commit 8c1868f1eb9352af46903b3499e802754866fc4d
Author: AdamYuan <[email protected]>
Date:   Tue Aug 17 15:33:00 2021 +0800

    [dwm][patch][winicon] Use XRender (Picture) to composite icons

diff --git a/dwm.suckless.org/patches/winicon/dwm-winicon-6.2-v1.3.diff 
b/dwm.suckless.org/patches/winicon/dwm-winicon-6.2-v2.0.diff
similarity index 51%
rename from dwm.suckless.org/patches/winicon/dwm-winicon-6.2-v1.3.diff
rename to dwm.suckless.org/patches/winicon/dwm-winicon-6.2-v2.0.diff
index 27d5ce22..b8505f72 100644
--- a/dwm.suckless.org/patches/winicon/dwm-winicon-6.2-v1.3.diff
+++ b/dwm.suckless.org/patches/winicon/dwm-winicon-6.2-v2.0.diff
@@ -1,87 +1,177 @@
 diff --git a/config.def.h b/config.def.h
-index 1c0b587..5385e27 100644
+index 1c0b587..b68169e 100644
 --- a/config.def.h
 +++ b/config.def.h
 @@ -5,6 +5,8 @@ static const unsigned int borderpx  = 1;        /* border 
pixel of windows */
  static const unsigned int snap      = 32;       /* snap pixel */
  static const int showbar            = 1;        /* 0 means no bar */
  static const int topbar             = 1;        /* 0 means bottom bar */
-+#define ICONSIZE 20   /* icon size */
++#define ICONSIZE 16   /* icon size */
 +#define ICONSPACING 5 /* space between icon and title */
  static const char *fonts[]          = { "monospace:size=10" };
  static const char dmenufont[]       = "monospace:size=10";
  static const char col_gray1[]       = "#222222";
 diff --git a/config.mk b/config.mk
-index 6d36cb7..c5d08de 100644
+index 6d36cb7..48c38d9 100644
 --- a/config.mk
 +++ b/config.mk
-@@ -20,9 +20,12 @@ FREETYPEINC = /usr/include/freetype2
- # OpenBSD (uncomment)
- #FREETYPEINC = ${X11INC}/freetype2
+@@ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2
  
-+# Imlib2
-+IMLIB2LIBS = -lImlib2
-+
  # includes and libs
  INCS = -I${X11INC} -I${FREETYPEINC}
 -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
-+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${IMLIB2LIBS}
++LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender -lImlib2
  
  # flags
  CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 
-DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
 diff --git a/drw.c b/drw.c
-index 8fd1ca4..bb6cfab 100644
+index 8fd1ca4..e7e8f35 100644
 --- a/drw.c
 +++ b/drw.c
-@@ -2,6 +2,7 @@
- #include <stdio.h>
- #include <stdlib.h>
+@@ -4,6 +4,7 @@
  #include <string.h>
-+#include <stdint.h>
  #include <X11/Xlib.h>
  #include <X11/Xft/Xft.h>
++#include <Imlib2.h>
  
-@@ -378,6 +379,26 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned 
int h, unsigned int lp
-       return x + (render ? w : 0);
+ #include "drw.h"
+ #include "util.h"
+@@ -71,6 +72,7 @@ drw_create(Display *dpy, int screen, Window root, unsigned 
int w, unsigned int h
+       drw->w = w;
+       drw->h = h;
+       drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, 
screen));
++      drw->picture = XRenderCreatePicture(dpy, drw->drawable, 
XRenderFindVisualFormat(dpy, DefaultVisual(dpy, screen)), 0, NULL);
+       drw->gc = XCreateGC(dpy, root, 0, NULL);
+       XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
+ 
+@@ -85,14 +87,18 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
+ 
+       drw->w = w;
+       drw->h = h;
++      if (drw->picture)
++              XRenderFreePicture(drw->dpy, drw->picture);
+       if (drw->drawable)
+               XFreePixmap(drw->dpy, drw->drawable);
+       drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, 
DefaultDepth(drw->dpy, drw->screen));
++      drw->picture = XRenderCreatePicture(drw->dpy, drw->drawable, 
XRenderFindVisualFormat(drw->dpy, DefaultVisual(drw->dpy, drw->screen)), 0, 
NULL);
+ }
+ 
+ void
+ drw_free(Drw *drw)
+ {
++      XRenderFreePicture(drw->dpy, drw->picture);
+       XFreePixmap(drw->dpy, drw->drawable);
+       XFreeGC(drw->dpy, drw->gc);
+       free(drw);
+@@ -235,6 +241,66 @@ drw_setscheme(Drw *drw, Clr *scm)
+               drw->scheme = scm;
  }
  
