Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Sravan Balaji
2022-05-21 11:42:06 -04:00
37 changed files with 1445 additions and 1022 deletions

View File

@@ -17,6 +17,7 @@ MIT/X Consortium License
© 2015-2016 Quentin Rameau <quinq@fifth.space> © 2015-2016 Quentin Rameau <quinq@fifth.space>
© 2015-2016 Eric Pruitt <eric.pruitt@gmail.com> © 2015-2016 Eric Pruitt <eric.pruitt@gmail.com>
© 2016-2017 Markus Teich <markus.teich@stusta.mhn.de> © 2016-2017 Markus Teich <markus.teich@stusta.mhn.de>
© 2020-2022 Chris Down <chris@chrisdown.name>
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),

View File

@@ -1,4 +1,4 @@
This dwm 6.2 (67d76bd, 2021-03-29) side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. Due to the complexity of some of the patches dwm-flexipatch has diverged from mainstream dwm by making some core patches non-optional for maintenance reasons. For the classic dwm-flexipatch build refer to branch [dwm-flexipatch-1.0](https://github.com/bakkeby/dwm-flexipatch/tree/dwm-flexipatch-1.0). This dwm 6.3 (8b48e30, 2022-04-26) side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. Due to the complexity of some of the patches dwm-flexipatch has diverged from mainstream dwm by making some core patches non-optional for maintenance reasons. For the classic dwm-flexipatch build refer to branch [dwm-flexipatch-1.0](https://github.com/bakkeby/dwm-flexipatch/tree/dwm-flexipatch-1.0).
For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/dwm-flexipatch/blob/master/patches.def.h): For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/dwm-flexipatch/blob/master/patches.def.h):
```c ```c
@@ -13,10 +13,16 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
If you are experiencing issues then you may want to check out the [Known Issues](https://github.com/bakkeby/dwm-flexipatch/discussions/categories/known-issues) discussion category. If you are experiencing issues then you may want to check out the [Known Issues](https://github.com/bakkeby/dwm-flexipatch/discussions/categories/known-issues) discussion category.
Browsing patches? There is a [map of patches](https://coggle.it/diagram/X9IiSSM6PTWOM9Wz) diagram which tries to organise patches into categories.
--- ---
### Changelog: ### Changelog:
2022-02-11 - Added the isfreesize version of the sizehints patch and the [tagsync](https://github.com/bakkeby/dwm-flexipatch/pull/219) patch (contributed by [Bagelli](https://github.com/Bagellll))
2021-11-23 - Added the taglabels and underlinetags patches
2021-09-08 - Added the alwayscenter patch 2021-09-08 - Added the alwayscenter patch
2021-07-27 - Added the winicon patch 2021-07-27 - Added the winicon patch
@@ -467,6 +473,9 @@ If you are experiencing issues then you may want to check out the [Known Issues]
- this patch adds key modes (like in vim or emacs) where chains of keyboard shortcuts can be - this patch adds key modes (like in vim or emacs) where chains of keyboard shortcuts can be
performed performed
- [killunsel](https://dwm.suckless.org/patches/killunsel/)
- kills all visible clients that are not selected (only the selected client will remain)
- [~leftlayout~](http://dwm.suckless.org/patches/leftlayout/) - [~leftlayout~](http://dwm.suckless.org/patches/leftlayout/)
- ~moves the layout symbol in the status bar to the left hand side~ - ~moves the layout symbol in the status bar to the left hand side~
@@ -703,6 +712,9 @@ If you are experiencing issues then you may want to check out the [Known Issues]
- [taggrid](https://dwm.suckless.org/patches/taggrid/) - [taggrid](https://dwm.suckless.org/patches/taggrid/)
- adds an option to place tags in rows like in many other window managers - adds an option to place tags in rows like in many other window managers
- [taglabels](https://dwm.suckless.org/patches/taglabels/)
- shows tag + class of master client in the tags section of the bar
- [tagmonfixfs](https://github.com/bakkeby/patches/wiki/tagmonfixfs/) - [tagmonfixfs](https://github.com/bakkeby/patches/wiki/tagmonfixfs/)
- allows moving a fullscreen window to another monitor while remaining in fullscreen - allows moving a fullscreen window to another monitor while remaining in fullscreen
@@ -741,13 +753,13 @@ If you are experiencing issues then you may want to check out the [Known Issues]
- lets you transfer all clients between the master and stack area while increasing or - lets you transfer all clients between the master and stack area while increasing or
decreasing the master area (nmaster) accordingly decreasing the master area (nmaster) accordingly
- [underlinetags](https://dwm.suckless.org/patches/underlinetags/)
- underlines the selected tag, or optionally all tags
- [unfloatvisible](https://dwm.suckless.org/patches/unfloatvisible/) - [unfloatvisible](https://dwm.suckless.org/patches/unfloatvisible/)
- resets isfloating on any visible windows that have it set and optionally also applies a - resets isfloating on any visible windows that have it set and optionally also applies a
layout layout
- [killunsel](https://dwm.suckless.org/patches/killunsel/)
- kills all visible clients that are not selected (only the selected client will remain)
- [~urgentborder~](https://dwm.suckless.org/patches/urgentborder/) - [~urgentborder~](https://dwm.suckless.org/patches/urgentborder/)
- ~this patch makes "urgent" windows have different colors~ - ~this patch makes "urgent" windows have different colors~

1061
README.org

File diff suppressed because it is too large Load Diff

View File

@@ -108,6 +108,19 @@ static const unsigned int systrayspacing = 2; /* systray spacing */
static const int showsystray = 1; /* 0 means no systray */ static const int showsystray = 1; /* 0 means no systray */
#endif // BAR_SYSTRAY_PATCH #endif // BAR_SYSTRAY_PATCH
#if BAR_TAGLABELS_PATCH
static const char ptagf[] = "[%s %s]"; /* format of a tag label */
static const char etagf[] = "[%s]"; /* format of an empty tag */
static const int lcaselbl = 0; /* 1 means make tag label lowercase */
#endif // BAR_TAGLABELS_PATCH
#if BAR_UNDERLINETAGS_PATCH
static const unsigned int ulinepad = 5; /* horizontal padding between the underline and tag */
static const unsigned int ulinestroke = 2; /* thickness / height of the underline */
static const unsigned int ulinevoffset = 0; /* how far above the bottom of the bar the line should appear */
static const int ulineall = 0; /* 1 to show underline on all tags, 0 for just the active ones */
#endif // BAR_UNDERLINETAGS_PATCH
static int tagindicatortype = INDICATOR_TOP_LEFT_SQUARE; static int tagindicatortype = INDICATOR_TOP_LEFT_SQUARE;
static int tiledindicatortype = INDICATOR_NONE; static int tiledindicatortype = INDICATOR_NONE;
static int floatindicatortype = INDICATOR_TOP_LEFT_SQUARE; static int floatindicatortype = INDICATOR_TOP_LEFT_SQUARE;
@@ -118,7 +131,7 @@ static int floatfakefsindicatortype = INDICATOR_PLUS_AND_LARGER_SQUARE;
#endif // FAKEFULLSCREEN_CLIENT_PATCH #endif // FAKEFULLSCREEN_CLIENT_PATCH
#if ONLYQUITONEMPTY_PATCH #if ONLYQUITONEMPTY_PATCH
static const int quit_empty_window_count = 2; /* only allow dwm to quit if no windows are open, value here represents number of deamons */ static const int quit_empty_window_count = 0; /* only allow dwm to quit if no (<= count) windows are open */
#endif // ONLYQUITONEMPTY_PATCH #endif // ONLYQUITONEMPTY_PATCH
#if BAR_EXTRASTATUS_PATCH #if BAR_EXTRASTATUS_PATCH
@@ -143,9 +156,6 @@ static const char dmenufont[] = "monospace:size=10";
static char c000000[] = "#000000"; // placeholder value static char c000000[] = "#000000"; // placeholder value
#if BAR_FLEXWINTITLE_PATCH
#endif // BAR_FLEXWINTITLE_PATCH
static char normfgcolor[] = "#F8F8F2"; static char normfgcolor[] = "#F8F8F2";
static char normbgcolor[] = "#282A36"; static char normbgcolor[] = "#282A36";
static char normbordercolor[] = "#4D4D4D"; static char normbordercolor[] = "#4D4D4D";
@@ -453,80 +463,82 @@ static const Inset default_inset = {
#endif // INSETS_PATCH #endif // INSETS_PATCH
static const BarRule barrules[] = { static const BarRule barrules[] = {
/* monitor bar alignment widthfunc drawfunc clickfunc name */ /* monitor bar alignment widthfunc drawfunc clickfunc name */
{ -2 }, #if BAR_STATUSBUTTON_PATCH
#if BAR_STATUSBUTTON_PATCH { -1, 0, BAR_ALIGN_LEFT, width_stbutton, draw_stbutton, click_stbutton, "statusbutton" },
{ -1, 0, BAR_ALIGN_LEFT, width_stbutton, draw_stbutton, click_stbutton, "statusbutton" }, #endif // BAR_STATUSBUTTON_PATCH
#endif // BAR_STATUSBUTTON_PATCH #if BAR_POWERLINE_TAGS_PATCH
#if BAR_POWERLINE_TAGS_PATCH { 0, 0, BAR_ALIGN_LEFT, width_pwrl_tags, draw_pwrl_tags, click_pwrl_tags, "powerline_tags" },
{ 0, 0, BAR_ALIGN_LEFT, width_pwrl_tags, draw_pwrl_tags, click_pwrl_tags, "powerline_tags" }, #endif // BAR_POWERLINE_TAGS_PATCH
#endif // BAR_POWERLINE_TAGS_PATCH #if BAR_TAGS_PATCH
#if BAR_TAGS_PATCH { -1, 0, BAR_ALIGN_LEFT, width_tags, draw_tags, click_tags, "tags" },
{ -1, 0, BAR_ALIGN_LEFT, width_tags, draw_tags, click_tags, "tags" }, #endif // BAR_TAGS_PATCH
#endif // BAR_TAGS_PATCH #if BAR_TAGLABELS_PATCH
#if BAR_TAGGRID_PATCH { -1, 0, BAR_ALIGN_LEFT, width_taglabels, draw_taglabels, click_taglabels, "taglabels" },
{ -1, 0, BAR_ALIGN_LEFT, width_taggrid, draw_taggrid, click_taggrid, "taggrid" }, #endif // BAR_TAGLABELS_PATCH
#endif // BAR_TAGGRID_PATCH #if BAR_TAGGRID_PATCH
#if BAR_SYSTRAY_PATCH { -1, 0, BAR_ALIGN_LEFT, width_taggrid, draw_taggrid, click_taggrid, "taggrid" },
{ 0, 0, BAR_ALIGN_RIGHT, width_systray, draw_systray, click_systray, "systray" }, #endif // BAR_TAGGRID_PATCH
#endif // BAR_SYSTRAY_PATCH #if BAR_SYSTRAY_PATCH
#if BAR_LTSYMBOL_PATCH { 0, 0, BAR_ALIGN_RIGHT, width_systray, draw_systray, click_systray, "systray" },
{ -1, 0, BAR_ALIGN_LEFT, width_ltsymbol, draw_ltsymbol, click_ltsymbol, "layout" }, #endif // BAR_SYSTRAY_PATCH
#endif // BAR_LTSYMBOL_PATCH #if BAR_LTSYMBOL_PATCH
#if BAR_STATUSCOLORS_PATCH && BAR_STATUSCMD_PATCH { -1, 0, BAR_ALIGN_LEFT, width_ltsymbol, draw_ltsymbol, click_ltsymbol, "layout" },
{ statusmon, 0, BAR_ALIGN_RIGHT, width_statuscolors, draw_statuscolors, click_statuscmd, "statuscolors" }, #endif // BAR_LTSYMBOL_PATCH
#elif BAR_STATUSCOLORS_PATCH #if BAR_STATUSCOLORS_PATCH && BAR_STATUSCMD_PATCH
{ statusmon, 0, BAR_ALIGN_RIGHT, width_statuscolors, draw_statuscolors, click_statuscolors, "statuscolors" }, { statusmon, 0, BAR_ALIGN_RIGHT, width_statuscolors, draw_statuscolors, click_statuscmd, "statuscolors" },
#elif BAR_STATUS2D_PATCH && BAR_STATUSCMD_PATCH #elif BAR_STATUSCOLORS_PATCH
{ statusmon, 0, BAR_ALIGN_RIGHT, width_status2d, draw_status2d, click_statuscmd, "status2d" }, { statusmon, 0, BAR_ALIGN_RIGHT, width_statuscolors, draw_statuscolors, click_statuscolors, "statuscolors" },
#elif BAR_STATUS2D_PATCH #elif BAR_STATUS2D_PATCH && BAR_STATUSCMD_PATCH
{ statusmon, 0, BAR_ALIGN_RIGHT, width_status2d, draw_status2d, click_status2d, "status2d" }, { statusmon, 0, BAR_ALIGN_RIGHT, width_status2d, draw_status2d, click_statuscmd, "status2d" },
#elif BAR_POWERLINE_STATUS_PATCH #elif BAR_STATUS2D_PATCH
{ statusmon, 0, BAR_ALIGN_RIGHT, width_pwrl_status, draw_pwrl_status, click_pwrl_status, "powerline_status" }, { statusmon, 0, BAR_ALIGN_RIGHT, width_status2d, draw_status2d, click_status2d, "status2d" },
#elif BAR_STATUS_PATCH && BAR_STATUSCMD_PATCH #elif BAR_POWERLINE_STATUS_PATCH
{ statusmon, 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_statuscmd, "status" }, { statusmon, 0, BAR_ALIGN_RIGHT, width_pwrl_status, draw_pwrl_status, click_pwrl_status, "powerline_status" },
#elif BAR_STATUS_PATCH #elif BAR_STATUS_PATCH && BAR_STATUSCMD_PATCH
{ statusmon, 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_status, "status" }, { statusmon, 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_statuscmd, "status" },
#endif // BAR_STATUS2D_PATCH | BAR_STATUSCMD_PATCH #elif BAR_STATUS_PATCH
#if XKB_PATCH { statusmon, 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_status, "status" },
{ 0, 0, BAR_ALIGN_RIGHT, width_xkb, draw_xkb, click_xkb, "xkb" }, #endif // BAR_STATUS2D_PATCH | BAR_STATUSCMD_PATCH
#endif // XKB_PATCH #if XKB_PATCH
#if BAR_FLEXWINTITLE_PATCH { 0, 0, BAR_ALIGN_RIGHT, width_xkb, draw_xkb, click_xkb, "xkb" },
{ -1, 0, BAR_ALIGN_NONE, width_flexwintitle, draw_flexwintitle, click_flexwintitle, "flexwintitle" }, #endif // XKB_PATCH
#elif BAR_TABGROUPS_PATCH #if BAR_FLEXWINTITLE_PATCH
{ -1, 0, BAR_ALIGN_NONE, width_bartabgroups, draw_bartabgroups, click_bartabgroups, "bartabgroups" }, { -1, 0, BAR_ALIGN_NONE, width_flexwintitle, draw_flexwintitle, click_flexwintitle, "flexwintitle" },
#elif BAR_AWESOMEBAR_PATCH #elif BAR_TABGROUPS_PATCH
{ -1, 0, BAR_ALIGN_NONE, width_awesomebar, draw_awesomebar, click_awesomebar, "awesomebar" }, { -1, 0, BAR_ALIGN_NONE, width_bartabgroups, draw_bartabgroups, click_bartabgroups, "bartabgroups" },
#elif BAR_FANCYBAR_PATCH #elif BAR_AWESOMEBAR_PATCH
{ -1, 0, BAR_ALIGN_NONE, width_fancybar, draw_fancybar, click_fancybar, "fancybar" }, { -1, 0, BAR_ALIGN_NONE, width_awesomebar, draw_awesomebar, click_awesomebar, "awesomebar" },
#elif BAR_WINTITLE_PATCH #elif BAR_FANCYBAR_PATCH
{ -1, 0, BAR_ALIGN_NONE, width_wintitle, draw_wintitle, click_wintitle, "wintitle" }, { -1, 0, BAR_ALIGN_NONE, width_fancybar, draw_fancybar, click_fancybar, "fancybar" },
#endif // BAR_TABGROUPS_PATCH | BAR_AWESOMEBAR_PATCH | BAR_FANCYBAR_PATCH | BAR_WINTITLE_PATCH #elif BAR_WINTITLE_PATCH
#if BAR_EXTRASTATUS_PATCH { -1, 0, BAR_ALIGN_NONE, width_wintitle, draw_wintitle, click_wintitle, "wintitle" },
#if BAR_STATUSCOLORS_PATCH && BAR_STATUSCMD_PATCH #endif // BAR_TABGROUPS_PATCH | BAR_AWESOMEBAR_PATCH | BAR_FANCYBAR_PATCH | BAR_WINTITLE_PATCH
{ statusmon, 1, BAR_ALIGN_CENTER, width_statuscolors_es, draw_statuscolors_es, click_statuscmd_es, "statuscolors_es" }, #if BAR_EXTRASTATUS_PATCH
#elif BAR_STATUSCOLORS_PATCH #if BAR_STATUSCOLORS_PATCH && BAR_STATUSCMD_PATCH
{ statusmon, 1, BAR_ALIGN_CENTER, width_statuscolors_es, draw_statuscolors_es, click_statuscolors, "statuscolors_es" }, { statusmon, 1, BAR_ALIGN_CENTER, width_statuscolors_es, draw_statuscolors_es, click_statuscmd_es, "statuscolors_es" },
#elif BAR_STATUS2D_PATCH && BAR_STATUSCMD_PATCH #elif BAR_STATUSCOLORS_PATCH
{ statusmon, 1, BAR_ALIGN_CENTER, width_status2d_es, draw_status2d_es, click_statuscmd_es, "status2d_es" }, { statusmon, 1, BAR_ALIGN_CENTER, width_statuscolors_es, draw_statuscolors_es, click_statuscolors, "statuscolors_es" },
#elif BAR_STATUS2D_PATCH #elif BAR_STATUS2D_PATCH && BAR_STATUSCMD_PATCH
{ statusmon, 1, BAR_ALIGN_CENTER, width_status2d_es, draw_status2d_es, click_status2d, "status2d_es" }, { statusmon, 1, BAR_ALIGN_CENTER, width_status2d_es, draw_status2d_es, click_statuscmd_es, "status2d_es" },
#elif BAR_POWERLINE_STATUS_PATCH #elif BAR_STATUS2D_PATCH
{ statusmon, 1, BAR_ALIGN_RIGHT, width_pwrl_status_es, draw_pwrl_status_es, click_pwrl_status, "powerline_status" }, { statusmon, 1, BAR_ALIGN_CENTER, width_status2d_es, draw_status2d_es, click_status2d, "status2d_es" },
#elif BAR_STATUSCMD_PATCH && BAR_STATUS_PATCH #elif BAR_POWERLINE_STATUS_PATCH
{ statusmon, 1, BAR_ALIGN_CENTER, width_status_es, draw_status_es, click_statuscmd_es, "status_es" }, { statusmon, 1, BAR_ALIGN_RIGHT, width_pwrl_status_es, draw_pwrl_status_es, click_pwrl_status, "powerline_status" },
#elif BAR_STATUS_PATCH #elif BAR_STATUSCMD_PATCH && BAR_STATUS_PATCH
{ statusmon, 1, BAR_ALIGN_CENTER, width_status_es, draw_status_es, click_status, "status_es" }, { statusmon, 1, BAR_ALIGN_CENTER, width_status_es, draw_status_es, click_statuscmd_es, "status_es" },
#endif // BAR_STATUS2D_PATCH | BAR_STATUSCMD_PATCH #elif BAR_STATUS_PATCH
#endif // BAR_EXTRASTATUS_PATCH { statusmon, 1, BAR_ALIGN_CENTER, width_status_es, draw_status_es, click_status, "status_es" },
#if BAR_FLEXWINTITLE_PATCH #endif // BAR_STATUS2D_PATCH | BAR_STATUSCMD_PATCH
#if BAR_WINTITLE_HIDDEN_PATCH #endif // BAR_EXTRASTATUS_PATCH
{ -1, 1, BAR_ALIGN_RIGHT_RIGHT, width_wintitle_hidden, draw_wintitle_hidden, click_wintitle_hidden, "wintitle_hidden" }, #if BAR_FLEXWINTITLE_PATCH
#endif #if BAR_WINTITLE_HIDDEN_PATCH
#if BAR_WINTITLE_FLOATING_PATCH { -1, 1, BAR_ALIGN_RIGHT_RIGHT, width_wintitle_hidden, draw_wintitle_hidden, click_wintitle_hidden, "wintitle_hidden" },
{ -1, 1, BAR_ALIGN_LEFT, width_wintitle_floating, draw_wintitle_floating, click_wintitle_floating, "wintitle_floating" }, #endif
#endif // BAR_WINTITLE_FLOATING_PATCH #if BAR_WINTITLE_FLOATING_PATCH
#endif // BAR_FLEXWINTITLE_PATCH { -1, 1, BAR_ALIGN_LEFT, width_wintitle_floating, draw_wintitle_floating, click_wintitle_floating, "wintitle_floating" },
#endif // BAR_WINTITLE_FLOATING_PATCH
#endif // BAR_FLEXWINTITLE_PATCH
}; };
static const float mfact = 0.50; /* factor of master area size [0.05..0.95] */ static const float mfact = 0.50; /* factor of master area size [0.05..0.95] */
@@ -537,6 +549,7 @@ static const int nstack = 0; /* number of clients in primary stack area
#endif // FLEXTILE_DELUXE_LAYOUT #endif // FLEXTILE_DELUXE_LAYOUT
static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
#if DECORATION_HINTS_PATCH #if DECORATION_HINTS_PATCH
static const int decorhints = 1; /* 1 means respect decoration hints */ static const int decorhints = 1; /* 1 means respect decoration hints */

View File

@@ -1,5 +1,5 @@
# dwm version # dwm version
VERSION = 6.2 VERSION = 6.3
# Customize below to fit your system # Customize below to fit your system
@@ -28,7 +28,7 @@ FREETYPEINC = /usr/include/freetype2
# OpenBSD - Uncomment this for the swallow patch / SWALLOW_PATCH # OpenBSD - Uncomment this for the swallow patch / SWALLOW_PATCH
#KVMLIB = -lkvm #KVMLIB = -lkvm
# Uncomment this for the alpha patch / BAR_ALPHA_PATCH # Uncomment this for the alpha patch and the winicon patch (BAR_ALPHA_PATCH, BAR_WINICON_PATCH)
#XRENDER = -lXrender #XRENDER = -lXrender
# Uncomment this for the mdpcontrol patch / MDPCONTROL_PATCH # Uncomment this for the mdpcontrol patch / MDPCONTROL_PATCH
@@ -58,7 +58,7 @@ LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${XRENDER} ${MPDCLIENT
# flags # flags
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} #CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} CFLAGS = -std=c99 -pedantic -Wall -Wno-unused-function -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
LDFLAGS = ${LIBS} LDFLAGS = ${LIBS}
# Solaris # Solaris

25
drw.c
View File

@@ -89,9 +89,15 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
drw->depth = depth; drw->depth = depth;
drw->cmap = cmap; drw->cmap = cmap;
drw->drawable = XCreatePixmap(dpy, root, w, h, depth); drw->drawable = XCreatePixmap(dpy, root, w, h, depth);
#if BAR_WINICON_PATCH
drw->picture = XRenderCreatePicture(dpy, drw->drawable, XRenderFindVisualFormat(dpy, visual), 0, NULL);
#endif // BAR_WINICON_PATCH
drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL);
#else #else
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
#if BAR_WINICON_PATCH
drw->picture = XRenderCreatePicture(dpy, drw->drawable, XRenderFindVisualFormat(dpy, DefaultVisual(dpy, screen)), 0, NULL);
#endif // BAR_WINICON_PATCH
drw->gc = XCreateGC(dpy, root, 0, NULL); drw->gc = XCreateGC(dpy, root, 0, NULL);
#endif // BAR_ALPHA_PATCH #endif // BAR_ALPHA_PATCH
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
@@ -107,18 +113,31 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
drw->w = w; drw->w = w;
drw->h = h; drw->h = h;
#if BAR_WINICON_PATCH
if (drw->picture)
XRenderFreePicture(drw->dpy, drw->picture);
#endif // BAR_WINICON_PATCH
if (drw->drawable) if (drw->drawable)
XFreePixmap(drw->dpy, drw->drawable); XFreePixmap(drw->dpy, drw->drawable);
#if BAR_ALPHA_PATCH #if BAR_ALPHA_PATCH
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth);
#else #if BAR_WINICON_PATCH
drw->picture = XRenderCreatePicture(drw->dpy, drw->drawable, XRenderFindVisualFormat(drw->dpy, drw->visual), 0, NULL);
#endif // BAR_WINICON_PATCH
#else // !BAR_ALPHA_PATCH
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
#if BAR_WINICON_PATCH
drw->picture = XRenderCreatePicture(drw->dpy, drw->drawable, XRenderFindVisualFormat(drw->dpy, DefaultVisual(drw->dpy, drw->screen)), 0, NULL);
#endif // BAR_WINICON_PATCH
#endif // BAR_ALPHA_PATCH #endif // BAR_ALPHA_PATCH
} }
void void
drw_free(Drw *drw) drw_free(Drw *drw)
{ {
#if BAR_WINICON_PATCH
XRenderFreePicture(drw->dpy, drw->picture);
#endif // BAR_WINICON_PATCH
XFreePixmap(drw->dpy, drw->drawable); XFreePixmap(drw->dpy, drw->drawable);
XFreeGC(drw->dpy, drw->gc); XFreeGC(drw->dpy, drw->gc);
drw_fontset_free(drw->fonts); drw_fontset_free(drw->fonts);
@@ -507,8 +526,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
if (utf8strlen) { if (utf8strlen) {
drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL);
/* shorten text if necessary */ /* shorten text if necessary */
for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; drw_font_getexts(usedfont, utf8str, len, &ew, NULL))
drw_font_getexts(usedfont, utf8str, len, &ew, NULL); len--;
if (len) { if (len) {
memcpy(buf, utf8str, len); memcpy(buf, utf8str, len);

3
drw.h
View File

@@ -35,6 +35,9 @@ typedef struct {
Colormap cmap; Colormap cmap;
#endif // BAR_ALPHA_PATCH #endif // BAR_ALPHA_PATCH
Drawable drawable; Drawable drawable;
#if BAR_WINICON_PATCH
Picture picture;
#endif // BAR_WINICON_PATCH
GC gc; GC gc;
Clr *scheme; Clr *scheme;
Fnt *fonts; Fnt *fonts;

256
dwm.c
View File

@@ -336,7 +336,7 @@ struct Client {
int sfx, sfy, sfw, sfh; /* stored float geometry, used on mode revert */ int sfx, sfy, sfw, sfh; /* stored float geometry, used on mode revert */
#endif // SAVEFLOATS_PATCH / EXRESIZE_PATCH #endif // SAVEFLOATS_PATCH / EXRESIZE_PATCH
int oldx, oldy, oldw, oldh; int oldx, oldy, oldw, oldh;
int basew, baseh, incw, inch, maxw, maxh, minw, minh; int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
int bw, oldbw; int bw, oldbw;
unsigned int tags; unsigned int tags;
#if SWITCHTAG_PATCH #if SWITCHTAG_PATCH
@@ -368,6 +368,9 @@ struct Client {
#if PLACEMOUSE_PATCH #if PLACEMOUSE_PATCH
int beingmoved; int beingmoved;
#endif // PLACEMOUSE_PATCH #endif // PLACEMOUSE_PATCH
#if SIZEHINTS_ISFREESIZE_PATCH
int isfreesize;
#endif // SIZEHINTS_ISFREESIZE_PATCH
#if SWALLOW_PATCH #if SWALLOW_PATCH
int isterminal, noswallow; int isterminal, noswallow;
pid_t pid; pid_t pid;
@@ -392,7 +395,8 @@ struct Client {
XkbInfo *xkb; XkbInfo *xkb;
#endif // XKB_PATCH #endif // XKB_PATCH
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
XImage *icon; unsigned int icw, ich;
Picture icon;
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
}; };
@@ -436,7 +440,6 @@ typedef struct {
typedef struct Pertag Pertag; typedef struct Pertag Pertag;
#endif // PERTAG_PATCH #endif // PERTAG_PATCH
struct Monitor { struct Monitor {
int index;
char ltsymbol[16]; char ltsymbol[16];
float mfact; float mfact;
#if FLEXTILE_DELUXE_LAYOUT #if FLEXTILE_DELUXE_LAYOUT
@@ -485,6 +488,9 @@ struct Monitor {
#if INSETS_PATCH #if INSETS_PATCH
Inset inset; Inset inset;
#endif // INSETS_PATCH #endif // INSETS_PATCH
#if BAR_TAGLABELS_PATCH
char taglabel[NUMTAGS][64];
#endif // BAR_TAGLABELS_PATCH
#if IPC_PATCH #if IPC_PATCH
char lastltsymbol[16]; char lastltsymbol[16];
TagState tagstate; TagState tagstate;
@@ -512,6 +518,9 @@ typedef struct {
#if SELECTIVEFAKEFULLSCREEN_PATCH && FAKEFULLSCREEN_CLIENT_PATCH && !FAKEFULLSCREEN_PATCH #if SELECTIVEFAKEFULLSCREEN_PATCH && FAKEFULLSCREEN_CLIENT_PATCH && !FAKEFULLSCREEN_PATCH
int isfakefullscreen; int isfakefullscreen;
#endif // SELECTIVEFAKEFULLSCREEN_PATCH #endif // SELECTIVEFAKEFULLSCREEN_PATCH
#if SIZEHINTS_ISFREESIZE_PATCH
int isfreesize;
#endif // SIZEHINTS_ISFREESIZE_PATCH
#if ISPERMANENT_PATCH #if ISPERMANENT_PATCH
int ispermanent; int ispermanent;
#endif // ISPERMANENT_PATCH #endif // ISPERMANENT_PATCH
@@ -822,6 +831,9 @@ applyrules(Client *c)
#if SWALLOW_PATCH #if SWALLOW_PATCH
c->noswallow = -1; c->noswallow = -1;
#endif // SWALLOW_PATCH #endif // SWALLOW_PATCH
#if SIZEHINTS_ISFREESIZE_PATCH
c->isfreesize = 1;
#endif // SIZEHINTS_ISFREESIZE_PATCH
c->isfloating = 0; c->isfloating = 0;
c->tags = 0; c->tags = 0;
XGetClassHint(dpy, c->win, &ch); XGetClassHint(dpy, c->win, &ch);
@@ -860,6 +872,9 @@ applyrules(Client *c)
c->isterminal = r->isterminal; c->isterminal = r->isterminal;
c->noswallow = r->noswallow; c->noswallow = r->noswallow;
#endif // SWALLOW_PATCH #endif // SWALLOW_PATCH
#if SIZEHINTS_ISFREESIZE_PATCH
c->isfreesize = r->isfreesize;
#endif // SIZEHINTS_ISFREESIZE_PATCH
c->isfloating = r->isfloating; c->isfloating = r->isfloating;
c->tags |= r->tags; c->tags |= r->tags;
#if SCRATCHPADS_PATCH #if SCRATCHPADS_PATCH
@@ -908,8 +923,14 @@ applyrules(Client *c)
view(&((Arg) { .ui = newtagset })); view(&((Arg) { .ui = newtagset }));
#endif // PERTAG_PATCH #endif // PERTAG_PATCH
} else { } else {
#if TAGSYNC_PATCH
for (m = mons; m; m = m->next)
m->tagset[m->seltags] = newtagset;
arrange(NULL);
#else
c->mon->tagset[c->mon->seltags] = newtagset; c->mon->tagset[c->mon->seltags] = newtagset;
arrange(c->mon); arrange(c->mon);
#endif // TAGSYNC_PATCH
} }
} }
} }
@@ -980,6 +1001,8 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
if (*w < bh) if (*w < bh)
*w = bh; *w = bh;
if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { 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 */ /* see last two sentences in ICCCM 4.1.2.3 */
baseismin = c->basew == c->minw && c->baseh == c->minh; baseismin = c->basew == c->minw && c->baseh == c->minh;
if (!baseismin) { /* temporarily remove base dimensions */ if (!baseismin) { /* temporarily remove base dimensions */
@@ -1095,7 +1118,7 @@ buttonpress(XEvent *e)
br = &barrules[r]; br = &barrules[r];
if (br->bar != bar->idx || (br->monitor == 'A' && m != selmon) || br->clickfunc == NULL) if (br->bar != bar->idx || (br->monitor == 'A' && m != selmon) || br->clickfunc == NULL)
continue; continue;
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index) if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->num)
continue; continue;
if (bar->x[r] <= ev->x && ev->x <= bar->x[r] + bar->w[r]) { if (bar->x[r] <= ev->x && ev->x <= bar->x[r] + bar->w[r]) {
carg.x = ev->x - bar->x[r]; carg.x = ev->x - bar->x[r];
@@ -1532,11 +1555,11 @@ createmon(void)
m->gappov = gappov; m->gappov = gappov;
#endif // VANITYGAPS_PATCH #endif // VANITYGAPS_PATCH
for (mi = 0, mon = mons; mon; mon = mon->next, mi++); // monitor index for (mi = 0, mon = mons; mon; mon = mon->next, mi++); // monitor index
m->index = mi; m->num = mi;
#if MONITOR_RULES_PATCH #if MONITOR_RULES_PATCH
for (j = 0; j < LENGTH(monrules); j++) { for (j = 0; j < LENGTH(monrules); j++) {
mr = &monrules[j]; mr = &monrules[j];
if ((mr->monitor == -1 || mr->monitor == mi) if ((mr->monitor == -1 || mr->monitor == m->num)
#if PERTAG_PATCH #if PERTAG_PATCH
&& (mr->tag <= 0 || (m->tagset[0] & (1 << (mr->tag - 1)))) && (mr->tag <= 0 || (m->tagset[0] & (1 << (mr->tag - 1))))
#endif // PERTAG_PATCH #endif // PERTAG_PATCH
@@ -1567,7 +1590,7 @@ createmon(void)
/* Derive the number of bars for this monitor based on bar rules */ /* Derive the number of bars for this monitor based on bar rules */
for (n = -1, i = 0; i < LENGTH(barrules); i++) { for (n = -1, i = 0; i < LENGTH(barrules); i++) {
br = &barrules[i]; br = &barrules[i];
if (br->monitor == 'A' || br->monitor == -1 || br->monitor == mi) if (br->monitor == 'A' || br->monitor == -1 || br->monitor == m->num)
n = MAX(br->bar, n); n = MAX(br->bar, n);
} }
@@ -1628,7 +1651,7 @@ createmon(void)
#if MONITOR_RULES_PATCH #if MONITOR_RULES_PATCH
for (j = 0; j < LENGTH(monrules); j++) { for (j = 0; j < LENGTH(monrules); j++) {
mr = &monrules[j]; mr = &monrules[j];
if ((mr->monitor == -1 || mr->monitor == mi) && (mr->tag == -1 || mr->tag == i)) { if ((mr->monitor == -1 || mr->monitor == m->num) && (mr->tag == -1 || mr->tag == i)) {
layout = MAX(mr->layout, 0); layout = MAX(mr->layout, 0);
layout = MIN(layout, LENGTH(layouts) - 1); layout = MIN(layout, LENGTH(layouts) - 1);
m->pertag->ltidxs[i][0] = &layouts[layout]; m->pertag->ltidxs[i][0] = &layouts[layout];
@@ -1750,8 +1773,12 @@ void
drawbar(Monitor *m) drawbar(Monitor *m)
{ {
Bar *bar; Bar *bar;
for (bar = m->bar; bar; bar = bar->next)
drawbarwin(bar); #if !BAR_FLEXWINTITLE_PATCH
if (m->showbar)
#endif // BAR_FLEXWINTITLE_PATCH
for (bar = m->bar; bar; bar = bar->next)
drawbarwin(bar);
} }
void void
@@ -1789,7 +1816,7 @@ drawbarwin(Bar *bar)
br = &barrules[r]; br = &barrules[r];
if (br->bar != bar->idx || !br->widthfunc || (br->monitor == 'A' && bar->mon != selmon)) if (br->bar != bar->idx || !br->widthfunc || (br->monitor == 'A' && bar->mon != selmon))
continue; continue;
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index) if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->num)
continue; continue;
drw_setscheme(drw, scheme[SchemeNorm]); drw_setscheme(drw, scheme[SchemeNorm]);
warg.w = (br->alignment < BAR_ALIGN_RIGHT_LEFT ? lw : rw); warg.w = (br->alignment < BAR_ALIGN_RIGHT_LEFT ? lw : rw);
@@ -2013,7 +2040,7 @@ focusstack(const Arg *arg)
if (!selmon->sel || (selmon->sel->isfullscreen && !selmon->sel->fakefullscreen)) if (!selmon->sel || (selmon->sel->isfullscreen && !selmon->sel->fakefullscreen))
return; return;
#else #else
if (!selmon->sel || selmon->sel->isfullscreen) if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen))
return; return;
#endif // LOSEFULLSCREEN_PATCH #endif // LOSEFULLSCREEN_PATCH
#if BAR_WINTITLEACTIONS_PATCH #if BAR_WINTITLEACTIONS_PATCH
@@ -2301,7 +2328,6 @@ manage(Window w, XWindowAttributes *wa)
c->cfact = 1.0; c->cfact = 1.0;
#endif // CFACTS_PATCH #endif // CFACTS_PATCH
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
c->icon = NULL;
updateicon(c); updateicon(c);
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
updatetitle(c); updatetitle(c);
@@ -2705,7 +2731,7 @@ propertynotify(XEvent *e)
arrange(c->mon); arrange(c->mon);
break; break;
case XA_WM_NORMAL_HINTS: case XA_WM_NORMAL_HINTS:
updatesizehints(c); c->hintsvalid = 0;
break; break;
case XA_WM_HINTS: case XA_WM_HINTS:
updatewmhints(c); updatewmhints(c);
@@ -2744,27 +2770,27 @@ quit(const Arg *arg)
#if COOL_AUTOSTART_PATCH #if COOL_AUTOSTART_PATCH
size_t i; size_t i;
#endif // COOL_AUTOSTART_PATCH #endif // COOL_AUTOSTART_PATCH
#if ONLYQUITONEMPTY_PATCH
unsigned int n;
Window *junk = malloc(1);
XQueryTree(dpy, root, junk, junk, &junk, &n);
if (n <= quit_empty_window_count)
{
#if RESTARTSIG_PATCH
restart = arg->i;
#endif // RESTARTSIG_PATCH
running = 0;
}
else
printf("[dwm] not exiting (n=%d)\n", n);
free(junk);
#else // !ONLYQUITONEMPTY_PATCH
#if RESTARTSIG_PATCH #if RESTARTSIG_PATCH
restart = arg->i; restart = arg->i;
#endif // RESTARTSIG_PATCH #endif // RESTARTSIG_PATCH
#if ONLYQUITONEMPTY_PATCH
Monitor *m;
Client *c;
unsigned int n = 0;
for (m = mons; m; m = m->next)
for (c = m->clients; c; c = c->next, n++);
#if RESTARTSIG_PATCH
if (restart || n <= quit_empty_window_count)
#else
if (n <= quit_empty_window_count)
#endif // RESTARTSIG_PATCH
running = 0;
else
fprintf(stderr, "[dwm] not exiting (n=%d)\n", n);
#else // !ONLYQUITONEMPTY_PATCH
running = 0; running = 0;
#endif // ONLYQUITONEMPTY_PATCH #endif // ONLYQUITONEMPTY_PATCH
@@ -2995,7 +3021,7 @@ resizemouse(const Arg *arg)
void void
restack(Monitor *m) restack(Monitor *m)
{ {
Client *c; Client *c, *f = NULL;
XEvent ev; XEvent ev;
XWindowChanges wc; XWindowChanges wc;
#if WARP_PATCH && FLEXTILE_DELUXE_LAYOUT #if WARP_PATCH && FLEXTILE_DELUXE_LAYOUT
@@ -3010,11 +3036,17 @@ restack(Monitor *m)
return; return;
if (m->sel->isfloating || !m->lt[m->sellt]->arrange) if (m->sel->isfloating || !m->lt[m->sellt]->arrange)
XRaiseWindow(dpy, m->sel->win); XRaiseWindow(dpy, m->sel->win);
if (m->lt[m->sellt]->arrange && m->bar) { if (m->lt[m->sellt]->arrange) {
wc.stack_mode = Below; wc.stack_mode = Below;
wc.sibling = m->bar->win; if (m->bar) {
wc.sibling = m->bar->win;
} else {
for (f = m->stack; f && (f->isfloating || !ISVISIBLE(f)); f = f->snext); // find first tiled stack client
if (f)
wc.sibling = f->win;
}
for (c = m->stack; c; c = c->snext) for (c = m->stack; c; c = c->snext)
if (!c->isfloating && ISVISIBLE(c)) { if (!c->isfloating && ISVISIBLE(c) && c != f) {
XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
wc.sibling = c->win; wc.sibling = c->win;
} }
@@ -3492,6 +3524,9 @@ setup(void)
signal(SIGTERM, sigterm); signal(SIGTERM, sigterm);
#endif // RESTARTSIG_PATCH #endif // RESTARTSIG_PATCH
/* the one line of bloat that would have saved a lot of time for a lot of people */
putenv("_JAVA_AWT_WM_NONREPARENTING=1");
/* init screen */ /* init screen */
screen = DefaultScreen(dpy); screen = DefaultScreen(dpy);
sw = DisplayWidth(dpy, screen); sw = DisplayWidth(dpy, screen);
@@ -3942,6 +3977,10 @@ togglebar(const Arg *arg)
updatebarpos(selmon); updatebarpos(selmon);
for (bar = selmon->bar; bar; bar = bar->next) for (bar = selmon->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
#if BAR_SYSTRAY_PATCH
if (!selmon->showbar && systray)
XMoveWindow(dpy, systray->win, -32000, -32000);
#endif // BAR_SYSTRAY_PATCH
arrange(selmon); arrange(selmon);
} }
@@ -4022,7 +4061,11 @@ toggletag(const Arg *arg)
void void
toggleview(const Arg *arg) toggleview(const Arg *arg)
{ {
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);;
#if TAGSYNC_PATCH
Monitor *origselmon = selmon;
for (selmon = mons; selmon; selmon = selmon->next) {
#endif // TAGSYNC_PATCH
#if PERTAG_PATCH #if PERTAG_PATCH
int i; int i;
#endif // PERTAG_PATCH #endif // PERTAG_PATCH
@@ -4093,11 +4136,25 @@ toggleview(const Arg *arg)
togglebar(NULL); togglebar(NULL);
#endif // PERTAGBAR_PATCH #endif // PERTAGBAR_PATCH
#endif // PERTAG_PATCH #endif // PERTAG_PATCH
#if !TAGSYNC_PATCH
focus(NULL); focus(NULL);
arrange(selmon); arrange(selmon);
#endif // TAGSYNC_PATCH
#if !EMPTYVIEW_PATCH #if !EMPTYVIEW_PATCH
} }
#endif // EMPTYVIEW_PATCH #endif // EMPTYVIEW_PATCH
#if TAGSYNC_PATCH
}
selmon = origselmon;
#if !EMPTYVIEW_PATCH
if (newtagset) {
#endif // EMPTYVIEW_PATCH
focus(NULL);
arrange(NULL);
#if !EMPTYVIEW_PATCH
}
#endif // EMPTYVIEW_PATCH
#endif // TAGSYNC_PATCH
#if BAR_EWMHTAGS_PATCH #if BAR_EWMHTAGS_PATCH
updatecurrentdesktop(); updatecurrentdesktop();
#endif // BAR_EWMHTAGS_PATCH #endif // BAR_EWMHTAGS_PATCH
@@ -4313,13 +4370,22 @@ updatebarpos(Monitor *m)
m->ww = m->mw; m->ww = m->mw;
m->wh = m->mh; m->wh = m->mh;
Bar *bar; Bar *bar;
#if BAR_PADDING_PATCH
int y_pad = vertpad;
int x_pad = sidepad;
#else
int y_pad = 0; int y_pad = 0;
int x_pad = 0; int x_pad = 0;
#endif // BAR_PADDING_PATCH #if BAR_PADDING_VANITYGAPS_PATCH && VANITYGAPS_PATCH
#if PERTAG_VANITYGAPS_PATCH && PERTAG_PATCH
if (!selmon || selmon->pertag->enablegaps[selmon->pertag->curtag])
#else
if (enablegaps)
#endif // PERTAG_VANITYGAPS_PATCH
{
y_pad = gappoh;
x_pad = gappov;
}
#elif BAR_PADDING_PATCH
y_pad = vertpad;
x_pad = sidepad;
#endif // BAR_PADDING_PATCH | BAR_PADDING_VANITYGAPS_PATCH
#if INSETS_PATCH #if INSETS_PATCH
// Custom insets // Custom insets
@@ -4419,46 +4485,42 @@ updategeom(void)
#if SORTSCREENS_PATCH #if SORTSCREENS_PATCH
sortscreens(unique, nn); sortscreens(unique, nn);
#endif // SORTSCREENS_PATCH #endif // SORTSCREENS_PATCH
if (n <= nn) { /* new monitors available */ /* new monitors if nn > n */
for (i = 0; i < (nn - n); i++) { for (i = n; i < nn; i++) {
for (m = mons; m && m->next; m = m->next); for (m = mons; m && m->next; m = m->next);
if (m) if (m)
m->next = createmon(); m->next = createmon();
else else
mons = createmon(); mons = createmon();
} }
for (i = 0, m = mons; i < nn && m; m = m->next, i++) { for (i = 0, m = mons; i < nn && m; m = m->next, i++)
if (i >= n if (i >= n
|| unique[i].x_org != m->mx || unique[i].y_org != m->my || unique[i].x_org != m->mx || unique[i].y_org != m->my
|| unique[i].width != m->mw || unique[i].height != m->mh) || unique[i].width != m->mw || unique[i].height != m->mh)
{ {
dirty = 1; dirty = 1;
m->num = i; m->num = i;
m->mx = m->wx = unique[i].x_org; m->mx = m->wx = unique[i].x_org;
m->my = m->wy = unique[i].y_org; m->my = m->wy = unique[i].y_org;
m->mw = m->ww = unique[i].width; m->mw = m->ww = unique[i].width;
m->mh = m->wh = unique[i].height; m->mh = m->wh = unique[i].height;
updatebarpos(m); updatebarpos(m);
} }
} /* removed monitors if n > nn */
} else { /* less monitors available nn < n */ for (i = nn; i < n; i++) {
for (i = nn; i < n; i++) { for (m = mons; m && m->next; m = m->next);
for (m = mons; m && m->next; m = m->next); while ((c = m->clients)) {
while ((c = m->clients)) { dirty = 1;
dirty = 1; m->clients = c->next;
m->clients = c->next; detachstack(c);
detachstack(c); c->mon = mons;
c->mon = mons; attach(c);
attach(c); attachstack(c);
attachstack(c); }
} if (m == selmon)
if (m == selmon) selmon = mons;
selmon = mons; cleanupmon(m);
cleanupmon(m);
}
} }
for (i = 0, m = mons; m; m = m->next, i++)
m->index = i;
free(unique); free(unique);
} else } else
#endif /* XINERAMA */ #endif /* XINERAMA */
@@ -4503,11 +4565,11 @@ updatesizehints(Client *c)
if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) if (!XGetWMNormalHints(dpy, c->win, &size, &msize))
/* size is uninitialized, ensure that size.flags aren't used */ /* size is uninitialized, ensure that size.flags aren't used */
#if SIZEHINTS_PATCH || SIZEHINTS_RULED_PATCH #if SIZEHINTS_PATCH || SIZEHINTS_RULED_PATCH || SIZEHINTS_ISFREESIZE_PATCH
size.flags = 0; size.flags = 0;
#else #else
size.flags = PSize; size.flags = PSize;
#endif // SIZEHINTS_PATCH | SIZEHINTS_RULED_PATCH #endif // SIZEHINTS_PATCH | SIZEHINTS_RULED_PATCH | SIZEHINTS_ISFREESIZE_PATCH
if (size.flags & PBaseSize) { if (size.flags & PBaseSize) {
c->basew = size.base_width; c->basew = size.base_width;
c->baseh = size.base_height; c->baseh = size.base_height;
@@ -4539,8 +4601,13 @@ updatesizehints(Client *c)
c->maxa = (float)size.max_aspect.x / size.max_aspect.y; c->maxa = (float)size.max_aspect.x / size.max_aspect.y;
} else } else
c->maxa = c->mina = 0.0; c->maxa = c->mina = 0.0;
#if SIZEHINTS_PATCH || SIZEHINTS_RULED_PATCH #if SIZEHINTS_PATCH || SIZEHINTS_RULED_PATCH || SIZEHINTS_ISFREESIZE_PATCH
if (size.flags & PSize) { #if SIZEHINTS_ISFREESIZE_PATCH
if ((size.flags & PSize) && c->isfreesize)
#else
if (size.flags & PSize)
#endif // SIZEHINTS_ISFREESIZE_PATCH
{
c->basew = size.base_width; c->basew = size.base_width;
c->baseh = size.base_height; c->baseh = size.base_height;
c->isfloating = 1; c->isfloating = 1;
@@ -4550,6 +4617,7 @@ updatesizehints(Client *c)
#endif // SIZEHINTS_RULED_PATCH #endif // SIZEHINTS_RULED_PATCH
#endif // SIZEHINTS_PATCH #endif // SIZEHINTS_PATCH
c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh);
c->hintsvalid = 1;
} }
void void
@@ -4641,6 +4709,10 @@ updatewmhints(Client *c)
void void
view(const Arg *arg) view(const Arg *arg)
{ {
#if TAGSYNC_PATCH
Monitor *origselmon = selmon;
for (selmon = mons; selmon; selmon = selmon->next) {
#endif // TAGSYNC_PATCH
#if EMPTYVIEW_PATCH #if EMPTYVIEW_PATCH
if (arg->ui && (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) if (arg->ui && (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
#else #else
@@ -4655,18 +4727,20 @@ view(const Arg *arg)
selmon->seltags ^= 1; /* toggle sel tagset */ selmon->seltags ^= 1; /* toggle sel tagset */
#if PERTAG_PATCH #if PERTAG_PATCH
pertagview(arg); pertagview(arg);
#if SWAPFOCUS_PATCH
Client *unmodified = selmon->pertag->prevclient[selmon->pertag->curtag];
#endif // SWAPFOCUS_PATCH
#else #else
if (arg->ui & TAGMASK) if (arg->ui & TAGMASK)
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
#endif // PERTAG_PATCH #endif // PERTAG_PATCH
#if TAGSYNC_PATCH
}
selmon = origselmon;
#endif // TAGSYNC_PATCH
focus(NULL); focus(NULL);
#if SWAPFOCUS_PATCH && PERTAG_PATCH #if TAGSYNC_PATCH
selmon->pertag->prevclient[selmon->pertag->curtag] = unmodified; arrange(NULL);
#endif // SWAPFOCUS_PATCH #else
arrange(selmon); arrange(selmon);
#endif // TAGSYNC_PATCH
#if BAR_EWMHTAGS_PATCH #if BAR_EWMHTAGS_PATCH
updatecurrentdesktop(); updatecurrentdesktop();
#endif // BAR_EWMHTAGS_PATCH #endif // BAR_EWMHTAGS_PATCH

View File

@@ -7,8 +7,14 @@ width_awesomebar(Bar *bar, BarArg *a)
int int
draw_awesomebar(Bar *bar, BarArg *a) draw_awesomebar(Bar *bar, BarArg *a)
{ {
int n = 0, scm, remainder = 0, tabw, pad; int n = 0, scm, remainder = 0, tabw, tpad, tx, tw;
unsigned int i; unsigned int i;
#if BAR_CENTEREDWINDOWNAME_PATCH
int cpad;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
#if BAR_WINICON_PATCH
int ipad;
#endif // BAR_WINICON_PATCH
#if BAR_TITLE_LEFT_PAD_PATCH && BAR_TITLE_RIGHT_PAD_PATCH #if BAR_TITLE_LEFT_PAD_PATCH && BAR_TITLE_RIGHT_PAD_PATCH
int x = a->x + lrpad / 2, w = a->w - lrpad; int x = a->x + lrpad / 2, w = a->w - lrpad;
#elif BAR_TITLE_LEFT_PAD_PATCH #elif BAR_TITLE_LEFT_PAD_PATCH
@@ -39,22 +45,49 @@ draw_awesomebar(Bar *bar, BarArg *a)
else else
scm = SchemeTitleNorm; scm = SchemeTitleNorm;
pad = lrpad / 2; tpad = lrpad / 2;
#if BAR_CENTEREDWINDOWNAME_PATCH #if BAR_CENTEREDWINDOWNAME_PATCH
cpad = 0;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
#if BAR_WINICON_PATCH
ipad = c->icon ? c->icw + ICONSPACING : 0;
#endif // BAR_WINICON_PATCH
tx = x;
tw = tabw;
#if BAR_WINICON_PATCH && BAR_CENTEREDWINDOWNAME_PATCH
if (TEXTW(c->name) + ipad < tabw)
cpad = (tabw - TEXTW(c->name) - ipad) / 2;
#elif BAR_CENTEREDWINDOWNAME_PATCH
if (TEXTW(c->name) < tabw) if (TEXTW(c->name) < tabw)
pad = (tabw - TEXTW(c->name) + lrpad) / 2; cpad = (tabw - TEXTW(c->name)) / 2;
#endif // BAR_CENTEREDWINDOWNAME_PATCH #endif // BAR_CENTEREDWINDOWNAME_PATCH
drw_setscheme(drw, scheme[scm]); drw_setscheme(drw, scheme[scm]);
XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, tx, a->y, tw, a->h);
#if BAR_CENTEREDWINDOWNAME_PATCH
/* Apply center padding, if any */
tx += cpad;
tw -= cpad;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
tx += tpad;
tw -= lrpad;
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
drw_text(drw, x, a->y, tabw + (i < remainder ? 1 : 0), a->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False); if (ipad) {
if (c->icon) drw_pic(drw, tx, a->y + (a->h - c->ich) / 2, c->icw, c->ich, c->icon);
drw_img(drw, x + pad, a->y + (a->h - c->icon->height) / 2, c->icon, tmpicon); tx += ipad;
#else tw -= ipad;
drw_text(drw, x, a->y, tabw + (i < remainder ? 1 : 0), a->h, pad, c->name, 0, False); }
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
drw_text(drw, tx, a->y, tw, a->h, 0, c->name, 0, False);
drawstateindicator(c->mon, c, 1, x, a->y, tabw + (i < remainder ? 1 : 0), a->h, 0, 0, c->isfixed); drawstateindicator(c->mon, c, 1, x, a->y, tabw + (i < remainder ? 1 : 0), a->h, 0, 0, c->isfixed);
x += tabw + (i < remainder ? 1 : 0); x += tabw + (i < remainder ? 1 : 0);
} }

View File

@@ -50,4 +50,3 @@ updatecurrentdesktop(void)
long data[] = { i }; long data[] = { i };
XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1);
} }

View File

@@ -7,7 +7,10 @@ width_fancybar(Bar *bar, BarArg *a)
int int
draw_fancybar(Bar *bar, BarArg *a) draw_fancybar(Bar *bar, BarArg *a)
{ {
int ftw, mw, ew = 0, n = 0; int tabw, mw, ew = 0, n = 0, tx, tw;
#if BAR_WINICON_PATCH
int ipad;
#endif // BAR_WINICON_PATCH
unsigned int i; unsigned int i;
Client *c; Client *c;
Monitor *m = bar->mon; Monitor *m = bar->mon;
@@ -28,25 +31,25 @@ draw_fancybar(Bar *bar, BarArg *a)
} }
if (n > 0) { if (n > 0) {
ftw = TEXTW(m->sel->name); tabw = TEXTW(m->sel->name);
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
if (m->sel->icon) if (m->sel->icon)
ftw += m->sel->icon->width + ICONSPACING; tabw += m->sel->icw + ICONSPACING;
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
mw = (ftw >= w || n == 1) ? 0 : (w - ftw) / (n - 1); mw = (tabw >= w || n == 1) ? 0 : (w - tabw) / (n - 1);
i = 0; i = 0;
for (c = m->clients; c; c = c->next) { for (c = m->clients; c; c = c->next) {
if (!ISVISIBLE(c) || c == m->sel) if (!ISVISIBLE(c) || c == m->sel)
continue; continue;
ftw = TEXTW(c->name); tabw = TEXTW(c->name);
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
if (c->icon) if (c->icon)
ftw += c->icon->width + ICONSPACING; tabw += c->icw + ICONSPACING;
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
if (ftw < mw) if (tabw < mw)
ew += (mw - ftw); ew += (mw - tabw);
else else
i++; i++;
} }
@@ -57,24 +60,36 @@ draw_fancybar(Bar *bar, BarArg *a)
for (c = m->clients; c; c = c->next) { for (c = m->clients; c; c = c->next) {
if (!ISVISIBLE(c)) if (!ISVISIBLE(c))
continue; continue;
ftw = MIN(m->sel == c ? w : mw, TEXTW(c->name)); tabw = MIN(m->sel == c ? w : mw, TEXTW(c->name));
#if BAR_WINICON_PATCH
ipad = c->icon ? c->icw + ICONSPACING : 0;
tabw += ipad;
#endif // BAR_WINICON_PATCH
tx = x;
tw = tabw;
drw_setscheme(drw, scheme[m->sel == c ? SchemeTitleSel : SchemeTitleNorm]); drw_setscheme(drw, scheme[m->sel == c ? SchemeTitleSel : SchemeTitleNorm]);
if (ftw > 0) { /* trap special handling of 0 in drw_text */
drw_text(drw, x, a->y, ftw, a->h, lrpad / 2, c->name, 0, False); XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, tx, a->y, tw, a->h);
#if BAR_WINICON_PATCH if (tabw <= 0) /* trap special handling of 0 in drw_text */
drw_text(drw, x, a->y, ftw, a->h, lrpad / 2 + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False); continue;
if (c->icon)
drw_img(drw, x + lrpad / 2, a->y + (a->h - c->icon->height) / 2, c->icon, tmpicon);
#else
drw_text(drw, x, a->y, ftw, a->h, lrpad / 2, c->name, 0, False);
#endif // BAR_WINICON_PATCH
tx += lrpad / 2;
tw -= lrpad;
#if BAR_WINICON_PATCH
if (ipad) {
drw_pic(drw, tx, a->y + (a->h - c->ich) / 2, c->icw, c->ich, c->icon);
tx += ipad;
tw -= ipad;
} }
drawstateindicator(c->mon, c, 1, x, a->y, ftw, a->h, 0, 0, c->isfixed); #endif // BAR_WINICON_PATCH
x += ftw;
w -= ftw; drw_text(drw, tx, a->y, tw, a->h, 0, c->name, 0, False);
drawstateindicator(c->mon, c, 1, x, a->y, tabw, a->h, 0, 0, c->isfixed);
x += tabw;
w -= tabw;
} }
} }
return n; return n;

View File

@@ -166,11 +166,21 @@ getselschemefor(int scheme)
} }
void void
flextitledraw(Monitor *m, Client *c, int unused, int x, int w, int tabscheme, Arg *arg, BarArg *barg) flextitledraw(Monitor *m, Client *c, int unused, int x, int w, int tabscheme, Arg *arg, BarArg *a)
{ {
if (!c) if (!c)
return; return;
int i, nclienttags = 0, nviewtags = 0, pad = lrpad / 2; int i, nclienttags = 0, nviewtags = 0;
int tpad = lrpad / 2;
#if BAR_WINICON_PATCH
int ipad = c->icon ? c->icw + ICONSPACING : 0;
#endif // BAR_WINICON_PATCH
#if BAR_CENTEREDWINDOWNAME_PATCH
int cpad = 0;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
int tx = x;
int tw = w;
int clientscheme = ( int clientscheme = (
c == selmon->sel && HIDDEN(c) c == selmon->sel && HIDDEN(c)
? SchemeHidSel ? SchemeHidSel
@@ -182,30 +192,49 @@ flextitledraw(Monitor *m, Client *c, int unused, int x, int w, int tabscheme, Ar
? SchemeUrg ? SchemeUrg
: tabscheme : tabscheme
); );
drw_setscheme(drw, scheme[clientscheme]); drw_setscheme(drw, scheme[clientscheme]);
XSetWindowBorder(dpy, c->win, scheme[clientscheme][ColBorder].pixel); XSetWindowBorder(dpy, c->win, scheme[clientscheme][ColBorder].pixel);
if (w <= TEXTW("A") - lrpad + pad) // reduce text padding if wintitle is too small
pad = (w - TEXTW("A") + lrpad < 0 ? 0 : (w - TEXTW("A") + lrpad) / 2); if (w <= TEXTW("A") - lrpad + tpad) // reduce text padding if wintitle is too small
#if BAR_CENTEREDWINDOWNAME_PATCH tpad = (w - TEXTW("A") + lrpad < 0 ? 0 : (w - TEXTW("A") + lrpad) / 2);
#if BAR_WINICON_PATCH && BAR_CENTEREDWINDOWNAME_PATCH
else if (TEXTW(c->name) + ipad < w)
cpad = (w - TEXTW(c->name) - ipad) / 2;
#elif BAR_CENTEREDWINDOWNAME_PATCH
else if (TEXTW(c->name) < w) else if (TEXTW(c->name) < w)
pad = (w - TEXTW(c->name) + lrpad) / 2; cpad = (w - TEXTW(c->name)) / 2;
#endif // BAR_CENTEREDWINDOWNAME_PATCH #endif // BAR_CENTEREDWINDOWNAME_PATCH
XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, a->y, w, a->h);
#if BAR_CENTEREDWINDOWNAME_PATCH
/* Apply center padding, if any */
tx += cpad;
tw -= cpad;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
tx += tpad;
tw -= lrpad;
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
drw_text(drw, x, barg->y, w, barg->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False); if (ipad) {
if (c->icon) drw_pic(drw, tx, a->y + (a->h - c->ich) / 2, c->icw, c->ich, c->icon);
drw_img(drw, x + pad, barg->y + (barg->h - c->icon->height) / 2, c->icon, tmpicon); tx += ipad;
#else tw -= ipad;
drw_text(drw, x, barg->y, w, barg->h, pad, c->name, 0, False); }
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
drawstateindicator(m, c, 1, x + 2, barg->y, w, barg->h, 0, 0, 0); drw_text(drw, tx, a->y, tw, a->h, 0, c->name, 0, False);
drawstateindicator(m, c, 1, x + 2, a->y, w, a->h, 0, 0, 0);
if (FLEXWINTITLE_BORDERS) { if (FLEXWINTITLE_BORDERS) {
XSetForeground(drw->dpy, drw->gc, scheme[SchemeSel][ColBorder].pixel); XSetForeground(drw->dpy, drw->gc, scheme[SchemeSel][ColBorder].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, barg->y, 1, barg->h); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, a->y, 1, a->h);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x + w - (x + w >= barg->w ? 1 : 0), barg->y, 1, barg->h); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x + w - (x + w >= a->w ? 1 : 0), a->y, 1, a->h);
} }
/* Optional tags icons */ /* Optional tags icons */
for (i = 0; i < NUMTAGS; i++) { for (i = 0; i < NUMTAGS; i++) {
if ((m->tagset[m->seltags] >> i) & 1) if ((m->tagset[m->seltags] >> i) & 1)
@@ -215,7 +244,7 @@ flextitledraw(Monitor *m, Client *c, int unused, int x, int w, int tabscheme, Ar
} }
if (TAGSINDICATOR == 2 || nclienttags > 1 || nviewtags > 1) if (TAGSINDICATOR == 2 || nclienttags > 1 || nviewtags > 1)
drawindicator(m, c, 1, x, barg->y, w, barg->h, 0, 0, 0, INDICATOR_RIGHT_TAGS); drawindicator(m, c, 1, x, a->y, w, a->h, 0, 0, 0, INDICATOR_RIGHT_TAGS);
} }
#ifndef HIDDEN #ifndef HIDDEN

View File

@@ -8,6 +8,7 @@ holdbar(const Arg *arg)
updatebarpos(selmon); updatebarpos(selmon);
for (bar = selmon->bar; bar; bar = bar->next) for (bar = selmon->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
drawbar(selmon);
} }
void void
@@ -29,6 +30,10 @@ keyrelease(XEvent *e)
updatebarpos(selmon); updatebarpos(selmon);
for (bar = selmon->bar; bar; bar = bar->next) for (bar = selmon->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
#if BAR_SYSTRAY_PATCH
if (!selmon->showbar && systray)
XMoveWindow(dpy, systray->win, -32000, -32000);
#endif // BAR_SYSTRAY_PATCH
arrange(selmon); arrange(selmon);
} }
#if COMBO_PATCH #if COMBO_PATCH

View File

@@ -36,11 +36,21 @@ click_bartabgroups(Bar *bar, Arg *arg, BarArg *a)
} }
void void
bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg *arg, BarArg *barg) bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg *arg, BarArg *a)
{ {
if (!c) if (!c)
return; return;
int i, nclienttags = 0, nviewtags = 0, pad = lrpad / 2; int i, nclienttags = 0, nviewtags = 0;
int tpad = lrpad / 2;
#if BAR_WINICON_PATCH
int ipad = c->icon ? c->icw + ICONSPACING : 0;
#endif // BAR_WINICON_PATCH
#if BAR_CENTEREDWINDOWNAME_PATCH
int cpad = 0;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
int tx = x;
int tw = w;
drw_setscheme(drw, scheme[ drw_setscheme(drw, scheme[
m->sel == c m->sel == c
#ifdef HIDDEN #ifdef HIDDEN
@@ -55,27 +65,44 @@ bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg
? SchemeTitleSel ? SchemeTitleSel
: SchemeTitleNorm : SchemeTitleNorm
]); ]);
if (w <= TEXTW("A") - lrpad + pad) // reduce text padding if wintitle is too small if (w <= TEXTW("A") - lrpad + tpad) // reduce text padding if wintitle is too small
pad = (w - TEXTW("A") + lrpad < 0 ? 0 : (w - TEXTW("A") + lrpad) / 2); tpad = (w - TEXTW("A") + lrpad < 0 ? 0 : (w - TEXTW("A") + lrpad) / 2);
#if BAR_CENTEREDWINDOWNAME_PATCH #if BAR_WINICON_PATCH && BAR_CENTEREDWINDOWNAME_PATCH
else if (TEXTW(c->name) + ipad < w)
cpad = (w - TEXTW(c->name) - ipad) / 2;
#elif BAR_CENTEREDWINDOWNAME_PATCH
else if (TEXTW(c->name) < w) else if (TEXTW(c->name) < w)
pad = (w - TEXTW(c->name) + lrpad) / 2; cpad = (w - TEXTW(c->name)) / 2;
#endif // BAR_CENTEREDWINDOWNAME_PATCH #endif // BAR_CENTEREDWINDOWNAME_PATCH
XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, a->y, w, a->h);
#if BAR_CENTEREDWINDOWNAME_PATCH
/* Apply center padding, if any */
tx += cpad;
tw -= cpad;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
tx += tpad;
tw -= lrpad;
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
drw_text(drw, x, barg->y, w, barg->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False); if (ipad) {
if (c->icon) drw_pic(drw, tx, a->y + (a->h - c->ich) / 2, c->icw, c->ich, c->icon);
drw_img(drw, x + pad, barg->y + (barg->h - c->icon->height) / 2, c->icon, tmpicon); tx += ipad;
#else tw -= ipad;
drw_text(drw, x, barg->y, w, barg->h, pad, c->name, 0, False); }
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
drawstateindicator(m, c, 1, x, barg->y, w, barg->h, 0, 0, c->isfixed); drw_text(drw, tx, a->y, tw, a->h, 0, c->name, 0, False);
drawstateindicator(m, c, 1, x, a->y, w, a->h, 0, 0, c->isfixed);
if (BARTAB_BORDERS) { if (BARTAB_BORDERS) {
XSetForeground(drw->dpy, drw->gc, scheme[SchemeSel][ColBorder].pixel); XSetForeground(drw->dpy, drw->gc, scheme[SchemeSel][ColBorder].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, barg->y, 1, barg->h); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, a->y, 1, a->h);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x + w - (x + w >= barg->w ? 1 : 0), barg->y, 1, barg->h); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x + w - (x + w >= a->w ? 1 : 0), a->y, 1, a->h);
} }
/* Optional tags icons */ /* Optional tags icons */
for (i = 0; i < NUMTAGS; i++) { for (i = 0; i < NUMTAGS; i++) {
@@ -86,7 +113,7 @@ bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg
} }
if (TAGSINDICATOR == 2 || nclienttags > 1 || nviewtags > 1) if (TAGSINDICATOR == 2 || nclienttags > 1 || nviewtags > 1)
drawindicator(m, c, 1, x, barg->y, w, barg->h, 0, 0, 0, INDICATOR_RIGHT_TAGS); drawindicator(m, c, 1, x, a->y, w, a->h, 0, 0, 0, INDICATOR_RIGHT_TAGS);
} }
#ifndef HIDDEN #ifndef HIDDEN

View File

@@ -4,7 +4,7 @@ tagicon(Monitor *m, int tag)
#if BAR_ALTTAGSDECORATION_PATCH #if BAR_ALTTAGSDECORATION_PATCH
Client *c; Client *c;
#endif // BAR_ALTTAGSDECORATION_PATCH #endif // BAR_ALTTAGSDECORATION_PATCH
int tagindex = tag + NUMTAGS * m->index; int tagindex = tag + NUMTAGS * m->num;
if (tagindex >= LENGTH(tagicons[DEFAULT_TAGS])) if (tagindex >= LENGTH(tagicons[DEFAULT_TAGS]))
tagindex = tagindex % LENGTH(tagicons[DEFAULT_TAGS]); tagindex = tagindex % LENGTH(tagicons[DEFAULT_TAGS]);
#if BAR_ALTTAGSDECORATION_PATCH #if BAR_ALTTAGSDECORATION_PATCH

91
patch/bar_taglabels.c Normal file
View File

@@ -0,0 +1,91 @@
int
width_taglabels(Bar *bar, BarArg *a)
{
int w, i;
Client *c;
Monitor *m = bar->mon;
char *icon;
unsigned int occ = 0;
for (c = m->clients; c; c = c->next)
occ |= c->tags == 255 ? 0 : c->tags;
for (w = 0, i = 0; i < NUMTAGS; i++) {
m->taglabel[i][0] = '\0';
#if BAR_HIDEVACANTTAGS_PATCH
if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
icon = tagicon(m, i);
XClassHint ch = { NULL, NULL };
for (c = m->clients; c; c = c->next) {
if (c->tags & (1 << i)) {
XGetClassHint(dpy, c->win, &ch);
break;
}
}
if (ch.res_class) {
if (lcaselbl)
ch.res_class[0] = tolower(ch.res_class[0]);
snprintf(m->taglabel[i], 64, ptagf, icon, ch.res_class);
} else
snprintf(m->taglabel[i], 64, etagf, icon);
w += TEXTW(m->taglabel[i]);
}
return w;
}
int
draw_taglabels(Bar *bar, BarArg *a)
{
int invert = 0;
int w, x = a->x;
unsigned int i, occ = 0, urg = 0;
Client *c;
Monitor *m = bar->mon;
for (c = m->clients; c; c = c->next)
if (c->isurgent)
urg |= c->tags;
for (i = 0; i < NUMTAGS; i++) {
/* do not draw vacant tags */
if (!m->taglabel[i][0])
continue;
drw_setscheme(drw, scheme[
m->tagset[m->seltags] & 1 << i
? SchemeTagsSel
: urg & 1 << i
? SchemeUrg
: SchemeTagsNorm
]);
w = TEXTW(m->taglabel[i]);
drw_text(drw, x, a->y, w, a->h, lrpad / 2, m->taglabel[i], invert, False);
drawindicator(m, NULL, occ, x, a->y, w, a->h, i, -1, invert, tagindicatortype);
#if BAR_UNDERLINETAGS_PATCH
if (ulineall || m->tagset[m->seltags] & 1 << i)
drw_rect(drw, x + ulinepad, bh - ulinestroke - ulinevoffset, w - (ulinepad * 2), ulinestroke, 1, 0);
#endif // BAR_UNDERLINETAGS_PATCH
x += w;
}
return 1;
}
int
click_taglabels(Bar *bar, Arg *arg, BarArg *a)
{
int i = 0, x = lrpad / 2;
Monitor *m = bar->mon;
do {
if (!m->taglabel[i][0])
continue;
x += TEXTW(m->taglabel[i]);
} while (a->x >= x && ++i < NUMTAGS);
if (i < NUMTAGS) {
arg->ui = 1 << i;
}
return ClkTagBar;
}

5
patch/bar_taglabels.h Normal file
View File

@@ -0,0 +1,5 @@
#include <ctype.h> /* for making tab label lowercase, very tiny standard library */
static int width_taglabels(Bar *bar, BarArg *a);
static int draw_taglabels(Bar *bar, BarArg *a);
static int click_taglabels(Bar *bar, Arg *arg, BarArg *a);

View File

@@ -57,6 +57,10 @@ draw_tags(Bar *bar, BarArg *a)
]); ]);
drw_text(drw, x, a->y, w, a->h, lrpad / 2, icon, invert, False); drw_text(drw, x, a->y, w, a->h, lrpad / 2, icon, invert, False);
drawindicator(m, NULL, occ, x, a->y, w, a->h, i, -1, invert, tagindicatortype); drawindicator(m, NULL, occ, x, a->y, w, a->h, i, -1, invert, tagindicatortype);
#if BAR_UNDERLINETAGS_PATCH
if (ulineall || m->tagset[m->seltags] & 1 << i)
drw_rect(drw, x + ulinepad, bh - ulinestroke - ulinevoffset, w - (ulinepad * 2), ulinestroke, 1, 0);
#endif // BAR_UNDERLINETAGS_PATCH
x += w; x += w;
} }
@@ -66,7 +70,7 @@ draw_tags(Bar *bar, BarArg *a)
int int
click_tags(Bar *bar, Arg *arg, BarArg *a) click_tags(Bar *bar, Arg *arg, BarArg *a)
{ {
int i = 0, x = lrpad / 2; int i = 0, x = 0;
#if BAR_HIDEVACANTTAGS_PATCH #if BAR_HIDEVACANTTAGS_PATCH
Client *c; Client *c;
unsigned int occ = 0; unsigned int occ = 0;

View File

@@ -1,60 +1,12 @@
static uint32_t tmpicon[ICONSIZE * ICONSIZE];
static uint32_t prealpha(uint32_t p) { static uint32_t prealpha(uint32_t p) {
uint8_t a = p >> 24u; uint8_t a = p >> 24u;
uint32_t rb = (a * (p & 0xFF00FFu)) >> 8u; uint32_t rb = (a * (p & 0xFF00FFu)) >> 8u;
uint32_t g = (a * (p & 0x00FF00u)) >> 8u; uint32_t g = (a * (p & 0x00FF00u)) >> 8u;
return (rb & 0xFF00FFu) | (g & 0x00FF00u) | ((~a) << 24u); return (rb & 0xFF00FFu) | (g & 0x00FF00u) | (a << 24u);
} }
#if BAR_ALPHA_PATCH Picture
static uint8_t div255(uint16_t x) { return (x*0x8081u) >> 23u; } geticonprop(Window win, unsigned int *picw, unsigned int *pich)
static uint32_t blend(uint32_t p1rb, uint32_t p1g, uint8_t p1a, uint32_t p2) {
uint8_t a = p2 >> 24u;
uint32_t rb = (p2 & 0xFF00FFu) + ( (a * p1rb) >> 8u );
uint32_t g = (p2 & 0x00FF00u) + ( (a * p1g) >> 8u );
return (rb & 0xFF00FFu) | (g & 0x00FF00u) | div255(~a * 255u + a * p1a) << 24u;
}
void
drw_img(Drw *drw, int x, int y, XImage *img, uint32_t *tmp)
{
if (!drw || !drw->scheme)
return;
uint32_t *data = (uint32_t *)img->data, p = drw->scheme[ColBg].pixel,
prb = p & 0xFF00FFu, pg = p & 0x00FF00u;
uint8_t pa = p >> 24u;
int icsz = img->width * img->height, i;
for (i = 0; i < icsz; ++i) tmp[i] = blend(prb, pg, pa, data[i]);
img->data = (char *) tmp;
XPutImage(drw->dpy, drw->drawable, drw->gc, img, 0, 0, x, y, img->width, img->height);
img->data = (char *) data;
}
#else
static uint32_t blend(uint32_t p1rb, uint32_t p1g, uint32_t p2) {
uint8_t a = p2 >> 24u;
uint32_t rb = (p2 & 0xFF00FFu) + ( (a * p1rb) >> 8u );
uint32_t g = (p2 & 0x00FF00u) + ( (a * p1g) >> 8u );
return (rb & 0xFF00FFu) | (g & 0x00FF00u) | ((~a) << 24u);
}
void
drw_img(Drw *drw, int x, int y, XImage *img, uint32_t *tmp)
{
if (!drw || !drw->scheme)
return;
uint32_t *data = (uint32_t *)img->data, p = drw->scheme[ColBg].pixel, prb = p & 0xFF00FFu, pg = p & 0x00FF00u;
int icsz = img->width * img->height, i;
for (i = 0; i < icsz; ++i) tmp[i] = blend(prb, pg, data[i]);
img->data = (char *) tmp;
XPutImage(drw->dpy, drw->drawable, drw->gc, img, 0, 0, x, y, img->width, img->height);
img->data = (char *) data;
}
#endif // BAR_ALPHA_PATCH
XImage *
geticonprop(Window win)
{ {
int format; int format;
unsigned long n, extra, *p = NULL; unsigned long n, extra, *p = NULL;
@@ -62,34 +14,32 @@ geticonprop(Window win)
if (XGetWindowProperty(dpy, win, netatom[NetWMIcon], 0L, LONG_MAX, False, AnyPropertyType, if (XGetWindowProperty(dpy, win, netatom[NetWMIcon], 0L, LONG_MAX, False, AnyPropertyType,
&real, &format, &n, &extra, (unsigned char **)&p) != Success) &real, &format, &n, &extra, (unsigned char **)&p) != Success)
return NULL; return None;
if (n == 0 || format != 32) { XFree(p); return NULL; } if (n == 0 || format != 32) { XFree(p); return None; }
unsigned long *bstp = NULL; unsigned long *bstp = NULL;
uint32_t w, h, sz; uint32_t w, h, sz;
{ {
const unsigned long *end = p + n; unsigned long *i; const unsigned long *end = p + n;
unsigned long *i;
uint32_t bstd = UINT32_MAX, d, m; uint32_t bstd = UINT32_MAX, d, m;
for (i = p; i < end - 1; i += sz) { for (i = p; i < end - 1; i += sz) {
if ((w = *i++) > UINT16_MAX || (h = *i++) > UINT16_MAX) { XFree(p); return NULL; } if ((w = *i++) >= 16384 || (h = *i++) >= 16384) { XFree(p); return None; }
if ((sz = w * h) > end - i) break; if ((sz = w * h) > end - i) break;
if ((m = w > h ? w : h) >= ICONSIZE && (d = m - ICONSIZE) < bstd) { bstd = d; bstp = i; } if ((m = w > h ? w : h) >= ICONSIZE && (d = m - ICONSIZE) < bstd) { bstd = d; bstp = i; }
} }
if (!bstp) { if (!bstp) {
for (i = p; i < end - 1; i += sz) { for (i = p; i < end - 1; i += sz) {
if ((w = *i++) > UINT16_MAX || (h = *i++) > UINT16_MAX) { XFree(p); return NULL; } if ((w = *i++) >= 16384 || (h = *i++) >= 16384) { XFree(p); return None; }
if ((sz = w * h) > end - i) break; if ((sz = w * h) > end - i) break;
if ((d = ICONSIZE - (w > h ? w : h)) < bstd) { bstd = d; bstp = i; } if ((d = ICONSIZE - (w > h ? w : h)) < bstd) { bstd = d; bstp = i; }
} }
} }
if (!bstp) { XFree(p); return NULL; } if (!bstp) { XFree(p); return None; }
} }
if ((w = *(bstp - 2)) == 0 || (h = *(bstp - 1)) == 0) { XFree(p); return NULL; } if ((w = *(bstp - 2)) == 0 || (h = *(bstp - 1)) == 0) { XFree(p); return None; }
uint32_t icw, ich, icsz; uint32_t icw, ich;
if (w <= h) { if (w <= h) {
ich = ICONSIZE; icw = w * ICONSIZE / h; ich = ICONSIZE; icw = w * ICONSIZE / h;
if (icw == 0) icw = 1; if (icw == 0) icw = 1;
@@ -98,43 +48,92 @@ geticonprop(Window win)
icw = ICONSIZE; ich = h * ICONSIZE / w; icw = ICONSIZE; ich = h * ICONSIZE / w;
if (ich == 0) ich = 1; if (ich == 0) ich = 1;
} }
icsz = icw * ich; *picw = icw; *pich = ich;
uint32_t i; uint32_t i, *bstp32 = (uint32_t *)bstp;
#if ULONG_MAX > UINT32_MAX for (sz = w * h, i = 0; i < sz; ++i) bstp32[i] = prealpha(bstp[i]);
uint32_t *bstp32 = (uint32_t *)bstp;
for (sz = w * h, i = 0; i < sz; ++i) bstp32[i] = bstp[i]; Picture ret = drw_picture_create_resized(drw, (char *)bstp, w, h, icw, ich);
#endif XFree(p);
uint32_t *icbuf = malloc(icsz << 2); if(!icbuf) { XFree(p); return NULL; }
if (w == icw && h == ich) memcpy(icbuf, bstp, icsz << 2); return ret;
else { }
Imlib_Image origin = imlib_create_image_using_data(w, h, (DATA32 *)bstp);
if (!origin) { XFree(p); free(icbuf); return NULL; } Picture
drw_picture_create_resized(Drw *drw, char *src, unsigned int srcw, unsigned int srch, unsigned int dstw, unsigned int dsth) {
Pixmap pm;
Picture pic;
GC gc;
if (srcw <= (dstw << 1u) && srch <= (dsth << 1u)) {
XImage img = {
srcw, srch, 0, ZPixmap, src,
ImageByteOrder(drw->dpy), BitmapUnit(drw->dpy), BitmapBitOrder(drw->dpy), 32,
32, 0, 32,
0, 0, 0
};
XInitImage(&img);
pm = XCreatePixmap(drw->dpy, drw->root, srcw, srch, 32);
gc = XCreateGC(drw->dpy, pm, 0, NULL);
XPutImage(drw->dpy, pm, gc, &img, 0, 0, 0, 0, srcw, srch);
XFreeGC(drw->dpy, gc);
pic = XRenderCreatePicture(drw->dpy, pm, XRenderFindStandardFormat(drw->dpy, PictStandardARGB32), 0, NULL);
XFreePixmap(drw->dpy, pm);
XRenderSetPictureFilter(drw->dpy, pic, FilterBilinear, NULL, 0);
XTransform xf;
xf.matrix[0][0] = (srcw << 16u) / dstw; xf.matrix[0][1] = 0; xf.matrix[0][2] = 0;
xf.matrix[1][0] = 0; xf.matrix[1][1] = (srch << 16u) / dsth; xf.matrix[1][2] = 0;
xf.matrix[2][0] = 0; xf.matrix[2][1] = 0; xf.matrix[2][2] = 65536;
XRenderSetPictureTransform(drw->dpy, pic, &xf);
} else {
Imlib_Image origin = imlib_create_image_using_data(srcw, srch, (DATA32 *)src);
if (!origin) return None;
imlib_context_set_image(origin); imlib_context_set_image(origin);
imlib_image_set_has_alpha(1); imlib_image_set_has_alpha(1);
Imlib_Image scaled = imlib_create_cropped_scaled_image(0, 0, w, h, icw, ich); Imlib_Image scaled = imlib_create_cropped_scaled_image(0, 0, srcw, srch, dstw, dsth);
imlib_free_image_and_decache(); imlib_free_image_and_decache();
if (!scaled) { XFree(p); free(icbuf); return NULL; } if (!scaled) return None;
imlib_context_set_image(scaled); imlib_context_set_image(scaled);
imlib_image_set_has_alpha(1); imlib_image_set_has_alpha(1);
memcpy(icbuf, imlib_image_get_data_for_reading_only(), icsz << 2);
XImage img = {
dstw, dsth, 0, ZPixmap, (char *)imlib_image_get_data_for_reading_only(),
ImageByteOrder(drw->dpy), BitmapUnit(drw->dpy), BitmapBitOrder(drw->dpy), 32,
32, 0, 32,
0, 0, 0
};
XInitImage(&img);
pm = XCreatePixmap(drw->dpy, drw->root, dstw, dsth, 32);
gc = XCreateGC(drw->dpy, pm, 0, NULL);
XPutImage(drw->dpy, pm, gc, &img, 0, 0, 0, 0, dstw, dsth);
imlib_free_image_and_decache(); imlib_free_image_and_decache();
XFreeGC(drw->dpy, gc);
pic = XRenderCreatePicture(drw->dpy, pm, XRenderFindStandardFormat(drw->dpy, PictStandardARGB32), 0, NULL);
XFreePixmap(drw->dpy, pm);
} }
XFree(p);
for (i = 0; i < icsz; ++i) icbuf[i] = prealpha(icbuf[i]); return pic;
#if BAR_ALPHA_PATCH }
return XCreateImage(dpy, drw->visual, drw->depth, ZPixmap, 0, (char *)icbuf, icw, ich, 32, 0);
#else void
return XCreateImage(dpy, DefaultVisual(dpy, screen), DefaultDepth(dpy, screen), ZPixmap, 0, (char *)icbuf, icw, ich, 32, 0); drw_pic(Drw *drw, int x, int y, unsigned int w, unsigned int h, Picture pic)
#endif // BAR_ALPHA_PATCH {
if (!drw)
return;
XRenderComposite(drw->dpy, PictOpOver, pic, None, drw->picture, 0, 0, 0, 0, x, y, w, h);
} }
void void
freeicon(Client *c) freeicon(Client *c)
{ {
if (c->icon) { if (c->icon) {
XDestroyImage(c->icon); XRenderFreePicture(dpy, c->icon);
c->icon = NULL; c->icon = None;
} }
} }
@@ -142,5 +141,5 @@ void
updateicon(Client *c) updateicon(Client *c)
{ {
freeicon(c); freeicon(c);
c->icon = geticonprop(c->win); c->icon = geticonprop(c->win, &c->icw, &c->ich);
} }

View File

@@ -2,7 +2,8 @@
#include <limits.h> #include <limits.h>
#include <stdint.h> #include <stdint.h>
void drw_img(Drw *drw, int x, int y, XImage *img, uint32_t *tmp); static Picture drw_picture_create_resized(Drw *drw, char *src, unsigned int src_w, unsigned int src_h, unsigned int dst_w, unsigned int dst_h);
static XImage *geticonprop(Window win); static void drw_pic(Drw *drw, int x, int y, unsigned int w, unsigned int h, Picture pic);
static Picture geticonprop(Window w, unsigned int *icw, unsigned int *ich);
static void freeicon(Client *c); static void freeicon(Client *c);
static void updateicon(Client *c); static void updateicon(Client *c);

View File

@@ -18,7 +18,6 @@ draw_wintitle(Bar *bar, BarArg *a)
#endif // BAR_TITLE_LEFT_PAD_PATCH | BAR_TITLE_RIGHT_PAD_PATCH #endif // BAR_TITLE_LEFT_PAD_PATCH | BAR_TITLE_RIGHT_PAD_PATCH
Monitor *m = bar->mon; Monitor *m = bar->mon;
Client *c = m->sel; Client *c = m->sel;
int pad = lrpad / 2;
if (!c) { if (!c) {
drw_setscheme(drw, scheme[SchemeTitleNorm]); drw_setscheme(drw, scheme[SchemeTitleNorm]);
@@ -26,23 +25,53 @@ draw_wintitle(Bar *bar, BarArg *a)
return 0; return 0;
} }
int tpad = lrpad / 2;
#if BAR_WINICON_PATCH
int ipad = c->icon ? c->icw + ICONSPACING : 0;
#endif // BAR_WINICON_PATCH
#if BAR_CENTEREDWINDOWNAME_PATCH
int cpad = 0;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
int tx = x;
int tw = w;
drw_setscheme(drw, scheme[m == selmon ? SchemeTitleSel : SchemeTitleNorm]); drw_setscheme(drw, scheme[m == selmon ? SchemeTitleSel : SchemeTitleNorm]);
#if BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH #if BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
XSetErrorHandler(xerrordummy); XSetErrorHandler(xerrordummy);
#endif // BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH #endif // BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
#if BAR_CENTEREDWINDOWNAME_PATCH
if (TEXTW(c->name) < w) if (w <= TEXTW("A") - lrpad + tpad) // reduce text padding if wintitle is too small
pad = (w - TEXTW(c->name) + lrpad) / 2; tpad = (w - TEXTW("A") + lrpad < 0 ? 0 : (w - TEXTW("A") + lrpad) / 2);
#if BAR_WINICON_PATCH && BAR_CENTEREDWINDOWNAME_PATCH
else if (TEXTW(c->name) + ipad < w)
cpad = (w - TEXTW(c->name) - ipad) / 2;
#elif BAR_CENTEREDWINDOWNAME_PATCH
else if (TEXTW(c->name) < w)
cpad = (w - TEXTW(c->name)) / 2;
#endif // BAR_CENTEREDWINDOWNAME_PATCH #endif // BAR_CENTEREDWINDOWNAME_PATCH
XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, a->y, w, a->h);
#if BAR_CENTEREDWINDOWNAME_PATCH
/* Apply center padding, if any */
tx += cpad;
tw -= cpad;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
tx += tpad;
tw -= lrpad;
#if BAR_WINICON_PATCH #if BAR_WINICON_PATCH
drw_text(drw, x, a->y, w, a->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False); if (ipad) {
if (c->icon) drw_pic(drw, tx, a->y + (a->h - c->ich) / 2, c->icw, c->ich, c->icon);
drw_img(drw, x + pad, a->y + (a->h - c->icon->height) / 2, c->icon, tmpicon); tx += ipad;
#else tw -= ipad;
drw_text(drw, x, a->y, w, a->h, pad, c->name, 0, False); }
#endif // BAR_WINICON_PATCH #endif // BAR_WINICON_PATCH
drw_text(drw, tx, a->y, tw, a->h, 0, c->name, 0, False);
#if BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH #if BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
XSync(dpy, False); XSync(dpy, False);
XSetErrorHandler(xerror); XSetErrorHandler(xerror);

View File

@@ -30,21 +30,10 @@ combotag(const Arg *arg)
void void
comboview(const Arg *arg) comboview(const Arg *arg)
{ {
unsigned newtags = arg->ui & TAGMASK;
if (combo) { if (combo) {
selmon->tagset[selmon->seltags] |= newtags; view(&((Arg) { .ui = selmon->tagset[selmon->seltags] | (arg->ui & TAGMASK) }));
} else { } else {
selmon->seltags ^= 1; /*toggle tagset*/
combo = 1; combo = 1;
if (newtags) { view(arg);
#if PERTAG_PATCH
pertagview(&((Arg) { .ui = newtags }));
#else
selmon->tagset[selmon->seltags] = newtags;
#endif // PERTAG_PATCH
}
} }
focus(NULL);
arrange(selmon);
} }

View File

@@ -1,9 +1,16 @@
void void
distributetags(const Arg *arg) distributetags(const Arg *arg)
{ {
Client *c;
unsigned int ui = 1; unsigned int ui = 1;
int i = 0; int i = 0;
for (Client *c = selmon->clients; c; c = c->next) {
#if TAGSYNC_PATCH
Monitor *origselmon = selmon;
for (selmon = mons; selmon; selmon = selmon->next) {
#endif // TAGSYNC_PATCH
for (c = selmon->clients; c; c = c->next) {
if (HIDDEN(c)) if (HIDDEN(c))
continue; continue;
if (!(c->tags & TAGMASK)) if (!(c->tags & TAGMASK))
@@ -11,7 +18,14 @@ distributetags(const Arg *arg)
c->tags = (ui << i) & TAGMASK; c->tags = (ui << i) & TAGMASK;
i = (i + 1) % NUMTAGS; i = (i + 1) % NUMTAGS;
} }
#if TAGSYNC_PATCH
}
selmon = origselmon;
focus(NULL);
arrange(NULL);
#else
focus(NULL); focus(NULL);
arrange(selmon); arrange(selmon);
#endif // TAGSYNC_PATCH
} }

View File

@@ -1,8 +1,9 @@
void void
tagtoleft(const Arg *arg) tagtoleft(const Arg *arg)
{ {
unsigned int MASK = (1 << NUMTAGS) - 1;
if (selmon->sel != NULL if (selmon->sel != NULL
&& __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 && __builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1
&& selmon->tagset[selmon->seltags] > 1) { && selmon->tagset[selmon->seltags] > 1) {
selmon->sel->tags >>= 1; selmon->sel->tags >>= 1;
focus(NULL); focus(NULL);
@@ -13,9 +14,10 @@ tagtoleft(const Arg *arg)
void void
tagtoright(const Arg *arg) tagtoright(const Arg *arg)
{ {
unsigned int MASK = (1 << NUMTAGS) - 1;
if (selmon->sel != NULL if (selmon->sel != NULL
&& __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 && __builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1
&& selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) { && selmon->tagset[selmon->seltags] & (MASK >> 1)) {
selmon->sel->tags <<= 1; selmon->sel->tags <<= 1;
focus(NULL); focus(NULL);
arrange(selmon); arrange(selmon);
@@ -25,80 +27,43 @@ tagtoright(const Arg *arg)
void void
viewtoleft(const Arg *arg) viewtoleft(const Arg *arg)
{ {
if (__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 unsigned int MASK = (1 << NUMTAGS) - 1;
if (__builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1
&& selmon->tagset[selmon->seltags] > 1) { && selmon->tagset[selmon->seltags] > 1) {
selmon->seltags ^= 1; /* toggle sel tagset */ view(&((Arg) { .ui = selmon->tagset[selmon->seltags] >> 1 }));
#if PERTAG_PATCH
pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] >> 1 }));
#else
selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] >> 1;
#endif // pertagview
focus(NULL);
arrange(selmon);
#if BAR_EWMHTAGS_PATCH
updatecurrentdesktop();
#endif // BAR_EWMHTAGS_PATCH
} }
} }
void void
viewtoright(const Arg *arg) viewtoright(const Arg *arg)
{ {
if (__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 unsigned int MASK = (1 << NUMTAGS) - 1;
&& selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) { if (__builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1
selmon->seltags ^= 1; /* toggle sel tagset */ && selmon->tagset[selmon->seltags] & (MASK >> 1)) {
#if PERTAG_PATCH view(&((Arg) { .ui = selmon->tagset[selmon->seltags] << 1 }));
pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] << 1 }));
#else
selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] << 1;
#endif // pertagview
focus(NULL);
arrange(selmon);
#if BAR_EWMHTAGS_PATCH
updatecurrentdesktop();
#endif // BAR_EWMHTAGS_PATCH
} }
} }
void void
tagandviewtoleft(const Arg *arg) tagandviewtoleft(const Arg *arg)
{ {
unsigned int MASK = (1 << NUMTAGS) - 1;
if (selmon->sel != NULL if (selmon->sel != NULL
&& __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 && __builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1
&& selmon->tagset[selmon->seltags] > 1) { && selmon->tagset[selmon->seltags] > 1) {
selmon->sel->tags >>= 1; selmon->sel->tags >>= 1;
selmon->seltags ^= 1; /* toggle sel tagset */ view(&((Arg) { .ui = selmon->tagset[selmon->seltags] >> 1 }));
#if PERTAG_PATCH
pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] >> 1 }));
#else
selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] >> 1;
#endif // pertagview
focus(selmon->sel);
arrange(selmon);
#if BAR_EWMHTAGS_PATCH
updatecurrentdesktop();
#endif // BAR_EWMHTAGS_PATCH
} }
} }
void void
tagandviewtoright(const Arg *arg) tagandviewtoright(const Arg *arg)
{ {
unsigned int MASK = (1 << NUMTAGS) - 1;
if (selmon->sel != NULL if (selmon->sel != NULL
&& __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 && __builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1
&& selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) { && selmon->tagset[selmon->seltags] & (MASK >> 1)) {
selmon->sel->tags <<= 1; selmon->sel->tags <<= 1;
selmon->seltags ^= 1; /* toggle sel tagset */ view(&((Arg) { .ui = selmon->tagset[selmon->seltags] << 1 }));
#if PERTAG_PATCH
pertagview(&((Arg) { .ui = selmon->tagset[selmon->seltags ^ 1] << 1 }));
#else
selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] << 1;
#endif // pertagview
focus(selmon->sel);
arrange(selmon);
#if BAR_EWMHTAGS_PATCH
updatecurrentdesktop();
#endif // BAR_EWMHTAGS_PATCH
} }
} }

