From 7d6a517f890828b497fcfe28f8d10d5bced4bc3e Mon Sep 17 00:00:00 2001 From: Bakkeby Date: Mon, 10 Jan 2022 11:31:15 +0100 Subject: [PATCH] fakefullscreenclient - enable fake fullscreen on a per client basis --- config.def.h | 1 + dwm.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/config.def.h b/config.def.h index a2ac963..7e6b2ff 100644 --- a/config.def.h +++ b/config.def.h @@ -78,6 +78,7 @@ static Key keys[] = { { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_f, togglefakefullscreen, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, diff --git a/dwm.c b/dwm.c index a96f33c..b95f50f 100644 --- a/dwm.c +++ b/dwm.c @@ -93,6 +93,7 @@ struct Client { int bw, oldbw; unsigned int tags; int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + int fakefullscreen; Client *next; Client *snext; Monitor *mon; @@ -211,6 +212,7 @@ static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void tile(Monitor *); static void togglebar(const Arg *arg); +static void togglefakefullscreen(const Arg *arg); static void togglefloating(const Arg *arg); static void toggletag(const Arg *arg); static void toggleview(const Arg *arg); @@ -566,7 +568,7 @@ configurenotify(XEvent *e) updatebars(); for (m = mons; m; m = m->next) { for (c = m->clients; c; c = c->next) - if (c->isfullscreen) + if (c->isfullscreen && c->fakefullscreen != 1) resizeclient(c, m->mx, m->my, m->mw, m->mh); XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); } @@ -1147,7 +1149,7 @@ movemouse(const Arg *arg) if (!(c = selmon->sel)) return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ + if (c->isfullscreen && c->fakefullscreen != 1) /* no support moving fullscreen windows by mouse */ return; restack(selmon); ocx = c->x; @@ -1288,7 +1290,10 @@ resizeclient(Client *c, int x, int y, int w, int h) wc.border_width = c->bw; XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); configure(c); - XSync(dpy, False); + if (c->fakefullscreen == 1) + XSync(dpy, True); + else + XSync(dpy, False); } void @@ -1302,7 +1307,7 @@ resizemouse(const Arg *arg) if (!(c = selmon->sel)) return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ + if (c->isfullscreen && c->fakefullscreen != 1) /* no support resizing fullscreen windows by mouse */ return; restack(selmon); ocx = c->x; @@ -1480,8 +1485,10 @@ setfullscreen(Client *c, int fullscreen) XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); c->isfullscreen = 1; - c->oldstate = c->isfloating; c->oldbw = c->bw; + if (c->fakefullscreen == 1) + return; + c->oldstate = c->isfloating; c->bw = 0; c->isfloating = 1; resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); @@ -1490,8 +1497,12 @@ setfullscreen(Client *c, int fullscreen) XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, PropModeReplace, (unsigned char*)0, 0); c->isfullscreen = 0; - c->isfloating = c->oldstate; c->bw = c->oldbw; + if (c->fakefullscreen == 1) + return; + if (c->fakefullscreen == 2) + c->fakefullscreen = 1; + c->isfloating = c->oldstate; c->x = c->oldx; c->y = c->oldy; c->w = c->oldw; @@ -1711,12 +1722,48 @@ togglebar(const Arg *arg) arrange(selmon); } +void +togglefakefullscreen(const Arg *arg) +{ + Client *c = selmon->sel; + if (!c) + return; + + if (c->fakefullscreen) { + if (c->isfullscreen) { + if (c->isfloating && c->fakefullscreen == 1) { + c->oldstate = c->isfloating; + c->oldx = c->x; + c->oldy = c->y; + c->oldw = c->w; + c->oldh = c->h; + } + c->fakefullscreen = 0; + } + else + c->isfullscreen = 0; + } else { + c->fakefullscreen = 1; + if (c->isfullscreen) { + c->isfloating = c->oldstate; + c->bw = c->oldbw; + c->x = c->oldx; + c->y = c->oldy; + c->w = c->oldw; + c->h = c->oldh; + resizeclient(c, c->x, c->y, c->w, c->h); + } + c->isfullscreen = 0; + } + setfullscreen(c, !c->isfullscreen); +} + void togglefloating(const Arg *arg) { if (!selmon->sel) return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ + if (selmon->sel->isfullscreen && selmon->sel->fakefullscreen != 1) /* no support for fullscreen windows */ return; selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; if (selmon->sel->isfloating) -- 2.19.1