diff options
author | gotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2> | 2007-05-11 10:17:25 +0000 |
---|---|---|
committer | gotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2> | 2007-05-11 10:17:25 +0000 |
commit | faf43c6311d3445fd142307eab2ec2765e3d3d7d (patch) | |
tree | c6e62941995d8ae59c1710cfe72e051f2fbb9188 /main.c | |
parent | 2bf490e772921d34d70c96dd138bc1b899894451 (diff) | |
download | dzen-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.c | 316 |
1 files changed, 164 insertions, 152 deletions
@@ -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; |