diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tab-label.c | 306 |
1 files changed, 153 insertions, 153 deletions
diff --git a/src/tab-label.c b/src/tab-label.c index ca6b0e0..9d91d6c 100644 --- a/src/tab-label.c +++ b/src/tab-label.c @@ -64,117 +64,6 @@ struct _MqTabLabelClass { G_DEFINE_TYPE(MqTabLabel, mq_tab_label, GTK_TYPE_EVENT_BOX) static void -reload_tab_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) -{ - webkit_web_view_reload(tab_label->web_view); - gtk_widget_hide(tab_label->popover); -} - -static void -duplicate_clicked_cb(GtkWidget G_GNUC_UNUSED *button, - G_GNUC_UNUSED MqTabLabel *tab_label) -{ - /* TODO */ -} - -static void -move_to_win_clicked_cb(GtkWidget G_GNUC_UNUSED *button, - G_GNUC_UNUSED MqTabLabel *tab_label) -{ - /* TODO */ -} - -static void -close_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) -{ - /* This callback handles both the close button on the tab label and the - * one on the popover. Closing the tab automatically hides the popover, - * so don't bother conditionally hiding it if it's shown. */ - - mq_tab_page_close(tab_label->tab_page); -} - -static void -new_tab_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) -{ - mq_notebook_insert_sibling( - MQ_NOTEBOOK(gtk_widget_get_parent(GTK_WIDGET(tab_label))), - NULL, - tab_label->tab_page, - TRUE); - gtk_widget_hide(tab_label->popover); -} - -static void -new_window_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) -{ - mq_application_add_window( - mq_tab_page_get_application(tab_label->tab_page), NULL); - gtk_widget_hide(tab_label->popover); -} - -static void -undo_close_clicked_cb(GtkWidget G_GNUC_UNUSED *button, - G_GNUC_UNUSED MqTabLabel *tab_label) -{ - /* TODO */ -} - -#define BUTTON_ROWS 2 -#define BUTTON_COLS 4 -#define BTN(Y, X) buttons[Y * BUTTON_COLS + X] -#define NEW_BTN(Y, X, ID, ICON, TOOLTIP) \ - G_STMT_START { \ - BTN(Y, X) = gtk_button_new_from_icon_name(ICON, \ - GTK_ICON_SIZE_BUTTON); \ - gtk_widget_set_tooltip_text(BTN(Y, X), TOOLTIP); \ - gtk_widget_set_can_focus(BTN(Y, X), FALSE); \ - g_signal_connect(BTN(Y, X), "clicked", \ - G_CALLBACK(ID ## _clicked_cb), tab_label); \ - gtk_grid_attach(GTK_GRID(button_grid), BTN(Y, X), X, Y, 1, 1); \ - } G_STMT_END - -static void -create_tab_popover(GtkWidget *widget, MqTabLabel *tab_label) -{ - GtkWidget *button_grid; - GtkWidget *buttons[BUTTON_ROWS * BUTTON_COLS]; - - /* Set up button grid. */ - button_grid = gtk_grid_new(); - gtk_widget_set_halign(button_grid, GTK_ALIGN_CENTER); - - /* Set up buttons. */ - /* Y,X,ID, ICON, TOOLTIP */ - NEW_BTN(0,0,reload_tab, "view-refresh", _("Reload tab")); - NEW_BTN(0,1,duplicate, "edit-copy", _("Duplicate tab")); - NEW_BTN(0,2,move_to_win,"window-new", _("Move tab to new window")); - NEW_BTN(0,3,close, "window-close", _("Close tab")); - NEW_BTN(1,0,new_tab, "tab-new-symbolic",_("New tab")); - NEW_BTN(1,1,new_window, "window-new", _("New window")); - NEW_BTN(1,2,undo_close, "edit-undo", _("Undo close tab")); - - /* TODO: Duplicate tab */ - gtk_widget_set_sensitive(BTN(0, 1), FALSE); - /* TODO: Move tab to new window */ - gtk_widget_set_sensitive(BTN(0, 2), FALSE); - /* TODO: Undo close tab */ - gtk_widget_set_sensitive(BTN(1, 2), FALSE); - - /* Set up the popover. */ - tab_label->popover = gtk_popover_new(widget); - gtk_container_add(GTK_CONTAINER(tab_label->popover), button_grid); - - /* NB: gtk_popover_popup() is new in GTK+ 3.22. */ - gtk_widget_show_all(tab_label->popover); -} - -#undef BUTTON_ROWS -#undef BUTTON_COLS -#undef BTN -#undef NEW_BTN - -static void set_image(MqTabLabel *tab_label, GdkPixbuf *favicon) { if (favicon) { @@ -249,48 +138,6 @@ set_custom_title(MqTabLabel *tab_label, const gchar *title) } } -static void -favicon_cb(WebKitWebView G_GNUC_UNUSED *web_view, - GParamSpec G_GNUC_UNUSED *param_spec, MqTabLabel *tab_label) -{ - cairo_surface_t *surface; - GdkPixbuf *pixbuf; - GdkPixbuf *scaled_pixbuf; - - surface = webkit_web_view_get_favicon(tab_label->web_view); - scaled_pixbuf = NULL; - if (surface) { - pixbuf = gdk_pixbuf_get_from_surface(surface, 0, 0, - cairo_image_surface_get_width(surface), - cairo_image_surface_get_height(surface)); - if (pixbuf) { - scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, 16, 16, - GDK_INTERP_BILINEAR); - g_object_unref(pixbuf); - } - } - - set_image(tab_label, scaled_pixbuf); -} - -static void -title_cb(WebKitWebView G_GNUC_UNUSED *web_view, - GParamSpec G_GNUC_UNUSED *param_spec, MqTabLabel *tab_label) -{ - set_title(tab_label, webkit_web_view_get_title(tab_label->web_view)); -} - -static void -set_web_view(MqTabLabel *tab_label, MqWebView *web_view) -{ - tab_label->web_view = WEBKIT_WEB_VIEW(web_view); - - g_signal_connect(web_view, "notify::favicon", - G_CALLBACK(favicon_cb), tab_label); - g_signal_connect(web_view, "notify::title", - G_CALLBACK(title_cb), tab_label); -} - static gboolean name_entry_key_press_event_cb(GtkEntry G_GNUC_UNUSED *entry, GdkEventKey *event, MqTabLabel *tab_label) @@ -393,6 +240,159 @@ create_name_popover(MqTabLabel *tab_label) gtk_widget_show_all(tab_label->name_popover); } +static void +reload_tab_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) +{ + webkit_web_view_reload(tab_label->web_view); + gtk_widget_hide(tab_label->popover); +} + +static void +duplicate_clicked_cb(GtkWidget G_GNUC_UNUSED *button, + G_GNUC_UNUSED MqTabLabel *tab_label) +{ + /* TODO */ +} + +static void +move_to_win_clicked_cb(GtkWidget G_GNUC_UNUSED *button, + G_GNUC_UNUSED MqTabLabel *tab_label) +{ + /* TODO */ +} + +static void +close_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) +{ + /* This callback handles both the close button on the tab label and the + * one on the popover. Closing the tab automatically hides the popover, + * so don't bother conditionally hiding it if it's shown. */ + + mq_tab_page_close(tab_label->tab_page); +} + +static void +new_tab_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) +{ + mq_notebook_insert_sibling( + MQ_NOTEBOOK(gtk_widget_get_parent(GTK_WIDGET(tab_label))), + NULL, + tab_label->tab_page, + TRUE); + gtk_widget_hide(tab_label->popover); +} + +static void +new_window_clicked_cb(GtkWidget G_GNUC_UNUSED *button, MqTabLabel *tab_label) +{ + mq_application_add_window( + mq_tab_page_get_application(tab_label->tab_page), NULL); + gtk_widget_hide(tab_label->popover); +} + +static void +undo_close_clicked_cb(GtkWidget G_GNUC_UNUSED *button, + G_GNUC_UNUSED MqTabLabel *tab_label) +{ + /* TODO */ +} + +#define BUTTON_ROWS 2 +#define BUTTON_COLS 4 +#define BTN(Y, X) buttons[Y * BUTTON_COLS + X] +#define NEW_BTN(Y, X, ID, ICON, TOOLTIP) \ + G_STMT_START { \ + BTN(Y, X) = gtk_button_new_from_icon_name(ICON, \ + GTK_ICON_SIZE_BUTTON); \ + gtk_widget_set_tooltip_text(BTN(Y, X), TOOLTIP); \ + gtk_widget_set_can_focus(BTN(Y, X), FALSE); \ + g_signal_connect(BTN(Y, X), "clicked", \ + G_CALLBACK(ID ## _clicked_cb), tab_label); \ + gtk_grid_attach(GTK_GRID(button_grid), BTN(Y, X), X, Y, 1, 1); \ + } G_STMT_END + +static void +create_tab_popover(GtkWidget *widget, MqTabLabel *tab_label) +{ + GtkWidget *button_grid; + GtkWidget *buttons[BUTTON_ROWS * BUTTON_COLS]; + + /* Set up button grid. */ + button_grid = gtk_grid_new(); + gtk_widget_set_halign(button_grid, GTK_ALIGN_CENTER); + + /* Set up buttons. */ + /* Y,X,ID, ICON, TOOLTIP */ + NEW_BTN(0,0,reload_tab, "view-refresh", _("Reload tab")); + NEW_BTN(0,1,duplicate, "edit-copy", _("Duplicate tab")); + NEW_BTN(0,2,move_to_win,"window-new", _("Move tab to new window")); + NEW_BTN(0,3,close, "window-close", _("Close tab")); + NEW_BTN(1,0,new_tab, "tab-new-symbolic",_("New tab")); + NEW_BTN(1,1,new_window, "window-new", _("New window")); + NEW_BTN(1,2,undo_close, "edit-undo", _("Undo close tab")); + + /* TODO: Duplicate tab */ + gtk_widget_set_sensitive(BTN(0, 1), FALSE); + /* TODO: Move tab to new window */ + gtk_widget_set_sensitive(BTN(0, 2), FALSE); + /* TODO: Undo close tab */ + gtk_widget_set_sensitive(BTN(1, 2), FALSE); + + /* Set up the popover. */ + tab_label->popover = gtk_popover_new(widget); + gtk_container_add(GTK_CONTAINER(tab_label->popover), button_grid); + + /* NB: gtk_popover_popup() is new in GTK+ 3.22. */ + gtk_widget_show_all(tab_label->popover); +} + +#undef BUTTON_ROWS +#undef BUTTON_COLS +#undef BTN +#undef NEW_BTN + +static void +favicon_cb(WebKitWebView G_GNUC_UNUSED *web_view, + GParamSpec G_GNUC_UNUSED *param_spec, MqTabLabel *tab_label) +{ + cairo_surface_t *surface; + GdkPixbuf *pixbuf; + GdkPixbuf *scaled_pixbuf; + + surface = webkit_web_view_get_favicon(tab_label->web_view); + scaled_pixbuf = NULL; + if (surface) { + pixbuf = gdk_pixbuf_get_from_surface(surface, 0, 0, + cairo_image_surface_get_width(surface), + cairo_image_surface_get_height(surface)); + if (pixbuf) { + scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, 16, 16, + GDK_INTERP_BILINEAR); + g_object_unref(pixbuf); + } + } + + set_image(tab_label, scaled_pixbuf); +} + +static void +title_cb(WebKitWebView G_GNUC_UNUSED *web_view, + GParamSpec G_GNUC_UNUSED *param_spec, MqTabLabel *tab_label) +{ + set_title(tab_label, webkit_web_view_get_title(tab_label->web_view)); +} + +static void +set_web_view(MqTabLabel *tab_label, MqWebView *web_view) +{ + tab_label->web_view = WEBKIT_WEB_VIEW(web_view); + + g_signal_connect(web_view, "notify::favicon", + G_CALLBACK(favicon_cb), tab_label); + g_signal_connect(web_view, "notify::title", + G_CALLBACK(title_cb), tab_label); +} + static gboolean button_press_cb(GtkWidget *widget, GdkEventButton *event, MqTabLabel *tab_label) |