Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/core/seat/cursor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,11 @@ void wf::cursor_t::set_cursor(
}
}

if (ev->surface)
{
wf::xwayland_adjust_cursor(ev->surface);
}

wlr_cursor_set_surface(cursor, ev->surface, ev->hotspot_x, ev->hotspot_y);

last_cursor_name.clear();
Expand Down
1 change: 1 addition & 0 deletions src/view/view-impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ void xwayland_update_default_cursor();
void xwayland_bring_to_front(wlr_surface *surface);
int xwayland_get_pid();
wl_client *xwayland_get_client();
void xwayland_adjust_cursor(wlr_surface *cursor_surface);

void init_desktop_apis();
void fini_desktop_apis();
Expand Down
61 changes: 61 additions & 0 deletions src/view/xwayland.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,3 +347,64 @@ wl_client*wf::xwayland_get_client()
return nullptr;
#endif
}

#if WF_HAS_XWAYLAND
static void update_xwayland_cursor_surface_scale(wlr_surface *surface, int32_t scale)
{
if (!surface || (scale <= 0))
{
return;
}

surface->current.scale = scale;

int width = surface->current.buffer_width;
int height = surface->current.buffer_height;
wlr_output_transform_coords(surface->current.transform, &width, &height);

width /= scale;
height /= scale;

surface->current.width = width;
surface->current.height = height;
}

#endif

void wf::xwayland_adjust_cursor(wlr_surface *cursor_surface)
{
#if WF_HAS_XWAYLAND
if (wl_resource_get_client(cursor_surface->resource) == wf::xwayland_get_client())
{
static wf::option_wrapper_t<bool> force_xwayland_scaling{"workarounds/force_xwayland_scaling"};
static wf::wl_listener_wrapper on_cursor_destroy;
static wf::wl_listener_wrapper on_cursor_commit;
static wlr_surface *last_cursor_surface = nullptr;

if (force_xwayland_scaling && (last_cursor_surface != cursor_surface))
{
on_cursor_destroy.set_callback([] (void*)
{
on_cursor_destroy.disconnect();
on_cursor_commit.disconnect();
last_cursor_surface = nullptr;
});

on_cursor_commit.set_callback([] (void*)
{
auto& ol = wf::get_core().output_layout;
auto wo = ol->find_closest_output(wf::get_core().get_cursor_position());
update_xwayland_cursor_surface_scale(last_cursor_surface, wo->handle->scale);
});

on_cursor_destroy.connect(&cursor_surface->events.destroy);
on_cursor_commit.connect(&cursor_surface->events.commit);
last_cursor_surface = cursor_surface;
on_cursor_commit.emit(NULL);
}
}

#else
(void)cursor_surface;
#endif
}
6 changes: 6 additions & 0 deletions src/view/xwayland/xwayland-surface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,9 @@ void wf::xw::xwayland_surface_node_t::apply_state(scene::surface_state_t&& state

wlr_surface_node_t::apply_state(std::move(state));
}

std::optional<wf::scene::input_node_t> wf::xw::xwayland_surface_node_t::find_node_at(const wf::pointf_t& at)
{
auto local = to_local(at);
return wlr_surface_node_t::find_node_at(local);
}
1 change: 1 addition & 0 deletions src/view/xwayland/xwayland-surface.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class xwayland_surface_node_t : public wf::scene::wlr_surface_node_t
std::string stringify() const override;
wf::pointf_t to_local(const wf::pointf_t& point) override;
wf::pointf_t to_global(const wf::pointf_t& point) override;
std::optional<wf::scene::input_node_t> find_node_at(const wf::pointf_t& at) override;
void apply_state(scene::surface_state_t&& state) override;

void set_scale(float scale);
Expand Down
Loading