From e6a74ad3ea480ff7262af104db440d6bda0ab5ab Mon Sep 17 00:00:00 2001 From: bakkeby Date: Sun, 16 Oct 2022 21:32:01 +0200 Subject: [PATCH] roundedcorners: moving drawroundedcorners logic to resizeclient ref. #304 --- dwm.c | 25 ++--------- patch/roundedcorners.c | 94 +++++++++++++++++++++--------------------- 2 files changed, 51 insertions(+), 68 deletions(-) diff --git a/dwm.c b/dwm.c index d0df3d7..25d57b6 100644 --- a/dwm.c +++ b/dwm.c @@ -1102,11 +1102,6 @@ arrangemon(Monitor *m) strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); if (m->lt[m->sellt]->arrange) m->lt[m->sellt]->arrange(m); - #if ROUNDED_CORNERS_PATCH - Client *c; - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - drawroundedcorners(c); - #endif // ROUNDED_CORNERS_PATCH } void @@ -2746,9 +2741,6 @@ movemouse(const Arg *arg) if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) { resize(c, nx, ny, c->w, c->h, 1); } - #if ROUNDED_CORNERS_PATCH - drawroundedcorners(c); - #endif // ROUNDED_CORNERS_PATCH break; } } while (ev.type != ButtonRelease); @@ -2772,9 +2764,6 @@ movemouse(const Arg *arg) c->sfy = ny; } #endif // SAVEFLOATS_PATCH / EXRESIZE_PATCH - #if ROUNDED_CORNERS_PATCH - drawroundedcorners(c); - #endif // ROUNDED_CORNERS_PATCH ignoreconfigurerequests = 0; } @@ -2932,6 +2921,9 @@ resizeclient(Client *c, int x, int y, int w, int h) c->expandmask = 0; #endif // EXRESIZE_PATCH wc.border_width = c->bw; + #if ROUNDED_CORNERS_PATCH + drawroundedcorners(c); + #endif // ROUNDED_CORNERS_PATCH #if NOBORDER_PATCH if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) #if MONOCLE_LAYOUT @@ -3064,9 +3056,6 @@ resizemouse(const Arg *arg) } if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) { resize(c, nx, ny, nw, nh, 1); - #if ROUNDED_CORNERS_PATCH - drawroundedcorners(c); - #endif // ROUNDED_CORNERS_PATCH } break; } @@ -3482,10 +3471,6 @@ setfullscreen(Client *c, int fullscreen) c->bw = 0; c->isfloating = 1; resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - #if ROUNDED_CORNERS_PATCH - XRectangle rect = { .x = 0, .y = 0, .width = c->w, .height = c->h }; - XShapeCombineRectangles(dpy, c->win, ShapeBounding, 0, 0, &rect, 1, ShapeSet, 1); - #endif // ROUNDED_CORNERS_PATCH XRaiseWindow(dpy, c->win); } else if (restorestate && (c->oldstate & (1 << 1))) { c->bw = c->oldbw; @@ -3520,10 +3505,6 @@ setfullscreen(Client *c, int fullscreen) c->bw = 0; c->isfloating = 1; resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - #if ROUNDED_CORNERS_PATCH - XRectangle rect = { .x = 0, .y = 0, .width = c->w, .height = c->h }; - XShapeCombineRectangles(dpy, c->win, ShapeBounding, 0, 0, &rect, 1, ShapeSet, 1); - #endif // ROUNDED_CORNERS_PATCH XRaiseWindow(dpy, c->win); #endif // !FAKEFULLSCREEN_PATCH } else if (!fullscreen && c->isfullscreen){ diff --git a/patch/roundedcorners.c b/patch/roundedcorners.c index 881dbab..c6a1bbb 100644 --- a/patch/roundedcorners.c +++ b/patch/roundedcorners.c @@ -2,50 +2,52 @@ void drawroundedcorners(Client *c) { - if (corner_radius <= 0 || !c || c->isfullscreen) - return; - - Window win; - win = c->win; - if (!win) - return; - - XWindowAttributes win_attr; - if (!XGetWindowAttributes(dpy, win, &win_attr)) - return; - - int dia = 2 * corner_radius; - int w = c->w; - int h = c->h; - if (w < dia || h < dia) - return; - - Pixmap mask; - mask = XCreatePixmap(dpy, win, w, h, 1); - if (!mask) - return; - - XGCValues xgcv; - GC shape_gc; - shape_gc = XCreateGC(dpy, mask, 0, &xgcv); - - if (!shape_gc) { - XFreePixmap(dpy, mask); - free(shape_gc); - return; - } - - XSetForeground(dpy, shape_gc, 0); - XFillRectangle(dpy, mask, shape_gc, 0, 0, w, h); - XSetForeground(dpy, shape_gc, 1); - XFillArc(dpy, mask, shape_gc, 0, 0, dia, dia, 0, 23040); - XFillArc(dpy, mask, shape_gc, w-dia-1, 0, dia, dia, 0, 23040); - XFillArc(dpy, mask, shape_gc, 0, h-dia-1, dia, dia, 0, 23040); - XFillArc(dpy, mask, shape_gc, w-dia-1, h-dia-1, dia, dia, 0, 23040); - XFillRectangle(dpy, mask, shape_gc, corner_radius, 0, w-dia, h); - XFillRectangle(dpy, mask, shape_gc, 0, corner_radius, w, h-dia); - XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, mask, ShapeSet); - XFreePixmap(dpy, mask); - XFreeGC(dpy, shape_gc); + XWindowAttributes win_attr; + Pixmap mask; + XGCValues xgcv; + GC shape_gc; + int dia, w, h; + + if (corner_radius <= 0 || !c) + return; + + /* Clear window shape if fullscreen */ + if (c->w == c->mon->mw && c->h == c->mon->mh) { + XRectangle rect = { .x = 0, .y = 0, .width = c->w, .height = c->h }; + XShapeCombineRectangles(dpy, c->win, ShapeBounding, 0, 0, &rect, 1, ShapeSet, 1); + return; + } + + if (!XGetWindowAttributes(dpy, c->win, &win_attr)) + return; + + dia = 2 * corner_radius; + w = c->w + 2 * c->bw; + h = c->h + 2 * c->bw; + if (w < dia || h < dia) + return; + + mask = XCreatePixmap(dpy, c->win, w, h, 1); + if (!mask) + return; + + shape_gc = XCreateGC(dpy, mask, 0, &xgcv); + if (!shape_gc) { + XFreePixmap(dpy, mask); + free(shape_gc); + return; + } + + XSetForeground(dpy, shape_gc, 0); + XFillRectangle(dpy, mask, shape_gc, 0, 0, w, h); + XSetForeground(dpy, shape_gc, 1); + XFillArc(dpy, mask, shape_gc, 0, 0, dia, dia, 0, 23040); + XFillArc(dpy, mask, shape_gc, w-dia-1, 0, dia, dia, 0, 23040); + XFillArc(dpy, mask, shape_gc, 0, h-dia-1, dia, dia, 0, 23040); + XFillArc(dpy, mask, shape_gc, w-dia-1, h-dia-1, dia, dia, 0, 23040); + XFillRectangle(dpy, mask, shape_gc, corner_radius, 0, w-dia, h); + XFillRectangle(dpy, mask, shape_gc, 0, corner_radius, w, h-dia); + XShapeCombineMask(dpy, c->win, ShapeBounding, -c->bw, -c->bw, mask, ShapeSet); + XFreePixmap(dpy, mask); + XFreeGC(dpy, shape_gc); } -