Give every web view a separate user content manager
This commit is contained in:
parent
3445830a6d
commit
944d623379
36
src/ag-app.c
36
src/ag-app.c
@ -8,11 +8,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "astrognome.h"
|
#include "astrognome.h"
|
||||||
|
|
||||||
typedef struct _AgAppPrivate {
|
G_DEFINE_TYPE(AgApp, ag_app, GTK_TYPE_APPLICATION);
|
||||||
WebKitUserContentManager *manager;
|
|
||||||
} AgAppPrivate;
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE(AgApp, ag_app, GTK_TYPE_APPLICATION);
|
|
||||||
|
|
||||||
GtkWindow *
|
GtkWindow *
|
||||||
ag_app_peek_first_window(AgApp *app)
|
ag_app_peek_first_window(AgApp *app)
|
||||||
@ -56,9 +52,8 @@ static GtkWidget *
|
|||||||
ag_app_create_window(AgApp *app)
|
ag_app_create_window(AgApp *app)
|
||||||
{
|
{
|
||||||
GtkWidget *window;
|
GtkWidget *window;
|
||||||
AgAppPrivate *priv = ag_app_get_instance_private(app);
|
|
||||||
|
|
||||||
window = ag_window_new(app, priv->manager);
|
window = ag_window_new(app);
|
||||||
gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW(window));
|
gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW(window));
|
||||||
gtk_widget_show_all(window);
|
gtk_widget_show_all(window);
|
||||||
|
|
||||||
@ -432,33 +427,6 @@ ag_app_new(void)
|
|||||||
static void
|
static void
|
||||||
ag_app_init(AgApp *app)
|
ag_app_init(AgApp *app)
|
||||||
{
|
{
|
||||||
AgAppPrivate *priv;
|
|
||||||
GBytes *css_data;
|
|
||||||
const gchar *css_source;
|
|
||||||
gsize css_length;
|
|
||||||
WebKitUserStyleSheet *stylesheet;
|
|
||||||
|
|
||||||
priv = ag_app_get_instance_private(app);
|
|
||||||
priv->manager = webkit_user_content_manager_new();
|
|
||||||
|
|
||||||
css_data = g_resources_lookup_data(
|
|
||||||
"/eu/polonkai/gergely/Astrognome/ui/chart-default.css",
|
|
||||||
G_RESOURCE_LOOKUP_FLAGS_NONE,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
if ((css_source = g_bytes_get_data(css_data, &css_length)) != NULL) {
|
|
||||||
stylesheet = webkit_user_style_sheet_new(
|
|
||||||
css_source,
|
|
||||||
WEBKIT_USER_CONTENT_INJECT_TOP_FRAME,
|
|
||||||
WEBKIT_USER_STYLE_LEVEL_USER,
|
|
||||||
NULL, NULL
|
|
||||||
);
|
|
||||||
webkit_user_content_manager_add_style_sheet(priv->manager, stylesheet);
|
|
||||||
webkit_user_style_sheet_unref(stylesheet);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_bytes_unref(css_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -62,6 +62,7 @@ struct _AgWindowPrivate {
|
|||||||
GtkEntryCompletion *city_comp;
|
GtkEntryCompletion *city_comp;
|
||||||
gchar *selected_country;
|
gchar *selected_country;
|
||||||
gchar *selected_city;
|
gchar *selected_city;
|
||||||
|
GList *style_sheets;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cc_search {
|
struct cc_search {
|
||||||
@ -2123,15 +2124,93 @@ ag_window_configure_event_cb(GtkWidget *widget,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ag_window_add_style_sheet(AgWindow *window, const gchar *path)
|
||||||
|
{
|
||||||
|
gchar *css_source;
|
||||||
|
gboolean source_free = FALSE;
|
||||||
|
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||||
|
|
||||||
|
if (strncmp("gres://", path, 7) == 0) {
|
||||||
|
gchar *res_path = g_strdup_printf(
|
||||||
|
"/eu/polonkai/gergely/Astrognome/%s",
|
||||||
|
path + 7
|
||||||
|
);
|
||||||
|
GBytes *css_data = g_resources_lookup_data(
|
||||||
|
res_path,
|
||||||
|
G_RESOURCE_LOOKUP_FLAGS_NONE,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
css_source = g_strdup(g_bytes_get_data(css_data, NULL));
|
||||||
|
source_free = TRUE;
|
||||||
|
g_bytes_unref(css_data);
|
||||||
|
} else if (strncmp("raw:", path, 4) == 0) {
|
||||||
|
css_source = (gchar *)path + 4;
|
||||||
|
} else {
|
||||||
|
GFile *css_file = g_file_new_for_uri(path);
|
||||||
|
GError *err = NULL;
|
||||||
|
|
||||||
|
g_file_load_contents(
|
||||||
|
css_file,
|
||||||
|
NULL,
|
||||||
|
&css_source, NULL,
|
||||||
|
NULL,
|
||||||
|
&err
|
||||||
|
);
|
||||||
|
source_free = TRUE;
|
||||||
|
g_object_unref(css_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (css_source) {
|
||||||
|
WebKitUserStyleSheet *style_sheet = webkit_user_style_sheet_new(
|
||||||
|
css_source,
|
||||||
|
WEBKIT_USER_CONTENT_INJECT_TOP_FRAME,
|
||||||
|
WEBKIT_USER_STYLE_LEVEL_USER,
|
||||||
|
NULL, NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
priv->style_sheets = g_list_append(priv->style_sheets, style_sheet);
|
||||||
|
|
||||||
|
if (source_free) {
|
||||||
|
g_free(css_source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ag_window_update_style_sheets(AgWindow *window)
|
||||||
|
{
|
||||||
|
GList *item;
|
||||||
|
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||||
|
WebKitUserContentManager *manager = webkit_web_view_get_user_content_manager(
|
||||||
|
WEBKIT_WEB_VIEW(priv->chart_web_view)
|
||||||
|
);
|
||||||
|
|
||||||
|
webkit_user_content_manager_remove_all_style_sheets(manager);
|
||||||
|
|
||||||
|
for (item = priv->style_sheets; item; item = g_list_next(item)) {
|
||||||
|
WebKitUserStyleSheet *style_sheet = item->data;
|
||||||
|
|
||||||
|
webkit_user_content_manager_add_style_sheet(manager, style_sheet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
ag_window_new(AgApp *app, WebKitUserContentManager *manager)
|
ag_window_new(AgApp *app)
|
||||||
{
|
{
|
||||||
AgWindow *window = g_object_new(AG_TYPE_WINDOW, NULL);
|
AgWindow *window = g_object_new(AG_TYPE_WINDOW, NULL);
|
||||||
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||||
|
WebKitUserContentManager *manager = webkit_user_content_manager_new();
|
||||||
|
|
||||||
priv->chart_web_view = webkit_web_view_new_with_user_content_manager(
|
priv->chart_web_view = webkit_web_view_new_with_user_content_manager(
|
||||||
manager
|
manager
|
||||||
);
|
);
|
||||||
|
ag_window_add_style_sheet(
|
||||||
|
window,
|
||||||
|
"gres://ui/chart-default.css"
|
||||||
|
);
|
||||||
|
ag_window_update_style_sheets(window);
|
||||||
gtk_box_pack_end(
|
gtk_box_pack_end(
|
||||||
GTK_BOX(priv->tab_chart),
|
GTK_BOX(priv->tab_chart),
|
||||||
priv->chart_web_view,
|
priv->chart_web_view,
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#define __AG_WINDOW_H__
|
#define __AG_WINDOW_H__
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <webkit2/webkit2.h>
|
|
||||||
|
|
||||||
#include "ag-app.h"
|
#include "ag-app.h"
|
||||||
#include "ag-chart.h"
|
#include "ag-chart.h"
|
||||||
@ -41,7 +40,7 @@ struct _AgWindowClass {
|
|||||||
|
|
||||||
GType ag_window_get_type(void) G_GNUC_CONST;
|
GType ag_window_get_type(void) G_GNUC_CONST;
|
||||||
|
|
||||||
GtkWidget *ag_window_new(AgApp *app, WebKitUserContentManager *manager);
|
GtkWidget *ag_window_new(AgApp *app);
|
||||||
|
|
||||||
void ag_window_set_chart(AgWindow *window,
|
void ag_window_set_chart(AgWindow *window,
|
||||||
AgChart *chart);
|
AgChart *chart);
|
||||||
|
Loading…
Reference in New Issue
Block a user