-+static uint32_t blend(uint32_t p1rb, uint32_t p1g, uint32_t p2) {
-+      uint8_t a = p2 >> 24u;
-+      uint32_t rb = (p2 & 0xFF00FFu) + ( (a * p1rb) >> 8u );
-+      uint32_t g = (p2 & 0x00FF00u) + ( (a * p1g) >> 8u );
-+      return (rb & 0xFF00FFu) | (g & 0x00FF00u);
++Picture
++drw_create_resized_picture(Drw *drw, char *src, unsigned int srcw, unsigned 
int srch, unsigned int dstw, unsigned int dsth, char *tmp) {
++      Pixmap pm;
++      Picture pic;
++      GC gc;
++
++      if (srcw <= (dstw << 1u) && srch <= (dsth << 1u)) {
++              pm = XCreatePixmap(drw->dpy, drw->root, srcw, srch, 32);
++              XImage img = {
++                      srcw, srch, 0, ZPixmap, src,
++                      ImageByteOrder(drw->dpy), BitmapUnit(drw->dpy), 
BitmapBitOrder(drw->dpy), 32,
++                      32, 0, 32,
++                      0, 0, 0
++              };
++              XInitImage(&img);
++              gc = XCreateGC(drw->dpy, pm, 0, NULL);
++              XPutImage(drw->dpy, pm, gc, &img, 0, 0, 0, 0, srcw, srch);
++              XFreeGC(drw->dpy, gc);
++
++              pic = XRenderCreatePicture(drw->dpy, pm, 
XRenderFindStandardFormat(drw->dpy, PictStandardARGB32), 0, NULL);
++              XFreePixmap(drw->dpy, pm);
++
++              XRenderSetPictureFilter(drw->dpy, pic, FilterBilinear, NULL, 0);
++              XTransform xf;
++              xf.matrix[0][0] = (srcw << 16u) / dstw; xf.matrix[0][1] = 0; 
xf.matrix[0][2] = 0;
++              xf.matrix[1][0] = 0; xf.matrix[1][1] = (srch << 16u) / dsth; 
xf.matrix[1][2] = 0;
++              xf.matrix[2][0] = 0; xf.matrix[2][1] = 0; xf.matrix[2][2] = 
65536;
++              XRenderSetPictureTransform(drw->dpy, pic, &xf);
++      } else {
++              Imlib_Image origin = imlib_create_image_using_data(srcw, srch, 
(DATA32 *)src);
++              if (!origin) return None;
++              imlib_context_set_image(origin);
++              imlib_image_set_has_alpha(1);
++              Imlib_Image scaled = imlib_create_cropped_scaled_image(0, 0, 
srcw, srch, dstw, dsth);
++              imlib_free_image_and_decache();
++              if (!scaled) return None;
++              imlib_context_set_image(scaled);
++              imlib_image_set_has_alpha(1);
++              memcpy(tmp, imlib_image_get_data_for_reading_only(), (dstw * 
dsth) << 2);
++              imlib_free_image_and_decache();
++
++              pm = XCreatePixmap(drw->dpy, drw->root, dstw, dsth, 32);
++              XImage img = {
++                      dstw, dsth, 0, ZPixmap, tmp,
++                      ImageByteOrder(drw->dpy), BitmapUnit(drw->dpy), 
BitmapBitOrder(drw->dpy), 32,
++                      32, 0, 32,
++                      0, 0, 0
++              };
++              XInitImage(&img);
++              gc = XCreateGC(drw->dpy, pm, 0, NULL);
++              XPutImage(drw->dpy, pm, gc, &img, 0, 0, 0, 0, dstw, dsth);
++              XFreeGC(drw->dpy, gc);
++
++              pic = XRenderCreatePicture(drw->dpy, pm, 
XRenderFindStandardFormat(drw->dpy, PictStandardARGB32), 0, NULL);
++              XFreePixmap(drw->dpy, pm);
++      }
++
++      return pic;
 +}
 +
+ void
+ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, 
int invert)
+ {
+@@ -378,6 +444,14 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned 
int h, unsigned int lp
+       return x + (render ? w : 0);
+ }
+ 
 +void
