pidgin/gtkblist.c

changeset 40379
c50c509dd028
parent 40378
9713b0ef6504
child 40382
c491e1f440dd
equal deleted inserted replaced
40378:9713b0ef6504 40379:c50c509dd028
134 GDK_WINDOW_STATE_ICONIFIED) 134 GDK_WINDOW_STATE_ICONIFIED)
135 135
136 #define PIDGIN_WINDOW_MAXIMIZED(x) \ 136 #define PIDGIN_WINDOW_MAXIMIZED(x) \
137 (gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(x))) & \ 137 (gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(x))) & \
138 GDK_WINDOW_STATE_MAXIMIZED) 138 GDK_WINDOW_STATE_MAXIMIZED)
139
140 static GtkWidget *accountmenu = NULL;
141 139
142 static guint visibility_manager_count = 0; 140 static guint visibility_manager_count = 0;
143 static GdkVisibilityState gtk_blist_visibility = GDK_VISIBILITY_UNOBSCURED; 141 static GdkVisibilityState gtk_blist_visibility = GDK_VISIBILITY_UNOBSCURED;
144 static gboolean gtk_blist_focused = FALSE; 142 static gboolean gtk_blist_focused = FALSE;
145 static gboolean editing_blist = FALSE; 143 static gboolean editing_blist = FALSE;
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>";
4356 gboolean sensitive; 4346 gboolean sensitive;
4357 int i; 4347 int i;
4358 4348
4359 g_return_if_fail(gtkblist != NULL); 4349 g_return_if_fail(gtkblist != NULL);
4360 4350
4361 pidgin_blist_update_accounts_menu();
4362
4363 sensitive = (purple_connections_get_all() != NULL); 4351 sensitive = (purple_connections_get_all() != NULL);
4364 4352
4365 for (i = 0; i < require_connection_size; i++) 4353 for (i = 0; i < require_connection_size; i++)
4366 { 4354 {
4367 action = gtk_ui_manager_get_action(gtkblist->ui, require_connection[i]); 4355 action = gtk_ui_manager_get_action(gtkblist->ui, require_connection[i]);
4730 if (!gtkblist) 4718 if (!gtkblist)
4731 return; 4719 return;
4732 4720
4733 pidgin_blist_select_notebook_page(gtkblist); 4721 pidgin_blist_select_notebook_page(gtkblist);
4734 update_menu_bar(gtkblist); 4722 update_menu_bar(gtkblist);
4735 }
4736
4737 static void
4738 account_actions_changed(PurpleAccount *account, gpointer data)
4739 {
4740 pidgin_blist_update_accounts_menu();
4741 } 4723 }
4742 4724
4743 static void 4725 static void
4744 account_status_changed(PurpleAccount *account, PurpleStatus *old, 4726 account_status_changed(PurpleAccount *account, PurpleStatus *old,
4745 PurpleStatus *new, PidginBuddyList *gtkblist) 4727 PurpleStatus *new, PidginBuddyList *gtkblist)
5590 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtkblist->menutray); 5572 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtkblist->menutray);
5591 gtk_widget_show(gtkblist->menutray); 5573 gtk_widget_show(gtkblist->menutray);
5592 gtk_widget_show(menu); 5574 gtk_widget_show(menu);
5593 gtk_box_pack_start(GTK_BOX(gtkblist->main_vbox), menu, FALSE, FALSE, 0); 5575 gtk_box_pack_start(GTK_BOX(gtkblist->main_vbox), menu, FALSE, FALSE, 0);
5594 5576
5595 menu = gtk_ui_manager_get_widget(gtkblist->ui, "/BList/AccountsMenu");
5596 accountmenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu));
5597
5598 gtkblist->menu = pidgin_buddy_list_menu_new(); 5577 gtkblist->menu = pidgin_buddy_list_menu_new();
5599 gtk_box_pack_start(GTK_BOX(gtkblist->main_vbox), gtkblist->menu, FALSE, 5578 gtk_box_pack_start(GTK_BOX(gtkblist->main_vbox), gtkblist->menu, FALSE,
5600 FALSE, 0); 5579 FALSE, 0);
5601 5580
5602 /****************************** Notebook *************************************/ 5581 /****************************** Notebook *************************************/
5811 PURPLE_CALLBACK(account_status_changed), 5790 PURPLE_CALLBACK(account_status_changed),
5812 gtkblist); 5791 gtkblist);
5813 purple_signal_connect(handle, "account-error-changed", gtkblist, 5792 purple_signal_connect(handle, "account-error-changed", gtkblist,
5814 PURPLE_CALLBACK(update_account_error_state), 5793 PURPLE_CALLBACK(update_account_error_state),
5815 gtkblist); 5794 gtkblist);
5816 purple_signal_connect(handle, "account-actions-changed", gtkblist,
5817 PURPLE_CALLBACK(account_actions_changed), NULL);
5818 5795
5819 handle = pidgin_accounts_get_handle(); 5796 handle = pidgin_accounts_get_handle();
5820 purple_signal_connect(handle, "account-modified", gtkblist, 5797 purple_signal_connect(handle, "account-modified", gtkblist,
5821 PURPLE_CALLBACK(account_modified), gtkblist); 5798 PURPLE_CALLBACK(account_modified), gtkblist);
5822 5799
7252 g_hash_table_destroy(cached_emblems); 7229 g_hash_table_destroy(cached_emblems);
7253 7230
7254 purple_signals_unregister_by_instance(pidgin_blist_get_handle()); 7231 purple_signals_unregister_by_instance(pidgin_blist_get_handle());
7255 purple_signals_disconnect_by_handle(pidgin_blist_get_handle()); 7232 purple_signals_disconnect_by_handle(pidgin_blist_get_handle());
7256 7233
7257 accountmenu = NULL;
7258 gtkblist = NULL; 7234 gtkblist = NULL;
7259 } 7235 }
7260 7236
7261 /************************************************************************** 7237 /**************************************************************************
7262 * GTK Buddy list GObject code 7238 * GTK Buddy list GObject code
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;

mercurial