X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=b1493ed48cd14b14c89d06ee75c74501e1ab4481;hb=ad538bb00a38c5df7d7140414756724c1045307d;hp=f17292ba407ae9b1b76ccbaf9c36ef5fe0596e23;hpb=e39b7e623cb19dc5e7e294d2e1a137a95dfd6945;p=surf.git diff --git a/surf.c b/surf.c index f17292b..b1493ed 100644 --- a/surf.c +++ b/surf.c @@ -53,7 +53,7 @@ union Arg { }; typedef struct Client { - GtkWidget *win, *scroll, *vbox, *pane; + GtkWidget *win; Window xid; WebKitWebView *view; WebKitWebInspector *inspector; @@ -155,7 +155,9 @@ static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c); static void loaduri(Client *c, const Arg *arg); static void navigate(Client *c, const Arg *arg); -static Client *newclient(void); +static Client *newclient(Client *c); +static WebKitWebView *newview(Client *c, WebKitWebView *rv); +static void showview(WebKitWebView *v, Client *c); static void newwindow(Client *c, const Arg *arg, gboolean noembed); static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); static gboolean contextmenu(WebKitWebView *view, GtkWidget *menu, @@ -774,16 +776,10 @@ navigate(Client *c, const Arg *arg) } Client * -newclient(void) +newclient(Client *rc) { Client *c; - WebKitWebSettings *settings; - WebKitWebFrame *frame; - GdkGeometry hints = { 1, 1 }; - GdkScreen *screen; - GdkWindow *gwin; gdouble dpi; - char *ua; if (!(c = calloc(1, sizeof(Client)))) die("Cannot malloc!\n"); @@ -791,119 +787,156 @@ newclient(void) c->title = NULL; c->progress = 100; - /* Window */ - if (embed) { - c->win = gtk_plug_new(embed); - } else { - c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - - /* TA: 20091214: Despite what the GNOME docs say, the ICCCM - * is always correct, so we should still call this function. - * But when doing so, we *must* differentiate between a - * WM_CLASS and a resource on the window. By convention, the - * window class (WM_CLASS) is capped, while the resource is in - * lowercase. Both these values come as a pair. - */ - gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "Surf"); - - /* TA: 20091214: And set the role here as well -- so that - * sessions can pick this up. - */ - gtk_window_set_role(GTK_WINDOW(c->win), "Surf"); - } - gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600); - g_signal_connect(G_OBJECT(c->win), - "destroy", - G_CALLBACK(destroywin), c); - g_signal_connect(G_OBJECT(c->win), - "leave_notify_event", - G_CALLBACK(titlechangeleave), c); + c->next = clients; + clients = c; - if (!kioskmode) - addaccelgroup(c); + c->view = newview(c, rc ? rc->view : NULL); - /* Pane */ - c->pane = gtk_paned_new(GTK_ORIENTATION_VERTICAL); + return c; +} - /* VBox */ - c->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_paned_pack1(GTK_PANED(c->pane), c->vbox, TRUE, TRUE); +WebKitWebView * +newview(Client *c, WebKitWebView *rv) +{ + WebKitWebView *v; + WebKitSettings *settings; + char *ua; /* Webview */ - c->view = WEBKIT_WEB_VIEW(webkit_web_view_new()); + if (rv) { + v = WEBKIT_WEB_VIEW( + webkit_web_view_new_with_related_view(rv)); + } else { + v = WEBKIT_WEB_VIEW(webkit_web_view_new()); + + settings = webkit_web_view_get_settings(v); + if (!(ua = getenv("SURF_USERAGENT"))) + ua = useragent; + g_object_set(G_OBJECT(settings), "user-agent", ua, NULL); + g_object_set(G_OBJECT(settings), + "auto-load-images", loadimages, NULL); + g_object_set(G_OBJECT(settings), + "enable-plugins", enableplugins, NULL); + g_object_set(G_OBJECT(settings), + "enable-scripts", enablescripts, NULL); + g_object_set(G_OBJECT(settings), + "enable-spatial-navigation", enablespatialbrowsing, NULL); + g_object_set(G_OBJECT(settings), + "enable-developer-extras", enableinspector, NULL); + g_object_set(G_OBJECT(settings), + "enable-default-context-menu", kioskmode ^ 1, NULL); + g_object_set(G_OBJECT(settings), + "default-font-size", defaultfontsize, NULL); + g_object_set(G_OBJECT(settings), + "resizable-text-areas", 1, NULL); + if (enablestyle) + setstyle(c, getstyle("about:blank")); + + if (enableinspector) { + c->inspector = webkit_web_view_get_inspector(v); + g_signal_connect(G_OBJECT(c->inspector), "inspect-web-view", + G_CALLBACK(inspector_new), c); + g_signal_connect(G_OBJECT(c->inspector), "show-window", + G_CALLBACK(inspector_show), c); + g_signal_connect(G_OBJECT(c->inspector), "close-window", + G_CALLBACK(inspector_close), c); + g_signal_connect(G_OBJECT(c->inspector), "finished", + G_CALLBACK(inspector_finished), c); + c->isinspecting = false; + } + } - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "notify::title", G_CALLBACK(titlechange), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "hovering-over-link", G_CALLBACK(linkhover), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "geolocation-policy-decision-requested", G_CALLBACK(geopolicyrequested), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "create-web-view", G_CALLBACK(createwindow), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "ready-to-show", + G_CALLBACK(showview), c); + g_signal_connect(G_OBJECT(v), "new-window-policy-decision-requested", G_CALLBACK(decidewindow), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "mime-type-policy-decision-requested", G_CALLBACK(decidedownload), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "window-object-cleared", G_CALLBACK(windowobjectcleared), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "notify::load-status", G_CALLBACK(loadstatuschange), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "notify::progress", G_CALLBACK(progresschange), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "download-requested", G_CALLBACK(initdownload), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "button-release-event", G_CALLBACK(buttonrelease), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "context-menu", G_CALLBACK(contextmenu), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "resource-request-starting", G_CALLBACK(beforerequest), c); - g_signal_connect(G_OBJECT(c->view), + g_signal_connect(G_OBJECT(v), "should-show-delete-interface-for-element", G_CALLBACK(deletion_interface), c); - /* Scrolled Window */ - c->scroll = gtk_scrolled_window_new(NULL, NULL); + return v; +} - frame = webkit_web_view_get_main_frame(WEBKIT_WEB_VIEW(c->view)); - g_signal_connect(G_OBJECT(frame), "scrollbars-policy-changed", - G_CALLBACK(gtk_true), NULL); +void +showview(WebKitWebView *v, Client *c) +{ + GdkGeometry hints = { 1, 1 }; + GdkRGBA bgcolor = { 0 }; + GdkWindow *gwin; - if (!enablescrollbars) { - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll), - GTK_POLICY_NEVER, - GTK_POLICY_NEVER); + /* Window */ + if (embed) { + c->win = gtk_plug_new(embed); } else { - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); + c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + /* TA: 20091214: Despite what the GNOME docs say, the ICCCM + * is always correct, so we should still call this function. + * But when doing so, we *must* differentiate between a + * WM_CLASS and a resource on the window. By convention, the + * window class (WM_CLASS) is capped, while the resource is in + * lowercase. Both these values come as a pair. + */ + gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "Surf"); + + /* TA: 20091214: And set the role here as well -- so that + * sessions can pick this up. + */ + gtk_window_set_role(GTK_WINDOW(c->win), "Surf"); } + gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600); + g_signal_connect(G_OBJECT(c->win), + "destroy", + G_CALLBACK(destroywin), c); + g_signal_connect(G_OBJECT(c->win), + "leave_notify_event", + G_CALLBACK(titlechangeleave), c); + + if (!kioskmode) + addaccelgroup(c); /* Arranging */ - gtk_container_add(GTK_CONTAINER(c->scroll), GTK_WIDGET(c->view)); - gtk_container_add(GTK_CONTAINER(c->win), c->pane); - gtk_container_add(GTK_CONTAINER(c->vbox), c->scroll); + gtk_container_add(GTK_CONTAINER(c->win), GTK_WIDGET(c->view)); /* Setup */ - gtk_box_set_child_packing(GTK_BOX(c->vbox), c->scroll, TRUE, TRUE, 0, - GTK_PACK_START); gtk_widget_grab_focus(GTK_WIDGET(c->view)); - gtk_widget_show(c->pane); - gtk_widget_show(c->vbox); - gtk_widget_show(c->scroll); gtk_widget_show(GTK_WIDGET(c->view)); gtk_widget_show(c->win); gwin = gtk_widget_get_window(GTK_WIDGET(c->win)); @@ -912,74 +945,20 @@ newclient(void) GDK_HINT_MIN_SIZE); gdk_window_set_events(gwin, GDK_ALL_EVENTS_MASK); gdk_window_add_filter(gwin, processx, c); - webkit_web_view_set_full_content_zoom(c->view, TRUE); runscript(frame); - settings = webkit_web_view_get_settings(c->view); - if (!(ua = getenv("SURF_USERAGENT"))) - ua = useragent; - g_object_set(G_OBJECT(settings), "user-agent", ua, NULL); - g_object_set(G_OBJECT(settings), - "auto-load-images", loadimages, NULL); - g_object_set(G_OBJECT(settings), - "enable-plugins", enableplugins, NULL); - g_object_set(G_OBJECT(settings), - "enable-scripts", enablescripts, NULL); - g_object_set(G_OBJECT(settings), - "enable-spatial-navigation", enablespatialbrowsing, NULL); - g_object_set(G_OBJECT(settings), - "enable-developer-extras", enableinspector, NULL); - g_object_set(G_OBJECT(settings), - "enable-default-context-menu", kioskmode ^ 1, NULL); - g_object_set(G_OBJECT(settings), - "default-font-size", defaultfontsize, NULL); - g_object_set(G_OBJECT(settings), - "resizable-text-areas", 1, NULL); - if (enablestyle) - setstyle(c, getstyle("about:blank")); - - /* - * While stupid, CSS specifies that a pixel represents 1/96 of an inch. - * This ensures websites are not unusably small with a high DPI screen. - * It is equivalent to firefox's "layout.css.devPixelsPerPx" setting. - */ - if (zoomto96dpi) { - screen = gdk_window_get_screen(gwin); - dpi = gdk_screen_get_resolution(screen); - if (dpi != -1) { - g_object_set(G_OBJECT(settings), - "enforce-96-dpi", true, NULL); - webkit_web_view_set_zoom_level(c->view, dpi/96); - } - } /* This might conflict with _zoomto96dpi_. */ if (zoomlevel != 1.0) webkit_web_view_set_zoom_level(c->view, zoomlevel); - if (enableinspector) { - c->inspector = webkit_web_view_get_inspector(c->view); - g_signal_connect(G_OBJECT(c->inspector), "inspect-web-view", - G_CALLBACK(inspector_new), c); - g_signal_connect(G_OBJECT(c->inspector), "show-window", - G_CALLBACK(inspector_show), c); - g_signal_connect(G_OBJECT(c->inspector), "close-window", - G_CALLBACK(inspector_close), c); - g_signal_connect(G_OBJECT(c->inspector), "finished", - G_CALLBACK(inspector_finished), c); - c->isinspecting = false; - } - if (runinfullscreen) fullscreen(c, NULL); setatom(c, AtomFind, ""); setatom(c, AtomUri, "about:blank"); if (hidebackground) - webkit_web_view_set_transparent(c->view, TRUE); - - c->next = clients; - clients = c; + webkit_web_view_set_background_color(c->view, &bgcolor); if (showxid) { gdk_display_sync(gtk_widget_get_display(c->win)); @@ -989,8 +968,6 @@ newclient(void) die("Error closing stdout"); } } - - return c; } void @@ -1253,21 +1230,20 @@ setup(void) webkit_web_context_get_cookie_manager(context), cookiepolicy_get()); + /* rendering process model, can be a shared unique one or one for each + * view */ + webkit_web_context_set_process_model(context, + WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES); + /* disk cache */ webkit_web_context_set_cache_model(context, enablecache ? WEBKIT_CACHE_MODEL_WEB_BROWSER : WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER); /* ssl */ - tlsdb = g_tls_file_database_new(cafile, &error); - - if (error) { - g_warning("Error loading SSL database %s: %s", cafile, - error->message); - g_error_free(error); - } - g_object_set(G_OBJECT(s), "tls-database", tlsdb, NULL); - g_object_set(G_OBJECT(s), "ssl-strict", strictssl, NULL); + webkit_web_context_set_tls_errors_policy(context, strictssl ? + WEBKIT_TLS_ERRORS_POLICY_FAIL : + WEBKIT_TLS_ERRORS_POLICY_IGNORE); } void @@ -1629,7 +1605,8 @@ main(int argc, char *argv[]) arg.v = argv[0]; setup(); - c = newclient(); + c = newclient(NULL); + showview(NULL, c); if (arg.v) loaduri(clients, &arg); else