struct Client *next;
} Client;
+typedef struct Cookie {
+ char *name;
+ char *value;
+ char *domain;
+ char *path;
+ struct Cookie *next;
+} Cookie;
+
+ typedef struct {
+ guint mod;
+ guint keyval;
+ void (*func)(Client *c, const Arg *arg);
+ const Arg arg;
+ gboolean stop; /* do not propagate keypress event/stop matching keys */
+ } Key;
+
+ typedef enum {
+ NONE,
+ SEARCHBAR,
+ URLBAR,
+ } Keypressmode;
+
+ typedef struct {
+ Key *keys;
+ unsigned int numkeys;
+ Keypressmode mode;
+ } KeySet;
+
SoupCookieJar *cookiejar;
+SoupSession *session;
Client *clients = NULL;
+Cookie *cookies = NULL;
gboolean embed = FALSE;
gboolean showxid = FALSE;
gboolean ignore_once = FALSE;
extern int optind;
static void cleanup(void);
+static void proccookies(SoupMessage *m, Client *c);
+ static void clipboard(Client *c, const Arg *arg);
static void destroyclient(Client *c);
static void destroywin(GtkWidget* w, Client *c);
static void die(char *str);
static void pasteurl(GtkClipboard *clipboard, const gchar *text, gpointer d);
static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d);
static void progresschange(WebKitWebView *view, gint p, Client *c);
+static void request(SoupSession *s, SoupMessage *m, Client *c);
+static void setcookie(char *name, char *val, char *dom, char *path, long exp);
+ static void reload(Client *c, const Arg *arg);
static void setup(void);
- static void showsearch(Client *c);
- static void showurl(Client *c);
- static void stop(Client *c);
+static void titlechange(WebKitWebView* view, WebKitWebFrame* frame,
+ const gchar* title, Client *c);
+ static void searchtext(Client *c, const Arg *arg);
+ static void showsearch(Client *c, const Arg *arg);
+ static void showurl(Client *c, const Arg *arg);
+ static void stop(Client *c, const Arg *arg);
+ static void titlechange(WebKitWebView* view, WebKitWebFrame* frame, const gchar* title, Client *c);
static void usage();
static void updatetitle(Client *c, const gchar *title);
+ static void zoompage(Client *c, const Arg *arg);
+
+ #include "config.h"
void
cleanup(void) {
destroyclient(clients);
}
+void
+proccookies(SoupMessage *m, Client *c) {
+ GSList *l;
+ SoupCookie *co;
+ long t;
+
+ 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
+ clipboard(Client *c, const Arg *arg) {
+ gboolean paste = *(gboolean *)arg;
+ if(paste)
+ gtk_clipboard_request_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), pasteurl, c);
+ else
+ gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), webkit_web_view_get_uri(c->view), -1);
+ }
+
void
destroyclient(Client *c) {
Client *p;
gboolean
keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
+ unsigned int n, m;
+
if(ev->type != GDK_KEY_PRESS)
return FALSE;
- if(GTK_WIDGET_HAS_FOCUS(c->searchbar)) {
- switch(ev->keyval) {
- case GDK_Escape:
- hidesearch(c);
- return TRUE;
- case GDK_Return:
- webkit_web_view_search_text(c->view,
- gtk_entry_get_text(GTK_ENTRY(c->searchbar)),
- FALSE,
- !(ev->state & GDK_SHIFT_MASK),
- TRUE);
- return TRUE;
- case GDK_Left:
- case GDK_Right:
- return FALSE;
- }
- }
- else if(GTK_WIDGET_HAS_FOCUS(c->urlbar)) {
- switch(ev->keyval) {
- case GDK_Escape:
- hideurl(c);
- return TRUE;
- case GDK_Return:
- loaduri(c, gtk_entry_get_text(GTK_ENTRY(c->urlbar)));
- hideurl(c);
- return TRUE;
- case GDK_Left:
- case GDK_Right:
- return FALSE;
- }
- }
- if(ev->state & GDK_CONTROL_MASK) {
- switch(ev->keyval) {
- case GDK_P:
- webkit_web_frame_print(webkit_web_view_get_main_frame(c->view));
- return TRUE;
- case GDK_p:
- gtk_clipboard_request_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), pasteurl, c);
- case GDK_y:
- gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), webkit_web_view_get_uri(c->view), -1);
- return TRUE;
- case GDK_r:
- webkit_web_view_reload(c->view);
- return TRUE;
- case GDK_R:
- webkit_web_view_reload_bypass_cache(c->view);
- return TRUE;
- case GDK_b:
- return TRUE;
- case GDK_g:
- showurl(c);
- return TRUE;
- case GDK_slash:
- showsearch(c);
- return TRUE;
- case GDK_plus:
- case GDK_equal:
- webkit_web_view_zoom_in(c->view);
- return TRUE;
- case GDK_minus:
- webkit_web_view_zoom_out(c->view);
- return TRUE;
- case GDK_0:
- webkit_web_view_set_zoom_level(c->view, 1.0);
- return TRUE;
- case GDK_n:
- case GDK_N:
- webkit_web_view_search_text(c->view,
- gtk_entry_get_text(GTK_ENTRY(c->searchbar)),
- FALSE,
- !(ev->state & GDK_SHIFT_MASK),
- TRUE);
- return TRUE;
- case GDK_h:
- webkit_web_view_go_back(c->view);
- return TRUE;
- case GDK_l:
- webkit_web_view_go_forward(c->view);
- return TRUE;
+
+ for(n = 0; n < LENGTH(keysets); n++)
+ switch(keysets[n].mode) {
+ case SEARCHBAR:
+ if(GTK_WIDGET_HAS_FOCUS(c->searchbar))
+ goto matchkeys;
+ break;
+ case URLBAR:
+ if(GTK_WIDGET_HAS_FOCUS(c->urlbar))
+ goto matchkeys;
+ break;
+ case NONE:
+ goto matchkeys;
+ default:
+ fprintf(stderr, "keypress(): Unknown Keypressmode\n");
+ break;
}
- }
- else {
- switch(ev->keyval) {
- case GDK_Escape:
- stop(c);
- return TRUE;
-
+ if(n < LENGTH(keysets)) {
+ matchkeys:
+ for(m = 0; m < keysets[n].numkeys; m++) {
+ Key *keys = keysets[n].keys;
+ if(ev->keyval == keys[m].keyval
+ && (ev->state == keys[m].mod
+ || (ev->state & keys[m].mod))
+ && keys[m].func) {
+ keys[m].func(c, &(keys[m].arg));
+ if(keys[m].stop)
+ return TRUE;
+ }
}
}
return FALSE;
}
void
- loaduri(Client *c, const gchar *uri) {
+ loaduri(Client *c, const Arg *arg) {
gchar *u;
- u = g_strrstr(uri, ":") ? g_strdup(uri)
+ const gchar *uri = (gchar *)arg->v;
+ if(!uri)
+ uri = gtk_entry_get_text(GTK_ENTRY(c->urlbar));
+ u = g_strrstr(uri, "://") ? g_strdup(uri)
: g_strdup_printf("http://%s", uri);
webkit_web_view_load_uri(c->view, u);
c->progress = 0;
int idummy;
unsigned long ldummy;
unsigned char *buf = NULL;
+ Arg arg;
+
if(((XEvent *)e)->type == PropertyNotify) {
ev = &((XEvent *)e)->xproperty;
if(ev->atom == urlprop && ev->state == PropertyNewValue) {
updatetitle(c, NULL);
}
-void setup(void) {
+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;
+ if(nocache)
+ webkit_web_view_reload_bypass_cache(c->view);
+ else
+ webkit_web_view_reload(c->view);
+ }
+
- setup(void) {
+void
+setcookie(char *name, char *val, char *dom, char *path, long exp) {
+ printf("%s %s %s %s %li\n", name, val, dom, path, exp);
+}
+
+void
++setup() {
dpy = GDK_DISPLAY();
+ session = webkit_get_default_session();
urlprop = XInternAtom(dpy, "_SURF_URL", False);
}
default:
usage();
}
- if(optind != argc)
+ if(optind + 1 == argc) {
+ c = newclient();
++ arg.v = argv[optind];
+ if(strchr("./", argv[optind][0]) || strcmp("-", argv[optind]) == 0)
+ loadfile(c, argv[optind]);
+ else
- loaduri(c, argv[optind]);
++ loaduri(c, &arg);
+
+ }
+ else if(optind != argc)
usage();
if(!clients)
newclient();