aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWill Thompson <will.thompson@collabora.co.uk>2009-06-03 06:47:00 +0800
committerWill Thompson <will.thompson@collabora.co.uk>2009-06-03 06:47:00 +0800
commitd083a54cbe33ed66d621a4b5bd47f3ebd75346cd (patch)
tree96495084f84ec3fe5cb5536f2da7f0b2845da5b9
parent6c869a62128a755dfd688c94f37546d8127aaa07 (diff)
downloadgsoc2013-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.c84
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,