From 4f19f5499610d56f2616da5d44039403ac9d4c06 Mon Sep 17 00:00:00 2001 From: wochap Date: Tue, 9 Jul 2024 10:52:37 -0500 Subject: [PATCH] implement customfloat and generate patches --- config.def.h | 7 ++++--- dwl.c | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index 22d2171..dee53f4 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 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, 0, 0, 1000, 0.75 }, /* Start on currently visible tags floating, not tiled */ + { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1, 0, 0, 0, 0 },/* Start on ONLY tag "9" */ }; /* layout(s) */ diff --git a/dwl.c b/dwl.c index dc0437e..be0340f 100644 --- a/dwl.c +++ b/dwl.c @@ -230,6 +230,10 @@ typedef struct { uint32_t tags; int isfloating; int monitor; + int x; + int y; + float w; + float h; } Rule; typedef struct { @@ -454,6 +458,11 @@ applyrules(Client *c) int i; const Rule *r; Monitor *mon = selmon, *m; + int newwidth; + int newheight; + int newx; + int newy; + int apply_resize = 0; c->isfloating = client_is_float_type(c); if (!(appid = client_get_appid(c))) @@ -471,9 +480,27 @@ applyrules(Client *c) 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 ? (r->w <= 1 ? b.width * r->w : r->w) : c->geom.width); + newheight = (int)round(r->h ? (r->h <= 1 ? b.height * r->h : r->h) : c->geom.height); + newx = (int)round(r->x ? (r->x <= 1 ? b.width * r->x + b.x : r->x + b.x) : c->geom.x); + newy = (int)round(r->y ? (r->y <= 1 ? b.height * r->y + b.y : r->y + b.y) : c->geom.y); + apply_resize = 1; + + } } } setmon(c, mon, newtags); + if (apply_resize) { + resize(c, (struct wlr_box){ + .x = newx, + .y = newy, + .width = newwidth, + .height = newheight, + }, 1); + } } void -- 2.45.1