dwm-clientopacity-20220612-d3f93c7.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-clientopacity-20220612-d3f93c7.diff (6055B)
       ---
            1 From d59a5a5409e4078c2c1b5ead786e1312d431c9a8 Mon Sep 17 00:00:00 2001
            2 From: blatzfab <fabian.blatz@hansgrohe.com>
            3 Date: Sun, 12 Jun 2022 18:42:28 +0200
            4 Subject: [PATCH] [PATCH] adds opacity on a per client basis
            5 
            6 ---
            7  config.def.h | 10 +++++++---
            8  dwm.c        | 37 ++++++++++++++++++++++++++++++++++++-
            9  2 files changed, 43 insertions(+), 4 deletions(-)
           10 
           11 diff --git a/config.def.h b/config.def.h
           12 index a2ac963..4b6903c 100644
           13 --- a/config.def.h
           14 +++ b/config.def.h
           15 @@ -5,6 +5,7 @@ static const unsigned int borderpx  = 1;        /* border pixel of windows */
           16  static const unsigned int snap      = 32;       /* snap pixel */
           17  static const int showbar            = 1;        /* 0 means no bar */
           18  static const int topbar             = 1;        /* 0 means bottom bar */
           19 +static const double defaultopacity  = 0.75;
           20  static const char *fonts[]          = { "monospace:size=10" };
           21  static const char dmenufont[]       = "monospace:size=10";
           22  static const char col_gray1[]       = "#222222";
           23 @@ -26,9 +27,10 @@ static const Rule rules[] = {
           24           *        WM_CLASS(STRING) = instance, class
           25           *        WM_NAME(STRING) = title
           26           */
           27 -        /* class      instance    title       tags mask     isfloating   monitor */
           28 -        { "Gimp",     NULL,       NULL,       0,            1,           -1 },
           29 -        { "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 },
           30 +        /* class      instance    title       tags mask     isfloating         opacity        monitor */
           31 +        { "Gimp",     NULL,       NULL,       0,            1,           1.0,                -1 },
           32 +        { "Firefox",  NULL,       NULL,       1 << 8,       0,           1.0,                -1 },
           33 +        { "St",              NULL,       NULL,       0,            0,           defaultopacity, -1},
           34  };
           35  
           36  /* layout(s) */
           37 @@ -85,6 +87,8 @@ static Key keys[] = {
           38          { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
           39          { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
           40          { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
           41 +        { MODKEY|ShiftMask,                XK_KP_Add, changeopacity,        {.f = +0.1}},
           42 +        { MODKEY|ShiftMask,                XK_KP_Subtract, changeopacity,  {.f = -0.1}},
           43          TAGKEYS(                        XK_1,                      0)
           44          TAGKEYS(                        XK_2,                      1)
           45          TAGKEYS(                        XK_3,                      2)
           46 diff --git a/dwm.c b/dwm.c
           47 index 5646a5c..591dff9 100644
           48 --- a/dwm.c
           49 +++ b/dwm.c
           50 @@ -62,7 +62,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
           51  enum { SchemeNorm, SchemeSel }; /* color schemes */
           52  enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
           53         NetWMFullscreen, NetActiveWindow, NetWMWindowType,
           54 -       NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
           55 +       NetWMWindowTypeDialog, NetClientList, NetWMWindowsOpacity, NetLast }; /* EWMH atoms */
           56  enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
           57  enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
           58         ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
           59 @@ -95,6 +95,7 @@ struct Client {
           60          int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
           61          Client *next;
           62          Client *snext;
           63 +        double opacity;
           64          Monitor *mon;
           65          Window win;
           66  };
           67 @@ -138,6 +139,7 @@ typedef struct {
           68          const char *title;
           69          unsigned int tags;
           70          int isfloating;
           71 +        double opacity;
           72          int monitor;
           73  } Rule;
           74  
           75 @@ -149,6 +151,7 @@ static void arrangemon(Monitor *m);
           76  static void attach(Client *c);
           77  static void attachstack(Client *c);
           78  static void buttonpress(XEvent *e);
           79 +static void changeopacity(const Arg *arg);
           80  static void checkotherwm(void);
           81  static void cleanup(void);
           82  static void cleanupmon(Monitor *mon);
           83 @@ -185,6 +188,7 @@ static void monocle(Monitor *m);
           84  static void motionnotify(XEvent *e);
           85  static void movemouse(const Arg *arg);
           86  static Client *nexttiled(Client *c);
           87 +static void opacity(Client *c, double opacity);
           88  static void pop(Client *);
           89  static void propertynotify(XEvent *e);
           90  static void quit(const Arg *arg);
           91 @@ -288,6 +292,7 @@ applyrules(Client *c)
           92          /* rule matching */
           93          c->isfloating = 0;
           94          c->tags = 0;
           95 +        c->opacity = defaultopacity;
           96          XGetClassHint(dpy, c->win, &ch);
           97          class    = ch.res_class ? ch.res_class : broken;
           98          instance = ch.res_name  ? ch.res_name  : broken;
           99 @@ -300,6 +305,7 @@ applyrules(Client *c)
          100                  {
          101                          c->isfloating = r->isfloating;
          102                          c->tags |= r->tags;
          103 +                        c->opacity = r->opacity;
          104                          for (m = mons; m && m->num != r->monitor; m = m->next);
          105                          if (m)
          106                                  c->mon = m;
          107 @@ -458,6 +464,21 @@ buttonpress(XEvent *e)
          108                          buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
          109  }
          110  
          111 +void
          112 +changeopacity(const Arg *arg)
          113 +{
          114 +        if (!selmon->sel)
          115 +                return;
          116 +        selmon->sel->opacity+=arg->f;
          117 +        if(selmon->sel->opacity > 1.0)
          118 +                selmon->sel->opacity = 1.0;
          119 +
          120 +        if(selmon->sel->opacity < 0)
          121 +                selmon->sel->opacity = 0;
          122 +
          123 +        opacity(selmon->sel, selmon->sel->opacity);
          124 +}
          125 +
          126  void
          127  checkotherwm(void)
          128  {
          129 @@ -1045,6 +1066,7 @@ manage(Window w, XWindowAttributes *wa)
          130                  c->mon = selmon;
          131                  applyrules(c);
          132          }
          133 +        opacity(c, c->opacity);
          134  
          135          if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
          136                  c->x = c->mon->mx + c->mon->mw - WIDTH(c);
          137 @@ -1206,6 +1228,18 @@ nexttiled(Client *c)
          138          return c;
          139  }
          140  
          141 +void
          142 +opacity(Client *c, double opacity)
          143 +{
          144 +        if(opacity >= 0 && opacity <= 1) {
          145 +                unsigned long real_opacity[] = { opacity * 0xffffffff };
          146 +                XChangeProperty(dpy, c->win, netatom[NetWMWindowsOpacity], XA_CARDINAL,
          147 +                                32, PropModeReplace, (unsigned char *)real_opacity,
          148 +                                1);
          149 +        } else
          150 +                XDeleteProperty(dpy, c->win, netatom[NetWMWindowsOpacity]);
          151 +}
          152 +
          153  void
          154  pop(Client *c)
          155  {
          156 @@ -1569,6 +1603,7 @@ setup(void)
          157          netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
          158          netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
          159          netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
          160 +        netatom[NetWMWindowsOpacity] = XInternAtom(dpy, "_NET_WM_WINDOW_OPACITY", False);
          161          /* init cursors */
          162          cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
          163          cursor[CurResize] = drw_cur_create(drw, XC_sizing);
          164 -- 
          165 2.36.1
          166