-+drw_img(Drw *drw, int x, int y, XImage *img, uint32_t *tmp) 
++drw_pic(Drw *drw, int x, int y, unsigned int w, unsigned int h, Picture pic)
 +{
-+      if (!drw || !drw->scheme)
++      if (!drw)
 +              return;
-+      uint32_t *data = (uint32_t *)img->data, p = drw->scheme[ColBg].pixel, 
prb = p & 0xFF00FFu, pg = p & 0x00FF00u;
-+      int icsz = img->width * img->height, i;
-+      for (i = 0; i < icsz; ++i) tmp[i] = blend(prb, pg, data[i]);
-+      img->data = (char *) tmp;
-+      XPutImage(drw->dpy, drw->drawable, drw->gc, img, 0, 0, x, y, 
img->width, img->height);
-+      img->data = (char *) data;
++      XRenderComposite(drw->dpy, PictOpOver, pic, None, drw->picture, 0, 0, 
0, 0, x, y, w, h);
 +}
 +
  void
  drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
  {
 diff --git a/drw.h b/drw.h
-index 4bcd5ad..07b6433 100644
+index 4bcd5ad..695b300 100644
 --- a/drw.h
 +++ b/drw.h
-@@ -52,6 +52,7 @@ void drw_setscheme(Drw *drw, Clr *scm);
+@@ -21,6 +21,7 @@ typedef struct {
+       int screen;
+       Window root;
+       Drawable drawable;
++      Picture picture;
+       GC gc;
+       Clr *scheme;
+       Fnt *fonts;
+@@ -49,9 +50,12 @@ void drw_cur_free(Drw *drw, Cur *cursor);
+ void drw_setfontset(Drw *drw, Fnt *set);
+ void drw_setscheme(Drw *drw, Clr *scm);
+ 
++Picture drw_create_resized_picture(Drw *drw, char *src, unsigned int src_w, 
unsigned int src_h, unsigned int dst_w, unsigned int dst_h, char *tmp);
++
  /* Drawing functions */
  void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int 
filled, int invert);
  int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned 
int lpad, const char *text, int invert);
-+void drw_img(Drw *drw, int x, int y, XImage *img, uint32_t *tmp);
++void drw_pic(Drw *drw, int x, int y, unsigned int w, unsigned int h, Picture 
pic);
  
  /* 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 4465af1..b02a80c 100644
+index 4465af1..a1b260e 100644
 --- a/dwm.c
 +++ b/dwm.c
 @@ -28,6 +28,8 @@
@@ -93,15 +183,7 @@ index 4465af1..b02a80c 100644
  #include <sys/types.h>
  #include <sys/wait.h>
  #include <X11/cursorfont.h>
-@@ -40,6 +42,7 @@
- #include <X11/extensions/Xinerama.h>
- #endif /* XINERAMA */
- #include <X11/Xft/Xft.h>
-+#include <Imlib2.h>
- 
- #include "drw.h"
- #include "util.h"
-@@ -60,7 +63,7 @@
+@@ -60,7 +62,7 @@
  /* enums */
  enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
  enum { SchemeNorm, SchemeSel }; /* color schemes */
