Adding bar modules which splits the dwm bar into modules allowing for re-arrangement of the bar and easier integration for new features

This commit is contained in:
bakkeby 2020-07-19 05:01:38 +02:00
commit a7d1663571
87 changed files with 2135 additions and 2136 deletions

View File

@ -2,7 +2,7 @@ This dwm 6.2 (aaad5f, 2020-07-08) side project has a different take on dwm patch
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
#define ALPHA_PATCH 1
#define BAR_ALPHA_PATCH 1
```
So if you have ever been curious about trying out dwm, but have been discouraged by manual patching, then this may be a good starting point to see what a "fully fledged" dwm can look like. Want to try out the `pertag` patch? Just flip a config and recompile. Once you have found out what works for you and what doesn't then you should be in a better position to choose patches should you want to start patching from scratch.
@ -15,6 +15,8 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
### Changelog:
2020-07-19 - Added bar_modules patch - making extrabar, leftlayout, staticstatus and statusallmons patches redundant
2020-07-18 - **Note**: Up until now building dwm-flexipath without any patches selected would have given you something more or less identical with mainstream dwm. In order to reduce complexity when it comes to maintainance future versions of dwm-flexipatch may diverge from this by making some patches non-optional. For the classic dwm-flexipatch and its many patch integration hints refer to branch [dwm-flexipatch-1.0](https://github.com/bakkeby/dwm-flexipatch/tree/dwm-flexipatch-1.0) which will be subject to bug fixes and mainstream dwm updates as far as feasible.
2020-07-05 - Extrabar compatibility improvements (staticstatus, status2d, dwmblocks) and fix for systray randomly causing dwm to crash when first systray application starts
@ -173,6 +175,9 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
- [bar_height](https://dwm.suckless.org/patches/bar_height/)
- allows the bar height to be explicitly set rather than being derived from font
- bar_modules
- splits the dwm bar into modules allowing for re-arrangement of the bar and easier integration for new features
- [barpadding](https://dwm.suckless.org/patches/barpadding/)
- adds vertical and horizontal space between the statusbar and the edge of the screen
@ -224,9 +229,12 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
- this patch allows the user to change size and placement of floating windows using only the keyboard
- it also allows for temporary vertical and horizontal extension of windows similar to other WMs fill command
- [extrabar](https://dwm.suckless.org/patches/extrabar/)
- enables an extra status bar in dwm in a similar manner to the dualstatus patch
- if the primary status is at the top via topbar then the extra status bar will be placed at the bottom and vice versa
- [-extrabar-](https://dwm.suckless.org/patches/extrabar/)
- -enables an extra status bar in dwm in a similar manner to the dualstatus patch-
- -if the primary status is at the top via topbar then the extra status bar will be placed at the bottom and vice versa-
- extrastatus
- formerly extrabar - now only splits the status into to statuses by using a status separator
- [fakefullscreen](https://dwm.suckless.org/patches/fakefullscreen/)
- only allow clients to "fullscreen" into the space currently given to them
@ -291,8 +299,8 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
- [keymodes](https://dwm.suckless.org/patches/keymodes/)
- this patch adds key modes (like in vim or emacs) where chains of keyboard shortcuts can be performed
- [leftlayout](http://dwm.suckless.org/patches/leftlayout/)
- moves the layout symbol in the status bar to the left hand side
- [-leftlayout-](http://dwm.suckless.org/patches/leftlayout/)
- -moves the layout symbol in the status bar to the left hand side-
- [losefullscreen](https://github.com/bakkeby/patches/tree/master/dwm/dwm-losefullscreen-6.2.diff)
- by default in dwm it is possible to make an application fullscreen, then use the focusstack keybindings to focus on other windows beneath the current window
@ -398,14 +406,14 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
- [stacker](https://dwm.suckless.org/patches/stacker/)
- provides comprehensive utilities for managing the client stack
- [staticstatus](https://dwm.suckless.org/patches/staticstatus/)
- allows the status text to be fixed to the bar on a specific monitor rather than being drawn on the focused monitor
- [-staticstatus-](https://dwm.suckless.org/patches/staticstatus/)
- -allows the status text to be fixed to the bar on a specific monitor rather than being drawn on the focused monitor-
- [status2d](https://dwm.suckless.org/patches/status2d/)
- allows colors and rectangle drawing in the dwm status bar
- [statusallmons](https://dwm.suckless.org/patches/statuspadding/)
- this patch draws and updates the statusbar on all monitors
- [-statusallmons-](https://dwm.suckless.org/patches/statuspadding/)
- -this patch draws and updates the statusbar on all monitors-
- [statusbutton](https://dwm.suckless.org/patches/statusbutton/)
- adds a clickable button to the left hand side of the statusbar

View File

@ -15,19 +15,19 @@ static const unsigned int gappoh = 10; /* horiz outer gap between windo
static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */
static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */
#endif // VANITYGAPS_PATCH
#if HOLDBAR_PATCH
#if BAR_HOLDBAR_PATCH
static const int showbar = 0; /* 0 means no bar */
#else
static const int showbar = 1; /* 0 means no bar */
#endif // HOLDBAR_PATCH
#endif // BAR_HOLDBAR_PATCH
static const int topbar = 1; /* 0 means bottom bar */
#if BAR_HEIGHT_PATCH
static const int bar_height = 0; /* 0 means derive from font, >= 1 explicit height */
#endif // BAR_HEIGHT_PATCH
#if BARPADDING_PATCH
#if BAR_PADDING_PATCH
static const int vertpad = 10; /* vertical padding of bar */
static const int sidepad = 10; /* horizontal padding of bar */
#endif // BARPADDING_PATCH
#endif // BAR_PADDING_PATCH
#if FOCUSONCLICK_PATCH
static const int focusonwheel = 0;
#endif // FOCUSONCLICK_PATCH
@ -35,136 +35,127 @@ static const int focusonwheel = 0;
static int floatposgrid_x = 5; /* float grid columns */
static int floatposgrid_y = 5; /* float grid rows */
#endif // FLOATPOS_PATCH
#if STATUSPADDING_PATCH
#if BAR_STATUSPADDING_PATCH
static const int horizpadbar = 2; /* horizontal padding for statusbar */
static const int vertpadbar = 0; /* vertical padding for statusbar */
#endif // STATUSPADDING_PATCH
#if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH
static const int statmonval = 0;
#endif // STATICSTATUS_PATCH
#if STATUSBUTTON_PATCH
#endif // BAR_STATUSPADDING_PATCH
#if BAR_STATUSBUTTON_PATCH
static const char buttonbar[] = "<O>";
#endif // STATUSBUTTON_PATCH
#if SYSTRAY_PATCH
static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
#endif // BAR_STATUSBUTTON_PATCH
#if BAR_SYSTRAY_PATCH
static const unsigned int systrayspacing = 2; /* systray spacing */
static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/
static const int showsystray = 1; /* 0 means no systray */
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_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 */
#endif // ONLYQUITONEMPTY_PATCH
#if EXTRABAR_PATCH
#if BAR_EXTRASTATUS_PATCH
static const char statussep = ';'; /* separator between status bars */
static const int ebalign = 0; /* extrabar alignment: 0 - left, 1 - right, 2 - center */
#if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH
static const int statebmonval = statmonval;
#endif // STATICSTATUS_PATCH
#endif // EXTRABAR_PATCH
#if PANGO_PATCH
#endif // BAR_EXTRASTATUS_PATCH
#if BAR_PANGO_PATCH
static const char font[] = "monospace 10";
#else
static const char *fonts[] = { "monospace:size=10" };
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
static const char dmenufont[] = "monospace:size=10";
static char normfgcolor[] = "#bbbbbb";
static char normbgcolor[] = "#222222";
#if !VTCOLORS_PATCH
#if !BAR_VTCOLORS_PATCH
static char normbordercolor[] = "#444444";
#if FLOAT_BORDER_COLOR_PATCH
static char normfloatcolor[] = "#db8fd9";
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // !VTCOLORS_PATCH
#endif // !BAR_VTCOLORS_PATCH
static char selfgcolor[] = "#eeeeee";
static char selbgcolor[] = "#005577";
#if !VTCOLORS_PATCH
#if !BAR_VTCOLORS_PATCH
static char selbordercolor[] = "#005577";
#if FLOAT_BORDER_COLOR_PATCH
static char selfloatcolor[] = "#005577";
#endif // FLOAT_BORDER_COLOR_PATCH
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
static char warnfgcolor[] = "#000000";
static char warnbgcolor[] = "#ffff00";
static char warnbordercolor[] = "#ff0000";
#if FLOAT_BORDER_COLOR_PATCH
static char warnfloatcolor[] = "#ffffff";
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
static char urgfgcolor[] = "#000000";
static char urgbgcolor[] = "#000000";
static char urgbordercolor[] = "#ff0000"; // NB: patch only works with border color for now
#if FLOAT_BORDER_COLOR_PATCH
static char urgfloatcolor[] = "#000000";
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // URGENTBORDER_PATCH // STATUSCOLORS_PATCH
#endif // URGENTBORDER_PATCH // BAR_STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
static char hidfgcolor[] = "#005577";
static char hidbgcolor[] = "#222222";
static char hidbordercolor[] = "#005577";
#if FLOAT_BORDER_COLOR_PATCH
static char hidfloatcolor[] = "#f76e0c";
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
#if TITLECOLOR_PATCH
#if BAR_TITLECOLOR_PATCH
static char titlefgcolor[] = "#eeeeee";
static char titlebgcolor[] = "#005577";
static char titlebordercolor[] = "#005577";
#if FLOAT_BORDER_COLOR_PATCH
static char titlefloatcolor[] = "#005577";
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // TITLECOLOR_PATCH
#endif // VTCOLORS_PATCH
#endif // BAR_TITLECOLOR_PATCH
#endif // BAR_VTCOLORS_PATCH
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
static const unsigned int baralpha = 0xd0;
static const unsigned int borderalpha = OPAQUE;
static const unsigned int alphas[][3] = {
/* fg bg border */
[SchemeNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeSel] = { OPAQUE, baralpha, borderalpha },
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
[SchemeWarn] = { OPAQUE, baralpha, borderalpha },
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
[SchemeUrg] = { OPAQUE, baralpha, borderalpha },
#endif // URGENTBORDER_PATCH / STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH / BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
[SchemeHid] = { OPAQUE, baralpha, borderalpha },
#endif // AWESOMEBAR_PATCH
#if VTCOLORS_PATCH
#endif // BAR_AWESOMEBAR_PATCH
#if BAR_VTCOLORS_PATCH
[SchemeTagsNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTagsSel] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleSel] = { OPAQUE, baralpha, borderalpha },
[SchemeStatus] = { OPAQUE, baralpha, borderalpha },
#elif TITLECOLOR_PATCH
#elif BAR_TITLECOLOR_PATCH
[SchemeTitle] = { OPAQUE, baralpha, borderalpha },
#endif // VTCOLORS_PATCH / TITLECOLOR_PATCH
#endif // BAR_VTCOLORS_PATCH / BAR_TITLECOLOR_PATCH
};
#endif // ALPHA_PATCH
#if VTCOLORS_PATCH && FLOAT_BORDER_COLOR_PATCH
#endif // BAR_ALPHA_PATCH
#if BAR_VTCOLORS_PATCH && FLOAT_BORDER_COLOR_PATCH
static const char title_bg_dark[] = "#303030";
static const char title_bg_light[] = "#fdfdfd";
static const int color_ptrs[][ColCount] = {
/* fg bg border float */
[SchemeNorm] = { -1, -1, 5, 12 },
[SchemeSel] = { -1, -1, 11, 13 },
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
[SchemeWarn] = { -1, 1, 1, 14 },
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
[SchemeUrg] = { 7, 9, 9, 15 },
#endif // URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
[SchemeHid] = { 5, 0, 0, -1 },
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
[SchemeTagsNorm] = { 2, 0, 0, -1 },
[SchemeTagsSel] = { 6, 5, 5, -1 },
[SchemeTitleNorm] = { 6, -1, -1, -1 },
@ -175,37 +166,37 @@ static char colors[][ColCount][8] = {
/* fg bg border float */
[SchemeNorm] = { "#000000", "#000000", "#000000", "#000000" },
[SchemeSel] = { "#000000", "#000000", "#000000", "#000000" },
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
[SchemeWarn] = { "#000000", "#000000", "#000000", "#000000" },
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
[SchemeUrg] = { "#000000", "#000000", "#000000", "#000000" },
#endif // URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
[SchemeHid] = { "#000000", "#000000", "#000000", "#000000" },
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
[SchemeTagsNorm] = { "#000000", "#000000", "#000000", "#000000" },
[SchemeTagsSel] = { "#000000", "#000000", "#000000", "#000000" },
[SchemeTitleNorm] = { "#000000", "#000000", "#000000", "#000000" },
[SchemeTitleSel] = { "#000000", "#000000", "#000000", "#000000" },
[SchemeStatus] = { "#000000", "#000000", "#000000", "#000000" },
};
#elif VTCOLORS_PATCH
#elif BAR_VTCOLORS_PATCH
static const char title_bg_dark[] = "#303030";
static const char title_bg_light[] = "#fdfdfd";
static const int color_ptrs[][ColCount] = {
/* fg bg border */
[SchemeNorm] = { -1, -1, 5 },
[SchemeSel] = { -1, -1, 11 },
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
[SchemeWarn] = { -1, 1, 1 },
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
[SchemeUrg] = { 7, 9, 9 },
#endif // URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
[SchemeHid] = { 5, 0, 0 },
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
[SchemeTagsNorm] = { 2, 0, 0 },
[SchemeTagsSel] = { 6, 5, 5 },
[SchemeTitleNorm] = { 6, -1, -1 },
@ -216,15 +207,15 @@ static char colors[][ColCount][8] = {
/* fg bg border */
[SchemeNorm] = { "#000000", "#000000", "#000000" },
[SchemeSel] = { "#000000", "#000000", "#000000" },
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
[SchemeWarn] = { "#000000", "#000000", "#000000" },
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
[SchemeUrg] = { "#000000", "#000000", "#000000" },
#endif // URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
[SchemeHid] = { "#000000", "#000000", "#000000" },
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
[SchemeTagsNorm] = { "#000000", "#000000", "#000000" },
[SchemeTagsSel] = { "#000000", "#000000", "#000000" },
[SchemeTitleNorm] = { "#000000", "#000000", "#000000" },
@ -240,20 +231,20 @@ char *colors[][ColCount] = {
/* fg bg border float */
[SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor, normfloatcolor },
[SchemeSel] = { selfgcolor, selbgcolor, selbordercolor, selfloatcolor },
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
[SchemeWarn] = { warnfgcolor, warnbgcolor, warnbordercolor, warnfloatcolor },
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
[SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor, urgfloatcolor },
#endif // URGENTBORDER_PATCH / STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH / BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
[SchemeHid] = { hidfgcolor, hidbgcolor, hidbordercolor, hidfloatcolor },
#endif // AWESOMEBAR_PATCH
#if TITLECOLOR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
#if BAR_TITLECOLOR_PATCH
[SchemeTitle] = { titlefgcolor, titlebgcolor, titlebordercolor, titlefloatcolor },
#endif // TITLECOLOR_PATCH
#endif // BAR_TITLECOLOR_PATCH
};
#else // !VTCOLORS_PATCH && !FLOAT_BORDER_COLOR_PATCH
#else // !BAR_VTCOLORS_PATCH && !FLOAT_BORDER_COLOR_PATCH
static
#if !XRDB_PATCH
const
@ -262,20 +253,20 @@ char *colors[][ColCount] = {
/* fg bg border */
[SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor },
[SchemeSel] = { selfgcolor, selbgcolor, selbordercolor },
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
[SchemeWarn] = { warnfgcolor, warnbgcolor, warnbordercolor },
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
[SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor },
#endif // URGENTBORDER_PATCH / STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH / BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
[SchemeHid] = { hidfgcolor, hidbgcolor, hidbordercolor },
#endif // AWESOMEBAR_PATCH
#if TITLECOLOR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
#if BAR_TITLECOLOR_PATCH
[SchemeTitle] = { titlefgcolor, titlebgcolor, titlebordercolor },
#endif // TITLECOLOR_PATCH
#endif // BAR_TITLECOLOR_PATCH
};
#endif // VTCOLORS_PATCH / FLOAT_BORDER_COLOR_PATCH
#endif // BAR_VTCOLORS_PATCH / FLOAT_BORDER_COLOR_PATCH
#if SCRATCHPADS_PATCH
const char *spcmd1[] = {"st", "-n", "spterm", "-g", "120x34", NULL };
@ -290,16 +281,16 @@ static Sp scratchpads[] = {
#endif // SCRATCHPADS_PATCH
/* tagging */
#if EWMHTAGS_PATCH
#if BAR_EWMHTAGS_PATCH
static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
#else
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
#endif // EWMHTAGS_PATCH
#if ALTERNATIVE_TAGS_PATCH
#endif // BAR_EWMHTAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
static const char *tagsalt[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
#endif // ALTERNATIVE_TAGS_PATCH
#endif // BAR_ALTERNATIVE_TAGS_PATCH
#if TAGGRID_PATCH
#if BAR_TAGGRID_PATCH
/* grid of tags */
#define DRAWCLASSICTAGS 1 << 0
#define DRAWTAGGRID 1 << 1
@ -315,7 +306,7 @@ static const char *tagsalt[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static const unsigned int drawtagmask = DRAWTAGGRID; /* | DRAWCLASSICTAGS to show classic row of tags */
static const int tagrows = 2;
#endif // TAGGRID_PATCH
#endif // BAR_TAGGRID_PATCH
/* There are two options when it comes to per-client rules:
* - a typical struct table or
@ -371,6 +362,62 @@ static const MonitorRule monrules[] = {
#endif // PERTAG_PATCH
#endif // MONITOR_RULES_PATCH
/* Bar rules allow you to configure what is shown where on the bar, as well as
* introducing your own bar modules.
*
* monitor:
* -1 show on all monitors
* 0 show on monitor 0
* 'A' show on active monitor (i.e. focused / selected) (or just -1 for active?)
* bar - bar index, 0 is default, 1 is extrabar
* alignment - how the module is aligned compared to other modules
* widthfunc, drawfunc, clickfunc - providing bar module width, draw and click functions
* name - does nothing, intended for visual clue and for logging / debugging
*/
static const BarRule barrules[] = {
/* monitor bar alignment widthfunc drawfunc clickfunc name */
#if BAR_STATUSBUTTON_PATCH
{ -1, 0, BAR_ALIGN_LEFT, width_stbutton, draw_stbutton, click_stbutton, "statusbutton" },
#endif // BAR_STATUSBUTTON_PATCH
#if BAR_TAGS_PATCH
{ -1, 0, BAR_ALIGN_LEFT, width_tags, draw_tags, click_tags, "tags" },
#endif // BAR_TAGS_PATCH
#if BAR_TAGGRID_PATCH
{ -1, 0, BAR_ALIGN_LEFT, width_taggrid, draw_taggrid, click_taggrid, "taggrid" },
#endif // BAR_TAGGRID_PATCH
#if BAR_LTSYMBOL_PATCH
{ -1, 0, BAR_ALIGN_LEFT, width_ltsymbol, draw_ltsymbol, click_ltsymbol, "layout" },
#endif // BAR_LTSYMBOL_PATCH
#if BAR_SYSTRAY_PATCH
{ 0, 0, BAR_ALIGN_RIGHT, width_systray, draw_systray, click_systray, "systray" },
#endif // BAR_SYSTRAY_PATCH
#if BAR_STATUS2D_PATCH && BAR_STATUSCMD_PATCH
{ 'A', 0, BAR_ALIGN_RIGHT, width_status2d, draw_status2d, click_statuscmd, "status2d" },
#elif BAR_STATUS2D_PATCH
{ 'A', 0, BAR_ALIGN_RIGHT, width_status2d, draw_status2d, click_status2d, "status2d" },
#elif BAR_STATUS_PATCH
{ 'A', 0, BAR_ALIGN_RIGHT, width_status, draw_status, click_status, "status" },
#endif // BAR_STATUS2D_PATCH | BAR_STATUSCMD_PATCH
#if BAR_AWESOMEBAR_PATCH
{ -1, 0, BAR_ALIGN_NONE, width_awesomebar, draw_awesomebar, click_awesomebar, "awesomebar" },
#elif BAR_FANCYBAR_PATCH
{ -1, 0, BAR_ALIGN_NONE, width_fancybar, draw_fancybar, click_fancybar, "fancybar" },
#elif BAR_WINTITLE_PATCH
{ -1, 0, BAR_ALIGN_NONE, width_wintitle, draw_wintitle, click_wintitle, "wintitle" },
#endif // BAR_AWESOMEBAR_PATCH | BAR_FANCYBAR_PATCH BAR_WINTITLE_PATCH
#if BAR_EXTRASTATUS_PATCH
#if BAR_STATUS2D_PATCH && BAR_STATUSCMD_PATCH
{ 'A', 1, BAR_ALIGN_CENTER, width_status2d_es, draw_status2d_es, click_statuscmd_es, "status2d_es" },
#elif BAR_STATUS2D_PATCH
{ 'A', 1, BAR_ALIGN_CENTER, width_status2d_es, draw_status2d_es, click_status2d, "status2d_es" },
#elif BAR_STATUSCMD_PATCH
{ 'A', 1, BAR_ALIGN_CENTER, width_status_es, draw_status_es, click_statuscmd_es, "status_es" },
#elif BAR_STATUS_PATCH
{ 'A', 1, BAR_ALIGN_CENTER, width_status_es, draw_status_es, click_status, "status_es" },
#endif // BAR_STATUS2D_PATCH | BAR_STATUSCMD_PATCH
#endif // BAR_EXTRASTATUS_PATCH
};
#if DWMC_PATCH
/* signal definitions */
/* signum must be greater than 0 */
@ -467,9 +514,9 @@ static Signal signals[] = {
#if SELFRESTART_PATCH
{ "self_restart", self_restart },
#endif // SELFRESTART_PATCH
#if TAGGRID_PATCH
#if BAR_TAGGRID_PATCH
{ "switchtag", switchtag },
#endif // TAGGRID_PATCH
#endif // BAR_TAGGRID_PATCH
#if STICKY_PATCH
{ "togglesticky", togglesticky },
#endif // STICKY_PATCH
@ -495,9 +542,9 @@ static Signal signals[] = {
#if TAGSWAPMON_PATCH
{ "tagswapmon", tagswapmon},
#endif // TAGSWAPMON_PATCH
#if ALTERNATIVE_TAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
{ "togglealttag", togglealttag },
#endif // ALTERNATIVE_TAGS_PATCH
#endif // BAR_ALTERNATIVE_TAGS_PATCH
#if TOGGLEFULLSCREEN_PATCH
{ "togglefullscreen", togglefullscreen },
#endif // TOGGLEFULLSCREEN_PATCH
@ -522,7 +569,7 @@ static Signal signals[] = {
#if WINVIEW_PATCH
{ "winview", winview },
#endif // WINVIEW_PATCH
#if XRDB_PATCH && !VTCOLORS_PATCH
#if XRDB_PATCH && !BAR_VTCOLORS_PATCH
{ "xrdb", xrdb },
#endif // XRDB_PATCH
#if TAGOTHERMONITOR_PATCH
@ -549,7 +596,7 @@ static const int nmaster = 1; /* number of clients in master area */
#if FLEXTILE_DELUXE_LAYOUT
static const int nstack = 0; /* number of clients in primary stack area */
#endif // FLEXTILE_DELUXE_LAYOUT
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
#if NROWGRID_LAYOUT
#define FORCE_VSPLIT 1
@ -746,9 +793,9 @@ static const Layout layouts[] = {
{ MOD, XK_z, ACTION##stack, {.i = -1 } },
#endif // STACKER_PATCH
#if HOLDBAR_PATCH
#if BAR_HOLDBAR_PATCH
#define HOLDKEY 0 // replace 0 with the keysym to activate holdbar
#endif // HOLDBAR_PATCH
#endif // BAR_HOLDBAR_PATCH
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
@ -767,18 +814,18 @@ static const char *dmenucmd[] = {
"-nf", normfgcolor,
"-sb", selbgcolor,
"-sf", selfgcolor,
#if DMENUMATCHTOP_PATCH
#if BAR_DMENUMATCHTOP_PATCH
topbar ? NULL : "-b",
#endif // DMENUMATCHTOP_PATCH
#endif // BAR_DMENUMATCHTOP_PATCH
NULL
};
static const char *termcmd[] = { "st", NULL };
#if STATUSCMD_PATCH && !DWMBLOCKS_PATCH
#if BAR_STATUSCMD_PATCH && !BAR_DWMBLOCKS_PATCH
/* commands spawned when clicking statusbar, the mouse button pressed is exported as BUTTON */
static const char *statuscmds[] = { "notify-send Mouse$BUTTON" };
static char *statuscmd[] = { "/bin/sh", "-c", NULL, NULL };
#endif // STATUSCMD_PATCH | DWMBLOCKS_PATCH
#endif // BAR_STATUSCMD_PATCH | DWMBLOCKS_PATCH
static Key keys[] = {
/* modifier key function argument */
@ -874,9 +921,9 @@ static Key keys[] = {
{ MODKEY|Mod4Mask, XK_Tab, shiftviewclients, { .i = -1 } },
{ MODKEY|Mod4Mask, XK_backslash, shiftviewclients, { .i = +1 } },
#endif // SHIFTVIEW_CLIENTS_PATCH
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
{ MODKEY|ControlMask, XK_z, showhideclient, {0} },
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
#if KILLUNSEL_PATCH
{ MODKEY|ShiftMask, XK_x, killunsel, {0} },
@ -891,13 +938,13 @@ static Key keys[] = {
#if FOCUSURGENT_PATCH
{ MODKEY, XK_u, focusurgent, {0} },
#endif // FOCUSURGENT_PATCH
#if HOLDBAR_PATCH
#if BAR_HOLDBAR_PATCH
{ 0, HOLDKEY, holdbar, {0} },
#endif // HOLDBAR_PATCH
#endif // BAR_HOLDBAR_PATCH
#if WINVIEW_PATCH
{ MODKEY, XK_o, winview, {0} },
#endif // WINVIEW_PATCH
#if XRDB_PATCH && !VTCOLORS_PATCH
#if XRDB_PATCH && !BAR_VTCOLORS_PATCH
{ MODKEY|ShiftMask, XK_F5, xrdb, {.v = NULL } },
#endif // XRDB_PATCH
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
@ -995,10 +1042,10 @@ static Key keys[] = {
{ MODKEY|Mod4Mask|ControlMask, XK_comma, tagswapmon, {.i = +1 } },
{ MODKEY|Mod4Mask|ControlMask, XK_period, tagswapmon, {.i = -1 } },
#endif // TAGSWAPMON_PATCH
#if ALTERNATIVE_TAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
{ MODKEY, XK_n, togglealttag, {0} },
#endif // ALTERNATIVE_TAGS_PATCH
#if TAGGRID_PATCH
#endif // BAR_ALTERNATIVE_TAGS_PATCH
#if BAR_TAGGRID_PATCH
{ MODKEY|ControlMask, XK_Up, switchtag, { .ui = SWITCHTAG_UP | SWITCHTAG_VIEW } },
{ MODKEY|ControlMask, XK_Down, switchtag, { .ui = SWITCHTAG_DOWN | SWITCHTAG_VIEW } },
{ MODKEY|ControlMask, XK_Right, switchtag, { .ui = SWITCHTAG_RIGHT | SWITCHTAG_VIEW } },
@ -1007,7 +1054,7 @@ static Key keys[] = {
{ MODKEY|Mod4Mask, XK_Down, switchtag, { .ui = SWITCHTAG_DOWN | SWITCHTAG_TAG | SWITCHTAG_VIEW } },
{ MODKEY|Mod4Mask, XK_Right, switchtag, { .ui = SWITCHTAG_RIGHT | SWITCHTAG_TAG | SWITCHTAG_VIEW } },
{ MODKEY|Mod4Mask, XK_Left, switchtag, { .ui = SWITCHTAG_LEFT | SWITCHTAG_TAG | SWITCHTAG_VIEW } },
#endif // TAGGRID_PATCH
#endif // BAR_TAGGRID_PATCH
#if MOVEPLACE_PATCH
{ MODKEY, XK_KP_7, moveplace, {.ui = WIN_NW }}, /* XK_KP_Home, */
{ MODKEY, XK_KP_8, moveplace, {.ui = WIN_N }}, /* XK_KP_Up, */
@ -1148,27 +1195,27 @@ static Command commands[] = {
#endif //
static Button buttons[] = {
/* click event mask button function argument */
#if STATUSBUTTON_PATCH
#if BAR_STATUSBUTTON_PATCH
{ ClkButton, 0, Button1, spawn, {.v = dmenucmd } },
#endif // STATUSBUTTON_PATCH
#endif // BAR_STATUSBUTTON_PATCH
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
{ ClkWinTitle, 0, Button1, togglewin, {0} },
{ ClkWinTitle, 0, Button3, showhideclient, {0} },
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
{ ClkWinTitle, 0, Button2, zoom, {0} },
#if STATUSCMD_PATCH && DWMBLOCKS_PATCH
#if BAR_STATUSCMD_PATCH && BAR_DWMBLOCKS_PATCH
{ ClkStatusText, 0, Button1, sigdwmblocks, {.i = 1 } },
{ ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2 } },
{ ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3 } },
#elif STATUSCMD_PATCH
#elif BAR_STATUSCMD_PATCH
{ ClkStatusText, 0, Button1, spawn, {.v = statuscmd } },
{ ClkStatusText, 0, Button2, spawn, {.v = statuscmd } },
{ ClkStatusText, 0, Button3, spawn, {.v = statuscmd } },
#else
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
#endif // STATUSCMD_PATCH
#endif // BAR_STATUSCMD_PATCH
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },

View File

@ -20,13 +20,13 @@ FREETYPEINC = /usr/include/freetype2
# OpenBSD (uncomment)
#FREETYPEINC = ${X11INC}/freetype2
# Uncomment this for the alpha patch / ALPHA_PATCH
# Uncomment this for the alpha patch / BAR_ALPHA_PATCH
#XRENDER = -lXrender
# Uncomment this for the mdpcontrol patch / MDPCONTROL_PATCH
#MPDCLIENT = -lmpdclient
# Uncomment for the pango patch / PANGO_PATCH
# Uncomment for the pango patch / BAR_PANGO_PATCH
#PANGOINC = `pkg-config --cflags xft pango pangoxft`
#PANGOLIB = `pkg-config --libs xft pango pangoxft`

84
drw.c
View File

@ -61,14 +61,14 @@ utf8decode(const char *c, long *u, size_t clen)
return len;
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
Drw *
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap)
#else
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
{
Drw *drw = ecalloc(1, sizeof(Drw));
@ -78,7 +78,7 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
drw->w = w;
drw->h = h;
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
drw->visual = visual;
drw->depth = depth;
drw->cmap = cmap;
@ -87,7 +87,7 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
#else
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
drw->gc = XCreateGC(dpy, root, 0, NULL);
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
return drw;
@ -103,11 +103,11 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
drw->h = h;
if (drw->drawable)
XFreePixmap(drw->dpy, drw->drawable);
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth);
#else
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
}
void
@ -115,15 +115,15 @@ drw_free(Drw *drw)
{
XFreePixmap(drw->dpy, drw->drawable);
XFreeGC(drw->dpy, drw->gc);
#if PANGO_PATCH
#if BAR_PANGO_PATCH
drw_font_free(drw->font);
#else
drw_fontset_free(drw->fonts);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
free(drw);
}
#if PANGO_PATCH
#if BAR_PANGO_PATCH
/* This function is an implementation detail. Library users should use
* drw_font_create instead.
*/
@ -192,7 +192,7 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
die("no font specified.");
}
#if !COLOR_EMOJI_PATCH
#if !BAR_COLOR_EMOJI_PATCH
/* Do not allow using color fonts. This is a workaround for a BadLength
* error from Xft with color glyphs. Modelled on the Xterm workaround. See
* https://bugzilla.redhat.com/show_bug.cgi?id=1498269
@ -205,7 +205,7 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
XftFontClose(drw->dpy, xfont);
return NULL;
}
#endif // COLOR_EMOJI_PATCH
#endif // BAR_COLOR_EMOJI_PATCH
font = ecalloc(1, sizeof(Fnt));
font->xfont = xfont;
@ -215,25 +215,25 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
return font;
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
static void
xfont_free(Fnt *font)
{
if (!font)
return;
#if PANGO_PATCH
#if BAR_PANGO_PATCH
if (font->layout)
g_object_unref(font->layout);
#else
if (font->pattern)
FcPatternDestroy(font->pattern);
XftFontClose(font->dpy, font->xfont);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
free(font);
}
#if PANGO_PATCH
#if BAR_PANGO_PATCH
Fnt*
drw_font_create(Drw* drw, const char font[])
{
@ -264,9 +264,9 @@ drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
}
return (drw->fonts = ret);
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
#if PANGO_PATCH
#if BAR_PANGO_PATCH
void
drw_font_free(Fnt *font)
{
@ -282,25 +282,25 @@ drw_fontset_free(Fnt *font)
xfont_free(font);
}
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
void
drw_clr_create(
Drw *drw,
Clr *dest,
#if VTCOLORS_PATCH
#if BAR_VTCOLORS_PATCH
const char clrname[]
#else
const char *clrname
#endif // VTCOLORS_PATCH
#if ALPHA_PATCH
#endif // BAR_VTCOLORS_PATCH
#if BAR_ALPHA_PATCH
, unsigned int alpha
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
) {
if (!drw || !dest || !clrname)
return;
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
clrname, dest))
die("error, cannot allocate color '%s'", clrname);
@ -315,7 +315,7 @@ drw_clr_create(
#if NO_TRANSPARENT_BORDERS_PATCH
dest->pixel |= 0xff << 24;
#endif // NO_TRANSPARENT_BORDERS_PATCH
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
}
/* Wrapper to create color schemes. The caller has to call free(3) on the
@ -323,16 +323,16 @@ drw_clr_create(
Clr *
drw_scm_create(
Drw *drw,
#if VTCOLORS_PATCH
#if BAR_VTCOLORS_PATCH
char clrnames[][8],
#elif XRDB_PATCH
char *clrnames[],
#else
const char *clrnames[],
#endif // VTCOLORS_PATCH / XRDB_PATCH
#if ALPHA_PATCH
#endif // BAR_VTCOLORS_PATCH / XRDB_PATCH
#if BAR_ALPHA_PATCH
const unsigned int alphas[],
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
size_t clrcount
) {
size_t i;
@ -343,11 +343,11 @@ drw_scm_create(
return NULL;
for (i = 0; i < clrcount; i++)
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]);
#else
drw_clr_create(drw, &ret[i], clrnames[i]);
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
return ret;
}
@ -358,7 +358,7 @@ drw_setfontset(Drw *drw, Fnt *set)
if (drw)
drw->fonts = set;
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
void
drw_setscheme(Drw *drw, Clr *scm)
@ -379,7 +379,7 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
}
#if PANGO_PATCH
#if BAR_PANGO_PATCH
int
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup)
{
@ -398,13 +398,13 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
} else {
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap);
#else
d = XftDrawCreate(drw->dpy, drw->drawable,
DefaultVisual(drw->dpy, drw->screen),
DefaultColormap(drw->dpy, drw->screen));
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
x += lpad;
w -= lpad;
}
@ -471,13 +471,13 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
} else {
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap);
#else
d = XftDrawCreate(drw->dpy, drw->drawable,
DefaultVisual(drw->dpy, drw->screen),
DefaultColormap(drw->dpy, drw->screen));
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
x += lpad;
w -= lpad;
}
@ -579,7 +579,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
return x + (render ? w : 0);
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
void
drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
@ -591,7 +591,7 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
XSync(drw->dpy, False);
}
#if PANGO_PATCH
#if BAR_PANGO_PATCH
unsigned int
drw_font_getwidth(Drw *drw, const char *text, Bool markup)
{
@ -607,9 +607,9 @@ drw_fontset_getwidth(Drw *drw, const char *text)
return 0;
return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
#if PANGO_PATCH
#if BAR_PANGO_PATCH
void
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup)
{
@ -644,7 +644,7 @@ drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w,
if (h)
*h = font->h;
}
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
Cur *
drw_cur_create(Drw *drw, int shape)

46
drw.h
View File

@ -1,9 +1,9 @@
/* See LICENSE file for copyright and license details. */
#if PANGO_PATCH
#if BAR_PANGO_PATCH
#include <pango/pango.h>
#include <pango/pangoxft.h>
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
typedef struct {
Cursor cursor;
@ -12,13 +12,13 @@ typedef struct {
typedef struct Fnt {
Display *dpy;
unsigned int h;
#if PANGO_PATCH
#if BAR_PANGO_PATCH
PangoLayout *layout;
#else
XftFont *xfont;
FcPattern *pattern;
struct Fnt *next;
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
} Fnt;
#if FLOAT_BORDER_COLOR_PATCH
@ -33,32 +33,32 @@ typedef struct {
Display *dpy;
int screen;
Window root;
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
Visual *visual;
unsigned int depth;
Colormap cmap;
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
Drawable drawable;
GC gc;
Clr *scheme;
#if PANGO_PATCH
#if BAR_PANGO_PATCH
Fnt *font;
#else
Fnt *fonts;
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
} Drw;
/* Drawable abstraction */
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap);
#else
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
void drw_free(Drw *drw);
/* Fnt abstraction */
#if PANGO_PATCH
#if BAR_PANGO_PATCH
Fnt *drw_font_create(Drw* drw, const char font[]);
void drw_font_free(Fnt* set);
unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup);
@ -68,33 +68,33 @@ 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);
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
/* Colorscheme abstraction */
void drw_clr_create(
Drw *drw,
Clr *dest,
#if VTCOLORS_PATCH
#if BAR_VTCOLORS_PATCH
const char clrname[]
#else
const char *clrname
#endif // VTCOLORS_PATCH
#if ALPHA_PATCH
#endif // BAR_VTCOLORS_PATCH
#if BAR_ALPHA_PATCH
, unsigned int alpha
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
);
Clr *drw_scm_create(
Drw *drw,
#if VTCOLORS_PATCH
#if BAR_VTCOLORS_PATCH
char clrnames[][8],
#elif XRDB_PATCH
char *clrnames[],
#else
const char *clrnames[],
#endif // VTCOLORS_PATCH / XRDB_PATCH
#if ALPHA_PATCH
#endif // BAR_VTCOLORS_PATCH / XRDB_PATCH
#if BAR_ALPHA_PATCH
const unsigned int alphas[],
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
size_t clrcount
);
@ -105,16 +105,16 @@ void drw_cur_free(Drw *drw, Cur *cursor);
/* Drawing context manipulation */
#if !PANGO_PATCH
void drw_setfontset(Drw *drw, Fnt *set);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
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);
#if PANGO_PATCH
#if BAR_PANGO_PATCH
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup);
#else
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
/* Map functions */
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);

1541
dwm.c
View File

@ -45,9 +45,9 @@
#include "drw.h"
#include "util.h"
#if PANGO_PATCH
#if BAR_PANGO_PATCH
#include <pango/pango.h>
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
#if SPAWNCMD_PATCH
#include <assert.h>
@ -57,6 +57,7 @@
#endif // SPAWNCMD_PATCH
/* macros */
#define BARRULES 20
#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)) \
@ -72,9 +73,9 @@
#else
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
#endif // ATTACHASIDE_PATCH
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
#define HIDDEN(C) ((getstate(C->win) == IconicState))
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
#define LENGTH(X) (sizeof X / sizeof X[0])
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
@ -88,12 +89,12 @@
#else
#define TAGMASK ((1 << LENGTH(tags)) - 1)
#endif // SCRATCHPADS_PATCH
#if PANGO_PATCH
#if BAR_PANGO_PATCH
#define TEXTW(X) (drw_font_getwidth(drw, (X), False) + lrpad)
#define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + lrpad)
#else
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
/* enums */
enum {
@ -119,36 +120,36 @@ enum {
enum {
SchemeNorm
,SchemeSel
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
,SchemeWarn
#endif // STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
,SchemeUrg
#endif // URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#if AWESOMEBAR_PATCH
#endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
#if BAR_AWESOMEBAR_PATCH
,SchemeHid
#endif // AWESOMEBAR_PATCH
#if VTCOLORS_PATCH
#endif // BAR_AWESOMEBAR_PATCH
#if BAR_VTCOLORS_PATCH
,SchemeTagsNorm
,SchemeTagsSel
,SchemeTitleNorm
,SchemeTitleSel
,SchemeStatus
#elif TITLECOLOR_PATCH
#elif BAR_TITLECOLOR_PATCH
,SchemeTitle
#endif // VTCOLORS_PATCH
#endif // BAR_VTCOLORS_PATCH
}; /* color schemes */
enum {
NetSupported, NetWMName, NetWMState, NetWMCheck,
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation,
NetSystemTrayVisual, NetWMWindowTypeDock, NetSystemTrayOrientationHorz,
#endif // SYSTRAY_PATCH
#if EWMHTAGS_PATCH
#endif // BAR_SYSTRAY_PATCH
#if BAR_EWMHTAGS_PATCH
NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop,
#endif // EWMHTAGS_PATCH
#endif // BAR_EWMHTAGS_PATCH
NetClientList, NetLast
}; /* EWMH atoms */
@ -164,9 +165,9 @@ enum {
}; /* default atoms */
enum {
#if STATUSBUTTON_PATCH
#if BAR_STATUSBUTTON_PATCH
ClkButton,
#endif // STATUSBUTTON_PATCH
#endif // BAR_STATUSBUTTON_PATCH
ClkTagBar,
ClkLtSymbol,
ClkStatusText,
@ -176,6 +177,20 @@ enum {
ClkLast
}; /* clicks */
enum {
BAR_ALIGN_LEFT,
BAR_ALIGN_CENTER,
BAR_ALIGN_RIGHT,
BAR_ALIGN_LEFT_LEFT,
BAR_ALIGN_LEFT_RIGHT,
BAR_ALIGN_LEFT_CENTER,
BAR_ALIGN_NONE,
BAR_ALIGN_RIGHT_LEFT,
BAR_ALIGN_RIGHT_RIGHT,
BAR_ALIGN_RIGHT_CENTER,
BAR_ALIGN_LAST
}; /* bar alignment */
typedef union {
int i;
unsigned int ui;
@ -183,6 +198,46 @@ typedef union {
const void *v;
} Arg;
typedef struct Monitor Monitor;
typedef struct Bar Bar;
struct Bar {
Window win;
Monitor *mon;
Bar *next;
int idx;
int topbar;
int bx, by, bw, bh; /* bar geometry */
int w[BARRULES]; // width, array length == barrules, then use r index for lookup purposes
int x[BARRULES]; // x position, array length == ^
};
typedef struct {
int max_width;
} BarWidthArg;
typedef struct {
int x;
int w;
} BarDrawArg;
typedef struct {
int rel_x;
int rel_y;
int rel_w;
int rel_h;
} BarClickArg;
typedef struct {
int monitor;
int bar;
int alignment; // see bar alignment enum
int (*widthfunc)(Bar *bar, BarWidthArg *a);
int (*drawfunc)(Bar *bar, BarDrawArg *a);
int (*clickfunc)(Bar *bar, Arg *arg, BarClickArg *a);
char *name; // for debugging
int x, w; // position, width for internal use
} BarRule;
typedef struct {
unsigned int click;
unsigned int mask;
@ -191,7 +246,6 @@ typedef struct {
const Arg arg;
} Button;
typedef struct Monitor Monitor;
typedef struct Client Client;
struct Client {
char name[256];
@ -288,18 +342,6 @@ struct Monitor {
#endif // FLEXTILE_DELUXE_LAYOUT
int nmaster;
int num;
int by; /* bar geometry */
int tw; /* bar text width */
#if EXTRABAR_PATCH
int eby; /* extra bar geometry */
#if STATUSCMD_PATCH
int etw; /* extra bar text width */
#endif // STATUSCMD_PATCH
#endif // EXTRABAR_PATCH
#if AWESOMEBAR_PATCH
int btw; /* width of tasks portion of bar */
int bt; /* number of tasks */
#endif // AWESOMEBAR_PATCH
int mx, my, mw, mh; /* screen size */
int wx, wy, ww, wh; /* window area */
#if VANITYGAPS_PATCH
@ -315,19 +357,15 @@ struct Monitor {
unsigned int sellt;
unsigned int tagset[2];
int showbar;
int topbar;
Client *clients;
Client *sel;
Client *stack;
Monitor *next;
Window barwin;
#if EXTRABAR_PATCH
Window extrabarwin;
#endif // EXTRABAR_PATCH
Bar *bar;
const Layout *lt[2];
#if ALTERNATIVE_TAGS_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH
unsigned int alttag;
#endif // ALTERNATIVE_TAGS_PATCH
#endif // BAR_ALTERNATIVE_TAGS_PATCH
#if PERTAG_PATCH
Pertag *pertag;
#endif // PERTAG_PATCH
@ -425,6 +463,7 @@ static void detachstack(Client *c);
static Monitor *dirtomon(int dir);
static void drawbar(Monitor *m);
static void drawbars(void);
static void drawbarwin(Bar *bar);
#if !FOCUSONCLICK_PATCH
static void enternotify(XEvent *e);
#endif // FOCUSONCLICK_PATCH
@ -472,11 +511,11 @@ static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
static void run(void);
static void scan(void);
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4);
#else
static int sendevent(Client *c, Atom proto);
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
static void sendmon(Client *c, Monitor *m);
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
@ -514,50 +553,48 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee);
static int xerrorstart(Display *dpy, XErrorEvent *ee);
static void zoom(const Arg *arg);
/* bar functions */
#include "patch/include.h"
/* variables */
static const char broken[] = "broken";
#if PANGO_PATCH || STATUS2D_PATCH && !STATUSCOLORS_PATCH
#if BAR_PANGO_PATCH || BAR_STATUS2D_PATCH && !BAR_STATUSCOLORS_PATCH
static char stext[1024];
#else
static char stext[512];
#endif // STATUS2D_PATCH
#if STATUSCMD_PATCH || EXTRABAR_PATCH
#if STATUS2D_PATCH
#endif // BAR_PANGO_PATCH | BAR_STATUS2D_PATCH
#if BAR_EXTRASTATUS_PATCH || BAR_STATUSCMD_PATCH
#if BAR_STATUS2D_PATCH
static char rawstext[1024];
#else
static char rawstext[512];
#endif // STATUS2D_PATCH
#endif // STATUSCMD_PATCH | EXTRABAR_PATCH
#if EXTRABAR_PATCH
#if STATUS2D_PATCH && !STATUSCOLORS_PATCH
#endif // BAR_STATUS2D_PATCH
#endif // BAR_EXTRASTATUS_PATCH | BAR_STATUSCMD_PATCH
#if BAR_EXTRASTATUS_PATCH
#if BAR_STATUS2D_PATCH && !BAR_STATUSCOLORS_PATCH
static char estext[1024];
#else
static char estext[512];
#endif // STATUS2D_PATCH
#if STATUSCMD_PATCH
#endif // BAR_STATUS2D_PATCH
#if BAR_STATUSCMD_PATCH
static char rawestext[1024];
#else
static char rawestext[512];
#endif // STATUSCMD_PATCH
#endif // EXTRABAR_PATCH
#endif // BAR_STATUSCMD_PATCH
#endif // BAR_EXTRASTATUS_PATCH
static int screen;
static int sw, sh; /* X display screen geometry width, height */
static int bh, blw = 0; /* bar geometry */
static int bh; /* bar geometry */
static int lrpad; /* sum of left and right padding for text */
#if BARPADDING_PATCH
static int vp; /* vertical padding for bar */
static int sp; /* side padding for bar */
#endif // BARPADDING_PATCH
static int (*xerrorxlib)(Display *, XErrorEvent *);
static unsigned int numlockmask = 0;
static void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
#if COMBO_PATCH || HOLDBAR_PATCH
#if COMBO_PATCH || BAR_HOLDBAR_PATCH
[ButtonRelease] = keyrelease,
#endif // COMBO_PATCH / HOLDBAR_PATCH
#endif // COMBO_PATCH / BAR_HOLDBAR_PATCH
[ClientMessage] = clientmessage,
[ConfigureRequest] = configurerequest,
[ConfigureNotify] = configurenotify,
@ -568,37 +605,31 @@ static void (*handler[LASTEvent]) (XEvent *) = {
[Expose] = expose,
[FocusIn] = focusin,
[KeyPress] = keypress,
#if COMBO_PATCH || HOLDBAR_PATCH
#if COMBO_PATCH || BAR_HOLDBAR_PATCH
[KeyRelease] = keyrelease,
#endif // COMBO_PATCH / HOLDBAR_PATCH
#endif // COMBO_PATCH / BAR_HOLDBAR_PATCH
[MappingNotify] = mappingnotify,
[MapRequest] = maprequest,
#if !FOCUSONCLICK_PATCH
[MotionNotify] = motionnotify,
#endif // FOCUSONCLICK_PATCH
[PropertyNotify] = propertynotify,
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
[ResizeRequest] = resizerequest,
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
[UnmapNotify] = unmapnotify
};
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast];
#else
static Atom wmatom[WMLast], netatom[NetLast];
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
static int running = 1;
static Cur *cursor[CurLast];
static Clr **scheme;
static Display *dpy;
static Drw *drw;
static Monitor *mons, *selmon;
#if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH
static Monitor *statmon;
#if EXTRABAR_PATCH
static Monitor *statebmon;
#endif // EXTRABAR_PATCH
#endif // STATICSTATUS_PATCH
static Window root, wmcheckwin;
/* configuration, allows nested code to access above variables */
@ -844,30 +875,15 @@ attachstack(Client *c)
void
buttonpress(XEvent *e)
{
unsigned int i, x, click;
int padding = 0;
#if STATUSCMD_PATCH
unsigned int xc;
#endif // STATUSCMD_PATCH
#if TAGGRID_PATCH
unsigned int columns;
#endif // TAGGRID_PATCH
#if HIDEVACANTTAGS_PATCH
unsigned int occ = 0;
#endif // HIDEVACANTTAGS_PATCH
int click, i, r, mi;
Arg arg = {0};
Client *c;
Monitor *m;
Bar *bar;
XButtonPressedEvent *ev = &e->xbutton;
#if STATUSCMD_PATCH && !DWMBLOCKS_PATCH
lastbutton = ev->button;
#endif // STATUSCMD_PATCH | DWMBLOCKS_PATCH
#if BARPADDING_PATCH
padding -= sp * 2;
#endif // BARPADDING_PATCH
#if TAGGRID_PATCH
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
#endif // TAGGRID_PATCH
const BarRule *br;
BarClickArg carg = { 0, 0, 0, 0 };
click = ClkRootWin;
/* focus monitor if necessary */
if ((m = wintomon(ev->window)) && m != selmon
@ -879,203 +895,32 @@ buttonpress(XEvent *e)
selmon = m;
focus(NULL);
}
#if SYSTRAY_PATCH
if (showsystray && selmon == systraytomon(selmon))
padding -= getsystraywidth();
#endif // SYSTRAY_PATCH
if (ev->window == selmon->barwin) {
i = x = 0;
#if LEFTLAYOUT_PATCH
x += blw;
if (ev->x < x) {
click = ClkLtSymbol;
#if STATUSBUTTON_PATCH
} else if (ev->x < (x += TEXTW(buttonbar))) {
click = ClkButton;
#endif // STATUSBUTTON_PATCH
} else {
#elif STATUSBUTTON_PATCH
x += TEXTW(buttonbar);
if (ev->x < x) {
click = ClkButton;
} else {
#endif // LEFTLAYOUT_PATCH | STATUSBUTTON_PATCH
#if HIDEVACANTTAGS_PATCH
for (c = m->clients; c; c = c->next)
occ |= c->tags == 255 ? 0 : c->tags;
#endif // HIDEVACANTTAGS_PATCH
#if TAGGRID_PATCH
if (drawtagmask & DRAWCLASSICTAGS)
#endif // TAGGRID_PATCH
do {
#if HIDEVACANTTAGS_PATCH
/* do not reserve space for vacant tags */
if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
continue;
#endif // HIDEVACANTTAGS_PATCH
x += TEXTW(tags[i]);
} while (ev->x >= x && ++i < LENGTH(tags));
if (i < LENGTH(tags)
#if TAGGRID_PATCH
&& (drawtagmask & DRAWCLASSICTAGS)
#endif
) {
click = ClkTagBar;
arg.ui = 1 << i;
#if TAGGRID_PATCH
} else if (ev->x < x + columns * bh / tagrows && (drawtagmask & DRAWTAGGRID)) {
click = ClkTagBar;
i = (ev->x - x) / (bh / tagrows);
i = i + columns * (ev->y / (bh / tagrows));
if (i >= LENGTH(tags)) {
i = LENGTH(tags) - 1;
}
arg.ui = 1 << i;
}
else if (ev->x < x + blw + columns * bh / tagrows)
click = ClkLtSymbol;
#else // TAGGRID_PATCH
} else if (ev->x < x + blw)
click = ClkLtSymbol;
#endif // TAGGRID_PATCH
else if (ev->x > selmon->ww - selmon->tw + padding)
#if !STATUSCMD_PATCH
click = ClkStatusText;
#else
{
click = ClkStatusText;
xc = selmon->ww - selmon->tw + padding;
#if STATUSPADDING_PATCH
xc += lrpad / 2;
#endif // STATUSPADDING_PATCH
char *text = rawstext;
int i = -1;
char ch;
#if DWMBLOCKS_PATCH
dwmblockssig = -1;
#else
statuscmdn = 0;
#endif // DWMBLOCKS_PATCH
while (text[++i]) {
if ((unsigned char)text[i] < ' ') {
ch = text[i];
text[i] = '\0';
#if STATUS2D_PATCH && !STATUSCOLORS_PATCH
xc += status2dtextlength(text);
#elif PANGO_PATCH
xc += TEXTWM(text) - lrpad;
#else
xc += TEXTW(text) - lrpad;
#endif // STATUS2D_PATCH
text[i] = ch;
text += i+1;
i = -1;
#if DWMBLOCKS_PATCH
if (xc >= ev->x && dwmblockssig != -1)
break;
dwmblockssig = ch;
#else
if (xc >= ev->x)
break;
if (ch <= LENGTH(statuscmds))
statuscmdn = ch - 1;
#endif // DWMBLOCKS_PATCH
}
}
#if DWMBLOCKS_PATCH
if (dwmblockssig == -1)
dwmblockssig = 0;
#endif // DWMBLOCKS_PATCH
}
#endif // STATUSCMD_PATCH
#if AWESOMEBAR_PATCH
else {
x += blw;
c = m->clients;
do {
if (!c || !ISVISIBLE(c))
for (mi = 0, m = mons; m && m != selmon; m = m->next, mi++); // get the monitor index
for (bar = selmon->bar; bar; bar = bar->next) {
if (ev->window == bar->win) {
for (r = 0; r < LENGTH(barrules); r++) {
br = &barrules[r];
if (br->bar != bar->idx || (br->monitor == 'A' && m != selmon) || br->clickfunc == NULL)
continue;
else
x += (1.0 / (double)m->bt) * m->btw;
} while (c && ev->x > x && (c = c->next));
if (c) {
click = ClkWinTitle;
arg.v = c;
}
}
#else
else
click = ClkWinTitle;
#endif // AWESOMEBAR_PATCH
#if LEFTLAYOUT_PATCH || STATUSBUTTON_PATCH
}
#endif // LEFTLAYOUT_PATCH | STATUSBUTTON_PATCH
#if EXTRABAR_PATCH && STATUSCMD_PATCH
} else if (ev->window == selmon->extrabarwin) {
i = x = 0;
padding = 0;
#if BARPADDING_PATCH
padding -= sp * 2;
#endif // BARPADDING_PATCH
if (
(ebalign == 0 && ev->x >= 0 && ev->x < selmon->etw) ||
(ebalign == 1 && ev->x > selmon->ww - selmon->etw + padding) ||
(ebalign == 2 && ev->x > (selmon->ww / 2 - selmon->etw / 2 + padding)
&& ev->x < (selmon->ww / 2 + selmon->etw / 2 - padding))
) {
click = ClkStatusText;
if (ebalign == 0)
xc = 0; // left
else if (ebalign == 1)
xc = selmon->ww - selmon->etw + padding; // right
else
xc = selmon->ww / 2 - selmon->etw / 2 + padding; // center
#if STATUSPADDING_PATCH
xc += lrpad / 2;
#endif // STATUSPADDING_PATCH
char *text = rawestext;
int i = -1;
char ch;
#if DWMBLOCKS_PATCH
dwmblockssig = -1;
#else
statuscmdn = 0;
#endif // DWMBLOCKS_PATCH
while (text[++i]) {
if ((unsigned char)text[i] < ' ') {
ch = text[i];
text[i] = '\0';
#if STATUS2D_PATCH && !STATUSCOLORS_PATCH
xc += status2dtextlength(text);
#elif PANGO_PATCH
xc += TEXTWM(text) - lrpad;
#else
xc += TEXTW(text) - lrpad;
#endif // STATUS2D_PATCH
text[i] = ch;
text += i+1;
i = -1;
#if DWMBLOCKS_PATCH
if (xc >= ev->x && dwmblockssig != -1)
break;
dwmblockssig = ch;
#else
if (xc >= ev->x)
break;
if (ch <= LENGTH(statuscmds))
statuscmdn = ch - 1;
#endif // DWMBLOCKS_PATCH
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != mi)
continue;
if (bar->x[r] <= ev->x && ev->x <= bar->x[r] + bar->w[r]) {
carg.rel_x = ev->x - bar->x[r];
carg.rel_y = ev->y;
carg.rel_w = bar->w[r];
carg.rel_h = bar->bh;
click = br->clickfunc(bar, &arg, &carg);
if (click < 0)
return;
break;
}
}
#if DWMBLOCKS_PATCH
if (dwmblockssig == -1)
dwmblockssig = 0;
#endif // DWMBLOCKS_PATCH
break;
}
#endif // EXTRABAR_PATCH
} else if ((c = wintoclient(ev->window))) {
}
if (click == ClkRootWin && (c = wintoclient(ev->window))) {
#if FOCUSONCLICK_PATCH
if (focusonwheel || (ev->button != Button4 && ev->button != Button5))
focus(c);
@ -1086,14 +931,17 @@ buttonpress(XEvent *e)
XAllowEvents(dpy, ReplayPointer, CurrentTime);
click = ClkClientWin;
}
for (i = 0; i < LENGTH(buttons); i++)
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))
#if AWESOMEBAR_PATCH
&& CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) {
#if BAR_AWESOMEBAR_PATCH
buttons[i].func((click == ClkTagBar || click == ClkWinTitle) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
#else
buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
#endif
}
}
}
void
@ -1123,28 +971,28 @@ cleanup(void)
XUngrabKey(dpy, AnyKey, AnyModifier, root);
while (mons)
cleanupmon(mons);
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
if (showsystray) {
XUnmapWindow(dpy, systray->win);
XDestroyWindow(dpy, systray->win);
free(systray);
}
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
for (i = 0; i < CurLast; i++)
drw_cur_free(drw, cursor[i]);
#if STATUS2D_PATCH && !STATUSCOLORS_PATCH
#if BAR_STATUS2D_PATCH && !BAR_STATUSCOLORS_PATCH
for (i = 0; i < LENGTH(colors) + 1; i++)
#else
for (i = 0; i < LENGTH(colors); i++)
#endif // STATUS2D_PATCH
#endif // BAR_STATUS2D_PATCH
free(scheme[i]);
free(scheme);
XDestroyWindow(dpy, wmcheckwin);
#if PANGO_PATCH
#if BAR_PANGO_PATCH
drw_font_free(drw->font);
#else
drw_fontset_free(drw->fonts);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
drw_free(drw);
XSync(dpy, False);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
@ -1155,6 +1003,7 @@ void
cleanupmon(Monitor *mon)
{
Monitor *m;
Bar *bar;
if (mon == mons)
mons = mons->next;
@ -1162,31 +1011,29 @@ cleanupmon(Monitor *mon)
for (m = mons; m && m->next != mon; m = m->next);
m->next = mon->next;
}
XUnmapWindow(dpy, mon->barwin);
XDestroyWindow(dpy, mon->barwin);
#if EXTRABAR_PATCH
if (mon->extrabarwin) {
XUnmapWindow(dpy, mon->extrabarwin);
XDestroyWindow(dpy, mon->extrabarwin);
for (bar = mon->bar; bar; bar = mon->bar) {
XUnmapWindow(dpy, bar->win);
XDestroyWindow(dpy, bar->win);
mon->bar = bar->next;
free(bar);
}
#endif // EXTRABAR_PATCH
free(mon);
}
void
clientmessage(XEvent *e)
{
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
XWindowAttributes wa;
XSetWindowAttributes swa;
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
XClientMessageEvent *cme = &e->xclient;
Client *c = wintoclient(cme->window);
#if FOCUSONNETACTIVE_PATCH
unsigned int i;
#endif // FOCUSONNETACTIVE_PATCH
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) {
/* add systray icons */
if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) {
@ -1197,10 +1044,6 @@ clientmessage(XEvent *e)
return;
}
/* Clear status bar to avoid artifacts beneath systray icons */
drw_rect(drw, 0, 0, selmon->ww, bh, 1, 1);
drw_map(drw, selmon->barwin, 0, 0, selmon->ww, bh);
c->mon = selmon;
c->next = systray->icons;
systray->icons = c;
@ -1224,12 +1067,10 @@ clientmessage(XEvent *e)
sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION);
XSync(dpy, False);
setclientstate(c, NormalState);
drawbar(selmon);
updatesystray();
}
return;
}
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
if (!c)
return;
@ -1300,6 +1141,7 @@ void
configurenotify(XEvent *e)
{
Monitor *m;
Bar *bar;
#if !FAKEFULLSCREEN_PATCH
Client *c;
#endif // !FAKEFULLSCREEN_PATCH
@ -1324,19 +1166,8 @@ configurenotify(XEvent *e)
#endif // FAKEFULLSCREEN_CLIENT_PATCH
resizeclient(c, m->mx, m->my, m->mw, m->mh);
#endif // !FAKEFULLSCREEN_PATCH
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh);
#else
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
#endif // BARPADDING_PATCH
#if EXTRABAR_PATCH
if (m->extrabarwin)
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, m->extrabarwin, m->wx + sp, m->eby - vp, m->ww - 2 * sp, bh);
#else
XMoveResizeWindow(dpy, m->extrabarwin, m->wx, m->eby, m->ww, bh);
#endif // BARPADDING_PATCH
#endif // EXTRABAR_PATCH
for (bar = m->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
}
focus(NULL);
arrange(NULL);
@ -1403,13 +1234,13 @@ configurerequest(XEvent *e)
Monitor *
createmon(void)
{
Monitor *m;
#if PERTAG_PATCH
int i;
#endif // PERTAG_PATCH
Monitor *m, *mon;
int i, n, mi, max_bars = 2, istopbar = topbar;
const BarRule *br;
Bar *bar;
#if MONITOR_RULES_PATCH
int mc, j;
Monitor *mi;
int j;
const MonitorRule *mr;
#endif // MONITOR_RULES_PATCH
@ -1425,7 +1256,6 @@ createmon(void)
m->nstack = nstack;
#endif // FLEXTILE_DELUXE_LAYOUT
m->showbar = showbar;
m->topbar = topbar;
#if SETBORDERPX_PATCH
m->borderpx = borderpx;
#endif // SETBORDERPX_PATCH
@ -1435,11 +1265,12 @@ createmon(void)
m->gappoh = gappoh;
m->gappov = gappov;
#endif // VANITYGAPS_PATCH
for (mi = 0, mon = mons; mon; mon = mon->next, mi++); // monitor index
#if MONITOR_RULES_PATCH
for (mc = 0, mi = mons; mi; mi = mi->next, mc++);
for (j = 0; j < LENGTH(monrules); j++) {
mr = &monrules[j];
if ((mr->monitor == -1 || mr->monitor == mc)
if ((mr->monitor == -1 || mr->monitor == mi)
#if PERTAG_PATCH
&& (mr->tag == -1 || mr->tag == 0)
#endif // PERTAG_PATCH
@ -1455,7 +1286,7 @@ createmon(void)
if (mr->showbar > -1)
m->showbar = mr->showbar;
if (mr->topbar > -1)
m->topbar = mr->topbar;
istopbar = mr->topbar;
break;
}
}
@ -1465,6 +1296,23 @@ createmon(void)
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
#endif // MONITOR_RULES_PATCH
/* Derive the number of bars for this monitor based on bar rules */
for (n = -1, i = 0; i < LENGTH(barrules); i++) {
br = &barrules[i];
if (br->monitor == 'A' || br->monitor == -1 || br->monitor == mi)
n = MAX(br->bar, n);
}
for (i = 0; i <= n && i < max_bars; i++) {
bar = ecalloc(1, sizeof(Bar));
bar->mon = m;
bar->idx = i;
bar->next = m->bar;
bar->topbar = istopbar;
m->bar = bar;
istopbar = !istopbar;
}
#if FLEXTILE_DELUXE_LAYOUT
m->ltaxis[LAYOUT] = m->lt[0]->preset.layout;
m->ltaxis[MASTER] = m->lt[0]->preset.masteraxis;
@ -1502,7 +1350,7 @@ createmon(void)
#if MONITOR_RULES_PATCH
for (j = 0; j < LENGTH(monrules); j++) {
mr = &monrules[j];
if ((mr->monitor == -1 || mr->monitor == mc) && (mr->tag == -1 || mr->tag == i)) {
if ((mr->monitor == -1 || mr->monitor == mi) && (mr->tag == -1 || mr->tag == i)) {
m->pertag->ltidxs[i][0] = &layouts[mr->layout];
m->pertag->ltidxs[i][1] = m->lt[0];
m->pertag->nmasters[i] = (mr->nmaster > -1 ? mr->nmaster : m->nmaster);
@ -1552,12 +1400,12 @@ destroynotify(XEvent *e)
else if ((c = swallowingclient(ev->window)))
unmanage(c->swallowing, 1);
#endif // SWALLOW_PATCH
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
else if (showsystray && (c = wintosystrayicon(ev->window))) {
removesystrayicon(c);
updatesystray();
drawbarwin(systray->bar);
}
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
}
void
@ -1601,471 +1449,123 @@ dirtomon(int dir)
void
drawbar(Monitor *m)
{
int x, w, stw = 0, stp = 0, invert;
#if ALTERNATIVE_TAGS_PATCH
int wdelta;
#endif // ALTERNATIVE_TAGS_PATCH
#if AWESOMEBAR_PATCH
int n = 0, scm, remainder, tabw;
#elif FANCYBAR_PATCH
int ftw, mw, ew = 0;
int n = 0;
#endif // FANCYBAR_PATCH, AWESOMEBAR_PATCH
#if BARPADDING_PATCH
stw = 2 * sp;
#endif // BARPADDING_PATCH
#if STATUSPADDING_PATCH
stp = lrpad / 2;
#endif // STATUSPADDING_PATCH
#if !HIDEVACANTTAGS_PATCH
#if !ACTIVETAGINDICATORBAR_PATCH && !ACTIVETAGINDICATORBAR_ALT1_PATCH
#if PANGO_PATCH
int boxs = drw->font->h / 9;
#else
int boxs = drw->fonts->h / 9;
#endif // PANGO_PATCH
#endif // ACTIVETAGINDICATORBAR_PATCH | ACTIVETAGINDICATORBAR_ALT1_PATCH
#if PANGO_PATCH
int boxw = drw->font->h / 6 + 2;
#else
int boxw = drw->fonts->h / 6 + 2;
#endif // PANGO_PATCH
#endif // HIDEVACANTTAGS_PATCH
unsigned int i, occ = 0, urg = 0;
#if STATUSCOLORS_PATCH
char *ts = stext;
char *tp = stext;
int tx = 0;
char ctmp;
#endif // STATUSCOLORS_PATCH
Client *c;
#if SYSTRAY_PATCH
if (showsystray && m == systraytomon(m))
stw += getsystraywidth();
#endif // SYSTRAY_PATCH
/* draw status first so it can be overdrawn by tags later */
#if !STATUSALLMONS_PATCH
#if STATICSTATUS_PATCH
if (m == statmon)
#else
if (m == selmon)
#endif // STATICSTATUS_PATCH
{ /* status is only drawn on selected monitor */
#endif // STATUSALLMONS_PATCH
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeStatus]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
#if STATUSCOLORS_PATCH
#if STATUSPADDING_PATCH
m->tw = textw_wosc(stext) + lrpad + 2;
#else
m->tw = textw_wosc(stext) + 2;
#endif // STATUSPADDING_PATCH
while (1) {
if ((unsigned int)*ts > LENGTH(colors)) {
ts++;
continue;
}
ctmp = *ts;
*ts = '\0';
#if PANGO_PATCH
drw_text(drw, m->ww - m->tw - stw + tx, 0, m->tw - tx, bh, stp, tp, 0, True);
tx += TEXTWM(tp) - lrpad;
#else
drw_text(drw, m->ww - m->tw - stw + tx, 0, m->tw - tx, bh, stp, tp, 0);
tx += TEXTW(tp) - lrpad;
#endif // PANGO_PATCH
if (ctmp == '\0')
break;
drw_setscheme(drw, scheme[(unsigned int)(ctmp-1)]);
*ts = ctmp;
tp = ++ts;
}
#elif STATUS2D_PATCH
m->tw = drawstatusbar(m, bh, stext, stw, stp, 1);
#else // STATUSCOLORS_PATCH
#if STATUSPADDING_PATCH && PANGO_PATCH
m->tw = TEXTWM(stext);
#elif STATUSPADDING_PATCH
m->tw = TEXTW(stext);
#elif PANGO_PATCH
m->tw = TEXTWM(stext) - lrpad + 2; /* 2px right padding */
#else
m->tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
#endif // STATUSPADDING_PATCH | PANGO_PATCH
#if PANGO_PATCH
drw_text(drw, m->ww - m->tw - stw, 0, m->tw, bh, stp, stext, 0, True);
#else
drw_text(drw, m->ww - m->tw - stw, 0, m->tw, bh, stp, stext, 0);
#endif // PANGO_PATCH
#endif // STATUSCOLORS_PATCH | STATUS2D_PATCH
#if !STATUSALLMONS_PATCH
}
#endif // STATUSALLMONS_PATCH
for (c = m->clients; c; c = c->next) {
#if AWESOMEBAR_PATCH || FANCYBAR_PATCH
if (ISVISIBLE(c))
n++;
#endif // FANCYBAR_PATCH
#if HIDEVACANTTAGS_PATCH
occ |= c->tags == 255 ? 0 : c->tags;
#else
occ |= c->tags;
#endif // HIDEVACANTTAGS_PATCH
if (c->isurgent)
urg |= c->tags;
}
x = 0;
#if LEFTLAYOUT_PATCH
w = blw = TEXTW(m->ltsymbol);
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTagsNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
#if PANGO_PATCH
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False);
#else
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
#endif // PANGO_PATCH
#endif // LEFTLAYOUT_PATCH
#if STATUSBUTTON_PATCH
w = TEXTW(buttonbar);
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTagsNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
#if PANGO_PATCH
x = drw_text(drw, x, 0, w, bh, lrpad / 2, buttonbar, 0, False);
#else
x = drw_text(drw, x, 0, w, bh, lrpad / 2, buttonbar, 0);
#endif // PANGO_PATCH
#endif // STATUSBUTTON_PATCH
#if TAGGRID_PATCH
if (drawtagmask & DRAWCLASSICTAGS)
#endif // TAGGRID_PATCH
for (i = 0; i < LENGTH(tags); i++) {
#if URGENTBORDER_PATCH
invert = 0;
#else
invert = urg & 1 << i;
#endif // URGENTBORDER_PATCH
#if HIDEVACANTTAGS_PATCH
/* do not draw vacant tags */
if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
continue;
#endif // HIDEVACANTTAGS_PATCH
w = TEXTW(tags[i]);
#if ALTERNATIVE_TAGS_PATCH
wdelta = selmon->alttag ? abs(TEXTW(tags[i]) - TEXTW(tagsalt[i])) / 2 : 0;
#endif // ALTERNATIVE_TAGS_PATCH
#if URGENTBORDER_PATCH
if (m->tagset[m->seltags] & 1 << i)
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTagsSel]);
#else
drw_setscheme(drw, scheme[SchemeSel]);
#endif // VTCOLORS_PATCH
else
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[urg & 1 << i ? SchemeUrg : SchemeTagsNorm]);
#else
drw_setscheme(drw, scheme[urg & 1 << i ? SchemeUrg : SchemeNorm]);
#endif // VTCOLORS_PATCH
#elif VTCOLORS_PATCH
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeTagsSel : SchemeTagsNorm]);
#else // URGENTBORDER_PATCH
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
#endif // URGENTBORDER_PATCH
#if ALTERNATIVE_TAGS_PATCH && PANGO_PATCH
drw_text(drw, x, 0, w, bh, wdelta + lrpad / 2, (selmon->alttag ? tagsalt[i] : tags[i]), invert, False);
#elif ALTERNATIVE_TAGS_PATCH
drw_text(drw, x, 0, w, bh, wdelta + lrpad / 2, (selmon->alttag ? tagsalt[i] : tags[i]), invert);
#elif PANGO_PATCH
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], invert, False);
#else
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], invert);
#endif // ALTERNATIVE_TAGS_PATCH
#if !HIDEVACANTTAGS_PATCH
if (occ & 1 << i)
#if ACTIVETAGINDICATORBAR_PATCH
drw_rect(drw, x + boxw, 0, w - ( 2 * boxw + 1), boxw,
#elif ACTIVETAGINDICATORBAR_ALT1_PATCH
drw_rect(drw, x + boxw, bh - boxw/2, w - ( 2 * boxw + 1), boxw/2,
#else
drw_rect(drw, x + boxs, boxs, boxw, boxw,
#endif // ACTIVETAGINDICATORBAR_PATCH
m == selmon && selmon->sel && selmon->sel->tags & 1 << i, invert);
#endif // HIDEVACANTTAGS_PATCH
x += w;
}
#if TAGGRID_PATCH
if (drawtagmask & DRAWTAGGRID) {
drawtaggrid(m,&x,occ);
}
#endif // TAGGRID_PATCH
#if !LEFTLAYOUT_PATCH
w = blw = TEXTW(m->ltsymbol);
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTagsNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
#if PANGO_PATCH
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False);
#else
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
#endif // PANGO_PATCH
#endif // LEFTLAYOUT_PATCH
if ((w = m->ww - m->tw - stw - x) > bh)
{
#if AWESOMEBAR_PATCH
if (n > 0) {
remainder = w % n;
tabw = w / n;
for (i = 0, c = m->clients; c; c = c->next, i++) {
if (!ISVISIBLE(c))
continue;
if (m->sel == c)
#if VTCOLORS_PATCH
scm = SchemeTitleSel;
#elif TITLECOLOR_PATCH
scm = SchemeTitle;
#else
scm = SchemeSel;
#endif // VTCOLORS_PATCH / TITLECOLOR_PATCH
else if (HIDDEN(c))
scm = SchemeHid;
else
#if VTCOLORS_PATCH
scm = SchemeTitleNorm;
#else
scm = SchemeNorm;
#endif // VTCOLORS_PATCH
drw_setscheme(drw, scheme[scm]);
#if PANGO_PATCH
drw_text(drw, x, 0, tabw + (i < remainder ? 1 : 0), bh, lrpad / 2, c->name, 0, False);
#else
drw_text(drw, x, 0, tabw + (i < remainder ? 1 : 0), bh, lrpad / 2, c->name, 0);
#endif // PANGO_PATCH
x += tabw;
}
} else {
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTitleNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
drw_rect(drw, x, 0, w, bh, 1, 1);
}
#elif FANCYBAR_PATCH
if (n > 0) {
ftw = TEXTW(m->sel->name) + lrpad;
mw = (ftw >= w || n == 1) ? 0 : (w - ftw) / (n - 1);
i = 0;
for (c = m->clients; c; c = c->next) {
if (!ISVISIBLE(c) || c == m->sel)
continue;
ftw = TEXTW(c->name);
if (ftw < mw)
ew += (mw - ftw);
else
i++;
}
if (i > 0)
mw += ew / i;
for (c = m->clients; c; c = c->next) {
if (!ISVISIBLE(c))
continue;
ftw = MIN(m->sel == c ? w : mw, TEXTW(c->name));
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[m->sel == c ? SchemeTitleSel : SchemeTitleNorm]);
#elif TITLECOLOR_PATCH
drw_setscheme(drw, scheme[m->sel == c ? SchemeTitle : SchemeNorm]);
#else
drw_setscheme(drw, scheme[m->sel == c ? SchemeSel : SchemeNorm]);
#endif // VTCOLORS_PATCH / TITLECOLOR_PATCH
if (ftw > 0) /* trap special handling of 0 in drw_text */
#if PANGO_PATCH
drw_text(drw, x, 0, ftw, bh, lrpad / 2, c->name, 0, False);
#else
drw_text(drw, x, 0, ftw, bh, lrpad / 2, c->name, 0);
#endif // PANGO_PATCH
#if !HIDEVACANTTAGS_PATCH
if (c->isfloating)
#if ACTIVETAGINDICATORBAR_PATCH
drw_rect(drw, x + boxw, 0, w - ( 2 * boxw + 1), boxw, c->isfixed, 0);
#elif ACTIVETAGINDICATORBAR_ALT1_PATCH
drw_rect(drw, x + boxw, bh - boxw/2, w - ( 2 * boxw + 1), boxw/2,
#else
drw_rect(drw, x + boxs, boxs, boxw, boxw, c->isfixed, 0);
#endif // ACTIVETAGINDICATORBAR_PATCH
#endif // HIDEVACANTTAGS_PATCH
x += ftw;
w -= ftw;
}
}
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTitleNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
drw_rect(drw, x, 0, w, bh, 1, 1);
#else
if (m->sel) {
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[m == selmon ? SchemeTitleSel : SchemeTitleNorm]);
#elif TITLECOLOR_PATCH
drw_setscheme(drw, scheme[m == selmon ? SchemeTitle : SchemeNorm]);
#else
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
#endif // VTCOLORS_PATCH / TITLECOLOR_PATCH
#if IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
XSetErrorHandler(xerrordummy);
#endif // IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
#if CENTEREDWINDOWNAME_PATCH
int mid = (m->ww - TEXTW(m->sel->name)) / 2 - x;
#if BARPADDING_PATCH && PANGO_PATCH
drw_text(drw, x, 0, w - 2*sp, bh, mid, m->sel->name, 0, False);
#elif BARPADDING_PATCH
drw_text(drw, x, 0, w - 2*sp, bh, mid, m->sel->name, 0);
#elif PANGO_PATCH
drw_text(drw, x, 0, w, bh, mid, m->sel->name, 0, False);
#else
drw_text(drw, x, 0, w, bh, mid, m->sel->name, 0);
#endif // BARPADDING_PATCH
#else
#if BARPADDING_PATCH && PANGO_PATCH
drw_text(drw, x, 0, w - 2*sp, bh, lrpad / 2, m->sel->name, 0, False);
#elif BARPADDING_PATCH
drw_text(drw, x, 0, w - 2*sp, bh, lrpad / 2, m->sel->name, 0);
#elif PANGO_PATCH
drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0, False);
#else
drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
#endif // BARPADDING_PATCH
#endif // CENTEREDWINDOWNAME_PATCH
#if IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
XSync(dpy, False);
XSetErrorHandler(xerror);
#endif // IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
#if !HIDEVACANTTAGS_PATCH
if (m->sel->isfloating)
#if ACTIVETAGINDICATORBAR_PATCH
drw_rect(drw, x + boxw, 0, w - ( 2 * boxw + 1), boxw, m->sel->isfixed, 0);
#elif ACTIVETAGINDICATORBAR_ALT1_PATCH
drw_rect(drw, x + boxw, bh - boxw/2, w - ( 2 * boxw + 1), boxw/2,
#else
drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
#endif // ACTIVETAGINDICATORBAR_PATCH
#endif // HIDEVACANTTAGS_PATCH
} else {
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTitleNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
#if BARPADDING_PATCH
drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1);
#else
drw_rect(drw, x, 0, w, bh, 1, 1);
#endif // BARPADDING_PATCH
}
#endif // FANCYBAR_PATCH, AWESOMEBAR_PATCH
}
#if AWESOMEBAR_PATCH
m->bt = n;
m->btw = w;
#endif // AWESOMEBAR_PATCH
drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh);
#if EXTRABAR_PATCH
#if STATICSTATUS_PATCH
if (m == statebmon && m->extrabarwin)
#else
if (m == selmon && m->extrabarwin)
#endif // STATICSTATUS_PATCH
{ /* extra status is only drawn on selected monitor */
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTitleNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
drw_rect(drw, 0, 0, m->ww, bh, 1, 1);
#if !STATUS2D_PATCH
#if PANGO_PATCH
w = TEXTWM(estext) - lrpad;
#else
w = TEXTW(estext) - lrpad;
#endif // PANGO_PATCH
if (ebalign == 0)
x = 0; // left
else if (ebalign == 1)
x = m->ww - w; // right
else
x = m->ww / 2 - w / 2; // center
#if PANGO_PATCH
drw_text(drw, x, 0, mons->ww, bh, 0, estext, 0, True);
#else
drw_text(drw, x, 0, mons->ww, bh, 0, estext, 0);
#endif // PANGO_PATCH
#else
w = drawstatusbar(m, bh, estext, 0, 0, ebalign);
#endif // STATUS2D_PATCH
#if STATUSCMD_PATCH
m->etw = w;
#endif // STATUSCMD_PATCH
drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh);
}
#if !STATICSTATUS_PATCH
else { /* clear status on other monitors */
#if VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTitleNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // VTCOLORS_PATCH
drw_rect(drw, 0, 0, m->ww, bh, 1, 1);
drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh);
}
#endif // STATICSTATUS_PATCH
#endif // EXTRABAR_PATCH
Bar *bar;
for (bar = m->bar; bar; bar = bar->next)
drawbarwin(bar);
}
void
drawbars(void)
{
Monitor *m;
#if SYSTRAY_PATCH
if (showsystray && systraypinning == 0) {
/* Clear status bar to avoid artifacts beneath systray icons */
drw_setscheme(drw, scheme[SchemeNorm]);
drw_rect(drw, 0, 0, selmon->ww, bh, 1, 1);
drw_map(drw, selmon->barwin, 0, 0, selmon->ww, bh);
}
#endif // SYSTRAY_PATCH
for (m = mons; m; m = m->next)
drawbar(m);
}
#if SYSTRAY_PATCH
if (showsystray)
updatesystray();
#endif // SYSTRAY_PATCH
void
drawbarwin(Bar *bar)
{
if (!bar->win)
return;
Monitor *mon;
int r, w, mi;
int rx, lx, rw, lw; // bar size, split between left and right if a center module is added
const BarRule *br;
BarWidthArg warg = { 0 };
BarDrawArg darg = { 0, 0 };
for (mi = 0, mon = mons; mon && mon != bar->mon; mon = mon->next, mi++); // get the monitor index
rw = lw = bar->bw;
rx = lx = 0;
#if BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTagsNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // BAR_VTCOLORS_PATCH
drw_rect(drw, lx, 0, lw, bh, 1, 1);
for (r = 0; r < LENGTH(barrules); r++) {
br = &barrules[r];
if (br->bar != bar->idx || br->drawfunc == NULL || (br->monitor == 'A' && bar->mon != selmon))
continue;
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != mi)
continue;
#if BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTagsNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // BAR_VTCOLORS_PATCH
warg.max_width = (br->alignment < BAR_ALIGN_RIGHT_LEFT ? lw : rw);
w = br->widthfunc(bar, &warg);
w = MIN(warg.max_width, w);
if (lw <= 0) { // if left is exhausted then switch to right side, and vice versa
lw = rw;
lx = rx;
} else if (rw <= 0) {
rw = lw;
rx = lx;
}
switch(br->alignment) {
default:
case BAR_ALIGN_NONE:
case BAR_ALIGN_LEFT_LEFT:
case BAR_ALIGN_LEFT:
bar->x[r] = lx;
if (lx == rx) {
rx += w;
rw -= w;
}
lx += w;
lw -= w;
break;
case BAR_ALIGN_LEFT_RIGHT:
case BAR_ALIGN_RIGHT:
bar->x[r] = lx + lw - w;
if (lx == rx)
rw -= w;
lw -= w;
break;
case BAR_ALIGN_LEFT_CENTER:
case BAR_ALIGN_CENTER:
bar->x[r] = lx + lw / 2 - w / 2;
if (lx == rx) {
rw = rx + rw - bar->x[r] - w;
rx = bar->x[r] + w;
}
lw = bar->x[r] - lx;
break;
case BAR_ALIGN_RIGHT_LEFT:
bar->x[r] = rx;
if (lx == rx) {
lx += w;
lw -= w;
}
rx += w;
rw -= w;
break;
case BAR_ALIGN_RIGHT_RIGHT:
bar->x[r] = rx + rw - w;
if (lx == rx)
lw -= w;
rw -= w;
break;
case BAR_ALIGN_RIGHT_CENTER:
bar->x[r] = rx + rw / 2 - w / 2;
if (lx == rx) {
lw = lx + lw - bar->x[r] + w;
lx = bar->x[r] + w;
}
rw = bar->x[r] - rx;
break;
}
bar->w[r] = w;
darg.x = bar->x[r];
darg.w = bar->w[r];
br->drawfunc(bar, &darg);
}
drw_map(drw, bar->win, 0, 0, bar->bw, bar->bh);
}
#if !FOCUSONCLICK_PATCH
@ -2095,25 +1595,20 @@ expose(XEvent *e)
Monitor *m;
XExposeEvent *ev = &e->xexpose;
if (ev->count == 0 && (m = wintomon(ev->window))) {
if (ev->count == 0 && (m = wintomon(ev->window)))
drawbar(m);
#if SYSTRAY_PATCH
if (showsystray && m == selmon)
updatesystray();
#endif // SYSTRAY_PATCH
}
}
void
focus(Client *c)
{
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
if (!c || !ISVISIBLE(c) || HIDDEN(c))
for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext);
#else
if (!c || !ISVISIBLE(c))
for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
if (selmon->sel && selmon->sel != c)
unfocus(selmon->sel, 0);
if (c) {
@ -2208,7 +1703,7 @@ getatomprop(Client *c, Atom prop)
unsigned char *p = NULL;
Atom da, atom = None;
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
/* FIXME getatomprop should return the number of items and a pointer to
* the stored data instead of this workaround */
Atom req = XA_ATOM;
@ -2228,7 +1723,7 @@ getatomprop(Client *c, Atom prop)
atom = *(Atom *)p;
XFree(p);
}
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
return atom;
}
@ -2380,11 +1875,11 @@ killclient(const Arg *arg)
if (!selmon->sel)
#endif // ISPERMANENT_PATCH
return;
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0, 0, 0)) {
#else
if (!sendevent(selmon->sel, wmatom[WMDelete])) {
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XSetCloseDownMode(dpy, DestroyAll);
@ -2462,7 +1957,7 @@ manage(Window w, XWindowAttributes *wa)
c->y = c->mon->my + c->mon->mh - HEIGHT(c);
c->x = MAX(c->x, c->mon->mx);
/* only fix client y-offset, if the client center might cover the bar */
c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx)
c->y = MAX(c->y, ((c->mon->bar->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx)
&& (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
#if !FLOATPOS_PATCH
#if SETBORDERPX_PATCH
@ -2529,22 +2024,22 @@ manage(Window w, XWindowAttributes *wa)
(unsigned char *) &(c->win), 1);
XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
if (!HIDDEN(c))
setclientstate(c, NormalState);
#else
setclientstate(c, NormalState);
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
if (c->mon == selmon)
unfocus(selmon->sel, 0);
c->mon->sel = c;
arrange(c->mon);
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
if (!HIDDEN(c))
XMapWindow(dpy, c->win);
#else
XMapWindow(dpy, c->win);
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
#if SWALLOW_PATCH
if (term)
swallow(term, c);
@ -2568,13 +2063,13 @@ maprequest(XEvent *e)
static XWindowAttributes wa;
XMapRequestEvent *ev = &e->xmaprequest;
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
Client *i;
if (showsystray && (i = wintosystrayicon(ev->window))) {
sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION);
updatesystray();
drawbarwin(systray->bar);
}
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
if (!XGetWindowAttributes(dpy, ev->window, &wa))
return;
@ -2687,11 +2182,11 @@ movemouse(const Arg *arg)
Client *
nexttiled(Client *c)
{
#if AWESOMEBAR_PATCH
#if BAR_AWESOMEBAR_PATCH
for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next);
#else
for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next);
#endif // AWESOMEBAR_PATCH
#endif // BAR_AWESOMEBAR_PATCH
return c;
}
@ -2713,7 +2208,7 @@ propertynotify(XEvent *e)
Window trans;
XPropertyEvent *ev = &e->xproperty;
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
if (showsystray && (c = wintosystrayicon(ev->window))) {
if (ev->atom == XA_WM_NORMAL_HINTS) {
updatesizehints(c);
@ -2721,9 +2216,9 @@ propertynotify(XEvent *e)
}
else
updatesystrayiconstate(c, ev);
updatesystray();
drawbarwin(systray->bar);
}
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
if ((ev->window == root) && (ev->atom == XA_WM_NAME)) {
#if DWMC_PATCH || FSIGNAL_PATCH
@ -2747,11 +2242,8 @@ propertynotify(XEvent *e)
break;
case XA_WM_HINTS:
updatewmhints(c);
drawbars();
#if URGENTBORDER_PATCH
if (c->isurgent)
XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColBorder].pixel);
#endif // URGENTBORDER_PATCH
drawbars();
break;
}
if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
@ -2989,7 +2481,7 @@ restack(Monitor *m)
XRaiseWindow(dpy, m->sel->win);
if (m->lt[m->sellt]->arrange) {
wc.stack_mode = Below;
wc.sibling = m->barwin;
wc.sibling = m->bar->win;
for (c = m->stack; c; c = c->snext)
if (!c->isfloating && ISVISIBLE(c)) {
XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
@ -3103,21 +2595,21 @@ setclientstate(Client *c, long state)
}
int
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4)
#else
sendevent(Client *c, Atom proto)
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
{
int n;
Atom *protocols;
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
Atom mt;
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
int exists = 0;
XEvent ev;
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) {
mt = wmatom[WMProtocols];
if (XGetWMProtocols(dpy, w, &protocols, &n)) {
@ -3135,10 +2627,10 @@ sendevent(Client *c, Atom proto)
exists = protocols[n] == proto;
XFree(protocols);
}
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
if (exists) {
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
ev.type = ClientMessage;
ev.xclient.window = w;
ev.xclient.message_type = mt;
@ -3157,7 +2649,7 @@ sendevent(Client *c, Atom proto)
ev.xclient.data.l[0] = proto;
ev.xclient.data.l[1] = CurrentTime;
XSendEvent(dpy, c->win, False, NoEventMask, &ev);
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
}
return exists;
}
@ -3171,11 +2663,11 @@ setfocus(Client *c)
XA_WINDOW, 32, PropModeReplace,
(unsigned char *) &(c->win), 1);
}
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0);
#else
sendevent(c, wmatom[WMTakeFocus]);
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
}
void
@ -3316,25 +2808,25 @@ setup(void)
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
root = RootWindow(dpy, screen);
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
xinitvisual();
drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap);
#else
drw = drw_create(dpy, screen, root, sw, sh);
#endif // ALPHA_PATCH
#if PANGO_PATCH
#endif // BAR_ALPHA_PATCH
#if BAR_PANGO_PATCH
if (!drw_font_create(drw, font))
#else
if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
die("no fonts could be loaded.");
#if STATUSPADDING_PATCH && PANGO_PATCH
#if BAR_STATUSPADDING_PATCH && BAR_PANGO_PATCH
lrpad = drw->font->h + horizpadbar;
bh = drw->font->h + vertpadbar;
#elif STATUSPADDING_PATCH
#elif BAR_STATUSPADDING_PATCH
lrpad = drw->fonts->h + horizpadbar;
bh = drw->fonts->h + vertpadbar;
#elif PANGO_PATCH
#elif BAR_PANGO_PATCH
lrpad = drw->font->h;
bh = drw->font->h + 2;
#else
@ -3344,12 +2836,8 @@ setup(void)
#else
bh = drw->fonts->h + 2;
#endif // BAR_HEIGHT_PATCH
#endif // STATUSPADDING_PATCH
#endif // BAR_STATUSPADDING_PATCH
updategeom();
#if BARPADDING_PATCH
sp = sidepad;
vp = (topbar == 1) ? vertpad : - vertpad;
#endif // BARPADDING_PATCH
/* init atoms */
utf8string = XInternAtom(dpy, "UTF8_STRING", False);
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
@ -3361,7 +2849,7 @@ setup(void)
#endif // WINDOWROLERULE_PATCH
netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False);
netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False);
netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False);
@ -3371,13 +2859,13 @@ setup(void)
xatom[Manager] = XInternAtom(dpy, "MANAGER", False);
xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False);
xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False);
#endif // SYSTRAY_PATCH
#if EWMHTAGS_PATCH
#endif // BAR_SYSTRAY_PATCH
#if BAR_EWMHTAGS_PATCH
netatom[NetDesktopViewport] = XInternAtom(dpy, "_NET_DESKTOP_VIEWPORT", False);
netatom[NetNumberOfDesktops] = XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False);
netatom[NetCurrentDesktop] = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False);
netatom[NetDesktopNames] = XInternAtom(dpy, "_NET_DESKTOP_NAMES", False);
#endif // EWMHTAGS_PATCH
#endif // BAR_EWMHTAGS_PATCH
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);
@ -3402,7 +2890,7 @@ setup(void)
#endif // DRAGCFACT_PATCH
cursor[CurMove] = drw_cur_create(drw, XC_fleur);
/* init appearance */
#if VTCOLORS_PATCH
#if BAR_VTCOLORS_PATCH
get_vt_colors();
if (get_luminance(colors[SchemeTagsNorm][ColBg]) > 50) {
strcpy(colors[SchemeTitleNorm][ColBg], title_bg_light);
@ -3411,34 +2899,26 @@ setup(void)
strcpy(colors[SchemeTitleNorm][ColBg], title_bg_dark);
strcpy(colors[SchemeTitleSel][ColBg], title_bg_dark);
}
#endif // VTCOLORS_PATCH
#if STATUS2D_PATCH && !STATUSCOLORS_PATCH
#endif // BAR_VTCOLORS_PATCH
#if BAR_STATUS2D_PATCH && !BAR_STATUSCOLORS_PATCH
scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *));
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], alphas[0], ColCount);
#else
scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], ColCount);
#endif // ALPHA_PATCH | FLOAT_BORDER_COLOR_PATCH
#endif // BAR_ALPHA_PATCH | FLOAT_BORDER_COLOR_PATCH
#else
scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
#endif // STATUS2D_PATCH
#endif // BAR_STATUS2D_PATCH
for (i = 0; i < LENGTH(colors); i++)
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
scheme[i] = drw_scm_create(drw, colors[i], alphas[i], ColCount);
#else
scheme[i] = drw_scm_create(drw, colors[i], ColCount);
#endif // ALPHA_PATCH
#if SYSTRAY_PATCH
/* init system tray */
if (showsystray)
updatesystray();
#endif // SYSTRAY_PATCH
/* init bars */
#endif // BAR_ALPHA_PATCH
updatebars();
updatestatus();
#if BARPADDING_PATCH
updatebarpos(selmon);
#endif // BARPADDING_PATCH
/* supporting window for NetWMCheck */
wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0);
XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32,
@ -3450,12 +2930,12 @@ setup(void)
/* EWMH support per view */
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
PropModeReplace, (unsigned char *) netatom, NetLast);
#if EWMHTAGS_PATCH
#if BAR_EWMHTAGS_PATCH
setnumdesktops();
setcurrentdesktop();
setdesktopnames();
setviewport();
#endif // EWMHTAGS_PATCH
#endif // BAR_EWMHTAGS_PATCH
XDeleteProperty(dpy, root, netatom[NetClientList]);
/* select events */
wa.cursor = cursor[CurNormal]->cursor;
@ -3538,14 +3018,14 @@ sigchld(int unused)
void
spawn(const Arg *arg)
{
#if STATUSCMD_PATCH && !DWMBLOCKS_PATCH
#if BAR_STATUSCMD_PATCH && !BAR_DWMBLOCKS_PATCH
char *cmd = NULL;
#endif // STATUSCMD_PATCH | DWMBLOCKS_PATCH
#endif // BAR_STATUSCMD_PATCH | BAR_DWMBLOCKS_PATCH
#if !NODMENU_PATCH
if (arg->v == dmenucmd)
dmenumon[0] = '0' + selmon->num;
#endif // NODMENU_PATCH
#if STATUSCMD_PATCH && !DWMBLOCKS_PATCH
#if BAR_STATUSCMD_PATCH && !BAR_DWMBLOCKS_PATCH
#if !NODMENU_PATCH
else if (arg->v == statuscmd)
#else
@ -3560,7 +3040,7 @@ spawn(const Arg *arg)
cmd[LENGTH(statusexport)-3] = '0' + lastbutton;
statuscmd[2] = cmd;
}
#endif // STATUSCMD_PATCH | DWMBLOCKS_PATCH
#endif // BAR_STATUSCMD_PATCH | BAR_DWMBLOCKS_PATCH
if (fork() == 0) {
if (dpy)
@ -3605,9 +3085,9 @@ spawn(const Arg *arg)
perror(" failed");
exit(EXIT_SUCCESS);
}
#if STATUSCMD_PATCH && !DWMBLOCKS_PATCH
#if BAR_STATUSCMD_PATCH && !BAR_DWMBLOCKS_PATCH
free(cmd);
#endif // STATUSCMD_PATCH | DWMBLOCKS_PATCH
#endif // BAR_STATUSCMD_PATCH | BAR_DWMBLOCKS_PATCH
}
void
@ -3669,42 +3149,19 @@ tagmon(const Arg *arg)
void
togglebar(const Arg *arg)
{
#if HOLDBAR_PATCH && PERTAG_PATCH && PERTAGBAR_PATCH
Bar *bar;
#if BAR_HOLDBAR_PATCH && PERTAG_PATCH && PERTAGBAR_PATCH
selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = (selmon->showbar == 2 ? 1 : !selmon->showbar);
#elif HOLDBAR_PATCH
#elif BAR_HOLDBAR_PATCH
selmon->showbar = (selmon->showbar == 2 ? 1 : !selmon->showbar);
#elif PERTAG_PATCH && PERTAGBAR_PATCH
selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
#else
selmon->showbar = !selmon->showbar;
#endif // HOLDBAR_PATCH | PERTAG_PATCH
#endif // BAR_HOLDBAR_PATCH | PERTAG_PATCH
updatebarpos(selmon);
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2*sp, bh);
#else
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
#endif // BARPADDING_PATCH
#if EXTRABAR_PATCH
if (selmon->extrabarwin)
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx + sp, selmon->eby - vp, selmon->ww - 2*sp, bh);
#else
XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
#endif // BARPADDING_PATCH
#endif // EXTRABAR_PATCH
#if SYSTRAY_PATCH
if (showsystray && selmon == systraytomon(selmon) ) {
XWindowChanges wc;
if (!selmon->showbar)
wc.y = -bh;
else if (selmon->showbar) {
wc.y = 0;
if (!selmon->topbar)
wc.y = selmon->mh - bh;
}
XConfigureWindow(dpy, systray->win, CWY, &wc);
}
#endif // SYSTRAY_PATCH
for (bar = selmon->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
arrange(selmon);
}
@ -3774,9 +3231,9 @@ toggletag(const Arg *arg)
#endif // SWAPFOCUS_PATCH
arrange(selmon);
}
#if EWMHTAGS_PATCH
#if BAR_EWMHTAGS_PATCH
updatecurrentdesktop();
#endif // EWMHTAGS_PATCH
#endif // BAR_EWMHTAGS_PATCH
}
void
@ -3853,9 +3310,9 @@ toggleview(const Arg *arg)
#if !EMPTYVIEW_PATCH
}
#endif // EMPTYVIEW_PATCH
#if EWMHTAGS_PATCH
#if BAR_EWMHTAGS_PATCH
updatecurrentdesktop();
#endif // EWMHTAGS_PATCH
#endif // BAR_EWMHTAGS_PATCH
}
void
@ -3953,102 +3410,51 @@ unmapnotify(XEvent *e)
setclientstate(c, WithdrawnState);
else
unmanage(c, 0);
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
} else if (showsystray && (c = wintosystrayicon(ev->window))) {
/* KLUDGE! sometimes icons occasionally unmap their windows, but do
* _not_ destroy them. We map those windows back */
XMapRaised(dpy, c->win);
removesystrayicon(c);
updatesystray();
#endif // SYSTRAY_PATCH
drawbarwin(systray->bar);
#endif // BAR_SYSTRAY_PATCH
}
}
void
updatebars(void)
{
unsigned int w;
Bar *bar;
Monitor *m;
XSetWindowAttributes wa = {
.override_redirect = True,
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
.background_pixel = 0,
.border_pixel = 0,
.colormap = cmap,
#else
.background_pixmap = ParentRelative,
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
.event_mask = ButtonPressMask|ExposureMask
};
XClassHint ch = {"dwm", "dwm"};
for (m = mons; m; m = m->next) {
if (!m->barwin) {
w = m->ww;
#if SYSTRAY_PATCH
if (showsystray && m == systraytomon(m))
w -= getsystraywidth();
#endif // SYSTRAY_PATCH
#if ALPHA_PATCH
#if BARPADDING_PATCH
m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, w - 2*sp, bh, 0, depth,
InputOutput, visual,
CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
#else
m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, depth,
InputOutput, visual,
CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
#endif // BARPADDING_PATCH
#else
#if BARPADDING_PATCH
m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, w - 2*sp, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
#else
m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
#endif // BARPADDING_PATCH
#endif // ALPHA_PATCH
XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
#if SYSTRAY_PATCH
if (showsystray && m == systraytomon(m))
XMapRaised(dpy, systray->win);
#endif // SYSTRAY_PATCH
XMapRaised(dpy, m->barwin);
XSetClassHint(dpy, m->barwin, &ch);
for (bar = m->bar; bar; bar = bar->next) {
if (!bar->win) { // TODO add static status controls to not create / show extra bar?
#if BAR_ALPHA_PATCH
bar->win = XCreateWindow(dpy, root, bar->bx, bar->by, bar->bw, bar->bh, 0, depth,
InputOutput, visual,
CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
#else
bar->win = XCreateWindow(dpy, root, bar->bx, bar->by, bar->bw, bar->bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
#endif // BAR_ALPHA_PATCH
XDefineCursor(dpy, bar->win, cursor[CurNormal]->cursor);
XMapRaised(dpy, bar->win);
XSetClassHint(dpy, bar->win, &ch);
}
}
#if EXTRABAR_PATCH
#if STATICSTATUS_PATCH
if (m == statebmon && !m->extrabarwin)
#else
if (!m->extrabarwin)
#endif // STATICSTATUS_PATCH
{
#if ALPHA_PATCH
#if BARPADDING_PATCH
m->extrabarwin = XCreateWindow(dpy, root, m->wx + sp, m->eby - vp, m->ww - 2*sp, bh, 0, depth,
InputOutput, visual,
CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
#else
m->extrabarwin = XCreateWindow(dpy, root, m->wx, m->eby, m->ww, bh, 0, depth,
InputOutput, visual,
CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
#endif // BARPADDING_PATCH
#elif BARPADDING_PATCH
m->extrabarwin = XCreateWindow(dpy, root, m->wx + sp, m->eby - vp, m->ww - 2*sp, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
#else
m->extrabarwin = XCreateWindow(dpy, root, m->wx, m->eby, m->ww, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
#endif // ALPHA_PATCH
XDefineCursor(dpy, m->extrabarwin, cursor[CurNormal]->cursor);
XMapRaised(dpy, m->extrabarwin);
XSetClassHint(dpy, m->extrabarwin, &ch);
}
#endif // EXTRABAR_PATCH
}
}
@ -4057,54 +3463,34 @@ updatebarpos(Monitor *m)
{
m->wy = m->my;
m->wh = m->mh;
#if EXTRABAR_PATCH
int num_bars;
#if STATICSTATUS_PATCH
int has_extrabar = (m == statebmon);
Bar *bar;
#if BAR_PADDING_PATCH
int y_pad = vertpad;
int x_pad = sidepad;
#else
int has_extrabar = 1;
#endif // STATICSTATUS_PATCH
num_bars = m->showbar * (1 + has_extrabar);
#if BARPADDING_PATCH
m->wh = m->wh - vertpad * num_bars - bh * num_bars;
m->wy = m->showbar ? m->wy + bh + vertpad: m->wy;
if (m->showbar) {
m->by = m->topbar ? m->wy - bh - vertpad: m->wy + m->wh + vertpad;
if (has_extrabar)
m->eby = m->topbar ? m->wy + m->wh + vertpad: m->wy - bh - vertpad;
} else {
m->by = -bh - vertpad;
if (has_extrabar)
m->eby = -bh - vertpad;
int y_pad = 0;
int x_pad = 0;
#endif // BAR_PADDING_PATCH
for (num_bars = 0, bar = m->bar; bar; bar = bar->next, num_bars++);
if (m->showbar)
m->wh = m->wh - y_pad * num_bars - bh * num_bars;
for (bar = m->bar; bar; bar = bar->next) {
bar->bx = m->mx + x_pad;
bar->bw = m->ww - 2 * x_pad;
bar->bh = bh;
if (m->showbar) {
if (bar->topbar) {
m->wy = m->wy + bh + y_pad;
bar->by = m->wy - bh;
} else
bar->by = m->wy + m->wh;
} else {
bar->by = -bh - y_pad;
}
}
#else
m->wh = m->wh - bh * num_bars;
m->wy = m->showbar ? m->wy + bh : m->wy;
if (m->showbar) {
m->by = m->topbar ? m->wy - bh : m->wy + m->wh;
if (has_extrabar)
m->eby = m->topbar ? m->wy + m->wh : m->wy - bh;
} else {
m->by = -bh;
if (has_extrabar)
m->eby = -bh;
}
#endif // BARPADDING_PATCH
#elif BARPADDING_PATCH
if (m->showbar) {
m->wh = m->wh - vertpad - bh;
m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad;
m->wy = m->topbar ? m->wy + bh + vp : m->wy;
} else
m->by = -bh - vp;
#else
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;
#endif // EXTRABAR_PATCH
}
void
@ -4154,14 +3540,6 @@ updategeom(void)
mons = createmon();
}
for (i = 0, m = mons; i < nn && m; m = m->next, i++) {
#if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH
if (i == statmonval)
statmon = m;
#if EXTRABAR_PATCH
if (i == statebmonval)
statebmon = m;
#endif // EXTRABAR_PATCH
#endif // STATICSTATUS_PATCH
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)
@ -4188,14 +3566,6 @@ updategeom(void)
}
if (m == selmon)
selmon = mons;
#if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH
if (m == statmon)
statmon = mons;
#if EXTRABAR_PATCH
if (m == statebmon)
statebmon = mons;
#endif // EXTRABAR_PATCH
#endif // STATICSTATUS_PATCH
cleanupmon(m);
}
}
@ -4212,14 +3582,6 @@ updategeom(void)
updatebarpos(mons);
}
}
#if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH
if (!statmon)
statmon = mons;
#if EXTRABAR_PATCH
if (!statebmon)
statebmon = mons;
#endif // EXTRABAR_PATCH
#endif // STATICSTATUS_PATCH
if (dirty) {
selmon = mons;
selmon = wintomon(root);
@ -4303,10 +3665,8 @@ updatesizehints(Client *c)
void
updatestatus(void)
{
#if STATUSALLMONS_PATCH
Monitor* m;
#endif // STATUSALLMONS_PATCH
#if EXTRABAR_PATCH
Monitor *m;
#if BAR_EXTRASTATUS_PATCH
if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext))) {
strcpy(stext, "dwm-"VERSION);
estext[0] = '\0';
@ -4314,22 +3674,22 @@ updatestatus(void)
char *e = strchr(rawstext, statussep);
if (e) {
*e = '\0'; e++;
#if STATUSCMD_PATCH
#if BAR_STATUSCMD_PATCH
strncpy(rawestext, e, sizeof(estext) - 1);
copyvalidchars(estext, rawestext);
#else
strncpy(estext, e, sizeof(estext) - 1);
#endif // STATUSCMD_PATCH
#endif // BAR_STATUSCMD_PATCH
} else {
estext[0] = '\0';
}
#if STATUSCMD_PATCH
#if BAR_STATUSCMD_PATCH
copyvalidchars(stext, rawstext);
#else
strncpy(stext, rawstext, sizeof(stext) - 1);
#endif // STATUSCMD_PATCH
#endif // BAR_STATUSCMD_PATCH
}
#elif STATUSCMD_PATCH
#elif BAR_STATUSCMD_PATCH
if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext)))
strcpy(stext, "dwm-"VERSION);
else
@ -4337,23 +3697,9 @@ updatestatus(void)
#else
if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
strcpy(stext, "dwm-"VERSION);
#endif // EXTRABAR_PATCH
#if STATUSALLMONS_PATCH
#endif // BAR_EXTRASTATUS_PATCH | BAR_STATUSCMD_PATCH
for (m = mons; m; m = m->next)
drawbar(m);
#elif STATICSTATUS_PATCH
drawbar(statmon);
#if EXTRABAR_PATCH
if (statmon != statebmon)
drawbar(statebmon);
#endif // EXTRABAR_PATCH
#else
drawbar(selmon);
#endif // STATUSALLMONS_PATCH | STATICSTATUS_PATCH
#if SYSTRAY_PATCH
if (showsystray)
updatesystray();
#endif // SYSTRAY_PATCH
}
void
@ -4374,19 +3720,18 @@ updatewmhints(Client *c)
if (c == selmon->sel && wmh->flags & XUrgencyHint) {
wmh->flags &= ~XUrgencyHint;
XSetWMHints(dpy, c->win, wmh);
} else {
} else
c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0;
#if URGENTBORDER_PATCH
if (c->isurgent) {
#if FLOAT_BORDER_COLOR_PATCH
if (c->isfloating)
XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColFloat].pixel);
else
#endif
XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColBorder].pixel);
}
#endif // URGENTBORDER_PATCH
#if URGENTBORDER_PATCH
if (c->isurgent) {
#if FLOAT_BORDER_COLOR_PATCH
if (c->isfloating)
XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColFloat].pixel);
else
#endif
XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColBorder].pixel);
}
#endif // URGENTBORDER_PATCH
if (wmh->flags & InputHint)
c->neverfocus = !wmh->input;
else
@ -4419,9 +3764,9 @@ view(const Arg *arg)
selmon->pertag->prevclient[selmon->pertag->curtag] = unmodified;
#endif // SWAPFOCUS_PATCH
arrange(selmon);
#if EWMHTAGS_PATCH
#if BAR_EWMHTAGS_PATCH
updatecurrentdesktop();
#endif // EWMHTAGS_PATCH
#endif // BAR_EWMHTAGS_PATCH
}
Client *
@ -4443,16 +3788,14 @@ wintomon(Window w)
int x, y;
Client *c;
Monitor *m;
Bar *bar;
if (w == root && getrootptr(&x, &y))
return recttomon(x, y, 1, 1);
for (m = mons; m; m = m->next)
#if EXTRABAR_PATCH
if (w == m->barwin || w == m->extrabarwin)
#else
if (w == m->barwin)
#endif // EXTRABAR_PATCH
return m;
for (bar = m->bar; bar; bar = bar->next)
if (w == bar->win)
return m;
if ((c = wintoclient(w)))
return c->mon;
return selmon;
@ -4586,12 +3929,12 @@ main(int argc, char *argv[])
else if (!strcmp("-h", argv[i]) || !strcmp("--help", argv[i]))
die(help());
else if (!strcmp("-fn", argv[i])) /* font set */
#if PANGO_PATCH
#if BAR_PANGO_PATCH
strcpy(font, argv[++i]);
#else
fonts[0] = argv[++i];
#endif // PANGO_PATCH
#if !VTCOLORS_PATCH
#endif // BAR_PANGO_PATCH
#if !BAR_VTCOLORS_PATCH
else if (!strcmp("-nb", argv[i])) /* normal background color */
colors[SchemeNorm][1] = argv[++i];
else if (!strcmp("-nf", argv[i])) /* normal foreground color */
@ -4600,7 +3943,7 @@ main(int argc, char *argv[])
colors[SchemeSel][1] = argv[++i];
else if (!strcmp("-sf", argv[i])) /* selected foreground color */
colors[SchemeSel][0] = argv[++i];
#endif // !VTCOLORS_PATCH
#endif // !BAR_VTCOLORS_PATCH
#if NODMENU_PATCH
else if (!strcmp("-df", argv[i])) /* dmenu font */
dmenucmd[2] = argv[++i];
@ -4640,10 +3983,10 @@ main(int argc, char *argv[])
die("dwm: cannot get xcb connection\n");
#endif // SWALLOW_PATCH
checkotherwm();
#if XRDB_PATCH && !VTCOLORS_PATCH
#if XRDB_PATCH && !BAR_VTCOLORS_PATCH
XrmInitialize();
loadxrdb();
#endif // XRDB_PATCH && !VTCOLORS_PATCH
#endif // XRDB_PATCH && !BAR_VTCOLORS_PATCH
setup();
#ifdef __OpenBSD__

View File

@ -1,67 +0,0 @@
void
hide(Client *c) {
if (!c || HIDDEN(c))
return;
Window w = c->win;
static XWindowAttributes ra, ca;
// more or less taken directly from blackbox's hide() function
XGrabServer(dpy);
XGetWindowAttributes(dpy, root, &ra);
XGetWindowAttributes(dpy, w, &ca);
// prevent UnmapNotify events
XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask);
XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask);
XUnmapWindow(dpy, w);
setclientstate(c, IconicState);
XSelectInput(dpy, root, ra.your_event_mask);
XSelectInput(dpy, w, ca.your_event_mask);
XUngrabServer(dpy);
focus(c->snext);
arrange(c->mon);
}
void
show(Client *c)
{
if (!c || !HIDDEN(c))
return;
XMapWindow(dpy, c->win);
setclientstate(c, NormalState);
arrange(c->mon);
}
void
togglewin(const Arg *arg)
{
Client *c = (Client*)arg->v;
if (c == selmon->sel)
hide(c);
else {
if (HIDDEN(c))
show(c);
focus(c);
restack(selmon);
}
}
void
showhideclient(const Arg *arg)
{
Client *c = (Client*)arg->v;
if (!c)
c = selmon->sel;
if (!c)
return;
if (HIDDEN(c)) {
show(c);
restack(selmon);
} else {
hide(c);
}
}

View File

@ -1,4 +0,0 @@
static void hide(Client *c);
static void show(Client *c);
static void togglewin(const Arg *arg);
static void showhideclient(const Arg *arg);

View File

@ -34,7 +34,7 @@ xinitvisual()
XFree(infos);
if (! visual) {
if (!visual) {
visual = DefaultVisual(dpy, screen);
depth = DefaultDepth(dpy, screen);
cmap = DefaultColormap(dpy, screen);

157
patch/bar_awesomebar.c Normal file
View File

@ -0,0 +1,157 @@
int
width_awesomebar(Bar *bar, BarWidthArg *a)
{
return a->max_width;
}
int
draw_awesomebar(Bar *bar, BarDrawArg *a)
{
int n = 0, scm, remainder = 0, tabw;
unsigned int i;
#if BAR_TITLE_LEFT_PAD && BAR_TITLE_RIGHT_PAD
int x = a->x + lrpad / 2, w = a->w - lrpad;
#elif BAR_TITLE_LEFT_PAD
int x = a->x + lrpad / 2, w = a->w - lrpad / 2;
#elif BAR_TITLE_RIGHT_PAD
int x = a->x, w = a->w - lrpad / 2;
#else
int x = a->x, w = a->w;
#endif // BAR_TITLE_LEFT_PAD | BAR_TITLE_RIGHT_PAD
Client *c;
for (c = bar->mon->clients; c; c = c->next)
if (ISVISIBLE(c))
n++;
if (n > 0) {
remainder = w % n;
tabw = w / n;
for (i = 0, c = bar->mon->clients; c; c = c->next, i++) {
if (!ISVISIBLE(c))
continue;
if (bar->mon->sel == c)
#if BAR_VTCOLORS_PATCH
scm = SchemeTitleSel;
#elif BAR_TITLECOLOR_PATCH
scm = SchemeTitle;
#else
scm = SchemeSel;
#endif // BAR_VTCOLORS_PATCH / BAR_TITLECOLOR_PATCH
else if (HIDDEN(c))
scm = SchemeHid;
else
#if BAR_VTCOLORS_PATCH
scm = SchemeTitleNorm;
#else
scm = SchemeNorm;
#endif // BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[scm]);
tabw += (i < remainder ? 1 : 0);
#if BAR_PANGO_PATCH
drw_text(drw, x, 0, tabw, bh, lrpad / 2, c->name, 0, False);
#else
drw_text(drw, x, 0, tabw, bh, lrpad / 2, c->name, 0);
#endif // BAR_PANGO_PATCH
x += tabw;
}
}
return a->x + a->w;
}
int
click_awesomebar(Bar *bar, Arg *arg, BarClickArg *a)
{
int x = 0, n = 0;
Client *c;
for (c = bar->mon->clients; c; c = c->next)
if (ISVISIBLE(c))
n++;
c = bar->mon->clients;
do {
if (!c || !ISVISIBLE(c))
continue;
else
x += (1.0 / (double)n) * a->rel_w;
} while (c && a->rel_x > x && (c = c->next));
if (c) {
arg->v = c;
return ClkWinTitle;
}
return -1;
}
void
hide(Client *c) {
if (!c || HIDDEN(c))
return;
Window w = c->win;
static XWindowAttributes ra, ca;
// more or less taken directly from blackbox's hide() function
XGrabServer(dpy);
XGetWindowAttributes(dpy, root, &ra);
XGetWindowAttributes(dpy, w, &ca);
// prevent UnmapNotify events
XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask);
XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask);
XUnmapWindow(dpy, w);
setclientstate(c, IconicState);
XSelectInput(dpy, root, ra.your_event_mask);
XSelectInput(dpy, w, ca.your_event_mask);
XUngrabServer(dpy);
focus(c->snext);
arrange(c->mon);
}
void
show(Client *c)
{
if (!c || !HIDDEN(c))
return;
XMapWindow(dpy, c->win);
setclientstate(c, NormalState);
arrange(c->mon);
}
void
togglewin(const Arg *arg)
{
Client *c = (Client*)arg->v;
if (!c)
return;
if (c == selmon->sel)
hide(c);
else {
if (HIDDEN(c))
show(c);
focus(c);
restack(selmon);
}
}
void
showhideclient(const Arg *arg)
{
Client *c = (Client*)arg->v;
if (!c)
c = selmon->sel;
if (!c)
return;
if (HIDDEN(c)) {
show(c);
restack(selmon);
} else {
hide(c);
}
}

8
patch/bar_awesomebar.h Normal file
View File

@ -0,0 +1,8 @@
static int width_awesomebar(Bar *bar, BarWidthArg *a);
static int draw_awesomebar(Bar *bar, BarDrawArg *a);
static int click_awesomebar(Bar *bar, Arg *arg, BarClickArg *a);
static void hide(Client *c);
static void show(Client *c);
static void togglewin(const Arg *arg);
static void showhideclient(const Arg *arg);

89
patch/bar_fancybar.c Normal file
View File

@ -0,0 +1,89 @@
int
width_fancybar(Bar *bar, BarWidthArg *a)
{
return a->max_width;
}
int
draw_fancybar(Bar *bar, BarDrawArg *a)
{
int ftw, mw, ew = 0, n = 0;
unsigned int i;
Client *c;
Monitor *m = bar->mon;
#if BAR_PANGO_PATCH
int boxs = drw->font->h / 9;
int boxw = drw->font->h / 6 + 2;
#else
int boxs = drw->fonts->h / 9;
int boxw = drw->fonts->h / 6 + 2;
#endif // BAR_PANGO_PATCH
#if BAR_TITLE_LEFT_PAD && BAR_TITLE_RIGHT_PAD
int x = a->x + lrpad / 2, w = a->w - lrpad;
#elif BAR_TITLE_LEFT_PAD
int x = a->x + lrpad / 2, w = a->w - lrpad / 2;
#elif BAR_TITLE_RIGHT_PAD
int x = a->x, w = a->w - lrpad / 2;
#else
int x = a->x, w = a->w;
#endif // BAR_TITLE_LEFT_PAD | BAR_TITLE_RIGHT_PAD
for (c = m->clients; c; c = c->next) {
if (ISVISIBLE(c))
n++;
}
if (n > 0) {
ftw = TEXTW(m->sel->name);
mw = (ftw >= w || n == 1) ? 0 : (w - ftw) / (n - 1);
i = 0;
for (c = m->clients; c; c = c->next) {
if (!ISVISIBLE(c) || c == m->sel)
continue;
ftw = TEXTW(c->name);
if (ftw < mw)
ew += (mw - ftw);
else
i++;
}
if (i > 0)
mw += ew / i;
for (c = m->clients; c; c = c->next) {
if (!ISVISIBLE(c))
continue;
ftw = MIN(m->sel == c ? w : mw, TEXTW(c->name));
#if BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[m->sel == c ? SchemeTitleSel : SchemeTitleNorm]);
#elif BAR_TITLECOLOR_PATCH
drw_setscheme(drw, scheme[m->sel == c ? SchemeTitle : SchemeNorm]);
#else
drw_setscheme(drw, scheme[m->sel == c ? SchemeSel : SchemeNorm]);
#endif // BAR_VTCOLORS_PATCH / BAR_TITLECOLOR_PATCH
if (ftw > 0) /* trap special handling of 0 in drw_text */
#if BAR_PANGO_PATCH
drw_text(drw, x, 0, ftw, bh, lrpad / 2, c->name, 0, False);
#else
drw_text(drw, x, 0, ftw, bh, lrpad / 2, c->name, 0);
#endif // BAR_PANGO_PATCH
if (c->isfloating)
drw_rect(drw, x + boxs, boxs, boxw, boxw, c->isfixed, 0);
x += ftw;
w -= ftw;
}
}
return x + w;
}
int
click_fancybar(Bar *bar, Arg *arg, BarClickArg *a)
{
return ClkWinTitle;
}

3
patch/bar_fancybar.h Normal file
View File

@ -0,0 +1,3 @@
static int width_fancybar(Bar *bar, BarWidthArg *a);
static int draw_fancybar(Bar *bar, BarDrawArg *a);
static int click_fancybar(Bar *bar, Arg *arg, BarClickArg *a);

37
patch/bar_holdbar.c Normal file
View File

@ -0,0 +1,37 @@
void
holdbar(const Arg *arg)
{
if (selmon->showbar)
return;
Bar *bar;
selmon->showbar = 2;
updatebarpos(selmon);
for (bar = selmon->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
}
void
keyrelease(XEvent *e)
{
Bar *bar;
if (XEventsQueued(dpy, QueuedAfterReading)) {
XEvent ne;
XPeekEvent(dpy, &ne);
if (ne.type == KeyPress && ne.xkey.time == e->xkey.time &&
ne.xkey.keycode == e->xkey.keycode) {
XNextEvent(dpy, &ne);
return;
}
}
if (e->xkey.keycode == XKeysymToKeycode(dpy, HOLDKEY) && selmon->showbar == 2) {
selmon->showbar = 0;
updatebarpos(selmon);
for (bar = selmon->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
arrange(selmon);
}
#if COMBO_PATCH
combo = 0;
#endif // COMBO_PATCH
}

2
patch/bar_holdbar.h Normal file
View File

@ -0,0 +1,2 @@
static void keyrelease(XEvent *e);
static void holdbar(const Arg *arg);

21
patch/bar_ltsymbol.c Normal file
View File

@ -0,0 +1,21 @@
int
width_ltsymbol(Bar *bar, BarWidthArg *a)
{
return TEXTW(bar->mon->ltsymbol);
}
int
draw_ltsymbol(Bar *bar, BarDrawArg *a)
{
#if BAR_PANGO_PATCH
return drw_text(drw, a->x, 0, a->w, bh, lrpad / 2, bar->mon->ltsymbol, 0, False);
#else
return drw_text(drw, a->x, 0, a->w, bh, lrpad / 2, bar->mon->ltsymbol, 0);
#endif // BAR_PANGO_PATCH
}
int
click_ltsymbol(Bar *bar, Arg *arg, BarClickArg *a)
{
return ClkLtSymbol;
}

3
patch/bar_ltsymbol.h Normal file
View File

@ -0,0 +1,3 @@
static int width_ltsymbol(Bar *bar, BarWidthArg *a);
static int draw_ltsymbol(Bar *bar, BarDrawArg *a);
static int click_ltsymbol(Bar *bar, Arg *arg, BarClickArg *a);

49
patch/bar_status.c Normal file
View File

@ -0,0 +1,49 @@
int
width_status(Bar *bar, BarWidthArg *a)
{
#if BAR_PANGO_PATCH
return TEXTWM(stext);
#else
return TEXTW(stext);
#endif // BAR_PANGO_PATCH
}
#if BAR_EXTRASTATUS_PATCH
int
width_status_es(Bar *bar, BarWidthArg *a)
{
#if BAR_PANGO_PATCH
return TEXTWM(estext) - lrpad;
#else
return TEXTW(estext) - lrpad;
#endif // BAR_PANGO_PATCH
}
#endif // BAR_EXTRASTATUS_PATCH
int
draw_status(Bar *bar, BarDrawArg *a)
{
#if BAR_PANGO_PATCH
return drw_text(drw, a->x, 0, a->w, bh, lrpad / 2, stext, 0, True);
#else
return drw_text(drw, a->x, 0, a->w, bh, lrpad / 2, stext, 0);
#endif // BAR_PANGO_PATCH
}
#if BAR_EXTRASTATUS_PATCH
int
draw_status_es(Bar *bar, BarDrawArg *a)
{
#if BAR_PANGO_PATCH
return drw_text(drw, a->x, 0, a->w, bh, 0, estext, 0, True);
#else
return drw_text(drw, a->x, 0, a->w, bh, 0, estext, 0);
#endif // BAR_PANGO_PATCH
}
#endif // BAR_EXTRASTATUS_PATCH
int
click_status(Bar *bar, Arg *arg, BarClickArg *a)
{
return ClkStatusText;
}

9
patch/bar_status.h Normal file
View File

@ -0,0 +1,9 @@
static int width_status(Bar *bar, BarWidthArg *a);
#if BAR_EXTRASTATUS_PATCH
static int width_status_es(Bar *bar, BarWidthArg *a);
#endif // BAR_EXTRASTATUS_PATCH
static int draw_status(Bar *bar, BarDrawArg *a);
#if BAR_EXTRASTATUS_PATCH
static int draw_status_es(Bar *bar, BarDrawArg *a);
#endif // BAR_EXTRASTATUS_PATCH
static int click_status(Bar *bar, Arg *arg, BarClickArg *a);

View File

@ -1,7 +1,43 @@
int
drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp, int align)
width_status2d(Bar *bar, BarWidthArg *a)
{
int ret, i, w, x, len;
return status2dtextlength(rawstext) + lrpad;
}
#if BAR_EXTRASTATUS_PATCH
int
width_status2d_es(Bar *bar, BarWidthArg *a)
{
return status2dtextlength(rawestext);
}
#endif // BAR_EXTRASTATUS_PATCH
int
draw_status2d(Bar *bar, BarDrawArg *a)
{
return drawstatusbar(a->x, rawstext);
}
#if BAR_EXTRASTATUS_PATCH
int
draw_status2d_es(Bar *bar, BarDrawArg *a)
{
return drawstatusbar(a->x, rawestext);
}
#endif // BAR_EXTRASTATUS_PATCH
#if !BAR_STATUSCMD_PATCH
int
click_status2d(Bar *bar, Arg *arg, BarClickArg *a)
{
return ClkStatusText;
}
#endif // BAR_STATUSCMD_PATCH
int
drawstatusbar(int x, char* stext)
{
int i, w, len;
short isCode = 0;
char *text;
char *p;
@ -10,58 +46,13 @@ drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp, int align)
if (!(text = (char*) malloc(sizeof(char)*len)))
die("malloc");
p = text;
#if STATUSCMD_PATCH
#if BAR_STATUSCMD_PATCH
copyvalidchars(text, stext);
#else
memcpy(text, stext, len);
#endif // STATUSCMD_PATCH
#endif // BAR_STATUSCMD_PATCH
/* compute width of the status text */
w = stp * 2;
i = -1;
while (text[++i]) {
if (text[i] == '^') {
if (!isCode) {
isCode = 1;
text[i] = '\0';
#if PANGO_PATCH
w += TEXTWM(text) - lrpad;
#else
w += TEXTW(text) - lrpad;
#endif // PANGO_PATCH
text[i] = '^';
if (text[++i] == 'f')
w += atoi(text + ++i);
} else {
isCode = 0;
text = text + i + 1;
i = -1;
}
}
}
if (!isCode)
#if PANGO_PATCH
w += TEXTWM(text) - lrpad;
#else
w += TEXTW(text) - lrpad;
#endif // PANGO_PATCH
else
isCode = 0;
text = p;
w += 2; /* 1px padding on both sides */
if (align == 0)
x = 0 + stp; // left
else if (align == 1)
x = m->ww - w - stw + stp; // right
else
x = m->ww / 2 - w / 2; // center
ret = w;
drw_setscheme(drw, scheme[LENGTH(colors)]);
drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
drw_rect(drw, x - stp - 1, 0, w, bh, 1, 1);
x++;
x += lrpad / 2;
/* process status text */
i = -1;
@ -70,13 +61,13 @@ drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp, int align)
isCode = 1;
text[i] = '\0';
#if PANGO_PATCH
#if BAR_PANGO_PATCH
w = TEXTWM(text) - lrpad;
drw_text(drw, x, 0, w, bh, 0, text, 0, True);
#else
w = TEXTW(text) - lrpad;
drw_text(drw, x, 0, w, bh, 0, text, 0);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
x += w;
@ -90,13 +81,13 @@ drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp, int align)
}
memcpy(buf, (char*)text+i+1, 7);
buf[7] = '\0';
#if ALPHA_PATCH && STATUS2D_NO_ALPHA_PATCH
#if BAR_ALPHA_PATCH && BAR_STATUS2D_NO_ALPHA_PATCH
drw_clr_create(drw, &drw->scheme[ColFg], buf, 0xff);
#elif ALPHA_PATCH
#elif BAR_ALPHA_PATCH
drw_clr_create(drw, &drw->scheme[ColFg], buf, alphas[SchemeNorm][ColFg]);
#else
drw_clr_create(drw, &drw->scheme[ColFg], buf);
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
i += 7;
} else if (text[i] == 'b') {
char buf[8];
@ -106,13 +97,13 @@ drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp, int align)
}
memcpy(buf, (char*)text+i+1, 7);
buf[7] = '\0';
#if ALPHA_PATCH && STATUS2D_NO_ALPHA_PATCH
#if BAR_ALPHA_PATCH && BAR_STATUS2D_NO_ALPHA_PATCH
drw_clr_create(drw, &drw->scheme[ColBg], buf, 0xff);
#elif ALPHA_PATCH
#elif BAR_ALPHA_PATCH
drw_clr_create(drw, &drw->scheme[ColBg], buf, alphas[SchemeNorm][ColBg]);
#else
drw_clr_create(drw, &drw->scheme[ColBg], buf);
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
i += 7;
} else if (text[i] == 'd') {
drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
@ -142,21 +133,21 @@ drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp, int align)
isCode = 0;
}
}
if (!isCode) {
#if PANGO_PATCH
#if BAR_PANGO_PATCH
w = TEXTWM(text) - lrpad;
drw_text(drw, x, 0, w, bh, 0, text, 0, True);
#else
w = TEXTW(text) - lrpad;
drw_text(drw, x, 0, w, bh, 0, text, 0);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
x += w;
}
drw_setscheme(drw, scheme[SchemeNorm]);
free(p);
return ret;
drw_setscheme(drw, scheme[SchemeNorm]);
return x;
}
int
@ -165,16 +156,17 @@ status2dtextlength(char* stext)
int i, w, len;
short isCode = 0;
char *text;
char *p;
len = strlen(stext) + 1;
if (!(text = (char*) malloc(sizeof(char)*len)))
die("malloc");
#if STATUSCMD_PATCH
p = text;
#if BAR_STATUSCMD_PATCH
copyvalidchars(text, stext);
#else
memcpy(text, stext, len);
#endif // STATUSCMD_PATCH
#endif // BAR_STATUSCMD_PATCH
/* compute width of the status text */
w = 0;
@ -184,11 +176,11 @@ status2dtextlength(char* stext)
if (!isCode) {
isCode = 1;
text[i] = '\0';
#if PANGO_PATCH
#if BAR_PANGO_PATCH
w += TEXTWM(text) - lrpad;
#else
w += TEXTW(text) - lrpad;
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
text[i] = '^';
if (text[++i] == 'f')
w += atoi(text + ++i);
@ -200,10 +192,11 @@ status2dtextlength(char* stext)
}
}
if (!isCode)
#if PANGO_PATCH
#if BAR_PANGO_PATCH
w += TEXTWM(text) - lrpad;
#else
w += TEXTW(text) - lrpad;
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
free(p);
return w;
}
}

13
patch/bar_status2d.h Normal file
View File

@ -0,0 +1,13 @@
static int width_status2d(Bar *bar, BarWidthArg *a);
#if BAR_EXTRASTATUS_PATCH
static int width_status2d_es(Bar *bar, BarWidthArg *a);
#endif // BAR_EXTRASTATUS_PATCH
static int draw_status2d(Bar *bar, BarDrawArg *a);
#if BAR_EXTRASTATUS_PATCH
static int draw_status2d_es(Bar *bar, BarDrawArg *a);
#endif // BAR_EXTRASTATUS_PATCH
#if !BAR_STATUSCMD_PATCH
static int click_status2d(Bar *bar, Arg *arg, BarClickArg *a);
#endif // BAR_STATUSCMD_PATCH
static int drawstatusbar(int x, char* text);
static int status2dtextlength(char* stext);

2
patch/bar_status2d_eb.h Normal file
View File

@ -0,0 +1,2 @@
static int width_status2d_eb(Bar *bar, BarWidthArg *a);
static int draw_status2d_eb(Bar *bar, BarDrawArg *a);

21
patch/bar_statusbutton.c Normal file
View File

@ -0,0 +1,21 @@
int
width_stbutton(Bar *bar, BarWidthArg *a)
{
return TEXTW(buttonbar);
}
int
draw_stbutton(Bar *bar, BarDrawArg *a)
{
#if BAR_PANGO_PATCH
return drw_text(drw, a->x, 0, a->w, bh, lrpad / 2, buttonbar, 0, False);
#else
return drw_text(drw, a->x, 0, a->w, bh, lrpad / 2, buttonbar, 0);
#endif // BAR_PANGO_PATCH
}
int
click_stbutton(Bar *bar, Arg *arg, BarClickArg *a)
{
return ClkButton;
}

3
patch/bar_statusbutton.h Normal file
View File

@ -0,0 +1,3 @@
static int width_stbutton(Bar *bar, BarWidthArg *a);
static int draw_stbutton(Bar *bar, BarDrawArg *a);
static int click_stbutton(Bar *bar, Arg *arg, BarClickArg *a);

76
patch/bar_statuscmd.c Normal file
View File

@ -0,0 +1,76 @@
#if !BAR_DWMBLOCKS_PATCH
static const char statusexport[] = "export BUTTON=-;";
static int statuscmdn;
static int lastbutton;
#endif // BAR_DWMBLOCKS_PATCH
int
click_statuscmd(Bar *bar, Arg *arg, BarClickArg *a)
{
return click_statuscmd_text(arg, a->rel_x, rawstext);
}
#if BAR_EXTRASTATUS_PATCH
int
click_statuscmd_es(Bar *bar, Arg *arg, BarClickArg *a)
{
return click_statuscmd_text(arg, a->rel_x, rawestext);
}
#endif // BAR_EXTRASTATUS_PATCH
int
click_statuscmd_text(Arg *arg, int rel_x, char *text)
{
int i = -1;
int x = 0;
char ch;
#if BAR_DWMBLOCKS_PATCH
dwmblockssig = -1;
#else
statuscmdn = 0;
#endif // BAR_DWMBLOCKS_PATCH
while (text[++i]) {
if ((unsigned char)text[i] < ' ') {
ch = text[i];
text[i] = '\0';
#if BAR_STATUS2D_PATCH && !BAR_BAR_STATUSCOLORS_PATCH
x += status2dtextlength(text);
#elif BAR_PANGO_PATCH
x += TEXTWM(text) - lrpad;
#else
x += TEXTW(text) - lrpad;
#endif // STATUS2D_PATCH
text[i] = ch;
text += i+1;
i = -1;
#if BAR_DWMBLOCKS_PATCH
if (x >= rel_x && dwmblockssig != -1)
break;
dwmblockssig = ch;
#else
if (x >= rel_x)
break;
if (ch <= LENGTH(statuscmds))
statuscmdn = ch - 1;
#endif // BAR_DWMBLOCKS_PATCH
}
}
#if BAR_DWMBLOCKS_PATCH
if (dwmblockssig == -1)
dwmblockssig = 0;
#endif // BAR_DWMBLOCKS_PATCH
return ClkStatusText;
}
void
copyvalidchars(char *text, char *rawtext)
{
int i = -1, j = 0;
while (rawtext[++i]) {
if ((unsigned char)rawtext[i] >= ' ') {
text[j++] = rawtext[i];
}
}
text[j] = '\0';
}

6
patch/bar_statuscmd.h Normal file
View File

@ -0,0 +1,6 @@
static int click_statuscmd(Bar *bar, Arg *arg, BarClickArg *a);
#if BAR_EXTRASTATUS_PATCH
static int click_statuscmd_es(Bar *bar, Arg *arg, BarClickArg *a);
#endif // BAR_EXTRASTATUS_PATCH
static int click_statuscmd_text(Arg *arg, int rel_x, char *text);
static void copyvalidchars(char *text, char *rawtext);

View File

@ -12,11 +12,11 @@ textw_wosc(char *s)
}
ctmp = *ts;
*ts = '\0';
#if PANGO_PATCH
#if BAR_PANGO_PATCH
sw += drw_font_getwidth(drw, tp, True);
#else
sw += drw_fontset_getwidth(drw, tp);
#endif // PANGO_PATCH
#endif // BAR_PANGO_PATCH
*ts = ctmp;
if (ctmp == '\0')
break;

View File

@ -1,15 +1,98 @@
static Systray *systray = NULL;
static unsigned long systrayorientation = _NET_SYSTEM_TRAY_ORIENTATION_HORZ;
unsigned int
getsystraywidth()
int
width_systray(Bar *bar, BarWidthArg *a)
{
unsigned int w = 0;
Client *i;
if (!systray)
return 1;
if (showsystray)
for (i = systray->icons; i; w += i->w + systrayspacing, i = i->next);
return w ? w + systrayspacing : 0;
return w ? w + lrpad - systrayspacing : 0;
}
int
draw_systray(Bar *bar, BarDrawArg *a)
{
if (!showsystray)
return a->x;
XSetWindowAttributes wa;
Client *i;
unsigned int w;
if (!systray) {
/* init systray */
if (!(systray = (Systray *)calloc(1, sizeof(Systray))))
die("fatal: could not malloc() %u bytes\n", sizeof(Systray));
wa.override_redirect = True;
wa.event_mask = ButtonPressMask|ExposureMask;
wa.border_pixel = 0;
#if BAR_ALPHA_PATCH
wa.background_pixel = 0;
wa.colormap = cmap;
systray->win = XCreateWindow(dpy, root, bar->bx + a->x + lrpad / 2, bar->by, MAX(a->w + 40, 1), bar->bh, 0, depth,
InputOutput, visual,
CWOverrideRedirect|CWBorderPixel|CWBackPixel|CWColormap|CWEventMask, &wa); // CWBackPixmap
#else
wa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
systray->win = XCreateSimpleWindow(dpy, root, bar->bx + a->x + lrpad / 2, bar->by, MIN(a->w, 1), bar->bh, 0, 0, scheme[SchemeNorm][ColBg].pixel);
XChangeWindowAttributes(dpy, systray->win, CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWEventMask, &wa);
#endif // BAR_ALPHA_PATCH
XSelectInput(dpy, systray->win, SubstructureNotifyMask);
XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32,
PropModeReplace, (unsigned char *)&systrayorientation, 1);
#if BAR_ALPHA_PATCH
XChangeProperty(dpy, systray->win, netatom[NetSystemTrayVisual], XA_VISUALID, 32,
PropModeReplace, (unsigned char *)&visual->visualid, 1);
#endif // BAR_ALPHA_PATCH
XChangeProperty(dpy, systray->win, netatom[NetWMWindowType], XA_ATOM, 32,
PropModeReplace, (unsigned char *)&netatom[NetWMWindowTypeDock], 1);
XMapRaised(dpy, systray->win);
XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime);
if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) {
sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0);
XSync(dpy, False);
} else {
fprintf(stderr, "dwm: unable to obtain system tray.\n");
free(systray);
systray = NULL;
return a->x;
}
}
systray->bar = bar;
drw_setscheme(drw, scheme[SchemeNorm]);
for (w = 0, i = systray->icons; i; i = i->next) {
#if BAR_ALPHA_PATCH
wa.background_pixel = 0;
#else
wa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
#endif // BAR_ALPHA_PATCH
XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa);
XMapRaised(dpy, i->win);
i->x = w;
XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h);
w += i->w;
if (i->next)
w += systrayspacing;
if (i->mon != bar->mon)
i->mon = bar->mon;
}
XMoveResizeWindow(dpy, systray->win, bar->bx + a->x + lrpad / 2, (w ? bar->by : -bar->by), MAX(w, 1), bar->bh);
return a->x + a->w;
}
int
click_systray(Bar *bar, Arg *arg, BarClickArg *a)
{
return -1;
}
void
@ -23,6 +106,7 @@ removesystrayicon(Client *i)
if (ii)
*ii = i->next;
free(i);
drawbarwin(systray->bar);
}
void
@ -33,114 +117,10 @@ resizerequest(XEvent *e)
if ((i = wintosystrayicon(ev->window))) {
updatesystrayicongeom(i, ev->width, ev->height);
updatesystray();
drawbarwin(systray->bar);
}
}
Monitor *
systraytomon(Monitor *m)
{
Monitor *t;
int i, n;
if (!systraypinning) {
if (!m)
return selmon;
return m == selmon ? m : NULL;
}
for (n = 1, t = mons; t && t->next; n++, t = t->next);
for (i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next);
if (systraypinningfailfirst && n < systraypinning)
return mons;
return t;
}
void
updatesystray(void)
{
XSetWindowAttributes wa;
XWindowChanges wc;
Client *i;
Monitor *m = systraytomon(NULL);
unsigned int x = m->mx + m->mw;
unsigned int w = 1, xpad = 0, ypad = 0;
#if BARPADDING_PATCH
xpad = sp;
ypad = vp;
#endif // BARPADDING_PATCH
if (!showsystray)
return;
if (!systray) {
/* init systray */
if (!(systray = (Systray *)calloc(1, sizeof(Systray))))
die("fatal: could not malloc() %u bytes\n", sizeof(Systray));
wa.override_redirect = True;
wa.event_mask = ButtonPressMask|ExposureMask;
wa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
wa.border_pixel = 0;
#if ALPHA_PATCH
wa.colormap = cmap;
systray->win = XCreateWindow(dpy, root, x - xpad, m->by + ypad, w, bh, 0, depth,
InputOutput, visual,
CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
#else
systray->win = XCreateSimpleWindow(dpy, root, x - xpad, m->by + ypad, w, bh, 0, 0, scheme[SchemeNorm][ColBg].pixel);
XChangeWindowAttributes(dpy, systray->win, CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWEventMask, &wa);
#endif // ALPHA_PATCH
XSelectInput(dpy, systray->win, SubstructureNotifyMask);
XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32,
PropModeReplace, (unsigned char *)&systrayorientation, 1);
#if ALPHA_PATCH
XChangeProperty(dpy, systray->win, netatom[NetSystemTrayVisual], XA_VISUALID, 32,
PropModeReplace, (unsigned char *)&visual->visualid, 1);
#endif // ALPHA_PATCH
XChangeProperty(dpy, systray->win, netatom[NetWMWindowType], XA_ATOM, 32,
PropModeReplace, (unsigned char *)&netatom[NetWMWindowTypeDock], 1);
XMapRaised(dpy, systray->win);
XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime);
if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) {
sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0);
XSync(dpy, False);
}
else {
fprintf(stderr, "dwm: unable to obtain system tray.\n");
free(systray);
systray = NULL;
return;
}
}
drw_setscheme(drw, scheme[SchemeNorm]);
for (w = 0, i = systray->icons; i; i = i->next) {
/* make sure the background color stays the same */
wa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa);
XMapRaised(dpy, i->win);
w += systrayspacing;
i->x = w;
XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h);
w += i->w;
if (i->mon != m)
i->mon = m;
}
w = w ? w + systrayspacing : 1;
x -= w;
XMoveResizeWindow(dpy, systray->win, x - xpad, m->by + ypad, w, bh);
wc.x = x - xpad;
wc.y = m->by + ypad;
wc.width = w;
wc.height = bh;
wc.stack_mode = Above; wc.sibling = m->barwin;
XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc);
XMapWindow(dpy, systray->win);
XMapSubwindows(dpy, systray->win);
/* redraw background */
XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel);
XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh);
XSync(dpy, False);
}
void
updatesystrayicongeom(Client *i, int w, int h)
{
@ -197,8 +177,9 @@ updatesystrayiconstate(Client *i, XPropertyEvent *ev)
Client *
wintosystrayicon(Window w)
{
if (!systray)
return NULL;
Client *i = NULL;
if (!showsystray || !w)
return i;
for (i = systray->icons; i && i->win != w; i = i->next);

View File

@ -22,15 +22,18 @@ typedef struct Systray Systray;
struct Systray {
Window win;
Client *icons;
Bar *bar;
};
/* bar integration */
static int width_systray(Bar *bar, BarWidthArg *a);
static int draw_systray(Bar *bar, BarDrawArg *a);
static int click_systray(Bar *bar, Arg *arg, BarClickArg *a);
/* function declarations */
static Atom getatomprop(Client *c, Atom prop);
static unsigned int getsystraywidth();
static void removesystrayicon(Client *i);
static void resizerequest(XEvent *e);
static Monitor *systraytomon(Monitor *m);
static void updatesystray(void);
static void updatesystrayicongeom(Client *i, int w, int h);
static void updatesystrayiconstate(Client *i, XPropertyEvent *ev);
static Client *wintosystrayicon(Window w);

166
patch/bar_taggrid.c Normal file
View File

@ -0,0 +1,166 @@
int
width_taggrid(Bar *bar, BarWidthArg *a)
{
return (bh / 2) * (LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0)) + lrpad;
}
int
draw_taggrid(Bar *bar, BarDrawArg *a)
{
unsigned int x, y, h, max_x = 0, columns, occ = 0;
int invert, i,j, k;
Client *c;
for (c = bar->mon->clients; c; c = c->next)
occ |= c->tags;
max_x = x = a->x + lrpad / 2;
h = bh / tagrows;
y = 0;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
/* Firstly we will fill the borders of squares */
#if BAR_VTCOLORS_PATCH
XSetForeground(drw->dpy, drw->gc, scheme[SchemeTagsNorm][ColBg].pixel);
#else
XSetForeground(drw->dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel);
#endif // BAR_VTCOLORS_PATCH
XFillRectangle(dpy, drw->drawable, drw->gc, x, y, h*columns + 1, bh);
/* We will draw LENGTH(tags) squares in tagraws raws. */
for (j = 0, i = 0; j < tagrows; j++) {
x = a->x + lrpad / 2;
for (k = 0; k < columns; k++, i++) {
if (i < LENGTH(tags)) {
invert = bar->mon->tagset[bar->mon->seltags] & 1 << i ? 0 : 1;
/* Select active color for current square */
#if BAR_VTCOLORS_PATCH
XSetForeground(drw->dpy, drw->gc, !invert ? scheme[SchemeTagsSel][ColBg].pixel :
scheme[SchemeTagsNorm][ColFg].pixel);
#else
XSetForeground(drw->dpy, drw->gc, !invert ? scheme[SchemeSel][ColBg].pixel :
scheme[SchemeNorm][ColFg].pixel);
#endif // BAR_VTCOLORS_PATCH
XFillRectangle(dpy, drw->drawable, drw->gc, x+1, y+1, h-1, h-1);
/* Mark square if tag has client */
if (occ & 1 << i) {
#if BAR_VTCOLORS_PATCH
XSetForeground(drw->dpy, drw->gc, !invert ? scheme[SchemeTagsSel][ColFg].pixel :
scheme[SchemeTagsNorm][ColBg].pixel);
#else
XSetForeground(drw->dpy, drw->gc, !invert ? scheme[SchemeSel][ColFg].pixel :
scheme[SchemeNorm][ColBg].pixel);
#endif // BAR_VTCOLORS_PATCH
XFillRectangle(dpy, drw->drawable, drw->gc, x + 1, y + 1,
h / 2, h / 2);
}
} else {
#if BAR_VTCOLORS_PATCH
XSetForeground(drw->dpy, drw->gc, scheme[SchemeTagsNorm][ColBg].pixel);
#else
XSetForeground(drw->dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel);
#endif // BAR_VTCOLORS_PATCH
XFillRectangle(dpy, drw->drawable, drw->gc, x+1, y+1, h-1, h);
}
x += h;
if (x > max_x) {
max_x = x;
}
}
y += h;
}
return max_x;
}
int
click_taggrid(Bar *bar, Arg *arg, BarClickArg *a)
{
unsigned int i, columns;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
i = (a->rel_x - lrpad / 2) / (bh / tagrows) + columns * (a->rel_y / (bh / tagrows));
if (i >= LENGTH(tags)) {
i = LENGTH(tags) - 1;
}
arg->ui = 1 << i;
return ClkTagBar;
}
void
switchtag(const Arg *arg)
{
unsigned int columns;
unsigned int new_tagset = 0;
unsigned int pos, i;
int col, row;
Arg new_arg;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
for (i = 0; i < LENGTH(tags); ++i) {
if (!(selmon->tagset[selmon->seltags] & 1 << i)) {
continue;
}
pos = i;
row = pos / columns;
col = pos % columns;
if (arg->ui & SWITCHTAG_UP) { /* UP */
row --;
if (row < 0) {
row = tagrows - 1;
}
do {
pos = row * columns + col;
row --;
} while (pos >= LENGTH(tags));
}
if (arg->ui & SWITCHTAG_DOWN) { /* DOWN */
row ++;
if (row >= tagrows) {
row = 0;
}
pos = row * columns + col;
if (pos >= LENGTH(tags)) {
row = 0;
}
pos = row * columns + col;
}
if (arg->ui & SWITCHTAG_LEFT) { /* LEFT */
col --;
if (col < 0) {
col = columns - 1;
}
do {
pos = row * columns + col;
col --;
} while (pos >= LENGTH(tags));
}
if (arg->ui & SWITCHTAG_RIGHT) { /* RIGHT */
col ++;
if (col >= columns) {
col = 0;
}
pos = row * columns + col;
if (pos >= LENGTH(tags)) {
col = 0;
pos = row * columns + col;
}
}
new_tagset |= 1 << pos;
}
new_arg.ui = new_tagset;
if (arg->ui & SWITCHTAG_TOGGLETAG) {
toggletag(&new_arg);
}
if (arg->ui & SWITCHTAG_TAG) {
tag(&new_arg);
}
if (arg->ui & SWITCHTAG_VIEW) {
view (&new_arg);
}
if (arg->ui & SWITCHTAG_TOGGLEVIEW) {
toggleview (&new_arg);
}
}

4
patch/bar_taggrid.h Normal file
View File

@ -0,0 +1,4 @@
static int width_taggrid(Bar *bar, BarWidthArg *a);
static int draw_taggrid(Bar *bar, BarDrawArg *a);
static int click_taggrid(Bar *bar, Arg *arg, BarClickArg *a);
static void switchtag(const Arg *arg);

125
patch/bar_tags.c Normal file
View File

@ -0,0 +1,125 @@
int
width_tags(Bar *bar, BarWidthArg *a)
{
int w, i;
for (w = 0, i = 0; i < LENGTH(tags); i++) {
#if BAR_ALTERNATIVE_TAGS_PATCH
w += selmon->alttag ? TEXTW(tagsalt[i]) : TEXTW(tags[i]);
#else
w += TEXTW(tags[i]);
#endif // BAR_ALTERNATIVE_TAGS_PATCH
}
return w + lrpad;
}
int
draw_tags(Bar *bar, BarDrawArg *a)
{
int invert;
int w, x = a->x + lrpad / 2;
#if BAR_ALTERNATIVE_TAGS_PATCH
int wdelta;
#endif // BAR_ALTERNATIVE_TAGS_PATCH
#if !BAR_HIDEVACANTTAGS_PATCH
#if !BAR_ACTIVETAGINDICATORBAR_PATCH && !BAR_ACTIVETAGINDICATORBAR_ALT1_PATCH
#if BAR_PANGO_PATCH
int boxs = drw->font->h / 9;
#else
int boxs = drw->fonts->h / 9;
#endif // BAR_PANGO_PATCH
#endif // BAR_ACTIVETAGINDICATORBAR_PATCH | BAR_ACTIVETAGINDICATORBAR_ALT1_PATCH
#if BAR_PANGO_PATCH
int boxw = drw->font->h / 6 + 2;
#else
int boxw = drw->fonts->h / 6 + 2;
#endif // BAR_PANGO_PATCH
#endif // BAR_HIDEVACANTTAGS_PATCH
unsigned int i, occ = 0, urg = 0;
Client *c;
Monitor *m = bar->mon;
for (c = m->clients; c; c = c->next) {
#if BAR_HIDEVACANTTAGS_PATCH
occ |= c->tags == 255 ? 0 : c->tags;
#else
occ |= c->tags;
#endif // BAR_HIDEVACANTTAGS_PATCH
if (c->isurgent)
urg |= c->tags;
}
for (i = 0; i < LENGTH(tags); i++) {
#if URGENTBORDER_PATCH
invert = 0;
#else
invert = urg & 1 << i;
#endif // URGENTBORDER_PATCH
#if BAR_HIDEVACANTTAGS_PATCH
/* do not draw vacant tags */
if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
continue;
#endif // BAR_HIDEVACANTTAGS_PATCH
w = TEXTW(tags[i]);
#if BAR_ALTERNATIVE_TAGS_PATCH
wdelta = selmon->alttag ? abs(TEXTW(tags[i]) - TEXTW(tagsalt[i])) / 2 : 0;
#endif // BAR_ALTERNATIVE_TAGS_PATCH
#if URGENTBORDER_PATCH
if (m->tagset[m->seltags] & 1 << i)
#if BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTagsSel]);
#else
drw_setscheme(drw, scheme[SchemeSel]);
#endif // BAR_VTCOLORS_PATCH
else
#if BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[urg & 1 << i ? SchemeUrg : SchemeTagsNorm]);
#else
drw_setscheme(drw, scheme[urg & 1 << i ? SchemeUrg : SchemeNorm]);
#endif // BAR_VTCOLORS_PATCH
#elif BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeTagsSel : SchemeTagsNorm]);
#else // URGENTBORDER_PATCH
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
#endif // URGENTBORDER_PATCH
#if BAR_ALTERNATIVE_TAGS_PATCH && BAR_PANGO_PATCH
drw_text(drw, x, 0, w, bh, wdelta + lrpad / 2, (selmon->alttag ? tagsalt[i] : tags[i]), invert, False);
#elif BAR_ALTERNATIVE_TAGS_PATCH
drw_text(drw, x, 0, w, bh, wdelta + lrpad / 2, (selmon->alttag ? tagsalt[i] : tags[i]), invert);
#elif BAR_PANGO_PATCH
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], invert, False);
#else
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], invert);
#endif // BAR_ALTERNATIVE_TAGS_PATCH
#if !BAR_HIDEVACANTTAGS_PATCH
if (occ & 1 << i)
#if BAR_ACTIVETAGINDICATORBAR_PATCH
drw_rect(drw, x + boxw, 0, w - ( 2 * boxw + 1), boxw,
#elif BAR_ACTIVETAGINDICATORBAR_ALT1_PATCH
drw_rect(drw, x + boxw, bh - boxw/2, w - ( 2 * boxw + 1), boxw/2,
#else
drw_rect(drw, x + boxs, boxs, boxw, boxw,
#endif // BAR_ACTIVETAGINDICATORBAR_PATCH
m == selmon && selmon->sel && selmon->sel->tags & 1 << i, invert);
#endif // BAR_HIDEVACANTTAGS_PATCH
x += w;
}
return x;
}
int
click_tags(Bar *bar, Arg *arg, BarClickArg *a)
{
int i = 0, x = lrpad / 2;
do
#if BAR_ALTERNATIVE_TAGS_PATCH
x += selmon->alttag ? TEXTW(tagsalt[i]) : TEXTW(tags[i]);
#else
x += TEXTW(tags[i]);
#endif
while (a->rel_x >= x && ++i < LENGTH(tags));
if (i < LENGTH(tags)) {
arg->ui = 1 << i;
}
return ClkTagBar;
}

3
patch/bar_tags.h Normal file
View File

@ -0,0 +1,3 @@
static int width_tags(Bar *bar, BarWidthArg *a);
static int draw_tags(Bar *bar, BarDrawArg *a);
static int click_tags(Bar *bar, Arg *arg, BarClickArg *a);

88
patch/bar_wintitle.c Normal file
View File

@ -0,0 +1,88 @@
int
width_wintitle(Bar *bar, BarWidthArg *a)
{
return a->max_width;
}
int
draw_wintitle(Bar *bar, BarDrawArg *a)
{
#if !BAR_ACTIVETAGINDICATORBAR_PATCH && !BAR_ACTIVETAGINDICATORBAR_ALT1_PATCH
#if BAR_PANGO_PATCH
int boxs = drw->font->h / 9;
#else
int boxs = drw->fonts->h / 9;
#endif // BAR_PANGO_PATCH
#endif // BAR_ACTIVETAGINDICATORBAR_PATCH | BAR_ACTIVETAGINDICATORBAR_ALT1_PATCH
#if BAR_PANGO_PATCH
int boxw = drw->font->h / 6 + 2;
#else
int boxw = drw->fonts->h / 6 + 2;
#endif // BAR_PANGO_PATCH
#if BAR_TITLE_LEFT_PAD && BAR_TITLE_RIGHT_PAD
int x = a->x + lrpad / 2, w = a->w - lrpad;
#elif BAR_TITLE_LEFT_PAD
int x = a->x + lrpad / 2, w = a->w - lrpad / 2;
#elif BAR_TITLE_RIGHT_PAD
int x = a->x, w = a->w - lrpad / 2;
#else
int x = a->x, w = a->w;
#endif // BAR_TITLE_LEFT_PAD | BAR_TITLE_RIGHT_PAD
Monitor *m = bar->mon;
if (m->sel) {
#if BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[m == selmon ? SchemeTitleSel : SchemeTitleNorm]);
#elif BAR_TITLECOLOR_PATCH
drw_setscheme(drw, scheme[m == selmon ? SchemeTitle : SchemeNorm]);
#else
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
#endif // BAR_VTCOLORS_PATCH / BAR_TITLECOLOR_PATCH
#if BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
XSetErrorHandler(xerrordummy);
#endif // BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
#if BAR_CENTEREDWINDOWNAME_PATCH
int mid = (m->ww - TEXTW(m->sel->name)) / 2 - x;
#if BAR_PANGO_PATCH
drw_text(drw, x, 0, w, bh, mid, m->sel->name, 0, False);
#else
drw_text(drw, x, 0, w, bh, mid, m->sel->name, 0);
#endif // BAR_PANGO_PATCH
#else
#if BAR_PANGO_PATCH
drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0, False);
#else
drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
#endif // BAR_PANGO_PATCH
#endif // BAR_CENTEREDWINDOWNAME_PATCH
#if BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
XSync(dpy, False);
XSetErrorHandler(xerror);
#endif // BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
if (m->sel->isfloating)
#if BAR_ACTIVETAGINDICATORBAR_PATCH
drw_rect(drw, x + boxw, 0, w - ( 2 * boxw + 1), boxw, m->sel->isfixed, 0);
#elif BAR_ACTIVETAGINDICATORBAR_ALT1_PATCH
drw_rect(drw, x + boxw, bh - boxw/2, w - ( 2 * boxw + 1), boxw/2, 0);
#else
drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
#endif // BAR_ACTIVETAGINDICATORBAR_PATCH
} else {
#if BAR_VTCOLORS_PATCH
drw_setscheme(drw, scheme[SchemeTitleNorm]);
#else
drw_setscheme(drw, scheme[SchemeNorm]);
#endif // BAR_VTCOLORS_PATCH
drw_rect(drw, x, 0, w, bh, 1, 1);
}
return x + w;
}
int
click_wintitle(Bar *bar, Arg *arg, BarClickArg *a)
{
return ClkWinTitle;
}

3
patch/bar_wintitle.h Normal file
View File

@ -0,0 +1,3 @@
static int width_wintitle(Bar *bar, BarWidthArg *a);
static int draw_wintitle(Bar *bar, BarDrawArg *a);
static int click_wintitle(Bar *bar, Arg *arg, BarClickArg *a);

View File

@ -1,12 +1,12 @@
static int combo = 0;
#if !HOLDBAR_PATCH
#if !BAR_HOLDBAR_PATCH
void
keyrelease(XEvent *e)
{
combo = 0;
}
#endif // !HOLDBAR_PATCH
#endif // !BAR_HOLDBAR_PATCH
void
combotag(const Arg *arg)

View File

@ -1,5 +1,5 @@
#if !HOLDBAR_PATCH
#if !BAR_HOLDBAR_PATCH
static void keyrelease(XEvent *e);
#endif // !HOLDBAR_PATCH
#endif // !BAR_HOLDBAR_PATCH
static void combotag(const Arg *arg);
static void comboview(const Arg *arg);

View File

@ -1,99 +0,0 @@
void
holdbar(const Arg *arg)
{
if (selmon->showbar)
return;
selmon->showbar = 2;
updateholdbarpos(selmon);
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh);
#else
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
#endif // BARPADDING_PATCH
#if EXTRABAR_PATCH
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx + sp, selmon->eby - vp, selmon->ww - 2 * sp, bh);
#else
XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
#endif // BARPADDING_PATCH
#endif // EXTRABAR_PATCH
}
void
keyrelease(XEvent *e)
{
if (XEventsQueued(dpy, QueuedAfterReading)) {
XEvent ne;
XPeekEvent(dpy, &ne);
if (ne.type == KeyPress && ne.xkey.time == e->xkey.time &&
ne.xkey.keycode == e->xkey.keycode) {
XNextEvent(dpy, &ne);
return;
}
}
if (e->xkey.keycode == XKeysymToKeycode(dpy, HOLDKEY) && selmon->showbar == 2) {
selmon->showbar = 0;
updateholdbarpos(selmon);
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh);
#else
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
#endif // BARPADDING_PATCH
#if EXTRABAR_PATCH
#if BARPADDING_PATCH
XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx + sp, selmon->eby - vp, selmon->ww - 2 * sp, bh);
#else
XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
#endif // BARPADDING_PATCH
#endif // EXTRABAR_PATCH
arrange(selmon);
}
#if COMBO_PATCH
combo = 0;
#endif // COMBO_PATCH
}
void
updateholdbarpos(Monitor *m)
{
m->wy = m->my;
m->wh = m->mh;
#if EXTRABAR_PATCH
#if BARPADDING_PATCH
m->wh = m->wh - vertpad * m->showbar * 2 - bh * m->showbar * 2;
m->wy = m->showbar ? m->wy + bh + vertpad: m->wy;
if (m->showbar) {
m->by = m->topbar ? m->wy - bh - vertpad: m->wy + m->wh + vertpad;
m->eby = m->topbar ? m->wy + m->wh + vertpad: m->wy - bh - vertpad;
} else {
m->by = -bh - vertpad;
m->eby = -bh - vertpad;
}
#else
m->wh = m->wh - bh * m->showbar * 2;
m->wy = m->showbar ? m->wy + bh : m->wy;
if (m->showbar) {
m->by = m->topbar ? m->wy - bh : m->wy + m->wh;
m->eby = m->topbar ? m->wy + m->wh : m->wy - bh;
} else {
m->by = -bh;
m->eby = -bh;
}
#endif // BARPADDING_PATCH
#elif BARPADDING_PATCH
if (m->showbar) {
m->wh = m->wh - vertpad - bh;
m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad;
m->wy = m->topbar ? m->wy + bh + vp : m->wy;
} else
m->by = -bh - vp;
#else
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;
#endif // EXTRABAR_PATCH
}

View File

@ -1,3 +0,0 @@
static void keyrelease(XEvent *e);
static void holdbar(const Arg *arg);
static void updateholdbarpos(Monitor *m);

View File

@ -1,45 +1,86 @@
/* Patches */
#if ALPHA_PATCH
#include "alpha.c"
/* Bar functionality */
#if BAR_ALPHA_PATCH
#include "bar_alpha.c"
#endif
#if ALTERNATIVE_TAGS_PATCH
#include "alternativetags.c"
#if BAR_ALTERNATIVE_TAGS_PATCH
#include "bar_alternativetags.c"
#endif
#if BAR_DWMBLOCKS_PATCH && BAR_STATUSCMD_PATCH
#include "bar_dwmblocks.c"
#endif
#if BAR_EWMHTAGS_PATCH
#include "bar_ewmhtags.c"
#endif
#if COMBO_PATCH
#include "combo.c"
#endif
#if BAR_HOLDBAR_PATCH
#include "bar_holdbar.c"
#endif
#if BAR_LTSYMBOL_PATCH
#include "bar_ltsymbol.c"
#endif
#if BAR_STATUS_PATCH
#include "bar_status.c"
#endif
#if BAR_STATUS2D_PATCH
#include "bar_status2d.c"
#endif
#if BAR_STATUSBUTTON_PATCH
#include "bar_statusbutton.c"
#endif
#if BAR_STATUSCMD_PATCH
#include "bar_statuscmd.c"
#endif
#if BAR_STATUSCOLORS_PATCH
#include "bar_statuscolors.c"
#endif
#if BAR_TAGS_PATCH
#include "bar_tags.c"
#endif
#if BAR_TAGGRID_PATCH
#include "bar_taggrid.c"
#endif
#if BAR_WINTITLE_PATCH
#include "bar_wintitle.c"
#endif
#if BAR_FANCYBAR_PATCH
#include "bar_fancybar.c"
#endif
#if BAR_AWESOMEBAR_PATCH
#include "bar_awesomebar.c"
#endif
#if BAR_SYSTRAY_PATCH
#include "bar_systray.c"
#endif
#if BAR_VTCOLORS_PATCH
#include "bar_vtcolors.c"
#endif
/* Other patches */
#if ATTACHABOVE_PATCH || ATTACHASIDE_PATCH || ATTACHBELOW_PATCH || ATTACHBOTTOM_PATCH
#include "attachx.c"
#endif
#if AUTOSTART_PATCH
#include "autostart.c"
#endif
#if AWESOMEBAR_PATCH
#include "awesomebar.c"
#endif
#if CFACTS_PATCH
#include "cfacts.c"
#endif
#if CMDCUSTOMIZE_PATCH
#include "cmdcustomize.c"
#endif
#if COMBO_PATCH
#include "combo.c"
#endif
#if CYCLELAYOUTS_PATCH
#include "cyclelayouts.c"
#endif
#if DRAGCFACT_PATCH && CFACTS_PATCH
#include "dragcfact.c"
#endif
#if DWMBLOCKS_PATCH && STATUSCMD_PATCH
#include "dwmblocks.c"
#endif
#if DWMC_PATCH
#include "dwmc.c"
#elif FSIGNAL_PATCH
#include "fsignal.c"
#endif
#if EWMHTAGS_PATCH
#include "ewmhtags.c"
#endif
#if EXRESIZE_PATCH
#include "exresize.c"
#endif
@ -58,9 +99,6 @@
#if FULLSCREEN_PATCH
#include "fullscreen.c"
#endif
#if HOLDBAR_PATCH
#include "holdbar.c"
#endif
#if INPLACEROTATE_PATCH
#include "inplacerotate.c"
#endif
@ -131,21 +169,9 @@
#if STACKER_PATCH
#include "stacker.c"
#endif
#if STATUS2D_PATCH && !STATUSCOLORS_PATCH
#include "status2d.c"
#endif
#if STATUSCOLORS_PATCH
#include "statuscolors.c"
#endif
#if STATUSCMD_PATCH
#include "statuscmd.c"
#endif
#if STICKY_PATCH
#include "sticky.c"
#endif
#if SYSTRAY_PATCH
#include "systray.c"
#endif
#if SWALLOW_PATCH
#include "swallow.c"
#endif
@ -164,9 +190,6 @@
#if TAGALLMON_PATCH
#include "tagallmon.c"
#endif
#if TAGGRID_PATCH
#include "taggrid.c"
#endif
#if TAGOTHERMONITOR_PATCH
#include "tagothermonitor.c"
#endif
@ -188,9 +211,6 @@
#if VANITYGAPS_PATCH
#include "vanitygaps.c"
#endif
#if VTCOLORS_PATCH
#include "vtcolors.c"
#endif
#if WARP_PATCH
#include "warp.c"
#endif
@ -200,7 +220,7 @@
#if ZOOMSWAP_PATCH
#include "zoomswap.c"
#endif
#if XRDB_PATCH && !VTCOLORS_PATCH
#if XRDB_PATCH && !BAR_VTCOLORS_PATCH
#include "xrdb.c"
#endif
#if DRAGMFACT_PATCH
@ -211,44 +231,44 @@
#include "layout_facts.c"
#endif
#if BSTACK_LAYOUT
#include "bstack.c"
#include "layout_bstack.c"
#endif
#if BSTACKHORIZ_LAYOUT
#include "bstackhoriz.c"
#include "layout_bstackhoriz.c"
#endif
#if CENTEREDMASTER_LAYOUT
#include "centeredmaster.c"
#include "layout_centeredmaster.c"
#endif
#if CENTEREDFLOATINGMASTER_LAYOUT
#include "centeredfloatingmaster.c"
#include "layout_centeredfloatingmaster.c"
#endif
#if COLUMNS_LAYOUT
#include "columns.c"
#include "layout_columns.c"
#endif
#if DECK_LAYOUT
#include "deck.c"
#include "layout_deck.c"
#endif
#if FIBONACCI_DWINDLE_LAYOUT || FIBONACCI_SPIRAL_LAYOUT
#include "fibonacci.c"
#include "layout_fibonacci.c"
#endif
#if FLEXTILE_DELUXE_LAYOUT
#include "flextile-deluxe.c"
#include "layout_flextile-deluxe.c"
#endif
#if GAPPLESSGRID_LAYOUT
#include "gapplessgrid.c"
#include "layout_gapplessgrid.c"
#endif
#if GRIDMODE_LAYOUT
#include "grid.c"
#include "layout_grid.c"
#endif
#if HORIZGRID_LAYOUT
#include "horizgrid.c"
#include "layout_horizgrid.c"
#endif
#if MONOCLE_LAYOUT
#include "monocle.c"
#include "layout_monocle.c"
#endif
#if NROWGRID_LAYOUT
#include "nrowgrid.c"
#include "layout_nrowgrid.c"
#endif
#if TILE_LAYOUT
#include "tile.c"
#endif
#include "layout_tile.c"
#endif

View File

@ -1,28 +1,72 @@
/* Patches */
#if ALPHA_PATCH
#include "alpha.h"
/* Bar functionality */
#if BAR_ALPHA_PATCH
#include "bar_alpha.h"
#endif
#if ALTERNATIVE_TAGS_PATCH
#include "alternativetags.h"
#if BAR_ALTERNATIVE_TAGS_PATCH
#include "bar_alternativetags.h"
#endif
#if BAR_DWMBLOCKS_PATCH && BAR_STATUSCMD_PATCH
#include "bar_dwmblocks.h"
#endif
#if BAR_EWMHTAGS_PATCH
#include "bar_ewmhtags.h"
#endif
#if COMBO_PATCH
#include "combo.h"
#endif
#if BAR_HOLDBAR_PATCH
#include "bar_holdbar.h"
#endif
#if BAR_LTSYMBOL_PATCH
#include "bar_ltsymbol.h"
#endif
#if BAR_STATUS_PATCH
#include "bar_status.h"
#endif
#if BAR_STATUS2D_PATCH
#include "bar_status2d.h"
#endif
#if BAR_STATUSBUTTON_PATCH
#include "bar_statusbutton.h"
#endif
#if BAR_STATUSCMD_PATCH
#include "bar_statuscmd.h"
#endif
#if BAR_TAGS_PATCH
#include "bar_tags.h"
#endif
#if BAR_TAGGRID_PATCH
#include "bar_taggrid.h"
#endif
#if BAR_WINTITLE_PATCH
#include "bar_wintitle.h"
#endif
#if BAR_FANCYBAR_PATCH
#include "bar_fancybar.h"
#endif
#if BAR_AWESOMEBAR_PATCH
#include "bar_awesomebar.h"
#endif
#if BAR_SYSTRAY_PATCH
#include "bar_systray.h"
#endif
#if BAR_VTCOLORS_PATCH
#include "bar_vtcolors.h"
#endif
/* Other patches */
#if ATTACHABOVE_PATCH || ATTACHASIDE_PATCH || ATTACHBELOW_PATCH || ATTACHBOTTOM_PATCH
#include "attachx.h"
#endif
#if AUTOSTART_PATCH
#include "autostart.h"
#endif
#if AWESOMEBAR_PATCH
#include "awesomebar.h"
#endif
#if CFACTS_PATCH
#include "cfacts.h"
#endif
#if CMDCUSTOMIZE_PATCH
#include "cmdcustomize.h"
#endif
#if COMBO_PATCH
#include "combo.h"
#endif
#if CYCLELAYOUTS_PATCH
#include "cyclelayouts.h"
#endif
@ -32,17 +76,11 @@
#if DRAGMFACT_PATCH
#include "dragmfact.h"
#endif
#if DWMBLOCKS_PATCH && STATUSCMD_PATCH
#include "dwmblocks.h"
#endif
#if DWMC_PATCH
#include "dwmc.h"
#elif FSIGNAL_PATCH
#include "fsignal.h"
#endif
#if EWMHTAGS_PATCH
#include "ewmhtags.h"
#endif
#if EXRESIZE_PATCH
#include "exresize.h"
#endif
@ -61,9 +99,6 @@
#if FULLSCREEN_PATCH
#include "fullscreen.h"
#endif
#if HOLDBAR_PATCH
#include "holdbar.h"
#endif
#if INPLACEROTATE_PATCH
#include "inplacerotate.h"
#endif
@ -134,18 +169,9 @@
#if STACKER_PATCH
#include "stacker.h"
#endif
#if STATUS2D_PATCH && !STATUSCOLORS_PATCH
#include "status2d.h"
#endif
#if STATUSCMD_PATCH
#include "statuscmd.h"
#endif
#if STICKY_PATCH
#include "sticky.h"
#endif
#if SYSTRAY_PATCH
#include "systray.h"
#endif
#if SWALLOW_PATCH
#include "swallow.h"
#endif
@ -164,9 +190,6 @@
#if TAGALLMON_PATCH
#include "tagallmon.h"
#endif
#if TAGGRID_PATCH
#include "taggrid.h"
#endif
#if TAGOTHERMONITOR_PATCH
#include "tagothermonitor.h"
#endif
@ -188,9 +211,6 @@
#if VANITYGAPS_PATCH
#include "vanitygaps.h"
#endif
#if VTCOLORS_PATCH
#include "vtcolors.h"
#endif
#if WARP_PATCH
#include "warp.h"
#endif
@ -200,49 +220,49 @@
#if ZOOMSWAP_PATCH
#include "zoomswap.h"
#endif
#if XRDB_PATCH && !VTCOLORS_PATCH
#if XRDB_PATCH && !BAR_VTCOLORS_PATCH
#include "xrdb.h"
#endif
/* Layouts */
#if BSTACK_LAYOUT
#include "bstack.h"
#include "layout_bstack.h"
#endif
#if BSTACKHORIZ_LAYOUT
#include "bstackhoriz.h"
#include "layout_bstackhoriz.h"
#endif
#if CENTEREDMASTER_LAYOUT
#include "centeredmaster.h"
#include "layout_centeredmaster.h"
#endif
#if CENTEREDFLOATINGMASTER_LAYOUT
#include "centeredfloatingmaster.h"
#include "layout_centeredfloatingmaster.h"
#endif
#if COLUMNS_LAYOUT
#include "columns.h"
#include "layout_columns.h"
#endif
#if DECK_LAYOUT
#include "deck.h"
#include "layout_deck.h"
#endif
#if FIBONACCI_DWINDLE_LAYOUT || FIBONACCI_SPIRAL_LAYOUT
#include "fibonacci.h"
#include "layout_fibonacci.h"
#endif
#if FLEXTILE_DELUXE_LAYOUT
#include "flextile-deluxe.h"
#include "layout_flextile-deluxe.h"
#endif
#if GAPPLESSGRID_LAYOUT
#include "gapplessgrid.h"
#include "layout_gapplessgrid.h"
#endif
#if GRIDMODE_LAYOUT
#include "grid.h"
#include "layout_grid.h"
#endif
#if HORIZGRID_LAYOUT
#include "horizgrid.h"
#include "layout_horizgrid.h"
#endif
#if MONOCLE_LAYOUT
#include "monocle.h"
#include "layout_monocle.h"
#endif
#if NROWGRID_LAYOUT
#include "nrowgrid.h"
#include "layout_nrowgrid.h"
#endif
#if TILE_LAYOUT
#include "tile.h"
#endif
#include "layout_tile.h"
#endif

View File

@ -8,11 +8,11 @@ killunsel(const Arg *arg)
for (i = selmon->clients; i; i = i->next) {
if (ISVISIBLE(i) && i != selmon->sel) {
#if SYSTRAY_PATCH
#if BAR_SYSTRAY_PATCH
if (!sendevent(i->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0, 0, 0))
#else
if (!sendevent(i, wmatom[WMDelete]))
#endif // SYSTRAY_PATCH
#endif // BAR_SYSTRAY_PATCH
{
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);

View File

@ -2,13 +2,13 @@ void
movestack(const Arg *arg)
{
Client *c = NULL, *p = NULL, *pc = NULL, *i;
if (arg->i > 0) {
if (!selmon->sel)
return;
/* find the client after selmon->sel */
for (c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
if (!c)
for (c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
}
else {
/* find the client before selmon->sel */
@ -20,6 +20,7 @@ movestack(const Arg *arg)
if (ISVISIBLE(i) && !i->isfloating)
c = i;
}
/* find the client before selmon->sel and c */
for (i = selmon->clients; i && (!p || !pc); i = i->next) {
if (i->next == selmon->sel)

View File

@ -1,2 +0,0 @@
static int drawstatusbar(Monitor *m, int bh, char* text, int stw, int stp, int align);
static int status2dtextlength(char* stext);

View File

@ -1,18 +0,0 @@
#if !DWMBLOCKS_PATCH
static const char statusexport[] = "export BUTTON=-;";
static int statuscmdn;
static int lastbutton;
#endif // DWMBLOCKS_PATCH
void
copyvalidchars(char *text, char *rawtext)
{
int i = -1, j = 0;
while (rawtext[++i]) {
if ((unsigned char)rawtext[i] >= ' ') {
text[j++] = rawtext[i];
}
}
text[j] = '\0';
}

View File

@ -1 +0,0 @@
static void copyvalidchars(char *text, char *rawtext);

View File

@ -1,118 +0,0 @@
void drawtaggrid(Monitor *m, int *x_pos, unsigned int occ)
{
unsigned int x, y, h, max_x, columns;
int invert, i,j, k;
h = bh / tagrows;
x = max_x = *x_pos;
y = 0;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
/* Firstly we will fill the borders of squares */
XSetForeground(drw->dpy, drw->gc, scheme[SchemeNorm][ColBorder].pixel);
XFillRectangle(dpy, drw->drawable, drw->gc, x, y, h*columns + 1, bh);
/* We will draw LENGTH(tags) squares in tagraws raws. */
for (j = 0, i= 0; j < tagrows; j++) {
x = *x_pos;
for (k = 0; k < columns && i < LENGTH(tags); k++, i++) {
invert = m->tagset[m->seltags] & 1 << i ? 0 : 1;
/* Select active color for current square */
XSetForeground(drw->dpy, drw->gc, !invert ? scheme[SchemeSel][ColBg].pixel :
scheme[SchemeNorm][ColFg].pixel);
XFillRectangle(dpy, drw->drawable, drw->gc, x+1, y+1, h-1, h-1);
/* Mark square if tag has client */
if (occ & 1 << i) {
XSetForeground(drw->dpy, drw->gc, !invert ? scheme[SchemeSel][ColFg].pixel :
scheme[SchemeNorm][ColBg].pixel);
XFillRectangle(dpy, drw->drawable, drw->gc, x + 1, y + 1,
h / 2, h / 2);
}
x += h;
if (x > max_x) {
max_x = x;
}
}
y += h;
}
*x_pos = max_x + 1;
}
void switchtag(const Arg *arg)
{
unsigned int columns;
unsigned int new_tagset = 0;
unsigned int pos, i;
int col, row;
Arg new_arg;
columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0);
for (i = 0; i < LENGTH(tags); ++i) {
if (!(selmon->tagset[selmon->seltags] & 1 << i)) {
continue;
}
pos = i;
row = pos / columns;
col = pos % columns;
if (arg->ui & SWITCHTAG_UP) { /* UP */
row --;
if (row < 0) {
row = tagrows - 1;
}
do {
pos = row * columns + col;
row --;
} while (pos >= LENGTH(tags));
}
if (arg->ui & SWITCHTAG_DOWN) { /* DOWN */
row ++;
if (row >= tagrows) {
row = 0;
}
pos = row * columns + col;
if (pos >= LENGTH(tags)) {
row = 0;
}
pos = row * columns + col;
}
if (arg->ui & SWITCHTAG_LEFT) { /* LEFT */
col --;
if (col < 0) {
col = columns - 1;
}
do {
pos = row * columns + col;
col --;
} while (pos >= LENGTH(tags));
}
if (arg->ui & SWITCHTAG_RIGHT) { /* RIGHT */
col ++;
if (col >= columns) {
col = 0;
}
pos = row * columns + col;
if (pos >= LENGTH(tags)) {
col = 0;
pos = row * columns + col;
}
}
new_tagset |= 1 << pos;
}
new_arg.ui = new_tagset;
if (arg->ui & SWITCHTAG_TOGGLETAG) {
toggletag(&new_arg);
}
if (arg->ui & SWITCHTAG_TAG) {
tag(&new_arg);
}
if (arg->ui & SWITCHTAG_VIEW) {
view (&new_arg);
}
if (arg->ui & SWITCHTAG_TOGGLEVIEW) {
toggleview (&new_arg);
}
}

View File

@ -1,2 +0,0 @@
static void drawtaggrid(Monitor *m, int *x_pos, unsigned int occ);
static void switchtag(const Arg *arg);

View File

@ -30,16 +30,16 @@ loadxrdb()
XRDB_LOAD_COLOR("dwm.selfloatcolor", selfloatcolor);
#endif // FLOAT_BORDER_COLOR_PATCH
#if STATUSCOLORS_PATCH
#if BAR_STATUSCOLORS_PATCH
XRDB_LOAD_COLOR("dwm.warnfgcolor", warnfgcolor);
XRDB_LOAD_COLOR("dwm.warnbgcolor", warnbgcolor);
XRDB_LOAD_COLOR("dwm.warnbordercolor", warnbordercolor);
#if FLOAT_BORDER_COLOR_PATCH
XRDB_LOAD_COLOR("dwm.warnfloatcolor", warnfloatcolor);
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // STATUSCOLORS_PATCH
#endif // BAR_STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || STATUSCOLORS_PATCH
#if URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH
XRDB_LOAD_COLOR("dwm.urgfgcolor", urgfgcolor);
XRDB_LOAD_COLOR("dwm.urgbgcolor", urgbgcolor);
XRDB_LOAD_COLOR("dwm.urgbordercolor", urgbordercolor);
@ -57,14 +57,14 @@ loadxrdb()
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // AWESOMEBAR_PATCH
#if TITLECOLOR_PATCH
#if BAR_TITLECOLOR_PATCH
XRDB_LOAD_COLOR("dwm.titlefgcolor", titlefgcolor);
XRDB_LOAD_COLOR("dwm.titlebgcolor", titlebgcolor);
XRDB_LOAD_COLOR("dwm.titlebordercolor", titlebordercolor);
#if FLOAT_BORDER_COLOR_PATCH
XRDB_LOAD_COLOR("dwm.titlefloatcolor", titlefloatcolor);
#endif // FLOAT_BORDER_COLOR_PATCH
#endif // TITLECOLOR_PATCH
#endif // BAR_TITLECOLOR_PATCH
}
}
}
@ -79,9 +79,9 @@ xrdb(const Arg *arg)
int i;
for (i = 0; i < LENGTH(colors); i++)
scheme[i] = drw_scm_create(drw, colors[i],
#if ALPHA_PATCH
#if BAR_ALPHA_PATCH
alphas[i],
#endif // ALPHA_PATCH
#endif // BAR_ALPHA_PATCH
#if FLOAT_BORDER_COLOR_PATCH
4
#else

View File

@ -10,31 +10,222 @@
* here for grouping purposes.
*/
/* Patches */
/* This patch changes the rectangle indicating if a tag is used by a client into a bar
* above the tag name for better visibility.
* https://dwm.suckless.org/patches/activetagindicatorbar/
/**
* Bar modules
*/
#define ACTIVETAGINDICATORBAR_PATCH 0
/* Alternative patch to the activetagindicatorbar patch, adds the bar below the tag
* icon rather than above.
/* Enhanced taskbar that shows the titles of all visible windows in the status bar
* and allows focus / hiding / unhiding of windows by clicking on the status bar.
* Awesomebar takes precedence over fancybar.
* https://dwm.suckless.org/patches/awesomebar/
*/
#define BAR_AWESOMEBAR_PATCH 0
/* This patch depends on statuscmd patch and adds integration with a (patched) dwmblocks
* instance to give a clickable status bar.
* Patch: https://gist.github.com/danbyl/54f7c1d57fc6507242a95b71c3d8fdea
* dwmblocks: https://github.com/torrinfail/dwmblocks
*/
#define BAR_DWMBLOCKS_PATCH 0
/* This patch shows the titles of all visible windows in the status bar
* (as opposed to showing only the selected one).
* Awesomebar takes precedence over fancybar. Fancybar takes precedence over
* the centeredwindowname patch.
* https://dwm.suckless.org/patches/fancybar/
*/
#define BAR_FANCYBAR_PATCH 0
/* Show layout symbol in bar */
#define BAR_LTSYMBOL_PATCH 1
/* This patch adds an option to place tags in rows like in many other window managers.
* https://dwm.suckless.org/patches/taggrid/
*/
#define BAR_TAGGRID_PATCH 0
/* Show status in bar */
#define BAR_STATUS_PATCH 1
/* This patch adds a clickable button to the left hand side of the statusbar.
* https://dwm.suckless.org/patches/statusbutton/
*/
#define BAR_STATUSBUTTON_PATCH 0
/* This patch adds the ability to execute shell commands based on the mouse button and position
* when clicking the status bar. Refer to the website for usage.
* https://dwm.suckless.org/patches/statuscmd/
*/
#define BAR_STATUSCMD_PATCH 0
/* Status2d allows colors and rectangle drawing in your dwm status bar.
* This patch is incompatible with the statuscolors patch which takes precedence.
* This patch is incompatible with the extrabar patch.
* https://dwm.suckless.org/patches/status2d/
*/
#define BAR_STATUS2D_PATCH 0
/* Supplementary patch should you want to disable alpha for the status2d section */
#define BAR_STATUS2D_NO_ALPHA_PATCH 0
/* The systray patch adds systray for the status bar.
* https://dwm.suckless.org/patches/systray/
*/
#define BAR_SYSTRAY_PATCH 0
/* Show tag symbols in bar */
#define BAR_TAGS_PATCH 1
/* Show window title in bar */
#define BAR_WINTITLE_PATCH 1
/* Title bar modules such as wintitle (default), fancybar and awesomebar
* do not by default add left and/or right padding as they take up the
* remaining space. These options allow you explicitly add padding should
* you need it.
*/
#define BAR_TITLE_RIGHT_PAD 0
#define BAR_TITLE_LEFT_PAD 1
/**
* Bar options
*/
#define ACTIVETAGINDICATORBAR_ALT1_PATCH 0
/* The alpha patch adds transparency for the status bar.
* You need to uncomment the corresponding line in config.mk to use the -lXrender library
* when including this patch.
* https://dwm.suckless.org/patches/alpha/
*/
#define ALPHA_PATCH 0
#define BAR_ALPHA_PATCH 0
/* This patch introduces alternative tags which can be switched on the fly for the
* sole purpose of providing visual aid.
* https://dwm.suckless.org/patches/alternativetags/
*/
#define ALTERNATIVE_TAGS_PATCH 0
#define BAR_ALTERNATIVE_TAGS_PATCH 0
/* This patch changes the rectangle indicating if a tag is used by a client into a bar
* above the tag name for better visibility.
* https://dwm.suckless.org/patches/activetagindicatorbar/
*/
#define BAR_ACTIVETAGINDICATORBAR_PATCH 0
/* Alternative patch to the activetagindicatorbar patch, adds the bar below the tag
* icon rather than above.
*/
#define BAR_ACTIVETAGINDICATORBAR_ALT1_PATCH 0
/* This patch centers the WM_NAME of the currently selected window on the status bar.
* Both fancybar and awesomebar patches take precedence over this patch.
* This patch only applies when the BAR_WINTITLE_PATCH module is used.
* https://dwm.suckless.org/patches/centeredwindowname/
*/
#define BAR_CENTEREDWINDOWNAME_PATCH 0
/* This patch enables color emoji in dwm by removing a workaround for a BadLength error
* in the Xft library when color glyphs are used.
* To enable this you will need an updated Xft library that can handle color glyphs otherwise
* dwm will crash on encountering such characters. Note that you will also need a font that
* provides color emojis for this to work.
*/
#define BAR_COLOR_EMOJI_PATCH 0
/* Updates the position of dmenu to match that of the bar. I.e. if topbar is 0 then dmenu
* will appear at the bottom and if 1 then dmenu will appear at the top.
* https://dwm.suckless.org/patches/dmenumatchtop
*/
#define BAR_DMENUMATCHTOP_PATCH 0
/* Originally this was the extrabar patch, but as the handling of extra bars is now built-in
* only the splitting of the status by a designated separator remains. As such this has been
* renamed to more accurately reflect what it does - creating an extra status.
* https://dwm.suckless.org/patches/extrabar/
*/
#define BAR_EXTRASTATUS_PATCH 0
/* Adds EWMH support for _NET_NUMBER_OF_DESKTOPS, _NET_CURRENT_DESKTOP, _NET_DESKTOP_NAMES
* and _NET_DESKTOP_VIEWPORT, which allows for compatibility with other bars and programs
* that request workspace information. For example polybar's xworkspaces module.
* https://dwm.suckless.org/patches/ewmhtags/
*/
#define BAR_EWMHTAGS_PATCH 0
/* Allows the bar height to be explicitly set rather than being derived from font.
* https://dwm.suckless.org/patches/bar_height/
*/
#define BAR_HEIGHT_PATCH 0
/* This patch prevents dwm from drawing tags with no clients (i.e. vacant) on the bar.
* https://dwm.suckless.org/patches/hide_vacant_tags/
*/
#define BAR_HIDEVACANTTAGS_PATCH 0
/* With this patch dwm's built-in status bar is only shown when HOLDKEY is pressed
* and the bar will now overlay the display.
* http://dwm.suckless.org/patches/holdbar/
*/
#define BAR_HOLDBAR_PATCH 0
/* Sometimes dwm crashes when it cannot render some glyphs in window titles (usually emoji).
* This patch is essentially a hack to ignore any errors when drawing text on the status bar.
* https://groups.google.com/forum/m/#!topic/wmii/7bncCahYIww
* https://docs.google.com/viewer?a=v&pid=forums&srcid=MDAwODA2MTg0MDQyMjE0OTgzMzMBMDQ3ODQzODkyMTU3NTAyMTMxNTYBX2RUMVNtOUtDQUFKATAuMQEBdjI&authuser=0
*/
#define BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH 0
/* This patch adds vertical and horizontal space between the statusbar and the edge of the screen.
* https://dwm.suckless.org/patches/barpadding/
*/
#define BAR_PADDING_PATCH 0
/* This patch adds simple markup for status messages using pango markup.
* This depends on the pango library v1.44 or greater.
* You need to uncomment the corresponding lines in config.mk to use the pango libraries
* when including this patch.
*
* Note that the pango patch does not protect against the BadLength error from Xft
* when color glyphs are used, which means that dwm will crash if color emoji is used.
*
* If you need color emoji then you may want to install this patched library from the AUR:
* https://aur.archlinux.org/packages/libxft-bgra/
*
* A long term fix for the libXft library is pending approval of this pull request:
* https://gitlab.freedesktop.org/xorg/lib/libxft/-/merge_requests/1
*
* Also see:
* https://developer.gnome.org/pygtk/stable/pango-markup-language.html
* https://lists.suckless.org/hackers/2004/17285.html
* https://dwm.suckless.org/patches/pango/
*/
#define BAR_PANGO_PATCH 0
/* This patch enables colored text in the status bar. It changes the way colors are defined
* in config.h allowing multiple color combinations for use in the status script.
* This patch is incompatible with and takes precedence over the status2d patch.
* https://dwm.suckless.org/patches/statuscolors/
*/
#define BAR_STATUSCOLORS_PATCH 0
/* This patch adds configuration options for horizontal and vertical padding in the status bar.
* https://dwm.suckless.org/patches/statuspadding/
*/
#define BAR_STATUSPADDING_PATCH 0
/* Adds a new color scheme used by the (selected) window title in the bar.
* https://dwm.suckless.org/patches/titlecolor/
*/
#define BAR_TITLECOLOR_PATCH 0
/* This patch adds the ability for dwm to read colors from the linux virtual console.
* /sys/module/vt/parameters/default_{red,grn,blu}
* Essentially this way the colors you use in your regular tty is "mirrored" to dwm.
* https://dwm.suckless.org/patches/vtcolors/
*/
#define BAR_VTCOLORS_PATCH 0
/***
* Other patches
*/
/* This patch prevents the focus to drift from the active fullscreen client when
* using focusstack().
@ -80,23 +271,6 @@
*/
#define AUTORESIZE_PATCH 0
/* Enhanced taskbar that shows the titles of all visible windows in the status bar
* and allows focus / hiding / unhiding of windows by clicking on the status bar.
* Awesomebar takes precedence over fancybar.
* https://dwm.suckless.org/patches/awesomebar/
*/
#define AWESOMEBAR_PATCH 0
/* Allows the bar height to be explicitly set rather than being derived from font.
* https://dwm.suckless.org/patches/bar_height/
*/
#define BAR_HEIGHT_PATCH 0
/* This patch adds vertical and horizontal space between the statusbar and the edge of the screen.
* https://dwm.suckless.org/patches/barpadding/
*/
#define BARPADDING_PATCH 0
/* This patch adds an iscentered rule to automatically center clients on the current monitor.
* This patch takes precedence over centeredwindowname and fancybar patches.
* https://dwm.suckless.org/patches/center/
@ -120,12 +294,6 @@
*/
#define CENTER_TRANSIENT_WINDOWS_BY_PARENT_PATCH 0
/* This patch centers the WM_NAME of the currently selected window on the status bar.
* Both fancybar and awesomebar patches take precedence over this patch.
* https://dwm.suckless.org/patches/centeredwindowname/
*/
#define CENTEREDWINDOWNAME_PATCH 0
/* This patch provides the ability to assign different weights to clients in their
* respective stack in tiled layout.
* https://dwm.suckless.org/patches/cfacts/
@ -137,14 +305,6 @@
*/
#define CMDCUSTOMIZE_PATCH 0
/* This patch enables color emoji in dwm by removing a workaround for a BadLength error
* in the Xft library when color glyphs are used.
* To enable this you will need an updated Xft library that can handle color glyphs otherwise
* dwm will crash on encountering such characters. Note that you will also need a font that
* provides color emojis for this to work.
*/
#define COLOR_EMOJI_PATCH 0
/* This patch tweaks the tagging interface so that you can select multiple tags for tag
* or view by pressing all the right keys as a combo. For example to view tags 1 and 3,
* hold MOD and then press and hold 1 and 3 together.
@ -157,12 +317,6 @@
*/
#define CYCLELAYOUTS_PATCH 0
/* Updates the position of dmenu to match that of the bar. I.e. if topbar is 0 then dmenu
* will appear at the bottom and if 1 then dmenu will appear at the top.
* https://dwm.suckless.org/patches/dmenumatchtop
*/
#define DMENUMATCHTOP_PATCH 0
/* Similarly to the dragmfact patch this allows you to click and drag clients to change the
* cfact to adjust the client's size in the stack. This patch depends on the cfacts patch.
*/
@ -175,13 +329,6 @@
*/
#define DRAGMFACT_PATCH 0
/* This patch depends on statuscmd patch and adds integration with a (patched) dwmblocks
* instance to give a clickable status bar.
* Patch: https://gist.github.com/danbyl/54f7c1d57fc6507242a95b71c3d8fdea
* dwmblocks: https://github.com/torrinfail/dwmblocks
*/
#define DWMBLOCKS_PATCH 0
/* Simple dwmc client using a fork of fsignal to communicate with dwm.
* To use this either copy the patch/dwmc shell script to somewhere in your path or
* uncomment the following line in Makefile:
@ -197,13 +344,6 @@
*/
#define EMPTYVIEW_PATCH 0
/* Adds EWMH support for _NET_NUMBER_OF_DESKTOPS, _NET_CURRENT_DESKTOP, _NET_DESKTOP_NAMES
* and _NET_DESKTOP_VIEWPORT, which allows for compatibility with other bars and programs
* that request workspace information. For example polybar's xworkspaces module.
* https://dwm.suckless.org/patches/ewmhtags/
*/
#define EWMHTAGS_PATCH 0
/* This patch allows the user to change size and placement of floating windows using only the
* keyboard. It also allows for temporary vertical and horizontal extension of windows similar
* to other WMs fill command.
@ -211,13 +351,6 @@
*/
#define EXRESIZE_PATCH 0
/* This patch will enable an extra status bar in dwm in a similar manner to the dualstatus
* patch. If the primary status is at the top via topbar then the extra status bar will be
* placed at the bottom and vice versa.
* https://dwm.suckless.org/patches/extrabar/
*/
#define EXTRABAR_PATCH 0
/* Only allow clients to "fullscreen" into the space currently given to them.
* As an example, this will allow you to view a fullscreen video in your browser on
* one half of the screen, while having the other half available for other tasks.
@ -233,14 +366,6 @@
*/
#define FAKEFULLSCREEN_CLIENT_PATCH 0
/* This patch shows the titles of all visible windows in the status bar
* (as opposed to showing only the selected one).
* Awesomebar takes precedence over fancybar. Fancybar takes precedence over
* the centeredwindowname patch.
* https://dwm.suckless.org/patches/fancybar/
*/
#define FANCYBAR_PATCH 0
/* This patch allows a different border color to be chosen for floating windows.
* https://dwm.suckless.org/patches/float_border_color/
*/
@ -296,17 +421,6 @@
*/
#define FULLSCREEN_PATCH 0
/* This patch prevents dwm from drawing tags with no clients (i.e. vacant) on the bar.
* https://dwm.suckless.org/patches/hide_vacant_tags/
*/
#define HIDEVACANTTAGS_PATCH 0
/* With this patch dwm's built-in status bar is only shown when HOLDKEY is pressed
* and the bar will now overlay the display.
* http://dwm.suckless.org/patches/holdbar/
*/
#define HOLDBAR_PATCH 0
/* This patch provides a keybinding to rotate all clients in the currently selected
* area (master or stack) without affecting the other area.
* https://dwm.suckless.org/patches/inplacerotate/
@ -318,13 +432,6 @@
*/
#define ISPERMANENT_PATCH 0
/* Sometimes dwm crashes when it cannot render some glyphs in window titles (usually emoji).
* This patch is essentially a hack to ignore any errors when drawing text on the status bar.
* https://groups.google.com/forum/m/#!topic/wmii/7bncCahYIww
* https://docs.google.com/viewer?a=v&pid=forums&srcid=MDAwODA2MTg0MDQyMjE0OTgzMzMBMDQ3ODQzODkyMTU3NTAyMTMxNTYBX2RUMVNtOUtDQUFKATAuMQEBdjI&authuser=0
*/
#define IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH 0
/* This patch adds key modes (like in vim or emacs) where chains of keyboard shortcuts
* can be performed.
* https://dwm.suckless.org/patches/keymodes/
@ -336,17 +443,12 @@
*/
#define KILLUNSEL_PATCH 0
/* Moves the layout symbol in the status bar to the left hand side.
* http://dwm.suckless.org/patches/leftlayout/
*/
#define LEFTLAYOUT_PATCH 0
/* By default in dwm it is possible to make an application fullscreen, then use
* the focusstack keybindings to focus on other windows beneath the current window.
* It is also possible to spawn new windows (e.g. a terminal) that end up getting
* focus while the previous window remains in fullscreen. This patch ensures that
* in such scenarios the previous window loses fullscreen.
* https://github.com/bakkeby/patches/tree/master/dwm/dwm-losefullscreen-6.2.diff
* https://github.com/bakkeby/patches/blob/master/dwm/dwm-losefullscreen-6.2.diff
*/
#define LOSEFULLSCREEN_PATCH 0
@ -421,27 +523,6 @@
*/
#define ONLYQUITONEMPTY_PATCH 0
/* This patch adds simple markup for status messages using pango markup.
* This depends on the pango library v1.44 or greater.
* You need to uncomment the corresponding lines in config.mk to use the pango libraries
* when including this patch.
*
* Note that the pango patch does not protect against the BadLength error from Xft
* when color glyphs are used, which means that dwm will crash if color emoji is used.
*
* If you need color emoji then you may want to install this patched library from the AUR:
* https://aur.archlinux.org/packages/libxft-bgra/
*
* A long term fix for the libXft library is pending approval of this pull request:
* https://gitlab.freedesktop.org/xorg/lib/libxft/-/merge_requests/1
*
* Also see:
* https://developer.gnome.org/pygtk/stable/pango-markup-language.html
* https://lists.suckless.org/hackers/2004/17285.html
* https://dwm.suckless.org/patches/pango/
*/
#define PANGO_PATCH 0
/* The pertag patch adds nmaster, mfacts and layouts per tag rather than per
* monitor (default).
* https://dwm.suckless.org/patches/pertag/
@ -466,6 +547,11 @@
*/
#define PUSH_NO_MASTER_PATCH 0
/* Resets the layout and mfact if there is only one visible client.
* https://dwm.suckless.org/patches/resetlayout/
*/
#define RESETLAYOUT_PATCH 0
/* By default, windows only resize from the bottom right corner. With this
* patch the mouse is warped to the nearest corner and you resize from there.
* https://dwm.suckless.org/patches/resizecorners/
@ -503,7 +589,7 @@
*/
#define SAVEFLOATS_PATCH 0
/* The scratchpads patch allows you to spawn or restore floating terminal windows.
/* The scratchpad patch allows you to spawn or restore floating terminal windows.
* It is typically useful when one need to do some short typing.
* Upgraded to Christian Tenllado's multiple scratchpad version.
* https://lists.suckless.org/hackers/2004/17205.html
@ -511,13 +597,6 @@
*/
#define SCRATCHPADS_PATCH 0
/* The scratchpad patch above automatically resizes and centers the scratchpad window every
* time you spawn it. This alteration of the patch disables that so that the size and position
* of the scratchpad window is retained when you respawn it. If you enable this then you may
* want to also take the centered patch and enable the iscentered flag for floating scratchpads.
*/
#define SCRATCHPAD_KEEP_POSITION_AND_SIZE_PATCH 0
/* This alternative patch enables a scratchpad feature in dwm similar to the scratchpad
* feature in i3wm.
* https://github.com/GasparVardanyan/dwm-scratchpad
@ -589,81 +668,26 @@
*/
#define STACKER_PATCH 0
/* This patch allows the status text to be fixed to the bar on a specific
* monitor rather than being drawn on the focused monitor.
* The statusallmons patch takes precedence over this patch.
* NB: If used together with the systray patch then consider setting
* systraypinning to statmonval+1.
* https://dwm.suckless.org/patches/staticstatus/
*/
#define STATICSTATUS_PATCH 0
/* Status2d allows colors and rectangle drawing in the dwm status bar.
* This patch is incompatible with the statuscolors patch which takes precedence.
* NB: If using this with dwmblocks then make sure to increase CMDLENGTH in dwmblocks.c
* from 50 (default) to 1024.
* https://dwm.suckless.org/patches/status2d/
*/
#define STATUS2D_PATCH 0
/* Supplementary patch should you want to disable alpha for the status2d section */
#define STATUS2D_NO_ALPHA_PATCH 0
/* This patch draws and updates the statusbar on all monitors.
* https://dwm.suckless.org/patches/statusallmons/
*/
#define STATUSALLMONS_PATCH 0
/* This patch adds a clickable button to the left hand side of the statusbar.
* https://dwm.suckless.org/patches/statusbutton/
*/
#define STATUSBUTTON_PATCH 0
/* This patch enables colored text in the status bar. It changes the way colors are defined
* in config.h allowing multiple color combinations for use in the status script.
* This patch is incompatible with and takes precedence over the status2d patch.
* https://dwm.suckless.org/patches/statuscolors/
*/
#define STATUSCOLORS_PATCH 0
/* This patch adds configuration options for horizontal and vertical padding in the status bar.
* https://dwm.suckless.org/patches/statuspadding/
*/
#define STATUSPADDING_PATCH 0
/* Adds toggleable keyboard shortcut to make a client 'sticky', i.e. visible on all tags.
* https://dwm.suckless.org/patches/sticky/
*/
#define STICKY_PATCH 0
/* This patch adds the ability to execute shell commands based on the mouse button and position
* when clicking the status bar. Refer to the website for usage.
* https://dwm.suckless.org/patches/statuscmd/
*/
#define STATUSCMD_PATCH 0
/* The systray patch adds systray for the status bar.
* https://dwm.suckless.org/patches/systray/
*/
#define SYSTRAY_PATCH 0
/* This patch adds "window swallowing" to dwm as known from Plan 9's windowing system rio.
* Clients marked with isterminal in config.h swallow a window opened by any child process,
* e.g. running xclock in a terminal. Closing the xclock window restores the terminal window
* in the current position.
* This patch depends on the following additional libraries:
* - libxcb
* - Xlib-libxcb
* - xcb-res
* You need to uncomment the corresponding line in config.mk to use the -lX11-xcb, -lxcb
* and -lxcb-res libraries when including this patch.
* https://dwm.suckless.org/patches/swallow/
*/
#define SWALLOW_PATCH 0
/* This patch depends on the pertag patch and makes it possible to switch focus with a single
* shortcut (MOD+s) instead of having to think if you should use MOD+j or MOD+k for reaching
* shortcut (MOD+s) instead of having to think if you should use mod-j or mod-k for reaching
* the previously used window.
* This patch depends on the following additional libraries:
* - libxcb
* - Xlib-libxcb
* - xcb-res
* https://dwm.suckless.org/patches/swapfocus/
*/
#define SWAPFOCUS_PATCH 0
@ -692,7 +716,7 @@
*
* (*) except if the client has been moved between tags or to another monitor
*
* https://github.com/bakkeby/patches/tree/master/dwm/dwm-switchtag-6.2.diff
* https://github.com/bakkeby/patches/blob/master/dwm/dwm-switchtag-6.2.diff
* Also see https://dwm.suckless.org/patches/switchtotag
*/
#define SWITCHTAG_PATCH 0
@ -703,15 +727,10 @@
#define TAGALL_PATCH 0
/* This patch allows you to move all visible windows on a monitor to an adjacent monitor.
* https://github.com/bakkeby/patches/tree/master/dwm/dwm-tagallmon-6.2.diff
* https://github.com/bakkeby/patches/blob/master/dwm/dwm-tagallmon-6.2.diff
*/
#define TAGALLMON_PATCH 0
/* This patch adds an option to place tags in rows like in many other window managers.
* https://dwm.suckless.org/patches/taggrid/
*/
#define TAGGRID_PATCH 0
/* This patch makes new clients attach into the stack area when you toggle a new tag into
* view. This means your master area will remain unchanged when toggling views.
* The allmaster patch will cause all clients in the master area to be left alone. This patch
@ -732,7 +751,7 @@
* monitor until you exit fullscreen view (at which point it will appear on the adjacent
* monitor). This patch allows a fullscreen window to be moved to an adjacent monitor
* while remaining in fullscreen.
* https://github.com/bakkeby/patches/tree/master/dwm/dwm-tagmonfixfs-6.2.diff
* https://github.com/bakkeby/patches/blob/master/dwm/dwm-tagmonfixfs-6.2.diff
*/
#define TAGMONFIXFS_PATCH 0
@ -744,17 +763,12 @@
/* This patch allows you to swap all visible windows on one monitor with those of an
* adjacent monitor.
* https://github.com/bakkeby/patches/tree/master/dwm/dwm-tagswapmon-6.2.diff
* https://github.com/bakkeby/patches/blob/master/dwm/dwm-tagswapmon-6.2.diff
*/
#define TAGSWAPMON_PATCH 0
/* Adds a new color scheme used by the (selected) window title in the bar.
* https://dwm.suckless.org/patches/titlecolor/
*/
#define TITLECOLOR_PATCH 0
/* This patch allows you to toggle fullscreen on and off using a single shortcut key.
* https://github.com/bakkeby/patches/tree/master/dwm/dwm-togglefullscreen-6.2.diff
* https://github.com/bakkeby/patches/blob/master/dwm/dwm-togglefullscreen-6.2.diff
*/
#define TOGGLEFULLSCREEN_PATCH 0
@ -799,13 +813,6 @@
*/
#define VIEWONTAG_PATCH 0
/* This patch adds the ability for dwm to read colors from the linux virtual console.
* /sys/module/vt/parameters/default_{red,grn,blu}
* Essentially this way the colors you use in your regular tty is "mirrored" to dwm.
* https://dwm.suckless.org/patches/vtcolors/
*/
#define VTCOLORS_PATCH 0
/* This patch warps the mouse cursor to the center of the currently focused window or screen
* when the mouse cursor is (a) on a different screen or (b) on top of a different window.
* https://dwm.suckless.org/patches/warp/
@ -817,7 +824,7 @@
* This patch adds the role field to the rule configuration so that one can
* differentiate between, say, Firefox "browser" vs "Preferences" vs "Manager"
* or Google-chrome "browser" vs "pop-up".
* https://github.com/bakkeby/patches/tree/master/dwm/dwm-windowrolerule-6.2.diff
* https://github.com/bakkeby/patches/blob/master/dwm/dwm-windowrolerule-6.2.diff
*/
#define WINDOWROLERULE_PATCH 0
@ -839,7 +846,9 @@
*/
#define ZOOMSWAP_PATCH 0
/* Layouts */
/**
* Layouts
*/
/* Bottomstack layout.
* https://dwm.suckless.org/patches/bottomstack/