Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Backports:SLE-15-SP4
dzen2
dzen2-1379930259.488ab66.obscpio
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File dzen2-1379930259.488ab66.obscpio of Package dzen2
070701303F14D3000081A40000420C0000003200000001524010930000030A000000080000001100000000000000000000002100000000dzen2-1379930259.488ab66/CREDITS================================== dzen, (c) 2007 by Robert Manea ================================== The following people have contributed especially to dzen: Cyrille Bagard <nocbos at gmail dot com> * patch allowing to use EWMH for docking dzen. Jason Creighton <jcreigh at gmail dot com> * XINERAMA support * _NET_WM_STRUT_PARTIAL support Adam Langley <agl at imperialviolet dot org> * patch to add optional timeout to '-p' Mauke <mauke at ...> * Code clean ups to remove compiler warnings Alexander V. Inyukhin <shurick at sectorb dot msk dot ru> * fix to action handling Valery V. Vorotyntsev <valery dot vv at gmail.com> * patch to correctly handle the -geometry and -y options for dzen at the bottom of the screen * cosmetic code clean ups 070701303F14D4000081A40000420C00000032000000015240109300000279000000080000001100000000000000000000002100000000dzen2-1379930259.488ab66/INSTALL================================== dzen, (c) 2007 by Robert Manea ================================== 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 Optionally if you want to use dzen's gadgets: cd gadgets make clean install Note: By default dzen will not be compiled with Xinerama and XPM support. Uncomment the respective lines in config.mk to change this. Use "./help" to view a nicely formated version of the documentation. 070701303F14D5000081A40000420C00000032000000015240109300000464000000080000001100000000000000000000002100000000dzen2-1379930259.488ab66/LICENSEMIT/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. 070701303F14D6000081A40000420C000000320000000152401093000006C9000000080000001100000000000000000000002200000000dzen2-1379930259.488ab66/Makefile# 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 $@ @echo "Run ./help for documentation" clean: @echo cleaning @rm -f dzen2 ${OBJ} dzen2-${VERSION}.tar.gz dist: clean @echo creating dist tarball @mkdir -p dzen2-${VERSION} @mkdir -p dzen2-${VERSION}/gadgets @mkdir -p dzen2-${VERSION}/bitmaps @cp -R CREDITS LICENSE Makefile INSTALL README.dzen README help config.mk action.h dzen.h ${SRC} dzen2-${VERSION} @cp -R gadgets/Makefile gadgets/config.mk gadgets/README.dbar gadgets/textwidth.c gadgets/README.textwidth gadgets/dbar.c gadgets/gdbar.c gadgets/README.gdbar gadgets/gcpubar.c gadgets/README.gcpubar gadgets/kittscanner.sh gadgets/README.kittscanner gadgets/noisyalert.sh dzen2-${VERSION}/gadgets @cp -R bitmaps/alert.xbm bitmaps/ball.xbm bitmaps/battery.xbm bitmaps/envelope.xbm bitmaps/volume.xbm bitmaps/pause.xbm bitmaps/play.xbm bitmaps/music.xbm dzen2-${VERSION}/bitmaps @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 070701303F14D7000081A40000420C000000320000000152401093000049EC000000080000001100000000000000000000002000000000dzen2-1379930259.488ab66/README==================================== dzen, (c) 2007-2010 by Robert Manea ==================================== Dzen is a general purpose messaging, notification and menuing program for X11. It was designed to be fast, tiny and scriptable in any language. Features -------- * Small, fast, very tiny set of dependencies (Xlib only by default) * Scriptable in any language * Sophisticated formating language - including colours, icons, graphics * Versatile - display all sorts of information * Interactive - user defined mouse and keyboard actions * Optional XFT support * Optional XINERAMA support Requirements ------------ In order to build dzen you need the Xlib 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 Optionally if you want to use dzen's gadgets: cd gadgets make clean install Note: By default dzen will not be compiled with Xinerama and XPM 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(ight) -tw title window width -sa alignment of slave window, see "-ta" -l lines, see (1) -e events and actions, see (2) -m menu mode, see (3) -u update contents of title and slave window simultaneously, see (4) -p persist EOF (optional timeout in seconds) -x x position -y y position -h line height (default: fontheight + 2 pixels) -w width -xs number of Xinerama screen -v version information see (5) for the in-text formating language. X resources ----------- Dzen is able to read font and color setting from X resources. As an example you can add following lines to ~/.Xresources dzen2.font: -*-fixed-*-*-*-*-*-*-*-*-*-*-*-* dzen2.foreground: #22EE11 dzen2.background: black Window layout ------------- Dzen's window layout is as follows: ------------------------------------------ | Title window, single line | `------------------------------------------´ | | | scrollable | | Slave window | | multiple lines | | lines to display simultaneously | | controlled with the | | '-l' option | | | | | `------------------------------------------´ The first line you provide to dzen always goes to the title window, all other consecutive lines will be drawn to the slave window unless you explicitly overide this with the (5) In-text formating language command ^tw(). QA: --- Q1: I don't want a slave window, what to do? A1: Do not provide the '-l' option, all lines will be displayed in the title window, this is the default behaviour. Q2: I used the '-l' option but no slave window appears. A2: With the default event/action handling the slave window will only be displayed if you hoover with the mouse over the title window. See "(2) Events and actions" if you'd like to change this. Q3: If I echo some text or cat a file dzen closes itself imediatelly. A3: There are 2 different approaches dzen uses to terminate itself, see next section "Termination". Q4: Ok, the title and slave thing works, can I update the contents of both windows at the same time? A4: Sure, see "(4) Simultaneous updates" or use the in-text command "^tw()" to explicitly draw to the title windwow. See section (5) for further details Q5: Can i chnage color of my input at runtime? A5: Yes, you can change both background and foreground colors and much more See "(5) In-Text formating language" Q6: Can I use dzen as a menu? A6: Yes, both vertical and horizontal menus are supported. See "(3) Menu" for further details. Termination: ------------ dzen uses two different approaches to terminate itself: * Timed termination: if EOF is received -> terminate - unless the '-p' option is set · '-p' without argument persist forever · '-p' with argument n persist for n seconds * Interactive termination: if mouse button3 is clicked -> terminate - this is the default behaviour, see (2) - in some modes the Escape key terminates too, 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. (By default limited to 64 each, easily changable in action.h) 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 onnewinput Perform actions if there is new input for the slave window button1 Mouse button1 released button2 Mouse button2 released button3 Mouse button3 released button4 Mouse button4 released (usually scrollwheel) button5 Mouse button5 released (usually scrollwheel) button6 Mouse button6 released button7 Mouse button7 released 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 key_KEYNAME Keyboard events (*) (*) Keyboard events: -------------------- Every key can be bound to an action (see below). The format is: key_KEYNAME where KEYNAME is the name of the key as defined in keysymdef.h (usually: /usr/include/X11/keysymdef.h). The part after 'XK_' in keysymdef.h must be used for KEYNAME. 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 togglecollapse toggle collapsed state stick stick slave window unstick unstick slave window togglestick toggle sticky state hide hide title window unhide unhide title window togglehide toggle hide state raise raise window to view (above all others) lower lower window (behind all others) scrollhome show head of input scrollend show tail of input scrollup:n scroll slave window n lines up (default n=1) scrolldown:n scroll slave window n lines down (default n=1) grabkeys enable keyboard support ungrabkeys disable keyboard support grabmouse enable mouse support only needed with specific windowmanagers, such as fluxbox ungrabmouse release mouse only needed with specific windowmanagers, such as fluxbox Note: If no events/actions are specified dzen defaults to: Title only mode: ---------------- -e 'button3=exit:13' Multiple lines and vertical menu mode: -------------------------------------- -e 'entertitle=uncollapse,grabkeys; enterslave=grabkeys;leaveslave=collapse,ungrabkeys; button1=menuexec;button2=togglestick;button3=exit:13; button4=scrollup;button5=scrolldown; key_Escape=ungrabkeys,exit' Horizontal menu mode: --------------------- -e 'enterslave=grabkeys;leaveslave=ungrabkeys; button4=scrollup;button5=scrolldown; key_Left=scrollup;key_Right=scrolldown; button1=menuexec;button3=exit:13 key_Escape=ungrabkeys,exit' 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 --------------------- Dzen provides two menu modes, vertical and horizontal menus. You can access these modes by adding 'v'(ertical) or 'h'(horizontal) to the '-m' option. If nothing is specified dzen defaults to vertical menus. Vertical menu, both invocations are equivalent: dzen2 -p -l 4 -m < file dzen2 -p -l 4 -m v < file Horizontal menu: dzen2 -p -l 4 -m h < file All actions beginning with "menu" work on the selected menu entry. Note: Menu mode only makes sense if '-l <n>' is specified! Horizontal menus have no title window, so all actions affecting the title window will be silently discarded in this mode. (4) Option '-u', Simultaneous updates ------------------------------------- ** DEPRECATED ** This option provides facilities to update the title and slave window at the same time. The way it works is best described by an example: Motivation: We want to display an updating clock in the title and some log output in the slave window. Solution: while true; do date # output goes to the title window dmesg | tail -n 10 # output goes to the slave window sleep 1 done | dzen2 -l 10 -u For this to work correctly it is essential to provide exactly the number of lines to the slave window as defined by the parameter to '-l'. (5) In-text formating & control language: ----------------------------------------- This feature allows to dynamically (at runtime) format the text dzen displays and control its behaviour. Currently the following commands are supported: Note: Doubling the '^' character ('^^') will remove the special meaning from it. Colors: ------- ^fg(color) set foreground color ^fg() without arguments, sets default fg color ^bg(color) set background color ^bg() without arguments, sets default bg color Graphics: --------- ^i(path) draw icon specified by path Supported formats: XBM and optionally XPM ^r(WIDTHxHEIGHT) draw a rectangle with the dimensions WIDTH and HEIGHT ^ro(WIDTHxHEIGHT) rectangle outline ^c(RADIUS) draw a circle with size RADIUS pixels ^co(RADIUS) circle outline Positioning: ------------ ^p(ARGUMENT) position next input amount of PIXELs to the right or left of the current position a.k.a. relative positioning ^pa(ARGUMENT) position next input at PIXEL a.k.a. absolute positioning ARGUMENT: ^p(+-X) move X pixels to the right or left of the current position (on the X axis) ^p(+-X;+-Y) move X pixels to the right or left and Y pixels up or down of the current position (on the X and Y axis) ^p(;+-Y) move Y pixels up or down of the current position (on the Y axis) ^p() without parameters resets the Y position to its default ^pa() takes the same parameters as described above but positions at the absolute X and Y coordinates Further ^p() also takes some symbolic names as argument: _LOCK_X Lock the current X position, useful if you want to align things vertically _UNLOCK_X Unlock the X position _LEFT Move current x-position to the left edge _RIGHT Move current x-position to the right edge _TOP Move current y-position to the top edge _CENTER Move current x-position to center of the window _BOTTOM Move current y-position to the bottom edge Interaction: ------------ ^ca(BTN, CMD) ... ^ca() Used to define 'clickable areas' anywhere inside the title window or slave window. - 'BTN' denotes the mouse button (1=left, 2=right, 3=middle, etc.) - 'CMD' denotes the command that should be spawned when the specific area has been clicked with the defined button - '...' denotes any text or formating commands dzen accepts - '^ca()' without arguments denotes the end of this clickable area Example: foo ^ca(1, echo one)^fg(red)click me and i'll echo one^fg()^ca() bar Actions as commands: -------------------- ^togglecollapse() ^collapse() ^uncollapse() ^togglestick() ^stick() See section (2) 'Events and actions' for a detailed description ^unstick() of each command. ^togglehide() ^hide() ^unhide() ^raise() ^lower() ^scrollhome() ^scrollend() ^exit() Other: ------ ^tw() draw to title window This command has some annoyances, as only the input after the command will be drawn to the title window, so it is best used only once and as first command per line. ^cs() clear slave window This command must be the first and only command per line. ^ib(VALUE) ignore background setting, VALUE can be either 1 to ignore or 0 to not ignore the bg color set with ^bg(color). This command is useful in combination with ^p() and ^pa() in order to position the input inside other already drawn input. Example: ^ib(1)^fg(red)^ro(100x15)^p(-98)^fg(blue)^r(20x10)^fg(orange)^p(3)^r(40x10)^p(4)^fg(darkgreen)^co(12)^p(2)^c(10) These commands can appear anywhere and in any combination in dzen's input. The color can be specified either as symbolic name (e.g. red, darkgreen, etc.) or as #rrggbb hex-value (e.g. #ffffaa). Icons must be in the XBM or optionally XPM format, see the "bitmaps" directory for some sample icons. With the standard "bitmap" application you can easily draw your own icons. Some examples: Input: ^fg(red)I'm red text ^fg(blue)I am blue Input: ^bg(#ffaaaa)The ^fg(yellow)text to ^bg(blue)^fg(orange)colorize Input: ^fg(grey70)Some text containing ^^ characters Input for icons: ^i(bitmaps/envelope.xbm) I am an envelope ^fg(yellow)and ^i(bitmaps/battery.xbm) I'm a baterry. Input for rectangles: 6x4 rectangle ^r(6x4) ^fg(red)12x8 ^r(12x8) ^fg(yellow)and finally 100x15 ^r(100x15) Input for relative positioning: Some text^p(100)^fg(yellow)100 pixels to the right^p(50)^fg(red)50 more pixels to the right 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 title 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 * Horizontal menu without any files: {echo Menu; echo -e "xterm\nxclock\nxeyes\nxfontsel"} | dzen2 -l 4 -m h -p * Extract PIDs from the process table: {echo Procs; ps -a} | dzen2 -m -l 12 -p \ -e 'button1=menuprint;button3=exit;button4=scrollup:3;button5=scrolldown:3;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. 070701303F14D8000081A40000420C00000032000000015240109300004BF2000000080000001100000000000000000000002500000000dzen2-1379930259.488ab66/README.dzen^fg(lightgreen)^r(190x4)^fg(#6fbf47)^r(38x4)^fg(darkgreen)^r(9x4) ^fg(#6fbf47) dzen, (c) 2007 by Robert Manea ^fg(darkgreen)^r(9x4)^fg(#6fbf47)^r(38x4)^fg(lightgreen)^r(190x4) A general purpose messaging, notification and menu program The "gadgets" subdirectory contains some tools that you can use in combination with dzen. Script archive with a collection of interesting ideas: ^fg(lightblue) http://gotmor.googlepages.com/dzenscriptarchive ^fg(#6fbf47)Features ^fg(#6fbf47)-------- ^co(4x4) scriptable in any language ^co(4x4) dynamic colorizer ^co(4x4) icons support ^co(4x4) keyboard support ^co(4x4) single line and/or windows holding multiple lines ^co(4x4) menu functionality ^co(4x4) in-text formating language ^co(4x4) flexible event/action mechanism ^co(4x4) hideable, collapsable ^co(4x4) Xinerama support ^fg(#6fbf47)Requirements ^fg(#6fbf47)------------ In order to build dzen you need the Xlib header files. ^fg(#6fbf47)Installation ^fg(#6fbf47)------------ 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): ^fg(grey85)make clean install Optionally if you want to use dzen's gadgets: ^fg(grey85)cd gadgets ^fg(grey85)make clean install ^fg(Khaki)Note: By default dzen will ^fg(red)not^fg(Khaki) be compiled with Xinerama and XPM support. ^fg(Khaki)Uncomment the respective lines in config.mk to change this. ^fg(#6fbf47)Contact: ^fg(#6fbf47)-------- Feature requests, patches or anything else related to dzen can be send to: ^fg(Khaki)rob dot manea at gmail dot com ^fg(#6fbf47)Running dzen ^fg(#6fbf47)------------ 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(ight) -tw title window width -sa alignment of slave window, see "-ta" -l lines, ^fg(#6fbf47)see (1) -e events and actions, ^fg(#6fbf47)see (2) -m menu mode, ^fg(#6fbf47)see (3) -u update contents of title and slave window simultaneously, ^fg(#6fbf47)see (4) -p persist EOF (optional timeout in seconds) -x x position -y y position -h line height (default: fontheight + 2 pixels) -w width -xs number of Xinerama screen -v version information ^fg(#6fbf47)see (5)^fg(), for the in-text formating language. ^fg(#6fbf47)X resources ^fg(#6fbf47)----------- Dzen is able to read font and color setting from X resources. As an example you can add following lines to ~/.Xresources ^fg(Khaki)dzen2.font: -*-fixed-*-*-*-*-*-*-*-*-*-*-*-* ^fg(Khaki)dzen2.foreground: #22EE11 ^fg(Khaki)dzen2.background: black ^fg(#6fbf47)Window layout ^fg(#6fbf47)------------- Dzen's window layout is as follows: ^fg(red) ------------------------------------------ ^fg(red) | Title window, single line | ^fg(red) `------------------------------------------´ ^fg(#6fbf47) | | ^fg(#6fbf47) | scrollable | ^fg(#6fbf47) | Slave window | ^fg(#6fbf47) | multiple lines | ^fg(#6fbf47) | lines to display simultaneously | ^fg(#6fbf47) | controlled with the | ^fg(#6fbf47) | '-l' option | ^fg(#6fbf47) | | ^fg(#6fbf47) | | ^fg(#6fbf47) `------------------------------------------´ The first line you provide to dzen always goes to the title window, all other consecutive lines will be drawn to the slave window unless you explicitly overide this with the ^fg(#6fbf47)(5) In-text formating language ^fg()command ^^tw(). ^fg(#6fbf47)QA: ^fg(#6fbf47)--- Q1: I don't want a slave window, what to do? A1: Do not provide the '-l' option, all lines will be displayed in the title window, this is the default behaviour. Q2: I used the '-l' option but no slave window appears. A2: With the default event/action handling the slave window will only be displayed if you hoover with the mouse over the title window. See ^fg(#6fbf47)(2) Events and actions ^fg()if you'd like to change this. Q3: If I echo some text or cat a file dzen closes itself imediatelly. A3: There are 2 different approaches dzen uses to terminate itself, see next section ^fg(#6fbf47)Termination^fg(). Q4: Ok, the title and slave thing works, can I update the contents of both windows at the same time? A4: Sure, see ^fg(#6fbf47)(4) Simultaneous updates ^fg()or use the in-text command ^^tw() to explicitly draw to the title windwow. See ^fg(#6fbf47)(5) In-Text formating language ^fg()for further details Q5: Can i chnage color of my input at runtime? A5: Yes, you can change both background and foreground colors and much more See ^fg(#6fbf47)(5) In-Text formating language^fg(). Q6: Can I use dzen as a menu? A6: Yes, both vertical and horizontal menus are supported. See ^fg(#6fbf47)(3) Menu ^fg()for further details. ^fg(#6fbf47)Termination: ^fg(#6fbf47)------------ dzen uses two different approaches to terminate itself: ^co(4x4) Timed termination: if EOF is received -> terminate - unless the '-p' option is set · '-p' without argument persist forever · '-p' with argument n persist for n seconds ^co(4x4) Interactive termination: if mouse button3 is clicked -> terminate - this is the default behaviour, ^fg(#6fbf47)see (2) - in some modes the Escape key terminates too, ^fg(#6fbf47)see (2) ^fg(#6fbf47)Return values: ^fg(#6fbf47)-------------- 0 - dzen received EOF 1 - some error occured, inspect the error message user defined - set with 'exit:retval' action, ^fg(#6fbf47)see (2) ^fg(#6fbf47)(1) Option "-l": Slave window ^fg(#6fbf47)-------------------------------- 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). ^fg(#6fbf47)(2) Option '-e': Events and actions ^fg(#6fbf47)----------------------------------- 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. (By default limited to 64 each, easily changable in action.h) An example: ^fg(grey70) -e 'button1=exec:xterm:firefox;entertitle=uncollapse,unhide;button3=exit' Meaning: ^fg(grey70)button1=exec:xterm:firefox; on Button1 event (Button1 press on the mouse) execute xterm and firefox. ^fg(Khaki)Note: xterm and firefox are options to the exec action ^fg(grey70)entertitle=uncollapse,unhide; on entertitle (mouse pointer enters the title window) uncollapse slave window and unhide the title window ^fg(grey70)button3=exit on button3 event exit dzen ^fg(#6fbf47)Supported events: ^fg(#6fbf47)----------------- onstart Perform actions right after startup onexit Perform actions just before exiting onnewinput Perform actions if there is new input for the slave window button1 Mouse button1 released button2 Mouse button2 released button3 Mouse button3 released button4 Mouse button4 released (usually scrollwheel) button5 Mouse button5 released (usually scrollwheel) button6 Mouse button6 released button7 Mouse button7 released 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 key_KEYNAME Keyboard events (*) ^fg(#6fbf47)(*) Keyboard events: ^fg(#6fbf47)-------------------- Every key can be bound to an action (see below). The format is: key_KEYNAME where KEYNAME is the name of the key as defined in keysymdef.h (usually: /usr/include/X11/keysymdef.h). The part after 'XK_' in keysymdef.h must be used for KEYNAME. ^fg(#6fbf47)Supported actions: ^fg(#6fbf47)------------------ 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 togglecollapse toggle collapsed state stick stick slave window unstick unstick slave window togglestick toggle sticky state hide hide title window unhide unhide title window togglehide toggle hide state raise raise window to view (above all others) lower lower window (behind all others) scrollhome show head of input scrollend show tail of input scrollup:n scroll slave window n lines up (default n=1) scrolldown:n scroll slave window n lines down (default n=1) grabkeys enable keyboard support ungrabkeys disable keyboard support grabmouse enable mouse support only needed with specific windowmanagers, such as fluxbox ungrabmouse release mouse only needed with specific windowmanagers, such as fluxbox ^fg(Khaki)Note: If no events/actions are specified dzen defaults to: ^fg(#6fbf47)Title only mode: ^fg(#6fbf47)---------------- -e 'button3=exit:13' ^fg(#6fbf47)Multiple lines and vertical menu mode: ^fg(#6fbf47)-------------------------------------- -e 'entertitle=uncollapse,grabkeys; enterslave=grabkeys;leaveslave=collapse,ungrabkeys; button1=menuexec;button2=togglestick;button3=exit:13; button4=scrollup;button5=scrolldown; key_Escape=ungrabkeys,exit' ^fg(#6fbf47)Horizontal menu mode: ^fg(#6fbf47)--------------------- -e 'enterslave=grabkeys;leaveslave=ungrabkeys; button4=scrollup;button5=scrolldown; key_Left=scrollup;key_Right=scrolldown; button1=menuexec;button3=exit:13 key_Escape=ungrabkeys,exit' ^fg(Khaki)If you define any events/actions, there is no default behaviour, ^fg(Khaki)i.e. you will have to specify _all_ events/actions you want to ^fg(Khaki)use. ^fg(#6fbf47)(3) Option '-m', Menu ^fg(#6fbf47)--------------------- Dzen provides two menu modes, vertical and horizontal menus. You can access these modes by adding 'v'(ertical) or 'h'(orizontal) to the '-m' option. If nothing is specified dzen defaults to vertical menus. Vertical menu, both invocations are equivalent: ^fg(grey70)dzen2 -p -l 4 -m < file ^fg(grey70)dzen2 -p -l 4 -m v < file Horizontal menu: ^fg(grey70)dzen2 -p -l 4 -m h < file All actions beginning with "menu" work on the selected menu entry. ^fg(Khaki)Note: Menu mode only makes sense if '-l <n>' is specified! ^fg(Khaki)Horizontal menus have no title window, so all actions ^fg(Khaki)affecting the title window will be silently discarded ^fg(Khaki)in this mode. ^fg(#6fbf47)(4) Option '-u', Simultaneous updates ^fg(#6fbf47)------------------------------------- This option provides facilities to update the title and slave window at the same time. The way it works is best described by an example: Motivation: We want to display an updating clock in the title and some log output in the slave window. Solution: ^fg(grey70)while true; do ^fg(grey70)date # output goes to the title window ^fg(grey70)dmesg | tail -n 10 # output goes to the slave window ^fg(grey70)sleep 1 ^fg(grey70)done | dzen2 -l 10 -u For this to work correctly it is essential to provide exactly the number of lines to the slave window as defined by the parameter to '-l'. ^fg(#6fbf47)(5) In-text formating language: ^fg(#6fbf47)------------------------------- This feature allows to dynamically (at runtime) format the text dzen displays. Currently the following commands are supported: Colors: ------- ^^fg(color) set foreground color ^^fg() without arguments, sets default fg color ^^bg(color) set background color ^^bg() without arguments, sets default bg color Graphics: --------- ^^i(path) draw icon specified by path Supported formats: XBM and optionally XPM ^^r(WIDTHxHEIGHT) draw a rectangle with the dimensions WIDTH and HEIGHT ^^ro(WIDTHxHEIGHT) rectangle outline ^^c(RADIUS) draw a circle with size RADIUS pixels ^^co(RADIUS) circle outline Positioning: ------------ ^^p(PIXEL) position next input amount of PIXELs to the right or left of the current position a.k.a. relative positioning ^^pa(PIXEL) position next input at PIXEL a.k.a. absolute positioning For maximum predictability ^^pa() should only be used with '-ta l' or '-sa l' Other: ------ ^^tw() draw to title window This command has some annoyances, as only the input after the command will be drawn to the title window, so it is best used only once and as first command per line Subject to be improved in the future. ^^cs() clear slave window This command must be the first and only command per line. ^^ib(VALUE) ignore background setting, VALUE can be either 1 to ignore or 0 to not ignore the bg color set with ^^bg(color) This command is useful in combination with ^^pa() in order to position the input inside other already drawn input. Example: ^^ib(1)^^fg(red)^^ro(100x15)^^p(-98)^^fg(blue)^^r(20x10)^^fg(orange)^^p(3)^^r(40x10)^^p(4)^^fg(darkgreen)^^co(12)^^p(2)^^c(10) Giving: ^ib(1)^fg(red)^ro(100x15)^p(-98)^fg(blue)^r(20x10)^fg(orange)^p(3)^r(40x10)^p(4)^fg(darkgreen)^co(12)^p(2)^c(10) These commands can appear anywhere and in any combination in dzen's input. The color can be specified either as symbolic name (e.g. red, darkgreen, etc.) or as #rrggbb hex-value (e.g. #ffffaa). Icons must be in the XBM or optionally XPM format, see the "bitmaps" directory for some sample icons. With the standard "bitmap" application you can easily draw your own icons. ^fg(Khaki)Note: Displaying XPM (pixmap) files imposes a somewhat ^fg(Khaki)higher load than lightweight XBM files, so use ^fg(Khaki)them with care in tight loops. Doubling the '^^' character removes the special meaning from it. Some examples: Input: ^^fg(red)I'm red text ^^fg(blue)I am blue Resulting in: ^fg(red)I'm red text ^fg(blue)I am blue Input: ^^bg(#ffaaaa)The ^^fg(yellow)text to ^^bg(blue)^^fg(orange)colorize Resulting in: ^bg(#ffaaaa)The ^fg(yellow)text to ^bg(blue)^fg(orange)colorize Input: ^^fg(white)Some text containing ^^^^ characters Resulting in: ^fg(white)Some text containing ^^ characters Input for icons: ^^i(bitmaps/envelope.xbm) I am an envelope ^^fg(yellow)and ^^i(bitmaps/battery.xbm) I'm a baterry. Resulting in: ^i(bitmaps/envelope.xbm) I am an envelope ^fg(yellow)and ^i(bitmaps/battery.xbm) I'm a baterry. Input for rectangles: 6x4 rectangle ^^r(6x4) ^^fg(red)12x8 ^^r(12x8) ^^fg(yellow)and finally 100x15 ^^r(100x15) Resulting in: 6x4 rectangle ^r(6x4) ^fg(red)12x8 ^r(12x8) ^fg(yellow)and finally 100x15 ^r(100x15) Input for relative positioning: Some text^^p(100)^^fg(yellow)100 pixels to the right^^p(50)^^fg(red)50 more pixels to the right Resulting in: Some text^p(100)^fg(yellow)100 pixels to the right^p(50)^fg(red)50 more pixels to the right ^fg(#6fbf47)Examples: ^fg(#6fbf47)--------- ^co(4x4) Display message and timeout after 10 seconds: ^fg(grey85) (echo "This is a message"; sleep 10) | dzen2 -bg darkred -fg grey85 -fn fixed ^co(4x4) Display message and never timeout: ^fg(grey85) echo "This is a message"| dzen2 -p ^co(4x4) Display updating single line message: ^fg(grey85) for i in $(seq 1 20); do A=${A}'='; print $A; sleep 1; done | dzen2 ^co(4x4) Display header and a message with multiple lines: ^fg(grey85) (echo Header; cal; sleep 20) | dzen2 -l 8 Displays "Header" in the title window and the output of cal in the 8 lines high slave window. ^co(4x4) Display updating messages: ^fg(grey85) (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. ^co(4x4) Display log files: ^fg(grey85) (su -c "echo LOGFILENAME; tail -f /var/log/messages") | dzen2 -l 20 -x 100 -y 300 -w 500 ^co(4x4) Monthly schedule with remind: ^fg(grey85) (echo Monthly Schedule; remind -c1 -m) | dzen2 -l 52 -w 410 -p -fn lime -bg '#e0e8ea' -fg black -x 635 ^co(4x4) Simple menu: ^fg(grey85) echo "Applications" | dzen2 -l 4 -p -m < menufile ^co(4x4) Horizontal menu without any files: ^fg(grey85) {echo Menu; echo -e "xterm\nxclock\nxeyes\nxfontsel"} | dzen2 -l 4 -m h -p ^co(4x4) Extract PIDs from the process table: ^fg(grey85) {echo Procs; ps -a} | dzen2 -m -l 12 -p \ ^fg(grey85) -e 'button1=menuprint;button3=exit;button4=scrollup:3;button5=scrolldown:3;entertitle=uncollapse;leaveslave=collapse' \ ^fg(grey85) | awk '{print $1}' ^co(4x4) Dzen as xmonad (see http://xmonad.org) statusbar: ^fg(grey85) status.sh | dzen2 -ta r -fn '-*-profont-*-*-*-*-11-*-*-*-*-*-iso8859' -bg '#aecf96' -fg black \ ^fg(grey85) -p -e 'sigusr1=raise;sigusr2=lower;onquit=exec:rm /tmp/dzen2-pid;button3=exit' & echo $! > /tmp/dzen2-pid Have fun. 070701303F14D9000081A40000420C00000032000000015240109300000262000000080000001100000000000000000000001E00000000dzen2-1379930259.488ab66/TODO# documentation o `-dock' and `-geometry' options are undocumented # X related o XRandR support (MEDIUM PRIORITY) o cache XPM files in order to improve drawing performace (HIGH PRIORITY, done in svn trunk) # extend available actions o set font action (LOW PRIORITY) o any other useful action (LOW PRIORITY) # user interface o improve in-text command to draw to the title window (MEDIUM PRIORITY, done in svn trunk) o auto fit window width to text length (MEDIUM PRIORITY, done in svn trunk) 070701303F14DA000081A40000420C00000032000000015240109300002B5E000000080000001100000000000000000000002200000000dzen2-1379930259.488ab66/action.c/* * (C)opyright 2007-2009 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[] = { { "onstart", onstart}, { "onexit", onexit}, { "onnewinput", onnewinput}, { "button1", button1}, { "button2", button2}, { "button3", button3}, { "button4", button4}, { "button5", button5}, { "button6", button6}, { "button7", button7}, { "entertitle", entertitle}, { "leavetitle", leavetitle}, { "enterslave", enterslave}, { "leaveslave", leaveslave}, { "sigusr1", sigusr1}, { "sigusr2", sigusr2}, { "keymarker", keymarker}, { 0, 0 } }; struct action_lookup ac_lookup_table[] = { { "print", a_print }, { "exec", a_exec}, { "exit", a_exit}, { "collapse", a_collapse}, { "uncollapse", a_uncollapse}, { "togglecollapse", a_togglecollapse}, { "stick", a_stick}, { "unstick", a_unstick}, { "togglestick", a_togglestick}, { "hide", a_hide}, { "unhide", a_unhide}, { "togglehide", a_togglehide}, { "scrollup", a_scrollup}, { "scrolldown", a_scrolldown}, { "menuprint", a_menuprint}, { "menuprint_noparse", a_menuprint_noparse}, { "menuexec", a_menuexec}, { "raise", a_raise}, { "lower", a_lower}, { "scrollhome", a_scrollhome}, { "scrollend", a_scrollend}, { "grabkeys", a_grabkeys}, { "ungrabkeys", a_ungrabkeys}, { "grabmouse", a_grabmouse}, { "ungrabmouse", a_ungrabmouse}, { 0, 0 } }; ev_list *head = NULL; static int new_event(long evid) { ev_list *item, *newitem; if(!head) { head = emalloc(sizeof (ev_list)); head->id = evid; head->next = NULL; } else { item = head; /* check if we already handle this event */ while(item) { if(item->id == evid) return 0; item = item->next; } item = head; while(item->next) item = item->next; newitem = emalloc(sizeof (ev_list)); newitem->id = evid; item->next = newitem; newitem->next = NULL; } return 0; } static void add_handler(long evid, int hpos, handlerf* hcb) { ev_list *item; item = head; while(item) { if(item->id == evid) { if(hpos < MAXACTIONS) { item->action[hpos] = emalloc(sizeof(As)); item->action[hpos]->handler = hcb; } break; } item = item->next; } } static void add_option(long evid, int hpos, int opos, char* opt) { ev_list *item; item = head; while(item) { if(item->id == evid) { if(opos < MAXOPTIONS) { item->action[hpos]->options[opos] = estrdup(opt); item->action[hpos]->options[opos+1] = NULL; } break; } item = item->next; } } int find_event(long evid) { ev_list *item; item = head; while(item) { if(item->id == evid) return item->id; item = item->next; } return -1; } void do_action(long evid) { int i; ev_list *item; item = head; while(item) { if(item->id == evid) break; item = item->next; } if(item) { for(i=0; item->action[i]->handler; i++) { item->action[i]->handler(item->action[i]->options); } } } int get_ev_id(const char *evname) { int i; KeySym ks; /* check for keyboard event */ if((!strncmp(evname, "key_", 4)) && ((ks = XStringToKeysym(evname+4)) != NoSymbol)) { return ks+keymarker; } /* own events */ for(i=0; ev_lookup_table[i].name; i++) { if(strncmp(ev_lookup_table[i].name, evname, strlen(ev_lookup_table[i].name)) == 0) return ev_lookup_table[i].id; } return -1; } handlerf * get_action_handler(const 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 NULL; } void free_event_list(void) { int i; ev_list *item; item = head; while(item) { for(i=0; item->action[i]->handler; i++) free(item->action[i]); item = item->next; } } void fill_ev_table(char *input) { char *str1, *str2, *str3, *str4, *token, *subtoken, *kommatoken, *dptoken; char *saveptr1=NULL, *saveptr2=NULL, *saveptr3=NULL, *saveptr4=NULL; int j, i=0, k=0; long eid=0; handlerf *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) { if((ah = get_action_handler(dptoken)) != NULL) { new_event(eid); add_handler(eid, i, ah); i++; } } else if(str4 != token && eid != -1 && ah) { add_option(eid, i-1, k, dptoken); k++; } else if(!ah) break; } k=0; } new_event(eid); add_handler(eid, i, NULL); i=0; } } } /* 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[]){ (void)opt; if(!dzen.slave_win.ishmenu && dzen.slave_win.max_lines && !dzen.slave_win.issticky) { XUnmapWindow(dzen.dpy, dzen.slave_win.win); } return 0; } int a_uncollapse(char * opt[]){ int i; (void)opt; if(!dzen.slave_win.ishmenu && 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++) XMapWindow(dzen.dpy, dzen.slave_win.line[i]); } return 0; } int a_togglecollapse(char * opt[]){ XWindowAttributes wa; (void)opt; if(dzen.slave_win.max_lines && (XGetWindowAttributes(dzen.dpy, dzen.slave_win.win, &wa), wa.map_state == IsUnmapped)) a_uncollapse(NULL); else a_collapse(NULL); return 0; } int a_stick(char * opt[]) { (void)opt; if(!dzen.slave_win.ishmenu && dzen.slave_win.max_lines) dzen.slave_win.issticky = True; return 0; } int a_unstick(char * opt[]) { (void)opt; if(!dzen.slave_win.ishmenu && dzen.slave_win.max_lines) dzen.slave_win.issticky = False; return 0; } int a_togglestick(char * opt[]) { (void)opt; if(!dzen.slave_win.ishmenu && dzen.slave_win.max_lines) dzen.slave_win.issticky = dzen.slave_win.issticky ? False : True; return 0; } static void scroll(int n) { if(dzen.slave_win.tcnt <= dzen.slave_win.max_lines) return; if(dzen.slave_win.first_line_vis + n < 0) { dzen.slave_win.first_line_vis = 0; dzen.slave_win.last_line_vis = dzen.slave_win.max_lines; } else if(dzen.slave_win.last_line_vis + n > dzen.slave_win.tcnt) { 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; } else { dzen.slave_win.first_line_vis += n; dzen.slave_win.last_line_vis += n; } x_draw_body(); } int a_scrollup(char * opt[]) { int n=1; if(opt[0]) n = atoi(opt[0]); if(dzen.slave_win.max_lines) scroll(-1*n); return 0; } int a_scrolldown(char * opt[]) { int n=1; if(opt[0]) n = atoi(opt[0]); if(dzen.slave_win.max_lines) scroll(n); return 0; } int a_hide(char * opt[]) { int n=1; printf("n:%d\n", n); if(!dzen.title_win.ishidden) { if(!dzen.slave_win.ishmenu) XResizeWindow(dzen.dpy, dzen.title_win.win, dzen.title_win.width, 1); else XResizeWindow(dzen.dpy, dzen.slave_win.win, dzen.title_win.width, 1); dzen.title_win.ishidden = True; } return 0; } int a_unhide(char * opt[]) { (void)opt; if(dzen.title_win.ishidden) { if(!dzen.slave_win.ishmenu) XResizeWindow(dzen.dpy, dzen.title_win.win, dzen.title_win.width, dzen.line_height); else XResizeWindow(dzen.dpy, dzen.slave_win.win, dzen.title_win.width, dzen.line_height); dzen.title_win.ishidden = False; } return 0; } int a_togglehide(char * opt[]) { dzen.title_win.ishidden ? a_unhide(NULL) : a_hide(opt); 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]); fflush(stdout); return 0; } int a_menuprint(char * opt[]) { char *text; int i; 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) { text = parse_line(NULL, dzen.slave_win.sel_line, 0, 0, 1); printf("%s", text); if(opt) for(i=0; opt[i]; ++i) printf("%s", opt[i]); puts(""); fflush(stdout); dzen.slave_win.sel_line = -1; free(text); } return 0; } int a_menuprint_noparse(char * opt[]) { int i; 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) { printf("%s", dzen.slave_win.tbuf[dzen.slave_win.sel_line]); if(opt) for(i=0; opt[i]; ++i) printf("%s", opt[i]); puts(""); fflush(stdout); dzen.slave_win.sel_line = -1; } return 0; } int a_menuexec(char * opt[]) { char *text; (void)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) { text = parse_line(NULL, dzen.slave_win.sel_line, 0, 0, 1); spawn(text); dzen.slave_win.sel_line = -1; free(text); } return 0; } int a_raise(char * opt[]) { (void)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[]) { (void)opt; XLowerWindow(dzen.dpy, dzen.title_win.win); if(dzen.slave_win.max_lines) XLowerWindow(dzen.dpy, dzen.slave_win.win); return 0; } int a_scrollhome(char * opt[]) { (void)opt; if(dzen.slave_win.max_lines) { dzen.slave_win.first_line_vis = 0; dzen.slave_win.last_line_vis = dzen.slave_win.max_lines; x_draw_body(); } return 0; } int a_scrollend(char * opt[]) { (void)opt; if(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; x_draw_body(); } return 0; } int a_grabkeys(char * opt[]) { (void)opt; XGrabKeyboard(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), True, GrabModeAsync, GrabModeAsync, CurrentTime); return 0; } int a_ungrabkeys(char * opt[]) { (void)opt; XUngrabKeyboard(dzen.dpy, CurrentTime); return 0; } int a_grabmouse(char * opt[]) { (void)opt; XGrabPointer(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), True, ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); return 0; } int a_ungrabmouse(char * opt[]) { (void)opt; XUngrabPointer(dzen.dpy, CurrentTime); return 0; } 070701303F14DB000081A40000420C000000320000000152401093000006F0000000080000001100000000000000000000002200000000dzen2-1379930259.488ab66/action.h/* * (C)opyright 2007-2009 Robert Manea <rob dot manea at gmail dot com> * See LICENSE file for license details. * */ #define MAXACTIONS 64 #define MAXOPTIONS 64 /* Event, Action data structures */ typedef struct AS As; typedef struct _ev_list ev_list; typedef int handlerf(char **); enum ev_id { /* startup, exit, input */ onstart, onexit, onnewinput, /* mouse buttons */ button1, button2, button3, button4, button5, button6, button7, /* entering/leaving windows */ entertitle, leavetitle, enterslave, leaveslave, /* external signals */ sigusr1, sigusr2, /* key event marker * must always be the last entry */ keymarker }; struct _ev_list { long id; As *action[MAXACTIONS]; ev_list *next; }; struct event_lookup { const char *name; long id; }; struct action_lookup { const char *name; int (*handler)(char **); }; struct AS { char *options[MAXOPTIONS]; int (*handler)(char **); }; /* utility functions */ void do_action(long); int get_ev_id(const char *); handlerf *get_action_handler(const char *); void fill_ev_table(char *); void free_event_list(void); int find_event(long); /* action handlers */ int a_print(char **); int a_exit(char **); int a_exec(char **); int a_collapse(char **); int a_uncollapse(char **); int a_togglecollapse(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_togglehide(char **); int a_menuprint(char **); int a_menuprint_noparse(char **); int a_menuexec(char **); int a_raise(char **); int a_lower(char **); int a_scrollhome(char **); int a_scrollend(char **); int a_grabkeys(char **); int a_ungrabkeys(char **); int a_grabmouse(char **); int a_ungrabmouse(char **); 07070121B50EA2000041ED0000420C00000032000000025240109300000000000000080000001100000000000000000000002100000000dzen2-1379930259.488ab66/bitmaps07070121B50EA3000081A40000420C0000003200000001524010930000011F000000080000001100000000000000000000002B00000000dzen2-1379930259.488ab66/bitmaps/alert.xbm#define alert_width 16 #define alert_height 16 static unsigned char alert_bits[] = { 0xff, 0xff, 0x01, 0xf8, 0xf1, 0xf9, 0xe1, 0xc1, 0xe1, 0xc1, 0xe1, 0xc1, 0xe1, 0xc1, 0xe1, 0xc1, 0xe1, 0xc1, 0xe1, 0xc1, 0x01, 0xc0, 0xe1, 0xc1, 0xe1, 0xc1, 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff}; 07070121B50EA4000081A40000420C000000320000000152401093000001B5000000080000001100000000000000000000002A00000000dzen2-1379930259.488ab66/bitmaps/ball.xbm#define ball_width 19 #define ball_height 19 static unsigned char ball_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xe0, 0x3f, 0x00, 0xf0, 0x7f, 0x00, 0x78, 0xfc, 0x00, 0x38, 0xf8, 0x00, 0x7c, 0xfe, 0x01, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x01, 0xf8, 0xff, 0x00, 0xf8, 0xff, 0x00, 0xf0, 0x7f, 0x00, 0xe0, 0x3f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; 07070121B50EA5000081A40000420C00000032000000015240109300000119000000080000001100000000000000000000002D00000000dzen2-1379930259.488ab66/bitmaps/battery.xbm#define battery_width 15 #define battery_height 15 static unsigned char battery_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0xfc, 0x08, 0xfc, 0x38, 0xfc, 0x38, 0xfc, 0x08, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 07070121B50EA6000081A40000420C0000003200000001524010930000011C000000080000001100000000000000000000002E00000000dzen2-1379930259.488ab66/bitmaps/envelope.xbm#define envelope_width 15 #define envelope_height 15 static unsigned char envelope_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x0c, 0x18, 0x1c, 0x1c, 0x34, 0x16, 0xc4, 0x11, 0x84, 0x10, 0x04, 0x10, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 07070121B50EA7000081A40000420C00000032000000015240109300000121000000080000001100000000000000000000002B00000000dzen2-1379930259.488ab66/bitmaps/music.xbm#define music_width 16 #define music_height 16 static unsigned char music_bits[] = { 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x03, 0x20, 0x1f, 0x20, 0x1c, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x2c, 0x10, 0x3e, 0x10, 0x1e, 0x16, 0x0c, 0x1f, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x00 }; 07070121B50EA8000081A40000420C00000032000000015240109300000121000000080000001100000000000000000000002B00000000dzen2-1379930259.488ab66/bitmaps/pause.xbm#define pause_width 16 #define pause_height 16 static unsigned char pause_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 07070121B50EA9000081A40000420C0000003200000001524010930000011E000000080000001100000000000000000000002A00000000dzen2-1379930259.488ab66/bitmaps/play.xbm#define play_width 16 #define play_height 16 static unsigned char play_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x78, 0x00, 0xf8, 0x01, 0xf8, 0x07, 0xf8, 0x1f, 0xf8, 0x1f, 0xf8, 0x07, 0xf8, 0x01, 0x78, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 07070121B50EAA000081A40000420C00000032000000015240109300000122000000080000001100000000000000000000002C00000000dzen2-1379930259.488ab66/bitmaps/volume.xbm#define volume_width 16 #define volume_height 16 static unsigned char volume_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x1b, 0x60, 0x1b, 0x60, 0x1b, 0x6c, 0x1b, 0x6c, 0x1b, 0x6c, 0x1b, 0x60, 0x1b, 0x60, 0x1b, 0x00, 0x1b, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 070701303F14DC000081A40000420C000000320000000152401093000009CF000000080000001100000000000000000000002300000000dzen2-1379930259.488ab66/config.mk# dzen version VERSION = 0.9.5-svn # 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} # Configure the features you want to be supported # Only one of the following options has to be uncommented, # all others must be commented! # # Uncomment: Remove # from the beginning of respective lines # Comment : Add # to the beginning of the respective lines ## Option 1: No Xinerama no XPM no XFT #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 #CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" ## Option 2: No Xinerama with XPM #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXpm #CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XPM # Option 3: With Xinerama no XPM #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXinerama #CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XINERAMA ## Option 4: With Xinerama and XPM #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXinerama -lXpm #CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XINERAMA -DDZEN_XPM ## Option 5: With XFT LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 `pkg-config --libs xft` CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XFT `pkg-config --cflags xft` ## Option 6: With XPM and XFT #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXpm `pkg-config --libs xft` #CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XPM -DDZEN_XFT `pkg-config --cflags xft` ## Option 7: With Xinerama and XFT #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXinerama `pkg-config --libs xft` #CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XINERAMA -DDZEN_XFT `pkg-config --cflags xft` ## Option 8: With Xinerama and XPM and XFT #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXinerama -lXpm `pkg-config --libs xft` #CFLAGS = -Wall -Os ${INCS} -DVERSION=\"${VERSION}\" -DDZEN_XINERAMA -DDZEN_XPM -DDZEN_XFT `pkg-config --cflags xft` # END of feature configuration LDFLAGS = ${LIBS} # Solaris, uncomment for Solaris #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" #LDFLAGS = ${LIBS} #CFLAGS += -xtarget=ultra # Debugging #CFLAGS = ${INCS} -DVERSION=\"${VERSION}\" -std=gnu89 -pedantic -Wall -W -Wundef -Wendif-labels -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wdisabled-optimization -O2 -pipe -DDZEN_XFT `pkg-config --cflags xft` #LDFLAGS = ${LIBS} # compiler and linker CC = gcc LD = ${CC} 070701303F14DD000081A40000420C000000320000000152401093000063EF000000080000001100000000000000000000002000000000dzen2-1379930259.488ab66/draw.c /* * (C)opyright 2007-2009 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> #ifdef DZEN_XPM #include <X11/xpm.h> #endif #define ARGLEN 256 #define MAX_ICON_CACHE 32 #define MAX(a,b) ((a)>(b)?(a):(b)) #define LNR2WINDOW(lnr) lnr==-1?0:1 typedef struct ICON_C { char name[ARGLEN]; Pixmap p; int w, h; } icon_c; icon_c icons[MAX_ICON_CACHE]; int icon_cnt; int otx; int xorig[2]; sens_w window_sens[2]; /* command types for the in-text parser */ enum ctype {bg, fg, icon, rect, recto, circle, circleo, pos, abspos, titlewin, ibg, fn, fixpos, ca, ba}; struct command_lookup { const char *name; int id; int off; }; struct command_lookup cmd_lookup_table[] = { { "fg(", fg, 3}, { "bg(", bg, 3}, { "i(", icon, 2}, { "r(", rect, 2}, { "ro(", recto, 3}, { "c(", circle, 2}, { "co(", circleo, 3}, { "p(", pos, 2}, { "pa(", abspos, 3}, { "tw(", titlewin, 3}, { "ib(", ibg, 3}, { "fn(", fn, 3}, { "ca(", ca, 3}, { "ba(", ba, 3}, { 0, 0, 0} }; /* positioning helpers */ enum sctype {LOCK_X, UNLOCK_X, TOP, BOTTOM, CENTER, LEFT, RIGHT}; int get_tokval(const char* line, char **retdata); int get_token(const char* line, int * t, char **tval); static unsigned int textnw(Fnt *font, const char *text, unsigned int len) { #ifndef DZEN_XFT XRectangle r; if(font->set) { XmbTextExtents(font->set, text, len, NULL, &r); return r.width; } return XTextWidth(font->xfont, text, len); #else XftTextExtentsUtf8(dzen.dpy, dzen.font.xftfont, (unsigned const char *) text, strlen(text), dzen.font.extents); if(dzen.font.extents->height > dzen.font.height) dzen.font.height = dzen.font.extents->height; return dzen.font.extents->xOff; #endif } void drawtext(const char *text, int reverse, int line, int align) { if(!reverse) { XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColBG]); XFillRectangle(dzen.dpy, dzen.slave_win.drawable[line], dzen.gc, 0, 0, dzen.w, dzen.h); XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColFG]); } else { XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColFG]); XFillRectangle(dzen.dpy, dzen.slave_win.drawable[line], dzen.rgc, 0, 0, dzen.w, dzen.h); XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]); } parse_line(text, line, align, reverse, 0); } long getcolor(const char *colstr) { Colormap cmap = DefaultColormap(dzen.dpy, dzen.screen); XColor color; if(!XAllocNamedColor(dzen.dpy, cmap, colstr, &color, &color)) return -1; return color.pixel; } void setfont(const char *fontstr) { #ifndef DZEN_XFT 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("dzen: 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; #else if(dzen.font.xftfont) XftFontClose(dzen.dpy, dzen.font.xftfont); dzen.font.xftfont = XftFontOpenXlfd(dzen.dpy, dzen.screen, fontstr); if(!dzen.font.xftfont) dzen.font.xftfont = XftFontOpenName(dzen.dpy, dzen.screen, fontstr); if(!dzen.font.xftfont) eprint("error, cannot load font: '%s'\n", fontstr); dzen.font.extents = malloc(sizeof(XGlyphInfo)); XftTextExtentsUtf8(dzen.dpy, dzen.font.xftfont, (unsigned const char *) fontstr, strlen(fontstr), dzen.font.extents); dzen.font.height = dzen.font.xftfont->ascent + dzen.font.xftfont->descent; dzen.font.width = (dzen.font.extents->width)/strlen(fontstr); #endif } int get_tokval(const char* line, char **retdata) { int i; char tokval[ARGLEN]; for(i=0; i < ARGLEN && (*(line+i) != ')'); i++) tokval[i] = *(line+i); tokval[i] = '\0'; *retdata = strdup(tokval); return i+1; } int get_token(const char *line, int * t, char **tval) { int off=0, next_pos=0, i; char *tokval = NULL; if(*(line+1) == ESC_CHAR) return 0; line++; for(i=0; cmd_lookup_table[i].name; ++i) { if( off=cmd_lookup_table[i].off, !strncmp(line, cmd_lookup_table[i].name, off) ) { next_pos = get_tokval(line+off, &tokval); *t = cmd_lookup_table[i].id; break; } } *tval = tokval; return next_pos+off; } static void setcolor(Drawable *pm, int x, int width, long tfg, long tbg, int reverse, int nobg) { if(nobg) return; XSetForeground(dzen.dpy, dzen.tgc, reverse ? tfg : tbg); XFillRectangle(dzen.dpy, *pm, dzen.tgc, x, 0, width, dzen.line_height); XSetForeground(dzen.dpy, dzen.tgc, reverse ? tbg : tfg); XSetBackground(dzen.dpy, dzen.tgc, reverse ? tfg : tbg); } int get_sens_area(char *s, int *b, char *cmd) { memset(cmd, 0, 1024); sscanf(s, "%5d", b); char *comma = strchr(s, ','); if (comma != NULL) strncpy(cmd, comma+1, 1024); return 0; } static int get_rect_vals(char *s, int *w, int *h, int *x, int *y) { *w=*h=*x=*y=0; return sscanf(s, "%5dx%5d%5d%5d", w, h, x, y); } static int get_circle_vals(char *s, int *d, int *a) { int ret; *d=*a=ret=0; return sscanf(s, "%5d%5d", d, a); } static int get_pos_vals(char *s, int *d, int *a) { int i=0, ret=3, onlyx=1; char buf[128]; *d=*a=0; if(s[0] == '_') { if(!strncmp(s, "_LOCK_X", 7)) { *d = LOCK_X; } if(!strncmp(s, "_UNLOCK_X", 8)) { *d = UNLOCK_X; } if(!strncmp(s, "_LEFT", 5)) { *d = LEFT; } if(!strncmp(s, "_RIGHT", 6)) { *d = RIGHT; } if(!strncmp(s, "_CENTER", 7)) { *d = CENTER; } if(!strncmp(s, "_BOTTOM", 7)) { *d = BOTTOM; } if(!strncmp(s, "_TOP", 4)) { *d = TOP; } return 5; } else { for(i=0; s[i] && i<128; i++) { if(s[i] == ';') { onlyx=0; break; } else buf[i]=s[i]; } if(i) { buf[i]='\0'; *d=atoi(buf); } else ret=2; if(s[++i]) { *a=atoi(s+i); } else ret = 1; if(onlyx) ret=1; return ret; } } static int get_block_align_vals(char *s, int *a, int *w) { char buf[32]; int r; *w = -1; r = sscanf(s, "%d,%31s", w, buf); if(!strcmp(buf, "_LEFT")) *a = ALIGNLEFT; else if(!strcmp(buf, "_RIGHT")) *a = ALIGNRIGHT; else if(!strcmp(buf, "_CENTER")) *a = ALIGNCENTER; else *a = -1; return r; } static int search_icon_cache(const char* name) { int i; for(i=0; i < MAX_ICON_CACHE; i++) if(!strncmp(icons[i].name, name, ARGLEN)) return i; return -1; } #ifdef DZEN_XPM static void cache_icon(const char* name, Pixmap pm, int w, int h) { if(icon_cnt >= MAX_ICON_CACHE) icon_cnt = 0; if(icons[icon_cnt].p) XFreePixmap(dzen.dpy, icons[icon_cnt].p); strncpy(icons[icon_cnt].name, name, ARGLEN); icons[icon_cnt].w = w; icons[icon_cnt].h = h; icons[icon_cnt].p = pm; icon_cnt++; } #endif char * parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { /* bitmaps */ unsigned int bm_w, bm_h; int bm_xh, bm_yh; /* rectangles, cirlcles*/ int rectw, recth, rectx, recty; /* positioning */ int n_posx, n_posy, set_posy=0; int px=0, py=0, opx=0; int i, next_pos=0, j=0, h=0, tw=0; /* buffer pos */ const char *linep=NULL; /* fonts */ int font_was_set=0; /* position */ int pos_is_fixed = 0; /* block alignment */ int block_align = -1; int block_width = -1; /* clickable area y tracking */ int max_y=-1; /* temp buffers */ char lbuf[MAX_LINE_LEN], *rbuf = NULL; /* parser state */ int t=-1, nobg=0; char *tval=NULL; /* X stuff */ long lastfg = dzen.norm[ColFG], lastbg = dzen.norm[ColBG]; Fnt *cur_fnt = NULL; #ifndef DZEN_XFT XGCValues gcv; #endif Drawable pm=0, bm; #ifdef DZEN_XPM int free_xpm_attrib = 0; Pixmap xpm_pm; XpmAttributes xpma; XpmColorSymbol xpms; #endif #ifdef DZEN_XFT XftDraw *xftd=NULL; XftColor xftc; char *xftcs; int xftcs_f=0; char *xftcs_bg; int xftcs_bgf=0; xftcs = (char *)dzen.fg; xftcs_bg = (char *)dzen.bg; #endif /* icon cache */ int ip; /* parse line and return the text without control commands */ if(nodraw) { rbuf = emalloc(MAX_LINE_LEN); rbuf[0] = '\0'; if( (lnr + dzen.slave_win.first_line_vis) >= dzen.slave_win.tcnt) line = NULL; else line = dzen.slave_win.tbuf[dzen.slave_win.first_line_vis+lnr]; } /* parse line and render text */ else { h = dzen.font.height; py = (dzen.line_height - h) / 2; xorig[LNR2WINDOW(lnr)] = 0; if(lnr != -1) { pm = XCreatePixmap(dzen.dpy, RootWindow(dzen.dpy, DefaultScreen(dzen.dpy)), dzen.slave_win.width, dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); } else { pm = XCreatePixmap(dzen.dpy, RootWindow(dzen.dpy, DefaultScreen(dzen.dpy)), dzen.title_win.width, dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); } #ifdef DZEN_XFT xftd = XftDrawCreate(dzen.dpy, pm, DefaultVisual(dzen.dpy, dzen.screen), DefaultColormap(dzen.dpy, dzen.screen)); #endif if(!reverse) { XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColBG]); #ifdef DZEN_XPM xpms.pixel = dzen.norm[ColBG]; #endif #ifdef DZEN_XFT xftcs_bg = (char *)dzen.bg; xftcs_bgf = 0; #endif } else { XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColFG]); #ifdef DZEN_XPM xpms.pixel = dzen.norm[ColFG]; #endif } XFillRectangle(dzen.dpy, pm, dzen.tgc, 0, 0, dzen.w, dzen.h); if(!reverse) { XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColFG]); } else { XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColBG]); } #ifdef DZEN_XPM xpms.name = NULL; xpms.value = (char *)"none"; xpma.colormap = DefaultColormap(dzen.dpy, dzen.screen); xpma.depth = DefaultDepth(dzen.dpy, dzen.screen); xpma.visual = DefaultVisual(dzen.dpy, dzen.screen); xpma.colorsymbols = &xpms; xpma.numsymbols = 1; xpma.valuemask = XpmColormap|XpmDepth|XpmVisual|XpmColorSymbols; #endif #ifndef DZEN_XFT if(!dzen.font.set){ gcv.font = dzen.font.xfont->fid; XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); } #endif cur_fnt = &dzen.font; if( lnr != -1 && (lnr + dzen.slave_win.first_line_vis >= dzen.slave_win.tcnt)) { XCopyArea(dzen.dpy, pm, dzen.slave_win.drawable[lnr], dzen.gc, 0, 0, px, dzen.line_height, xorig[LNR2WINDOW(lnr)], 0); XFreePixmap(dzen.dpy, pm); return NULL; } } linep = line; while(1) { if(*linep == ESC_CHAR || *linep == '\0') { lbuf[j] = '\0'; /* clear _lock_x at EOL so final width is correct */ if(*linep=='\0') pos_is_fixed=0; if(nodraw) { strcat(rbuf, lbuf); } else { if(t != -1 && tval) { switch(t) { case icon: if(MAX_ICON_CACHE && (ip=search_icon_cache(tval)) != -1) { int y; XCopyArea(dzen.dpy, icons[ip].p, pm, dzen.tgc, 0, 0, icons[ip].w, icons[ip].h, px, y=(set_posy ? py : (dzen.line_height >= (signed)icons[ip].h ? (dzen.line_height - icons[ip].h)/2 : 0))); px += !pos_is_fixed ? icons[ip].w : 0; max_y = MAX(max_y, y+icons[ip].h); } else { int y; if(XReadBitmapFile(dzen.dpy, pm, tval, &bm_w, &bm_h, &bm, &bm_xh, &bm_yh) == BitmapSuccess && (h/2 + px + (signed)bm_w < dzen.w)) { setcolor(&pm, px, bm_w, lastfg, lastbg, reverse, nobg); XCopyPlane(dzen.dpy, bm, pm, dzen.tgc, 0, 0, bm_w, bm_h, px, y=(set_posy ? py : (dzen.line_height >= (int)bm_h ? (dzen.line_height - (int)bm_h)/2 : 0)), 1); XFreePixmap(dzen.dpy, bm); px += !pos_is_fixed ? bm_w : 0; max_y = MAX(max_y, y+bm_h); } #ifdef DZEN_XPM else if(XpmReadFileToPixmap(dzen.dpy, dzen.title_win.win, tval, &xpm_pm, NULL, &xpma) == XpmSuccess) { setcolor(&pm, px, xpma.width, lastfg, lastbg, reverse, nobg); if(MAX_ICON_CACHE) cache_icon(tval, xpm_pm, xpma.width, xpma.height); XCopyArea(dzen.dpy, xpm_pm, pm, dzen.tgc, 0, 0, xpma.width, xpma.height, px, y=(set_posy ? py : (dzen.line_height >= (int)xpma.height ? (dzen.line_height - (int)xpma.height)/2 : 0))); px += !pos_is_fixed ? xpma.width : 0; max_y = MAX(max_y, y+xpma.height); /* freed by cache_icon() */ //XFreePixmap(dzen.dpy, xpm_pm); free_xpm_attrib = 1; } #endif } break; case rect: get_rect_vals(tval, &rectw, &recth, &rectx, &recty); recth = recth > dzen.line_height ? dzen.line_height : recth; if(set_posy) py += recty; recty = recty == 0 ? (dzen.line_height - recth)/2 : (dzen.line_height - recth)/2 + recty; px += !pos_is_fixed ? rectx : 0; setcolor(&pm, px, rectw, lastfg, lastbg, reverse, nobg); XFillRectangle(dzen.dpy, pm, dzen.tgc, px, set_posy ? py : ((int)recty < 0 ? dzen.line_height + recty : recty), rectw, recth); px += !pos_is_fixed ? rectw : 0; break; case recto: get_rect_vals(tval, &rectw, &recth, &rectx, &recty); if (!rectw) break; recth = recth > dzen.line_height ? dzen.line_height-2 : recth-1; if(set_posy) py += recty; recty = recty == 0 ? (dzen.line_height - recth)/2 : (dzen.line_height - recth)/2 + recty; px = (rectx == 0) ? px : rectx+px; /* prevent from stairs effect when rounding recty */ if (!((dzen.line_height - recth) % 2)) recty--; setcolor(&pm, px, rectw, lastfg, lastbg, reverse, nobg); XDrawRectangle(dzen.dpy, pm, dzen.tgc, px, set_posy ? py : ((int)recty<0 ? dzen.line_height + recty : recty), rectw-1, recth); px += !pos_is_fixed ? rectw : 0; break; case circle: rectx = get_circle_vals(tval, &rectw, &recth); setcolor(&pm, px, rectw, lastfg, lastbg, reverse, nobg); XFillArc(dzen.dpy, pm, dzen.tgc, px, set_posy ? py :(dzen.line_height - rectw)/2, rectw, rectw, 90*64, rectx>1?recth*64:64*360); px += !pos_is_fixed ? rectw : 0; break; case circleo: rectx = get_circle_vals(tval, &rectw, &recth); setcolor(&pm, px, rectw, lastfg, lastbg, reverse, nobg); XDrawArc(dzen.dpy, pm, dzen.tgc, px, set_posy ? py : (dzen.line_height - rectw)/2, rectw, rectw, 90*64, rectx>1?recth*64:64*360); px += !pos_is_fixed ? rectw : 0; break; case pos: if(tval[0]) { int r=0; r = get_pos_vals(tval, &n_posx, &n_posy); if( (r == 1 && !set_posy)) set_posy=0; else if (r == 5) { switch(n_posx) { case LOCK_X: pos_is_fixed = 1; break; case UNLOCK_X: pos_is_fixed = 0; break; case LEFT: px = 0; break; case RIGHT: px = dzen.w; break; case CENTER: px = dzen.w/2; break; case BOTTOM: set_posy = 1; py = dzen.line_height; break; case TOP: set_posy = 1; py = 0; break; } } else set_posy=1; if(r != 2) px = px+n_posx<0? 0 : px + n_posx; if(r != 1) py += n_posy; } else { set_posy = 0; py = (dzen.line_height - dzen.font.height) / 2; } break; case abspos: if(tval[0]) { int r=0; if( (r=get_pos_vals(tval, &n_posx, &n_posy)) == 1 && !set_posy) set_posy=0; else set_posy=1; n_posx = n_posx < 0 ? n_posx*-1 : n_posx; if(r != 2) px = n_posx; if(r != 1) py = n_posy; } else { set_posy = 0; py = (dzen.line_height - dzen.font.height) / 2; } break; case ibg: nobg = atoi(tval); break; case bg: lastbg = tval[0] ? (unsigned)getcolor(tval) : dzen.norm[ColBG]; #ifdef DZEN_XFT if(xftcs_bgf) free(xftcs_bg); if(tval[0]) { xftcs_bg = estrdup(tval); xftcs_bgf = 1; } else { xftcs_bg = (char *)dzen.bg; xftcs_bgf = 0; } #endif break; case fg: lastfg = tval[0] ? (unsigned)getcolor(tval) : dzen.norm[ColFG]; XSetForeground(dzen.dpy, dzen.tgc, lastfg); #ifdef DZEN_XFT if(tval[0]) { xftcs = estrdup(tval); xftcs_f = 1; } else { xftcs = (char *)dzen.fg; xftcs_f = 0; } #endif break; case fn: if(tval[0]) { #ifndef DZEN_XFT if(!strncmp(tval, "dfnt", 4)) { cur_fnt = &(dzen.fnpl[atoi(tval+4)]); if(!cur_fnt->set) { gcv.font = cur_fnt->xfont->fid; XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); } } else #endif setfont(tval); } else { cur_fnt = &dzen.font; #ifndef DZEN_XFT if(!cur_fnt->set){ gcv.font = cur_fnt->xfont->fid; XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); } #else setfont(dzen.fnt ? dzen.fnt : FONT); #endif } py = set_posy ? py : (dzen.line_height - cur_fnt->height) / 2; font_was_set = 1; break; case ca: ; //nop to keep gcc happy sens_w *w = &window_sens[LNR2WINDOW(lnr)]; if(tval[0]) { click_a *area = &((*w).sens_areas[(*w).sens_areas_cnt]); if((*w).sens_areas_cnt < MAX_CLICKABLE_AREAS) { get_sens_area(tval, &(*area).button, (*area).cmd); (*area).start_x = px; (*area).start_y = py; (*area).end_y = py; max_y = py; (*area).active = 0; if(lnr == -1) { (*area).win = dzen.title_win.win; } else { (*area).win = dzen.slave_win.line[lnr]; } (*w).sens_areas_cnt++; } } else { //find most recent unclosed area for(i = (*w).sens_areas_cnt - 1; i >= 0; i--) if(!(*w).sens_areas[i].active) break; if(i >= 0 && i < MAX_CLICKABLE_AREAS) { (*w).sens_areas[i].end_x = px; (*w).sens_areas[i].end_y = max_y; (*w).sens_areas[i].active = 1; } } break; case ba: if(tval[0]) get_block_align_vals(tval, &block_align, &block_width); else block_align=block_width=-1; break; } free(tval); } /* check if text is longer than window's width */ tw = textnw(cur_fnt, lbuf, strlen(lbuf)); while((((tw + px) > (dzen.w)) || (block_align!=-1 && tw>block_width)) && j>=0) { lbuf[--j] = '\0'; tw = textnw(cur_fnt, lbuf, strlen(lbuf)); } opx = px; /* draw background for block */ if(block_align!=-1 && !nobg) { setcolor(&pm, px, rectw, lastbg, lastbg, 0, nobg); XFillRectangle(dzen.dpy, pm, dzen.tgc, px, 0, block_width, dzen.line_height); } if(block_align==ALIGNRIGHT) px += (block_width - tw); else if(block_align==ALIGNCENTER) px += (block_width/2) - (tw/2); if(!nobg) setcolor(&pm, px, tw, lastfg, lastbg, reverse, nobg); #ifndef DZEN_XFT if(cur_fnt->set) XmbDrawString(dzen.dpy, pm, cur_fnt->set, dzen.tgc, px, py + cur_fnt->ascent, lbuf, strlen(lbuf)); else XDrawString(dzen.dpy, pm, dzen.tgc, px, py+dzen.font.ascent, lbuf, strlen(lbuf)); #else if(reverse) { XftColorAllocName(dzen.dpy, DefaultVisual(dzen.dpy, dzen.screen), DefaultColormap(dzen.dpy, dzen.screen), xftcs_bg, &xftc); } else { XftColorAllocName(dzen.dpy, DefaultVisual(dzen.dpy, dzen.screen), DefaultColormap(dzen.dpy, dzen.screen), xftcs, &xftc); } XftDrawStringUtf8(xftd, &xftc, cur_fnt->xftfont, px, py + dzen.font.xftfont->ascent, (const FcChar8 *)lbuf, strlen(lbuf)); if(xftcs_f) { free(xftcs); xftcs_f = 0; } if(xftcs_bgf) { free(xftcs_bg); xftcs_bgf = 0; } #endif max_y = MAX(max_y, py+dzen.font.height); if(block_align==-1) { if(!pos_is_fixed || *linep =='\0') px += tw; } else { if(pos_is_fixed) px = opx; else px = opx+block_width; } block_align=block_width=-1; } if(*linep=='\0') break; j=0; t=-1; tval=NULL; next_pos = get_token(linep, &t, &tval); linep += next_pos; /* ^^ escapes */ if(next_pos == 0) lbuf[j++] = *linep++; } else lbuf[j++] = *linep; linep++; } if(!nodraw) { /* expand/shrink dynamically */ if(dzen.title_win.expand && lnr == -1){ i = px; switch(dzen.title_win.expand) { case left: /* grow left end */ otx = dzen.title_win.x_right_corner - i > dzen.title_win.x ? dzen.title_win.x_right_corner - i : dzen.title_win.x; XMoveResizeWindow(dzen.dpy, dzen.title_win.win, otx, dzen.title_win.y, px, dzen.line_height); break; case right: XResizeWindow(dzen.dpy, dzen.title_win.win, px, dzen.line_height); break; } } else { if(align == ALIGNLEFT) xorig[LNR2WINDOW(lnr)] = 0; if(align == ALIGNCENTER) { xorig[LNR2WINDOW(lnr)] = (lnr != -1) ? (dzen.slave_win.width - px)/2 : (dzen.title_win.width - px)/2; } else if(align == ALIGNRIGHT) { xorig[LNR2WINDOW(lnr)] = (lnr != -1) ? (dzen.slave_win.width - px) : (dzen.title_win.width - px); } } if(lnr != -1) { XCopyArea(dzen.dpy, pm, dzen.slave_win.drawable[lnr], dzen.gc, 0, 0, dzen.w, dzen.line_height, xorig[LNR2WINDOW(lnr)], 0); } else { XCopyArea(dzen.dpy, pm, dzen.title_win.drawable, dzen.gc, 0, 0, dzen.w, dzen.line_height, xorig[LNR2WINDOW(lnr)], 0); } XFreePixmap(dzen.dpy, pm); /* reset font to default */ if(font_was_set) setfont(dzen.fnt ? dzen.fnt : FONT); #ifdef DZEN_XPM if(free_xpm_attrib) { XFreeColors(dzen.dpy, xpma.colormap, xpma.pixels, xpma.npixels, xpma.depth); XpmFreeAttributes(&xpma); } #endif #ifdef DZEN_XFT XftDrawDestroy(xftd); #endif } return nodraw ? rbuf : NULL; } int parse_non_drawing_commands(char * text) { if(!text) return 1; if(!strncmp(text, "^togglecollapse()", strlen("^togglecollapse()"))) { a_togglecollapse(NULL); return 0; } if(!strncmp(text, "^collapse()", strlen("^collapse()"))) { a_collapse(NULL); return 0; } if(!strncmp(text, "^uncollapse()", strlen("^uncollapse()"))) { a_uncollapse(NULL); return 0; } if(!strncmp(text, "^togglestick()", strlen("^togglestick()"))) { a_togglestick(NULL); return 0; } if(!strncmp(text, "^stick()", strlen("^stick()"))) { a_stick(NULL); return 0; } if(!strncmp(text, "^unstick()", strlen("^unstick()"))) { a_unstick(NULL); return 0; } if(!strncmp(text, "^togglehide()", strlen("^togglehide()"))) { a_togglehide(NULL); return 0; } if(!strncmp(text, "^hide()", strlen("^hide()"))) { a_hide(NULL); return 0; } if(!strncmp(text, "^unhide()", strlen("^unhide()"))) { a_unhide(NULL); return 0; } if(!strncmp(text, "^raise()", strlen("^raise()"))) { a_raise(NULL); return 0; } if(!strncmp(text, "^lower()", strlen("^lower()"))) { a_lower(NULL); return 0; } if(!strncmp(text, "^scrollhome()", strlen("^scrollhome()"))) { a_scrollhome(NULL); return 0; } if(!strncmp(text, "^scrollend()", strlen("^scrollend()"))) { a_scrollend(NULL); return 0; } if(!strncmp(text, "^exit()", strlen("^exit()"))) { a_exit(NULL); return 0; } return 1; } void drawheader(const char * text) { if(parse_non_drawing_commands((char *)text)) { if (text){ dzen.w = dzen.title_win.width; dzen.h = dzen.line_height; window_sens[TOPWINDOW].sens_areas_cnt = 0; XFillRectangle(dzen.dpy, dzen.title_win.drawable, dzen.rgc, 0, 0, dzen.w, dzen.h); parse_line(text, -1, dzen.title_win.alignment, 0, 0); } } else { dzen.slave_win.tcnt = -1; dzen.cur_line = 0; } 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) { char *ec; int i, write_buffer=1; if(dzen.slave_win.tcnt == -1) { dzen.slave_win.tcnt = 0; drawheader(text); return; } if((ec = strstr(text, "^tw()")) && (*(ec-1) != '^')) { drawheader(ec+5); return; } if(dzen.slave_win.tcnt == dzen.slave_win.tsize) free_buffer(); write_buffer = parse_non_drawing_commands(text); if(text[0] == '^' && text[1] == 'c' && text[2] == 's') { free_buffer(); for(i=0; i < dzen.slave_win.max_lines; i++) XFillRectangle(dzen.dpy, dzen.slave_win.drawable[i], dzen.rgc, 0, 0, dzen.slave_win.width, dzen.line_height); x_draw_body(); return; } if( write_buffer && (dzen.slave_win.tcnt < dzen.slave_win.tsize) ) { dzen.slave_win.tbuf[dzen.slave_win.tcnt] = estrdup(text); dzen.slave_win.tcnt++; } } 070701303F14DE000081A40000420C00000032000000015240109300000DA2000000080000001100000000000000000000002000000000dzen2-1379930259.488ab66/dzen.h/* * (C)opyright 2007-2009 Robert Manea <rob dot manea at gmail dot com> * See LICENSE file for license details. * */ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xresource.h> #ifdef DZEN_XINERAMA #include <X11/extensions/Xinerama.h> #endif #ifdef DZEN_XFT #include <X11/Xft/Xft.h> #endif #define FONT "-*-fixed-*-*-*-*-*-*-*-*-*-*-*-*" #define BGCOLOR "#111111" #define FGCOLOR "grey70" #define ESC_CHAR '^' #define ALIGNCENTER 0 #define ALIGNLEFT 1 #define ALIGNRIGHT 2 #define TOPWINDOW 0 #define SLAVEWINDOW 1 #define MIN_BUF_SIZE 1024 #define MAX_LINE_LEN 8192 #define MAX_CLICKABLE_AREAS 256 #ifndef Button6 # define Button6 6 #endif #ifndef Button7 # define Button7 7 #endif enum { ColFG, ColBG, ColLast }; /* exapansion directions */ enum { noexpand, left, right, both }; typedef struct DZEN Dzen; typedef struct Fnt Fnt; typedef struct TW TWIN; typedef struct SW SWIN; typedef struct _Sline Sline; struct Fnt { XFontStruct *xfont; XFontSet set; int ascent; int descent; int height; #ifdef DZEN_XFT XftFont *xftfont; XGlyphInfo *extents; int width; #endif }; /* clickable areas */ typedef struct _CLICK_A { int active; int button; int start_x; int end_x; int start_y; int end_y; Window win; //(line)window to which the action is attached char cmd[1024]; } click_a; typedef struct _SENS_PER_WINDOW { click_a sens_areas[MAX_CLICKABLE_AREAS]; int sens_areas_cnt; } sens_w; //0: top window, 1: slave window extern int xorig[2]; extern sens_w window_sens[2]; /* title window */ struct TW { int x, y, width, height; char *name; Window win; Drawable drawable; char alignment; int expand; int x_right_corner; Bool ishidden; }; /* slave window */ struct SW { int x, y, width, height; char *name; Window win; Window *line; Drawable *drawable; /* input buffer */ char **tbuf; int tsize; int tcnt; /* line fg colors */ unsigned long *tcol; int max_lines; int first_line_vis; int last_line_vis; int sel_line; char alignment; Bool ismenu; Bool ishmenu; Bool issticky; Bool ismapped; }; struct DZEN { int x, y, w, h; Bool running; unsigned long norm[ColLast]; TWIN title_win; SWIN slave_win; /* sensitive areas */ Window sa_win; const char *fnt; const char *bg; const char *fg; int line_height; Display *dpy; int screen; unsigned int depth; Visual *visual; GC gc, rgc, tgc; Fnt font; Fnt fnpl[64]; Bool ispersistent; Bool tsupdate; Bool colorize; unsigned long timeout; long 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 align); extern char * parse_line(const char * text, int linenr, int align, int reverse, int nodraw); extern 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(const 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 */ 070701303F14DF000041ED0000420C00000032000000025240109300000000000000080000001100000000000000000000002100000000dzen2-1379930259.488ab66/gadgets070701304160CB000081A40000420C0000003200000001524010930000069A000000080000001100000000000000000000002A00000000dzen2-1379930259.488ab66/gadgets/Makefile# dzen2 gadgets # (c) 2007 Robert Manea include config.mk SRC = dbar.c dbar-main.c gdbar.c gcpubar.c textwidth.c OBJ = ${SRC:.c=.o} all: options dbar gdbar gcpubar textwidth options: @echo dzen2 gadgets build options: @echo "CFLAGS = ${CFLAGS}" @echo "LDFLAGS = ${LDFLAGS}" @echo "CC = ${CC}" @echo "LD = ${LD}" .c.o: @echo CC $< @${CC} -c ${CFLAGS} $< ${OBJ}: dbar.h config.mk dbar: ${OBJ} @echo LD $@ @${LD} -o $@ dbar-main.o dbar.o ${LDFLAGS} @strip $@ gdbar: ${OBJ} @echo LD $@ # @${LD} -o $@ gdbar.o dbar.o ${LDFLAGS} -L${X11LIB} -lX11 @${LD} -o $@ gdbar.o dbar.o ${LDFLAGS} @strip $@ gcpubar: ${OBJ} @echo LD $@ # @${LD} -o $@ gcpubar.o dbar.o ${LDFLAGS} -L${X11LIB} @${LD} -o $@ gcpubar.o dbar.o ${LDFLAGS} @strip $@ textwidth: ${OBJ} @echo LD $@ @${LD} -o $@ textwidth.o ${LDFLAGS} -L${X11LIB} -lX11 @strip $@ clean: @echo cleaning @rm -f ${OBJ} dbar @rm -f ${OBJ} gdbar @rm -f ${OBJ} gcpubar @rm -f ${OBJ} textwidth install: all @echo installing executable file to ${DESTDIR}${PREFIX}/bin @mkdir -p ${DESTDIR}${PREFIX}/bin @cp -f dbar ${DESTDIR}${PREFIX}/bin @chmod 755 ${DESTDIR}${PREFIX}/bin/dbar @cp -f gdbar ${DESTDIR}${PREFIX}/bin @chmod 755 ${DESTDIR}${PREFIX}/bin/gdbar @cp -f gcpubar ${DESTDIR}${PREFIX}/bin @chmod 755 ${DESTDIR}${PREFIX}/bin/gcpubar @cp -f textwidth ${DESTDIR}${PREFIX}/bin @chmod 755 ${DESTDIR}${PREFIX}/bin/textwidth uninstall: @echo removing executable file from ${DESTDIR}${PREFIX}/bin @rm -f ${DESTDIR}${PREFIX}/bin/dbar @rm -f ${DESTDIR}${PREFIX}/bin/gdbar @rm -f ${DESTDIR}${PREFIX}/bin/gcpubar @rm -f ${DESTDIR}${PREFIX}/bin/textwidth .PHONY: all options clean install uninstall 0707013066BB26000081A40000420C00000032000000015240109300000822000000080000001100000000000000000000002D00000000dzen2-1379930259.488ab66/gadgets/README.dbar============================== dbar, (c) 2007 by Robert Manea ============================== dbar is an application that generates semi graphical progress meters, from some values you supply to it. See the usage examples for a description of the expected input format. Options: -------- -max : Value to be considered 100% (default: 100) -min : Value to be considered 0% (default: 0 ) -w : Number of charcaters to be considered 100% in the meter (default: 25 ) -s : Symbol represeting the percentage value in the meter (default: = ) -l : label to be prepended to the bar (default: '' ) -nonl: no new line, don't put '\n' at the end of the bar (default: do print '\n') dbar lets you define static 0% and 100% marks with the '-min' and '-max' options or you can provide these marks dynamically at runtime. Static and dynamic marks can be mixed, in this case the value specified at runtime will override the comandline value. You can specify ranges of numbers, negative, positive or ranges with a negative min value and positive max value. All numbers are treated as double precision floating point, i.e. the input is NOT limited to integers. Usage examples: 1) Static 0% and 100% mark or single value input: echo 25 | dbar -m 100 -l Sometext Output: Sometext 25% [====== ] 2) If your 100% mark changes dynamically or 2-values input: echo "50 150" | dbar ^ ^ | |__ max. value | |__ value to display Output: 33% [======== ] 3) If your value range is not between [0, maxval] or 3-values input: echo "50 -25 150" | dbar ^ ^ ^ | | |__ max. value 100% mark | | | |_____ min. value 0% mark | |________ value to display Output: 43% [=========== ] 4) Multiple runs: for i in 2 20 50 75 80; do echo $i; sleep 1; done | dbar | dzen2 Output: Find out yourself. 070701331C015D000081A40000420C00000032000000015240109300000484000000080000001100000000000000000000003000000000dzen2-1379930259.488ab66/gadgets/README.gcpubar==================================== gcpubar, (c) 20007 by Robert Manea ==================================== gcpubar is a CPU utilization meter for Linux. It relies on the existence of the "/proc/stat" file and generateѕ fully graphical meters viewable with dzen >= 0.7.0. Command line options: --------------------- -i : Update interval in seconds (default: 1) You can use positive values less than 1 for intervals shorter than a second -c : Number of times to display (default: infinite) the meter -w : Width of the meter in pixels (default: 100) -h : Height of the meter in pixels (default: 10) -fg : Meter foreground color (default: white) -bg : Meter background color (default: darkgrey) -s : Style, can be either o(utlined) v(ertical), g(raph) or the default gauge if no parameter is specified -gw : Width of the graph elements (default: 1) -gs : Space between the graph elemements (default: 0) -nonl: no new line, don't put '\n' at the end of the bar (default: do print '\n') 070701331C015E000081A40000420C000000320000000152401093000004FE000000080000001100000000000000000000002E00000000dzen2-1379930259.488ab66/gadgets/README.gdbar================================= gdbar, (c) 2007 by Robert Manea ================================= gdbar is an application that generates fully graphical progress meters, from some values you supply to it. It has the same input semantics as dbar (see README.dbar). In contrast to dbar, gdbar draws fully graphical meters which are only useful in combination with dzen >= 0.7.0. Options: -------- -fg : foreground color of the meter (default: white) -bg : background color of the meter (default: darkgrey) -s : Style, can be either o(utlined), v(ertical), or the default gauge if no parameter is specified -sw : Width of the segments -sh : Height of the vertical segments -ss : Space between the segments -max : Value to be considered 100% (default: 100) -min : Value to be considered 0% (default: 0 ) -w : Size in pixels to be considered 100% in the meter (default: 80 ) -h : bar height -l : label to be prepended to the bar (default: '' ) -o : Draw conky style meters -nonl: no new line, don't put '\n' at the end of the bar (default: do print '\n') See README.dbar for further details! 070701331C015F000081A40000420C000000320000000152401093000001A0000000080000001100000000000000000000003400000000dzen2-1379930259.488ab66/gadgets/README.kittscanner======================================== kitt-scanner, (c) 2007 by Robert Manea ======================================== This is just a fun gadget and wants to show what can be done with dzen other than just displaying text ;). It implements sort of a KITT (Knight Rider, TV series) scanner in shell script. There are some settings that you can tweak to your likings, see "kittscanner.sh" for further details. 070701335BDB20000081A40000420C000000320000000152401093000000DD000000080000001100000000000000000000003200000000dzen2-1379930259.488ab66/gadgets/README.textwidth=================================== textwidth, (c) 2007 by Robert Manea =================================== Simple utility to calculate the width in pixels of text with a given font. Usage: textwidth <fontname> <text> 070701335BDB21000081A40000420C00000032000000015240109300000125000000080000001100000000000000000000002B00000000dzen2-1379930259.488ab66/gadgets/config.mk# Customize below to fit your system # paths PREFIX = /usr/local MANPREFIX = ${PREFIX}/share/man X11INC = /usr/X11R6/include INCS = -I. -I/usr/include -I${X11INC} X11LIB = /usr/X11R6/lib LIBS = -L/usr/lib CFLAGS = -Os ${INCS} LDFLAGS = ${LIBS} # compiler and linker CC = gcc LD = ${CC} 070701335BDB22000081A40000420C00000032000000015240109300000A06000000080000001100000000000000000000002D00000000dzen2-1379930259.488ab66/gadgets/dbar-main.c/* dbar - ascii percentage meter Copyright (c) 2007 by 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. */ #include <stdio.h> #include "dbar.h" #define MAXLEN 512 int main(int argc, char *argv[]) { int i, nv; char aval[MAXLEN], *endptr; Dbar dbar; dbardefaults(&dbar, textual); for(i=1; i < argc; i++) { if(!strncmp(argv[i], "-w", 3)) { if(++i < argc) dbar.width = atoi(argv[i]); } else if(!strncmp(argv[i], "-s", 3)) { if(++i < argc) dbar.sym = argv[i][0]; } else if(!strncmp(argv[i], "-max", 5)) { if(++i < argc) { dbar.maxval = strtod(argv[i], &endptr); if(*endptr) { fprintf(stderr, "dbar: '%s' incorrect number format", argv[i]); return EXIT_FAILURE; } } } else if(!strncmp(argv[i], "-min", 5)) { if(++i < argc) { dbar.minval = strtod(argv[i], &endptr); if(*endptr) { fprintf(stderr, "dbar: '%s' incorrect number format", argv[i]); return EXIT_FAILURE; } } } else if(!strncmp(argv[i], "-l", 3)) { if(++i < argc) dbar.label = argv[i]; } else if(!strncmp(argv[i], "-nonl", 6)) { dbar.pnl = 0; } else { fprintf(stderr, "usage: dbar [-w <characters>] [-s <symbol>] [-min <minvalue>] [-max <maxvalue>] [-l <string>] [-nonl]\n"); return EXIT_FAILURE; } } while(fgets(aval, MAXLEN, stdin)) { nv = sscanf(aval, "%lf %lf %lf", &dbar.val, &dbar.minval, &dbar.maxval); if(nv == 2) { dbar.maxval = dbar.minval; dbar.minval = 0; } fdbar(&dbar, stdout); } } 070701335BDB23000081A40000420C0000003200000001524010930000171F000000080000001100000000000000000000002800000000dzen2-1379930259.488ab66/gadgets/dbar.c#include "dbar.h" void dbardefaults(Dbar *dbar, int mode) { dbar->bg = "darkgrey"; dbar->fg = "white"; dbar->label = NULL; dbar->sym = '='; dbar->val = 0; dbar->minval = 0; dbar->maxval = 100.0; dbar->mode = mode ? graphical : textual; dbar->style = norm; dbar->width = mode ? 80 : 25; dbar->height = 10; dbar->segw = 6; dbar->segh = 2; dbar->segb = 0; dbar->gs = 0; dbar->gw = 1; dbar->gc = 0; dbar->pnl = 1; memset(dbar->gb, '\0', MAX_GRAPH_VALS); } void fdbar(Dbar *dbar, FILE *stream) { int i, rp, p, t; int segs, segsa; double l, perc; perc = (100 * (dbar->val - dbar->minval)) / (dbar->maxval - dbar->minval); switch(dbar->style) { case outlined: l = perc * ((double)(dbar->width-2) / 100); break; case vertical: l = perc * ((double)dbar->height / 100); break; case graph: l = perc * ((double)dbar->height / 100); break; default: l = perc * ((double)dbar->width / 100); break; } l=(int)(l + 0.5) >= (int)l ? l+0.5 : l; rp=(int)(perc + 0.5) >= (int)perc ? (int)(perc + 0.5) : (int)perc; if(dbar->mode == textual) { fprintf(stream, "%s%3d%% [", dbar->label ? dbar->label : "", rp); for(i=0; i < (int)l; i++) if(i == dbar->width) { fputc('>', stream); break; } else fputc(dbar->sym, stream); for(; i < dbar->width; i++) fputc(' ', stream); fprintf(stream, "]%s", dbar->pnl ? "\n" : ""); } else { switch(dbar->style) { case outlined: if(dbar->segb == 0) { fprintf(stream, "%s^ib(1)^fg(%s)^ro(%dx%d)^p(%d)^fg(%s)^r(%dx%d)^p(%d)^ib(0)^fg()%s", dbar->label ? dbar->label : "", dbar->bg, (int)dbar->width, dbar->height, -1*(dbar->width-2), dbar->fg, (int)l>dbar->width-4?dbar->width-4:(int)l, dbar->height-4>0?dbar->height-4:1, dbar->width-(int)l-1, dbar->pnl ? "\n" : ""); } else { segs = dbar->width / (dbar->segw + dbar->segb); segsa = rp * segs / 100; fprintf(stream, "%s^ib(1)^fg(%s)^ro(%dx%d)^p(%d)", dbar->label ? dbar->label : "", dbar->bg, (int)dbar->width, dbar->height, -1*(dbar->width-2)); for(i=0; i < segs; i++) { if(i<segsa) fprintf(stream, "^fg(%s)^r(%dx%d+%d+%d')", dbar->fg, dbar->segw, dbar->height-4>0?dbar->height-4:1, i?dbar->segb:0, 0); else break; } printf("^fg()^ib(0)^p(%d)%s", dbar->width - i*(dbar->segw + dbar->segb), dbar->pnl ? "\n" : ""); } break; case vertical: segs = dbar->height / (dbar->segh + dbar->segb); segsa = rp * segs / 100; fprintf(stream, "%s^ib(1)", dbar->label ? dbar->label : ""); if(dbar->segb == 0) { //fprintf(stream, "^fg(%s)^r(%dx%d+%d-%d)^fg(%s)^p(-%d)^r(%dx%d+%d-%d)", // dbar->bg, dbar->segw, dbar->height, 0, dbar->height+1, // dbar->fg, dbar->segw, dbar->segw, (int)l, 0, (int)l+1); fprintf(stream, "^fg(%s)^r(%dx%d)^fg(%s)^r(%dx%d-%d+%d)", dbar->bg, dbar->segw, dbar->height, dbar->fg, dbar->segw, (int)l, dbar->segw, (int)((dbar->height-l)/2.0 + .5)); } else { for(i=0; i < segs; i++) { t = dbar->height/2-(dbar->segh+dbar->segb)*i; //if(i<segsa) fprintf(stream, "^fg(%s)^r(%dx%d-%d%c%d)", i < segsa ? dbar->fg : dbar->bg, dbar->segw, dbar->segh, i?dbar->segw:0, t > 0 ? '+' : '-', abs(t)); //fprintf(stream, "^fg(%s)^p(-%d)^r(%dx%d+%d-%d)", // dbar->fg, i?dbar->segw:0, dbar->segw, // dbar->segh, 0, (dbar->segh+dbar->segb)*(i+1)); //else //fprintf(stream, "^fg(%s)^r(%dx%d-%d-%d)", // dbar->bg, dbar->segw, // dbar->segh,i?dbar->segw:0, (dbar->segh+dbar->segb)*i); //fprintf(stream, "^fg(%s)^p(-%d)^r(%dx%d+%d-%d)", // dbar->bg, i?dbar->segw:0, dbar->segw, // dbar->segh, 0, (dbar->segh+dbar->segb)*(i+1)); } } fprintf(stream, "^ib(0)^fg()%s", dbar->pnl ? "\n" : ""); break; case graph: dbar->gc = dbar->gc < MAX_GRAPH_VALS && (dbar->gs == 0 ? dbar->gc : dbar->gc * dbar->gs + dbar->gc * dbar->gw) < dbar->width ? ++dbar->gc : 0; dbar->gb[dbar->gc] = l; printf("%s", dbar->label ? dbar->label : ""); for(i=dbar->gc+1; i<MAX_GRAPH_VALS && (i*(dbar->gs+dbar->gw)) < dbar->width; ++i) { p=100*dbar->gb[i]/dbar->height; p=(int)p+0.5 >= (int)p ? (int)(p+0.5) : (int)p; fprintf(stream, "^fg(%s)^p(%d)^r(%dx%d+0-%d)", dbar->fg, dbar->gs, dbar->gw, (int)dbar->gb[i], (int)dbar->gb[i]+1); } for(i=0; i < dbar->gc; ++i) { p=100*dbar->gb[i]/dbar->height; p=(int)p+0.5 >= (int)p ? (int)(p+0.5) : (int)p; fprintf(stream, "^fg(%s)^p(%d)^r(%dx%d+0-%d)", dbar->fg, dbar->gs, dbar->gw, (int)dbar->gb[i], (int)dbar->gb[i]+1); } fprintf(stream, "^fg()%s", dbar->pnl ? "\n" : ""); break; case pie: fprintf(stream, "^ib(1)^fg(%s)^c(%d)^p(-%d)^fg(%s)^c(%d-%d)%s", dbar->bg, dbar->width, dbar->width, dbar->fg, dbar->width, (int)(rp*360/100), dbar->pnl ? "\n" : ""); break; default: if(dbar->segb == 0) //printf("%s%3d%% ^fg(%s)^r(%dx%d)^fg(%s)^r(%dx%d)^fg()%s", printf("%s^fg(%s)^r(%dx%d)^fg(%s)^r(%dx%d)^fg()%s", dbar->label ? dbar->label : "", dbar->fg, (int)l, dbar->height, dbar->bg, dbar->width-(int)l, dbar->height, dbar->pnl ? "\n" : ""); else { segs = dbar->width / (dbar->segw + dbar->segb); segsa = rp * segs / 100; //printf("%s%3d%% ", dbar->label ? dbar->label : "", rp); printf("%s", dbar->label ? dbar->label : ""); for(i=0; i < segs; i++) { if(i<segsa) fprintf(stream, "^fg(%s)^r(%dx%d+%d+%d)", dbar->fg, dbar->segw, dbar->height, i?dbar->segb:0, 0); else fprintf(stream, "^fg(%s)^r(%dx%d+%d+%d)", dbar->bg, dbar->segw, dbar->height, i?dbar->segb:0, 0); } fprintf(stream, "^p(%d)^fg()%s", dbar->segb, dbar->pnl ? "\n" : ""); } break; } } fflush(stream); } 070701335BDB24000081A40000420C0000003200000001524010930000027C000000080000001100000000000000000000002800000000dzen2-1379930259.488ab66/gadgets/dbar.h#ifndef __DBAR_H #define __DBAR_H #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define MAX_GRAPH_VALS 1024 typedef struct { const char *bg; const char *fg; const char *label; char sym; double val; double minval; double maxval; int mode; int style; int width; int height; int segw; int segh; int segb; int gs; int gw; int gc; char gb[MAX_GRAPH_VALS]; int pnl; } Dbar; enum mode { textual, graphical }; enum style { norm, outlined, vertical, graph, pie }; void fdbar(Dbar *dbar, FILE *stream); void dbardefaults(Dbar *dbar, int mode); #endif /* __DBAR_H */ 070701335BDB25000081A40000420C000000320000000152401093000012CB000000080000001100000000000000000000002B00000000dzen2-1379930259.488ab66/gadgets/gcpubar.c/* gcpubar - graphical cpu usage bar, to be used with dzen Copyright (C) 2007 by 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. */ #include "dbar.h" /* critical % value, color */ #define CPUCRIT 75 #define CRITCOL "#D56F6C" /* medium % value, color */ #define CPUMED 50 #define MEDCOL "#EBA178" struct cpu_info { unsigned long long user; unsigned long long sys; unsigned long long idle; unsigned long long iowait; } ncpu, ocpu; int main(int argc, char *argv[]) { int i, t; double total; struct cpu_info mcpu; FILE *statfp; char buf[256], *ep; Dbar dbar; int counts = 0; double ival = 1.0; dbardefaults(&dbar, graphical); dbar.mode = graphical; for(i=1; i < argc; i++) { if(!strncmp(argv[i], "-i", 3)) { if(i+1 < argc) { ival = strtod(argv[i+1], &ep); if(*ep) { fprintf(stderr, "%s: '-i' Invalid interval value\n", argv[0]); return EXIT_FAILURE; } else i++; } } else if(!strncmp(argv[i], "-s", 3)) { if(++i < argc) { switch(argv[i][0]) { case 'o': dbar.style = outlined; break; case 'g': dbar.style = graph; break; case 'v': dbar.style = vertical; break; case 'p': dbar.style = pie; break; default: dbar.style = norm; break; } } } else if(!strncmp(argv[i], "-c", 3)) { if(++i < argc) counts = atoi(argv[i]); } else if(!strncmp(argv[i], "-gs", 4)) { if(++i < argc) dbar.gs = atoi(argv[i]); } else if(!strncmp(argv[i], "-gw", 4)) { if(++i < argc) dbar.gw = atoi(argv[i]); } else if(!strncmp(argv[i], "-w", 3)) { if(++i < argc) dbar.width = atoi(argv[i]); } else if(!strncmp(argv[i], "-h", 3)) { if(++i < argc) dbar.height = atoi(argv[i]); } else if(!strncmp(argv[i], "-sw", 4)) { if(++i < argc) dbar.segw = atoi(argv[i]); } else if(!strncmp(argv[i], "-sh", 4)) { if(++i < argc) dbar.segh = atoi(argv[i]); } else if(!strncmp(argv[i], "-ss", 4)) { if(++i < argc) dbar.segb = atoi(argv[i]); } else if(!strncmp(argv[i], "-fg", 4)) { if(++i < argc) dbar.fg = argv[i]; } else if(!strncmp(argv[i], "-bg", 4)) { if(++i < argc) dbar.bg = argv[i]; } else if(!strncmp(argv[i], "-l", 3)) { if(++i < argc) dbar.label = argv[i]; } else if(!strncmp(argv[i], "-nonl", 6)) { dbar.pnl = 0; } else { printf("usage: %s [-l <label>] [-i <interval>] [-c <count>] [-fg <color>] [-bg <color>] [-w <pixel>] [-h <pixel>] [-s <o|g|v>] [-sw <pixel>] [-sh <pixel>] [-ss <pixel>] [-gs <pixel>] [-gw <pixel>] [-nonl]\n", argv[0]); return EXIT_FAILURE; } } if(!(statfp = fopen("/proc/stat", "r"))) { printf("%s: error opening '/proc/stat'\n", argv[0]); return EXIT_FAILURE; } t = counts > 0 ? counts : 1; while(t) { rewind(statfp); while(fgets(buf, sizeof buf, statfp)) { if(!strncmp(buf, "cpu ", 4)) { unsigned long long unice; double myload; /* linux >= 2.6 */ if((sscanf(buf, "cpu %llu %llu %llu %llu %llu", &ncpu.user, &unice, &ncpu.sys, &ncpu.idle, &ncpu.iowait)) < 5) { printf("%s: wrong field count in /proc/stat\n", argv[0]); return EXIT_FAILURE; } ncpu.user += unice; mcpu.user = ncpu.user - ocpu.user; mcpu.sys = ncpu.sys - ocpu.sys; mcpu.idle = ncpu.idle - ocpu.idle; mcpu.iowait = ncpu.iowait - ocpu.iowait; dbar.maxval = mcpu.user + mcpu.sys + mcpu.idle + mcpu.iowait; dbar.val = mcpu.user + mcpu.sys + mcpu.iowait; fdbar(&dbar, stdout); ocpu = ncpu; } } if((counts > 0) && (t-1 > 0)) { --t; usleep((unsigned long)(ival * 1000000.0)); } else if((counts == 0) && (t == 1)) usleep((unsigned long)(ival * 1000000.0)); else break; } return EXIT_SUCCESS; } 070701335BDB26000081A40000420C000000320000000152401093000008E1000000080000001100000000000000000000002900000000dzen2-1379930259.488ab66/gadgets/gdbar.c#include <stdio.h> #include "dbar.h" #define MAXLEN 1024 int main(int argc, char *argv[]) { int i, nv; char aval[MAXLEN], *endptr; Dbar dbar; dbardefaults(&dbar, graphical); for(i=1; i < argc; i++) { if(!strncmp(argv[i], "-w", 3)) { if(++i < argc) dbar.width = atoi(argv[i]); } else if(!strncmp(argv[i], "-h", 3)) { if(++i < argc) dbar.height = atoi(argv[i]); } else if(!strncmp(argv[i], "-sw", 4)) { if(++i < argc) dbar.segw = atoi(argv[i]); } else if(!strncmp(argv[i], "-sh", 4)) { if(++i < argc) dbar.segh = atoi(argv[i]); } else if(!strncmp(argv[i], "-ss", 4)) { if(++i < argc) dbar.segb = atoi(argv[i]); } else if(!strncmp(argv[i], "-s", 3)) { if(++i < argc) { switch(argv[i][0]) { case 'o': dbar.style = outlined; break; case 'v': dbar.style = vertical; break; case 'p': dbar.style = pie; break; default: dbar.style = norm; break; } } } else if(!strncmp(argv[i], "-fg", 4)) { if(++i < argc) dbar.fg = argv[i]; } else if(!strncmp(argv[i], "-bg", 4)) { if(++i < argc) dbar.bg = argv[i]; } else if(!strncmp(argv[i], "-max", 5)) { if(++i < argc) { dbar.maxval = strtod(argv[i], &endptr); if(*endptr) { fprintf(stderr, "gdbar: '%s' incorrect number format", argv[i]); return EXIT_FAILURE; } } } else if(!strncmp(argv[i], "-min", 5)) { if(++i < argc) { dbar.minval = strtod(argv[i], &endptr); if(*endptr) { fprintf(stderr, "gdbar: '%s' incorrect number format", argv[i]); return EXIT_FAILURE; } } } else if(!strncmp(argv[i], "-l", 3)) { if(++i < argc) dbar.label = argv[i]; } else if(!strncmp(argv[i], "-nonl", 6)) { dbar.pnl = 0; } else { fprintf(stderr, "usage: gdbar [-s <o|v>] [-w <pixel>] [-h <pixel>] [-sw <pixel>] [-ss <pixel>] [-sw <pixel>] [-fg <color>] [-bg <color>] [-min <minvalue>] [-max <maxvalue>] [-l <string>] [-nonl] \n"); return EXIT_FAILURE; } } while(fgets(aval, MAXLEN, stdin)) { nv = sscanf(aval, "%lf %lf %lf", &dbar.val, &dbar.minval, &dbar.maxval); if(nv == 2) { dbar.maxval = dbar.minval; dbar.minval = 0; } fdbar(&dbar, stdout); } } 070701335BDB27000081ED0000420C0000003200000001524010930000052B000000080000001100000000000000000000003000000000dzen2-1379930259.488ab66/gadgets/kittscanner.sh#!/bin/sh # # (c) 2007 by Robert Manea <rob dot manea at gmail dot com> # # KITT Scanner for dzen - a man, a car, a dzen # #---[ KITT configuration ]---------------------------------------------- SCANNER_LEDS=17 LED_SPACING=3 LED_WIDTH=25 LED_HEIGHT=10 INACTIVE_LED_COLOR=darkred ACTIVE_LED_COLOR=red BG=black SLEEP=0.1 DZEN=dzen2 DZENOPTS="-bg $BG -fg $INACTIVE_LED_COLOR" #----------------------------------------------------------------------- DFG="^fg(${INACTIVE_LED_COLOR})" LFG="^fg(${ACTIVE_LED_COLOR})" RECT="^r(${LED_WIDTH}x${LED_HEIGHT})" i=; j=1; SIGN='+' # build a number list "1 2 ... $SCANNER_LEDS" nr_list_leds() { l=1 lnr=$1 while [ $l -le $lnr ]; do NRLIST=${NRLIST}' '${l} l=`expr $l + 1` done echo $NRLIST } LED_LIST=`nr_list_leds $SCANNER_LEDS` while :; do for i in $LED_LIST; do if [ "$i" -eq "$j" ]; then KBAR=${KBAR}"^p(${LED_SPACING})"${LFG}${RECT}${DFG} else KBAR=${KBAR}"^p(${LED_SPACING})"${RECT} fi done echo $KBAR; KBAR= if [ $SIGN = '+' ] && [ $j -ge $SCANNER_LEDS ]; then j=$SCANNER_LEDS SIGN='-' elif [ $SIGN = '-' ] && [ $j -eq 1 ]; then j=1 SIGN='+' fi j=`expr $j $SIGN 1` sleep $SLEEP; done | $DZEN $DZENOPTS -h `expr $LED_HEIGHT + 4` 070701335BDB28000081A40000420C00000032000000015240109300000196000000080000001100000000000000000000002F00000000dzen2-1379930259.488ab66/gadgets/noisyalert.sh#!/bin/sh # # (c) 2007 by Robert Manea # # A noisy alert for dzen # # Syntax noisyalert.sh [Message] [TIMEOUT in seconds] | dzen2 ALERTMSG=${1:-"Alert"} ALERTSEC=${2:-10} RECTW=10 RECTH=10 while [ $ALERTSEC -ne 0 ]; do if [ `expr $ALERTSEC % 2` -eq 0 ]; then echo "^r(${RECTW}x${RECTH}) $ALERTMSG" else echo "^ro(${RECTW}x${RECTH}) $ALERTMSG" fi ALERTSEC=`expr $ALERTSEC - 1` sleep 1 done 070701335BDB29000081A40000420C00000032000000015240109300000BD5000000080000001100000000000000000000002D00000000dzen2-1379930259.488ab66/gadgets/textwidth.c/* textwidth - calculate width in pixels of text with a given font Copyright (C) 2007 by 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. */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<X11/Xlib.h> typedef struct _Fnt { XFontStruct *xfont; XFontSet set; int ascent; int descent; int height; } Fnt; Fnt font; Display *dpy; unsigned int textw(const char *text, unsigned int len) { XRectangle r; if(font.set) { XmbTextExtents(font.set, text, len, NULL, &r); return r.width; } return XTextWidth(font.xfont, text, len); } void setfont(const char *fontstr) { char *def, **missing; int i, n; missing = NULL; if(font.set) XFreeFontSet(dpy, font.set); font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); if(missing) XFreeStringList(missing); if(font.set) { XFontSetExtents *font_extents; XFontStruct **xfonts; char **font_names; font.ascent = font.descent = 0; font_extents = XExtentsOfFontSet(font.set); n = XFontsOfFontSet(font.set, &xfonts, &font_names); for(i = 0, font.ascent = 0, font.descent = 0; i < n; i++) { if(font.ascent < (*xfonts)->ascent) font.ascent = (*xfonts)->ascent; if(font.descent < (*xfonts)->descent) font.descent = (*xfonts)->descent; xfonts++; } } else { if(font.xfont) XFreeFont(dpy, font.xfont); font.xfont = NULL; if(!(font.xfont = XLoadQueryFont(dpy, fontstr))) { fprintf(stderr, "error, cannot load font: '%s'\n", fontstr); exit(EXIT_FAILURE); } font.ascent = font.xfont->ascent; font.descent = font.xfont->descent; } font.height = font.ascent + font.descent; } int main(int argc, char *argv[]) { char *myfont, *text; if(argc < 3) { fprintf(stderr, "usage: %s <font> <string>\n", argv[0]); return EXIT_FAILURE; } myfont = argv[1]; text = argv[2]; dpy = XOpenDisplay(0); if(!dpy) { fprintf(stderr, "cannot open display\n"); return EXIT_FAILURE; } setfont(myfont); printf("%u\n", textw(text, strlen(text))); return EXIT_SUCCESS; } 070701335BDB2A000081ED0000420C00000032000000015240109300000253000000080000001100000000000000000000001E00000000dzen2-1379930259.488ab66/help#!/bin/sh # # (c) 2007, by Robert Manea OPTS='-bg #111111 -fg grey70 -p -l 30 -e onstart=uncollapse,scrollhome;button5=scrolldown;key_Down=scrolldown;button4=scrollup;key_Up=scrollup;key_Page_Down=scrolldown:30;key_Page_Up=scrollup:30;key_Escape=exit;button3=exit;entertitle=grabkeys;enterslave=grabkeys;leaveslave=ungrabkeys' if test -x ./dzen2 ; then (echo "^fg(#323232)^bg(#5FBF77) Documentation (use: scrollwheel, arrow keys, PgUP/PgDown to scroll. Escape or right mouse button to quit) "; cat README.dzen) | ./dzen2 $OPTS else echo "Please type 'make' to build dzen and rerun help" fi 070701335BDB2B000081A40000420C0000003200000001524010930000751B000000080000001100000000000000000000002000000000dzen2-1379930259.488ab66/main.c/* * (C)opyright 2007-2009 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> #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 255 #endif Dzen dzen = {0}; static int last_cnt = 0; typedef void sigfunc(int); static void clean_up(void) { int i; free_event_list(); #ifndef DZEN_XFT if(dzen.font.set) XFreeFontSet(dzen.dpy, dzen.font.set); else XFreeFont(dzen.dpy, dzen.font.xfont); #endif XFreePixmap(dzen.dpy, dzen.title_win.drawable); if(dzen.slave_win.max_lines) { for(i=0; i < dzen.slave_win.max_lines; i++) { XFreePixmap(dzen.dpy, dzen.slave_win.drawable[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); XFreeGC(dzen.dpy, dzen.rgc); XFreeGC(dzen.dpy, dzen.tgc); XDestroyWindow(dzen.dpy, dzen.title_win.win); XCloseDisplay(dzen.dpy); } static void catch_sigusr1(int s) { (void)s; do_action(sigusr1); } static void catch_sigusr2(int s) { (void)s; do_action(sigusr2); } static void catch_sigterm(int s) { (void)s; do_action(onexit); } static void catch_alrm(int s) { (void)s; do_action(onexit); clean_up(); exit(0); } 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; } char *rem=NULL; static int chomp(char *inbuf, char *outbuf, int start, int len) { int i=0; int off=start; if(rem) { strncpy(outbuf, rem, strlen(rem)); i += strlen(rem); free(rem); rem = NULL; } while(off < len) { if(i >= MAX_LINE_LEN) { outbuf[MAX_LINE_LEN-1] = '\0'; return ++off; } if(inbuf[off] != '\n') { outbuf[i++] = inbuf[off++]; } else if(inbuf[off] == '\n') { outbuf[i] = '\0'; return ++off; } } outbuf[i] = '\0'; rem = estrdup(outbuf); return 0; } void free_buffer(void) { int i; for(i=0; i<dzen.slave_win.tcnt; i++) { free(dzen.slave_win.tbuf[i]); dzen.slave_win.tbuf[i] = NULL; } dzen.slave_win.tcnt = dzen.slave_win.last_line_vis = last_cnt = 0; } static int read_stdin(void) { char buf[MAX_LINE_LEN], retbuf[MAX_LINE_LEN]; ssize_t n, n_off=0; if(!(n = read(STDIN_FILENO, buf, sizeof buf))) { if(!dzen.ispersistent) { dzen.running = False; return -1; } else return -2; } else { while((n_off = chomp(buf, retbuf, n_off, n))) { if(!dzen.slave_win.ishmenu && dzen.tsupdate && dzen.slave_win.max_lines && ((dzen.cur_line == 0) || !(dzen.cur_line % (dzen.slave_win.max_lines+1)))) drawheader(retbuf); else if(!dzen.slave_win.ishmenu && !dzen.tsupdate && ((dzen.cur_line == 0) || !dzen.slave_win.max_lines)) drawheader(retbuf); else drawbody(retbuf); dzen.cur_line++; } } return 0; } static void x_hilight_line(int line) { drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 1, line, dzen.slave_win.alignment); XCopyArea(dzen.dpy, dzen.slave_win.drawable[line], dzen.slave_win.line[line], dzen.gc, 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } static void x_unhilight_line(int line) { drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 0, line, dzen.slave_win.alignment); XCopyArea(dzen.dpy, dzen.slave_win.drawable[line], dzen.slave_win.line[line], dzen.rgc, 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } void x_draw_body(void) { int i; dzen.x = 0; dzen.y = 0; dzen.w = dzen.slave_win.width; dzen.h = dzen.line_height; window_sens[SLAVEWINDOW].sens_areas_cnt = 0; 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; } else { 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); } for(i=0; i < dzen.slave_win.max_lines; i++) XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc, 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } static void x_check_geometry(XRectangle scr) { TWIN *t = &dzen.title_win; SWIN *s = &dzen.slave_win; t->x = t->x < 0 ? scr.width + t->x + scr.x : t->x + scr.x; t->y = t->y < 0 ? scr.height + t->y + scr.y : t->y + scr.y; if(t->x < scr.x || scr.x + scr.width < t->x) t->x = scr.x; if(!t->width) t->width = scr.width; if((t->x + t->width) > (scr.x + scr.width) && (t->expand != left)) t->width = scr.width - (t->x - scr.x); if(t->expand == left) { t->x_right_corner = t->x + t->width; t->x = t->width ? t->x_right_corner - t->width : scr.x; } if(!s->width) { s->x = scr.x; s->width = scr.width; } if(t->width == s->width) s->x = t->x; if(s->width != scr.width) { s->x = t->x + (t->width - s->width)/2; if(s->x < scr.x) s->x = scr.x; if(s->x + s->width > scr.x + scr.width) s->x = scr.x + (scr.width - s->width); } if(!dzen.line_height) dzen.line_height = dzen.font.height + 2; if(t->y + dzen.line_height > scr.y + scr.height) t->y = scr.y + scr.height - dzen.line_height; } 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 set_docking_ewmh_info(Display *dpy, Window w, int dock) { unsigned long strut[12] = { 0 }; unsigned long strut_s[4] = { 0 }; XWindowAttributes wa; Atom type; unsigned int desktop; pid_t cur_pid; char *host_name; XTextProperty txt_prop; XRectangle si; #ifdef DZEN_XINERAMA XineramaScreenInfo *xsi; int screen_count,i,max_height; #endif host_name = emalloc(HOST_NAME_MAX); if( (gethostname(host_name, HOST_NAME_MAX) > -1) && (cur_pid = getpid()) ) { XStringListToTextProperty(&host_name, 1, &txt_prop); XSetWMClientMachine(dpy, w, &txt_prop); XFree(txt_prop.value); XChangeProperty( dpy, w, XInternAtom(dpy, "_NET_WM_PID", False), XInternAtom(dpy, "CARDINAL", False), 32, PropModeReplace, (unsigned char *)&cur_pid, 1 ); } free(host_name); XGetWindowAttributes(dpy, w, &wa); #ifdef DZEN_XINERAMA queryscreeninfo(dpy,&si,dzen.xinescreen); #else qsi_no_xinerama(dpy,&si); #endif if(wa.y - si.y == 0) { strut[2] = si.y + wa.height; strut[8] = wa.x; strut[9] = wa.x + wa.width - 1; strut_s[2] = strut[2]; } else if((wa.y - si.y + wa.height) == si.height) { #ifdef DZEN_XINERAMA max_height = si.height; xsi = XineramaQueryScreens(dpy,&screen_count); for(i=0; i < screen_count; i++) { if(xsi[i].height > max_height) max_height = xsi[i].height; } XFree(xsi); /* Adjust strut value if there is a larger screen */ strut[3] = max_height - (si.height + si.y) + wa.height; #else strut[3] = wa.height; #endif strut[10] = wa.x; strut[11] = wa.x + wa.width - 1; strut_s[3] = strut[3]; } if(strut[2] != 0 || strut[3] != 0) { XChangeProperty( dpy, w, XInternAtom(dpy, "_NET_WM_STRUT_PARTIAL", False), XInternAtom(dpy, "CARDINAL", False), 32, PropModeReplace, (unsigned char *)&strut, 12 ); XChangeProperty( dpy, w, XInternAtom(dpy, "_NET_WM_STRUT", False), XInternAtom(dpy, "CARDINAL", False), 32, PropModeReplace, (unsigned char *)&strut, 4 ); } if(dock) { type = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False); XChangeProperty( dpy, w, XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False), XInternAtom(dpy, "ATOM", False), 32, PropModeReplace, (unsigned char *)&type, 1 ); /* some window managers honor this properties*/ type = XInternAtom(dpy, "_NET_WM_STATE_ABOVE", False); XChangeProperty( dpy, w, XInternAtom(dpy, "_NET_WM_STATE", False), XInternAtom(dpy, "ATOM", False), 32, PropModeReplace, (unsigned char *)&type, 1 ); type = XInternAtom(dpy, "_NET_WM_STATE_STICKY", False); XChangeProperty( dpy, w, XInternAtom(dpy, "_NET_WM_STATE", False), XInternAtom(dpy, "ATOM", False), 32, PropModeAppend, (unsigned char *)&type, 1 ); desktop = 0xffffffff; XChangeProperty( dpy, w, XInternAtom(dpy, "_NET_WM_DESKTOP", False), XInternAtom(dpy, "CARDINAL", False), 32, PropModeReplace, (unsigned char *)&desktop, 1 ); } } static void x_create_gcs(void) { XGCValues gcv; gcv.graphics_exposures = 0; /* normal GC */ dzen.gc = XCreateGC(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), GCGraphicsExposures, &gcv); XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColFG]); XSetBackground(dzen.dpy, dzen.gc, dzen.norm[ColBG]); /* reverse color GC */ dzen.rgc = XCreateGC(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), GCGraphicsExposures, &gcv); XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]); XSetBackground(dzen.dpy, dzen.rgc, dzen.norm[ColFG]); /* temporary GC */ dzen.tgc = XCreateGC(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), GCGraphicsExposures, &gcv); } static void x_connect(void) { dzen.dpy = XOpenDisplay(0); if(!dzen.dpy) eprint("dzen: cannot open display\n"); dzen.screen = DefaultScreen(dzen.dpy); } /* Read display styles from X resources. */ static void x_read_resources(void) { XrmDatabase xdb; char* xrm; char* datatype[20]; XrmValue xvalue; XrmInitialize(); xrm = XResourceManagerString(dzen.dpy); if( xrm != NULL ) { xdb = XrmGetStringDatabase(xrm); if( XrmGetResource(xdb, "dzen2.font", "*", datatype, &xvalue) == True ) dzen.fnt = estrdup(xvalue.addr); if( XrmGetResource(xdb, "dzen2.foreground", "*", datatype, &xvalue) == True ) dzen.fg = estrdup(xvalue.addr); if( XrmGetResource(xdb, "dzen2.background", "*", datatype, &xvalue) == True ) dzen.bg = estrdup(xvalue.addr); if( XrmGetResource(xdb, "dzen2.titlename", "*", datatype, &xvalue) == True ) dzen.title_win.name = estrdup(xvalue.addr); if( XrmGetResource(xdb, "dzen2.slavename", "*", datatype, &xvalue) == True ) dzen.slave_win.name = estrdup(xvalue.addr); XrmDestroyDatabase(xdb); } } static void x_create_windows(int use_ewmh_dock) { XSetWindowAttributes wa; Window root; int i; XRectangle si; XClassHint *class_hint; root = RootWindow(dzen.dpy, dzen.screen); /* style */ if((dzen.norm[ColBG] = getcolor(dzen.bg)) == ~0lu) eprint("dzen: error, cannot allocate color '%s'\n", dzen.bg); if((dzen.norm[ColFG] = getcolor(dzen.fg)) == ~0lu) eprint("dzen: error, cannot allocate color '%s'\n", dzen.fg); setfont(dzen.fnt); x_create_gcs(); /* window attributes */ wa.override_redirect = (use_ewmh_dock ? 0 : 1); wa.background_pixmap = ParentRelative; wa.event_mask = ExposureMask | ButtonReleaseMask | ButtonPressMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | KeyPressMask; #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); /* set class property */ class_hint = XAllocClassHint(); class_hint->res_name = "dzen2"; class_hint->res_class = "dzen"; XSetClassHint(dzen.dpy, dzen.title_win.win, class_hint); XFree(class_hint); /* title */ XStoreName(dzen.dpy, dzen.title_win.win, dzen.title_win.name); dzen.title_win.drawable = XCreatePixmap(dzen.dpy, root, dzen.title_win.width, dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); XFillRectangle(dzen.dpy, dzen.title_win.drawable, dzen.rgc, 0, 0, dzen.title_win.width, dzen.line_height); /* set some hints for windowmanagers*/ set_docking_ewmh_info(dzen.dpy, dzen.title_win.win, use_ewmh_dock); /* TODO: Smarter approach to window creation so we can reduce the * size of this function. */ if(dzen.slave_win.max_lines) { dzen.slave_win.first_line_vis = 0; dzen.slave_win.last_line_vis = 0; dzen.slave_win.line = emalloc(sizeof(Window) * dzen.slave_win.max_lines); dzen.slave_win.drawable = emalloc(sizeof(Drawable) * dzen.slave_win.max_lines); /* horizontal menu mode */ if(dzen.slave_win.ishmenu) { /* calculate width of menuentries - this is a very simple * approach but works well for general cases. */ int ew = dzen.slave_win.width / dzen.slave_win.max_lines; int r = dzen.slave_win.width - ew * dzen.slave_win.max_lines; dzen.slave_win.issticky = True; dzen.slave_win.y = dzen.title_win.y; dzen.slave_win.win = XCreateWindow(dzen.dpy, root, dzen.slave_win.x, dzen.slave_win.y, dzen.slave_win.width, dzen.line_height, 0, DefaultDepth(dzen.dpy, dzen.screen), CopyFromParent, DefaultVisual(dzen.dpy, dzen.screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); XStoreName(dzen.dpy, dzen.slave_win.win, dzen.slave_win.name); for(i=0; i < dzen.slave_win.max_lines; i++) { dzen.slave_win.drawable[i] = XCreatePixmap(dzen.dpy, root, ew+r, dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); XFillRectangle(dzen.dpy, dzen.slave_win.drawable[i], dzen.rgc, 0, 0, ew+r, dzen.line_height); } /* windows holding the lines */ for(i=0; i < dzen.slave_win.max_lines; i++) dzen.slave_win.line[i] = XCreateWindow(dzen.dpy, dzen.slave_win.win, i*ew, 0, (i == dzen.slave_win.max_lines-1) ? ew+r : ew, dzen.line_height, 0, DefaultDepth(dzen.dpy, dzen.screen), CopyFromParent, DefaultVisual(dzen.dpy, dzen.screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); /* As we don't use the title window in this mode, * we reuse its width value */ dzen.title_win.width = dzen.slave_win.width; dzen.slave_win.width = ew+r; } /* vertical slave window */ else { 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.y + 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); XStoreName(dzen.dpy, dzen.slave_win.win, dzen.slave_win.name); for(i=0; i < dzen.slave_win.max_lines; i++) { dzen.slave_win.drawable[i] = XCreatePixmap(dzen.dpy, root, dzen.slave_win.width, dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); XFillRectangle(dzen.dpy, dzen.slave_win.drawable[i], dzen.rgc, 0, 0, dzen.slave_win.width, dzen.line_height); } /* windows holding the 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); } } } static void x_map_window(Window win) { XMapRaised(dzen.dpy, win); XSync(dzen.dpy, False); } static void x_redraw(Window w) { int i; if(!dzen.slave_win.ishmenu && w == dzen.title_win.win) drawheader(NULL); if(!dzen.tsupdate && w == dzen.slave_win.win) { for(i=0; i < dzen.slave_win.max_lines; i++) XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc, 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } else { for(i=0; i < dzen.slave_win.max_lines; i++) if(w == dzen.slave_win.line[i]) { XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc, 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } } } static void handle_xev(void) { XEvent ev; int i, sa_clicked=0; char buf[32]; KeySym ksym; XNextEvent(dzen.dpy, &ev); switch(ev.type) { case Expose: if(ev.xexpose.count == 0) x_redraw(ev.xexpose.window); 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_hilight_line(i); } if(!dzen.slave_win.ishmenu && 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_unhilight_line(i); } if(!dzen.slave_win.ishmenu && ev.xcrossing.window == dzen.title_win.win) do_action(leavetitle); if(ev.xcrossing.window == dzen.slave_win.win) { do_action(leaveslave); } 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; } /* clickable areas */ int w_id = ev.xbutton.window == dzen.title_win.win ? 0 : 1; sens_w w = window_sens[w_id]; for(i=w.sens_areas_cnt; i>=0; i--) { if(ev.xbutton.window == w.sens_areas[i].win && ev.xbutton.button == w.sens_areas[i].button && (ev.xbutton.x >= w.sens_areas[i].start_x+xorig[w_id] && ev.xbutton.x <= w.sens_areas[i].end_x+xorig[w_id]) && (ev.xbutton.y >= w.sens_areas[i].start_y && ev.xbutton.y <= w.sens_areas[i].end_y) && w.sens_areas[i].active) { spawn(w.sens_areas[i].cmd); sa_clicked++; break; } } if(!sa_clicked) { 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; case Button6: do_action(button6); break; case Button7: do_action(button7); break; } } break; case KeyPress: XLookupString(&ev.xkey, buf, sizeof buf, &ksym, 0); do_action(ksym+keymarker); break; /* TODO: XRandR rotation and size */ } } static void handle_newl(void) { XWindowAttributes wa; if(dzen.slave_win.max_lines && (dzen.slave_win.tcnt > last_cnt)) { do_action(onnewinput); if (XGetWindowAttributes(dzen.dpy, dzen.slave_win.win, &wa), wa.map_state != IsUnmapped /* autoscroll and redraw only if we're * currently viewing the last line of input */ && (dzen.slave_win.last_line_vis == last_cnt)) { dzen.slave_win.first_line_vis = 0; dzen.slave_win.last_line_vis = 0; x_draw_body(); } /* needed for a_scrollhome */ else if(wa.map_state != IsUnmapped && dzen.slave_win.last_line_vis == dzen.slave_win.max_lines) x_draw_body(); /* forget state if window was unmapped */ else if(wa.map_state == IsUnmapped || !dzen.slave_win.last_line_vis) { dzen.slave_win.first_line_vis = 0; dzen.slave_win.last_line_vis = 0; x_draw_body(); } last_cnt = dzen.slave_win.tcnt; } } static void event_loop(void) { int xfd, ret, dr=0; fd_set rmask; 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 && FD_ISSET(STDIN_FILENO, &rmask)) { if((dr = read_stdin()) == -1) return; handle_newl(); } if(dr == -2 && dzen.timeout > 0) { /* set an alarm to kill us after the timeout */ struct itimerval t; memset(&t, 0, sizeof t); t.it_value.tv_sec = dzen.timeout; t.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &t, NULL); } if(FD_ISSET(xfd, &rmask)) handle_xev(); } } return; } static void x_preload(const char *fontstr, int p) { char *def, **missing; int i, n; missing = NULL; dzen.fnpl[p].set = XCreateFontSet(dzen.dpy, fontstr, &missing, &n, &def); if(missing) XFreeStringList(missing); if(dzen.fnpl[p].set) { XFontSetExtents *font_extents; XFontStruct **xfonts; char **font_names; dzen.fnpl[p].ascent = dzen.fnpl[p].descent = 0; font_extents = XExtentsOfFontSet(dzen.fnpl[p].set); n = XFontsOfFontSet(dzen.fnpl[p].set, &xfonts, &font_names); for(i = 0, dzen.fnpl[p].ascent = 0, dzen.fnpl[p].descent = 0; i < n; i++) { if(dzen.fnpl[p].ascent < (*xfonts)->ascent) dzen.fnpl[p].ascent = (*xfonts)->ascent; if(dzen.fnpl[p].descent < (*xfonts)->descent) dzen.fnpl[p].descent = (*xfonts)->descent; xfonts++; } } else { if(dzen.fnpl[p].xfont) XFreeFont(dzen.dpy, dzen.fnpl[p].xfont); dzen.fnpl[p].xfont = NULL; if(!(dzen.fnpl[p].xfont = XLoadQueryFont(dzen.dpy, fontstr))) eprint("dzen: error, cannot load font: '%s'\n", fontstr); dzen.fnpl[p].ascent = dzen.fnpl[p].xfont->ascent; dzen.fnpl[p].descent = dzen.fnpl[p].xfont->descent; } dzen.fnpl[p].height = dzen.fnpl[p].ascent + dzen.fnpl[p].descent; } static void font_preload(char *s) { int k = 0; char *buf = strtok(s,","); while( buf != NULL ) { if(k<64) x_preload(buf, k++); buf = strtok(NULL,","); } } /* Get alignment from character 'l'eft, 'r'ight and 'c'enter */ static char alignment_from_char(char align) { switch(align) { case 'l' : return ALIGNLEFT; case 'r' : return ALIGNRIGHT; case 'c' : return ALIGNCENTER; default : return ALIGNCENTER; } } static void init_input_buffer(void) { if(MIN_BUF_SIZE % dzen.slave_win.max_lines) dzen.slave_win.tsize = MIN_BUF_SIZE + (dzen.slave_win.max_lines - (MIN_BUF_SIZE % dzen.slave_win.max_lines)); else dzen.slave_win.tsize = MIN_BUF_SIZE; dzen.slave_win.tbuf = emalloc(dzen.slave_win.tsize * sizeof(char *)); } int main(int argc, char *argv[]) { int i, use_ewmh_dock=0; char *action_string = NULL; char *endptr, *fnpre = NULL; /* default values */ dzen.title_win.name = "dzen title"; dzen.slave_win.name = "dzen slave"; 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; dzen.tsupdate = 0; dzen.line_height = 0; dzen.title_win.expand = noexpand; /* Connect to X server */ x_connect(); x_read_resources(); /* 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]); if(dzen.slave_win.max_lines) init_input_buffer(); } } else if(!strncmp(argv[i], "-geometry", 10)) { if(++i < argc) { int t; int tx, ty; unsigned int tw, th; t = XParseGeometry(argv[i], &tx, &ty, &tw, &th); if(t & XValue) dzen.title_win.x = tx; if(t & YValue) { dzen.title_win.y = ty; if(!ty && (t & YNegative)) /* -0 != +0 */ dzen.title_win.y = -1; } if(t & WidthValue) dzen.title_win.width = (signed int) tw; if(t & HeightValue) dzen.line_height = (signed int) th; } } else if(!strncmp(argv[i], "-u", 3)){ dzen.tsupdate = True; } else if(!strncmp(argv[i], "-expand", 8)){ if(++i < argc) { switch(argv[i][0]){ case 'l': dzen.title_win.expand = left; break; case 'c': dzen.title_win.expand = both; break; case 'r': dzen.title_win.expand = right; break; default: dzen.title_win.expand = noexpand; } } } else if(!strncmp(argv[i], "-p", 3)) { dzen.ispersistent = True; if (i+1 < argc) { dzen.timeout = strtoul(argv[i+1], &endptr, 10); if(*endptr) dzen.timeout = 0; else i++; } } else if(!strncmp(argv[i], "-ta", 4)) { if(++i < argc) dzen.title_win.alignment = alignment_from_char(argv[i][0]); } else if(!strncmp(argv[i], "-sa", 4)) { if(++i < argc) dzen.slave_win.alignment = alignment_from_char(argv[i][0]); } else if(!strncmp(argv[i], "-m", 3)) { dzen.slave_win.ismenu = True; if(i+1 < argc) { if( argv[i+1][0] == 'v') { ++i; break; } dzen.slave_win.ishmenu = (argv[i+1][0] == 'h') ? ++i, True : False; } } 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], "-title-name", 12)) { if(++i < argc) dzen.title_win.name = argv[i]; } else if(!strncmp(argv[i], "-slave-name", 12)) { if(++i < argc) dzen.slave_win.name = 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], "-h", 3)) { if(++i < argc) dzen.line_height= atoi(argv[i]); } else if(!strncmp(argv[i], "-tw", 4)) { if(++i < argc) dzen.title_win.width = atoi(argv[i]); } else if(!strncmp(argv[i], "-fn-preload", 12)) { if(++i < argc) { fnpre = estrdup(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], "-dock", 6)) use_ewmh_dock = 1; else if(!strncmp(argv[i], "-v", 3)) { printf("dzen-"VERSION", (C)opyright 2007-2009 Robert Manea\n"); printf( "Enabled optional features: " #ifdef DZEN_XMP " XPM " #endif #ifdef DZEN_XFT " XFT" #endif #ifdef DZEN_XINERAMA " XINERAMA " #endif "\n" ); return EXIT_SUCCESS; } else eprint("usage: dzen2 [-v] [-p [seconds]] [-m [v|h]] [-ta <l|c|r>] [-sa <l|c|r>]\n" " [-x <pixel>] [-y <pixel>] [-w <pixel>] [-h <pixel>] [-tw <pixel>] [-u]\n" " [-e <string>] [-l <lines>] [-fn <font>] [-bg <color>] [-fg <color>]\n" " [-geometry <geometry string>] [-expand <left|right>] [-dock]\n" " [-title-name <string>] [-slave-name <string>]\n" #ifdef DZEN_XINERAMA " [-xs <screen>]\n" #endif ); if(dzen.tsupdate && !dzen.slave_win.max_lines) dzen.tsupdate = False; 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) fill_ev_table(action_string); else { if(!dzen.slave_win.max_lines) { char edef[] = "button3=exit:13"; fill_ev_table(edef); } else if(dzen.slave_win.ishmenu) { char edef[] = "enterslave=grabkeys;leaveslave=ungrabkeys;" "button4=scrollup;button5=scrolldown;" "key_Left=scrollup;key_Right=scrolldown;" "button1=menuexec;button3=exit:13;" "key_Escape=ungrabkeys,exit"; fill_ev_table(edef); } else { char edef[] = "entertitle=uncollapse,grabkeys;" "enterslave=grabkeys;leaveslave=collapse,ungrabkeys;" "button1=menuexec;button2=togglestick;button3=exit:13;" "button4=scrollup;button5=scrolldown;" "key_Up=scrollup;key_Down=scrolldown;" "key_Escape=ungrabkeys,exit"; fill_ev_table(edef); } } if((find_event(onexit) != -1) && (setup_signal(SIGTERM, catch_sigterm) == SIG_ERR)) fprintf(stderr, "dzen: error hooking SIGTERM\n"); if((find_event(sigusr1) != -1) && (setup_signal(SIGUSR1, catch_sigusr1) == SIG_ERR)) fprintf(stderr, "dzen: error hooking SIGUSR1\n"); if((find_event(sigusr2) != -1) && (setup_signal(SIGUSR2, catch_sigusr2) == SIG_ERR)) fprintf(stderr, "dzen: error hooking SIGUSR2\n"); if(setup_signal(SIGALRM, catch_alrm) == SIG_ERR) fprintf(stderr, "dzen: error hooking SIGALARM\n"); if(dzen.slave_win.ishmenu && !dzen.slave_win.max_lines) dzen.slave_win.max_lines = 1; x_create_windows(use_ewmh_dock); if(!dzen.slave_win.ishmenu) x_map_window(dzen.title_win.win); else { XMapRaised(dzen.dpy, dzen.slave_win.win); for(i=0; i < dzen.slave_win.max_lines; i++) XMapWindow(dzen.dpy, dzen.slave_win.line[i]); } if( fnpre != NULL ) font_preload(fnpre); do_action(onstart); /* main loop */ event_loop(); do_action(onexit); clean_up(); if(dzen.ret_val) return dzen.ret_val; return EXIT_SUCCESS; } 070701335BDB2C000081A40000420C00000032000000015240109300000502000000080000001100000000000000000000002000000000dzen2-1379930259.488ab66/util.c/* * (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> #define ONEMASK ((size_t)(-1) / 0xFF) 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 const 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); } 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!306 blocks
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor