| 99 |
99 |
| 100 /****************************************************************************** |
100 /****************************************************************************** |
| 101 * Code |
101 * Code |
| 102 *****************************************************************************/ |
102 *****************************************************************************/ |
| 103 |
103 |
| 104 GtkWidget *pidgin_separator(GtkWidget *menu) |
|
| 105 { |
|
| 106 GtkWidget *menuitem; |
|
| 107 |
|
| 108 menuitem = gtk_separator_menu_item_new(); |
|
| 109 gtk_widget_show(menuitem); |
|
| 110 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 111 return menuitem; |
|
| 112 } |
|
| 113 |
|
| 114 GtkWidget *pidgin_new_check_item(GtkWidget *menu, const char *str, |
|
| 115 GCallback cb, gpointer data, gboolean checked) |
|
| 116 { |
|
| 117 GtkWidget *menuitem; |
|
| 118 menuitem = gtk_check_menu_item_new_with_mnemonic(str); |
|
| 119 |
|
| 120 if (menu) |
|
| 121 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 122 |
|
| 123 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), checked); |
|
| 124 |
|
| 125 if (cb) |
|
| 126 g_signal_connect(G_OBJECT(menuitem), "activate", cb, data); |
|
| 127 |
|
| 128 gtk_widget_show_all(menuitem); |
|
| 129 |
|
| 130 return menuitem; |
|
| 131 } |
|
| 132 |
|
| 133 GtkWidget *pidgin_new_menu_item(GtkWidget *menu, const char *mnemonic, |
104 GtkWidget *pidgin_new_menu_item(GtkWidget *menu, const char *mnemonic, |
| 134 const char *icon, GCallback cb, gpointer data) |
105 const char *icon, GCallback cb, gpointer data) |
| 135 { |
106 { |
| 136 GtkWidget *menuitem; |
107 GtkWidget *menuitem; |
| 137 GtkWidget *box; |
108 GtkWidget *box; |
| 404 |
375 |
| 405 protocol = purple_account_get_protocol(account); |
376 protocol = purple_account_get_protocol(account); |
| 406 if (protocol == NULL) |
377 if (protocol == NULL) |
| 407 return NULL; |
378 return NULL; |
| 408 return pidgin_create_icon_from_protocol(protocol, size, account); |
379 return pidgin_create_icon_from_protocol(protocol, size, account); |
| 409 } |
|
| 410 |
|
| 411 static void |
|
| 412 menu_action_cb(GtkMenuItem *item, gpointer object) |
|
| 413 { |
|
| 414 gpointer data; |
|
| 415 void (*callback)(gpointer, gpointer); |
|
| 416 |
|
| 417 callback = g_object_get_data(G_OBJECT(item), "purplecallback"); |
|
| 418 data = g_object_get_data(G_OBJECT(item), "purplecallbackdata"); |
|
| 419 |
|
| 420 if (callback) |
|
| 421 callback(object, data); |
|
| 422 } |
|
| 423 |
|
| 424 static GtkWidget * |
|
| 425 do_pidgin_append_menu_action(GtkWidget *menu, PurpleActionMenu *act, |
|
| 426 gpointer object) |
|
| 427 { |
|
| 428 GtkWidget *menuitem; |
|
| 429 GList *list; |
|
| 430 |
|
| 431 if (act == NULL) { |
|
| 432 return pidgin_separator(menu); |
|
| 433 } |
|
| 434 |
|
| 435 menuitem = gtk_menu_item_new_with_mnemonic( |
|
| 436 purple_action_menu_get_label(act)); |
|
| 437 |
|
| 438 list = purple_action_menu_get_children(act); |
|
| 439 |
|
| 440 if (list == NULL) { |
|
| 441 GCallback callback; |
|
| 442 |
|
| 443 callback = purple_action_menu_get_callback(act); |
|
| 444 |
|
| 445 if (callback != NULL) { |
|
| 446 g_object_set_data(G_OBJECT(menuitem), |
|
| 447 "purplecallback", |
|
| 448 callback); |
|
| 449 g_object_set_data(G_OBJECT(menuitem), |
|
| 450 "purplecallbackdata", |
|
| 451 purple_action_menu_get_data(act)); |
|
| 452 g_signal_connect(G_OBJECT(menuitem), "activate", |
|
| 453 G_CALLBACK(menu_action_cb), |
|
| 454 object); |
|
| 455 } else { |
|
| 456 gtk_widget_set_sensitive(menuitem, FALSE); |
|
| 457 } |
|
| 458 |
|
| 459 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 460 } else { |
|
| 461 GList *l = NULL; |
|
| 462 GtkWidget *submenu = NULL; |
|
| 463 GtkAccelGroup *group; |
|
| 464 |
|
| 465 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 466 |
|
| 467 submenu = gtk_menu_new(); |
|
| 468 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
|
| 469 |
|
| 470 group = gtk_menu_get_accel_group(GTK_MENU(menu)); |
|
| 471 if (group) { |
|
| 472 char *path = g_strdup_printf("%s/%s", |
|
| 473 gtk_menu_item_get_accel_path(GTK_MENU_ITEM(menuitem)), |
|
| 474 purple_action_menu_get_label(act)); |
|
| 475 gtk_menu_set_accel_path(GTK_MENU(submenu), path); |
|
| 476 g_free(path); |
|
| 477 gtk_menu_set_accel_group(GTK_MENU(submenu), group); |
|
| 478 } |
|
| 479 |
|
| 480 for (l = list; l; l = l->next) { |
|
| 481 PurpleActionMenu *act = (PurpleActionMenu *)l->data; |
|
| 482 |
|
| 483 do_pidgin_append_menu_action(submenu, act, object); |
|
| 484 } |
|
| 485 } |
|
| 486 return menuitem; |
|
| 487 } |
|
| 488 |
|
| 489 GtkWidget * |
|
| 490 pidgin_append_menu_action(GtkWidget *menu, PurpleActionMenu *act, |
|
| 491 gpointer object) |
|
| 492 { |
|
| 493 GtkWidget *menuitem = do_pidgin_append_menu_action(menu, act, object); |
|
| 494 purple_action_menu_free(act); |
|
| 495 return menuitem; |
|
| 496 } |
380 } |
| 497 |
381 |
| 498 static gboolean buddyname_completion_match_func(GtkEntryCompletion *completion, |
382 static gboolean buddyname_completion_match_func(GtkEntryCompletion *completion, |
| 499 const gchar *key, GtkTreeIter *iter, gpointer user_data) |
383 const gchar *key, GtkTreeIter *iter, gpointer user_data) |
| 500 { |
384 { |