diff options
-rw-r--r-- | select/LICENSE | 21 | ||||
-rw-r--r-- | select/Makefile | 51 | ||||
-rw-r--r-- | select/README | 250 | ||||
-rw-r--r-- | select/TODO | 17 | ||||
-rw-r--r-- | select/action.c | 334 | ||||
-rw-r--r-- | select/action.h | 77 | ||||
-rw-r--r-- | select/config.mk | 37 | ||||
-rw-r--r-- | select/draw.c | 173 | ||||
-rw-r--r-- | select/dzen.h | 118 | ||||
-rw-r--r-- | select/main.c | 601 | ||||
-rw-r--r-- | select/util.c | 62 |
11 files changed, 0 insertions, 1741 deletions
diff --git a/select/LICENSE b/select/LICENSE deleted file mode 100644 index 9aea25c..0000000 --- a/select/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT/X Consortium License - -(C)opyright MMVII Robert Manea <rob dot manea at gmail dot com> - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/select/Makefile b/select/Makefile deleted file mode 100644 index 454cd02..0000000 --- a/select/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# dzen2 -# (C)opyright MMVII Robert Manea - -include config.mk - -SRC = draw.c main.c util.c action.c -OBJ = ${SRC:.c=.o} - -all: options dzen2 - -options: - @echo dzen2 build options: - @echo "CFLAGS = ${CFLAGS}" - @echo "LDFLAGS = ${LDFLAGS}" - @echo "CC = ${CC}" - @echo "LD = ${LD}" - -.c.o: - @echo CC $< - @${CC} -c ${CFLAGS} $< - -${OBJ}: dzen.h action.h config.mk - -dzen2: ${OBJ} - @echo LD $@ - @${LD} -o $@ ${OBJ} ${LDFLAGS} - @strip $@ - -clean: - @echo cleaning - @rm -f dzen2 ${OBJ} dzen2-${VERSION}.tar.gz - -dist: clean - @echo creating dist tarball - @mkdir -p dzen2-${VERSION} - @cp -R LICENSE Makefile README config.mk action.h dzen.h ${SRC} dzen2-${VERSION} - @tar -cf dzen2-${VERSION}.tar dzen2-${VERSION} - @gzip dzen2-${VERSION}.tar - @rm -rf dzen2-${VERSION} - -install: all - @echo installing executable file to ${DESTDIR}${PREFIX}/bin - @mkdir -p ${DESTDIR}${PREFIX}/bin - @cp -f dzen2 ${DESTDIR}${PREFIX}/bin - @chmod 755 ${DESTDIR}${PREFIX}/bin/dzen2 - -uninstall: - @echo removing executable file from ${DESTDIR}${PREFIX}/bin - @rm -f ${DESTDIR}${PREFIX}/bin/dzen2 - -.PHONY: all options clean dist install uninstall diff --git a/select/README b/select/README deleted file mode 100644 index f0fb548..0000000 --- a/select/README +++ /dev/null @@ -1,250 +0,0 @@ -================================== - dzen, (c) 2007 by Robert Manea -================================== - -A general purpose messaging, notification and launcher program. - - -Features --------- - - * scriptable in any language - * single line and/or windows - holding multiple lines - * menu functionality - * flexible event/action - mechanism - * hideable, collapsable - * Xinerama support - - -Requirements ------------- -In order to build dzen you need the Xlib and phtread header files. - - -Installation ------------- -Edit config.mk to match your local setup (dzen is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dzen (if -necessary as root): - - make clean install - - -Note: By default dzen will not be compiled with Xinerama support. - Uncomment the respective lines in config.mk to change this. - - -Contact: --------- -Feature requests, patches or anything else related to dzen can be send -to: rob dot manea at gmail dot com - - -Running dzen ------------- -dzen accepts a couple of options: - - -fg foreground color - -bg background color - -fn font - -ta alignement of title window content - l(eft), c(center), r(right) - -tw title window width - -sa alignment of slave window, see "-ta" - -l lines, see (1) - -e events and actions, see (2) - -m menu, see (3) - -p persistent, never time out - -x x position - -y y position - -w width - -xs number of Xinerama screen - -v version information - -Termination: ------------- -dzen2 uses two different approaches to terminate itself: - - * If EOF is received -> terminate - - unless the '-p' flag is set - - * If mouse button3 is clicked -> terminate - - this is the default behaviour, see (2)) - - -Return values: --------------- -0 - dzen received EOF -1 - some error occured, inspect the error message -user defined - set with 'exit:retval' action, see (2)) - - - -(1) Option "-l": Slave window --------------------------------- - -Enables support for displaying multiple lines. The parameter to "-l" -specifies the number of lines to be displayed. - -These lines of input are held in the slave window which becomes active as soon -as the pointer enters the title (default action) window. - -If the mouse leaves the slave window it will be hidden unless it is set -sticky by clicking with Button2 into it (default action). - -Button4 and Button5 (mouse wheel) will scroll the slave window up -and down if the content exceeds the window height (default action). - - -(2) Option '-e': Events and actions ----------------------------------- - -dzen allows the user to associate actions to events. - -The command line syntax is as follows: --e 'event1=action1:option1:...option<n>,...,action<m>;...;event<l>' - -Every event can take any number of actions and every action can take any number -of options. (Currently limited to 256 each) - -An example: - -e 'button1=exec:xterm:firefox;entertitle=uncollapse,unhide;button3=exit' - - Meaning: - - button1=exec:xterm:firefox; - on Button1 event (Button1 press on the mouse) execute xterm and - firefox. - (Note: xterm and firefox are options to the exec action) - - entertitle=uncollapse,unhide; - on entertitle (mouse pointer enters the title window) uncollapse - slave window and unhide the title window - - button3=exit - on button3 event exit dzen - - -Supported events: - onstart Perform actions right after startup - onexit Perform actions just before exiting - button1 Mouse button1 released - button2 Mouse button2 released - button3 Mouse button3 released - button4 Mouse button4 released (usually scrollwheel) - button5 Mouse button5 released (usually scrollwheel) - entertitle Mouse enters the title window - leavetitle Mouse leaves the title window - enterslave Mouse enters the slave window - leaveslave Mouse leaves the slave window - sigusr1 SIGUSR1 received - sigusr2 SIGUSR2 received - -Supported actions: - exec:command1:..:n execute all given options - menuexec executes selected menu entry - exit:retval exit dzen and return 'retval' - print:str1:...:n write all given options to STDOUT - menuprint write selected menu entry to STDOUT - collapse collapse (roll-up) slave window - uncollapse uncollapse (roll-down) slave window - stick stick slave window - unstick unstick slave window - togglestick toggle sticky state - hide hide title window - unhide unhide title window - scrollup scroll slave window one line up - scrolldown scroll slave window one line down - raise raise window to view (above all others) - lower lower window (behind all others) - - -Note: If no events/actions are specified dzen defaults to: - - -e 'entertitle=uncollapse;leaveslave=collapse; - button1=menuexec; - button2=togglestick;button3=exit:13; - button4=scrollup;button5=scrolldown' - - If you define any events/actions, there is no default behaviour, - i.e. you will have to specify _all_ events/actions you want to - use. - - -(3) Option '-m', Menu --------------------- - -If menu mode is activated the line under the pointer will be -highlighted. -All actions beginning with "menu" work on the selected menu entry. - -Note: Menu mode only makes sense if '-l <n>' is specified! - - - -Examples: ---------- - -* Display message and timeout after 10 seconds: - (echo "This is a message"; sleep 10) | dzen2 -bg darkred -fg grey80 -fn fixed - - -* Display message and never timeout: - echo "This is a message"| dzen2 -p - - -* Display updating single line message: - for i in $(seq 1 20); do A=${A}'='; print $A; sleep 1; done | dzen2 - - -* Display header and a message with multiple lines: - (echo Header; cal; sleep 20) | dzen2 -l 8 - - Displays "Header" in the main alert window and - the output of cal in the 8 lines high slave - window. - - -* Display updating messages: - (echo Header; while true; do echo test$((i++)); sleep 1; done) | dzen2 -l 12 - - The slave window will update contents if new input has arrived. - - -* Display log files: - (su -c "echo LOGFILENAME; tail -f /var/log/messages") | dzen2 -l 20 -x 100 -y 300 -w 500 - - -* Monthly schedule with remind: - (echo Monthly Schedule; remind -c1 -m) | dzen2 -l 52 -w 410 -p -fn lime -bg '#e0e8ea' -fg black -x 635 - - -* Simple menu: - echo "Applications" | dzen2 -l 4 -p -m < menufile - - -* Menu without any files: - {echo Menu; echo -e "xterm\nxclock\nxeyes\nxfontsel"} | dzen2 -l 4 -m -p - - -* Extract PIDs from the process table: - - {echo Procs; ps -a} | dzen2 -m -l 12 -p \ - -e 'button1=menuprint;button3=exit; button4=scrollup;button5=scrolldown;entertitle=uncollapse;leaveslave=collapse' \ - | awk '{print $1}' - - -* Dzen as xmonad (see http://xmonad.org) statusbar: - - status.sh | dzen2 -ta r -fn '-*-profont-*-*-*-*-11-*-*-*-*-*-iso8859' -bg '#aecf96' -fg black \ - -p -e 'sigusr1=raise;sigusr2=lower;onquit=exec:rm /tmp/dzen2-pid;button3=exit' & echo $! > /tmp/dzen2-pid - - - - - -Have fun. diff --git a/select/TODO b/select/TODO deleted file mode 100644 index fa4b3e1..0000000 --- a/select/TODO +++ /dev/null @@ -1,17 +0,0 @@ -# extend available events: - - o input changed event - o keyboard support - -# extend available actions - - o set foreground color action - o set background color action - o set font action - o actions acting like a switch should have a toggleaction function - o any other useful action - -# user interface - - o title and slave window should be allowed to have different bg/fg/font/settings without making the command line arguments a mess - o split lines longer than window width in multiple lines diff --git a/select/action.c b/select/action.c deleted file mode 100644 index ad00d10..0000000 --- a/select/action.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * (C)opyright MMVII Robert Manea <rob dot manea at gmail dot com> - * See LICENSE file for license details. - */ - -#include "dzen.h" -#include "action.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -struct event_lookup ev_lookup_table[] = { - { "exposet", exposetitle}, - { "exposes", exposeslave}, - { "onstart", onstart}, - { "onexit", onexit}, - { "button1", button1}, - { "button2", button2}, - { "button3", button3}, - { "button4", button4}, - { "button5", button5}, - { "entertitle", entertitle}, - { "leavetitle", leavetitle}, - { "enterslave", enterslave}, - { "leaveslave", leaveslave}, - { "sigusr1", sigusr1}, - { "sigusr2", sigusr2}, - { 0, 0 } -}; - -struct action_lookup ac_lookup_table[] = { - { "exposetitle", a_exposetitle}, - { "exposeslave", a_exposeslave}, - { "print", a_print }, - { "exec", a_exec}, - { "exit", a_exit}, - { "collapse", a_collapse}, - { "uncollapse", a_uncollapse}, - { "stick", a_stick}, - { "unstick", a_unstick}, - { "togglestick", a_togglestick}, - { "hide", a_hide}, - { "unhide", a_unhide}, - { "scrollup", a_scrollup}, - { "scrolldown", a_scrolldown}, - { "menuprint", a_menuprint}, - { "menuexec", a_menuexec}, - { "raise", a_raise}, - { "lower", a_lower}, - { 0, 0 } -}; - -Ev ev_table[MAXEVENTS] = {{0}, {0}}; - -/* utilities */ -void -do_action(int event) { - int i; - - if(ev_table[event].isset) - for(i=0; ev_table[event].action[i]->handler; i++) - ev_table[event].action[i]->handler(ev_table[event].action[i]->options); -} - -int -get_ev_id(char *evname) { - int i; - - for(i=0; ev_lookup_table[i].name; i++) { - if(strcmp(ev_lookup_table[i].name, evname) == 0) - return ev_lookup_table[i].id; - } - return -1; -} - -void * -get_action_handler(char *acname) { - int i; - - for(i=0; ac_lookup_table[i].name; i++) { - if(strcmp(ac_lookup_table[i].name, acname) == 0) - return ac_lookup_table[i].handler; - } - return (void *)NULL; -} - -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, - *token, *subtoken, *kommatoken, *dptoken; - char *saveptr1, *saveptr2, *saveptr3, *saveptr4; - int j, i=0, k=0; - int eid=0; - void *ah=0; - - - for (j = 1, str1 = input; ; j++, str1 = NULL) { - token = strtok_r(str1, ";", &saveptr1); - if (token == NULL) - break; - - for (str2 = token; ; str2 = NULL) { - subtoken = strtok_r(str2, "=", &saveptr2); - if (subtoken == NULL) - break; - if( (str2 == token) && ((eid = get_ev_id(subtoken)) != -1)) - ; - else if(eid == -1) - break; - - for (str3 = subtoken; ; str3 = NULL) { - kommatoken = strtok_r(str3, ",", &saveptr3); - if (kommatoken == NULL) - break; - - for (str4 = kommatoken; ; str4 = NULL) { - dptoken = strtok_r(str4, ":", &saveptr4); - if (dptoken == NULL) { - break; - } - if(str4 == kommatoken && str4 != token && eid != -1) { - ev_table[eid].isset = 1; - if((ah = (void *)get_action_handler(dptoken))) { - ev_table[eid].action[i] = emalloc(sizeof(As)); - ev_table[eid].action[i]->handler= get_action_handler(dptoken); - } - i++; - } - else if(str4 != token && eid != -1 && ah) { - ev_table[eid].action[i-1]->options[k] = strdup(dptoken); - k++; - } - else if(!ah) - break; - } - k=0; - } - ev_table[eid].action[i] = emalloc(sizeof(As)); - ev_table[eid].action[i]->handler = NULL; - i=0; - } - } -} - - -/* actions */ - -/* used internally */ -int -a_exposetitle(char * opt[]) { - XCopyArea(dzen.dpy, dzen.title_win.drawable, dzen.title_win.win, - dzen.gc, 0, 0, dzen.title_win.width, dzen.line_height, 0, 0); - return 0; -} - -/* used internally */ -int -a_exposeslave(char * opt[]) { - x_draw_body(); - return 0; -} - -/* user selectable actions */ -int -a_exit(char * opt[]) { - if(opt[0]) - dzen.ret_val = atoi(opt[0]); - dzen.running = False; - return 0; -} - -int -a_collapse(char * opt[]){ - int i; - if(dzen.slave_win.max_lines && !dzen.slave_win.issticky) { - for(i=0; i < dzen.slave_win.max_lines; i++) - XUnmapWindow(dzen.dpy, dzen.slave_win.line[i]); - XUnmapWindow(dzen.dpy, dzen.slave_win.win); - } - return 0; -} - -int -a_uncollapse(char * opt[]){ - int i; - if(dzen.slave_win.max_lines && !dzen.slave_win.issticky) { - XMapRaised(dzen.dpy, dzen.slave_win.win); - for(i=0; i < dzen.slave_win.max_lines; i++) - XMapRaised(dzen.dpy, dzen.slave_win.line[i]); - x_draw_body(); - } - return 0; -} - -int -a_togglecollapse(char * opt[]){ - return 0; -} - -int -a_stick(char * opt[]) { - if(dzen.slave_win.max_lines) - dzen.slave_win.issticky = True; - return 0; -} - -int -a_unstick(char * opt[]) { - if(dzen.slave_win.max_lines) - dzen.slave_win.issticky = False; - return 0; -} - -int -a_togglestick(char * opt[]) { - if(dzen.slave_win.max_lines) - dzen.slave_win.issticky = dzen.slave_win.issticky ? False : True; - return 0; -} - -int -a_scrollup(char * opt[]) { - if(dzen.slave_win.max_lines - && dzen.slave_win.first_line_vis - && dzen.slave_win.last_line_vis > dzen.slave_win.max_lines) { - dzen.slave_win.first_line_vis--; - dzen.slave_win.last_line_vis--; - x_draw_body(); - } - return 0; -} - -int -a_scrolldown(char * opt[]) { - if(dzen.slave_win.max_lines - && dzen.slave_win.last_line_vis >= dzen.slave_win.max_lines - && dzen.slave_win.last_line_vis < dzen.slave_win.tcnt) { - dzen.slave_win.first_line_vis++; - dzen.slave_win.last_line_vis++; - x_draw_body(); - } - return 0; -} - -int -a_hide(char * opt[]) { - if(!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.ishidden) { - XResizeWindow(dzen.dpy, dzen.title_win.win, dzen.title_win.width, dzen.line_height); - dzen.title_win.ishidden = False; - } - return 0; -} - -int -a_exec(char * opt[]) { - int i; - - if(opt) - for(i=0; opt[i]; i++) - if(opt[i]) - spawn(opt[i]); - return 0; -} - -int -a_print(char * opt[]) { - int i; - - if(opt) - for(i=0; opt[i]; i++) - puts(opt[i]); - return 0; -} - -int -a_menuprint(char * opt[]) { - if(dzen.slave_win.ismenu && dzen.slave_win.sel_line != -1 - && (dzen.slave_win.sel_line + dzen.slave_win.first_line_vis) < dzen.slave_win.tcnt) { - 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; -} - -int -a_menuexec(char * opt[]) { - if(dzen.slave_win.ismenu && dzen.slave_win.sel_line != -1 - && (dzen.slave_win.sel_line + dzen.slave_win.first_line_vis) < dzen.slave_win.tcnt) { - spawn(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis]); - dzen.slave_win.sel_line = -1; - } - return 0; -} - -int -a_raise(char * opt[]) { - XRaiseWindow(dzen.dpy, dzen.title_win.win); - - if(dzen.slave_win.max_lines) - XRaiseWindow(dzen.dpy, dzen.slave_win.win); - return 0; -} - -int -a_lower(char * opt[]) { - XLowerWindow(dzen.dpy, dzen.title_win.win); - - if(dzen.slave_win.max_lines) - XLowerWindow(dzen.dpy, dzen.slave_win.win); - return 0; -} diff --git a/select/action.h b/select/action.h deleted file mode 100644 index da5b739..0000000 --- a/select/action.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * (C)opyright MMVII Robert Manea <rob dot manea at gmail dot com> - * See LICENSE file for license details. - * - */ - -#define MAXEVENTS 32 -#define MAXACTIONS 256 -#define MAXOPTIONS 256 - -/* Event, Action data structures */ -typedef struct AS As; -typedef struct EV Ev; - -enum ev_id { - /* internal events, should not be used by the user */ - exposetitle, exposeslave, - /* startup, exit */ - onstart, onexit, - /* mouse buttons */ - button1, button2, button3, button4, button5, - /* entering/leaving windows */ - entertitle, leavetitle, enterslave, leaveslave, - /* external signals */ - sigusr1, sigusr2 -}; - -struct event_lookup { - char *name; - int id; -}; - -struct action_lookup { - char *name; - int (*handler)(char **); -}; - -struct AS { - char *options[MAXOPTIONS]; - int (*handler)(char **); -}; - -struct EV { - int isset; - As *action[MAXACTIONS]; -}; - -extern Ev ev_table[MAXEVENTS]; - -/* utility functions */ -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 **); -int a_exposeslave(char **); -int a_print(char **); -int a_exit(char **); -int a_exec(char **); -int a_collapse(char **); -int a_uncollapse(char **); -int a_stick(char **); -int a_unstick(char **); -int a_togglestick(char **); -int a_scrollup(char **); -int a_scrolldown(char **); -int a_hide(char **); -int a_unhide(char **); -int a_menuprint(char **); -int a_menuexec(char **); -int a_raise(char **); -int a_lower(char **); - - diff --git a/select/config.mk b/select/config.mk deleted file mode 100644 index 2092869..0000000 --- a/select/config.mk +++ /dev/null @@ -1,37 +0,0 @@ -# dzen version -VERSION = 0.3.0 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib -INCS = -I. -I/usr/include -I${X11INC} - -# No Xinerama: -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -# With Xinerama: -#LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXinerama - -# No Xinerama: -CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" -# With Xinerama: -#CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XINERAMA - -LDFLAGS = ${LIBS} - -# Debugging -#CFLAGS = -g -Wall -O0 ${INCS} -DVERSION=\"${VERSION}\" -DPOSIX_SOURCE -#LDFLAGS = -g ${LIBS} - -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} -#CFLAGS += -xtarget=ultra - -# compiler and linker -CC = cc -LD = ${CC} diff --git a/select/draw.c b/select/draw.c deleted file mode 100644 index bc7c8ba..0000000 --- a/select/draw.c +++ /dev/null @@ -1,173 +0,0 @@ -/* -* (C)opyright MMVII Robert Manea <rob dot manea at gmail dot com> -* See LICENSE file for license details. -*/ -#include "dzen.h" -#include <stdio.h> -#include <string.h> - -/* static */ -static unsigned int -textnw(const char *text, unsigned int len) { - XRectangle r; - - if(dzen.font.set) { - XmbTextExtents(dzen.font.set, text, len, NULL, &r); - return r.width; - } - return XTextWidth(dzen.font.xfont, text, len); -} - - -void -drawtext(const char *text, int reverse, int line, int align) { - int x, y, w, h; - static char buf[1024]; - unsigned int len, olen; - XGCValues gcv; - GC mgc; - XRectangle r = { dzen.x, dzen.y, dzen.w, dzen.h}; - - - mgc = reverse ? dzen.gc : dzen.rgc; - if(line == -1) /* title window */ - XFillRectangles(dzen.dpy, dzen.title_win.drawable, mgc, &r, 1); - else /* slave window */ - XFillRectangles(dzen.dpy, dzen.slave_win.drawable, mgc, &r, 1); - - if(!text) - return; - - w = 0; - olen = len = strlen(text); - if(len >= sizeof buf) - len = sizeof buf - 1; - memcpy(buf, text, len); - buf[len] = 0; - h = dzen.font.ascent + dzen.font.descent; - /* shorten text if necessary */ - while(len && (w = textnw(buf, len)) > dzen.w - h) - buf[--len] = 0; - if(len < olen) { - if(len > 1) - buf[len - 1] = '.'; - if(len > 2) - buf[len - 2] = '.'; - if(len > 3) - buf[len - 3] = '.'; - } - - if(line != -1) { - if(align == ALIGNLEFT) - x = h/2; - else if(align == ALIGNCENTER) - x = (dzen.slave_win.width - textw(buf)+h)/2; - else - x = dzen.slave_win.width - textw(buf); - } else { - if(!align) - x = (dzen.w - textw(buf)+h)/2; - else if(align == ALIGNLEFT) - x = h/2; - else - x = dzen.title_win.width - textw(buf); - } - y = dzen.font.ascent + (dzen.line_height - h) / 2; - - mgc = reverse ? dzen.rgc : dzen.gc; - if(dzen.font.set) { - if(line == -1) - XmbDrawString(dzen.dpy, dzen.title_win.drawable, dzen.font.set, - mgc, x, y, buf, len); - else - XmbDrawString(dzen.dpy, dzen.slave_win.drawable, dzen.font.set, - mgc, x, y, buf, len); - } - else { - gcv.font = dzen.font.xfont->fid; - XChangeGC(dzen.dpy, mgc, GCForeground | GCFont, &gcv); - - if(line != -1) - XDrawString(dzen.dpy, dzen.slave_win.drawable, - mgc, x, y, buf, len); - else - XDrawString(dzen.dpy, dzen.title_win.drawable, - mgc, x, y, buf, len); - } -} - -unsigned long -getcolor(const char *colstr) { - Colormap cmap = DefaultColormap(dzen.dpy, dzen.screen); - XColor color; - - if(!XAllocNamedColor(dzen.dpy, cmap, colstr, &color, &color)) - eprint("error, cannot allocate color '%s'\n", colstr); - return color.pixel; -} - -void -setfont(const char *fontstr) { - char *def, **missing; - int i, n; - - missing = NULL; - if(dzen.font.set) - XFreeFontSet(dzen.dpy, dzen.font.set); - dzen.font.set = XCreateFontSet(dzen.dpy, fontstr, &missing, &n, &def); - if(missing) - XFreeStringList(missing); - if(dzen.font.set) { - XFontSetExtents *font_extents; - XFontStruct **xfonts; - char **font_names; - dzen.font.ascent = dzen.font.descent = 0; - font_extents = XExtentsOfFontSet(dzen.font.set); - n = XFontsOfFontSet(dzen.font.set, &xfonts, &font_names); - for(i = 0, dzen.font.ascent = 0, dzen.font.descent = 0; i < n; i++) { - if(dzen.font.ascent < (*xfonts)->ascent) - dzen.font.ascent = (*xfonts)->ascent; - if(dzen.font.descent < (*xfonts)->descent) - dzen.font.descent = (*xfonts)->descent; - xfonts++; - } - } - else { - if(dzen.font.xfont) - XFreeFont(dzen.dpy, dzen.font.xfont); - dzen.font.xfont = NULL; - if(!(dzen.font.xfont = XLoadQueryFont(dzen.dpy, fontstr))) - eprint("error, cannot load font: '%s'\n", fontstr); - dzen.font.ascent = dzen.font.xfont->ascent; - dzen.font.descent = dzen.font.xfont->descent; - } - dzen.font.height = dzen.font.ascent + dzen.font.descent; -} - -unsigned int -textw(const char *text) { - return textnw(text, strlen(text)) + dzen.font.height; -} - -void -drawheader(char * text) { - dzen.x = 0; - dzen.y = 0; - dzen.w = dzen.title_win.width; - dzen.h = dzen.line_height; - - if(text) - drawtext(text, 0, -1, dzen.title_win.alignment); - XCopyArea(dzen.dpy, dzen.title_win.drawable, dzen.title_win.win, - dzen.gc, 0, 0, dzen.title_win.width, dzen.line_height, 0, 0); -} - -void -drawbody(char * text) { - if(dzen.slave_win.tcnt >= BUF_SIZE) - free_buffer(); - if(dzen.slave_win.tcnt < BUF_SIZE) { - dzen.slave_win.tbuf[dzen.slave_win.tcnt] = estrdup(text); - dzen.slave_win.tcnt++; - } -} diff --git a/select/dzen.h b/select/dzen.h deleted file mode 100644 index 6cbb3af..0000000 --- a/select/dzen.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * (C)opyright MMVII Robert Manea <rob dot manea at gmail dot com> - * See LICENSE file for license details. - */ - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#ifdef DZEN_XINERAMA -#include <X11/extensions/Xinerama.h> -#endif - -#define FONT "-*-fixed-*-*-*-*-*-*-*-*-*-*-*-*" -#define BGCOLOR "#ab0b0b" -#define FGCOLOR "#efefef" - -#define ALIGNCENTER 0 -#define ALIGNLEFT 1 -#define ALIGNRIGHT 2 - -#define BUF_SIZE 4096 - -/* gui data structures */ -enum { ColFG, ColBG, ColLast }; - -typedef struct DZEN Dzen; -typedef struct Fnt Fnt; -typedef struct TW TWIN; -typedef struct SW SWIN; - -struct Fnt { - XFontStruct *xfont; - XFontSet set; - int ascent; - int descent; - int height; -}; - -/* title window */ -struct TW { - int x, y, width, height; - - Window win; - Drawable drawable; - char alignment; - Bool ishidden; -}; - -/* slave window */ -struct SW { - int x, y, width, height; - - Window win; - Window *line; - Drawable drawable; - - char *tbuf[BUF_SIZE]; - int tcnt; - int max_lines; - int first_line_vis; - int last_line_vis; - int sel_line; - - char alignment; - Bool ismenu; - Bool issticky; - Bool ismapped; -}; - -struct DZEN { - int x, y, w, h; - Bool running; - unsigned long norm[ColLast]; - - TWIN title_win; - SWIN slave_win; - - char *fnt; - char *bg; - char *fg; - int line_height; - - Display *dpy; - int screen; - unsigned int depth; - - Visual *visual; - GC gc, rgc; - Fnt font; - - Bool ispersistent; - int cur_line; - int ret_val; - - /* should always be 0 if DZEN_XINERAMA not defined */ - int xinescreen; -}; - -extern Dzen dzen; - -void free_buffer(void); -void x_draw_body(void); - -/* draw.c */ -extern void drawtext(const char *text, - int reverse, - int line, - int aligne); -extern unsigned long getcolor(const char *colstr); /* returns color of colstr */ -extern void setfont(const char *fontstr); /* sets global font */ -extern unsigned int textw(const char *text); /* returns width of text in px */ -extern void drawheader(char *text); -extern void drawbody(char *text); - -/* util.c */ -extern void *emalloc(unsigned int size); /* allocates memory, exits on error */ -extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */ -extern char *estrdup(const char *str); /* duplicates str, exits on allocation error */ -extern void spawn(const char *arg); /* execute arg */ diff --git a/select/main.c b/select/main.c deleted file mode 100644 index e1837cc..0000000 --- a/select/main.c +++ /dev/null @@ -1,601 +0,0 @@ -/* -* (C)opyright MMVII Robert Manea <rob dot manea at gmail dot com> -* See LICENSE file for license details. -* -*/ -#include "dzen.h" -#include "action.h" - -#include <ctype.h> -#include <locale.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <signal.h> -#include <sys/select.h> -#include <sys/time.h> -#include <sys/types.h> - -Dzen dzen = {0}; -static int last_cnt = 0; -typedef void sigfunc(int); - - -static void -catch_sigusr1() { - do_action(sigusr1); -} - -static void -catch_sigusr2() { - do_action(sigusr2); -} - -static void -catch_sigterm() { - do_action(onexit); -} - -static sigfunc * -setup_signal(int signr, sigfunc *shandler) { - struct sigaction nh, oh; - - nh.sa_handler = shandler; - sigemptyset(&nh.sa_mask); - nh.sa_flags = 0; - - if(sigaction(signr, &nh, &oh) < 0) - return SIG_ERR; - - return NULL; -} - -static int -chomp(char *inbuf, char *outbuf, int start, int len) { - int i=0; - int off=start; - - while(off < len) { - if(inbuf[off] != '\n') { - outbuf[i++] = inbuf[off++]; - } else if(inbuf[off] == '\n') { - outbuf[i] = '\0'; - return ++off; - } - } - outbuf[i] = '\0'; - return 0; -} - -void -free_buffer(void) { - int i; - for(i=0; i<BUF_SIZE; i++) - free(dzen.slave_win.tbuf[i]); - dzen.slave_win.tcnt = 0; - last_cnt = 0; -} - -static int -read_stdin(void *ptr) { - char buf[1024], retbuf[1024]; - ssize_t n, n_off=0; - - n = read(STDIN_FILENO, buf, sizeof buf); - - if(!n && !dzen.ispersistent) { - dzen.running = False; - return -1; - } else if (!n && dzen.ispersistent) - return -2; - - if(n) { - while((n_off = chomp(buf, retbuf, n_off, n))) { - if(!dzen.cur_line || !dzen.slave_win.max_lines) { - drawheader(retbuf); - } - else - drawbody(retbuf); - dzen.cur_line++; - } - } - return 0; -} - -static void -x_highlight_line(int line) { - drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 1, line+1, dzen.slave_win.alignment); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.rgc, - 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); -} - -static void -x_unhighlight_line(int line) { - drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 0, line+1, dzen.slave_win.alignment); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.gc, - 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); -} - -void -x_draw_body(void) { - dzen.x = 0; - dzen.y = 0; - dzen.w = dzen.slave_win.width; - dzen.h = dzen.line_height; - int i; - - 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, dzen.slave_win.alignment); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc, - 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); - } - else if(i < dzen.slave_win.max_lines) { - drawtext("", 0, i, dzen.slave_win.alignment); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc, - 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); - } - } -} - -static void - x_check_geometry(XRectangle si) { - if(dzen.title_win.x > si.width) - dzen.title_win.x = si.x; - if (dzen.title_win.x < si.x) - dzen.title_win.x = si.x; - - if(!dzen.title_win.width) - dzen.title_win.width = si.width; - - if((dzen.title_win.x + dzen.title_win.width) > (si.x + si.width)) - dzen.title_win.width = si.width - (dzen.title_win.x - si.x); - - if(!dzen.slave_win.width) { - dzen.slave_win.x = si.x; - dzen.slave_win.width = si.width; - } - if( dzen.title_win.width == dzen.slave_win.width) { - dzen.slave_win.x = dzen.title_win.x; - dzen.slave_win.width = dzen.title_win.width; - } - if(dzen.slave_win.width != si.width) { - dzen.slave_win.x = dzen.title_win.x + (dzen.title_win.width - dzen.slave_win.width)/2; - if(dzen.slave_win.x < si.x) - dzen.slave_win.x = si.x; - if(dzen.slave_win.width > si.width) - dzen.slave_win.width = si.width; - if(dzen.slave_win.x + dzen.slave_win.width > si.width) - dzen.slave_win.x = si.x + (si.width - dzen.slave_win.width); - } - dzen.line_height = dzen.font.height + 2; - dzen.title_win.y = si.y + ((dzen.title_win.y + dzen.line_height) > si.height ? 0 : dzen.title_win.y); - } - -static void -qsi_no_xinerama(Display *dpy, XRectangle *rect) { - rect->x = 0; - rect->y = 0; - rect->width = DisplayWidth( dpy, DefaultScreen(dpy)); - rect->height = DisplayHeight(dpy, DefaultScreen(dpy)); -} - -#ifdef DZEN_XINERAMA -static void -queryscreeninfo(Display *dpy, XRectangle *rect, int screen) { - XineramaScreenInfo *xsi = NULL; - int nscreens = 1; - - if(XineramaIsActive(dpy)) - xsi = XineramaQueryScreens(dpy, &nscreens); - - if(xsi == NULL || screen > nscreens || screen <= 0) { - qsi_no_xinerama(dpy, rect); - } else { - rect->x = xsi[screen-1].x_org; - rect->y = xsi[screen-1].y_org; - rect->width = xsi[screen-1].width; - rect->height = xsi[screen-1].height; - } -} -#endif - -static void -x_create_windows(void) { - XSetWindowAttributes wa; - Window root; - int i; - XRectangle si; - - 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; - -#ifdef DZEN_XINERAMA - queryscreeninfo(dzen.dpy, &si, dzen.xinescreen); -#else - qsi_no_xinerama(dzen.dpy, &si); -#endif - - x_check_geometry(si); - - /* title window */ - dzen.title_win.win = XCreateWindow(dzen.dpy, root, - dzen.title_win.x, dzen.title_win.y, dzen.title_win.width, dzen.line_height, 0, - DefaultDepth(dzen.dpy, dzen.screen), CopyFromParent, - DefaultVisual(dzen.dpy, dzen.screen), - CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); - dzen.title_win.drawable = XCreatePixmap(dzen.dpy, root, dzen.title_win.width, - dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); - - /* slave window */ - if(dzen.slave_win.max_lines) { - dzen.slave_win.first_line_vis = 0; - dzen.slave_win.last_line_vis = 0; - dzen.slave_win.issticky = False; - dzen.slave_win.y = dzen.title_win.y + dzen.line_height; - - if(dzen.title_win.y + dzen.line_height*dzen.slave_win.max_lines > si.height) - dzen.slave_win.y = (dzen.title_win.y - dzen.line_height) - dzen.line_height*(dzen.slave_win.max_lines) + dzen.line_height; - - dzen.slave_win.win = XCreateWindow(dzen.dpy, root, - dzen.slave_win.x, dzen.slave_win.y, dzen.slave_win.width, dzen.slave_win.max_lines * dzen.line_height, 0, - DefaultDepth(dzen.dpy, dzen.screen), CopyFromParent, - DefaultVisual(dzen.dpy, dzen.screen), - CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); - - dzen.slave_win.drawable = XCreatePixmap(dzen.dpy, root, dzen.slave_win.width, - dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); - - /* windows holding the lines */ - dzen.slave_win.line = emalloc(sizeof(Window) * dzen.slave_win.max_lines); - for(i=0; i < dzen.slave_win.max_lines; i++) { - dzen.slave_win.line[i] = XCreateWindow(dzen.dpy, dzen.slave_win.win, - 0, i*dzen.line_height, dzen.slave_win.width, dzen.line_height, 0, - DefaultDepth(dzen.dpy, dzen.screen), CopyFromParent, - DefaultVisual(dzen.dpy, dzen.screen), - CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); - } - - } - /* normal GC */ - dzen.gc = XCreateGC(dzen.dpy, root, 0, 0); - XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColFG]); - XSetBackground(dzen.dpy, dzen.gc, dzen.norm[ColBG]); - /* reverse GC */ - dzen.rgc = XCreateGC(dzen.dpy, root, 0, 0); - XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]); - XSetBackground(dzen.dpy, dzen.rgc, dzen.norm[ColFG]); -} - -static void -x_map_window(Window win) { - XMapRaised(dzen.dpy, win); - XSync(dzen.dpy, False); -} - -static void -handle_xev(void) { - XEvent ev; - int i; - - 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); - } - XSync(dzen.dpy, False); - 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); - XSync(dzen.dpy, False); - 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); - break; - } - XFlush(dzen.dpy); -} - -static void -handle_newl(void) { - XWindowAttributes wa; - - 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; - } -} - -static int -event_loop(void *ptr) { - int xfd, ret, dr=0; - fd_set rmask; - - drawheader(""); - xfd = ConnectionNumber(dzen.dpy); - - while(dzen.running) { - FD_ZERO(&rmask); - FD_SET(xfd, &rmask); - if(dr != -2) - FD_SET(STDIN_FILENO, &rmask); - - while(XPending(dzen.dpy)) - handle_xev(); - ret = select(xfd+1, &rmask, NULL, NULL, NULL); - if(ret) { - if(dr != -2){ - if(FD_ISSET(STDIN_FILENO, &rmask)) { - dr = read_stdin(NULL); - if(dr == -1) - return 0; - handle_newl(); - } - } - if(FD_ISSET(xfd, &rmask)) - handle_xev(); - } - } - return 1; -} - -static void -clean_up(void) { - int i; - - 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); -} - -static void -set_alignment(void) -{ - if(dzen.title_win.alignment) { - switch(dzen.title_win.alignment) { - case 'l': - dzen.title_win.alignment = ALIGNLEFT; - break; - case 'c': - dzen.title_win.alignment = ALIGNCENTER; - break; - case 'r': - dzen.title_win.alignment = ALIGNRIGHT; - break; - default: - dzen.title_win.alignment = ALIGNCENTER; - } - } - if(dzen.slave_win.alignment) { - switch(dzen.slave_win.alignment) { - case 'l': - dzen.slave_win.alignment = ALIGNLEFT; - break; - case 'c': - dzen.slave_win.alignment = ALIGNCENTER; - break; - case 'r': - dzen.slave_win.alignment = ALIGNRIGHT; - break; - default: - dzen.slave_win.alignment = ALIGNLEFT; - } - } -} - -int -main(int argc, char *argv[]) { - int i; - char *action_string = NULL; - - /* default values */ - dzen.cur_line = 0; - dzen.ret_val = 0; - dzen.title_win.x = dzen.slave_win.x = 0; - dzen.title_win.y = 0; - dzen.title_win.width = dzen.slave_win.width = 0; - dzen.title_win.alignment = ALIGNCENTER; - dzen.slave_win.alignment = ALIGNLEFT; - dzen.fnt = FONT; - dzen.bg = BGCOLOR; - dzen.fg = FGCOLOR; - dzen.slave_win.max_lines = 0; - dzen.running = True; - dzen.xinescreen = 0; - - /* cmdline args */ - for(i = 1; i < argc; i++) - if(!strncmp(argv[i], "-l", 3)){ - if(++i < argc) dzen.slave_win.max_lines = atoi(argv[i]); - } - else if(!strncmp(argv[i], "-p", 3)) { - dzen.ispersistent = True; - } - else if(!strncmp(argv[i], "-ta", 4)) { - if(++i < argc) dzen.title_win.alignment = argv[i][0]; - } - else if(!strncmp(argv[i], "-sa", 4)) { - if(++i < argc) dzen.slave_win.alignment = argv[i][0]; - } - else if(!strncmp(argv[i], "-m", 3)) { - dzen.slave_win.ismenu = True; - } - else if(!strncmp(argv[i], "-fn", 4)) { - if(++i < argc) dzen.fnt = argv[i]; - } - else if(!strncmp(argv[i], "-e", 3)) { - if(++i < argc) action_string = argv[i]; - } - else if(!strncmp(argv[i], "-bg", 4)) { - if(++i < argc) dzen.bg = argv[i]; - } - else if(!strncmp(argv[i], "-fg", 4)) { - if(++i < argc) dzen.fg = argv[i]; - } - else if(!strncmp(argv[i], "-x", 3)) { - if(++i < argc) dzen.title_win.x = dzen.slave_win.x = atoi(argv[i]); - } - else if(!strncmp(argv[i], "-y", 3)) { - if(++i < argc) dzen.title_win.y = atoi(argv[i]); - } - else if(!strncmp(argv[i], "-w", 3)) { - if(++i < argc) dzen.slave_win.width = atoi(argv[i]); - } - else if(!strncmp(argv[i], "-tw", 3)) { - if(++i < argc) dzen.title_win.width = atoi(argv[i]); - } -#ifdef DZEN_XINERAMA - else if(!strncmp(argv[i], "-xs", 4)) { - if(++i < argc) dzen.xinescreen = atoi(argv[i]); - } -#endif - else if(!strncmp(argv[i], "-v", 3)) - eprint("dzen-"VERSION", (C)opyright 2007 Robert Manea\n"); - else - eprint("usage: dzen2 [-v] [-p] [-m] [-ta <l|c|r>] [-sa <l|c|r>] [-tw <pixel>]\n" - " [-e <string>] [-x <pixel>] [-y <pixel>] [-w <pixel>] \n" - " [-l <lines>] [-fn <font>] [-bg <color>] [-fg <color>] \n" -#ifdef DZEN_XINERAMA - " [-xs <screen>]\n" -#endif - ); - - if(!dzen.title_win.width) - dzen.title_win.width = dzen.slave_win.width; - - if(!setlocale(LC_ALL, "") || !XSupportsLocale()) - puts("dzen: locale not available, expect problems with fonts.\n"); - - if(action_string) { - char edef[] = "exposet=exposetitle;exposes=exposeslave"; - fill_ev_table(edef); - fill_ev_table(action_string); - } else { - char edef[] = "exposet=exposetitle;exposes=exposeslave;" - "entertitle=uncollapse;leaveslave=collapse;" - "button1=menuexec;button2=togglestick;button3=exit:13;" - "button4=scrollup;button5=scrolldown"; - fill_ev_table(edef); - } - - if(ev_table[onexit].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_alignment(); - x_create_windows(); - x_map_window(dzen.title_win.win); - - do_action(onstart); - - /* main loop */ - event_loop(NULL); - - do_action(onexit); - clean_up(); - - if(dzen.ret_val) - return dzen.ret_val; - - return EXIT_SUCCESS; -} diff --git a/select/util.c b/select/util.c deleted file mode 100644 index d584a4a..0000000 --- a/select/util.c +++ /dev/null @@ -1,62 +0,0 @@ -/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> - * (C)opyright MMVII Robert Manea <rob dot manea at gmail dot com> - * See LICENSE file for license details. - */ - -#include "dzen.h" -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/wait.h> -#include <unistd.h> - -void * -emalloc(unsigned int size) { - void *res = malloc(size); - - if(!res) - eprint("fatal: could not malloc() %u bytes\n", size); - return res; -} - -void -eprint(const char *errstr, ...) { - va_list ap; - - va_start(ap, errstr); - vfprintf(stderr, errstr, ap); - va_end(ap); - exit(EXIT_FAILURE); -} - -char * -estrdup(const char *str) { - void *res = strdup(str); - - if(!res) - eprint("fatal: could not malloc() %u bytes\n", strlen(str)); - return res; -} -void -spawn(const char *arg) { - static char *shell = NULL; - - if(!shell && !(shell = getenv("SHELL"))) - shell = "/bin/sh"; - if(!arg) - return; - /* The double-fork construct avoids zombie processes and keeps the code - * clean from stupid signal handlers. */ - if(fork() == 0) { - if(fork() == 0) { - setsid(); - execl(shell, shell, "-c", arg, (char *)NULL); - fprintf(stderr, "dzen: execl '%s -c %s'", shell, arg); - perror(" failed"); - } - exit(0); - } - wait(0); -} - |