aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-05-11 10:17:25 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-05-11 10:17:25 +0000
commitfaf43c6311d3445fd142307eab2ec2765e3d3d7d (patch)
treec6e62941995d8ae59c1710cfe72e051f2fbb9188 /main.c
parent2bf490e772921d34d70c96dd138bc1b899894451 (diff)
downloaddzen-faf43c6311d3445fd142307eab2ec2765e3d3d7d.tar.gz
dzen-faf43c6311d3445fd142307eab2ec2765e3d3d7d.zip
code clean und and rearrangement
git-svn-id: http://dzen.googlecode.com/svn/trunk@17 f2baff5b-bf2c-0410-a398-912abdc3d8b2
Diffstat (limited to 'main.c')
-rw-r--r--main.c316
1 files changed, 164 insertions, 152 deletions
diff --git a/main.c b/main.c
index 0d0f882..fd5778a 100644
--- a/main.c
+++ b/main.c
@@ -55,20 +55,7 @@ chomp(char *buf, unsigned int len) {
buf[len-1] = '\0';
}
-static void
-drawheader(char * text) {
- dzen.x = 0;
- dzen.y = 0;
- dzen.w = dzen.title_win.width;
- dzen.h = dzen.mh;
-
- if(text)
- drawtext(text, 0, -1);
- XCopyArea(dzen.dpy, dzen.title_win.drawable, dzen.title_win.win,
- dzen.gc, 0, 0, dzen.title_win.width, dzen.mh, 0, 0);
-}
-
-static void
+void
free_buffer(void) {
int i;
for(i=0; i<BUF_SIZE; i++)
@@ -77,126 +64,6 @@ free_buffer(void) {
last_cnt = 0;
}
-static void
-drawbody(char * text) {
- if(dzen.slave_win.tcnt >= BUF_SIZE) {
- pthread_mutex_lock(&dzen.mt);
- free_buffer();
- pthread_mutex_unlock(&dzen.mt);
- }
- if(dzen.slave_win.tcnt < BUF_SIZE) {
- pthread_mutex_lock(&dzen.mt);
- dzen.slave_win.tbuf[dzen.slave_win.tcnt] = estrdup(text);
- dzen.slave_win.tcnt++;
- pthread_mutex_unlock(&dzen.mt);
- }
-}
-
-static void
-x_resize_header(int width, int height) {
- XResizeWindow(dzen.dpy, dzen.title_win.win, width, height);
-}
-
-static void
-x_highlight_line(int line) {
- drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 1, line+1);
- XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.rgc,
- 0, 0, dzen.slave_win.width, dzen.mh, 0, 0);
-}
-
-static void
-x_unhighlight_line(int line) {
- drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 0, line+1);
- XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.gc,
- 0, 0, dzen.slave_win.width, dzen.mh, 0, 0);
-}
-
-static void
-event_loop(void *ptr) {
- XEvent ev;
- XWindowAttributes wa;
- int i;
-
- while(dzen.running) {
- if(dzen.slave_win.max_lines && (dzen.slave_win.tcnt > last_cnt)) {
- if (XGetWindowAttributes(dzen.dpy, dzen.slave_win.win, &wa),
- wa.map_state != IsUnmapped) {
- dzen.slave_win.first_line_vis = 0;
- dzen.slave_win.last_line_vis = 0;
- do_action(exposeslave);
- }
- last_cnt = dzen.slave_win.tcnt;
- }
-
- if(XPending(dzen.dpy)) {
- XNextEvent(dzen.dpy, &ev);
- switch(ev.type) {
- case Expose:
- if(ev.xexpose.count == 0) {
- if(ev.xexpose.window == dzen.title_win.win)
- drawheader(NULL);
- if(ev.xexpose.window == dzen.slave_win.win)
- do_action(exposeslave);
- for(i=0; i < dzen.slave_win.max_lines; i++)
- if(ev.xcrossing.window == dzen.slave_win.line[i])
- do_action(exposeslave);
- }
- break;
- case EnterNotify:
- if(dzen.slave_win.ismenu) {
- for(i=0; i < dzen.slave_win.max_lines; i++)
- if(ev.xcrossing.window == dzen.slave_win.line[i])
- x_highlight_line(i);
- }
- if(ev.xcrossing.window == dzen.title_win.win)
- do_action(entertitle);
- if(ev.xcrossing.window == dzen.slave_win.win)
- do_action(enterslave);
- break;
- case LeaveNotify:
- if(dzen.slave_win.ismenu) {
- for(i=0; i < dzen.slave_win.max_lines; i++)
- if(ev.xcrossing.window == dzen.slave_win.line[i])
- x_unhighlight_line(i);
- }
- if(ev.xcrossing.window == dzen.title_win.win)
- do_action(leavetitle);
- if(ev.xcrossing.window == dzen.slave_win.win) {
- do_action(leaveslave);
- }
- XSync(dzen.dpy, False);
- break;
- case ButtonRelease:
- if(dzen.slave_win.ismenu) {
- for(i=0; i < dzen.slave_win.max_lines; i++)
- if(ev.xbutton.window == dzen.slave_win.line[i])
- dzen.slave_win.sel_line = i;
- }
- switch(ev.xbutton.button) {
- case Button1:
- do_action(button1);
- break;
- case Button2:
- do_action(button2);
- break;
- case Button3:
- do_action(button3);
- break;
- case Button4:
- do_action(button4);
- break;
- case Button5:
- do_action(button5);
- break;
- }
- XSync(dzen.dpy, False);
- }
- XFlush(dzen.dpy);
- } else
- usleep(10000);
- }
-}
-
void *
read_stdin(void *ptr) {
char buf[1024], *text = NULL;
@@ -228,30 +95,61 @@ read_stdin(void *ptr) {
}
static void
-x_create_windows(void) {
- XSetWindowAttributes wa;
- Window root;
- int i;
+x_resize_header(int width, int height) {
+ XResizeWindow(dzen.dpy, dzen.title_win.win, width, height);
+}
- dzen.dpy = XOpenDisplay(0);
- if(!dzen.dpy)
- eprint("dzen: cannot open display\n");
+static void
+x_highlight_line(int line) {
+ drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 1, line+1);
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.rgc,
+ 0, 0, dzen.slave_win.width, dzen.mh, 0, 0);
+}
- dzen.screen = DefaultScreen(dzen.dpy);
- root = RootWindow(dzen.dpy, dzen.screen);
+static void
+x_unhighlight_line(int line) {
+ drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 0, line+1);
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.gc,
+ 0, 0, dzen.slave_win.width, dzen.mh, 0, 0);
+}
- /* style */
- dzen.norm[ColBG] = getcolor(dzen.bg);
- dzen.norm[ColFG] = getcolor(dzen.fg);
- setfont(dzen.fnt);
+void
+x_draw_body(void) {
+ dzen.x = 0;
+ dzen.y = 0;
+ dzen.w = dzen.slave_win.width;
+ dzen.h = dzen.mh;
+ int i;
- /* window attributes */
- wa.override_redirect = 1;
- wa.background_pixmap = ParentRelative;
- wa.event_mask = ExposureMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask;
+ 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);
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc,
+ 0, 0, dzen.slave_win.width, dzen.mh, 0, 0);
+ }
+ else if(i < dzen.slave_win.max_lines) {
+ drawtext("", 0, i);
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc,
+ 0, 0, dzen.slave_win.width, dzen.mh, 0, 0);
+ }
+ }
+ pthread_mutex_unlock(&dzen.mt);
+}
- /* check geometry */
+static void
+x_check_geometry(void) {
if(dzen.title_win.x > DisplayWidth(dzen.dpy, dzen.screen))
dzen.title_win.x = 0;
@@ -280,7 +178,32 @@ x_create_windows(void) {
}
dzen.mh = dzen.font.height + 2;
dzen.hy = (dzen.hy + dzen.mh) > DisplayHeight(dzen.dpy, dzen.screen) ? 0 : dzen.hy;
+}
+static void
+x_create_windows(void) {
+ XSetWindowAttributes wa;
+ Window root;
+ int i;
+
+ dzen.dpy = XOpenDisplay(0);
+ if(!dzen.dpy)
+ eprint("dzen: cannot open display\n");
+
+ dzen.screen = DefaultScreen(dzen.dpy);
+ root = RootWindow(dzen.dpy, dzen.screen);
+
+ /* style */
+ dzen.norm[ColBG] = getcolor(dzen.bg);
+ dzen.norm[ColFG] = getcolor(dzen.fg);
+ setfont(dzen.fnt);
+
+ /* window attributes */
+ wa.override_redirect = 1;
+ wa.background_pixmap = ParentRelative;
+ wa.event_mask = ExposureMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask;
+
+ x_check_geometry();
/* title window */
dzen.title_win.win = XCreateWindow(dzen.dpy, root,
@@ -335,6 +258,91 @@ x_map_window(Window win) {
XMapRaised(dzen.dpy, win);
XSync(dzen.dpy, False);
}
+static void
+event_loop(void *ptr) {
+ XEvent ev;
+ XWindowAttributes wa;
+ int i;
+
+ while(dzen.running) {
+ if(dzen.slave_win.max_lines && (dzen.slave_win.tcnt > last_cnt)) {
+ if (XGetWindowAttributes(dzen.dpy, dzen.slave_win.win, &wa),
+ wa.map_state != IsUnmapped) {
+ dzen.slave_win.first_line_vis = 0;
+ dzen.slave_win.last_line_vis = 0;
+ do_action(exposeslave);
+ }
+ last_cnt = dzen.slave_win.tcnt;
+ }
+
+ if(XPending(dzen.dpy)) {
+ XNextEvent(dzen.dpy, &ev);
+ switch(ev.type) {
+ case Expose:
+ if(ev.xexpose.count == 0) {
+ if(ev.xexpose.window == dzen.title_win.win)
+ drawheader(NULL);
+ if(ev.xexpose.window == dzen.slave_win.win)
+ do_action(exposeslave);
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ if(ev.xcrossing.window == dzen.slave_win.line[i])
+ do_action(exposeslave);
+ }
+ break;
+ case EnterNotify:
+ if(dzen.slave_win.ismenu) {
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ if(ev.xcrossing.window == dzen.slave_win.line[i])
+ x_highlight_line(i);
+ }
+ if(ev.xcrossing.window == dzen.title_win.win)
+ do_action(entertitle);
+ if(ev.xcrossing.window == dzen.slave_win.win)
+ do_action(enterslave);
+ break;
+ case LeaveNotify:
+ if(dzen.slave_win.ismenu) {
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ if(ev.xcrossing.window == dzen.slave_win.line[i])
+ x_unhighlight_line(i);
+ }
+ if(ev.xcrossing.window == dzen.title_win.win)
+ do_action(leavetitle);
+ if(ev.xcrossing.window == dzen.slave_win.win) {
+ do_action(leaveslave);
+ }
+ XSync(dzen.dpy, False);
+ break;
+ case ButtonRelease:
+ if(dzen.slave_win.ismenu) {
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ if(ev.xbutton.window == dzen.slave_win.line[i])
+ dzen.slave_win.sel_line = i;
+ }
+ switch(ev.xbutton.button) {
+ case Button1:
+ do_action(button1);
+ break;
+ case Button2:
+ do_action(button2);
+ break;
+ case Button3:
+ do_action(button3);
+ break;
+ case Button4:
+ do_action(button4);
+ break;
+ case Button5:
+ do_action(button5);
+ break;
+ }
+ XSync(dzen.dpy, False);
+ }
+ XFlush(dzen.dpy);
+ } else
+ usleep(10000);
+ }
+}
static void
clean_up(void) {
@@ -466,10 +474,14 @@ main(int argc, char *argv[]) {
pthread_create(&dzen.read_thread, NULL, read_stdin, NULL);
do_action(onstart);
+
+ /* main event loop */
event_loop(NULL);
+
do_action(onquit);
clean_up();
+
if(dzen.ret_val)
return dzen.ret_val;