finch/gntblist.c

branch
soc.2013.gobjectification.plugins
changeset 36489
6e8edeb3f3f9
parent 36488
48c3419844f0
child 36490
f8b890ba0789
equal deleted inserted replaced
36488:48c3419844f0 36489:6e8edeb3f3f9
2448 if (action && action->callback) 2448 if (action && action->callback)
2449 action->callback(action); 2449 action->callback(action);
2450 } 2450 }
2451 2451
2452 static void 2452 static void
2453 build_plugin_actions(GntMenuItem *item, PurplePlugin *plugin, gpointer context) 2453 build_plugin_actions(GntMenuItem *item, PurplePlugin *plugin)
2454 { 2454 {
2455 GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP); 2455 GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP);
2456 PurplePluginGetActionsCallback get_actions;
2456 GList *actions; 2457 GList *actions;
2457 GntMenuItem *menuitem; 2458 GntMenuItem *menuitem;
2458 2459
2460 get_actions =
2461 purple_plugin_info_get_actions_callback(purple_plugin_get_info(plugin));
2462
2459 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); 2463 gnt_menuitem_set_submenu(item, GNT_MENU(sub));
2460 for (actions = PURPLE_PLUGIN_ACTIONS(plugin, context); actions; 2464 for (actions = get_actions(plugin); actions;
2461 actions = g_list_delete_link(actions, actions)) { 2465 actions = g_list_delete_link(actions, actions)) {
2462 if (actions->data) { 2466 if (actions->data) {
2463 PurplePluginAction *action = actions->data; 2467 PurplePluginAction *action = actions->data;
2464 action->plugin = plugin; 2468 action->plugin = plugin;
2465 action->context = context;
2466 menuitem = gnt_menuitem_new(action->label); 2469 menuitem = gnt_menuitem_new(action->label);
2467 gnt_menu_add_item(GNT_MENU(sub), menuitem); 2470 gnt_menu_add_item(GNT_MENU(sub), menuitem);
2468 2471
2469 gnt_menuitem_set_callback(menuitem, plugin_action, action); 2472 gnt_menuitem_set_callback(menuitem, plugin_action, action);
2470 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", 2473 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action",
2471 action, (GDestroyNotify)purple_plugin_action_free); 2474 action, (GDestroyNotify)purple_plugin_action_free);
2475 }
2476 }
2477 }
2478
2479 static void
2480 protocol_action(GntMenuItem *item, gpointer data)
2481 {
2482 PurpleProtocolAction *action = data;
2483 if (action && action->callback)
2484 action->callback(action);
2485 }
2486
2487 static void
2488 build_protocol_actions(GntMenuItem *item, PurplePluginProtocolInfo *prpl_info,
2489 PurpleConnection *gc)
2490 {
2491 GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP);
2492 GList *actions;
2493 GntMenuItem *menuitem;
2494
2495 gnt_menuitem_set_submenu(item, GNT_MENU(sub));
2496 for (actions = prpl_info->actions(gc); actions;
2497 actions = g_list_delete_link(actions, actions)) {
2498 if (actions->data) {
2499 PurpleProtocolAction *action = actions->data;
2500 action->connection = gc;
2501 menuitem = gnt_menuitem_new(action->label);
2502 gnt_menu_add_item(GNT_MENU(sub), menuitem);
2503
2504 gnt_menuitem_set_callback(menuitem, protocol_action, action);
2505 g_object_set_data_full(G_OBJECT(menuitem), "protocol_action",
2506 action, (GDestroyNotify)purple_protocol_action_free);
2472 } 2507 }
2473 } 2508 }
2474 } 2509 }
2475 2510
2476 static gboolean 2511 static gboolean
2536 sub = gnt_menu_new(GNT_MENU_POPUP); 2571 sub = gnt_menu_new(GNT_MENU_POPUP);
2537 gnt_menuitem_set_submenu(plg, GNT_MENU(sub)); 2572 gnt_menuitem_set_submenu(plg, GNT_MENU(sub));
2538 2573
2539 for (iter = purple_plugins_get_loaded(); iter; iter = iter->next) { 2574 for (iter = purple_plugins_get_loaded(); iter; iter = iter->next) {
2540 PurplePlugin *plugin = iter->data; 2575 PurplePlugin *plugin = iter->data;
2576 PurplePluginInfo *info = purple_plugin_get_info(plugin);
2541 GntMenuItem *item; 2577 GntMenuItem *item;
2542 if (PURPLE_IS_PROTOCOL_PLUGIN(plugin)) 2578
2579 if (!purple_plugin_info_get_actions_callback(info))
2543 continue; 2580 continue;
2544 2581
2545 if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin)) 2582 item = gnt_menuitem_new(_(purple_plugin_info_get_name(info)));
2546 continue;
2547
2548 item = gnt_menuitem_new(_(plugin->info->name));
2549 gnt_menu_add_item(GNT_MENU(sub), item); 2583 gnt_menu_add_item(GNT_MENU(sub), item);
2550 build_plugin_actions(item, plugin, NULL); 2584 build_plugin_actions(item, plugin);
2551 } 2585 }
2552 } 2586 }
2553 2587
2554 static void 2588 static void
2555 reconstruct_accounts_menu(void) 2589 reconstruct_accounts_menu(void)
2570 2604
2571 for (iter = purple_accounts_get_all_active(); iter; 2605 for (iter = purple_accounts_get_all_active(); iter;
2572 iter = g_list_delete_link(iter, iter)) { 2606 iter = g_list_delete_link(iter, iter)) {
2573 PurpleAccount *account = iter->data; 2607 PurpleAccount *account = iter->data;
2574 PurpleConnection *gc = purple_account_get_connection(account); 2608 PurpleConnection *gc = purple_account_get_connection(account);
2575 PurplePlugin *prpl; 2609 PurplePluginProtocolInfo *prpl_info;
2576 2610
2577 if (!gc || !PURPLE_CONNECTION_IS_CONNECTED(gc)) 2611 if (!gc || !PURPLE_CONNECTION_IS_CONNECTED(gc))
2578 continue; 2612 continue;
2579 prpl = purple_connection_get_prpl(gc); 2613 prpl_info = purple_connection_get_protocol_info(gc);
2580 2614
2581 if (PURPLE_PLUGIN_HAS_ACTIONS(prpl)) { 2615 if (prpl_info->actions) {
2582 item = gnt_menuitem_new(purple_account_get_username(account)); 2616 item = gnt_menuitem_new(purple_account_get_username(account));
2583 gnt_menu_add_item(GNT_MENU(sub), item); 2617 gnt_menu_add_item(GNT_MENU(sub), item);
2584 build_plugin_actions(item, prpl, gc); 2618 build_protocol_actions(item, prpl_info, gc);
2585 } 2619 }
2586 } 2620 }
2587 } 2621 }
2588 2622
2589 static void 2623 static void

mercurial