opt: optimize pos offset in winrule

This commit is contained in:
DreamMaoMao 2025-05-27 10:42:43 +08:00
parent e3353b85f6
commit 51b3034bb2

View file

@ -615,7 +615,7 @@ static void handle_foreign_close_request(struct wl_listener *listener,
void *data); void *data);
static void handle_foreign_destroy(struct wl_listener *listener, void *data); static void handle_foreign_destroy(struct wl_listener *listener, void *data);
static struct wlr_box setclient_coordinate_center(struct wlr_box geom, static struct wlr_box setclient_coordinate_center(Client *c, struct wlr_box geom,
int offsetx, int offsety); int offsetx, int offsety);
static unsigned int get_tags_first_tag(unsigned int tags); static unsigned int get_tags_first_tag(unsigned int tags);
@ -638,6 +638,7 @@ static void set_rect_size(struct wlr_scene_rect *rect, int width, int height);
static Client *center_select(Monitor *m); static Client *center_select(Monitor *m);
static void handlecursoractivity(void); static void handlecursoractivity(void);
static int hidecursor(void *data); static int hidecursor(void *data);
static bool check_hit_no_border(Client *c);
#include "dispatch/dispatch.h" #include "dispatch/dispatch.h"
@ -1062,22 +1063,9 @@ void set_rect_size(struct wlr_scene_rect *rect, int width, int height) {
wlr_scene_rect_set_size(rect, GEZERO(width), GEZERO(height)); wlr_scene_rect_set_size(rect, GEZERO(width), GEZERO(height));
} }
void apply_border(Client *c, struct wlr_box clip_box, int offsetx, bool check_hit_no_border(Client *c) {
int offsety) {
int i; int i;
bool hit_no_border = false; bool hit_no_border = false;
if (c->iskilling || !client_surface(c)->mapped)
return;
if (clip_box.width > c->animation.current.width) {
clip_box.width = c->animation.current.width;
}
if (clip_box.height > c->animation.current.height) {
clip_box.height = c->animation.current.height;
}
if (!render_border) { if (!render_border) {
hit_no_border = true; hit_no_border = true;
} }
@ -1092,6 +1080,25 @@ void apply_border(Client *c, struct wlr_box clip_box, int offsetx,
if (no_border_when_single && c->mon->visible_clients == 1) { if (no_border_when_single && c->mon->visible_clients == 1) {
hit_no_border = true; hit_no_border = true;
} }
return hit_no_border;
}
void apply_border(Client *c, struct wlr_box clip_box, int offsetx,
int offsety) {
bool hit_no_border = false;
if (c->iskilling || !client_surface(c)->mapped)
return;
if (clip_box.width > c->animation.current.width) {
clip_box.width = c->animation.current.width;
}
if (clip_box.height > c->animation.current.height) {
clip_box.height = c->animation.current.height;
}
hit_no_border = check_hit_no_border(c);
if (hit_no_border && smartgaps) { if (hit_no_border && smartgaps) {
c->bw = 0; c->bw = 0;
@ -1412,7 +1419,7 @@ void show_scratchpad(Client *c) {
: c->mon->w.height * 0.8; : c->mon->w.height * 0.8;
// 重新计算居中的坐标 // 重新计算居中的坐标
c->geom = c->animainit_geom = c->animation.current = c->geom = c->animainit_geom = c->animation.current =
setclient_coordinate_center(c->geom, 0, 0); setclient_coordinate_center(c, c->geom, 0, 0);
resize(c, c->geom, 0); resize(c, c->geom, 0);
} else if (c->geom.width != c->scratchpad_geom.width || } else if (c->geom.width != c->scratchpad_geom.width ||
c->geom.height != c->scratchpad_geom.height) { c->geom.height != c->scratchpad_geom.height) {
@ -1421,7 +1428,7 @@ void show_scratchpad(Client *c) {
c->geom.height = c->scratchpad_geom.height ? c->scratchpad_geom.height c->geom.height = c->scratchpad_geom.height ? c->scratchpad_geom.height
: c->mon->w.height * 0.8; : c->mon->w.height * 0.8;
c->geom = c->animainit_geom = c->animation.current = c->geom = c->animainit_geom = c->animation.current =
setclient_coordinate_center(c->geom, 0, 0); setclient_coordinate_center(c, c->geom, 0, 0);
resize(c, c->geom, 0); resize(c, c->geom, 0);
} }
c->oldtags = selmon->tagset[selmon->seltags]; c->oldtags = selmon->tagset[selmon->seltags];
@ -1725,40 +1732,42 @@ void toggle_hotarea(int x_root, int y_root) {
} }
struct wlr_box // 计算客户端居中坐标 struct wlr_box // 计算客户端居中坐标
setclient_coordinate_center(struct wlr_box geom, int offsetx, int offsety) { setclient_coordinate_center(Client *c, struct wlr_box geom, int offsetx, int offsety) {
struct wlr_box tempbox; struct wlr_box tempbox;
int offset = 0; int offset = 0;
int len = 0; int len = 0;
unsigned int cbw = check_hit_no_border(c) ? c->bw : 0;
tempbox.x = selmon->w.x + (selmon->w.width - geom.width) / 2; tempbox.x = selmon->w.x + (selmon->w.width - geom.width) / 2;
tempbox.y = selmon->w.y + (selmon->w.height - geom.height) / 2; tempbox.y = selmon->w.y + (selmon->w.height - geom.height) / 2;
tempbox.width = geom.width; tempbox.width = geom.width;
tempbox.height = geom.height; tempbox.height = geom.height;
if (offsetx != 0) { if (offsetx != 0) {
len = (selmon->w.width - geom.width) / 2 - gappoh; len = selmon->w.width/ 2;
offset = len * (offsetx / 100.0); offset = len * (offsetx / 100.0);
tempbox.x += offset; tempbox.x += offset;
// 限制窗口在屏幕内 // 限制窗口在屏幕内
if (tempbox.x < selmon->m.x) { if (tempbox.x < selmon->m.x) {
tempbox.x = selmon->m.x; tempbox.x = selmon->m.x - cbw;
} }
if (tempbox.x + tempbox.width > selmon->m.x + selmon->m.width) { if (tempbox.x + tempbox.width > selmon->m.x + selmon->m.width) {
tempbox.x = selmon->m.x + selmon->m.width - tempbox.width; tempbox.x = selmon->m.x + selmon->m.width - tempbox.width + cbw;
} }
} }
if (offsety != 0) { if (offsety != 0) {
len = (selmon->w.height - geom.height) / 2 - gappov; len = selmon->w.height;
offset = len * (offsety / 100.0); offset = len * (offsety / 100.0);
tempbox.y += offset; tempbox.y += offset;
// 限制窗口在屏幕内 // 限制窗口在屏幕内
if (tempbox.y < selmon->m.y) { if (tempbox.y < selmon->m.y) {
tempbox.y = selmon->m.y; tempbox.y = selmon->m.y - cbw;
} }
if (tempbox.y + tempbox.height > selmon->m.y + selmon->m.height) { if (tempbox.y + tempbox.height > selmon->m.y + selmon->m.height) {
tempbox.y = selmon->m.y + selmon->m.height - tempbox.height; tempbox.y = selmon->m.y + selmon->m.height - tempbox.height + cbw;
} }
} }
@ -1791,7 +1800,7 @@ applyrulesgeom(Client *c) {
c->geom.height = r->height > 0 ? r->height : c->geom.height; c->geom.height = r->height > 0 ? r->height : c->geom.height;
// 重新计算居中的坐标 // 重新计算居中的坐标
if (r->offsetx || r->offsety) if (r->offsetx || r->offsety)
c->geom = setclient_coordinate_center(c->geom, r->offsetx, r->offsety); c->geom = setclient_coordinate_center(c, c->geom, r->offsetx, r->offsety);
hit = r->height > 0 || r->width > 0 || r->offsetx != 0 || r->offsety != 0 hit = r->height > 0 || r->width > 0 || r->offsetx != 0 || r->offsety != 0
? 1 ? 1
: 0; : 0;
@ -1865,7 +1874,7 @@ applyrules(Client *c) {
// 重新计算居中的坐标 // 重新计算居中的坐标
if (r->offsetx || r->offsety) if (r->offsetx || r->offsety)
c->oldgeom = c->geom = c->oldgeom = c->geom =
setclient_coordinate_center(c->geom, r->offsetx, r->offsety); setclient_coordinate_center(c, c->geom, r->offsetx, r->offsety);
} }
} }
} }
@ -5443,7 +5452,7 @@ setfloating(Client *c, int floating) {
} }
// 重新计算居中的坐标 // 重新计算居中的坐标
if (!client_is_x11(c) || !client_should_ignore_focus(c)) if (!client_is_x11(c) || !client_should_ignore_focus(c))
target_box = setclient_coordinate_center(target_box, 0, 0); target_box = setclient_coordinate_center(c, target_box, 0, 0);
backup_box = c->geom; backup_box = c->geom;
hit = applyrulesgeom(c); hit = applyrulesgeom(c);
target_box = hit == 1 ? c->geom : target_box; target_box = hit == 1 ? c->geom : target_box;
@ -6271,7 +6280,7 @@ void tagmon(const Arg *arg) {
c->geom.height = c->geom.height =
(int)(c->geom.height * c->mon->w.height / selmon->w.height); (int)(c->geom.height * c->mon->w.height / selmon->w.height);
selmon = c->mon; selmon = c->mon;
c->geom = setclient_coordinate_center(c->geom, 0, 0); c->geom = setclient_coordinate_center(c, c->geom, 0, 0);
focusclient(c, 1); focusclient(c, 1);
c->oldgeom = c->geom; c->oldgeom = c->geom;
resize(c, c->geom, 1); resize(c, c->geom, 1);