View File

@@ -20,9 +20,6 @@
#if COMBO_PATCH #if COMBO_PATCH
#include "combo.c" #include "combo.c"
#endif #endif
#if BAR_HOLDBAR_PATCH
#include "bar_holdbar.c"
#endif
#if BAR_LTSYMBOL_PATCH #if BAR_LTSYMBOL_PATCH
#include "bar_ltsymbol.c" #include "bar_ltsymbol.c"
#endif #endif
@@ -56,6 +53,9 @@
#if BAR_TAGS_PATCH #if BAR_TAGS_PATCH
#include "bar_tags.c" #include "bar_tags.c"
#endif #endif
#if BAR_TAGLABELS_PATCH
#include "bar_taglabels.c"
#endif
#if BAR_TAGGRID_PATCH #if BAR_TAGGRID_PATCH
#include "bar_taggrid.c" #include "bar_taggrid.c"
#endif #endif
@@ -80,6 +80,9 @@
#if BAR_SYSTRAY_PATCH #if BAR_SYSTRAY_PATCH
#include "bar_systray.c" #include "bar_systray.c"
#endif #endif
#if BAR_HOLDBAR_PATCH
#include "bar_holdbar.c"
#endif
#if BAR_VTCOLORS_PATCH #if BAR_VTCOLORS_PATCH
#include "bar_vtcolors.c" #include "bar_vtcolors.c"
#endif #endif

