X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=b69c615b4f377c054420e6f78e3ba0243fdbb7d5;hb=a013f0857e0f2ddf720b9d02954eeacd8d3f849b;hp=2465fd15ead964f54168032325691a16a32a7e0f;hpb=d911219554e1b51f02ac29aaf200f15f083c9dee;p=surf.git diff --git a/surf.c b/surf.c index 2465fd1..b69c615 100644 --- a/surf.c +++ b/surf.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -45,7 +46,7 @@ typedef struct Client { gint progress; gboolean sslfailed; struct Client *next; - gboolean zoomed; + gboolean zoomed, fullscreen; } Client; typedef struct { @@ -78,7 +79,9 @@ static Client *clients = NULL; static GdkNativeWindow embed = 0; static gboolean showxid = FALSE; static char winid[64]; -static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0; +static gboolean loadimages = 1, enableplugins = 1, enablescripts = 1, + usingproxy = 0; +static char togglestat[5]; static char *buildpath(const char *path); static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl); @@ -98,6 +101,7 @@ static void die(char *str); static void drawindicator(Client *c); static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c); static void find(Client *c, const Arg *arg); +static void fullscreen(Client *c, const Arg *arg); static const char *getatom(Client *c, int a); static char *geturi(Client *c); static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c); @@ -127,6 +131,7 @@ static void eval(Client *c, const Arg *arg); 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 gettogglestat(Client *c); static void update(Client *c); static void updatewinid(Client *c); static void usage(void); @@ -357,13 +362,13 @@ drawindicator(Client *c) { width = c->progress * w->allocation.width / 100; gc = gdk_gc_new(w->window); if(strstr(uri, "https://") == uri) { - if(using_proxy) { + if(usingproxy) { colorname = c->sslfailed? progress_proxy_untrust : progress_proxy_trust; } else { colorname = c->sslfailed? progress_untrust : progress_trust; } } else { - if(using_proxy) { + if(usingproxy) { colorname = progress_proxy; } else { colorname = progress; @@ -395,6 +400,16 @@ find(Client *c, const Arg *arg) { webkit_web_view_search_text(c->view, s, FALSE, forward, TRUE); } +void +fullscreen(Client *c, const Arg *arg) { + if(c->fullscreen) { + gtk_window_unfullscreen(GTK_WINDOW(c->win)); + } else { + gtk_window_fullscreen(GTK_WINDOW(c->win)); + } + c->fullscreen = !c->fullscreen; +} + const char * getatom(Client *c, int a) { static char buf[BUFSIZ]; @@ -428,7 +443,7 @@ initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) { Arg arg; updatewinid(c); - arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o)); + arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o), geturi(c)); spawn(c, &arg); return FALSE; } @@ -447,6 +462,7 @@ keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { processed = TRUE; } } + return processed; } @@ -493,14 +509,23 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { void loaduri(Client *c, const Arg *arg) { - char *u; + char *u, *rp; const char *uri = (char *)arg->v; Arg a = { .b = FALSE }; if(strcmp(uri, "") == 0) return; - u = g_strrstr(uri, "://") ? g_strdup(uri) - : g_strdup_printf("http://%s", uri); + + /* In case it's a file path. */ + if(uri[0] == '/') { + rp = realpath(uri, NULL); + u = g_strdup_printf("file://%s", rp); + free(rp); + } else { + u = g_strrstr(uri, "://") ? g_strdup(uri) + : g_strdup_printf("http://%s", uri); + } + /* prevents endless loop */ if(c->uri && strcmp(u, c->uri) == 0) { reload(c, &a); @@ -529,12 +554,13 @@ newclient(void) { if(!(c = calloc(1, sizeof(Client)))) die("Cannot malloc!\n"); + /* Window */ if(embed) { c->win = gtk_plug_new(embed); - } - else { + } 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 @@ -599,6 +625,7 @@ newclient(void) { gdk_window_set_events(GTK_WIDGET(c->win)->window, GDK_ALL_EVENTS_MASK); gdk_window_add_filter(GTK_WIDGET(c->win)->window, processx, c); webkit_web_view_set_full_content_zoom(c->view, TRUE); + frame = webkit_web_view_get_main_frame(c->view); runscript(frame); settings = webkit_web_view_get_settings(c->view); @@ -607,16 +634,17 @@ newclient(void) { g_object_set(G_OBJECT(settings), "user-agent", ua, NULL); uri = g_strconcat("file://", stylefile, NULL); g_object_set(G_OBJECT(settings), "user-stylesheet-uri", uri, NULL); - g_object_set(G_OBJECT(settings), "auto-load-images", loadimage, NULL); - g_object_set(G_OBJECT(settings), "enable-plugins", plugin, NULL); - g_object_set(G_OBJECT(settings), "enable-scripts", script, NULL); - g_object_set(G_OBJECT(settings), "enable-spatial-navigation", SPATIAL_BROWSING, NULL); + g_object_set(G_OBJECT(settings), "auto-load-images", loadimages, NULL); + g_object_set(G_OBJECT(settings), "enable-plugins", enableplugins, NULL); + g_object_set(G_OBJECT(settings), "enable-scripts", enablescripts, NULL); + g_object_set(G_OBJECT(settings), "enable-spatial-navigation", + spatialbrowsing, NULL); g_free(uri); setatom(c, AtomFind, ""); setatom(c, AtomUri, "about:blank"); - if(HIDE_BACKGROUND) + if(hidebackground) webkit_web_view_set_transparent(c->view, TRUE); c->title = NULL; @@ -646,11 +674,11 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) { snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed); cmd[i++] = tmp; } - if(!script) + if(!enablescripts) cmd[i++] = "-s"; - if(!plugin) + if(!enableplugins) cmd[i++] = "-p"; - if(!loadimage) + if(!loadimages) cmd[i++] = "-i"; if(showxid) cmd[i++] = "-x"; @@ -838,7 +866,7 @@ setup(void) { g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL); soup_uri_free(puri); g_free(new_proxy); - using_proxy = 1; + usingproxy = 1; } } @@ -891,7 +919,7 @@ titlechange(WebKitWebView *v, WebKitWebFrame *f, const char *t, Client *c) { } void -toggle(Client *c, const Arg *arg) { +toggle(Client *c, const Arg *arg) { WebKitWebSettings *settings; char *name = (char *)arg->v; gboolean value; @@ -904,19 +932,44 @@ toggle(Client *c, const Arg *arg) { reload(c,&a); } +void +gettogglestat(Client *c){ + gboolean value; + WebKitWebSettings *settings = webkit_web_view_get_settings(c->view); + + g_object_get(G_OBJECT(settings), "enable-caret-browsing", + &value, NULL); + togglestat[0] = value? 'C': 'c'; + + g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL); + togglestat[1] = value? 'I': 'i'; + + g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL); + togglestat[2] = value? 'S': 's'; + + g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL); + togglestat[3] = value? 'V': 'v'; + + togglestat[4] = '\0'; +} + + void update(Client *c) { char *t; + gettogglestat(c); + if(c->linkhover) { - t = g_strdup(c->linkhover); + t = g_strdup_printf("%s| %s", togglestat, c->linkhover); } else if(c->progress != 100) { drawindicator(c); gtk_widget_show(c->indicator); - t = g_strdup_printf("[%i%%] %s", c->progress, c->title); + t = g_strdup_printf("[%i%%] %s| %s", c->progress, togglestat, + c->title); } else { gtk_widget_hide_all(c->indicator); - t = g_strdup(c->title); + t = g_strdup_printf("%s| %s", togglestat, c->title); } gtk_window_set_title(GTK_WINDOW(c->win), t); @@ -944,11 +997,14 @@ windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContextRef js, JSObje void zoom(Client *c, const Arg *arg) { c->zoomed = TRUE; - if(arg->i < 0) /* zoom out */ + if(arg->i < 0) { + /* zoom out */ webkit_web_view_zoom_out(c->view); - else if(arg->i > 0) /* zoom in */ + } else if(arg->i > 0) { + /* zoom in */ webkit_web_view_zoom_in(c->view); - else { /* reset */ + } else { + /* reset */ c->zoomed = FALSE; webkit_web_view_set_zoom_level(c->view, 1.0); } @@ -969,16 +1025,16 @@ main(int argc, char *argv[]) { embed = strtol(EARGF(usage()), NULL, 0); break; case 'i': - loadimage = 0; + loadimages = 0; break; case 'p': - plugin = 0; + enableplugins = 0; break; case 'r': scriptfile = EARGF(usage()); break; case 's': - script = 0; + enablescripts = 0; break; case 't': stylefile = EARGF(usage());