From b0271403739f0be2e6c193bb9e782011cb73a5ba Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Mon, 29 Apr 2024 01:29:53 +0200 Subject: [PATCH] removed dwm and i3, minimizing my config --- hosts/vali/mars/awesome/awesome.nix | 26 +- hosts/vali/mars/configuration.nix | 1 - hosts/vali/mars/default.nix | 2 - hosts/vali/mars/dwm/dmenu-5.3/LICENSE | 30 - hosts/vali/mars/dwm/dmenu-5.3/Makefile | 58 - hosts/vali/mars/dwm/dmenu-5.3/README | 24 - hosts/vali/mars/dwm/dmenu-5.3/arg.h | 49 - hosts/vali/mars/dwm/dmenu-5.3/config.def.h | 23 - hosts/vali/mars/dwm/dmenu-5.3/config.h | 23 - hosts/vali/mars/dwm/dmenu-5.3/config.mk | 32 - hosts/vali/mars/dwm/dmenu-5.3/dmenu | Bin 42560 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/dmenu.1 | 194 -- hosts/vali/mars/dwm/dmenu-5.3/dmenu.c | 796 ------ hosts/vali/mars/dwm/dmenu-5.3/dmenu.o | Bin 32384 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/dmenu_path | 13 - hosts/vali/mars/dwm/dmenu-5.3/dmenu_run | 2 - hosts/vali/mars/dwm/dmenu-5.3/drw.c | 451 ---- hosts/vali/mars/dwm/dmenu-5.3/drw.h | 58 - hosts/vali/mars/dwm/dmenu-5.3/drw.o | Bin 11160 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/shell.nix | 9 - hosts/vali/mars/dwm/dmenu-5.3/stest | Bin 16576 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/stest.1 | 90 - hosts/vali/mars/dwm/dmenu-5.3/stest.c | 109 - hosts/vali/mars/dwm/dmenu-5.3/stest.o | Bin 5328 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/util.c | 36 - hosts/vali/mars/dwm/dmenu-5.3/util.h | 9 - hosts/vali/mars/dwm/dmenu-5.3/util.o | Bin 2248 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/.gitignore | 3 - hosts/vali/mars/dwm/dwm-6.5/LICENSE | 38 - hosts/vali/mars/dwm/dwm-6.5/Makefile | 45 - hosts/vali/mars/dwm/dwm-6.5/README | 48 - hosts/vali/mars/dwm/dwm-6.5/config.def.h | 123 - hosts/vali/mars/dwm/dwm-6.5/config.h | 128 - hosts/vali/mars/dwm/dwm-6.5/config.mk | 39 - hosts/vali/mars/dwm/dwm-6.5/drw.c | 450 ---- hosts/vali/mars/dwm/dwm-6.5/drw.h | 58 - hosts/vali/mars/dwm/dwm-6.5/drw.o | Bin 11144 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/dwm | Bin 62920 -> 0 bytes .../dwm-multiple-dynamic-scratchpads.diff | 207 -- .../dwm-scratchpad-20240321-061e9fe.diff | 105 - hosts/vali/mars/dwm/dwm-6.5/dwm.1 | 179 -- hosts/vali/mars/dwm/dwm-6.5/dwm.c | 2319 ----------------- hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig | 2207 ---------------- hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej | 23 - hosts/vali/mars/dwm/dwm-6.5/dwm.o | Bin 59856 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/dwm.png | Bin 373 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/shell.nix | 9 - hosts/vali/mars/dwm/dwm-6.5/transient.c | 42 - hosts/vali/mars/dwm/dwm-6.5/util.c | 36 - hosts/vali/mars/dwm/dwm-6.5/util.h | 8 - hosts/vali/mars/dwm/dwm-6.5/util.o | Bin 2248 -> 0 bytes hosts/vali/mars/dwm/dwm.nix | 23 - hosts/vali/mars/i3/config | 190 -- hosts/vali/mars/i3/default.nix | 6 - hosts/vali/mars/i3/i3-new.nix | 68 - hosts/vali/mars/i3/i3.nix | 22 - hosts/vali/mars/i3/polybar.sh | 0 hosts/vali/mars/programs.nix | 4 +- 58 files changed, 16 insertions(+), 8399 deletions(-) delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/LICENSE delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/Makefile delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/README delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/arg.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/config.def.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/config.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/config.mk delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/dmenu delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/dmenu.1 delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/dmenu.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/dmenu.o delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/dmenu_path delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/dmenu_run delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/drw.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/drw.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/drw.o delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/shell.nix delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/stest delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/stest.1 delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/stest.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/stest.o delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/util.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/util.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/util.o delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/.gitignore delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/LICENSE delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/Makefile delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/README delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/config.def.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/config.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/config.mk delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/drw.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/drw.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/drw.o delete mode 100755 hosts/vali/mars/dwm/dwm-6.5/dwm delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm-multiple-dynamic-scratchpads.diff delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.1 delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.o delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.png delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/shell.nix delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/transient.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/util.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/util.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/util.o delete mode 100644 hosts/vali/mars/dwm/dwm.nix delete mode 100644 hosts/vali/mars/i3/config delete mode 100644 hosts/vali/mars/i3/default.nix delete mode 100644 hosts/vali/mars/i3/i3-new.nix delete mode 100644 hosts/vali/mars/i3/i3.nix delete mode 100644 hosts/vali/mars/i3/polybar.sh diff --git a/hosts/vali/mars/awesome/awesome.nix b/hosts/vali/mars/awesome/awesome.nix index b9c2f20..d3080eb 100644 --- a/hosts/vali/mars/awesome/awesome.nix +++ b/hosts/vali/mars/awesome/awesome.nix @@ -3,21 +3,21 @@ with lib; let username = config.modules.other.system.username; cfg = config.modules.programs.awesome; in { - options.modules.programs.dwm.enable = mkEnableOption "awesome"; + options.modules.programs.awesome.enable = mkEnableOption "awesome"; config = mkIf cfg.enable { - services.xserver = { - enable = true; - layout = "de, de"; - xkbVariant = ",neo "; - xkbOptions = "grp:alt_space_toggle"; - windowManager.awesome = { - enable = true; + services = { + displayManager.sddm.enable = true; + xserver = { + enable = true; + xkb = { + layout = "de, de"; + variant = ",neo "; + options = "grp:alt_space_toggle"; + }; + windowManager.awesome.enable = true; + displayManager.setupCommands = "${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-1 --rotate normal --output DP-2 --rotate normal --left-of HDMI-1 --output HDMI-0 --right-of HDMI-1"; + }; }; - displayManager = { - sddm.enable = true; - setupCommands = "${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-1 --rotate normal --output DP-2 --rotate normal --left-of HDMI-1 --output HDMI-0 --right-of HDMI-1"; - }; - }; }; } diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index 8f34d0f..a3ae599 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -55,7 +55,6 @@ btop.enable = true; mpv.enable = true; kitty.enable = true; - dwm.enable = true; awesome.enable = true; newsboat.enable = true; #git = { diff --git a/hosts/vali/mars/default.nix b/hosts/vali/mars/default.nix index c1106bb..acd94e4 100644 --- a/hosts/vali/mars/default.nix +++ b/hosts/vali/mars/default.nix @@ -4,8 +4,6 @@ _: { ./programs.nix ./hardware-configuration.nix ./profile.nix - ./i3 - ./dwm/dwm.nix ./awesome/awesome.nix ]; diff --git a/hosts/vali/mars/dwm/dmenu-5.3/LICENSE b/hosts/vali/mars/dwm/dmenu-5.3/LICENSE deleted file mode 100644 index 2a64b28..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2008 Sander van Dijk -© 2006-2007 Michał Janeczek -© 2007 Kris Maglione -© 2009 Gottox -© 2009 Markus Schnalke -© 2009 Evan Gates -© 2010-2012 Connor Lane Smith -© 2014-2022 Hiltjo Posthuma -© 2015-2019 Quentin Rameau - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/hosts/vali/mars/dwm/dmenu-5.3/Makefile b/hosts/vali/mars/dwm/dmenu-5.3/Makefile deleted file mode 100644 index 458c524..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# dmenu - dynamic menu -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dmenu.c stest.c util.c -OBJ = $(SRC:.c=.o) - -all: dmenu stest - -.c.o: - $(CC) -c $(CFLAGS) $< - -config.h: - cp config.def.h $@ - -$(OBJ): arg.h config.h config.mk drw.h - -dmenu: dmenu.o drw.o util.o - $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) - -stest: stest.o - $(CC) -o $@ stest.o $(LDFLAGS) - -clean: - rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz - -dist: clean - mkdir -p dmenu-$(VERSION) - cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\ - drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\ - dmenu-$(VERSION) - tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION) - gzip dmenu-$(VERSION).tar - rm -rf dmenu-$(VERSION) - -install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run - chmod 755 $(DESTDIR)$(PREFIX)/bin/stest - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\ - $(DESTDIR)$(PREFIX)/bin/dmenu_path\ - $(DESTDIR)$(PREFIX)/bin/dmenu_run\ - $(DESTDIR)$(PREFIX)/bin/stest\ - $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ - $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -.PHONY: all clean dist install uninstall diff --git a/hosts/vali/mars/dwm/dmenu-5.3/README b/hosts/vali/mars/dwm/dmenu-5.3/README deleted file mode 100644 index a8fcdfe..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/README +++ /dev/null @@ -1,24 +0,0 @@ -dmenu - dynamic menu -==================== -dmenu is an efficient dynamic menu for X. - - -Requirements ------------- -In order to build dmenu you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dmenu is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dmenu -(if necessary as root): - - make clean install - - -Running dmenu -------------- -See the man page for details. diff --git a/hosts/vali/mars/dwm/dmenu-5.3/arg.h b/hosts/vali/mars/dwm/dmenu-5.3/arg.h deleted file mode 100644 index e94e02b..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/arg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/hosts/vali/mars/dwm/dmenu-5.3/config.def.h b/hosts/vali/mars/dwm/dmenu-5.3/config.def.h deleted file mode 100644 index 1edb647..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/config.def.h +++ /dev/null @@ -1,23 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "monospace:size=10" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/hosts/vali/mars/dwm/dmenu-5.3/config.h b/hosts/vali/mars/dwm/dmenu-5.3/config.h deleted file mode 100644 index 1edb647..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/config.h +++ /dev/null @@ -1,23 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "monospace:size=10" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/hosts/vali/mars/dwm/dmenu-5.3/config.mk b/hosts/vali/mars/dwm/dmenu-5.3/config.mk deleted file mode 100644 index 137f7c8..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/config.mk +++ /dev/null @@ -1,32 +0,0 @@ -# dmenu version -VERSION = 5.3 - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = $(X11INC)/freetype2 -#MANPREFIX = ${PREFIX}/man - -# includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) -LDFLAGS = $(LIBS) - -# compiler and linker -CC = cc diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu b/hosts/vali/mars/dwm/dmenu-5.3/dmenu deleted file mode 100755 index 8906fbffc1fddc3401e9a2b3ca90ab0537e36dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42560 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 -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef XINERAMA -#include -#endif -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ - -struct item { - char *text; - struct item *left, *right; - int out; -}; - -static char text[BUFSIZ] = ""; -static char *embed; -static int bh, mw, mh; -static int inputw = 0, promptw; -static int lrpad; /* sum of left and right padding */ -static size_t cursor; -static struct item *items = NULL; -static struct item *matches, *matchend; -static struct item *prev, *curr, *next, *sel; -static int mon = -1, screen; - -static Atom clip, utf8; -static Display *dpy; -static Window root, parentwin, win; -static XIC xic; - -static Drw *drw; -static Clr *scheme[SchemeLast]; - -#include "config.h" - -static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; -static char *(*fstrstr)(const char *, const char *) = strstr; - -static unsigned int -textw_clamp(const char *str, unsigned int n) -{ - unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad; - return MIN(w, n); -} - -static void -appenditem(struct item *item, struct item **list, struct item **last) -{ - if (*last) - (*last)->right = item; - else - *list = item; - - item->left = *last; - item->right = NULL; - *last = item; -} - -static void -calcoffsets(void) -{ - int i, n; - - if (lines > 0) - n = lines * bh; - else - n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); - /* calculate which items will begin the next page and previous page */ - for (i = 0, next = curr; next; next = next->right) - if ((i += (lines > 0) ? bh : textw_clamp(next->text, n)) > n) - break; - for (i = 0, prev = curr; prev && prev->left; prev = prev->left) - if ((i += (lines > 0) ? bh : textw_clamp(prev->left->text, n)) > n) - break; -} - -static void -cleanup(void) -{ - size_t i; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - for (i = 0; items && items[i].text; ++i) - free(items[i].text); - free(items); - drw_free(drw); - XSync(dpy, False); - XCloseDisplay(dpy); -} - -static char * -cistrstr(const char *h, const char *n) -{ - size_t i; - - if (!n[0]) - return (char *)h; - - for (; *h; ++h) { - for (i = 0; n[i] && tolower((unsigned char)n[i]) == - tolower((unsigned char)h[i]); ++i) - ; - if (n[i] == '\0') - return (char *)h; - } - return NULL; -} - -static int -drawitem(struct item *item, int x, int y, int w) -{ - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else - drw_setscheme(drw, scheme[SchemeNorm]); - - return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); -} - -static void -drawmenu(void) -{ - unsigned int curpos; - struct item *item; - int x = 0, y = 0, w; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); - - if (prompt && *prompt) { - drw_setscheme(drw, scheme[SchemeSel]); - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); - } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); - } - - if (lines > 0) { - /* draw vertical list */ - for (item = curr; item != next; item = item->right) - drawitem(item, x, y += bh, mw - x); - } else if (matches) { - /* draw horizontal list */ - x += inputw; - w = TEXTW("<"); - if (curr->left) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); - } - x += w; - for (item = curr; item != next; item = item->right) - x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">"))); - if (next) { - w = TEXTW(">"); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); - } - } - drw_map(drw, win, 0, 0, mw, mh); -} - -static void -grabfocus(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - Window focuswin; - int i, revertwin; - - for (i = 0; i < 100; ++i) { - XGetInputFocus(dpy, &focuswin, &revertwin); - if (focuswin == win) - return; - XSetInputFocus(dpy, win, RevertToParent, CurrentTime); - nanosleep(&ts, NULL); - } - die("cannot grab focus"); -} - -static void -grabkeyboard(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; - int i; - - if (embed) - return; - /* try to grab keyboard, we may have to wait for another process to ungrab */ - for (i = 0; i < 1000; i++) { - if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, - GrabModeAsync, CurrentTime) == GrabSuccess) - return; - nanosleep(&ts, NULL); - } - die("cannot grab keyboard"); -} - -static void -match(void) -{ - static char **tokv = NULL; - static int tokn = 0; - - char buf[sizeof text], *s; - int i, tokc = 0; - size_t len, textsize; - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; - - strcpy(buf, text); - /* separate input text into tokens to be matched individually */ - for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) - if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) - die("cannot realloc %zu bytes:", tokn * sizeof *tokv); - len = tokc ? strlen(tokv[0]) : 0; - - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; - textsize = strlen(text) + 1; - for (item = items; item && item->text; item++) { - for (i = 0; i < tokc; i++) - if (!fstrstr(item->text, tokv[i])) - break; - if (i != tokc) /* not all tokens match */ - continue; - /* exact matches go first, then prefixes, then substrings */ - if (!tokc || !fstrncmp(text, item->text, textsize)) - appenditem(item, &matches, &matchend); - else if (!fstrncmp(tokv[0], item->text, len)) - appenditem(item, &lprefix, &prefixend); - else - appenditem(item, &lsubstr, &substrend); - } - if (lprefix) { - if (matches) { - matchend->right = lprefix; - lprefix->left = matchend; - } else - matches = lprefix; - matchend = prefixend; - } - if (lsubstr) { - if (matches) { - matchend->right = lsubstr; - lsubstr->left = matchend; - } else - matches = lsubstr; - matchend = substrend; - } - curr = sel = matches; - calcoffsets(); -} - -static void -insert(const char *str, ssize_t n) -{ - if (strlen(text) + n > sizeof text - 1) - return; - /* move existing text out of the way, insert new text, and update cursor */ - memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); - if (n > 0) - memcpy(&text[cursor], str, n); - cursor += n; - match(); -} - -static size_t -nextrune(int inc) -{ - ssize_t n; - - /* return location of next utf8 rune in the given direction (+1 or -1) */ - for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) - ; - return n; -} - -static void -movewordedge(int dir) -{ - if (dir < 0) { /* move cursor to the start of the word*/ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - } else { /* move cursor to the end of the word */ - while (text[cursor] && strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - while (text[cursor] && !strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - } -} - -static void -keypress(XKeyEvent *ev) -{ - char buf[64]; - int len; - KeySym ksym = NoSymbol; - Status status; - - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - switch (status) { - default: /* XLookupNone, XBufferOverflow */ - return; - case XLookupChars: /* composed string from input method */ - goto insert; - case XLookupKeySym: - case XLookupBoth: /* a KeySym and a string are returned: use keysym */ - break; - } - - if (ev->state & ControlMask) { - switch(ksym) { - case XK_a: ksym = XK_Home; break; - case XK_b: ksym = XK_Left; break; - case XK_c: ksym = XK_Escape; break; - case XK_d: ksym = XK_Delete; break; - case XK_e: ksym = XK_End; break; - case XK_f: ksym = XK_Right; break; - case XK_g: ksym = XK_Escape; break; - case XK_h: ksym = XK_BackSpace; break; - case XK_i: ksym = XK_Tab; break; - case XK_j: /* fallthrough */ - case XK_J: /* fallthrough */ - case XK_m: /* fallthrough */ - case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; - case XK_n: ksym = XK_Down; break; - case XK_p: ksym = XK_Up; break; - - case XK_k: /* delete right */ - text[cursor] = '\0'; - match(); - break; - case XK_u: /* delete left */ - insert(NULL, 0 - cursor); - break; - case XK_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - break; - case XK_y: /* paste selection */ - case XK_Y: - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - return; - case XK_Left: - case XK_KP_Left: - movewordedge(-1); - goto draw; - case XK_Right: - case XK_KP_Right: - movewordedge(+1); - goto draw; - case XK_Return: - case XK_KP_Enter: - break; - case XK_bracketleft: - cleanup(); - exit(1); - default: - return; - } - } else if (ev->state & Mod1Mask) { - switch(ksym) { - case XK_b: - movewordedge(-1); - goto draw; - case XK_f: - movewordedge(+1); - goto draw; - case XK_g: ksym = XK_Home; break; - case XK_G: ksym = XK_End; break; - case XK_h: ksym = XK_Up; break; - case XK_j: ksym = XK_Next; break; - case XK_k: ksym = XK_Prior; break; - case XK_l: ksym = XK_Down; break; - default: - return; - } - } - - switch(ksym) { - default: -insert: - if (!iscntrl((unsigned char)*buf)) - insert(buf, len); - break; - case XK_Delete: - case XK_KP_Delete: - if (text[cursor] == '\0') - return; - cursor = nextrune(+1); - /* fallthrough */ - case XK_BackSpace: - if (cursor == 0) - return; - insert(NULL, nextrune(-1) - cursor); - break; - case XK_End: - case XK_KP_End: - if (text[cursor] != '\0') { - cursor = strlen(text); - break; - } - if (next) { - /* jump to end of list and position items in reverse */ - curr = matchend; - calcoffsets(); - curr = prev; - calcoffsets(); - while (next && (curr = curr->right)) - calcoffsets(); - } - sel = matchend; - break; - case XK_Escape: - cleanup(); - exit(1); - case XK_Home: - case XK_KP_Home: - if (sel == matches) { - cursor = 0; - break; - } - sel = curr = matches; - calcoffsets(); - break; - case XK_Left: - case XK_KP_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Up: - case XK_KP_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; - case XK_Next: - case XK_KP_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; - case XK_Prior: - case XK_KP_Prior: - if (!prev) - return; - sel = curr = prev; - calcoffsets(); - break; - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); - if (!(ev->state & ControlMask)) { - cleanup(); - exit(0); - } - if (sel) - sel->out = 1; - break; - case XK_Right: - case XK_KP_Right: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Down: - case XK_KP_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; - case XK_Tab: - if (!sel) - return; - cursor = strnlen(sel->text, sizeof text - 1); - memcpy(text, sel->text, cursor); - text[cursor] = '\0'; - match(); - break; - } - -draw: - drawmenu(); -} - -static void -paste(void) -{ - char *p, *q; - int di; - unsigned long dl; - Atom da; - - /* we have been given the current selection, now insert it into input */ - if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, - utf8, &da, &di, &dl, &dl, (unsigned char **)&p) - == Success && p) { - insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); - XFree(p); - } - drawmenu(); -} - -static void -readstdin(void) -{ - char *line = NULL; - size_t i, itemsiz = 0, linesiz = 0; - ssize_t len; - - /* read each line from stdin and add it to the item list */ - for (i = 0; (len = getline(&line, &linesiz, stdin)) != -1; i++) { - if (i + 1 >= itemsiz) { - itemsiz += 256; - if (!(items = realloc(items, itemsiz * sizeof(*items)))) - die("cannot realloc %zu bytes:", itemsiz * sizeof(*items)); - } - if (line[len - 1] == '\n') - line[len - 1] = '\0'; - if (!(items[i].text = strdup(line))) - die("strdup:"); - - items[i].out = 0; - } - free(line); - if (items) - items[i].text = NULL; - lines = MIN(lines, i); -} - -static void -run(void) -{ - XEvent ev; - - while (!XNextEvent(dpy, &ev)) { - if (XFilterEvent(&ev, win)) - continue; - switch(ev.type) { - case DestroyNotify: - if (ev.xdestroywindow.window != win) - break; - cleanup(); - exit(1); - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); - break; - case FocusIn: - /* regrab focus from parent window */ - if (ev.xfocus.window != win) - grabfocus(); - break; - case KeyPress: - keypress(&ev.xkey); - break; - case SelectionNotify: - if (ev.xselection.property == utf8) - paste(); - break; - case VisibilityNotify: - if (ev.xvisibility.state != VisibilityUnobscured) - XRaiseWindow(dpy, win); - break; - } - } -} - -static void -setup(void) -{ - int x, y, i, j; - unsigned int du; - XSetWindowAttributes swa; - XIM xim; - Window w, dw, *dws; - XWindowAttributes wa; - XClassHint ch = {"dmenu", "dmenu"}; -#ifdef XINERAMA - XineramaScreenInfo *info; - Window pw; - int a, di, n, area = 0; -#endif - /* init appearance */ - for (j = 0; j < SchemeLast; j++) - scheme[j] = drw_scm_create(drw, colors[j], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - - /* calculate menu geometry */ - bh = drw->fonts->h + 2; - lines = MAX(lines, 0); - mh = (lines + 1) * bh; -#ifdef XINERAMA - i = 0; - if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { - XGetInputFocus(dpy, &w, &di); - if (mon >= 0 && mon < n) - i = mon; - else if (w != root && w != PointerRoot && w != None) { - /* find top-level window containing current input focus */ - do { - if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) - XFree(dws); - } while (w != root && w != pw); - /* find xinerama screen with which the window intersects most */ - if (XGetWindowAttributes(dpy, pw, &wa)) - for (j = 0; j < n; j++) - if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { - area = a; - i = j; - } - } - /* no focused window is on screen, so use pointer location instead */ - if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) - for (i = 0; i < n; i++) - if (INTERSECT(x, y, 1, 1, info[i]) != 0) - break; - - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; - } - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = mw / 3; /* input width: ~33% of monitor width */ - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, root, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); - XSetClassHint(dpy, win, &ch); - - - /* input methods */ - if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) - die("XOpenIM failed: could not open input device"); - - xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, win, XNFocusWindow, win, NULL); - - XMapRaised(dpy, win); - if (embed) { - XReparentWindow(dpy, win, parentwin, x, y); - XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); - if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { - for (i = 0; i < du && dws[i] != win; ++i) - XSelectInput(dpy, dws[i], FocusChangeMask); - XFree(dws); - } - grabfocus(); - } - drw_resize(drw, mw, mh); - drawmenu(); -} - -static void -usage(void) -{ - die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); -} - -int -main(int argc, char *argv[]) -{ - XWindowAttributes wa; - int i, fast = 0; - - for (i = 1; i < argc; i++) - /* these options take no arguments */ - if (!strcmp(argv[i], "-v")) { /* prints version information */ - puts("dmenu-"VERSION); - exit(0); - } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; - } else if (i + 1 == argc) - usage(); - /* these options take one argument */ - else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ - lines = atoi(argv[++i]); - else if (!strcmp(argv[i], "-m")) - mon = atoi(argv[++i]); - else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ - prompt = argv[++i]; - else if (!strcmp(argv[i], "-fn")) /* font or font set */ - fonts[0] = argv[++i]; - else if (!strcmp(argv[i], "-nb")) /* normal background color */ - colors[SchemeNorm][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ - colors[SchemeNorm][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-sb")) /* selected background color */ - colors[SchemeSel][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ - colors[SchemeSel][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-w")) /* embedding window id */ - embed = argv[++i]; - else - usage(); - - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("cannot open display"); - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - if (!embed || !(parentwin = strtol(embed, NULL, 0))) - parentwin = root; - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - drw = drw_create(dpy, screen, root, wa.width, wa.height); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - -#ifdef __OpenBSD__ - if (pledge("stdio rpath", NULL) == -1) - die("pledge"); -#endif - - if (fast && !isatty(0)) { - grabkeyboard(); - readstdin(); - } else { - readstdin(); - grabkeyboard(); - } - setup(); - run(); - - return 1; /* unreachable */ -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu.o b/hosts/vali/mars/dwm/dmenu-5.3/dmenu.o deleted file mode 100644 index 75e7e0be9078e3e3c70141fc419ae6da5255619b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32384 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 diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_path b/hosts/vali/mars/dwm/dmenu-5.3/dmenu_path deleted file mode 100755 index 3a7cda7..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_path +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" -cache="$cachedir/dmenu_run" - -[ ! -e "$cachedir" ] && mkdir -p "$cachedir" - -IFS=: -if stest -dqr -n "$cache" $PATH; then - stest -flx $PATH | sort -u | tee "$cache" -else - cat "$cache" -fi diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_run b/hosts/vali/mars/dwm/dmenu-5.3/dmenu_run deleted file mode 100755 index 834ede5..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/hosts/vali/mars/dwm/dmenu-5.3/drw.c b/hosts/vali/mars/dwm/dmenu-5.3/drw.c deleted file mode 100644 index 78a2b27..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/drw.c +++ /dev/null @@ -1,451 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - int ty, ellipsis_x = 0; - unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len, hash, h0, h1; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0, overflow = 0; - /* keep track of a couple codepoints for which we have no match. */ - static unsigned int nomatches[128], ellipsis_width; - - if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) - return 0; - - if (!render) { - w = invert ? invert : ~invert; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - if (!ellipsis_width && render) - ellipsis_width = drw_fontset_getwidth(drw, "..."); - while (1) { - ew = ellipsis_len = utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); - if (ew + ellipsis_width <= w) { - /* keep track where the ellipsis still fits */ - ellipsis_x = x + ew; - ellipsis_w = w - ew; - ellipsis_len = utf8strlen; - } - - if (ew + tmpw > w) { - overflow = 1; - /* called from drw_fontset_getwidth_clamp(): - * it wants the width AFTER the overflow - */ - if (!render) - x += tmpw; - else - utf8strlen = ellipsis_len; - } else if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - ew += tmpw; - } else { - nextfont = curfont; - } - break; - } - } - - if (overflow || !charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); - } - x += ew; - w -= ew; - } - if (render && overflow) - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); - - if (!*text || overflow) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - hash = (unsigned int)utf8codepoint; - hash = ((hash >> 16) ^ hash) * 0x21F0AAAD; - hash = ((hash >> 15) ^ hash) * 0xD35A2D97; - h0 = ((hash >> 15) ^ hash) % LENGTH(nomatches); - h1 = (hash >> 17) % LENGTH(nomatches); - /* avoid expensive XftFontMatch call when we know we won't find a match */ - if (nomatches[h0] == utf8codepoint || nomatches[h1] == utf8codepoint) - goto no_match; - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - nomatches[nomatches[h0] ? h1 : h0] = utf8codepoint; -no_match: - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -unsigned int -drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) -{ - unsigned int tmp = 0; - if (drw && drw->fonts && text && n) - tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); - return MIN(n, tmp); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/drw.h b/hosts/vali/mars/dwm/dmenu-5.3/drw.h deleted file mode 100644 index fd7631b..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/drw.h +++ /dev/null @@ -1,58 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/hosts/vali/mars/dwm/dmenu-5.3/drw.o b/hosts/vali/mars/dwm/dmenu-5.3/drw.o deleted file mode 100644 index 05bf8b656009a325422f7ddbb5b29a69d329acbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11160 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 diff --git a/hosts/vali/mars/dwm/dmenu-5.3/shell.nix b/hosts/vali/mars/dwm/dmenu-5.3/shell.nix deleted file mode 100644 index 883e00e..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/shell.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ pkgs ? import {} }: - pkgs.mkShell { - nativeBuildInputs = with pkgs; [ - gnumake - xorg.libX11.dev - xorg.libXft - xorg.libXinerama - ]; -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest b/hosts/vali/mars/dwm/dmenu-5.3/stest deleted file mode 100755 index fe4502343d6b4550687dc5874e7330606ff82269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16576 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 ZLS@1GmC=-dr5ZpTa8SD$%tH|9`T_rqok#!x diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest.1 b/hosts/vali/mars/dwm/dmenu-5.3/stest.1 deleted file mode 100644 index 2667d8a..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/stest.1 +++ /dev/null @@ -1,90 +0,0 @@ -.TH STEST 1 dmenu\-VERSION -.SH NAME -stest \- filter a list of files by properties -.SH SYNOPSIS -.B stest -.RB [ -abcdefghlpqrsuwx ] -.RB [ -n -.IR file ] -.RB [ -o -.IR file ] -.RI [ file ...] -.SH DESCRIPTION -.B stest -takes a list of files and filters by the files' properties, analogous to -.IR test (1). -Files which pass all tests are printed to stdout. If no files are given, stest -reads files from stdin. -.SH OPTIONS -.TP -.B \-a -Test hidden files. -.TP -.B \-b -Test that files are block specials. -.TP -.B \-c -Test that files are character specials. -.TP -.B \-d -Test that files are directories. -.TP -.B \-e -Test that files exist. -.TP -.B \-f -Test that files are regular files. -.TP -.B \-g -Test that files have their set-group-ID flag set. -.TP -.B \-h -Test that files are symbolic links. -.TP -.B \-l -Test the contents of a directory given as an argument. -.TP -.BI \-n " file" -Test that files are newer than -.IR file . -.TP -.BI \-o " file" -Test that files are older than -.IR file . -.TP -.B \-p -Test that files are named pipes. -.TP -.B \-q -No files are printed, only the exit status is returned. -.TP -.B \-r -Test that files are readable. -.TP -.B \-s -Test that files are not empty. -.TP -.B \-u -Test that files have their set-user-ID flag set. -.TP -.B \-v -Invert the sense of tests, only failing files pass. -.TP -.B \-w -Test that files are writable. -.TP -.B \-x -Test that files are executable. -.SH EXIT STATUS -.TP -.B 0 -At least one file passed all tests. -.TP -.B 1 -No files passed all tests. -.TP -.B 2 -An error occurred. -.SH SEE ALSO -.IR dmenu (1), -.IR test (1) diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest.c b/hosts/vali/mars/dwm/dmenu-5.3/stest.c deleted file mode 100644 index e27d3a5..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/stest.c +++ /dev/null @@ -1,109 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include - -#include -#include -#include -#include -#include -#include - -#include "arg.h" -char *argv0; - -#define FLAG(x) (flag[(x)-'a']) - -static void test(const char *, const char *); -static void usage(void); - -static int match = 0; -static int flag[26]; -static struct stat old, new; - -static void -test(const char *path, const char *name) -{ - struct stat st, ln; - - if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */ - && (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */ - && (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */ - && (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */ - && (!FLAG('e') || access(path, F_OK) == 0) /* exists */ - && (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */ - && (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */ - && (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */ - && (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */ - && (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */ - && (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */ - && (!FLAG('r') || access(path, R_OK) == 0) /* readable */ - && (!FLAG('s') || st.st_size > 0) /* not empty */ - && (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */ - && (!FLAG('w') || access(path, W_OK) == 0) /* writable */ - && (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */ - if (FLAG('q')) - exit(0); - match = 1; - puts(name); - } -} - -static void -usage(void) -{ - fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] " - "[-n file] [-o file] [file...]\n", argv0); - exit(2); /* like test(1) return > 1 on error */ -} - -int -main(int argc, char *argv[]) -{ - struct dirent *d; - char path[PATH_MAX], *line = NULL, *file; - size_t linesiz = 0; - ssize_t n; - DIR *dir; - int r; - - ARGBEGIN { - case 'n': /* newer than file */ - case 'o': /* older than file */ - file = EARGF(usage()); - if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old)))) - perror(file); - break; - default: - /* miscellaneous operators */ - if (strchr("abcdefghlpqrsuvwx", ARGC())) - FLAG(ARGC()) = 1; - else - usage(); /* unknown flag */ - } ARGEND; - - if (!argc) { - /* read list from stdin */ - while ((n = getline(&line, &linesiz, stdin)) > 0) { - if (line[n - 1] == '\n') - line[n - 1] = '\0'; - test(line, line); - } - free(line); - } else { - for (; argc; argc--, argv++) { - if (FLAG('l') && (dir = opendir(*argv))) { - /* test directory contents */ - while ((d = readdir(dir))) { - r = snprintf(path, sizeof path, "%s/%s", - *argv, d->d_name); - if (r >= 0 && (size_t)r < sizeof path) - test(path, d->d_name); - } - closedir(dir); - } else { - test(*argv, *argv); - } - } - } - return match ? 0 : 1; -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest.o b/hosts/vali/mars/dwm/dmenu-5.3/stest.o deleted file mode 100644 index 27f2c5e6b523acec7972def72b6187b996e7bee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5328 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 diff --git a/hosts/vali/mars/dwm/dmenu-5.3/util.c b/hosts/vali/mars/dwm/dmenu-5.3/util.c deleted file mode 100644 index 96b82c9..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/util.c +++ /dev/null @@ -1,36 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void -die(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/util.h b/hosts/vali/mars/dwm/dmenu-5.3/util.h deleted file mode 100644 index c0a50d4..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/util.h +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) -#define LENGTH(X) (sizeof (X) / sizeof (X)[0]) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/hosts/vali/mars/dwm/dmenu-5.3/util.o b/hosts/vali/mars/dwm/dmenu-5.3/util.o deleted file mode 100644 index 4b569ab3cf3d20cbdf0c56dd2448b4cd6d4ad19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmb<-^>JfjWMqH=Mg}_u1P><4z~I4(U^{@B4h(z@ybPhi9-Y5E8sFStU|{g*EK$+$ z=nPRY@aXhWvGD11QE~9;^ilC>IZ$HGuj!%^z_00}lEAMSqEf)GIY*^|fq{WvbBW3X zFug`)0hr#RvH?u*Q8~cCz>wn6&7!ISHrz!;!tj7cw=T$bkIsi4owq!CTU0(UFfi<6 zVqjo6&Z5ErQrBI};L+)#!r{^DqM~rzMTNxxB--hsBJcvFv%#97M9rh~K7>=l{NJin z+@rgcVZQj1q)av7)*L}9`wk2qCElyODu`L6Cug zK>$@Ln5T|ITn~phD9o{$?7I4BLV zBZ==q5(mW*O#OKzaZnnAiC;q!2PJu!_%kGNWc8qI2a*EW%Z+63H;^C$12~<7(g4gH zR#3uXU|;~{RAwagJWz3vIUo#E56UATqd@9G7{mr)NZA812P6)Q9|pbR%G{E~BnG|W zk|GG50b>=V<|OKsq*jzL=%plbdHE%& zdhULqy2T}l$=OhTdS0nsK~a7|YEelggC5wx)QtGFqQu-(kgF)iApe4b0u;B%rosFx z3X(*UK;tqB7p03~4d!)TDdL2OWA4^;xDVnKoo3=G0x z9)f@hgZ&H=^@Q3FVk6@Mm_lShENUYe7#KkL50oa6mBRF+y9?bvg-|om^)G -© 2006-2009 Jukka Salmi -© 2006-2007 Sander van Dijk -© 2007-2011 Peter Hartlich -© 2007-2009 Szabolcs Nagy -© 2007-2009 Christof Musik -© 2007-2009 Premysl Hruby -© 2007-2008 Enno Gottox Boland -© 2008 Martin Hurton -© 2008 Neale Pickett -© 2009 Mate Nagy -© 2010-2016 Hiltjo Posthuma -© 2010-2012 Connor Lane Smith -© 2011 Christoph Lohmann <20h@r-36.net> -© 2015-2016 Quentin Rameau -© 2015-2016 Eric Pruitt -© 2016-2017 Markus Teich -© 2020-2022 Chris Down - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/hosts/vali/mars/dwm/dwm-6.5/Makefile b/hosts/vali/mars/dwm/dwm-6.5/Makefile deleted file mode 100644 index ffa69b4..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# dwm - dynamic window manager -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dwm.c util.c -OBJ = ${SRC:.c=.o} - -all: dwm - -.c.o: - ${CC} -c ${CFLAGS} $< - -${OBJ}: config.h config.mk - -config.h: - cp config.def.h $@ - -dwm: ${OBJ} - ${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz - -dist: clean - mkdir -p dwm-${VERSION} - cp -R LICENSE Makefile README config.def.h config.mk\ - dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} - tar -cf dwm-${VERSION}.tar dwm-${VERSION} - gzip dwm-${VERSION}.tar - rm -rf dwm-${VERSION} - -install: all - mkdir -p ${DESTDIR}${PREFIX}/bin - cp -f dwm ${DESTDIR}${PREFIX}/bin - chmod 755 ${DESTDIR}${PREFIX}/bin/dwm - mkdir -p ${DESTDIR}${MANPREFIX}/man1 - sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 - chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/dwm\ - ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -.PHONY: all clean dist install uninstall diff --git a/hosts/vali/mars/dwm/dwm-6.5/README b/hosts/vali/mars/dwm/dwm-6.5/README deleted file mode 100644 index 95d4fd0..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/README +++ /dev/null @@ -1,48 +0,0 @@ -dwm - dynamic window manager -============================ -dwm is an extremely fast, small, and dynamic window manager for X. - - -Requirements ------------- -In order to build dwm you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dwm is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dwm (if -necessary as root): - - make clean install - - -Running dwm ------------ -Add the following line to your .xinitrc to start dwm using startx: - - exec dwm - -In order to connect dwm to a specific display, make sure that -the DISPLAY environment variable is set correctly, e.g.: - - DISPLAY=foo.bar:1 exec dwm - -(This will start dwm on display :1 of the host foo.bar.) - -In order to display status info in the bar, you can do something -like this in your .xinitrc: - - while xsetroot -name "`date` `uptime | sed 's/.*,//'`" - do - sleep 1 - done & - exec dwm - - -Configuration -------------- -The configuration of dwm is done by creating a custom config.h -and (re)compiling the source code. diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.def.h b/hosts/vali/mars/dwm/dwm-6.5/config.def.h deleted file mode 100644 index aabd622..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/config.def.h +++ /dev/null @@ -1,123 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ -static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -}; - -/* key definitions */ -#define MODKEY Mod1Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, - { MODKEY, XK_s, scratchpad_show, {.i = 1} }, - { MODKEY, XK_y, scratchpad_show, {.i = 2} }, - { MODKEY, XK_u, scratchpad_show, {.i = 3} }, - { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.i = 1} }, - { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} }, - { MODKEY|ShiftMask, XK_u, scratchpad_hide, {.i = 3} }, - { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static const Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.h b/hosts/vali/mars/dwm/dwm-6.5/config.h deleted file mode 100644 index 1e4f2b6..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/config.h +++ /dev/null @@ -1,128 +0,0 @@ - - -/* appearance */ -static const unsigned int borderpx = 4; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 0; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#282828"; -static const char col_gray2[] = "#98971a"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#928374"; -static const char col_cyan[] = "#BD93BD"; -static const char col_sel[] = "#d79921"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray2, col_gray1, col_gray4 }, - [SchemeSel] = { col_gray2, col_gray1, col_sel }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ -static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -}; - -/* key definitions */ -#define MODKEY Mod4Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "rofi", "-show", "drun", NULL }; -static const char *termcmd[] = { "kitty", NULL }; -static const char *browsercmd[] = { "tor-browser", NULL }; -static const char *filebrowsercmd[] = { "pcmanfm", NULL }; -static const char *spkeepassxc[] = { "keepassxc", NULL }; - -static const Key keys[] = { -/* modifier key function argument */ - { MODKEY, XK_d, spawn, {.v = dmenucmd } }, - { MODKEY, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, spawn, {.v = browsercmd } }, - { MODKEY, XK_e, spawn, {.v = filebrowsercmd } }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY|ShiftMask, XK_i, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY|ShiftMask, XK_h, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_l, tagmon, {.i = -1 } }, - { MODKEY, XK_j, focusmon, {.i = -1 } }, - { MODKEY, XK_k, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_q, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY|ShiftMask, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_space, togglefullscr, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_s, scratchpad_show, {.i = 1} }, - { MODKEY, XK_y, scratchpad_show, {.i = 2} }, - { MODKEY, XK_p, scratchpad_show, {.i = 3} }, - { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.i = 1} }, - { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} }, - { MODKEY|ShiftMask, XK_p, scratchpad_hide, {.i = 3} }, - { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_e, quit, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static const Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.mk b/hosts/vali/mars/dwm/dwm-6.5/config.mk deleted file mode 100644 index 8efca9a..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/config.mk +++ /dev/null @@ -1,39 +0,0 @@ -# dwm version -VERSION = 6.5 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = ${X11INC}/freetype2 -#MANPREFIX = ${PREFIX}/man - -# includes and libs -INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} -CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} -LDFLAGS = ${LIBS} - -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} - -# compiler and linker -CC = cc diff --git a/hosts/vali/mars/dwm/dwm-6.5/drw.c b/hosts/vali/mars/dwm/dwm-6.5/drw.c deleted file mode 100644 index a58a2b4..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/drw.c +++ /dev/null @@ -1,450 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - int i, ty, ellipsis_x = 0; - unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0, overflow = 0; - /* keep track of a couple codepoints for which we have no match. */ - enum { nomatches_len = 64 }; - static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; - static unsigned int ellipsis_width = 0; - - if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) - return 0; - - if (!render) { - w = invert ? invert : ~invert; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - if (!ellipsis_width && render) - ellipsis_width = drw_fontset_getwidth(drw, "..."); - while (1) { - ew = ellipsis_len = utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); - if (ew + ellipsis_width <= w) { - /* keep track where the ellipsis still fits */ - ellipsis_x = x + ew; - ellipsis_w = w - ew; - ellipsis_len = utf8strlen; - } - - if (ew + tmpw > w) { - overflow = 1; - /* called from drw_fontset_getwidth_clamp(): - * it wants the width AFTER the overflow - */ - if (!render) - x += tmpw; - else - utf8strlen = ellipsis_len; - } else if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - ew += tmpw; - } else { - nextfont = curfont; - } - break; - } - } - - if (overflow || !charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); - } - x += ew; - w -= ew; - } - if (render && overflow) - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); - - if (!*text || overflow) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - for (i = 0; i < nomatches_len; ++i) { - /* avoid calling XftFontMatch if we know we won't find a match */ - if (utf8codepoint == nomatches.codepoint[i]) - goto no_match; - } - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; -no_match: - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -unsigned int -drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) -{ - unsigned int tmp = 0; - if (drw && drw->fonts && text && n) - tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); - return MIN(n, tmp); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/drw.h b/hosts/vali/mars/dwm/dwm-6.5/drw.h deleted file mode 100644 index 6471431..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/drw.h +++ /dev/null @@ -1,58 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/hosts/vali/mars/dwm/dwm-6.5/drw.o b/hosts/vali/mars/dwm/dwm-6.5/drw.o deleted file mode 100644 index 05c8f4bcf9b50e8bbf99e044134728ba7fba5051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11144 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 YXc!5z7seOFq2KW>L 31 ? -1 : 1]; }; -+struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; - - /* function implementations */ - void -@@ -309,7 +322,9 @@ applyrules(Client *c) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); -+ if(c->tags != SCRATCHPAD_MASK_1 && c->tags != SCRATCHPAD_MASK_2 && c->tags != SCRATCHPAD_MASK_3) { - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -+ } - } - - int -@@ -1412,6 +1427,124 @@ scan(void) - } - } - -+static void scratchpad_hide(const Arg *arg) { -+ if(scratchpad_hide_flag < 4) { -+ if(arg->i == 1) { -+ if(selmon->sel) { -+ selmon->sel->tags = SCRATCHPAD_MASK_1; -+ selmon->sel->isfloating = 1; -+ focus(NULL); -+ arrange(selmon); -+ scratchpad_hide_flag++; -+ } -+ } -+ else if(arg->i == 2) { -+ if(selmon->sel) { -+ selmon->sel->tags = SCRATCHPAD_MASK_2; -+ selmon->sel->isfloating = 1; -+ focus(NULL); -+ arrange(selmon); -+ scratchpad_hide_flag++; -+ } -+ } -+ else if(arg->i == 3) { -+ if(selmon->sel) { -+ selmon->sel->tags = SCRATCHPAD_MASK_3; -+ selmon->sel->isfloating = 1; -+ focus(NULL); -+ arrange(selmon); -+ scratchpad_hide_flag++; -+ } -+ } -+ } -+} -+ -+static void scratchpad_remove() { -+ if(selmon->sel && (scratchpad_last_showed_1 != NULL || scratchpad_last_showed_2 != NULL ||scratchpad_last_showed_3 != NULL) && (selmon->sel == scratchpad_last_showed_1 || selmon->sel == scratchpad_last_showed_2 || selmon->sel == scratchpad_last_showed_3)) { -+ if(scratchpad_last_showed_1 == selmon->sel) { -+ scratchpad_last_showed_1 = NULL; -+ scratchpad_hide_flag--; -+ } -+ else if(scratchpad_last_showed_2 == selmon->sel) { -+ scratchpad_last_showed_2 = NULL; -+ scratchpad_hide_flag--; -+ } -+ else if(scratchpad_last_showed_3 == selmon->sel) { -+ scratchpad_last_showed_3 = NULL; -+ scratchpad_hide_flag--; -+ } -+ } -+} -+ -+static void scratchpad_show(const Arg *arg) { -+ if(arg->i == 1) { -+ if(scratchpad_last_showed_1 == NULL) { -+ scratchpad_show_first(arg->i); -+ } -+ else { -+ if(scratchpad_last_showed_1->tags != SCRATCHPAD_MASK_1) { -+ scratchpad_last_showed_1->tags = SCRATCHPAD_MASK_1; -+ focus(NULL); -+ arrange(selmon); -+ } -+ else { -+ scratchpad_show_first(arg->i); -+ } -+ } -+ } -+ else if(arg->i == 2) { -+ if(scratchpad_last_showed_2 == NULL) { -+ scratchpad_show_first(arg->i); -+ } -+ else { -+ if(scratchpad_last_showed_2->tags != SCRATCHPAD_MASK_2) { -+ scratchpad_last_showed_2->tags = SCRATCHPAD_MASK_2; -+ focus(NULL); -+ arrange(selmon); -+ } -+ else { -+ scratchpad_show_first(arg->i); -+ } -+ } -+ } -+ else if(arg->i == 3) { -+ if(scratchpad_last_showed_3 == NULL) { -+ scratchpad_show_first(arg->i); -+ } -+ else { -+ if(scratchpad_last_showed_3->tags != SCRATCHPAD_MASK_3) { -+ scratchpad_last_showed_3->tags = SCRATCHPAD_MASK_3; -+ focus(NULL); -+ arrange(selmon); -+ } -+ else { -+ scratchpad_show_first(arg->i); -+ } -+ } -+ } -+} -+ -+static void scratchpad_show_client(Client *c) { -+ c->tags = selmon->tagset[selmon->seltags]; -+ focus(c); -+ arrange(selmon); -+} -+ -+static void scratchpad_show_first(int scratchNum) { -+ for(Client *c = selmon->clients; c !=NULL; c = c->next) { -+ if(c->tags == SCRATCHPAD_MASK_1 && scratchNum == 1) { -+ scratchpad_last_showed_1 = c; -+ scratchpad_show_client(c); -+ } else if(c->tags == SCRATCHPAD_MASK_2 && scratchNum == 2) { -+ scratchpad_last_showed_2 = c; -+ scratchpad_show_client(c); -+ } else if(c->tags == SCRATCHPAD_MASK_3 && scratchNum == 3) { -+ scratchpad_last_showed_3 = c; -+ scratchpad_show_client(c); -+ } -+ } -+} -+ - void - sendmon(Client *c, Monitor *m) - { -@@ -1785,6 +1918,16 @@ unmanage(Client *c, int destroyed) - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -+ if(scratchpad_last_showed_1 == c) { -+ scratchpad_last_showed_1 = NULL; -+ } -+ if(scratchpad_last_showed_2 == c) { -+ scratchpad_last_showed_2 = NULL; -+ } -+ if(scratchpad_last_showed_3 == c) { -+ scratchpad_last_showed_3 = NULL; -+ } -+ - free(c); - focus(NULL); - updateclientlist(); diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff b/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff deleted file mode 100644 index cb218b6..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff +++ /dev/null @@ -1,105 +0,0 @@ -From b9f3c11c3150f0b5d5b297a4eeeb2012764c98f5 Mon Sep 17 00:00:00 2001 -From: visil -Date: Thu, 21 Mar 2024 15:16:39 +0300 -Subject: [PATCH] Patch updated to 6.5 - ---- - config.def.h | 3 +++ - dwm.c | 34 ++++++++++++++++++++++++++++++++++ - 2 files changed, 37 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 9efa774..0b8b310 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -59,11 +59,14 @@ static const Layout layouts[] = { - static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ - static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; - static const char *termcmd[] = { "st", NULL }; -+static const char scratchpadname[] = "scratchpad"; -+static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL }; - - static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, -+ { MODKEY, XK_grave, togglescratch, {.v = scratchpadcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, -diff --git a/dwm.c b/dwm.c -index f1d86b2..a8db21a 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -211,6 +211,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); -+static void togglescratch(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unfocus(Client *c, int setfocus); -@@ -271,6 +272,8 @@ static Window root, wmcheckwin; - /* configuration, allows nested code to access above variables */ - #include "config.h" - -+static unsigned int scratchtag = 1 << LENGTH(tags); -+ - /* compile-time check if all tags fit into an unsigned int bit array. */ - struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -@@ -1061,6 +1064,14 @@ manage(Window w, XWindowAttributes *wa) - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; - -+ selmon->tagset[selmon->seltags] &= ~scratchtag; -+ if (!strcmp(c->name, scratchpadname)) { -+ c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag; -+ c->isfloating = True; -+ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); -+ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); -+ } -+ - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); -@@ -1651,6 +1662,7 @@ spawn(const Arg *arg) - - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; -+ selmon->tagset[selmon->seltags] &= ~scratchtag; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); -@@ -1735,6 +1747,28 @@ togglefloating(const Arg *arg) - arrange(selmon); - } - -+void -+togglescratch(const Arg *arg) -+{ -+ Client *c; -+ unsigned int found = 0; -+ -+ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); -+ if (found) { -+ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; -+ if (newtagset) { -+ selmon->tagset[selmon->seltags] = newtagset; -+ focus(NULL); -+ arrange(selmon); -+ } -+ if (ISVISIBLE(c)) { -+ focus(c); -+ restack(selmon); -+ } -+ } else -+ spawn(arg); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.44.0 - diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.1 b/hosts/vali/mars/dwm/dwm-6.5/dwm.1 deleted file mode 100644 index 38531ea..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.1 +++ /dev/null @@ -1,179 +0,0 @@ -.TH DWM 1 dwm\-VERSION -.SH NAME -dwm \- dynamic window manager -.SH SYNOPSIS -.B dwm -.RB [ \-v ] -.SH DESCRIPTION -dwm is a dynamic window manager for X. It manages windows in tiled, monocle -and floating layouts. Either layout can be applied dynamically, optimising the -environment for the application in use and the task performed. -.P -In tiled layouts windows are managed in a master and stacking area. The master -area on the left contains one window by default, and the stacking area on the -right contains all other windows. The number of master area windows can be -adjusted from zero to an arbitrary number. In monocle layout all windows are -maximised to the screen size. In floating layout windows can be resized and -moved freely. Dialog windows are always managed floating, regardless of the -layout applied. -.P -Windows are grouped by tags. Each window can be tagged with one or multiple -tags. Selecting certain tags displays all windows with these tags. -.P -Each screen contains a small status bar which displays all available tags, the -layout, the title of the focused window, and the text read from the root window -name property, if the screen is focused. A floating window is indicated with an -empty square and a maximised floating window is indicated with a filled square -before the windows title. The selected tags are indicated with a different -color. The tags of the focused window are indicated with a filled square in the -top left corner. The tags which are applied to one or more windows are -indicated with an empty square in the top left corner. -.P -dwm draws a small border around windows to indicate the focus state. -.SH OPTIONS -.TP -.B \-v -prints version information to stderr, then exits. -.SH USAGE -.SS Status bar -.TP -.B X root window name -is read and displayed in the status text area. It can be set with the -.BR xsetroot (1) -command. -.TP -.B Button1 -click on a tag label to display all windows with that tag, click on the layout -label toggles between tiled and floating layout. -.TP -.B Button3 -click on a tag label adds/removes all windows with that tag to/from the view. -.TP -.B Mod1\-Button1 -click on a tag label applies that tag to the focused window. -.TP -.B Mod1\-Button3 -click on a tag label adds/removes that tag to/from the focused window. -.SS Keyboard commands -.TP -.B Mod1\-Shift\-Return -Start -.BR st(1). -.TP -.B Mod1\-p -Spawn -.BR dmenu(1) -for launching other programs. -.TP -.B Mod1\-, -Focus previous screen, if any. -.TP -.B Mod1\-. -Focus next screen, if any. -.TP -.B Mod1\-Shift\-, -Send focused window to previous screen, if any. -.TP -.B Mod1\-Shift\-. -Send focused window to next screen, if any. -.TP -.B Mod1\-b -Toggles bar on and off. -.TP -.B Mod1\-t -Sets tiled layout. -.TP -.B Mod1\-f -Sets floating layout. -.TP -.B Mod1\-m -Sets monocle layout. -.TP -.B Mod1\-space -Toggles between current and previous layout. -.TP -.B Mod1\-j -Focus next window. -.TP -.B Mod1\-k -Focus previous window. -.TP -.B Mod1\-i -Increase number of windows in master area. -.TP -.B Mod1\-d -Decrease number of windows in master area. -.TP -.B Mod1\-l -Increase master area size. -.TP -.B Mod1\-h -Decrease master area size. -.TP -.B Mod1\-Return -Zooms/cycles focused window to/from master area (tiled layouts only). -.TP -.B Mod1\-Shift\-c -Close focused window. -.TP -.B Mod1\-Shift\-space -Toggle fullscreen for focused window. -.TP -.B Mod1\-Shift\-space -Toggle focused window between tiled and floating state. -.TP -.B Mod1\-Tab -Toggles to the previously selected tags. -.TP -.B Mod1\-Shift\-[1..n] -Apply nth tag to focused window. -.TP -.B Mod1\-Shift\-0 -Apply all tags to focused window. -.TP -.B Mod1\-Control\-Shift\-[1..n] -Add/remove nth tag to/from focused window. -.TP -.B Mod1\-[1..n] -View all windows with nth tag. -.TP -.B Mod1\-0 -View all windows with any tag. -.TP -.B Mod1\-Control\-[1..n] -Add/remove all windows with nth tag to/from the view. -.TP -.B Mod1\-Shift\-q -Quit dwm. -.SS Mouse commands -.TP -.B Mod1\-Button1 -Move focused window while dragging. Tiled windows will be toggled to the floating state. -.TP -.B Mod1\-Button2 -Toggles focused window between floating and tiled state. -.TP -.B Mod1\-Button3 -Resize focused window while dragging. Tiled windows will be toggled to the floating state. -.SH CUSTOMIZATION -dwm is customized by creating a custom config.h and (re)compiling the source -code. This keeps it fast, secure and simple. -.SH SEE ALSO -.BR dmenu (1), -.BR st (1) -.SH ISSUES -Java applications which use the XToolkit/XAWT backend may draw grey windows -only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early -JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds -are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the -environment variable -.BR AWT_TOOLKIT=MToolkit -(to use the older Motif backend instead) or running -.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D -or -.B wmname LG3D -(to pretend that a non-reparenting window manager is running that the -XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable -.BR _JAVA_AWT_WM_NONREPARENTING=1 . -.SH BUGS -Send all bug reports with a patch to hackers@suckless.org. diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c b/hosts/vali/mars/dwm/dwm-6.5/dwm.c deleted file mode 100644 index f7e94b6..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.c +++ /dev/null @@ -1,2319 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -static void expose(XEvent *e); -static void focus(Client *c); -static void focusin(XEvent *e); -static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); -static Atom getatomprop(Client *c, Atom prop); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void manage(Window w, XWindowAttributes *wa); -static void mappingnotify(XEvent *e); -static void maprequest(XEvent *e); -static void monocle(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *c); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void scan(void); -static void scratchpad_hide(); -static void scratchpad_remove(); -static void scratchpad_show(); -static void scratchpad_show_client(Client *c); -static void scratchpad_show_first(int scratchNum); -static int sendevent(Client *c, Atom proto); -static void sendmon(Client *c, Monitor *m); -static void setclientstate(Client *c, long state); -static void setfocus(Client *c); -static void setfullscreen(Client *c, int fullscreen); -static void setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setup(void); -static void seturgent(Client *c, int urg); -static void showhide(Client *c); -static void spawn(const Arg *arg); -static void tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void tile(Monitor *m); -static void togglebar(const Arg *arg); -static void togglefloating(const Arg *arg); -static void togglefullscr(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static int updategeom(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatetitle(Client *c); -static void updatewindowtype(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -static int xerror(Display *dpy, XErrorEvent *ee); -static int xerrordummy(Display *dpy, XErrorEvent *ee); -static int xerrorstart(Display *dpy, XErrorEvent *ee); -static void zoom(const Arg *arg); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh; /* bar height */ -static int lrpad; /* sum of left and right padding for text */ -static int (*xerrorxlib)(Display *, XErrorEvent *); -static unsigned int numlockmask = 0; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int running = 1; -static Cur *cursor[CurLast]; -static Clr **scheme; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root, wmcheckwin; - -/* scratchpad */ -#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) -#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) -#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) -static int scratchpad_hide_flag = 0; -static Client *scratchpad_last_showed_1 = NULL; -static Client *scratchpad_last_showed_2 = NULL; -static Client *scratchpad_last_showed_3 = NULL; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - XGetClassHint(dpy, c->win, &ch); - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) - && (!r->class || strstr(class, r->class)) - && (!r->instance || strstr(instance, r->instance))) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; - } - } - if (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - if(c->tags != SCRATCHPAD_MASK_1 && c->tags != SCRATCHPAD_MASK_2 && c->tags != SCRATCHPAD_MASK_3) { - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; - } -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - if (!c->hintsvalid) - updatesizehints(c); - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + TEXTW(selmon->ltsymbol)) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - click = ClkClientWin; - } - for (i = 0; i < LENGTH(buttons); i++) - if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - free(scheme); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, w, tw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; - - if (!m->showbar) - return; - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - tw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) - return 0; - if (name.encoding == XA_STRING) { - strncpy(text, (char *)name.value, size - 1); - } else if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (!focused) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j, k; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - int start, end, skip; - KeySym *syms; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - XDisplayKeycodes(dpy, &start, &end); - syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); - if (!syms) - return; - for (k = start; k <= end; k++) - for (i = 0; i < LENGTH(keys); i++) - /* skip modifier codes, we do that ourselves */ - if (keys[i].keysym == syms[(k - start) * skip]) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, k, - keys[i].mod | modifiers[j], - root, True, - GrabModeAsync, GrabModeAsync); - XFree(syms); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - - if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) - c->x = c->mon->wx + c->mon->ww - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) - c->y = c->mon->wy + c->mon->wh - HEIGHT(c); - c->x = MAX(c->x, c->mon->wx); - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; - c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attach(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->wx - nx) < snap) - nx = selmon->wx; - else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) - ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - c->hintsvalid = 0; - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { - updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - XUngrabPointer(dpy, CurrentTime); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -static void scratchpad_hide(const Arg *arg) { - if(scratchpad_hide_flag < 4) { - if(arg->i == 1) { - if(selmon->sel) { - selmon->sel->tags = SCRATCHPAD_MASK_1; - selmon->sel->isfloating = 1; - focus(NULL); - arrange(selmon); - scratchpad_hide_flag++; - } - } - else if(arg->i == 2) { - if(selmon->sel) { - selmon->sel->tags = SCRATCHPAD_MASK_2; - selmon->sel->isfloating = 1; - focus(NULL); - arrange(selmon); - scratchpad_hide_flag++; - } - } - else if(arg->i == 3) { - if(selmon->sel) { - selmon->sel->tags = SCRATCHPAD_MASK_3; - selmon->sel->isfloating = 1; - focus(NULL); - arrange(selmon); - scratchpad_hide_flag++; - } - } - } -} - -static void scratchpad_remove() { - if(selmon->sel && (scratchpad_last_showed_1 != NULL || scratchpad_last_showed_2 != NULL ||scratchpad_last_showed_3 != NULL) && (selmon->sel == scratchpad_last_showed_1 || selmon->sel == scratchpad_last_showed_2 || selmon->sel == scratchpad_last_showed_3)) { - if(scratchpad_last_showed_1 == selmon->sel) { - scratchpad_last_showed_1 = NULL; - scratchpad_hide_flag--; - } - else if(scratchpad_last_showed_2 == selmon->sel) { - scratchpad_last_showed_2 = NULL; - scratchpad_hide_flag--; - } - else if(scratchpad_last_showed_3 == selmon->sel) { - scratchpad_last_showed_3 = NULL; - scratchpad_hide_flag--; - } - } -} - -static void scratchpad_show(const Arg *arg) { - if(arg->i == 1) { - if(scratchpad_last_showed_1 == NULL) { - scratchpad_show_first(arg->i); - } - else { - if(scratchpad_last_showed_1->tags != SCRATCHPAD_MASK_1) { - scratchpad_last_showed_1->tags = SCRATCHPAD_MASK_1; - focus(NULL); - arrange(selmon); - } - else { - scratchpad_show_first(arg->i); - } - } - } - else if(arg->i == 2) { - if(scratchpad_last_showed_2 == NULL) { - scratchpad_show_first(arg->i); - } - else { - if(scratchpad_last_showed_2->tags != SCRATCHPAD_MASK_2) { - scratchpad_last_showed_2->tags = SCRATCHPAD_MASK_2; - focus(NULL); - arrange(selmon); - } - else { - scratchpad_show_first(arg->i); - } - } - } - else if(arg->i == 3) { - if(scratchpad_last_showed_3 == NULL) { - scratchpad_show_first(arg->i); - } - else { - if(scratchpad_last_showed_3->tags != SCRATCHPAD_MASK_3) { - scratchpad_last_showed_3->tags = SCRATCHPAD_MASK_3; - focus(NULL); - arrange(selmon); - } - else { - scratchpad_show_first(arg->i); - } - } - } -} - -static void scratchpad_show_client(Client *c) { - c->tags = selmon->tagset[selmon->seltags]; - focus(c); - arrange(selmon); -} - -static void scratchpad_show_first(int scratchNum) { - for(Client *c = selmon->clients; c !=NULL; c = c->next) { - if(c->tags == SCRATCHPAD_MASK_1 && scratchNum == 1) { - scratchpad_last_showed_1 = c; - scratchpad_show_client(c); - } else if(c->tags == SCRATCHPAD_MASK_2 && scratchNum == 2) { - scratchpad_last_showed_2 = c; - scratchpad_show_client(c); - } else if(c->tags == SCRATCHPAD_MASK_3 && scratchNum == 3) { - scratchpad_last_showed_3 = c; - scratchpad_show_client(c); - } - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) -{ - float f; - - if (!arg || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; - selmon->mfact = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - struct sigaction sa; - - /* do not transform children into zombies when they terminate */ - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); - - /* clean up any zombies (inherited from .xinitrc etc) immediately */ - while (waitpid(-1, NULL, WNOHANG) > 0); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); - netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask - |ButtonPressMask|PointerMotionMask|EnterWindowMask - |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - -void -seturgent(Client *c, int urg) -{ - XWMHints *wmh; - - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -spawn(const Arg *arg) -{ - struct sigaction sa; - - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = SIG_DFL; - sigaction(SIGCHLD, &sa, NULL); - - execvp(((char **)arg->v)[0], (char **)arg->v); - die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - if (my + HEIGHT(c) < m->wh) - my += HEIGHT(c); - } else { - h = (m->wh - ty) / (n - i); - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); - if (ty + HEIGHT(c) < m->wh) - ty += HEIGHT(c); - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -togglefullscr(const Arg *arg) -{ - if(selmon->sel) - setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XSelectInput(dpy, c->win, NoEventMask); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - if(scratchpad_last_showed_1 == c) { - scratchpad_last_showed_1 = NULL; - } - if(scratchpad_last_showed_2 == c) { - scratchpad_last_showed_2 = NULL; - } - if(scratchpad_last_showed_3 == c) { - scratchpad_last_showed_3 = NULL; - } - - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - - /* new monitors if nn > n */ - for (i = n; i < nn; i++) { - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - /* removed monitors if n > nn */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - free(unique); - } else -#endif /* XINERAMA */ - { /* default monitor setup */ - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); - c->hintsvalid = 1; -} - -void -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatetitle(Client *c) -{ - if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); - if (c->name[0] == '\0') /* hack to mark broken clients */ - strcpy(c->name, broken); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) - return; - if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig deleted file mode 100644 index 7ab1910..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig +++ /dev/null @@ -1,2207 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -static void expose(XEvent *e); -static void focus(Client *c); -static void focusin(XEvent *e); -static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); -static Atom getatomprop(Client *c, Atom prop); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void manage(Window w, XWindowAttributes *wa); -static void mappingnotify(XEvent *e); -static void maprequest(XEvent *e); -static void monocle(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *c); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void scan(void); -static int sendevent(Client *c, Atom proto); -static void sendmon(Client *c, Monitor *m); -static void setclientstate(Client *c, long state); -static void setfocus(Client *c); -static void setfullscreen(Client *c, int fullscreen); -static void setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setup(void); -static void seturgent(Client *c, int urg); -static void showhide(Client *c); -static void spawn(const Arg *arg); -static void tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void tile(Monitor *m); -static void togglebar(const Arg *arg); -static void togglefloating(const Arg *arg); -static void togglefullscr(const Arg *arg); -static void togglescratch(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static int updategeom(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatetitle(Client *c); -static void updatewindowtype(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -static int xerror(Display *dpy, XErrorEvent *ee); -static int xerrordummy(Display *dpy, XErrorEvent *ee); -static int xerrorstart(Display *dpy, XErrorEvent *ee); -static void zoom(const Arg *arg); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh; /* bar height */ -static int lrpad; /* sum of left and right padding for text */ -static int (*xerrorxlib)(Display *, XErrorEvent *); -static unsigned int numlockmask = 0; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int running = 1; -static Cur *cursor[CurLast]; -static Clr **scheme; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root, wmcheckwin; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -static unsigned int scratchtag = 1 << LENGTH(tags); -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - XGetClassHint(dpy, c->win, &ch); - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) - && (!r->class || strstr(class, r->class)) - && (!r->instance || strstr(instance, r->instance))) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; - } - } - if (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - if (!c->hintsvalid) - updatesizehints(c); - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + TEXTW(selmon->ltsymbol)) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - click = ClkClientWin; - } - for (i = 0; i < LENGTH(buttons); i++) - if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - free(scheme); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, w, tw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; - - if (!m->showbar) - return; - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - tw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) - return 0; - if (name.encoding == XA_STRING) { - strncpy(text, (char *)name.value, size - 1); - } else if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (!focused) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j, k; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - int start, end, skip; - KeySym *syms; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - XDisplayKeycodes(dpy, &start, &end); - syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); - if (!syms) - return; - for (k = start; k <= end; k++) - for (i = 0; i < LENGTH(keys); i++) - /* skip modifier codes, we do that ourselves */ - if (keys[i].keysym == syms[(k - start) * skip]) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, k, - keys[i].mod | modifiers[j], - root, True, - GrabModeAsync, GrabModeAsync); - XFree(syms); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - - if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) - c->x = c->mon->wx + c->mon->ww - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) - c->y = c->mon->wy + c->mon->wh - HEIGHT(c); - c->x = MAX(c->x, c->mon->wx); - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; - - selmon->tagset[selmon->seltags] &= ~scratchtag; - if (!strcmp(c->name, scratchpadname)) { - c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag; - c->isfloating = True; - c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); - c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); - } - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; - c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attach(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->wx - nx) < snap) - nx = selmon->wx; - else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) - ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - c->hintsvalid = 0; - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { - updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - XUngrabPointer(dpy, CurrentTime); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) -{ - float f; - - if (!arg || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; - selmon->mfact = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - struct sigaction sa; - - /* do not transform children into zombies when they terminate */ - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); - - /* clean up any zombies (inherited from .xinitrc etc) immediately */ - while (waitpid(-1, NULL, WNOHANG) > 0); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); - netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask - |ButtonPressMask|PointerMotionMask|EnterWindowMask - |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - -void -seturgent(Client *c, int urg) -{ - XWMHints *wmh; - - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -spawn(const Arg *arg) -{ - struct sigaction sa; - - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - selmon->tagset[selmon->seltags] &= ~scratchtag; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = SIG_DFL; - sigaction(SIGCHLD, &sa, NULL); - - execvp(((char **)arg->v)[0], (char **)arg->v); - die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - if (my + HEIGHT(c) < m->wh) - my += HEIGHT(c); - } else { - h = (m->wh - ty) / (n - i); - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); - if (ty + HEIGHT(c) < m->wh) - ty += HEIGHT(c); - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -togglescratch(const Arg *arg) -{ - Client *c; - unsigned int found = 0; - - for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); - if (found) { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } - if (ISVISIBLE(c)) { - focus(c); - restack(selmon); - } - } else - spawn(arg); -} -void -togglefullscr(const Arg *arg) -{ - if(selmon->sel) - setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XSelectInput(dpy, c->win, NoEventMask); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - - /* new monitors if nn > n */ - for (i = n; i < nn; i++) { - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - /* removed monitors if n > nn */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - free(unique); - } else -#endif /* XINERAMA */ - { /* default monitor setup */ - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); - c->hintsvalid = 1; -} - -void -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatetitle(Client *c) -{ - if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); - if (c->name[0] == '\0') /* hack to mark broken clients */ - strcpy(c->name, broken); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) - return; - if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej deleted file mode 100644 index 10b98fd..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej +++ /dev/null @@ -1,23 +0,0 @@ ---- dwm.c -+++ dwm.c -@@ -274,11 +279,19 @@ static Drw *drw; - static Monitor *mons, *selmon; - static Window root, wmcheckwin; - -+/* scratchpad */ -+#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) -+#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) -+#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) -+static int scratchpad_hide_flag = 0; -+static Client *scratchpad_last_showed_1 = NULL; -+static Client *scratchpad_last_showed_2 = NULL; -+static Client *scratchpad_last_showed_3 = NULL; - /* configuration, allows nested code to access above variables */ - #include "config.h" - - /* compile-time check if all tags fit into an unsigned int bit array. */ --struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; -+struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; - - /* function implementations */ - void diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.o b/hosts/vali/mars/dwm/dwm-6.5/dwm.o deleted file mode 100644 index 167e75d11e0e21d9afa10ecd139c0e990adfa918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59856 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 GgeCxv)opSB diff --git a/hosts/vali/mars/dwm/dwm-6.5/shell.nix b/hosts/vali/mars/dwm/dwm-6.5/shell.nix deleted file mode 100644 index 883e00e..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/shell.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ pkgs ? import {} }: - pkgs.mkShell { - nativeBuildInputs = with pkgs; [ - gnumake - xorg.libX11.dev - xorg.libXft - xorg.libXinerama - ]; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/transient.c b/hosts/vali/mars/dwm/dwm-6.5/transient.c deleted file mode 100644 index 040adb5..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/transient.c +++ /dev/null @@ -1,42 +0,0 @@ -/* cc transient.c -o transient -lX11 */ - -#include -#include -#include -#include - -int main(void) { - Display *d; - Window r, f, t = None; - XSizeHints h; - XEvent e; - - d = XOpenDisplay(NULL); - if (!d) - exit(1); - r = DefaultRootWindow(d); - - f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0); - h.min_width = h.max_width = h.min_height = h.max_height = 400; - h.flags = PMinSize | PMaxSize; - XSetWMNormalHints(d, f, &h); - XStoreName(d, f, "floating"); - XMapWindow(d, f); - - XSelectInput(d, f, ExposureMask); - while (1) { - XNextEvent(d, &e); - - if (t == None) { - sleep(5); - t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0); - XSetTransientForHint(d, t, f); - XStoreName(d, t, "transient"); - XMapWindow(d, t); - XSelectInput(d, t, ExposureMask); - } - } - - XCloseDisplay(d); - exit(0); -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/util.c b/hosts/vali/mars/dwm/dwm-6.5/util.c deleted file mode 100644 index 96b82c9..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/util.c +++ /dev/null @@ -1,36 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void -die(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/util.h b/hosts/vali/mars/dwm/dwm-6.5/util.h deleted file mode 100644 index f633b51..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/hosts/vali/mars/dwm/dwm-6.5/util.o b/hosts/vali/mars/dwm/dwm-6.5/util.o deleted file mode 100644 index 4b569ab3cf3d20cbdf0c56dd2448b4cd6d4ad19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmb<-^>JfjWMqH=Mg}_u1P><4z~I4(U^{@B4h(z@ybPhi9-Y5E8sFStU|{g*EK$+$ z=nPRY@aXhWvGD11QE~9;^ilC>IZ$HGuj!%^z_00}lEAMSqEf)GIY*^|fq{WvbBW3X zFug`)0hr#RvH?u*Q8~cCz>wn6&7!ISHrz!;!tj7cw=T$bkIsi4owq!CTU0(UFfi<6 zVqjo6&Z5ErQrBI};L+)#!r{^DqM~rzMTNxxB--hsBJcvFv%#97M9rh~K7>=l{NJin z+@rgcVZQj1q)av7)*L}9`wk2qCElyODu`L6Cug zK>$@Ln5T|ITn~phD9o{$?7I4BLV zBZ==q5(mW*O#OKzaZnnAiC;q!2PJu!_%kGNWc8qI2a*EW%Z+63H;^C$12~<7(g4gH zR#3uXU|;~{RAwagJWz3vIUo#E56UATqd@9G7{mr)NZA812P6)Q9|pbR%G{E~BnG|W zk|GG50b>=V<|OKsq*jzL=%plbdHE%& zdhULqy2T}l$=OhTdS0nsK~a7|YEelggC5wx)QtGFqQu-(kgF)iApe4b0u;B%rosFx z3X(*UK;tqB7p03~4d!)TDdL2OWA4^;xDVnKoo3=G0x z9)f@hgZ&H=^@Q3FVk6@Mm_lShENUYe7#KkL50oa6mBRF+y9?bvg-|om^)G