View File

@@ -56,6 +56,9 @@
#if BAR_TAGS_PATCH #if BAR_TAGS_PATCH
#include "bar_tags.h" #include "bar_tags.h"
#endif #endif
#if BAR_TAGLABELS_PATCH
#include "bar_taglabels.h"
#endif
#if BAR_TAGGRID_PATCH #if BAR_TAGGRID_PATCH
#include "bar_taggrid.h" #include "bar_taggrid.h"
#endif #endif

View File

@@ -88,8 +88,10 @@ placemouse(const Arg *arg)
if ((r && r != prevr) || (attachmode != prevattachmode)) { if ((r && r != prevr) || (attachmode != prevattachmode)) {
detachstack(c); detachstack(c);
detach(c); detach(c);
if (c->mon != r->mon) if (c->mon != r->mon) {
arrangemon(c->mon); arrangemon(c->mon);
c->tags = r->mon->tagset[r->mon->seltags];
}
c->mon = r->mon; c->mon = r->mon;
r->mon->sel = r; r->mon->sel = r;

View File

@@ -40,9 +40,11 @@ pushup(const Arg *arg)
} else { } else {
/* move to the end */ /* move to the end */
for (c = sel; c->next; c = c->next); for (c = sel; c->next; c = c->next);
detach(sel); if (sel != c) {
sel->next = NULL; detach(sel);
c->next = sel; sel->next = NULL;
c->next = sel;
}
} }
focus(sel); focus(sel);
arrange(selmon); arrange(selmon);

