/*
* Tab chrome
*
* 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
#include "tab-chrome.h"
static GtkWidget *
navigation_toolbar_new(MqTabChrome *chrome, gchar *uri)
{
GtkToolbar *navigation_toolbar;
GtkToolItem *uri_toolitem;
navigation_toolbar = GTK_TOOLBAR(gtk_toolbar_new());
/* Back button */
chrome->back_button = gtk_tool_button_new(
gtk_image_new_from_icon_name("go-previous", 16), "Back");
gtk_toolbar_insert(navigation_toolbar, chrome->back_button, -1);
/* Forward button */
chrome->forward_button = gtk_tool_button_new(
gtk_image_new_from_icon_name("go-next", 16), "Forward");
gtk_toolbar_insert(navigation_toolbar, chrome->forward_button, -1);
/* URI bar */
uri_toolitem = gtk_tool_item_new();
chrome->uri_entry = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry), uri);
gtk_entry_set_placeholder_text(GTK_ENTRY(chrome->uri_entry),
"URI...");
gtk_entry_set_icon_from_icon_name(GTK_ENTRY(chrome->uri_entry),
GTK_ENTRY_ICON_PRIMARY, "text-x-generic");
gtk_entry_set_progress_fraction(GTK_ENTRY(chrome->uri_entry), 0.0);
gtk_container_add(GTK_CONTAINER(uri_toolitem),
chrome->uri_entry);
gtk_tool_item_set_expand(uri_toolitem, TRUE);
gtk_toolbar_insert(navigation_toolbar, uri_toolitem, -1);
gtk_widget_set_hexpand(GTK_WIDGET(navigation_toolbar), TRUE);
return GTK_WIDGET(navigation_toolbar);
}
MqTabChrome *
mq_tab_chrome_new(gchar *uri, GtkWidget *tab_image, GtkWidget *tab_label)
{
MqTabChrome *chrome;
chrome = malloc(sizeof(*chrome));
chrome->tab_image = tab_image;
chrome->tab_label = tab_label;
chrome->container = gtk_grid_new();
gtk_grid_attach(GTK_GRID(chrome->container),
navigation_toolbar_new(chrome, uri), 0, 0, 1, 1);
return chrome;
}
GtkWidget *
mq_tab_chrome_get_container(MqTabChrome *chrome)
{
return chrome->container;
}
static void
update_tab_image(MqTabChrome *chrome)
{
gtk_image_set_from_surface(GTK_IMAGE(chrome->tab_image),
webkit_web_view_get_favicon(chrome->web_view));
}
static void
update_tab_label(MqTabChrome *chrome)
{
gtk_label_set_text(GTK_LABEL(chrome->tab_label),
g_strdup_printf("%d. %s", chrome->tab_position + 1,
webkit_web_view_get_title(chrome->web_view)));
}
void
mq_tab_chrome_update_tab_position(MqTabChrome *chrome, guint position)
{
chrome->tab_position = position;
update_tab_label(chrome);
}
static void
load_changed_cb(WebKitWebView *web_view, WebKitLoadEvent load_event,
MqTabChrome *chrome)
{
switch (load_event) {
case WEBKIT_LOAD_STARTED:
case WEBKIT_LOAD_REDIRECTED:
case WEBKIT_LOAD_COMMITTED:
gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry),
webkit_web_view_get_uri(web_view));
break;
case WEBKIT_LOAD_FINISHED:
gtk_entry_set_progress_fraction(
GTK_ENTRY(chrome->uri_entry), 0.0);
break;
}
gtk_widget_set_sensitive(GTK_WIDGET(chrome->back_button),
webkit_web_view_can_go_back(web_view));
gtk_widget_set_sensitive(GTK_WIDGET(chrome->forward_button),
webkit_web_view_can_go_forward(web_view));
}
static void
load_progress_cb(WebKitWebView *web_view,
GParamSpec __attribute__((unused)) *paramspec, MqTabChrome *chrome)
{
gtk_entry_set_progress_fraction(GTK_ENTRY(chrome->uri_entry),
webkit_web_view_get_estimated_load_progress(web_view));
}
static void
uri_cb(WebKitWebView *web_view, GParamSpec __attribute__((unused)) *paramspec,
MqTabChrome *chrome)
{
gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry),
webkit_web_view_get_uri(web_view));
}
static void
favicon_cb(WebKitWebView __attribute__((unused)) *web_view,
GParamSpec __attribute__((unused)) *paramspec, MqTabChrome *chrome)
{
update_tab_image(chrome);
}
static void
title_cb(WebKitWebView __attribute__((unused)) *web_view,
GParamSpec __attribute__((unused)) *paramspec, MqTabChrome *chrome)
{
update_tab_label(chrome);
}
static void
connect_web_view(MqTabChrome *chrome)
{
g_signal_connect(chrome->web_view, "load-changed",
G_CALLBACK(load_changed_cb), chrome);
g_signal_connect(chrome->web_view, "notify::estimated-load-progress",
G_CALLBACK(load_progress_cb), chrome);
g_signal_connect(chrome->web_view, "notify::uri",
G_CALLBACK(uri_cb), chrome);
/* FIXME: Doesn't work? */
g_signal_connect(chrome->web_view, "notify::favicon",
G_CALLBACK(favicon_cb), chrome);
g_signal_connect(chrome->web_view, "notify::title",
G_CALLBACK(title_cb), chrome);
}
void
mq_tab_chrome_set_web_view(MqTabChrome *chrome, WebKitWebView *web_view)
{
chrome->web_view = web_view;
connect_web_view(chrome);
}