Compare commits

...

3 Commits

Author SHA1 Message Date
Matthias Clasen
a83317a796 Drop gdk_display_list_seats
It has been replaced by gdk_display_get_seats()
and is no longer used.
2020-09-06 09:43:07 -04:00
Matthias Clasen
4032ef1509 Port all users to gdk_display_get_seats 2020-09-06 09:43:07 -04:00
Matthias Clasen
e7afca6bbf Add gdk_display_get_seats
This is a function to get the seats as a list model.
2020-09-06 08:43:46 -04:00
12 changed files with 117 additions and 96 deletions

View File

@@ -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

View File

@@ -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
*/

View File

@@ -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;

View File

@@ -108,7 +108,7 @@ struct _GdkDisplay
GdkDebugFlags debug_flags;
GList *seats;
GListStore *seats;
};
struct _GdkDisplayClass

View File

@@ -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]);
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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 ();