X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=08245b698ec6980188a343694a371a96610875f9;hb=421486db18ce2de31de71bf0372b6f5c049eb970;hp=b2980309a08bf05b590cbed7fd3afda9ff039156;hpb=94f2f2eacef96aa3f34124352232aac3a17c995f;p=surf.git diff --git a/surf.c b/surf.c index b298030..08245b6 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; @@ -156,6 +156,7 @@ static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, static void loaduri(Client *c, const Arg *arg); static void navigate(Client *c, const Arg *arg); static Client *newclient(void); +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, @@ -778,10 +779,6 @@ newclient(void) { Client *c; WebKitWebSettings *settings; - WebKitWebFrame *frame; - GdkGeometry hints = { 1, 1 }; - GdkScreen *screen; - GdkWindow *gwin; gdouble dpi; char *ua; @@ -791,44 +788,6 @@ 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); - - if (!kioskmode) - addaccelgroup(c); - - /* Pane */ - c->pane = gtk_paned_new(GTK_ORIENTATION_VERTICAL); - - /* VBox */ - c->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_paned_pack1(GTK_PANED(c->pane), c->vbox, TRUE, TRUE); - /* Webview */ c->view = WEBKIT_WEB_VIEW(webkit_web_view_new()); @@ -844,6 +803,8 @@ newclient(void) g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(createwindow), c); + g_signal_connect(G_OBJECT(v), "ready-to-show", + G_CALLBACK(showview), c); g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-requested", G_CALLBACK(decidewindow), c); @@ -875,47 +836,6 @@ newclient(void) "should-show-delete-interface-for-element", G_CALLBACK(deletion_interface), c); - /* Scrolled Window */ - c->scroll = gtk_scrolled_window_new(NULL, NULL); - - 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); - - if (!enablescrollbars) { - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll), - GTK_POLICY_NEVER, - GTK_POLICY_NEVER); - } else { - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - } - - /* 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); - - /* 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)); - c->xid = gdk_x11_window_get_xid(gwin); - gtk_window_set_geometry_hints(GTK_WINDOW(c->win), NULL, &hints, - 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; @@ -939,24 +859,6 @@ newclient(void) 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", @@ -970,16 +872,77 @@ newclient(void) c->isinspecting = false; } + c->next = clients; + clients = c; + + return c; +} + +void +showview(WebKitWebView *v, Client *c) +{ + GdkGeometry hints = { 1, 1 }; + GdkRGBA bgcolor = { 0 }; + GdkWindow *gwin; + + /* 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); + + if (!kioskmode) + addaccelgroup(c); + + /* Arranging */ + gtk_container_add(GTK_CONTAINER(c->win), GTK_WIDGET(c->view)); + + /* Setup */ + gtk_widget_grab_focus(GTK_WIDGET(c->view)); + gtk_widget_show(GTK_WIDGET(c->view)); + gtk_widget_show(c->win); + gwin = gtk_widget_get_window(GTK_WIDGET(c->win)); + c->xid = gdk_x11_window_get_xid(gwin); + gtk_window_set_geometry_hints(GTK_WINDOW(c->win), NULL, &hints, + GDK_HINT_MIN_SIZE); + gdk_window_set_events(gwin, GDK_ALL_EVENTS_MASK); + gdk_window_add_filter(gwin, processx, c); + + runscript(frame); + + /* This might conflict with _zoomto96dpi_. */ + if (zoomlevel != 1.0) + webkit_web_view_set_zoom_level(c->view, zoomlevel); + 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 +952,6 @@ newclient(void) die("Error closing stdout"); } } - - return c; } void @@ -1253,6 +1214,11 @@ 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 :