From rlaager at pidgin.im Mon Jul 18 00:33:07 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:07 -0400 Subject: /pidgin/main: 1448543681b6: Remove a space before an ellipse Message-ID: Changeset: 1448543681b6d4aa865d3395b5a8d024cdc60363 Author: Richard Laager Date: 2016-06-07 00:48 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/1448543681b6 Description: Remove a space before an ellipse diffstat: finch/gntsound.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/finch/gntsound.c b/finch/gntsound.c --- a/finch/gntsound.c +++ b/finch/gntsound.c @@ -750,7 +750,7 @@ choose_cb(GntWidget *button, gpointer nu FinchSoundEvent * event = &sounds[id]; char *path = NULL; - gnt_box_set_title(GNT_BOX(w), _("Select Sound File ...")); + gnt_box_set_title(GNT_BOX(w), _("Select Sound File...")); gnt_file_sel_set_current_location(sel, (event && event->file) ? (path = g_path_get_dirname(event->file)) : purple_home_dir()); From grim at reaperworld.com Mon Jul 18 00:33:07 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:07 -0400 Subject: /pidgin/main: 97a43b771cb1: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: 97a43b771cb1d4b65c3e9a3fb47a62290d1ff1d3 Author: Gary Kramlich Date: 2016-07-01 16:17 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/97a43b771cb1 Description: Merged in rlaager/pidgin/release-2.x.y (pull request #66) Remove a space before an ellipse diffstat: finch/gntsound.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/finch/gntsound.c b/finch/gntsound.c --- a/finch/gntsound.c +++ b/finch/gntsound.c @@ -750,7 +750,7 @@ choose_cb(GntWidget *button, gpointer nu FinchSoundEvent * event = &sounds[id]; char *path = NULL; - gnt_box_set_title(GNT_BOX(w), _("Select Sound File ...")); + gnt_box_set_title(GNT_BOX(w), _("Select Sound File...")); gnt_file_sel_set_current_location(sel, (event && event->file) ? (path = g_path_get_dirname(event->file)) : purple_home_dir()); From rlaager at pidgin.im Mon Jul 18 00:33:07 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:07 -0400 Subject: /pidgin/main: 183e39dc4190: Use "Yahoo! ID" consistently Message-ID: Changeset: 183e39dc41904435f29d3bc93fc658091fe917ab Author: Richard Laager Date: 2016-06-06 21:47 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/183e39dc4190 Description: Use "Yahoo! ID" consistently We used "Yahoo ID" in one place. Reported-by: Allan Nordh?y diffstat: libpurple/protocols/yahoo/libyahoo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/libpurple/protocols/yahoo/libyahoo.c b/libpurple/protocols/yahoo/libyahoo.c --- a/libpurple/protocols/yahoo/libyahoo.c +++ b/libpurple/protocols/yahoo/libyahoo.c @@ -163,7 +163,7 @@ yahoo_get_account_text_table(PurpleAccou { GHashTable *table; table = g_hash_table_new(g_str_hash, g_str_equal); - g_hash_table_insert(table, "login_label", (gpointer)_("Yahoo ID...")); + g_hash_table_insert(table, "login_label", (gpointer)_("Yahoo! ID...")); return table; } From rlaager at pidgin.im Mon Jul 18 00:33:07 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:07 -0400 Subject: /pidgin/main: 6143bf4f9cc0: Reword a string in Finch's status cr... Message-ID: Changeset: 6143bf4f9cc0db697b48c45c89a43f8cdaf26abf Author: Richard Laager Date: 2016-06-07 00:26 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/6143bf4f9cc0 Description: Reword a string in Finch's status creator The existing string at least needed a "the" added. Since I was editing anyway, I made it match Pidgin. Reported-by: Allan Nordh?y diffstat: finch/gntstatus.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/finch/gntstatus.c b/finch/gntstatus.c --- a/finch/gntstatus.c +++ b/finch/gntstatus.c @@ -569,7 +569,7 @@ void finch_savedstatus_edit(PurpleSavedS gnt_box_add_widget(GNT_BOX(window), entry); gnt_box_add_widget(GNT_BOX(window), gnt_hline_new()); - gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Use different status for following accounts"))); + gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Use a different status for some accounts"))); edit->hash = g_hash_table_new(g_direct_hash, g_direct_equal); edit->tree = tree = gnt_tree_new_with_columns(3); From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 70e6a5082554: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: 70e6a5082554218faf0203fff5091e4a0d6242d0 Author: Gary Kramlich Date: 2016-07-01 16:18 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/70e6a5082554 Description: Merged in rlaager/pidgin/release-2.x.y (pull request #63) Reword a string in Finch's status creator diffstat: finch/gntstatus.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/finch/gntstatus.c b/finch/gntstatus.c --- a/finch/gntstatus.c +++ b/finch/gntstatus.c @@ -569,7 +569,7 @@ void finch_savedstatus_edit(PurpleSavedS gnt_box_add_widget(GNT_BOX(window), entry); gnt_box_add_widget(GNT_BOX(window), gnt_hline_new()); - gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Use different status for following accounts"))); + gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Use a different status for some accounts"))); edit->hash = g_hash_table_new(g_direct_hash, g_direct_equal); edit->tree = tree = gnt_tree_new_with_columns(3); From grim at reaperworld.com Mon Jul 18 00:33:07 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:07 -0400 Subject: /pidgin/main: 8904ba5c1f69: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: 8904ba5c1f69000808ac41493a4819bf54bec57d Author: Gary Kramlich Date: 2016-07-01 16:17 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/8904ba5c1f69 Description: Merged in rlaager/pidgin/release-2.x.y (pull request #59) Use "Yahoo! ID" consistently diffstat: libpurple/protocols/yahoo/libyahoo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/libpurple/protocols/yahoo/libyahoo.c b/libpurple/protocols/yahoo/libyahoo.c --- a/libpurple/protocols/yahoo/libyahoo.c +++ b/libpurple/protocols/yahoo/libyahoo.c @@ -163,7 +163,7 @@ yahoo_get_account_text_table(PurpleAccou { GHashTable *table; table = g_hash_table_new(g_str_hash, g_str_equal); - g_hash_table_insert(table, "login_label", (gpointer)_("Yahoo ID...")); + g_hash_table_insert(table, "login_label", (gpointer)_("Yahoo! ID...")); return table; } From rlaager at pidgin.im Mon Jul 18 00:33:08 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: b8f8bf6d813f: Fix pounce grammar in Finch Message-ID: Changeset: b8f8bf6d813f47e08623d079a3c990ac249da7f4 Author: Richard Laager Date: 2016-06-06 23:31 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/b8f8bf6d813f Description: Fix pounce grammar in Finch Finch used "Pounce Who" and it should use "Pounce on Whom" as Pidgin does. This does not break the string freeze, because "Pounce on Whom" already exists as a translatable string. Reported-by: Allan Nordh?y diffstat: finch/gntpounce.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/finch/gntpounce.c b/finch/gntpounce.c --- a/finch/gntpounce.c +++ b/finch/gntpounce.c @@ -342,7 +342,7 @@ finch_pounce_editor_show(PurpleAccount * g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(delete_win_cb), dialog); - gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Pounce Who"), GNT_TEXT_FLAG_BOLD)); + gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Pounce on Whom"), GNT_TEXT_FLAG_BOLD)); /* Account: */ gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Account:"))); From rlaager at pidgin.im Mon Jul 18 00:33:08 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 7f8e2632b7a7: Remove reference to Windows 2000 Message-ID: Changeset: 7f8e2632b7a72c4f08d9aeb9681c83daee0409b7 Author: Richard Laager Date: 2016-06-07 00:05 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/7f8e2632b7a7 Description: Remove reference to Windows 2000 I'm assuming we do not support anything less than Windows 2000. Reported-by: Allan Nordh?y diffstat: pidgin/plugins/win32/transparency/win2ktrans.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diffs (13 lines): diff --git a/pidgin/plugins/win32/transparency/win2ktrans.c b/pidgin/plugins/win32/transparency/win2ktrans.c --- a/pidgin/plugins/win32/transparency/win2ktrans.c +++ b/pidgin/plugins/win32/transparency/win2ktrans.c @@ -682,8 +682,7 @@ static PurplePluginInfo info = /** summary */ N_("Variable Transparency for the buddy list and conversations."), /** description */ - N_("This plugin enables variable alpha transparency on conversation windows and the buddy list.\n\n" - "* Note: This plugin requires Win2000 or greater."), + N_("This plugin enables variable alpha transparency on conversation windows and the buddy list."), "Herman Bloggs ", /**< author */ PURPLE_WEBSITE, /**< homepage */ plugin_load, /**< load */ From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 22541f58aef9: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: 22541f58aef9bf63d2fbddc96b1f9b706b2e7a6c Author: Gary Kramlich Date: 2016-07-01 16:19 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/22541f58aef9 Description: Merged in rlaager/pidgin/release-2.x.y (pull request #61) Fix pounce grammar in Finch diffstat: finch/gntpounce.c | 2 +- pidgin/plugins/win32/transparency/win2ktrans.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diffs (25 lines): diff --git a/finch/gntpounce.c b/finch/gntpounce.c --- a/finch/gntpounce.c +++ b/finch/gntpounce.c @@ -342,7 +342,7 @@ finch_pounce_editor_show(PurpleAccount * g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(delete_win_cb), dialog); - gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Pounce Who"), GNT_TEXT_FLAG_BOLD)); + gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Pounce on Whom"), GNT_TEXT_FLAG_BOLD)); /* Account: */ gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Account:"))); diff --git a/pidgin/plugins/win32/transparency/win2ktrans.c b/pidgin/plugins/win32/transparency/win2ktrans.c --- a/pidgin/plugins/win32/transparency/win2ktrans.c +++ b/pidgin/plugins/win32/transparency/win2ktrans.c @@ -682,8 +682,7 @@ static PurplePluginInfo info = /** summary */ N_("Variable Transparency for the buddy list and conversations."), /** description */ - N_("This plugin enables variable alpha transparency on conversation windows and the buddy list.\n\n" - "* Note: This plugin requires Win2000 or greater."), + N_("This plugin enables variable alpha transparency on conversation windows and the buddy list."), "Herman Bloggs ", /**< author */ PURPLE_WEBSITE, /**< homepage */ plugin_load, /**< load */ From rlaager at pidgin.im Mon Jul 18 00:33:08 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 03437cc299d4: Drop ampersands Message-ID: Changeset: 03437cc299d42d80f15386c1c6d455bf0f3cd7dc Author: Richard Laager Date: 2016-06-07 00:35 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/03437cc299d4 Description: Drop ampersands This changes "Save & Use" to "Save and Use". I believe the use of ampersands is discouraged in formal writing. The OpenOffice HIG agrees, for whatever that is worth. Reported-by: Allan Nordh?y diffstat: finch/gntstatus.c | 4 ++-- pidgin/gtksavedstatuses.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diffs (37 lines): diff --git a/finch/gntstatus.c b/finch/gntstatus.c --- a/finch/gntstatus.c +++ b/finch/gntstatus.c @@ -602,8 +602,8 @@ void finch_savedstatus_edit(PurpleSavedS g_object_set_data(G_OBJECT(button), "use", NULL); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); - /* Save & Use */ - button = gnt_button_new(_("Save & Use")); + /* Save and Use */ + button = gnt_button_new(_("Save and Use")); gnt_box_add_widget(GNT_BOX(box), button); g_object_set_data(G_OBJECT(button), "use", GINT_TO_POINTER(TRUE)); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); diff --git a/pidgin/gtksavedstatuses.c b/pidgin/gtksavedstatuses.c --- a/pidgin/gtksavedstatuses.c +++ b/pidgin/gtksavedstatuses.c @@ -805,7 +805,7 @@ status_editor_ok_cb(GtkButton *button, g g_free(message); g_free(unformatted); - /* If they clicked on "Save & Use" or "Use," then activate the status */ + /* If they clicked on "Save and Use" or "Use," then activate the status */ if (button != dialog->save_button) purple_savedstatus_activate(saved_status); @@ -1215,8 +1215,8 @@ pidgin_status_editor_show(gboolean edit, g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(status_editor_ok_cb), dialog); - /* Save & Use button */ - button = pidgin_pixbuf_button_from_stock(_("Sa_ve & Use"), GTK_STOCK_OK, + /* Save and Use button */ + button = pidgin_pixbuf_button_from_stock(_("Sa_ve and Use"), GTK_STOCK_OK, PIDGIN_BUTTON_HORIZONTAL); dialog->saveanduse_button = GTK_BUTTON(button); gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 2d0793be3611: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: 2d0793be3611dab19f9db7a0429954bc8c00b977 Author: Gary Kramlich Date: 2016-07-01 16:20 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/2d0793be3611 Description: Merged in rlaager/pidgin/release-2.x.y (pull request #64) Drop ampersands diffstat: finch/gntstatus.c | 4 ++-- pidgin/gtksavedstatuses.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diffs (37 lines): diff --git a/finch/gntstatus.c b/finch/gntstatus.c --- a/finch/gntstatus.c +++ b/finch/gntstatus.c @@ -602,8 +602,8 @@ void finch_savedstatus_edit(PurpleSavedS g_object_set_data(G_OBJECT(button), "use", NULL); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); - /* Save & Use */ - button = gnt_button_new(_("Save & Use")); + /* Save and Use */ + button = gnt_button_new(_("Save and Use")); gnt_box_add_widget(GNT_BOX(box), button); g_object_set_data(G_OBJECT(button), "use", GINT_TO_POINTER(TRUE)); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); diff --git a/pidgin/gtksavedstatuses.c b/pidgin/gtksavedstatuses.c --- a/pidgin/gtksavedstatuses.c +++ b/pidgin/gtksavedstatuses.c @@ -805,7 +805,7 @@ status_editor_ok_cb(GtkButton *button, g g_free(message); g_free(unformatted); - /* If they clicked on "Save & Use" or "Use," then activate the status */ + /* If they clicked on "Save and Use" or "Use," then activate the status */ if (button != dialog->save_button) purple_savedstatus_activate(saved_status); @@ -1215,8 +1215,8 @@ pidgin_status_editor_show(gboolean edit, g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(status_editor_ok_cb), dialog); - /* Save & Use button */ - button = pidgin_pixbuf_button_from_stock(_("Sa_ve & Use"), GTK_STOCK_OK, + /* Save and Use button */ + button = pidgin_pixbuf_button_from_stock(_("Sa_ve and Use"), GTK_STOCK_OK, PIDGIN_BUTTON_HORIZONTAL); dialog->saveanduse_button = GTK_BUTTON(button); gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); From rlaager at pidgin.im Mon Jul 18 00:33:08 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: a9c65ec9aaf2: Shorten gnttinyurl plugin description Message-ID: Changeset: a9c65ec9aaf24d639496a5f1ddcf67b6a9489e02 Author: Richard Laager Date: 2016-06-07 00:50 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/a9c65ec9aaf2 Description: Shorten gnttinyurl plugin description diffstat: finch/plugins/gnttinyurl.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (21 lines): diff --git a/finch/plugins/gnttinyurl.c b/finch/plugins/gnttinyurl.c --- a/finch/plugins/gnttinyurl.c +++ b/finch/plugins/gnttinyurl.c @@ -368,7 +368,7 @@ tinyurl_notify_uri(const char *uri) * may not always happen, e.g. when another plugin sets its own * notify_message. So tread carefully. */ win = purple_notify_message(NULL, PURPLE_NOTIFY_MSG_INFO, _("URI"), uri, - _("Please wait while TinyURL fetches a shorter URL ..."), NULL, NULL); + _("Please wait while TinyURL fetches a shorter URL..."), NULL, NULL); if (!GNT_IS_WINDOW(win) || !g_object_get_data(G_OBJECT(win), "info-widget")) return win; @@ -471,7 +471,7 @@ static PurplePluginInfo info = N_("TinyURL"), DISPLAY_VERSION, N_("TinyURL plugin"), - N_("When receiving a message with URL(s), use TinyURL for easier copying"), + N_("Shorten URLs in messages using TinyURL"), "Richard Nelson ", PURPLE_WEBSITE, plugin_load, From rlaager at pidgin.im Mon Jul 18 00:33:08 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 3492ca801484: Fix "e-mail" to "email" Message-ID: Changeset: 3492ca80148407b975f221ba7975fe18942af785 Author: Richard Laager Date: 2016-06-08 02:35 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/3492ca801484 Description: Fix "e-mail" to "email" Somehow, this slipped in. diffstat: pidgin/gtkdialogs.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/pidgin/gtkdialogs.c b/pidgin/gtkdialogs.c --- a/pidgin/gtkdialogs.c +++ b/pidgin/gtkdialogs.c @@ -551,7 +551,7 @@ void pidgin_dialogs_about(void) g_string_append(str, _("Help from other Pidgin users is " - "available by e-mailing support at pidgin.im
" "This is a public mailing list! " "(archive)
" From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 67bd8968d3e9: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: 67bd8968d3e913ced45b01859565784d53ea6584 Author: Gary Kramlich Date: 2016-07-01 16:20 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/67bd8968d3e9 Description: Merged in rlaager/pidgin/release-2.x.y (pull request #67) Shorten gnttinyurl plugin description diffstat: finch/plugins/gnttinyurl.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (21 lines): diff --git a/finch/plugins/gnttinyurl.c b/finch/plugins/gnttinyurl.c --- a/finch/plugins/gnttinyurl.c +++ b/finch/plugins/gnttinyurl.c @@ -368,7 +368,7 @@ tinyurl_notify_uri(const char *uri) * may not always happen, e.g. when another plugin sets its own * notify_message. So tread carefully. */ win = purple_notify_message(NULL, PURPLE_NOTIFY_MSG_INFO, _("URI"), uri, - _("Please wait while TinyURL fetches a shorter URL ..."), NULL, NULL); + _("Please wait while TinyURL fetches a shorter URL..."), NULL, NULL); if (!GNT_IS_WINDOW(win) || !g_object_get_data(G_OBJECT(win), "info-widget")) return win; @@ -471,7 +471,7 @@ static PurplePluginInfo info = N_("TinyURL"), DISPLAY_VERSION, N_("TinyURL plugin"), - N_("When receiving a message with URL(s), use TinyURL for easier copying"), + N_("Shorten URLs in messages using TinyURL"), "Richard Nelson ", PURPLE_WEBSITE, plugin_load, From rlaager at pidgin.im Mon Jul 18 00:33:08 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 660e41d31deb: Message Notification: Drop redundant... Message-ID: Changeset: 660e41d31debf19ff622e300e4a7febeceb6b9f7 Author: Richard Laager Date: 2016-06-06 22:16 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/660e41d31deb Description: Message Notification: Drop redundant "Notify for" The high level section is "Notify For". We do not need to prefix individual options with "Notify for". I intentionally gave these two strings the same mnemonic. Anything else would have required changing something else. The only good candidate was "Prepend _string into window title" becoming _w; in the end, this seemed like the lesser of two evils. Reported-by: Bj?rn Voigt diffstat: pidgin/plugins/notify.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (21 lines): diff --git a/pidgin/plugins/notify.c b/pidgin/plugins/notify.c --- a/pidgin/plugins/notify.c +++ b/pidgin/plugins/notify.c @@ -718,7 +718,7 @@ get_config_frame(PurplePlugin *plugin) G_CALLBACK(type_toggle_cb), "type_im"); ref = toggle; - toggle = gtk_check_button_new_with_mnemonic(_("\t_Notify for System messages")); + toggle = gtk_check_button_new_with_mnemonic(_("\tS_ystem messages")); gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), purple_prefs_get_bool("/plugins/gtk/X11/notify/type_im_sys")); @@ -746,7 +746,7 @@ get_config_frame(PurplePlugin *plugin) g_signal_connect(G_OBJECT(ref), "toggled", G_CALLBACK(pidgin_toggle_sensitive), toggle); - toggle = gtk_check_button_new_with_mnemonic(_("\tNotify for _System messages")); + toggle = gtk_check_button_new_with_mnemonic(_("\tS_ystem messages")); gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), purple_prefs_get_bool("/plugins/gtk/X11/notify/type_chat_sys")); From rlaager at pidgin.im Mon Jul 18 00:33:08 2016 From: rlaager at pidgin.im (Richard Laager) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: d3430adc96af: Fix pounce grammar in Finch Message-ID: Changeset: d3430adc96af5246c61b5677c892a7b84d1a63d1 Author: Richard Laager Date: 2016-06-06 23:28 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/d3430adc96af Description: Fix pounce grammar in Finch Finch used "Pounce Who" and it should use "Pounce on Whom" as Pidgin does. This does not break the string freeze, because "Pounce on Whom" already exists as a translatable string. Reported-by: Allan Nordh?y diffstat: finch/gntpounce.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/finch/gntpounce.c b/finch/gntpounce.c --- a/finch/gntpounce.c +++ b/finch/gntpounce.c @@ -342,7 +342,7 @@ finch_pounce_editor_show(PurpleAccount * g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(delete_win_cb), dialog); - gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Pounce Who"), GNT_TEXT_FLAG_BOLD)); + gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Pounce on Whom"), GNT_TEXT_FLAG_BOLD)); /* Account: */ gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Account:"))); From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 28a84e67172c: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: 28a84e67172cb2f8be8ecf3d910f7bc1eac467c0 Author: Gary Kramlich Date: 2016-07-01 16:22 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/28a84e67172c Description: Merged in rlaager/pidgin/release-2.x.y (pull request #60) Message Notification: Drop redundant "Notify for" diffstat: pidgin/plugins/notify.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (21 lines): diff --git a/pidgin/plugins/notify.c b/pidgin/plugins/notify.c --- a/pidgin/plugins/notify.c +++ b/pidgin/plugins/notify.c @@ -718,7 +718,7 @@ get_config_frame(PurplePlugin *plugin) G_CALLBACK(type_toggle_cb), "type_im"); ref = toggle; - toggle = gtk_check_button_new_with_mnemonic(_("\t_Notify for System messages")); + toggle = gtk_check_button_new_with_mnemonic(_("\tS_ystem messages")); gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), purple_prefs_get_bool("/plugins/gtk/X11/notify/type_im_sys")); @@ -746,7 +746,7 @@ get_config_frame(PurplePlugin *plugin) g_signal_connect(G_OBJECT(ref), "toggled", G_CALLBACK(pidgin_toggle_sensitive), toggle); - toggle = gtk_check_button_new_with_mnemonic(_("\tNotify for _System messages")); + toggle = gtk_check_button_new_with_mnemonic(_("\tS_ystem messages")); gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), purple_prefs_get_bool("/plugins/gtk/X11/notify/type_chat_sys")); From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: a21b7b6aae4f: Replace instances of d.pidgin.im wit... Message-ID: Changeset: a21b7b6aae4f6d35da1d9b764bf9a0548e93151b Author: Gary Kramlich Date: 2016-06-06 21:41 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/a21b7b6aae4f Description: Replace instances of d.pidgin.im with developer.pidgin.im. Fixes #17036 diffstat: libpurple/protocols/bonjour/bonjour.c | 2 +- pidgin/gtkblist.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diffs (24 lines): diff --git a/libpurple/protocols/bonjour/bonjour.c b/libpurple/protocols/bonjour/bonjour.c --- a/libpurple/protocols/bonjour/bonjour.c +++ b/libpurple/protocols/bonjour/bonjour.c @@ -97,7 +97,7 @@ bonjour_login(PurpleAccount *account) purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("Unable to find Apple's \"Bonjour for Windows\" toolkit, see " - "http://d.pidgin.im/BonjourWindows for more information.")); + "https://developer.pidgin.im/BonjourWindows for more information.")); return; } #endif /* _WIN32 */ diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c --- a/pidgin/gtkblist.c +++ b/pidgin/gtkblist.c @@ -5102,7 +5102,7 @@ generic_error_destroy_cb(GtkObject *dial purple_account_clear_current_error(account); } -#define SSL_FAQ_URI "http://d.pidgin.im/wiki/FAQssl" +#define SSL_FAQ_URI "https://developer.pidgin.im/wiki/FAQssl" static void ssl_faq_clicked_cb(PidginMiniDialog *mini_dialog, From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: 4e350598cf7c: Merged in rw_grim/pidgin/release-2.x... Message-ID: Changeset: 4e350598cf7cd60723e045cfc9f2a25ebd7e53cd Author: Gary Kramlich Date: 2016-07-01 16:22 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/4e350598cf7c Description: Merged in rw_grim/pidgin/release-2.x.y (pull request #58) Replace instances of d.pidgin.im with developer.pidgin.im. diffstat: libpurple/protocols/bonjour/bonjour.c | 2 +- pidgin/gtkblist.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diffs (24 lines): diff --git a/libpurple/protocols/bonjour/bonjour.c b/libpurple/protocols/bonjour/bonjour.c --- a/libpurple/protocols/bonjour/bonjour.c +++ b/libpurple/protocols/bonjour/bonjour.c @@ -97,7 +97,7 @@ bonjour_login(PurpleAccount *account) purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("Unable to find Apple's \"Bonjour for Windows\" toolkit, see " - "http://d.pidgin.im/BonjourWindows for more information.")); + "https://developer.pidgin.im/BonjourWindows for more information.")); return; } #endif /* _WIN32 */ diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c --- a/pidgin/gtkblist.c +++ b/pidgin/gtkblist.c @@ -5102,7 +5102,7 @@ generic_error_destroy_cb(GtkObject *dial purple_account_clear_current_error(account); } -#define SSL_FAQ_URI "http://d.pidgin.im/wiki/FAQssl" +#define SSL_FAQ_URI "https://developer.pidgin.im/wiki/FAQssl" static void ssl_faq_clicked_cb(PidginMiniDialog *mini_dialog, From salinasv at pidgin.im Mon Jul 18 00:33:09 2016 From: salinasv at pidgin.im (Jorge Villase?or) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 38eebb7c9019: Simplify our menuitem creation util ... Message-ID: Changeset: 38eebb7c90194d56da448ee7174a6c8407d73762 Author: Jorge Villase?or Date: 2016-07-01 00:19 -0700 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/38eebb7c9019 Description: Simplify our menuitem creation util function This is a preparation to migrate to the new icon naming specification as well as migrate to newer gtk functions. Nowhere in the code it is used the accel_key functionallity on pidgin_new_item_stock() which is not even implemented. So now they are removed. Details: * Remove one function with duplicated functionallity and only used once. Replaced by the generic option. * Migrate the deprecated way to create a menuitem to the new option provided by gtk. * Remove dead code. diffstat: ChangeLog.API | 2 + pidgin/gtkblist.c | 169 +++++++++++++++++++-------------------- pidgin/gtkconv.c | 78 +++++++++-------- pidgin/gtkdocklet.c | 29 ++++-- pidgin/gtkroomlist.c | 8 +- pidgin/gtkstatusbox.c | 11 +- pidgin/gtkutils.c | 75 ++++------------ pidgin/gtkutils.h | 21 +---- pidgin/gtkwebview.c | 61 +++++++------- pidgin/plugins/disco/gtkdisco.c | 8 +- 10 files changed, 215 insertions(+), 247 deletions(-) diffs (truncated from 799 to 300 lines): diff --git a/ChangeLog.API b/ChangeLog.API --- a/ChangeLog.API +++ b/ChangeLog.API @@ -569,6 +569,8 @@ version 3.0.0 (??/??/????): * FULL_CIRCLE_DEGREES renamed to PIDGIN_FULL_CIRCLE_DEGREES * NUM_NICK_SEED_COLORS renamed to PIDGIN_NUM_NICK_SEED_COLORS * PALETTE_NUM_COLORS renamed to PIDGIN_PALETTE_NUM_COLORS + * pidgin_new_item_from_stock renamed to pidgin_new_menu_item and + removed the accel related parameters. * pidgin_setup_screenname_autocomplete now takes a filter function and its data as final two arguments * smiley_list renamed to PidginSmileyList diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c --- a/pidgin/gtkblist.c +++ b/pidgin/gtkblist.c @@ -1405,9 +1405,9 @@ void pidgin_append_blist_node_privacy_me account = purple_buddy_get_account(buddy); permitted = purple_account_privacy_check(account, purple_buddy_get_name(buddy)); - pidgin_new_item_from_stock(menu, permitted ? _("_Block") : _("Un_block"), - permitted ? PIDGIN_STOCK_TOOLBAR_BLOCK : PIDGIN_STOCK_TOOLBAR_UNBLOCK, G_CALLBACK(toggle_privacy), - node, 0 ,0, NULL); + pidgin_new_menu_item(menu, permitted ? _("_Block") : _("Un_block"), + permitted ? PIDGIN_STOCK_TOOLBAR_BLOCK : PIDGIN_STOCK_TOOLBAR_UNBLOCK, + G_CALLBACK(toggle_privacy), node); } void @@ -1460,8 +1460,9 @@ pidgin_append_blist_node_move_to_menu(Gt continue; if (group == purple_blist_node_get_parent(node)) continue; - menuitem = pidgin_new_item_from_stock(submenu, purple_group_get_name((PurpleGroup *)group), NULL, - G_CALLBACK(gtk_blist_menu_move_to_cb), node, 0, 0, NULL); + menuitem = pidgin_new_menu_item(submenu, + purple_group_get_name((PurpleGroup *)group), NULL, + G_CALLBACK(gtk_blist_menu_move_to_cb), node); g_object_set_data(G_OBJECT(menuitem), "groupnode", group); } gtk_widget_show_all(submenu); @@ -1492,11 +1493,11 @@ pidgin_blist_make_buddy_menu(GtkWidget * } if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER_IFACE, get_info)) { - pidgin_new_item_from_stock(menu, _("Get _Info"), PIDGIN_STOCK_TOOLBAR_USER_INFO, - G_CALLBACK(gtk_blist_menu_info_cb), buddy, 0, 0, NULL); - } - pidgin_new_item_from_stock(menu, _("I_M"), PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, - G_CALLBACK(gtk_blist_menu_im_cb), buddy, 0, 0, NULL); + pidgin_new_menu_item(menu, _("Get _Info"), PIDGIN_STOCK_TOOLBAR_USER_INFO, + G_CALLBACK(gtk_blist_menu_info_cb), buddy); + } + pidgin_new_menu_item(menu, _("I_M"), PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, + G_CALLBACK(gtk_blist_menu_im_cb), buddy); #ifdef USE_VV if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, MEDIA_IFACE, get_caps)) { @@ -1504,18 +1505,18 @@ pidgin_blist_make_buddy_menu(GtkWidget * const gchar *who = purple_buddy_get_name(buddy); PurpleMediaCaps caps = purple_protocol_get_media_caps(account, who); if (caps & PURPLE_MEDIA_CAPS_AUDIO) { - pidgin_new_item_from_stock(menu, _("_Audio Call"), + pidgin_new_menu_item(menu, _("_Audio Call"), PIDGIN_STOCK_TOOLBAR_AUDIO_CALL, - G_CALLBACK(gtk_blist_menu_audio_call_cb), buddy, 0, 0, NULL); + G_CALLBACK(gtk_blist_menu_audio_call_cb), buddy); } if (caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO) { - pidgin_new_item_from_stock(menu, _("Audio/_Video Call"), + pidgin_new_menu_item(menu, _("Audio/_Video Call"), PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, - G_CALLBACK(gtk_blist_menu_video_call_cb), buddy, 0, 0, NULL); + G_CALLBACK(gtk_blist_menu_video_call_cb), buddy); } else if (caps & PURPLE_MEDIA_CAPS_VIDEO) { - pidgin_new_item_from_stock(menu, _("_Video Call"), + pidgin_new_menu_item(menu, _("_Video Call"), PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, - G_CALLBACK(gtk_blist_menu_video_call_cb), buddy, 0, 0, NULL); + G_CALLBACK(gtk_blist_menu_video_call_cb), buddy); } } @@ -1526,30 +1527,30 @@ pidgin_blist_make_buddy_menu(GtkWidget * purple_protocol_xfer_iface_can_receive(protocol, purple_account_get_connection(purple_buddy_get_account(buddy)), purple_buddy_get_name(buddy))) { - pidgin_new_item_from_stock(menu, _("_Send File..."), - PIDGIN_STOCK_TOOLBAR_SEND_FILE, - G_CALLBACK(gtk_blist_menu_send_file_cb), - buddy, 0, 0, NULL); - } - } - - pidgin_new_item_from_stock(menu, _("Add Buddy _Pounce..."), NULL, - G_CALLBACK(gtk_blist_menu_bp_cb), buddy, 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Send File..."), + PIDGIN_STOCK_TOOLBAR_SEND_FILE, + G_CALLBACK(gtk_blist_menu_send_file_cb), + buddy); + } + } + + pidgin_new_menu_item(menu, _("Add Buddy _Pounce..."), NULL, + G_CALLBACK(gtk_blist_menu_bp_cb), buddy); if (node->parent && node->parent->child->next && !sub && !contact_expanded) { - pidgin_new_item_from_stock(menu, _("View _Log"), NULL, - G_CALLBACK(gtk_blist_menu_showlog_cb), - contact, 0, 0, NULL); + pidgin_new_menu_item(menu, _("View _Log"), NULL, + G_CALLBACK(gtk_blist_menu_showlog_cb), contact); } else if (!sub) { - pidgin_new_item_from_stock(menu, _("View _Log"), NULL, - G_CALLBACK(gtk_blist_menu_showlog_cb), buddy, 0, 0, NULL); + pidgin_new_menu_item(menu, _("View _Log"), NULL, + G_CALLBACK(gtk_blist_menu_showlog_cb), buddy); } if (!purple_blist_node_is_transient(node)) { gboolean show_offline = purple_blist_node_get_bool(node, "show_offline"); - pidgin_new_item_from_stock(menu, show_offline ? _("Hide When Offline") : _("Show When Offline"), - NULL, G_CALLBACK(gtk_blist_menu_showoffline_cb), node, 0, 0, NULL); + pidgin_new_menu_item(menu, + show_offline ? _("Hide When Offline") : _("Show When Offline"), + NULL, G_CALLBACK(gtk_blist_menu_showoffline_cb), node); } pidgin_append_blist_node_proto_menu(menu, purple_account_get_connection(purple_buddy_get_account(buddy)), node); @@ -1562,20 +1563,17 @@ pidgin_blist_make_buddy_menu(GtkWidget * !sub && !contact_expanded) { pidgin_separator(menu); pidgin_append_blist_node_privacy_menu(menu, node); - pidgin_new_item_from_stock(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, - G_CALLBACK(gtk_blist_menu_alias_cb), - contact, 0, 0, NULL); - pidgin_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, - G_CALLBACK(pidgin_blist_remove_cb), - contact, 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, + G_CALLBACK(gtk_blist_menu_alias_cb), contact); + pidgin_new_menu_item(menu, _("_Remove"), GTK_STOCK_REMOVE, + G_CALLBACK(pidgin_blist_remove_cb), contact); } else if (!sub || contact_expanded) { pidgin_separator(menu); pidgin_append_blist_node_privacy_menu(menu, node); - pidgin_new_item_from_stock(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, - G_CALLBACK(gtk_blist_menu_alias_cb), buddy, 0, 0, NULL); - pidgin_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, - G_CALLBACK(pidgin_blist_remove_cb), buddy, - 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, + G_CALLBACK(gtk_blist_menu_alias_cb), buddy); + pidgin_new_menu_item(menu, _("_Remove"), GTK_STOCK_REMOVE, + G_CALLBACK(pidgin_blist_remove_cb), buddy); } } @@ -1698,13 +1696,11 @@ add_buddy_icon_menu_items(GtkWidget *men { GtkWidget *item; - pidgin_new_item_from_stock(menu, _("Set Custom Icon"), NULL, - G_CALLBACK(set_node_custom_icon), node, 0, - 0, NULL); - - item = pidgin_new_item_from_stock(menu, _("Remove Custom Icon"), NULL, - G_CALLBACK(remove_node_custom_icon), node, - 0, 0, NULL); + pidgin_new_menu_item(menu, _("Set Custom Icon"), NULL, + G_CALLBACK(set_node_custom_icon), node); + + item = pidgin_new_menu_item(menu, _("Remove Custom Icon"), NULL, + G_CALLBACK(remove_node_custom_icon), node); if (!purple_buddy_icons_node_has_custom_icon(node)) gtk_widget_set_sensitive(item, FALSE); } @@ -1716,20 +1712,21 @@ create_group_menu (PurpleBlistNode *node GtkWidget *item; menu = gtk_menu_new(); - item = pidgin_new_item_from_stock(menu, _("Add _Buddy..."), GTK_STOCK_ADD, - G_CALLBACK(pidgin_blist_add_buddy_cb), node, 0, 0, NULL); + item = pidgin_new_menu_item(menu, _("Add _Buddy..."), GTK_STOCK_ADD, + G_CALLBACK(pidgin_blist_add_buddy_cb), node); gtk_widget_set_sensitive(item, purple_connections_get_all() != NULL); - item = pidgin_new_item_from_stock(menu, _("Add C_hat..."), GTK_STOCK_ADD, - G_CALLBACK(pidgin_blist_add_chat_cb), node, 0, 0, NULL); + item = pidgin_new_menu_item(menu, _("Add C_hat..."), GTK_STOCK_ADD, + G_CALLBACK(pidgin_blist_add_chat_cb), node); gtk_widget_set_sensitive(item, pidgin_blist_joinchat_is_showable()); - pidgin_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, - G_CALLBACK(pidgin_blist_remove_cb), node, 0, 0, NULL); - pidgin_new_item_from_stock(menu, _("_Rename"), NULL, - G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Delete Group"), GTK_STOCK_REMOVE, + G_CALLBACK(pidgin_blist_remove_cb), node); + pidgin_new_menu_item(menu, _("_Rename"), NULL, + G_CALLBACK(gtk_blist_menu_alias_cb), node); if (!purple_blist_node_is_transient(node)) { gboolean show_offline = purple_blist_node_get_bool(node, "show_offline"); - pidgin_new_item_from_stock(menu, show_offline ? _("Hide When Offline") : _("Show When Offline"), - NULL, G_CALLBACK(gtk_blist_menu_showoffline_cb), node, 0, 0, NULL); + pidgin_new_menu_item(menu, + show_offline ? _("Hide When Offline") : _("Show When Offline"), + NULL, G_CALLBACK(gtk_blist_menu_showoffline_cb), node); } add_buddy_icon_menu_items(menu, node); @@ -1749,26 +1746,26 @@ create_chat_menu(PurpleBlistNode *node, autojoin = purple_blist_node_get_bool(node, "gtk-autojoin"); persistent = purple_blist_node_get_bool(node, "gtk-persistent"); - pidgin_new_item_from_stock(menu, _("_Join"), PIDGIN_STOCK_CHAT, - G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Join"), PIDGIN_STOCK_CHAT, + G_CALLBACK(gtk_blist_menu_join_cb), node); pidgin_new_check_item(menu, _("Auto-Join"), G_CALLBACK(gtk_blist_menu_autojoin_cb), node, autojoin); pidgin_new_check_item(menu, _("Persistent"), G_CALLBACK(gtk_blist_menu_persistent_cb), node, persistent); - pidgin_new_item_from_stock(menu, _("View _Log"), NULL, - G_CALLBACK(gtk_blist_menu_showlog_cb), node, 0, 0, NULL); + pidgin_new_menu_item(menu, _("View _Log"), NULL, + G_CALLBACK(gtk_blist_menu_showlog_cb), node); pidgin_append_blist_node_proto_menu(menu, purple_account_get_connection(purple_chat_get_account(c)), node); pidgin_append_blist_node_extended_menu(menu, node); pidgin_separator(menu); - pidgin_new_item_from_stock(menu, _("_Edit Settings..."), NULL, - G_CALLBACK(chat_components_edit), node, 0, 0, NULL); - pidgin_new_item_from_stock(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, - G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); - pidgin_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, - G_CALLBACK(pidgin_blist_remove_cb), node, 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Edit Settings..."), NULL, + G_CALLBACK(chat_components_edit), node); + pidgin_new_menu_item(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, + G_CALLBACK(gtk_blist_menu_alias_cb), node); + pidgin_new_menu_item(menu, _("_Remove"), GTK_STOCK_REMOVE, + G_CALLBACK(pidgin_blist_remove_cb), node); add_buddy_icon_menu_items(menu, node); @@ -1782,24 +1779,24 @@ create_contact_menu (PurpleBlistNode *no menu = gtk_menu_new(); - pidgin_new_item_from_stock(menu, _("View _Log"), NULL, + pidgin_new_menu_item(menu, _("View _Log"), NULL, G_CALLBACK(gtk_blist_menu_showlog_cb), - node, 0, 0, NULL); + node); pidgin_separator(menu); - pidgin_new_item_from_stock(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, - G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); - pidgin_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, - G_CALLBACK(pidgin_blist_remove_cb), node, 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, + G_CALLBACK(gtk_blist_menu_alias_cb), node); + pidgin_new_menu_item(menu, _("_Remove"), GTK_STOCK_REMOVE, + G_CALLBACK(pidgin_blist_remove_cb), node); add_buddy_icon_menu_items(menu, node); pidgin_separator(menu); - pidgin_new_item_from_stock(menu, _("_Collapse"), GTK_STOCK_ZOOM_OUT, + pidgin_new_menu_item(menu, _("_Collapse"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(pidgin_blist_collapse_contact_cb), - node, 0, 0, NULL); + node); pidgin_append_blist_node_extended_menu(menu, node); return menu; @@ -1822,15 +1819,15 @@ create_buddy_menu(PurpleBlistNode *node, add_buddy_icon_menu_items(menu, node); if(gtknode->contact_expanded) { - pidgin_new_item_from_stock(menu, _("_Collapse"), - GTK_STOCK_ZOOM_OUT, - G_CALLBACK(pidgin_blist_collapse_contact_cb), - node, 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Collapse"), + GTK_STOCK_ZOOM_OUT, + G_CALLBACK(pidgin_blist_collapse_contact_cb), + node); } else { - pidgin_new_item_from_stock(menu, _("_Expand"), - GTK_STOCK_ZOOM_IN, - G_CALLBACK(pidgin_blist_expand_contact_cb), node, - 0, 0, NULL); + pidgin_new_menu_item(menu, _("_Expand"), + GTK_STOCK_ZOOM_IN, + G_CALLBACK(pidgin_blist_expand_contact_cb), + node); From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 3f81450a2df5: mediamanager: add info argument to P... Message-ID: Changeset: 3f81450a2df52aafcb71ef994d9a9b13277abd60 Author: Jakub Adam Date: 2016-06-21 14:59 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/3f81450a2df5 Description: mediamanager: add info argument to PurpleMediaElementCreateCallback diffstat: finch/gntmedia.c | 4 ++-- libpurple/media-gst.h | 5 +++-- libpurple/mediamanager.c | 6 +++--- pidgin/gtkmedia.c | 8 ++++---- 4 files changed, 12 insertions(+), 11 deletions(-) diffs (105 lines): diff --git a/finch/gntmedia.c b/finch/gntmedia.c --- a/finch/gntmedia.c +++ b/finch/gntmedia.c @@ -409,7 +409,7 @@ call_cmd_cb(PurpleConversation *conv, co } static GstElement * -create_default_audio_src(PurpleMedia *media, +create_default_audio_src(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *src; @@ -432,7 +432,7 @@ create_default_audio_src(PurpleMedia *me } static GstElement * -create_default_audio_sink(PurpleMedia *media, +create_default_audio_sink(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *sink; diff --git a/libpurple/media-gst.h b/libpurple/media-gst.h --- a/libpurple/media-gst.h +++ b/libpurple/media-gst.h @@ -49,8 +49,9 @@ typedef struct _PurpleMediaElementInfo PurpleMediaElementInfo; typedef struct _PurpleMediaElementInfoClass PurpleMediaElementInfoClass; -typedef GstElement *(*PurpleMediaElementCreateCallback)(PurpleMedia *media, - const gchar *session_id, const gchar *participant); +typedef GstElement *(*PurpleMediaElementCreateCallback)( + PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant); /** * PurpleMediaElementType: diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -876,7 +876,7 @@ media_established_cb (PurpleMedia *media } static GstElement * -create_send_appsrc(PurpleMedia *media, +create_send_appsrc(PurpleMediaElementInfo *element_info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { PurpleMediaManager *manager = purple_media_manager_get (); @@ -1022,7 +1022,7 @@ appsink_destroyed (PurpleMediaAppDataInf } static GstElement * -create_recv_appsink(PurpleMedia *media, +create_recv_appsink(PurpleMediaElementInfo *element_info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { PurpleMediaManager *manager = purple_media_manager_get (); @@ -2122,7 +2122,7 @@ purple_media_element_info_call_create(Pu g_return_val_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(info), NULL); g_object_get(info, "create-cb", &create, NULL); if (create) - return create(media, session_id, participant); + return create(info, media, session_id, participant); #endif return NULL; } diff --git a/pidgin/gtkmedia.c b/pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c +++ b/pidgin/gtkmedia.c @@ -1309,7 +1309,7 @@ create_configured_vv_element(const gchar } static GstElement * -create_default_video_src(PurpleMedia *media, +create_default_video_src(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *sendbin, *src; @@ -1361,7 +1361,7 @@ create_default_video_src(PurpleMedia *me } static GstElement * -create_default_video_sink(PurpleMedia *media, +create_default_video_sink(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *sink; @@ -1381,7 +1381,7 @@ create_default_video_sink(PurpleMedia *m } static GstElement * -create_default_audio_src(PurpleMedia *media, +create_default_audio_src(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *src; @@ -1412,7 +1412,7 @@ create_default_audio_src(PurpleMedia *me } static GstElement * -create_default_audio_sink(PurpleMedia *media, +create_default_audio_sink(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *sink; From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 6928eca77c75: mediamanager: keep track of devices ... Message-ID: Changeset: 6928eca77c75a683e851f76393b727b907b81ceb Author: Jakub Adam Date: 2016-04-15 14:10 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/6928eca77c75 Description: mediamanager: keep track of devices managed by GstDeviceMonitor diffstat: libpurple/mediamanager.c | 235 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 235 insertions(+), 0 deletions(-) diffs (280 lines): diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -72,6 +72,12 @@ struct _PurpleMediaManagerPrivate PurpleMediaElementInfo *audio_src; PurpleMediaElementInfo *audio_sink; +#ifdef USE_GSTREAMER +#if GST_CHECK_VERSION(1, 4, 0) + GstDeviceMonitor *device_monitor; +#endif /* GST_CHECK_VERSION(1, 4, 0) */ +#endif /* USE_GSTREAMER */ + #ifdef HAVE_MEDIA_APPLICATION /* Application data streams */ GList *appdata_info; /* holds PurpleMediaAppDataInfo */ @@ -113,6 +119,9 @@ static void purple_media_manager_finaliz #ifdef HAVE_MEDIA_APPLICATION static void free_appdata_info_locked (PurpleMediaAppDataInfo *info); #endif +#ifdef USE_GSTREAMER +static void purple_media_manager_init_device_monitor(PurpleMediaManager *manager); +#endif static GObjectClass *parent_class = NULL; @@ -194,6 +203,10 @@ purple_media_manager_class_init (PurpleM static void purple_media_manager_init (PurpleMediaManager *media) { +#ifdef USE_GSTREAMER + GError *error; +#endif /* USE_GSTREAMER */ + media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media); media->priv->medias = NULL; media->priv->private_medias = NULL; @@ -203,6 +216,18 @@ purple_media_manager_init (PurpleMediaMa media->priv->appdata_info = NULL; g_mutex_init (&media->priv->appdata_mutex); #endif +#ifdef USE_GSTREAMER + if (gst_init_check(NULL, NULL, &error)) { + purple_media_manager_init_device_monitor(media); + } else { + purple_debug_error("mediamanager", + "GStreamer failed to initialize: %s.", + error ? error->message : ""); + if (error) { + g_error_free(error); + } + } +#endif /* USE_GSTREAMER */ purple_prefs_add_none("/purple/media"); purple_prefs_add_none("/purple/media/audio"); @@ -236,6 +261,14 @@ purple_media_manager_finalize (GObject * (GDestroyNotify) free_appdata_info_locked); g_mutex_clear (&priv->appdata_mutex); #endif +#ifdef USE_GSTREAMER +#if GST_CHECK_VERSION(1, 4, 0) + if (priv->device_monitor) { + gst_device_monitor_stop(priv->device_monitor); + g_object_unref(priv->device_monitor); + } +#endif /* GST_CHECK_VERSION(1, 4, 0) */ +#endif /* USE_GSTREAMER */ parent_class->finalize(media); } @@ -1845,6 +1878,208 @@ purple_media_manager_receive_application #ifdef USE_GSTREAMER +#if GST_CHECK_VERSION(1, 4, 0) + +static void +videosink_disable_last_sample(GstElement *sink) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS(sink); + + if (g_object_class_find_property(klass, "enable-last-sample")) { + g_object_set(sink, "enable-last-sample", FALSE, NULL); + } +} + +static PurpleMediaElementType +gst_class_to_purple_element_type(const gchar *device_class) +{ + if (purple_strequal(device_class, "Audio/Source")) { + return PURPLE_MEDIA_ELEMENT_AUDIO + | PURPLE_MEDIA_ELEMENT_SRC + | PURPLE_MEDIA_ELEMENT_ONE_SRC + | PURPLE_MEDIA_ELEMENT_UNIQUE; + } else if (purple_strequal(device_class, "Audio/Sink")) { + return PURPLE_MEDIA_ELEMENT_AUDIO + | PURPLE_MEDIA_ELEMENT_SINK + | PURPLE_MEDIA_ELEMENT_ONE_SINK; + } else if (purple_strequal(device_class, "Video/Source")) { + return PURPLE_MEDIA_ELEMENT_VIDEO + | PURPLE_MEDIA_ELEMENT_SRC + | PURPLE_MEDIA_ELEMENT_ONE_SRC + | PURPLE_MEDIA_ELEMENT_UNIQUE; + } else if (purple_strequal(device_class, "Video/Sink")) { + return PURPLE_MEDIA_ELEMENT_VIDEO + | PURPLE_MEDIA_ELEMENT_SINK + | PURPLE_MEDIA_ELEMENT_ONE_SINK; + } + + return PURPLE_MEDIA_ELEMENT_NONE; +} + +static GstElement * +gst_device_create_cb(PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant) +{ + GstDevice *device; + GstElement *result; + PurpleMediaElementType type; + + device = g_object_get_data(G_OBJECT(info), "gst-device"); + if (!device) { + return NULL; + } + + result = gst_device_create_element(device, NULL); + if (!result) { + return NULL; + } + + type = purple_media_element_info_get_element_type(info); + + if ((type & PURPLE_MEDIA_ELEMENT_VIDEO) && + (type & PURPLE_MEDIA_ELEMENT_SINK)) { + videosink_disable_last_sample(result); + } + + return result; +} + +static void +purple_media_manager_register_gst_device(PurpleMediaManager *manager, + GstDevice *device) +{ + PurpleMediaElementInfo *info; + PurpleMediaElementType type; + gchar *name; + gchar *device_class; + gchar *id; + + name = gst_device_get_display_name(device); + device_class = gst_device_get_device_class(device); + + id = g_strdup_printf("%s %s", device_class, name); + + type = gst_class_to_purple_element_type(device_class); + + info = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", id, + "name", name, + "type", type, + "create-cb", gst_device_create_cb, + NULL); + + g_object_set_data(G_OBJECT(info), "gst-device", device); + + purple_media_manager_register_element(manager, info); + + purple_debug_info("mediamanager", "Registered %s device %s", + device_class, name); + + g_free(name); + g_free(device_class); + g_free(id); +} + +static void +purple_media_manager_unregister_gst_device(PurpleMediaManager *manager, + GstDevice *device) +{ + GList *i; + gchar *name; + gchar *device_class; + gboolean done = FALSE; + + name = gst_device_get_display_name(device); + device_class = gst_device_get_device_class(device); + + for (i = manager->priv->elements; i && !done; i = i->next) { + PurpleMediaElementInfo *info = i->data; + GstDevice *device2; + + device2 = g_object_get_data(G_OBJECT(info), "gst-device"); + if (device2) { + gchar *name2; + gchar *device_class2; + + name2 = gst_device_get_display_name(device2); + device_class2 = gst_device_get_device_class(device2); + + if (purple_strequal(name, name2) && + purple_strequal(device_class, device_class2)) { + gchar *id; + + id = purple_media_element_info_get_id(info); + purple_media_manager_unregister_element(manager, + id); + + purple_debug_info("mediamanager", + "Unregistered %s device %s", + device_class, name); + + g_free(id); + + done = TRUE; + } + + g_free(name2); + g_free(device_class2); + } + } + + g_free(name); + g_free(device_class); +} + +static gboolean +device_monitor_bus_cb(GstBus *bus, GstMessage *message, gpointer user_data) +{ + PurpleMediaManager *manager = user_data; + GstMessageType message_type; + GstDevice *device; + + message_type = GST_MESSAGE_TYPE(message); + + if (message_type == GST_MESSAGE_DEVICE_ADDED) { + gst_message_parse_device_added(message, &device); + purple_media_manager_register_gst_device(manager, device); + } else if (message_type == GST_MESSAGE_DEVICE_REMOVED) { + gst_message_parse_device_removed (message, &device); + purple_media_manager_unregister_gst_device(manager, device); + } + + return G_SOURCE_CONTINUE; +} + +#endif /* GST_CHECK_VERSION(1, 4, 0) */ + +static void +purple_media_manager_init_device_monitor(PurpleMediaManager *manager) +{ +#if GST_CHECK_VERSION(1, 4, 0) + GstBus *bus; + GList *i; + + manager->priv->device_monitor = gst_device_monitor_new(); + + bus = gst_device_monitor_get_bus(manager->priv->device_monitor); + gst_bus_add_watch (bus, device_monitor_bus_cb, manager); + gst_object_unref (bus); + + /* This avoids warning in GStreamer logs about no filters set */ + gst_device_monitor_add_filter(manager->priv->device_monitor, NULL, NULL); + + gst_device_monitor_start(manager->priv->device_monitor); + + i = gst_device_monitor_get_devices(manager->priv->device_monitor); + for (; i; i = g_list_delete_link(i, i)) { + GstDevice *device = i->data; + + purple_media_manager_register_gst_device(manager, device); + gst_object_unref(device); + } +#endif /* GST_CHECK_VERSION(1, 4, 0) */ +} + /* * PurpleMediaElementType */ From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: b709356517b5: mediamanager: ignore PulseAudio moni... Message-ID: Changeset: b709356517b522c4215b39e56d44a2bdceb9d4ba Author: Jakub Adam Date: 2016-06-22 09:37 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/b709356517b5 Description: mediamanager: ignore PulseAudio monitors Ignore PulseAudio monitor audio sources since they have little use in the context of telephony. diffstat: libpurple/mediamanager.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 38 insertions(+), 0 deletions(-) diffs (55 lines): diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -1944,6 +1944,40 @@ gst_device_create_cb(PurpleMediaElementI return result; } +static gboolean +device_is_ignored(GstDevice *device) +{ + gboolean result = FALSE; + +#if GST_CHECK_VERSION(1, 6, 0) + gchar *device_class; + + g_return_val_if_fail(device, TRUE); + + device_class = gst_device_get_device_class(device); + + /* Ignore PulseAudio monitor audio sources since they have little use + * in the context of telephony.*/ + if (purple_strequal(device_class, "Audio/Source")) { + GstStructure *properties; + const gchar *pa_class; + + properties = gst_device_get_properties(device); + + pa_class = gst_structure_get_string(properties, "device.class"); + if (purple_strequal(pa_class, "monitor")) { + result = TRUE; + } + + gst_structure_free(properties); + } + + g_free(device_class); +#endif /* GST_CHECK_VERSION(1, 6, 0) */ + + return result; +} + static void purple_media_manager_register_gst_device(PurpleMediaManager *manager, GstDevice *device) @@ -1954,6 +1988,10 @@ purple_media_manager_register_gst_device gchar *device_class; gchar *id; + if (device_is_ignored(device)) { + return; + } + name = gst_device_get_display_name(device); device_class = gst_device_get_device_class(device); From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: c52fa2813311: mediamanager: add purple_media_manag... Message-ID: Changeset: c52fa28133112d26a9f0a401de3b9ef3ae5cf725 Author: Jakub Adam Date: 2016-06-22 10:15 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/c52fa2813311 Description: mediamanager: add purple_media_manager_enumerate_elements() diffstat: libpurple/media-gst.h | 11 +++++++++++ libpurple/mediamanager.c | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 0 deletions(-) diffs (53 lines): diff --git a/libpurple/media-gst.h b/libpurple/media-gst.h --- a/libpurple/media-gst.h +++ b/libpurple/media-gst.h @@ -163,6 +163,17 @@ GstElement *purple_media_manager_get_ele PurpleMediaSessionType type, PurpleMedia *media, const gchar *session_id, const gchar *participant); +/** + * purple_media_manager_enumerate_elements: + * @manager: The media manager to use to obtain the element infos. + * @type: The type of element infos to get. + * + * Returns: A #GList of registered #PurpleMediaElementInfo instances that match + * @type. + */ +GList *purple_media_manager_enumerate_elements(PurpleMediaManager *manager, + PurpleMediaElementType type); + PurpleMediaElementInfo *purple_media_manager_get_element_info( PurpleMediaManager *manager, const gchar *name); gboolean purple_media_manager_register_element(PurpleMediaManager *manager, diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -2118,6 +2118,28 @@ purple_media_manager_init_device_monitor #endif /* GST_CHECK_VERSION(1, 4, 0) */ } +GList * +purple_media_manager_enumerate_elements(PurpleMediaManager *manager, + PurpleMediaElementType type) +{ + GList *result = NULL; + GList *i; + + for (i = manager->priv->elements; i; i = i->next) { + PurpleMediaElementInfo *info = i->data; + PurpleMediaElementType type2; + + type2 = purple_media_element_info_get_element_type(info); + + if ((type2 & type) == type) { + g_object_ref(info); + result = g_list_prepend(result, info); + } + } + + return result; +} + /* * PurpleMediaElementType */ From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 3827fccb2f2b: mediamanager: register static elements Message-ID: Changeset: 3827fccb2f2bc308b36bd473944de803bea498d6 Author: Jakub Adam Date: 2016-06-22 12:09 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/3827fccb2f2b Description: mediamanager: register static elements These are source/sink elements which aren't dynamically inserted or removed as the devices managed by GstDeviceMonitor come and go. Namely they are default source and sinks (which represent their respective "autodetect" GStreamer elements), audio and video test signal sources, and video outputs (XVideo, OpenGL, DirectDraw, etc.). diffstat: libpurple/mediamanager.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 181 insertions(+), 2 deletions(-) diffs (221 lines): diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -121,6 +121,7 @@ static void free_appdata_info_locked (Pu #endif #ifdef USE_GSTREAMER static void purple_media_manager_init_device_monitor(PurpleMediaManager *manager); +static void purple_media_manager_register_static_elements(PurpleMediaManager *manager); #endif static GObjectClass *parent_class = NULL; @@ -218,6 +219,7 @@ purple_media_manager_init (PurpleMediaMa #endif #ifdef USE_GSTREAMER if (gst_init_check(NULL, NULL, &error)) { + purple_media_manager_register_static_elements(media); purple_media_manager_init_device_monitor(media); } else { purple_debug_error("mediamanager", @@ -1878,8 +1880,6 @@ purple_media_manager_receive_application #ifdef USE_GSTREAMER -#if GST_CHECK_VERSION(1, 4, 0) - static void videosink_disable_last_sample(GstElement *sink) { @@ -1890,6 +1890,8 @@ videosink_disable_last_sample(GstElement } } +#if GST_CHECK_VERSION(1, 4, 0) + static PurpleMediaElementType gst_class_to_purple_element_type(const gchar *device_class) { @@ -2140,6 +2142,183 @@ purple_media_manager_enumerate_elements( return result; } +static GstElement * +gst_factory_make_cb(PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant) +{ + gchar *id; + GstElement *element; + + id = purple_media_element_info_get_id(info); + + element = gst_element_factory_make(id, NULL); + + g_free(id); + + return element; +} + +static void +autovideosink_child_added_cb (GstChildProxy *child_proxy, GObject *object, + gchar *name, gpointer user_data) +{ + videosink_disable_last_sample(GST_ELEMENT(object)); +} + +static GstElement * +default_video_sink_create_cb(PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant) +{ + GstElement *videosink = gst_element_factory_make("autovideosink", NULL); + + g_signal_connect(videosink, "child-added", + G_CALLBACK(autovideosink_child_added_cb), NULL); + + return videosink; +} + +static GstElement * +disabled_video_create_cb(PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant) +{ + GstElement *src = gst_element_factory_make("videotestsrc", NULL); + + /* GST_VIDEO_TEST_SRC_BLACK */ + g_object_set(src, "pattern", 2, NULL); + + return src; +} + +static GstElement * +test_video_create_cb(PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant) +{ + GstElement *src = gst_element_factory_make("videotestsrc", NULL); + + g_object_set(src, "is-live", TRUE, NULL); + + return src; +} + +static void +purple_media_manager_register_static_elements(PurpleMediaManager *manager) +{ + static const gchar *VIDEO_SINK_PLUGINS[] = { + /* "aasink", "AALib", Didn't work for me */ + "directdrawsink", "DirectDraw", + "glimagesink", "OpenGL", + "ximagesink", "X Window System", + "xvimagesink", "X Window System (Xv)", + NULL + }; + const gchar **sinks = VIDEO_SINK_PLUGINS; + + /* Default auto* elements. */ + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", "autoaudiosrc", + "name", N_("Default"), + "type", PURPLE_MEDIA_ELEMENT_AUDIO + | PURPLE_MEDIA_ELEMENT_SRC + | PURPLE_MEDIA_ELEMENT_ONE_SRC + | PURPLE_MEDIA_ELEMENT_UNIQUE, + "create-cb", gst_factory_make_cb, + NULL)); + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", "autoaudiosink", + "name", N_("Default"), + "type", PURPLE_MEDIA_ELEMENT_AUDIO + | PURPLE_MEDIA_ELEMENT_SINK + | PURPLE_MEDIA_ELEMENT_ONE_SINK, + "create-cb", gst_factory_make_cb, + NULL)); + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", "autovideosrc", + "name", N_("Default"), + "type", PURPLE_MEDIA_ELEMENT_VIDEO + | PURPLE_MEDIA_ELEMENT_SRC + | PURPLE_MEDIA_ELEMENT_ONE_SRC + | PURPLE_MEDIA_ELEMENT_UNIQUE, + "create-cb", gst_factory_make_cb, + NULL)); + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", "autovideosink", + "name", N_("Default"), + "type", PURPLE_MEDIA_ELEMENT_VIDEO + | PURPLE_MEDIA_ELEMENT_SINK + | PURPLE_MEDIA_ELEMENT_ONE_SINK, + "create-cb", default_video_sink_create_cb, + NULL)); + + /* Special elements */ + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", "audiotestsrc", + /* Translators: This is a noun that refers to one + * possible audio input device. The user can employ the + * device to sanity check basic audio functionality + * within the libpurple client. */ + "name", N_("Test Sound"), + "type", PURPLE_MEDIA_ELEMENT_AUDIO + | PURPLE_MEDIA_ELEMENT_SRC + | PURPLE_MEDIA_ELEMENT_ONE_SRC, + "create-cb", gst_factory_make_cb, + NULL)); + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", "disabledvideosrc", + "name", N_("Disabled"), + "type", PURPLE_MEDIA_ELEMENT_VIDEO + | PURPLE_MEDIA_ELEMENT_SRC + | PURPLE_MEDIA_ELEMENT_ONE_SINK, + "create-cb", disabled_video_create_cb, + NULL)); + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", "videotestsrc", + /* Translators: This is a noun that refers to one + * possible video input device. The user can employ the + * device to sanity check basic video functionality + * within the libpurple client. */ + "name", N_("Test Pattern"), + "type", PURPLE_MEDIA_ELEMENT_VIDEO + | PURPLE_MEDIA_ELEMENT_SRC + | PURPLE_MEDIA_ELEMENT_ONE_SRC, + "create-cb", test_video_create_cb, + NULL)); + + for (sinks = VIDEO_SINK_PLUGINS; sinks[0]; sinks += 2) { + GstElementFactory *factory; + + factory = gst_element_factory_find(sinks[0]); + if (!factory) { + continue; + } + + purple_media_manager_register_element(manager, + g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + "id", sinks[0], + "name", sinks[1], + "type", PURPLE_MEDIA_ELEMENT_VIDEO + | PURPLE_MEDIA_ELEMENT_SINK + | PURPLE_MEDIA_ELEMENT_ONE_SINK, + "create-cb", gst_factory_make_cb, + NULL)); + + gst_object_unref(factory); + } +} + /* * PurpleMediaElementType */ From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: f12d4064eeae: pidgin/finch: use GStreamer-provided... Message-ID: Changeset: f12d4064eeaecaf9709edea3181249beac1c0bcb Author: Jakub Adam Date: 2016-06-23 14:31 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/f12d4064eeae Description: pidgin/finch: use GStreamer-provided VV elements On startup, don't register own "pidgindefault..." etc. elements with PurpleMediaManager; only set the active elements from application preferences. diffstat: finch/gntmedia.c | 41 +++++++++++++++++++++++++---- pidgin/gtkmedia.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 98 insertions(+), 18 deletions(-) diffs (216 lines): diff --git a/finch/gntmedia.c b/finch/gntmedia.c --- a/finch/gntmedia.c +++ b/finch/gntmedia.c @@ -408,6 +408,8 @@ call_cmd_cb(PurpleConversation *conv, co return PURPLE_CMD_RET_OK; } +#ifndef USE_GSTREAMER + static GstElement * create_default_audio_src(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) @@ -446,14 +448,41 @@ create_default_audio_sink(PurpleMediaEle } return sink; } +#endif /* USE_GSTREAMER */ #endif /* USE_VV */ void finch_media_manager_init(void) { #ifdef USE_VV PurpleMediaManager *manager = purple_media_manager_get(); - PurpleMediaElementInfo *default_audio_src = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + PurpleMediaElementInfo *audio_src; + PurpleMediaElementInfo *audio_sink; +#ifdef USE_GSTREAMER + const char *pref; + + pref = purple_prefs_get_string( + FINCH_PREFS_ROOT "/vvconfig/audio/src/device"); + audio_src = purple_media_manager_get_element_info(manager, pref); + if (!audio_src) { + pref = "autoaudiosrc"; + purple_prefs_set_string( + FINCH_PREFS_ROOT "/vvconfig/audio/src/device", pref); + audio_src = purple_media_manager_get_element_info(manager, + pref); + } + + pref = purple_prefs_get_string( + FINCH_PREFS_ROOT "/vvconfig/audio/sink/device"); + audio_sink = purple_media_manager_get_element_info(manager, pref); + if (!audio_sink) { + pref = "autoaudiosink"; + purple_prefs_set_string( + FINCH_PREFS_ROOT "/vvconfig/audio/sink/device", pref); + audio_sink = purple_media_manager_get_element_info(manager, + pref); + } +#else + audio_src = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "finchdefaultaudiosrc", "name", "Finch Default Audio Source", "type", PURPLE_MEDIA_ELEMENT_AUDIO @@ -461,14 +490,14 @@ void finch_media_manager_init(void) | PURPLE_MEDIA_ELEMENT_ONE_SRC | PURPLE_MEDIA_ELEMENT_UNIQUE, "create-cb", create_default_audio_src, NULL); - PurpleMediaElementInfo *default_audio_sink = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + audio_sink = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "finchdefaultaudiosink", "name", "Finch Default Audio Sink", "type", PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SINK | PURPLE_MEDIA_ELEMENT_ONE_SINK, "create-cb", create_default_audio_sink, NULL); +#endif /* USE_GSTREAMER */ g_signal_connect(G_OBJECT(manager), "init-media", G_CALLBACK(finch_new_media), NULL); purple_cmd_register("call", "", PURPLE_CMD_P_DEFAULT, @@ -480,8 +509,8 @@ void finch_media_manager_init(void) PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION); purple_debug_info("gntmedia", "Registering media element types\n"); - purple_media_manager_set_active_element(manager, default_audio_src); - purple_media_manager_set_active_element(manager, default_audio_sink); + purple_media_manager_set_active_element(manager, audio_src); + purple_media_manager_set_active_element(manager, audio_sink); #endif } diff --git a/pidgin/gtkmedia.c b/pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c +++ b/pidgin/gtkmedia.c @@ -1194,6 +1194,8 @@ pidgin_media_new_cb(PurpleMediaManager * return TRUE; } +#ifndef USE_GSTREAMER + static void videosink_disable_last_sample(GstElement *sink) { @@ -1432,6 +1434,7 @@ create_default_audio_sink(PurpleMediaEle } return sink; } +#endif /* USE_GSTREAMER */ #endif /* USE_VV */ void @@ -1439,8 +1442,58 @@ pidgin_medias_init(void) { #ifdef USE_VV PurpleMediaManager *manager = purple_media_manager_get(); - PurpleMediaElementInfo *default_video_src = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + PurpleMediaElementInfo *video_src; + PurpleMediaElementInfo *video_sink; + PurpleMediaElementInfo *audio_src; + PurpleMediaElementInfo *audio_sink; +#ifdef USE_GSTREAMER + const char *pref; + + pref = purple_prefs_get_string( + PIDGIN_PREFS_ROOT "/vvconfig/video/src/device"); + video_src = purple_media_manager_get_element_info(manager, pref); + if (!video_src) { + pref = "autovideosrc"; + purple_prefs_set_string( + PIDGIN_PREFS_ROOT "/vvconfig/video/src/device", pref); + video_src = purple_media_manager_get_element_info(manager, + pref); + } + + pref = purple_prefs_get_string( + PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device"); + video_sink = purple_media_manager_get_element_info(manager, pref); + if (!video_sink) { + pref = "autovideosink"; + purple_prefs_set_string( + PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device", pref); + video_sink = purple_media_manager_get_element_info(manager, + pref); + } + + pref = purple_prefs_get_string( + PIDGIN_PREFS_ROOT "/vvconfig/audio/src/device"); + audio_src = purple_media_manager_get_element_info(manager, pref); + if (!audio_src) { + pref = "autoaudiosrc"; + purple_prefs_set_string( + PIDGIN_PREFS_ROOT "/vvconfig/audio/src/device", pref); + audio_src = purple_media_manager_get_element_info(manager, + pref); + } + + pref = purple_prefs_get_string( + PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/device"); + audio_sink = purple_media_manager_get_element_info(manager, pref); + if (!audio_sink) { + pref = "autoaudiosink"; + purple_prefs_set_string( + PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/device", pref); + audio_sink = purple_media_manager_get_element_info(manager, + pref); + } +#else + video_src = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "pidgindefaultvideosrc", "name", "Pidgin Default Video Source", "type", PURPLE_MEDIA_ELEMENT_VIDEO @@ -1448,16 +1501,14 @@ pidgin_medias_init(void) | PURPLE_MEDIA_ELEMENT_ONE_SRC | PURPLE_MEDIA_ELEMENT_UNIQUE, "create-cb", create_default_video_src, NULL); - PurpleMediaElementInfo *default_video_sink = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + video_sink = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "pidgindefaultvideosink", "name", "Pidgin Default Video Sink", "type", PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SINK | PURPLE_MEDIA_ELEMENT_ONE_SINK, "create-cb", create_default_video_sink, NULL); - PurpleMediaElementInfo *default_audio_src = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + audio_src = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "pidgindefaultaudiosrc", "name", "Pidgin Default Audio Source", "type", PURPLE_MEDIA_ELEMENT_AUDIO @@ -1465,14 +1516,14 @@ pidgin_medias_init(void) | PURPLE_MEDIA_ELEMENT_ONE_SRC | PURPLE_MEDIA_ELEMENT_UNIQUE, "create-cb", create_default_audio_src, NULL); - PurpleMediaElementInfo *default_audio_sink = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + audio_sink = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "pidgindefaultaudiosink", "name", "Pidgin Default Audio Sink", "type", PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SINK | PURPLE_MEDIA_ELEMENT_ONE_SINK, "create-cb", create_default_audio_sink, NULL); +#endif /* USE_GSTREAMER */ g_signal_connect(G_OBJECT(manager), "init-media", G_CALLBACK(pidgin_media_new_cb), NULL); @@ -1485,10 +1536,10 @@ pidgin_medias_init(void) PURPLE_MEDIA_CAPS_AUDIO_VIDEO); purple_debug_info("gtkmedia", "Registering media element types\n"); - purple_media_manager_set_active_element(manager, default_video_src); - purple_media_manager_set_active_element(manager, default_video_sink); - purple_media_manager_set_active_element(manager, default_audio_src); - purple_media_manager_set_active_element(manager, default_audio_sink); + purple_media_manager_set_active_element(manager, video_src); + purple_media_manager_set_active_element(manager, video_sink); + purple_media_manager_set_active_element(manager, audio_src); + purple_media_manager_set_active_element(manager, audio_sink); #endif } From grim at reaperworld.com Mon Jul 18 00:33:08 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:08 -0400 Subject: /pidgin/main: cb1fbe968546: Merged in rlaager/pidgin/release-2.x... Message-ID: Changeset: cb1fbe968546cb7707d1ca7a6bd45b00e2673d4d Author: Gary Kramlich Date: 2016-07-01 16:21 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/cb1fbe968546 Description: Merged in rlaager/pidgin/release-2.x.y (pull request #68) Fix "e-mail" to "email" diffstat: pidgin/gtkdialogs.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/pidgin/gtkdialogs.c b/pidgin/gtkdialogs.c --- a/pidgin/gtkdialogs.c +++ b/pidgin/gtkdialogs.c @@ -551,7 +551,7 @@ void pidgin_dialogs_about(void) g_string_append(str, _("Help from other Pidgin users is " - "available by e-mailing support at pidgin.im
" "This is a public mailing list! " "(archive)
" From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 2051b23e562b: mediamanager: add "elements-changed"... Message-ID: Changeset: 2051b23e562b9f40c530f8ec98c49c73011e99a4 Author: Jakub Adam Date: 2016-06-23 12:57 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/2051b23e562b Description: mediamanager: add "elements-changed" signal diffstat: libpurple/mediamanager.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 52 insertions(+), 0 deletions(-) diffs (107 lines): diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -132,6 +132,7 @@ enum { INIT_MEDIA, INIT_PRIVATE_MEDIA, UI_CAPS_CHANGED, + ELEMENTS_CHANGED, LAST_SIGNAL }; static guint purple_media_manager_signals[LAST_SIGNAL] = {0}; @@ -198,6 +199,14 @@ purple_media_manager_class_init (PurpleM G_TYPE_NONE, 2, PURPLE_MEDIA_TYPE_CAPS, PURPLE_MEDIA_TYPE_CAPS); + purple_media_manager_signals[ELEMENTS_CHANGED] = + g_signal_new("elements-changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + g_type_class_add_private(klass, sizeof(PurpleMediaManagerPrivate)); } @@ -1268,6 +1277,30 @@ purple_media_manager_get_element_info(Pu return NULL; } +static GQuark +element_info_to_detail(PurpleMediaElementInfo *info) +{ + PurpleMediaElementType type; + + type = purple_media_element_info_get_element_type(info); + + if (type & PURPLE_MEDIA_ELEMENT_AUDIO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return g_quark_from_string("audiosrc"); + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return g_quark_from_string("audiosink"); + } + } else if (type & PURPLE_MEDIA_ELEMENT_VIDEO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return g_quark_from_string("videosrc"); + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return g_quark_from_string("videosink"); + } + } + + return 0; +} + gboolean purple_media_manager_register_element(PurpleMediaManager *manager, PurpleMediaElementInfo *info) @@ -1275,6 +1308,7 @@ purple_media_manager_register_element(Pu #ifdef USE_VV PurpleMediaElementInfo *info2; gchar *id; + GQuark detail; g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE); g_return_val_if_fail(info != NULL, FALSE); @@ -1290,6 +1324,14 @@ purple_media_manager_register_element(Pu manager->priv->elements = g_list_prepend(manager->priv->elements, info); + + detail = element_info_to_detail(info); + if (detail != 0) { + g_signal_emit(manager, + purple_media_manager_signals[ELEMENTS_CHANGED], + detail); + } + return TRUE; #else return FALSE; @@ -1302,6 +1344,7 @@ purple_media_manager_unregister_element( { #ifdef USE_VV PurpleMediaElementInfo *info; + GQuark detail; g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE); @@ -1321,9 +1364,18 @@ purple_media_manager_unregister_element( if (manager->priv->video_sink == info) manager->priv->video_sink = NULL; + detail = element_info_to_detail(info); + manager->priv->elements = g_list_remove( manager->priv->elements, info); g_object_unref(info); + + if (detail != 0) { + g_signal_emit(manager, + purple_media_manager_signals[ELEMENTS_CHANGED], + detail); + } + return TRUE; #else return FALSE; From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: d4ed67195cbf: gtkprefs: rework Voice/Video prefere... Message-ID: Changeset: d4ed67195cbf2f4b3e1878a9f9d25187730a1f3d Author: Jakub Adam Date: 2016-04-18 14:01 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/d4ed67195cbf Description: gtkprefs: rework Voice/Video preferences page * Don't hardcode supported source/sink plugins * Simplify the settings by removing "plugin" property. Each Voice/Video Src/Sink pair now has only "device" setting. * Use purple_media_manager_enumerate_devices() to get the available media elements. Those are either detected dynamically through GstDeviceMonitor or statically registered like default or test sources/sinks. diffstat: pidgin/gtkprefs.c | 240 +++++++++-------------------------------------------- 1 files changed, 44 insertions(+), 196 deletions(-) diffs (truncated from 347 to 300 lines): diff --git a/pidgin/gtkprefs.c b/pidgin/gtkprefs.c --- a/pidgin/gtkprefs.c +++ b/pidgin/gtkprefs.c @@ -128,58 +128,6 @@ static GtkListStore *prefs_smiley_themes #ifdef USE_VV -static const gchar *AUDIO_SRC_PLUGINS[] = { - "alsasrc", "ALSA", - "directsoundsrc", "DirectSound", - /* "esdmon", "ESD", ? */ - "osssrc", "OSS", - "pulsesrc", "PulseAudio", - "sndiosrc", "sndio", - /* "audiotestsrc wave=silence", "Silence", */ - /* Translators: This is a noun that refers to one possible audio input - plugin. The plugin can be used by the user to sanity check basic audio - functionality within Pidgin. */ - "audiotestsrc", N_("Test Sound"), - NULL -}; - -static const gchar *AUDIO_SINK_PLUGINS[] = { - "alsasink", "ALSA", - "directsoundsink", "DirectSound", - /* "gconfaudiosink", "GConf", */ - "artsdsink", "aRts", - "esdsink", "ESD", - "osssink", "OSS", - "pulsesink", "PulseAudio", - "sndiosink", "sndio", - NULL -}; - -static const gchar *VIDEO_SRC_PLUGINS[] = { - "videodisabledsrc", N_("Disabled"), - /* Translators: This is a noun that refers to one possible video input - plugin. The plugin can be used by the user to sanity check basic video - functionality within Pidgin. */ - "videotestsrc", N_("Test Input"), - "dshowvideosrc","DirectDraw", - "ksvideosrc", "KS Video", - "qcamsrc", "Quickcam", - "v4lsrc", "Video4Linux", - "v4l2src", "Video4Linux2", - "v4lmjpegsrc", "Video4Linux MJPEG", - NULL -}; - -static const gchar *VIDEO_SINK_PLUGINS[] = { - /* "aasink", "AALib", Didn't work for me */ - "directdrawsink", "DirectDraw", - /* "gconfvideosink", "GConf", */ - "glimagesink", "OpenGL", - "ximagesink", "X Window System", - "xvimagesink", "X Window System (Xv)", - NULL -}; - static GtkWidget *voice_level; static GtkWidget *voice_threshold; static GtkWidget *voice_volume; @@ -3392,71 +3340,24 @@ away_page(void) #ifdef USE_VV static GList * -get_vv_element_devices(const gchar *element_name) +get_vv_device_menuitems(PurpleMediaElementType type) { - GList *ret = NULL; - GstElement *element; - GObjectClass *klass; - - ret = g_list_prepend(ret, g_strdup(_("Default"))); - ret = g_list_prepend(ret, g_strdup("")); - - if (!strcmp(element_name, "") || (*element_name == '\0')) { - return g_list_reverse(ret); + GList *result = NULL; + GList *i; + + i = purple_media_manager_enumerate_elements(purple_media_manager_get(), + type); + for (; i; i = g_list_delete_link(i, i)) { + PurpleMediaElementInfo *info = i->data; + + result = g_list_append(result, + purple_media_element_info_get_name(info)); + result = g_list_append(result, + purple_media_element_info_get_id(info)); + g_object_unref(info); } - if (g_strcmp0(element_name, "videodisabledsrc") == 0) { - /* Translators: This string refers to 'static' or 'snow' sometimes - seen when trying to tune a TV to a non-existant analog station. */ - ret = g_list_prepend(ret, g_strdup(_("Random noise"))); - ret = g_list_prepend(ret, g_strdup("snow")); - - return g_list_reverse(ret); - } - - element = gst_element_factory_make(element_name, "test"); - if (!element) { - purple_debug_info("vvconfig", "'%s' - unable to find element\n", - element_name); - return g_list_reverse(ret); - } - - klass = G_OBJECT_GET_CLASS (element); - if (!klass) { - purple_debug_info("vvconfig", "'%s' - unable to find GObject " - "Class\n", element_name); - return g_list_reverse(ret); - } - - purple_debug_info("vvconfig", "'%s' - gstreamer-1.0 doesn't suport " - "property probing\n", element_name); - - gst_object_unref(element); - return g_list_reverse(ret); -} - -static GList * -get_vv_element_plugins(const gchar **plugins) -{ - GList *ret = NULL; - - ret = g_list_prepend(ret, (gpointer)_("Default")); - ret = g_list_prepend(ret, ""); - for (; plugins[0] && plugins[1]; plugins += 2) { -#if GST_CHECK_VERSION(1,0,0) - if (gst_registry_check_feature_version(gst_registry_get(), - plugins[0], 0, 0, 0) -#else - if (gst_default_registry_check_feature_version(plugins[0], 0, 0, 0) -#endif - || g_strcmp0(plugins[0], "videodisabledsrc") == 0) - { - ret = g_list_prepend(ret, (gpointer)_(plugins[1])); - ret = g_list_prepend(ret, (gpointer)plugins[0]); - } - } - - return g_list_reverse(ret); + return result; } static GstElement * @@ -3843,39 +3744,15 @@ make_video_test(GtkWidget *vbox) } static void -vv_plugin_changed_cb(const gchar *name, PurplePrefType type, +vv_device_changed_cb(const gchar *name, PurplePrefType type, gconstpointer value, gpointer data) { - GtkWidget *vbox = data; - GtkSizeGroup *sg; - GtkWidget *widget; - gchar *pref; - GList *devices; - - sg = g_object_get_data(G_OBJECT(vbox), "size-group"); - widget = g_object_get_data(G_OBJECT(vbox), "device-hbox"); - gtk_widget_destroy(widget); - - pref = g_strdup(name); - strcpy(pref + strlen(pref) - strlen("plugin"), "device"); - devices = get_vv_element_devices(value); - if (g_list_find_custom(devices, purple_prefs_get_string(pref), - (GCompareFunc)strcmp) == NULL) - { - GList *next = g_list_next(devices); - if (next) - purple_prefs_set_string(pref, next->data); - } - widget = pidgin_prefs_dropdown_from_list(vbox, _("_Device"), - PURPLE_PREF_STRING, pref, devices); - g_list_free_full(devices, g_free); - gtk_size_group_add_widget(sg, widget); - gtk_widget_set_halign(widget, GTK_ALIGN_START); - gtk_widget_set_valign(widget, GTK_ALIGN_CENTER); - - g_object_set_data(G_OBJECT(vbox), "device-hbox", - gtk_widget_get_parent(widget)); - g_signal_connect_swapped(widget, "destroy", G_CALLBACK(g_free), pref); + PurpleMediaManager *manager; + PurpleMediaElementInfo *info; + + manager = purple_media_manager_get(); + info = purple_media_manager_get_element_info(manager, value); + purple_media_manager_set_active_element(manager, info); /* Refresh test viewers */ if (strstr(name, "audio") && voice_pipeline) { @@ -3889,46 +3766,32 @@ vv_plugin_changed_cb(const gchar *name, static void make_vv_frame(GtkWidget *parent, GtkSizeGroup *sg, - const gchar *name, const gchar **plugin_strs, - const gchar *plugin_pref, const gchar *device_pref) + const gchar *name, PurpleMediaElementType element_type, + const gchar *preference_key) { GtkWidget *vbox, *widget; - GList *plugins, *devices; + GList *devices; vbox = pidgin_make_frame(parent, name); - /* Setup plugin preference */ - plugins = get_vv_element_plugins(plugin_strs); - widget = pidgin_prefs_dropdown_from_list(vbox, _("_Plugin"), - PURPLE_PREF_STRING, plugin_pref, - plugins); - g_list_free(plugins); - gtk_size_group_add_widget(sg, widget); - gtk_widget_set_halign(widget, GTK_ALIGN_START); - gtk_widget_set_valign(widget, GTK_ALIGN_CENTER); - /* Setup device preference */ - devices = get_vv_element_devices(purple_prefs_get_string(plugin_pref)); - if (g_list_find_custom(devices, purple_prefs_get_string(device_pref), + devices = get_vv_device_menuitems(element_type); + if (g_list_find_custom(devices, purple_prefs_get_string(preference_key), (GCompareFunc)strcmp) == NULL) { GList *next = g_list_next(devices); if (next) - purple_prefs_set_string(device_pref, next->data); + purple_prefs_set_string(preference_key, next->data); } widget = pidgin_prefs_dropdown_from_list(vbox, _("_Device"), - PURPLE_PREF_STRING, device_pref, - devices); + PURPLE_PREF_STRING, preference_key, devices); g_list_free_full(devices, g_free); gtk_size_group_add_widget(sg, widget); gtk_widget_set_halign(widget, GTK_ALIGN_START); gtk_widget_set_valign(widget, GTK_ALIGN_CENTER); - widget = gtk_widget_get_parent(widget); - g_object_set_data(G_OBJECT(vbox), "size-group", sg); - g_object_set_data(G_OBJECT(vbox), "device-hbox", widget); - purple_prefs_connect_callback(vbox, plugin_pref, vv_plugin_changed_cb, - vbox); + purple_prefs_connect_callback(vbox, preference_key, + vv_device_changed_cb, vbox); g_signal_connect_swapped(vbox, "destroy", G_CALLBACK(purple_prefs_disconnect_by_handle), vbox); } @@ -3946,20 +3809,20 @@ vv_page(void) sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); vbox = pidgin_make_frame(ret, _("Audio")); - make_vv_frame(vbox, sg, _("Input"), AUDIO_SRC_PLUGINS, - PIDGIN_PREFS_ROOT "/vvconfig/audio/src/plugin", + make_vv_frame(vbox, sg, _("Input"), + PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SRC, PIDGIN_PREFS_ROOT "/vvconfig/audio/src/device"); - make_vv_frame(vbox, sg, _("Output"), AUDIO_SINK_PLUGINS, - PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/plugin", + make_vv_frame(vbox, sg, _("Output"), + PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SINK, PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/device"); make_voice_test(vbox); vbox = pidgin_make_frame(ret, _("Video")); - make_vv_frame(vbox, sg, _("Input"), VIDEO_SRC_PLUGINS, - PIDGIN_PREFS_ROOT "/vvconfig/video/src/plugin", + make_vv_frame(vbox, sg, _("Input"), + PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SRC, PIDGIN_PREFS_ROOT "/vvconfig/video/src/device"); - make_vv_frame(vbox, sg, _("Output"), VIDEO_SINK_PLUGINS, - PIDGIN_PREFS_ROOT "/vvconfig/video/sink/plugin", + make_vv_frame(vbox, sg, _("Output"), + PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SINK, PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device"); make_video_test(vbox); @@ -4140,18 +4003,14 @@ pidgin_prefs_init(void) purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig"); purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/audio"); purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/audio/src"); - purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/audio/src/plugin", ""); purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/audio/src/device", ""); purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/audio/sink"); - purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/plugin", ""); purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/device", ""); purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/video"); purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/video/src"); - purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/video/src/plugin", ""); purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/video/src/device", ""); purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/video"); purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/video/sink"); - purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/video/sink/plugin", ""); purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device", ""); #endif From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: b091d0c4c8dd: gtkprefs: update respective combo on... Message-ID: Changeset: b091d0c4c8ddb671c494f420a9f4b62a5de06c8a Author: Jakub Adam Date: 2016-06-23 12:27 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/b091d0c4c8dd Description: gtkprefs: update respective combo on "elements-changed" diffstat: pidgin/gtkprefs.c | 130 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 104 insertions(+), 26 deletions(-) diffs (174 lines): diff --git a/pidgin/gtkprefs.c b/pidgin/gtkprefs.c --- a/pidgin/gtkprefs.c +++ b/pidgin/gtkprefs.c @@ -3764,18 +3764,37 @@ vv_device_changed_cb(const gchar *name, } } -static void -make_vv_frame(GtkWidget *parent, GtkSizeGroup *sg, - const gchar *name, PurpleMediaElementType element_type, - const gchar *preference_key) +static const char * +purple_media_type_to_preference_key(PurpleMediaElementType type) { - GtkWidget *vbox, *widget; + if (type & PURPLE_MEDIA_ELEMENT_AUDIO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return PIDGIN_PREFS_ROOT "/vvconfig/audio/src/device"; + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/device"; + } + } else if (type & PURPLE_MEDIA_ELEMENT_VIDEO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return PIDGIN_PREFS_ROOT "/vvconfig/video/src/device"; + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device"; + } + } + + return NULL; +} + +static GtkWidget * +make_vv_dropdown(GtkWidget *parent, GtkSizeGroup *size_group, + PurpleMediaElementType element_type) +{ + GtkWidget *label; + const gchar *preference_key; GList *devices; - vbox = pidgin_make_frame(parent, name); - - /* Setup device preference */ + preference_key = purple_media_type_to_preference_key(element_type); devices = get_vv_device_menuitems(element_type); + if (g_list_find_custom(devices, purple_prefs_get_string(preference_key), (GCompareFunc)strcmp) == NULL) { @@ -3783,17 +3802,64 @@ make_vv_frame(GtkWidget *parent, GtkSize if (next) purple_prefs_set_string(preference_key, next->data); } - widget = pidgin_prefs_dropdown_from_list(vbox, _("_Device"), + + label = pidgin_prefs_dropdown_from_list(parent, _("_Device"), PURPLE_PREF_STRING, preference_key, devices); + g_list_free_full(devices, g_free); - gtk_size_group_add_widget(sg, widget); - gtk_widget_set_halign(widget, GTK_ALIGN_START); - gtk_widget_set_valign(widget, GTK_ALIGN_CENTER); - - purple_prefs_connect_callback(vbox, preference_key, + + gtk_size_group_add_widget(size_group, label); + gtk_widget_set_halign(label, GTK_ALIGN_START); + gtk_widget_set_valign(label, GTK_ALIGN_CENTER); + + /* Return the parent GtkBox of dropdown and label, which was created + * in pidgin_prefs_dropdown_from_list(). */ + return gtk_widget_get_parent(label); +} + +static GtkWidget * +make_vv_frame(GtkWidget *parent, GtkSizeGroup *sg, + const gchar *name, PurpleMediaElementType type) +{ + GtkWidget *vbox; + GtkWidget *dropdown; + + vbox = pidgin_make_frame(parent, name); + + dropdown = make_vv_dropdown(vbox, sg, type); + + purple_prefs_connect_callback(vbox, + purple_media_type_to_preference_key(type), vv_device_changed_cb, vbox); g_signal_connect_swapped(vbox, "destroy", G_CALLBACK(purple_prefs_disconnect_by_handle), vbox); + + g_object_set_data(G_OBJECT(vbox), "vv_frame", vbox); + g_object_set_data(G_OBJECT(vbox), "vv_dropdown", dropdown); + g_object_set_data(G_OBJECT(vbox), "vv_size_group", sg); + g_object_set_data(G_OBJECT(vbox), "vv_media_type", (gpointer)type); + + return vbox; +} + +static void +device_list_changed_cb(PurpleMediaManager *manager, GtkWidget *widget) +{ + GtkWidget *frame; + GtkWidget *dropdown; + PurpleMediaElementType media_type; + + gtk_widget_destroy(g_object_get_data(G_OBJECT(widget), "vv_dropdown")); + + frame = g_object_get_data(G_OBJECT(widget), "vv_frame"); + media_type = (PurpleMediaElementType)g_object_get_data(G_OBJECT(widget), + "vv_media_type"); + + dropdown = make_vv_dropdown(frame, + g_object_get_data(G_OBJECT(widget), "vv_size_group"), + media_type); + + g_object_set_data(G_OBJECT(widget), "vv_dropdown", dropdown); } static GtkWidget * @@ -3801,29 +3867,41 @@ vv_page(void) { GtkWidget *ret; GtkWidget *vbox; + GtkWidget *frame; GtkSizeGroup *sg; + PurpleMediaManager *manager; ret = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PIDGIN_HIG_CAT_SPACE); gtk_container_set_border_width(GTK_CONTAINER(ret), PIDGIN_HIG_BORDER); sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + manager = purple_media_manager_get(); + vbox = pidgin_make_frame(ret, _("Audio")); - make_vv_frame(vbox, sg, _("Input"), - PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SRC, - PIDGIN_PREFS_ROOT "/vvconfig/audio/src/device"); - make_vv_frame(vbox, sg, _("Output"), - PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SINK, - PIDGIN_PREFS_ROOT "/vvconfig/audio/sink/device"); + frame = make_vv_frame(vbox, sg, _("Input"), + PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SRC); + g_signal_connect_object(manager, "elements-changed::audiosrc", + G_CALLBACK(device_list_changed_cb), frame, 0); + + frame = make_vv_frame(vbox, sg, _("Output"), + PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SINK); + g_signal_connect_object(manager, "elements-changed::audiosink", + G_CALLBACK(device_list_changed_cb), frame, 0); + make_voice_test(vbox); vbox = pidgin_make_frame(ret, _("Video")); - make_vv_frame(vbox, sg, _("Input"), - PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SRC, - PIDGIN_PREFS_ROOT "/vvconfig/video/src/device"); - make_vv_frame(vbox, sg, _("Output"), - PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SINK, - PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device"); + frame = make_vv_frame(vbox, sg, _("Input"), + PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SRC); + g_signal_connect_object(manager, "elements-changed::videosrc", + G_CALLBACK(device_list_changed_cb), frame, 0); + + frame = make_vv_frame(vbox, sg, _("Output"), + PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SINK); + g_signal_connect_object(manager, "elements-changed::videosink", + G_CALLBACK(device_list_changed_cb), frame, 0); + make_video_test(vbox); gtk_widget_show_all(ret); From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: ff1c58f6500e: mediamanager: clarify notes for tran... Message-ID: Changeset: ff1c58f6500e7f237c2f2986527f71a5a71c65ae Author: Jakub Adam Date: 2016-07-04 23:27 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/ff1c58f6500e Description: mediamanager: clarify notes for translators diffstat: libpurple/mediamanager.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diffs (30 lines): diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -2315,9 +2315,9 @@ purple_media_manager_register_static_ele g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "audiotestsrc", /* Translators: This is a noun that refers to one - * possible audio input device. The user can employ the - * device to sanity check basic audio functionality - * within the libpurple client. */ + * possible audio input device. The device can help the + * user to check if her speakers or headphones have been + * set up correctly for voice calling. */ "name", N_("Test Sound"), "type", PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SRC @@ -2339,9 +2339,10 @@ purple_media_manager_register_static_ele g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "videotestsrc", /* Translators: This is a noun that refers to one - * possible video input device. The user can employ the - * device to sanity check basic video functionality - * within the libpurple client. */ + * possible video input device. The device produces + * a test "monoscope" image that can help the user check + * the video output has been set up correctly without + * needing a webcam connected to the computer. */ "name", N_("Test Pattern"), "type", PURPLE_MEDIA_ELEMENT_VIDEO | PURPLE_MEDIA_ELEMENT_SRC From jakub.adam at ktknet.cz Mon Jul 18 00:33:09 2016 From: jakub.adam at ktknet.cz (Jakub Adam) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 19be2d31412a: Add ChangeLog.API entry for purple_m... Message-ID: Changeset: 19be2d31412ae30cb76760b62427c6d50e9cac1a Author: Jakub Adam Date: 2016-07-06 10:33 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/19be2d31412a Description: Add ChangeLog.API entry for purple_media_manager_enumerate_elements() diffstat: ChangeLog.API | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (11 lines): diff --git a/ChangeLog.API b/ChangeLog.API --- a/ChangeLog.API +++ b/ChangeLog.API @@ -71,6 +71,7 @@ version 3.0.0 (??/??/????): * purple_notify_searchresult_column_set_visible * purple_notify_user_info_entry_destroy * purple_notify_user_info_prepend_pair_plaintext + * purple_media_manager_enumerate_elements * purple_menu_action_get_callback * purple_menu_action_get_children * purple_menu_action_get_data From cmaiku at gmail.com Mon Jul 18 00:33:09 2016 From: cmaiku at gmail.com (Mike Ruprecht) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 0c19895fef84: irc: Fix compiling no member gsc in ... Message-ID: Changeset: 0c19895fef8434f9dc8b69b7cdb598da49e0a735 Author: Mike Ruprecht Date: 2016-07-06 14:05 -0500 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/0c19895fef84 Description: irc: Fix compiling no member gsc in irc_conn Port a reference to irc_conn.gsc to Gio I missed due having tested without HAVE_CYRUS_SASL enabled. This fixes building IRC when cyrus sasl is installed. diffstat: libpurple/protocols/irc/msgs.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/libpurple/protocols/irc/msgs.c b/libpurple/protocols/irc/msgs.c --- a/libpurple/protocols/irc/msgs.c +++ b/libpurple/protocols/irc/msgs.c @@ -1467,7 +1467,7 @@ irc_auth_start_cyrus(struct irc_conn *ir secprops.min_ssf = 0; secprops.security_flags = SASL_SEC_NOANONYMOUS; - if (!irc->gsc) { + if (!G_IS_TLS_CONNECTION(irc->conn)) { gboolean plaintext; secprops.max_ssf = -1; From grim at reaperworld.com Mon Jul 18 00:33:09 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: fa361c7394a2: Merged in xhaakon/pidgin (pull reque... Message-ID: Changeset: fa361c7394a259510beaefe6134211aa3ba2c3fb Author: Gary Kramlich Date: 2016-07-07 22:56 -0500 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/fa361c7394a2 Description: Merged in xhaakon/pidgin (pull request #86) GStreamer 1.0 media device management diffstat: ChangeLog.API | 1 + finch/gntmedia.c | 45 +++- libpurple/media-gst.h | 16 +- libpurple/mediamanager.c | 533 ++++++++++++++++++++++++++++++++++++++++++++++- pidgin/gtkmedia.c | 83 +++++- pidgin/gtkprefs.c | 350 ++++++++++++------------------ 6 files changed, 787 insertions(+), 241 deletions(-) diffs (truncated from 1412 to 300 lines): diff --git a/ChangeLog.API b/ChangeLog.API --- a/ChangeLog.API +++ b/ChangeLog.API @@ -71,6 +71,7 @@ version 3.0.0 (??/??/????): * purple_notify_searchresult_column_set_visible * purple_notify_user_info_entry_destroy * purple_notify_user_info_prepend_pair_plaintext + * purple_media_manager_enumerate_elements * purple_menu_action_get_callback * purple_menu_action_get_children * purple_menu_action_get_data diff --git a/finch/gntmedia.c b/finch/gntmedia.c --- a/finch/gntmedia.c +++ b/finch/gntmedia.c @@ -408,8 +408,10 @@ call_cmd_cb(PurpleConversation *conv, co return PURPLE_CMD_RET_OK; } +#ifndef USE_GSTREAMER + static GstElement * -create_default_audio_src(PurpleMedia *media, +create_default_audio_src(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *src; @@ -432,7 +434,7 @@ create_default_audio_src(PurpleMedia *me } static GstElement * -create_default_audio_sink(PurpleMedia *media, +create_default_audio_sink(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *sink; @@ -446,14 +448,41 @@ create_default_audio_sink(PurpleMedia *m } return sink; } +#endif /* USE_GSTREAMER */ #endif /* USE_VV */ void finch_media_manager_init(void) { #ifdef USE_VV PurpleMediaManager *manager = purple_media_manager_get(); - PurpleMediaElementInfo *default_audio_src = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + PurpleMediaElementInfo *audio_src; + PurpleMediaElementInfo *audio_sink; +#ifdef USE_GSTREAMER + const char *pref; + + pref = purple_prefs_get_string( + FINCH_PREFS_ROOT "/vvconfig/audio/src/device"); + audio_src = purple_media_manager_get_element_info(manager, pref); + if (!audio_src) { + pref = "autoaudiosrc"; + purple_prefs_set_string( + FINCH_PREFS_ROOT "/vvconfig/audio/src/device", pref); + audio_src = purple_media_manager_get_element_info(manager, + pref); + } + + pref = purple_prefs_get_string( + FINCH_PREFS_ROOT "/vvconfig/audio/sink/device"); + audio_sink = purple_media_manager_get_element_info(manager, pref); + if (!audio_sink) { + pref = "autoaudiosink"; + purple_prefs_set_string( + FINCH_PREFS_ROOT "/vvconfig/audio/sink/device", pref); + audio_sink = purple_media_manager_get_element_info(manager, + pref); + } +#else + audio_src = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "finchdefaultaudiosrc", "name", "Finch Default Audio Source", "type", PURPLE_MEDIA_ELEMENT_AUDIO @@ -461,14 +490,14 @@ void finch_media_manager_init(void) | PURPLE_MEDIA_ELEMENT_ONE_SRC | PURPLE_MEDIA_ELEMENT_UNIQUE, "create-cb", create_default_audio_src, NULL); - PurpleMediaElementInfo *default_audio_sink = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + audio_sink = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "finchdefaultaudiosink", "name", "Finch Default Audio Sink", "type", PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SINK | PURPLE_MEDIA_ELEMENT_ONE_SINK, "create-cb", create_default_audio_sink, NULL); +#endif /* USE_GSTREAMER */ g_signal_connect(G_OBJECT(manager), "init-media", G_CALLBACK(finch_new_media), NULL); purple_cmd_register("call", "", PURPLE_CMD_P_DEFAULT, @@ -480,8 +509,8 @@ void finch_media_manager_init(void) PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION); purple_debug_info("gntmedia", "Registering media element types\n"); - purple_media_manager_set_active_element(manager, default_audio_src); - purple_media_manager_set_active_element(manager, default_audio_sink); + purple_media_manager_set_active_element(manager, audio_src); + purple_media_manager_set_active_element(manager, audio_sink); #endif } diff --git a/libpurple/media-gst.h b/libpurple/media-gst.h --- a/libpurple/media-gst.h +++ b/libpurple/media-gst.h @@ -49,8 +49,9 @@ typedef struct _PurpleMediaElementInfo PurpleMediaElementInfo; typedef struct _PurpleMediaElementInfoClass PurpleMediaElementInfoClass; -typedef GstElement *(*PurpleMediaElementCreateCallback)(PurpleMedia *media, - const gchar *session_id, const gchar *participant); +typedef GstElement *(*PurpleMediaElementCreateCallback)( + PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant); /** * PurpleMediaElementType: @@ -162,6 +163,17 @@ GstElement *purple_media_manager_get_ele PurpleMediaSessionType type, PurpleMedia *media, const gchar *session_id, const gchar *participant); +/** + * purple_media_manager_enumerate_elements: + * @manager: The media manager to use to obtain the element infos. + * @type: The type of element infos to get. + * + * Returns: A #GList of registered #PurpleMediaElementInfo instances that match + * @type. + */ +GList *purple_media_manager_enumerate_elements(PurpleMediaManager *manager, + PurpleMediaElementType type); + PurpleMediaElementInfo *purple_media_manager_get_element_info( PurpleMediaManager *manager, const gchar *name); gboolean purple_media_manager_register_element(PurpleMediaManager *manager, diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -72,6 +72,12 @@ struct _PurpleMediaManagerPrivate PurpleMediaElementInfo *audio_src; PurpleMediaElementInfo *audio_sink; +#ifdef USE_GSTREAMER +#if GST_CHECK_VERSION(1, 4, 0) + GstDeviceMonitor *device_monitor; +#endif /* GST_CHECK_VERSION(1, 4, 0) */ +#endif /* USE_GSTREAMER */ + #ifdef HAVE_MEDIA_APPLICATION /* Application data streams */ GList *appdata_info; /* holds PurpleMediaAppDataInfo */ @@ -113,6 +119,10 @@ static void purple_media_manager_finaliz #ifdef HAVE_MEDIA_APPLICATION static void free_appdata_info_locked (PurpleMediaAppDataInfo *info); #endif +#ifdef USE_GSTREAMER +static void purple_media_manager_init_device_monitor(PurpleMediaManager *manager); +static void purple_media_manager_register_static_elements(PurpleMediaManager *manager); +#endif static GObjectClass *parent_class = NULL; @@ -122,6 +132,7 @@ enum { INIT_MEDIA, INIT_PRIVATE_MEDIA, UI_CAPS_CHANGED, + ELEMENTS_CHANGED, LAST_SIGNAL }; static guint purple_media_manager_signals[LAST_SIGNAL] = {0}; @@ -188,12 +199,24 @@ purple_media_manager_class_init (PurpleM G_TYPE_NONE, 2, PURPLE_MEDIA_TYPE_CAPS, PURPLE_MEDIA_TYPE_CAPS); + purple_media_manager_signals[ELEMENTS_CHANGED] = + g_signal_new("elements-changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + g_type_class_add_private(klass, sizeof(PurpleMediaManagerPrivate)); } static void purple_media_manager_init (PurpleMediaManager *media) { +#ifdef USE_GSTREAMER + GError *error; +#endif /* USE_GSTREAMER */ + media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media); media->priv->medias = NULL; media->priv->private_medias = NULL; @@ -203,6 +226,19 @@ purple_media_manager_init (PurpleMediaMa media->priv->appdata_info = NULL; g_mutex_init (&media->priv->appdata_mutex); #endif +#ifdef USE_GSTREAMER + if (gst_init_check(NULL, NULL, &error)) { + purple_media_manager_register_static_elements(media); + purple_media_manager_init_device_monitor(media); + } else { + purple_debug_error("mediamanager", + "GStreamer failed to initialize: %s.", + error ? error->message : ""); + if (error) { + g_error_free(error); + } + } +#endif /* USE_GSTREAMER */ purple_prefs_add_none("/purple/media"); purple_prefs_add_none("/purple/media/audio"); @@ -236,6 +272,14 @@ purple_media_manager_finalize (GObject * (GDestroyNotify) free_appdata_info_locked); g_mutex_clear (&priv->appdata_mutex); #endif +#ifdef USE_GSTREAMER +#if GST_CHECK_VERSION(1, 4, 0) + if (priv->device_monitor) { + gst_device_monitor_stop(priv->device_monitor); + g_object_unref(priv->device_monitor); + } +#endif /* GST_CHECK_VERSION(1, 4, 0) */ +#endif /* USE_GSTREAMER */ parent_class->finalize(media); } @@ -876,7 +920,7 @@ media_established_cb (PurpleMedia *media } static GstElement * -create_send_appsrc(PurpleMedia *media, +create_send_appsrc(PurpleMediaElementInfo *element_info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { PurpleMediaManager *manager = purple_media_manager_get (); @@ -1022,7 +1066,7 @@ appsink_destroyed (PurpleMediaAppDataInf } static GstElement * -create_recv_appsink(PurpleMedia *media, +create_recv_appsink(PurpleMediaElementInfo *element_info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { PurpleMediaManager *manager = purple_media_manager_get (); @@ -1233,6 +1277,30 @@ purple_media_manager_get_element_info(Pu return NULL; } +static GQuark +element_info_to_detail(PurpleMediaElementInfo *info) +{ + PurpleMediaElementType type; + + type = purple_media_element_info_get_element_type(info); + + if (type & PURPLE_MEDIA_ELEMENT_AUDIO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return g_quark_from_string("audiosrc"); + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return g_quark_from_string("audiosink"); + } + } else if (type & PURPLE_MEDIA_ELEMENT_VIDEO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return g_quark_from_string("videosrc"); + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return g_quark_from_string("videosink"); + } + } + + return 0; +} + gboolean purple_media_manager_register_element(PurpleMediaManager *manager, PurpleMediaElementInfo *info) @@ -1240,6 +1308,7 @@ purple_media_manager_register_element(Pu #ifdef USE_VV PurpleMediaElementInfo *info2; gchar *id; + GQuark detail; g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE); g_return_val_if_fail(info != NULL, FALSE); @@ -1255,6 +1324,14 @@ purple_media_manager_register_element(Pu manager->priv->elements = g_list_prepend(manager->priv->elements, info); + + detail = element_info_to_detail(info); + if (detail != 0) { + g_signal_emit(manager, From grim at reaperworld.com Mon Jul 18 00:33:09 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: ff0f9f09ee77: Merged in CMaiku/pidgin (pull reques... Message-ID: Changeset: ff0f9f09ee778ba9511bc943a7a30b4b9557b045 Author: Gary Kramlich Date: 2016-07-07 22:57 -0500 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/ff0f9f09ee77 Description: Merged in CMaiku/pidgin (pull request #88) irc: Fix compiling no member gsc in irc_conn diffstat: libpurple/protocols/irc/msgs.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/libpurple/protocols/irc/msgs.c b/libpurple/protocols/irc/msgs.c --- a/libpurple/protocols/irc/msgs.c +++ b/libpurple/protocols/irc/msgs.c @@ -1467,7 +1467,7 @@ irc_auth_start_cyrus(struct irc_conn *ir secprops.min_ssf = 0; secprops.security_flags = SASL_SEC_NOANONYMOUS; - if (!irc->gsc) { + if (!G_IS_TLS_CONNECTION(irc->conn)) { gboolean plaintext; secprops.max_ssf = -1; From grim at reaperworld.com Mon Jul 18 00:33:09 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 1cf07b94c6ca: Fix make check Message-ID: Changeset: 1cf07b94c6ca44814ad456de985947be66a391c8 Author: Gary Kramlich Date: 2016-07-07 23:39 -0500 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/1cf07b94c6ca Description: Fix make check diffstat: po/POTFILES.in | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diffs (19 lines): diff --git a/po/POTFILES.in b/po/POTFILES.in --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -51,6 +51,7 @@ libpurple/dbus-server.h libpurple/http.c libpurple/keyring.c libpurple/log.c +libpurple/mediamanager.c libpurple/media/backend-fs2.c libpurple/message.c libpurple/plugins.c @@ -161,6 +162,7 @@ libpurple/protocols/oscar/family_icbm.c libpurple/protocols/oscar/family_locate.c libpurple/protocols/oscar/flap_connection.c libpurple/protocols/oscar/icq.c +libpurple/protocols/oscar/kerberos.c libpurple/protocols/oscar/odc.c libpurple/protocols/oscar/oft.c libpurple/protocols/oscar/oscar.c From grim at reaperworld.com Mon Jul 18 00:33:09 2016 From: grim at reaperworld.com (Gary Kramlich) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: 73c2a7635d5b: Merged in kakaroto/main/release-2.x.... Message-ID: Changeset: 73c2a7635d5bb0ea4f27a1f313def9d57bba4d56 Author: Gary Kramlich Date: 2016-07-09 16:48 -0500 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/73c2a7635d5b Description: Merged in kakaroto/main/release-2.x.y (pull request #90) http: Use %.*s to debug print a non-null terminated string diffstat: libpurple/util.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/libpurple/util.c b/libpurple/util.c --- a/libpurple/util.c +++ b/libpurple/util.c @@ -4087,7 +4087,7 @@ url_fetch_send_cb(gpointer data, gint so } if(purple_debug_is_unsafe()) - purple_debug_misc("util", "Request: '%s'\n", gfud->request); + purple_debug_misc("util", "Request: '%.*s'\n", (int) gfud->request_len, gfud->request); else purple_debug_misc("util", "request constructed\n"); From kakaroto at kakaroto.homelinux.net Mon Jul 18 00:33:09 2016 From: kakaroto at kakaroto.homelinux.net (Youness Alaoui) Date: Mon, 18 Jul 2016 00:33:09 -0400 Subject: /pidgin/main: b8f3613c8673: http: Use %.*s to debug print a non-... Message-ID: Changeset: b8f3613c8673b11abf88e5a04a9c122cb1905722 Author: Youness Alaoui Date: 2016-07-08 16:20 -0400 Branch: release-2.x.y URL: https://hg.pidgin.im/pidgin/main/rev/b8f3613c8673 Description: http: Use %.*s to debug print a non-null terminated string This is in relation to PR 70 which changed a g_strdup into a g_memdup diffstat: libpurple/util.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/libpurple/util.c b/libpurple/util.c --- a/libpurple/util.c +++ b/libpurple/util.c @@ -4087,7 +4087,7 @@ url_fetch_send_cb(gpointer data, gint so } if(purple_debug_is_unsafe()) - purple_debug_misc("util", "Request: '%s'\n", gfud->request); + purple_debug_misc("util", "Request: '%.*s'\n", (int) gfud->request_len, gfud->request); else purple_debug_misc("util", "request constructed\n");