tchanges to the event system, make config.h saner, working on cookies - surf - customized build of surf, the suckless webkit browser
 (HTM) git clone git://src.adamsgaard.dk/surf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit f0e0656f38682d54d8b981fe579767d4fa9638fd
 (DIR) parent 4156e0aa51ae1e8925537aa4814acfb6eed4923b
 (HTM) Author: Enno Boland (tox) <tox@s01.de>
       Date:   Mon,  7 Sep 2009 09:44:21 +0200
       
       changes to the event system, make config.h saner, working on cookies
       Diffstat:
         M config.h                            |      69 +++++++++++--------------------
         M surf.c                              |      90 ++++++++++++++------------------
       
       2 files changed, 63 insertions(+), 96 deletions(-)
       ---
 (DIR) diff --git a/config.h b/config.h
       t@@ -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 },
        };
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -25,7 +25,6 @@ union Arg {
                const gboolean b;
                const int i;
                const unsigned int ui;
       -        const float f;
                const void *v;
        } ;
        
       t@@ -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;
       t@@ -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);
       t@@ -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;
       t@@ -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
       t@@ -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
       t@@ -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[]) {
       t@@ -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));