wayland: Use the tool's current_tablet device instead of caching it
The tablet tool is initialized with a device but if that device is later removed we never update tool->device. This eventually causes a crash when we're passing that device into meta_wayland_input_invalidate_focus(). The tool keeps track of the current tablet anyway so instead of caching this pointer in the tool, use the current tablet's device. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3642 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3959>
This commit is contained in:
parent
2d64965a55
commit
e4004a7c4f
3 changed files with 5 additions and 9 deletions
|
@ -362,7 +362,6 @@ meta_wayland_tablet_seat_lookup_pad (MetaWaylandTabletSeat *tablet_seat,
|
||||||
|
|
||||||
static MetaWaylandTabletTool *
|
static MetaWaylandTabletTool *
|
||||||
meta_wayland_tablet_seat_ensure_tool (MetaWaylandTabletSeat *tablet_seat,
|
meta_wayland_tablet_seat_ensure_tool (MetaWaylandTabletSeat *tablet_seat,
|
||||||
ClutterInputDevice *device,
|
|
||||||
ClutterInputDeviceTool *device_tool)
|
ClutterInputDeviceTool *device_tool)
|
||||||
{
|
{
|
||||||
MetaWaylandTabletTool *tool;
|
MetaWaylandTabletTool *tool;
|
||||||
|
@ -371,7 +370,7 @@ meta_wayland_tablet_seat_ensure_tool (MetaWaylandTabletSeat *tablet_seat,
|
||||||
|
|
||||||
if (!tool)
|
if (!tool)
|
||||||
{
|
{
|
||||||
tool = meta_wayland_tablet_tool_new (tablet_seat, device, device_tool);
|
tool = meta_wayland_tablet_tool_new (tablet_seat, device_tool);
|
||||||
g_hash_table_insert (tablet_seat->tools, device_tool, tool);
|
g_hash_table_insert (tablet_seat->tools, device_tool, tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,7 +398,7 @@ meta_wayland_tablet_seat_update (MetaWaylandTabletSeat *tablet_seat,
|
||||||
device_tool = clutter_event_get_device_tool (event);
|
device_tool = clutter_event_get_device_tool (event);
|
||||||
|
|
||||||
if (device && device_tool)
|
if (device && device_tool)
|
||||||
tool = meta_wayland_tablet_seat_ensure_tool (tablet_seat, device, device_tool);
|
tool = meta_wayland_tablet_seat_ensure_tool (tablet_seat, device_tool);
|
||||||
|
|
||||||
if (!tool)
|
if (!tool)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
struct _MetaWaylandTabletTool
|
struct _MetaWaylandTabletTool
|
||||||
{
|
{
|
||||||
MetaWaylandTabletSeat *seat;
|
MetaWaylandTabletSeat *seat;
|
||||||
ClutterInputDevice *device;
|
|
||||||
ClutterInputDeviceTool *device_tool;
|
ClutterInputDeviceTool *device_tool;
|
||||||
struct wl_list resource_list;
|
struct wl_list resource_list;
|
||||||
struct wl_list focus_resource_list;
|
struct wl_list focus_resource_list;
|
||||||
|
@ -423,7 +422,6 @@ tool_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
|
||||||
|
|
||||||
MetaWaylandTabletTool *
|
MetaWaylandTabletTool *
|
||||||
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||||
ClutterInputDevice *device,
|
|
||||||
ClutterInputDeviceTool *device_tool)
|
ClutterInputDeviceTool *device_tool)
|
||||||
{
|
{
|
||||||
MetaWaylandCompositor *compositor =
|
MetaWaylandCompositor *compositor =
|
||||||
|
@ -435,7 +433,6 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||||
|
|
||||||
tool = g_new0 (MetaWaylandTabletTool, 1);
|
tool = g_new0 (MetaWaylandTabletTool, 1);
|
||||||
tool->seat = seat;
|
tool->seat = seat;
|
||||||
tool->device = device;
|
|
||||||
tool->device_tool = device_tool;
|
tool->device_tool = device_tool;
|
||||||
wl_list_init (&tool->resource_list);
|
wl_list_init (&tool->resource_list);
|
||||||
wl_list_init (&tool->focus_resource_list);
|
wl_list_init (&tool->focus_resource_list);
|
||||||
|
@ -634,7 +631,8 @@ meta_wayland_tablet_tool_set_current_surface (MetaWaylandTabletTool *tool,
|
||||||
|
|
||||||
tablet_seat = tool->seat;
|
tablet_seat = tool->seat;
|
||||||
input = meta_wayland_seat_get_input (tablet_seat->seat);
|
input = meta_wayland_seat_get_input (tablet_seat->seat);
|
||||||
meta_wayland_input_invalidate_focus (input, tool->device, NULL);
|
if (tool->current_tablet)
|
||||||
|
meta_wayland_input_invalidate_focus (input, tool->current_tablet->device, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1002,7 +1000,7 @@ meta_wayland_tablet_tool_get_grab_info (MetaWaylandTabletTool *tool,
|
||||||
meta_wayland_tablet_tool_can_grab_surface (tool, surface, serial))
|
meta_wayland_tablet_tool_can_grab_surface (tool, surface, serial))
|
||||||
{
|
{
|
||||||
if (device_out)
|
if (device_out)
|
||||||
*device_out = tool->device;
|
*device_out = tool->current_tablet ? NULL : tool->current_tablet->device;
|
||||||
|
|
||||||
if (x)
|
if (x)
|
||||||
*x = tool->grab_x;
|
*x = tool->grab_x;
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include "wayland/meta-wayland-types.h"
|
#include "wayland/meta-wayland-types.h"
|
||||||
|
|
||||||
MetaWaylandTabletTool * meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
MetaWaylandTabletTool * meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||||
ClutterInputDevice *device,
|
|
||||||
ClutterInputDeviceTool *device_tool);
|
ClutterInputDeviceTool *device_tool);
|
||||||
void meta_wayland_tablet_tool_free (MetaWaylandTabletTool *tool);
|
void meta_wayland_tablet_tool_free (MetaWaylandTabletTool *tool);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue