From b9ec52a0dfdb4314070831b2aa7fc65177ebc2ad Mon Sep 17 00:00:00 2001 From: A Frederick Christensen Date: Sat, 16 Aug 2025 15:08:39 -0500 Subject: [PATCH] customfloat-patch --- config.def.h | 7 ++++--- dwl.c | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index 95c2afa..67b27ed 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.0f, 0.0f, 0.0f, 1.0f}; /* You can also use glsl colors */ +static const int respect_monitor_reserved_area = 0; /* 1 to monitor center while respecting the monitor's reserved area, 0 to monitor center */ /* 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 monitor x y width height */ /* 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, -1, -1, -1, 1000, 0.75 }, /* Start on currently visible tags floating, not tiled */ + { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1, -1, -1, -1, -1 }, /* Start on ONLY tag "9" */ }; /* layout(s) */ diff --git a/dwl.c b/dwl.c index 12f441e..e364621 100644 --- a/dwl.c +++ b/dwl.c @@ -228,6 +228,10 @@ typedef struct { uint32_t tags; int isfloating; int monitor; + int x; + int y; + float w; + float h; } Rule; typedef struct { @@ -482,4 +486,9 @@ applyrules(Client *c) int i; const Rule *r; Monitor *mon = selmon, *m; + int newwidth; + int newheight; + int newx; + int newy; + int apply_resize = 0; appid = client_get_appid(c); title = client_get_title(c); @@ -495,0 +504,0 @@ applyrules(Client *c) wl_list_for_each(m, &mons, link) { if (r->monitor == i++) mon = m; + if (c->isfloating || !mon->lt[mon->sellt]->arrange) { + /* client is floating or in floating layout */ + struct wlr_box b = respect_monitor_reserved_area ? mon->w : mon->m; + newwidth = (int)round((r->w >= 0) ? (r->w <= 1 ? b.width * r->w : r->w) : c->geom.width); + newheight = (int)round((r->h >= 0) ? (r->h <= 1 ? b.height * r->h : r->h) : c->geom.height); + newx = (int)round((r->x >= 0) ? (r->x <= 1 ? b.width * r->x + b.x : r->x + b.x) : c->geom.x); + newy = (int)round((r->y >= 0) ? (r->y <= 1 ? b.height * r->y + b.y : r->y + b.y) : c->geom.y); + apply_resize = 1; + } } } } c->isfloating |= client_is_float_type(c); setmon(c, mon, newtags); + if (apply_resize) { + resize(c, (struct wlr_box){ + .x = newx, + .y = newy, + .width = newwidth, + .height = newheight, + }, 1); + } } void -- 2.50.1