dwm-ratiofullscreen-20210723-e493493.diff (4893B)
1 From e493493fa3bffd8b58408a55714de9d49211b1ba Mon Sep 17 00:00:00 2001 2 From: Layerex <layerex@dismail.de> 3 Date: Fri, 23 Jul 2021 15:15:23 +0300 4 Subject: [PATCH] ratiofullscreen patch 5 6 Toggle fullscreen for a window while saving its ratio. 7 Space left uncovered by a window may be set to be black or left 8 transparent. 9 The patch is intended to be used with old games which have miniscule 10 window sizes and don't handle fullscreen correctly themselves. 11 Smartborders patch (its modified resizeclient function) is a dependency 12 of this patch. 13 --- 14 config.def.h | 3 +++ 15 dwm.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++---- 16 2 files changed, 59 insertions(+), 4 deletions(-) 17 18 diff --git a/config.def.h b/config.def.h 19 index 1c0b587..6966237 100644 20 --- a/config.def.h 21 +++ b/config.def.h 22 @@ -36,6 +36,8 @@ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] 23 static const int nmaster = 1; /* number of clients in master area */ 24 static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ 25 26 +static const int ratiofullscreenborders = 1; 27 + 28 static const Layout layouts[] = { 29 /* symbol arrange function */ 30 { "[]=", tile }, /* first entry is default */ 31 @@ -61,6 +63,7 @@ static const char *termcmd[] = { "st", NULL }; 32 33 static Key keys[] = { 34 /* modifier key function argument */ 35 + { MODKEY|ControlMask, XK_f, toggleratiofullscr, {0} }, 36 { MODKEY, XK_p, spawn, {.v = dmenucmd } }, 37 { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, 38 { MODKEY, XK_b, togglebar, {0} }, 39 diff --git a/dwm.c b/dwm.c 40 index 3c94e4b..7b19235 100644 41 --- a/dwm.c 42 +++ b/dwm.c 43 @@ -211,6 +211,7 @@ static void tagmon(const Arg *arg); 44 static void tile(Monitor *); 45 static void togglebar(const Arg *arg); 46 static void togglefloating(const Arg *arg); 47 +static void toggleratiofullscr(const Arg *arg); 48 static void toggletag(const Arg *arg); 49 static void toggleview(const Arg *arg); 50 static void unfocus(Client *c, int setfocus); 51 @@ -802,7 +803,9 @@ focus(Client *c) 52 detachstack(c); 53 attachstack(c); 54 grabbuttons(c, 1); 55 - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); 56 + if (!c->isfullscreen) { 57 + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); 58 + } 59 setfocus(c); 60 } else { 61 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); 62 @@ -1482,10 +1485,49 @@ setfullscreen(Client *c, int fullscreen) 63 if (fullscreen && !c->isfullscreen) { 64 XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, 65 PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); 66 - c->isfullscreen = 1; 67 + c->isfullscreen = fullscreen; 68 c->oldstate = c->isfloating; 69 + c->oldbw = c->bw; 70 + c->bw = 0; 71 c->isfloating = 1; 72 - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh, 0); 73 + int nx, ny, nw, nh, bw; 74 + if (fullscreen == 1) { 75 + nx = c->mon->mx; 76 + ny = c->mon->my; 77 + nw = c->mon->mw; 78 + nh = c->mon->mh; 79 + bw = 0; 80 + } else if (fullscreen == 2) { 81 + if ((nw = c->w * c->mon->mh / c->h) < c->mon->mw) { 82 + nh = c->mon->mh; 83 + nx = (c->mon->mw - nw) / 2; 84 + if (!ratiofullscreenborders) { 85 + ny = c->mon->my; 86 + bw = 0; 87 + } else { 88 + ny = -nx; 89 + bw = nx; 90 + nx = 0; 91 + } 92 + } else { 93 + nw = c->mon->mw; 94 + nh = c->h * c->mon->mw / c->w; 95 + ny = (c->mon->mh - nh) / 2; 96 + if (!ratiofullscreenborders) { 97 + nx = c->mon->mx; 98 + bw = 0; 99 + } else { 100 + nx = -ny; 101 + bw = ny; 102 + ny = 0; 103 + } 104 + } 105 + XSetWindowBorder(dpy, c->win, BlackPixel(dpy, screen)); 106 + } else { 107 + printf("Invalid argument (%d) provided to setfullscreen", fullscreen); 108 + return; 109 + } 110 + resizeclient(c, nx, ny, nw, nh, bw); 111 XRaiseWindow(dpy, c->win); 112 } else if (!fullscreen && c->isfullscreen){ 113 XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, 114 @@ -1498,6 +1540,7 @@ setfullscreen(Client *c, int fullscreen) 115 c->h = c->oldh; 116 c->bw = c->oldbw; 117 resizeclient(c, c->x, c->y, c->w, c->h, c->bw); 118 + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); 119 arrange(c->mon); 120 } 121 } 122 @@ -1730,6 +1773,13 @@ togglefloating(const Arg *arg) 123 arrange(selmon); 124 } 125 126 +void 127 +toggleratiofullscr(const Arg *arg) 128 +{ 129 + if(selmon->sel) 130 + setfullscreen(selmon->sel, !selmon->sel->isfullscreen * 2); 131 +} 132 + 133 void 134 toggletag(const Arg *arg) 135 { 136 @@ -1763,7 +1813,9 @@ unfocus(Client *c, int setfocus) 137 if (!c) 138 return; 139 grabbuttons(c, 0); 140 - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); 141 + if (!c->isfullscreen) { 142 + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); 143 + } 144 if (setfocus) { 145 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); 146 XDeleteProperty(dpy, root, netatom[NetActiveWindow]); 147 -- 148 2.32.0 149