From: Aida JonikienÄ— aidas957@gmail.com
Some compositors (like Mutter in nested mode) don't support the relative motion protocol (which causes winewayland to fail to load even if it's used for simple apps like winecfg). --- dlls/winewayland.drv/wayland.c | 13 +++++-------- dlls/winewayland.drv/wayland_pointer.c | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/dlls/winewayland.drv/wayland.c b/dlls/winewayland.drv/wayland.c index 5fdd8d80712..537f59c4e24 100644 --- a/dlls/winewayland.drv/wayland.c +++ b/dlls/winewayland.drv/wayland.c @@ -288,16 +288,13 @@ BOOL wayland_process_init(void) ERR("Wayland compositor doesn't support wl_subcompositor\n"); return FALSE; } + + /* Check for optional globals. */ if (!process_wayland.zwp_pointer_constraints_v1) - { - ERR("Wayland compositor doesn't support zwp_pointer_constraints_v1\n"); - return FALSE; - } + ERR("Wayland compositor doesn't support optional zwp_pointer_constraints_v1 (pointer locking/confining won't work)\n"); + if (!process_wayland.zwp_relative_pointer_manager_v1) - { - ERR("Wayland compositor doesn't support zwp_relative_pointer_manager_v1\n"); - return FALSE; - } + ERR("Wayland compositor doesn't support optional zwp_relative_pointer_manager_v1 (relative motion won't work)\n");
__wine_set_user_driver(&waylanddrv_funcs, WINE_GDI_DRIVER_VERSION); process_wayland.initialized = TRUE; diff --git a/dlls/winewayland.drv/wayland_pointer.c b/dlls/winewayland.drv/wayland_pointer.c index 1d8acaeabd2..1a224bd7a68 100644 --- a/dlls/winewayland.drv/wayland_pointer.c +++ b/dlls/winewayland.drv/wayland_pointer.c @@ -778,6 +778,14 @@ static void wayland_pointer_update_constraint(struct wl_surface *wl_surface, { struct wayland_pointer *pointer = &process_wayland.pointer; BOOL needs_relative, needs_lock, needs_confine; + static unsigned int once; + + if (!process_wayland.zwp_pointer_constraints_v1) + { + if (!once++) + ERR("This function requires zwp_pointer_constraints_v1\n"); + return; + }
needs_lock = wl_surface && (confine_rect || covers_vscreen) && !pointer->cursor.wl_surface; @@ -856,6 +864,13 @@ static void wayland_pointer_update_constraint(struct wl_surface *wl_surface, } }
+ if (!process_wayland.zwp_relative_pointer_manager_v1) + { + if (!once++) + ERR("zwp_relative_pointer_manager_v1 isn't supported, skipping relative motion\n"); + return; + } + needs_relative = !pointer->cursor.wl_surface && pointer->constraint_hwnd && pointer->constraint_hwnd == pointer->focused_hwnd;