aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--action.c37
-rw-r--r--action.h1
-rw-r--r--config.mk10
-rw-r--r--dzen.h5
-rw-r--r--main.c65
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
@@ -86,6 +86,17 @@ get_action_handler(char *acname) {
}
void
+free_ev_table(void) {
+ int i, j;
+
+ for(i=0; i<MAXEVENTS; i++) {
+ if(ev_table[i].isset)
+ for(j=0; ev_table[i].action[j]->handler; j++)
+ free(ev_table[i].action[j]);
+ }
+}
+
+void
fill_ev_table(char *input)
{
char *str1, *str2, *str3, *str4,
@@ -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 <X11/Xlib.h>
#include <X11/Xutil.h>
-#include <X11/keysym.h>
+//#include <X11/keysym.h>
#include <pthread.h>
#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;