| 3515 } |
3513 } |
| 3516 |
3514 |
| 3517 /*************************************************** |
3515 /*************************************************** |
| 3518 * Crap * |
3516 * Crap * |
| 3519 ***************************************************/ |
3517 ***************************************************/ |
| 3520 /* TODO: fill out tooltips... */ |
|
| 3521 static const GtkActionEntry blist_menu_entries[] = { |
3518 static const GtkActionEntry blist_menu_entries[] = { |
| 3522 /* NOTE: Do not set any accelerator to Control+O. It is mapped by |
|
| 3523 gtk_blist_key_press_cb to "Get User Info" on the selected buddy. */ |
|
| 3524 /* Accounts menu */ |
|
| 3525 { "AccountsMenu", NULL, N_("_Accounts"), NULL, NULL, NULL }, |
|
| 3526 |
|
| 3527 /* Tools */ |
3519 /* Tools */ |
| 3528 { "ToolsMenu", NULL, N_("_Tools"), NULL, NULL, NULL }, |
3520 { "ToolsMenu", NULL, N_("_Tools"), NULL, NULL, NULL }, |
| 3529 { "SetMood", NULL, N_("Set _Mood"), "<control>D", NULL, set_mood_show }, |
3521 { "SetMood", NULL, N_("Set _Mood"), "<control>D", NULL, set_mood_show }, |
| 3530 }; |
3522 }; |
| 3531 |
3523 |
| 3532 static const char *blist_menu = |
3524 static const char *blist_menu = |
| 3533 "<ui>" |
3525 "<ui>" |
| 3534 "<menubar name='BList'>" |
3526 "<menubar name='BList'>" |
| 3535 "<menu action='AccountsMenu'>" |
|
| 3536 "</menu>" |
|
| 3537 "<menu action='ToolsMenu'>" |
3527 "<menu action='ToolsMenu'>" |
| 3538 "<menuitem action='SetMood'/>" |
3528 "<menuitem action='SetMood'/>" |
| 3539 "</menu>" |
3529 "</menu>" |
| 3540 "</menubar>" |
3530 "</menubar>" |
| 3541 "</ui>"; |
3531 "</ui>"; |
| 7643 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
7619 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
| 7644 return; |
7620 return; |
| 7645 } |
7621 } |
| 7646 } |
7622 } |
| 7647 |
7623 |
| 7648 static void |
|
| 7649 modify_account_cb(GtkWidget *widget, gpointer data) |
|
| 7650 { |
|
| 7651 pidgin_account_dialog_show(PIDGIN_MODIFY_ACCOUNT_DIALOG, data); |
|
| 7652 } |
|
| 7653 |
|
| 7654 static void |
|
| 7655 enable_account_cb(GtkCheckMenuItem *widget, gpointer data) |
|
| 7656 { |
|
| 7657 PurpleAccount *account = data; |
|
| 7658 const PurpleSavedStatus *saved_status; |
|
| 7659 |
|
| 7660 saved_status = purple_savedstatus_get_current(); |
|
| 7661 purple_savedstatus_activate_for_account(saved_status, account); |
|
| 7662 |
|
| 7663 purple_account_set_enabled(account, PIDGIN_UI, TRUE); |
|
| 7664 } |
|
| 7665 |
|
| 7666 static void |
|
| 7667 disable_account_cb(GtkCheckMenuItem *widget, gpointer data) |
|
| 7668 { |
|
| 7669 PurpleAccount *account = data; |
|
| 7670 |
|
| 7671 purple_account_set_enabled(account, PIDGIN_UI, FALSE); |
|
| 7672 } |
|
| 7673 |
|
| 7674 static void |
|
| 7675 protocol_act(GtkWidget *obj, PurpleProtocolAction *pam) |
|
| 7676 { |
|
| 7677 if (pam && pam->callback) |
|
| 7678 pam->callback(pam); |
|
| 7679 } |
|
| 7680 |
|
| 7681 void |
|
| 7682 pidgin_blist_update_accounts_menu(void) |
|
| 7683 { |
|
| 7684 GtkWidget *menuitem, *submenu; |
|
| 7685 GtkAccelGroup *accel_group; |
|
| 7686 GList *l, *accounts; |
|
| 7687 gboolean disabled_accounts = FALSE; |
|
| 7688 gboolean enabled_accounts = FALSE; |
|
| 7689 |
|
| 7690 if (accountmenu == NULL) |
|
| 7691 return; |
|
| 7692 |
|
| 7693 /* Clear the old Accounts menu */ |
|
| 7694 for (l = gtk_container_get_children(GTK_CONTAINER(accountmenu)); l; l = g_list_delete_link(l, l)) { |
|
| 7695 menuitem = l->data; |
|
| 7696 |
|
| 7697 if (menuitem != gtk_ui_manager_get_widget(gtkblist->ui, "/BList/AccountsMenu/ManageAccounts")) |
|
| 7698 gtk_widget_destroy(menuitem); |
|
| 7699 } |
|
| 7700 |
|
| 7701 accel_group = gtk_menu_get_accel_group(GTK_MENU(accountmenu)); |
|
| 7702 |
|
| 7703 for (accounts = purple_accounts_get_all(); accounts; accounts = accounts->next) { |
|
| 7704 char *buf = NULL; |
|
| 7705 GtkWidget *image = NULL; |
|
| 7706 PurpleAccount *account = NULL; |
|
| 7707 GdkPixbuf *pixbuf = NULL; |
|
| 7708 |
|
| 7709 account = accounts->data; |
|
| 7710 |
|
| 7711 if (!purple_account_get_enabled(account, PIDGIN_UI)) { |
|
| 7712 if (!disabled_accounts) { |
|
| 7713 menuitem = gtk_menu_item_new_with_label(_("Enable Account")); |
|
| 7714 gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem); |
|
| 7715 |
|
| 7716 submenu = gtk_menu_new(); |
|
| 7717 gtk_menu_set_accel_group(GTK_MENU(submenu), accel_group); |
|
| 7718 gtk_menu_set_accel_path(GTK_MENU(submenu), "<Actions>/BListActions/EnableAccount"); |
|
| 7719 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
|
| 7720 |
|
| 7721 disabled_accounts = TRUE; |
|
| 7722 } |
|
| 7723 |
|
| 7724 buf = g_strconcat(purple_account_get_username(account), " (", |
|
| 7725 purple_account_get_protocol_name(account), ")", NULL); |
|
| 7726 menuitem = gtk_image_menu_item_new_with_label(buf); |
|
| 7727 g_free(buf); |
|
| 7728 |
|
| 7729 pixbuf = pidgin_create_protocol_icon(account, PIDGIN_PROTOCOL_ICON_SMALL); |
|
| 7730 if (pixbuf != NULL) { |
|
| 7731 if (!purple_account_is_connected(account)) |
|
| 7732 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); |
|
| 7733 image = gtk_image_new_from_pixbuf(pixbuf); |
|
| 7734 g_object_unref(G_OBJECT(pixbuf)); |
|
| 7735 gtk_widget_show(image); |
|
| 7736 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); |
|
| 7737 } |
|
| 7738 |
|
| 7739 g_signal_connect(G_OBJECT(menuitem), "activate", |
|
| 7740 G_CALLBACK(enable_account_cb), account); |
|
| 7741 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
|
| 7742 |
|
| 7743 } else { |
|
| 7744 enabled_accounts = TRUE; |
|
| 7745 } |
|
| 7746 } |
|
| 7747 |
|
| 7748 if (!enabled_accounts) { |
|
| 7749 gtk_widget_show_all(accountmenu); |
|
| 7750 return; |
|
| 7751 } |
|
| 7752 |
|
| 7753 pidgin_separator(accountmenu); |
|
| 7754 |
|
| 7755 for (accounts = purple_accounts_get_all(); accounts; accounts = accounts->next) { |
|
| 7756 char *buf = NULL; |
|
| 7757 char *accel_path_buf = NULL; |
|
| 7758 GtkWidget *image = NULL; |
|
| 7759 PurpleConnection *gc = NULL; |
|
| 7760 PurpleAccount *account = NULL; |
|
| 7761 GdkPixbuf *pixbuf = NULL; |
|
| 7762 PurpleProtocol *protocol; |
|
| 7763 |
|
| 7764 account = accounts->data; |
|
| 7765 |
|
| 7766 if (!purple_account_get_enabled(account, PIDGIN_UI)) |
|
| 7767 continue; |
|
| 7768 |
|
| 7769 buf = g_strconcat(purple_account_get_username(account), " (", |
|
| 7770 purple_account_get_protocol_name(account), ")", NULL); |
|
| 7771 menuitem = gtk_image_menu_item_new_with_label(buf); |
|
| 7772 accel_path_buf = g_strconcat("<Actions>/AccountActions/", buf, NULL); |
|
| 7773 g_free(buf); |
|
| 7774 |
|
| 7775 pixbuf = pidgin_create_protocol_icon(account, PIDGIN_PROTOCOL_ICON_SMALL); |
|
| 7776 if (pixbuf != NULL) { |
|
| 7777 if (!purple_account_is_connected(account)) |
|
| 7778 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, |
|
| 7779 0.0, FALSE); |
|
| 7780 image = gtk_image_new_from_pixbuf(pixbuf); |
|
| 7781 g_object_unref(G_OBJECT(pixbuf)); |
|
| 7782 gtk_widget_show(image); |
|
| 7783 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); |
|
| 7784 } |
|
| 7785 |
|
| 7786 gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem); |
|
| 7787 |
|
| 7788 submenu = gtk_menu_new(); |
|
| 7789 gtk_menu_set_accel_group(GTK_MENU(submenu), accel_group); |
|
| 7790 gtk_menu_set_accel_path(GTK_MENU(submenu), accel_path_buf); |
|
| 7791 g_free(accel_path_buf); |
|
| 7792 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
|
| 7793 |
|
| 7794 menuitem = gtk_menu_item_new_with_mnemonic(_("_Edit Account")); |
|
| 7795 g_signal_connect(G_OBJECT(menuitem), "activate", |
|
| 7796 G_CALLBACK(modify_account_cb), account); |
|
| 7797 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
|
| 7798 |
|
| 7799 pidgin_separator(submenu); |
|
| 7800 |
|
| 7801 gc = purple_account_get_connection(account); |
|
| 7802 protocol = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? |
|
| 7803 purple_connection_get_protocol(gc) : NULL; |
|
| 7804 |
|
| 7805 if (protocol && |
|
| 7806 (PURPLE_PROTOCOL_IMPLEMENTS(protocol, CLIENT, get_moods) || |
|
| 7807 PURPLE_PROTOCOL_IMPLEMENTS(protocol, CLIENT, get_actions))) { |
|
| 7808 if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, CLIENT, get_moods) && |
|
| 7809 (purple_connection_get_flags(gc) & PURPLE_CONNECTION_FLAG_SUPPORT_MOODS)) { |
|
| 7810 |
|
| 7811 if (purple_account_get_status(account, "mood")) { |
|
| 7812 menuitem = gtk_menu_item_new_with_mnemonic(_("Set _Mood...")); |
|
| 7813 g_signal_connect(G_OBJECT(menuitem), "activate", |
|
| 7814 G_CALLBACK(set_mood_cb), account); |
|
| 7815 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
|
| 7816 } |
|
| 7817 } |
|
| 7818 |
|
| 7819 if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, CLIENT, get_actions)) { |
|
| 7820 GtkWidget *menuitem; |
|
| 7821 PurpleProtocolAction *action = NULL; |
|
| 7822 GList *actions, *l; |
|
| 7823 |
|
| 7824 actions = purple_protocol_client_iface_get_actions(protocol, gc); |
|
| 7825 |
|
| 7826 for (l = actions; l != NULL; l = l->next) |
|
| 7827 { |
|
| 7828 if (l->data) |
|
| 7829 { |
|
| 7830 action = (PurpleProtocolAction *) l->data; |
|
| 7831 action->connection = gc; |
|
| 7832 |
|
| 7833 menuitem = gtk_menu_item_new_with_label(action->label); |
|
| 7834 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
|
| 7835 |
|
| 7836 g_signal_connect(G_OBJECT(menuitem), "activate", |
|
| 7837 G_CALLBACK(protocol_act), action); |
|
| 7838 g_object_set_data_full(G_OBJECT(menuitem), "protocol_action", |
|
| 7839 action, |
|
| 7840 (GDestroyNotify)purple_protocol_action_free); |
|
| 7841 gtk_widget_show(menuitem); |
|
| 7842 } |
|
| 7843 else |
|
| 7844 pidgin_separator(submenu); |
|
| 7845 } |
|
| 7846 |
|
| 7847 g_list_free(actions); |
|
| 7848 } |
|
| 7849 } else { |
|
| 7850 menuitem = gtk_menu_item_new_with_label(_("No actions available")); |
|
| 7851 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
|
| 7852 gtk_widget_set_sensitive(menuitem, FALSE); |
|
| 7853 } |
|
| 7854 |
|
| 7855 pidgin_separator(submenu); |
|
| 7856 |
|
| 7857 menuitem = gtk_menu_item_new_with_mnemonic(_("_Disable")); |
|
| 7858 g_signal_connect(G_OBJECT(menuitem), "activate", |
|
| 7859 G_CALLBACK(disable_account_cb), account); |
|
| 7860 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
|
| 7861 } |
|
| 7862 |
|
| 7863 gtk_widget_show_all(accountmenu); |
|
| 7864 } |
|
| 7865 |
|
| 7866 void |
7624 void |
| 7867 pidgin_blist_update_sort_methods(void) |
7625 pidgin_blist_update_sort_methods(void) |
| 7868 { |
7626 { |
| 7869 GtkWidget *sort_item = NULL; |
7627 GtkWidget *sort_item = NULL; |
| 7870 GMenu *menu = NULL; |
7628 GMenu *menu = NULL; |