aboutsummaryrefslogtreecommitdiffstats
path: root/action.c
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-03-28 17:11:37 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-03-28 17:11:37 +0000
commit4b54df524a318680d93382f8253c8da5a7546b58 (patch)
tree24cb2f61910d7591856616af9330e9c7d3b60f64 /action.c
downloaddzen-4b54df524a318680d93382f8253c8da5a7546b58.tar.gz
dzen-4b54df524a318680d93382f8253c8da5a7546b58.zip
0.1.9 initial svn release
git-svn-id: http://dzen.googlecode.com/svn/trunk@1 f2baff5b-bf2c-0410-a398-912abdc3d8b2
Diffstat (limited to 'action.c')
-rw-r--r--action.c329
1 files changed, 329 insertions, 0 deletions
diff --git a/action.c b/action.c
new file mode 100644
index 0000000..375efc7
--- /dev/null
+++ b/action.c
@@ -0,0 +1,329 @@
+/*
+ * (C)opyright MMVII Robert Manea <rob dot manea at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include "dzen.h"
+#include "action.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct event_lookup ev_lookup_table[] = {
+ { "exposet", exposetitle},
+ { "exposes", exposeslave},
+ { "button1", button1},
+ { "button2", button2},
+ { "button3", button3},
+ { "button4", button4},
+ { "button5", button5},
+ { "entertitle", entertitle},
+ { "leavetitle", leavetitle},
+ { "enterslave", enterslave},
+ { "leaveslave", leaveslave},
+ { "sigusr1", sigusr1},
+ { "sigusr2", sigusr2},
+ { 0, 0 }
+};
+
+struct action_lookup ac_lookup_table[] = {
+ { "exposetitle", a_exposetitle},
+ { "exposeslave", a_exposeslave},
+ { "print", a_print },
+ { "exec", a_exec},
+ { "exit", a_exit},
+ { "collapse", a_collapse},
+ { "uncollapse", a_uncollapse},
+ { "stick", a_stick},
+ { "unstick", a_unstick},
+ { "togglestick", a_togglestick},
+ { "hide", a_hide},
+ { "unhide", a_unhide},
+ { "scrollup", a_scrollup},
+ { "scrolldown", a_scrolldown},
+ { "menuprint", a_menuprint},
+ { "menuexec", a_menuexec},
+ { 0, 0 }
+};
+
+Ev ev_table[256] = {{0}, {0}};
+
+/* utilities */
+void
+do_action(int event) {
+ int i;
+
+ 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;
+
+ for(i=0; ev_lookup_table[i].name; i++) {
+ if(strcmp(ev_lookup_table[i].name, evname) == 0)
+ return ev_lookup_table[i].id;
+ }
+ return -1;
+}
+
+void *
+get_action_handler(char *acname) {
+ int i;
+
+ for(i=0; ac_lookup_table[i].name; i++) {
+ if(strcmp(ac_lookup_table[i].name, acname) == 0)
+ return ac_lookup_table[i].handler;
+ }
+ return (void *)NULL;
+}
+
+void
+fill_ev_table(char *input)
+{
+ char *str1, *str2, *str3, *str4,
+ *token, *subtoken, *kommatoken, *dptoken;
+ char *saveptr1, *saveptr2, *saveptr3, *saveptr4;
+ int j, i=0, k=0;
+ int eid=0;
+ void *ah=0;
+
+
+ for (j = 1, str1 = input; ; j++, str1 = NULL) {
+ token = strtok_r(str1, ";", &saveptr1);
+ if (token == NULL)
+ break;
+
+ for (str2 = token; ; str2 = NULL) {
+ subtoken = strtok_r(str2, "=", &saveptr2);
+ if (subtoken == NULL)
+ break;
+ if( (str2 == token) && ((eid = get_ev_id(subtoken)) != -1))
+ 0;
+ else if(eid == -1)
+ break;
+
+ for (str3 = subtoken; ; str3 = NULL) {
+ kommatoken = strtok_r(str3, ",", &saveptr3);
+ if (kommatoken == NULL)
+ break;
+
+ for (str4 = kommatoken; ; str4 = NULL) {
+ dptoken = strtok_r(str4, ":", &saveptr4);
+ if (dptoken == NULL) {
+ break;
+ }
+ if(str4 == kommatoken && str4 != token && eid != -1) {
+ ev_table[eid].isset = 1;
+ ev_table[eid].action[i] = malloc(sizeof(As));
+ if((ah = (void *)get_action_handler(dptoken)))
+ 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);
+ k++;
+ }
+ else if(!ah)
+ break;
+ }
+ k=0;
+ }
+ ev_table[eid].action[i] = malloc(sizeof(As));
+ ev_table[eid].action[i]->handler = NULL;
+ i=0;
+ }
+ }
+}
+
+/* drawing utilities */
+static void
+x_draw_body(void) {
+ dzen.x = 0;
+ dzen.y = 0;
+ dzen.w = dzen.mw;
+ dzen.h = dzen.mh;
+ int i;
+
+ pthread_mutex_lock(&dzen.mt);
+ if(!dzen.slave_win.last_line_vis) {
+ if(dzen.slave_win.tcnt < dzen.slave_win.max_lines) {
+ dzen.slave_win.first_line_vis = 0;
+ dzen.slave_win.last_line_vis = dzen.slave_win.tcnt;
+ }
+ if(dzen.slave_win.tcnt >= 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;
+ }
+ }
+
+ for(i=0; i < dzen.slave_win.max_lines; i++) {
+ if(i < dzen.slave_win.last_line_vis) {
+ drawtext(dzen.slave_win.tbuf[i + dzen.slave_win.first_line_vis], 0, i+1);
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc,
+ 0, 0, dzen.mw, dzen.mh, 0, 0);
+ }
+ else if(i < dzen.slave_win.max_lines) {
+ drawtext("", 0, i+1);
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc,
+ 0, 0, dzen.mw, dzen.mh, 0, 0);
+ }
+ }
+ pthread_mutex_unlock(&dzen.mt);
+}
+
+/* actions */
+
+/* used internally */
+int
+a_exposetitle(char * opt[]) {
+ XCopyArea(dzen.dpy, dzen.title_win.drawable, dzen.title_win.win,
+ dzen.gc, 0, 0, dzen.mw, dzen.mh, 0, 0);
+ return 0;
+}
+
+/* used internally */
+int
+a_exposeslave(char * opt[]) {
+ x_draw_body();
+ return 0;
+}
+
+/* user selectable actions */
+int
+a_exit(char * opt[]) {
+ if(opt[0])
+ dzen.ret_val = atoi(opt[0]);
+ dzen.running = False;
+ return 0;
+}
+
+int
+a_collapse(char * opt[]){
+ int i;
+ if(dzen.slave_win.max_lines && !dzen.slave_win.issticky) {
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ XUnmapWindow(dzen.dpy, dzen.slave_win.line[i]);
+ XUnmapWindow(dzen.dpy, dzen.slave_win.win);
+ }
+ return 0;
+}
+
+int
+a_uncollapse(char * opt[]){
+ int i;
+ if(dzen.slave_win.max_lines && !dzen.slave_win.issticky) {
+ XMapRaised(dzen.dpy, dzen.slave_win.win);
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ XMapRaised(dzen.dpy, dzen.slave_win.line[i]);
+ x_draw_body();
+ }
+ return 0;
+}
+
+int
+a_togglecollapse(char * opt[]){
+ return 0;
+}
+
+int
+a_stick(char * opt[]) {
+ if(dzen.slave_win.max_lines)
+ dzen.slave_win.issticky = True;
+ return 0;
+}
+
+int
+a_unstick(char * opt[]) {
+ if(dzen.slave_win.max_lines)
+ dzen.slave_win.issticky = False;
+ return 0;
+}
+
+int
+a_togglestick(char * opt[]) {
+ if(dzen.slave_win.max_lines)
+ dzen.slave_win.issticky = dzen.slave_win.issticky ? False : True;
+ return 0;
+}
+
+int
+a_scrollup(char * opt[]) {
+ if(dzen.slave_win.max_lines
+ && dzen.slave_win.first_line_vis
+ && dzen.slave_win.last_line_vis > dzen.slave_win.max_lines) {
+ dzen.slave_win.first_line_vis--;
+ dzen.slave_win.last_line_vis--;
+ x_draw_body();
+ }
+ return 0;
+}
+
+int
+a_scrolldown(char * opt[]) {
+ if(dzen.slave_win.max_lines
+ && dzen.slave_win.last_line_vis >= dzen.slave_win.max_lines
+ && dzen.slave_win.last_line_vis < dzen.slave_win.tcnt) {
+ dzen.slave_win.first_line_vis++;
+ dzen.slave_win.last_line_vis++;
+ x_draw_body();
+ }
+ return 0;
+}
+
+int
+a_hide(char * opt[]) {
+ if(dzen.title_win.autohide && !dzen.title_win.ishidden) {
+ XResizeWindow(dzen.dpy, dzen.title_win.win, dzen.mw, 1);
+ dzen.title_win.ishidden = True;
+ }
+ return 0;
+}
+
+int
+a_unhide(char * opt[]) {
+ if(dzen.title_win.autohide && dzen.title_win.ishidden) {
+ XResizeWindow(dzen.dpy, dzen.title_win.win, dzen.mw, dzen.mh);
+ dzen.title_win.ishidden = False;
+ }
+ return 0;
+}
+
+int
+a_exec(char * opt[]) {
+ int i;
+
+ if(opt)
+ for(i=0; opt[i]; i++)
+ if(opt[i])
+ spawn(opt[i]);
+ return 0;
+}
+
+int
+a_print(char * opt[]) {
+ int i;
+
+ if(opt)
+ for(i=0; opt[i]; i++)
+ puts(opt[i]);
+ return 0;
+}
+
+int
+a_menuprint(char * opt[]) {
+ if(dzen.slave_win.ismenu) {
+ puts(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis]);
+ fflush(stdout);
+ }
+ return 0;
+}
+
+int
+a_menuexec(char * opt[]) {
+ if(dzen.slave_win.ismenu)
+ spawn(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis]);
+ return 0;
+}