View File

@@ -1,28 +1,42 @@
void void
reorganizetags(const Arg *arg) reorganizetags(const Arg *arg)
{ {
Client *c; Client *c;
unsigned int occ, unocc, i; unsigned int occ, unocc, i;
unsigned int tagdest[NUMTAGS]; unsigned int tagdest[NUMTAGS];
occ = 0; #if TAGSYNC_PATCH
for (c = selmon->clients; c; c = c->next) Monitor *origselmon = selmon;
occ |= (1 << (ffs(c->tags)-1)); for (selmon = mons; selmon; selmon = selmon->next) {
unocc = 0; #endif // TAGSYNC_PATCH
for (i = 0; i < NUMTAGS; ++i) {
while (unocc < i && (occ & (1 << unocc)))
unocc++;
if (occ & (1 << i)) {
tagdest[i] = unocc;
occ &= ~(1 << i);
occ |= 1 << unocc;
}
}
for (c = selmon->clients; c; c = c->next) occ = 0;
c->tags = 1 << tagdest[ffs(c->tags)-1]; for (c = selmon->clients; c; c = c->next)
if (selmon->sel) occ |= (1 << (ffs(c->tags)-1));
selmon->tagset[selmon->seltags] = selmon->sel->tags; unocc = 0;
arrange(selmon); for (i = 0; i < NUMTAGS; ++i) {
while (unocc < i && (occ & (1 << unocc)))
unocc++;
if (occ & (1 << i)) {
tagdest[i] = unocc;
occ &= ~(1 << i);
occ |= 1 << unocc;
}
}
for (c = selmon->clients; c; c = c->next)
c->tags = 1 << tagdest[ffs(c->tags)-1];
#if TAGSYNC_PATCH
}
selmon = origselmon;
#endif // TAGSYNC_PATCH
if (selmon->sel)
view(&((Arg) { .ui = selmon->sel->tags }));
else
#if TAGSYNC_PATCH
arrange(NULL);
#else
arrange(selmon);
#endif // TAGSYNC_PATCH
} }

