Fix gamma control

This commit is contained in:
project-repo 2023-12-25 16:50:53 +01:00
commit 0aaf2d070b
4 changed files with 32 additions and 5 deletions

View file

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

View file

@ -18,6 +18,7 @@
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_cursor.h>
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_gamma_control_v1.h>
#include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_layout.h>
#include <wlr/types/wlr_scene.h>
@ -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;

View file

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

View file

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