From 54444a2a6b1f362d0d01c4fd79cd1b83390b39f2 Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Sun, 5 Oct 2025 22:57:30 +0800 Subject: [PATCH] feat: The floating Windows do not overlap --- src/mango.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/mango.c b/src/mango.c index 9fc9e4c..08090c7 100644 --- a/src/mango.c +++ b/src/mango.c @@ -700,6 +700,7 @@ static bool check_trackpad_disabled(struct wlr_pointer *pointer); static unsigned int get_tag_status(unsigned int tag, Monitor *m); static void enable_adaptive_sync(Monitor *m, struct wlr_output_state *state); static Client *get_next_stack_client(Client *c, bool reverse); +static void set_float_malposition(Client *tc); #include "data/static_keymap.h" #include "dispatch/bind_declare.h" @@ -1179,6 +1180,25 @@ int applyrulesgeom(Client *c) { return hit; } +void set_float_malposition(Client *tc) { + Client *c = NULL; + int x, y, offset; + x = tc->geom.x; + y = tc->geom.y; + offset = MIN(tc->mon->m.width / 20, tc->mon->m.height / 20); + + wl_list_for_each(c, &clients, link) { + if (c->isfloating && c != tc && VISIBLEON(c, tc->mon) && + x - c->geom.x < offset && y - c->geom.y < offset) { + x = c->geom.x + offset; + y = c->geom.y + offset; + } + } + + tc->float_geom.x = tc->geom.x = x; + tc->float_geom.y = tc->geom.y = y; +} + void applyrules(Client *c) { /* rule matching */ const char *appid, *title; @@ -1298,6 +1318,10 @@ void applyrules(Client *c) { arrange(c->mon, false); } + if (c->isfloating && !hit_rule_pos) { + set_float_malposition(c); + } + // apply named scratchpad rule if (c->isnamedscratchpad) { apply_named_scratchpad(c);