aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-06-13 11:55:28 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-06-13 11:55:28 +0000
commitae6ef24bb00f12bb690153963734e8f1ec138a1c (patch)
treebb82dd4e0b5e9c208885e2b1cdc1ed210ff1c22c
parent2f8b7e260d6963668c3f26cc302adcf3fa0d1961 (diff)
downloaddzen-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.c155
-rw-r--r--action.h20
-rw-r--r--main.c18
3 files changed, 173 insertions, 20 deletions
diff --git a/action.c b/action.c
index 8a51b78..d2a1e91 100644
--- a/action.c
+++ b/action.c
@@ -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;
+}
+
+
+
diff --git a/action.h b/action.h
index 0d7135c..3678bed 100644
--- a/action.h
+++ b/action.h
@@ -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 **);
diff --git a/main.c b/main.c
index e01955e..9f01edd 100644
--- a/main.c
+++ b/main.c
@@ -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);
}