~kris/suckless

tabbed

f0e0656f38682d54d8b981fe579767d4fa9638fd — Enno Boland (tox) 17 years ago 4156e0a
changes to the event system, make config.h saner, working on cookies
2 files changed, 63 insertions(+), 96 deletions(-)

M config.h
M surf.c
M config.h => config.h +24 -45
@@ 1,47 1,26 @@
/* modifier 0 means no modifier */
static Key searchbar_keys[] = {
    /* modifier	            keyval      function        arg         stop event */
    { 0,                    GDK_Escape, hidesearch,     {0},            TRUE },
    { 0,                    GDK_Return, searchtext,     {.b = TRUE},    TRUE },
    { GDK_SHIFT_MASK,       GDK_Return, searchtext,     {.b = FALSE},   TRUE },
    { GDK_SHIFT_MASK,       GDK_Left,   NULL,           {0},            FALSE },
    { GDK_SHIFT_MASK,       GDK_Right,  NULL,           {0},            FALSE },
};

static Key urlbar_keys[] = {
    /* modifier	            keyval      function        arg         stop event */
    { 0,                    GDK_Escape, hideurl,        {0},            TRUE },
        /* able to "chain" commands; by setting stop event to FALSE */
    { 0,                    GDK_Return, loaduri,        {.v = NULL},    FALSE },
    { 0,                    GDK_Return, hideurl,        {0},            TRUE },
    { GDK_SHIFT_MASK,       GDK_Left,   NULL,           {0},            FALSE },
    { GDK_SHIFT_MASK,       GDK_Right,  NULL,           {0},            FALSE },
};

static Key general_keys[] = {
    /* modifier	            keyval      function        arg         stop event */
    { GDK_CONTROL_MASK,     GDK_P,      print,          {0},            TRUE },
    { GDK_CONTROL_MASK,     GDK_p,      clipboard,      {.b = TRUE },   TRUE },
    { GDK_CONTROL_MASK,     GDK_y,      clipboard,      {.b = FALSE},   TRUE },
    { GDK_CONTROL_MASK,     GDK_R,      reload,         {.b = TRUE},    TRUE },
    { GDK_CONTROL_MASK,     GDK_r,      reload,         {.b = FALSE},   TRUE },
    { GDK_CONTROL_MASK,     GDK_b,      NULL,           {0},            TRUE },
    { GDK_CONTROL_MASK,     GDK_g,      showurl,        {0},            TRUE },
    { GDK_CONTROL_MASK,     GDK_slash,  showsearch,     {0},            TRUE },
    { GDK_CONTROL_MASK,     GDK_plus,   zoompage,       {0},            TRUE },
    { GDK_CONTROL_MASK,     GDK_minus,  zoompage,       {.f = -1.0 },   TRUE },
    { GDK_CONTROL_MASK,     GDK_0,      zoompage,       {.f = +1.0 },   TRUE },
    { GDK_CONTROL_MASK,     GDK_n,      searchtext,     {.b = TRUE},    TRUE },
    { GDK_CONTROL_MASK,     GDK_N,      searchtext,     {.b = FALSE},   TRUE },
    { GDK_CONTROL_MASK,     GDK_l,      navigate,       {.i = +1},      TRUE },
    { GDK_CONTROL_MASK,     GDK_h,      navigate,       {.i = -1},      TRUE },
    { 0,                    GDK_Escape, stop,           {0},            TRUE },
};

