diff options
author | gotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2> | 2007-06-13 11:55:28 +0000 |
---|---|---|
committer | gotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2> | 2007-06-13 11:55:28 +0000 |
commit | ae6ef24bb00f12bb690153963734e8f1ec138a1c (patch) | |
tree | bb82dd4e0b5e9c208885e2b1cdc1ed210ff1c22c | |
parent | 2f8b7e260d6963668c3f26cc302adcf3fa0d1961 (diff) | |
download | dzen-ae6ef24bb00f12bb690153963734e8f1ec138a1c.tar.gz dzen-ae6ef24bb00f12bb690153963734e8f1ec138a1c.zip |
added keyboard handling
added a_grabkeys, a_ungrabkeys, a_scrollend
git-svn-id: http://dzen.googlecode.com/svn/trunk@84 f2baff5b-bf2c-0410-a398-912abdc3d8b2
-rw-r--r-- | action.c | 155 | ||||
-rw-r--r-- | action.h | 20 | ||||
-rw-r--r-- | main.c | 18 |
3 files changed, 173 insertions, 20 deletions
@@ -25,6 +25,7 @@ struct event_lookup ev_lookup_table[] = { { "leaveslave", leaveslave}, { "sigusr1", sigusr1}, { "sigusr2", sigusr2}, + { "keymarker", keymarker}, { 0, 0 } }; @@ -46,25 +47,109 @@ struct action_lookup ac_lookup_table[] = { { "raise", a_raise}, { "lower", a_lower}, { "scrollhome", a_scrollhome}, + { "scrollend", a_scrollend}, + { "grabkeys", a_grabkeys}, + { "ungrabkeys", a_ungrabkeys}, { 0, 0 } }; Ev ev_table[MAXEVENTS] = {{0}, {0}}; +key_ev_list *head = NULL; + +int +key_new_event(keid) { + key_ev_list *item, *newitem; + + if(!head) { + head = emalloc(sizeof (key_ev_list)); + head->id = keid; + head->next = NULL; + } else { + item = head; + /* check if we already handle this event */ + while(item) { + if(item->id == keid) + return 0; + item = item->next; + } + item = head; + while(item->next) + item = item->next; + + newitem = emalloc(sizeof (key_ev_list)); + newitem->id = keid; + item->next = newitem; + newitem->next= NULL; + } + return 0; +} + +void +key_add_handler(long keid, int hpos, void * hcb){ + key_ev_list *item; + + item = head; + while(item) { + if(item->id == keid) { + item->action[hpos] = emalloc(sizeof(As)); + item->action[hpos]->handler = hcb; + break; + } + item = item->next; + } + +} -/* utilities */ void -do_action(int event) { +key_add_option(long keid, int hpos, int opos, char* opt) { + key_ev_list *item; + + item = head; + while(item) { + if(item->id == keid) { + item->action[hpos]->options[opos] = estrdup(opt); + break; + } + item = item->next; + } +} + +void +do_action(long event) { int i; + key_ev_list *item; + + if(event > keymarker) { + item = head; + while(item) { + if(item->id == event) + break; + item = item->next; + } - if(ev_table[event].isset) - for(i=0; ev_table[event].action[i]->handler; i++) - ev_table[event].action[i]->handler(ev_table[event].action[i]->options); + if(item) { + for(i=0; item->action[i]->handler; i++) { + item->action[i]->handler(item->action[i]->options); + } + } + } else + if(ev_table[event].isset) + for(i=0; ev_table[event].action[i]->handler; i++) + ev_table[event].action[i]->handler(ev_table[event].action[i]->options); } int get_ev_id(char *evname) { int i; + KeySym ks; + /* check for keyboard event */ + if((!strncmp(evname, "key_", 4)) + && ((ks = XStringToKeysym(evname+4)) != NoSymbol)) { + return ks+keymarker; + } + + /* own events */ for(i=0; ev_lookup_table[i].name; i++) { if(strcmp(ev_lookup_table[i].name, evname) == 0) return ev_lookup_table[i].id; @@ -101,7 +186,7 @@ fill_ev_table(char *input) *token, *subtoken, *kommatoken, *dptoken; char *saveptr1, *saveptr2, *saveptr3, *saveptr4; int j, i=0, k=0; - int eid=0; + long eid=0; void *ah=0; @@ -130,15 +215,29 @@ fill_ev_table(char *input) break; } if(str4 == kommatoken && str4 != token && eid != -1) { - ev_table[eid].isset = 1; - if((ah = (void *)get_action_handler(dptoken))) { - ev_table[eid].action[i] = emalloc(sizeof(As)); - ev_table[eid].action[i]->handler= get_action_handler(dptoken); + /* keyboard event */ + if(eid > keymarker) { + /* populate linked list of key events */ + if((ah = (void *)get_action_handler(dptoken))) { + key_new_event(eid); + key_add_handler(eid, i, ah); + } + } else { + ev_table[eid].isset = 1; + if((ah = (void *)get_action_handler(dptoken))) { + ev_table[eid].action[i] = emalloc(sizeof(As)); + ev_table[eid].action[i]->handler= get_action_handler(dptoken); + } } i++; } else if(str4 != token && eid != -1 && ah) { - ev_table[eid].action[i-1]->options[k] = strdup(dptoken); + if(eid > keymarker) { + /* add option to key events */ + key_add_option(eid, i-1, k, dptoken); + } else + ev_table[eid].action[i-1]->options[k] = strdup(dptoken); + k++; } else if(!ah) @@ -146,8 +245,13 @@ fill_ev_table(char *input) } k=0; } - ev_table[eid].action[i] = emalloc(sizeof(As)); - ev_table[eid].action[i]->handler = NULL; + if(eid > keymarker) { + key_new_event(eid); + key_add_handler(eid, i, NULL); + } else { + ev_table[eid].action[i] = emalloc(sizeof(As)); + ev_table[eid].action[i]->handler = NULL; + } i=0; } } @@ -357,3 +461,28 @@ a_scrollhome(char * opt[]) { return 0; } +int +a_scrollend(char * opt[]) { + if(dzen.slave_win.max_lines) { + dzen.slave_win.first_line_vis = dzen.slave_win.tcnt - dzen.slave_win.max_lines ; + dzen.slave_win.last_line_vis = dzen.slave_win.tcnt; + x_draw_body(); + } + return 0; +} + +int +a_grabkeys(char * opt[]) { + XGrabKeyboard(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), + True, GrabModeAsync, GrabModeAsync, CurrentTime); + return 0; +} + +int +a_ungrabkeys(char * opt[]) { + XUngrabKeyboard(dzen.dpy, CurrentTime); + return 0; +} + + + @@ -11,6 +11,7 @@ /* Event, Action data structures */ typedef struct AS As; typedef struct EV Ev; +typedef struct _key_ev_list key_ev_list; enum ev_id { /* startup, exit */ @@ -20,12 +21,22 @@ enum ev_id { /* entering/leaving windows */ entertitle, leavetitle, enterslave, leaveslave, /* external signals */ - sigusr1, sigusr2 + sigusr1, sigusr2, + /* key event marker + * must always be the last entry + */ + keymarker +}; + +struct _key_ev_list { + long id; + As *action[MAXACTIONS]; + key_ev_list *next; }; struct event_lookup { char *name; - int id; + long id; }; struct action_lookup { @@ -46,7 +57,7 @@ struct EV { extern Ev ev_table[MAXEVENTS]; /* utility functions */ -void do_action(int); +void do_action(long); int get_ev_id(char *); void * get_action_handler(char *); void fill_ev_table(char *); @@ -70,4 +81,7 @@ int a_menuexec(char **); int a_raise(char **); int a_lower(char **); int a_scrollhome(char **); +int a_scrollend(char **); +int a_grabkeys(char **); +int a_ungrabkeys(char **); @@ -23,6 +23,7 @@ Dzen dzen = {0}; static int last_cnt = 0; typedef void sigfunc(int); +int isfocused = 0; static void @@ -99,7 +100,7 @@ chomp(char *inbuf, char *outbuf, int start, int len) { } while(off < len) { if(inbuf[off] != '\n') { - outbuf[i++] = inbuf[off++]; + outbuf[i++] = inbuf[off++]; } else if(inbuf[off] == '\n') { outbuf[i] = '\0'; return ++off; @@ -283,7 +284,7 @@ x_create_windows(void) { /* window attributes */ wa.override_redirect = 1; wa.background_pixmap = ParentRelative; - wa.event_mask = ExposureMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask; + wa.event_mask = ExposureMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | KeyPressMask; #ifdef DZEN_XINERAMA queryscreeninfo(dzen.dpy, &si, dzen.xinescreen); @@ -393,6 +394,8 @@ static void handle_xev(void) { XEvent ev; int i; + char buf[32]; + KeySym ksym; XNextEvent(dzen.dpy, &ev); switch(ev.type) { @@ -457,6 +460,10 @@ handle_xev(void) { break; } break; + case KeyPress: + XLookupString(&ev.xkey, buf, sizeof buf, &ksym, 0); + do_action(ksym+keymarker); + break; } } @@ -668,9 +675,12 @@ main(int argc, char *argv[]) { if(action_string) fill_ev_table(action_string); else { - char edef[] = "entertitle=uncollapse;leaveslave=collapse;" + char edef[] = "entertitle=uncollapse,grabkeys;" + "enterslave=grabkeys;leaveslave=collapse,ungrabkeys;" "button1=menuexec;button2=togglestick;button3=exit:13;" - "button4=scrollup;button5=scrolldown"; + "button4=scrollup;button5=scrolldown;" + "key_Up=scrollup;key_Left=scrollup;key_Down=scrolldown;key_Right=scrolldown;" + "key_q=ungrabkeys,exit"; fill_ev_table(edef); } |