From 54d6ba78c33b15480c75025f15893f006a2ca5d1 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 8 Mar 2019 16:14:30 +0100 Subject: [PATCH] rootston: add output-management-v1 support --- include/rootston/desktop.h | 6 +++++- rootston/desktop.c | 29 +++++++++++++++++++++++++++++ rootston/output.c | 20 ++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/include/rootston/desktop.h b/include/rootston/desktop.h index 81faba81..fdd3abe0 100644 --- a/include/rootston/desktop.h +++ b/include/rootston/desktop.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -14,10 +15,10 @@ #include #include #include +#include #include #include #include -#include #include #include #include @@ -69,6 +70,7 @@ struct roots_desktop { struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager_v1; struct wlr_relative_pointer_manager_v1 *relative_pointer_manager; struct wlr_pointer_gestures_v1 *pointer_gestures; + struct wlr_output_manager_v1 *output_manager_v1; struct wl_listener new_output; struct wl_listener layout_change; @@ -81,6 +83,8 @@ struct roots_desktop { struct wl_listener input_inhibit_deactivate; struct wl_listener virtual_keyboard_new; struct wl_listener pointer_constraint; + struct wl_listener output_manager_apply; + struct wl_listener output_manager_test; #if WLR_HAS_XWAYLAND struct wlr_xwayland *xwayland; diff --git a/rootston/desktop.c b/rootston/desktop.c index b0530ea1..35962cbb 100644 --- a/rootston/desktop.c +++ b/rootston/desktop.c @@ -294,6 +294,26 @@ static void handle_pointer_constraint(struct wl_listener *listener, } } +static void handle_output_manager_apply(struct wl_listener *listener, + void *data) { + struct roots_desktop *desktop = + wl_container_of(listener, desktop, output_manager_apply); + struct wlr_output_configuration_v1 *config = data; + (void)config; + wlr_log(WLR_DEBUG, "APPLY"); // TODO +} + +static void handle_output_manager_test(struct wl_listener *listener, + void *data) { + struct roots_desktop *desktop = + wl_container_of(listener, desktop, output_manager_test); + struct wlr_output_configuration_v1 *config = data; + + // TODO: implement test-only mode + wlr_output_configuration_v1_send_succeeded(config); + wlr_output_configuration_v1_destroy(config); +} + struct roots_desktop *desktop_create(struct roots_server *server, struct roots_config *config) { wlr_log(WLR_DEBUG, "Initializing roots desktop"); @@ -457,6 +477,15 @@ struct roots_desktop *desktop_create(struct roots_server *server, desktop->pointer_gestures = wlr_pointer_gestures_v1_create(server->wl_display); + desktop->output_manager_v1 = + wlr_output_manager_v1_create(server->wl_display); + desktop->output_manager_apply.notify = handle_output_manager_apply; + wl_signal_add(&desktop->output_manager_v1->events.apply, + &desktop->output_manager_apply); + desktop->output_manager_test.notify = handle_output_manager_test; + wl_signal_add(&desktop->output_manager_v1->events.test, + &desktop->output_manager_test); + wlr_primary_selection_v1_device_manager_create(server->wl_display); wlr_data_control_manager_v1_create(server->wl_display); diff --git a/rootston/output.c b/rootston/output.c index 3edd07b0..0f684c85 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -424,11 +424,27 @@ static void set_mode(struct wlr_output *output, } } +static void update_output_manager_config(struct roots_desktop *desktop) { + struct wlr_output_configuration_v1 *config = + wlr_output_configuration_v1_create(); + + struct roots_output *output; + wl_list_for_each(output, &desktop->outputs, link) { + struct wlr_output_configuration_head_v1 *head = + wlr_output_configuration_head_v1_create(config, output->wlr_output); + (void)head; + } + + wlr_output_manager_v1_set_configuration(desktop->output_manager_v1, config); +} + static void output_destroy(struct roots_output *output) { // TODO: cursor //example_config_configure_cursor(sample->config, sample->cursor, // sample->compositor); + struct roots_desktop *desktop = output->desktop; + wl_list_remove(&output->link); wl_list_remove(&output->destroy.link); wl_list_remove(&output->mode.link); @@ -437,6 +453,8 @@ static void output_destroy(struct roots_output *output) { wl_list_remove(&output->damage_frame.link); wl_list_remove(&output->damage_destroy.link); free(output); + + update_output_manager_config(desktop); } static void output_handle_destroy(struct wl_listener *listener, void *data) { @@ -579,4 +597,6 @@ void handle_new_output(struct wl_listener *listener, void *data) { arrange_layers(output); output_damage_whole(output); + + update_output_manager_config(desktop); }