summaryrefslogtreecommitdiffstats
path: root/dwl-patches/patches/client-opacity/client-opacity.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dwl-patches/patches/client-opacity/client-opacity.patch')
-rw-r--r--dwl-patches/patches/client-opacity/client-opacity.patch181
1 files changed, 181 insertions, 0 deletions
diff --git a/dwl-patches/patches/client-opacity/client-opacity.patch b/dwl-patches/patches/client-opacity/client-opacity.patch
new file mode 100644
index 0000000..da2faf7
--- /dev/null
+++ b/dwl-patches/patches/client-opacity/client-opacity.patch
@@ -0,0 +1,181 @@
+From ba3172875d379ff4f2db69753f50067cecfc8293 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
+ <leohdz172@proton.me>
+Date: Tue, 25 Jul 2023 12:48:22 -0600
+Subject: [PATCH] add default transparency for windows and rules for override
+ the transparency
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
+---
+ config.def.h | 9 ++++++---
+ dwl.c | 39 +++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 45 insertions(+), 3 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 22d2171d..0eb86874 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -13,6 +13,7 @@ static const float focuscolor[] = COLOR(0x005577ff);
+ static const float urgentcolor[] = COLOR(0xff0000ff);
+ /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */
+ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */
++static const float default_opacity = 0.75;
+
+ /* tagging - TAGCOUNT must be no greater than 31 */
+ #define TAGCOUNT (9)
+@@ -22,10 +23,10 @@ static int log_level = WLR_ERROR;
+
+ /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */
+ static const Rule rules[] = {
+- /* app_id title tags mask isfloating monitor */
++ /* app_id title tags mask isfloating alpha monitor */
+ /* examples: */
+- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */
+- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */
++ { "Gimp_EXAMPLE", NULL, 0, 1, default_opacity, -1 }, /* Start on currently visible tags floating, not tiled */
++ { "firefox_EXAMPLE", NULL, 1 << 8, 0, 1.0, -1 }, /* Start on ONLY tag "9" */
+ };
+
+ /* layout(s) */
+@@ -133,6 +134,8 @@ static const Key keys[] = {
+ { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} },
+ { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} },
+ { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} },
++ { MODKEY, XKB_KEY_o, setopacity, {.f = +0.1f} },
++ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, setopacity, {.f = -0.1f} },
+ { MODKEY, XKB_KEY_Return, zoom, {0} },
+ { MODKEY, XKB_KEY_Tab, view, {0} },
+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} },
+diff --git a/dwl.c b/dwl.c
+index ad21e1ba..0554fcdf 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -138,6 +138,7 @@ typedef struct {
+ unsigned int bw;
+ uint32_t tags;
+ int isfloating, isurgent, isfullscreen;
++ float opacity;
+ uint32_t resize; /* configure serial of a pending resize */
+ } Client;
+
+@@ -227,6 +228,7 @@ typedef struct {
+ const char *title;
+ uint32_t tags;
+ int isfloating;
++ float opacity;
+ int monitor;
+ } Rule;
+
+@@ -319,6 +321,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data);
+ static void requestmonstate(struct wl_listener *listener, void *data);
+ static void resize(Client *c, struct wlr_box geo, int interact);
+ static void run(char *startup_cmd);
++static void scenebuffersetopacity(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data);
+ static void setcursor(struct wl_listener *listener, void *data);
+ static void setcursorshape(struct wl_listener *listener, void *data);
+ static void setfloating(Client *c, int floating);
+@@ -326,6 +329,7 @@ static void setfullscreen(Client *c, int fullscreen);
+ static void setlayout(const Arg *arg);
+ static void setmfact(const Arg *arg);
+ static void setmon(Client *c, Monitor *m, uint32_t newtags);
++static void setopacity(const Arg *arg);
+ static void setpsel(struct wl_listener *listener, void *data);
+ static void setsel(struct wl_listener *listener, void *data);
+ static void setup(void);
+@@ -491,6 +495,7 @@ applyrules(Client *c)
+ if ((!r->title || strstr(title, r->title))
+ && (!r->id || strstr(appid, r->id))) {
+ c->isfloating = r->isfloating;
++ c->opacity = r->opacity;
+ newtags |= r->tags;
+ i = 0;
+ wl_list_for_each(m, &mons, link) {
+@@ -499,6 +504,8 @@ applyrules(Client *c)
+ }
+ }
+ }
++ if (c->scene_surface)
++ wlr_scene_node_for_each_buffer(&c->scene_surface->node, scenebuffersetopacity, c);
+ setmon(c, mon, newtags);
+ }
+
+@@ -874,6 +881,9 @@ commitnotify(struct wl_listener *listener, void *data)
+
+ resize(c, c->geom, (c->isfloating && !c->isfullscreen));
+
++ if (c->scene_surface)
++ wlr_scene_node_for_each_buffer(&c->scene_surface->node, scenebuffersetopacity, c);
++
+ /* mark a pending resize as completed */
+ if (c->resize && c->resize <= c->surface.xdg->current.configure_serial)
+ c->resize = 0;
+@@ -1120,6 +1130,7 @@ createnotify(struct wl_listener *listener, void *data)
+ c = toplevel->base->data = ecalloc(1, sizeof(*c));
+ c->surface.xdg = toplevel->base;
+ c->bw = borderpx;
++ c->opacity = default_opacity;
+
+ LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify);
+ LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify);
+@@ -2285,6 +2296,15 @@ run(char *startup_cmd)
+ wl_display_run(dpy);
+ }
+
++void
++scenebuffersetopacity(struct wlr_scene_buffer *buffer, int sx, int sy, void *data)
++{
++ Client *c = data;
++ /* xdg-popups are children of Client.scene, we do not have to worry about
++ messing with them. */
++ wlr_scene_buffer_set_opacity(buffer, c->isfullscreen ? 1 : c->opacity);
++}
++
+ void
+ setcursor(struct wl_listener *listener, void *data)
+ {
+@@ -2353,6 +2373,7 @@ setfullscreen(Client *c, int fullscreen)
+ * client positions are set by the user and cannot be recalculated */
+ resize(c, c->prev, 0);
+ }
++ wlr_scene_node_for_each_buffer(&c->scene_surface->node, scenebuffersetopacity, c);
+ arrange(c->mon);
+ printstatus();
+ }
+@@ -2409,6 +2430,23 @@ setmon(Client *c, Monitor *m, uint32_t newtags)
+ focusclient(focustop(selmon), 1);
+ }
+
++void
++setopacity(const Arg *arg)
++{
++ Client *sel = focustop(selmon);
++ if (!sel)
++ return;
++
++ sel->opacity += arg->f;
++ if (sel->opacity > 1.0)
++ sel->opacity = 1.0f;
++
++ if (sel->opacity < 0.1)
++ sel->opacity = 0.1f;
++
++ wlr_scene_node_for_each_buffer(&sel->scene_surface->node, scenebuffersetopacity, sel);
++}
++
+ void
+ setpsel(struct wl_listener *listener, void *data)
+ {
+@@ -3120,6 +3158,7 @@ createnotifyx11(struct wl_listener *listener, void *data)
+ c->surface.xwayland = xsurface;
+ c->type = X11;
+ c->bw = client_is_unmanaged(c) ? 0 : borderpx;
++ c->opacity = default_opacity;
+
+ /* Listen to the various events it can emit */
+ LISTEN(&xsurface->events.associate, &c->associate, associatex11);
+--
+2.48.0
+