Make it possible to open a link in a new window with holding the mod key.
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index da84e1c..b6669ae 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -2,6 +2,7 @@
  *
  * To understand surf, start reading main().
  */
+
 #include <signal.h>
 #include <X11/X.h>
 #include <X11/Xatom.h>
@@ -240,7 +241,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;
@@ -657,6 +659,8 @@ newclient(void) {
        WebKitWebSettings *settings;
        WebKitWebFrame *frame;
        GdkGeometry hints = { 1, 1 };
+       GdkScreen *screen;
+       gdouble dpi;
        char *uri, *ua;
 
        if(!(c = calloc(1, sizeof(Client))))
@@ -801,6 +805,21 @@ 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);
+               }
+       }
+
        if(enableinspector) {
                c->inspector = WEBKIT_WEB_INSPECTOR(
                                webkit_web_view_get_inspector(c->view));
@@ -815,6 +834,11 @@ newclient(void) {
                c->isinspecting = false;
        }
 
+       if(runinfullscreen) {
+               c->fullscreen = 0;
+               fullscreen(c, NULL);
+       }
+
        g_free(uri);
 
        setatom(c, AtomFind, "");
@@ -842,7 +866,7 @@ newclient(void) {
 static void
 newwindow(Client *c, const Arg *arg, gboolean noembed) {
        guint i = 0;
-       const char *cmd[12], *uri;
+       const char *cmd[14], *uri;
        const Arg a = { .v = (void *)cmd };
        char tmp[64];
 
@@ -864,6 +888,8 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) {
                cmd[i++] = "-s";
        if(showxid)
                cmd[i++] = "-x";
+       cmd[i++] = "-c";
+       cmd[i++] = cookiefile;
        cmd[i++] = "--";
        uri = arg->v ? (char *)arg->v : c->linkhover;
        if(uri)
@@ -1252,7 +1278,8 @@ updatewinid(Client *c) {
 
 static void
 usage(void) {
-       die("usage: %s [-biknpsvx] [-c cookiefile] [-e xid] [-r scriptfile]"
+       die("usage: %s [-bBfFgGiIkKnNpPsSvx]"
+               " [-c cookiefile] [-e xid] [-r scriptfile]"
                " [-t stylefile] [-u useragent] [uri]\n", basename(argv0));
 }
 
@@ -1289,33 +1316,60 @@ main(int argc, char *argv[]) {
        case 'b':
                enablescrollbars = 0;
                break;
+       case 'B':
+               enablescrollbars = 1;
+               break;
        case 'c':
                cookiefile = EARGF(usage());
                break;
        case 'e':
                embed = strtol(EARGF(usage()), NULL, 0);
                break;
+       case 'f':
+               runinfullscreen = 1;
+               break;
+       case 'F':
+               runinfullscreen = 0;
+               break;
        case 'g':
                allowgeolocation = 0;
                break;
+       case 'G':
+               allowgeolocation = 1;
+               break;
        case 'i':
                loadimages = 0;
                break;
+       case 'I':
+               loadimages = 1;
+               break;
        case 'k':
+               kioskmode = 0;
+               break;
+       case 'K':
                kioskmode = 1;
                break;
        case 'n':
                enableinspector = 0;
                break;
+       case 'N':
+               enableinspector = 1;
+               break;
        case 'p':
                enableplugins = 0;
                break;
+       case 'P':
+               enableplugins = 1;
+               break;
        case 'r':
                scriptfile = EARGF(usage());
                break;
        case 's':
                enablescripts = 0;
                break;
+       case 'S':
+               enablescripts = 1;
+               break;
        case 't':
                stylefile = EARGF(usage());
                break;