opt: optimize handle foreign toplevel
Some checks failed
Close manually marked stale issues / close-issues (push) Has been cancelled
Lock Threads / lock (push) Has been cancelled

This commit is contained in:
DreamMaoMao
2025-12-10 22:35:45 +08:00
parent 64d350ee9b
commit f771e56c31
2 changed files with 42 additions and 19 deletions

View File

@@ -6,7 +6,7 @@ void handle_foreign_activate_request(struct wl_listener *listener, void *data) {
Client *c = wl_container_of(listener, c, foreign_activate_request); Client *c = wl_container_of(listener, c, foreign_activate_request);
uint32_t target; uint32_t target;
if (c && c->swallowing) if (c->swallowing)
return; return;
if (c->isminimized) { if (c->isminimized) {
@@ -22,29 +22,39 @@ void handle_foreign_activate_request(struct wl_listener *listener, void *data) {
target = get_tags_first_tag(c->tags); target = get_tags_first_tag(c->tags);
view_in_mon(&(Arg){.ui = target}, true, c->mon, true); view_in_mon(&(Arg){.ui = target}, true, c->mon, true);
focusclient(c, 1); focusclient(c, 1);
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, true);
} }
void handle_foreign_maximize_request(struct wl_listener *listener, void *data) { void handle_foreign_maximize_request(struct wl_listener *listener, void *data) {
Client *c = wl_container_of(listener, c, foreign_maximize_request); Client *c = wl_container_of(listener, c, foreign_maximize_request);
if (c->ismaximizescreen) { struct wlr_foreign_toplevel_handle_v1_maximized_event *event = data;
if (c->swallowing)
return;
if (c->ismaximizescreen && !event->maximized) {
setmaximizescreen(c, 0); setmaximizescreen(c, 0);
} else { return;
}
if (!c->ismaximizescreen && event->maximized) {
setmaximizescreen(c, 1); setmaximizescreen(c, 1);
return;
} }
} }
void handle_foreign_minimize_request(struct wl_listener *listener, void *data) { void handle_foreign_minimize_request(struct wl_listener *listener, void *data) {
Client *c = wl_container_of(listener, c, foreign_minimize_request); Client *c = wl_container_of(listener, c, foreign_minimize_request);
if (c && c->swallowing) struct wlr_foreign_toplevel_handle_v1_minimized_event *event = data;
if (c->swallowing)
return; return;
if (c && !c->isminimized && c == selmon->sel) { if (!c->isminimized && event->minimized) {
set_minimized(c); set_minimized(c);
return; return;
} }
if (c->isminimized) { if (c->isminimized && !event->minimized) {
c->is_in_scratchpad = 0; c->is_in_scratchpad = 0;
c->isnamedscratchpad = 0; c->isnamedscratchpad = 0;
c->is_scratchpad_show = 0; c->is_scratchpad_show = 0;
@@ -57,26 +67,37 @@ void handle_foreign_minimize_request(struct wl_listener *listener, void *data) {
void handle_foreign_fullscreen_request(struct wl_listener *listener, void handle_foreign_fullscreen_request(struct wl_listener *listener,
void *data) { void *data) {
return;
Client *c = wl_container_of(listener, c, foreign_fullscreen_request);
struct wlr_foreign_toplevel_handle_v1_fullscreen_event *event = data;
if (c->swallowing)
return;
if (c->isfullscreen && !event->fullscreen) {
setfullscreen(c, 0);
return;
}
if (!c->isfullscreen && event->fullscreen) {
setfullscreen(c, 1);
return;
}
} }
void handle_foreign_close_request(struct wl_listener *listener, void *data) { void handle_foreign_close_request(struct wl_listener *listener, void *data) {
Client *c = wl_container_of(listener, c, foreign_close_request); Client *c = wl_container_of(listener, c, foreign_close_request);
if (c) { pending_kill_client(c);
pending_kill_client(c);
}
} }
void handle_foreign_destroy(struct wl_listener *listener, void *data) { void handle_foreign_destroy(struct wl_listener *listener, void *data) {
Client *c = wl_container_of(listener, c, foreign_destroy); Client *c = wl_container_of(listener, c, foreign_destroy);
if (c) { wl_list_remove(&c->foreign_activate_request.link);
wl_list_remove(&c->foreign_activate_request.link); wl_list_remove(&c->foreign_minimize_request.link);
wl_list_remove(&c->foreign_minimize_request.link); wl_list_remove(&c->foreign_maximize_request.link);
wl_list_remove(&c->foreign_maximize_request.link); wl_list_remove(&c->foreign_fullscreen_request.link);
wl_list_remove(&c->foreign_fullscreen_request.link); wl_list_remove(&c->foreign_close_request.link);
wl_list_remove(&c->foreign_close_request.link); wl_list_remove(&c->foreign_destroy.link);
wl_list_remove(&c->foreign_destroy.link);
}
} }
void remove_foreign_topleve(Client *c) { void remove_foreign_topleve(Client *c) {

View File

@@ -682,4 +682,6 @@ arrange(Monitor *m, bool want_animation) {
motionnotify(0, NULL, 0, 0, 0, 0); motionnotify(0, NULL, 0, 0, 0, 0);
checkidleinhibitor(NULL); checkidleinhibitor(NULL);
} }
printstatus();
} }