labwc/src/common/scene-helpers.c

93 lines
2.5 KiB
C
Raw Normal View History

2022-02-21 03:18:38 +01:00
// SPDX-License-Identifier: GPL-2.0-only
#include <assert.h>
#include <wlr/types/wlr_output.h>
2022-02-21 03:18:38 +01:00
#include <wlr/types/wlr_scene.h>
#include <wlr/util/log.h>
2023-01-31 03:35:13 +01:00
#include "common/scene-helpers.h"
#include "labwc.h"
#include "magnifier.h"
#include "output-state.h"
2022-02-21 03:18:38 +01:00
struct wlr_surface *
lab_wlr_surface_from_node(struct wlr_scene_node *node)
{
struct wlr_scene_buffer *buffer;
struct wlr_scene_surface *scene_surface;
if (node && node->type == WLR_SCENE_NODE_BUFFER) {
buffer = wlr_scene_buffer_from_node(node);
scene_surface = wlr_scene_surface_try_from_buffer(buffer);
if (scene_surface) {
return scene_surface->surface;
}
}
return NULL;
}
struct wlr_scene_node *
lab_wlr_scene_get_prev_node(struct wlr_scene_node *node)
{
assert(node);
struct wlr_scene_node *prev;
prev = wl_container_of(node->link.prev, node, link);
if (&prev->link == &node->parent->children) {
return NULL;
}
return prev;
}
/*
* This is a copy of wlr_scene_output_commit()
* as it doesn't use the pending state at all.
*/
bool
lab_wlr_scene_output_commit(struct wlr_scene_output *scene_output,
struct wlr_output_state *state)
{
assert(scene_output);
assert(state);
struct wlr_output *wlr_output = scene_output->output;
struct output *output = wlr_output->data;
bool wants_magnification = output_wants_magnification(output);
/*
* FIXME: Regardless of wants_magnification, we are currently adding
* damages to next frame when magnifier is shown, which forces
* rendering on every output commit and overloads CPU.
* We also need to verify the necessity of wants_magnification.
*/
if (!wlr_output->needs_frame && !pixman_region32_not_empty(
&scene_output->damage_ring.current) && !wants_magnification) {
return true;
}
if (!wlr_scene_output_build_state(scene_output, state, NULL)) {
wlr_log(WLR_ERROR, "Failed to build output state for %s",
wlr_output->name);
return false;
}
struct wlr_box additional_damage = {0};
if (state->buffer && is_magnify_on()) {
magnify(output, state->buffer, &additional_damage);
}
if (state == &output->pending) {
if (!wlr_output_commit(wlr_output)) {
wlr_log(WLR_INFO, "Failed to commit output %s",
wlr_output->name);
return false;
}
} else if (!wlr_output_commit_state(wlr_output, state)) {
wlr_log(WLR_INFO, "Failed to commit state for output %s",
wlr_output->name);
return false;
}
if (!wlr_box_empty(&additional_damage)) {
wlr_damage_ring_add_box(&scene_output->damage_ring, &additional_damage);
}
return true;
}