/* Sequence of Keys to match against a keypress */
static KeySet keysets[] = {
    /* keyset (Key[])   numkeys                     focusedwidget/mode */
    { searchbar_keys,   LENGTH(searchbar_keys),     SEARCHBAR },
    { urlbar_keys,      LENGTH(urlbar_keys),        URLBAR },
    { general_keys,     LENGTH(general_keys),       NONE },
static Key keys[] = {
    /* modifier	            keyval      function        arg             Focus */
    { 0,                    GDK_Escape, hidesearch,     {0},            ALWAYS },
    { 0,                    GDK_Escape, hideurl,        {0},            ALWAYS },
    { GDK_CONTROL_MASK,     GDK_P,      print,          {0},            ALWAYS },
    { 0,                    GDK_Return, searchtext,     {.b = TRUE},    SEARCHBAR },
    { GDK_SHIFT_MASK,       GDK_Return, searchtext,     {.b = FALSE},   SEARCHBAR },
    { GDK_CONTROL_MASK,     GDK_n,      searchtext,     {.b = TRUE},    BROWSER|SEARCHBAR },
    { GDK_CONTROL_MASK,     GDK_N,      searchtext,     {.b = FALSE},   BROWSER|SEARCHBAR },
    { 0 },
    { GDK_CONTROL_MASK,     GDK_R,      reload,         {.b = TRUE},    ALWAYS },
    { GDK_CONTROL_MASK,     GDK_r,      reload,         {.b = FALSE},   ALWAYS },
    { GDK_CONTROL_MASK,     GDK_g,      showurl,        {0},            ALWAYS },
    { GDK_CONTROL_MASK,     GDK_slash,  showsearch,     {0},            ALWAYS },
    { 0,                    GDK_Return, loaduri,        {.v = NULL},    URLBAR },
    { 0,                    GDK_Return, hideurl,        {0},            URLBAR },
    { GDK_CONTROL_MASK,     GDK_p,      clipboard,      {.b = TRUE },   BROWSER },
    { GDK_CONTROL_MASK,     GDK_y,      clipboard,      {.b = FALSE},   BROWSER },
    { GDK_CONTROL_MASK,     GDK_plus,   zoompage,       {.i = +1 },     BROWSER },
    { GDK_CONTROL_MASK,     GDK_minus,  zoompage,       {.i = -1 },     BROWSER },
    { GDK_CONTROL_MASK,     GDK_0,      zoompage,       {.i = 0 },      BROWSER },
    { GDK_CONTROL_MASK,     GDK_l,      navigate,       {.i = +1},      BROWSER },
    { GDK_CONTROL_MASK,     GDK_h,      navigate,       {.i = -1},      BROWSER },
    { 0,                    GDK_Escape, stop,           {0},            BROWSER },
};

M surf.c => surf.c +39 -51
@@ 25,7 25,6 @@ union Arg {
	const gboolean b;
	const int i;
	const unsigned int ui;
	const float f;
	const void *v;
} ;



@@ 46,26 45,21 @@ typedef struct Cookie {
	struct Cookie *next;
} Cookie;

typedef enum {
    BROWSER = 0x0001,
    SEARCHBAR = 0x0010,
    URLBAR = 0x0100,
    ALWAYS = ~0,
} KeyFocus;

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 */
	KeyFocus focus;
} Key;

typedef enum {
    NONE,
    SEARCHBAR,
    URLBAR,
} Keypressmode;

typedef struct {
	Key *keys;
	unsigned int numkeys;
	Keypressmode mode;
} KeySet;

SoupCookieJar *cookiejar;
SoupSession *session;
Client *clients = NULL;


@@ 101,8 95,9 @@ static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d);
static void print(Client *c, const Arg *arg);
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 rereadcookies();
static void setcookie(char *name, char *val, char *dom, char *path, long exp);
static void setup();
static void titlechange(WebKitWebView* view, WebKitWebFrame* frame,
		const gchar* title, Client *c);


@@ 129,6 124,7 @@ proccookies(SoupMessage *m, Client *c) {
	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;


@@ 237,42 233,26 @@ hideurl(Client *c, const Arg *arg) {

gboolean
keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
	unsigned int n, m;
	unsigned int i, focus;
	gboolean processed = FALSE;

	if(ev->type != GDK_KEY_PRESS)
		return FALSE;

	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;
		}
	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;
			}
	if(GTK_WIDGET_HAS_FOCUS(c->searchbar))
		focus = SEARCHBAR;
	else if(GTK_WIDGET_HAS_FOCUS(c->urlbar))
		focus = URLBAR;
	else
		focus = BROWSER;
	for(i = 0; i < LENGTH(keys); i++) {
		if(focus & keys[i].focus && ev->keyval == keys[i].keyval &&
				(ev->state == keys[i].mod || ev->state & keys[i].mod)
				&& keys[i].func) {
			keys[i].func(c, &(keys[i].arg));
			processed = TRUE;
		}
	}
	return FALSE;
	return processed;
}

void


@@ 497,8 477,16 @@ reload(Client *c, const Arg *arg) {
}

void
rereadcookies() {
	const gchar *filename, *home;

	home = g_get_home_dir();
	filename = g_build_filename(home, ".surf", "cookies", NULL);
}

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


@@ 576,12 564,12 @@ updatetitle(Client *c, const char *title) {

void
zoompage(Client *c, const Arg *arg) {
	if(*(float *)arg < 0)		/* zoom out */
	if(arg->i < 0)		/* zoom out */
		webkit_web_view_zoom_out(c->view);
	else if(*(float *)arg == 0)	/* zoom in */
	else if(arg->i > 0)	/* zoom in */
		webkit_web_view_zoom_in(c->view);
	else				/* absolute level */
		webkit_web_view_set_zoom_level(c->view, *(float *)arg);
		webkit_web_view_set_zoom_level(c->view, 1.0);
}

int main(int argc, char *argv[]) {


@@ 633,7 621,7 @@ int main(int argc, char *argv[]) {

	/* cookie persistance */
	s = webkit_get_default_session();
	filename = g_build_filename(home, ".surf", "cookies", NULL);
	filename = g_build_filename(home, ".surf", "cookies.jar", NULL);
	cookiejar = soup_cookie_jar_text_new(filename, FALSE);
	soup_session_add_feature(s, SOUP_SESSION_FEATURE(cookiejar));