summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
Diffstat (limited to 'src/login')
-rw-r--r--src/login/logind-device.c16
-rw-r--r--src/login/logind-seat-dbus.c40
-rw-r--r--src/login/logind-seat.c20
-rw-r--r--src/login/logind-seat.h3
4 files changed, 72 insertions, 7 deletions
diff --git a/src/login/logind-device.c b/src/login/logind-device.c
index 828e1efe4a..51b15358ba 100644
--- a/src/login/logind-device.c
+++ b/src/login/logind-device.c
@@ -65,22 +65,32 @@ void device_free(Device *d) {
}
void device_detach(Device *d) {
+ Seat *s;
assert(d);
- if (d->seat)
- LIST_REMOVE(Device, devices, d->seat->devices, d);
+ if (!d->seat)
+ return;
- seat_add_to_gc_queue(d->seat);
+ s = d->seat;
+ LIST_REMOVE(Device, devices, d->seat->devices, d);
d->seat = NULL;
+
+ seat_add_to_gc_queue(s);
+ seat_send_changed(s, "CanGraphical\0");
}
void device_attach(Device *d, Seat *s) {
assert(d);
assert(s);
+ if (d->seat == s)
+ return;
+
if (d->seat)
device_detach(d);
d->seat = s;
LIST_PREPEND(Device, devices, s->devices, d);
+
+ seat_send_changed(s, "CanGraphical\0");
}
diff --git a/src/login/logind-seat-dbus.c b/src/login/logind-seat-dbus.c
index 4bf9bf7b1f..7833d70a03 100644
--- a/src/login/logind-seat-dbus.c
+++ b/src/login/logind-seat-dbus.c
@@ -36,6 +36,8 @@
" <property name=\"Id\" type=\"s\" access=\"read\"/>\n" \
" <property name=\"ActiveSession\" type=\"so\" access=\"read\"/>\n" \
" <property name=\"CanMultiSession\" type=\"b\" access=\"read\"/>\n" \
+ " <property name=\"CanTTY\" type=\"b\" access=\"read\"/>\n" \
+ " <property name=\"CanGraphical\" type=\"b\" access=\"read\"/>\n" \
" <property name=\"Sessions\" type=\"a(so)\" access=\"read\"/>\n" \
" <property name=\"IdleHint\" type=\"b\" access=\"read\"/>\n" \
" <property name=\"IdleSinceHint\" type=\"t\" access=\"read\"/>\n" \
@@ -133,7 +135,7 @@ static int bus_seat_append_sessions(DBusMessageIter *i, const char *property, vo
return 0;
}
-static int bus_seat_append_multi_session(DBusMessageIter *i, const char *property, void *data) {
+static int bus_seat_append_can_multi_session(DBusMessageIter *i, const char *property, void *data) {
Seat *s = data;
dbus_bool_t b;
@@ -149,6 +151,38 @@ static int bus_seat_append_multi_session(DBusMessageIter *i, const char *propert
return 0;
}
+static int bus_seat_append_can_tty(DBusMessageIter *i, const char *property, void *data) {
+ Seat *s = data;
+ dbus_bool_t b;
+
+ assert(i);
+ assert(property);
+ assert(s);
+
+ b = seat_can_tty(s);
+
+ if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b))
+ return -ENOMEM;
+
+ return 0;
+}
+
+static int bus_seat_append_can_graphical(DBusMessageIter *i, const char *property, void *data) {
+ Seat *s = data;
+ dbus_bool_t b;
+
+ assert(i);
+ assert(property);
+ assert(s);
+
+ b = seat_can_graphical(s);
+
+ if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b))
+ return -ENOMEM;
+
+ return 0;
+}
+
static int bus_seat_append_idle_hint(DBusMessageIter *i, const char *property, void *data) {
Seat *s = data;
dbus_bool_t b;
@@ -210,7 +244,9 @@ static int get_seat_for_path(Manager *m, const char *path, Seat **_s) {
static const BusProperty bus_login_seat_properties[] = {
{ "Id", bus_property_append_string, "s", offsetof(Seat, id), true },
{ "ActiveSession", bus_seat_append_active, "(so)", 0 },
- { "CanMultiSession", bus_seat_append_multi_session, "b", 0 },
+ { "CanMultiSession", bus_seat_append_can_multi_session, "b", 0 },
+ { "CanTTY", bus_seat_append_can_tty, "b", 0 },
+ { "CanGraphical", bus_seat_append_can_graphical, "b", 0 },
{ "Sessions", bus_seat_append_sessions, "a(so)", 0 },
{ "IdleHint", bus_seat_append_idle_hint, "b", 0 },
{ "IdleSinceHint", bus_seat_append_idle_hint_since, "t", 0 },
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index 755f20c03a..045712192a 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -104,9 +104,13 @@ int seat_save(Seat *s) {
fprintf(f,
"# This is private data. Do not parse.\n"
"IS_VTCONSOLE=%i\n"
- "CAN_MULTI_SESSION=%i\n",
+ "CAN_MULTI_SESSION=%i\n"
+ "CAN_TTY=%i\n"
+ "CAN_GRAPHICAL=%i\n",
seat_is_vtconsole(s),
- seat_can_multi_session(s));
+ seat_can_multi_session(s),
+ seat_can_tty(s),
+ seat_can_graphical(s));
if (s->active) {
assert(s->active->user);
@@ -427,6 +431,18 @@ bool seat_can_multi_session(Seat *s) {
return s->manager->console_active_fd >= 0;
}
+bool seat_can_tty(Seat *s) {
+ assert(s);
+
+ return seat_is_vtconsole(s);
+}
+
+bool seat_can_graphical(Seat *s) {
+ assert(s);
+
+ return !!s->devices;
+}
+
int seat_get_idle_hint(Seat *s, dual_timestamp *t) {
Session *session;
bool idle_hint = true;
diff --git a/src/login/logind-seat.h b/src/login/logind-seat.h
index d41320da46..1abbc344ec 100644
--- a/src/login/logind-seat.h
+++ b/src/login/logind-seat.h
@@ -63,6 +63,9 @@ int seat_attach_session(Seat *s, Session *session);
bool seat_is_vtconsole(Seat *s);
bool seat_can_multi_session(Seat *s);
+bool seat_can_tty(Seat *s);
+bool seat_can_graphical(Seat *s);
+
int seat_get_idle_hint(Seat *s, dual_timestamp *t);
int seat_start(Seat *s);