View File

@@ -2,44 +2,55 @@ void
setborderpx(const Arg *arg) setborderpx(const Arg *arg)
{ {
Client *c; Client *c;
int prev_borderpx = selmon->borderpx; Monitor *m = selmon;
#if BAR_BORDER_PATCH
if (arg->i == 0) Bar *bar;
selmon->borderpx = borderpx; #endif // BAR_BORDER_PATCH
else if (selmon->borderpx + arg->i < 0) int prev_borderpx = m->borderpx;
selmon->borderpx = 0; m->borderpx = arg->i
else ? MAX(m->borderpx + arg->i, 0)
selmon->borderpx += arg->i; : m->borderpx == borderpx
? 0
: borderpx;
int delta = 2 * (m->borderpx - prev_borderpx);
#if BAR_BORDER_PATCH #if BAR_BORDER_PATCH
for (bar = selmon->bar; bar; bar = bar->next) { for (bar = m->bar; bar; bar = bar->next) {
bar->bh = bar->bh - 2 * bar->borderpx + 2 * selmon->borderpx; bar->bh = bar->bh - 2 * bar->borderpx + 2 * m->borderpx;
bar->borderpx = selmon->borderpx; bar->borderpx = m->borderpx;
} }
updatebarpos(selmon); updatebarpos(m);
for (bar = selmon->bar; bar; bar = bar->next) for (bar = m->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
#endif // BAR_BORDER_PATCH #endif // BAR_BORDER_PATCH
for (c = selmon->clients; c; c = c->next) for (c = m->clients; c; c = c->next) {
{ c->bw = m->borderpx;
if (c->bw + arg->i < 0) #if !FAKEFULLSCREEN_PATCH
c->bw = 0; #if FAKEFULLSCREEN_CLIENT_PATCH
else if (c->isfullscreen && !c->fakefullscreen)
c->bw = selmon->borderpx; continue;
#else
if (c->isfullscreen)
continue;
#endif // FAKEFULLSCREEN_CLIENT_PATCH
#endif // FAKEFULLSCREEN_PATCH
#if BAR_WINTITLEACTIONS_PATCH
if (HIDDEN(c))
continue;
#endif // BAR_WINTITLEACTIONS_PATCH
#if SCRATCHPADS_PATCH
if ((c->tags & SPTAGMASK) && !ISVISIBLE(c))
continue;
#endif // SCRATCHPADS_PATCH
#if SCRATCHPAD_ALT_1_PATCH
if ((c->tags & SCRATCHPAD_MASK))
continue;
#endif // SCRATCHPAD_ALT_1_PATCH
if (!c->isfloating && m->lt[m->sellt]->arrange)
continue;
if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) resizeclient(c, c->x, c->y, c->w - delta, c->h - delta);
{
if (arg->i != 0 && prev_borderpx + arg->i >= 0)
resize(c, c->x, c->y, c->w-(arg->i*2), c->h-(arg->i*2), 0);
else if (arg->i != 0)
resizeclient(c, c->x, c->y, c->w, c->h);
else if (prev_borderpx > borderpx)
resize(c, c->x, c->y, c->w + 2*(prev_borderpx - borderpx), c->h + 2*(prev_borderpx - borderpx), 0);
else if (prev_borderpx < borderpx)
resize(c, c->x, c->y, c->w - 2*(borderpx - prev_borderpx), c->h - 2*(borderpx - prev_borderpx), 0);
}
} }
arrange(selmon); arrange(m);
} }

