|
|
@ -517,13 +517,34 @@ static bool scan_out_fullscreen_view(struct sway_output *output,
|
|
|
|
return wlr_output_commit(wlr_output);
|
|
|
|
return wlr_output_commit(wlr_output);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void get_frame_damage(struct sway_output *output,
|
|
|
|
|
|
|
|
pixman_region32_t *frame_damage) {
|
|
|
|
|
|
|
|
struct wlr_output *wlr_output = output->wlr_output;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int width, height;
|
|
|
|
|
|
|
|
wlr_output_transformed_resolution(wlr_output, &width, &height);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pixman_region32_init(frame_damage);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum wl_output_transform transform =
|
|
|
|
|
|
|
|
wlr_output_transform_invert(wlr_output->transform);
|
|
|
|
|
|
|
|
wlr_region_transform(frame_damage, &output->damage_ring.current,
|
|
|
|
|
|
|
|
transform, width, height);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (debug.damage != DAMAGE_DEFAULT) {
|
|
|
|
|
|
|
|
pixman_region32_union_rect(frame_damage, frame_damage,
|
|
|
|
|
|
|
|
0, 0, wlr_output->width, wlr_output->height);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int output_repaint_timer_handler(void *data) {
|
|
|
|
static int output_repaint_timer_handler(void *data) {
|
|
|
|
struct sway_output *output = data;
|
|
|
|
struct sway_output *output = data;
|
|
|
|
if (output->wlr_output == NULL) {
|
|
|
|
struct wlr_output *wlr_output = output->wlr_output;
|
|
|
|
|
|
|
|
if (wlr_output == NULL) {
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
output->wlr_output->frame_pending = false;
|
|
|
|
wlr_output->frame_pending = false;
|
|
|
|
|
|
|
|
|
|
|
|
struct sway_workspace *workspace = output->current.active_workspace;
|
|
|
|
struct sway_workspace *workspace = output->current.active_workspace;
|
|
|
|
if (workspace == NULL) {
|
|
|
|
if (workspace == NULL) {
|
|
|
@ -575,10 +596,22 @@ static int output_repaint_timer_handler(void *data) {
|
|
|
|
struct timespec now;
|
|
|
|
struct timespec now;
|
|
|
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
|
|
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
|
|
|
|
|
|
|
|
|
|
|
output_render(output, &now, &damage);
|
|
|
|
output_render(output, &damage);
|
|
|
|
|
|
|
|
|
|
|
|
pixman_region32_fini(&damage);
|
|
|
|
pixman_region32_fini(&damage);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pixman_region32_t frame_damage;
|
|
|
|
|
|
|
|
get_frame_damage(output, &frame_damage);
|
|
|
|
|
|
|
|
wlr_output_set_damage(wlr_output, &frame_damage);
|
|
|
|
|
|
|
|
pixman_region32_fini(&frame_damage);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!wlr_output_commit(wlr_output)) {
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wlr_damage_ring_rotate(&output->damage_ring);
|
|
|
|
|
|
|
|
output->last_frame = now;
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|