X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=3e2e2b009181a727ea1a6acf3c83602021672172;hb=a7ea753f93837ee5eed1e2c80b6642d08e6143e0;hp=ae1a9355164b113172604375c4bff3c1920ed0b3;hpb=25ba840e4d24735118949f38216628792f22d7f5;p=surf.git diff --git a/surf.c b/surf.c index ae1a935..3e2e2b0 100644 --- a/surf.c +++ b/surf.c @@ -20,6 +20,10 @@ #include #include +#include "arg.h" + +char *argv0; + #define LENGTH(x) (sizeof x / sizeof x[0]) #define COOKIEJAR_TYPE (cookiejar_get_type ()) #define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar)) @@ -74,8 +78,8 @@ static Client *clients = NULL; static GdkNativeWindow embed = 0; static gboolean showxid = FALSE; static char winid[64]; -static char *progname; -static gboolean loadimage = 1, plugin = 1, script = 1; +static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0; +static char togglestat[5]; static char *buildpath(const char *path); static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl); @@ -123,6 +127,8 @@ static void spawn(Client *c, const Arg *arg); 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); @@ -138,10 +144,19 @@ buildpath(const char *path) { FILE *f; /* creating directory */ - if(path[0] == '/') + if(path[0] == '/') { apath = g_strdup(path); - else - apath = g_strconcat(g_get_home_dir(), "/", path, NULL); + } else if(path[0] == '~') { + if(path[1] == '/') { + apath = g_strconcat(g_get_home_dir(), &path[1], NULL); + } else { + apath = g_strconcat(g_get_home_dir(), "/", + &path[1], NULL); + } + } else { + apath = g_strconcat(g_get_current_dir(), "/", path, NULL); + } + if((p = strrchr(apath, '/'))) { *p = '\0'; g_mkdir_with_parents(apath, 0700); @@ -153,6 +168,7 @@ buildpath(const char *path) { g_chmod(apath, 0600); /* always */ fclose(f); } + return apath; } @@ -216,7 +232,7 @@ cookiejar_new(const char *filename, gboolean read_only) { return g_object_new(COOKIEJAR_TYPE, SOUP_COOKIE_JAR_TEXT_FILENAME, filename, SOUP_COOKIE_JAR_READ_ONLY, read_only, NULL); -} +} static void cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec) { @@ -333,6 +349,7 @@ void drawindicator(Client *c) { gint width; const char *uri; + char *colorname; GtkWidget *w; GdkGC *gc; GdkColor fg; @@ -342,11 +359,20 @@ drawindicator(Client *c) { width = c->progress * w->allocation.width / 100; gc = gdk_gc_new(w->window); if(strstr(uri, "https://") == uri) { - gdk_color_parse(c->sslfailed ? - progress_untrust : progress_trust, &fg); + if(using_proxy) { + colorname = c->sslfailed? progress_proxy_untrust : progress_proxy_trust; + } else { + colorname = c->sslfailed? progress_untrust : progress_trust; + } } else { - gdk_color_parse(progress, &fg); + if(using_proxy) { + colorname = progress_proxy; + } else { + colorname = progress; + } } + + gdk_color_parse(colorname, &fg); gdk_gc_set_rgb_fg_color(gc, &fg); gdk_draw_rectangle(w->window, w->style->bg_gc[GTK_WIDGET_STATE(w)], @@ -404,7 +430,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; } @@ -423,6 +449,7 @@ keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { processed = TRUE; } } + return processed; } @@ -430,8 +457,7 @@ void linkhover(WebKitWebView *v, const char* t, const char* l, Client *c) { if(l) { c->linkhover = copystr(&c->linkhover, l); - } - else if(c->linkhover) { + } else if(c->linkhover) { free(c->linkhover); c->linkhover = NULL; } @@ -481,8 +507,7 @@ loaduri(Client *c, const Arg *arg) { /* prevents endless loop */ if(c->uri && strcmp(u, c->uri) == 0) { reload(c, &a); - } - else { + } else { webkit_web_view_load_uri(c->view, u); c->progress = 0; c->title = copystr(&c->title, u); @@ -507,12 +532,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 @@ -577,6 +603,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); @@ -588,13 +615,13 @@ newclient(void) { 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), "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; @@ -618,7 +645,7 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) { const Arg a = { .v = (void *)cmd }; char tmp[64]; - cmd[i++] = progname; + cmd[i++] = argv0; if(embed && !noembed) { cmd[i++] = "-e"; snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed); @@ -816,6 +843,7 @@ setup(void) { g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL); soup_uri_free(puri); g_free(new_proxy); + using_proxy = 1; } } @@ -867,20 +895,56 @@ titlechange(WebKitWebView *v, WebKitWebFrame *f, const char *t, Client *c) { update(c); } +void +toggle(Client *c, const Arg *arg) { + WebKitWebSettings *settings; + char *name = (char *)arg->v; + gboolean value; + Arg a = { .b = FALSE }; + + settings = webkit_web_view_get_settings(c->view); + g_object_get(G_OBJECT(settings), name, &value, NULL); + g_object_set(G_OBJECT(settings), name, !value, NULL); + + reload(c,&a); +} + +void +gettogglestat(Client *c){ + gboolean value; + WebKitWebSettings *settings = webkit_web_view_get_settings(c->view); + + togglestat[4] = '\0'; + g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL); + togglestat[0] = value?'I':'i'; + g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL); + togglestat[1] = value?'S':'s'; + g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL); + togglestat[2] = value?'V':'v'; + g_object_get(G_OBJECT(settings), "enable-caret-browsing", + &value, NULL); + togglestat[3] = value?'C':'c'; +} + + 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); g_free(t); } @@ -894,7 +958,8 @@ updatewinid(Client *c) { void usage(void) { fputs("surf - simple browser\n", stderr); - die("usage: surf [-e xid] [-i] [-p] [-s] [-v] [-x] [uri]\n"); + die("usage: surf [-c cookiefile] [-e xid] [-i] [-p] [-r scriptfile]" + " [-s] [-t stylefile] [-u useragent] [-v] [-x] [uri]\n"); } void @@ -917,49 +982,55 @@ zoom(Client *c, const Arg *arg) { int main(int argc, char *argv[]) { - int i; Arg arg; - progname = argv[0]; + memset(&arg, 0, sizeof(arg)); + /* command line args */ - for(i = 1, arg.v = NULL; i < argc && argv[i][0] == '-' && - argv[i][1] != '\0' && argv[i][2] == '\0'; i++) { - if(!strcmp(argv[i], "--")) { - i++; - break; - } - switch(argv[i][1]) { - case 'e': - if(++i < argc) - embed = strtol(argv[i], NULL, 0); - else - usage(); - break; - case 'i': - loadimage = 0; - break; - case 'p': - plugin = 0; - break; - case 's': - script = 0; - break; - case 'x': - showxid = TRUE; - break; - case 'v': - die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n"); - default: - usage(); - } - } - if(i < argc) - arg.v = argv[i]; + ARGBEGIN { + case 'c': + cookiefile = EARGF(usage()); + break; + case 'e': + embed = strtol(EARGF(usage()), NULL, 0); + break; + case 'i': + loadimage = 0; + break; + case 'p': + plugin = 0; + break; + case 'r': + scriptfile = EARGF(usage()); + break; + case 's': + script = 0; + break; + case 't': + stylefile = EARGF(usage()); + break; + case 'u': + useragent = EARGF(usage()); + break; + case 'x': + showxid = TRUE; + break; + case 'v': + die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n"); + default: + usage(); + } ARGEND; + if(argc > 0) + arg.v = argv[0]; + setup(); newclient(); if(arg.v) loaduri(clients, &arg); + gtk_main(); cleanup(); + return EXIT_SUCCESS; } +