View File

@@ -8,12 +8,12 @@ shiftview(const Arg *arg)
unsigned int seltagset = selmon->tagset[selmon->seltags]; unsigned int seltagset = selmon->tagset[selmon->seltags];
#endif // SCRATCHPADS_PATCH #endif // SCRATCHPADS_PATCH
if (arg->i > 0) // left circular shift if (arg->i > 0) // left circular shift
shifted.ui = (seltagset << arg->i) shifted.ui = (seltagset << arg->i) | (seltagset >> (NUMTAGS - arg->i));
| (seltagset >> (NUMTAGS - arg->i));
else // right circular shift else // right circular shift
shifted.ui = seltagset >> -arg->i shifted.ui = (seltagset >> -arg->i) | (seltagset << (NUMTAGS + arg->i));
| seltagset << (NUMTAGS + arg->i); #if SCRATCHPADS_PATCH
shifted.ui &= ~SPTAGMASK;
#endif // SCRATCHPADS_PATCH
view(&shifted); view(&shifted);
} }

View File

@@ -1,2 +1 @@
static void shiftview(const Arg *arg); static void shiftview(const Arg *arg);

View File

@@ -5,7 +5,11 @@ shiftviewclients(const Arg *arg)
Client *c; Client *c;
unsigned int tagmask = 0; unsigned int tagmask = 0;
for (c = selmon->clients; c; c = c->next) #if TAGSYNC_PATCH
Monitor *origselmon = selmon;
for (selmon = mons; selmon; selmon = selmon->next)
#endif // TAGSYNC_PATCH
for (c = selmon->clients; c; c = c->next) {
#if SCRATCHPADS_PATCH #if SCRATCHPADS_PATCH
if (!(c->tags & SPTAGMASK)) if (!(c->tags & SPTAGMASK))
tagmask = tagmask | c->tags; tagmask = tagmask | c->tags;
@@ -15,28 +19,28 @@ shiftviewclients(const Arg *arg)
#else #else
tagmask = tagmask | c->tags; tagmask = tagmask | c->tags;
#endif // SCRATCHPADS_PATCH #endif // SCRATCHPADS_PATCH
}
#if TAGSYNC_PATCH
selmon = origselmon;
#endif // TAGSYNC_PATCH
#if SCRATCHPADS_PATCH #if SCRATCHPADS_PATCH
shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK; shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
#else #else
shifted.ui = selmon->tagset[selmon->seltags]; shifted.ui = selmon->tagset[selmon->seltags];
#endif // SCRATCHPADS_PATCH #endif // SCRATCHPADS_PATCH
if (arg->i > 0) // left circular shift
do { do {
if (arg->i > 0) // left circular shift
shifted.ui = (shifted.ui << arg->i) shifted.ui = (shifted.ui << arg->i)
| (shifted.ui >> (NUMTAGS - arg->i)); | (shifted.ui >> (NUMTAGS - arg->i));
#if SCRATCHPADS_PATCH else // right circular shift
shifted.ui &= ~SPTAGMASK; shifted.ui = (shifted.ui >> -arg->i)
#endif // SCRATCHPADS_PATCH | (shifted.ui << (NUMTAGS + arg->i));
} while (tagmask && !(shifted.ui & tagmask)); #if SCRATCHPADS_PATCH
else // right circular shift shifted.ui &= ~SPTAGMASK;
do { #endif // SCRATCHPADS_PATCH
shifted.ui = (shifted.ui >> (- arg->i) } while (tagmask && !(shifted.ui & tagmask));
| shifted.ui << (NUMTAGS + arg->i));
#if SCRATCHPADS_PATCH
shifted.ui &= ~SPTAGMASK;
#endif // SCRATCHPADS_PATCH
} while (tagmask && !(shifted.ui & tagmask));
view(&shifted); view(&shifted);
} }

