2024-01-08 22:58:58 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
|
2025-07-28 01:22:10 -04:00
|
|
|
#include <wlr/types/wlr_tearing_control_v1.h>
|
2024-05-27 16:27:35 +02:00
|
|
|
#include "common/mem.h"
|
2024-01-08 22:58:58 +02:00
|
|
|
#include "labwc.h"
|
|
|
|
|
#include "view.h"
|
|
|
|
|
|
|
|
|
|
struct tearing_controller {
|
2025-06-26 18:23:09 +09:00
|
|
|
struct wlr_tearing_control_v1 *tearing_control;
|
|
|
|
|
struct wl_listener set_hint;
|
|
|
|
|
struct wl_listener destroy;
|
2024-01-08 22:58:58 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void
|
2025-06-26 18:23:09 +09:00
|
|
|
handle_controller_set_hint(struct wl_listener *listener, void *data)
|
2024-01-08 22:58:58 +02:00
|
|
|
{
|
|
|
|
|
struct tearing_controller *controller = wl_container_of(listener, controller, set_hint);
|
|
|
|
|
struct view *view = view_from_wlr_surface(controller->tearing_control->surface);
|
2024-08-06 22:23:10 +02:00
|
|
|
if (view) {
|
|
|
|
|
/*
|
|
|
|
|
* tearing_control->current is actually an enum:
|
|
|
|
|
* WP_TEARING_CONTROL_V1_PRESENTATION_HINT_VSYNC = 0
|
|
|
|
|
* WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC = 1
|
|
|
|
|
*
|
|
|
|
|
* Using it as a bool here allows us to not ship the XML.
|
|
|
|
|
*/
|
|
|
|
|
view->tearing_hint = controller->tearing_control->current;
|
2024-01-08 22:58:58 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2025-06-26 18:23:09 +09:00
|
|
|
handle_controller_destroy(struct wl_listener *listener, void *data)
|
2024-01-08 22:58:58 +02:00
|
|
|
{
|
|
|
|
|
struct tearing_controller *controller = wl_container_of(listener, controller, destroy);
|
2024-05-27 16:27:35 +02:00
|
|
|
wl_list_remove(&controller->set_hint.link);
|
|
|
|
|
wl_list_remove(&controller->destroy.link);
|
2024-01-08 22:58:58 +02:00
|
|
|
free(controller);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2025-06-26 18:23:09 +09:00
|
|
|
handle_tearing_new_object(struct wl_listener *listener, void *data)
|
2024-01-08 22:58:58 +02:00
|
|
|
{
|
|
|
|
|
struct wlr_tearing_control_v1 *tearing_control = data;
|
|
|
|
|
|
|
|
|
|
enum wp_tearing_control_v1_presentation_hint hint =
|
|
|
|
|
wlr_tearing_control_manager_v1_surface_hint_from_surface
|
tree-wide: auto-replace of (struct server *)
#!/bin/bash
read -r -d '' EXPRS << EOF
s/xwayland->server/xwayland->svr/g;
s/\t*struct server \*server;\n//g;
s/\t*struct server \*server =.*?;\n//gs;
s/\t*.* = ([a-z_]*->)*server[;,]\n//g;
s/\{\n\n/\{\n/g;
s/\n\n+/\n\n/g;
s/\(\s*struct server \*server\)/(void)/g;
s/\(\s*struct server \*server,\s*/(/g;
s/,\s*struct server \*server\)/)/g;
s/,\s*struct server \*server,\s*/, /g;
s/\(\s*([a-z_]*->)*server\)/()/g;
s/\(\s*([a-z_]*->)*server,\s*/(/g;
s/,\s*([a-z_]*->)*server\)/)/g;
s/,\s*([a-z_]*->)*server,\s*/, /g;
s/([a-z_]*->)*server->/g_server./g;
s/xwayland->svr/xwayland->server/g;
EOF
find src include \( -name \*.c -o -name \*.h \) -exec \
perl -0777 -i -pe "$EXPRS" \{\} \;
2026-02-23 11:56:39 -05:00
|
|
|
(g_server.tearing_control, tearing_control->surface);
|
2024-01-08 22:58:58 +02:00
|
|
|
wlr_log(WLR_DEBUG, "New presentation hint %d received for surface %p",
|
|
|
|
|
hint, tearing_control->surface);
|
|
|
|
|
|
2024-05-27 16:27:35 +02:00
|
|
|
struct tearing_controller *controller = znew(*controller);
|
2024-01-08 22:58:58 +02:00
|
|
|
controller->tearing_control = tearing_control;
|
2024-05-27 16:27:35 +02:00
|
|
|
|
2025-06-26 18:23:09 +09:00
|
|
|
controller->set_hint.notify = handle_controller_set_hint;
|
2024-01-08 22:58:58 +02:00
|
|
|
wl_signal_add(&tearing_control->events.set_hint, &controller->set_hint);
|
2024-05-27 16:27:35 +02:00
|
|
|
|
2025-06-26 18:23:09 +09:00
|
|
|
controller->destroy.notify = handle_controller_destroy;
|
2024-01-08 22:58:58 +02:00
|
|
|
wl_signal_add(&tearing_control->events.destroy, &controller->destroy);
|
|
|
|
|
}
|