X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=37d457ea1b6a94e8ca73cb48040a25b171278420;hb=bdfa30bf335f0e728e222d9fd9d137605c535abe;hp=042bdf40878865d4c5c1a984e654df4ad34a8977;hpb=b298d889de769086e06b7bc71188ea7e4e38f259;p=surf.git diff --git a/surf.c b/surf.c index 042bdf4..37d457e 100644 --- a/surf.c +++ b/surf.c @@ -31,9 +31,10 @@ union Arg { typedef struct Client { GtkWidget *win, *scroll, *vbox, *uribar, *searchbar, *indicator; + GtkWidget **items; WebKitWebView *view; WebKitDownload *download; - gchar *title, *linkhover; + char *title, *linkhover; gint progress; struct Client *next; } Client; @@ -44,14 +45,6 @@ typedef struct { const Arg arg; } Item; -typedef struct Cookie { - gchar *name; - gchar *value; - gchar *domain; - gchar *path; - struct Cookie *next; -} Cookie; - typedef enum { Browser = 0x0001, SearchBar = 0x0010, @@ -72,60 +65,56 @@ static Atom uriprop; static SoupCookieJar *cookiejar; static SoupSession *session; static Client *clients = NULL; -/*static Cookie *cookies = NULL;*/ static GdkNativeWindow embed = 0; static gboolean showxid = FALSE; static gboolean ignore_once = FALSE; -static gchar winid[64]; -static gchar *progname; +static char winid[64]; +static char *progname; -static const gchar *autouri(Client *c); -static gchar *buildpath(const gchar *path); +static const char *autouri(Client *c); +static char *buildpath(const char *path); static void cleanup(void); static void clipboard(Client *c, const Arg *arg); static void context(WebKitWebView *v, GtkMenu *m, Client *c); -static gchar *copystr(gchar **str, const gchar *src); +static char *copystr(char **str, const char *src); static gboolean decidewindow(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *p, Client *c); static void destroyclient(Client *c); static void destroywin(GtkWidget* w, Client *c); -static void die(gchar *str); +static void die(char *str); static void download(WebKitDownload *o, GParamSpec *pspec, Client *c); static void drawindicator(Client *c); static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c); static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c); -static gchar *geturi(Client *c); +static char *geturi(Client *c); static void hidesearch(Client *c, const Arg *arg); static void hideuri(Client *c, const Arg *arg); static void itemclick(GtkMenuItem *mi, Client *c); static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c); -static void linkhover(WebKitWebView *v, const gchar* t, const gchar* l, Client *c); +static void linkhover(WebKitWebView *v, const char* t, const char* l, Client *c); static void loadcommit(WebKitWebView *v, WebKitWebFrame *f, Client *c); +static void loadfinished(WebKitWebView *v, WebKitWebFrame *f, Client *c); static void loadstart(WebKitWebView *v, WebKitWebFrame *f, Client *c); static void loaduri(Client *c, const Arg *arg); static void navigate(Client *c, const Arg *arg); static Client *newclient(void); static void newwindow(Client *c, const Arg *arg); static WebKitWebView *createwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c); -static void pasteuri(GtkClipboard *clipboard, const gchar *text, gpointer d); +static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d); static void print(Client *c, const Arg *arg); -static void proccookies(SoupMessage *m, Client *c); static void progresschange(WebKitWebView *v, gint p, Client *c); -static void request(SoupSession *s, SoupMessage *m, Client *c); static void reload(Client *c, const Arg *arg); -static void rereadcookies(void); +static void reloadcookie(); static void sigchld(int unused); -static void setcookie(gchar *name, gchar *val, gchar *dom, gchar *path, long exp); static void setup(void); static void spawn(Client *c, const Arg *arg); -static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const gchar* title, Client *c); static void scroll(Client *c, const Arg *arg); static void searchtext(Client *c, const Arg *arg); static void source(Client *c, const Arg *arg); static void showsearch(Client *c, const Arg *arg); static void showuri(Client *c, const Arg *arg); static void stop(Client *c, const Arg *arg); -static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const gchar* title, Client *c); +static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const char* title, Client *c); static gboolean focusview(GtkWidget *w, GdkEventFocus *e, Client *c); static void usage(void); static void update(Client *c); @@ -136,7 +125,7 @@ static void zoom(Client *c, const Arg *arg); /* configuration, allows nested code to access above variables */ #include "config.h" -const gchar * +const char * autouri(Client *c) { if(GTK_WIDGET_HAS_FOCUS(c->uribar)) return gtk_entry_get_text(GTK_ENTRY(c->uribar)); @@ -145,9 +134,9 @@ autouri(Client *c) { return NULL; } -gchar * -buildpath(const gchar *path) { - gchar *apath, *p; +char * +buildpath(const char *path) { + char *apath, *p; FILE *f; /* creating directory */ @@ -189,22 +178,22 @@ clipboard(Client *c, const Arg *arg) { void context(WebKitWebView *v, GtkMenu *m, Client *c) { int i; - GtkWidget *item; + GtkContainer *parent; gtk_widget_hide_all(GTK_WIDGET(m)); gtk_widget_show(GTK_WIDGET(m)); for(i = 0; i < LENGTH(items); i++) { - item = gtk_menu_item_new_with_label(items[i].label); - gtk_menu_shell_append(GTK_MENU_SHELL(m), item); - g_signal_connect(G_OBJECT(item), "activate", - G_CALLBACK(itemclick), c); - gtk_widget_show(item); + parent = GTK_CONTAINER(gtk_widget_get_parent(c->items[i])); + if(parent) + gtk_container_remove(parent, c->items[i]); + gtk_menu_shell_append(GTK_MENU_SHELL(m), c->items[i]); + gtk_widget_show(c->items[i]); } } -gchar * -copystr(gchar **str, const gchar *src) { - gchar *tmp; +char * +copystr(char **str, const char *src) { + char *tmp; tmp = g_strdup(src); if(str && *str) { @@ -216,6 +205,7 @@ copystr(gchar **str, const gchar *src) { void destroyclient(Client *c) { + int i; Client *p; gtk_widget_destroy(GTK_WIDGET(c->view)); @@ -224,6 +214,10 @@ destroyclient(Client *c) { gtk_widget_destroy(c->searchbar); gtk_widget_destroy(c->vbox); gtk_widget_destroy(c->win); + for(i = 0; i < LENGTH(items); i++) + gtk_widget_destroy(c->items[i]); + free(c->items); + for(p = clients; p && p->next != c; p = p->next); if(p) p->next = c->next; @@ -252,7 +246,7 @@ destroywin(GtkWidget* w, Client *c) { } void -die(gchar *str) { +die(char *str) { fputs(str, stderr); exit(EXIT_FAILURE); } @@ -260,7 +254,7 @@ die(gchar *str) { void drawindicator(Client *c) { gint width; - gchar *uri; + char *uri; GtkWidget *w; GdkGC *gc; GdkColor fg; @@ -299,8 +293,8 @@ download(WebKitDownload *o, GParamSpec *pspec, Client *c) { gboolean initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) { - const gchar *filename; - gchar *uri, *html; + const char *filename; + char *uri, *html; stop(c, NULL); c->download = o; @@ -322,11 +316,11 @@ initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) { return TRUE; } -gchar * +char * geturi(Client *c) { - gchar *uri; + char *uri; - if(!(uri = (gchar *)webkit_web_view_get_uri(c->view))) + if(!(uri = (char *)webkit_web_view_get_uri(c->view))) uri = copystr(NULL, "about:blank"); return uri; } @@ -346,7 +340,7 @@ hideuri(Client *c, const Arg *arg) { void itemclick(GtkMenuItem *mi, Client *c) { int i; - const gchar *label; + const char *label; label = gtk_menu_item_get_label(mi); for(i = 0; i < LENGTH(items); i++) @@ -381,7 +375,7 @@ keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { } void -linkhover(WebKitWebView *v, const gchar* t, const gchar* l, Client *c) { +linkhover(WebKitWebView *v, const char* t, const char* l, Client *c) { if(l) c->linkhover = copystr(&c->linkhover, l); else if(c->linkhover) { @@ -393,7 +387,7 @@ linkhover(WebKitWebView *v, const gchar* t, const gchar* l, Client *c) { void loadcommit(WebKitWebView *view, WebKitWebFrame *f, Client *c) { - gchar *uri; + char *uri; ignore_once = TRUE; uri = geturi(c); @@ -402,16 +396,22 @@ loadcommit(WebKitWebView *view, WebKitWebFrame *f, Client *c) { strlen(uri) + 1); } +void +loadfinished(WebKitWebView *v, WebKitWebFrame *f, Client *c) { + reloadcookie(); +} + void loadstart(WebKitWebView *view, WebKitWebFrame *f, Client *c) { + reloadcookie(); c->progress = 0; update(c); } void loaduri(Client *c, const Arg *arg) { - gchar *u; - const gchar *uri = (gchar *)arg->v; + char *u; + const char *uri = (char *)arg->v; if(!uri) uri = autouri(c); @@ -434,9 +434,10 @@ navigate(Client *c, const Arg *arg) { Client * newclient(void) { + int i; Client *c; WebKitWebSettings *settings; - gchar *uri; + char *uri; if(!(c = calloc(1, sizeof(Client)))) die("Cannot malloc!\n"); @@ -452,6 +453,17 @@ newclient(void) { g_signal_connect(G_OBJECT(c->win), "destroy", G_CALLBACK(destroywin), c); g_signal_connect(G_OBJECT(c->win), "key-press-event", G_CALLBACK(keypress), c); + if(!(c->items = calloc(1, sizeof(GtkWidget *) * LENGTH(items)))) + die("Cannot malloc!\n"); + + /* contextmenu */ + for(i = 0; i < LENGTH(items); i++) { + c->items[i] = gtk_menu_item_new_with_label(items[i].label); + g_signal_connect(G_OBJECT(c->items[i]), "activate", + G_CALLBACK(itemclick), c); + } + + /* VBox */ c->vbox = gtk_vbox_new(FALSE, 0); @@ -464,6 +476,7 @@ newclient(void) { c->view = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_signal_connect(G_OBJECT(c->view), "title-changed", G_CALLBACK(titlechange), c); g_signal_connect(G_OBJECT(c->view), "load-progress-changed", G_CALLBACK(progresschange), c); + g_signal_connect(G_OBJECT(c->view), "load-finished", G_CALLBACK(loadfinished), c); g_signal_connect(G_OBJECT(c->view), "load-committed", G_CALLBACK(loadcommit), c); g_signal_connect(G_OBJECT(c->view), "load-started", G_CALLBACK(loadstart), c); g_signal_connect(G_OBJECT(c->view), "hovering-over-link", G_CALLBACK(linkhover), c); @@ -471,7 +484,6 @@ newclient(void) { g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-requested", G_CALLBACK(decidewindow), c); g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c); g_signal_connect(G_OBJECT(c->view), "window-object-cleared", G_CALLBACK(windowobjectcleared), c); - g_signal_connect_after(session, "request-started", G_CALLBACK(request), c); g_signal_connect(G_OBJECT(c->view), "focus-in-event", G_CALLBACK(focusview), c); g_signal_connect(G_OBJECT(c->view), "populate-popup", G_CALLBACK(context), c); @@ -534,9 +546,9 @@ newclient(void) { void newwindow(Client *c, const Arg *arg) { guint i = 0; - const gchar *cmd[7], *uri; + const char *cmd[7], *uri; const Arg a = { .v = (void *)cmd }; - gchar tmp[64]; + char tmp[64]; cmd[i++] = progname; if(embed) { @@ -562,7 +574,7 @@ createwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c) { } void -pasteuri(GtkClipboard *clipboard, const gchar *text, gpointer d) { +pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) { Arg arg = {.v = text }; if(text != NULL) loaduri((Client *) d, &arg); @@ -601,33 +613,12 @@ print(Client *c, const Arg *arg) { webkit_web_frame_print(webkit_web_view_get_main_frame(c->view)); } -void -proccookies(SoupMessage *m, Client *c) { - GSList *l; - SoupCookie *co; - long t; - - rereadcookies(); - for (l = soup_cookies_from_response(m); l; l = l->next){ - co = (SoupCookie *)l->data; - t = co->expires ? soup_date_to_time_t(co->expires) : 0; - setcookie(co->name, co->value, co->domain, co->value, t); - } - g_slist_free(l); -} - void progresschange(WebKitWebView *v, gint p, Client *c) { c->progress = p; update(c); } -void -request(SoupSession *s, SoupMessage *m, Client *c) { - soup_message_add_header_handler(m, "got-headers", "Set-Cookie", - G_CALLBACK(proccookies), c); -} - void reload(Client *c, const Arg *arg) { gboolean nocache = *(gboolean *)arg; @@ -638,9 +629,14 @@ reload(Client *c, const Arg *arg) { } void -rereadcookies(void) { +reloadcookie(void) { + SoupSession *s; -} + /* This forces the cookie to be written to hdd */ + s = webkit_get_default_session(); + soup_session_remove_feature(s, SOUP_SESSION_FEATURE(cookiejar)); + soup_session_add_feature(s, SOUP_SESSION_FEATURE(cookiejar)); +} void scroll(Client *c, const Arg *arg) { @@ -662,11 +658,6 @@ sigchld(int unused) { while(0 < waitpid(-1, NULL, WNOHANG)); } -void -setcookie(gchar *name, gchar *val, gchar *dom, gchar *path, long exp) { - -} - void setup(void) { SoupSession *s; @@ -712,7 +703,7 @@ source(Client *c, const Arg *arg) { void searchtext(Client *c, const Arg *arg) { - const gchar *text; + const char *text; gboolean forward = *(gboolean *)arg; text = gtk_entry_get_text(GTK_ENTRY(c->searchbar)); webkit_web_view_search_text(c->view, text, FALSE, forward, TRUE); @@ -721,7 +712,7 @@ searchtext(Client *c, const Arg *arg) { void showuri(Client *c, const Arg *arg) { - gchar *uri; + char *uri; hidesearch(c, NULL); uri = geturi(c); @@ -745,15 +736,15 @@ spawn(Client *c, const Arg *arg) { if(dpy) close(ConnectionNumber(dpy)); setsid(); - execvp(((gchar **)arg->v)[0], (gchar **)arg->v); - fprintf(stderr, "tabbed: execvp %s", ((gchar **)arg->v)[0]); + execvp(((char **)arg->v)[0], (char **)arg->v); + fprintf(stderr, "tabbed: execvp %s", ((char **)arg->v)[0]); perror(" failed"); exit(0); } } void -titlechange(WebKitWebView *v, WebKitWebFrame *f, const gchar *t, Client *c) { +titlechange(WebKitWebView *v, WebKitWebFrame *f, const char *t, Client *c) { c->title = copystr(&c->title, t); update(c); } @@ -773,7 +764,7 @@ usage(void) { void update(Client *c) { - gchar *t; + char *t; if(c->progress != 100) t = g_strdup_printf("%s [%i%%]", c->title, c->progress); @@ -796,7 +787,7 @@ updatewinid(Client *c) { void windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContextRef js, JSObjectRef win, Client *c) { JSStringRef jsscript; - gchar *script; + char *script; JSValueRef exception = NULL; GError *error;