From b33102b3415919b94b59bc9b88630c9e36841a80 Mon Sep 17 00:00:00 2001 From: speckitor Date: Sun, 11 Jan 2026 22:38:28 +0700 Subject: [PATCH] fullscreen and focused output --- include/output.h | 4 +++- src/absinthe-toplevel.c | 2 +- src/main.c | 2 ++ src/output.c | 34 +++++++++++++++++----------------- src/server.c | 6 ++++-- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/include/output.h b/include/output.h index 80cb80f..a357051 100644 --- a/include/output.h +++ b/include/output.h @@ -5,4 +5,6 @@ void output_frame(struct wl_listener *listener, void *data); void output_request_state(struct wl_listener *listener, void *data); void output_destroy(struct wl_listener *listener, void *data); -void output_layout_change(struct wl_listener *listener, void *data); +void outputs_update(struct wl_listener *listener, void *data); + +void update_focused_output(struct absinthe_server *server); diff --git a/src/absinthe-toplevel.c b/src/absinthe-toplevel.c index aa90d5f..b6524cd 100644 --- a/src/absinthe-toplevel.c +++ b/src/absinthe-toplevel.c @@ -45,7 +45,7 @@ void absinthe_toplevel_set_fullscreen(struct absinthe_toplevel *toplevel, bool f if (!toplevel || toplevel->fullscreen == fullscreen) return; - struct absinthe_output *output = toplevel->output; + struct absinthe_output *output = toplevel->server->focused_output; toplevel->fullscreen = fullscreen; wlr_xdg_toplevel_set_fullscreen(toplevel->xdg_toplevel, fullscreen); diff --git a/src/main.c b/src/main.c index 8d01226..4773479 100644 --- a/src/main.c +++ b/src/main.c @@ -78,6 +78,8 @@ int main(int argc, char **argv) wl_signal_add(&server.backend->events.new_output, &server.new_output); server.output_layout = wlr_output_layout_create(server.display); + server.output_layout_change.notify = outputs_update; + wl_signal_add(&server.output_layout->events.change, &server.output_layout_change); server.output_mgr = wlr_output_manager_v1_create(server.display); diff --git a/src/output.c b/src/output.c index f43ecba..9f436fe 100644 --- a/src/output.c +++ b/src/output.c @@ -36,27 +36,27 @@ void output_destroy(struct wl_listener *listener, void *data) free(output); } -void output_layout_change(struct wl_listener *listener, void *data) +void outputs_update(struct wl_listener *listener, void *data) { struct absinthe_server *server = wl_container_of(listener, server, output_layout_change); - struct wlr_output_configuration_v1 *config = wlr_output_configuration_v1_create(); - - struct wlr_output_configuration_head_v1 *config_head; struct absinthe_output *output; wl_list_for_each(output, &server->outputs, link) { - if (output->wlr_output->enabled) continue; - - config_head = wlr_output_configuration_head_v1_create(config, output->wlr_output); - config_head->state.enabled = false; - wlr_output_layout_remove(server->output_layout, output->wlr_output); - } - - wl_list_for_each(output, &server->outputs, link) { - if (!output->wlr_output->enabled || !wlr_output_layout_get(server->output_layout, output->wlr_output)) continue; - - wlr_output_layout_add_auto(server->output_layout, output->wlr_output); wlr_output_layout_get_box(server->output_layout, output->wlr_output, &output->geometry); } - - wlr_output_manager_v1_set_configuration(server->output_mgr, config); } + +void update_focused_output(struct absinthe_server *server) +{ + struct absinthe_output *output; + int32_t cursor_x = server->cursor->x; + int32_t cursor_y = server->cursor->y; + wl_list_for_each(output, &server->outputs, link) { + bool cursor_in_output_x = cursor_x >= output->geometry.x && cursor_x <= output->geometry.x + output->geometry.width; + bool cursor_in_output_y = cursor_y >= output->geometry.y && cursor_y <= output->geometry.y + output->geometry.height; + if (cursor_in_output_x && cursor_in_output_y) { + server->focused_output = output; + break; + } + } +} + diff --git a/src/server.c b/src/server.c index 881e23c..b42c838 100644 --- a/src/server.c +++ b/src/server.c @@ -44,12 +44,12 @@ void server_new_output(struct wl_listener *listener, void *data) output->destroy.notify = output_destroy; wl_signal_add(&wlr_output->events.destroy, &output->destroy); + wl_list_insert(&server->outputs, &output->link); + struct wlr_output_layout_output *l_layout = wlr_output_layout_add_auto(server->output_layout, output->wlr_output); struct wlr_scene_output *scene_output = wlr_scene_output_create(server->scene, wlr_output); wlr_scene_output_layout_add_output(server->scene_layout, l_layout, scene_output); wlr_output_layout_get_box(server->output_layout, output->wlr_output, &output->geometry); - - server->focused_output = output; } void server_new_xdg_toplevel(struct wl_listener *listener, void *data) @@ -123,6 +123,7 @@ void server_cursor_motion(struct wl_listener *listener, void *data) { struct absinthe_server *server = wl_container_of(listener, server, cursor_motion); struct wlr_pointer_motion_event *event = data; + update_focused_output(server); wlr_cursor_move(server->cursor, &event->pointer->base, event->delta_x, event->delta_y); process_cursor_motion(server, event->time_msec); } @@ -131,6 +132,7 @@ void server_cursor_motion_absolute(struct wl_listener *listener, void *data) { struct absinthe_server *server = wl_container_of(listener, server, cursor_motion_absolute); struct wlr_pointer_motion_absolute_event *event = data; + update_focused_output(server); wlr_cursor_warp_absolute(server->cursor, &event->pointer->base, event->x, event->y); process_cursor_motion(server, event->time_msec); }