From 945c9936a036e2c24186aba12e0e8bf402f139fd Mon Sep 17 00:00:00 2001 From: gotmor Date: Fri, 13 Feb 2009 15:18:51 +0000 Subject: first bloody support for ^ca(button,cmd) ... ^ca() as of now it has the following limitations: * only works in the title window * does not work with "-expand" * probably some other issues git-svn-id: http://dzen.googlecode.com/svn/trunk@251 f2baff5b-bf2c-0410-a398-912abdc3d8b2 --- draw.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- dzen.h | 13 +++++++++++++ main.c | 11 +++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/draw.c b/draw.c index 6f2f4e7..edb7a7c 100644 --- a/draw.c +++ b/draw.c @@ -28,9 +28,10 @@ typedef struct ICON_C { icon_c icons[MAX_ICON_CACHE]; int icon_cnt; int otx; +int xorig=0; /* command types for the in-text parser */ -enum ctype {bg, fg, icon, rect, recto, circle, circleo, pos, abspos, titlewin, ibg, fn, sa, fixpos}; +enum ctype {bg, fg, icon, rect, recto, circle, circleo, pos, abspos, titlewin, ibg, fn, fixpos, ca}; struct command_lookup { const char *name; @@ -51,6 +52,7 @@ struct command_lookup cmd_lookup_table[] = { { "tw(", titlewin, 3}, { "ib(", ibg, 3}, { "fn(", fn, 3}, + { "ca(", ca, 3}, { 0, 0, 0} }; @@ -151,7 +153,7 @@ setfont(const char *fontstr) { if(!dzen.font.xftfont) dzen.font.xftfont = XftFontOpenName(dzen.dpy, dzen.screen, fontstr); if(!dzen.font.xftfont) - fprintf(stderr, "error, cannot load font: '%s'\n", fontstr); + eprint("error, cannot load font: '%s'\n", fontstr); dzen.font.extents = malloc(sizeof(XGlyphInfo)); XftTextExtentsUtf8(dzen.dpy, dzen.font.xftfont, (unsigned const char *) fontstr, strlen(fontstr), dzen.font.extents); dzen.font.height = dzen.font.xftfont->ascent + dzen.font.xftfont->descent; @@ -210,6 +212,12 @@ setcolor(Drawable *pm, int x, int width, long tfg, long tbg, int reverse, int no XSetBackground(dzen.dpy, dzen.tgc, reverse ? tfg : tbg); } +int +get_sens_area(char *s, int *b, char *cmd) { + sscanf(s, "%5d,%1024s", b, cmd); + + return 0; +} static int get_rect_vals(char *s, int *w, int *h, int *x, int *y) { @@ -310,6 +318,7 @@ cache_icon(const char* name, Pixmap pm, int w, int h) { } #endif + char * parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { /* bitmaps */ @@ -319,7 +328,7 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { int rectw, recth, rectx, recty; /* positioning */ int n_posx, n_posy, set_posy=0; - int px=0, py=0, xorig=0; + int px=0, py=0; int i, next_pos=0, j=0, h=0, tw=0; /* fonts */ int font_was_set=0; @@ -356,7 +365,6 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { xftcs = (char *)dzen.fg; #endif - /* icon cache */ int ip; @@ -384,6 +392,7 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { else { pm = XCreatePixmap(dzen.dpy, RootWindow(dzen.dpy, DefaultScreen(dzen.dpy)), dzen.title_win.width, dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); + sens_areas_cnt = 0; } #ifdef DZEN_XFT @@ -658,6 +667,21 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { py = set_posy ? py : (dzen.line_height - cur_fnt->height) / 2; font_was_set = 1; break; + case ca: + if(tval[0]) { + if(sens_areas_cnt < MAX_CLICKABLE_AREAS) { + get_sens_area(tval, + &sens_areas[sens_areas_cnt].button, + sens_areas[sens_areas_cnt].cmd); + sens_areas[sens_areas_cnt].start_x = px; + } + } else { + if(sens_areas_cnt < MAX_CLICKABLE_AREAS) { + sens_areas[sens_areas_cnt].end_x = px; + sens_areas_cnt++; + } + } + break; } free(tval); @@ -920,6 +944,21 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { py = set_posy ? py : (dzen.line_height - cur_fnt->height) / 2; font_was_set = 1; break; + case ca: + if(tval[0]) { + if(sens_areas_cnt < MAX_CLICKABLE_AREAS) { + get_sens_area(tval, + &sens_areas[sens_areas_cnt].button, + sens_areas[sens_areas_cnt].cmd); + sens_areas[sens_areas_cnt].start_x = px; + } + } else { + if(sens_areas_cnt < MAX_CLICKABLE_AREAS) { + sens_areas[sens_areas_cnt].end_x = px; + sens_areas_cnt++; + } + } + break; } free(tval); diff --git a/dzen.h b/dzen.h index d7703cc..6dfdf7d 100644 --- a/dzen.h +++ b/dzen.h @@ -26,6 +26,8 @@ #define MIN_BUF_SIZE 1024 #define MAX_LINE_LEN 8192 +#define MAX_CLICKABLE_AREAS 256 + #ifndef Button6 # define Button6 6 #endif @@ -58,6 +60,17 @@ struct Fnt { #endif }; +/* clickable areas */ +typedef struct _CLICK_A { + int button; + int start_x; + int end_x; + char cmd[1024]; +} click_a; +extern click_a sens_areas[MAX_CLICKABLE_AREAS]; +extern int sens_areas_cnt; +extern int xorig; + /* title window */ struct TW { diff --git a/main.c b/main.c index 10f015d..3a320b1 100644 --- a/main.c +++ b/main.c @@ -27,6 +27,8 @@ Dzen dzen = {0}; static int last_cnt = 0; typedef void sigfunc(int); +click_a sens_areas[MAX_CLICKABLE_AREAS]; +int sens_areas_cnt=0; static void @@ -638,6 +640,15 @@ handle_xev(void) { if(ev.xbutton.window == dzen.slave_win.line[i]) dzen.slave_win.sel_line = i; } + + /* clickable areas */ + for(i=0; i<20; i++) { + if(ev.xbutton.window == dzen.title_win.win && + ev.xbutton.button == sens_areas[i].button && + (ev.xbutton.x >= sens_areas[i].start_x+xorig && + ev.xbutton.x <= sens_areas[i].end_x+xorig)) + spawn(sens_areas[i].cmd); + } switch(ev.xbutton.button) { case Button1: do_action(button1); -- cgit v1.2.3-54-g00ecf