Skip to content

Commit 57cf981

Browse files
committed
Switch back to greeter when logind emits SecureAttentionKey
1 parent 8c22a51 commit 57cf981

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

src/lightdm.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,13 @@ login1_service_seat_removed_cb (Login1Service *service, Login1Seat *login1_seat)
551551
remove_login1_seat (login1_seat);
552552
}
553553

554+
static void
555+
login1_service_seat_attention_key_cb (Login1Service *service, Login1Seat *login1_seat)
556+
{
557+
Seat *seat = display_manager_get_seat (display_manager, login1_seat_get_id (login1_seat));
558+
seat_switch_to_greeter (seat);
559+
}
560+
554561
int
555562
main (int argc, char **argv)
556563
{
@@ -891,6 +898,7 @@ main (int argc, char **argv)
891898
{
892899
g_signal_connect (login1_service_get_instance (), LOGIN1_SERVICE_SIGNAL_SEAT_ADDED, G_CALLBACK (login1_service_seat_added_cb), NULL);
893900
g_signal_connect (login1_service_get_instance (), LOGIN1_SERVICE_SIGNAL_SEAT_REMOVED, G_CALLBACK (login1_service_seat_removed_cb), NULL);
901+
g_signal_connect (login1_service_get_instance (), LOGIN1_SERVICE_SIGNAL_SEAT_ATTENTION_KEY, G_CALLBACK (login1_service_seat_attention_key_cb), NULL);
894902

895903
for (GList *link = login1_service_get_seats (login1_service_get_instance ()); link; link = link->next)
896904
{

src/login1.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <gio/gio.h>
1515

1616
#include "login1.h"
17+
#include "seat.h"
1718

1819
#define LOGIN1_SERVICE_NAME "org.freedesktop.login1"
1920
#define LOGIN1_OBJECT_NAME "/org/freedesktop/login1"
@@ -22,6 +23,7 @@
2223
enum {
2324
SEAT_ADDED,
2425
SEAT_REMOVED,
26+
SEAT_ATTENTION_KEY,
2527
LAST_SERVICE_SIGNAL
2628
};
2729
static guint service_signals[LAST_SERVICE_SIGNAL] = { 0 };
@@ -248,6 +250,18 @@ signal_cb (GDBusConnection *connection,
248250
g_signal_emit (service, service_signals[SEAT_REMOVED], 0, seat);
249251
}
250252
}
253+
else if (strcmp (signal_name, "SecureAttentionKey") == 0)
254+
{
255+
const gchar *id, *path;
256+
g_variant_get (parameters, "(&s&o)", &id, &path);
257+
258+
Login1Seat *seat = login1_service_get_seat (service, id);
259+
if (seat)
260+
{
261+
g_signal_emit (service, service_signals[SEAT_ATTENTION_KEY], 0, seat);
262+
}
263+
264+
}
251265
}
252266

253267
gboolean
@@ -498,6 +512,14 @@ login1_service_class_init (Login1ServiceClass *klass)
498512
NULL, NULL,
499513
NULL,
500514
G_TYPE_NONE, 1, LOGIN1_SEAT_TYPE);
515+
service_signals[SEAT_ATTENTION_KEY] =
516+
g_signal_new (LOGIN1_SERVICE_SIGNAL_SEAT_ATTENTION_KEY,
517+
G_TYPE_FROM_CLASS (klass),
518+
G_SIGNAL_RUN_LAST,
519+
G_STRUCT_OFFSET (Login1ServiceClass, seat_attention_key),
520+
NULL, NULL,
521+
NULL,
522+
G_TYPE_NONE, 1, LOGIN1_SEAT_TYPE);
501523
}
502524

503525
const gchar *

src/login1.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ G_BEGIN_DECLS
2424

2525
#define LOGIN1_SERVICE_SIGNAL_SEAT_ADDED "seat-added"
2626
#define LOGIN1_SERVICE_SIGNAL_SEAT_REMOVED "seat-removed"
27+
#define LOGIN1_SERVICE_SIGNAL_SEAT_ATTENTION_KEY "seat-attention-key"
2728

2829
#define LOGIN1_SEAT_SIGNAL_CAN_GRAPHICAL_CHANGED "can-graphical-changed"
2930
#define LOGIN1_SIGNAL_ACTIVE_SESION_CHANGED "active-session-changed"
@@ -50,6 +51,7 @@ typedef struct
5051
GObjectClass parent_class;
5152
void (*seat_added)(Login1Service *service, Login1Seat *seat);
5253
void (*seat_removed)(Login1Service *service, Login1Seat *seat);
54+
void (*seat_attention_key)(Login1Service *service, Login1Seat *seat);
5355
} Login1ServiceClass;
5456

5557
GType login1_service_get_type (void);

0 commit comments

Comments
 (0)