comparison pidgin/gtkdocklet.c @ 20895:dc94a669bbf6

merge of '0799c401a032f2fe66af5bbf14c1269fa11fe738' and 'fa0e512d79dfe479bc36c2436089b51854ef3eb5'
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Fri, 12 Oct 2007 11:19:17 +0000
parents 39a793dcb9df c7b20abc3885
children 1d8969748cd9 8b9c48347004
comparison
equal deleted inserted replaced
20894:39a793dcb9df 20895:dc94a669bbf6
471 pidgin_new_item_from_stock(submenu, _("Saved..."), NULL, G_CALLBACK(pidgin_status_window_show), NULL, 0, 0, NULL); 471 pidgin_new_item_from_stock(submenu, _("Saved..."), NULL, G_CALLBACK(pidgin_status_window_show), NULL, 0, 0, NULL);
472 472
473 return menuitem; 473 return menuitem;
474 } 474 }
475 475
476
477
478 static void
479 plugin_act(GtkObject *obj, PurplePluginAction *pam)
480 {
481 if (pam && pam->callback)
482 pam->callback(pam);
483 }
484
485 static void
486 build_plugin_actions(GtkWidget *menu, PurplePlugin *plugin,
487 gpointer context)
488 {
489 GtkWidget *menuitem;
490 PurplePluginAction *action = NULL;
491 GList *actions, *l;
492
493 actions = PURPLE_PLUGIN_ACTIONS(plugin, context);
494
495 for (l = actions; l != NULL; l = l->next)
496 {
497 if (l->data)
498 {
499 action = (PurplePluginAction *) l->data;
500 action->plugin = plugin;
501 action->context = context;
502
503 menuitem = gtk_menu_item_new_with_label(action->label);
504 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
505
506 g_signal_connect(G_OBJECT(menuitem), "activate",
507 G_CALLBACK(plugin_act), action);
508 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action",
509 action,
510 (GDestroyNotify)purple_plugin_action_free);
511 gtk_widget_show(menuitem);
512 }
513 else
514 pidgin_separator(menu);
515 }
516
517 g_list_free(actions);
518 }
519
520
521 static void
522 docklet_plugin_actions(GtkWidget *menu)
523 {
524 GtkWidget *menuitem, *submenu;
525 PurplePlugin *plugin = NULL;
526 GList *l;
527 int c = 0;
528
529 g_return_if_fail(menu != NULL);
530
531 /* Add a submenu for each plugin with custom actions */
532 for (l = purple_plugins_get_loaded(); l; l = l->next) {
533 plugin = (PurplePlugin *) l->data;
534
535 if (PURPLE_IS_PROTOCOL_PLUGIN(plugin))
536 continue;
537
538 if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin))
539 continue;
540
541 menuitem = gtk_image_menu_item_new_with_label(_(plugin->info->name));
542 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
543 gtk_widget_show(menuitem);
544
545 submenu = gtk_menu_new();
546 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
547 gtk_widget_show(submenu);
548
549 build_plugin_actions(submenu, plugin, NULL);
550
551 c++;
552 }
553 if(c>0)
554 pidgin_separator(menu);
555 }
556
476 static void 557 static void
477 docklet_menu() { 558 docklet_menu() {
478 static GtkWidget *menu = NULL; 559 static GtkWidget *menu = NULL;
479 GtkWidget *menuitem; 560 GtkWidget *menuitem;
480 561
536 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/blink")); 617 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/blink"));
537 g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(docklet_toggle_blink), NULL); 618 g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(docklet_toggle_blink), NULL);
538 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 619 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
539 620
540 pidgin_separator(menu); 621 pidgin_separator(menu);
622
623 /* add plugin actions */
624 docklet_plugin_actions(menu);
541 625
542 pidgin_new_item_from_stock(menu, _("Quit"), GTK_STOCK_QUIT, G_CALLBACK(purple_core_quit), NULL, 0, 0, NULL); 626 pidgin_new_item_from_stock(menu, _("Quit"), GTK_STOCK_QUIT, G_CALLBACK(purple_core_quit), NULL, 0, 0, NULL);
543 627
544 #ifdef _WIN32 628 #ifdef _WIN32
545 g_signal_connect(menu, "leave-notify-event", G_CALLBACK(docklet_menu_leave_enter), NULL); 629 g_signal_connect(menu, "leave-notify-event", G_CALLBACK(docklet_menu_leave_enter), NULL);