diff --git a/README.md b/README.md index c2dd33f..f1e32c2 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/config.def.h b/config.def.h index 190ab12..7e91c43 100644 --- a/config.def.h +++ b/config.def.h @@ -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,73 +35,71 @@ 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 +#endif // BAR_STATUSPADDING_PATCH +#if BAR_STATICSTATUS_PATCH && !BAR_STATUSALLMONS_PATCH static const int statmonval = 0; -#endif // STATICSTATUS_PATCH +#endif // BAR_STATICSTATUS_PATCH #if STATUSBUTTON_PATCH static const char buttonbar[] = ""; #endif // STATUSBUTTON_PATCH #if SYSTRAY_PATCH -static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ 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 #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_EXTRABAR_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 +#if BAR_STATICSTATUS_PATCH && !BAR_STATUSALLMONS_PATCH static const int statebmonval = statmonval; -#endif // STATICSTATUS_PATCH -#endif // EXTRABAR_PATCH -#if PANGO_PATCH +#endif // BAR_STATICSTATUS_PATCH +#endif // BAR_EXTRABAR_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 static char hidfgcolor[] = "#005577"; @@ -112,56 +110,56 @@ static char hidfloatcolor[] = "#f76e0c"; #endif // FLOAT_BORDER_COLOR_PATCH #endif // 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 + #endif // URGENTBORDER_PATCH / BAR_STATUSCOLORS_PATCH #if AWESOMEBAR_PATCH [SchemeHid] = { OPAQUE, baralpha, borderalpha }, #endif // AWESOMEBAR_PATCH - #if VTCOLORS_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 + #endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH #if AWESOMEBAR_PATCH [SchemeHid] = { 5, 0, 0, -1 }, #endif // AWESOMEBAR_PATCH @@ -175,12 +173,12 @@ 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 + #endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH #if AWESOMEBAR_PATCH [SchemeHid] = { "#000000", "#000000", "#000000", "#000000" }, #endif // AWESOMEBAR_PATCH @@ -190,19 +188,19 @@ static char colors[][ColCount][8] = { [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 + #endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH #if AWESOMEBAR_PATCH [SchemeHid] = { 5, 0, 0 }, #endif // AWESOMEBAR_PATCH @@ -216,12 +214,12 @@ 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 + #endif // URGENTBORDER_PATCH || BAR_STATUSCOLORS_PATCH #if AWESOMEBAR_PATCH [SchemeHid] = { "#000000", "#000000", "#000000" }, #endif // AWESOMEBAR_PATCH @@ -240,20 +238,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 + #endif // URGENTBORDER_PATCH / BAR_STATUSCOLORS_PATCH #if AWESOMEBAR_PATCH [SchemeHid] = { hidfgcolor, hidbgcolor, hidbordercolor, hidfloatcolor }, #endif // AWESOMEBAR_PATCH - #if TITLECOLOR_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 +260,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 + #endif // URGENTBORDER_PATCH / BAR_STATUSCOLORS_PATCH #if AWESOMEBAR_PATCH [SchemeHid] = { hidfgcolor, hidbgcolor, hidbordercolor }, #endif // AWESOMEBAR_PATCH - #if TITLECOLOR_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,14 +288,14 @@ 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 /* grid of tags */ @@ -495,9 +493,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 +520,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 @@ -746,9 +744,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 +765,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 */ @@ -891,13 +889,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,9 +993,9 @@ 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 + #endif // BAR_ALTERNATIVE_TAGS_PATCH #if TAGGRID_PATCH { MODKEY|ControlMask, XK_Up, switchtag, { .ui = SWITCHTAG_UP | SWITCHTAG_VIEW } }, { MODKEY|ControlMask, XK_Down, switchtag, { .ui = SWITCHTAG_DOWN | SWITCHTAG_VIEW } }, @@ -1148,27 +1146,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} }, diff --git a/config.mk b/config.mk index 49e5263..e92e380 100644 --- a/config.mk +++ b/config.mk @@ -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` diff --git a/drw.c b/drw.c index bfc66be..99dc6da 100644 --- a/drw.c +++ b/drw.c @@ -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) diff --git a/drw.h b/drw.h index ae46f9a..8a1812f 100644 --- a/drw.h +++ b/drw.h @@ -1,9 +1,9 @@ /* See LICENSE file for copyright and license details. */ -#if PANGO_PATCH +#if BAR_PANGO_PATCH #include #include -#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); diff --git a/dwm.c b/dwm.c index c3bb411..eca9c91 100644 --- a/dwm.c +++ b/dwm.c @@ -45,9 +45,9 @@ #include "drw.h" #include "util.h" -#if PANGO_PATCH +#if BAR_PANGO_PATCH #include -#endif // PANGO_PATCH +#endif // BAR_PANGO_PATCH #if SPAWNCMD_PATCH #include @@ -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,11 +165,15 @@ enum { }; /* default atoms */ enum { - #if STATUSBUTTON_PATCH + #if BAR_STATUSBUTTON_PATCH ClkButton, - #endif // STATUSBUTTON_PATCH + #endif // BAR_STATUSBUTTON_PATCH + #if BAR_TAGS_PATCH ClkTagBar, + #endif // BAR_TAGS_PATCH + #if BAR_LTSYMBOL_PATCH ClkLtSymbol, + #endif // BAR_LTSYMBOL_PATCH ClkStatusText, ClkWinTitle, ClkClientWin, @@ -176,6 +181,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 +202,26 @@ typedef union { const void *v; } Arg; +typedef struct Bar Bar; +struct Bar { + Window win; + 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 Monitor Monitor; +typedef struct { + int monitor; + int bar; + int alignment; // see bar alignment enum + int (*widthfunc)(Monitor *m, int max_width); + int (*drawfunc)(Monitor *m, int x, int w); + int (*clickfunc)(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); + char *name; // for debugging + int x, w; // position, width for internal use +} BarRule; + typedef struct { unsigned int click; unsigned int mask; @@ -191,7 +230,6 @@ typedef struct { const Arg arg; } Button; -typedef struct Monitor Monitor; typedef struct Client Client; struct Client { char name[256]; @@ -288,18 +326,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 @@ -320,14 +346,15 @@ struct Monitor { Client *sel; Client *stack; Monitor *next; - Window barwin; - #if EXTRABAR_PATCH - Window extrabarwin; - #endif // EXTRABAR_PATCH + #if BAR_EXTRABAR_PATCH + Bar *bars[2]; + #else + Bar *bars[1]; + #endif // BAR_EXTRABAR_PATCH 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 @@ -472,11 +499,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,48 +541,46 @@ 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 STATUS2D_PATCH +#endif // BAR_STATUS2D_PATCH +#if BAR_STATUS2D_PATCH static char rawstext[1024]; #else static char rawstext[512]; -#endif // STATUS2D_PATCH -#if EXTRABAR_PATCH -#if STATUS2D_PATCH && !STATUSCOLORS_PATCH +#endif // BAR_STATUS2D_PATCH +#if BAR_EXTRABAR_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_EXTRABAR_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, @@ -566,37 +591,37 @@ 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 +#if BAR_STATICSTATUS_PATCH && !BAR_STATUSALLMONS_PATCH static Monitor *statmon; -#if EXTRABAR_PATCH +#if BAR_EXTRABAR_PATCH static Monitor *statebmon; -#endif // EXTRABAR_PATCH -#endif // STATICSTATUS_PATCH +#endif // BAR_EXTRABAR_PATCH +#endif // BAR_STATICSTATUS_PATCH static Window root, wmcheckwin; /* configuration, allows nested code to access above variables */ @@ -842,30 +867,13 @@ 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, b, r, mi; Arg arg = {0}; Client *c; Monitor *m; 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; + click = ClkRootWin; /* focus monitor if necessary */ if ((m = wintomon(ev->window)) && m != selmon @@ -877,203 +885,26 @@ 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 (b = 0; b < LENGTH(selmon->bars); b++) { + if (ev->window == selmon->bars[b]->win) { + fprintf(stderr, "buttonpress on bar, mi = %d\n", mi); + for (r = 0; r < LENGTH(barrules); r++) { + br = &barrules[r]; + if (br->bar != b || (br->monitor == 'A' && m != selmon) || (br->monitor != -1 && br->monitor != mi) || 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 (selmon->bars[b]->x[r] <= ev->x && ev->x <= selmon->bars[b]->x[r] + selmon->bars[b]->w[r]) { + click = br->clickfunc(m, &arg, ev->x - selmon->bars[b]->x[r], ev->y, selmon->bars[b]->w[r], bh); + 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); @@ -1084,14 +915,17 @@ buttonpress(XEvent *e) XAllowEvents(dpy, ReplayPointer, CurrentTime); click = ClkClientWin; } + fprintf(stderr, "click = %d, dwmblockssig = %d, ev->button = %d, mi = %d\n", click, dwmblockssig, ev->button, mi); 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)) { + fprintf(stderr, "found click, b.button (%d) == ev->button (%d)\n", buttons[i].button, ev->button); + #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 @@ -1121,28 +955,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); @@ -1153,6 +987,7 @@ void cleanupmon(Monitor *mon) { Monitor *m; + int b; if (mon == mons) mons = mons->next; @@ -1160,31 +995,30 @@ 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 (b = 0; b < LENGTH(mon->bars); b++) { + if (mon->bars[b]) { + XUnmapWindow(dpy, mon->bars[b]->win); + XDestroyWindow(dpy, mon->bars[b]->win); + } + free(mon->bars[b]); } - #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) { @@ -1195,11 +1029,7 @@ 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->mon = systray->mon; c->next = systray->icons; systray->icons = c; XGetWindowAttributes(dpy, c->win, &wa); @@ -1222,12 +1052,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; @@ -1303,6 +1131,7 @@ configurenotify(XEvent *e) #endif // !FAKEFULLSCREEN_PATCH XConfigureEvent *ev = &e->xconfigure; int dirty; + int b; /* TODO: updategeom handling sucks, needs to be simplified */ if (ev->window == root) { @@ -1322,19 +1151,9 @@ 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 (b = 0; b < LENGTH(m->bars); b++) + if (m->bars[b]) + XMoveResizeWindow(dpy, m->bars[b]->win, m->bars[b]->bx, m->bars[b]->by, m->bars[b]->bw, m->bars[b]->bh); } focus(NULL); arrange(NULL); @@ -1402,9 +1221,7 @@ Monitor * createmon(void) { Monitor *m; - #if PERTAG_PATCH int i; - #endif // PERTAG_PATCH #if MONITOR_RULES_PATCH int mc, j; Monitor *mi; @@ -1433,6 +1250,12 @@ createmon(void) m->gappoh = gappoh; m->gappov = gappov; #endif // VANITYGAPS_PATCH + for (i = 0; i < LENGTH(m->bars); i++) + m->bars[i] = ecalloc(1, sizeof(Bar)); + // for (r = 0; r < LENGTH(barrules); r++) { + + // for (b = 0; b < LENGTH(selmon->bars); b++) { + #if MONITOR_RULES_PATCH for (mc = 0, mi = mons; mi; mi = mi->next, mc++); for (j = 0; j < LENGTH(monrules); j++) { @@ -1550,12 +1373,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(); } - #endif // SYSTRAY_PATCH + #endif // BAR_SYSTRAY_PATCH } void @@ -1599,471 +1422,128 @@ 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; + Monitor *mon; + int b, r, mi; + int ret_x, w; + int rx, lx, rw, lw; // bar size, split between left and right if a center module is added + const BarRule *br; + Bar *bar; - #if SYSTRAY_PATCH - if (showsystray && m == systraytomon(m)) - stw += getsystraywidth(); - #endif // SYSTRAY_PATCH + for (mi = 0, mon = mons; mon && mon != m; mon = mon->next, mi++); // get the monitor index + for (b = LENGTH(m->bars) - 1; b >= 0; b--) { + fprintf(stderr, "drawbar, monitor m = %ld, mi = %d, b = %d\n", m, mi, b); + bar = m->bars[b]; + if (!bar->win) { + fprintf(stderr, "%s\n", "bar->win does not exist"); + continue; + } - /* 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]); + rw = lw = bar->bw; + rx = lx = 0; + fprintf(stderr, "lx = %d, lw = %d\n", lx, lw); + + #if BAR_VTCOLORS_PATCH + drw_setscheme(drw, scheme[SchemeTagsNorm]); #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++; + #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 != b || (br->monitor == 'A' && m != selmon) || (br->monitor != -1 && br->monitor != mi) || br->drawfunc == NULL) 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; + #if BAR_VTCOLORS_PATCH + drw_setscheme(drw, scheme[SchemeTagsNorm]); #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') + drw_setscheme(drw, scheme[SchemeNorm]); + #endif // BAR_VTCOLORS_PATCH + if (br->alignment < BAR_ALIGN_RIGHT_LEFT) { + w = br->widthfunc(m, lw); + w = MIN(lw, w); + } else { + w = br->widthfunc(m, rw); + w = MIN(rw, w); + } + switch(br->alignment) { + default: + case BAR_ALIGN_NONE: + case BAR_ALIGN_LEFT_LEFT: + case BAR_ALIGN_LEFT: + bar->x[r] = lx; + bar->w[r] = w; + 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; + bar->w[r] = 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; + bar->w[r] = w; + if (lx == rx) { + rw = rx + rw - bar->x[r] - bar->w[r]; + rx = bar->x[r] + bar->w[r]; + } + lw = bar->x[r] - lx; + break; + case BAR_ALIGN_RIGHT_LEFT: + bar->x[r] = rx; + bar->w[r] = w; + if (lx == rx) { + lx += w; + lw -= w; + } + rx += w; + rw -= w; + break; + case BAR_ALIGN_RIGHT_RIGHT: + bar->x[r] = rx + rw - w; + bar->w[r] = w; + if (lx == rx) + lw -= w; + rw -= w; + break; + case BAR_ALIGN_RIGHT_CENTER: + bar->x[r] = rx + rw / 2 - w / 2; + bar->w[r] = w; + if (lx == rx) { + lw = lx + lw - bar->x[r] + bar->w[r]; + lx = bar->x[r] + bar->w[r]; + } + rw = bar->x[r] - rx; 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); + ret_x = br->drawfunc(m, bar->x[r], bar->w[r]); + if (ret_x != bar->x[r] + bar->w[r]) + fprintf(stderr, "%s - %d alignment, expected these to be the same: %d vs %d, w = %d, bx = %d\n", br->name, br->alignment, ret_x, bar->x[r] + bar->w[r], bar->w[r], bar->x[r]); - 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 (lw <= 0) { // if left is exhausted, switch to right side + lw = rw; + lx = rx; + rw = 0; + rx = 0; } } - #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 + drw_map(drw, bar->win, 0, 0, bar->bw, bar->bh); } - - #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 } 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 } #if !FOCUSONCLICK_PATCH @@ -2093,25 +1573,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) { @@ -2206,7 +1681,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; @@ -2226,7 +1701,7 @@ getatomprop(Client *c, Atom prop) atom = *(Atom *)p; XFree(p); } - #endif // SYSTRAY_PATCH + #endif // BAR_SYSTRAY_PATCH return atom; } @@ -2378,11 +1853,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); @@ -2460,7 +1935,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->bars[0]->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 @@ -2527,22 +2002,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); @@ -2566,13 +2041,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(); } - #endif // SYSTRAY_PATCH + #endif // BAR_SYSTRAY_PATCH if (!XGetWindowAttributes(dpy, ev->window, &wa)) return; @@ -2685,11 +2160,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; } @@ -2711,7 +2186,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,7 +2196,7 @@ propertynotify(XEvent *e) updatesystrayiconstate(c, ev); updatesystray(); } - #endif // SYSTRAY_PATCH + #endif // BAR_SYSTRAY_PATCH if ((ev->window == root) && (ev->atom == XA_WM_NAME)) { #if DWMC_PATCH || FSIGNAL_PATCH @@ -2987,7 +2462,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->bars[0]->win; for (c = m->stack; c; c = c->snext) if (!c->isfloating && ISVISIBLE(c)) { XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); @@ -3101,21 +2576,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)) { @@ -3133,10 +2608,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; @@ -3155,7 +2630,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; } @@ -3169,11 +2644,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 @@ -3314,25 +2789,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 @@ -3342,12 +2817,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); @@ -3359,7 +2830,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); @@ -3369,13 +2840,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); @@ -3400,7 +2871,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); @@ -3409,34 +2880,43 @@ 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 + #endif // BAR_ALPHA_PATCH + // #if BAR_SYSTRAY_PATCH + // /* init system tray */ + // if (showsystray) + // updatesystray(); + // #endif // BAR_SYSTRAY_PATCH /* init bars */ + // Monitor *m; + // for (m = mons; m; m = m->next) { + // fprintf(stderr, "updating bar pos\n"); + // updatebarpos(m); + // } updatebars(); updatestatus(); - #if BARPADDING_PATCH - updatebarpos(selmon); - #endif // BARPADDING_PATCH + + // Monitor *m; + // for (m = mons; m; m = m->next) + // updatebarpos(m); + // for () + // updatebarpos(selmon); + /* supporting window for NetWMCheck */ wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, @@ -3448,12 +2928,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; @@ -3536,14 +3016,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 @@ -3558,7 +3038,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) @@ -3603,9 +3083,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 @@ -3667,42 +3147,20 @@ tagmon(const Arg *arg) void togglebar(const Arg *arg) { - #if HOLDBAR_PATCH && PERTAG_PATCH && PERTAGBAR_PATCH + int b; + #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 (b = 0; b < LENGTH(selmon->bars); b++) + if (selmon->bars[b]->win) + XMoveResizeWindow(dpy, selmon->bars[b]->win, selmon->bars[b]->bx, selmon->bars[b]->by, selmon->bars[b]->bw, selmon->bars[b]->bh); arrange(selmon); } @@ -3772,9 +3230,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 @@ -3851,9 +3309,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 @@ -3951,102 +3409,52 @@ 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 + #endif // BAR_SYSTRAY_PATCH } } void updatebars(void) { - unsigned int w; + int b; 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 (b = 0; b < LENGTH(m->bars); b++) { + if (!m->bars[b]->win) { // TODO add static status controls to not create / show extra bar? + fprintf(stderr, "creating bar %d at pos x = %d, y = %d, w = %d, h = %d\n", b, m->bars[b]->bx, m->bars[b]->by, m->bars[b]->bw, m->bars[b]->bh); + #if BAR_ALPHA_PATCH + m->bars[b]->win = XCreateWindow(dpy, root, m->bars[b]->bx, m->bars[b]->by, m->bars[b]->bw, m->bars[b]->bh, 0, depth, + InputOutput, visual, + CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); + #else + m->bars[b]->win = XCreateWindow(dpy, root, m->bars[b]->bx, m->bars[b]->by, m->bars[b]->bw, m->bars[b]->bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + #endif // BAR_ALPHA_PATCH + XDefineCursor(dpy, m->bars[b]->win, cursor[CurNormal]->cursor); + XMapRaised(dpy, m->bars[b]->win); + XSetClassHint(dpy, m->bars[b]->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 - } } @@ -4055,54 +3463,36 @@ 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); + int num_bars, b; + #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; + int y_pad = 0; + int x_pad = 0; + #endif // BAR_PADDING_PATCH + + // for (num_bars = 0; num_bars < LENGTH(m->bars) && m->bars[num_bars]->win; num_bars++); + num_bars = LENGTH(m->bars); + fprintf(stderr, "num_bars = %d\n", num_bars); 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; + m->wh = m->wh - y_pad * num_bars - bh * num_bars; + m->wy = m->wy + 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; + + for (b = 0; b < num_bars; b++) { + fprintf(stderr, "setting bx to xpad %d, b = %d\n", m->mx + x_pad, b); + m->bars[b]->bx = m->mx + x_pad; + m->bars[b]->bw = m->ww - 2 * x_pad; + m->bars[b]->bh = bh; + if (m->showbar) { + fprintf(stderr, "eh? %d, b = %d\n", topbar == b, b); + m->bars[b]->by = m->topbar == b ? m->wy + m->wh : m->wy - bh; + } else { + m->bars[b]->by = -bh - y_pad; + } + fprintf(stderr, "finished with bar, bx = %d, by = %d, bw = %d, bh = %d, m = %ld\n", m->bars[b]->bx, m->bars[b]->by, m->bars[b]->bw, m->bars[b]->bh, m); } - #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 @@ -4152,14 +3542,14 @@ updategeom(void) mons = createmon(); } for (i = 0, m = mons; i < nn && m; m = m->next, i++) { - #if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH + #if BAR_STATICSTATUS_PATCH && !BAR_STATUSALLMONS_PATCH if (i == statmonval) statmon = m; - #if EXTRABAR_PATCH + #if BAR_EXTRABAR_PATCH if (i == statebmonval) statebmon = m; - #endif // EXTRABAR_PATCH - #endif // STATICSTATUS_PATCH + #endif // BAR_EXTRABAR_PATCH + #endif // BAR_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) @@ -4186,14 +3576,14 @@ updategeom(void) } if (m == selmon) selmon = mons; - #if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH + #if BAR_STATICSTATUS_PATCH && !BAR_STATUSALLMONS_PATCH if (m == statmon) statmon = mons; - #if EXTRABAR_PATCH + #if BAR_EXTRABAR_PATCH if (m == statebmon) statebmon = mons; - #endif // EXTRABAR_PATCH - #endif // STATICSTATUS_PATCH + #endif // BAR_EXTRABAR_PATCH + #endif // BAR_STATICSTATUS_PATCH cleanupmon(m); } } @@ -4210,14 +3600,14 @@ updategeom(void) updatebarpos(mons); } } - #if STATICSTATUS_PATCH && !STATUSALLMONS_PATCH + #if BAR_STATICSTATUS_PATCH && !BAR_STATUSALLMONS_PATCH if (!statmon) statmon = mons; - #if EXTRABAR_PATCH + #if BAR_EXTRABAR_PATCH if (!statebmon) statebmon = mons; - #endif // EXTRABAR_PATCH - #endif // STATICSTATUS_PATCH + #endif // BAR_EXTRABAR_PATCH + #endif // BAR_STATICSTATUS_PATCH if (dirty) { selmon = mons; selmon = wintomon(root); @@ -4301,10 +3691,10 @@ updatesizehints(Client *c) void updatestatus(void) { - #if STATUSALLMONS_PATCH + #if BAR_STATUSALLMONS_PATCH Monitor* m; - #endif // STATUSALLMONS_PATCH - #if EXTRABAR_PATCH + #endif // BAR_STATUSALLMONS_PATCH + #if BAR_EXTRABAR_PATCH if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext))) { strcpy(stext, "dwm-"VERSION); estext[0] = '\0'; @@ -4312,22 +3702,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 @@ -4335,23 +3725,19 @@ updatestatus(void) #else if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) strcpy(stext, "dwm-"VERSION); - #endif // EXTRABAR_PATCH - #if STATUSALLMONS_PATCH + #endif // BAR_EXTRABAR_PATCH + #if BAR_STATUSALLMONS_PATCH for (m = mons; m; m = m->next) drawbar(m); - #elif STATICSTATUS_PATCH + #elif BAR_STATICSTATUS_PATCH drawbar(statmon); - #if EXTRABAR_PATCH + #if BAR_EXTRABAR_PATCH if (statmon != statebmon) drawbar(statebmon); - #endif // EXTRABAR_PATCH + #endif // BAR_EXTRABAR_PATCH #else drawbar(selmon); - #endif // STATUSALLMONS_PATCH | STATICSTATUS_PATCH - #if SYSTRAY_PATCH - if (showsystray) - updatesystray(); - #endif // SYSTRAY_PATCH + #endif // BAR_STATUSALLMONS_PATCH | BAR_STATICSTATUS_PATCH } void @@ -4417,9 +3803,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 * @@ -4438,19 +3824,16 @@ wintoclient(Window w) Monitor * wintomon(Window w) { - int x, y; + int x, y, b; Client *c; Monitor *m; 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 (b = 0; b < LENGTH(m->bars); b++) + if (w == m->bars[b]->win) + return m; if ((c = wintoclient(w))) return c->mon; return selmon; @@ -4584,12 +3967,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 */ @@ -4598,7 +3981,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]; @@ -4638,10 +4021,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__ diff --git a/patch/awesomebar.c b/patch/awesomebar.c deleted file mode 100644 index e21f4f1..0000000 --- a/patch/awesomebar.c +++ /dev/null @@ -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); - } -} \ No newline at end of file diff --git a/patch/awesomebar.h b/patch/awesomebar.h deleted file mode 100644 index 8cf46f4..0000000 --- a/patch/awesomebar.h +++ /dev/null @@ -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); \ No newline at end of file diff --git a/patch/alpha.c b/patch/bar_alpha.c similarity index 100% rename from patch/alpha.c rename to patch/bar_alpha.c diff --git a/patch/alpha.h b/patch/bar_alpha.h similarity index 100% rename from patch/alpha.h rename to patch/bar_alpha.h diff --git a/patch/alternativetags.c b/patch/bar_alternativetags.c similarity index 100% rename from patch/alternativetags.c rename to patch/bar_alternativetags.c diff --git a/patch/alternativetags.h b/patch/bar_alternativetags.h similarity index 100% rename from patch/alternativetags.h rename to patch/bar_alternativetags.h diff --git a/patch/bar_awesomebar.c b/patch/bar_awesomebar.c new file mode 100644 index 0000000..85ec003 --- /dev/null +++ b/patch/bar_awesomebar.c @@ -0,0 +1,146 @@ +int +width_awesomebar(Monitor *m, int max_width) +{ + return max_width; +} + +int +draw_awesomebar(Monitor *m, int x_orig, int w) +{ + int n = 0, scm, remainder = 0, tabw; + unsigned int i, x = x_orig; + Client *c; + for (c = m->clients; c; c = c->next) + if (ISVISIBLE(c)) + n++; + + 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 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]); + #if BAR_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 // BAR_PANGO_PATCH + x += tabw; + } + } + return x_orig + w; +} + +int +click_awesomebar(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + int x = 0, n = 0; + Client *c; + + for (c = m->clients; c; c = c->next) + if (ISVISIBLE(c)) + n++; + + c = m->clients; + + do { + if (!c || !ISVISIBLE(c)) + continue; + else + x += (1.0 / (double)n) * rel_w; + } while (c && 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); + } +} \ No newline at end of file diff --git a/patch/bar_awesomebar.h b/patch/bar_awesomebar.h new file mode 100644 index 0000000..84c8505 --- /dev/null +++ b/patch/bar_awesomebar.h @@ -0,0 +1,8 @@ +static int width_awesomebar(Monitor *m, int max_width); +static int draw_awesomebar(Monitor *m, int x, int w); +static int click_awesomebar(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); + +static void hide(Client *c); +static void show(Client *c); +static void togglewin(const Arg *arg); +static void showhideclient(const Arg *arg); \ No newline at end of file diff --git a/patch/dwmblocks.c b/patch/bar_dwmblocks.c similarity index 100% rename from patch/dwmblocks.c rename to patch/bar_dwmblocks.c diff --git a/patch/dwmblocks.h b/patch/bar_dwmblocks.h similarity index 100% rename from patch/dwmblocks.h rename to patch/bar_dwmblocks.h diff --git a/patch/bar_fancybar.c b/patch/bar_fancybar.c new file mode 100644 index 0000000..b6f5363 --- /dev/null +++ b/patch/bar_fancybar.c @@ -0,0 +1,97 @@ +int +width_fancybar(Monitor *m, int max_width) +{ + return max_width; +} + +int +draw_fancybar(Monitor *m, int x, int w) +{ + int ftw, mw, ew = 0, n = 0; + unsigned int i; + Client *c; + #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 + + for (c = m->clients; c; c = c->next) { + if (ISVISIBLE(c)) + n++; + } + + 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 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 !BAR_HIDEVACANTTAGS_PATCH + if (c->isfloating) + #if BAR_ACTIVETAGINDICATORBAR_PATCH + drw_rect(drw, x + boxw, 0, w - ( 2 * boxw + 1), boxw, c->isfixed, 0); + #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, c->isfixed, 0); + #endif // BAR_ACTIVETAGINDICATORBAR_PATCH + #endif // BAR_HIDEVACANTTAGS_PATCH + x += ftw; + w -= ftw; + } + } + #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_fancybar(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return ClkWinTitle; +} + + diff --git a/patch/bar_fancybar.h b/patch/bar_fancybar.h new file mode 100644 index 0000000..24336d9 --- /dev/null +++ b/patch/bar_fancybar.h @@ -0,0 +1,3 @@ +static int width_fancybar(Monitor *m, int max_width); +static int draw_fancybar(Monitor *m, int x, int w); +static int click_fancybar(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); \ No newline at end of file diff --git a/patch/bar_ltsymbol.c b/patch/bar_ltsymbol.c new file mode 100644 index 0000000..f4417f1 --- /dev/null +++ b/patch/bar_ltsymbol.c @@ -0,0 +1,21 @@ +int +width_ltsymbol(Monitor *m, int max_width) +{ + return TEXTW(m->ltsymbol); +} + +int +draw_ltsymbol(Monitor *m, int x, int w) +{ + #if BAR_PANGO_PATCH + return drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False); + #else + return drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + #endif // BAR_PANGO_PATCH +} + +int +click_ltsymbol(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return ClkLtSymbol; +} \ No newline at end of file diff --git a/patch/bar_ltsymbol.h b/patch/bar_ltsymbol.h new file mode 100644 index 0000000..5471496 --- /dev/null +++ b/patch/bar_ltsymbol.h @@ -0,0 +1,3 @@ +static int width_ltsymbol(Monitor *m, int max_width); +static int draw_ltsymbol(Monitor *m, int x, int w); +static int click_ltsymbol(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); diff --git a/patch/bar_status.c b/patch/bar_status.c new file mode 100644 index 0000000..fdf72de --- /dev/null +++ b/patch/bar_status.c @@ -0,0 +1,25 @@ +int +width_status(Monitor *m, int max_width) +{ + #if BAR_PANGO_PATCH + return TEXTWM(stext) - lrpad + 2; /* 2px right padding */ + #else + return TEXTW(stext) - lrpad + 2; /* 2px right padding */ + #endif // BAR_PANGO_PATCH +} + +int +draw_status(Monitor *m, int x, int w) +{ + #if BAR_PANGO_PATCH + return drw_text(drw, x, 0, w, bh, 0, stext, 0, True); + #else + return drw_text(drw, x, 0, w, bh, 0, stext, 0); + #endif // BAR_PANGO_PATCH +} + +int +click_status(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return ClkStatusText; +} diff --git a/patch/bar_status.h b/patch/bar_status.h new file mode 100644 index 0000000..3b6c924 --- /dev/null +++ b/patch/bar_status.h @@ -0,0 +1,3 @@ +static int width_status(Monitor *m, int max_width); +static int draw_status(Monitor *m, int x, int w); +static int click_status(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); \ No newline at end of file diff --git a/patch/status2d.c b/patch/bar_status2d.c similarity index 65% rename from patch/status2d.c rename to patch/bar_status2d.c index 99dcacd..8b3b3e5 100644 --- a/patch/status2d.c +++ b/patch/bar_status2d.c @@ -1,7 +1,25 @@ int -drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp, int align) +width_status2d(Monitor *m, int max_width) { - int ret, i, w, x, len; + return status2dtextlength(rawstext); +} + +int +draw_status2d(Monitor *m, int x, int w) +{ + return drawstatusbar(m, x, w, rawstext); +} + +int +click_status2d(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return ClkStatusText; +} + +int +drawstatusbar(Monitor *m, int x, int ow, char* stext) +{ + int i, w, len; short isCode = 0; char *text; char *p; @@ -10,58 +28,11 @@ 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 - - /* 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++; + #endif // BAR_STATUSCMD_PATCH /* process status text */ i = -1; @@ -70,13 +41,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 +61,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 +77,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 +113,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 +136,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 +156,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 +172,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; -} +} \ No newline at end of file diff --git a/patch/bar_status2d.h b/patch/bar_status2d.h new file mode 100644 index 0000000..3f1a346 --- /dev/null +++ b/patch/bar_status2d.h @@ -0,0 +1,5 @@ +static int width_status2d(Monitor *m, int max_width); +static int draw_status2d(Monitor *m, int x, int w); +static int click_status2d(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); +static int drawstatusbar(Monitor *m, int x, int w, char* text); +static int status2dtextlength(char* stext); \ No newline at end of file diff --git a/patch/bar_status2d_eb.c b/patch/bar_status2d_eb.c new file mode 100644 index 0000000..adce774 --- /dev/null +++ b/patch/bar_status2d_eb.c @@ -0,0 +1,11 @@ +int +width_status2d_eb(Monitor *m, int max_width) +{ + return status2dtextlength(rawestext); +} + +int +draw_status2d_eb(Monitor *m, int x, int w) +{ + return drawstatusbar(m, x, w, rawestext); +} \ No newline at end of file diff --git a/patch/bar_status2d_eb.h b/patch/bar_status2d_eb.h new file mode 100644 index 0000000..87b41fb --- /dev/null +++ b/patch/bar_status2d_eb.h @@ -0,0 +1,2 @@ +static int width_status2d_eb(Monitor *m, int max_width); +static int draw_status2d_eb(Monitor *m, int x, int w); \ No newline at end of file diff --git a/patch/bar_statusbutton.c b/patch/bar_statusbutton.c new file mode 100644 index 0000000..130ef62 --- /dev/null +++ b/patch/bar_statusbutton.c @@ -0,0 +1,21 @@ +int +width_stbutton(Monitor *m, int max_width) +{ + return TEXTW(buttonbar); +} + +int +draw_stbutton(Monitor *m, int x, int w) +{ + #if BAR_PANGO_PATCH + return drw_text(drw, x, 0, w, bh, lrpad / 2, buttonbar, 0, False); + #else + return drw_text(drw, x, 0, w, bh, lrpad / 2, buttonbar, 0); + #endif // BAR_PANGO_PATCH +} + +int +click_stbutton(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return ClkButton; +} diff --git a/patch/bar_statusbutton.h b/patch/bar_statusbutton.h new file mode 100644 index 0000000..84ac2c5 --- /dev/null +++ b/patch/bar_statusbutton.h @@ -0,0 +1,3 @@ +static int width_stbutton(Monitor *m, int max_width); +static int draw_stbutton(Monitor *m, int x, int w); +static int click_stbutton(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); \ No newline at end of file diff --git a/patch/bar_statuscmd.c b/patch/bar_statuscmd.c new file mode 100644 index 0000000..f6166c3 --- /dev/null +++ b/patch/bar_statuscmd.c @@ -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(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return click_statuscmd_text(m, arg, rel_x, rel_y, rawstext); +} + +#if BAR_EXTRABAR_PATCH +int +click_statuscmd_eb(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return click_statuscmd_text(m, arg, rel_x, rel_y, rawestext); +} +#endif // BAR_EXTRABAR_PATCH + +int +click_statuscmd_text(Monitor *m, Arg *arg, int rel_x, int rel_y, 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'; +} diff --git a/patch/bar_statuscmd.h b/patch/bar_statuscmd.h new file mode 100644 index 0000000..92ed7e1 --- /dev/null +++ b/patch/bar_statuscmd.h @@ -0,0 +1,6 @@ +static int click_statuscmd(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); +#if BAR_EXTRABAR_PATCH +static int click_statuscmd_eb(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); +#endif // BAR_EXTRABAR_PATCH +static int click_statuscmd_text(Monitor *m, Arg *arg, int rel_x, int rel_y, char *text); +static void copyvalidchars(char *text, char *rawtext); \ No newline at end of file diff --git a/patch/systray.c b/patch/bar_systray.c similarity index 63% rename from patch/systray.c rename to patch/bar_systray.c index 0ca2f86..9938543 100644 --- a/patch/systray.c +++ b/patch/bar_systray.c @@ -1,17 +1,35 @@ - static Systray *systray = NULL; static unsigned long systrayorientation = _NET_SYSTEM_TRAY_ORIENTATION_HORZ; +static int systraybaridx = -1; +static int systraybarrule = -1; +static int systrayxpos = 0; -unsigned int -getsystraywidth() +int +width_systray(Monitor *m, int max_width) { 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; } +int +draw_systray(Monitor *m, int x_pos, int w) +{ + systrayxpos = x_pos; + updatesystray(); + return systrayxpos + w; +} + +int +click_systray(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return -1; +} + void removesystrayicon(Client *i) { @@ -37,64 +55,51 @@ resizerequest(XEvent *e) } } -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; + XSetWindowAttributes wa; + Client *i; + Monitor *m; + unsigned int w = 1, r, mi; + const BarRule *br; + 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); + /* Work out which bar the systray is to be displayed on */ + for (r = 0; r < LENGTH(barrules); r++) { + br = &barrules[r]; + if (br->drawfunc == &draw_systray) { + systraybaridx = br->bar; + systraybarrule = r; + if (br->monitor == -1 || br->monitor == 'A') + m = selmon; + else + for (m = mons, mi = 0; m && mi < br->monitor && m->next; m = m->next, mi++); + systray->win = m->bars[systraybaridx]->win; + systray->mon = m; + + break; + } + } + if (systraybaridx == -1) { + fprintf(stderr, "dwm: unable to obtain system tray, no draw_systray in bar rules.\n"); + free(systray); + systray = NULL; + return; + } + XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&systrayorientation, 1); - #if ALPHA_PATCH + #if BAR_ALPHA_PATCH XChangeProperty(dpy, systray->win, netatom[NetSystemTrayVisual], XA_VISUALID, 32, PropModeReplace, (unsigned char *)&visual->visualid, 1); - #endif // ALPHA_PATCH + #endif // BAR_ALPHA_PATCH XChangeProperty(dpy, systray->win, netatom[NetWMWindowType], XA_ATOM, 32, PropModeReplace, (unsigned char *)&netatom[NetWMWindowTypeDock], 1); XMapRaised(dpy, systray->win); @@ -102,8 +107,7 @@ updatesystray(void) if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); XSync(dpy, False); - } - else { + } else { fprintf(stderr, "dwm: unable to obtain system tray.\n"); free(systray); systray = NULL; @@ -111,34 +115,18 @@ updatesystray(void) } } - 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; + i->x = systrayxpos + w; XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); w += i->w; - if (i->mon != m) - i->mon = m; + if (i->mon != systray->mon) + i->mon = systray->mon; } - 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 diff --git a/patch/systray.h b/patch/bar_systray.h similarity index 81% rename from patch/systray.h rename to patch/bar_systray.h index 1a2bab6..de588d1 100644 --- a/patch/systray.h +++ b/patch/bar_systray.h @@ -22,14 +22,18 @@ typedef struct Systray Systray; struct Systray { Window win; Client *icons; + Monitor *mon; }; +/* bar integration */ +static int width_systray(Monitor *m, int max_width); +static int draw_systray(Monitor *m, int x_pos, int w); +static int click_systray(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); + /* 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); diff --git a/patch/bar_taggrid.c b/patch/bar_taggrid.c new file mode 100644 index 0000000..4fa98d7 --- /dev/null +++ b/patch/bar_taggrid.c @@ -0,0 +1,142 @@ +int +width_taggrid(Monitor *m, int max_width) +{ + return (bh / 2) * (LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0)); +} + +int +draw_taggrid(Monitor *m, int x_pos, int w) +{ + unsigned int x, y, h, max_x, columns, occ = 0; + int invert, i,j, k; + Client *c; + + for (c = m->clients; c; c = c->next) + occ |= c->tags; + + 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 */ + 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; + } + return max_x; +} + +int +click_taggrid(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + unsigned int i, columns; + + columns = LENGTH(tags) / tagrows + ((LENGTH(tags) % tagrows > 0) ? 1 : 0); + i = (rel_x - 0) / (bh / tagrows) + columns * (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); + } +} \ No newline at end of file diff --git a/patch/bar_taggrid.h b/patch/bar_taggrid.h new file mode 100644 index 0000000..ca8a16c --- /dev/null +++ b/patch/bar_taggrid.h @@ -0,0 +1,4 @@ +static int width_taggrid(Monitor *m, int max_width); +static int draw_taggrid(Monitor *m, int x, int w); +static int click_taggrid(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); +static void switchtag(const Arg *arg); \ No newline at end of file diff --git a/patch/bar_tags.c b/patch/bar_tags.c new file mode 100644 index 0000000..73dc5d7 --- /dev/null +++ b/patch/bar_tags.c @@ -0,0 +1,123 @@ +int +width_tags(Monitor *m, int max_width) +{ + 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; +} + +int +draw_tags(Monitor *m, int x, int w) +{ + int invert; + #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; + + 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(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + int i = 0, x = 0; + do + #if BAR_ALTERNATIVE_TAGS_PATCH + x += selmon->alttag ? TEXTW(tagsalt[i]) : TEXTW(tags[i]); + #else + x += TEXTW(tags[i]); + #endif + while (rel_x >= x && ++i < LENGTH(tags)); + if (i < LENGTH(tags)) { + arg->ui = 1 << i; + } + return ClkTagBar; +} diff --git a/patch/bar_tags.h b/patch/bar_tags.h new file mode 100644 index 0000000..788c488 --- /dev/null +++ b/patch/bar_tags.h @@ -0,0 +1,3 @@ +static int width_tags(Monitor *m, int max_width); +static int draw_tags(Monitor *m, int x, int w); +static int click_tags(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); \ No newline at end of file diff --git a/patch/bar_wintitle.c b/patch/bar_wintitle.c new file mode 100644 index 0000000..e937723 --- /dev/null +++ b/patch/bar_wintitle.c @@ -0,0 +1,89 @@ +int +width_wintitle(Monitor *m, int max_width) +{ + return max_width; +} + +int +draw_wintitle(Monitor *m, int x, int w) +{ + #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 (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_PADDING_PATCH && BAR_PANGO_PATCH + drw_text(drw, x, 0, w - 2*sp, bh, mid, m->sel->name, 0, False); + #elif BAR_PADDING_PATCH + drw_text(drw, x, 0, w - 2*sp, bh, mid, m->sel->name, 0); + #elif 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_PADDING_PATCH + #else + #if BAR_PADDING_PATCH && BAR_PANGO_PATCH + drw_text(drw, x, 0, w - 2*sp, bh, lrpad / 2, m->sel->name, 0, False); + #elif BAR_PADDING_PATCH + drw_text(drw, x, 0, w - 2*sp, bh, lrpad / 2, m->sel->name, 0); + #elif 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_PADDING_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, + #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 + #if BAR_PADDING_PATCH + drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1); + #else + drw_rect(drw, x, 0, w, bh, 1, 1); + #endif // BAR_PADDING_PATCH + } + return x + w; +} + +int +click_wintitle(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h) +{ + return ClkWinTitle; +} + + diff --git a/patch/bar_wintitle.h b/patch/bar_wintitle.h new file mode 100644 index 0000000..b1d7ddd --- /dev/null +++ b/patch/bar_wintitle.h @@ -0,0 +1,3 @@ +static int width_wintitle(Monitor *m, int max_width); +static int draw_wintitle(Monitor *m, int x, int w); +static int click_wintitle(Monitor *m, Arg *arg, int rel_x, int rel_y, int rel_w, int rel_h); \ No newline at end of file diff --git a/patch/combo.c b/patch/combo.c index 907b645..43f7e5d 100644 --- a/patch/combo.c +++ b/patch/combo.c @@ -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) diff --git a/patch/combo.h b/patch/combo.h index 08be95e..752f636 100644 --- a/patch/combo.h +++ b/patch/combo.h @@ -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); \ No newline at end of file diff --git a/patch/holdbar.c b/patch/holdbar.c index e3a5bfc..4be9af1 100644 --- a/patch/holdbar.c +++ b/patch/holdbar.c @@ -5,18 +5,18 @@ holdbar(const Arg *arg) return; selmon->showbar = 2; updateholdbarpos(selmon); - #if BARPADDING_PATCH + #if BAR_PADDING_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 + #endif // BAR_PADDING_PATCH + #if BAR_EXTRABAR_PATCH + #if BAR_PADDING_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 + #endif // BAR_PADDING_PATCH + #endif // BAR_EXTRABAR_PATCH } void @@ -35,18 +35,18 @@ keyrelease(XEvent *e) if (e->xkey.keycode == XKeysymToKeycode(dpy, HOLDKEY) && selmon->showbar == 2) { selmon->showbar = 0; updateholdbarpos(selmon); - #if BARPADDING_PATCH + #if BAR_PADDING_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 + #endif // BAR_PADDING_PATCH + #if BAR_EXTRABAR_PATCH + #if BAR_PADDING_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 + #endif // BAR_PADDING_PATCH + #endif // BAR_EXTRABAR_PATCH arrange(selmon); } #if COMBO_PATCH @@ -59,8 +59,8 @@ updateholdbarpos(Monitor *m) { m->wy = m->my; m->wh = m->mh; - #if EXTRABAR_PATCH - #if BARPADDING_PATCH + #if BAR_EXTRABAR_PATCH + #if BAR_PADDING_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) { @@ -80,8 +80,8 @@ updateholdbarpos(Monitor *m) m->by = -bh; m->eby = -bh; } - #endif // BARPADDING_PATCH - #elif BARPADDING_PATCH + #endif // BAR_PADDING_PATCH + #elif BAR_PADDING_PATCH if (m->showbar) { m->wh = m->wh - vertpad - bh; m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; @@ -95,5 +95,5 @@ updateholdbarpos(Monitor *m) m->wy = m->topbar ? m->wy + bh : m->wy; } else m->by = -bh; - #endif // EXTRABAR_PATCH + #endif // BAR_EXTRABAR_PATCH } diff --git a/patch/include.c b/patch/include.c index d574fd6..5cde652 100644 --- a/patch/include.c +++ b/patch/include.c @@ -1,19 +1,57 @@ -/* 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_LTSYMBOL_PATCH +#include "bar_ltsymbol.c" +#endif +#if BAR_STATUS_PATCH +#include "bar_status.c" +#endif +#if BAR_STATUS2D_PATCH +#include "bar_status2d.c" +#if BAR_EXTRABAR_PATCH +#include "bar_status2d_eb.c" +#endif // BAR_EXTRABAR_PATCH +#endif +#if BAR_STATUSBUTTON_PATCH +#include "bar_statusbutton.c" +#endif +#if BAR_STATUSCMD_PATCH +#include "bar_statuscmd.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 + +/* 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 @@ -29,15 +67,12 @@ #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 +#if BAR_EWMHTAGS_PATCH #include "ewmhtags.c" #endif #if EXRESIZE_PATCH @@ -58,7 +93,7 @@ #if FULLSCREEN_PATCH #include "fullscreen.c" #endif -#if HOLDBAR_PATCH +#if BAR_HOLDBAR_PATCH #include "holdbar.c" #endif #if INPLACEROTATE_PATCH @@ -131,21 +166,12 @@ #if STACKER_PATCH #include "stacker.c" #endif -#if STATUS2D_PATCH && !STATUSCOLORS_PATCH -#include "status2d.c" -#endif -#if STATUSCOLORS_PATCH +#if BAR_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 @@ -188,7 +214,7 @@ #if VANITYGAPS_PATCH #include "vanitygaps.c" #endif -#if VTCOLORS_PATCH +#if BAR_VTCOLORS_PATCH #include "vtcolors.c" #endif #if WARP_PATCH @@ -200,7 +226,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 +237,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 \ No newline at end of file diff --git a/patch/include.h b/patch/include.h index 97628aa..49ce915 100644 --- a/patch/include.h +++ b/patch/include.h @@ -1,19 +1,57 @@ -/* 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_LTSYMBOL_PATCH +#include "bar_ltsymbol.h" +#endif +#if BAR_STATUS_PATCH +#include "bar_status.h" +#endif +#if BAR_STATUS2D_PATCH +#include "bar_status2d.h" +#if BAR_EXTRABAR_PATCH +#include "bar_status2d_eb.h" +#endif // BAR_EXTRABAR_PATCH +#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 + +/* 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 @@ -32,15 +70,12 @@ #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 +#if BAR_EWMHTAGS_PATCH #include "ewmhtags.h" #endif #if EXRESIZE_PATCH @@ -61,7 +96,7 @@ #if FULLSCREEN_PATCH #include "fullscreen.h" #endif -#if HOLDBAR_PATCH +#if BAR_HOLDBAR_PATCH #include "holdbar.h" #endif #if INPLACEROTATE_PATCH @@ -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 @@ -188,7 +214,7 @@ #if VANITYGAPS_PATCH #include "vanitygaps.h" #endif -#if VTCOLORS_PATCH +#if BAR_VTCOLORS_PATCH #include "vtcolors.h" #endif #if WARP_PATCH @@ -200,49 +226,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 \ No newline at end of file diff --git a/patch/killunsel.c b/patch/killunsel.c index 1e15d2b..774847b 100644 --- a/patch/killunsel.c +++ b/patch/killunsel.c @@ -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); diff --git a/patch/bstack.c b/patch/layout_bstack.c similarity index 100% rename from patch/bstack.c rename to patch/layout_bstack.c diff --git a/patch/bstack.h b/patch/layout_bstack.h similarity index 100% rename from patch/bstack.h rename to patch/layout_bstack.h diff --git a/patch/bstackhoriz.c b/patch/layout_bstackhoriz.c similarity index 100% rename from patch/bstackhoriz.c rename to patch/layout_bstackhoriz.c diff --git a/patch/bstackhoriz.h b/patch/layout_bstackhoriz.h similarity index 100% rename from patch/bstackhoriz.h rename to patch/layout_bstackhoriz.h diff --git a/patch/centeredfloatingmaster.c b/patch/layout_centeredfloatingmaster.c similarity index 100% rename from patch/centeredfloatingmaster.c rename to patch/layout_centeredfloatingmaster.c diff --git a/patch/centeredfloatingmaster.h b/patch/layout_centeredfloatingmaster.h similarity index 100% rename from patch/centeredfloatingmaster.h rename to patch/layout_centeredfloatingmaster.h diff --git a/patch/centeredmaster.c b/patch/layout_centeredmaster.c similarity index 100% rename from patch/centeredmaster.c rename to patch/layout_centeredmaster.c diff --git a/patch/centeredmaster.h b/patch/layout_centeredmaster.h similarity index 100% rename from patch/centeredmaster.h rename to patch/layout_centeredmaster.h diff --git a/patch/columns.c b/patch/layout_columns.c similarity index 100% rename from patch/columns.c rename to patch/layout_columns.c diff --git a/patch/columns.h b/patch/layout_columns.h similarity index 100% rename from patch/columns.h rename to patch/layout_columns.h diff --git a/patch/deck.c b/patch/layout_deck.c similarity index 100% rename from patch/deck.c rename to patch/layout_deck.c diff --git a/patch/deck.h b/patch/layout_deck.h similarity index 100% rename from patch/deck.h rename to patch/layout_deck.h diff --git a/patch/fibonacci.c b/patch/layout_fibonacci.c similarity index 100% rename from patch/fibonacci.c rename to patch/layout_fibonacci.c diff --git a/patch/fibonacci.h b/patch/layout_fibonacci.h similarity index 100% rename from patch/fibonacci.h rename to patch/layout_fibonacci.h diff --git a/patch/flextile-deluxe.c b/patch/layout_flextile-deluxe.c similarity index 100% rename from patch/flextile-deluxe.c rename to patch/layout_flextile-deluxe.c diff --git a/patch/flextile-deluxe.h b/patch/layout_flextile-deluxe.h similarity index 100% rename from patch/flextile-deluxe.h rename to patch/layout_flextile-deluxe.h diff --git a/patch/gapplessgrid.c b/patch/layout_gapplessgrid.c similarity index 100% rename from patch/gapplessgrid.c rename to patch/layout_gapplessgrid.c diff --git a/patch/gapplessgrid.h b/patch/layout_gapplessgrid.h similarity index 100% rename from patch/gapplessgrid.h rename to patch/layout_gapplessgrid.h diff --git a/patch/grid.c b/patch/layout_grid.c similarity index 100% rename from patch/grid.c rename to patch/layout_grid.c diff --git a/patch/grid.h b/patch/layout_grid.h similarity index 100% rename from patch/grid.h rename to patch/layout_grid.h diff --git a/patch/horizgrid.c b/patch/layout_horizgrid.c similarity index 100% rename from patch/horizgrid.c rename to patch/layout_horizgrid.c diff --git a/patch/horizgrid.h b/patch/layout_horizgrid.h similarity index 100% rename from patch/horizgrid.h rename to patch/layout_horizgrid.h diff --git a/patch/monocle.c b/patch/layout_monocle.c similarity index 100% rename from patch/monocle.c rename to patch/layout_monocle.c diff --git a/patch/monocle.h b/patch/layout_monocle.h similarity index 100% rename from patch/monocle.h rename to patch/layout_monocle.h diff --git a/patch/nrowgrid.c b/patch/layout_nrowgrid.c similarity index 100% rename from patch/nrowgrid.c rename to patch/layout_nrowgrid.c diff --git a/patch/nrowgrid.h b/patch/layout_nrowgrid.h similarity index 100% rename from patch/nrowgrid.h rename to patch/layout_nrowgrid.h diff --git a/patch/tile.c b/patch/layout_tile.c similarity index 100% rename from patch/tile.c rename to patch/layout_tile.c diff --git a/patch/tile.h b/patch/layout_tile.h similarity index 100% rename from patch/tile.h rename to patch/layout_tile.h diff --git a/patch/status2d.h b/patch/status2d.h deleted file mode 100644 index 7688807..0000000 --- a/patch/status2d.h +++ /dev/null @@ -1,2 +0,0 @@ -static int drawstatusbar(Monitor *m, int bh, char* text, int stw, int stp, int align); -static int status2dtextlength(char* stext); \ No newline at end of file diff --git a/patch/statuscolors.c b/patch/statuscolors.c index ef41735..cc24ad4 100644 --- a/patch/statuscolors.c +++ b/patch/statuscolors.c @@ -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; diff --git a/patch/xrdb.c b/patch/xrdb.c index ef9e186..f3bd38a 100644 --- a/patch/xrdb.c +++ b/patch/xrdb.c @@ -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 diff --git a/patches.def.h b/patches.def.h index 81dcc7c..a95e26e 100644 --- a/patches.def.h +++ b/patches.def.h @@ -10,31 +10,228 @@ * 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 + +/** + * 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 + +/* 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 BAR_EXTRABAR_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 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 BAR_STATICSTATUS_PATCH 0 + +/* This patch draws and updates the statusbar on all monitors. + * https://dwm.suckless.org/patches/statusallmons/ + */ +#define BAR_STATUSALLMONS_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 +277,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 +300,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 +311,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 +323,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 +335,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 +350,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 +357,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 +372,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 +427,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 +438,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 +449,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 +529,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 +553,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 +595,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 +603,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,82 +674,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. - * This patch is incompatible with the extrabar patch. - * 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 @@ -693,7 +722,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 @@ -704,15 +733,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 @@ -733,7 +757,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 @@ -745,17 +769,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 @@ -784,8 +803,8 @@ /* This patch adds configurable gaps between windows differentiating between outer, inner, * horizontal and vertical gaps. - * https://github.com/bakkeby/dwm-vanitygaps/tree/master/patches/dwm-vanitygaps-6.2.diff - * https://github.com/bakkeby/dwm-vanitygaps/tree/master/patches/dwm-vanitygaps-cfacts-6.2.diff + * https://github.com/bakkeby/patches/blob/master/dwm/dwm-vanitygaps-6.2.diff + * https://github.com/bakkeby/patches/blob/master/dwm/dwm-cfacts-vanitygaps-6.2.diff */ #define VANITYGAPS_PATCH 0 @@ -800,13 +819,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/ @@ -818,7 +830,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 @@ -840,7 +852,9 @@ */ #define ZOOMSWAP_PATCH 0 -/* Layouts */ +/** + * Layouts + */ /* Bottomstack layout. * https://dwm.suckless.org/patches/bottomstack/ @@ -917,4 +931,4 @@ /* Monocle layout (default). * This can be optionally disabled in favour of other layouts. */ -#define MONOCLE_LAYOUT 1 +#define MONOCLE_LAYOUT 1 \ No newline at end of file