tAdd showview() - surf - customized build of surf, the suckless webkit browser
 (HTM) git clone git://src.adamsgaard.dk/surf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 421486db18ce2de31de71bf0372b6f5c049eb970
 (DIR) parent f86977a6fab8ed51bd1208b843b9f53db0cdd058
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Wed, 18 Nov 2015 16:13:27 +0100
       
       Add showview()
       
       Only show the window when and if the view is ready.
       Move all the window rendering there.
       
       Diffstat:
         M surf.c                              |     129 ++++++++++++++++---------------
       
       1 file changed, 68 insertions(+), 61 deletions(-)
       ---
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -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,
       t@@ -778,9 +779,6 @@ newclient(void)
        {
                Client *c;
                WebKitWebSettings *settings;
       -        GdkGeometry hints = { 1, 1 };
       -        GdkScreen *screen;
       -        GdkWindow *gwin;
                gdouble dpi;
                char *ua;
        
       t@@ -790,37 +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);
       -
                /* Webview */
                c->view = WEBKIT_WEB_VIEW(webkit_web_view_new());
        
       t@@ -836,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);
       t@@ -867,23 +836,6 @@ newclient(void)
                                 "should-show-delete-interface-for-element",
                                 G_CALLBACK(deletion_interface), 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);
       -        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;
       t@@ -907,10 +859,6 @@ newclient(void)
                if (enablestyle)
                        setstyle(c, getstyle("about:blank"));
        
       -        /* 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",
       t@@ -924,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));
       t@@ -943,8 +952,6 @@ newclient(void)
                                die("Error closing stdout");
                        }
                }
       -
       -        return c;
        }
        
        void