From f771e56c31f6febc6ce04f2fbc0697dc487fdef4 Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Wed, 10 Dec 2025 22:35:45 +0800 Subject: [PATCH] opt: optimize handle foreign toplevel --- src/ext-protocol/foreign-toplevel.h | 59 +++++++++++++++++++---------- src/layout/arrange.h | 2 + 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/ext-protocol/foreign-toplevel.h b/src/ext-protocol/foreign-toplevel.h index 4a72579..01c384f 100644 --- a/src/ext-protocol/foreign-toplevel.h +++ b/src/ext-protocol/foreign-toplevel.h @@ -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); uint32_t target; - if (c && c->swallowing) + if (c->swallowing) return; 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); view_in_mon(&(Arg){.ui = target}, true, c->mon, true); 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) { 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); - } else { + return; + } + + if (!c->ismaximizescreen && event->maximized) { setmaximizescreen(c, 1); + return; } } void handle_foreign_minimize_request(struct wl_listener *listener, void *data) { 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; - if (c && !c->isminimized && c == selmon->sel) { + if (!c->isminimized && event->minimized) { set_minimized(c); return; } - if (c->isminimized) { + if (c->isminimized && !event->minimized) { c->is_in_scratchpad = 0; c->isnamedscratchpad = 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 *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) { 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) { Client *c = wl_container_of(listener, c, foreign_destroy); - if (c) { - wl_list_remove(&c->foreign_activate_request.link); - wl_list_remove(&c->foreign_minimize_request.link); - wl_list_remove(&c->foreign_maximize_request.link); - wl_list_remove(&c->foreign_fullscreen_request.link); - wl_list_remove(&c->foreign_close_request.link); - wl_list_remove(&c->foreign_destroy.link); - } + wl_list_remove(&c->foreign_activate_request.link); + wl_list_remove(&c->foreign_minimize_request.link); + wl_list_remove(&c->foreign_maximize_request.link); + wl_list_remove(&c->foreign_fullscreen_request.link); + wl_list_remove(&c->foreign_close_request.link); + wl_list_remove(&c->foreign_destroy.link); } void remove_foreign_topleve(Client *c) { diff --git a/src/layout/arrange.h b/src/layout/arrange.h index 7a1d620..f896673 100644 --- a/src/layout/arrange.h +++ b/src/layout/arrange.h @@ -682,4 +682,6 @@ arrange(Monitor *m, bool want_animation) { motionnotify(0, NULL, 0, 0, 0, 0); checkidleinhibitor(NULL); } + + printstatus(); }