| 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 |