@@ -110,23 +192,23 @@ index 4465af1..b02a80c 100644
         NetWMFullscreen, NetActiveWindow, NetWMWindowType,
         NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
  enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default 
atoms */
-@@ -93,6 +96,7 @@ struct Client {
+@@ -93,6 +95,7 @@ struct Client {
        int bw, oldbw;
        unsigned int tags;
        int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
-+      XImage *icon;
++      unsigned int icw, ich; Picture icon;
        Client *next;
        Client *snext;
        Monitor *mon;
-@@ -171,6 +175,7 @@ static void focusmon(const Arg *arg);
+@@ -169,6 +172,7 @@ static void focus(Client *c);
+ static void focusin(XEvent *e);
+ static void focusmon(const Arg *arg);
  static void focusstack(const Arg *arg);
++static Picture geticonprop(Window w, unsigned int *icw, unsigned int *ich);
  static int getrootptr(int *x, int *y);
  static long getstate(Window w);
-+static XImage *geticonprop(Window win);
  static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
- static void grabbuttons(Client *c, int focused);
- static void grabkeys(void);
-@@ -213,6 +218,7 @@ static void togglebar(const Arg *arg);
+@@ -213,6 +217,7 @@ static void togglebar(const Arg *arg);
  static void togglefloating(const Arg *arg);
  static void toggletag(const Arg *arg);
  static void toggleview(const Arg *arg);
@@ -134,7 +216,7 @@ index 4465af1..b02a80c 100644
  static void unfocus(Client *c, int setfocus);
  static void unmanage(Client *c, int destroyed);
  static void unmapnotify(XEvent *e);
-@@ -224,6 +230,7 @@ static void updatenumlockmask(void);
+@@ -224,6 +229,7 @@ static void updatenumlockmask(void);
  static void updatesizehints(Client *c);
  static void updatestatus(void);
  static void updatetitle(Client *c);
@@ -142,30 +224,29 @@ index 4465af1..b02a80c 100644
  static void updatewindowtype(Client *c);
  static void updatewmhints(Client *c);
  static void view(const Arg *arg);
-@@ -731,7 +738,9 @@ drawbar(Monitor *m)
+@@ -731,7 +737,8 @@ drawbar(Monitor *m)
        if ((w = m->ww - sw - x) > bh) {
                if (m->sel) {
                        drw_setscheme(drw, scheme[m == selmon ? SchemeSel : 
SchemeNorm]);
 -                      drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
-+                      drw_text(drw, x, 0, w, bh, lrpad / 2 + (m->sel->icon ? 
m->sel->icon->width + ICONSPACING : 0), m->sel->name, 0);
-+                      static uint32_t tmp[ICONSIZE * ICONSIZE];
-+                      if (m->sel->icon) drw_img(drw, x + lrpad / 2, (bh - 
m->sel->icon->height) / 2, m->sel->icon, tmp);
++                      drw_text(drw, x, 0, w, bh, lrpad / 2 + (m->sel->icon ? 
m->sel->icw + ICONSPACING : 0), m->sel->name, 0);
++                      if (m->sel->icon) drw_pic(drw, x + lrpad / 2, (bh - 
m->sel->ich) / 2, m->sel->icw, m->sel->ich, m->sel->icon);
                        if (m->sel->isfloating)
                                drw_rect(drw, x + boxs, boxs, boxw, boxw, 
m->sel->isfixed, 0);
                } else {
-@@ -899,6 +908,85 @@ getstate(Window w)
-       return result;
+@@ -871,6 +878,68 @@ getatomprop(Client *c, Atom prop)
+       return atom;
  }
  
 +static uint32_t prealpha(uint32_t p) {
 +      uint8_t a = p >> 24u;
 +      uint32_t rb = (a * (p & 0xFF00FFu)) >> 8u;
 +      uint32_t g = (a * (p & 0x00FF00u)) >> 8u;
-+      return (rb & 0xFF00FFu) | (g & 0x00FF00u) | ((~a) << 24u);
++      return (rb & 0xFF00FFu) | (g & 0x00FF00u) | (a << 24u);
 +}
 +
-+XImage *
-+geticonprop(Window win)
++Picture
++geticonprop(Window win, unsigned int *picw, unsigned int *pich)
 +{
 +      int format;
 +      unsigned long n, extra, *p = NULL;
@@ -173,34 +254,32 @@ index 4465af1..b02a80c 100644
 +
 +      if (XGetWindowProperty(dpy, win, netatom[NetWMIcon], 0L, LONG_MAX, 
False, AnyPropertyType, 
 +                                                 &real, &format, &n, &extra, 
(unsigned char **)&p) != Success)
-+              return NULL; 
-+      if (n == 0 || format != 32) { XFree(p); return NULL; }
++              return None; 
++      if (n == 0 || format != 32) { XFree(p); return None; }
 +
 +      unsigned long *bstp = NULL;
 +      uint32_t w, h, sz;
-+
 +      {
-+              const unsigned long *end = p + n;
-+              unsigned long *i;
++              unsigned long *i; const unsigned long *end = p + n;
 +              uint32_t bstd = UINT32_MAX, d, m;
 +              for (i = p; i < end - 1; i += sz) {
-+                      if ((w = *i++) > UINT16_MAX || (h = *i++) > UINT16_MAX) 
{ XFree(p); return NULL; }
++                      if ((w = *i++) > UINT16_MAX || (h = *i++) > UINT16_MAX) 
{ XFree(p); return None; }
 +                      if ((sz = w * h) > end - i) break;
 +                      if ((m = w > h ? w : h) >= ICONSIZE && (d = m - 
ICONSIZE) < bstd) { bstd = d; bstp = i; }
 +              }
 +              if (!bstp) {
 +                      for (i = p; i < end - 1; i += sz) {
-+                              if ((w = *i++) > UINT16_MAX || (h = *i++) > 
UINT16_MAX) { XFree(p); return NULL; }
++                              if ((w = *i++) > UINT16_MAX || (h = *i++) > 
UINT16_MAX) { XFree(p); return None; }
 +                              if ((sz = w * h) > end - i) break;
 +                              if ((d = ICONSIZE - (w > h ? w : h)) < bstd) { 
bstd = d; bstp = i; }
 +                      }
 +              }
-+              if (!bstp) { XFree(p); return NULL; }
++              if (!bstp) { XFree(p); return None; }
 +      }
 +
-+      if ((w = *(bstp - 2)) == 0 || (h = *(bstp - 1)) == 0) { XFree(p); 
return NULL; }
++      if ((w = *(bstp - 2)) == 0 || (h = *(bstp - 1)) == 0) { XFree(p); 
return None; }
 +
-+      uint32_t icw, ich, icsz;
++      uint32_t icw, ich;
 +      if (w <= h) {
 +              ich = ICONSIZE; icw = w * ICONSIZE / h;
 +              if (icw == 0) icw = 1;
@@ -209,46 +288,30 @@ index 4465af1..b02a80c 100644
 +              icw = ICONSIZE; ich = h * ICONSIZE / w;
 +              if (ich == 0) ich = 1;
 +      }
-+      icsz = icw * ich;
++      *picw = icw; *pich = ich;
 +
-+      uint32_t i;
-+#if ULONG_MAX > UINT32_MAX
-+      uint32_t *bstp32 = (uint32_t *)bstp;
-+      for (sz = w * h, i = 0; i < sz; ++i) bstp32[i] = bstp[i];
-+#endif
-+      uint32_t *icbuf = malloc(icsz << 2); if(!icbuf) { XFree(p); return 
NULL; }
-+      if (w == icw && h == ich) memcpy(icbuf, bstp, icsz << 2);
-+      else {
-+              Imlib_Image origin = imlib_create_image_using_data(w, h, 
(DATA32 *)bstp);
-+              if (!origin) { XFree(p); free(icbuf); return NULL; }
-+              imlib_context_set_image(origin);
-+              imlib_image_set_has_alpha(1);
-+              Imlib_Image scaled = imlib_create_cropped_scaled_image(0, 0, w, 
h, icw, ich);
-+              imlib_free_image_and_decache();
-+              if (!scaled) { XFree(p); free(icbuf); return NULL; }
-+              imlib_context_set_image(scaled);
-+              imlib_image_set_has_alpha(1);
-+              memcpy(icbuf, imlib_image_get_data_for_reading_only(), icsz << 
2);
-+              imlib_free_image_and_decache();
-+      }
++      uint32_t i, *bstp32 = (uint32_t *)bstp;
++      for (sz = w * h, i = 0; i < sz; ++i) bstp32[i] = prealpha(bstp[i]);
++
++      static char tmp[ICONSIZE * ICONSIZE << 2];
++      Picture ret = drw_create_resized_picture(drw, (char *)bstp, w, h, icw, 
ich, tmp);
 +      XFree(p);
-+      for (i = 0; i < icsz; ++i) icbuf[i] = prealpha(icbuf[i]);
-+      return XCreateImage(dpy, DefaultVisual(dpy, screen), DefaultDepth(dpy, 
screen), ZPixmap, 0, (char *)icbuf, icw, ich, 32, 0);
++
++      return ret;
 +}
 +
  int
- gettextprop(Window w, Atom atom, char *text, unsigned int size)
+ getrootptr(int *x, int *y)
  {
-@@ -1030,6 +1118,8 @@ manage(Window w, XWindowAttributes *wa)
+@@ -1030,6 +1099,7 @@ manage(Window w, XWindowAttributes *wa)
        c->h = c->oldh = wa->height;
        c->oldbw = wa->border_width;
  
-+      c->icon = NULL;
 +      updateicon(c);
        updatetitle(c);
        if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
                c->mon = t->mon;
-@@ -1240,6 +1330,11 @@ propertynotify(XEvent *e)
+@@ -1240,6 +1310,11 @@ propertynotify(XEvent *e)
                        if (c == c->mon->sel)
                                drawbar(c->mon);
                }
@@ -260,7 +323,7 @@ index 4465af1..b02a80c 100644
                if (ev->atom == netatom[NetWMWindowType])
                        updatewindowtype(c);
        }
-@@ -1556,6 +1651,7 @@ setup(void)
+@@ -1556,6 +1631,7 @@ setup(void)
        netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", 
False);
        netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
        netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
@@ -268,7 +331,7 @@ index 4465af1..b02a80c 100644
        netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
        netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", 
False);
        netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", 
