summaryrefslogtreecommitdiffhomepage
path: root/patch
diff options
context:
space:
mode:
authorbakkeby <[email protected]>2021-07-27 13:40:53 +0200
committerbakkeby <[email protected]>2021-07-27 13:40:53 +0200
commitf8ae6714db02a42856c07066f689136999f6ad77 (patch)
tree06a753cb58aa7ef3526afdf5d0325e2a520b5de9 /patch
parentd72bc90cdc231ebf71530d1cd17e63b5cdf8eb96 (diff)
downloaddwm-flexipatch-f8ae6714db02a42856c07066f689136999f6ad77.tar.gz
dwm-flexipatch-f8ae6714db02a42856c07066f689136999f6ad77.zip
Adding winicon patch
Diffstat (limited to 'patch')
-rw-r--r--patch/bar_awesomebar.c8
-rw-r--r--patch/bar_fancybar.c21
-rw-r--r--patch/bar_flexwintitle.c7
-rw-r--r--patch/bar_tabgroups.c7
-rw-r--r--patch/bar_winicon.c146
-rw-r--r--patch/bar_winicon.h8
-rw-r--r--patch/bar_wintitle.c19
-rw-r--r--patch/include.c3
-rw-r--r--patch/include.h3
9 files changed, 216 insertions, 6 deletions
diff --git a/patch/bar_awesomebar.c b/patch/bar_awesomebar.c
index 9e6bc97..b02c6e7 100644
--- a/patch/bar_awesomebar.c
+++ b/patch/bar_awesomebar.c
@@ -46,7 +46,15 @@ draw_awesomebar(Bar *bar, BarArg *a)
#endif // BAR_CENTEREDWINDOWNAME_PATCH
drw_setscheme(drw, scheme[scm]);
+
+ #if BAR_WINICON_PATCH
+ drw_text(drw, x, a->y, tabw + (i < remainder ? 1 : 0), a->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False);
+ if (c->icon)
+ drw_img(drw, x + pad, a->y + (a->h - c->icon->height) / 2, c->icon, tmpicon);
+ #else
drw_text(drw, x, a->y, tabw + (i < remainder ? 1 : 0), a->h, pad, c->name, 0, False);
+ #endif // BAR_WINICON_PATCH
+
drawstateindicator(c->mon, c, 1, x, a->y, tabw + (i < remainder ? 1 : 0), a->h, 0, 0, c->isfixed);
x += tabw + (i < remainder ? 1 : 0);
}
diff --git a/patch/bar_fancybar.c b/patch/bar_fancybar.c
index 3017161..10bac83 100644
--- a/patch/bar_fancybar.c
+++ b/patch/bar_fancybar.c
@@ -29,6 +29,10 @@ draw_fancybar(Bar *bar, BarArg *a)
if (n > 0) {
ftw = TEXTW(m->sel->name);
+ #if BAR_WINICON_PATCH
+ if (m->sel->icon)
+ ftw += m->sel->icon->width + ICONSPACING;
+ #endif // BAR_WINICON_PATCH
mw = (ftw >= w || n == 1) ? 0 : (w - ftw) / (n - 1);
i = 0;
@@ -37,6 +41,10 @@ draw_fancybar(Bar *bar, BarArg *a)
if (!ISVISIBLE(c) || c == m->sel)
continue;
ftw = TEXTW(c->name);
+ #if BAR_WINICON_PATCH
+ if (c->icon)
+ ftw += c->icon->width + ICONSPACING;
+ #endif // BAR_WINICON_PATCH
if (ftw < mw)
ew += (mw - ftw);
else
@@ -51,8 +59,19 @@ draw_fancybar(Bar *bar, BarArg *a)
continue;
ftw = MIN(m->sel == c ? w : mw, TEXTW(c->name));
drw_setscheme(drw, scheme[m->sel == c ? SchemeTitleSel : SchemeTitleNorm]);
- if (ftw > 0) /* trap special handling of 0 in drw_text */
+ if (ftw > 0) { /* trap special handling of 0 in drw_text */
+
+ drw_text(drw, x, a->y, ftw, a->h, lrpad / 2, c->name, 0, False);
+
+ #if BAR_WINICON_PATCH
+ drw_text(drw, x, a->y, ftw, a->h, lrpad / 2 + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False);
+ if (c->icon)
+ drw_img(drw, x + lrpad / 2, a->y + (a->h - c->icon->height) / 2, c->icon, tmpicon);
+ #else
drw_text(drw, x, a->y, ftw, a->h, lrpad / 2, c->name, 0, False);
+ #endif // BAR_WINICON_PATCH
+
+ }
drawstateindicator(c->mon, c, 1, x, a->y, ftw, a->h, 0, 0, c->isfixed);
x += ftw;
w -= ftw;
diff --git a/patch/bar_flexwintitle.c b/patch/bar_flexwintitle.c
index 8d650e1..0e17443 100644
--- a/patch/bar_flexwintitle.c
+++ b/patch/bar_flexwintitle.c
@@ -191,7 +191,14 @@ flextitledraw(Monitor *m, Client *c, int unused, int x, int w, int tabscheme, Ar
pad = (w - TEXTW(c->name) + lrpad) / 2;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
+ #if BAR_WINICON_PATCH
+ drw_text(drw, x, barg->y, w, barg->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False);
+ if (c->icon)
+ drw_img(drw, x + pad, barg->y + (barg->h - c->icon->height) / 2, c->icon, tmpicon);
+ #else
drw_text(drw, x, barg->y, w, barg->h, pad, c->name, 0, False);
+ #endif // BAR_WINICON_PATCH
+
drawstateindicator(m, c, 1, x + 2, barg->y, w, barg->h, 0, 0, 0);
if (FLEXWINTITLE_BORDERS) {
diff --git a/patch/bar_tabgroups.c b/patch/bar_tabgroups.c
index 91e1393..1498bc2 100644
--- a/patch/bar_tabgroups.c
+++ b/patch/bar_tabgroups.c
@@ -62,7 +62,14 @@ bartabdraw(Monitor *m, Client *c, int unused, int x, int w, int groupactive, Arg
pad = (w - TEXTW(c->name) + lrpad) / 2;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
+ #if BAR_WINICON_PATCH
+ drw_text(drw, x, barg->y, w, barg->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False);
+ if (c->icon)
+ drw_img(drw, x + pad, barg->y + (barg->h - c->icon->height) / 2, c->icon, tmpicon);
+ #else
drw_text(drw, x, barg->y, w, barg->h, pad, c->name, 0, False);
+ #endif // BAR_WINICON_PATCH
+
drawstateindicator(m, c, 1, x, barg->y, w, barg->h, 0, 0, c->isfixed);
if (BARTAB_BORDERS) {
diff --git a/patch/bar_winicon.c b/patch/bar_winicon.c
new file mode 100644
index 0000000..5ae7fe7
--- /dev/null
+++ b/patch/bar_winicon.c
@@ -0,0 +1,146 @@
+static uint32_t tmpicon[ICONSIZE * ICONSIZE];
+
+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);
+}
+
+#if BAR_ALPHA_PATCH
+static uint8_t div255(uint16_t x) { return (x*0x8081u) >> 23u; }
+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;
+}
+#else
+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) | ((~a) << 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;
+ 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;
+}
+#endif // BAR_ALPHA_PATCH
+
+XImage *
+geticonprop(Window win)
+{
+ int format;
+ unsigned long n, extra, *p = NULL;
+ Atom real;
+
+ 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; }
+
+ unsigned long *bstp = NULL;
+ uint32_t w, h, sz;
+
+ {
+ const unsigned long *end = p + n;
+ unsigned long *i;
+ 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 ((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 ((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 ((w = *(bstp - 2)) == 0 || (h = *(bstp - 1)) == 0) { XFree(p); return NULL; }
+
+ uint32_t icw, ich, icsz;
+ if (w <= h) {
+ ich = ICONSIZE; icw = w * ICONSIZE / h;
+ if (icw == 0) icw = 1;
+ }
+ else {
+ icw = ICONSIZE; ich = h * ICONSIZE / w;
+ if (ich == 0) ich = 1;
+ }
+ icsz = icw * 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();
+ }
+ XFree(p);
+ for (i = 0; i < icsz; ++i) icbuf[i] = prealpha(icbuf[i]);
+ #if BAR_ALPHA_PATCH
+ return XCreateImage(dpy, drw->visual, drw->depth, ZPixmap, 0, (char *)icbuf, icw, ich, 32, 0);
+ #else
+ return XCreateImage(dpy, DefaultVisual(dpy, screen), DefaultDepth(dpy, screen), ZPixmap, 0, (char *)icbuf, icw, ich, 32, 0);
+ #endif // BAR_ALPHA_PATCH
+}
+
+void
+freeicon(Client *c)
+{
+ if (c->icon) {
+ XDestroyImage(c->icon);
+ c->icon = NULL;
+ }
+}
+
+void
+updateicon(Client *c)
+{
+ freeicon(c);
+ c->icon = geticonprop(c->win);
+} \ No newline at end of file
diff --git a/patch/bar_winicon.h b/patch/bar_winicon.h
new file mode 100644
index 0000000..791182e
--- /dev/null
+++ b/patch/bar_winicon.h
@@ -0,0 +1,8 @@
+#include <Imlib2.h>
+#include <limits.h>
+#include <stdint.h>
+
+void drw_img(Drw *drw, int x, int y, XImage *img, uint32_t *tmp);
+static XImage *geticonprop(Window win);
+static void freeicon(Client *c);
+static void updateicon(Client *c); \ No newline at end of file
diff --git a/patch/bar_wintitle.c b/patch/bar_wintitle.c
index d3b5258..d2241d2 100644
--- a/patch/bar_wintitle.c
+++ b/patch/bar_wintitle.c
@@ -17,9 +17,10 @@ draw_wintitle(Bar *bar, BarArg *a)
int x = a->x, w = a->w;
#endif // BAR_TITLE_LEFT_PAD_PATCH | BAR_TITLE_RIGHT_PAD_PATCH
Monitor *m = bar->mon;
+ Client *c = m->sel;
int pad = lrpad / 2;
- if (!m->sel) {
+ if (!c) {
drw_setscheme(drw, scheme[SchemeTitleNorm]);
drw_rect(drw, x, a->y, w, a->h, 1, 1);
return 0;
@@ -30,15 +31,23 @@ draw_wintitle(Bar *bar, BarArg *a)
XSetErrorHandler(xerrordummy);
#endif // BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
#if BAR_CENTEREDWINDOWNAME_PATCH
- if (TEXTW(m->sel->name) < w)
- pad = (w - TEXTW(m->sel->name) + lrpad) / 2;
+ if (TEXTW(c->name) < w)
+ pad = (w - TEXTW(c->name) + lrpad) / 2;
#endif // BAR_CENTEREDWINDOWNAME_PATCH
- drw_text(drw, x, a->y, w, a->h, pad, m->sel->name, 0, False);
+
+ #if BAR_WINICON_PATCH
+ drw_text(drw, x, a->y, w, a->h, pad + (c->icon ? c->icon->width + ICONSPACING : 0), c->name, 0, False);
+ if (c->icon)
+ drw_img(drw, x + pad, a->y + (a->h - c->icon->height) / 2, c->icon, tmpicon);
+ #else
+ drw_text(drw, x, a->y, w, a->h, pad, c->name, 0, False);
+ #endif // BAR_WINICON_PATCH
+
#if BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
XSync(dpy, False);
XSetErrorHandler(xerror);
#endif // BAR_IGNORE_XFT_ERRORS_WHEN_DRAWING_TEXT_PATCH
- drawstateindicator(m, m->sel, 1, x, a->y, w, a->h, 0, 0, m->sel->isfixed);
+ drawstateindicator(m, c, 1, x, a->y, w, a->h, 0, 0, c->isfixed);
return 1;
}
diff --git a/patch/include.c b/patch/include.c
index 2e7d92c..29dac83 100644
--- a/patch/include.c
+++ b/patch/include.c
@@ -47,6 +47,9 @@
#if BAR_STATUSCOLORS_PATCH
#include "bar_statuscolors.c"
#endif
+#if BAR_WINICON_PATCH
+#include "bar_winicon.c"
+#endif
#if BAR_TABGROUPS_PATCH
#include "bar_tabgroups.c"
#endif
diff --git a/patch/include.h b/patch/include.h
index 850589e..c913a27 100644
--- a/patch/include.h
+++ b/patch/include.h
@@ -44,6 +44,9 @@
#if BAR_STATUSCMD_PATCH
#include "bar_statuscmd.h"
#endif
+#if BAR_WINICON_PATCH
+#include "bar_winicon.h"
+#endif
#if BAR_TABGROUPS_PATCH
#include "bar_tabgroups.h"
#endif