Compare commits
3 Commits
css-line-h
...
seat-model
Author | SHA1 | Date | |
---|---|---|---|
|
a83317a796 | ||
|
4032ef1509 | ||
|
e7afca6bbf |
@@ -85,7 +85,7 @@ gdk_display_supports_input_shapes
|
||||
gdk_display_get_app_launch_context
|
||||
gdk_display_notify_startup_complete
|
||||
gdk_display_get_default_seat
|
||||
gdk_display_list_seats
|
||||
gdk_display_get_seats
|
||||
gdk_display_get_monitors
|
||||
gdk_display_get_monitor_at_surface
|
||||
gdk_display_get_clipboard
|
||||
|
@@ -51,7 +51,7 @@
|
||||
*
|
||||
* Most of the input device handling has been factored out into separate #GdkSeat
|
||||
* objects. Every display has a one or more seats, which can be accessed with
|
||||
* gdk_display_get_default_seat() and gdk_display_list_seats().
|
||||
* gdk_display_get_default_seat() and gdk_display_get_seats().
|
||||
*
|
||||
* Output devices are represented by #GdkMonitor objects, which can be accessed
|
||||
* with gdk_display_get_monitor_at_surface() and similar APIs.
|
||||
@@ -147,10 +147,17 @@ gdk_display_real_event_data_free (GdkDisplay *display,
|
||||
static GdkSeat *
|
||||
gdk_display_real_get_default_seat (GdkDisplay *display)
|
||||
{
|
||||
if (!display->seats)
|
||||
GListModel *seats;
|
||||
GdkSeat *seat;
|
||||
|
||||
seats = G_LIST_MODEL (display->seats);
|
||||
if (g_list_model_get_n_items (seats) == 0)
|
||||
return NULL;
|
||||
|
||||
return display->seats->data;
|
||||
seat = g_list_model_get_item (seats, 0);
|
||||
g_object_unref (seat);
|
||||
|
||||
return seat;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -338,6 +345,8 @@ gdk_display_init (GdkDisplay *display)
|
||||
display->composited = TRUE;
|
||||
display->rgba = TRUE;
|
||||
display->input_shapes = TRUE;
|
||||
|
||||
display->seats = g_list_store_new (GDK_TYPE_SEAT);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -364,7 +373,7 @@ gdk_display_finalize (GObject *object)
|
||||
|
||||
g_hash_table_destroy (display->pointers_info);
|
||||
|
||||
g_list_free_full (display->seats, g_object_unref);
|
||||
g_object_unref (display->seats);
|
||||
|
||||
G_OBJECT_CLASS (gdk_display_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -1365,7 +1374,7 @@ gdk_display_add_seat (GdkDisplay *display,
|
||||
g_return_if_fail (GDK_IS_DISPLAY (display));
|
||||
g_return_if_fail (GDK_IS_SEAT (seat));
|
||||
|
||||
display->seats = g_list_append (display->seats, g_object_ref (seat));
|
||||
g_list_store_append (display->seats, seat);
|
||||
g_signal_emit (display, signals[SEAT_ADDED], 0, seat);
|
||||
|
||||
g_signal_connect (seat, "device-removed", G_CALLBACK (device_removed_cb), display);
|
||||
@@ -1375,21 +1384,19 @@ void
|
||||
gdk_display_remove_seat (GdkDisplay *display,
|
||||
GdkSeat *seat)
|
||||
{
|
||||
GList *link;
|
||||
guint pos;
|
||||
|
||||
g_return_if_fail (GDK_IS_DISPLAY (display));
|
||||
g_return_if_fail (GDK_IS_SEAT (seat));
|
||||
|
||||
g_signal_handlers_disconnect_by_func (seat, G_CALLBACK (device_removed_cb), display);
|
||||
|
||||
link = g_list_find (display->seats, seat);
|
||||
|
||||
if (link)
|
||||
if (g_list_store_find (display->seats, seat, &pos))
|
||||
{
|
||||
display->seats = g_list_remove_link (display->seats, link);
|
||||
seat = g_list_model_get_item (G_LIST_MODEL (display->seats), pos);
|
||||
g_list_store_remove (display->seats, pos);
|
||||
g_signal_emit (display, signals[SEAT_REMOVED], 0, seat);
|
||||
g_object_unref (link->data);
|
||||
g_list_free (link);
|
||||
g_object_unref (seat);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1417,20 +1424,25 @@ gdk_display_get_default_seat (GdkDisplay *display)
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_display_list_seats:
|
||||
* gdk_display_get_seats:
|
||||
* @display: a #GdkDisplay
|
||||
*
|
||||
* Returns the list of seats known to @display.
|
||||
*
|
||||
* Returns: (transfer container) (element-type GdkSeat): the
|
||||
* list of seats known to the #GdkDisplay
|
||||
**/
|
||||
GList *
|
||||
gdk_display_list_seats (GdkDisplay *display)
|
||||
* Subsequent calls to this function will always return the same list
|
||||
* for the same display.
|
||||
*
|
||||
* You can listen to the #GListModel::items-changed signal on this list
|
||||
* to observe changes to the seats of this display.
|
||||
*
|
||||
* Returns: (transfer none): the list of seats
|
||||
*/
|
||||
GListModel *
|
||||
gdk_display_get_seats (GdkDisplay *display)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
|
||||
return g_list_copy (display->seats);
|
||||
return G_LIST_MODEL (display->seats);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1442,8 +1454,8 @@ gdk_display_list_seats (GdkDisplay *display)
|
||||
* Subsequent calls to this function will always return the same list for the
|
||||
* same display.
|
||||
*
|
||||
* You can listen to the GListModel::items-changed signal on this list
|
||||
* to monitor changes to the monitor of this display.
|
||||
* You can listen to the #GListModel::items-changed signal on this list
|
||||
* to observe changes to the monitors of this display.
|
||||
*
|
||||
* Returns: (transfer none): a #GListModel of #GdkMonitor
|
||||
*/
|
||||
|
@@ -89,7 +89,7 @@ GDK_AVAILABLE_IN_ALL
|
||||
GdkSeat * gdk_display_get_default_seat (GdkDisplay *display);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GList * gdk_display_list_seats (GdkDisplay *display);
|
||||
GListModel * gdk_display_get_seats (GdkDisplay *display);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GListModel * gdk_display_get_monitors (GdkDisplay *self) G_GNUC_PURE;
|
||||
|
@@ -108,7 +108,7 @@ struct _GdkDisplay
|
||||
|
||||
GdkDebugFlags debug_flags;
|
||||
|
||||
GList *seats;
|
||||
GListStore *seats;
|
||||
};
|
||||
|
||||
struct _GdkDisplayClass
|
||||
|
@@ -1790,7 +1790,7 @@ gdk_surface_get_cursor (GdkSurface *surface)
|
||||
*/
|
||||
void
|
||||
gdk_surface_set_cursor (GdkSurface *surface,
|
||||
GdkCursor *cursor)
|
||||
GdkCursor *cursor)
|
||||
{
|
||||
g_return_if_fail (GDK_IS_SURFACE (surface));
|
||||
|
||||
@@ -1803,30 +1803,33 @@ gdk_surface_set_cursor (GdkSurface *surface,
|
||||
if (!GDK_SURFACE_DESTROYED (surface))
|
||||
{
|
||||
GdkDevice *device;
|
||||
GList *seats, *s;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
|
||||
if (cursor)
|
||||
surface->cursor = g_object_ref (cursor);
|
||||
|
||||
seats = gdk_display_list_seats (surface->display);
|
||||
seats = gdk_display_get_seats (surface->display);
|
||||
|
||||
for (s = seats; s; s = s->next)
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
GdkSeat *seat;
|
||||
GList *devices, *d;
|
||||
|
||||
device = gdk_seat_get_pointer (s->data);
|
||||
seat = g_list_model_get_item (seats, i);
|
||||
device = gdk_seat_get_pointer (seat);
|
||||
gdk_surface_set_cursor_internal (surface, device, surface->cursor);
|
||||
|
||||
devices = gdk_seat_get_devices (s->data, GDK_SEAT_CAPABILITY_TABLET_STYLUS);
|
||||
devices = gdk_seat_get_devices (seat, GDK_SEAT_CAPABILITY_TABLET_STYLUS);
|
||||
for (d = devices; d; d = d->next)
|
||||
{
|
||||
device = d->data;
|
||||
gdk_surface_set_cursor_internal (surface, device, surface->cursor);
|
||||
}
|
||||
g_list_free (devices);
|
||||
g_object_unref (seat);
|
||||
}
|
||||
|
||||
g_list_free (seats);
|
||||
g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_CURSOR]);
|
||||
}
|
||||
}
|
||||
|
@@ -4819,22 +4819,23 @@ _gdk_wayland_display_remove_seat (GdkWaylandDisplay *display_wayland,
|
||||
guint32 id)
|
||||
{
|
||||
GdkDisplay *display = GDK_DISPLAY (display_wayland);
|
||||
GList *l, *seats;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
gboolean removed = FALSE;
|
||||
|
||||
seats = gdk_display_list_seats (display);
|
||||
|
||||
for (l = seats; l != NULL; l = l->next)
|
||||
seats = gdk_display_get_seats (display);
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n && !removed; i++)
|
||||
{
|
||||
GdkWaylandSeat *seat = l->data;
|
||||
GdkWaylandSeat *seat = g_list_model_get_item (seats, i);
|
||||
|
||||
if (seat->id != id)
|
||||
continue;
|
||||
if (seat->id == id)
|
||||
{
|
||||
gdk_display_remove_seat (display, GDK_SEAT (seat));
|
||||
removed = TRUE;
|
||||
}
|
||||
|
||||
gdk_display_remove_seat (display, GDK_SEAT (seat));
|
||||
break;
|
||||
g_object_unref (seat);
|
||||
}
|
||||
|
||||
g_list_free (seats);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
|
@@ -2213,20 +2213,20 @@ transform_to_string (int transform)
|
||||
static void
|
||||
update_scale (GdkDisplay *display)
|
||||
{
|
||||
GList *seats;
|
||||
GList *l;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
|
||||
g_list_foreach (gdk_wayland_display_get_toplevel_surfaces (display),
|
||||
(GFunc)gdk_wayland_surface_update_scale,
|
||||
NULL);
|
||||
seats = gdk_display_list_seats (display);
|
||||
for (l = seats; l; l = l->next)
|
||||
{
|
||||
GdkSeat *seat = l->data;
|
||||
|
||||
seats = gdk_display_get_seats (display);
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
GdkSeat *seat = g_list_model_get_item (seats, i);
|
||||
gdk_wayland_seat_update_cursor_scale (GDK_WAYLAND_SEAT (seat));
|
||||
g_object_unref (seat);
|
||||
}
|
||||
g_list_free (seats);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -2796,34 +2796,29 @@ gdk_x11_display_get_keymap (GdkDisplay *display)
|
||||
static GdkSeat *
|
||||
gdk_x11_display_get_default_seat (GdkDisplay *display)
|
||||
{
|
||||
GList *seats, *l;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
int device_id;
|
||||
gboolean result = FALSE;
|
||||
|
||||
seats = gdk_display_list_seats (display);
|
||||
seats = gdk_display_get_seats (display);
|
||||
|
||||
gdk_x11_display_error_trap_push (display);
|
||||
result = XIGetClientPointer (GDK_DISPLAY_XDISPLAY (display),
|
||||
None, &device_id);
|
||||
gdk_x11_display_error_trap_pop_ignored (display);
|
||||
|
||||
for (l = seats; l; l = l->next)
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
GdkDevice *pointer;
|
||||
GdkSeat *seat = g_list_model_get_item (seats, i);
|
||||
GdkDevice *pointer = gdk_seat_get_pointer (seat);
|
||||
|
||||
pointer = gdk_seat_get_pointer (l->data);
|
||||
g_object_unref (seat);
|
||||
|
||||
if (gdk_x11_device_get_id (pointer) == device_id || !result)
|
||||
{
|
||||
GdkSeat *seat = l->data;
|
||||
g_list_free (seats);
|
||||
|
||||
return seat;
|
||||
}
|
||||
return seat;
|
||||
}
|
||||
|
||||
g_list_free (seats);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@@ -608,16 +608,20 @@ close_menu (GtkPopover *popover)
|
||||
static gboolean
|
||||
gtk_popover_has_mnemonic_modifier_pressed (GtkPopover *popover)
|
||||
{
|
||||
GList *seats, *s;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
gboolean retval = FALSE;
|
||||
|
||||
seats = gdk_display_list_seats (gtk_widget_get_display (GTK_WIDGET (popover)));
|
||||
seats = gdk_display_get_seats (gtk_widget_get_display (GTK_WIDGET (popover)));
|
||||
|
||||
for (s = seats; s; s = s->next)
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
GdkDevice *dev = gdk_seat_get_keyboard (s->data);
|
||||
GdkSeat *seat = g_list_model_get_item (seats, i);
|
||||
GdkDevice *dev = gdk_seat_get_keyboard (seat);
|
||||
GdkModifierType mask;
|
||||
|
||||
g_object_unref (seat);
|
||||
|
||||
mask = gdk_device_get_modifier_state (dev);
|
||||
if ((mask & gtk_accelerator_get_default_mod_mask ()) == GDK_ALT_MASK)
|
||||
{
|
||||
@@ -626,8 +630,6 @@ gtk_popover_has_mnemonic_modifier_pressed (GtkPopover *popover)
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free (seats);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@@ -4792,16 +4792,20 @@ gtk_window_real_activate_focus (GtkWindow *window)
|
||||
static gboolean
|
||||
gtk_window_has_mnemonic_modifier_pressed (GtkWindow *window)
|
||||
{
|
||||
GList *seats, *s;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
gboolean retval = FALSE;
|
||||
|
||||
seats = gdk_display_list_seats (gtk_widget_get_display (GTK_WIDGET (window)));
|
||||
seats = gdk_display_get_seats (gtk_widget_get_display (GTK_WIDGET (window)));
|
||||
|
||||
for (s = seats; s; s = s->next)
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
GdkDevice *dev = gdk_seat_get_keyboard (s->data);
|
||||
GdkSeat *seat = g_list_model_get_item (seats, i);
|
||||
GdkDevice *dev = gdk_seat_get_keyboard (seat);
|
||||
GdkModifierType mask;
|
||||
|
||||
g_object_unref (seat);
|
||||
|
||||
mask = gdk_device_get_modifier_state (dev);
|
||||
if ((mask & gtk_accelerator_get_default_mod_mask ()) == GDK_ALT_MASK)
|
||||
{
|
||||
@@ -4810,8 +4814,6 @@ gtk_window_has_mnemonic_modifier_pressed (GtkWindow *window)
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free (seats);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@@ -828,18 +828,20 @@ static void
|
||||
populate_seats (GtkInspectorGeneral *gen)
|
||||
{
|
||||
GtkWidget *child;
|
||||
GList *list, *l;
|
||||
int i;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
|
||||
while ((child = gtk_widget_get_first_child (gen->device_box)))
|
||||
gtk_list_box_remove (GTK_LIST_BOX (gen->device_box), child);
|
||||
|
||||
list = gdk_display_list_seats (gen->display);
|
||||
seats = gdk_display_get_seats (gen->display);
|
||||
|
||||
for (l = list, i = 0; l; l = l->next, i++)
|
||||
add_seat (gen, GDK_SEAT (l->data), i);
|
||||
|
||||
g_list_free (list);
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
GdkSeat *seat = g_list_model_get_item (seats, i);
|
||||
add_seat (gen, seat, i);
|
||||
g_object_unref (seat);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -935,17 +937,21 @@ static void
|
||||
gtk_inspector_general_dispose (GObject *object)
|
||||
{
|
||||
GtkInspectorGeneral *gen = GTK_INSPECTOR_GENERAL (object);
|
||||
GList *list, *l;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
|
||||
g_clear_pointer (&gen->swin, gtk_widget_unparent);
|
||||
|
||||
g_signal_handlers_disconnect_by_func (gen->display, G_CALLBACK (seat_added), gen);
|
||||
g_signal_handlers_disconnect_by_func (gen->display, G_CALLBACK (seat_removed), gen);
|
||||
|
||||
list = gdk_display_list_seats (gen->display);
|
||||
for (l = list; l; l = l->next)
|
||||
disconnect_seat (gen, GDK_SEAT (l->data));
|
||||
g_list_free (list);
|
||||
seats = gdk_display_get_seats (gen->display);
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
GdkSeat *seat = g_list_model_get_item (seats, i);
|
||||
disconnect_seat (gen, seat);
|
||||
g_object_unref (seat);
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (gtk_inspector_general_parent_class)->dispose (object);
|
||||
}
|
||||
|
@@ -1,11 +1,12 @@
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static void
|
||||
test_list_seats (void)
|
||||
test_get_seats (void)
|
||||
{
|
||||
GdkDisplay *display;
|
||||
GdkSeat *seat0, *seat;
|
||||
GList *list, *l;
|
||||
GListModel *seats;
|
||||
guint i, n;
|
||||
gboolean found_default;
|
||||
|
||||
display = gdk_display_get_default ();
|
||||
@@ -14,25 +15,24 @@ test_list_seats (void)
|
||||
g_assert_true (GDK_IS_SEAT (seat0));
|
||||
|
||||
found_default = FALSE;
|
||||
list = gdk_display_list_seats (display);
|
||||
|
||||
for (l = list; l; l = l->next)
|
||||
seats = gdk_display_get_seats (display);
|
||||
for (i = 0, n = g_list_model_get_n_items (seats); i < n; i++)
|
||||
{
|
||||
seat = l->data;
|
||||
seat = g_list_model_get_item (seats, i);
|
||||
|
||||
g_assert_true (GDK_IS_SEAT (seat));
|
||||
g_assert (gdk_seat_get_display (seat) == display);
|
||||
|
||||
if (seat == seat0)
|
||||
found_default = TRUE;
|
||||
|
||||
g_object_unref (seat);
|
||||
}
|
||||
|
||||
if (seat0 != NULL)
|
||||
g_assert_true (found_default);
|
||||
else
|
||||
g_assert_true (list == NULL);
|
||||
|
||||
g_list_free (list);
|
||||
g_assert_true (n == 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -118,7 +118,7 @@ main (int argc, char *argv[])
|
||||
|
||||
gtk_init ();
|
||||
|
||||
g_test_add_func ("/seat/list", test_list_seats);
|
||||
g_test_add_func ("/seat/list", test_get_seats);
|
||||
g_test_add_func ("/seat/default", test_default_seat);
|
||||
|
||||
return g_test_run ();
|
||||
|
Reference in New Issue
Block a user