diff options
author | Will Thompson <will.thompson@collabora.co.uk> | 2009-06-03 06:47:00 +0800 |
---|---|---|
committer | Will Thompson <will.thompson@collabora.co.uk> | 2009-06-03 06:47:00 +0800 |
commit | d083a54cbe33ed66d621a4b5bd47f3ebd75346cd (patch) | |
tree | 96495084f84ec3fe5cb5536f2da7f0b2845da5b9 | |
parent | 6c869a62128a755dfd688c94f37546d8127aaa07 (diff) | |
download | gsoc2013-empathy-d083a54cbe33ed66d621a4b5bd47f3ebd75346cd.tar gsoc2013-empathy-d083a54cbe33ed66d621a4b5bd47f3ebd75346cd.tar.gz gsoc2013-empathy-d083a54cbe33ed66d621a4b5bd47f3ebd75346cd.tar.bz2 gsoc2013-empathy-d083a54cbe33ed66d621a4b5bd47f3ebd75346cd.tar.lz gsoc2013-empathy-d083a54cbe33ed66d621a4b5bd47f3ebd75346cd.tar.xz gsoc2013-empathy-d083a54cbe33ed66d621a4b5bd47f3ebd75346cd.tar.zst gsoc2013-empathy-d083a54cbe33ed66d621a4b5bd47f3ebd75346cd.zip |
Add a right-click menu to conversation window tabs.
It turns out that GtkNotebook supports right-click menus that list the
tabs with minimal effort on our part. This makes it easier to deal with
windows with more tabs than can fit in the space available.
Signed-off-by: Will Thompson <will.thompson@collabora.co.uk>
-rw-r--r-- | src/empathy-chat-window.c | 84 |
1 files changed, 52 insertions, 32 deletions
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c index 248a408a3..bf02c3cc6 100644 --- a/src/empathy-chat-window.c +++ b/src/empathy-chat-window.c @@ -192,7 +192,8 @@ chat_tab_style_set_cb (GtkWidget *hbox, static GtkWidget * chat_window_create_label (EmpathyChatWindow *window, - EmpathyChat *chat) + EmpathyChat *chat, + gboolean is_tab_label) { EmpathyChatWindowPriv *priv; GtkWidget *hbox; @@ -214,7 +215,8 @@ chat_window_create_label (EmpathyChatWindow *window, gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE); name_label = gtk_label_new (NULL); - gtk_label_set_ellipsize (GTK_LABEL (name_label), PANGO_ELLIPSIZE_END); + if (is_tab_label) + gtk_label_set_ellipsize (GTK_LABEL (name_label), PANGO_ELLIPSIZE_END); attr_list = pango_attr_list_new (); attr = pango_attr_scale_new (1/1.2); @@ -226,7 +228,9 @@ chat_window_create_label (EmpathyChatWindow *window, gtk_misc_set_padding (GTK_MISC (name_label), 2, 0); gtk_misc_set_alignment (GTK_MISC (name_label), 0.0, 0.5); - g_object_set_data (G_OBJECT (chat), "chat-window-tab-label", name_label); + g_object_set_data (G_OBJECT (chat), + is_tab_label ? "chat-window-tab-label" : "chat-window-menu-label", + name_label); status_image = gtk_image_new (); @@ -236,40 +240,47 @@ chat_window_create_label (EmpathyChatWindow *window, gtk_box_pack_start (GTK_BOX (event_box_hbox), status_image, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (event_box_hbox), name_label, TRUE, TRUE, 0); - g_object_set_data (G_OBJECT (chat), "chat-window-tab-image", status_image); - g_object_set_data (G_OBJECT (chat), "chat-window-tab-tooltip-widget", event_box); + g_object_set_data (G_OBJECT (chat), + is_tab_label ? "chat-window-tab-image" : "chat-window-menu-image", + status_image); + g_object_set_data (G_OBJECT (chat), + is_tab_label ? "chat-window-tab-tooltip-widget" : "chat-window-menu-tooltip-widget", + event_box); - close_button = gtk_button_new (); - gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE); - g_object_set_data (G_OBJECT (chat), "chat-window-tab-close-button", close_button); + gtk_container_add (GTK_CONTAINER (event_box), event_box_hbox); + gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, TRUE, 0); - /* We don't want focus/keynav for the button to avoid clutter, and - * Ctrl-W works anyway. - */ - GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_FOCUS); - GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_DEFAULT); + if (is_tab_label) { + close_button = gtk_button_new (); + gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (chat), "chat-window-tab-close-button", close_button); - /* Set the name to make the special rc style match. */ - gtk_widget_set_name (close_button, "empathy-close-button"); + /* We don't want focus/keynav for the button to avoid clutter, and + * Ctrl-W works anyway. + */ + GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_FOCUS); + GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_DEFAULT); - close_image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); + /* Set the name to make the special rc style match. */ + gtk_widget_set_name (close_button, "empathy-close-button"); - gtk_container_add (GTK_CONTAINER (close_button), close_image); + close_image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); - gtk_container_add (GTK_CONTAINER (event_box), event_box_hbox); - gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, TRUE, 0); - gtk_box_pack_end (GTK_BOX (hbox), close_button, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (close_button), close_image); - /* React to theme changes and also setup the size correctly. */ - g_signal_connect (hbox, - "style-set", - G_CALLBACK (chat_tab_style_set_cb), - chat); + gtk_box_pack_end (GTK_BOX (hbox), close_button, FALSE, FALSE, 0); - g_signal_connect (close_button, - "clicked", - G_CALLBACK (chat_window_close_clicked_cb), - chat); + g_signal_connect (close_button, + "clicked", + G_CALLBACK (chat_window_close_clicked_cb), + chat); + + /* React to theme changes and also setup the size correctly. */ + g_signal_connect (hbox, + "style-set", + G_CALLBACK (chat_tab_style_set_cb), + chat); + } gtk_widget_show_all (hbox); @@ -413,6 +424,8 @@ chat_window_update_chat_tab (EmpathyChat *chat) } widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-image"); gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon_name, GTK_ICON_SIZE_MENU); + widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-image"); + gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon_name, GTK_ICON_SIZE_MENU); /* Update tab tooltip */ tooltip = g_string_new (NULL); @@ -446,11 +459,15 @@ chat_window_update_chat_tab (EmpathyChat *chat) markup = g_string_free (tooltip, FALSE); widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-tooltip-widget"); gtk_widget_set_tooltip_markup (widget, markup); + widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-tooltip-widget"); + gtk_widget_set_tooltip_markup (widget, markup); g_free (markup); - /* Update tab label */ + /* Update tab and menu label */ widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-label"); gtk_label_set_text (GTK_LABEL (widget), name); + widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-label"); + gtk_label_set_text (GTK_LABEL (widget), name); /* Update the window if it's the current chat */ if (priv->current_chat == chat) { @@ -1370,6 +1387,7 @@ empathy_chat_window_init (EmpathyChatWindow *window) priv->notebook = gtk_notebook_new (); gtk_notebook_set_group (GTK_NOTEBOOK (priv->notebook), "EmpathyChatWindow"); gtk_notebook_set_scrollable (GTK_NOTEBOOK (priv->notebook), TRUE); + gtk_notebook_popup_enable (GTK_NOTEBOOK (priv->notebook)); gtk_box_pack_start (GTK_BOX (chat_vbox), priv->notebook, TRUE, TRUE, 0); gtk_widget_show (priv->notebook); @@ -1515,6 +1533,7 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window, { EmpathyChatWindowPriv *priv; GtkWidget *label; + GtkWidget *popup_label; GtkWidget *child; gint x, y, w, h; @@ -1546,7 +1565,8 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window, } child = GTK_WIDGET (chat); - label = chat_window_create_label (window, chat); + label = chat_window_create_label (window, chat, TRUE); + popup_label = chat_window_create_label (window, chat, FALSE); gtk_widget_show (child); g_signal_connect (chat, "notify::name", @@ -1560,7 +1580,7 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window, NULL); chat_window_chat_notify_cb (chat); - gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), child, label); + gtk_notebook_append_page_menu (GTK_NOTEBOOK (priv->notebook), child, label, popup_label); gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (priv->notebook), child, TRUE); gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (priv->notebook), child, TRUE); gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (priv->notebook), child, |