diff --git a/cage.c b/cage.c index 8f14746..647d7e8 100644 --- a/cage.c +++ b/cage.c @@ -496,11 +496,8 @@ main(int argc, char *argv[]) server.output_manager_test.notify = handle_output_manager_test; wl_signal_add(&server.output_manager_v1->events.test, &server.output_manager_test); - if (!wlr_gamma_control_manager_v1_create(server.wl_display)) { - wlr_log(WLR_ERROR, "Unable to create the gamma control manager"); - ret = 1; - goto end; - } + struct wlr_gamma_control_manager_v1 *gamma_control_mgr = wlr_gamma_control_manager_v1_create(server.wl_display); + wl_signal_add(&gamma_control_mgr->events.set_gamma, &server.set_gamma); struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard = wlr_virtual_keyboard_manager_v1_create(server.wl_display); diff --git a/seat.c b/seat.c index cdf8798..32c4d4b 100644 --- a/seat.c +++ b/seat.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -407,6 +408,28 @@ handle_new_keyboard(struct cg_seat *seat, struct wlr_keyboard *keyboard, bool vi wlr_seat_set_keyboard(seat->seat, keyboard); } +static void +handle_set_gamma(struct wl_listener *listener, void *data) +{ + struct cg_server *server = wl_container_of(listener, server, set_gamma); + struct wlr_gamma_control_manager_v1_set_gamma_event *event = data; + struct wlr_output_state state; + wlr_output_state_init(&state); + if (!wlr_gamma_control_v1_apply(event->control, &state)) { + wlr_output_state_finish(&state); + return; + } + + if (!wlr_output_test_state(event->output, &state)) { + wlr_gamma_control_v1_send_failed_and_destroy(event->control); + wlr_output_state_finish(&state); + return; + } + + wlr_output_commit_state(event->output, &state); + wlr_output_schedule_frame(event->output); +} + static void handle_virtual_keyboard(struct wl_listener *listener, void *data) { @@ -871,6 +894,8 @@ seat_create(struct cg_server *server, struct wlr_backend *backend) seat->new_input.notify = handle_new_input; wl_signal_add(&backend->events.new_input, &seat->new_input); + server->set_gamma.notify = handle_set_gamma; + server->new_virtual_keyboard.notify = handle_virtual_keyboard; server->new_virtual_pointer.notify = handle_virtual_pointer; diff --git a/server.h b/server.h index 00c2a61..3c99455 100644 --- a/server.h +++ b/server.h @@ -52,6 +52,7 @@ struct cg_server { struct wl_listener new_virtual_keyboard; struct wl_listener new_virtual_pointer; + struct wl_listener set_gamma; #if CAGE_HAS_XWAYLAND struct wl_listener new_xwayland_surface; #endif