[mutter] wayland: Make seat devices GObjects
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] wayland: Make seat devices GObjects
- Date: Fri, 9 Sep 2016 03:10:33 +0000 (UTC)
commit e5a359a032f7ae572efeb3a7c2232a40de395d0d
Author: Jonas Ådahl <jadahl gmail com>
Date: Fri Apr 1 16:39:30 2016 +0800
wayland: Make seat devices GObjects
This will make it possible to add signals and other GObject features.
https://bugzilla.gnome.org/show_bug.cgi?id=771050
src/core/display.c | 2 +-
src/wayland/meta-pointer-confinement-wayland.c | 2 +-
src/wayland/meta-wayland-data-device.c | 47 ++++++++--------
src/wayland/meta-wayland-keyboard.c | 39 +++++++++-----
src/wayland/meta-wayland-keyboard.h | 17 +++++--
src/wayland/meta-wayland-pointer-constraints.c | 6 +-
src/wayland/meta-wayland-pointer-gesture-pinch.c | 5 +-
src/wayland/meta-wayland-pointer-gesture-swipe.c | 5 +-
src/wayland/meta-wayland-pointer.c | 32 +++++++----
src/wayland/meta-wayland-pointer.h | 14 ++++--
src/wayland/meta-wayland-popup.c | 4 +-
src/wayland/meta-wayland-seat.c | 64 +++++++++++++---------
src/wayland/meta-wayland-seat.h | 7 ++-
src/wayland/meta-wayland-tablet-seat.c | 2 +-
src/wayland/meta-wayland-touch.c | 28 +++++++---
src/wayland/meta-wayland-touch.h | 17 +++++--
src/wayland/meta-wayland-wl-shell.c | 2 +-
src/wayland/meta-wayland-xdg-shell.c | 5 +-
src/wayland/meta-wayland.c | 2 +-
src/wayland/meta-xwayland-selection.c | 14 +++---
20 files changed, 193 insertions(+), 121 deletions(-)
---
diff --git a/src/core/display.c b/src/core/display.c
index 46a12c3..42a530f 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -505,7 +505,7 @@ meta_display_cancel_touch (MetaDisplay *display)
return;
compositor = meta_wayland_compositor_get_default ();
- meta_wayland_touch_cancel (&compositor->seat->touch);
+ meta_wayland_touch_cancel (compositor->seat->touch);
#endif
}
diff --git a/src/wayland/meta-pointer-confinement-wayland.c b/src/wayland/meta-pointer-confinement-wayland.c
index 8eb7d1a..293200c 100644
--- a/src/wayland/meta-pointer-confinement-wayland.c
+++ b/src/wayland/meta-pointer-confinement-wayland.c
@@ -620,7 +620,7 @@ meta_pointer_confinement_wayland_maybe_warp (MetaPointerConfinementWayland *self
seat = meta_wayland_pointer_constraint_get_seat (self->constraint);
surface = meta_wayland_pointer_constraint_get_surface (self->constraint);
- clutter_input_device_get_coords (seat->pointer.device, NULL, &point);
+ clutter_input_device_get_coords (seat->pointer->device, NULL, &point);
meta_wayland_surface_get_relative_coordinates (surface,
point.x, point.y,
&sx, &sy);
diff --git a/src/wayland/meta-wayland-data-device.c b/src/wayland/meta-wayland-data-device.c
index fbc42ec..30ec571 100644
--- a/src/wayland/meta-wayland-data-device.c
+++ b/src/wayland/meta-wayland-data-device.c
@@ -465,7 +465,7 @@ primary_offer_receive (struct wl_client *client, struct wl_resource *resource,
seat = meta_wayland_data_source_get_seat (source);
if (wl_resource_get_client (offer->resource) !=
- meta_wayland_keyboard_get_focus_client (&seat->keyboard))
+ meta_wayland_keyboard_get_focus_client (seat->keyboard))
{
close (fd);
return;
@@ -979,7 +979,7 @@ drag_grab_button (MetaWaylandPointerGrab *grab,
drag_grab->feedback_actor = NULL;
}
- if (seat->pointer.button_count == 0 &&
+ if (seat->pointer->button_count == 0 &&
event_type == CLUTTER_BUTTON_RELEASE)
data_device_end_drag_grab (drag_grab);
}
@@ -1073,10 +1073,10 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice *data
data_device->current_grab = drag_grab = g_slice_new0 (MetaWaylandDragGrab);
drag_grab->generic.interface = funcs;
- drag_grab->generic.pointer = &seat->pointer;
+ drag_grab->generic.pointer = seat->pointer;
drag_grab->keyboard_grab.interface = &keyboard_drag_grab_interface;
- drag_grab->keyboard_grab.keyboard = &seat->keyboard;
+ drag_grab->keyboard_grab.keyboard = seat->keyboard;
drag_grab->drag_client = client;
drag_grab->seat = seat;
@@ -1087,15 +1087,15 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice *data
&drag_grab->drag_origin_listener);
clutter_actor_transform_stage_point (CLUTTER_ACTOR (meta_surface_actor_get_texture
(surface->surface_actor)),
- seat->pointer.grab_x,
- seat->pointer.grab_y,
+ seat->pointer->grab_x,
+ seat->pointer->grab_y,
&surface_pos.x, &surface_pos.y);
drag_grab->drag_start_x = surface_pos.x;
drag_grab->drag_start_y = surface_pos.y;
drag_grab->need_initial_focus = TRUE;
- modifiers = clutter_input_device_get_modifier_state (seat->pointer.device);
+ modifiers = clutter_input_device_get_modifier_state (seat->pointer->device);
drag_grab->buttons = modifiers &
(CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK | CLUTTER_BUTTON3_MASK |
CLUTTER_BUTTON4_MASK | CLUTTER_BUTTON5_MASK);
@@ -1121,12 +1121,13 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice *data
clutter_actor_add_child (drag_grab->feedback_actor,
CLUTTER_ACTOR (drag_grab->drag_surface->surface_actor));
- clutter_input_device_get_coords (seat->pointer.device, NULL, &pos);
+ clutter_input_device_get_coords (seat->pointer->device, NULL, &pos);
meta_feedback_actor_set_position (META_FEEDBACK_ACTOR (drag_grab->feedback_actor),
pos.x, pos.y);
}
- meta_wayland_pointer_start_grab (&seat->pointer, (MetaWaylandPointerGrab*) drag_grab);
+ meta_wayland_pointer_start_grab (seat->pointer,
+ (MetaWaylandPointerGrab*) drag_grab);
meta_wayland_data_source_set_seat (source, seat);
}
@@ -1155,16 +1156,16 @@ data_device_start_drag (struct wl_client *client,
if (!surface)
return;
- if (seat->pointer.button_count == 0 ||
- seat->pointer.grab_serial != serial ||
- !seat->pointer.focus_surface ||
- seat->pointer.focus_surface != surface)
+ if (seat->pointer->button_count == 0 ||
+ seat->pointer->grab_serial != serial ||
+ !seat->pointer->focus_surface ||
+ seat->pointer->focus_surface != surface)
return;
/* FIXME: Check that the data source type array isn't empty. */
if (data_device->current_grab ||
- seat->pointer.grab != &seat->pointer.default_grab)
+ seat->pointer->grab != &seat->pointer->default_grab)
return;
if (icon_resource)
@@ -1183,13 +1184,13 @@ data_device_start_drag (struct wl_client *client,
return;
}
- meta_wayland_pointer_set_focus (&seat->pointer, NULL);
+ meta_wayland_pointer_set_focus (seat->pointer, NULL);
meta_wayland_data_device_start_drag (data_device, client,
&drag_grab_interface,
surface, drag_source, icon_surface);
- meta_wayland_keyboard_set_focus (&seat->keyboard, NULL);
- meta_wayland_keyboard_start_grab (&seat->keyboard,
+ meta_wayland_keyboard_set_focus (seat->keyboard, NULL);
+ meta_wayland_keyboard_start_grab (seat->keyboard,
&seat->data_device.current_grab->keyboard_grab);
}
@@ -1203,7 +1204,7 @@ selection_data_source_destroyed (gpointer data, GObject *object_was_here)
data_device->selection_data_source = NULL;
- focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
if (focus_client)
{
data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client);
@@ -1529,7 +1530,7 @@ meta_wayland_data_device_set_selection (MetaWaylandDataDevice *data_device,
data_device->selection_data_source = source;
data_device->selection_serial = serial;
- focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
if (focus_client)
{
data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client);
@@ -1606,7 +1607,7 @@ primary_source_destroyed (gpointer data,
data_device->primary_data_source = NULL;
- focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
if (focus_client)
{
struct wl_resource *data_device_resource;
@@ -1635,7 +1636,7 @@ meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device,
resource = META_WAYLAND_DATA_SOURCE_PRIMARY (source)->resource;
if (wl_resource_get_client (resource) !=
- meta_wayland_keyboard_get_focus_client (&seat->keyboard))
+ meta_wayland_keyboard_get_focus_client (seat->keyboard))
return;
}
@@ -1654,7 +1655,7 @@ meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device,
data_device->primary_data_source = source;
data_device->primary_serial = serial;
- focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
if (focus_client)
{
data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client);
@@ -1840,7 +1841,7 @@ meta_wayland_data_device_set_keyboard_focus (MetaWaylandDataDevice *data_device)
struct wl_resource *data_device_resource, *offer;
MetaWaylandDataSource *source;
- focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
if (focus_client == data_device->focus_client)
return;
diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c
index 1d3c29b..d505783 100644
--- a/src/wayland/meta-wayland-keyboard.c
+++ b/src/wayland/meta-wayland-keyboard.c
@@ -65,6 +65,8 @@
#include "backends/native/meta-backend-native.h"
#endif
+G_DEFINE_TYPE (MetaWaylandKeyboard, meta_wayland_keyboard, G_TYPE_OBJECT);
+
static void meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard);
static void notify_modifiers (MetaWaylandKeyboard *keyboard);
static guint evdev_code (const ClutterKeyEvent *event);
@@ -342,7 +344,7 @@ meta_wayland_keyboard_broadcast_modifiers (MetaWaylandKeyboard *keyboard)
l = &keyboard->focus_resource_list;
if (!wl_list_empty (l))
{
- uint32_t serial = wl_display_next_serial (keyboard->display);
+ uint32_t serial = wl_display_next_serial (keyboard->seat->wl_display);
wl_resource_for_each (resource, l)
keyboard_send_modifiers (keyboard, resource, serial);
@@ -478,14 +480,12 @@ static const MetaWaylandKeyboardGrabInterface default_keyboard_grab_interface =
};
void
-meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
- struct wl_display *display)
+meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard,
+ MetaWaylandSeat *seat)
{
MetaBackend *backend = meta_get_backend ();
- memset (keyboard, 0, sizeof *keyboard);
-
- keyboard->display = display;
+ keyboard->seat = seat;
wl_list_init (&keyboard->resource_list);
wl_list_init (&keyboard->focus_resource_list);
@@ -512,17 +512,20 @@ meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
static void
meta_wayland_xkb_info_destroy (MetaWaylandXkbInfo *xkb_info)
{
- xkb_keymap_unref (xkb_info->keymap);
- xkb_state_unref (xkb_info->state);
+ g_clear_pointer (&xkb_info->keymap, xkb_keymap_unref);
+ g_clear_pointer (&xkb_info->state, xkb_state_unref);
if (xkb_info->keymap_area)
- munmap (xkb_info->keymap_area, xkb_info->keymap_size);
+ {
+ munmap (xkb_info->keymap_area, xkb_info->keymap_size);
+ xkb_info->keymap_area = NULL;
+ }
if (xkb_info->keymap_fd >= 0)
close (xkb_info->keymap_fd);
}
void
-meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard)
+meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard)
{
MetaBackend *backend = meta_get_backend ();
@@ -534,9 +537,9 @@ meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard)
/* XXX: What about keyboard->resource_list? */
- g_object_unref (keyboard->settings);
+ g_clear_object (&keyboard->settings);
- keyboard->display = NULL;
+ keyboard->seat = NULL;
}
static guint
@@ -682,7 +685,7 @@ void
meta_wayland_keyboard_set_focus (MetaWaylandKeyboard *keyboard,
MetaWaylandSurface *surface)
{
- if (keyboard->display == NULL)
+ if (keyboard->seat == NULL)
return;
if (keyboard->focus_surface == surface)
@@ -809,3 +812,13 @@ meta_wayland_keyboard_end_grab (MetaWaylandKeyboard *keyboard)
{
keyboard->grab = &keyboard->default_grab;
}
+
+static void
+meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard)
+{
+}
+
+static void
+meta_wayland_keyboard_class_init (MetaWaylandKeyboardClass *klass)
+{
+}
diff --git a/src/wayland/meta-wayland-keyboard.h b/src/wayland/meta-wayland-keyboard.h
index be921ec..5f7d15c 100644
--- a/src/wayland/meta-wayland-keyboard.h
+++ b/src/wayland/meta-wayland-keyboard.h
@@ -49,6 +49,13 @@
#include <wayland-server.h>
#include <xkbcommon/xkbcommon.h>
+#include "wayland/meta-wayland-types.h"
+
+#define META_TYPE_WAYLAND_KEYBOARD (meta_wayland_keyboard_get_type ())
+G_DECLARE_FINAL_TYPE (MetaWaylandKeyboard, meta_wayland_keyboard,
+ META, WAYLAND_KEYBOARD,
+ GObject);
+
struct _MetaWaylandKeyboardGrabInterface
{
gboolean (*key) (MetaWaylandKeyboardGrab *grab,
@@ -74,7 +81,9 @@ typedef struct
struct _MetaWaylandKeyboard
{
- struct wl_display *display;
+ GObject parent;
+
+ MetaWaylandSeat *seat;
struct wl_list resource_list;
struct wl_list focus_resource_list;
@@ -93,10 +102,10 @@ struct _MetaWaylandKeyboard
GSettings *settings;
};
-void meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
- struct wl_display *display);
+void meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard,
+ MetaWaylandSeat *seat);
-void meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard);
+void meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard);
void meta_wayland_keyboard_update (MetaWaylandKeyboard *keyboard,
const ClutterKeyEvent *event);
diff --git a/src/wayland/meta-wayland-pointer-constraints.c b/src/wayland/meta-wayland-pointer-constraints.c
index c1e82a2..6477d41 100644
--- a/src/wayland/meta-wayland-pointer-constraints.c
+++ b/src/wayland/meta-wayland-pointer-constraints.c
@@ -329,7 +329,7 @@ meta_wayland_pointer_constraint_enable (MetaWaylandPointerConstraint *constraint
constraint->is_enabled = TRUE;
meta_wayland_pointer_constraint_notify_activated (constraint);
- meta_wayland_pointer_start_grab (&constraint->seat->pointer,
+ meta_wayland_pointer_start_grab (constraint->seat->pointer,
&constraint->grab);
constraint->constraint =
@@ -394,7 +394,7 @@ meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *cons
if (!meta_window_appears_focused (constraint->surface->window))
return;
- meta_wayland_pointer_get_relative_coordinates (&constraint->seat->pointer,
+ meta_wayland_pointer_get_relative_coordinates (constraint->seat->pointer,
constraint->surface,
&sx, &sy);
if (!is_within_constraint_region (constraint, sx, sy))
@@ -416,7 +416,7 @@ void
meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
MetaWindow *window)
{
- MetaWaylandPointer *pointer = &seat->pointer;
+ MetaWaylandPointer *pointer = seat->pointer;
MetaWaylandPointerConstraint *constraint;
if ((pointer->grab->interface != &confined_pointer_grab_interface &&
diff --git a/src/wayland/meta-wayland-pointer-gesture-pinch.c
b/src/wayland/meta-wayland-pointer-gesture-pinch.c
index 80bc78f..3f91a10 100644
--- a/src/wayland/meta-wayland-pointer-gesture-pinch.c
+++ b/src/wayland/meta-wayland-pointer-gesture-pinch.c
@@ -27,6 +27,7 @@
#include "meta-wayland-pointer-gesture-pinch.h"
#include "meta-wayland-pointer.h"
+#include "meta-wayland-seat.h"
#include "meta-wayland-surface.h"
#include "pointer-gestures-unstable-v1-server-protocol.h"
@@ -39,7 +40,7 @@ handle_pinch_begin (MetaWaylandPointer *pointer,
uint32_t serial;
pointer_client = pointer->focus_client;
- serial = wl_display_next_serial (pointer->display);
+ serial = wl_display_next_serial (pointer->seat->wl_display);
wl_resource_for_each (resource, &pointer_client->pinch_gesture_resources)
{
@@ -84,7 +85,7 @@ handle_pinch_end (MetaWaylandPointer *pointer,
uint32_t serial;
pointer_client = pointer->focus_client;
- serial = wl_display_next_serial (pointer->display);
+ serial = wl_display_next_serial (pointer->seat->wl_display);
if (event->touchpad_pinch.phase == CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL)
cancelled = TRUE;
diff --git a/src/wayland/meta-wayland-pointer-gesture-swipe.c
b/src/wayland/meta-wayland-pointer-gesture-swipe.c
index 8762cc5..5f98e23 100644
--- a/src/wayland/meta-wayland-pointer-gesture-swipe.c
+++ b/src/wayland/meta-wayland-pointer-gesture-swipe.c
@@ -27,6 +27,7 @@
#include "meta-wayland-pointer-gesture-swipe.h"
#include "meta-wayland-pointer.h"
+#include "meta-wayland-seat.h"
#include "meta-wayland-surface.h"
#include "pointer-gestures-unstable-v1-server-protocol.h"
@@ -39,7 +40,7 @@ handle_swipe_begin (MetaWaylandPointer *pointer,
uint32_t serial, fingers;
pointer_client = pointer->focus_client;
- serial = wl_display_next_serial (pointer->display);
+ serial = wl_display_next_serial (pointer->seat->wl_display);
fingers = clutter_event_get_gesture_swipe_finger_count (event);
wl_resource_for_each (resource, &pointer_client->swipe_gesture_resources)
@@ -81,7 +82,7 @@ handle_swipe_end (MetaWaylandPointer *pointer,
uint32_t serial;
pointer_client = pointer->focus_client;
- serial = wl_display_next_serial (pointer->display);
+ serial = wl_display_next_serial (pointer->seat->wl_display);
if (event->touchpad_swipe.phase == CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL)
cancelled = TRUE;
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 08f7de9..47b21f0 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -52,6 +52,7 @@
#include "meta-wayland-pointer.h"
#include "meta-wayland-popup.h"
#include "meta-wayland-private.h"
+#include "meta-wayland-seat.h"
#include "meta-wayland-surface.h"
#include "meta-wayland-buffer.h"
#include "meta-wayland-surface-role-cursor.h"
@@ -74,6 +75,8 @@
#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int (10)
+G_DEFINE_TYPE (MetaWaylandPointer, meta_wayland_pointer, G_TYPE_OBJECT);
+
static MetaWaylandPointerClient *
meta_wayland_pointer_client_new (void)
{
@@ -444,15 +447,13 @@ meta_wayland_pointer_on_cursor_changed (MetaCursorTracker *cursor_tracker,
}
void
-meta_wayland_pointer_init (MetaWaylandPointer *pointer,
- struct wl_display *display)
+meta_wayland_pointer_enable (MetaWaylandPointer *pointer,
+ MetaWaylandSeat *seat)
{
MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
ClutterDeviceManager *manager;
- memset (pointer, 0, sizeof *pointer);
-
- pointer->display = display;
+ pointer->seat = seat;
pointer->pointer_clients =
g_hash_table_new_full (NULL, NULL, NULL,
@@ -476,7 +477,7 @@ meta_wayland_pointer_init (MetaWaylandPointer *pointer,
}
void
-meta_wayland_pointer_release (MetaWaylandPointer *pointer)
+meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
{
MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
@@ -493,7 +494,7 @@ meta_wayland_pointer_release (MetaWaylandPointer *pointer)
meta_wayland_pointer_set_focus (pointer, NULL);
g_clear_pointer (&pointer->pointer_clients, g_hash_table_unref);
- pointer->display = NULL;
+ pointer->seat = NULL;
pointer->cursor_surface = NULL;
}
@@ -579,7 +580,7 @@ handle_button_event (MetaWaylandPointer *pointer,
pointer->grab->interface->button (pointer->grab, event);
if (implicit_grab)
- pointer->grab_serial = wl_display_get_serial (pointer->display);
+ pointer->grab_serial = wl_display_get_serial (pointer->seat->wl_display);
}
static void
@@ -786,7 +787,7 @@ void
meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
MetaWaylandSurface *surface)
{
- if (pointer->display == NULL)
+ if (pointer->seat == NULL)
return;
if (pointer->focus_surface == surface)
@@ -1194,6 +1195,15 @@ meta_wayland_relative_pointer_init (MetaWaylandCompositor *compositor)
MetaWaylandSeat *
meta_wayland_pointer_get_seat (MetaWaylandPointer *pointer)
{
- MetaWaylandSeat *seat = wl_container_of (pointer, seat, pointer);
- return seat;
+ return pointer->seat;
+}
+
+static void
+meta_wayland_pointer_init (MetaWaylandPointer *pointer)
+{
+}
+
+static void
+meta_wayland_pointer_class_init (MetaWaylandPointerClass *klass)
+{
}
diff --git a/src/wayland/meta-wayland-pointer.h b/src/wayland/meta-wayland-pointer.h
index f7b76d7..93bda6b 100644
--- a/src/wayland/meta-wayland-pointer.h
+++ b/src/wayland/meta-wayland-pointer.h
@@ -32,6 +32,10 @@
#include <meta/meta-cursor-tracker.h>
+#define META_TYPE_WAYLAND_POINTER (meta_wayland_pointer_get_type ())
+G_DECLARE_FINAL_TYPE (MetaWaylandPointer, meta_wayland_pointer,
+ META, WAYLAND_POINTER, GObject);
+
struct _MetaWaylandPointerGrabInterface
{
void (*focus) (MetaWaylandPointerGrab *grab,
@@ -58,7 +62,9 @@ struct _MetaWaylandPointerClient
struct _MetaWaylandPointer
{
- struct wl_display *display;
+ GObject parent;
+
+ MetaWaylandSeat *seat;
MetaWaylandPointerClient *focus_client;
GHashTable *pointer_clients;
@@ -84,10 +90,10 @@ struct _MetaWaylandPointer
guint32 button_count;
};
-void meta_wayland_pointer_init (MetaWaylandPointer *pointer,
- struct wl_display *display);
+void meta_wayland_pointer_enable (MetaWaylandPointer *pointer,
+ MetaWaylandSeat *seat);
-void meta_wayland_pointer_release (MetaWaylandPointer *pointer);
+void meta_wayland_pointer_disable (MetaWaylandPointer *pointer);
void meta_wayland_pointer_update (MetaWaylandPointer *pointer,
const ClutterEvent *event);
diff --git a/src/wayland/meta-wayland-popup.c b/src/wayland/meta-wayland-popup.c
index e582e6d..77860d4 100644
--- a/src/wayland/meta-wayland-popup.c
+++ b/src/wayland/meta-wayland-popup.c
@@ -253,7 +253,7 @@ meta_wayland_popup_dismiss (MetaWaylandPopup *popup)
top_popup_surface = meta_wayland_popup_grab_get_top_popup (popup_grab);
seat = meta_wayland_pointer_get_seat (popup_grab->generic.pointer);
- keyboard = &seat->keyboard;
+ keyboard = seat->keyboard;
meta_wayland_keyboard_set_focus (keyboard, top_popup_surface);
}
}
@@ -285,7 +285,7 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
wl_list_insert (&grab->all_popups, &popup->link);
seat = meta_wayland_pointer_get_seat (grab->generic.pointer);
- keyboard = &seat->keyboard;
+ keyboard = seat->keyboard;
meta_wayland_keyboard_set_focus (keyboard, surface);
return popup;
diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c
index bc13497..165b765 100644
--- a/src/wayland/meta-wayland-seat.c
+++ b/src/wayland/meta-wayland-seat.c
@@ -43,7 +43,7 @@ seat_get_pointer (struct wl_client *client,
uint32_t id)
{
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
- MetaWaylandPointer *pointer = &seat->pointer;
+ MetaWaylandPointer *pointer = seat->pointer;
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0)
meta_wayland_pointer_create_new_resource (pointer, client, resource, id);
@@ -55,7 +55,7 @@ seat_get_keyboard (struct wl_client *client,
uint32_t id)
{
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
- MetaWaylandKeyboard *keyboard = &seat->keyboard;
+ MetaWaylandKeyboard *keyboard = seat->keyboard;
if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
meta_wayland_keyboard_create_new_resource (keyboard, client, resource, id);
@@ -67,7 +67,7 @@ seat_get_touch (struct wl_client *client,
uint32_t id)
{
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
- MetaWaylandTouch *touch = &seat->touch;
+ MetaWaylandTouch *touch = seat->touch;
if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
meta_wayland_touch_create_new_resource (touch, client, resource, id);
@@ -157,15 +157,15 @@ meta_wayland_seat_set_capabilities (MetaWaylandSeat *seat,
seat->capabilities = flags;
if (CAPABILITY_ENABLED (prev_flags, flags, WL_SEAT_CAPABILITY_POINTER))
- meta_wayland_pointer_init (&seat->pointer, seat->wl_display);
+ meta_wayland_pointer_enable (seat->pointer, seat);
else if (CAPABILITY_DISABLED (prev_flags, flags, WL_SEAT_CAPABILITY_POINTER))
- meta_wayland_pointer_release (&seat->pointer);
+ meta_wayland_pointer_disable (seat->pointer);
if (CAPABILITY_ENABLED (prev_flags, flags, WL_SEAT_CAPABILITY_KEYBOARD))
{
MetaDisplay *display;
- meta_wayland_keyboard_init (&seat->keyboard, seat->wl_display);
+ meta_wayland_keyboard_enable (seat->keyboard, seat);
display = meta_get_display ();
/* Post-initialization, ensure the input focus is in sync */
@@ -173,12 +173,12 @@ meta_wayland_seat_set_capabilities (MetaWaylandSeat *seat,
meta_display_sync_wayland_input_focus (display);
}
else if (CAPABILITY_DISABLED (prev_flags, flags, WL_SEAT_CAPABILITY_KEYBOARD))
- meta_wayland_keyboard_release (&seat->keyboard);
+ meta_wayland_keyboard_disable (seat->keyboard);
if (CAPABILITY_ENABLED (prev_flags, flags, WL_SEAT_CAPABILITY_TOUCH))
- meta_wayland_touch_init (&seat->touch, seat->wl_display);
+ meta_wayland_touch_enable (seat->touch, seat);
else if (CAPABILITY_DISABLED (prev_flags, flags, WL_SEAT_CAPABILITY_TOUCH))
- meta_wayland_touch_release (&seat->touch);
+ meta_wayland_touch_disable (seat->touch);
/* Broadcast capability changes */
wl_resource_for_each (resource, &seat->base_resource_list)
@@ -215,6 +215,10 @@ meta_wayland_seat_new (MetaWaylandCompositor *compositor,
wl_list_init (&seat->base_resource_list);
seat->wl_display = display;
+ seat->pointer = g_object_new (META_TYPE_WAYLAND_POINTER, NULL);
+ seat->keyboard = g_object_new (META_TYPE_WAYLAND_KEYBOARD, NULL);
+ seat->touch = g_object_new (META_TYPE_WAYLAND_TOUCH, NULL);
+
meta_wayland_data_device_init (&seat->data_device);
device_manager = clutter_device_manager_get_default ();
@@ -247,6 +251,10 @@ meta_wayland_seat_free (MetaWaylandSeat *seat)
g_signal_handlers_disconnect_by_data (device_manager, seat);
meta_wayland_seat_set_capabilities (seat, 0);
+ g_object_unref (seat->pointer);
+ g_object_unref (seat->keyboard);
+ g_object_unref (seat->touch);
+
g_slice_free (MetaWaylandSeat, seat);
}
@@ -306,20 +314,20 @@ meta_wayland_seat_update (MetaWaylandSeat *seat,
case CLUTTER_BUTTON_RELEASE:
case CLUTTER_SCROLL:
if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
- meta_wayland_pointer_update (&seat->pointer, event);
+ meta_wayland_pointer_update (seat->pointer, event);
break;
case CLUTTER_KEY_PRESS:
case CLUTTER_KEY_RELEASE:
if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
- meta_wayland_keyboard_update (&seat->keyboard, (const ClutterKeyEvent *) event);
+ meta_wayland_keyboard_update (seat->keyboard, (const ClutterKeyEvent *) event);
break;
case CLUTTER_TOUCH_BEGIN:
case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END:
if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
- meta_wayland_touch_update (&seat->touch, event);
+ meta_wayland_touch_update (seat->touch, event);
break;
default:
@@ -343,18 +351,18 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
case CLUTTER_TOUCHPAD_SWIPE:
case CLUTTER_TOUCHPAD_PINCH:
if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
- return meta_wayland_pointer_handle_event (&seat->pointer, event);
+ return meta_wayland_pointer_handle_event (seat->pointer, event);
case CLUTTER_KEY_PRESS:
case CLUTTER_KEY_RELEASE:
if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
- return meta_wayland_keyboard_handle_event (&seat->keyboard,
+ return meta_wayland_keyboard_handle_event (seat->keyboard,
(const ClutterKeyEvent *) event);
case CLUTTER_TOUCH_BEGIN:
case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END:
if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
- return meta_wayland_touch_handle_event (&seat->touch, event);
+ return meta_wayland_touch_handle_event (seat->touch, event);
default:
break;
@@ -369,7 +377,7 @@ meta_wayland_seat_repick (MetaWaylandSeat *seat)
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) == 0)
return;
- meta_wayland_pointer_repick (&seat->pointer);
+ meta_wayland_pointer_repick (seat->pointer);
}
void
@@ -381,7 +389,7 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat,
if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
{
- meta_wayland_keyboard_set_focus (&seat->keyboard, surface);
+ meta_wayland_keyboard_set_focus (seat->keyboard, surface);
meta_wayland_data_device_set_keyboard_focus (&seat->data_device);
}
@@ -401,24 +409,28 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat,
gboolean can_grab_surface = FALSE;
if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
- sequence = meta_wayland_touch_find_grab_sequence (&seat->touch, surface, serial);
+ sequence = meta_wayland_touch_find_grab_sequence (seat->touch,
+ surface,
+ serial);
if (sequence)
{
- meta_wayland_touch_get_press_coords (&seat->touch, sequence, x, y);
+ meta_wayland_touch_get_press_coords (seat->touch, sequence, x, y);
}
else
{
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0 &&
- (!require_pressed || seat->pointer.button_count > 0))
- can_grab_surface = meta_wayland_pointer_can_grab_surface (&seat->pointer, surface, serial);
+ (!require_pressed || seat->pointer->button_count > 0))
+ can_grab_surface = meta_wayland_pointer_can_grab_surface (seat->pointer,
+ surface,
+ serial);
if (can_grab_surface)
{
if (x)
- *x = seat->pointer.grab_x;
+ *x = seat->pointer->grab_x;
if (y)
- *y = seat->pointer.grab_y;
+ *y = seat->pointer->grab_y;
}
}
@@ -429,7 +441,7 @@ gboolean
meta_wayland_seat_can_popup (MetaWaylandSeat *seat,
uint32_t serial)
{
- return (meta_wayland_pointer_can_popup (&seat->pointer, serial) ||
- meta_wayland_keyboard_can_popup (&seat->keyboard, serial) ||
- meta_wayland_touch_can_popup (&seat->touch, serial));
+ return (meta_wayland_pointer_can_popup (seat->pointer, serial) ||
+ meta_wayland_keyboard_can_popup (seat->keyboard, serial) ||
+ meta_wayland_touch_can_popup (seat->touch, serial));
}
diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h
index 42ddb1e..33b8975 100644
--- a/src/wayland/meta-wayland-seat.h
+++ b/src/wayland/meta-wayland-seat.h
@@ -36,9 +36,10 @@ struct _MetaWaylandSeat
struct wl_list base_resource_list;
struct wl_display *wl_display;
- MetaWaylandPointer pointer;
- MetaWaylandKeyboard keyboard;
- MetaWaylandTouch touch;
+ MetaWaylandPointer *pointer;
+ MetaWaylandKeyboard *keyboard;
+ MetaWaylandTouch *touch;
+
MetaWaylandDataDevice data_device;
guint capabilities;
diff --git a/src/wayland/meta-wayland-tablet-seat.c b/src/wayland/meta-wayland-tablet-seat.c
index 9cd8faf..5e34ad3 100644
--- a/src/wayland/meta-wayland-tablet-seat.c
+++ b/src/wayland/meta-wayland-tablet-seat.c
@@ -204,7 +204,7 @@ static void
meta_wayland_tablet_seat_device_added (MetaWaylandTabletSeat *tablet_seat,
ClutterInputDevice *device)
{
- MetaWaylandSurface *pad_focus = tablet_seat->seat->keyboard.focus_surface;
+ MetaWaylandSurface *pad_focus = tablet_seat->seat->keyboard->focus_surface;
if (is_tablet_device (device))
{
diff --git a/src/wayland/meta-wayland-touch.c b/src/wayland/meta-wayland-touch.c
index 52c3f64..440d6ab 100644
--- a/src/wayland/meta-wayland-touch.c
+++ b/src/wayland/meta-wayland-touch.c
@@ -34,6 +34,8 @@
#include "backends/native/meta-backend-native.h"
#endif
+G_DEFINE_TYPE (MetaWaylandTouch, meta_wayland_touch, G_TYPE_OBJECT);
+
struct _MetaWaylandTouchSurface
{
MetaWaylandSurface *surface;
@@ -454,7 +456,7 @@ meta_wayland_touch_cancel (MetaWaylandTouch *touch)
{
GList *surfaces, *s;
- if (touch->display == NULL)
+ if (touch->seat == NULL)
return;
surfaces = s = touch_get_surfaces (touch, FALSE);
@@ -514,14 +516,12 @@ evdev_filter_func (struct libinput_event *event,
#endif
void
-meta_wayland_touch_init (MetaWaylandTouch *touch,
- struct wl_display *display)
+meta_wayland_touch_enable (MetaWaylandTouch *touch,
+ MetaWaylandSeat *seat)
{
ClutterDeviceManager *manager;
- memset (touch, 0, sizeof *touch);
-
- touch->display = display;
+ touch->seat = seat;
touch->touch_surfaces = g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify) touch_surface_free);
touch->touches = g_hash_table_new_full (NULL, NULL, NULL,
@@ -540,7 +540,7 @@ meta_wayland_touch_init (MetaWaylandTouch *touch,
}
void
-meta_wayland_touch_release (MetaWaylandTouch *touch)
+meta_wayland_touch_disable (MetaWaylandTouch *touch)
{
#ifdef HAVE_NATIVE_BACKEND
MetaBackend *backend = meta_get_backend ();
@@ -550,7 +550,7 @@ meta_wayland_touch_release (MetaWaylandTouch *touch)
g_clear_pointer (&touch->touch_surfaces, (GDestroyNotify) g_hash_table_unref);
g_clear_pointer (&touch->touches, (GDestroyNotify) g_hash_table_unref);
- touch->display = NULL;
+ touch->seat = NULL;
}
void
@@ -561,7 +561,7 @@ meta_wayland_touch_create_new_resource (MetaWaylandTouch *touch,
{
struct wl_resource *cr;
- if (touch->display == NULL)
+ if (touch->seat == NULL)
{
wl_resource_post_error (seat_resource, WL_DISPLAY_ERROR_INVALID_METHOD,
"Cannot retrieve touch interface without touch capability");
@@ -641,3 +641,13 @@ meta_wayland_touch_get_press_coords (MetaWaylandTouch *touch,
return TRUE;
}
+
+static void
+meta_wayland_touch_init (MetaWaylandTouch *touch)
+{
+}
+
+static void
+meta_wayland_touch_class_init (MetaWaylandTouchClass *klass)
+{
+}
diff --git a/src/wayland/meta-wayland-touch.h b/src/wayland/meta-wayland-touch.h
index e5abc12..5b27c6a 100644
--- a/src/wayland/meta-wayland-touch.h
+++ b/src/wayland/meta-wayland-touch.h
@@ -28,12 +28,21 @@
#include "meta-wayland-types.h"
+#define META_TYPE_WAYLAND_TOUCH (meta_wayland_touch_get_type ())
+G_DECLARE_FINAL_TYPE (MetaWaylandTouch, meta_wayland_touch,
+ META, WAYLAND_TOUCH,
+ GObject);
+
+
typedef struct _MetaWaylandTouchSurface MetaWaylandTouchSurface;
typedef struct _MetaWaylandTouchInfo MetaWaylandTouchInfo;
struct _MetaWaylandTouch
{
- struct wl_display *display;
+ GObject parent;
+
+ MetaWaylandSeat *seat;
+
struct wl_list resource_list;
GHashTable *touch_surfaces; /* HT of MetaWaylandSurface->MetaWaylandTouchSurface */
@@ -43,10 +52,10 @@ struct _MetaWaylandTouch
guint64 frame_slots;
};
-void meta_wayland_touch_init (MetaWaylandTouch *touch,
- struct wl_display *display);
+void meta_wayland_touch_enable (MetaWaylandTouch *touch,
+ MetaWaylandSeat *seat);
-void meta_wayland_touch_release (MetaWaylandTouch *touch);
+void meta_wayland_touch_disable (MetaWaylandTouch *touch);
void meta_wayland_touch_update (MetaWaylandTouch *touch,
const ClutterEvent *event);
diff --git a/src/wayland/meta-wayland-wl-shell.c b/src/wayland/meta-wayland-wl-shell.c
index e04df47..1888c78 100644
--- a/src/wayland/meta-wayland-wl-shell.c
+++ b/src/wayland/meta-wayland-wl-shell.c
@@ -324,7 +324,7 @@ meta_wayland_wl_shell_surface_create_popup (MetaWaylandWlShellSurface *wl_shell_
MetaWaylandSeat *seat = wl_shell_surface->popup_seat;
MetaWaylandPopup *popup;
- popup = meta_wayland_pointer_start_popup_grab (&seat->pointer, popup_surface);
+ popup = meta_wayland_pointer_start_popup_grab (seat->pointer, popup_surface);
if (!popup)
{
wl_shell_surface_send_popup_done (wl_shell_surface->resource);
diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
index 8831f8b..3290683 100644
--- a/src/wayland/meta-wayland-xdg-shell.c
+++ b/src/wayland/meta-wayland-xdg-shell.c
@@ -442,7 +442,7 @@ xdg_popup_grab (struct wl_client *client,
return;
}
- top_popup = meta_wayland_pointer_get_top_popup (&seat->pointer);
+ top_popup = meta_wayland_pointer_get_top_popup (seat->pointer);
if ((top_popup == NULL &&
!META_IS_WAYLAND_XDG_SURFACE (parent_surface->role)) ||
(top_popup != NULL && parent_surface != top_popup))
@@ -803,7 +803,7 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
meta_window_focus (window, meta_display_get_current_time (display));
popup_surface = META_WAYLAND_POPUP_SURFACE (surface->role);
- popup = meta_wayland_pointer_start_popup_grab (&seat->pointer,
+ popup = meta_wayland_pointer_start_popup_grab (seat->pointer,
popup_surface);
if (popup == NULL)
{
@@ -1675,7 +1675,6 @@ meta_wayland_xdg_positioner_set_constraint_adjustment (struct wl_client *clien
ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_X |
ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_Y);
-
if ((constraint_adjustment & ~all_adjustments) != 0)
{
wl_resource_post_error (resource, ZXDG_POSITIONER_V6_ERROR_INVALID_INPUT,
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index b360cf1..e153b24 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -226,7 +226,7 @@ meta_wayland_compositor_update_key_state (MetaWaylandCompositor *compositor,
int key_vector_len,
int offset)
{
- meta_wayland_keyboard_update_key_state (&compositor->seat->keyboard,
+ meta_wayland_keyboard_update_key_state (compositor->seat->keyboard,
key_vector, key_vector_len, offset);
}
diff --git a/src/wayland/meta-xwayland-selection.c b/src/wayland/meta-xwayland-selection.c
index 2528d8a..c346ba8 100644
--- a/src/wayland/meta-xwayland-selection.c
+++ b/src/wayland/meta-xwayland-selection.c
@@ -972,7 +972,7 @@ meta_x11_drag_dest_update (MetaWaylandDataDevice *data_device,
MetaWaylandSeat *seat = compositor->seat;
ClutterPoint pos;
- clutter_input_device_get_coords (seat->pointer.device, NULL, &pos);
+ clutter_input_device_get_coords (seat->pointer->device, NULL, &pos);
xdnd_send_position (compositor->xwayland_manager.selection_data,
compositor->xwayland_manager.selection_data->dnd.dnd_dest,
clutter_get_current_event_time (),
@@ -1378,7 +1378,7 @@ drag_xgrab_motion (MetaWaylandPointerGrab *grab,
event);
dnd->last_motion_time = clutter_event_get_time (event);
- meta_wayland_pointer_send_motion (&seat->pointer, event);
+ meta_wayland_pointer_send_motion (seat->pointer, event);
}
static void
@@ -1388,7 +1388,7 @@ drag_xgrab_button (MetaWaylandPointerGrab *grab,
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
MetaWaylandSeat *seat = compositor->seat;
- meta_wayland_pointer_send_button (&seat->pointer, event);
+ meta_wayland_pointer_send_button (seat->pointer, event);
}
static const MetaWaylandPointerGrabInterface drag_xgrab_interface = {
@@ -1499,10 +1499,10 @@ meta_xwayland_selection_handle_client_message (MetaWaylandCompositor *compositor
uint32_t action = 0;
motion = clutter_event_new (CLUTTER_MOTION);
- clutter_input_device_get_coords (seat->pointer.device, NULL, &pos);
+ clutter_input_device_get_coords (seat->pointer->device, NULL, &pos);
clutter_event_set_coords (motion, pos.x, pos.y);
- clutter_event_set_device (motion, seat->pointer.device);
- clutter_event_set_source_device (motion, seat->pointer.device);
+ clutter_event_set_device (motion, seat->pointer->device);
+ clutter_event_set_source_device (motion, seat->pointer->device);
clutter_event_set_time (motion, dnd->last_motion_time);
action = atom_to_action ((Atom) event->data.l[4]);
@@ -1591,7 +1591,7 @@ meta_xwayland_selection_handle_xfixes_selection_notify (MetaWaylandCompositor *c
{
MetaWaylandSurface *focus;
- focus = compositor->seat->pointer.focus_surface;
+ focus = compositor->seat->pointer->focus_surface;
selection->source = meta_wayland_data_source_xwayland_new (selection);
meta_wayland_data_device_set_dnd_source (&compositor->seat->data_device,
selection->source);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]