X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=6dc32ea0e729f40e46f21e3e736dfb9584bdb478;hb=62f54a3745f193223def1c14a19a8581af1c00ed;hp=7b4d9bb7ecf51d82e0c0a608c21c1aecbbbc57db;hpb=6376a30379d9a130f01a37b188b8005ed7d05a9d;p=surf.git diff --git a/surf.c b/surf.c index 7b4d9bb..6dc32ea 100644 --- a/surf.c +++ b/surf.c @@ -23,6 +23,8 @@ #define LENGTH(x) (sizeof x / sizeof x[0]) #define CLEANMASK(mask) (mask & ~(GDK_MOD2_MASK)) +enum { AtomFind, AtomGo, AtomUri, AtomLast }; + typedef union Arg Arg; union Arg { gboolean b; @@ -54,11 +56,10 @@ typedef struct { } Key; static Display *dpy; -static Atom uriprop, findprop; +static Atom atoms[AtomLast]; static Client *clients = NULL; static GdkNativeWindow embed = 0; static gboolean showxid = FALSE; -static int ignorexprop = 0; static char winid[64]; static char *progname; static gboolean loadimage = 1, plugin = 1, script = 1; @@ -76,10 +77,11 @@ 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 const char *getatom(Client *c, Atom a); +static const char *getatom(Client *c, int a); static const char *getcookies(SoupURI *uri); static char *geturi(Client *c); void gotheaders(SoupMessage *msg, gpointer user_data); +static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c); static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c); static void linkhover(WebKitWebView *v, const char* t, const char* l, Client *c); static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c); @@ -95,7 +97,7 @@ static void progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c); static void reload(Client *c, const Arg *arg); static void resize(GtkWidget *w, GtkAllocation *a, Client *c); static void scroll(Client *c, const Arg *arg); -static void setatom(Client *c, Atom a, const char *v); +static void setatom(Client *c, int a, const char *v); static void setcookie(SoupCookie *c); static void setup(void); static void sigchld(int unused); @@ -128,7 +130,7 @@ buildpath(const char *path) { *p = '/'; } /* creating file (gives error when apath ends with "/") */ - if((f = g_fopen(apath, "a"))) + if((f = fopen(apath, "a"))) fclose(f); return apath; } @@ -138,7 +140,6 @@ cleanup(void) { while(clients) destroyclient(clients); g_free(cookiefile); - g_free(dldir); g_free(scriptfile); g_free(stylefile); } @@ -187,10 +188,7 @@ createwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c) { gboolean decidedownload(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, gchar *m, WebKitWebPolicyDecision *p, Client *c) { if(!webkit_web_view_can_show_mime_type(v, m)) { - webkit_web_policy_decision_ignore(p); - webkit_web_view_load_html_string(c->view, - "Can't display content.", - webkit_network_request_get_uri(r)); + webkit_web_policy_decision_download(p); return TRUE; } return FALSE; @@ -213,6 +211,7 @@ void destroyclient(Client *c) { Client *p; + webkit_web_view_stop_loading(c->view); gtk_widget_destroy(c->indicator); gtk_widget_destroy(GTK_WIDGET(c->view)); gtk_widget_destroy(c->scroll); @@ -248,7 +247,7 @@ drawindicator(Client *c) { GdkGC *gc; GdkColor fg; - uri = getatom(c, uriprop); + uri = geturi(c); w = c->indicator; width = c->progress * w->allocation.width / 100; gc = gdk_gc_new(w->window); @@ -273,7 +272,7 @@ void find(Client *c, const Arg *arg) { const char *s; - s = getatom(c, findprop); + s = getatom(c, AtomFind); gboolean forward = *(gboolean *)arg; webkit_web_view_search_text(c->view, s, FALSE, forward, TRUE); } @@ -288,7 +287,7 @@ getcookies(SoupURI *uri) { } const char * -getatom(Client *c, Atom a) { +getatom(Client *c, int a) { static char buf[BUFSIZ]; Atom adummy; int idummy; @@ -296,7 +295,7 @@ getatom(Client *c, Atom a) { unsigned char *p = NULL; XGetWindowProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), - a, 0L, BUFSIZ, False, XA_STRING, + atoms[a], 0L, BUFSIZ, False, XA_STRING, &adummy, &idummy, &ldummy, &ldummy, &p); if(p) strncpy(buf, (char *)p, LENGTH(buf)-1); @@ -328,6 +327,16 @@ gotheaders(SoupMessage *msg, gpointer v) { soup_cookies_free(l); } +gboolean +initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) { + Arg arg; + + updatewinid(c); + arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o)); + spawn(c, &arg); + return FALSE; +} + gboolean keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { guint i; @@ -361,7 +370,7 @@ void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { switch(webkit_web_view_get_load_status (c->view)) { case WEBKIT_LOAD_COMMITTED: - setatom(c, uriprop, geturi(c)); + setatom(c, AtomUri, geturi(c)); break; case WEBKIT_LOAD_FINISHED: c->progress = 0; @@ -454,6 +463,7 @@ newclient(void) { g_signal_connect(G_OBJECT(c->view), "window-object-cleared", G_CALLBACK(windowobjectcleared), c); g_signal_connect(G_OBJECT(c->view), "notify::load-status", G_CALLBACK(loadstatuschange), c); g_signal_connect(G_OBJECT(c->view), "notify::progress", G_CALLBACK(progresschange), c); + g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c); /* Indicator */ c->indicator = gtk_drawing_area_new(); @@ -491,10 +501,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", true, NULL); + g_free(uri); - setatom(c, findprop, ""); - setatom(c, uriprop, ""); - if(NOBACKGROUND) + + setatom(c, AtomFind, ""); + setatom(c, AtomUri, "about:blank"); + if(HIDE_BACKGROUND) webkit_web_view_set_transparent(c->view, TRUE); c->title = NULL; @@ -570,18 +583,17 @@ processx(GdkXEvent *e, GdkEvent *event, gpointer d) { if(((XEvent *)e)->type == PropertyNotify) { ev = &((XEvent *)e)->xproperty; - if(ignorexprop) - ignorexprop--; - else if(ev->state == PropertyNewValue) { - if(ev->atom == uriprop) { - arg.v = getatom(c, uriprop); - loaduri(c, &arg); - } - else if(ev->atom == findprop) { + if(ev->state == PropertyNewValue) { + if(ev->atom == atoms[AtomFind]) { arg.b = TRUE; find(c, &arg); + return GDK_FILTER_REMOVE; + } + else if(ev->atom == atoms[AtomGo]) { + arg.v = getatom(c, AtomGo); + loaduri(c, &arg); + return GDK_FILTER_REMOVE; } - return GDK_FILTER_REMOVE; } } return GDK_FILTER_CONTINUE; @@ -648,10 +660,9 @@ setcookie(SoupCookie *c) { } void -setatom(Client *c, Atom a, const char *v) { +setatom(Client *c, int a, const char *v) { XSync(dpy, False); - ignorexprop++; - XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), a, + XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), atoms[a], XA_STRING, 8, PropModeReplace, (unsigned char *)v, strlen(v) + 1); } @@ -671,12 +682,14 @@ setup(void) { dpy = GDK_DISPLAY(); s = webkit_get_default_session(); - uriprop = XInternAtom(dpy, "_SURF_URI", False); - findprop = XInternAtom(dpy, "_SURF_FIND", False); + + /* atoms */ + atoms[AtomFind] = XInternAtom(dpy, "_SURF_FIND", False); + atoms[AtomGo] = XInternAtom(dpy, "_SURF_GO", False); + atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False); /* dirs and files */ cookiefile = buildpath(cookiefile); - dldir = buildpath(dldir); scriptfile = buildpath(scriptfile); stylefile = buildpath(stylefile); @@ -690,7 +703,6 @@ setup(void) { if((proxy = getenv("http_proxy")) && strcmp(proxy, "")) { new_proxy = g_strrstr(proxy, "http://") ? g_strdup(proxy) : g_strdup_printf("http://%s", proxy); - puri = soup_uri_new(new_proxy); g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL); soup_uri_free(puri);