This commit is contained in:
Consolatis 2026-02-01 00:48:03 +01:00 committed by GitHub
commit 1550a85ced
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 20 additions and 68 deletions

View file

@ -95,6 +95,7 @@ jobs:
apt-get install -y git gcc clang gdb xwayland apt-get install -y git gcc clang gdb xwayland
apt-get build-dep -y labwc apt-get build-dep -y labwc
apt-get build-dep -y libwlroots-0.19-dev apt-get build-dep -y libwlroots-0.19-dev
apt-get build-dep -y libxkbcommon-dev
- name: Install FreeBSD dependencies - name: Install FreeBSD dependencies
if: matrix.name == 'FreeBSD' if: matrix.name == 'FreeBSD'
@ -121,7 +122,7 @@ jobs:
xbps-install -y git meson gcc clang pkg-config scdoc \ xbps-install -y git meson gcc clang pkg-config scdoc \
cairo-devel glib-devel libpng-devel librsvg-devel libxml2-devel \ cairo-devel glib-devel libpng-devel librsvg-devel libxml2-devel \
pango-devel wlroots0.19-devel gdb bash xorg-server-xwayland \ pango-devel wlroots0.19-devel gdb bash xorg-server-xwayland \
dejavu-fonts-ttf libsfdo-devel foot dejavu-fonts-ttf libsfdo-devel foot hwids
# These builds are executed on all runners # These builds are executed on all runners
- name: Build with gcc - name: Build with gcc

View file

