From 0aaf2d070bf6e09d424b60159ecbc62c153f96ca Mon Sep 17 00:00:00 2001 From: project-repo Date: Mon, 25 Dec 2023 16:50:53 +0100 Subject: [PATCH] Fix gamma control --- cagebreak.c | 9 ++++++--- output.c | 23 ++++++++++++++++++++++- output.h | 3 ++- server.h | 2 ++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/cagebreak.c b/cagebreak.c index a772b0e..f08b2e9 100644 --- a/cagebreak.c +++ b/cagebreak.c @@ -280,7 +280,6 @@ main(int argc, char *argv[]) { struct wlr_viewporter *viewporter = NULL; struct wlr_presentation *presentation = NULL; struct wlr_xdg_output_manager_v1 *output_manager = NULL; - struct wlr_gamma_control_manager_v1 *gamma_control_manager = NULL; struct wlr_xdg_shell *xdg_shell = NULL; wl_list_init(&server.input_config); wl_list_init(&server.output_config); @@ -566,13 +565,17 @@ main(int argc, char *argv[]) { goto end; } - gamma_control_manager = + server.gamma_control = wlr_gamma_control_manager_v1_create(server.wl_display); - if(!gamma_control_manager) { + if(!server.gamma_control) { wlr_log(WLR_ERROR, "Unable to create the gamma control manager"); ret = 1; goto end; } + server.gamma_control_set_gamma.notify = + handle_output_gamma_control_set_gamma; + wl_signal_add(&server.gamma_control->events.set_gamma, + &server.gamma_control_set_gamma); #if CG_HAS_XWAYLAND server.xwayland = wlr_xwayland_create(server.wl_display, compositor, true); diff --git a/output.c b/output.c index 3118a09..a528759 100644 --- a/output.c +++ b/output.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -187,6 +188,27 @@ handle_output_destroy(struct wl_listener *listener, void *data) { output_destroy(output); } +void +handle_output_gamma_control_set_gamma(struct wl_listener *listener, + void *data) { + struct cg_server *server = + wl_container_of(listener, server, gamma_control_set_gamma); + const struct wlr_gamma_control_manager_v1_set_gamma_event *event = data; + + struct wlr_gamma_control_v1 *gamma_control = + wlr_gamma_control_manager_v1_get_control(server->gamma_control, + event->output); + + struct wlr_output_state pending = {0}; + wlr_gamma_control_v1_apply(gamma_control, &pending); + if(!wlr_output_test_state(event->output, &pending)) { + wlr_gamma_control_v1_send_failed_and_destroy(gamma_control); + } else { + wlr_output_commit_state(event->output, &pending); + wlr_output_schedule_frame(event->output); + } +} + static void handle_output_frame(struct wl_listener *listener, void *data) { struct cg_output *output = wl_container_of(listener, output, frame); @@ -621,7 +643,6 @@ handle_new_output(struct wl_listener *listener, void *data) { if(!reinit) { output->server = server; - output->last_scanned_out_view = NULL; output->name = strdup(wlr_output->name); struct cg_output_priorities *it; diff --git a/output.h b/output.h index 384f56b..5c9fb59 100644 --- a/output.h +++ b/output.h @@ -32,7 +32,6 @@ struct cg_output { struct wlr_box layout_box; int curr_workspace; int priority; - struct cg_view *last_scanned_out_view; enum output_role role; bool destroyed; char *name; @@ -76,4 +75,6 @@ void output_make_workspace_fullscreen(struct cg_output *output, int ws); int output_get_num(const struct cg_output *output); +void +handle_output_gamma_control_set_gamma(struct wl_listener *listener, void *data); #endif diff --git a/server.h b/server.h index 0df8cd3..90fc117 100644 --- a/server.h +++ b/server.h @@ -29,6 +29,8 @@ struct cg_server { struct wlr_idle_notifier_v1 *idle; struct wlr_idle_inhibit_manager_v1 *idle_inhibit_v1; struct wl_listener new_idle_inhibitor_v1; + struct wlr_gamma_control_manager_v1 *gamma_control; + struct wl_listener gamma_control_set_gamma; struct wl_list inhibitors; struct wlr_output_layout *output_layout;