rootston: add output-management-v1 support

This commit is contained in:
emersion 2019-03-08 16:14:30 +01:00 committed by Drew DeVault
parent e873c652bf
commit 54d6ba78c3
3 changed files with 54 additions and 1 deletions

View file

@ -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);

View file

@ -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);
}