Fix error handling in spawn()
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index 6c85c3e..32c1920 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -211,7 +211,7 @@ die(const char *errstr, ...)
        va_start(ap, errstr);
        vfprintf(stderr, errstr, ap);
        va_end(ap);
-       exit(EXIT_FAILURE);
+       exit(1);
 }
 
 void
@@ -259,7 +259,8 @@ sigchld(int unused)
 {
        if (signal(SIGCHLD, sigchld) == SIG_ERR)
                die("Can't install SIGCHLD handler");
-       while (0 < waitpid(-1, NULL, WNOHANG));
+       while (waitpid(-1, NULL, WNOHANG) > 0)
+               ;
 }
 
 char *
@@ -332,14 +333,12 @@ newclient(Client *rc)
        if (!(c = calloc(1, sizeof(Client))))
                die("Cannot malloc!\n");
 
-       c->title = NULL;
-       c->progress = 100;
-
        c->next = clients;
        clients = c;
 
-       c->view = newview(c, rc ? rc->view : NULL);
+       c->progress = 100;
        c->tlsflags = G_TLS_CERTIFICATE_VALIDATE_ALL + 1;
+       c->view = newview(c, rc ? rc->view : NULL);
 
        return c;
 }
@@ -434,26 +433,24 @@ void
 updatetitle(Client *c)
 {
        char *title;
+       const char *name = c->targeturi ? c->targeturi :
+                          c->title ? c->title : "";
 
        if (showindicators) {
                gettogglestats(c);
                getpagestats(c);
 
-               if (c->progress != 100) {
+               if (c->progress != 100)
                        title = g_strdup_printf("[%i%%] %s:%s | %s",
-                               c->progress, togglestats, pagestats,
-                               c->targeturi ? c->targeturi : c->title);
-               } else {
+                               c->progress, togglestats, pagestats, name);
+               else
                        title = g_strdup_printf("%s:%s | %s",
-                               togglestats, pagestats,
-                               c->targeturi ? c->targeturi : c->title);
-               }
+                               togglestats, pagestats, name);
 
                gtk_window_set_title(GTK_WINDOW(c->win), title);
                g_free(title);
        } else {
-               gtk_window_set_title(GTK_WINDOW(c->win), c->title ?
-                                    c->title : "");
+               gtk_window_set_title(GTK_WINDOW(c->win), name);
        }
 }
 
@@ -488,12 +485,11 @@ cookiepolicy_get(void)
                return WEBKIT_COOKIE_POLICY_ACCEPT_NEVER;
        case '@':
                return WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY;
+       default: /* fallthrough */
        case 'A':
-       default:
-               break;
+               return WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS;
        }
 
-       return WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS;
 }
 
 char
@@ -504,12 +500,11 @@ cookiepolicy_set(const WebKitCookieAcceptPolicy p)
                return 'a';
        case WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY:
                return '@';
+       default: /* fallthrough */
        case WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS:
-       default:
-               break;
+               return 'A';
        }
 
-       return 'A';
 }
 
 const char *
@@ -648,9 +643,9 @@ spawn(Client *c, const Arg *a)
                        close(ConnectionNumber(dpy));
                setsid();
                execvp(((char **)a->v)[0], (char **)a->v);
-               fprintf(stderr, "surf: execvp %s", ((char **)a->v)[0]);
+               fprintf(stderr, "%s: execvp %s", argv0, ((char **)a->v)[0]);
                perror(" failed");
-               exit(0);
+               exit(1);
        }
 }
 
@@ -905,7 +900,6 @@ winevent(GtkWidget *w, GdkEvent *e, Client *c)
 void
 showview(WebKitWebView *v, Client *c)
 {
-       GdkGeometry hints = { 1, 1 };
        GdkRGBA bgcolor = { 0 };
        GdkWindow *gwin;
 
@@ -916,8 +910,6 @@ showview(WebKitWebView *v, Client *c)
        c->win = createwindow(c);
 
        gtk_container_add(GTK_CONTAINER(c->win), GTK_WIDGET(c->view));
-       gtk_window_set_geometry_hints(GTK_WINDOW(c->win), NULL, &hints,
-                                     GDK_HINT_MIN_SIZE);
        gtk_widget_show_all(c->win);
        gtk_widget_grab_focus(GTK_WIDGET(c->view));
 
@@ -951,6 +943,7 @@ showview(WebKitWebView *v, Client *c)
 GtkWidget *
 createwindow(Client *c)
 {
+       char *wmstr;
        GtkWidget *w;
 
        if (embed) {
@@ -958,19 +951,14 @@ createwindow(Client *c)
        } else {
                w = 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(w), "surf", "Surf");
+               wmstr = g_path_get_basename(argv0);
+               gtk_window_set_wmclass(GTK_WINDOW(w), wmstr, "Surf");
+               g_free(wmstr);
 
-               /* TA:  20091214:  And set the role here as well -- so that
-                * sessions can pick this up.
-                */
-               gtk_window_set_role(GTK_WINDOW(w), "Surf");
+               wmstr = g_strdup_printf("%s[%lu]", "Surf",
+                       webkit_web_view_get_page_id(c->view));
+               gtk_window_set_role(GTK_WINDOW(w), wmstr);
+               g_free(wmstr);
 
                gtk_window_set_default_size(GTK_WINDOW(w), 800, 600);
        }
@@ -1226,7 +1214,7 @@ void
 pasteuri(GtkClipboard *clipboard, const char *text, gpointer d)
 {
        Arg a = {.v = text };
-       if (!text)
+       if (text)
                loaduri((Client *) d, &a);
 }
 
@@ -1549,18 +1537,18 @@ main(int argc, char *argv[])
        } ARGEND;
        if (argc > 0)
                arg.v = argv[0];
+       else
+               arg.v = "about:blank";
 
        setup();
        c = newclient(NULL);
        showview(NULL, c);
 
-       if (arg.v)
-               loaduri(clients, &arg);
-       else
-               updatetitle(c);
+       loaduri(c, &arg);
+       updatetitle(c);
 
        gtk_main();
        cleanup();
 
-       return EXIT_SUCCESS;
+       return 0;
 }