summaryrefslogtreecommitdiffstats
path: root/src/tab.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tab.c')
-rw-r--r--src/tab.c110
1 files changed, 105 insertions, 5 deletions
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