summaryrefslogtreecommitdiffstats
path: root/src/window.c
diff options
context:
space:
mode:
authorPatrick McDermott <pj@pehjota.net>2017-09-19 05:34:23 (EDT)
committer Patrick McDermott <pj@pehjota.net>2017-09-19 05:34:23 (EDT)
commit82896907ca9402fef0bc90ff1d1c8cdeb16c3c53 (patch)
tree543d4b1a3a066374967548d3dfc76256b4953681 /src/window.c
parent2ad6e3a956a674a62cd477e8320e4fdb98b92ff0 (diff)
downloadmarquee-82896907ca9402fef0bc90ff1d1c8cdeb16c3c53.zip
marquee-82896907ca9402fef0bc90ff1d1c8cdeb16c3c53.tar.gz
marquee-82896907ca9402fef0bc90ff1d1c8cdeb16c3c53.tar.bz2
src/window.c: Add tab popover/context menu
The buttons don't do anything yet.
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c76
1 files changed, 75 insertions, 1 deletions
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),