False);
-@@ -1746,6 +1842,15 @@ toggleview(const Arg *arg)
+@@ -1746,6 +1822,15 @@ toggleview(const Arg *arg)
        }
  }
  
@@ -276,15 +339,15 @@ index 4465af1..b02a80c 100644
 +freeicon(Client *c)
 +{
 +      if (c->icon) {
-+              XDestroyImage(c->icon);
-+              c->icon = NULL;
++              XRenderFreePicture(dpy, c->icon);
++              c->icon = None;
 +      }
 +}
 +
  void
  unfocus(Client *c, int setfocus)
  {
-@@ -1767,6 +1872,7 @@ unmanage(Client *c, int destroyed)
+@@ -1767,6 +1852,7 @@ unmanage(Client *c, int destroyed)
  
        detach(c);
        detachstack(c);
@@ -292,7 +355,7 @@ index 4465af1..b02a80c 100644
        if (!destroyed) {
                wc.border_width = c->oldbw;
                XGrabServer(dpy); /* avoid race conditions */
-@@ -2001,6 +2107,13 @@ updatetitle(Client *c)
+@@ -2001,6 +2087,13 @@ updatetitle(Client *c)
                strcpy(c->name, broken);
  }
  
@@ -300,7 +363,7 @@ index 4465af1..b02a80c 100644
 +updateicon(Client *c)
 +{
 +      freeicon(c);
-+      c->icon = geticonprop(c->win);
++      c->icon = geticonprop(c->win, &c->icw, &c->ich);
 +}
 +
  void
diff --git a/dwm.suckless.org/patches/winicon/index.md 
b/dwm.suckless.org/patches/winicon/index.md
index a3dac4e8..b6641732 100644
--- a/dwm.suckless.org/patches/winicon/index.md
+++ b/dwm.suckless.org/patches/winicon/index.md
@@ -27,42 +27,19 @@ Configuration
 
 Download
 --------
-* [dwm-winicon-6.2-v1.3.diff](dwm-winicon-6.2-v1.3.diff) (2021-07-23)
+* [dwm-winicon-6.2-v2.0.diff](dwm-winicon-6.2-v2.0.diff) (2021-08-17)
 
 Alpha Patch
 -----------
-If you also use [alpha patch](https://dwm.suckless.org/patches/alpha/), some 
changes are needed to make this patch work properly.
-
-After applying both patches,
-* change the last return statement in **geticonprop** function (dwm.c) to
-
-               return XCreateImage(drw->dpy, drw->visual, drw->depth, ZPixmap, 
0, (char *)icbuf, icw, ich, 32, 0);
-
-* change **drw_img** and **blend** function (drw.c) to
-
-       inline static uint8_t div255(uint16_t x) { return (x*0x8081u) >> 23u; }
-       inline static uint32_t blend(uint32_t p1rb, uint32_t p1g, uint8_t p1a, 
uint32_t p2) {
-               uint8_t a = p2 >> 24u;
-               uint32_t rb = (p2 & 0xFF00FFu) + ( (a * p1rb) >> 8u );
-               uint32_t g = (p2 & 0x00FF00u) + ( (a * p1g) >> 8u );
-               return (rb & 0xFF00FFu) | (g & 0x00FF00u) | div255(~a * 255u + 
a * p1a) << 24u;
-       }
-               
-       void
-       drw_img(Drw *drw, int x, int y, XImage *img, uint32_t *tmp) 
-       {
-               if (!drw || !drw->scheme)
-                       return;
-               uint32_t *data = (uint32_t *)img->data, p = 
drw->scheme[ColBg].pixel,
-                                prb = p & 0xFF00FFu, pg = p & 0x00FF00u;
-               uint8_t pa = p >> 24u;
-               int icsz = img->width * img->height, i;
-               for (i = 0; i < icsz; ++i) tmp[i] = blend(prb, pg, pa, data[i]);
-       
-               img->data = (char *) tmp;
-               XPutImage(drw->dpy, drw->drawable, drw->gc, img, 0, 0, x, y, 
img->width, img->height);
-               img->data = (char *) data;
-       }
+If you also use [alpha patch](https://dwm.suckless.org/patches/alpha/), some 
modifications are needed to make dwm work correctly.
+* Replace (in drw.c, drw_create function)
+       drw->picture = XRenderCreatePicture(dpy, drw->drawable, 
XRenderFindVisualFormat(dpy, DefaultVisual(dpy, screen)), 0, NULL);
+with 
+       drw->picture = XRenderCreatePicture(dpy, drw->drawable, 
XRenderFindVisualFormat(dpy, visual), 0, NULL);
+* Replace (in drw.c, drw_resize function)
+       drw->picture = XRenderCreatePicture(drw->dpy, drw->drawable, 
XRenderFindVisualFormat(drw->dpy, DefaultVisual(drw->dpy, drw->screen)), 0, 
NULL);
+with 
+       drw->picture = XRenderCreatePicture(drw->dpy, drw->drawable, 
XRenderFindVisualFormat(drw->dpy, drw->visual), 0, NULL);
 
 Author
 ------


Reply via email to