Replacing the deprecated ssl-ca-file with tls-database.
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index 939a06f..7b71f0e 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -47,7 +47,7 @@ typedef struct Client {
        WebKitWebView *view;
        WebKitWebInspector *inspector;
        char *title, *linkhover;
-       const char *uri, *needle;
+       const char *needle;
        gint progress;
        struct Client *next;
        gboolean zoomed, fullscreen, isinspecting, sslfailed;
@@ -80,6 +80,7 @@ static char winid[64];
 static gboolean usingproxy = 0;
 static char togglestat[7];
 static char pagestat[3];
+static GTlsDatabase *tlsdb;
 
 static void addaccelgroup(Client *c);
 static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
@@ -241,7 +242,8 @@ buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl) {
 
        g_object_get(result, "context", &context, NULL);
        if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) {
-               if(e->button == 2) {
+               if(e->button == 2 ||
+                               (e->button == 1 && CLEANMASK(e->state) == CLEANMASK(MODKEY))) {
                        g_object_get(result, "link-uri", &arg.v, NULL);
                        newwindow(NULL, &arg, e->state & GDK_CONTROL_MASK);
                        return true;
@@ -600,8 +602,8 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
                        src = webkit_web_frame_get_data_source(frame);
                        request = webkit_web_data_source_get_request(src);
                        msg = webkit_network_request_get_message(request);
-                       c->sslfailed = soup_message_get_flags(msg)
-                                      ^ SOUP_MESSAGE_CERTIFICATE_TRUSTED;
+                       c->sslfailed = !(soup_message_get_flags(msg)
+                                       & SOUP_MESSAGE_CERTIFICATE_TRUSTED);
                }
                setatom(c, AtomUri, uri);
                break;
@@ -634,8 +636,10 @@ loaduri(Client *c, const Arg *arg) {
                        : g_strdup_printf("http://%s", uri);
        }
 
+       setatom(c, AtomUri, uri);
+
        /* prevents endless loop */
-       if(c->uri && strcmp(u, c->uri) == 0) {
+       if(strcmp(u, geturi(c)) == 0) {
                reload(c, &a);
        } else {
                webkit_web_view_load_uri(c->view, u);
@@ -658,6 +662,8 @@ newclient(void) {
        WebKitWebSettings *settings;
        WebKitWebFrame *frame;
        GdkGeometry hints = { 1, 1 };
+       GdkScreen *screen;
+       gdouble dpi;
        char *uri, *ua;
 
        if(!(c = calloc(1, sizeof(Client))))
@@ -802,6 +808,24 @@ newclient(void) {
        g_object_set(G_OBJECT(settings), "default-font-size",
                        defaultfontsize, NULL);
 
+       /*
+        * 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(GTK_WIDGET(c->win)->window);
+               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_INSPECTOR(
                                webkit_web_view_get_inspector(c->view));
@@ -816,6 +840,11 @@ newclient(void) {
                c->isinspecting = false;
        }
 
+       if(runinfullscreen) {
+               c->fullscreen = 0;
+               fullscreen(c, NULL);
+       }
+
        g_free(uri);
 
        setatom(c, AtomFind, "");
@@ -1016,6 +1045,7 @@ setup(void) {
        char *new_proxy;
        SoupURI *puri;
        SoupSession *s;
+       GError *error = NULL;
 
        /* clean up any zombies immediately */
        sigchld(0);
@@ -1042,7 +1072,13 @@ setup(void) {
                                        FALSE)));
 
        /* ssl */
-       g_object_set(G_OBJECT(s), "ssl-ca-file", cafile, NULL);
+       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);
 
        /* proxy */
@@ -1255,8 +1291,10 @@ updatewinid(Client *c) {
 
 static void
 usage(void) {
-       die("usage: %s [-biknpsvx] [-c cookiefile] [-e xid] [-r scriptfile]"
-               " [-t stylefile] [-u useragent] [uri]\n", basename(argv0));
+       die("usage: %s [-bBfFgGiIkKnNpPsSvx]"
+               " [-c cookiefile] [-e xid] [-r scriptfile]"
+               " [-t stylefile] [-u useragent] [-z zoomlevel]"
+               " [uri]\n", basename(argv0));
 }
 
 static void
@@ -1301,6 +1339,12 @@ main(int argc, char *argv[]) {
        case 'e':
                embed = strtol(EARGF(usage()), NULL, 0);
                break;
+       case 'f':
+               runinfullscreen = 1;
+               break;
+       case 'F':
+               runinfullscreen = 0;
+               break;
        case 'g':
                allowgeolocation = 0;
                break;
@@ -1352,6 +1396,9 @@ main(int argc, char *argv[]) {
        case 'x':
                showxid = TRUE;
                break;
+       case 'z':
+               zoomlevel = strtof(EARGF(usage()), NULL);
+               break;
        default:
                usage();
        } ARGEND;