View File

@@ -1,2 +1 @@
static void shiftviewclients(const Arg *arg); static void shiftviewclients(const Arg *arg);

View File

@@ -2,6 +2,10 @@ void
checkfloatingrules(Client *c) checkfloatingrules(Client *c)
{ {
const char *class, *instance; const char *class, *instance;
Atom wintype;
#if WINDOWROLERULE_PATCH
char role[64];
#endif // WINDOWROLERULE_PATCH
unsigned int i; unsigned int i;
const Rule *r; const Rule *r;
XClassHint ch = { NULL, NULL }; XClassHint ch = { NULL, NULL };
@@ -9,13 +13,23 @@ checkfloatingrules(Client *c)
XGetClassHint(dpy, c->win, &ch); XGetClassHint(dpy, c->win, &ch);
class = ch.res_class ? ch.res_class : broken; class = ch.res_class ? ch.res_class : broken;
instance = ch.res_name ? ch.res_name : broken; instance = ch.res_name ? ch.res_name : broken;
wintype = getatomprop(c, netatom[NetWMWindowType]);
#if WINDOWROLERULE_PATCH
gettextprop(c->win, wmatom[WMWindowRole], role, sizeof(role));
#endif // WINDOWROLERULE_PATCH
for (i = 0; i < LENGTH(rules); i++) { for (i = 0; i < LENGTH(rules); i++) {
r = &rules[i]; r = &rules[i];
if ((!r->title || strstr(c->name, r->title)) if ((!r->title || strstr(c->name, r->title))
&& (!r->class || strstr(class, r->class)) && (!r->class || strstr(class, r->class))
&& (!r->instance || strstr(instance, r->instance))) #if WINDOWROLERULE_PATCH
&& (!r->role || strstr(role, r->role))
#endif // WINDOWROLERULE_PATCH
&& (!r->instance || strstr(instance, r->instance))
&& (!r->wintype || wintype == XInternAtom(dpy, r->wintype, False)))
{
c->isfloating = r->isfloating; c->isfloating = r->isfloating;
}
} }
if (ch.res_class) if (ch.res_class)
XFree(ch.res_class); XFree(ch.res_class);

View File

@@ -1,23 +1,31 @@
void void
swaptags(const Arg *arg) swaptags(const Arg *arg)
{ {
unsigned int newtag = arg->ui & TAGMASK; Client *c;
unsigned int curtag = selmon->tagset[selmon->seltags]; unsigned int newtag = arg->ui & TAGMASK;
unsigned int curtag = selmon->tagset[selmon->seltags];
if (newtag == curtag || !curtag || (curtag & (curtag-1))) if (newtag == curtag || !curtag || (curtag & (curtag-1)))
return; return;
for (Client *c = selmon->clients; c != NULL; c = c->next) { #if TAGSYNC_PATCH
if ((c->tags & newtag) || (c->tags & curtag)) Monitor *origselmon = selmon;
c->tags ^= curtag ^ newtag; for (selmon = mons; selmon; selmon = selmon->next) {
#endif // TAGSYNC_PATCH
if (!c->tags) for (c = selmon->clients; c != NULL; c = c->next) {
c->tags = newtag; if ((c->tags & newtag) || (c->tags & curtag))
} c->tags ^= curtag ^ newtag;
selmon->tagset[selmon->seltags] = newtag; if (!c->tags)
c->tags = newtag;
}
focus(NULL); #if TAGSYNC_PATCH
arrange(selmon); }
selmon = origselmon;
#endif // TAGSYNC_PATCH
view(&((Arg) { .ui = newtag }));
} }

View File

@@ -86,6 +86,16 @@ togglegaps(const Arg *arg)
#else #else
enablegaps = !enablegaps; enablegaps = !enablegaps;
#endif // PERTAG_VANITYGAPS_PATCH #endif // PERTAG_VANITYGAPS_PATCH
#if BAR_PADDING_VANITYGAPS_PATCH
updatebarpos(selmon);
for (Bar *bar = selmon->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
#if BAR_SYSTRAY_PATCH
drawbarwin(systray->bar);
#endif // BAR_SYSTRAY_PATCH
#endif // BAR_PADDING_VANITYGAPS_PATCH
arrange(NULL); arrange(NULL);
} }