summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2019-11-30 11:24:13 +0000
committerVincent Sanders <vince@kyllikki.org>2019-11-30 11:24:13 +0000
commitad321c1b83299b72dc0dce03e852c857469b794f (patch)
tree9f5e63c356700a0c67438064e26ff56c0356087a
parent4a1ca97c65a7f266b60d57fc484fe154dbbc855d (diff)
downloadnetsurf-ad321c1b83299b72dc0dce03e852c857469b794f.tar.gz
netsurf-ad321c1b83299b72dc0dce03e852c857469b794f.tar.bz2
make gtk tab closeable with middle click
Implements feature request "Please add middle-click on tab to close." Fixes: #2720.
-rw-r--r--frontends/gtk/tabs.c54
1 files changed, 43 insertions, 11 deletions
diff --git a/frontends/gtk/tabs.c b/frontends/gtk/tabs.c
index 76fd02f89..4fa109b70 100644
--- a/frontends/gtk/tabs.c
+++ b/frontends/gtk/tabs.c
@@ -72,6 +72,25 @@ nsgtk_tab_update_size(GtkWidget *hbox,
/**
+ * gtk event handler for button release on tab hbox
+ */
+static gboolean
+nsgtk_tab_button_release(GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ GtkWidget *page;
+
+ if ((event->type == GDK_BUTTON_RELEASE) && (event->button == 2)) {
+ page = (GtkWidget *)user_data;
+ gtk_widget_destroy(page);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+/**
* Create a notebook tab label
*
* \param page The page content widget
@@ -83,11 +102,16 @@ nsgtk_tab_label_setup(GtkWidget *page,
const char *title,
GdkPixbuf *icon_pixbuf)
{
- GtkWidget *hbox, *favicon, *label, *button, *close;
+ GtkWidget *ebox, *hbox, *favicon, *label, *button, *close;
/* horizontal box */
hbox = nsgtk_hbox_new(FALSE, 3);
+ /* event box */
+ ebox = gtk_event_box_new();
+ gtk_widget_set_events(ebox, GDK_BUTTON_PRESS_MASK);
+ gtk_container_add(GTK_CONTAINER(ebox), hbox);
+
/* construct a favicon */
favicon = gtk_image_new();
if (icon_pixbuf != NULL) {
@@ -102,7 +126,7 @@ nsgtk_tab_label_setup(GtkWidget *page,
nsgtk_widget_set_margins(label, 0, 0);
gtk_widget_show(label);
- /* construct a close button and attach signals */
+ /* construct a close button */
button = gtk_button_new();
close = nsgtk_image_new_from_stock(NSGTK_STOCK_CLOSE,
@@ -112,26 +136,34 @@ nsgtk_tab_label_setup(GtkWidget *page,
gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
gtk_widget_set_tooltip_text(button, "Close this tab.");
+ /* pack the widgets into the label box */
+ gtk_box_pack_start(GTK_BOX(hbox), favicon, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+
+ /* make the icon and label widgets findable by name */
+ g_object_set_data(G_OBJECT(ebox), "favicon", favicon);
+ g_object_set_data(G_OBJECT(ebox), "label", label);
+
+ /* attach signal handlers */
g_signal_connect_swapped(button,
"clicked",
G_CALLBACK(gtk_widget_destroy), page);
+
g_signal_connect(hbox,
"style-set",
G_CALLBACK(nsgtk_tab_update_size),
button);
- /* pack the widgets into the label box */
- gtk_box_pack_start(GTK_BOX(hbox), favicon, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ g_signal_connect(ebox,
+ "button-release-event",
+ G_CALLBACK(nsgtk_tab_button_release),
+ page);
- g_object_set_data(G_OBJECT(hbox), "favicon", favicon);
- g_object_set_data(G_OBJECT(hbox), "label", label);
- g_object_set_data(G_OBJECT(hbox), "close-button", button);
- gtk_widget_show_all(hbox);
+ gtk_widget_show_all(ebox);
- return hbox;
+ return ebox;
}