aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2009-02-13 15:18:51 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2009-02-13 15:18:51 +0000
commit945c9936a036e2c24186aba12e0e8bf402f139fd (patch)
tree628e44e2ae886d6b6c1efcc9b26408decb3858cb
parent56a428c495dd0caae0c506bec0f16dff1770cd36 (diff)
downloaddzen-945c9936a036e2c24186aba12e0e8bf402f139fd.tar.gz
dzen-945c9936a036e2c24186aba12e0e8bf402f139fd.zip
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
-rw-r--r--draw.c47
-rw-r--r--dzen.h13
-rw-r--r--main.c11
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);