├── lib ├── shlib_version ├── Makefile └── swm_hack.c ├── linux ├── util.h ├── queue_compat.h ├── baraction.sh ├── Makefile └── tree.h ├── outdated_man_pages ├── spectrwm_es.1 ├── spectrwm_pt.1 ├── spectrwm_ru.1 └── spectrwm_it.1 ├── osx ├── osx.h ├── Makefile └── osx.c ├── initscreen.sh ├── spectrwm.desktop ├── screenshot.sh ├── Makefile ├── version.h ├── LICENSE.md ├── freebsd └── Makefile ├── netbsd └── Makefile ├── baraction.sh ├── README.md ├── spectrwm_fr_ch.conf ├── spectrwm_se.conf ├── spectrwm_us.conf ├── spectrwm_es.conf ├── spectrwm_cz.conf ├── spectrwm_fr.conf ├── spectrwm.conf └── CHANGELOG.md /lib/shlib_version: -------------------------------------------------------------------------------- 1 | major=0 2 | minor=0 3 | -------------------------------------------------------------------------------- /linux/util.h: -------------------------------------------------------------------------------- 1 | #ifndef WAIT_ANY 2 | #define WAIT_ANY (-1) 3 | #endif 4 | -------------------------------------------------------------------------------- /outdated_man_pages/spectrwm_es.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conformal/spectrwm/HEAD/outdated_man_pages/spectrwm_es.1 -------------------------------------------------------------------------------- /outdated_man_pages/spectrwm_pt.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conformal/spectrwm/HEAD/outdated_man_pages/spectrwm_pt.1 -------------------------------------------------------------------------------- /osx/osx.h: -------------------------------------------------------------------------------- 1 | long long strtonum(const char *, long long, long long, const char **); 2 | void *reallocarray(void *optr, size_t nmemb, size_t size); 3 | -------------------------------------------------------------------------------- /initscreen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Example xrandr multiscreen init 4 | 5 | xrandr --output LVDS --auto 6 | xrandr --output VGA --auto --right-of LVDS 7 | -------------------------------------------------------------------------------- /spectrwm.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=spectrwm 3 | Comment=The spectrwm window manager 4 | Type=Application 5 | Exec=spectrwm 6 | TryExec=spectrwm 7 | DesktopNames=spectrwm; 8 | -------------------------------------------------------------------------------- /screenshot.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | 4 | screenshot() { 5 | case $1 in 6 | full) 7 | scrot -m 8 | ;; 9 | window) 10 | sleep 1 11 | scrot -s 12 | ;; 13 | *) 14 | ;; 15 | esac; 16 | } 17 | 18 | screenshot $1 19 | -------------------------------------------------------------------------------- /linux/queue_compat.h: -------------------------------------------------------------------------------- 1 | #ifndef TAILQ_END 2 | #define TAILQ_END(head) NULL 3 | #endif 4 | 5 | #ifndef TAILQ_FOREACH_SAFE 6 | #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ 7 | for ((var) = TAILQ_FIRST(head); \ 8 | (var) != TAILQ_END(head) && \ 9 | ((tvar) = TAILQ_NEXT(var, field), 1); \ 10 | (var) = (tvar)) 11 | #endif 12 | -------------------------------------------------------------------------------- /lib/Makefile: -------------------------------------------------------------------------------- 1 | .include 2 | 3 | PREFIX?=/usr/local 4 | 5 | LIB= swmhack 6 | NOMAN= yes 7 | SRCS= swm_hack.c 8 | LIBDIR= ${X11BASE}/lib 9 | 10 | CC?= cc 11 | 12 | DEBUGLIBS= no 13 | NOPROFILE= yes 14 | 15 | CFLAGS+= -std=c99 -Wmissing-prototypes -Wall -Wextra -Wshadow -Wno-uninitialized -g 16 | CFLAGS+= -fPIC 17 | CFLAGS+= -I${X11BASE}/include 18 | 19 | install: 20 | ${INSTALL} ${INSTALL_COPY} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 21 | lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} \ 22 | ${PREFIX}/lib/ 23 | 24 | .include 25 | .include 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .include 2 | 3 | PREFIX?=/usr/local 4 | 5 | BINDIR=${PREFIX}/bin 6 | SUBDIR= lib 7 | 8 | PROG=spectrwm 9 | MAN=spectrwm.1 10 | 11 | CFLAGS+=-std=c99 -Wmissing-prototypes -Wall -Wextra -Wshadow -Wno-uninitialized -g 12 | # Uncomment define below to disallow user settable clock format string 13 | #CFLAGS+=-DSWM_DENY_CLOCK_FORMAT 14 | CPPFLAGS+= -I${X11BASE}/include -I${X11BASE}/include/freetype2 15 | LDADD+=-lutil -L${X11BASE}/lib -lX11 -lX11-xcb -lxcb -lxcb-util -lxcb-icccm -lxcb-keysyms -lxcb-randr -lxcb-xinput -lxcb-xtest -lfontconfig -lXft -lXcursor 16 | BUILDVERSION != sh "${.CURDIR}/buildver.sh" 17 | .if !${BUILDVERSION} == "" 18 | CPPFLAGS+= -DSPECTRWM_BUILDSTR=\"$(BUILDVERSION)\" 19 | .endif 20 | 21 | MANDIR= ${PREFIX}/man/man 22 | 23 | obj: _xenocara_obj 24 | 25 | beforeinstall: 26 | ln -sf ${PROG} ${BINDIR}/scrotwm 27 | 28 | spectrwm.html: spectrwm.1 29 | mandoc -Thtml ${.CURDIR}/spectrwm.1 > spectrwm.html 30 | 31 | .include 32 | .include 33 | -------------------------------------------------------------------------------- /version.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2011 Conformal Systems LLC 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | 18 | #ifndef SPECTRWM_VERSION_H 19 | #define SPECTRWM_VERSION_H 20 | 21 | #define SPECTRWM_STR(x) #x 22 | #define SPECTRWM_STRINGIZE(x) SPECTRWM_STR(x) 23 | 24 | #define SPECTRWM_MAJOR 3 25 | #define SPECTRWM_MINOR 7 26 | #define SPECTRWM_PATCH 0 27 | #define SPECTRWM_VERSION SPECTRWM_STRINGIZE(SPECTRWM_MAJOR) "." \ 28 | SPECTRWM_STRINGIZE(SPECTRWM_MINOR) "." \ 29 | SPECTRWM_STRINGIZE(SPECTRWM_PATCH) 30 | 31 | #endif /* SPECTRWM_VERSION_H */ 32 | 33 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009-2016 Marco Peereboom 2 | Copyright (c) 2009-2011 Ryan McBride 3 | Copyright (c) 2009 Darrin Chandler 4 | Copyright (c) 2009 Pierre-Yves Ritschard 5 | Copyright (c) 2010 Tuukka Kataja 6 | Copyright (c) 2011 Jason L. Wright 7 | Copyright (c) 2011-2016 Reginald Kennedy 8 | Copyright (c) 2011-2012 Lawrence Teo 9 | Copyright (c) 2011-2012 Tiago Cunha 10 | Copyright (c) 2012-2015 David Hill 11 | Copyright (c) 2014-2016 Yuri D'Elia 12 | 13 | Permission to use, copy, modify, and distribute this software for any 14 | purpose with or without fee is hereby granted, provided that the above 15 | copyright notice and this permission notice appear in all copies. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 18 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 19 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 20 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 21 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 22 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 23 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 24 | -------------------------------------------------------------------------------- /freebsd/Makefile: -------------------------------------------------------------------------------- 1 | .sinclude 2 | 3 | PREFIX?= /usr/local 4 | LOCALBASE?= /usr/local 5 | 6 | SWM_BINDIR?= $(PREFIX)/bin 7 | SWM_LIBDIR?= $(PREFIX)/lib 8 | SWM_MANDIR?= $(PREFIX)/man 9 | 10 | CC?= cc 11 | 12 | LVERS!= awk -F = '/major/ { printf( "%s.", $$2 ) } /minor/ { printf( "%s", $$2 ) }' ${.CURDIR}/../lib/shlib_version 13 | BUILDVERSION!= sh "${.CURDIR}/../buildver.sh" 14 | .if !${BUILDVERSION} == "" 15 | CFLAGS+= -DSPECTRWM_BUILDSTR=\"$(BUILDVERSION)\" 16 | .endif 17 | 18 | CFLAGS+= -std=c99 -Wmissing-prototypes -Wall -Wextra -Wshadow -Wno-uninitialized -g 19 | CFLAGS+= -I. -I${LOCALBASE}/include -I${LOCALBASE}/include/freetype2 20 | CFLAGS+= -DSWM_LIB=\"$(SWM_LIBDIR)/libswmhack.so.$(LVERS)\" 21 | LDADD+= -lutil -L${LOCALBASE}/lib -lX11 -lX11-xcb -lxcb \ 22 | -lxcb-icccm -lxcb-keysyms -lxcb-randr -lxcb-util -lxcb-xinput -lxcb-xtest -lfontconfig -lXft -lXcursor 23 | 24 | 25 | all: spectrwm libswmhack.so.$(LVERS) 26 | 27 | spectrwm.c: 28 | ln -sf ../spectrwm.c 29 | ln -sf ../version.h 30 | ln -sf ../linux/queue_compat.h 31 | 32 | swm_hack.c: 33 | ln -sf ../lib/swm_hack.c 34 | 35 | spectrwm: spectrwm.o 36 | $(CC) $(LDFLAGS) $(LDADD) -o ${.TARGET} ${.ALLSRC} 37 | 38 | swm_hack.so: swm_hack.c 39 | $(CC) $(CFLAGS) -c -shared -fpic -DPIC -o ${.TARGET} ${.ALLSRC} 40 | 41 | libswmhack.so.$(LVERS): swm_hack.so 42 | $(CC) $(LDFLAGS) -shared -fpic -o ${.TARGET} ${.ALLSRC} 43 | 44 | install: all 45 | install -m 755 -d $(SWM_BINDIR) 46 | install -m 755 -d $(SWM_LIBDIR) 47 | install -m 755 -d $(SWM_MANDIR)/man1 48 | install -m 755 spectrwm $(SWM_BINDIR) 49 | install -m 755 libswmhack.so.$(LVERS) $(SWM_LIBDIR) 50 | install -m 644 ../spectrwm.1 $(SWM_MANDIR)/man1/spectrwm.1 51 | ln -sf spectrwm $(SWM_BINDIR)/scrotwm 52 | 53 | clean: 54 | rm -f spectrwm *.o *.so libswmhack.so.* spectrwm.c swm_hack.c version.h queue_compat.h 55 | 56 | .PHONY: all install clean 57 | 58 | .sinclude 59 | -------------------------------------------------------------------------------- /netbsd/Makefile: -------------------------------------------------------------------------------- 1 | .sinclude 2 | 3 | PREFIX?= /usr/pkg 4 | LOCALBASE?= /usr/pkg 5 | 6 | SWM_BINDIR?= ${DESTDIR}$(PREFIX)/bin 7 | SWM_LIBDIR?= ${DESTDIR}$(PREFIX)/lib 8 | SWM_MANDIR?= ${DESTDIR}$(PREFIX)/${PKGMANDIR} 9 | 10 | LVERS!= awk -F = '/major/ { printf( "%s.", $$2 ) } /minor/ { printf( "%s", $$2 ) }' ${.CURDIR}/../lib/shlib_version 11 | BUILDVERSION!= sh "${.CURDIR}/../buildver.sh" 12 | .if !${BUILDVERSION} == "" 13 | CFLAGS+= -DSPECTRWM_BUILDSTR=\"$(BUILDVERSION)\" 14 | .endif 15 | 16 | CFLAGS+= -std=c99 -Wmissing-prototypes -Wall -Wextra -Wshadow -Wno-uninitialized -g 17 | CFLAGS+= -I. -I${LOCALBASE}/include -I${LOCALBASE}/include/freetype2 18 | CFLAGS+= -DSWM_LIB=\"$(SWM_LIBDIR)/libswmhack.so.$(LVERS)\" 19 | LDADD+= -lutil -L${LOCALBASE}/lib -lX11 -lX11-xcb -lxcb \ 20 | -lxcb-icccm -lxcb-keysyms -lxcb-randr -lxcb-util -lxcb-xinput -lxcb-xtest -lfontconfig -lXft -lXcursor 21 | 22 | 23 | all: spectrwm libswmhack.so.$(LVERS) 24 | 25 | spectrwm.c: 26 | ln -sf ../spectrwm.c 27 | ln -sf ../version.h 28 | ln -sf ../linux/queue_compat.h 29 | 30 | swm_hack.c: 31 | ln -sf ../lib/swm_hack.c 32 | 33 | spectrwm: spectrwm.o 34 | $(CC) $(LDFLAGS) $(LDADD) -o ${.TARGET} ${.ALLSRC} 35 | 36 | swm_hack.so: swm_hack.c 37 | $(CC) $(CFLAGS) -c -shared -fpic -DPIC -o ${.TARGET} ${.ALLSRC} 38 | 39 | libswmhack.so.$(LVERS): swm_hack.so 40 | $(CC) $(LDFLAGS) -shared -fpic -o ${.TARGET} ${.ALLSRC} 41 | 42 | install: all 43 | $(BSD_INSTALL_PROGRAM_DIR) $(SWM_BINDIR) 44 | $(BSD_INSTALL_LIB_DIR) $(SWM_LIBDIR) 45 | $(BSD_INSTALL_MAN_DIR) $(SWM_MANDIR)/man1 46 | $(BSD_INSTALL_PROGRAM) spectrwm $(SWM_BINDIR) 47 | $(BSD_INSTALL_LIB) libswmhack.so.$(LVERS) $(SWM_LIBDIR) 48 | $(BSD_INSTALL_MAN) ../spectrwm.1 $(SWM_MANDIR)/man1/spectrwm.1 49 | ln -sf spectrwm $(SWM_BINDIR)/scrotwm 50 | 51 | clean: 52 | rm -f spectrwm *.o *.so libswmhack.so.* spectrwm.c swm_hack.c version.h queue_compat.h 53 | 54 | .PHONY: all install clean 55 | 56 | .sinclude 57 | -------------------------------------------------------------------------------- /baraction.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Example Bar Action Script for OpenBSD-current. 3 | # 4 | 5 | print_date() { 6 | # The date is printed to the status bar by default. 7 | # To print the date through this script, set clock_enabled to 0 8 | # in spectrwm.conf. Uncomment "print_date" below. 9 | FORMAT="%a %b %d %R %Z %Y" 10 | DATE=`date "+${FORMAT}"` 11 | echo -n "${DATE} " 12 | } 13 | 14 | print_mem() { 15 | MEM=`/usr/bin/top | grep Free: | cut -d " " -f6` 16 | echo -n "Free mem: $MEM " 17 | } 18 | 19 | _print_cpu() { 20 | printf "CPU: %3d%% User %3d%% Nice %3d%% Sys %3d%% Spin %3d%% Int %3d%% Idle " $1 $2 $3 $4 $5 $6 21 | } 22 | 23 | print_cpu() { 24 | OUT="" 25 | # iostat prints each column justified to 3 chars, so if one counter 26 | # is 100, it jams up agains the preceeding one. sort this out. 27 | while [ "${1}x" != "x" ]; do 28 | if [ ${1} -gt 99 ]; then 29 | OUT="$OUT ${1%100} 100" 30 | else 31 | OUT="$OUT ${1}" 32 | fi 33 | shift; 34 | done 35 | _print_cpu $OUT 36 | } 37 | 38 | print_cpuspeed() { 39 | CPU_SPEED=`/sbin/sysctl hw.cpuspeed | cut -d "=" -f2` 40 | printf "CPU speed: %4d MHz " $CPU_SPEED 41 | } 42 | 43 | print_bat() { 44 | BAT_STATUS=$1 45 | BAT_LEVEL=$2 46 | AC_STATUS=$3 47 | 48 | if [ $AC_STATUS -ne 255 -o $BAT_STATUS -lt 4 ]; then 49 | if [ $AC_STATUS -eq 0 ]; then 50 | echo -n "on battery (${BAT_LEVEL}%)" 51 | else 52 | case $AC_STATUS in 53 | 1) 54 | AC_STRING="on AC: " 55 | ;; 56 | 2) 57 | AC_STRING="on backup AC: " 58 | ;; 59 | *) 60 | AC_STRING="" 61 | ;; 62 | esac; 63 | case $BAT_STATUS in 64 | 4) 65 | BAT_STRING="(no battery)" 66 | ;; 67 | [0-3]) 68 | BAT_STRING="(battery ${BAT_LEVEL}%)" 69 | ;; 70 | *) 71 | BAT_STRING="(battery unknown)" 72 | ;; 73 | esac; 74 | 75 | FULL="${AC_STRING}${BAT_STRING}" 76 | if [ "$FULL" != "" ]; then 77 | echo -n "$FULL" 78 | fi 79 | fi 80 | fi 81 | } 82 | 83 | # cache the output of apm(8), no need to call that every second. 84 | APM_DATA="" 85 | I=0 86 | while :; do 87 | IOSTAT_DATA=`/usr/sbin/iostat -C -c 2 | tail -n 1 | grep '[0-9]$'` 88 | if [ $I -eq 0 ]; then 89 | APM_DATA=`/usr/sbin/apm -alb` 90 | fi 91 | # print_date 92 | print_mem 93 | print_cpu $IOSTAT_DATA 94 | print_cpuspeed 95 | print_bat $APM_DATA 96 | echo "" 97 | I=$(( ( ${I} + 1 ) % 11 )) 98 | sleep 1 99 | done 100 | -------------------------------------------------------------------------------- /osx/Makefile: -------------------------------------------------------------------------------- 1 | PREFIX?= /usr/local 2 | BINDIR?= $(PREFIX)/bin 3 | LIBDIR?= $(PREFIX)/lib 4 | MANDIR?= $(PREFIX)/share/man 5 | 6 | BUILDVERSION = $(shell sh $(CURDIR)/../buildver.sh) 7 | 8 | # To use xquartz, uncomment the following three lines. 9 | INCFLAGS+= -I/opt/X11/include -I/opt/X11/include/freetype2/ 10 | LDADD+= -L/opt/X11/lib -lX11 -lXcursor -lfontconfig -lXft 11 | 12 | # To use homebrew, uncomment the following three lines. 13 | #INCFLAGS+= -I/opt/X11/include 14 | #LDADD+= -lX11 -lXcursor -lfontconfig -lXft -L/opt/X11/lib 15 | #INCFLAGS+= -I/usr/local/Cellar/freetype/2.5.0.1/include/freetype2 16 | 17 | # To use homebrew , comment out the following two lines. 18 | #INCFLAGS+= -I/opt/local/include/freetype2 -I/opt/local/include 19 | #LDADD+= -L/opt/local/lib -lX11 -lXcursor -lfontconfig -lXft 20 | 21 | LDADD+= -lxcb-keysyms -lxcb-util -lxcb-randr -lX11-xcb -lxcb-xtest -lxcb -lxcb-icccm 22 | 23 | LVERS= $(shell . ../lib/shlib_version; echo $$major.$$minor) 24 | 25 | CFLAGS+= -std=c99 -Wmissing-prototypes -Wall -Wextra -Wshadow -Wno-uninitialized -g 26 | CFLAGS+= -O2 -D_GNU_SOURCE -D__OSX__ -I. -I.. ${INCFLAGS} 27 | CFLAGS+= -DSWM_LIB=\"$(LIBDIR)/libswmhack.so.$(LVERS)\" 28 | ifneq ("${BUILDVERSION}", "") 29 | CFLAGS+= -DSPECTRWM_BUILDSTR=\"$(BUILDVERSION)\" 30 | endif 31 | 32 | CC?= cc 33 | 34 | all: spectrwm libswmhack.so.$(LVERS) 35 | 36 | spectrwm.c: 37 | ln -sf ../linux/tree.h 38 | ln -sf ../spectrwm.c 39 | ln -sf ../version.h 40 | ln -sf ../linux/queue_compat.h 41 | 42 | swm_hack.c: 43 | ln -sf ../lib/swm_hack.c 44 | 45 | spectrwm: spectrwm.o osx.o 46 | $(CC) $(LDFLAGS) -o $@ $+ $(LDADD) 47 | 48 | %.so: %.c 49 | $(CC) $(CFLAGS) -c -fpic -DPIC $+ -o $@ 50 | 51 | libswmhack.so.$(LVERS): swm_hack.so 52 | $(CC) $(LDFLAGS) -shared -fpic -o libswmhack.so.$(LVERS) swm_hack.so $(LDADD) 53 | # replace above line with this for OSX 10.5 54 | # $(CC) -shared -bundle -fpic -o libswmhack.so.$(LVERS) $(LDADD) swm_hack.so 55 | 56 | install: all 57 | install -m 755 -d $(DESTDIR)$(BINDIR) 58 | install -m 755 -d $(DESTDIR)$(LIBDIR) 59 | install -m 755 -d $(DESTDIR)$(MANDIR)/man1 60 | install -m 755 spectrwm $(DESTDIR)$(BINDIR) 61 | install -m 755 libswmhack.so.$(LVERS) $(DESTDIR)$(LIBDIR) 62 | install -m 644 ../spectrwm.1 $(DESTDIR)$(MANDIR)/man1/spectrwm.1 63 | ln -sf spectrwm $(DESTDIR)$(BINDIR)/scrotwm 64 | ln -sf libswmhack.so.0.0 $(DESTDIR)$(LIBDIR)/libswmhack.so.0 65 | ln -sf libswmhack.so.0.0 $(DESTDIR)$(LIBDIR)/libswmhack.so 66 | 67 | clean: 68 | rm -f spectrwm *.o *.so libswmhack.so.* spectrwm.c swm_hack.c tree.h version.h queue_compat.h 69 | 70 | .PHONY: all install clean 71 | -------------------------------------------------------------------------------- /linux/baraction.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Example Bar Action Script for Linux. 3 | # Requires: acpi, iostat. 4 | # Tested on: Debian 10, Fedora 31. 5 | # 6 | 7 | print_date() { 8 | # The date is printed to the status bar by default. 9 | # To print the date through this script, set clock_enabled to 0 10 | # in spectrwm.conf. Uncomment "print_date" below. 11 | FORMAT="%a %b %d %R %Z %Y" 12 | DATE=`date "+${FORMAT}"` 13 | echo -n "${DATE} " 14 | } 15 | 16 | print_mem() { 17 | MEM=`/usr/bin/free -m | grep ^Mem: | sed -E 's/ +/ /g' | cut -d ' ' -f4` 18 | echo -n "Free mem: ${MEM}M " 19 | } 20 | 21 | _print_cpu() { 22 | printf "CPU: %3d%% User %3d%% Nice %3d%% Sys %3d%% Idle " $1 $2 $3 $6 23 | } 24 | 25 | print_cpu() { 26 | OUT="" 27 | # Remove the decimal part from all the percentages. 28 | while [ "${1}x" != "x" ]; do 29 | OUT="$OUT `echo "${1}" | cut -d '.' -f1`" 30 | shift; 31 | done 32 | _print_cpu $OUT 33 | } 34 | 35 | print_cpuspeed() { 36 | CPU_SPEED=`/usr/bin/lscpu | grep '^CPU MHz:' | sed -E 's/ +/ /g' | cut -d ' ' -f3 | cut -d '.' -f1` 37 | printf "CPU speed: %4d MHz " $CPU_SPEED 38 | } 39 | 40 | print_bat() { 41 | AC_STATUS="$3" 42 | BAT_STATUS="$6" 43 | # Most battery statuses fit into a single word, except "Not charging" 44 | # for which we need to have special handling. 45 | if [ "$BAT_STATUS" = "Not" ]; then 46 | BAT_STATUS="$BAT_STATUS $7" 47 | shift 48 | fi 49 | BAT_LEVEL="`echo "$7" | tr -d ','`" 50 | 51 | if [ "$AC_STATUS" != "" -o "$BAT_STATUS" != "" ]; then 52 | if [ "$BAT_STATUS" = "Discharging," ]; then 53 | echo -n "on battery ($BAT_LEVEL)" 54 | else 55 | case "$AC_STATUS" in 56 | on-line) 57 | AC_STRING="on AC: " 58 | ;; 59 | *) 60 | AC_STRING="" 61 | ;; 62 | esac 63 | case "$BAT_STATUS" in 64 | "") 65 | BAT_STRING="(no battery)" 66 | ;; 67 | *harging,|Full,) 68 | BAT_STRING="(battery $BAT_LEVEL)" 69 | ;; 70 | *) 71 | BAT_STRING="(battery unknown)" 72 | ;; 73 | esac 74 | 75 | FULL="${AC_STRING}${BAT_STRING}" 76 | if [ "$FULL" != "" ]; then 77 | echo -n "$FULL" 78 | fi 79 | fi 80 | fi 81 | } 82 | 83 | # Cache the output of acpi(8), no need to call that every second. 84 | ACPI_DATA="" 85 | I=0 86 | while :; do 87 | IOSTAT_DATA=`/usr/bin/iostat -c | grep '[0-9]$'` 88 | if [ $I -eq 0 ]; then 89 | ACPI_DATA=`/usr/bin/acpi -a 2>/dev/null; /usr/bin/acpi -b 2>/dev/null` 90 | fi 91 | # print_date 92 | print_mem 93 | print_cpu $IOSTAT_DATA 94 | print_cpuspeed 95 | print_bat $ACPI_DATA 96 | echo "" 97 | I=$(( ( ${I} + 1 ) % 11 )) 98 | sleep 1 99 | done 100 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | spectrwm 2 | ======== 3 | 4 | spectrwm is a small, dynamic tiling and reparenting window manager for X11. It 5 | tries to stay out of the way so that valuable screen real estate can be used 6 | for much more important stuff. It has sane defaults, and it does not require one to 7 | learn a language to do any configuration. spectrwm is written by hackers for hackers, 8 | and it strives to be small, compact, and fast. 9 | 10 | spectrwm was largely inspired by [xmonad](http://xmonad.org) and 11 | [dwm](http://dwm.suckless.org). Both are fine products, but they suffer from things 12 | like: crazy-unportable-language syndrome, silly defaults, asymmetrical window 13 | layout, the 'how hard can it be?' (to code efficiently) problem, and good old NIH. Nevertheless, 14 | [dwm](http://dwm.suckless.org) was a phenomenal resource, and good ideas 15 | and code were borrowed from it. On the other hand, [xmonad](http://xmonad.org) 16 | has great defaults and key bindings, plus xinerama support, but it is crippled by not 17 | being written in C. 18 | 19 | spectrwm is a beautiful pearl! For it, too, was created by grinding irritation. 20 | Nothing is a bigger waste of time either than moving windows around until they are the 21 | right size-ish or having just about any relevant key combination be eaten 22 | by some task one never performs. The path of agony is too long to quote, and, in 23 | classic [OpenBSD](http://www.openbsd.org) fashion (put up, or hack up), a 24 | brand new window manager was whooped up to serve no other purpose than to obey 25 | its masters. 26 | 27 | spectrwm is released under the ISC license. Patches can be accepted, provided that they are also licensed with ISC. 28 | 29 | ## Building and installation 30 | [Click here for current installation guide](https://github.com/conformal/spectrwm/wiki/Installation) 31 | 32 | ## Feedback and questions 33 | You can and come chat with us on IRC. We use the [OFTC](https://www.oftc.net) 34 | channel #spectrwm. 35 | 36 | ## Major features 37 | * Dynamic RandR support (multi-head) 38 | * Navigation anywhere on all screens with either the keyboard or mouse 39 | * Customizable status bar 40 | * Human readable configuration file 41 | * Restartable without losing state 42 | * Quick launch menu 43 | * Many screen layouts possible with a few simple key strokes 44 | * Windows can be added or removed from master area 45 | * Windows can be moved to any workspace or within a region 46 | * Resizable master area 47 | * Move/resize floating windows 48 | * Drag-to-float 49 | * Extended Window Manager Hints (EWMH) Support 50 | * Configureable tiling 51 | * Adjustable tile gap allows for a true one pixel border. 52 | * Customizable colors and border width. 53 | * User definable regions 54 | * User definable modkey & key bindings 55 | * User definable quirk bindings 56 | * User definable key bindings to launch applications 57 | * Multi OS support (\*BSD, Linux, OSX, Windows/cygwin) 58 | * Reparenting window manager 59 | 60 | ## Documentation 61 | [Click here for current man page](https://htmlpreview.github.io/?https://github.com/conformal/spectrwm/blob/master/spectrwm.html) 62 | 63 | ## License 64 | 65 | spectrwm is ISC licensed unless otherwise specified in individual files. 66 | 67 | ## Screenshots 68 | ![Vertical stack](https://github.com/conformal/spectrwm/wiki/Scrotwm1.png) 69 | 70 | ![Horizontal stack](https://github.com/conformal/spectrwm/wiki/Scrotwm2.png) 71 | 72 | ![Horizontal stack](https://github.com/conformal/spectrwm/wiki/Scrotwm3.png) 73 | 74 | ![Vertical stack with floater and extra window in master area](https://github.com/conformal/spectrwm/wiki/Scrotwm4.png) 75 | 76 | ![mplayer, resized and moved](https://github.com/conformal/spectrwm/wiki/Scrotwm5.png) 77 | -------------------------------------------------------------------------------- /osx/osx.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "osx.h" 11 | 12 | /* --------------------------------------------------------------------------- */ 13 | /* $OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $ */ 14 | 15 | /* 16 | * Copyright (c) 2004 Ted Unangst and Todd Miller 17 | * All rights reserved. 18 | * 19 | * Permission to use, copy, modify, and distribute this software for any 20 | * purpose with or without fee is hereby granted, provided that the above 21 | * copyright notice and this permission notice appear in all copies. 22 | * 23 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 24 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 25 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 26 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 27 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 28 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 29 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 30 | */ 31 | 32 | #define INVALID 1 33 | #define TOOSMALL 2 34 | #define TOOLARGE 3 35 | 36 | long long 37 | strtonum(const char *numstr, long long minval, long long maxval, 38 | const char **errstrp) 39 | { 40 | long long ll = 0; 41 | char *ep; 42 | int error = 0; 43 | struct errval { 44 | const char *errstr; 45 | int err; 46 | } ev[4] = { 47 | { NULL, 0 }, 48 | { "invalid", EINVAL }, 49 | { "too small", ERANGE }, 50 | { "too large", ERANGE }, 51 | }; 52 | 53 | ev[0].err = errno; 54 | errno = 0; 55 | if (minval > maxval) 56 | error = INVALID; 57 | else { 58 | ll = strtoll(numstr, &ep, 10); 59 | if (numstr == ep || *ep != '\0') 60 | error = INVALID; 61 | else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval) 62 | error = TOOSMALL; 63 | else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval) 64 | error = TOOLARGE; 65 | } 66 | if (errstrp != NULL) 67 | *errstrp = ev[error].errstr; 68 | errno = ev[error].err; 69 | if (error) 70 | ll = 0; 71 | 72 | return (ll); 73 | } 74 | 75 | /* $OpenBSD: reallocarray.c,v 1.3 2015/09/13 08:31:47 guenther Exp $ */ 76 | /* 77 | * Copyright (c) 2008 Otto Moerbeek 78 | * 79 | * Permission to use, copy, modify, and distribute this software for any 80 | * purpose with or without fee is hereby granted, provided that the above 81 | * copyright notice and this permission notice appear in all copies. 82 | * 83 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 84 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 85 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 86 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 87 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 88 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 89 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 90 | */ 91 | 92 | #include 93 | #include 94 | #include 95 | #include 96 | 97 | /* 98 | * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX 99 | * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW 100 | */ 101 | #define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4)) 102 | 103 | void * 104 | reallocarray(void *optr, size_t nmemb, size_t size) 105 | { 106 | if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && 107 | nmemb > 0 && SIZE_MAX / nmemb < size) { 108 | errno = ENOMEM; 109 | return NULL; 110 | } 111 | return realloc(optr, size * nmemb); 112 | } 113 | -------------------------------------------------------------------------------- /linux/Makefile: -------------------------------------------------------------------------------- 1 | PREFIX ?= /usr/local 2 | BINDIR ?= $(PREFIX)/bin 3 | LIBDIR ?= $(PREFIX)/lib 4 | SYSCONFDIR ?= $(PREFIX)/etc 5 | DATAROOTDIR ?= $(PREFIX)/share 6 | MANDIR ?= $(DATAROOTDIR)/man 7 | DOCDIR ?= $(DATAROOTDIR)/doc/spectrwm 8 | XSESSIONSDIR ?= $(DATAROOTDIR)/xsessions 9 | PKG_CONFIG ?= pkg-config 10 | 11 | BUILDVERSION := $(shell sh $(CURDIR)/../buildver.sh) 12 | LIBVERSION := $(shell . $(CURDIR)/../lib/shlib_version; echo $$major.$$minor) 13 | LIBMAJORVERSION := $(shell . $(CURDIR)/../lib/shlib_version; echo $$major) 14 | 15 | MAINT_CFLAGS := -std=c99 -Wmissing-prototypes -Wall -Wextra -Wshadow -g 16 | MAINT_LDFLAGS := -Wl,--as-needed 17 | MAINT_CPPFLAGS := -I. -D_GNU_SOURCE -DSWM_LIB=\"$(LIBDIR)/libswmhack.so.$(LIBVERSION)\" 18 | 19 | ifneq ("${BUILDVERSION}", "") 20 | MAINT_CPPFLAGS += -DSPECTRWM_BUILDSTR=\"$(BUILDVERSION)\" 21 | endif 22 | 23 | BIN_CFLAGS := -fPIE 24 | BIN_LDFLAGS := -fPIE -pie 25 | BIN_CPPFLAGS := $(shell $(PKG_CONFIG) --cflags libbsd-overlay x11 x11-xcb xcb-icccm xcb-keysyms xcb-randr xcb-util xcb-xinput xcb-xtest xcursor fontconfig xft) 26 | BIN_LDLIBS := $(shell $(PKG_CONFIG) --libs libbsd-overlay x11 x11-xcb xcb-icccm xcb-keysyms xcb-randr xcb-util xcb-xinput xcb-xtest xcursor fontconfig xft) 27 | LIB_CFLAGS := -fPIC 28 | LIB_LDFLAGS := -fPIC -shared 29 | LIB_CPPFLAGS := $(shell $(PKG_CONFIG) --cflags x11) 30 | LIB_LDLIBS := -ldl 31 | 32 | all: spectrwm libswmhack.so.$(LIBVERSION) 33 | 34 | spectrwm: spectrwm.o 35 | $(CC) $(MAINT_LDFLAGS) $(BIN_LDFLAGS) $(LDFLAGS) -o $@ $+ $(BIN_LDLIBS) $(LDLIBS) 36 | 37 | spectrwm.o: ../spectrwm.c ../version.h tree.h util.h queue_compat.h 38 | $(CC) $(MAINT_CFLAGS) $(BIN_CFLAGS) $(CFLAGS) $(MAINT_CPPFLAGS) $(BIN_CPPFLAGS) $(CPPFLAGS) -c -o $@ $< 39 | 40 | libswmhack.so.$(LIBVERSION): swm_hack.so 41 | $(CC) $(MAINT_LDFLAGS) $(LIB_LDFLAGS) $(LDFLAGS) -Wl,-soname,$@ -o $@ $+ $(LIB_LDLIBS) $(LDLIBS) 42 | 43 | swm_hack.so: ../lib/swm_hack.c 44 | $(CC) $(MAINT_CFLAGS) $(LIB_CFLAGS) $(CFLAGS) $(MAINT_CPPFLAGS) $(LIB_CPPFLAGS) $(CPPFLAGS) -c -o $@ $< 45 | 46 | clean: 47 | rm -f spectrwm *.o libswmhack.so.* *.so 48 | 49 | install: all 50 | install -m 755 -d $(DESTDIR)$(BINDIR) 51 | install -m 755 -d $(DESTDIR)$(LIBDIR) 52 | install -m 755 -d $(DESTDIR)$(SYSCONFDIR) 53 | install -m 755 -d $(DESTDIR)$(MANDIR)/man1 54 | install -m 755 -d $(DESTDIR)$(DOCDIR) 55 | install -m 755 -d $(DESTDIR)$(DOCDIR)/examples 56 | install -m 755 -d $(DESTDIR)$(XSESSIONSDIR) 57 | install -m 755 spectrwm $(DESTDIR)$(BINDIR) 58 | ln -sf spectrwm $(DESTDIR)$(BINDIR)/scrotwm 59 | install -m 755 libswmhack.so.$(LIBVERSION) $(DESTDIR)$(LIBDIR) 60 | ln -sf libswmhack.so.$(LIBVERSION) $(DESTDIR)$(LIBDIR)/libswmhack.so.$(LIBMAJORVERSION) 61 | ln -sf libswmhack.so.$(LIBVERSION) $(DESTDIR)$(LIBDIR)/libswmhack.so 62 | install -m 644 ../spectrwm.conf $(DESTDIR)$(SYSCONFDIR) 63 | install -m 644 ../spectrwm.1 $(DESTDIR)$(MANDIR)/man1 64 | install -m 644 ../CHANGELOG.md $(DESTDIR)$(DOCDIR) 65 | install -m 644 ../LICENSE.md $(DESTDIR)$(DOCDIR) 66 | install -m 644 baraction.sh $(DESTDIR)$(DOCDIR)/examples 67 | install -m 644 ../initscreen.sh $(DESTDIR)$(DOCDIR)/examples 68 | install -m 644 ../screenshot.sh $(DESTDIR)$(DOCDIR)/examples 69 | install -m 644 ../spectrwm_*.conf $(DESTDIR)$(DOCDIR)/examples 70 | install -m 644 ../spectrwm.desktop $(DESTDIR)$(XSESSIONSDIR) 71 | 72 | uninstall: 73 | rm -f $(DESTDIR)$(BINDIR)/spectrwm 74 | rm -f $(DESTDIR)$(BINDIR)/scrotwm 75 | rm -f $(DESTDIR)$(LIBDIR)/libswmhack.so.$(LIBVERSION) 76 | rm -f $(DESTDIR)$(LIBDIR)/libswmhack.so.$(LIBMAJORVERSION) 77 | rm -f $(DESTDIR)$(LIBDIR)/libswmhack.so 78 | rm -f $(DESTDIR)$(SYSCONFDIR)/spectrwm.conf 79 | rm -f $(DESTDIR)$(MANDIR)/man1/spectrwm.1 80 | rm -f $(DESTDIR)$(DOCDIR)/CHANGELOG.md 81 | rm -f $(DESTDIR)$(DOCDIR)/LICENSE.md 82 | rm -f $(DESTDIR)$(DOCDIR)/examples/baraction.sh 83 | rm -f $(DESTDIR)$(DOCDIR)/examples/initscreen.sh 84 | rm -f $(DESTDIR)$(DOCDIR)/examples/screenshot.sh 85 | rm -f $(DESTDIR)$(DOCDIR)/examples/spectrwm_*.conf 86 | rm -f $(DESTDIR)$(XSESSIONSDIR)/spectrwm.desktop 87 | 88 | .PHONY: all clean install uninstall 89 | -------------------------------------------------------------------------------- /spectrwm_fr_ch.conf: -------------------------------------------------------------------------------- 1 | # Key bindings for Swiss French (FR_CH) keyboards 2 | # unbind with: bind[] = 3 | bind[bar_toggle] = MOD+b 4 | bind[bar_toggle_ws] = MOD+Shift+b 5 | bind[below_toggle] = MOD+Shift+t 6 | bind[button2] = MOD+v 7 | bind[center_layout] = MOD+backslash 8 | bind[cycle_layout] = MOD+space 9 | bind[flip_layout] = MOD+Shift+backslash 10 | bind[float_toggle] = MOD+t 11 | bind[focus_free] = MOD+section 12 | bind[focus_main] = MOD+m 13 | bind[focus_next] = MOD+j 14 | bind[focus_next] = MOD+Tab 15 | bind[focus_prev] = MOD+k 16 | bind[focus_prev] = MOD+Shift+Tab 17 | bind[focus_prior] = MOD+Shift+a 18 | bind[focus_urgent] = MOD+u 19 | bind[free_toggle] = MOD+Shift+section 20 | bind[fullscreen_toggle] = MOD+Shift+e 21 | bind[height_grow] = MOD+Shift+egrave 22 | bind[height_shrink] = MOD+Shift+minus 23 | bind[iconify] = MOD+w 24 | bind[initscr] = MOD+Shift+i 25 | #bind[layout_floating] = 26 | #bind[layout_horizontal] = 27 | #bind[layout_max] = 28 | #bind[layout_vertical] = 29 | bind[lock] = MOD+Shift+Delete 30 | bind[master_add] = MOD+comma 31 | bind[master_del] = MOD+period 32 | bind[master_grow] = MOD+l 33 | bind[master_shrink] = MOD+h 34 | bind[maximize_toggle] = MOD+e 35 | bind[menu] = MOD+p 36 | bind[move_down] = MOD+Shift+agrave 37 | bind[move_left] = MOD+eacute 38 | bind[move_right] = MOD+agrave 39 | bind[move_up] = MOD+Shift+eacute 40 | bind[mvrg_1] = MOD+Shift+KP_End 41 | bind[mvrg_2] = MOD+Shift+KP_Down 42 | bind[mvrg_3] = MOD+Shift+KP_Next 43 | bind[mvrg_4] = MOD+Shift+KP_Left 44 | bind[mvrg_5] = MOD+Shift+KP_Begin 45 | bind[mvrg_6] = MOD+Shift+KP_Right 46 | bind[mvrg_7] = MOD+Shift+KP_Home 47 | bind[mvrg_8] = MOD+Shift+KP_Up 48 | bind[mvrg_9] = MOD+Shift+KP_Prior 49 | #bind[mvrg_next] = 50 | #bind[mvrg_prev] = 51 | bind[mvws_1] = MOD+Shift+1 52 | bind[mvws_2] = MOD+Shift+2 53 | bind[mvws_3] = MOD+Shift+3 54 | bind[mvws_4] = MOD+Shift+4 55 | bind[mvws_5] = MOD+Shift+5 56 | bind[mvws_6] = MOD+Shift+6 57 | bind[mvws_7] = MOD+Shift+7 58 | bind[mvws_8] = MOD+Shift+8 59 | bind[mvws_9] = MOD+Shift+9 60 | bind[mvws_10] = MOD+Shift+0 61 | bind[mvws_11] = MOD+Shift+F1 62 | bind[mvws_12] = MOD+Shift+F2 63 | bind[mvws_13] = MOD+Shift+F3 64 | bind[mvws_14] = MOD+Shift+F4 65 | bind[mvws_15] = MOD+Shift+F5 66 | bind[mvws_16] = MOD+Shift+F6 67 | bind[mvws_17] = MOD+Shift+F7 68 | bind[mvws_18] = MOD+Shift+F8 69 | bind[mvws_19] = MOD+Shift+F9 70 | bind[mvws_20] = MOD+Shift+F10 71 | bind[mvws_21] = MOD+Shift+F11 72 | bind[mvws_22] = MOD+Shift+F12 73 | bind[name_workspace] = MOD+Shift+apostrophe 74 | bind[quit] = MOD+Shift+q 75 | bind[raise] = MOD+r 76 | bind[raise_toggle] = MOD+Shift+r 77 | #bind[reload] = 78 | bind[restart] = MOD+q 79 | #bind[restart_of_day] = 80 | bind[rg_1] = MOD+KP_End 81 | bind[rg_2] = MOD+KP_Down 82 | bind[rg_3] = MOD+KP_Next 83 | bind[rg_4] = MOD+KP_Left 84 | bind[rg_5] = MOD+KP_Begin 85 | bind[rg_6] = MOD+KP_Right 86 | bind[rg_7] = MOD+KP_Home 87 | bind[rg_8] = MOD+KP_Up 88 | bind[rg_9] = MOD+KP_Prior 89 | #bind[rg_move_next] = 90 | #bind[rg_move_prev] = 91 | bind[rg_next] = MOD+Shift+Right 92 | bind[rg_prev] = MOD+Shift+Left 93 | bind[screenshot_all] = MOD+s 94 | bind[screenshot_wind] = MOD+Shift+s 95 | bind[search_win] = MOD+f 96 | bind[search_workspace] = MOD+apostrophe 97 | #bind[stack_balance] = 98 | bind[stack_dec] = MOD+Shift+period 99 | bind[stack_inc] = MOD+Shift+comma 100 | bind[stack_reset] = MOD+Shift+space 101 | bind[swap_main] = MOD+Return 102 | bind[swap_next] = MOD+Shift+j 103 | bind[swap_prev] = MOD+Shift+k 104 | bind[term] = MOD+Shift+Return 105 | bind[uniconify] = MOD+Shift+w 106 | #bind[uniconify_quick] = 107 | bind[version] = MOD+Shift+v 108 | bind[width_grow] = MOD+egrave 109 | bind[width_shrink] = MOD+minus 110 | bind[wind_del] = MOD+x 111 | bind[wind_kill] = MOD+Shift+x 112 | bind[ws_1] = MOD+1 113 | bind[ws_2] = MOD+2 114 | bind[ws_3] = MOD+3 115 | bind[ws_4] = MOD+4 116 | bind[ws_5] = MOD+5 117 | bind[ws_6] = MOD+6 118 | bind[ws_7] = MOD+7 119 | bind[ws_8] = MOD+8 120 | bind[ws_9] = MOD+9 121 | bind[ws_10] = MOD+0 122 | bind[ws_11] = MOD+F1 123 | bind[ws_12] = MOD+F2 124 | bind[ws_13] = MOD+F3 125 | bind[ws_14] = MOD+F4 126 | bind[ws_15] = MOD+F5 127 | bind[ws_16] = MOD+F6 128 | bind[ws_17] = MOD+F7 129 | bind[ws_18] = MOD+F8 130 | bind[ws_19] = MOD+F9 131 | bind[ws_20] = MOD+F10 132 | bind[ws_21] = MOD+F11 133 | bind[ws_22] = MOD+F12 134 | #bind[ws_empty] = 135 | #bind[ws_empty_move] = 136 | bind[ws_next] = MOD+Right 137 | bind[ws_next_all] = MOD+Up 138 | bind[ws_next_move] = MOD+Shift+Up 139 | bind[ws_prev] = MOD+Left 140 | bind[ws_prev_all] = MOD+Down 141 | bind[ws_prev_move] = MOD+Shift+Down 142 | bind[ws_prior] = MOD+a 143 | bind[debug_toggle] = MOD+d 144 | bind[dumpwins] = MOD+Shift+d 145 | -------------------------------------------------------------------------------- /spectrwm_se.conf: -------------------------------------------------------------------------------- 1 | # Key bindings for Swedish (se) keyboards 2 | # unbind with: bind[] = 3 | bind[bar_toggle] = MOD+b 4 | bind[bar_toggle_ws] = MOD+Shift+b 5 | bind[below_toggle] = MOD+Shift+t 6 | bind[button2] = MOD+v 7 | bind[center_layout] = MOD+apostrophe 8 | bind[cycle_layout] = MOD+space 9 | bind[flip_layout] = MOD+Shift+apostrophe 10 | bind[float_toggle] = MOD+t 11 | bind[focus_free] = MOD+section 12 | bind[focus_main] = MOD+m 13 | bind[focus_next] = MOD+j 14 | bind[focus_next] = MOD+Tab 15 | bind[focus_prev] = MOD+k 16 | bind[focus_prev] = MOD+Shift+Tab 17 | bind[focus_prior] = MOD+Shift+a 18 | bind[focus_urgent] = MOD+u 19 | bind[free_toggle] = MOD+Shift+section 20 | bind[fullscreen_toggle] = MOD+Shift+e 21 | bind[height_grow] = MOD+Shift+dead_acute 22 | bind[height_shrink] = MOD+Shift+plus 23 | bind[iconify] = MOD+w 24 | bind[initscr] = MOD+Shift+i 25 | #bind[layout_floating] = 26 | #bind[layout_horizontal] = 27 | #bind[layout_max] = 28 | #bind[layout_vertical] = 29 | bind[lock] = MOD+Shift+Delete 30 | bind[master_add] = MOD+comma 31 | bind[master_del] = MOD+period 32 | bind[master_grow] = MOD+l 33 | bind[master_shrink] = MOD+h 34 | bind[maximize_toggle] = MOD+e 35 | bind[menu] = MOD+p 36 | bind[move_down] = MOD+Shift+dead_diaeresis 37 | bind[move_left] = MOD+aring 38 | bind[move_right] = MOD+dead_diaeresis 39 | bind[move_up] = MOD+Shift+aring 40 | bind[mvrg_1] = MOD+Shift+KP_End 41 | bind[mvrg_2] = MOD+Shift+KP_Down 42 | bind[mvrg_3] = MOD+Shift+KP_Next 43 | bind[mvrg_4] = MOD+Shift+KP_Left 44 | bind[mvrg_5] = MOD+Shift+KP_Begin 45 | bind[mvrg_6] = MOD+Shift+KP_Right 46 | bind[mvrg_7] = MOD+Shift+KP_Home 47 | bind[mvrg_8] = MOD+Shift+KP_Up 48 | bind[mvrg_9] = MOD+Shift+KP_Prior 49 | #bind[mvrg_next] = 50 | #bind[mvrg_prev] = 51 | bind[mvws_1] = MOD+Shift+1 52 | bind[mvws_2] = MOD+Shift+2 53 | bind[mvws_3] = MOD+Shift+3 54 | bind[mvws_4] = MOD+Shift+4 55 | bind[mvws_5] = MOD+Shift+5 56 | bind[mvws_6] = MOD+Shift+6 57 | bind[mvws_7] = MOD+Shift+7 58 | bind[mvws_8] = MOD+Shift+8 59 | bind[mvws_9] = MOD+Shift+9 60 | bind[mvws_10] = MOD+Shift+0 61 | bind[mvws_11] = MOD+Shift+F1 62 | bind[mvws_12] = MOD+Shift+F2 63 | bind[mvws_13] = MOD+Shift+F3 64 | bind[mvws_14] = MOD+Shift+F4 65 | bind[mvws_15] = MOD+Shift+F5 66 | bind[mvws_16] = MOD+Shift+F6 67 | bind[mvws_17] = MOD+Shift+F7 68 | bind[mvws_18] = MOD+Shift+F8 69 | bind[mvws_19] = MOD+Shift+F9 70 | bind[mvws_20] = MOD+Shift+F10 71 | bind[mvws_21] = MOD+Shift+F11 72 | bind[mvws_22] = MOD+Shift+F12 73 | bind[name_workspace] = MOD+Shift+minus 74 | bind[quit] = MOD+Shift+q 75 | bind[raise] = MOD+r 76 | bind[raise_toggle] = MOD+Shift+r 77 | #bind[reload] = 78 | bind[restart] = MOD+q 79 | #bind[restart_of_day] = 80 | bind[rg_1] = MOD+KP_End 81 | bind[rg_2] = MOD+KP_Down 82 | bind[rg_3] = MOD+KP_Next 83 | bind[rg_4] = MOD+KP_Left 84 | bind[rg_5] = MOD+KP_Begin 85 | bind[rg_6] = MOD+KP_Right 86 | bind[rg_7] = MOD+KP_Home 87 | bind[rg_8] = MOD+KP_Up 88 | bind[rg_9] = MOD+KP_Prior 89 | #bind[rg_move_next] = 90 | #bind[rg_move_prev] = 91 | bind[rg_next] = MOD+Shift+Right 92 | bind[rg_prev] = MOD+Shift+Left 93 | bind[screenshot_all] = MOD+s 94 | bind[screenshot_wind] = MOD+Shift+s 95 | bind[search_win] = MOD+f 96 | bind[search_workspace] = MOD+minus 97 | #bind[stack_balance] = 98 | bind[stack_dec] = MOD+Shift+period 99 | bind[stack_inc] = MOD+Shift+comma 100 | bind[stack_reset] = MOD+Shift+space 101 | bind[swap_main] = MOD+Return 102 | bind[swap_next] = MOD+Shift+j 103 | bind[swap_prev] = MOD+Shift+k 104 | bind[term] = MOD+Shift+Return 105 | bind[uniconify] = MOD+Shift+w 106 | #bind[uniconify_quick] = 107 | bind[version] = MOD+Shift+v 108 | bind[width_grow] = MOD+dead_acute 109 | bind[width_shrink] = MOD+plus 110 | bind[wind_del] = MOD+x 111 | bind[wind_kill] = MOD+Shift+x 112 | bind[ws_1] = MOD+1 113 | bind[ws_2] = MOD+2 114 | bind[ws_3] = MOD+3 115 | bind[ws_4] = MOD+4 116 | bind[ws_5] = MOD+5 117 | bind[ws_6] = MOD+6 118 | bind[ws_7] = MOD+7 119 | bind[ws_8] = MOD+8 120 | bind[ws_9] = MOD+9 121 | bind[ws_10] = MOD+0 122 | bind[ws_11] = MOD+F1 123 | bind[ws_12] = MOD+F2 124 | bind[ws_13] = MOD+F3 125 | bind[ws_14] = MOD+F4 126 | bind[ws_15] = MOD+F5 127 | bind[ws_16] = MOD+F6 128 | bind[ws_17] = MOD+F7 129 | bind[ws_18] = MOD+F8 130 | bind[ws_19] = MOD+F9 131 | bind[ws_20] = MOD+F10 132 | bind[ws_21] = MOD+F11 133 | bind[ws_22] = MOD+F12 134 | #bind[ws_empty] = 135 | #bind[ws_empty_move] = 136 | bind[ws_next] = MOD+Right 137 | bind[ws_next_all] = MOD+Up 138 | bind[ws_next_move] = MOD+Shift+Up 139 | bind[ws_prev] = MOD+Left 140 | bind[ws_prev_all] = MOD+Down 141 | bind[ws_prev_move] = MOD+Shift+Down 142 | bind[ws_prior] = MOD+a 143 | bind[debug_toggle] = MOD+d 144 | bind[dumpwins] = MOD+Shift+d 145 | -------------------------------------------------------------------------------- /spectrwm_us.conf: -------------------------------------------------------------------------------- 1 | # Key bindings for United States (us) keyboards 2 | # unbind with: bind[] = 3 | bind[bar_toggle] = MOD+b 4 | bind[bar_toggle_ws] = MOD+Shift+b 5 | bind[below_toggle] = MOD+Shift+t 6 | bind[button2] = MOD+v 7 | bind[center_layout] = MOD+backslash 8 | bind[cycle_layout] = MOD+space 9 | bind[flip_layout] = MOD+Shift+backslash 10 | bind[float_toggle] = MOD+t 11 | bind[focus_free] = MOD+grave 12 | bind[focus_main] = MOD+m 13 | bind[focus_next] = MOD+j 14 | bind[focus_next] = MOD+Tab 15 | bind[focus_prev] = MOD+k 16 | bind[focus_prev] = MOD+Shift+Tab 17 | bind[focus_prior] = MOD+Shift+a 18 | bind[focus_urgent] = MOD+u 19 | bind[free_toggle] = MOD+Shift+grave 20 | bind[fullscreen_toggle] = MOD+Shift+e 21 | bind[height_grow] = MOD+Shift+equal 22 | bind[height_shrink] = MOD+Shift+minus 23 | bind[iconify] = MOD+w 24 | bind[initscr] = MOD+Shift+i 25 | #bind[layout_floating] = 26 | #bind[layout_horizontal] = 27 | #bind[layout_max] = 28 | #bind[layout_vertical] = 29 | bind[lock] = MOD+Shift+Delete 30 | bind[master_add] = MOD+comma 31 | bind[master_del] = MOD+period 32 | bind[master_grow] = MOD+l 33 | bind[master_shrink] = MOD+h 34 | bind[maximize_toggle] = MOD+e 35 | bind[menu] = MOD+p 36 | bind[move_down] = MOD+Shift+bracketright 37 | bind[move_left] = MOD+bracketleft 38 | bind[move_right] = MOD+bracketright 39 | bind[move_up] = MOD+Shift+bracketleft 40 | bind[mvrg_1] = MOD+Shift+KP_End 41 | bind[mvrg_2] = MOD+Shift+KP_Down 42 | bind[mvrg_3] = MOD+Shift+KP_Next 43 | bind[mvrg_4] = MOD+Shift+KP_Left 44 | bind[mvrg_5] = MOD+Shift+KP_Begin 45 | bind[mvrg_6] = MOD+Shift+KP_Right 46 | bind[mvrg_7] = MOD+Shift+KP_Home 47 | bind[mvrg_8] = MOD+Shift+KP_Up 48 | bind[mvrg_9] = MOD+Shift+KP_Prior 49 | #bind[mvrg_next] = 50 | #bind[mvrg_prev] = 51 | bind[mvws_1] = MOD+Shift+1 52 | bind[mvws_2] = MOD+Shift+2 53 | bind[mvws_3] = MOD+Shift+3 54 | bind[mvws_4] = MOD+Shift+4 55 | bind[mvws_5] = MOD+Shift+5 56 | bind[mvws_6] = MOD+Shift+6 57 | bind[mvws_7] = MOD+Shift+7 58 | bind[mvws_8] = MOD+Shift+8 59 | bind[mvws_9] = MOD+Shift+9 60 | bind[mvws_10] = MOD+Shift+0 61 | bind[mvws_11] = MOD+Shift+F1 62 | bind[mvws_12] = MOD+Shift+F2 63 | bind[mvws_13] = MOD+Shift+F3 64 | bind[mvws_14] = MOD+Shift+F4 65 | bind[mvws_15] = MOD+Shift+F5 66 | bind[mvws_16] = MOD+Shift+F6 67 | bind[mvws_17] = MOD+Shift+F7 68 | bind[mvws_18] = MOD+Shift+F8 69 | bind[mvws_19] = MOD+Shift+F9 70 | bind[mvws_20] = MOD+Shift+F10 71 | bind[mvws_21] = MOD+Shift+F11 72 | bind[mvws_22] = MOD+Shift+F12 73 | bind[name_workspace] = MOD+Shift+slash 74 | bind[quit] = MOD+Shift+q 75 | bind[raise] = MOD+r 76 | bind[raise_toggle] = MOD+Shift+r 77 | #bind[reload] = 78 | bind[restart] = MOD+q 79 | #bind[restart_of_day] = 80 | bind[rg_1] = MOD+KP_End 81 | bind[rg_2] = MOD+KP_Down 82 | bind[rg_3] = MOD+KP_Next 83 | bind[rg_4] = MOD+KP_Left 84 | bind[rg_5] = MOD+KP_Begin 85 | bind[rg_6] = MOD+KP_Right 86 | bind[rg_7] = MOD+KP_Home 87 | bind[rg_8] = MOD+KP_Up 88 | bind[rg_9] = MOD+KP_Prior 89 | #bind[rg_move_next] = 90 | #bind[rg_move_prev] = 91 | bind[rg_next] = MOD+Shift+Right 92 | bind[rg_prev] = MOD+Shift+Left 93 | bind[screenshot_all] = MOD+s 94 | bind[screenshot_wind] = MOD+Shift+s 95 | bind[search_win] = MOD+f 96 | bind[search_workspace] = MOD+slash 97 | #bind[stack_balance] = 98 | bind[stack_dec] = MOD+Shift+period 99 | bind[stack_inc] = MOD+Shift+comma 100 | bind[stack_reset] = MOD+Shift+space 101 | bind[swap_main] = MOD+Return 102 | bind[swap_next] = MOD+Shift+j 103 | bind[swap_prev] = MOD+Shift+k 104 | bind[term] = MOD+Shift+Return 105 | bind[uniconify] = MOD+Shift+w 106 | #bind[uniconify_quick] = 107 | bind[version] = MOD+Shift+v 108 | bind[width_grow] = MOD+equal 109 | bind[width_shrink] = MOD+minus 110 | bind[wind_del] = MOD+x 111 | bind[wind_kill] = MOD+Shift+x 112 | bind[ws_1] = MOD+1 113 | bind[ws_2] = MOD+2 114 | bind[ws_3] = MOD+3 115 | bind[ws_4] = MOD+4 116 | bind[ws_5] = MOD+5 117 | bind[ws_6] = MOD+6 118 | bind[ws_7] = MOD+7 119 | bind[ws_8] = MOD+8 120 | bind[ws_9] = MOD+9 121 | bind[ws_10] = MOD+0 122 | bind[ws_11] = MOD+F1 123 | bind[ws_12] = MOD+F2 124 | bind[ws_13] = MOD+F3 125 | bind[ws_14] = MOD+F4 126 | bind[ws_15] = MOD+F5 127 | bind[ws_16] = MOD+F6 128 | bind[ws_17] = MOD+F7 129 | bind[ws_18] = MOD+F8 130 | bind[ws_19] = MOD+F9 131 | bind[ws_20] = MOD+F10 132 | bind[ws_21] = MOD+F11 133 | bind[ws_22] = MOD+F12 134 | #bind[ws_empty] = 135 | #bind[ws_empty_move] = 136 | bind[ws_next] = MOD+Right 137 | bind[ws_next_all] = MOD+Up 138 | bind[ws_next_move] = MOD+Shift+Up 139 | bind[ws_prev] = MOD+Left 140 | bind[ws_prev_all] = MOD+Down 141 | bind[ws_prev_move] = MOD+Shift+Down 142 | bind[ws_prior] = MOD+a 143 | bind[debug_toggle] = MOD+d 144 | bind[dumpwins] = MOD+Shift+d 145 | -------------------------------------------------------------------------------- /spectrwm_es.conf: -------------------------------------------------------------------------------- 1 | # Key bindings for Spanish (es) keyboards 2 | # unbind with: bind[] = 3 | bind[bar_toggle] = MOD+b 4 | bind[bar_toggle_ws] = MOD+Shift+b 5 | bind[below_toggle] = MOD+Shift+t 6 | bind[button2] = MOD+v 7 | bind[center_layout] = MOD+backslash 8 | bind[cycle_layout] = MOD+space 9 | bind[flip_layout] = MOD+Shift+backslash 10 | bind[float_toggle] = MOD+t 11 | bind[focus_free] = MOD+masculine 12 | bind[focus_main] = MOD+m 13 | bind[focus_next] = MOD+j 14 | bind[focus_next] = MOD+Tab 15 | bind[focus_prev] = MOD+k 16 | bind[focus_prev] = MOD+Shift+Tab 17 | bind[focus_prior] = MOD+Shift+a 18 | bind[focus_urgent] = MOD+u 19 | bind[free_toggle] = MOD+Shift+masculine 20 | bind[fullscreen_toggle] = MOD+Shift+e 21 | bind[height_grow] = MOD+Shift+exclamdown 22 | bind[height_shrink] = MOD+Shift+apostrophe 23 | bind[iconify] = MOD+w 24 | bind[initscr] = MOD+Shift+i 25 | #bind[layout_floating] = 26 | #bind[layout_horizontal] = 27 | #bind[layout_max] = 28 | #bind[layout_vertical] = 29 | bind[lock] = MOD+Shift+Delete 30 | bind[master_add] = MOD+comma 31 | bind[master_del] = MOD+period 32 | bind[master_grow] = MOD+l 33 | bind[master_shrink] = MOD+h 34 | bind[maximize_toggle] = MOD+e 35 | bind[menu] = MOD+p 36 | bind[move_down] = MOD+Shift+plus 37 | bind[move_left] = MOD+dead_grave 38 | bind[move_right] = MOD+plus 39 | bind[move_up] = MOD+Shift+dead_grave 40 | bind[mvrg_1] = MOD+Shift+KP_End 41 | bind[mvrg_2] = MOD+Shift+KP_Down 42 | bind[mvrg_3] = MOD+Shift+KP_Next 43 | bind[mvrg_4] = MOD+Shift+KP_Left 44 | bind[mvrg_5] = MOD+Shift+KP_Begin 45 | bind[mvrg_6] = MOD+Shift+KP_Right 46 | bind[mvrg_7] = MOD+Shift+KP_Home 47 | bind[mvrg_8] = MOD+Shift+KP_Up 48 | bind[mvrg_9] = MOD+Shift+KP_Prior 49 | #bind[mvrg_next] = 50 | #bind[mvrg_prev] = 51 | bind[mvws_1] = MOD+Shift+1 52 | bind[mvws_2] = MOD+Shift+2 53 | bind[mvws_3] = MOD+Shift+3 54 | bind[mvws_4] = MOD+Shift+4 55 | bind[mvws_5] = MOD+Shift+5 56 | bind[mvws_6] = MOD+Shift+6 57 | bind[mvws_7] = MOD+Shift+7 58 | bind[mvws_8] = MOD+Shift+8 59 | bind[mvws_9] = MOD+Shift+9 60 | bind[mvws_10] = MOD+Shift+0 61 | bind[mvws_11] = MOD+Shift+F1 62 | bind[mvws_12] = MOD+Shift+F2 63 | bind[mvws_13] = MOD+Shift+F3 64 | bind[mvws_14] = MOD+Shift+F4 65 | bind[mvws_15] = MOD+Shift+F5 66 | bind[mvws_16] = MOD+Shift+F6 67 | bind[mvws_17] = MOD+Shift+F7 68 | bind[mvws_18] = MOD+Shift+F8 69 | bind[mvws_19] = MOD+Shift+F9 70 | bind[mvws_20] = MOD+Shift+F10 71 | bind[mvws_21] = MOD+Shift+F11 72 | bind[mvws_22] = MOD+Shift+F12 73 | bind[name_workspace] = MOD+Shift+slash 74 | bind[quit] = MOD+Shift+q 75 | bind[raise] = MOD+r 76 | bind[raise_toggle] = MOD+Shift+r 77 | #bind[reload] = 78 | bind[restart] = MOD+q 79 | #bind[restart_of_day] = 80 | bind[rg_1] = MOD+KP_End 81 | bind[rg_2] = MOD+KP_Down 82 | bind[rg_3] = MOD+KP_Next 83 | bind[rg_4] = MOD+KP_Left 84 | bind[rg_5] = MOD+KP_Begin 85 | bind[rg_6] = MOD+KP_Right 86 | bind[rg_7] = MOD+KP_Home 87 | bind[rg_8] = MOD+KP_Up 88 | bind[rg_9] = MOD+KP_Prior 89 | #bind[rg_move_next] = 90 | #bind[rg_move_prev] = 91 | bind[rg_next] = MOD+Shift+Right 92 | bind[rg_prev] = MOD+Shift+Left 93 | bind[screenshot_all] = MOD+s 94 | bind[screenshot_wind] = MOD+Shift+s 95 | bind[search_win] = MOD+f 96 | bind[search_workspace] = MOD+slash 97 | #bind[stack_balance] = 98 | bind[stack_dec] = MOD+Shift+period 99 | bind[stack_inc] = MOD+Shift+comma 100 | bind[stack_reset] = MOD+Shift+space 101 | bind[swap_main] = MOD+Return 102 | bind[swap_next] = MOD+Shift+j 103 | bind[swap_prev] = MOD+Shift+k 104 | bind[term] = MOD+Shift+Return 105 | bind[uniconify] = MOD+Shift+w 106 | #bind[uniconify_quick] = 107 | bind[version] = MOD+Shift+v 108 | bind[width_grow] = MOD+exclamdown 109 | bind[width_shrink] = MOD+apostrophe 110 | bind[wind_del] = MOD+x 111 | bind[wind_kill] = MOD+Shift+x 112 | bind[ws_1] = MOD+1 113 | bind[ws_2] = MOD+2 114 | bind[ws_3] = MOD+3 115 | bind[ws_4] = MOD+4 116 | bind[ws_5] = MOD+5 117 | bind[ws_6] = MOD+6 118 | bind[ws_7] = MOD+7 119 | bind[ws_8] = MOD+8 120 | bind[ws_9] = MOD+9 121 | bind[ws_10] = MOD+0 122 | bind[ws_11] = MOD+F1 123 | bind[ws_12] = MOD+F2 124 | bind[ws_13] = MOD+F3 125 | bind[ws_14] = MOD+F4 126 | bind[ws_15] = MOD+F5 127 | bind[ws_16] = MOD+F6 128 | bind[ws_17] = MOD+F7 129 | bind[ws_18] = MOD+F8 130 | bind[ws_19] = MOD+F9 131 | bind[ws_20] = MOD+F10 132 | bind[ws_21] = MOD+F11 133 | bind[ws_22] = MOD+F12 134 | #bind[ws_empty] = 135 | #bind[ws_empty_move] = 136 | bind[ws_next] = MOD+Right 137 | bind[ws_next_all] = MOD+Up 138 | bind[ws_next_move] = MOD+Shift+Up 139 | bind[ws_prev] = MOD+Left 140 | bind[ws_prev_all] = MOD+Down 141 | bind[ws_prev_move] = MOD+Shift+Down 142 | bind[ws_prior] = MOD+a 143 | bind[debug_toggle] = MOD+d 144 | bind[dumpwins] = MOD+Shift+d 145 | -------------------------------------------------------------------------------- /spectrwm_cz.conf: -------------------------------------------------------------------------------- 1 | # Key bindings for Czech Republic (cz) keyboards 2 | # unbind with: bind[] = 3 | bind[bar_toggle] = MOD+b 4 | bind[bar_toggle_ws] = MOD+Shift+b 5 | bind[below_toggle] = MOD+Shift+t 6 | bind[button2] = MOD+v 7 | bind[center_layout] = MOD+backslash 8 | bind[cycle_layout] = MOD+space 9 | bind[flip_layout] = MOD+Shift+backslash 10 | bind[float_toggle] = MOD+t 11 | bind[focus_free] = MOD+semicolon 12 | bind[focus_main] = MOD+m 13 | bind[focus_next] = MOD+j 14 | bind[focus_next] = MOD+Tab 15 | bind[focus_prev] = MOD+k 16 | bind[focus_prev] = MOD+Shift+Tab 17 | bind[focus_prior] = MOD+Shift+a 18 | bind[focus_urgent] = MOD+u 19 | bind[free_toggle] = MOD+Shift+semicolon 20 | bind[fullscreen_toggle] = MOD+Shift+e 21 | bind[height_grow] = MOD+Shift+dead_acute 22 | bind[height_shrink] = MOD+Shift+equal 23 | bind[iconify] = MOD+w 24 | bind[initscr] = MOD+Shift+i 25 | #bind[layout_floating] = 26 | #bind[layout_horizontal] = 27 | #bind[layout_max] = 28 | #bind[layout_vertical] = 29 | bind[lock] = MOD+Shift+Delete 30 | bind[master_add] = MOD+comma 31 | bind[master_del] = MOD+period 32 | bind[master_grow] = MOD+l 33 | bind[master_shrink] = MOD+h 34 | bind[maximize_toggle] = MOD+e 35 | bind[menu] = MOD+p 36 | bind[move_down] = MOD+Shift+parenright 37 | bind[move_left] = MOD+uacute 38 | bind[move_right] = MOD+parenright 39 | bind[move_up] = MOD+Shift+uacute 40 | bind[mvrg_1] = MOD+Shift+KP_End 41 | bind[mvrg_2] = MOD+Shift+KP_Down 42 | bind[mvrg_3] = MOD+Shift+KP_Next 43 | bind[mvrg_4] = MOD+Shift+KP_Left 44 | bind[mvrg_5] = MOD+Shift+KP_Begin 45 | bind[mvrg_6] = MOD+Shift+KP_Right 46 | bind[mvrg_7] = MOD+Shift+KP_Home 47 | bind[mvrg_8] = MOD+Shift+KP_Up 48 | bind[mvrg_9] = MOD+Shift+KP_Prior 49 | #bind[mvrg_next] = 50 | #bind[mvrg_prev] = 51 | bind[mvws_1] = MOD+Shift+plus 52 | bind[mvws_2] = MOD+Shift+ecaron 53 | bind[mvws_3] = MOD+Shift+scaron 54 | bind[mvws_4] = MOD+Shift+ccaron 55 | bind[mvws_5] = MOD+Shift+rcaron 56 | bind[mvws_6] = MOD+Shift+zcaron 57 | bind[mvws_7] = MOD+Shift+yacute 58 | bind[mvws_8] = MOD+Shift+aacute 59 | bind[mvws_9] = MOD+Shift+iacute 60 | bind[mvws_10] = MOD+Shift+eacute 61 | bind[mvws_11] = MOD+Shift+F1 62 | bind[mvws_12] = MOD+Shift+F2 63 | bind[mvws_13] = MOD+Shift+F3 64 | bind[mvws_14] = MOD+Shift+F4 65 | bind[mvws_15] = MOD+Shift+F5 66 | bind[mvws_16] = MOD+Shift+F6 67 | bind[mvws_17] = MOD+Shift+F7 68 | bind[mvws_18] = MOD+Shift+F8 69 | bind[mvws_19] = MOD+Shift+F9 70 | bind[mvws_20] = MOD+Shift+F10 71 | bind[mvws_21] = MOD+Shift+F11 72 | bind[mvws_22] = MOD+Shift+F12 73 | bind[name_workspace] = MOD+Shift+slash 74 | bind[quit] = MOD+Shift+q 75 | bind[raise] = MOD+r 76 | bind[raise_toggle] = MOD+Shift+r 77 | #bind[reload] = 78 | bind[restart] = MOD+q 79 | #bind[restart_of_day] = 80 | bind[rg_1] = MOD+KP_End 81 | bind[rg_2] = MOD+KP_Down 82 | bind[rg_3] = MOD+KP_Next 83 | bind[rg_4] = MOD+KP_Left 84 | bind[rg_5] = MOD+KP_Begin 85 | bind[rg_6] = MOD+KP_Right 86 | bind[rg_7] = MOD+KP_Home 87 | bind[rg_8] = MOD+KP_Up 88 | bind[rg_9] = MOD+KP_Prior 89 | #bind[rg_move_next] = 90 | #bind[rg_move_prev] = 91 | bind[rg_next] = MOD+Shift+Right 92 | bind[rg_prev] = MOD+Shift+Left 93 | bind[screenshot_all] = MOD+s 94 | bind[screenshot_wind] = MOD+Shift+s 95 | bind[search_win] = MOD+f 96 | bind[search_workspace] = MOD+slash 97 | #bind[stack_balance] = 98 | bind[stack_dec] = MOD+Shift+period 99 | bind[stack_inc] = MOD+Shift+comma 100 | bind[stack_reset] = MOD+Shift+space 101 | bind[swap_main] = MOD+Return 102 | bind[swap_next] = MOD+Shift+j 103 | bind[swap_prev] = MOD+Shift+k 104 | bind[term] = MOD+Shift+Return 105 | bind[uniconify] = MOD+Shift+w 106 | #bind[uniconify_quick] = 107 | bind[version] = MOD+Shift+v 108 | bind[width_grow] = MOD+dead_acute 109 | bind[width_shrink] = MOD+equal 110 | bind[wind_del] = MOD+x 111 | bind[wind_kill] = MOD+Shift+x 112 | bind[ws_1] = MOD+plus 113 | bind[ws_2] = MOD+ecaron 114 | bind[ws_3] = MOD+scaron 115 | bind[ws_4] = MOD+ccaron 116 | bind[ws_5] = MOD+rcaron 117 | bind[ws_6] = MOD+zcaron 118 | bind[ws_7] = MOD+yacute 119 | bind[ws_8] = MOD+aacute 120 | bind[ws_9] = MOD+iacute 121 | bind[ws_10] = MOD+eacute 122 | bind[ws_11] = MOD+F1 123 | bind[ws_12] = MOD+F2 124 | bind[ws_13] = MOD+F3 125 | bind[ws_14] = MOD+F4 126 | bind[ws_15] = MOD+F5 127 | bind[ws_16] = MOD+F6 128 | bind[ws_17] = MOD+F7 129 | bind[ws_18] = MOD+F8 130 | bind[ws_19] = MOD+F9 131 | bind[ws_20] = MOD+F10 132 | bind[ws_21] = MOD+F11 133 | bind[ws_22] = MOD+F12 134 | #bind[ws_empty] = 135 | #bind[ws_empty_move] = 136 | bind[ws_next] = MOD+Right 137 | bind[ws_next_all] = MOD+Up 138 | bind[ws_next_move] = MOD+Shift+Up 139 | bind[ws_prev] = MOD+Left 140 | bind[ws_prev_all] = MOD+Down 141 | bind[ws_prev_move] = MOD+Shift+Down 142 | bind[ws_prior] = MOD+a 143 | bind[debug_toggle] = MOD+d 144 | bind[dumpwins] = MOD+Shift+d 145 | -------------------------------------------------------------------------------- /spectrwm_fr.conf: -------------------------------------------------------------------------------- 1 | # Key bindings for French (fr) keyboards 2 | # unbind with: bind[] = 3 | bind[bar_toggle] = MOD+b 4 | bind[bar_toggle_ws] = MOD+Shift+b 5 | bind[below_toggle] = MOD+Shift+t 6 | bind[button2] = MOD+v 7 | bind[center_layout] = MOD+dollar 8 | bind[cycle_layout] = MOD+space 9 | bind[flip_layout] = MOD+Shift+dollar 10 | bind[float_toggle] = MOD+t 11 | bind[focus_free] = MOD+twosuperior 12 | bind[focus_main] = MOD+m 13 | bind[focus_next] = MOD+j 14 | bind[focus_next] = MOD+Tab 15 | bind[focus_prev] = MOD+k 16 | bind[focus_prev] = MOD+Shift+Tab 17 | bind[focus_prior] = MOD+Shift+a 18 | bind[focus_urgent] = MOD+u 19 | bind[free_toggle] = MOD+Shift+twosuperior 20 | bind[fullscreen_toggle] = MOD+Shift+e 21 | bind[height_grow] = MOD+Shift+equal 22 | bind[height_shrink] = MOD+Shift+parenright 23 | bind[iconify] = MOD+w 24 | bind[initscr] = MOD+Shift+i 25 | #bind[layout_floating] = 26 | #bind[layout_horizontal] = 27 | #bind[layout_max] = 28 | #bind[layout_vertical] = 29 | bind[lock] = MOD+Shift+Delete 30 | bind[master_add] = MOD+comma 31 | bind[master_del] = MOD+semicolon 32 | bind[master_grow] = MOD+l 33 | bind[master_shrink] = MOD+h 34 | bind[maximize_toggle] = MOD+e 35 | bind[menu] = MOD+p 36 | bind[move_down] = MOD+Shift+asterisk 37 | bind[move_left] = MOD+ugrave 38 | bind[move_right] = MOD+asterisk 39 | bind[move_up] = MOD+Shift+ugrave 40 | bind[mvrg_1] = MOD+Shift+KP_End 41 | bind[mvrg_2] = MOD+Shift+KP_Down 42 | bind[mvrg_3] = MOD+Shift+KP_Next 43 | bind[mvrg_4] = MOD+Shift+KP_Left 44 | bind[mvrg_5] = MOD+Shift+KP_Begin 45 | bind[mvrg_6] = MOD+Shift+KP_Right 46 | bind[mvrg_7] = MOD+Shift+KP_Home 47 | bind[mvrg_8] = MOD+Shift+KP_Up 48 | bind[mvrg_9] = MOD+Shift+KP_Prior 49 | #bind[mvrg_next] = 50 | #bind[mvrg_prev] = 51 | bind[mvws_1] = MOD+Shift+ampersand 52 | bind[mvws_2] = MOD+Shift+eacute 53 | bind[mvws_3] = MOD+Shift+quotedbl 54 | bind[mvws_4] = MOD+Shift+apostrophe 55 | bind[mvws_5] = MOD+Shift+parenleft 56 | bind[mvws_6] = MOD+Shift+minus 57 | bind[mvws_7] = MOD+Shift+egrave 58 | bind[mvws_8] = MOD+Shift+underscore 59 | bind[mvws_9] = MOD+Shift+ccedilla 60 | bind[mvws_10] = MOD+Shift+agrave 61 | bind[mvws_11] = MOD+Shift+F1 62 | bind[mvws_12] = MOD+Shift+F2 63 | bind[mvws_13] = MOD+Shift+F3 64 | bind[mvws_14] = MOD+Shift+F4 65 | bind[mvws_15] = MOD+Shift+F5 66 | bind[mvws_16] = MOD+Shift+F6 67 | bind[mvws_17] = MOD+Shift+F7 68 | bind[mvws_18] = MOD+Shift+F8 69 | bind[mvws_19] = MOD+Shift+F9 70 | bind[mvws_20] = MOD+Shift+F10 71 | bind[mvws_21] = MOD+Shift+F11 72 | bind[mvws_22] = MOD+Shift+F12 73 | bind[name_workspace] = MOD+Shift+colon 74 | bind[quit] = MOD+Shift+q 75 | bind[raise] = MOD+r 76 | bind[raise_toggle] = MOD+Shift+r 77 | #bind[reload] = 78 | bind[restart] = MOD+q 79 | #bind[restart_of_day] = 80 | bind[rg_1] = MOD+KP_End 81 | bind[rg_2] = MOD+KP_Down 82 | bind[rg_3] = MOD+KP_Next 83 | bind[rg_4] = MOD+KP_Left 84 | bind[rg_5] = MOD+KP_Begin 85 | bind[rg_6] = MOD+KP_Right 86 | bind[rg_7] = MOD+KP_Home 87 | bind[rg_8] = MOD+KP_Up 88 | bind[rg_9] = MOD+KP_Prior 89 | #bind[rg_move_next] = 90 | #bind[rg_move_prev] = 91 | bind[rg_next] = MOD+Shift+Right 92 | bind[rg_prev] = MOD+Shift+Left 93 | bind[screenshot_all] = MOD+s 94 | bind[screenshot_wind] = MOD+Shift+s 95 | bind[search_win] = MOD+f 96 | bind[search_workspace] = MOD+colon 97 | #bind[stack_balance] = 98 | bind[stack_dec] = MOD+Shift+semicolon 99 | bind[stack_inc] = MOD+Shift+comma 100 | bind[stack_reset] = MOD+Shift+space 101 | bind[swap_main] = MOD+Return 102 | bind[swap_next] = MOD+Shift+j 103 | bind[swap_prev] = MOD+Shift+k 104 | bind[term] = MOD+Shift+Return 105 | bind[uniconify] = MOD+Shift+w 106 | #bind[uniconify_quick] = 107 | bind[version] = MOD+Shift+v 108 | bind[width_grow] = MOD+equal 109 | bind[width_shrink] = MOD+minus 110 | bind[wind_del] = MOD+x 111 | bind[wind_kill] = MOD+Shift+x 112 | bind[ws_1] = MOD+ampersand 113 | bind[ws_2] = MOD+eacute 114 | bind[ws_3] = MOD+quotedbl 115 | bind[ws_4] = MOD+apostrophe 116 | bind[ws_5] = MOD+parenleft 117 | bind[ws_6] = MOD+minus 118 | bind[ws_7] = MOD+egrave 119 | bind[ws_8] = MOD+underscore 120 | bind[ws_9] = MOD+ccedilla 121 | bind[ws_10] = MOD+agrave 122 | bind[ws_11] = MOD+F1 123 | bind[ws_12] = MOD+F2 124 | bind[ws_13] = MOD+F3 125 | bind[ws_14] = MOD+F4 126 | bind[ws_15] = MOD+F5 127 | bind[ws_16] = MOD+F6 128 | bind[ws_17] = MOD+F7 129 | bind[ws_18] = MOD+F8 130 | bind[ws_19] = MOD+F9 131 | bind[ws_20] = MOD+F10 132 | bind[ws_21] = MOD+F11 133 | bind[ws_22] = MOD+F12 134 | #bind[ws_empty] = 135 | #bind[ws_empty_move] = 136 | bind[ws_next] = MOD+Right 137 | bind[ws_next_all] = MOD+Up 138 | bind[ws_next_move] = MOD+Shift+Up 139 | bind[ws_prev] = MOD+Left 140 | bind[ws_prev_all] = MOD+Down 141 | bind[ws_prev_move] = MOD+Shift+Down 142 | bind[ws_prior] = MOD+a 143 | bind[debug_toggle] = MOD+d 144 | bind[dumpwins] = MOD+Shift+d 145 | -------------------------------------------------------------------------------- /spectrwm.conf: -------------------------------------------------------------------------------- 1 | # 2 | # spectrwm Example Configuration File 3 | # 4 | # PLEASE READ THE MAN PAGE BEFORE EDITING THIS FILE! 5 | # https://htmlpreview.github.io/?https://github.com/conformal/spectrwm/blob/master/spectrwm.html 6 | # 7 | # All example settings in this file are commented out with a '#'. 8 | # See the spectrwm(1) man page for default values. 9 | # 10 | # NOTE: rgb color values are in hexadecimal! See XQueryColor(3) for details. 11 | 12 | #workspace_limit = 22 13 | #focus_mode = default 14 | #focus_close = previous 15 | #focus_close_wrap = 1 16 | #focus_default = last 17 | #spawn_position = next 18 | #workspace_autorotate = 1 19 | #workspace_clamp = 1 20 | #warp_focus = 1 21 | #warp_pointer = 1 22 | #click_to_raise = 1 23 | #center_autobalance = 1 24 | #center_nowrap = 1 25 | #center_adaptive = 1 26 | #center_noautostack = 1 27 | #uniconify_order = latest 28 | 29 | # Include mapped workspaces when switching with any of the ws next/prev actions. 30 | #cycle_visible = 1 31 | 32 | # Sequence of layouts used by the cycle_layout action. 33 | #layout_order = vertical,horizontal,max,floating 34 | 35 | # Window Decoration 36 | #border_width = 1 37 | #color_focus = red 38 | #color_focus_maximized = yellow 39 | #color_unfocus = rgb:88/88/88 40 | #color_unfocus_maximized = rgb:88/88/00 41 | #color_urgent = rgb:ff/a5/00 42 | #color_urgent_maximized = rgb:ff/a5/00 43 | #color_focus_free = cyan 44 | #color_focus_maximized_free = magenta 45 | #color_unfocus_free = rgb:00/88/88 46 | #color_unfocus_maximized_free = rgb:88/00/88 47 | #color_urgent_free = rgb:b8/86/0b 48 | #color_urgent_maximized_free = rgb:b8/86/0b 49 | #region_padding = 0 50 | #tile_gap = 0 51 | 52 | # Region containment 53 | # Distance window must be dragged/resized beyond the region edge before it is 54 | # allowed outside the region. 55 | #boundary_width = 50 56 | 57 | # Settings that apply when regions have a single window 58 | # '1' - apply only when status bar is disabled. 59 | # 'always' - apply regardless of status bar. 60 | #disable_border = 1 # remove window border 61 | #disable_padding = always # disable region padding 62 | 63 | # Bar Settings 64 | #bar_enabled = 1 65 | #bar_enabled_ws[1] = 1 66 | #bar_border_width = 1 67 | #bar_border[1] = rgb:00/80/80 68 | #bar_border_unfocus[1] = rgb:00/40/40 69 | #bar_border_free[1] = rgb:80/80/00 70 | #bar_color[1] = black 71 | #bar_color_unfocus[1] = black 72 | #bar_color_free[1] = rgb:40/40/00 73 | #bar_color_selected[1] = rgb:00/80/80 74 | #bar_font_color[1] = rgb:a0/a0/a0 75 | #bar_font_color_unfocus[1] = rgb:a0/a0/a0 76 | #bar_font_color_free[1] = white 77 | #bar_font_color_selected = black 78 | #bar_font = xos4 Terminus:pixelsize=14:antialias=true 79 | #bar_font_pua = Typicons:pixelsize=14:antialias=true 80 | #bar_action = baraction.sh 81 | #bar_action_expand = 0 82 | #bar_justify = left 83 | #bar_format = +N:+I +S <+D>+4<%a %b %d %R %Z %Y+8<+A+4<+V 84 | #bar_workspace_limit = 0 85 | #workspace_indicator = listcurrent,listactive,markcurrent,printnames 86 | #workspace_mark_current = '*' 87 | #workspace_mark_current_suffix = '' 88 | #workspace_mark_active = '^' 89 | #workspace_mark_active_suffix = '' 90 | #workspace_mark_empty = '-' 91 | #workspace_mark_empty_suffix = '' 92 | #workspace_mark_urgent = '!' 93 | #workspace_mark_urgent_suffix = '' 94 | #bar_at_bottom = 1 95 | #stack_enabled = 1 96 | #stack_mark_horizontal = '[-]' 97 | #stack_mark_horizontal_flip = '[v]' 98 | #stack_mark_horizontal_center = '(-)' 99 | #stack_mark_horizontal_center_flip = '(v)' 100 | #stack_mark_vertical = '[|]' 101 | #stack_mark_vertical_flip = '[>]' 102 | #stack_mark_vertical_center = '(|)' 103 | #stack_mark_vertical_center_flip = '(>)' 104 | #stack_mark_max = '[ ]' 105 | #stack_mark_floating = '[~]' 106 | #focus_mark_none = '' 107 | #focus_mark_normal = '' 108 | #focus_mark_floating = '(f)' 109 | #focus_mark_maximized = '(m)' 110 | #focus_mark_free = '(*)' 111 | #clock_enabled = 1 112 | #clock_format = %a %b %d %R %Z %Y 113 | #iconic_enabled = 0 114 | #fullscreen_hide_other = 0 115 | #maximize_hide_bar = 0 116 | #maximize_hide_other = 0 117 | #window_class_enabled = 0 118 | #window_instance_enabled = 0 119 | #window_name_enabled = 0 120 | #verbose_layout = 1 121 | #urgent_enabled = 1 122 | #urgent_collapse = 0 123 | 124 | # Dialog box size ratio when using TRANSSZ quirk; 0.3 < dialog_ratio <= 1.0 125 | #dialog_ratio = 0.6 126 | 127 | # The pixel amount to move/resize windows via the move_ and shrink/grow actions. 128 | #move_step = 50 129 | #resize_step = 50 130 | 131 | # Split a non-RandR dual head setup into one region per monitor 132 | # (non-standard driver-based multihead is not seen by spectrwm) 133 | #region = screen[1]:1280x1024+0+0 134 | #region = screen[1]:1280x1024+1280+0 135 | 136 | # Customize workspace layout at start 137 | #layout = ws[1]:4:0:0:0:vertical 138 | #layout = ws[2]:0:0:0:0:horizontal 139 | #layout = ws[3]:0:0:0:0:max 140 | #layout = ws[4]:4:0:0:0:vertical_flip 141 | #layout = ws[5]:0:0:0:0:horizontal_flip 142 | #layout = ws[6]:0:0:0:0:floating 143 | 144 | # Set workspace name at start 145 | #name = ws[1]:IRC 146 | #name = ws[2]:Email 147 | #name = ws[3]:Browse 148 | #name = ws[10]:Music 149 | 150 | # Change the modifier to use when specifying 'MOD' in bindings. 151 | # This should come before configuring bindings, not after. 152 | # (Mod1: Alt key, Mod4: Windows key, Mod2: Apple key on OSX) 153 | #modkey = Mod4 154 | 155 | # This allows you to include pre-defined key bindings for your keyboard layout. 156 | # All key bindings are cleared before loading bindings in the specified file. 157 | #keyboard_mapping = ~/.spectrwm_us.conf 158 | 159 | # PROGRAMS 160 | 161 | # Set the default spawn flags for 'autorun' and 'program' entries. 162 | # Note that this does not affect existing entries, including defaults. 163 | #spawn_flags = nospawnws 164 | 165 | # A regex search pattern can be specified to change existing entries: 166 | #spawn_flags[menu|term] += nospawnws 167 | 168 | # Change spawn flags on all existing entries, including defaults: 169 | #spawn_flags[.*] += nospawnws 170 | 171 | # Launch applications in a workspace of choice. 172 | # Note that the specified workspace is ignored when 'nospawnws' is set. 173 | #autorun = ws[1]:xterm 174 | #autorun = ws[2]:xombrero http://www.openbsd.org 175 | 176 | # Validated default program entries: 177 | #program[lock] = xlock 178 | #program[term] = xterm 179 | #program[menu] = dmenu_run $dmenu_bottom -fn $bar_font -nb $bar_color -nf $bar_font_color -sb $bar_color_selected -sf $bar_font_color_selected 180 | #program[search] = dmenu $dmenu_bottom -i -fn $bar_font -nb $bar_color -nf $bar_font_color -sb $bar_color_selected -sf $bar_font_color_selected 181 | #program[name_workspace] = dmenu $dmenu_bottom -p Workspace -fn $bar_font -nb $bar_color -nf $bar_font_color -sb $bar_color_selected -sf $bar_font_color_selected 182 | 183 | # Validation of the above can be disabled by setting the 'optional' spawn flag. 184 | # Note that these entries are required for included features. Instead of 185 | # disabling validation, it is recommended to resolve these dependencies or 186 | # override the entries with suitable alternatives. 187 | #spawn_flags[lock|term|menu|search|name_workspace] += optional 188 | 189 | # Alternatively, free the respective binding(s): 190 | #bind[] = MOD+Shift+Delete # disable lock 191 | #bind[] = MOD+Shift+Return # disable term 192 | #bind[] = MOD+p # disable menu 193 | 194 | # Default programs with the 'optional' spawn flag: 195 | #program[screenshot_all] = screenshot.sh full 196 | #program[screenshot_wind] = screenshot.sh window 197 | #program[initscr] = initscreen.sh 198 | 199 | # EXAMPLE: Define 'firefox' action and bind to key. 200 | #program[firefox] = firefox http://spectrwm.org/ 201 | #bind[firefox] = MOD+Shift+b 202 | 203 | # QUIRKS 204 | # Default quirks, remove with: quirk[class:name] = NONE 205 | #quirk[.*:.*:.*:splash,dialog] = FLOAT 206 | #quirk[.*:.*:.*:toolbar,utility] = FLOAT + ANYWHERE 207 | #quirk[.*:.*:.*:notification] = FLOAT + ANYWHERE + MINIMALBORDER + NOFOCUSONMAP 208 | #quirk[MPlayer:xv] = FLOAT + FULLSCREEN + FOCUSPREV 209 | #quirk[OpenOffice.org 2.4:VCLSalFrame] = FLOAT 210 | #quirk[OpenOffice.org 3.0:VCLSalFrame] = FLOAT 211 | #quirk[OpenOffice.org 3.1:VCLSalFrame] = FLOAT 212 | #quirk[Firefox-bin:firefox-bin] = TRANSSZ 213 | #quirk[Firefox:Dialog] = FLOAT 214 | #quirk[Gimp:gimp] = FLOAT + ANYWHERE 215 | #quirk[XTerm:xterm] = XTERM_FONTADJ 216 | #quirk[xine:Xine Window] = FLOAT + ANYWHERE 217 | #quirk[Xitk:Xitk Combo] = FLOAT + ANYWHERE 218 | #quirk[xine:xine Panel] = FLOAT + ANYWHERE 219 | #quirk[Xitk:Xine Window] = FLOAT + ANYWHERE 220 | #quirk[xine:xine Video Fullscreen Window] = FULLSCREEN + FLOAT 221 | #quirk[pcb:pcb] = FLOAT 222 | -------------------------------------------------------------------------------- /outdated_man_pages/spectrwm_ru.1: -------------------------------------------------------------------------------- 1 | .\" Copyright (c) 2009 Marco Peereboom 2 | .\" Copyright (c) 2009 Darrin Chandler 3 | .\" 4 | .\" Permission to use, copy, modify, and distribute this software for any 5 | .\" purpose with or without fee is hereby granted, provided that the above 6 | .\" copyright notice and this permission notice appear in all copies. 7 | .\" 8 | .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | .\" 16 | .Dd $Mdocdate$ 17 | .Dt SPECTRWM 1 18 | .Os 19 | .Sh НАЗВАНИЕ 20 | .Nm spectrwm 21 | .Nd Оконный менеджер для X11 22 | .Sh ИСПОЛЬЗОВАНИЕ 23 | .Nm spectrwm 24 | .Sh ОПИСАНИЕ 25 | .Nm 26 | это минималистичный менеджер окон, ставящий своей целью не мешать вам и не 27 | занимать ценное пространство экрана. Его настройки по-умолчанию разумны и, 28 | кроме того, он не требует знания языков программирования для работы с 29 | конфигурационным файлом. Он написан хакерами для хакеров и старается быть 30 | легким, компактным и быстрым. 31 | .Pp 32 | Когда 33 | .Nm 34 | запускается, он читает настройки из своего конфигурационного файла, 35 | .Pa spectrwm.conf . 36 | Смотрите секцию 37 | .Sx КОНФИГУРАЦИОННЫЕ ФАЙЛЫ 38 | ниже. 39 | .Pp 40 | На этой странице используются следующие обозначения: 41 | .Pp 42 | .Bl -tag -width Ds -offset indent -compact 43 | .It Cm M 44 | Мета-клавиша 45 | .It Cm S 46 | Shift 47 | .It Aq Cm Name 48 | Имя клавиши 49 | .It Cm M1 50 | Кнопка мыши 1 51 | .It Cm M3 52 | Кнопка мыши 3 53 | .El 54 | .Pp 55 | .Nm 56 | должен быть понятным и очевидным. 57 | Большинство действий выполняется комбинациями клавиш. 58 | Смотрите секцию 59 | .Sx ПРИВЯЗКИ 60 | ниже, чтобы узнать о стандартных настройках. 61 | .Sh КОНФИГУРАЦИОННЫЕ ФАЙЛЫ 62 | .Nm 63 | пытается прочитать файл в домашнем каталоге, 64 | .Pa ~/.spectrwm.conf . 65 | В случае, если он недоступен, 66 | происходит обращение к глобальному файлу настроек, 67 | .Pa /etc/spectrwm.conf . 68 | .Pp 69 | Формат файла следующий: \*(Ltключ\*(Gt = \*(Ltзначение\*(Gt. 70 | Например: 71 | .Pp 72 | .Dl color_focus = red 73 | .Pp 74 | Однозначное включение и выключение задается значениями 1 и 0. 75 | .Pp 76 | Поддерживаются следующие ключевые слова: 77 | .Pp 78 | .Bl -tag -width "title_class_enabledXXX" -offset indent -compact 79 | .It Cm color_focus 80 | Цвет рамки окна в фокусе. 81 | .It Cm color_unfocus 82 | Цвет рамки окон не в фокусе. 83 | .It Cm bar_enabled 84 | Включение статусной строки. 85 | .It Cm bar_border Ns Bq Ar x 86 | Цвет рамки статусной строки 87 | .Ar x . 88 | .It Cm bar_color Ns Bq Ar x 89 | Цвет статусной строки 90 | .Ar x . 91 | .It Cm bar_font_color Ns Bq Ar x 92 | Цвет шрифта статусной строки 93 | .Ar x . 94 | .It Cm bar_font 95 | Тип шрифта статусной строки. 96 | .It Cm bar_action 97 | Внешний файл скрипта для статусной строки, выводящий туда информацию, 98 | например, уровень заряда батарей. 99 | .It Cm stack_enabled 100 | Включить отображение способа укладки окон в статусной строке. 101 | .It Cm clock_enabled 102 | Включить часы в статусной строке. 103 | Можно отключить, установив 0, и Вы сможете использовать 104 | собственные часы из внешнего скрипта. 105 | .It Cm dialog_ratio 106 | Ряд приложений имеет слишком маленькие диалоговые окна. 107 | Это значение - доля размера экрана, к которой они будут приведены. 108 | Например, значение 0.6 будет соответствовать 60% от реального размера экрана. 109 | .It Cm region 110 | Выделяет область экрана на Ваше усмотрение, уничтожает все перекрытые области 111 | экрана, определенные автоматически. 112 | Формат: screen[]:WIDTHxHEIGHT+X+Y, 113 | например\& screen[1]:1280x800+0+0. 114 | .It Cm term_width 115 | Установить минимальную допустимую ширину эмулятора терминала. 116 | Если это значение больше 0, 117 | .Nm 118 | попытается отмасштабировать шрифты в терминале, чтобы ширина 119 | была больше этого значения 120 | . 121 | Поодерживается только 122 | .Xr xterm 1 123 | . 124 | Также 125 | .Xr xterm 1 126 | не может быть с setuid или setgid, хотя это так на многих системах. 127 | Возможно необходимо задать program[term] (Смотрите секцию 128 | .Sx ПРОГРАММЫ 129 | ) чтобы использовалась другая копия 130 | .Xr xterm 1 131 | без заданного бита setgid. 132 | .It Cm title_class_enabled 133 | Отображать класс окна в статусной строке. 134 | Обычно выключено 135 | .It Cm title_name_enabled 136 | Отображать заголовок окна в статусной строке. 137 | Обычно выключено 138 | .It Cm modkey 139 | Назначить Мета-клавишу, клавишу-модификатор. 140 | Mod1 соответствует клавише ALT, а Mod4 соответствует клавише WIN на PC. 141 | .It Cm program Ns Bq Ar p 142 | Добавить пользовательскую программу для назначения привязки 143 | .Ar p . 144 | Смотрите секцию 145 | .Sx ПРОГРАММЫ 146 | ниже. 147 | .It Cm bind Ns Bq Ar x 148 | Назначить привязку на действие 149 | .Ar x . 150 | Смотрите секцию 151 | .Sx ПРИВЯЗКИ 152 | ниже. 153 | .It Cm quirk Ns Bq Ar c:n 154 | Добавить костыль для окон с классом 155 | .Ar c 156 | и именем 157 | .Ar n . 158 | Смотрите секцию 159 | .Sx КОСТЫЛИ 160 | ниже. 161 | .El 162 | .Pp 163 | Цвета задаются с помощью 164 | .Xr XQueryColor 3 165 | А шрифты задаются с использованием 166 | .Xr XQueryFont 3 167 | . 168 | .Sh ПРОГРАММЫ 169 | .Nm 170 | позволяет Вам добавлять Ваши собственные действия для запуска 171 | программ и делать к ним привязки как ко всем остальным действиям 172 | Смотрите секцию 173 | .Sx ПРИВЯЗКИ 174 | ниже. 175 | .Pp 176 | Стандартные программы: 177 | .Pp 178 | .Bl -tag -width "screenshot_wind" -offset indent -compact 179 | .It Cm term 180 | xterm 181 | .It Cm screenshot_all 182 | screenshot.sh full 183 | .It Cm screenshot_wind 184 | screenshot.sh window 185 | .It Cm lock 186 | xlock 187 | .It Cm initscr 188 | initscreen.sh 189 | .It Cm menu 190 | dmenu_run \-fn $bar_font \-nb $bar_color \-nf $bar_font_color \-sb $bar_border \-sf $bar_color 191 | .El 192 | .Pp 193 | Ваши собственные программы задаются следующим образом: 194 | .Pp 195 | .Dl program[] = [ [... ]] 196 | .Pp 197 | .Aq name 198 | это любой идентификатор, не мешающийся с уже существующими, 199 | .Aq progpath 200 | это собственно путь к программе, 201 | .Aq arg 202 | это список передаваемых аргументов или оставьте пустым. 203 | .Pp 204 | Следующие переменные можно получать из 205 | .Nm 206 | (Смотрите секцию 207 | .Sx КОНФИГУРАЦИОННЫЕ ФАЙЛЫ 208 | выше), 209 | и их можно использовать как 210 | .Aq arg 211 | (в момент запуска программы будет выполнена подстановка значений): 212 | .Pp 213 | .Bl -tag -width "$bar_font_color" -offset indent -compact 214 | .It Cm $bar_border 215 | .It Cm $bar_color 216 | .It Cm $bar_font 217 | .It Cm $bar_font_color 218 | .It Cm $color_focus 219 | .It Cm $color_unfocus 220 | .El 221 | .Pp 222 | Например: 223 | .Bd -literal -offset indent 224 | program[ff] = /usr/local/bin/firefox http://spectrwm.org/ 225 | bind[ff] = Mod+f # Значит Mod+F запускает firefox 226 | .Ed 227 | .Pp 228 | Чтобы отменить назначение: 229 | .Bd -literal -offset indent 230 | bind[] = Mod+f 231 | program[ff] = 232 | .Ed 233 | .Pp 234 | .Sh ПРИВЯЗКИ 235 | .Nm 236 | предоставляет доступ к действиям с помощью клавиатурных комбинаций. 237 | .Pp 238 | Установленные привязки для мыши: 239 | .Pp 240 | .Bl -tag -width "M-j, M-XXX" -offset indent -compact 241 | .It Cm M1 242 | Сфокусироваться на окне 243 | .It Cm M-M1 244 | Переместить окно 245 | .It Cm M-M3 246 | Изменить размер окна 247 | .It Cm M-S-M3 248 | Изменить размер окна, удерживая его в центре 249 | .El 250 | .Pp 251 | Стандартные клавиатурные привязки: 252 | .Pp 253 | .Bl -tag -width "M-j, M-XXX" -offset indent -compact 254 | .It Cm M-S- Ns Aq Cm Return 255 | term 256 | .It Cm M-p 257 | menu 258 | .It Cm M-S-q 259 | quit 260 | .It Cm M-q 261 | restart 262 | .Nm 263 | .It Cm M- Ns Aq Cm Space 264 | cycle_layout 265 | .It Cm M-S- Ns Aq Cm Space 266 | reset_layout 267 | .It Cm M-h 268 | master_shrink 269 | .It Cm M-l 270 | master_grow 271 | .It Cm M-, 272 | master_add 273 | .It Cm M-. 274 | master_del 275 | .It Cm M-S-, 276 | stack_inc 277 | .It Cm M-S-. 278 | stack_del 279 | .It Cm M- Ns Aq Cm Return 280 | swap_main 281 | .It Xo 282 | .Cm M-j , 283 | .Cm M- Ns Aq Cm TAB 284 | .Xc 285 | focus_next 286 | .It Xo 287 | .Cm M-k , 288 | .Cm M-S- Ns Aq Cm TAB 289 | .Xc 290 | focus_prev 291 | .It Cm M-m 292 | focus_main 293 | .It Cm M-S-j 294 | swap_next 295 | .It Cm M-S-k 296 | swap_prev 297 | .It Cm M-b 298 | bar_toggle 299 | .It Cm M-x 300 | wind_del 301 | .It Cm M-S-x 302 | wind_kill 303 | .It Cm M- Ns Aq Ar n 304 | .Ns ws_ Ns Ar n 305 | .It Cm M-S- Ns Aq Ar n 306 | .Ns mvws_ Ns Ar n 307 | .It Cm M- Ns Aq Cm Right 308 | ws_next 309 | .It Cm M- Ns Aq Cm Left 310 | ws_prev 311 | .It Cm M-S- Ns Aq Cm Right 312 | screen_next 313 | .It Cm M-S- Ns Aq Cm Left 314 | screen_prev 315 | .It Cm M-s 316 | screenshot_all 317 | .It Cm M-S-s 318 | screenshot_wind 319 | .It Cm M-S-v 320 | version 321 | .It Cm M-t 322 | float_toggle 323 | .It Cm M-S Aq Cm Delete 324 | lock 325 | .It Cm M-S-i 326 | initscr 327 | .El 328 | .Pp 329 | Описания действий перечислены ниже: 330 | .Pp 331 | .Bl -tag -width "M-j, M-XXX" -offset indent -compact 332 | .It Cm term 333 | Запустить эмулятор терминала 334 | (Смотрите секцию 335 | .Sx ПРОГРАММЫ 336 | выше) 337 | .It Cm menu 338 | Меню 339 | (Смотрите секцию 340 | .Sx ПРОГРАММЫ 341 | выше) 342 | .It Cm quit 343 | Выйти 344 | .Nm 345 | .It Cm restart 346 | Перезапустить 347 | .Nm 348 | .It Cm cycle_layout 349 | Менять укладку окон 350 | .It Cm reset_layout 351 | Стандартная укладка 352 | .It Cm master_shrink 353 | Сжать область главного окна 354 | .It Cm master_grow 355 | Расширить область главного окна 356 | .It Cm master_add 357 | Добавить окна в главную область 358 | .It Cm master_del 359 | Убрать окна из главной области 360 | .It Cm stack_inc 361 | Увеличить число столбцов или рядов в текущей укладке 362 | .It Cm stack_del 363 | Уменьшить число столбцов или рядов в текущей укладке 364 | .It Cm swap_main 365 | Отправить текущее окно в главную область, сделать главным 366 | .It Cm focus_next 367 | Фокусироваться на следующем окне 368 | .It Cm focus_prev 369 | Фокусироваться на предыдущем окне 370 | .It Cm focus_main 371 | Фокусироваться на главном окне 372 | .It Cm swap_next 373 | Поменять со следующим окном 374 | .It Cm swap_prev 375 | Поменять со предыдущим окном 376 | .It Cm bar_toggle 377 | Выключить статусную строку на всех рабочих столах 378 | .It Cm wind_del 379 | Закрыть фокусированное окно 380 | .It Cm wind_kill 381 | Грохнуть фокусированное окно 382 | .It Cm ws_ Ns Ar n 383 | Переключиться на рабочий стол 384 | .Ar n , 385 | где 386 | .Ar n 387 | от 1 до 10 388 | .It Cm mvws_ Ns Ar n 389 | Переместить фокусированное окно в рабочий стол 390 | .Ar n , 391 | где 392 | .Ar n 393 | от 1 до 10 394 | .It Cm ws_next 395 | Перейти к следующему не пустому рабочему столу 396 | .It Cm ws_prev 397 | Перейти к следующему не пустому рабочему столу 398 | .It Cm screen_next 399 | Переместить указатель в следующую область 400 | .It Cm screen_prev 401 | Переместить указатель в следующую область 402 | .It Cm screenshot_all 403 | Сделать снимок всего экрана (если возможно) 404 | (Смотрите секцию 405 | .Sx ПРОГРАММЫ 406 | выше) 407 | .It Cm screenshot_wind 408 | Сделать снимок окна (если возможно) 409 | (Смотрите секцию 410 | .Sx ПРОГРАММЫ 411 | выше) 412 | .It Cm version 413 | Показать версию в статусной строке 414 | .It Cm float_toggle 415 | Переключить окно в фокусе в плавающий режим, float 416 | .It Cm lock 417 | Заблокировать экран 418 | (Смотрите секцию 419 | .Sx ПРОГРАММЫ 420 | выше) 421 | .It Cm initscr 422 | Инициализировать экран еще раз 423 | (Смотрите секцию 424 | .Sx ПРОГРАММЫ 425 | выше) 426 | .El 427 | .Pp 428 | Собственные привязки назначаются следующим образом: 429 | .Pp 430 | .Dl bind[] = 431 | .Pp 432 | .Aq action 433 | это действие из списка программ 434 | .Aq keys 435 | это не более одной клавиши-модификатора 436 | (MOD, Mod1, Shift, и.т.п.) и обычные клавиши 437 | (b, space, и.т.п.), разделенные "+". 438 | Например: 439 | .Bd -literal -offset indent 440 | bind[reset] = Mod4+q # назначить WIN + q на действие reset 441 | bind[] = Mod1+q # снять все действия с Alt + q 442 | .Ed 443 | .Pp 444 | На одно действие можно назначить несколько комбинаций. 445 | .Sh КОСТЫЛИ 446 | .Nm 447 | позволяет настроить костыли, нужные для специальной работы spectrwm 448 | с рядом приложений, который вы определяете сами. То есть, Вы можете 449 | принудительно установить способ тайлинга для какого-нибудь приложения 450 | .Pp 451 | Список стандартных костылей: 452 | .Pp 453 | .Bl -tag -width "OpenOffice.org N.M:VCLSalFrameXXX" -offset indent -compact 454 | .It Firefox\-bin:firefox\-bin 455 | TRANSSZ 456 | .It Firefox:Dialog 457 | FLOAT 458 | .It Gimp:gimp 459 | FLOAT + ANYWHERE 460 | .It MPlayer:xv 461 | FLOAT + FULLSCREEN 462 | .It OpenOffice.org 2.4:VCLSalFrame 463 | FLOAT 464 | .It OpenOffice.org 3.1:VCLSalFrame 465 | FLOAT 466 | .It pcb:pcb 467 | FLOAT 468 | .It xine:Xine Window 469 | FLOAT + ANYWHERE 470 | .It xine:xine Panel 471 | FLOAT + ANYWHERE 472 | .It xine:xine Video Fullscreen Window 473 | FULLSCREEN + FLOAT 474 | .It Xitk:Xitk Combo 475 | FLOAT + ANYWHERE 476 | .It Xitk:Xine Window 477 | FLOAT + ANYWHERE 478 | .It XTerm:xterm 479 | XTERM_FONTADJ 480 | .El 481 | .Pp 482 | Описание: 483 | .Pp 484 | .Bl -tag -width "XTERM_FONTADJXXX" -offset indent -compact 485 | .It FLOAT 486 | Такое окно не нужно тайлить вообще, разрешить ему float 487 | .It TRANSSZ 488 | Тразиентое окно 489 | (Смотрите секцию 490 | .Sx КОНФИГУРАЦИОННЫЕ ФАЙЛЫ) . 491 | .It ANYWHERE 492 | Позволить окну самостоятельно выбрать местоположение 493 | .It XTERM_FONTADJ 494 | Изменять шрифты xterm при изменении размеров окна 495 | .It FULLSCREEN 496 | Позволить окну запускаться в полноэкранном режиме 497 | .El 498 | .Pp 499 | Назначать костыли можно следующим образом: 500 | .Pp 501 | .Dl quirk[:] = [ + ... ] 502 | .Pp 503 | .Aq class 504 | и 505 | .Aq name 506 | определяют к какому окну будет применяться костыль, а 507 | .Aq quirk 508 | один из вышеперечисленных способов. 509 | Например: 510 | .Bd -literal -offset indent 511 | quirk[MPlayer:xv] = FLOAT + FULLSCREEN # mplayer настроен 512 | quirk[pcb:pcb] = NONE # убрать существующий костыль 513 | .Ed 514 | .Pp 515 | Вы можете узнать 516 | .Aq class 517 | и 518 | .Aq name 519 | запустив xprop и нажав в интересующее окно. 520 | Вот как будет выглядеть вывод для Firefox: 521 | .Bd -literal -offset indent 522 | $ xprop | grep WM_CLASS 523 | WM_CLASS(STRING) = "Navigator", "Firefox" 524 | .Ed 525 | .Pp 526 | Обратите внимание, класс и имя меняются местами, 527 | правильный костыль будет выглядеть так: 528 | .Bd -literal -offset indent 529 | quirk[Firefox:Navigator] = FLOAT 530 | .Ed 531 | .Sh ФАЙЛЫ 532 | .Bl -tag -width "/etc/spectrwm.confXXX" -compact 533 | .It Pa ~/.spectrwm.conf 534 | .Nm 535 | Личные настройки пользователя. 536 | .It Pa /etc/spectrwm.conf 537 | .Nm 538 | Глобавльные настройки. 539 | .El 540 | .Sh ИСТОРИЯ 541 | .Nm 542 | идейно основан на dwm и xmonad 543 | .Sh АВТОРЫ 544 | .An -nosplit 545 | .Pp 546 | .Nm 547 | написан: 548 | .An Marco Peereboom Aq marco@peereboom.us , 549 | .An Ryan Thomas McBride Aq mcbride@countersiege.com 550 | and 551 | .An Darrin Chandler Aq dwchandler@stilyagin.com . 552 | .Sh БАГИ 553 | При вызове меню с помощью 554 | .Cm M-p , 555 | необходима корректная работа dmenu. 556 | -------------------------------------------------------------------------------- /lib/swm_hack.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2009 Marco Peereboom 3 | * Copyright (c) 2009 Ryan McBride 4 | * Copyright (c) 2011-2024 Reginald Kennedy 5 | * 6 | * Permission to use, copy, modify, and distribute this software for any 7 | * purpose with or without fee is hereby granted, provided that the above 8 | * copyright notice and this permission notice appear in all copies. 9 | * 10 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 | */ 18 | /* 19 | * Copyright (C) 2005-2007 Carsten Haitzler 20 | * Copyright (C) 2006-2007 Kim Woelders 21 | * 22 | * Permission is hereby granted, free of charge, to any person obtaining a copy 23 | * of this software and associated documentation files (the "Software"), to 24 | * deal in the Software without restriction, including without limitation the 25 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 26 | * sell copies of the Software, and to permit persons to whom the Software is 27 | * furnished to do so, subject to the following conditions: 28 | * 29 | * The above copyright notice and this permission notice shall be included in 30 | * all copies of the Software, its documentation and marketing & publicity 31 | * materials, and acknowledgment shall be given in the documentation, materials 32 | * and software packages that this Software was used. 33 | * 34 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 35 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 36 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 37 | * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 38 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 39 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 40 | */ 41 | /* 42 | * Basic hack mechanism (dlopen etc.) taken from e_hack.c in e17. 43 | */ 44 | #include 45 | #include 46 | #include 47 | #include 48 | #include 49 | #include 50 | #include 51 | #include 52 | #include 53 | #include 54 | 55 | static xcb_atom_t swmws = XCB_ATOM_NONE, swmpid = XCB_ATOM_NONE; 56 | static bool xterm = false; 57 | 58 | static xcb_atom_t get_atom_from_string_xcb(xcb_connection_t *, char *); 59 | static xcb_atom_t get_atom_from_string_xlib(Display *, char *); 60 | static void preload_atoms_xcb(xcb_connection_t *); 61 | static void preload_atoms_xlib(Display *); 62 | static void prepare_window_xcb(xcb_connection_t *, xcb_window_t); 63 | static void prepare_window_xlib(Display *, Window); 64 | static void set_property_xcb(xcb_connection_t *, xcb_window_t, 65 | xcb_atom_t, char *); 66 | static void set_property_xlib(Display *, Window, Atom, char *); 67 | static void *xcbsym(const char *, char **); 68 | static void *xlibsym(const char *, char **); 69 | static void *xtlibsym(const char *, char **); 70 | 71 | #define SWM_PROPLEN (16) 72 | 73 | static void * 74 | xcbsym(const char *symbol, char **e) 75 | { 76 | static void *lib_xcb = NULL; 77 | void *p = NULL; 78 | 79 | #ifdef RTLD_NEXT 80 | p = dlsym(RTLD_NEXT, symbol); 81 | #endif 82 | if (p == NULL) { 83 | if (lib_xcb == NULL) 84 | lib_xcb = dlopen("libxcb.so", RTLD_GLOBAL | RTLD_LAZY); 85 | if (lib_xcb) 86 | p = dlsym(lib_xcb, symbol); 87 | if (p == NULL && e) 88 | *e = dlerror(); 89 | } 90 | 91 | return (p); 92 | } 93 | 94 | static void * 95 | xlibsym(const char *symbol, char **e) 96 | { 97 | static void *lib_xlib = NULL; 98 | void *p = NULL; 99 | 100 | #ifdef RTLD_NEXT 101 | p = dlsym(RTLD_NEXT, symbol); 102 | #endif 103 | if (p == NULL) { 104 | if (lib_xlib == NULL) 105 | lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); 106 | if (lib_xlib) 107 | p = dlsym(lib_xlib, symbol); 108 | if (p == NULL && e) 109 | *e = dlerror(); 110 | } 111 | 112 | return (p); 113 | } 114 | 115 | static void * 116 | xtlibsym(const char *symbol, char **e) 117 | { 118 | static void *lib_xtlib = NULL; 119 | void *p = NULL; 120 | 121 | #ifdef RTLD_NEXT 122 | p = dlsym(RTLD_NEXT, symbol); 123 | #endif 124 | if (p == NULL) { 125 | if (lib_xtlib == NULL) 126 | lib_xtlib = dlopen("libXt.so", RTLD_GLOBAL | RTLD_LAZY); 127 | if (lib_xtlib) 128 | p = dlsym(lib_xtlib, symbol); 129 | if (p == NULL && e) 130 | *e = dlerror(); 131 | } 132 | 133 | return (p); 134 | } 135 | 136 | /* xcb_intern_atom */ 137 | typedef xcb_intern_atom_cookie_t (XIAF)(xcb_connection_t *, uint8_t, uint16_t, 138 | const char *); 139 | 140 | /* xcb_intern_atom_reply */ 141 | typedef xcb_intern_atom_reply_t *(XIARF)(xcb_connection_t *, 142 | xcb_intern_atom_cookie_t, xcb_generic_error_t **); 143 | 144 | static xcb_atom_t 145 | get_atom_from_string_xcb(xcb_connection_t *c, char *name) 146 | { 147 | xcb_atom_t atom; 148 | xcb_intern_atom_cookie_t iac; 149 | xcb_intern_atom_reply_t *iar; 150 | static XIAF *xiaf = NULL; 151 | static XIARF *xiarf = NULL; 152 | char *e; 153 | 154 | if (xiaf == NULL) { 155 | xiaf = (XIAF *)xcbsym("xcb_intern_atom", &e); 156 | if (xiaf == NULL) { 157 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 158 | exit(1); 159 | } 160 | } 161 | if (xiarf == NULL) { 162 | xiarf = (XIARF *)xcbsym("xcb_intern_atom_reply", &e); 163 | if (xiarf == NULL) { 164 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 165 | exit(1); 166 | } 167 | } 168 | 169 | iac = (*xiaf)(c, 0, strlen(name), name); 170 | iar = (*xiarf)(c, iac, NULL); 171 | if (iar) { 172 | atom = iar->atom; 173 | free(iar); 174 | 175 | return (atom); 176 | } 177 | 178 | return (XCB_ATOM_NONE); 179 | } 180 | 181 | /* XInternAtom */ 182 | typedef Atom (IAF)(Display *, char *, Bool); 183 | 184 | static xcb_atom_t 185 | get_atom_from_string_xlib(Display *dpy, char *name) 186 | { 187 | xcb_atom_t atom = XCB_ATOM_NONE; 188 | static IAF *iaf = NULL; 189 | char *e; 190 | 191 | if (iaf == NULL) { 192 | iaf = (IAF *)xlibsym("XInternAtom", &e); 193 | if (iaf == NULL) { 194 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 195 | exit(1); 196 | } 197 | } 198 | 199 | atom = (xcb_atom_t)(*iaf)(dpy, name, False); 200 | return (atom); 201 | } 202 | 203 | typedef int (XCHE)(xcb_connection_t *c); 204 | 205 | static void 206 | preload_atoms_xcb(xcb_connection_t *c) 207 | { 208 | static XCHE *xchef = NULL; 209 | char *e; 210 | 211 | if (xchef == NULL) { 212 | xchef = (XCHE *)xcbsym("xcb_connection_has_error", &e); 213 | if (xchef == NULL) { 214 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 215 | exit(1); 216 | } 217 | } 218 | 219 | if (c == NULL || ((*xchef)(c))) 220 | return; 221 | 222 | if (swmws == XCB_ATOM_NONE) 223 | swmws = get_atom_from_string_xcb(c, "_SWM_WS"); 224 | if (swmpid == XCB_ATOM_NONE) 225 | swmpid = get_atom_from_string_xcb(c, "_SWM_PID"); 226 | } 227 | 228 | static void 229 | preload_atoms_xlib(Display *dpy) 230 | { 231 | if (dpy == NULL) 232 | return; 233 | 234 | if (swmws == XCB_ATOM_NONE) 235 | swmws = get_atom_from_string_xlib(dpy, "_SWM_WS"); 236 | if (swmpid == XCB_ATOM_NONE) 237 | swmpid = get_atom_from_string_xlib(dpy, "_SWM_PID"); 238 | } 239 | 240 | typedef void (XDF)(xcb_connection_t *); 241 | typedef xcb_connection_t *(XCAF)(const char *, xcb_auth_info_t *, int *); 242 | xcb_connection_t * 243 | xcb_connect_to_display_with_auth_info(const char *display, 244 | xcb_auth_info_t *auth, int *screen) 245 | { 246 | static XCAF *xcaf = NULL; 247 | static XDF *xdf = NULL; 248 | xcb_connection_t *c; 249 | char *e; 250 | 251 | if (xcaf == NULL) { 252 | xcaf = 253 | (XCAF *)xcbsym("xcb_connect_to_display_with_auth_info", &e); 254 | if (xcaf == NULL) { 255 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 256 | exit(1); 257 | } 258 | } 259 | if (xdf == NULL) { 260 | xdf = (XDF *)xcbsym("xcb_disconnect", &e); 261 | if (xdf == NULL) { 262 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 263 | exit(1); 264 | } 265 | } 266 | 267 | /* Preload without affecting the initial sequence count. */ 268 | c = (*xcaf)(display, auth, screen); 269 | preload_atoms_xcb(c); 270 | (*xdf)(c); 271 | 272 | c = (*xcaf)(display, auth, screen); 273 | return (c); 274 | } 275 | 276 | /* xcb_change_property */ 277 | typedef xcb_void_cookie_t (XCPF)(xcb_connection_t *, uint8_t, xcb_window_t, 278 | xcb_atom_t, xcb_atom_t, uint8_t, uint32_t, const void *); 279 | 280 | static void 281 | set_property_xcb(xcb_connection_t *c, xcb_window_t wid, xcb_atom_t atom, 282 | char *val) 283 | { 284 | char prop[SWM_PROPLEN]; 285 | static XCPF *xcpf = NULL; 286 | char *e; 287 | 288 | if (xcpf == NULL) { 289 | xcpf = (XCPF *)xcbsym("xcb_change_property", &e); 290 | if (xcpf == NULL) { 291 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 292 | exit(1); 293 | } 294 | } 295 | 296 | if (atom != XCB_ATOM_NONE && 297 | (snprintf(prop, SWM_PROPLEN, "%s", val)) < SWM_PROPLEN) 298 | (*xcpf)(c, XCB_PROP_MODE_REPLACE, wid, atom, XCB_ATOM_STRING, 8, 299 | strlen((char *)prop), prop); 300 | } 301 | 302 | /* XChangeProperty */ 303 | typedef int (CPF)(Display *, Window, Atom, Atom, int, int, unsigned char *, int); 304 | 305 | static void 306 | set_property_xlib(Display *dpy, Window id, Atom atom, char *val) 307 | { 308 | char prop[SWM_PROPLEN]; 309 | static CPF *cpf = NULL; 310 | char *e; 311 | 312 | if (cpf == NULL) { 313 | cpf = (CPF *)xlibsym("XChangeProperty", &e); 314 | if (cpf == NULL) { 315 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 316 | exit(1); 317 | } 318 | } 319 | 320 | if (atom != XCB_ATOM_NONE && 321 | (snprintf(prop, SWM_PROPLEN, "%s", val)) < SWM_PROPLEN) 322 | (*cpf)(dpy, id, atom, XA_STRING, 8, PropModeReplace, 323 | (unsigned char *)prop, strlen((char *)prop)); 324 | } 325 | 326 | static void 327 | prepare_window_xcb(xcb_connection_t *c, xcb_window_t window) 328 | { 329 | char *env; 330 | 331 | if (window == XCB_WINDOW_NONE) 332 | return; 333 | 334 | if ((env = getenv("_SWM_WS")) != NULL) 335 | set_property_xcb(c, window, swmws, env); 336 | if ((env = getenv("_SWM_PID")) != NULL) 337 | set_property_xcb(c, window, swmpid, env); 338 | if (getenv("_SWM_XTERM_FONTADJ") != NULL) { 339 | unsetenv("_SWM_XTERM_FONTADJ"); 340 | xterm = true; 341 | } 342 | } 343 | 344 | static void 345 | prepare_window_xlib(Display *dpy, Window window) 346 | { 347 | char *env; 348 | 349 | if (window == None) 350 | return; 351 | 352 | if ((env = getenv("_SWM_WS")) != NULL) 353 | set_property_xlib(dpy, window, (Atom)swmws, env); 354 | if ((env = getenv("_SWM_PID")) != NULL) 355 | set_property_xlib(dpy, window, (Atom)swmpid, env); 356 | if (getenv("_SWM_XTERM_FONTADJ") != NULL) { 357 | unsetenv("_SWM_XTERM_FONTADJ"); 358 | xterm = true; 359 | } 360 | } 361 | 362 | /* xcb_create_window/xcb_create_window_checked */ 363 | typedef xcb_void_cookie_t (XCWF)(xcb_connection_t *, uint8_t, xcb_window_t, 364 | xcb_window_t, int16_t, int16_t, uint16_t, uint16_t, uint16_t, uint16_t, 365 | xcb_visualid_t, uint32_t, const void *); 366 | 367 | xcb_void_cookie_t 368 | xcb_create_window_checked(xcb_connection_t *c, uint8_t depth, xcb_window_t wid, 369 | xcb_window_t parent, int16_t x, int16_t y, uint16_t width, uint16_t height, 370 | uint16_t border_width, uint16_t _class, xcb_visualid_t visual, 371 | uint32_t value_mask, const void *value_list) 372 | { 373 | static XCWF *xcwcf = NULL; 374 | xcb_void_cookie_t xcb_ret; 375 | char *e; 376 | 377 | if (xcwcf == NULL) { 378 | xcwcf = (XCWF *)xcbsym("xcb_create_window_checked", &e); 379 | if (xcwcf == NULL) { 380 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 381 | exit(1); 382 | } 383 | } 384 | 385 | xcb_ret = (*xcwcf)(c, depth, wid, parent, x, y, width, height, 386 | border_width, _class, visual, value_mask, value_list); 387 | prepare_window_xcb(c, wid); 388 | 389 | return (xcb_ret); 390 | } 391 | 392 | xcb_void_cookie_t 393 | xcb_create_window(xcb_connection_t *c, uint8_t depth, xcb_window_t wid, 394 | xcb_window_t parent, int16_t x, int16_t y, uint16_t width, uint16_t height, 395 | uint16_t border_width, uint16_t _class, xcb_visualid_t visual, 396 | uint32_t value_mask, const void *value_list) 397 | { 398 | static XCWF *xcwf = NULL; 399 | xcb_void_cookie_t xcb_ret; 400 | char *e; 401 | 402 | if (xcwf == NULL) { 403 | xcwf = (XCWF *)xcbsym("xcb_create_window", &e); 404 | if (xcwf == NULL) { 405 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 406 | exit(1); 407 | } 408 | } 409 | 410 | xcb_ret = (*xcwf)(c, depth, wid, parent, x, y, width, height, 411 | border_width, _class, visual, value_mask, value_list); 412 | prepare_window_xcb(c, wid); 413 | 414 | return (xcb_ret); 415 | } 416 | 417 | /* xcb_create_window_aux/xcb_create_window_aux_checked */ 418 | typedef xcb_void_cookie_t (XCWAF)(xcb_connection_t *, uint8_t, xcb_window_t, 419 | xcb_window_t, int16_t, int16_t, uint16_t, uint16_t, uint16_t, uint16_t, 420 | xcb_visualid_t, uint32_t, const xcb_create_window_value_list_t *); 421 | 422 | xcb_void_cookie_t 423 | xcb_create_window_aux_checked(xcb_connection_t *c, uint8_t depth, 424 | xcb_window_t wid, xcb_window_t parent, int16_t x, int16_t y, uint16_t width, 425 | uint16_t height, uint16_t border_width, uint16_t _class, 426 | xcb_visualid_t visual, uint32_t value_mask, 427 | const xcb_create_window_value_list_t *value_list) 428 | { 429 | static XCWAF *xcwacf = NULL; 430 | xcb_void_cookie_t xcb_ret; 431 | char *e; 432 | 433 | if (xcwacf == NULL) { 434 | xcwacf = (XCWAF *)xcbsym("xcb_create_window_aux_checked", &e); 435 | if (xcwacf == NULL) { 436 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 437 | exit(1); 438 | } 439 | } 440 | 441 | xcb_ret = (*xcwacf)(c, depth, wid, parent, x, y, width, height, 442 | border_width, _class, visual, value_mask, value_list); 443 | prepare_window_xcb(c, wid); 444 | 445 | return (xcb_ret); 446 | } 447 | 448 | xcb_void_cookie_t 449 | xcb_create_window_aux(xcb_connection_t *c, uint8_t depth, xcb_window_t wid, 450 | xcb_window_t parent, int16_t x, int16_t y, uint16_t width, uint16_t height, 451 | uint16_t border_width, uint16_t _class, xcb_visualid_t visual, 452 | uint32_t value_mask, const xcb_create_window_value_list_t *value_list) 453 | { 454 | static XCWAF *xcwaf = NULL; 455 | xcb_void_cookie_t xcb_ret; 456 | char *e; 457 | 458 | if (xcwaf == NULL) { 459 | xcwaf = (XCWAF *)xcbsym("xcb_create_window_aux", &e); 460 | if (xcwaf == NULL) { 461 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 462 | exit(1); 463 | } 464 | } 465 | 466 | xcb_ret = (*xcwaf)(c, depth, wid, parent, x, y, width, height, 467 | border_width, _class, visual, value_mask, value_list); 468 | prepare_window_xcb(c, wid); 469 | 470 | return (xcb_ret); 471 | } 472 | 473 | typedef Display *(ODF)(_Xconst char *); 474 | Display * 475 | XOpenDisplay(_Xconst char *_display) 476 | { 477 | static ODF *odf = NULL; 478 | Display *display; 479 | char *e; 480 | 481 | if (odf == NULL) { 482 | odf = (ODF *)xlibsym("XOpenDisplay", &e); 483 | if (odf == NULL) { 484 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 485 | exit(1); 486 | } 487 | } 488 | 489 | display = (*odf)(_display); 490 | preload_atoms_xlib(display); 491 | 492 | return (display); 493 | } 494 | 495 | typedef Window (CWF)(Display *, Window, int, int, unsigned int, unsigned int, 496 | unsigned int, int, unsigned int, Visual *, unsigned long, 497 | XSetWindowAttributes *); 498 | Window 499 | XCreateWindow(Display *dpy, Window parent, int x, int y, unsigned int width, 500 | unsigned int height, unsigned int border_width, int depth, 501 | unsigned int _class, Visual *visual, unsigned long valuemask, 502 | XSetWindowAttributes * attributes) 503 | { 504 | static CWF *cwf = NULL; 505 | Window wid; 506 | char *e; 507 | 508 | if (cwf == NULL) { 509 | cwf = (CWF *)xlibsym("XCreateWindow", &e); 510 | if (cwf == NULL) { 511 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 512 | exit(1); 513 | } 514 | } 515 | 516 | wid = (*cwf)(dpy, parent, x, y, width, height, border_width, depth, 517 | _class, visual, valuemask, attributes); 518 | prepare_window_xlib(dpy, wid); 519 | 520 | return (wid); 521 | } 522 | 523 | typedef Window (CSWF)(Display *, Window, int, int, unsigned int, unsigned int, 524 | unsigned int, unsigned long, unsigned long); 525 | Window 526 | XCreateSimpleWindow(Display *dpy, Window parent, int x, int y, 527 | unsigned int width, unsigned int height, unsigned int border_width, 528 | unsigned long border, unsigned long background) 529 | { 530 | static CSWF *cswf = NULL; 531 | Window wid; 532 | char *e; 533 | 534 | if (cswf == NULL) { 535 | cswf = (CSWF *)xlibsym("XCreateSimpleWindow", &e); 536 | if (cswf == NULL) { 537 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 538 | exit(1); 539 | } 540 | } 541 | 542 | wid = (*cswf)(dpy, parent, x, y, width, height, border_width, border, 543 | background); 544 | prepare_window_xlib(dpy, wid); 545 | 546 | return (wid); 547 | } 548 | 549 | typedef KeyCode (KTKF)(Display *, KeySym); 550 | 551 | /* 552 | * XtAppNextEvent Intercept Hack 553 | * Normally xterm rejects "synthetic" (XSendEvent) events to prevent spoofing. 554 | * We don't want to disable this completely, it's insecure. But hook here 555 | * and allow these mostly harmless ones that we use to adjust fonts. 556 | */ 557 | typedef void (ANEF)(XtAppContext, XEvent *); 558 | void 559 | XtAppNextEvent(XtAppContext app_context, XEvent *event_return) 560 | { 561 | static ANEF *anef = NULL; 562 | static KTKF *xktkf = NULL; 563 | static KeyCode kp_add = 0, kp_subtract = 0; 564 | char *e; 565 | 566 | if (anef == NULL) { 567 | anef = (ANEF *)xtlibsym("XtAppNextEvent", &e); 568 | if (anef == NULL) { 569 | fprintf(stderr, "libswmhack.so: ERROR: %s\n", e); 570 | exit(1); 571 | } 572 | } 573 | 574 | (*anef)(app_context, event_return); 575 | 576 | /* Return here if it's not an Xterm. */ 577 | if (!xterm || event_return == NULL) 578 | return; 579 | 580 | if (event_return->type != KeyPress && event_return->type != KeyRelease) 581 | return; 582 | 583 | if (xktkf == NULL) { 584 | xktkf = (KTKF *)xlibsym("XKeysymToKeycode", &e); 585 | if (xktkf == NULL) { 586 | fprintf(stderr, "libswmhack.so: %s\n", e); 587 | return; 588 | } 589 | 590 | kp_add = (*xktkf)(event_return->xany.display, XK_KP_Add); 591 | kp_subtract = (*xktkf)(event_return->xany.display, 592 | XK_KP_Subtract); 593 | } 594 | 595 | if (kp_add == 0 || kp_subtract == 0) 596 | return; 597 | 598 | /* Allow spoofing of font change keystrokes. */ 599 | if (event_return->xkey.state == ShiftMask && 600 | (event_return->xkey.keycode == kp_add || 601 | event_return->xkey.keycode == kp_subtract)) 602 | event_return->xkey.send_event = 0; 603 | } 604 | -------------------------------------------------------------------------------- /linux/tree.h: -------------------------------------------------------------------------------- 1 | /* $xxxterm$ */ 2 | /* $OpenBSD: tree.h,v 1.12 2009/03/02 09:42:55 mikeb Exp $ */ 3 | /* 4 | * Copyright 2002 Niels Provos 5 | * All rights reserved. 6 | * 7 | * Redistribution and use in source and binary forms, with or without 8 | * modification, are permitted provided that the following conditions 9 | * are met: 10 | * 1. Redistributions of source code must retain the above copyright 11 | * notice, this list of conditions and the following disclaimer. 12 | * 2. Redistributions in binary form must reproduce the above copyright 13 | * notice, this list of conditions and the following disclaimer in the 14 | * documentation and/or other materials provided with the distribution. 15 | * 16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #ifndef _SYS_TREE_H_ 29 | #define _SYS_TREE_H_ 30 | 31 | /* 32 | * This file defines data structures for different types of trees: 33 | * splay trees and red-black trees. 34 | * 35 | * A splay tree is a self-organizing data structure. Every operation 36 | * on the tree causes a splay to happen. The splay moves the requested 37 | * node to the root of the tree and partly rebalances it. 38 | * 39 | * This has the benefit that request locality causes faster lookups as 40 | * the requested nodes move to the top of the tree. On the other hand, 41 | * every lookup causes memory writes. 42 | * 43 | * The Balance Theorem bounds the total access time for m operations 44 | * and n inserts on an initially empty tree as O((m + n)lg n). The 45 | * amortized cost for a sequence of m accesses to a splay tree is O(lg n); 46 | * 47 | * A red-black tree is a binary search tree with the node color as an 48 | * extra attribute. It fulfills a set of conditions: 49 | * - every search path from the root to a leaf consists of the 50 | * same number of black nodes, 51 | * - each red node (except for the root) has a black parent, 52 | * - each leaf node is black. 53 | * 54 | * Every operation on a red-black tree is bounded as O(lg n). 55 | * The maximum height of a red-black tree is 2lg (n+1). 56 | */ 57 | 58 | #define SPLAY_HEAD(name, type) \ 59 | struct name { \ 60 | struct type *sph_root; /* root of the tree */ \ 61 | } 62 | 63 | #define SPLAY_INITIALIZER(root) \ 64 | { NULL } 65 | 66 | #define SPLAY_INIT(root) do { \ 67 | (root)->sph_root = NULL; \ 68 | } while (0) 69 | 70 | #define SPLAY_ENTRY(type) \ 71 | struct { \ 72 | struct type *spe_left; /* left element */ \ 73 | struct type *spe_right; /* right element */ \ 74 | } 75 | 76 | #define SPLAY_LEFT(elm, field) (elm)->field.spe_left 77 | #define SPLAY_RIGHT(elm, field) (elm)->field.spe_right 78 | #define SPLAY_ROOT(head) (head)->sph_root 79 | #define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) 80 | 81 | /* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ 82 | #define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ 83 | SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ 84 | SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ 85 | (head)->sph_root = tmp; \ 86 | } while (0) 87 | 88 | #define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ 89 | SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ 90 | SPLAY_LEFT(tmp, field) = (head)->sph_root; \ 91 | (head)->sph_root = tmp; \ 92 | } while (0) 93 | 94 | #define SPLAY_LINKLEFT(head, tmp, field) do { \ 95 | SPLAY_LEFT(tmp, field) = (head)->sph_root; \ 96 | tmp = (head)->sph_root; \ 97 | (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ 98 | } while (0) 99 | 100 | #define SPLAY_LINKRIGHT(head, tmp, field) do { \ 101 | SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ 102 | tmp = (head)->sph_root; \ 103 | (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ 104 | } while (0) 105 | 106 | #define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ 107 | SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ 108 | SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ 109 | SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ 110 | SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ 111 | } while (0) 112 | 113 | /* Generates prototypes and inline functions */ 114 | 115 | #define SPLAY_PROTOTYPE(name, type, field, cmp) \ 116 | void name##_SPLAY(struct name *, struct type *); \ 117 | void name##_SPLAY_MINMAX(struct name *, int); \ 118 | struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ 119 | struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ 120 | \ 121 | /* Finds the node with the same key as elm */ \ 122 | static __inline struct type * \ 123 | name##_SPLAY_FIND(struct name *head, struct type *elm) \ 124 | { \ 125 | if (SPLAY_EMPTY(head)) \ 126 | return(NULL); \ 127 | name##_SPLAY(head, elm); \ 128 | if ((cmp)(elm, (head)->sph_root) == 0) \ 129 | return (head->sph_root); \ 130 | return (NULL); \ 131 | } \ 132 | \ 133 | static __inline struct type * \ 134 | name##_SPLAY_NEXT(struct name *head, struct type *elm) \ 135 | { \ 136 | name##_SPLAY(head, elm); \ 137 | if (SPLAY_RIGHT(elm, field) != NULL) { \ 138 | elm = SPLAY_RIGHT(elm, field); \ 139 | while (SPLAY_LEFT(elm, field) != NULL) { \ 140 | elm = SPLAY_LEFT(elm, field); \ 141 | } \ 142 | } else \ 143 | elm = NULL; \ 144 | return (elm); \ 145 | } \ 146 | \ 147 | static __inline struct type * \ 148 | name##_SPLAY_MIN_MAX(struct name *head, int val) \ 149 | { \ 150 | name##_SPLAY_MINMAX(head, val); \ 151 | return (SPLAY_ROOT(head)); \ 152 | } 153 | 154 | /* Main splay operation. 155 | * Moves node close to the key of elm to top 156 | */ 157 | #define SPLAY_GENERATE(name, type, field, cmp) \ 158 | struct type * \ 159 | name##_SPLAY_INSERT(struct name *head, struct type *elm) \ 160 | { \ 161 | if (SPLAY_EMPTY(head)) { \ 162 | SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ 163 | } else { \ 164 | int __comp; \ 165 | name##_SPLAY(head, elm); \ 166 | __comp = (cmp)(elm, (head)->sph_root); \ 167 | if(__comp < 0) { \ 168 | SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\ 169 | SPLAY_RIGHT(elm, field) = (head)->sph_root; \ 170 | SPLAY_LEFT((head)->sph_root, field) = NULL; \ 171 | } else if (__comp > 0) { \ 172 | SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\ 173 | SPLAY_LEFT(elm, field) = (head)->sph_root; \ 174 | SPLAY_RIGHT((head)->sph_root, field) = NULL; \ 175 | } else \ 176 | return ((head)->sph_root); \ 177 | } \ 178 | (head)->sph_root = (elm); \ 179 | return (NULL); \ 180 | } \ 181 | \ 182 | struct type * \ 183 | name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ 184 | { \ 185 | struct type *__tmp; \ 186 | if (SPLAY_EMPTY(head)) \ 187 | return (NULL); \ 188 | name##_SPLAY(head, elm); \ 189 | if ((cmp)(elm, (head)->sph_root) == 0) { \ 190 | if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ 191 | (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\ 192 | } else { \ 193 | __tmp = SPLAY_RIGHT((head)->sph_root, field); \ 194 | (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\ 195 | name##_SPLAY(head, elm); \ 196 | SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ 197 | } \ 198 | return (elm); \ 199 | } \ 200 | return (NULL); \ 201 | } \ 202 | \ 203 | void \ 204 | name##_SPLAY(struct name *head, struct type *elm) \ 205 | { \ 206 | struct type __node, *__left, *__right, *__tmp; \ 207 | int __comp; \ 208 | \ 209 | SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ 210 | __left = __right = &__node; \ 211 | \ 212 | while ((__comp = (cmp)(elm, (head)->sph_root))) { \ 213 | if (__comp < 0) { \ 214 | __tmp = SPLAY_LEFT((head)->sph_root, field); \ 215 | if (__tmp == NULL) \ 216 | break; \ 217 | if ((cmp)(elm, __tmp) < 0){ \ 218 | SPLAY_ROTATE_RIGHT(head, __tmp, field); \ 219 | if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ 220 | break; \ 221 | } \ 222 | SPLAY_LINKLEFT(head, __right, field); \ 223 | } else if (__comp > 0) { \ 224 | __tmp = SPLAY_RIGHT((head)->sph_root, field); \ 225 | if (__tmp == NULL) \ 226 | break; \ 227 | if ((cmp)(elm, __tmp) > 0){ \ 228 | SPLAY_ROTATE_LEFT(head, __tmp, field); \ 229 | if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ 230 | break; \ 231 | } \ 232 | SPLAY_LINKRIGHT(head, __left, field); \ 233 | } \ 234 | } \ 235 | SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ 236 | } \ 237 | \ 238 | /* Splay with either the minimum or the maximum element \ 239 | * Used to find minimum or maximum element in tree. \ 240 | */ \ 241 | void name##_SPLAY_MINMAX(struct name *head, int __comp) \ 242 | { \ 243 | struct type __node, *__left, *__right, *__tmp; \ 244 | \ 245 | SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ 246 | __left = __right = &__node; \ 247 | \ 248 | while (1) { \ 249 | if (__comp < 0) { \ 250 | __tmp = SPLAY_LEFT((head)->sph_root, field); \ 251 | if (__tmp == NULL) \ 252 | break; \ 253 | if (__comp < 0){ \ 254 | SPLAY_ROTATE_RIGHT(head, __tmp, field); \ 255 | if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ 256 | break; \ 257 | } \ 258 | SPLAY_LINKLEFT(head, __right, field); \ 259 | } else if (__comp > 0) { \ 260 | __tmp = SPLAY_RIGHT((head)->sph_root, field); \ 261 | if (__tmp == NULL) \ 262 | break; \ 263 | if (__comp > 0) { \ 264 | SPLAY_ROTATE_LEFT(head, __tmp, field); \ 265 | if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ 266 | break; \ 267 | } \ 268 | SPLAY_LINKRIGHT(head, __left, field); \ 269 | } \ 270 | } \ 271 | SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ 272 | } 273 | 274 | #define SPLAY_NEGINF -1 275 | #define SPLAY_INF 1 276 | 277 | #define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) 278 | #define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) 279 | #define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) 280 | #define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) 281 | #define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ 282 | : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) 283 | #define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ 284 | : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) 285 | 286 | #define SPLAY_FOREACH(x, name, head) \ 287 | for ((x) = SPLAY_MIN(name, head); \ 288 | (x) != NULL; \ 289 | (x) = SPLAY_NEXT(name, head, x)) 290 | 291 | /* Macros that define a red-black tree */ 292 | #define RB_HEAD(name, type) \ 293 | struct name { \ 294 | struct type *rbh_root; /* root of the tree */ \ 295 | } 296 | 297 | #define RB_INITIALIZER(root) \ 298 | { NULL } 299 | 300 | #define RB_INIT(root) do { \ 301 | (root)->rbh_root = NULL; \ 302 | } while (0) 303 | 304 | #define RB_BLACK 0 305 | #define RB_RED 1 306 | #define RB_ENTRY(type) \ 307 | struct { \ 308 | struct type *rbe_left; /* left element */ \ 309 | struct type *rbe_right; /* right element */ \ 310 | struct type *rbe_parent; /* parent element */ \ 311 | int rbe_color; /* node color */ \ 312 | } 313 | 314 | #define RB_LEFT(elm, field) (elm)->field.rbe_left 315 | #define RB_RIGHT(elm, field) (elm)->field.rbe_right 316 | #define RB_PARENT(elm, field) (elm)->field.rbe_parent 317 | #define RB_COLOR(elm, field) (elm)->field.rbe_color 318 | #define RB_ROOT(head) (head)->rbh_root 319 | #define RB_EMPTY(head) (RB_ROOT(head) == NULL) 320 | 321 | #define RB_SET(elm, parent, field) do { \ 322 | RB_PARENT(elm, field) = parent; \ 323 | RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ 324 | RB_COLOR(elm, field) = RB_RED; \ 325 | } while (0) 326 | 327 | #define RB_SET_BLACKRED(black, red, field) do { \ 328 | RB_COLOR(black, field) = RB_BLACK; \ 329 | RB_COLOR(red, field) = RB_RED; \ 330 | } while (0) 331 | 332 | #ifndef RB_AUGMENT 333 | #define RB_AUGMENT(x) do {} while (0) 334 | #endif 335 | 336 | #define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ 337 | (tmp) = RB_RIGHT(elm, field); \ 338 | if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field))) { \ 339 | RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ 340 | } \ 341 | RB_AUGMENT(elm); \ 342 | if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ 343 | if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ 344 | RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ 345 | else \ 346 | RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ 347 | } else \ 348 | (head)->rbh_root = (tmp); \ 349 | RB_LEFT(tmp, field) = (elm); \ 350 | RB_PARENT(elm, field) = (tmp); \ 351 | RB_AUGMENT(tmp); \ 352 | if ((RB_PARENT(tmp, field))) \ 353 | RB_AUGMENT(RB_PARENT(tmp, field)); \ 354 | } while (0) 355 | 356 | #define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ 357 | (tmp) = RB_LEFT(elm, field); \ 358 | if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field))) { \ 359 | RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ 360 | } \ 361 | RB_AUGMENT(elm); \ 362 | if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ 363 | if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ 364 | RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ 365 | else \ 366 | RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ 367 | } else \ 368 | (head)->rbh_root = (tmp); \ 369 | RB_RIGHT(tmp, field) = (elm); \ 370 | RB_PARENT(elm, field) = (tmp); \ 371 | RB_AUGMENT(tmp); \ 372 | if ((RB_PARENT(tmp, field))) \ 373 | RB_AUGMENT(RB_PARENT(tmp, field)); \ 374 | } while (0) 375 | 376 | /* Generates prototypes and inline functions */ 377 | #define RB_PROTOTYPE(name, type, field, cmp) \ 378 | RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) 379 | #define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ 380 | RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __attribute__((__unused__)) static) 381 | #define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ 382 | attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ 383 | attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ 384 | attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ 385 | attr struct type *name##_RB_INSERT(struct name *, struct type *); \ 386 | attr struct type *name##_RB_FIND(struct name *, struct type *); \ 387 | attr struct type *name##_RB_NFIND(struct name *, struct type *); \ 388 | attr struct type *name##_RB_NEXT(struct type *); \ 389 | attr struct type *name##_RB_PREV(struct type *); \ 390 | attr struct type *name##_RB_MINMAX(struct name *, int); \ 391 | \ 392 | 393 | /* Main rb operation. 394 | * Moves node close to the key of elm to top 395 | */ 396 | #define RB_GENERATE(name, type, field, cmp) \ 397 | RB_GENERATE_INTERNAL(name, type, field, cmp,) 398 | #define RB_GENERATE_STATIC(name, type, field, cmp) \ 399 | RB_GENERATE_INTERNAL(name, type, field, cmp, __attribute__((__unused__)) static) 400 | #define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ 401 | attr void \ 402 | name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ 403 | { \ 404 | struct type *parent, *gparent, *tmp; \ 405 | while ((parent = RB_PARENT(elm, field)) && \ 406 | RB_COLOR(parent, field) == RB_RED) { \ 407 | gparent = RB_PARENT(parent, field); \ 408 | if (parent == RB_LEFT(gparent, field)) { \ 409 | tmp = RB_RIGHT(gparent, field); \ 410 | if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ 411 | RB_COLOR(tmp, field) = RB_BLACK; \ 412 | RB_SET_BLACKRED(parent, gparent, field);\ 413 | elm = gparent; \ 414 | continue; \ 415 | } \ 416 | if (RB_RIGHT(parent, field) == elm) { \ 417 | RB_ROTATE_LEFT(head, parent, tmp, field);\ 418 | tmp = parent; \ 419 | parent = elm; \ 420 | elm = tmp; \ 421 | } \ 422 | RB_SET_BLACKRED(parent, gparent, field); \ 423 | RB_ROTATE_RIGHT(head, gparent, tmp, field); \ 424 | } else { \ 425 | tmp = RB_LEFT(gparent, field); \ 426 | if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ 427 | RB_COLOR(tmp, field) = RB_BLACK; \ 428 | RB_SET_BLACKRED(parent, gparent, field);\ 429 | elm = gparent; \ 430 | continue; \ 431 | } \ 432 | if (RB_LEFT(parent, field) == elm) { \ 433 | RB_ROTATE_RIGHT(head, parent, tmp, field);\ 434 | tmp = parent; \ 435 | parent = elm; \ 436 | elm = tmp; \ 437 | } \ 438 | RB_SET_BLACKRED(parent, gparent, field); \ 439 | RB_ROTATE_LEFT(head, gparent, tmp, field); \ 440 | } \ 441 | } \ 442 | RB_COLOR(head->rbh_root, field) = RB_BLACK; \ 443 | } \ 444 | \ 445 | attr void \ 446 | name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \ 447 | { \ 448 | struct type *tmp; \ 449 | while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ 450 | elm != RB_ROOT(head)) { \ 451 | if (RB_LEFT(parent, field) == elm) { \ 452 | tmp = RB_RIGHT(parent, field); \ 453 | if (RB_COLOR(tmp, field) == RB_RED) { \ 454 | RB_SET_BLACKRED(tmp, parent, field); \ 455 | RB_ROTATE_LEFT(head, parent, tmp, field);\ 456 | tmp = RB_RIGHT(parent, field); \ 457 | } \ 458 | if ((RB_LEFT(tmp, field) == NULL || \ 459 | RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ 460 | (RB_RIGHT(tmp, field) == NULL || \ 461 | RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ 462 | RB_COLOR(tmp, field) = RB_RED; \ 463 | elm = parent; \ 464 | parent = RB_PARENT(elm, field); \ 465 | } else { \ 466 | if (RB_RIGHT(tmp, field) == NULL || \ 467 | RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\ 468 | struct type *oleft; \ 469 | if ((oleft = RB_LEFT(tmp, field)))\ 470 | RB_COLOR(oleft, field) = RB_BLACK;\ 471 | RB_COLOR(tmp, field) = RB_RED; \ 472 | RB_ROTATE_RIGHT(head, tmp, oleft, field);\ 473 | tmp = RB_RIGHT(parent, field); \ 474 | } \ 475 | RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ 476 | RB_COLOR(parent, field) = RB_BLACK; \ 477 | if (RB_RIGHT(tmp, field)) \ 478 | RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\ 479 | RB_ROTATE_LEFT(head, parent, tmp, field);\ 480 | elm = RB_ROOT(head); \ 481 | break; \ 482 | } \ 483 | } else { \ 484 | tmp = RB_LEFT(parent, field); \ 485 | if (RB_COLOR(tmp, field) == RB_RED) { \ 486 | RB_SET_BLACKRED(tmp, parent, field); \ 487 | RB_ROTATE_RIGHT(head, parent, tmp, field);\ 488 | tmp = RB_LEFT(parent, field); \ 489 | } \ 490 | if ((RB_LEFT(tmp, field) == NULL || \ 491 | RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ 492 | (RB_RIGHT(tmp, field) == NULL || \ 493 | RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ 494 | RB_COLOR(tmp, field) = RB_RED; \ 495 | elm = parent; \ 496 | parent = RB_PARENT(elm, field); \ 497 | } else { \ 498 | if (RB_LEFT(tmp, field) == NULL || \ 499 | RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\ 500 | struct type *oright; \ 501 | if ((oright = RB_RIGHT(tmp, field)))\ 502 | RB_COLOR(oright, field) = RB_BLACK;\ 503 | RB_COLOR(tmp, field) = RB_RED; \ 504 | RB_ROTATE_LEFT(head, tmp, oright, field);\ 505 | tmp = RB_LEFT(parent, field); \ 506 | } \ 507 | RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ 508 | RB_COLOR(parent, field) = RB_BLACK; \ 509 | if (RB_LEFT(tmp, field)) \ 510 | RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\ 511 | RB_ROTATE_RIGHT(head, parent, tmp, field);\ 512 | elm = RB_ROOT(head); \ 513 | break; \ 514 | } \ 515 | } \ 516 | } \ 517 | if (elm) \ 518 | RB_COLOR(elm, field) = RB_BLACK; \ 519 | } \ 520 | \ 521 | attr struct type * \ 522 | name##_RB_REMOVE(struct name *head, struct type *elm) \ 523 | { \ 524 | struct type *child, *parent, *old = elm; \ 525 | int color; \ 526 | if (RB_LEFT(elm, field) == NULL) \ 527 | child = RB_RIGHT(elm, field); \ 528 | else if (RB_RIGHT(elm, field) == NULL) \ 529 | child = RB_LEFT(elm, field); \ 530 | else { \ 531 | struct type *left; \ 532 | elm = RB_RIGHT(elm, field); \ 533 | while ((left = RB_LEFT(elm, field))) \ 534 | elm = left; \ 535 | child = RB_RIGHT(elm, field); \ 536 | parent = RB_PARENT(elm, field); \ 537 | color = RB_COLOR(elm, field); \ 538 | if (child) \ 539 | RB_PARENT(child, field) = parent; \ 540 | if (parent) { \ 541 | if (RB_LEFT(parent, field) == elm) \ 542 | RB_LEFT(parent, field) = child; \ 543 | else \ 544 | RB_RIGHT(parent, field) = child; \ 545 | RB_AUGMENT(parent); \ 546 | } else \ 547 | RB_ROOT(head) = child; \ 548 | if (RB_PARENT(elm, field) == old) \ 549 | parent = elm; \ 550 | (elm)->field = (old)->field; \ 551 | if (RB_PARENT(old, field)) { \ 552 | if (RB_LEFT(RB_PARENT(old, field), field) == old)\ 553 | RB_LEFT(RB_PARENT(old, field), field) = elm;\ 554 | else \ 555 | RB_RIGHT(RB_PARENT(old, field), field) = elm;\ 556 | RB_AUGMENT(RB_PARENT(old, field)); \ 557 | } else \ 558 | RB_ROOT(head) = elm; \ 559 | RB_PARENT(RB_LEFT(old, field), field) = elm; \ 560 | if (RB_RIGHT(old, field)) \ 561 | RB_PARENT(RB_RIGHT(old, field), field) = elm; \ 562 | if (parent) { \ 563 | left = parent; \ 564 | do { \ 565 | RB_AUGMENT(left); \ 566 | } while ((left = RB_PARENT(left, field))); \ 567 | } \ 568 | goto color; \ 569 | } \ 570 | parent = RB_PARENT(elm, field); \ 571 | color = RB_COLOR(elm, field); \ 572 | if (child) \ 573 | RB_PARENT(child, field) = parent; \ 574 | if (parent) { \ 575 | if (RB_LEFT(parent, field) == elm) \ 576 | RB_LEFT(parent, field) = child; \ 577 | else \ 578 | RB_RIGHT(parent, field) = child; \ 579 | RB_AUGMENT(parent); \ 580 | } else \ 581 | RB_ROOT(head) = child; \ 582 | color: \ 583 | if (color == RB_BLACK) \ 584 | name##_RB_REMOVE_COLOR(head, parent, child); \ 585 | return (old); \ 586 | } \ 587 | \ 588 | /* Inserts a node into the RB tree */ \ 589 | attr struct type * \ 590 | name##_RB_INSERT(struct name *head, struct type *elm) \ 591 | { \ 592 | struct type *tmp; \ 593 | struct type *parent = NULL; \ 594 | int comp = 0; \ 595 | tmp = RB_ROOT(head); \ 596 | while (tmp) { \ 597 | parent = tmp; \ 598 | comp = (cmp)(elm, parent); \ 599 | if (comp < 0) \ 600 | tmp = RB_LEFT(tmp, field); \ 601 | else if (comp > 0) \ 602 | tmp = RB_RIGHT(tmp, field); \ 603 | else \ 604 | return (tmp); \ 605 | } \ 606 | RB_SET(elm, parent, field); \ 607 | if (parent != NULL) { \ 608 | if (comp < 0) \ 609 | RB_LEFT(parent, field) = elm; \ 610 | else \ 611 | RB_RIGHT(parent, field) = elm; \ 612 | RB_AUGMENT(parent); \ 613 | } else \ 614 | RB_ROOT(head) = elm; \ 615 | name##_RB_INSERT_COLOR(head, elm); \ 616 | return (NULL); \ 617 | } \ 618 | \ 619 | /* Finds the node with the same key as elm */ \ 620 | attr struct type * \ 621 | name##_RB_FIND(struct name *head, struct type *elm) \ 622 | { \ 623 | struct type *tmp = RB_ROOT(head); \ 624 | int comp; \ 625 | while (tmp) { \ 626 | comp = cmp(elm, tmp); \ 627 | if (comp < 0) \ 628 | tmp = RB_LEFT(tmp, field); \ 629 | else if (comp > 0) \ 630 | tmp = RB_RIGHT(tmp, field); \ 631 | else \ 632 | return (tmp); \ 633 | } \ 634 | return (NULL); \ 635 | } \ 636 | \ 637 | /* Finds the first node greater than or equal to the search key */ \ 638 | attr struct type * \ 639 | name##_RB_NFIND(struct name *head, struct type *elm) \ 640 | { \ 641 | struct type *tmp = RB_ROOT(head); \ 642 | struct type *res = NULL; \ 643 | int comp; \ 644 | while (tmp) { \ 645 | comp = cmp(elm, tmp); \ 646 | if (comp < 0) { \ 647 | res = tmp; \ 648 | tmp = RB_LEFT(tmp, field); \ 649 | } \ 650 | else if (comp > 0) \ 651 | tmp = RB_RIGHT(tmp, field); \ 652 | else \ 653 | return (tmp); \ 654 | } \ 655 | return (res); \ 656 | } \ 657 | \ 658 | /* ARGSUSED */ \ 659 | attr struct type * \ 660 | name##_RB_NEXT(struct type *elm) \ 661 | { \ 662 | if (RB_RIGHT(elm, field)) { \ 663 | elm = RB_RIGHT(elm, field); \ 664 | while (RB_LEFT(elm, field)) \ 665 | elm = RB_LEFT(elm, field); \ 666 | } else { \ 667 | if (RB_PARENT(elm, field) && \ 668 | (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ 669 | elm = RB_PARENT(elm, field); \ 670 | else { \ 671 | while (RB_PARENT(elm, field) && \ 672 | (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ 673 | elm = RB_PARENT(elm, field); \ 674 | elm = RB_PARENT(elm, field); \ 675 | } \ 676 | } \ 677 | return (elm); \ 678 | } \ 679 | \ 680 | /* ARGSUSED */ \ 681 | attr struct type * \ 682 | name##_RB_PREV(struct type *elm) \ 683 | { \ 684 | if (RB_LEFT(elm, field)) { \ 685 | elm = RB_LEFT(elm, field); \ 686 | while (RB_RIGHT(elm, field)) \ 687 | elm = RB_RIGHT(elm, field); \ 688 | } else { \ 689 | if (RB_PARENT(elm, field) && \ 690 | (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ 691 | elm = RB_PARENT(elm, field); \ 692 | else { \ 693 | while (RB_PARENT(elm, field) && \ 694 | (elm == RB_LEFT(RB_PARENT(elm, field), field)))\ 695 | elm = RB_PARENT(elm, field); \ 696 | elm = RB_PARENT(elm, field); \ 697 | } \ 698 | } \ 699 | return (elm); \ 700 | } \ 701 | \ 702 | attr struct type * \ 703 | name##_RB_MINMAX(struct name *head, int val) \ 704 | { \ 705 | struct type *tmp = RB_ROOT(head); \ 706 | struct type *parent = NULL; \ 707 | while (tmp) { \ 708 | parent = tmp; \ 709 | if (val < 0) \ 710 | tmp = RB_LEFT(tmp, field); \ 711 | else \ 712 | tmp = RB_RIGHT(tmp, field); \ 713 | } \ 714 | return (parent); \ 715 | } 716 | 717 | #define RB_NEGINF -1 718 | #define RB_INF 1 719 | 720 | #define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) 721 | #define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) 722 | #define RB_FIND(name, x, y) name##_RB_FIND(x, y) 723 | #define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) 724 | #define RB_NEXT(name, x, y) name##_RB_NEXT(y) 725 | #define RB_PREV(name, x, y) name##_RB_PREV(y) 726 | #define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) 727 | #define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) 728 | 729 | #define RB_FOREACH(x, name, head) \ 730 | for ((x) = RB_MIN(name, head); \ 731 | (x) != NULL; \ 732 | (x) = name##_RB_NEXT(x)) 733 | 734 | #define RB_FOREACH_SAFE(x, name, head, y) \ 735 | for ((x) = RB_MIN(name, head); \ 736 | ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ 737 | (x) = (y)) 738 | 739 | #define RB_FOREACH_REVERSE(x, name, head) \ 740 | for ((x) = RB_MAX(name, head); \ 741 | (x) != NULL; \ 742 | (x) = name##_RB_PREV(x)) 743 | 744 | #endif /* _SYS_TREE_H_ */ 745 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | spectrwm 3.7.0 2 | ============== 3 | 4 | Released on Aug 26, 2025 5 | 6 | Adds a centered mode for tiled layouts, configuration reload, increases the 7 | maximum number of workspaces, and more. 8 | 9 | * Add centered mode for tiled layouts. 10 | - Add `center_layout` action (default: `M-backslash`). Toggle centering of 11 | the master area. 12 | - Add `center_adaptive` option to only center when centering does not create 13 | empty space. 14 | - Add `center_autobalance` option to automatically balance the master/stacking 15 | areas when toggling centered mode. 16 | - Add `center_noautostack` option to disable automatically adding an extra 17 | stack when centering a layout with a single stack. 18 | - Add `center_nowrap` option to allow the centered master area to split the 19 | original order of stacks instead of maintaining tiling order. 20 | - Add corresponding layout and stack_mark options. 21 | * Add configuration reload. 22 | - On reload, the configuration is reloaded without restarting and the bar(s) 23 | are reinitialized along with `bar_action` (if used). 24 | - Add `reload` action (default: `unbound`). Initiates a reload. 25 | - Add `SIGUSR1` signal handling to initiate a reload. 26 | * Improve uniconify. 27 | - Add `uniconify_order` option to set the window order in the uniconify menu. 28 | - Add `uniconify_quick` action (default: `unbound`). Uniconify the most 29 | recently iconified window. 30 | * Improve EWMH support. 31 | - Add support for `_NET_WM_STATE_FOCUSED`. 32 | - Improve `_NET_WM_DESKTOP` request handling. 33 | - Improve `_NET_WM_ALLOWED_ACTIONS` support. 34 | - Fix `_NET_WM_ALLOWED_ACTIONS` property change issue. 35 | - Fix `_NET_DESKTOP_NAMES` handling. 36 | * Add new quirks. 37 | - Add `NOTILE` quirk to disallow windows from being tiled. 38 | - Add `IGNOREURGENT` quirk to ignore the urgency hint on windows. 39 | - Add `NOFOCUSPOINTER` quirk to disable click-to-focus on windows. 40 | * Increase the maximum `workspace_limit` to 100. Note that bindings for 41 | workspaces 23 and above are unbound by default. 42 | * Add `move_step` and `resize_step` options to configure the pixel amount to 43 | move/resize a window when using the respective action bindings. 44 | * Add `bar_padding_horizontal` and `bar_padding_vertical` options to adjust 45 | the padding of bar text. 46 | * Add `disable_padding` option to disable region padding when there is a single 47 | window. 48 | * Improve transient window stacking to prevent dialogs from getting buried. 49 | * Change the `restart_of_day` action to ignore `autorun` entries. 50 | * Fix compatibility issue with Wine. 51 | * Fix pointer centering when focusing free mode windows. 52 | * Fix free mode maximized/fullscreen unfocus handling issue. 53 | * Fix move/resize refocus issue with globally active input model windows. 54 | * Fix popup window refocus issue for free mode windows. 55 | * Improve window management checks to better handle buggy programs. 56 | * Improve debug output. 57 | 58 | 59 | spectrwm 3.6.0 60 | ============== 61 | 62 | Released on Jun 10, 2024 63 | 64 | Adds some new features, removes limits and fixes bugs. 65 | 66 | * Improve `focus_mode` to support customization of specific focus situations. 67 | * Improve quirks. 68 | - Add support for `+=` and `-=` assignment operators for quirk assignment. 69 | - Add new optional window type field to quirks. 70 | - Add `BELOW` quirk. 71 | - Add `ICONIFY` quirk. 72 | - Add `MAXIMIZE` quirk. 73 | * Add new `spawn_flags` option to adjust program spawn entry settings. 74 | * Add new `layout_order` option to customize the layout sequence used by the 75 | `cycle_layout` action. 76 | * Improve bar font handling. 77 | - Remove the `bar_font` limit of 10 fonts when using Xft. 78 | - Extend `bar_format` markup sequences to support font indexes above 9. 79 | * Improve bar color handling. 80 | - Remove the 10 color limit on options that accept a color list. 81 | - Extend `bar_format` markup sequences to support color indexes above 9. 82 | - Add support for the `+=` operator with options that accept a color list. 83 | - Fix handling of normal/unfocus/free bar colors with different counts. 84 | - Fix bar colors should be per X screen. 85 | * Improve urgent window handling. 86 | - Add `color_urgent*` options to change the border colors of urgent windows. 87 | - Fix `focus_urgent` search issue. 88 | * Improve EWMH handling. 89 | - Add special handling of `_NET_WM_WINDOW_TYPE_NOTIFICATION` windows. 90 | - Fix `warp_pointer` should not apply to `_NET_WM_MOVERESIZE`. 91 | - Fix `_NET_ACTIVE_WINDOW` request handling. 92 | - Fix `_NET_DESKTOP_VIEWPORTS`. 93 | - Fix EWMH `_NET_WM_DESKTOP` requests should not bypass `workspace_limit`. 94 | * Improve libswmhack.so. 95 | - Add XCB support. 96 | - Remove unneeded compile time linking with libX11. 97 | - Improve symbol lookup. 98 | * Add new `bar_workspace_limit` option to limit the workspaces shown in the 99 | workspace (`+L`) and urgency hint (`+U`) indicators. 100 | * Fix flipped vertical/horizontal layout positioning issue. 101 | * Fix segfault when setting the `layout` option to `floating`. 102 | * Fix window mapping issue when swapping a maximized window. 103 | * Fix `swap_main` issue. 104 | * Fix listing of empty workspaces in `bar_format` `+U` and `+L`. 105 | * Fix escape handling of `+` in `bar_action` script output. 106 | * Fix possible bar redraw delays. 107 | * Fix some leaks and a possible crash. 108 | * Fix building against XCB with RandR < 1.6. 109 | * Improve RandR checks. 110 | * Remove Xlib RandR dependency. 111 | * Remove BSD function ports for Linux and depend on `libbsd` instead. 112 | * Improve included `spectrwm.desktop` and move it to the main directory. 113 | * Improve man page. 114 | * Improve CHANGELOG and README. 115 | 116 | 117 | spectrwm 3.5.1 118 | ============== 119 | 120 | Released on Nov 25, 2023 121 | 122 | Fixes NetBSD support and a few minor issues. 123 | 124 | * Fix `bar_at_bottom` bottom gap when `bar_border_width` > 0. 125 | * Fix maximize new windows in max layout when `max_layout_maximize = 1`. 126 | * Fix `autorun` option and `WS` quirk should accept a value of `-1` as stated 127 | in the manual. 128 | * Fix `bar_color_free` and `bar_font_color_free` options. 129 | * Fix bar urgency hint (+U) workspaces should begin at 1. 130 | * Fix iconified windows should uniconify on MapRequest. 131 | * Fix focus fallback issue when iconifying windows. 132 | * Improve handling when programs try to position their own windows. 133 | * Fix NetBSD build issues. 134 | * Add NetBSD to list of OSes that have the XCB XInput Extension. 135 | * Fix build failure when building without the XCB XInput Extension. 136 | * Fix possible segfault at startup. 137 | * Add SWMHACK section to manual. 138 | * Fix typos in manual. 139 | 140 | 141 | spectrwm 3.5.0 142 | ============== 143 | 144 | Released on Oct 22, 2023 145 | 146 | Includes a bunch of major new features and improvements, such as dock/panel 147 | support, an always mapped window mode, floating workspace layout, transparent 148 | color support, tons of fixes, and more! 149 | 150 | * Add *free* window mode. 151 | - *free* windows are floating windows that are not in a workspace. They remain 152 | mapped and may be resized, positioned and stacked anywhere. When iconified, 153 | they appear at the end of the uniconify menu. Note that free windows can be 154 | stacked above/below workspace windows but must be put into a workspace and 155 | unfloated to be part of its tiling layout. `float_toggle` is convenient for 156 | this purpose. 157 | - Add `free_toggle` action (default: `M-S-grave`). Toggle focused window 158 | between workspace mode and free mode. 159 | - Add `focus_free` action (default: `M-grave`). Switch focus to/from windows in 160 | free mode, if any. 161 | - Add related color and focus mark options. 162 | * Improve EWMH (Extended Window Manager Hints) support. 163 | - Add support for docks/panels and desktop managers. 164 | - Add strut support for windows (e.g. panels) to automatically reserve screen 165 | real estate. 166 | - Add support for applications to initiate move/resize operations. 167 | - Add *demands attention* support to urgency features to include windows that 168 | request focus but are denied. 169 | - Add support for *below* state to keep windows stacked below others. 170 | - Improve `_NET_ACTIVE_WINDOW` handling. 171 | - Fix `_NET_DESKTOP_VIEWPORT` should update on workspace and region changes. 172 | * Improve window stacking. 173 | - Overhaul window stacking for improved reliability and flexibility required 174 | for new features/fixes. Windows are now stacked as a whole instead of per 175 | region/workspace. 176 | - Add `click_to_raise` option (default: `1` (enabled)). Raises stacking 177 | priority when clicking on a window. 178 | - Add `below_toggle` action (default: `M-S-t`). Toggles *below* state on a 179 | focused window to keep it below other windows. `raise` can be used to 180 | temporarily bring a window above all others. 181 | - Fix `raise` and `always_raise` stacking issues. 182 | - Fix follow mode stacking issues. 183 | - Fix stacking order issues. 184 | - Restore stacking order after leaving fullscreen/maximized state. 185 | * Workaround application issues related to ICCCM 6.3 button grabs. 186 | - If X Input Extension >= 2.1 is available, handle button bindings with the 187 | `REPLAY` flag passively, without grabs. For other button bindings, establish 188 | grabs on root. 189 | - Otherwise, for compatibility, establish all button binding grabs directly on 190 | client windows. 191 | * Add alpha transparent color support for use with compositing managers. Colors 192 | can now be specified with an alpha component via the format 193 | `rbga:rr/gg/bb/aa` (values in hex.) 194 | * Improve bar fonts. 195 | - Fallback to a "fail-safe" font if the default/user `bar_font` fails to load. 196 | - Add fallback handling for missing glyphs when using multiple fonts with Xft. 197 | - Add supplementary private-use code points to `bar_font_pua`. 198 | - Fix `$bar_font` program variable substitution should not include fallbacks. 199 | * Improve window mapping. 200 | - Add `maximize_hide_other` and `fullscreen_hide_other` options. When a 201 | maximized/fullscreen window is focused, hide unrelated windows on the same 202 | workspace. Useful for transparent windows. 203 | - Fix window mapping issue when handling simultaneous screen changes. 204 | - Improve reliability. 205 | * Improve (re)start handling. 206 | - Set intial focus more reliably. 207 | - Focus on fullscreen/maximized windows before main. 208 | - Restore window floating geometry on shutdown. 209 | * Improve focus handling. 210 | - Add `prior` setting to `focus_close`. When the focused window is closed, 211 | fallback to the last focused window in the workspace. 212 | - Add `focus_prior` action. Focus last focused window on workspace. 213 | (Default binding: `M-S-a`.) 214 | - Improve previous focus fallback. 215 | - Fix iconified window focus issue. 216 | - Fix input focus fallback. 217 | - Fix setting focus with EWMH should unmaximize other windows. 218 | - Fix move/resize operation should abort on focus loss. 219 | - Fix `focus_main` issue with iconified/floating windows. 220 | - Fix max layout focus issue when closing transients. 221 | - Fix `warp_pointer` issues. 222 | * Improve focus follow mode. 223 | - Fix handling of ConfigureWindow and EWMH requests. 224 | - Fix workspace switching issues. 225 | * Improve status bar. 226 | - Add character sequence for workspace list indicator (`+L`). 227 | - Add workspace mark options for the workspace indicator (`+L`). 228 | - Add stack mark options for the stacking indicator (`+S`). 229 | - Add focus mark options for the focus status indicator (`+F`). 230 | - Add character sequence for number of windows in workspace (`+w`) (lowercase). 231 | - Add unfocused options to color bar text and background. 232 | - Add color options for when a window in free mode is focused. 233 | - Fix `bar_action` piping deadlock issue. 234 | - Fix `name_workspace` should clear on empty string. 235 | - Fix refresh bar on `name_workspace`. 236 | - Set `WM_CLASS`, `WM_NAME` and `_NET_WM_NAME` on the bar window. 237 | * Add `floating` workspace layout stacking mode. 238 | - In floating layout, windows are not tiled and may be freely moved around 239 | and resized. 240 | - Add `stack_mark_floating` option for the stacking indicator 241 | (default:` '[~]'`). 242 | - Add `layout_floating` action (default: unbound). Directly switch to floating 243 | layout. 244 | - Add `floating` `stack_mode` to the `layout` option. 245 | * Improve max layout. 246 | - Allow windows to be unmaximized/floated in max layout. 247 | - Add `max_layout_maximize` option to configure default maximized state. 248 | - Allow floating windows to remain floating when dragged between regions into 249 | a max layout workspace. 250 | * Improve window handling. 251 | - Add *snap* behavior when dragging tiled/maximized windows. Prevents 252 | accidentally floating tiled windows. 253 | - Add `snap_range` option (default 25). Sets the pixel distance a 254 | tiled/maximized window must be dragged (with the pointer) to make it 255 | float and move freely. Set to 0 to unsnap/float immediately. 256 | - Add `maximized_unfocus` and `fullscreen_unfocus` options. Configures 257 | handling of maximized/fullscreen windows that lose focus. 258 | - Add support for ICCCM `WM_CHANGE_STATE` ClientMessage. Enables applications 259 | to iconify their own windows. 260 | - Add support for window gravity. Improves floating window positioning by 261 | applications. 262 | - Disable border on maximized windows when `disable_border = always`. 263 | - Add window titles to `search_win`. 264 | - Fix maximize handling. 265 | - Fix handling when a window is lost immediately after ReparentWindow. 266 | - Fix Java workaround. 267 | * Improve workspace handling. 268 | - Add `workspace_autorotate` option. When switching workspaces between regions, 269 | automatically "rotate" vertical/horizontal layouts based on RandR rotation 270 | data. 271 | - Add `prior_layout` action. Switch to the last used layout. 272 | (Unbound by default.) 273 | - Add optional rotation argument to `region` option. 274 | - Fix ws cycle actions should skip visible workspaces. 275 | - Add `cycle_visible` option to the man page and example conf. 276 | * Improve debugging. 277 | - Add `-d` command-line option to enable debug mode. Enables debug mode 278 | actions and logging to *stderr* without the need to rebuild with 279 | `-DSWM_DEBUG`. 280 | - Add multi-line support to `debug_toggle` overlay (default: `M-d`). 281 | - Add atom name cache to avoid redundant requests/syncs when printing output. 282 | * Fix X connection error handling to exit on a failed connection. 283 | * Fix build issues. 284 | - Fix compile error when building against musl. 285 | - Fix build with clang 16 on Linux. 286 | * Improve OpenBSD `pledge(2)` support. 287 | - Add "wpath" pledge for sparc64 support 288 | - Simplify usage. 289 | * Improve Linux Makefile. 290 | * Improve manual and examples. 291 | - Add details to `modkey` option in man page. 292 | - Add stack modes and window states to man page. 293 | - Fix incorrect key binding for `ws_6` in spectrwm_fr.conf. 294 | - Fix man page `wmctrl(1)` examples. 295 | - Fix `iostat(8)` issue in example baraction.sh script for OpenBSD. 296 | - Update man page note regarding `dmenu(1)` Xft support. 297 | - Update example spectrwm.conf. 298 | - Update `keyboard_mapping` example configuration files. 299 | - Update html manual. 300 | 301 | 302 | spectrwm 3.4.1 303 | ============== 304 | 305 | Released on Jun 25, 2020 306 | 307 | * Fix `always_raise` mapping issue. 308 | * Fix `_NET_CURRENT_DESKTOP` should be updated on `ws_next_move`/`ws_prev_move`. 309 | * Fix focus redirect for transient windows that are about to map. 310 | * Fix manual focus should not be affected by pointer on (un)grab. 311 | * Add java detection for JetBrains windows. 312 | * Remove `_NET_WM_STATE` on withdrawn windows as advised by EWMH spec. 313 | * Add information to man page about program call execution. 314 | 315 | 316 | spectrwm 3.4.0 317 | ============== 318 | 319 | Released on Jun 17, 2020 320 | 321 | * Add optional startup parameters: 322 | - `-c file` - Specify a configuration file to load instead of scanning for one. 323 | - `-v` - Print version and exit. 324 | * Add new `restart_of_day` action. (Unbound by default.) 325 | (Same as restart but configuration file is loaded in full.) 326 | * Improve startup error handling. 327 | * Fix input focus issues. 328 | * Fix max layout 'flickering' issue when `focus_mode = follow`. 329 | * Fix `ws_next_move` and `ws_prev_move`. 330 | * Fix withdrawn window handling. 331 | * Fix focus issue when moving transient (and related) windows between workspaces. 332 | * Fix maximized windows sometimes unmaximize on workspace switch. 333 | * Fix `SIGHUP` restart. 334 | * Fix transient window crossing issue on focus/swap next/prev actions. 335 | * Fix border color issue when clicking to focus a window on an unfocused region. 336 | * Fix `keyboard_mapping` fallback issue. 337 | * Fix width calculation of Xft glyphs. 338 | (Fixes the (dis)appearing space when switching workspaces.) 339 | * Increase bar hard limits to better accomodate complex markup sequences. 340 | * Add workaround to man page for OSs ignoring `LD_PRELOAD`. 341 | * Add some notes to man page and fix a warning. 342 | * Add missing options to example spectrwm.conf. 343 | * Update spectrwm_fr.conf 344 | * linux: Add example baraction.sh script. 345 | * linux: Accept user-provided pkg-config command. 346 | * linux: Install examples. 347 | 348 | 349 | spectrwm 3.3.0 350 | ============== 351 | 352 | Released on Dec 19, 2019 353 | 354 | * Add new bar text markup sequences for multiple colors/fonts/sections. 355 | * Add new `bar_font_pua` option to assign a font (such as an icon font) 356 | to the Unicode Private Use Area (U+E000 -> U+F8FF). 357 | * Extend `disable_border` option with `always`. 358 | * Add support for XDG Base Directory Specification. 359 | * Add OpenBSD `pledge(2)` support. 360 | * Enable xinput2 on OpenBSD. 361 | * Enable travis. 362 | * Fix keysym binding issue with multiple keyboard layouts. 363 | * Fix buffer overflow in `bar_strlcat_esc`. 364 | * Fix infinite loop due to unsigned integer overflow. 365 | * Fix cygwin compile issues. 366 | * Fix NetBSD Makefile. 367 | * Bunch of statical analyzer fixes. 368 | * Bunch of minor fixes. 369 | 370 | 371 | spectrwm 3.2.0 372 | ============== 373 | 374 | Released on Sep 7, 2018 375 | 376 | * Add new '+L' bar_format sequence to add a workspace list indicator to the 377 | bar. 378 | * Add new 'workspace_indicator' option to configure the workspace indicator. 379 | * Add new 'layout_vertical','layout_horizontal' and 'layout_max' actions. 380 | (Unbound by default.) 381 | * Add new 'ws_empty_move' action. (Unbound by default.) 382 | * Add support for high screen depth when creating frame/bar windows. 383 | (Compositing manager alpha transparency now works!) 384 | * Add check to adapt move/resize update rate to the refresh rate of the active 385 | display(s). 386 | * Add 'max' alias for the layout option value 'fullscreen' for consistency. 387 | * Add CHANGELOG.md 388 | * Fix warp_pointer issue when Coordinate Transformation Matrix is used. 389 | (Currently available on Linux and FreeBSD only.) 390 | * Fix focus bar color on (re)start/screenchange. 391 | * Fix libswmhack causing issues such as deadlocks with some programs. 392 | * Fix config file parsing on musl libc. 393 | * Fix slight pointer jump on move action. 394 | * Fix segfault with missing FontSet charsets. 395 | * Fix mdoc compliance. 396 | 397 | 398 | spectrwm 3.1.0 399 | ============== 400 | 401 | Released on Oct 3, 2017 402 | 403 | Major changes: 404 | 405 | * Add +R for region index to bar formatting. 406 | * Add new bar_color_selected and bar_font_color_selected options. 407 | * Add new 'ws_empty' action. 408 | * Enable padding in the bar_format using '_' character 409 | * Handle MappingNotify during startup. 410 | * Reset SIGPIPE before execvp(). 411 | * Correct size for WM_STATE 412 | 413 | This release also fixes a bunch of bugs, linux build and man page nits. 414 | 415 | 416 | spectrwm 3.0.2 417 | ============== 418 | 419 | Released on May 23, 2016 420 | 421 | Quick patch release that addresses some fallout from going full reparenting. 422 | 423 | * Ensure iconic windows stay iconic when reparenting. 424 | * Fix workspace cleanup on RandR screenchange. Fixes 425 | [#127](https://github.com/conformal/spectrwm/issues/127) and 426 | [#120](https://github.com/conformal/spectrwm/issues/120). 427 | 428 | 429 | spectrwm 3.0.1 430 | ============== 431 | 432 | Released on May 5, 2016 433 | 434 | * Fix makefile for non-Bitrig OS' 435 | * Redraw the focus window frame when changing regions with the pointer 436 | [#126](https://github.com/conformal/spectrwm/issues/126) 437 | * Prepend SWM_LIB to LD_PRELOAD instead of clobbering 438 | [#124](https://github.com/conformal/spectrwm/issues/124) 439 | 440 | 441 | spectrwm 3.0.0 442 | ============== 443 | 444 | Released on May 2, 2016 445 | 446 | We are proud to release spectrwm 3.0.0. Only one major new feature was added 447 | this release that should make spectrwm less quirky when using poorly written, 448 | old X11 and java applications. With the addition of reparenting spectrwm is 449 | now all grown up! In addition, spectrwm is now nearly ICCCM and EWMH compliant. 450 | 451 | Minor features/enhancements: 452 | 453 | * Add [Online manual](https://htmlpreview.github.io/?https://github.com/conformal/spectrwm/blob/master/spectrwm.html) 454 | * Add fullscreen_toggle action (_NET_WM_STATE_FULLSCREEN) 455 | * Send window to next/previous regions workspace 456 | * Add support for _NET_REQUEST_FRAME_EXTENTS 457 | 458 | As usual, a bunch of little, and not always obvious, fixes went in as well. 459 | See commit logs for details. 460 | 461 | Enjoy! 462 | 463 | Team spectrwm 464 | 465 | 466 | spectrwm 2.7.2 467 | ============== 468 | 469 | Released on May 26, 2015 470 | 471 | 472 | spectrwm 2.7.1 473 | ============== 474 | 475 | Released on May 24, 2015 476 | 477 | 478 | spectrwm 2.7.0 479 | ============== 480 | 481 | Released on May 22, 2015 482 | 483 | 484 | spectrwm 2.6.2 485 | ============== 486 | 487 | Released on Jan 27, 2015 488 | 489 | 490 | spectrwm 2.6.1 491 | ============== 492 | 493 | Released on Oct 26, 2014 494 | 495 | * Fix urgency indicator issue 496 | * Fix stacking issue on (re)start when managing unma 497 | * Fix xscreensaver-command example 498 | * Update Italian man page 499 | * Man page fixes, mostly spacing related 500 | * Reorder LDFLAGS in Linux Makefile to work with --a 501 | * Fix warp_pointer centering 502 | * Add note to man page regarding autorun and LD_PRELOAD 503 | * Honour correctly "disable_border" in max_stack 504 | * Fix focus_urgent 505 | 506 | 507 | spectrwm 2.6.0 508 | ============== 509 | 510 | Released on Aug 22, 2014 511 | 512 | * Improve English man page. 513 | * Improve Linux Makefile. 514 | * Fix typo s/fallowing/following/ 515 | * Fix bug in baraction.sh that causes bar text to flicker every 20s. 516 | * Fix man page to use escape codes for aring å and pi p. 517 | * Fix stacking issue at (re)start when spawn_position = first or prev. 518 | * Convert all booleans to stdbool.h bool. 519 | * Add new quirk IGNOREPID. 520 | * Add new quirk IGNORESPAWNWS. 521 | * Add new option: warp_pointer. 522 | * Add new quirk: WS[n] 523 | * Add new option: urgent_collapse 524 | 525 | 526 | spectrwm 2.5.1 527 | ============== 528 | 529 | Released on May 8, 2014 530 | 531 | * Improve stacking for windows with multiple transients. 532 | * Add clarification for the 'name' option to man page. 533 | * Add default maximize_toggle binding to man page. 534 | * Set stacking order when setting up a new status bar. 535 | * Fix segfault in fullscreen layout when a window with transient(s) unmap. 536 | * Fix segfault when loading "layout" with non-zero parameters. 537 | 538 | 539 | spectrwm 2.5.0 540 | ============== 541 | 542 | Released on Feb 26, 2014 543 | 544 | * Add new maximize_toggle action (Default bind: M-e) Toggles maximization of 545 | the focused window. 546 | * Change floating indicator in bar to also show 'm' for maximized state. 547 | * Add color_focus_maximized and color_unfocus_maximized config options. Sets 548 | border colors on maximized windows. Defaults to the value of color_focus and 549 | color_unfocus, respectively. 550 | * Add 'name' configuration option. Set name of workspace at start-of-day. 551 | * Improve support for Extended Window Manager Hints (EWMH): 552 | - Add support for NETCURRENT DESKTOP. 553 | - Add support for NETDESKTOP_NAMES. 554 | - Add support for NETNUMBER_OF_DESKTOPS. 555 | - Add support for NETCLIENT_LIST. Windows are sorted according to 556 | NETCLIENT_LIST at start. 557 | - Add support for NETDESKTOP_GEOMETRY and NETDESKTOP_VIEWPORT. 558 | - Add support for NETRESTACK_WINDOW. 559 | - Add support for NETWM_DESKTOP client message. 560 | - Improve handling of NETWM_STATE_FULLSCREEN. 561 | - Fix support for NETWM_NAME. 562 | - Change iconify to use NETWM_STATE_HIDDEN instead of SWMICONIC. 563 | - Add NETWM_FULL_PLACEMENT to NETSUPPORTED. 564 | * Add new reorder stack action for floating windows. Reorder floating windows 565 | by using swap_next/prev without affecting tiling order. 566 | * Deny NETACTIVE_WINDOW ClientMessages with a source type of 'normal'. Focus 567 | change requests that are not a result of direct user action are ignored. 568 | Requests from applications that use the old EWMH specification such as 569 | wmctrl(1) are still accepted. 570 | * Add new OBEYAPPFOCUSREQ quirk. When an application requests focus on the 571 | window via a NETACTIVE_WINDOW client message (source indication of 1), 572 | comply with the request. 573 | * Fix text rendering issue in search_win. 574 | * Fix floating windows remaining borderless after being fullscreen. 575 | * Fix window border colors when moving windows to hidden workspaces. 576 | * Fix segfault when attempting to set a color on a non-existent screen. Show 577 | error instead of exiting when screen index is invalid. 578 | * Fix configurerequest resize on transients. 579 | * Fix move floater to max_stack. 580 | * Fix focus issues when a window maps/unmaps on an unfocused region. 581 | * Fix stacking issues. 582 | * Fix 'bind[] = ...' not unbinding as expected. 583 | * Fix quirk matching of windows missing WM_CLASS. 584 | * Ignore EnterNotify when entering from an inferior window. 585 | * Disable floating_toggle on fullscreen layout. 586 | * Disable swapwin on fullscreen layout. 587 | * Ignore key press events while moving/resizing. 588 | * Fix LD_PRELOAD error on Linux. Note: On 64-bit Linux systems, if LD_PRELOAD 589 | isn't a relative/absolute pathname to libswmhack.so, then ld.so attempts to 590 | load a 32-bit version for 32-bit programs. This produces an error message. 591 | The solution is to either build and install a 32-bit libswmhack.so.0.0 or use 592 | an absolute/relative path so that ld.so only loads libswmhack.so for 64-bit 593 | binaries. 594 | * Update OSX Makefile. 595 | 596 | 597 | spectrwm 2.4.0 598 | ============== 599 | 600 | Released on Nov 15, 2013 601 | 602 | 603 | spectrwm 2.3.0 604 | ============== 605 | 606 | Released on Apr 29, 2013 607 | 608 | * Added ability to move/resize floating windows beyond region boundaries. 609 | * Added 'soft boundary' behavior to region boundaries. When moving a window 610 | past the region boundary, the window will 'snap' to the region boundary if it 611 | is less than boundary_width distance beyond the edge. 612 | * Added new boundary_width configuration option. Disable the 'soft boundary' 613 | behavior by setting this option to 0. 614 | * Added ability to set tile_gap to negative values. This makes it possible for 615 | tiled windows to overlap. Set to the opposite of border_width to collapse 616 | borders. 617 | * Fixed floating window stacking order issue on multiple-region setups. 618 | * Fixed crash on maprequest when WM_CLASS name and/or instance isn't set. 619 | * Fixed positioning issue on flipped layouts with a multi-column/row stack. 620 | * Fixed focus when switching to an inactive workspace with a new window. 621 | * Fixed symlinks in Linux Makefile. 622 | 623 | 624 | spectrwm 2.2.0 625 | ============== 626 | 627 | Released on Mar 23, 2013 628 | 629 | * Change validation of default 'optional' programs to only occur when the 630 | respective config entry is overridden, not when the binding is overridden. 631 | * Added details to the man page and spectrwm.conf on how to disable/override 632 | the default programs. 633 | * Change key grabbing to only grab ws binds within workspace_limit. 634 | * New QUIRKS: 635 | - NOFOCUSONMAP: Don't change focus to the window when it gets mapped on the 636 | screen. 637 | - FOCUSONMAP_SINGLE: When the window is mapped, change focus if it is the 638 | only mapped window on the workspace using the quirk entry. 639 | * New ws_next_move and ws_prev_move bindings to send a window to the next/prev 640 | workspace and switch to the workspace. 641 | * Fix fullscreen layout stacking issue when running with multiple regions. 642 | * Fix input focus issue with multiple regions when changing region focus with 643 | the keyboard. 644 | * Fix manual focus mode; pointer motion over an empty region no longer changes 645 | region focus. 646 | * Fix building on OSX. 647 | * Fix expansion of ~ for the keyboard_mapping path. 648 | * Fix segfault that can occur when the XCB server connection is lost. 649 | * Remove path from Linux spectrwm.desktop. 650 | 651 | 652 | spectrwm 2.1.1 653 | ============== 654 | 655 | Released on Nov 28, 2012 656 | 657 | Quite a few little fixes but they add up. 658 | 659 | * avoid a free on an uninitialized variable by setting optval to NULL. 660 | * Fix fparseln flags to remove escape characters in the result. 661 | * Fix issue where rapid window crossing events might get ignored. 662 | * Validate bound spawn programs after conf is loaded. 663 | * Fix move/resize to bail if the window gets destroyed. 664 | * Fix bar clock not getting updated during periods of inactivity. 665 | 666 | 667 | spectrwm 2.1.0 668 | ============== 669 | 670 | Released on Oct 30, 2012 671 | 672 | * New configuration options: 673 | - tile_gap: adjust spacing between tiled windows. 674 | - region_padding: adjust spacing between tiled windows and the region border. 675 | - bar_border_unfocus[x]: border color of the bar on unfocused regions of 676 | screen x. 677 | - bar_enabled_ws[x]: set the default state for bar_toggle_ws on workspace x. 678 | * New bindings: 679 | - rg_ - focus on region n, default is MOD-Keypad_<1-9> 680 | - mvrg_ - move window to region n, default is MOD-Shift-Keypad_<1-9> 681 | - bar_toggle_ws - toggle the status bar on current workspace, default is 682 | MOD-Shift-b. 683 | * New argument variables for program spawn: 684 | - $region_index 685 | - $workspace_index 686 | * Improved bar_action handling to eliminate the need for bar_delay. 687 | * Renamed screen_* bindings to rg_*; config files using the old bindings are 688 | still supported. 689 | * Fixed handling of region focus with empty workspaces. 690 | * Fixed toggle_bar not working on empty workspaces. 691 | * Fixed issue where multiple key actions might be handled simultaneously. 692 | * Fixed focus behavior when iconified windows exist in the ws. 693 | * Fixed windows not being unmapped on single-monitor fullscreen layout. 694 | * Fixed mouse and keyboard binds to work regardless of caps/numlock state. 695 | * Fixed a couple segfaults. 696 | * Fixed a couple memleaks. 697 | * Kill bar_action script oAn an unclean exit. 698 | * Add startup exception mechanism that display error messages in the bar. 699 | * Add config file check that uses startup exceptions to tell user if the file 700 | has issues. 701 | * Add runtime dependency checker that uses startup exceptions to tell user if 702 | something is missing. 703 | 704 | 705 | spectrwm 2.0.2 706 | ============== 707 | 708 | Released on Aug 27, 2012 709 | 710 | This is an emergency patch release for folks that end up with a blank screen 711 | after starting spectrwm. No need to updated unless you see this issue. 712 | 713 | Release notes: 714 | * Fix scan_xrandr to fallback when a scan results in no new regions. 715 | * Add tilde ~ expansion to autorun command in the config. 716 | 717 | 718 | spectrwm 2.0.1 719 | ============== 720 | 721 | Released on Aug 26, 2012 722 | 723 | * Added support for Xcursor. 724 | * Fixed several fullscreen layout issues. 725 | * Improved focus handling so related windows are raised when appropriate. 726 | * Fixed several focus issues. 727 | * Fixed several issues that could cause segfaults. 728 | * Fixed startup issue where certain windows might not get managed. 729 | * Fixed delay when moving/resizing windows via keyboard. 730 | 731 | 732 | spectrwm 2.0.0 733 | ============== 734 | 735 | Released on Aug 22, 2012 736 | 737 | * complete rewrite using xcb 738 | * 100% backwards compatible 739 | * way more responsive and snappy 740 | * Tons of warts fixed 741 | * cygwin works again 742 | * xft fonts 743 | 744 | And many other things. 745 | 746 | 747 | spectrwm 1.2.0 748 | ============== 749 | 750 | Released on Jul 31, 2012 751 | 752 | 753 | spectrwm 1.1.2 754 | ============== 755 | 756 | Released on Jul 17, 2012 757 | 758 | * Fix issue where a window/icon could not be clicked or otherwise be 759 | manipulated (skype, thunderbird etc). 760 | * Fix an issue where on some Intel graphics cards when exiting the screen 761 | turned garbled and would blink really badly. 762 | * Bonus fix: spawn_position to actually do what it is supposed to do. 763 | 764 | 765 | spectrwm 1.1.1 766 | ============== 767 | 768 | Released on Jul 3, 2012 769 | 770 | * Add backwards compatibility for the spawn_term binding 771 | * Add clarification to man page that default workspace_limit is 10. 772 | 773 | 774 | spectrwm 1.1.0 775 | ============== 776 | 777 | Released on Jul 2, 2012 778 | 779 | * Fix status bar flicker by double-buffering the output. 780 | * Add horizontal_flip and vertical_flip layout options. 781 | * Kill references before focusing on a new window. 782 | * Add new options to change focus behavior on window open and close. 783 | * Increase workspace hard limit to 22. 784 | * Tons of wart removals 785 | 786 | 787 | spectrwm 1.0.0 788 | ============== 789 | 790 | Released on Feb 17, 2012 791 | 792 | * Fixed all clang static analyze bugs/issues 793 | * Remain name and config file compatible with scrotwm 794 | * Fix OSX version again 795 | * Print proper version with M-S-v on linux 796 | * Add flip_layout binding to all keyboard layout examples 797 | * Fix setting of window property strings 798 | * Clear status-bar when iconifying the last window 799 | * Use a red-black tree for key bindings 800 | -------------------------------------------------------------------------------- /outdated_man_pages/spectrwm_it.1: -------------------------------------------------------------------------------- 1 | .\" Copyright (c) 2009-2012 Marco Peereboom 2 | .\" Copyright (c) 2009 Darrin Chandler 3 | .\" Copyright (c) 2011-2014 Reginald Kennedy 4 | .\" Copyright (c) 2011-2012 Lawrence Teo 5 | .\" Copyright (c) 2011-2012 Tiago Cunha 6 | .\" Copyright (c) 2012 David Hill 7 | .\" 8 | .\" Permission to use, copy, modify, and distribute this software for any 9 | .\" purpose with or without fee is hereby granted, provided that the above 10 | .\" copyright notice and this permission notice appear in all copies. 11 | .\" 12 | .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 | .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 | .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 | .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 | .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 | .\" 20 | .Dd $Mdocdate: February 15 2012 $ 21 | .Dt SPECTRWM 1 22 | .Os 23 | .Sh NOME 24 | .Nm spectrwm 25 | .Nd gestore di finestre per X11 26 | .Sh SINTASSI 27 | .Nm spectrwm 28 | .Sh DESCRIZIONE 29 | .Nm 30 | \[`e] un gestore di finestre minimale che cerca di stare in disparte, in modo 31 | che il prezioso spazio sullo schermo possa essere usato per cose molto 32 | pi\[`u] importanti. 33 | Ha delle impostazioni predefinite ragionevoli e non richiede all'utente di 34 | imparare un nuovo linguaggio per modificarne la configurazione. 35 | \[`E] stato scritto dagli hacker per gli hacker, ed ha come obiettivo quello 36 | di essere piccolo, compatto e veloce. 37 | .Pp 38 | All'avvio, 39 | .Nm 40 | legge le impostazioni presenti nel suo file di configurazione, 41 | .Pa spectrwm.conf . 42 | Vedere la sezione 43 | .Sx FILE DI CONFIGURAZIONE 44 | pi\[`u] sotto. 45 | .Pp 46 | Le seguenti notazioni verranno utilizzate all'interno di questa pagina: 47 | .Pp 48 | .Bl -tag -width Ds -offset indent -compact 49 | .It Cm M 50 | Meta 51 | .It Cm S 52 | Shift 53 | .It Aq Cm Name 54 | Tasto Name 55 | .It Cm M1 56 | Tasto 1 (sinistro) del mouse 57 | .It Cm M3 58 | Tasto 3 (destro) del mouse 59 | .El 60 | .Pp 61 | .Nm 62 | \[`e] molto semplice da usare. 63 | La maggior parte delle azioni vengono svolte utilizzando combinazioni di 64 | tasti sulla tastiera o sul mouse. 65 | Vedere la sezione 66 | .Sx SCORCIATOIE 67 | pi\[`u] sotto per informazioni sulle impostazioni predefinite e sulle 68 | possibilit\[`a] di personalizzazione. 69 | .Sh FILE DI CONFIGURAZIONE 70 | .Nm 71 | da precedenza al file di configurazione specifico dell'utente, 72 | .Pa ~/.spectrwm.conf . 73 | Se quel file non \[`e] disponibile, tenta di utilizzare il file di 74 | configurazione globale 75 | .Pa /etc/spectrwm.conf . 76 | .Pp 77 | Il formato del file \[`e] 78 | .Pp 79 | .Dl Ar keyword Li = Ar setting 80 | .Pp 81 | Ad esempio: 82 | .Pp 83 | .Dl color_focus = red 84 | .Pp 85 | Le impostazioni di tipo binario possono essere abilitate e disabilitate 86 | utilizzando rispettivamente i valori 1 e 0. 87 | .Pp 88 | I colori devono essere specificati usando il formato usato da 89 | .Xr XQueryColor 3 . 90 | .Pp 91 | I commenti iniziano con #. 92 | Qualora fosse necessario usare usare 93 | .Ql # 94 | come parte di un'opzione, questo dovr\[`a] essere preceduto da un 95 | backslash, eg. \e#. 96 | .Pp 97 | Il file di configurazione supporta le seguenti impostazioni: 98 | .Bl -tag -width 2m 99 | .It Ic autorun 100 | All'avvio, esegue un'applicazione nell'area di lavoro specificata. 101 | Il formato da utilizzare \[`e] 102 | .Li ws Ns Bo Ar idx Bc : Ns Ar application , 103 | eg. ws[2]:xterm esegue 104 | .Xr xterm 1 105 | nell'area di lavoro 2. 106 | .It Ic bar_action 107 | Script esterno che produce informazioni aggiuntive, come ad esempio quelle 108 | sullo stato di carica della batteria, da inserire nella barra di stato. 109 | .It Ic bar_at_bottom 110 | Posiziona la barra di stato in fondo ad ogni regione anzich\['e] in cima. 111 | .It Ic bar_borders Ns Bq Ar x 112 | Colore del bordo della barra di stato nello schermo 113 | .Ar x . 114 | .It Ic bar_border_unfocus Ns Bq Ar x 115 | Colore del bordo della barra di stato nelle regioni dello schermo 116 | .Ar x 117 | che non hanno il focus. 118 | .It Ic bar_border_width 119 | Imposta lo spessore del bordo della barra di stato, in pixel. 120 | Il bordo pu\[`o] essere disabilitato usando il valore 0. 121 | .It Ic bar_color Ns Bq Ar x 122 | Colore di sfondo della barra di stato nello schermo 123 | .Ar x . 124 | .It Ic bar_enabled 125 | Imposta il valore predefinito di 126 | .Ic bar_toggle ; 127 | il valore predefinito per questa opzione \[`e] 1. 128 | .It Ic bar_enabled_ws Ns Bq Ar x 129 | Imposta il valore predefinito di 130 | .Ic bar_toggle_ws 131 | per l'area di lavoro 132 | .Ar x ; 133 | il valore predefinito per questa opzione \[`e] 1. 134 | .It Ic bar_font 135 | Font da usare per la barra di stato. 136 | Il font pu\[`o] essere specificato usando Xft o X Logical Font 137 | Description (XLFD). 138 | \[`E] possibile specificare dei font secondari separandoli tra loro con 139 | una virgola. 140 | Se tutte le specifiche sono nel formato XLFD verranno usati i gruppi di font; 141 | se almeno una delle specifiche \[`e] in formato Xft, verr\[`a] usato Xft. 142 | Quando Xft \[`e] in uso, verr\[`a] usato solo il primo font caricato con 143 | successo anche nel caso in cui non dovesse comprendere tutti i glifi 144 | necessari. 145 | L'impostazione predefinita prevede l'uso dei gruppi di font; \[`e] bene 146 | tenere conto del fatto che 147 | .Xr dmenu 1 148 | non supporta Xft. 149 | .Pp 150 | Esempio con Xft: 151 | .Bd -literal -offset indent 152 | bar_font = Terminus:style=Regular:pixelsize=14:antialias=true 153 | 154 | bar_font = -*-profont-medium-*-*-*-11-*-*-*-*-*-*-*,Terminus:pixelsize=14,\ 155 | -*-clean-medium-*-*-*-12-*-*-*-*-*-*-* 156 | .Ed 157 | .Pp 158 | Esempio con gruppi di font: 159 | .Bd -literal -offset indent 160 | bar_font = -*-terminus-medium-*-*-*-14-*-*-*-*-*-*-* 161 | 162 | bar_font = -*-profont-medium-*-*-*-11-*-*-*-*-*-*-*,\ 163 | -*-terminus-medium-*-*-*-14-*-*-*-*-*-*-*,\ 164 | -*-clean-medium-*-*-*-12-*-*-*-*-*-*-* 165 | .Ed 166 | .Pp 167 | Per ottenere un elenco dei font disponibili sul proprio sistema, 168 | usare 169 | .Xr fc-list 1 170 | o 171 | .Xr xlsfonts 1 . 172 | L'applicazione 173 | .Xr xfontsel 1 174 | pu\[`o] essere d'aiuto per il formato XLFD. 175 | .It Ic bar_font_color Ns Bq Ar x 176 | Colore del testo nella barra di stato nello schermo 177 | .Ar x . 178 | .It Ic bar_format 179 | Imposta il formato da utilizzare per la barra di stato, 180 | sovrascrivendo 181 | .Ic clock_format 182 | e tutte le opzioni che terminano con 183 | .Ic enabled . 184 | Il formato viene passato a 185 | .Xr strftime 3 186 | prima di essere usato, e pu\[`o] contenere le seguenti sequenze 187 | di caratteri: 188 | .Bl -column "Sequenza di caratteri" "Sostituita con" -offset indent 189 | .It Sy "Sequenza di caratteri" Ta Sy "Sostituita con" 190 | .It Li "+<" Ta "Lascia uno spazio" 191 | .It Li "+A" Ta "Output dello script esterno" 192 | .It Li "+C" Ta "Classe della finestra corrente (da WM_CLASS)" 193 | .It Li "+D" Ta "Nome dell'area di lavoro corrente" 194 | .It Li "+F" Ta "Indicatore di float" 195 | .It Li "+I" Ta "Indice dell'area di lavoro corrente" 196 | .It Li "+M" Ta "Numero di finestre minimizzate nell'area di lavoro corrente" 197 | .It Li "+N" Ta "Numero dello schermo corrente" 198 | .It Li "+P" Ta "Classe e istanza della finestra corrente, separate da due punti" 199 | .It Li "+S" Ta "Algoritmo di gestione delle finestre in uso" 200 | .It Li "+T" Ta "Istanza della finestra corrente (da WM_CLASS)" 201 | .It Li "+U" Ta "Indicatore di urgenza" 202 | .It Li "+V" Ta "Versione del programma" 203 | .It Li "+W" Ta "Nome della finestra corrente (da _NET_WM_NAME o WM_NAME)" 204 | .It Li "++" Ta "Il carattere" Ql + 205 | .El 206 | .Pp 207 | Tutte le sequenze di caratteri possono limitare il numero di caratteri 208 | massimo utilizzato, eg. +64A. 209 | Il testo che non contribuisce a formare una di queste sequenze di caratteri 210 | viene copiato senza subire modifiche. 211 | .It Ic bar_justify 212 | Allinea il test all'interno della barra di stato. 213 | I valori possibili sono 214 | .Ar left 215 | (sinistra), 216 | .Ar center 217 | (centro) e 218 | .Ar right 219 | (destra). 220 | .Pp 221 | Se il valore scelto non \[`e] 222 | .Ar left , 223 | il testo potrebbe non risultare allineato correttamente. 224 | Vedere 225 | .Ic bar_format 226 | per maggiori informazioni. 227 | .It Ic bind Ns Bq Ar x 228 | Associa una combinazione di tasti all'azione 229 | .Ar x . 230 | Vedere la sezione 231 | .Sx SCORCIATOIE 232 | pi\[`u] sotto. 233 | .It Ic border_width 234 | Imposta lo spessore del bordo delle finestre, in pixel. 235 | Il bordo pu\[`o] essere disabilitato usando il valore 0. 236 | .It Ic boundary_width 237 | Imposta la larghezza dell'area di contenimento delle regioni, in pixel. 238 | Questo valore permette di controllare di quanto una finestra debba essere 239 | trascinata o ridimensionata oltre il limite di una regione prima che 240 | venga considerata al di fuori di essa. 241 | Questa impostazione non viene presa in considerazione quando le finestre 242 | vengono manipolate utilizzando la tastiera. 243 | L'area di contenimento pu\[`o] essere disabilitata usando il valore 0. 244 | .It Ic clock_enabled 245 | Abilita o disabilita l'orologio nella barra di stato. 246 | Se viene usato il valore 0, \[`e] possibile inserire un orologio 247 | personalizzato nello script esterno definito in 248 | .Ic bar action . 249 | .It Ic iconic_enabled 250 | Visualizza nella barra di stato il numero di finestre minimizzate. 251 | Questo indicatore pu\[`o] essere abilitato usando il valore 1. 252 | .It Ic color_focus 253 | Colore del bordo della finestra che detiene il focus. 254 | Il colore predefinito \[`e] il rosso. 255 | .It Ic color_focus_maximized 256 | Colore del bordo della finestra che detiene il focus, se massimizzata. 257 | Il colore predefinito \[`e] quello usato per 258 | .Ic color_focus . 259 | .It Ic color_unfocus 260 | Colore del bordo delle finestre che non detengono il focus. 261 | Il colore predefinito \[`e] rgb:88/88/88. 262 | .It Ic color_unfocus_maximized 263 | Colore del bordo delle finestre che non detengono il focus, se massimizzate. 264 | Il colore predefinito \[`e] quello usato per 265 | .Ic color_unfocus . 266 | .It Ic dialog_ratio 267 | Alcune applicazioni creano finestre di dialogo troppo piccole per essere 268 | utilizzate. 269 | Questa opzione indica la percentuale dello schermo da utilizzare per le 270 | finestre di dialogo: ad esempio, il valore 0.6 indica che dovr\[`a] essere 271 | usato il 60% dello spazio disponibile. 272 | .It Ic disable_border 273 | Non mostrare i bordi quando la barra di stato \[`e] nascosta e c'\[`e] una 274 | sola finestra nella regione. 275 | .It Ic focus_close 276 | Imposta quale finestra ricever\[`a] il focus in seguito alla chiusura della 277 | finestra che lo detiene al momento. 278 | I valori possibili sono 279 | .Ar first 280 | (prima), 281 | .Ar next 282 | (successiva), 283 | .Ar previous 284 | (precedente, impostazione predefinita) e 285 | .Ar last 286 | (ultima). 287 | .Ar next 288 | e 289 | .Ar previous 290 | sono intese relativamente alla finestra che \[`e] stata chiusa. 291 | .It Ic focus_close_wrap 292 | Se abilitata, l'ultima finestra ricever\[`a] il focus quando l'ultima 293 | viene chiusa, e viceversa. 294 | Questa opzione pu\[`o] essere disabilitata usando il valore 0. 295 | .It Ic focus_default 296 | Finestra che deve ricevere il focus quando nessun'altra finestra lo 297 | detiene. 298 | I valori possibili sono 299 | .Ar first 300 | (prima) e 301 | .Ar last 302 | (ultima, impostazione predefinita). 303 | .It Ic focus_mode 304 | Comportamento del focus in relazione al cursore del mouse. 305 | I valori possibili sono: 306 | .Pp 307 | .Bl -tag -width "default" -offset indent -compact 308 | .It Ar default 309 | Modifica il focus quando viene attraversato un bordo in seguito ad un 310 | movimento del cursore o all'interazione con una finestra. 311 | .It Ar follow 312 | Modifica il focus ogni volta che il cursore attraversa un bordo, anche se 313 | questo avviene in seguito al passaggio ad un'area di lavoro diversa o ad 314 | un cambio di layout. 315 | .It Ar manual 316 | Modifica il focus solo quando si interagisce con una finestra. 317 | .El 318 | .It Ic java_workaround 319 | Evita alcuni problemi di rendering nelle GUI Java impersonando il window 320 | manager LG3D, scritto da Sun. 321 | Il valore predefinito \[`e] 1. 322 | .It Ic keyboard_mapping 323 | Rimuove tutte le scorciatoie da tastiera esistenti e carica le nuove 324 | scorciatoie dal file specificato. 325 | Questo permette di caricare scorciatoie specifiche del proprio layout 326 | di tastiera. 327 | Vedere la sezione 328 | .Sx MAPPE DI TASTIERA 329 | pi\[`u] sotto per un elenco dei file che vengono forniti. 330 | .It Ic layout 331 | Imposta il layout da utilizzare all'avvio. 332 | Definito nel formato 333 | .Li ws Ns Bo Ar idx Bc : Ns Ar master_grow : Ns Ar master_add : Ns Ar stack_inc : Ns Ar always_raise : Ns Ar stack_mode , 334 | eg. ws[2]:-4:0:1:0:horizontal configura l'area di lavoro 2 per utilizzare 335 | un algoritmo di stacking orizzontale, riduce l'area principale di 4 336 | unit\[`a] e aggiunge una finestra all'area di stacking, mantenendo il 337 | comportamento predefinito per le finestre floating. 338 | I valori possibili per 339 | .Ar stack_mode 340 | sono 341 | .Ar vertical , 342 | .Ar vertical_flip , 343 | .Ar horizontal , 344 | .Ar horizontal_flip 345 | and 346 | .Ar fullscreen . 347 | Vedere 348 | .Ic master_grow , 349 | .Ic master_shrink , 350 | .Ic master_add , 351 | .Ic master_del , 352 | .Ic stack_inc , 353 | .Ic stack_dec , 354 | e 355 | .Ic always_raise 356 | per maggiori informazioni. 357 | Le opzioni che controllano gli algoritmi di gestione delle finestre sono 358 | complesse e possono influenzare altre opzioni, quindi \[`e] opportuno 359 | prendere confidenza con esse prima di utilizzare l'opzione 360 | .Ic layout . 361 | .Pp 362 | Questa impostazione non viene applicata al riavvio. 363 | .It Ic modkey 364 | Cambia il modificatore. 365 | Solitamente Mod1 \[`e] il tasto Alt e Mod4 il tasto Windows su un PC. 366 | .It Ic name 367 | Imposta il nome di un'area di lavoro all'avvio. 368 | Definito nel formato 369 | .Li ws Ns Bo Ar idx Bc : Ns Ar name , 370 | eg. ws[1]:Console assegna il nome 371 | .Dq Console 372 | all'area di lavoro 1. 373 | .It Ic program Ns Bq Ar p 374 | Definisce la nuova azione 375 | .Ar p , 376 | corrispondente all'esecuzione di un programma. 377 | Vedere la sezione 378 | .Sx PROGRAMMI 379 | pi\[`u] sotto. 380 | .It Ic quirk Ns Bq Ar c Ns Li : Ns Ar i Ns Li : Ns Ar n 381 | Aggiunge un "quirk" per le finestre di classe 382 | .Ar c , 383 | istanza 384 | .Ar i 385 | e nome 386 | .Ar n . 387 | Vedere la sezione 388 | .Sx QUIRK 389 | pi\[`u] sotto. 390 | .It Ic region 391 | Definisce una regione personalizzata, rimuovendo tutte le regioni create in 392 | automatico che occupano la stessa parte dello schermo. 393 | Definita nel formato 394 | .Li screen Ns Bo Ar idx Ns Bc : Ns Ar width Ns x Ns Ar height Ns + Ns Ar x Ns + Ns Ar y , 395 | eg. screen[1]:800x1200+0+0. 396 | .Pp 397 | Per fare s\[`i] che una regione copra pi\[`u] monitor, \[`e] sufficiente 398 | definirla in modo che li occupi tutti, eg. screen[1]:2048x768+0+0 definisce 399 | una regione che copre due monitor con risoluzione 1024x768 posizionati uno 400 | di fianco all'altro. 401 | .It Ic region_padding 402 | Larghezza, in pixel, dello spazio lasciato vuoto all'interno di una regione. 403 | Questa opzione pu\[`o] essere disabilitata usando il valore 0. 404 | .It Ic spawn_position 405 | Posizione da assegnare alle finestre al momento della loro creazione. 406 | I valori possibili sono 407 | .Ar first 408 | (prima), 409 | .Ar next 410 | (successiva), 411 | .Ar previous 412 | (precedente) e 413 | .Ar last 414 | (ultima, predefinito). 415 | .Ar next 416 | e 417 | .Ar previous 418 | sono intese relativamente alla finestra che detiene il focus. 419 | .It Ic stack_enabled 420 | Abilita o disabilita la visualizzazione dell'algoritmo di stacking in uso 421 | all'interno della barra di stato. 422 | .It Ic term_width 423 | Imposta la larghezza minima desiderata per i terminali. 424 | Se il valore \[`e] maggiore di 0, 425 | .Nm 426 | cercher\[`a] di regolare la dimensione del font usato dal terminale 427 | per fare s\[`i] che la larghezza rimanga superiore ad esso mentre la 428 | finestra viene ridimensionata. 429 | Solo 430 | .Xr xterm 1 431 | \[`e] supportato al momento. 432 | L'eseguibile di 433 | .Xr xterm 1 434 | non deve avere i bit setuid o setgid abilitati, contrariamente a quanto 435 | avviene nella maggior parte dei sistemi. 436 | L'utente potrebbe dover creare una copia dell'eseguibile di 437 | .Xr xterm 1 , 438 | priva dei bit setuid e setgid, e modificare program[term] (vedere la 439 | sezione 440 | .Sx PROGRAMMI 441 | pi\[`u] sotto) in modo che punti a questa copia. 442 | .It Ic title_gap 443 | Larghezza, in pixel, dello spazio lasciato vuoto tra una finestra e l'altra. 444 | L'utilizzo di un valore negativo fa s\[`i] che le finestre si sovrappongano. 445 | Se il valore impostato \[`e] l'opposto di 446 | .Ic border_width , 447 | non verr\[`a] visualizzato alcun bordo tra le finestre. 448 | Questa opzione pu\[`o] essere disabilitata usando il valore 0. 449 | .It Ic urgent_collapse 450 | Disabilita la visualizzazione di un testo sostitutivo per le aree di lavoro 451 | che non contengono finestre urgenti. 452 | Questa opzione pu\[`o] essere abilitata usando il valore 1. 453 | .It Ic urgent_enabled 454 | Abilita o disabilita la visualizzazione dell'indicatore di urgenza 455 | all'interno della barra di stato. 456 | Molti emulatore di terminale devono essere configurati esplicitamente per 457 | fare s\[`i] che il carattere "bell" causi la modifica dello stato di 458 | urgenza della finestra. 459 | Ad esempio, in 460 | .Xr xterm 1 , 461 | \[`e] necessario aggiungere al file 462 | .Pa .Xdefaults 463 | la seguente riga: 464 | .Bd -literal -offset indent 465 | xterm.bellIsUrgent: true 466 | .Ed 467 | .It Ic verbose_layout 468 | Abilita o disabilita la visualizzazione del numero di finestre nell'area 469 | principale e del numero di righe (o colonne) nell'area di stacking. 470 | Questa opzione pu\[`o] essere disabilitata usando il valore 1. 471 | Vedre 472 | .Ar master_add , 473 | .Ar master_del , 474 | .Ar stack_inc 475 | e 476 | .Ar stack_dec 477 | per maggiori informazioni. 478 | .It Ic window_class_enabled 479 | Abilita o disabilita la visualizzazione del nome della classe (da WM_CLASS) 480 | all'interno della barra di stato. 481 | Questa opzione pu\[`o] essere abilitata usando il valore 1. 482 | .It Ic window_instance_enabled 483 | Abilita o disabilita la visualizzazione del nome dell'istanza (da WM_CLASS) 484 | all'interno della barra di stato. 485 | Questa opzione pu\[`o] essere abilitata usando il valore 1. 486 | .It Ic window_name_enabled 487 | Abilita o disabilita la visualizzazione del titolo della finestra (da 488 | _NET_WM_NAME o WM_NAME) all'interno della barra di stato. 489 | Questa opzione pu\[`o] essere abilitata usando il valore 1. 490 | .Pp 491 | Per impedire che titoli di finestra troppo lunghi impediscano di 492 | visualizzare altre informazioni, lo spazio dedicato al titolo \[`e] 493 | limitato a 64 caratteri. 494 | Vedere 495 | .Ic bar_format 496 | per maggiori informazioni. 497 | .It Ic warp_pointer 498 | Posiziona il cursore del mouse al centro della finestra che ha il focus 499 | quando vengono utilizzate scorciatoie da tastiera per modificare il focus, 500 | cambiare area di lavoro, cambiare regione, etc. 501 | Questa opzione pu\[`o] essere abilitata usando il valore 1. 502 | .It Ic workspace_limit 503 | Imposta il numero di aree di lavoro disponibili. 504 | Il valore minimo \[`e] 1, quello massimo \[`e] 22, quello predefinito 505 | \[`e] 10. 506 | .El 507 | .Sh PROGRAMMI 508 | .Nm 509 | consente di definire azioni personalizzate per l'esecuzione di programmi, 510 | e di assegnare queste azioni a scorciatoie da tastiera come \[`e] 511 | possibile per quelle predefinite. 512 | Vedere la sezione 513 | .Sx SCORCIATOIE 514 | pi\[`u] sotto. 515 | .Pp 516 | I programmi vengono definiti come segue: 517 | .Pp 518 | .Dl program Ns Bo Ar action Bc = Ar progpath Op Ar arg Op Ar arg ... 519 | .Pp 520 | .Ar action 521 | \[`e] qualsiasi identificatore che non vada in conflitto con una delle 522 | azioni predefinite, 523 | .Ar progpath 524 | \[`e] il percorso del programma da eseguire e 525 | .Ar arg 526 | sono gli argomenti (uno o pi\[`u]) da passare al programma. 527 | .Pp 528 | Se il percorso o gli argomenti comprendono il carattere 529 | .Ql # , 530 | questo dovr\[`a] essere preceduto da un carattere di escape, 531 | diventando \e#. 532 | .Pp 533 | I seguenti argomenti verranno sostituiti, al momento dell'esecuzione, con 534 | il valore assegnato all'opzione corrispondente: 535 | .Pp 536 | .Bl -tag -width "$bar_font_color" -offset indent -compact 537 | .It Cm $bar_border 538 | .It Cm $bar_color 539 | .It Cm $bar_font 540 | .It Cm $bar_font_color 541 | .It Cm $color_focus 542 | .It Cm $color_unfocus 543 | .It Cm $dmenu_bottom 544 | \-b se 545 | .Ic bar_at_bottom 546 | \[`e] abilitato 547 | .It Cm $region_index 548 | .It Cm $workspace_index 549 | .El 550 | .Pp 551 | Esempio: 552 | .Bd -literal -offset indent 553 | program[ff] = /usr/local/bin/firefox http://spectrwm.org/ 554 | bind[ff] = MOD+Shift+b # Ora M-S-b esegue Firefox 555 | .Ed 556 | .Pp 557 | Per eliminare la scorciatoia appena definita: 558 | .Bd -literal -offset indent 559 | bind[] = MOD+Shift+b 560 | .Ed 561 | .Pp 562 | Programmi predefiniti: 563 | .Pp 564 | .Bl -tag -width "screenshot_wind" -offset indent -compact 565 | .It Cm lock 566 | xlock 567 | .It Cm menu 568 | dmenu_run $dmenu_bottom \-fn $bar_font \-nb $bar_color \-nf $bar_font_color \-sb 569 | $bar_border \-sf $bar_color 570 | .It Cm term 571 | xterm 572 | .It Cm initscr 573 | initscreen.sh # opzionale 574 | .It Cm screenshot_all 575 | screenshot.sh full # opzionale 576 | .It Cm screenshot_wind 577 | screenshot.sh window # opzionale 578 | .El 579 | .Pp 580 | I programmi opzionali non verranno verificati a meno di non essere 581 | ridefiniti dall'utente. 582 | Se uno dei programmi predefiniti fallisce la verifica, \[`e] possibile 583 | risolvere l'errore installando il programma corrispondente, modificando 584 | il percorso del programma o disabilitando la scorciatoia relativa. 585 | .Pp 586 | Ad esempio, per ridefinire 587 | .Ic lock : 588 | .Bd -literal -offset indent 589 | program[lock] = xscreensaver\-command \-lock 590 | .Ed 591 | .Pp 592 | Per disabilitare la scorciatoia assegnata a 593 | .Ic lock 594 | ed impedirne la verifica: 595 | .Bd -literal -offset indent 596 | bind[] = MOD+Shift+Delete 597 | .Ed 598 | .Sh SCORCIATOIE 599 | .Nm 600 | fornisce numerose azioni che possono essere attivate usando combinazioni 601 | di tasti sulla tastiera o sul mouse. 602 | .Pp 603 | Le combinazioni di tasti che coinvolgono il mouse sono le seguenti: 604 | .Pp 605 | .Bl -tag -width "M-j, M-XXX" -offset indent -compact 606 | .It Cm M1 607 | Assegna il focus ad una finestra 608 | .It Cm M-M1 609 | Sposta una finestra 610 | .It Cm M-M3 611 | Ridimensiona una finestra 612 | .It Cm M-S-M3 613 | Ridimensiona una finestra, mantenendola centrata 614 | .El 615 | .Pp 616 | Le scorciatoie da tastiera predefinite sono le seguenti: 617 | .Pp 618 | .Bl -tag -width "M-j, M-XXXXXX" -offset indent -compact 619 | .It Cm M-S- Ns Aq Cm Return 620 | term 621 | .It Cm M-p 622 | menu 623 | .It Cm M-S-q 624 | quit 625 | .It Cm M-q 626 | restart 627 | .It Cm M- Ns Aq Cm Space 628 | cycle_layout 629 | .It Cm M-S-\e 630 | flip_layout 631 | .It Cm M-S- Ns Aq Cm Space 632 | stack_reset 633 | .It Cm M-h 634 | master_shrink 635 | .It Cm M-l 636 | master_grow 637 | .It Cm M-, 638 | master_add 639 | .It Cm M-. 640 | master_del 641 | .It Cm M-S-, 642 | stack_inc 643 | .It Cm M-S-. 644 | stack_dec 645 | .It Cm M- Ns Aq Cm Return 646 | swap_main 647 | .It Xo 648 | .Cm M-j , 649 | .Cm M- Ns Aq Cm TAB 650 | .Xc 651 | focus_next 652 | .It Xo 653 | .Cm M-k , 654 | .Cm M-S- Ns Aq Cm TAB 655 | .Xc 656 | focus_prev 657 | .It Cm M-m 658 | focus_main 659 | .It Cm M-u 660 | focus_urgent 661 | .It Cm M-S-j 662 | swap_next 663 | .It Cm M-S-k 664 | swap_prev 665 | .It Cm M-b 666 | bar_toggle 667 | .It Cm M-S-b 668 | bar_toggle_ws 669 | .It Cm M-x 670 | wind_del 671 | .It Cm M-S-x 672 | wind_kill 673 | .It Cm M- Ns Aq Ar 1-9,0,F1-F12 674 | .Pf ws_ Aq Ar 1-22 675 | .It Cm M-S- Ns Aq Ar 1-9,0,F1-F12 676 | .Pf mvws_ Ns Aq Ar 1-22 677 | .It Cm M- Ns Aq Ar Keypad 1-9 678 | .Pf rg_ Aq Ar 1-9 679 | .It Cm M-S- Ns Aq Ar Keypad 1-9 680 | .Pf mvrg_ Aq Ar 1-9 681 | .It Cm M- Ns Aq Cm Right 682 | ws_next 683 | .It Cm M- Ns Aq Cm Left 684 | ws_prev 685 | .It Cm M- Ns Aq Cm Up 686 | ws_next_all 687 | .It Cm M- Ns Aq Cm Down 688 | ws_prev_all 689 | .It Cm M-a 690 | ws_next_move 691 | .It Cm M-S- Ns Aq Cm Left 692 | ws_prev_move 693 | .It Cm M-S- Ns Aq Cm Up 694 | ws_prior 695 | .It Cm M-S- Ns Aq Cm Right 696 | rg_next 697 | .It Cm M-S- Ns Aq Cm Left 698 | rg_prev 699 | .It Cm M-s 700 | screenshot_all 701 | .It Cm M-S-s 702 | screenshot_wind 703 | .It Cm M-S-v 704 | version 705 | .It Cm M-t 706 | float_toggle 707 | .It Cm M-S- Ns Aq Cm Delete 708 | lock 709 | .It Cm M-S-i 710 | initscr 711 | .It Cm M-w 712 | iconify 713 | .It Cm M-S-w 714 | uniconify 715 | .It Cm M-e 716 | maximize_toggle 717 | .It Cm M-S-r 718 | always_raise 719 | .It Cm M-v 720 | button2 721 | .It Cm M-- 722 | width_shrink 723 | .It Cm M-= 724 | width_grow 725 | .It Cm M-S-- 726 | height_shrink 727 | .It Cm M-S-= 728 | height_grow 729 | .It Cm M-[ 730 | move_left 731 | .It Cm M-] 732 | move_right 733 | .It Cm M-S-[ 734 | move_up 735 | .It Cm M-S-] 736 | move_down 737 | .It Cm M-S-/ 738 | name_workspace 739 | .It Cm M-/ 740 | search_workspace 741 | .It Cm M-f 742 | search_win 743 | .El 744 | .Pp 745 | Le azioni predefinite disponibili sono le seguenti: 746 | .Pp 747 | .Bl -tag -width "M-j, M-XXXX" -offset indent -compact 748 | .It Cm term 749 | Esegue un terminale (vedere la sezione 750 | .Sx PROGRAMMI 751 | pi\[`u] in alto). 752 | .It Cm menu 753 | Mostra il menu (vedere la sezione 754 | .Sx PROGRAMMI 755 | pi\[`u] in alto). 756 | .It Cm quit 757 | Chiude 758 | .Nm . 759 | .It Cm restart 760 | Riavvia 761 | .Nm . 762 | .It Cm cycle_layout 763 | Passa al layout successivo. 764 | .It Cm flip_layout 765 | Inverte l'area principale e quella di stacking. 766 | .It Cm stack_reset 767 | Riporta il layout al suo stato iniziale. 768 | .It Cm master_shrink 769 | Riduce la dimensione dell'area principale. 770 | .It Cm master_grow 771 | Aumenta la dimensione dell'area principale. 772 | .It Cm master_add 773 | Aggiunge una finestra all'area principale. 774 | .It Cm master_del 775 | Rimuove una finestra dall'area principale. 776 | .It Cm stack_inc 777 | Aggiunge una riga (o colonna) all'area di stacking. 778 | .It Cm stack_dec 779 | Rimuove una riga (o colonna) dall'area di stacking. 780 | .It Cm swap_main 781 | Sposta la finestra corrente nell'area principale. 782 | .It Cm focus_next 783 | Assegna il focus alla finestra successiva. 784 | .It Cm focus_prev 785 | Assegna il focus alla finestra precedente. 786 | .It Cm focus_main 787 | Assegna il focus alla finestra principale dell'area di lavoro. 788 | .It Cm focus_urgent 789 | Assegna il focus alla finestra urgente successiva. 790 | Verr\[`a] effettuato, se necessario, il passaggio ad un'altra area di 791 | lavoro. 792 | .It Cm swap_next 793 | Inverte la finestra corrente con quella successiva. 794 | .It Cm swap_prev 795 | Inverte la finestra corrente con quella precedente. 796 | .It Cm bar_toggle 797 | Modifica la visibilit\[`a] della barra di stato a livello globale. 798 | .It Cm bar_toggle_ws 799 | Modifica la visibilit\[`a] della barra di stato nell'area di lavoro 800 | corrente. 801 | .It Cm wind_del 802 | Chiude la finestra corrente. 803 | .It Cm wind_kill 804 | Distrugge la finestra corrente. 805 | .It Cm ws_ Ns Ar n 806 | Passa all'area di lavoro 807 | .Ar n , 808 | dove 809 | .Ar n 810 | \[`e] un valore compreso tra 1 e 811 | .Ic workspace_limit . 812 | .It Cm mvws_ Ns Ar n 813 | Sposta la finestra corrente nell'area di lavoro 814 | .Ar n , 815 | dove 816 | .Ar n 817 | \[`e] un numero compreso tra 1 e 818 | .Ic workspace_limit . 819 | .It Cm rg_ Ns Ar n 820 | Assegna il focus alla regione 821 | .Ar n , 822 | dove 823 | .Ar n 824 | \[`e] un numero compreso tra 1 e 9. 825 | .It Cm mvrg_ Ns Ar n 826 | Sposta la finestra corrente nella regione 827 | .Ar n , 828 | dove 829 | .Ar n 830 | \[`e] un numero compreso tra 1 e 9. 831 | .It Cm ws_next 832 | Passa all'area di lavoro non vuota successiva. 833 | .It Cm ws_prev 834 | Passa all'area di lavoro non vuota precedente. 835 | .It Cm ws_next_all 836 | Passa all'area di lavoro successiva. 837 | .It Cm ws_prev_all 838 | Passa all'area di lavoro precedente. 839 | .It Cm ws_next_move 840 | Passa all'area di lavoro successiva, spostando allo stesso tempo la 841 | finestra corrente. 842 | .It Cm ws_prev_move 843 | Passa all'area di lavoro precedente, spostando allo stesso tempo la 844 | finestra corrente. 845 | .It Cm ws_prior 846 | Passa all'ultima area di lavoro visitata. 847 | .It Cm rg_next 848 | Passa alla regione successiva. 849 | .It Cm rg_prev 850 | Passa alla regione precedente. 851 | .It Cm screenshot_all 852 | Cattura l'intera schermata chiamando l'apposito script (vedere la sezione 853 | .Sx PROGRAMMI 854 | pi\[`u] in alto). 855 | .It Cm screenshot_wind 856 | Cattura una singola finestra chiamando l'apposito script (vedere la sezione 857 | .Sx PROGRAMMI 858 | pi\[`u] in alto). 859 | .It Cm version 860 | Modifica la visibilit\[`a] del numero di versione all'interno della barra 861 | di stato. 862 | .It Cm float_toggle 863 | Modifica la finestra che detiene il focus, portandola da floating a tiled 864 | e viceversa. 865 | .It Cm lock 866 | Blocca lo schermo (vedere la sezione 867 | .Sx PROGRAMMI 868 | pi\[`u] in alto). 869 | .It Cm initscr 870 | Inizializza nuovamente tutti gli schermi (vedere la sezione 871 | .Sx PROGRAMMI 872 | pi\[`u] in alto). 873 | .It Cm iconify 874 | Minimizza la finestra che detiene il focus. 875 | .It Cm uniconify 876 | Ripristina la finestra selezionata tramite 877 | .Xr dmenu 1 . 878 | .It Cm maximize_toggle 879 | Modifica lo stato di massimizzazione della finestra che detiene il focus. 880 | .It Cm always_raise 881 | Se impostato, le finestre tiled possono oscurare le finestre floating. 882 | .It Cm button2 883 | Simula la pressione del tasto centrale del mouse. 884 | .It Cm width_shrink 885 | Riduce la larghezza di una finestra floating. 886 | .It Cm width_grow 887 | Aumenta la larghezza di una finestra floating. 888 | .It Cm height_shrink 889 | Riduce l'altezza di una finestra floating. 890 | .It Cm height_grow 891 | Aumenta l'altezza di una finestra floating. 892 | .It Cm move_left 893 | Sposta una finestra floating verso sinistra di un'unit\[`a]. 894 | .It Cm move_right 895 | Sposta una finestra floating verso destra di un'unit\[`a]. 896 | .It Cm move_up 897 | Sposta una finestra floating verso l'alto di un'unit\[`a]. 898 | .It Cm move_down 899 | Sposta una finestra floating verso il basso di un'unit\[`a]. 900 | .It Cm name_workspace 901 | Assegna un nome all'area di lavoro corrente. 902 | .It Cm search_workspace 903 | Cerca un'area di lavoro. 904 | .It Cm search_win 905 | Cerca una finestra all'interno dell'area di lavoro corrente. 906 | .El 907 | .Pp 908 | Le scorciatoie da tastiera personalizzate vengono definite come segue: 909 | .Pp 910 | .Dl bind Ns Bo Ar action Bc = Ar keys 911 | .Pp 912 | .Ar action 913 | \[`e] una delle azioni predefinite descritte sopra, oppure la stringa vuota 914 | (per disabilitare la scorciatoia). 915 | .Ar keys 916 | \[`e] composta da uno o pi\[`u] tasti modificatore (eg. MOD, Mod1, Shift, 917 | etc.) e uno o pi\[`u] tasti normali (eg. b, Space, etc.) separati da 918 | .Ql + . 919 | .Pp 920 | Esempio: 921 | .Bd -literal -offset indent 922 | bind[reset] = Mod4+q # Assegna l'azione reset alla scorciatoia Win+q 923 | bind[] = Mod1+q # disabilita la scorciatoia predefinita Alt+q 924 | .Ed 925 | .Pp 926 | Per usare il valore dell'opzione 927 | .Ic modkey 928 | in una scorciatoia, specificare MOD come modificatore. 929 | .Pp 930 | Pi\[`u] scorciatoie possono essere assegnate alla stessa azione. 931 | .Pp 932 | Per usare dei caratteri non latini, come \[oa] o \[*p], all'interno di una 933 | scorciatoia, \[`e] necessario specificare il nome xkb del carattere 934 | anzich\['e] il carattere stesso. 935 | Eseguendo 936 | .Xr xev 1 937 | e premendo un tasto mentre la finestra del programma detiene il focus, 938 | \[`e] possibile leggere il nome xkb corrispondente al tasto premuto. 939 | Ad esempio, per \[oa]: 940 | .Bd -literal -offset indent 941 | KeyPress event, serial 41, synthetic NO, window 0x2600001, 942 | root 0x15a, subw 0x0, time 106213808, (11,5), root:(359,823), 943 | state 0x0, keycode 24 (keysym 0xe5, aring), same_screen YES, 944 | XLookupString gives 2 bytes: (c3 a5) "\[oa]" 945 | XmbLookupString gives 2 bytes: (c3 a5) "\[oa]" 946 | XFilterEvent returns: False 947 | .Ed 948 | .Pp 949 | Il nome xkb \[`e] aring. 950 | Quindi, all'interno di 951 | .Pa spectrwm.conf 952 | sar\[`a] possibile aggiungere la seguente riga: 953 | .Bd -literal -offset indent 954 | bind[program] = MOD+aring 955 | .Ed 956 | .Sh MAPPE DI TASTIERA 957 | \[`E] possibile caricare le scorciatoie da un file di configurazione 958 | separato tramite l'opzione 959 | .Ic keyboard_mapping : 960 | questo consente di utilizzare scorciatoie specifiche del proprio layout di 961 | tastiera. 962 | .Pp 963 | Vengono forniti i seguenti file: 964 | .Pp 965 | .Bl -tag -width "spectrwm_XX.confXXX" -offset indent -compact 966 | .It Cm spectrwm_cz.conf 967 | Layout per tastiere ceche 968 | .It Cm spectrwm_es.conf 969 | Layout per tastiere spagnole 970 | .It Cm spectrwm_fr.conf 971 | Layout per tastiere francesi 972 | .It Cm spectrwm_fr_ch.conf 973 | Layout per tastiere francesi (Svizzera) 974 | .It Cm spectrwm_se.conf 975 | Layout per tastiere svedesi 976 | .It Cm spectrwm_us.conf 977 | Layout per tastiere americane 978 | .El 979 | .Sh QUIRK 980 | \[`E] possibile specificare "quirk" da applicare a quelle finestre (ad 981 | esempio applicazioni a schermo intero e finestre di dialogo) che richiedono 982 | un comportamento speciale da parte di un gestore di finestre tiling come 983 | .Nm . 984 | .Pp 985 | La configurazione predefinita, per quanto riguarda i quirk, \[`e] la 986 | seguente: 987 | .Pp 988 | .Bl -tag -width "OpenOffice.org N.M:VCLSalFrameXXX" -offset indent \ 989 | -compact 990 | .It Firefox\-bin:firefox\-bin 991 | TRANSSZ 992 | .It Firefox:Dialog 993 | FLOAT 994 | .It Gimp:gimp 995 | FLOAT + ANYWHERE 996 | .It MPlayer:xv 997 | FLOAT + FULLSCREEN + FOCUSPREV 998 | .It OpenOffice.org 2.4:VCLSalFrame 999 | FLOAT 1000 | .It OpenOffice.org 3.1:VCLSalFrame 1001 | FLOAT 1002 | .It pcb:pcb 1003 | FLOAT 1004 | .It xine:Xine Window 1005 | FLOAT + ANYWHERE 1006 | .It xine:xine Panel 1007 | FLOAT + ANYWHERE 1008 | .It xine:xine Video Fullscreen Window 1009 | FULLSCREEN + FLOAT 1010 | .It Xitk:Xitk Combo 1011 | FLOAT + ANYWHERE 1012 | .It Xitk:Xine Window 1013 | FLOAT + ANYWHERE 1014 | .It XTerm:xterm 1015 | XTERM_FONTADJ 1016 | .El 1017 | .Pp 1018 | I quirk disponibili sono i seguenti: 1019 | .Pp 1020 | .Bl -tag -width "XTERM_FONTADJXXX" -offset indent -compact 1021 | .It FLOAT 1022 | Le finestre saranno sempre floating. 1023 | .It TRANSSZ 1024 | Modifica la dimensione delle finestre di dialogo in base al valore di 1025 | .Ic dialog_ratio 1026 | (vedere la sezione 1027 | .Sx FILE DI CONFIGURAZIONE 1028 | pi\[`u] in alto). 1029 | .It ANYWHERE 1030 | Consenti alle finestre di decidere la propria posizione. 1031 | .It XTERM_FONTADJ 1032 | Regola la dimensione dei font di 1033 | .Xr xterm 1 1034 | quando la dimensione delle finestre viene modificata. 1035 | .It FULLSCREEN 1036 | Non mostrare il bordo. 1037 | .It FOCUSPREV 1038 | Alla chiusura di una finestra, il focus verr\[`a] assegnato alla finestra 1039 | che lo deteneva in precedenza e non alla finestra precedente nello stack. 1040 | .It NOFOCUSONMAP 1041 | Non assegnare il focus alle finestre quando vengono create. 1042 | Questo quirk viene ignorato se il valore di 1043 | .Ic focus_mode 1044 | \[`e] 1045 | .Ar follow . 1046 | .It FOCUSONMAP_SINGLE 1047 | Assegna il focus alle finestre quando vengono create solo se non sono 1048 | gi\[`a] presenti delle finestre con la stessa classe e istanza nell'area 1049 | di lavoro. 1050 | Questo quirk viene ignorato se il valore di 1051 | .Ic focus_mode 1052 | \[`e] 1053 | .Ar follow . 1054 | .It OBEYAPPFOCUSREQ 1055 | Assegna il focus alle finestre quando viene richiesto tramite un messaggio 1056 | di tipo _NET_ACTIVE_WINDOW con sorgente 1. 1057 | Se la sorgente \[`e] 0 (non specificato) o 2 (pager), la richiesta viene 1058 | sempre accolta. 1059 | .It IGNOREPID 1060 | Ignora il PID nella scelta dell'area di lavoro iniziale per le nuove 1061 | finestre. 1062 | Molto utile per le applicazioni (eg. terminali) che creano pi\[`u] finestre 1063 | all'interno dello stesso processo. 1064 | .It IGNORESPAWNWS 1065 | Ignora l'area di lavoro in cui \[`e] stata eseguita la scorciatoia da 1066 | tastiera nella scelta dell'area di lavoro iniziale per le nuove finestre. 1067 | .It WS Ns Bq Ar n 1068 | Obbliga le nuove finestre ad essere assegnate all'area di lavoro 1069 | .Ar n . 1070 | .El 1071 | .Pp 1072 | I quirk personalizzati vengono definiti come segue: 1073 | .Pp 1074 | .Dl quirk Ns Bo Ar class Ns Bo : Ns Ar instance Ns Bo : Ns Ar name Bc Bc Bc = Ar quirk Op + Ar quirk ... 1075 | .Pp 1076 | .Ar class , 1077 | .Ar instance 1078 | (opzionale) e 1079 | .Ar name 1080 | (opzionale) sono dei pattern che vengono usati per determinare a quali 1081 | finestre i quirk debbano essere applicati e 1082 | .Ar quirk 1083 | \[`e] uno dei quirk descritti in precedenza. 1084 | .Pp 1085 | I pattern vengono interpretati come espressioni regolari estese POSIX. 1086 | I simboli ':', '[' e ']' devono essere preceduti da '\\' per essere 1087 | considerati letteralmente. 1088 | Vedere 1089 | .Xr regex 7 1090 | per ulteriori informazioni sulle espressioni regolari estese POSIX. 1091 | .Pp 1092 | Ad esempio: 1093 | .Bd -literal -offset indent 1094 | quirk[MPlayer] = FLOAT + FULLSCREEN + FOCUSPREV # Le finestre con \ 1095 | classe 'MPlayer' sono floating 1096 | quirk[.*] = FLOAT # Le finestre sono floating 1097 | quirk[.*:.*:.*] = FLOAT # Come sopra 1098 | quirk[Firefox:Navigator] = FLOAT # Le finestre di navigazione di \ 1099 | Firefox sono floating 1100 | quirk[::Console] = FLOAT # Le finestre la cui classe non \[`e] impostata \ 1101 | e il cui nome \[`e] 'Console' sono floating 1102 | quirk[\\[0-9\\].*:.*:\\[\\[\\:alnum\\:\\]\\]*] = FLOAT # Le finestre la \ 1103 | cui classe inizia con un numero e il cui nome \[`e] non definito o \ 1104 | contiene solo caratteri alfanumerici, senza spazi, sono floating 1105 | quirk[pcb:pcb] = NONE # Rimuove i quirk predefiniti 1106 | .Ed 1107 | \[`E] possibile ottenere 1108 | .Ar class , 1109 | .Ar instance 1110 | e 1111 | .Ar name 1112 | eseguendo 1113 | .Xr xprop 1 1114 | e selezionando la finestra desiderata. 1115 | In questo esempio, \[`e] stata selezionata la finestra principale di 1116 | Firefox: 1117 | .Bd -literal -offset indent 1118 | $ xprop | grep \-E "^(WM_CLASS|_NET_WM_NAME|WM_NAME)" 1119 | WM_CLASS(STRING) = "Navigator", "Firefox" 1120 | WM_NAME(STRING) = "spectrwm - ConformalOpenSource" 1121 | _NET_WM_NAME(UTF8_STRING) = "spectrwm - ConformalOpenSource" 1122 | .Ed 1123 | .Pp 1124 | Il comando 1125 | .Xr xprop 1 1126 | visualizza WM_CLASS nel seguente formato: 1127 | .Bd -literal -offset indent 1128 | WM_CLASS(STRING) = "", "" 1129 | .Ed 1130 | .Pp 1131 | In questo caso, bisognerebbe aggiungere al file di configurazione la 1132 | seguente riga: 1133 | .Bd -literal -offset indent 1134 | quirk[Firefox:Navigator] = FLOAT 1135 | .Ed 1136 | .Pp 1137 | .Nm 1138 | assegna alcuni quirk in automatico, basandosi sul valore della 1139 | propriet\[`a] _NET_WM_WINDOW_TYPE, nel seguente modo: 1140 | .Pp 1141 | .Bl -tag -width "_NET_WM_WINDOW_TYPE_TOOLBARXXX" -offset indent -compact 1142 | .It _NET_WM_WINDOW_TYPE_DOCK 1143 | FLOAT + ANYWHERE 1144 | .It _NET_WM_WINDOW_TYPE_TOOLBAR 1145 | FLOAT + ANYWHERE 1146 | .It _NET_WM_WINDOW_TYPE_UTILITY 1147 | FLOAT + ANYWHERE 1148 | .It _NET_WM_WINDOW_TYPE_SPLASH 1149 | FLOAT 1150 | .It _NET_WM_WINDOW_TYPE_DIALOG 1151 | FLOAT 1152 | .El 1153 | .Pp 1154 | In tutti gli altri casi gli unici quirk assegnati alle finestre saranno 1155 | quelli predefiniti o, con precedenza maggiore, quelli specificati nel 1156 | file di configurazione. 1157 | .Sh EWMH 1158 | .Nm 1159 | implementa in maniera parziale la specifica EWMH, Extended Window Manager 1160 | Hints: questo consente di controllare le finestre, oltre che 1161 | .Nm 1162 | stesso, da script e programmi esterni. 1163 | Per sfruttare questo supporto, 1164 | .Nm 1165 | dovr\[`a] ricevere degli eventi di tipo ClientMessage; questo tipo di 1166 | messaggio pu\[`o] essere inviato dalla riga di comando usando tool come 1167 | .Xr wmctrl 1 1168 | e 1169 | .Xr xdotool 1 . 1170 | Il formato dei messaggi \[`e] definito nella specifica EWMH. 1171 | .Pp 1172 | L'identificativo della finestra che detiene il focus pu\[`o] essere 1173 | ottenuto leggendo il valore della propriet\[`a] _NET_ACTIVE_WINDOWS 1174 | della root window. 1175 | Ad esempio, per visualizzare il titolo della finestra: 1176 | .Bd -literal -offset indent 1177 | $ WINDOWID=`xprop \-root _NET_ACTIVE_WINDOW | grep \-o "0x.*"` 1178 | $ xprop \-id $WINDOWID _NET_WM_NAME | grep \-o "\\".*\\"" 1179 | .Ed 1180 | .Pp 1181 | Il focus pu\[`o] essere assegnato ad una finestra inviando un messaggio 1182 | di tipo _NET_ACTIVE_WINDOW alla root window, ad esempio: 1183 | .Bd -literal -offset indent 1184 | $ wmctrl \-i \-a 0x4a0000b 1185 | .Ed 1186 | .Pp 1187 | Le finestre possono essere chiuse inviando un messaggio di tipo 1188 | _NET_CLOSE_WINDOW, ad esempio: 1189 | .Bd -literal -offset indent 1190 | $ wmctrl \-i \-c 0x4a0000b 1191 | .Ed 1192 | .Pp 1193 | Le finestre possono essere portate da floating a tiled, e viceversa, 1194 | aggiungendo o rimuovendo l'atomo _NET_WM_STATE_ABOVE dalla propriet\[`a] 1195 | _NET_WM_STATE della finestra. 1196 | Per fare ci\[`o], \[`e] necessario inviare un messaggio di tipo 1197 | _NET_WM_STATE, ad esempio: 1198 | .Bd -literal -offset indent 1199 | $ wmctrl \-i \-r 0x4a0000b \-b toggle,_NET_WM_STATE_ABOVE 1200 | .Ed 1201 | .Pp 1202 | Le finestre possono essere minimizzate e ripristinate sostituendo 1203 | _NET_WM_STATE_HIDDEN a _NET_WM_STATE_ABOVE nell'esempio precedente: 1204 | .Bd -literal -offset indent 1205 | $ wmctrl \-i \-r 0x4a0000b \-b toggle,_NET_WM_STATE_HIDDEN 1206 | .Ed 1207 | .Pp 1208 | Le finestre floating possono essere ridimensionate e spostate tramite 1209 | l'invio di un messaggio di tipo _NET_MOVERESIZE_WINDOW, ad esempio: 1210 | .Bd -literal -offset indent 1211 | $ wmctrl \-i \-r 0x4a0000b \-e 0,100,50,640,480 1212 | .Ed 1213 | In questo caso, la con id 0x4a0000b finestra viene spostata in (100,50) 1214 | e la sua dimensione diventa 640x480. 1215 | .Pp 1216 | I messaggi di tipo _NET_MOVERESIZE_WINDOW che fanno riferimento a finestre 1217 | tiled verranno ignorati. 1218 | .Sh SEGNALI 1219 | Il segnale HUP fa riavviare 1220 | .Nm . 1221 | .Sh FILE 1222 | .Bl -tag -width "/etc/spectrwm.confXXX" -compact 1223 | .It Pa ~/.spectrwm.conf 1224 | File di configurazione specifico dell'utente. 1225 | .Nm . 1226 | .It Pa /etc/spectrwm.conf 1227 | File di configurazione globale. 1228 | .El 1229 | .Sh ORIGINE 1230 | .Nm 1231 | \[`e] ispirato a xmonad & dwm. 1232 | .Sh AUTORI 1233 | .An -nosplit 1234 | .Nm 1235 | \[`e] stato scritto da: 1236 | .Pp 1237 | .Bl -tag -width "Ryan Thomas McBride Aq mcbride@countersiege.com " -offset \ 1238 | indent -compact 1239 | .It Cm Marco Peereboom Aq marco@peereboom.us 1240 | .It Cm Ryan Thomas McBride Aq mcbride@countersiege.com 1241 | .It Cm Darrin Chandler Aq dwchandler@stilyagin.com 1242 | .It Cm Pierre-Yves Ritschard Aq pyr@spootnik.org 1243 | .It Cm Tuukka Kataja Aq stuge@xor.fi 1244 | .It Cm Jason L. Wright Aq jason@thought.net 1245 | .It Cm Reginald Kennedy Aq rk@rejii.com 1246 | .It Cm Lawrence Teo Aq lteo@lteo.net 1247 | .It Cm Tiago Cunha Aq tcunha@gmx.com 1248 | .It Cm David Hill Aq dhill@mindcry.org 1249 | .El 1250 | --------------------------------------------------------------------------------