aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-05-10 16:22:05 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-05-10 16:22:05 +0000
commit2bf490e772921d34d70c96dd138bc1b899894451 (patch)
treef4da2de54baa5acc0c99c24c8139507667ea1833 /main.c
parenta0bd8877f3819aaf8221376a16a018d0cbd19033 (diff)
downloaddzen-2bf490e772921d34d70c96dd138bc1b899894451.tar.gz
dzen-2bf490e772921d34d70c96dd138bc1b899894451.zip
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
Diffstat (limited to 'main.c')
-rw-r--r--main.c65
1 files changed, 34 insertions, 31 deletions
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;