X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=42bc393b600990835affa413a091676c03cffa3a;hb=237e10058aaceca4660259d3948662a1e0b79cfb;hp=e325126ae640de3fbc5ff31fc67a167e583aa211;hpb=083ea8ecde50314cca961c7596a7ab43fc90223e;p=surf.git diff --git a/surf.c b/surf.c index e325126..42bc393 100644 --- a/surf.c +++ b/surf.c @@ -2,6 +2,7 @@ * * To understand surf, start reading main(). */ + #include #include #include @@ -77,7 +78,7 @@ static GdkNativeWindow embed = 0; static gboolean showxid = FALSE; static char winid[64]; static gboolean usingproxy = 0; -static char togglestat[6]; +static char togglestat[7]; static char pagestat[3]; static void addaccelgroup(Client *c); @@ -106,12 +107,16 @@ static gboolean decidedownload(WebKitWebView *v, WebKitWebFrame *f, static gboolean decidewindow(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *p, Client *c); +static gboolean deletion_interface(WebKitWebView *view, + WebKitDOMHTMLElement *arg1, Client *c); static void destroyclient(Client *c); static void destroywin(GtkWidget* w, Client *c); static void die(const char *errstr, ...); static void eval(Client *c, const Arg *arg); static void find(Client *c, const Arg *arg); static void fullscreen(Client *c, const Arg *arg); +static void geopolicyrequested(WebKitWebView *v, WebKitWebFrame *f, + WebKitGeolocationPolicyDecision *d, Client *c); static const char *getatom(Client *c, int a); static void gettogglestat(Client *c); static void getpagestat(Client *c); @@ -156,6 +161,7 @@ static void stop(Client *c, const Arg *arg); static void titlechange(WebKitWebView *v, WebKitWebFrame *frame, const char *title, Client *c); static void toggle(Client *c, const Arg *arg); +static void togglegeolocation(Client *c, const Arg *arg); static void togglescrollbars(Client *c, const Arg *arg); static void togglestyle(Client *c, const Arg *arg); static void updatetitle(Client *c); @@ -386,6 +392,12 @@ decidewindow(WebKitWebView *view, WebKitWebFrame *f, WebKitNetworkRequest *r, return FALSE; } +static gboolean +deletion_interface(WebKitWebView *view, + WebKitDOMHTMLElement *arg1, Client *c) { + return FALSE; +} + static void destroyclient(Client *c) { Client *p; @@ -441,6 +453,16 @@ fullscreen(Client *c, const Arg *arg) { c->fullscreen = !c->fullscreen; } +static void +geopolicyrequested(WebKitWebView *v, WebKitWebFrame *f, + WebKitGeolocationPolicyDecision *d, Client *c) { + if(allowgeolocation) { + webkit_geolocation_policy_allow(d); + } else { + webkit_geolocation_policy_deny(d); + } +} + static const char * getatom(Client *c, int a) { static char buf[BUFSIZ]; @@ -636,6 +658,8 @@ newclient(void) { WebKitWebSettings *settings; WebKitWebFrame *frame; GdkGeometry hints = { 1, 1 }; + GdkScreen *screen; + gdouble dpi; char *uri, *ua; if(!(c = calloc(1, sizeof(Client)))) @@ -685,6 +709,9 @@ newclient(void) { g_signal_connect(G_OBJECT(c->view), "hovering-over-link", G_CALLBACK(linkhover), c); + g_signal_connect(G_OBJECT(c->view), + "geolocation-policy-decision-requested", + G_CALLBACK(geopolicyrequested), c); g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(createwindow), c); @@ -715,6 +742,9 @@ newclient(void) { g_signal_connect(G_OBJECT(c->view), "resource-request-starting", G_CALLBACK(beforerequest), c); + g_signal_connect(G_OBJECT(c->view), + "should-show-delete-interface-for-element", + G_CALLBACK(deletion_interface), c); /* Scrolled Window */ c->scroll = gtk_scrolled_window_new(NULL, NULL); @@ -774,6 +804,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)); @@ -788,6 +833,11 @@ newclient(void) { c->isinspecting = false; } + if(runinfullscreen) { + c->fullscreen = 0; + fullscreen(c, NULL); + } + g_free(uri); setatom(c, AtomFind, ""); @@ -815,7 +865,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]; @@ -837,6 +887,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) @@ -1086,7 +1138,7 @@ toggle(Client *c, const Arg *arg) { g_object_get(G_OBJECT(settings), name, &value, NULL); g_object_set(G_OBJECT(settings), name, !value, NULL); - reload(c,&a); + reload(c, &a); } static void @@ -1107,6 +1159,15 @@ twitch(Client *c, const Arg *arg) { gtk_adjustment_set_value(a, v); } +static void +togglegeolocation(Client *c, const Arg *arg) { + Arg a = { .b = FALSE }; + + allowgeolocation ^= 1; + + reload(c, &a); +} + static void togglescrollbars(Client *c, const Arg *arg) { GtkPolicyType vspolicy; @@ -1150,19 +1211,21 @@ gettogglestat(Client *c){ &value, NULL); togglestat[0] = value? 'C': 'c'; + togglestat[1] = allowgeolocation? 'G': 'g'; + g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL); - togglestat[1] = value? 'I': 'i'; + togglestat[2] = value? 'I': 'i'; g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL); - togglestat[2] = value? 'S': 's'; + togglestat[3] = value? 'S': 's'; g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL); - togglestat[3] = value? 'V': 'v'; + togglestat[4] = value? 'V': 'v'; g_object_get(G_OBJECT(settings), "user-stylesheet-uri", &uri, NULL); - togglestat[4] = uri[0] ? 'M': 'm'; + togglestat[5] = uri[0] ? 'M': 'm'; - togglestat[5] = '\0'; + togglestat[6] = '\0'; } static void @@ -1251,30 +1314,57 @@ 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 '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;