Sat, 10 Aug 2013 23:51:48 +0530
Undo action-related changes in UI
| finch/gntblist.c | file | annotate | diff | comparison | revisions | |
| libpurple/plugins.c | file | annotate | diff | comparison | revisions | |
| libpurple/prpl.c | file | annotate | diff | comparison | revisions | |
| pidgin/gtkblist.c | file | annotate | diff | comparison | revisions | |
| pidgin/gtkdocklet.c | file | annotate | diff | comparison | revisions |
--- a/finch/gntblist.c Sat Aug 10 23:24:36 2013 +0530 +++ b/finch/gntblist.c Sat Aug 10 23:51:48 2013 +0530 @@ -2450,53 +2450,25 @@ } static void -build_plugin_actions(GntMenuItem *item, PurplePlugin *plugin) +build_plugin_actions(GntMenuItem *item, PurplePlugin *plugin, gpointer context) { GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP); - GList *actions, *l; + GList *actions; GntMenuItem *menuitem; - actions = purple_plugin_get_actions(plugin); - gnt_menuitem_set_submenu(item, GNT_MENU(sub)); - for (l = actions; l; l = l->next) { - if (l->data) { - PurplePluginAction *action = l->data; + for (actions = PURPLE_PLUGIN_ACTIONS(plugin, context); actions; + actions = g_list_delete_link(actions, actions)) { + if (actions->data) { + PurplePluginAction *action = actions->data; + action->plugin = plugin; + action->context = context; menuitem = gnt_menuitem_new(action->label); gnt_menu_add_item(GNT_MENU(sub), menuitem); gnt_menuitem_set_callback(menuitem, plugin_action, action); - g_object_set_data(G_OBJECT(menuitem), "plugin_action", action); - } - } -} - -static void -protocol_action(GntMenuItem *item, gpointer data) -{ - PurpleProtocolAction *action = data; - if (action && action->callback) - action->callback(action); -} - -static void -build_protocol_actions(GntMenuItem *item, PurplePluginProtocolInfo *prpl_info, - PurpleConnection *gc) -{ - GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP); - GList *l; - GntMenuItem *menuitem; - - gnt_menuitem_set_submenu(item, GNT_MENU(sub)); - for (l = prpl_info->actions; l; l = l->next) { - if (l->data) { - PurpleProtocolAction *action = l->data; - action->connection = gc; - menuitem = gnt_menuitem_new(action->label); - gnt_menu_add_item(GNT_MENU(sub), menuitem); - - gnt_menuitem_set_callback(menuitem, protocol_action, action); - g_object_set_data(G_OBJECT(menuitem), "protocol_action", action); + g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", + action, (GDestroyNotify)purple_plugin_action_free); } } } @@ -2565,16 +2537,17 @@ gnt_menuitem_set_submenu(plg, GNT_MENU(sub)); for (iter = purple_plugins_get_loaded(); iter; iter = iter->next) { - PurplePlugin *plugin = PURPLE_PLUGIN(iter->data); - PurplePluginInfo *plugin_info = purple_plugin_get_info(plugin); + PurplePlugin *plugin = iter->data; GntMenuItem *item; - - if (!purple_plugin_get_actions(plugin)) + if (PURPLE_IS_PROTOCOL_PLUGIN(plugin)) + continue; + + if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin)) continue; - item = gnt_menuitem_new(_(purple_plugin_info_get_name(plugin_info))); + item = gnt_menuitem_new(_(plugin->info->name)); gnt_menu_add_item(GNT_MENU(sub), item); - build_plugin_actions(item, plugin); + build_plugin_actions(item, plugin, NULL); } } @@ -2599,16 +2572,16 @@ iter = g_list_delete_link(iter, iter)) { PurpleAccount *account = iter->data; PurpleConnection *gc = purple_account_get_connection(account); - PurplePluginProtocolInfo *prpl_info; + PurplePlugin *prpl; if (!gc || !PURPLE_CONNECTION_IS_CONNECTED(gc)) continue; - prpl_info = purple_connection_get_protocol_info(gc); - - if (prpl_info->actions != NULL) { + prpl = purple_connection_get_prpl(gc); + + if (PURPLE_PLUGIN_HAS_ACTIONS(prpl)) { item = gnt_menuitem_new(purple_account_get_username(account)); gnt_menu_add_item(GNT_MENU(sub), item); - build_protocol_actions(item, prpl_info, gc); + build_plugin_actions(item, prpl, gc); } } }
--- a/libpurple/plugins.c Sat Aug 10 23:24:36 2013 +0530 +++ b/libpurple/plugins.c Sat Aug 10 23:51:48 2013 +0530 @@ -151,10 +151,6 @@ purple_signals_disconnect_by_handle(plugin); - while (priv->actions) { - g_boxed_free(PURPLE_TYPE_PLUGIN_ACTION, priv->actions->data); - priv->actions = g_list_delete_link(priv->actions, priv->actions); - } priv->unloaded = TRUE; loaded_plugins = g_list_remove(loaded_plugins, plugin); @@ -434,11 +430,6 @@ { PurplePluginInfoPrivate *priv = PURPLE_PLUGIN_INFO_GET_PRIVATE(object); - while (priv->actions) { - g_boxed_free(PURPLE_TYPE_PLUGIN_ACTION, priv->actions->data); - priv->actions = g_list_delete_link(priv->actions, priv->actions); - } - g_free(priv->category); g_free(priv->ui_requirement); g_free(priv->error); @@ -743,13 +734,12 @@ { PurplePluginAction *action; - g_return_if_fail(label != NULL && callback != NULL); + g_return_val_if_fail(label != NULL && callback != NULL, NULL); action = g_new0(PurplePluginAction, 1); action->label = g_strdup(label); action->callback = callback; - action->plugin = plugin; return action; }
--- a/libpurple/prpl.c Sat Aug 10 23:24:36 2013 +0530 +++ b/libpurple/prpl.c Sat Aug 10 23:51:48 2013 +0530 @@ -626,7 +626,7 @@ { PurpleProtocolAction *action; - g_return_if_fail(label != NULL && callback != NULL); + g_return_val_if_fail(label != NULL && callback != NULL, NULL); action = g_new0(PurpleProtocolAction, 1);
--- a/pidgin/gtkblist.c Sat Aug 10 23:24:36 2013 +0530 +++ b/pidgin/gtkblist.c Sat Aug 10 23:51:48 2013 +0530 @@ -8108,7 +8108,7 @@ static void build_plugin_actions(GtkActionGroup *action_group, GString *ui, char *parent, - PurplePlugin *plugin) + PurplePlugin *plugin, gpointer context) { GtkAction *menuaction; PurplePluginAction *action = NULL; @@ -8116,11 +8116,13 @@ char *name; int count = 0; - actions = purple_plugin_get_actions(plugin); + actions = PURPLE_PLUGIN_ACTIONS(plugin, context); for (l = actions; l != NULL; l = l->next) { if (l->data) { action = (PurplePluginAction *)l->data; + action->plugin = plugin; + action->context = context; name = g_strdup_printf("%s-action-%d", parent, count++); menuaction = gtk_action_new(name, action->label, NULL, NULL); @@ -8129,13 +8131,16 @@ g_signal_connect(G_OBJECT(menuaction), "activate", G_CALLBACK(plugin_act), action); - g_object_set_data(G_OBJECT(menuaction), "plugin_action", - action); + g_object_set_data_full(G_OBJECT(menuaction), "plugin_action", + action, + (GDestroyNotify)purple_plugin_action_free); g_free(name); } else g_string_append(ui, "<separator/>"); } + + g_list_free(actions); } @@ -8246,6 +8251,7 @@ PurpleConnection *gc = NULL; PurpleAccount *account = NULL; GdkPixbuf *pixbuf = NULL; + PurplePlugin *plugin = NULL; PurplePluginProtocolInfo *prpl_info; account = accounts->data; @@ -8286,11 +8292,12 @@ pidgin_separator(submenu); gc = purple_account_get_connection(account); - prpl_info = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? purple_connection_get_protocol_info(gc) : NULL; + plugin = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? purple_connection_get_prpl(gc) : NULL; + prpl_info = plugin ? PURPLE_PLUGIN_PROTOCOL_INFO(plugin) : NULL; if (prpl_info && (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_moods) || - prpl_info->actions)) { + PURPLE_PLUGIN_HAS_ACTIONS(plugin))) { if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_moods) && (purple_connection_get_flags(gc) & PURPLE_CONNECTION_FLAG_SUPPORT_MOODS)) { @@ -8302,30 +8309,36 @@ } } - if (prpl_info->actions) { + if (PURPLE_PLUGIN_HAS_ACTIONS(plugin)) { GtkWidget *menuitem; - PurpleProtocolAction *action = NULL; - GList *l; - - for (l = prpl_info->actions; l != NULL; l = l->next) + PurplePluginAction *action = NULL; + GList *actions, *l; + + actions = PURPLE_PLUGIN_ACTIONS(plugin, gc); + + for (l = actions; l != NULL; l = l->next) { if (l->data) { - action = (PurpleProtocolAction *) l->data; - action->connection = gc; + action = (PurplePluginAction *) l->data; + action->plugin = plugin; + action->context = gc; menuitem = gtk_menu_item_new_with_label(action->label); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(plugin_act), action); - g_object_set_data(G_OBJECT(menuitem), "protocol_action", - action); + g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", + action, + (GDestroyNotify)purple_plugin_action_free); gtk_widget_show(menuitem); } else pidgin_separator(submenu); } + + g_list_free(actions); } } else { menuitem = gtk_menu_item_new_with_label(_("No actions available")); @@ -8377,21 +8390,21 @@ /* Add a submenu for each plugin with custom actions */ for (l = purple_plugins_get_loaded(); l; l = l->next) { char *name; - PurplePluginInfo *info; - - plugin = PURPLE_PLUGIN(l->data); - info = purple_plugin_get_info(plugin); - - if (!purple_plugin_get_actions(plugin)) + + plugin = (PurplePlugin *)l->data; + + if (PURPLE_IS_PROTOCOL_PLUGIN(plugin)) + continue; + + if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin)) continue; name = g_strdup_printf("plugin%d", count); - action = gtk_action_new(name, - purple_plugin_info_get_name(info), NULL, NULL); + action = gtk_action_new(name, plugin->info->name, NULL, NULL); gtk_action_group_add_action(plugins_action_group, action); g_string_append_printf(plugins_ui, "<menu action='%s'>", name); - build_plugin_actions(plugins_action_group, plugins_ui, name, plugin); + build_plugin_actions(plugins_action_group, plugins_ui, name, plugin, NULL); g_string_append(plugins_ui, "</menu>"); count++;
--- a/pidgin/gtkdocklet.c Sat Aug 10 23:24:36 2013 +0530 +++ b/pidgin/gtkdocklet.c Sat Aug 10 23:51:48 2013 +0530 @@ -631,31 +631,38 @@ } static void -build_plugin_actions(GtkWidget *menu, PurplePlugin *plugin) +build_plugin_actions(GtkWidget *menu, PurplePlugin *plugin, + gpointer context) { GtkWidget *menuitem; PurplePluginAction *action = NULL; GList *actions, *l; - actions = purple_plugin_get_actions(plugin); + actions = PURPLE_PLUGIN_ACTIONS(plugin, context); for (l = actions; l != NULL; l = l->next) { if (l->data) { action = (PurplePluginAction *) l->data; + action->plugin = plugin; + action->context = context; menuitem = gtk_menu_item_new_with_label(action->label); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(plugin_act), action); - g_object_set_data(G_OBJECT(menuitem), "plugin_action", action); + g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", + action, + (GDestroyNotify)purple_plugin_action_free); gtk_widget_show(menuitem); } else pidgin_separator(menu); } + + g_list_free(actions); } @@ -664,7 +671,6 @@ { GtkWidget *menuitem, *submenu; PurplePlugin *plugin = NULL; - PurplePluginInfo *info; GList *l; int c = 0; @@ -672,19 +678,21 @@ /* Add a submenu for each plugin with custom actions */ for (l = purple_plugins_get_loaded(); l; l = l->next) { - plugin = PURPLE_PLUGIN(l->data); - info = purple_plugin_get_info(plugin); + plugin = (PurplePlugin *) l->data; - if (!purple_plugin_get_actions(plugin)) + if (PURPLE_IS_PROTOCOL_PLUGIN(plugin)) continue; - menuitem = gtk_image_menu_item_new_with_label(_(purple_plugin_info_get_name(info))); + if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin)) + continue; + + menuitem = gtk_image_menu_item_new_with_label(_(plugin->info->name)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); - build_plugin_actions(submenu, plugin); + build_plugin_actions(submenu, plugin, NULL); c++; }