@ -75,8 +75,6 @@ void xwayland_adjust_usable_area(struct view *view,
void xwayland_update_workarea(struct server *server); void xwayland_update_workarea(struct server *server);
void xwayland_reset_cursor(struct server *server);
void xwayland_flush(struct server *server); void xwayland_flush(struct server *server);
#endif /* HAVE_XWAYLAND */ #endif /* HAVE_XWAYLAND */

View file

@ -51,9 +51,9 @@ endif
add_project_arguments('-DLABWC_VERSION=@0@'.format(version), language: 'c') add_project_arguments('-DLABWC_VERSION=@0@'.format(version), language: 'c')
wlroots = dependency( wlroots = dependency(
'wlroots-0.19', 'wlroots-0.20',
default_options: ['default_library=static', 'examples=false'], default_options: ['default_library=static', 'examples=false'],
version: ['>=0.19.0', '<0.20.0'], version: ['>=0.20.0', '<0.21.0'],
) )
wlroots_has_xwayland = wlroots.get_variable('have_xwayland') == 'true' wlroots_has_xwayland = wlroots.get_variable('have_xwayland') == 'true'

View file

@ -1610,9 +1610,6 @@ void
cursor_reload(struct seat *seat) cursor_reload(struct seat *seat)
{ {
cursor_load(seat); cursor_load(seat);
#if HAVE_XWAYLAND
xwayland_reset_cursor(seat->server);
#endif
cursor_update_image(seat); cursor_update_image(seat);
} }

View file

@ -309,7 +309,8 @@ handle_keyboard_grab_destroy(struct wl_listener *listener, void *data)
{ {
struct input_method_relay *relay = struct input_method_relay *relay =
wl_container_of(listener, relay, keyboard_grab_destroy); wl_container_of(listener, relay, keyboard_grab_destroy);
struct wlr_input_method_keyboard_grab_v2 *keyboard_grab = data; struct wlr_input_method_keyboard_grab_v2 *keyboard_grab =
relay->input_method->keyboard_grab;
assert(keyboard_grab); assert(keyboard_grab);
wl_list_remove(&relay->keyboard_grab_destroy.link); wl_list_remove(&relay->keyboard_grab_destroy.link);
@ -583,11 +584,11 @@ input_method_relay_create(struct seat *seat)
relay->popup_tree = wlr_scene_tree_create(&seat->server->scene->tree); relay->popup_tree = wlr_scene_tree_create(&seat->server->scene->tree);
relay->new_text_input.notify = handle_new_text_input; relay->new_text_input.notify = handle_new_text_input;
wl_signal_add(&seat->server->text_input_manager->events.text_input, wl_signal_add(&seat->server->text_input_manager->events.new_text_input,
&relay->new_text_input); &relay->new_text_input);
relay->new_input_method.notify = handle_new_input_method; relay->new_input_method.notify = handle_new_input_method;
wl_signal_add(&seat->server->input_method_manager->events.input_method, wl_signal_add(&seat->server->input_method_manager->events.new_input_method,
&relay->new_input_method); &relay->new_input_method);
relay->focused_surface_destroy.notify = handle_focused_surface_destroy; relay->focused_surface_destroy.notify = handle_focused_surface_destroy;

View file

@ -17,6 +17,7 @@
#include <wlr/types/wlr_ext_foreign_toplevel_list_v1.h> #include <wlr/types/wlr_ext_foreign_toplevel_list_v1.h>
#include <wlr/types/wlr_ext_image_capture_source_v1.h> #include <wlr/types/wlr_ext_image_capture_source_v1.h>
#include <wlr/types/wlr_ext_image_copy_capture_v1.h> #include <wlr/types/wlr_ext_image_copy_capture_v1.h>
#include <wlr/types/wlr_fixes.h>
#include <wlr/types/wlr_foreign_toplevel_management_v1.h> #include <wlr/types/wlr_foreign_toplevel_management_v1.h>
#include <wlr/types/wlr_fractional_scale_v1.h> #include <wlr/types/wlr_fractional_scale_v1.h>
#include <wlr/types/wlr_input_method_v2.h> #include <wlr/types/wlr_input_method_v2.h>
@ -256,6 +257,7 @@ allow_for_sandbox(const struct wlr_security_context_v1_state *security_state,
"wl_data_device_manager", /* would be great if we could drop this one */ "wl_data_device_manager", /* would be great if we could drop this one */
"wl_seat", "wl_seat",
"xdg_wm_base", "xdg_wm_base",
"wl_fixes",
/* enhanced */ /* enhanced */
"wl_output", "wl_output",
"wl_drm", "wl_drm",
@ -436,6 +438,8 @@ server_init(struct server *server)
server->wl_event_loop = wl_display_get_event_loop(server->wl_display); server->wl_event_loop = wl_display_get_event_loop(server->wl_display);
wlr_fixes_create(server->wl_display, 1);
/* Catch signals */ /* Catch signals */
server->sighup_source = wl_event_loop_add_signal( server->sighup_source = wl_event_loop_add_signal(
server->wl_event_loop, SIGHUP, handle_sighup, server); server->wl_event_loop, SIGHUP, handle_sighup, server);

View file

@ -1200,60 +1200,11 @@ xwayland_server_init(struct server *server, struct wlr_compositor *compositor)
server->seat.xcursor_manager, XCURSOR_DEFAULT, 1); server->seat.xcursor_manager, XCURSOR_DEFAULT, 1);
if (xcursor) { if (xcursor) {
struct wlr_xcursor_image *image = xcursor->images[0]; struct wlr_xcursor_image *image = xcursor->images[0];
wlr_xwayland_set_cursor(server->xwayland, image->buffer, struct wlr_buffer *cursor_buffer = wlr_xcursor_image_get_buffer(image);
image->width * 4, image->width, if (cursor_buffer) {
image->height, image->hotspot_x, wlr_xwayland_set_cursor(server->xwayland, cursor_buffer,
image->hotspot_y); image->hotspot_x, image->hotspot_y);
} }
}
void
xwayland_reset_cursor(struct server *server)
{
/*
* As xwayland caches the pixel data when not yet started up
* due to the delayed lazy startup approach, we do have to
* re-set the xwayland cursor image. Otherwise the first X11
* client connected will cause the xwayland server to use
* the cached (and potentially destroyed) pixel data.
*
* Calling this function after reloading the cursor theme
* ensures that the cached pixel data keeps being valid.
*
* To reproduce:
* - Compile with b_sanitize=address,undefined
* - Start labwc (nothing in autostart that could create
* a X11 connection, e.g. no GTK or X11 application)
* - Reconfigure
* - Start some X11 client
*/
if (!server->xwayland) {
return;
}
struct wlr_xcursor *xcursor = wlr_xcursor_manager_get_xcursor(
server->seat.xcursor_manager, XCURSOR_DEFAULT, 1);
if (xcursor && !server->xwayland->xwm) {
/* Prevents setting the cursor on an active xwayland server */
struct wlr_xcursor_image *image = xcursor->images[0];
wlr_xwayland_set_cursor(server->xwayland, image->buffer,
image->width * 4, image->width,
image->height, image->hotspot_x,
image->hotspot_y);
return;
}
if (server->xwayland->cursor) {
/*
* The previous configured theme has set the
* default cursor or the xwayland server is
* currently running but still has a cached
* xcursor set that will be used on the next
* xwayland destroy -> lazy startup cycle.
*/
zfree(server->xwayland->cursor);
} }
} }

View file

@ -1,7 +1,7 @@
[wrap-git] [wrap-git]
url = https://gitlab.freedesktop.org/wlroots/wlroots.git url = https://gitlab.freedesktop.org/wlroots/wlroots.git
revision = 0.19 revision = master
[provide] [provide]
dependency_names = wlroots-0.19 dependency_names = wlroots-0.20
wlroots-0.19=wlroots wlroots-0.20=wlroots