dwm-ratiofullscreen-20210723-e493493.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       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