summaryrefslogtreecommitdiff
path: root/gtk/gtkpasswordentry.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-05-14 21:27:45 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-05-15 14:11:53 -0400
commit8912a6eb757c39a6801358331fa81f8f52ebad8a (patch)
treeb410b78952f174bed33fd9d1fb63615eb20d3082 /gtk/gtkpasswordentry.c
parent9b7a73268ea264f5674d04e129d9dabf680d3513 (diff)
downloadgtk+-8912a6eb757c39a6801358331fa81f8f52ebad8a.tar.gz
gtk: Handle seatless displays
If you run weston with the headless backend, you get a Wayland display with no seat, which is just fine by the protocol. gdk_display_get_default_seat() returns NULL in this case. Various widgets assume that we always have a seat with a keyboard and a pointer, since that is what X guarantees. Make things survive without that, so we can run the testsuite under a headless Wayland compositor.
Diffstat (limited to 'gtk/gtkpasswordentry.c')
-rw-r--r--gtk/gtkpasswordentry.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/gtk/gtkpasswordentry.c b/gtk/gtkpasswordentry.c
index d26bf75645..ab68a7dbd8 100644
--- a/gtk/gtkpasswordentry.c
+++ b/gtk/gtkpasswordentry.c
@@ -167,12 +167,20 @@ gtk_password_entry_realize (GtkWidget *widget)
{
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
+ GdkSeat *seat;
GTK_WIDGET_CLASS (gtk_password_entry_parent_class)->realize (widget);
- priv->keyboard = gdk_seat_get_keyboard (gdk_display_get_default_seat (gtk_widget_get_display (widget)));
- g_signal_connect (priv->keyboard, "notify::caps-lock-state", G_CALLBACK (caps_lock_state_changed), entry);
- caps_lock_state_changed (priv->keyboard, NULL, widget);
+ seat = gdk_display_get_default_seat (gtk_widget_get_display (widget));
+ if (seat)
+ priv->keyboard = gdk_seat_get_keyboard (seat);
+
+ if (priv->keyboard)
+ {
+ g_signal_connect (priv->keyboard, "notify::caps-lock-state",
+ G_CALLBACK (caps_lock_state_changed), entry);
+ caps_lock_state_changed (priv->keyboard, NULL, widget);
+ }
}
static void
@@ -496,7 +504,8 @@ gtk_password_entry_set_show_peek_icon (GtkPasswordEntry *entry,
entry);
}
- caps_lock_state_changed (priv->keyboard, NULL, GTK_WIDGET (entry));
+ if (priv->keyboard)
+ caps_lock_state_changed (priv->keyboard, NULL, GTK_WIDGET (entry));
g_object_notify_by_pspec (G_OBJECT (entry), props[PROP_SHOW_PEEK_ICON]);
}