From 82896907ca9402fef0bc90ff1d1c8cdeb16c3c53 Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Tue, 19 Sep 2017 05:34:23 -0400 Subject: src/window.c: Add tab popover/context menu The buttons don't do anything yet. --- diff --git a/src/window.c b/src/window.c index 5c903c2..37c1f8f 100644 --- a/src/window.c +++ b/src/window.c @@ -26,6 +26,72 @@ #include "window.h" #include "tab.h" +#define NEW_BUTTON(BOX, I, NAME, TOOLTIP) \ + do { \ + buttons[I] = gtk_button_new_from_icon_name(NAME, \ + GTK_ICON_SIZE_BUTTON); \ + gtk_widget_set_tooltip_text(buttons[I], TOOLTIP); \ + gtk_box_pack_start(GTK_BOX(BOX ? all_tabs_button_box : \ + current_tab_button_box), buttons[I], \ + TRUE, FALSE, 0); \ + } while (0) + +static gboolean +tab_label_button_press_cb(GtkWidget *widget, GdkEvent *event, MqTab *tab) +{ + GtkWidget *current_tab_button_box; + GtkWidget *all_tabs_button_box; + GtkWidget *buttons[7]; + GtkWidget *button_rows_box; + GtkWidget *stack; + GtkWidget *popover; + + /* 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 boxes. */ + current_tab_button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + all_tabs_button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_widget_set_halign(current_tab_button_box, GTK_ALIGN_CENTER); + gtk_widget_set_halign(all_tabs_button_box, 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, 4, "tab-new-symbolic", "New Tab"); + NEW_BUTTON(1, 5, "edit-undo", "Undo Close Tab"); + NEW_BUTTON(1, 6, "view-list-symbolic", "Tab List..."); + + /* Set up the button rows box. */ + button_rows_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_box_pack_start(GTK_BOX(button_rows_box), current_tab_button_box, + TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(button_rows_box), all_tabs_button_box, + TRUE, FALSE, 0); + + /* Set up the stack. */ + stack = gtk_stack_new(); + gtk_stack_add_named(GTK_STACK(stack), button_rows_box, "buttons"); + gtk_stack_add_named(GTK_STACK(stack), gtk_label_new("Tab list"), + "tab_list"); + + /* Set up the popover. */ + popover = gtk_popover_new(widget); + gtk_container_add(GTK_CONTAINER(popover), stack); + + /* NB: gtk_popover_popup() is new in GTK+ 3.22. */ + gtk_widget_show_all(popover); + /* TODO: gtk_widget_hide() tab list */ + + return FALSE; +} + +#undef NEW_BUTTON + static void add_tab(MqWindow *window, gchar *uri, gint position) { @@ -33,6 +99,7 @@ add_tab(MqWindow *window, gchar *uri, gint position) GtkWidget *tab_label_label; GtkWidget *tab_label; MqTab *tab; + GtkWidget *tab_label_event_box; GtkWidget *tab_widget; tab_label_image = gtk_image_new_from_icon_name("text-x-generic", @@ -53,9 +120,16 @@ add_tab(MqWindow *window, gchar *uri, gint position) tab = mq_tab_new(uri, tab_label_image, tab_label_label); + 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), tab_label); + tab_widget = mq_tab_get_container(tab); position = gtk_notebook_insert_page(GTK_NOTEBOOK(window->notebook), - tab_widget, tab_label, position); + tab_widget, tab_label_event_box, 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