|
|
|
@ -9,6 +9,7 @@
|
|
|
|
|
#include <wlr/render/swapchain.h>
|
|
|
|
|
#include <wlr/render/wlr_renderer.h>
|
|
|
|
|
#include <wlr/types/wlr_buffer.h>
|
|
|
|
|
#include <wlr/types/wlr_gamma_control_v1.h>
|
|
|
|
|
#include <wlr/types/wlr_matrix.h>
|
|
|
|
|
#include <wlr/types/wlr_output_layout.h>
|
|
|
|
|
#include <wlr/types/wlr_output.h>
|
|
|
|
@ -564,6 +565,7 @@ static int output_repaint_timer_handler(void *data) {
|
|
|
|
|
wlr_output->frame_pending = false;
|
|
|
|
|
|
|
|
|
|
if (!wlr_output->needs_frame &&
|
|
|
|
|
!output->gamma_lut_changed &&
|
|
|
|
|
!pixman_region32_not_empty(&output->damage_ring.current)) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@ -578,6 +580,19 @@ static int output_repaint_timer_handler(void *data) {
|
|
|
|
|
fullscreen_con = workspace->current.fullscreen;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (output->gamma_lut_changed) {
|
|
|
|
|
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, &wlr_output->pending)) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (!wlr_output_test(wlr_output)) {
|
|
|
|
|
wlr_output_rollback(wlr_output);
|
|
|
|
|
wlr_gamma_control_v1_send_failed_and_destroy(gamma_control);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pixman_region32_t frame_damage;
|
|
|
|
|
get_frame_damage(output, &frame_damage);
|
|
|
|
|
wlr_output_set_damage(wlr_output, &frame_damage);
|
|
|
|
@ -1076,6 +1091,16 @@ void handle_output_layout_change(struct wl_listener *listener,
|
|
|
|
|
update_output_manager_config(server);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void handle_gamma_control_set_gamma(struct wl_listener *listener, void *data) {
|
|
|
|
|
struct sway_server *server =
|
|
|
|
|
wl_container_of(listener, server, gamma_control_set_gamma);
|
|
|
|
|
const struct wlr_gamma_control_manager_v1_set_gamma_event *event = data;
|
|
|
|
|
|
|
|
|
|
struct sway_output *output = event->output->data;
|
|
|
|
|
output->gamma_lut_changed = true;
|
|
|
|
|
wlr_output_schedule_frame(output->wlr_output);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void output_manager_apply(struct sway_server *server,
|
|
|
|
|
struct wlr_output_configuration_v1 *config, bool test_only) {
|
|
|
|
|
// TODO: perform atomic tests on the whole backend atomically
|
|
|
|
|