/* * Tab * * Copyright (C) 2017 Patrick McDermott * * This file is part of Marquee. * * Marquee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Marquee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Marquee. If not, see . */ #include #include #include "tab.h" #include "tab-chrome.h" #include "tab-body.h" static void mq_tab_populate_tab(MqTab *tab) { tab->tab_image = gtk_image_new_from_icon_name("text-x-generic", GTK_ICON_SIZE_BUTTON); tab->tab_label = gtk_label_new("New tab"); gtk_label_set_ellipsize(GTK_LABEL(tab->tab_label), PANGO_ELLIPSIZE_END); gtk_widget_set_hexpand(tab->tab_label, TRUE); gtk_widget_set_size_request(tab->tab_label, 50, 1); tab->tab = gtk_grid_new(); gtk_grid_attach(GTK_GRID(tab->tab), tab->tab_image, 0, 0, 1, 1); gtk_grid_attach(GTK_GRID(tab->tab), tab->tab_label, 1, 0, 1, 1); gtk_grid_attach(GTK_GRID(tab->tab), gtk_button_new_from_icon_name( "window-close", GTK_ICON_SIZE_BUTTON), 2, 0, 1, 1); gtk_widget_show_all(tab->tab); } static void update_tab_image(MqTab *tab) { gtk_image_set_from_surface(GTK_IMAGE(tab->tab_image), webkit_web_view_get_favicon(tab->web_view)); } static void update_tab_label(MqTab *tab) { gtk_label_set_text(GTK_LABEL(tab->tab_label), g_strdup_printf("%d. %s", tab->tab_position + 1, webkit_web_view_get_title(tab->web_view))); } static void favicon_cb(WebKitWebView __attribute__((unused)) *web_view, GParamSpec __attribute__((unused)) *paramspec, MqTab *tab) { update_tab_image(tab); } static void title_cb(WebKitWebView __attribute__((unused)) *web_view, GParamSpec __attribute__((unused)) *paramspec, MqTab *tab) { update_tab_label(tab); } MqTab * mq_tab_new(gchar *uri) { MqTab *tab; tab = malloc(sizeof(*tab)); mq_tab_populate_tab(tab); tab->chrome = mq_tab_chrome_new(uri); tab->body = mq_tab_body_new(uri); tab->web_view = mq_tab_body_get_web_view(tab->body); /* FIXME: Doesn't work? */ g_signal_connect(tab->web_view, "notify::favicon", G_CALLBACK(favicon_cb), tab); g_signal_connect(tab->web_view, "notify::title", G_CALLBACK(title_cb), tab); mq_tab_chrome_set_web_view(tab->chrome, tab->web_view); tab->container = gtk_grid_new(); gtk_grid_attach(GTK_GRID(tab->container), mq_tab_chrome_get_container(tab->chrome), 0, 0, 1, 1); gtk_grid_attach(GTK_GRID(tab->container), mq_tab_body_get_container(tab->body), 0, 1, 1, 1); return tab; } GtkWidget * mq_tab_get_tab(MqTab *tab) { return tab->tab; } GtkWidget * mq_tab_get_container(MqTab *tab) { return tab->container; } void mq_tab_update_position(MqTab *tab, guint position) { tab->tab_position = position; update_tab_label(tab); }