From 2bf490e772921d34d70c96dd138bc1b899894451 Mon Sep 17 00:00:00 2001 From: gotmor Date: Thu, 10 May 2007 16:22:05 +0000 Subject: new clean_up code fixed selected line bug in menu mode git-svn-id: http://dzen.googlecode.com/svn/trunk@16 f2baff5b-bf2c-0410-a398-912abdc3d8b2 --- action.c | 37 ++++++++++++++++-------------------- action.h | 1 + config.mk | 10 +++++----- dzen.h | 5 +++-- main.c | 65 +++++++++++++++++++++++++++++++++------------------------------ 5 files changed, 59 insertions(+), 59 deletions(-) diff --git a/action.c b/action.c index 9b5ee81..1e18462 100644 --- a/action.c +++ b/action.c @@ -85,6 +85,17 @@ get_action_handler(char *acname) { return (void *)NULL; } +void +free_ev_table(void) { + int i, j; + + for(i=0; ihandler; j++) + free(ev_table[i].action[j]); + } +} + void fill_ev_table(char *input) { @@ -278,25 +289,6 @@ a_scrolldown(char * opt[]) { return 0; } -/* -int -a_hide(char * opt[]) { - if(dzen.title_win.autohide && !dzen.title_win.ishidden) { - XResizeWindow(dzen.dpy, dzen.title_win.win, dzen.title_win.width, 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.title_win.width, dzen.mh); - dzen.title_win.ishidden = False; - } - return 0; -} -*/ int a_hide(char * opt[]) { if(!dzen.title_win.ishidden) { @@ -338,8 +330,9 @@ a_print(char * opt[]) { int a_menuprint(char * opt[]) { - if(dzen.slave_win.ismenu) { + if(dzen.slave_win.ismenu && dzen.slave_win.sel_line != -1) { puts(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis]); + dzen.slave_win.sel_line = -1; fflush(stdout); } return 0; @@ -347,8 +340,10 @@ a_menuprint(char * opt[]) { int a_menuexec(char * opt[]) { - if(dzen.slave_win.ismenu) + if(dzen.slave_win.ismenu && dzen.slave_win.sel_line != -1) { spawn(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis]); + dzen.slave_win.sel_line = -1; + } return 0; } diff --git a/action.h b/action.h index 107b3cf..9085410 100644 --- a/action.h +++ b/action.h @@ -52,6 +52,7 @@ void do_action(int); int get_ev_id(char *); void * get_action_handler(char *); void fill_ev_table(char *); +void free_ev_table(void); /* action handlers */ int a_exposetitle(char **); diff --git a/config.mk b/config.mk index db3dc5e..0622471 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # dzen version -VERSION = 0.2.1 +VERSION = 0.2.2 # Customize below to fit your system @@ -15,10 +15,10 @@ INCS = -I. -I/usr/include -I${X11INC} LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lpthread # flags -#CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} -CFLAGS = -g -Wall -O0 ${INCS} -DVERSION=\"${VERSION}\" -DPOSIX_SOURCE -LDFLAGS = -g ${LIBS} +CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" +LDFLAGS = ${LIBS} +#CFLAGS = -g -Wall -O0 ${INCS} -DVERSION=\"${VERSION}\" -DPOSIX_SOURCE +#LDFLAGS = -g ${LIBS} # Solaris #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" diff --git a/dzen.h b/dzen.h index e0904c2..1f266be 100644 --- a/dzen.h +++ b/dzen.h @@ -5,14 +5,15 @@ #include #include -#include +//#include #include #define FONT "-*-fixed-*-*-*-*-*-*-*-*-*-*-*-*" #define BGCOLOR "#ab0b0b" #define FGCOLOR "#efefef" -#define BUF_SIZE 4096 +//#define BUF_SIZE 4096 +#define BUF_SIZE 1024 /* gui data structures */ enum { ColFG, ColBG, ColLast }; diff --git a/main.c b/main.c index f3fd4c3..0d0f882 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,11 @@ catch_sigusr2() { do_action(sigusr2); } +static void +catch_sigterm() { + do_action(onquit); +} + sigfunc * setup_signal(int signr, sigfunc *shandler) { struct sigaction nh, oh; @@ -331,6 +336,32 @@ x_map_window(Window win) { XSync(dzen.dpy, False); } +static void +clean_up(void) { + int i; + + if(!dzen.running) + pthread_cancel(dzen.read_thread); + + free_ev_table(); + if(dzen.font.set) + XFreeFontSet(dzen.dpy, dzen.font.set); + else + XFreeFont(dzen.dpy, dzen.font.xfont); + + XFreePixmap(dzen.dpy, dzen.title_win.drawable); + if(dzen.slave_win.max_lines) { + XFreePixmap(dzen.dpy, dzen.slave_win.drawable); + for(i=0; i < dzen.slave_win.max_lines; i++) + XDestroyWindow(dzen.dpy, dzen.slave_win.line[i]); + free(dzen.slave_win.line); + XDestroyWindow(dzen.dpy, dzen.slave_win.win); + } + XFreeGC(dzen.dpy, dzen.gc); + XDestroyWindow(dzen.dpy, dzen.title_win.win); + XCloseDisplay(dzen.dpy); +} + int main(int argc, char *argv[]) { int i; @@ -358,11 +389,9 @@ main(int argc, char *argv[]) { else if(!strncmp(argv[i], "-p", 3)) { dzen.slave_win.ispersistent = True; } - /* else if(!strncmp(argv[i], "-a", 3)) { dzen.title_win.autohide = True; } - */ else if(!strncmp(argv[i], "-m", 3)) { dzen.slave_win.ismenu = True; } @@ -417,13 +446,13 @@ main(int argc, char *argv[]) { fill_ev_table(edef); } - /* setup signal handlers */ + if(ev_table[onquit].isset && (setup_signal(SIGTERM, catch_sigterm) == SIG_ERR)) + fprintf(stderr, "dzen: error hooking SIGTERM\n"); if(ev_table[sigusr1].isset && (setup_signal(SIGUSR1, catch_sigusr1) == SIG_ERR)) fprintf(stderr, "dzen: error hooking SIGUSR1\n"); if(ev_table[sigusr2].isset && (setup_signal(SIGUSR2, catch_sigusr2) == SIG_ERR)) fprintf(stderr, "dzen: error hooking SIGUSR2\n"); - /* set up windows */ x_create_windows(); x_map_window(dzen.title_win.win); @@ -436,37 +465,11 @@ main(int argc, char *argv[]) { /* reader */ pthread_create(&dzen.read_thread, NULL, read_stdin, NULL); - /* actions to be done right after startup */ do_action(onstart); - - /* catch events */ event_loop(NULL); - - /* actions to be done right before quitting*/ do_action(onquit); - - /* clean up */ - if(!dzen.running) - pthread_cancel(dzen.read_thread); - - if(dzen.font.set) - XFreeFontSet(dzen.dpy, dzen.font.set); - else - XFreeFont(dzen.dpy, dzen.font.xfont); - - XFreePixmap(dzen.dpy, dzen.title_win.drawable); - if(dzen.slave_win.max_lines) { - XFreePixmap(dzen.dpy, dzen.slave_win.drawable); - for(i=0; i < dzen.slave_win.max_lines; i++) - XDestroyWindow(dzen.dpy, dzen.slave_win.line[i]); - free(dzen.slave_win.line); - XDestroyWindow(dzen.dpy, dzen.slave_win.win); - } - XFreeGC(dzen.dpy, dzen.gc); - XDestroyWindow(dzen.dpy, dzen.title_win.win); - XCloseDisplay(dzen.dpy); - + clean_up(); if(dzen.ret_val) return dzen.ret_val; -- cgit v1.2.3-54-g00ecf