diff --git a/include/waybox/output.h b/include/waybox/output.h index 323bb4d..a8192fe 100644 --- a/include/waybox/output.h +++ b/include/waybox/output.h @@ -18,10 +18,11 @@ struct wb_output { struct wlr_scene_tree *shell_top; } layers; -#if ! WLR_CHECK_VERSION(0, 17, 0) - /* DEPRECATED: Use a tool like swaybg instead */ +#if ! WLR_CHECK_VERSION(0, 18, 0) + /* DEPRECATED: Use a tool like swaybg or hyprpaper instead */ struct wlr_scene_rect *background; #endif + bool gamma_lut_changed; struct wlr_box geometry; struct wl_listener destroy; @@ -53,8 +54,9 @@ struct wb_view { struct wlr_box previous_geometry; }; -void output_frame_notify(struct wl_listener* listener, void *data); -void output_destroy_notify(struct wl_listener* listener, void *data); -void new_output_notify(struct wl_listener* listener, void *data); +void handle_gamma_control_set_gamma(struct wl_listener *listener, void *data); +void output_frame_notify(struct wl_listener *listener, void *data); +void output_destroy_notify(struct wl_listener *listener, void *data); +void new_output_notify(struct wl_listener *listener, void *data); #endif /* output.h */ diff --git a/include/waybox/server.h b/include/waybox/server.h index 9f68fc3..9c7b12d 100644 --- a/include/waybox/server.h +++ b/include/waybox/server.h @@ -43,6 +43,7 @@ struct wb_server { struct wlr_allocator *allocator; struct wlr_backend *backend; struct wlr_compositor *compositor; + struct wlr_gamma_control_manager_v1 *gamma_control_manager; struct wlr_idle_notifier_v1 *idle_notifier; struct wlr_output_layout *output_layout; struct wlr_xdg_output_manager_v1 *output_manager; @@ -65,6 +66,7 @@ struct wb_server { struct wlr_layer_shell_v1 *layer_shell; struct wlr_xdg_shell *xdg_shell; + struct wl_listener gamma_control_set_gamma; struct wl_listener new_layer_surface; struct wl_listener new_xdg_surface; struct wl_listener new_xdg_decoration; diff --git a/waybox/output.c b/waybox/output.c index 47ecb24..b6e8d0d 100644 --- a/waybox/output.c +++ b/waybox/output.c @@ -10,12 +10,30 @@ void output_frame_notify(struct wl_listener *listener, void *data) { wlr_output_layout_get_box(output->server->output_layout, output->wlr_output, &output->geometry); -#if ! WLR_CHECK_VERSION(0, 17, 0) +#if ! WLR_CHECK_VERSION(0, 18, 0) /* Update the background for the current output size. */ wlr_scene_rect_set_size(output->background, output->geometry.width, output->geometry.height); #endif + if (output->gamma_lut_changed) { + output->gamma_lut_changed = false; +#if WLR_CHECK_VERSION(0, 17, 0) + struct wlr_gamma_control_v1 *gamma_control = + wlr_gamma_control_manager_v1_get_control(output->server->gamma_control_manager, + output->wlr_output); + if (!wlr_gamma_control_v1_apply(gamma_control, &output->wlr_output->pending)) { + return; + } +#endif + if (!wlr_output_test(output->wlr_output)) { + wlr_output_rollback(output->wlr_output); +#if WLR_CHECK_VERSION(0, 17, 0) + wlr_gamma_control_v1_send_failed_and_destroy(gamma_control); +#endif + } + } + /* Render the scene if needed and commit the output */ wlr_scene_output_commit(scene_output); @@ -32,6 +50,13 @@ void output_request_state_notify(struct wl_listener *listener, void *data) { const struct wlr_output_event_request_state *event = data; wlr_output_commit_state(output->wlr_output, event->state); } + +void handle_gamma_control_set_gamma(struct wl_listener *listener, void *data) { + const struct wlr_gamma_control_manager_v1_set_gamma_event *event = data; + struct wb_output *output = event->output->data; + output->gamma_lut_changed = true; + wlr_output_schedule_frame(output->wlr_output); +} #endif void output_destroy_notify(struct wl_listener *listener, void *data) { @@ -68,19 +93,16 @@ void new_output_notify(struct wl_listener *listener, void *data) { #if WLR_CHECK_VERSION(0, 17, 0) struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output); + struct wlr_output_state state; + wlr_output_state_init(&state); + wlr_output_state_set_enabled(&state, true); + if (mode != NULL) { - struct wlr_output_state state = {0}; wlr_output_state_set_mode(&state, mode); - wlr_output_state_set_enabled(&state, true); - - if (!wlr_output_commit_state(wlr_output, &state)) { - wlr_output_state_finish(&state); - wlr_log_errno(WLR_ERROR, "%s", _("Couldn't commit state to output")); - return; - } - - wlr_output_state_finish(&state); } + + wlr_output_state_finish(&state); + wlr_output_commit_state(wlr_output, &state); #else if (!wl_list_empty(&wlr_output->modes)) { struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output); @@ -99,7 +121,7 @@ void new_output_notify(struct wl_listener *listener, void *data) { output->wlr_output = wlr_output; wlr_output->data = output; -#if ! WLR_CHECK_VERSION(0, 17, 0) +#if ! WLR_CHECK_VERSION(0, 18, 0) /* Set the background color */ float color[4] = {0.1875, 0.1875, 0.1875, 1.0}; output->background = wlr_scene_rect_create(&server->scene->tree, 0, 0, color); diff --git a/waybox/server.c b/waybox/server.c index 200899a..3a22a92 100644 --- a/waybox/server.c +++ b/waybox/server.c @@ -96,11 +96,18 @@ bool wb_start_server(struct wb_server* server) { wlr_log(WLR_INFO, "%s: WAYLAND_DISPLAY=%s", _("Running Wayland compositor on Wayland display"), socket); setenv("WAYLAND_DISPLAY", socket, true); - wlr_gamma_control_manager_v1_create(server->wl_display); + wlr_data_device_manager_create(server->wl_display); + + server->gamma_control_manager = + wlr_gamma_control_manager_v1_create(server->wl_display); +#if WLR_CHECK_VERSION(0, 17, 0) + server->gamma_control_set_gamma.notify = handle_gamma_control_set_gamma; + wl_signal_add(&server->gamma_control_manager->events.set_gamma, &server->gamma_control_set_gamma); +#endif + wlr_screencopy_manager_v1_create(server->wl_display); server->idle_notifier = wlr_idle_notifier_v1_create(server->wl_display); - wlr_data_device_manager_create(server->wl_display); wl_list_init(&server->views); init_xdg_decoration(server); init_layer_shell(server);