]> git.mdlowis.com Git - proto/labwc.git/commitdiff
chase: handle gamma-control-v1 set_gamma events
authorJohan Malm <jgm323@gmail.com>
Fri, 1 Dec 2023 17:07:05 +0000 (17:07 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Fri, 1 Dec 2023 22:30:17 +0000 (22:30 +0000)
References:
- https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4046
- https://github.com/swaywm/sway/pull/7494/files

Fixes: #1262
include/labwc.h
src/output.c
src/server.c

index 261883c5bfa97fc341fb1adf85b8a2393fe4f7a6..f288de355d4662bf3ecc825e1ad49eb0eae20b34 100644 (file)
@@ -17,6 +17,7 @@
 #include <wlr/types/wlr_cursor.h>
 #include <wlr/types/wlr_data_device.h>
 #include <wlr/types/wlr_foreign_toplevel_management_v1.h>
+#include <wlr/types/wlr_gamma_control_v1.h>
 #include <wlr/types/wlr_input_device.h>
 #include <wlr/types/wlr_keyboard.h>
 #include <wlr/types/wlr_keyboard_group.h>
@@ -291,6 +292,9 @@ struct server {
         */
        int pending_output_layout_change;
 
+       struct wlr_gamma_control_manager_v1 *gamma_control_manager_v1;
+       struct wl_listener gamma_control_set_gamma;
+
        struct session_lock *session_lock;
 
        struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
@@ -343,6 +347,7 @@ struct output {
        struct wl_listener request_state;
 
        bool leased;
+       bool gamma_lut_changed;
 };
 
 #undef LAB_NR_LAYERS
index 003be96383165f0cd77c341a6d0f88ea145f95e2..c631793617da167e12c5bcaf0ee22da769dd816d 100644 (file)
@@ -33,6 +33,36 @@ output_frame_notify(struct wl_listener *listener, void *data)
        if (!output_is_usable(output)) {
                return;
        }
+
+       struct wlr_output *wlr_output = output->wlr_output;
+       struct server *server = output->server;
+
+       if (output->gamma_lut_changed) {
+               struct wlr_output_state pending;
+               wlr_output_state_init(&pending);
+               if (!wlr_scene_output_build_state(output->scene_output, &pending, NULL)) {
+                       return;
+               }
+               output->gamma_lut_changed = false;
+               struct wlr_gamma_control_v1 *gamma_control =
+                       wlr_gamma_control_manager_v1_get_control(
+                               server->gamma_control_manager_v1, wlr_output);
+               if (!wlr_gamma_control_v1_apply(gamma_control, &pending)) {
+                       wlr_output_state_finish(&pending);
+                       return;
+               }
+
+               if (!wlr_output_commit_state(output->wlr_output, &pending)) {
+                       wlr_gamma_control_v1_send_failed_and_destroy(gamma_control);
+                       wlr_output_state_finish(&pending);
+                       return;
+               }
+
+               wlr_damage_ring_rotate(&output->scene_output->damage_ring);
+               wlr_output_state_finish(&pending);
+               return;
+       }
+
        if (lab_wlr_scene_output_commit(output->scene_output)) {
                struct timespec now = { 0 };
                clock_gettime(CLOCK_MONOTONIC, &now);
@@ -314,6 +344,9 @@ new_output_notify(struct wl_listener *listener, void *data)
 void
 output_init(struct server *server)
 {
+       server->gamma_control_manager_v1 =
+               wlr_gamma_control_manager_v1_create(server->wl_display);
+
        server->new_output.notify = new_output_notify;
        wl_signal_add(&server->backend->events.new_output, &server->new_output);
 
@@ -529,6 +562,17 @@ handle_output_layout_change(struct wl_listener *listener, void *data)
        do_output_layout_change(server);
 }
 
+static void
+handle_gamma_control_set_gamma(struct wl_listener *listener, void *data)
+{
+       struct server *server = wl_container_of(listener, server, gamma_control_set_gamma);
+       const struct wlr_gamma_control_manager_v1_set_gamma_event *event = data;
+
+       struct output *output = event->output->data;
+       output->gamma_lut_changed = true;
+       wlr_output_schedule_frame(output->wlr_output);
+}
+
 void
 output_manager_init(struct server *server)
 {
@@ -541,6 +585,10 @@ output_manager_init(struct server *server)
        server->output_manager_apply.notify = handle_output_manager_apply;
        wl_signal_add(&server->output_manager->events.apply,
                &server->output_manager_apply);
+
+       server->gamma_control_set_gamma.notify = handle_gamma_control_set_gamma;
+       wl_signal_add(&server->gamma_control_manager_v1->events.set_gamma,
+               &server->gamma_control_set_gamma);
 }
 
 struct output *
index 26a41634ca9835e97965454c31344717c891917e..bd21d775cb5b471f9d7ca74d57e8e96c1ddca580 100644 (file)
@@ -375,7 +375,6 @@ server_init(struct server *server)
        wlr_export_dmabuf_manager_v1_create(server->wl_display);
        wlr_screencopy_manager_v1_create(server->wl_display);
        wlr_data_control_manager_v1_create(server->wl_display);
-       wlr_gamma_control_manager_v1_create(server->wl_display);
        wlr_viewporter_create(server->wl_display);
        wlr_single_pixel_buffer_manager_v1_create(server->wl_display);