From 4d5308723024a5eaaee42f60c79fb0862b072052 Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Fri, 22 Sep 2017 01:39:21 -0400 Subject: Move tab context menu code from MqWindow to MqTab --- (limited to 'src') diff --git a/src/tab.c b/src/tab.c index 2c1ba65..8667b22 100644 --- a/src/tab.c +++ b/src/tab.c @@ -28,8 +28,101 @@ #include "tab-body.h" static void +tab_list_button_toggled_cb(GtkToggleButton *toggle_button, GtkWidget *tab_list) +{ + if (gtk_toggle_button_get_active(toggle_button)) { + gtk_widget_show(tab_list); + } else { + gtk_widget_hide(tab_list); + } +} + +#define BUTTON_ROWS 2 +#define BUTTON_COLS 4 +#define NEW_BUTTON(Y, X, ICON, TOOLTIP) \ + do { \ + buttons[Y * BUTTON_COLS + X] = gtk_button_new_from_icon_name(\ + ICON, GTK_ICON_SIZE_BUTTON); \ + gtk_widget_set_tooltip_text(buttons[Y * BUTTON_COLS + X], \ + TOOLTIP); \ + gtk_widget_set_can_focus(buttons[Y * BUTTON_COLS + X], FALSE); \ + gtk_grid_attach(GTK_GRID(button_grid), \ + buttons[Y * BUTTON_COLS + X], X, Y, 1, 1); \ + } while (0) +#define NEW_TOGGLE(Y, X, ICON, TOOLTIP) \ + do { \ + buttons[Y * BUTTON_COLS + X] = gtk_toggle_button_new(); \ + gtk_button_set_image(GTK_BUTTON(buttons[Y * BUTTON_COLS + X]), \ + gtk_image_new_from_icon_name(ICON, \ + GTK_ICON_SIZE_BUTTON)); \ + gtk_widget_set_tooltip_text(buttons[Y * BUTTON_COLS + X], \ + TOOLTIP); \ + gtk_widget_set_can_focus(buttons[Y * BUTTON_COLS + X], FALSE); \ + gtk_grid_attach(GTK_GRID(button_grid), \ + buttons[Y * BUTTON_COLS + X], X, Y, 1, 1); \ + } while (0) + +static gboolean +tab_label_button_press_cb(GtkWidget *widget, GdkEvent *event, MqTab *tab) +{ + GtkWidget *button_grid; + GtkWidget *buttons[BUTTON_ROWS * BUTTON_COLS]; + GtkWidget *box; + GtkWidget *tab_list; + GtkWidget *popover; /* TODO: Add to MqWindow */ + + /* Make sure this is a right mouse button press event. */ + if (event->type != GDK_BUTTON_PRESS || event->button.button != 3) { + return FALSE; + } + + /* Set up button grid. */ + button_grid = gtk_grid_new(); + gtk_widget_set_halign(button_grid, GTK_ALIGN_CENTER); + + /* Set up buttons. */ + NEW_BUTTON(0, 0, "view-refresh", "Reload tab"); + NEW_BUTTON(0, 1, "edit-copy", "Duplicate tab"); + NEW_BUTTON(0, 2, "window-new", "Open tab in new window"); + NEW_BUTTON(0, 3, "window-close", "Close tab"); + NEW_BUTTON(1, 0, "tab-new-symbolic", "New tab"); + NEW_BUTTON(1, 1, "edit-undo", "Undo close tab"); + NEW_TOGGLE(1, 3, "view-list-symbolic", "Tab list..."); + + /* Set up the button rows box. */ + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_box_pack_start(GTK_BOX(box), button_grid, + TRUE, FALSE, 0); + + /* Set up the tab list. */ + tab_list = gtk_label_new("Tab list"); + gtk_box_pack_start(GTK_BOX(box), tab_list, + TRUE, FALSE, 0); + + g_signal_connect(buttons[1 * BUTTON_COLS + 3], "toggled", + G_CALLBACK(tab_list_button_toggled_cb), tab_list); + + /* Set up the popover. */ + popover = gtk_popover_new(widget); + gtk_container_add(GTK_CONTAINER(popover), box); + + /* NB: gtk_popover_popup() is new in GTK+ 3.22. */ + gtk_widget_show_all(popover); + gtk_widget_hide(tab_list); + + return FALSE; +} + +#undef BUTTON_ROWS +#undef BUTTON_COLS +#undef NEW_BUTTON +#undef NEW_TOGGLE + +static void mq_tab_populate_tab(MqTab *tab) { + GtkWidget *box; + tab->tab_image = gtk_image_new_from_icon_name("text-x-generic", GTK_ICON_SIZE_BUTTON); @@ -39,12 +132,19 @@ mq_tab_populate_tab(MqTab *tab) gtk_widget_set_hexpand(tab->tab_label, TRUE); gtk_widget_set_size_request(tab->tab_label, 50, 1); - tab->tab = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_start(GTK_BOX(tab->tab), tab->tab_image, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(tab->tab), tab->tab_label, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(tab->tab), gtk_button_new_from_icon_name( + box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_pack_start(GTK_BOX(box), tab->tab_image, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(box), tab->tab_label, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(box), gtk_button_new_from_icon_name( "window-close", GTK_ICON_SIZE_BUTTON), FALSE, FALSE, 0); - gtk_widget_show_all(tab->tab); + gtk_widget_show_all(box); + + tab->tab = gtk_event_box_new(); + g_signal_connect(tab->tab, "button-press-event", + G_CALLBACK(tab_label_button_press_cb), tab); + gtk_event_box_set_visible_window(GTK_EVENT_BOX(tab->tab), + FALSE); + gtk_container_add(GTK_CONTAINER(tab->tab), box); } static void diff --git a/src/window.c b/src/window.c index 013ed80..bd64e1e 100644 --- a/src/window.c +++ b/src/window.c @@ -27,116 +27,16 @@ #include "tab.h" static void -tab_list_button_toggled_cb(GtkToggleButton *toggle_button, GtkWidget *tab_list) -{ - if (gtk_toggle_button_get_active(toggle_button)) { - gtk_widget_show(tab_list); - } else { - gtk_widget_hide(tab_list); - } -} - -#define BUTTON_ROWS 2 -#define BUTTON_COLS 4 -#define NEW_BUTTON(Y, X, ICON, TOOLTIP) \ - do { \ - buttons[Y * BUTTON_COLS + X] = gtk_button_new_from_icon_name(\ - ICON, GTK_ICON_SIZE_BUTTON); \ - gtk_widget_set_tooltip_text(buttons[Y * BUTTON_COLS + X], \ - TOOLTIP); \ - gtk_widget_set_can_focus(buttons[Y * BUTTON_COLS + X], FALSE); \ - gtk_grid_attach(GTK_GRID(button_grid), \ - buttons[Y * BUTTON_COLS + X], X, Y, 1, 1); \ - } while (0) -#define NEW_TOGGLE(Y, X, ICON, TOOLTIP) \ - do { \ - buttons[Y * BUTTON_COLS + X] = gtk_toggle_button_new(); \ - gtk_button_set_image(GTK_BUTTON(buttons[Y * BUTTON_COLS + X]), \ - gtk_image_new_from_icon_name(ICON, \ - GTK_ICON_SIZE_BUTTON)); \ - gtk_widget_set_tooltip_text(buttons[Y * BUTTON_COLS + X], \ - TOOLTIP); \ - gtk_widget_set_can_focus(buttons[Y * BUTTON_COLS + X], FALSE); \ - gtk_grid_attach(GTK_GRID(button_grid), \ - buttons[Y * BUTTON_COLS + X], X, Y, 1, 1); \ - } while (0) - -static gboolean -tab_label_button_press_cb(GtkWidget *widget, GdkEvent *event, MqTab *tab) -{ - GtkWidget *button_grid; - GtkWidget *buttons[BUTTON_ROWS * BUTTON_COLS]; - GtkWidget *box; - GtkWidget *tab_list; - GtkWidget *popover; /* TODO: Add to MqWindow */ - - /* Make sure this is a right mouse button press event. */ - if (event->type != GDK_BUTTON_PRESS || event->button.button != 3) { - return FALSE; - } - - /* Set up button grid. */ - button_grid = gtk_grid_new(); - gtk_widget_set_halign(button_grid, GTK_ALIGN_CENTER); - - /* Set up buttons. */ - NEW_BUTTON(0, 0, "view-refresh", "Reload tab"); - NEW_BUTTON(0, 1, "edit-copy", "Duplicate tab"); - NEW_BUTTON(0, 2, "window-new", "Open tab in new window"); - NEW_BUTTON(0, 3, "window-close", "Close tab"); - NEW_BUTTON(1, 0, "tab-new-symbolic", "New tab"); - NEW_BUTTON(1, 1, "edit-undo", "Undo close tab"); - NEW_TOGGLE(1, 3, "view-list-symbolic", "Tab list..."); - - /* Set up the button rows box. */ - box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_box_pack_start(GTK_BOX(box), button_grid, - TRUE, FALSE, 0); - - /* Set up the tab list. */ - tab_list = gtk_label_new("Tab list"); - gtk_box_pack_start(GTK_BOX(box), tab_list, - TRUE, FALSE, 0); - - g_signal_connect(buttons[1 * BUTTON_COLS + 3], "toggled", - G_CALLBACK(tab_list_button_toggled_cb), tab_list); - - /* Set up the popover. */ - popover = gtk_popover_new(widget); - gtk_container_add(GTK_CONTAINER(popover), box); - - /* NB: gtk_popover_popup() is new in GTK+ 3.22. */ - gtk_widget_show_all(popover); - gtk_widget_hide(tab_list); - - return FALSE; -} - -#undef BUTTON_ROWS -#undef BUTTON_COLS -#undef NEW_BUTTON -#undef NEW_TOGGLE - -static void add_tab(MqWindow *window, gchar *uri, gint position) { MqTab *tab; - GtkWidget *tab_label_event_box; GtkWidget *tab_widget; tab = mq_tab_new(uri); - tab_label_event_box = gtk_event_box_new(); - g_signal_connect(tab_label_event_box, "button-press-event", - G_CALLBACK(tab_label_button_press_cb), tab); - gtk_event_box_set_visible_window(GTK_EVENT_BOX(tab_label_event_box), - FALSE); - gtk_container_add(GTK_CONTAINER(tab_label_event_box), - mq_tab_get_tab(tab)); - tab_widget = mq_tab_get_container(tab); position = gtk_notebook_insert_page(GTK_NOTEBOOK(window->notebook), - tab_widget, tab_label_event_box, position); + tab_widget, mq_tab_get_tab(tab), position); gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(window->notebook), tab_widget, TRUE); gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(window->notebook), -- cgit v0.9.1