summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
Diffstat (limited to 'src/login')
-rw-r--r--src/login/logind-action.c8
-rw-r--r--src/login/logind-button.c23
-rw-r--r--src/login/logind-button.h3
-rw-r--r--src/login/logind-core.c11
-rw-r--r--src/login/logind.c2
-rw-r--r--src/login/logind.h2
6 files changed, 43 insertions, 6 deletions
diff --git a/src/login/logind-action.c b/src/login/logind-action.c
index 3bad922713..c04f2107d1 100644
--- a/src/login/logind-action.c
+++ b/src/login/logind-action.c
@@ -70,6 +70,14 @@ int manager_handle_action(
return 0;
}
+ /* If we are docked don't react to lid closing */
+ if (inhibit_key == INHIBIT_HANDLE_LID_SWITCH) {
+ if (manager_is_docked(m)) {
+ log_debug("Ignoring lid switch request, system is docked.");
+ return 0;
+ }
+ }
+
/* If the key handling is inhibited, don't do anything */
if (inhibit_key > 0) {
if (manager_is_inhibited(m, inhibit_key, INHIBIT_BLOCK, NULL, true, false, 0, NULL)) {
diff --git a/src/login/logind-button.c b/src/login/logind-button.c
index 720071a2a8..060978dd34 100644
--- a/src/login/logind-button.c
+++ b/src/login/logind-button.c
@@ -188,6 +188,14 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
b->lid_closed = true;
manager_handle_action(b->manager, INHIBIT_HANDLE_LID_SWITCH, b->manager->handle_lid_switch, b->manager->lid_switch_ignore_inhibited, true);
button_install_check_event_source(b);
+
+ } else if (ev.code == SW_DOCK) {
+ log_struct(LOG_INFO,
+ "MESSAGE=System docked.",
+ MESSAGE_ID(SD_MESSAGE_SYSTEM_DOCKED),
+ NULL);
+
+ b->docked = true;
}
} else if (ev.type == EV_SW && ev.value == 0) {
@@ -200,6 +208,14 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
b->lid_closed = false;
b->check_event_source = sd_event_source_unref(b->check_event_source);
+
+ } else if (ev.code == SW_DOCK) {
+ log_struct(LOG_INFO,
+ "MESSAGE=System undocked.",
+ MESSAGE_ID(SD_MESSAGE_SYSTEM_UNDOCKED),
+ NULL);
+
+ b->docked = false;
}
}
@@ -247,7 +263,7 @@ fail:
return r;
}
-int button_check_lid(Button *b) {
+int button_check_switches(Button *b) {
uint8_t switches[SW_MAX/8+1] = {};
assert(b);
@@ -258,11 +274,10 @@ int button_check_lid(Button *b) {
return -errno;
b->lid_closed = (switches[SW_LID/8] >> (SW_LID % 8)) & 1;
+ b->docked = (switches[SW_DOCK/8] >> (SW_DOCK % 8)) & 1;
- if (b->lid_closed) {
- manager_handle_action(b->manager, INHIBIT_HANDLE_LID_SWITCH, b->manager->handle_lid_switch, b->manager->lid_switch_ignore_inhibited, true);
+ if (b->lid_closed)
button_install_check_event_source(b);
- }
return 0;
}
diff --git a/src/login/logind-button.h b/src/login/logind-button.h
index e85aa81d0a..72a612e914 100644
--- a/src/login/logind-button.h
+++ b/src/login/logind-button.h
@@ -38,10 +38,11 @@ struct Button {
int fd;
bool lid_closed;
+ bool docked;
};
Button* button_new(Manager *m, const char *name);
void button_free(Button*b);
int button_open(Button *b);
int button_set_seat(Button *b, const char *sn);
-int button_check_lid(Button *b);
+int button_check_switches(Button *b);
diff --git a/src/login/logind-core.c b/src/login/logind-core.c
index 3f8e8139da..e4e593fa5b 100644
--- a/src/login/logind-core.c
+++ b/src/login/logind-core.c
@@ -503,3 +503,14 @@ int manager_spawn_autovt(Manager *m, unsigned int vtnr) {
return r;
}
+
+bool manager_is_docked(Manager *m) {
+ Iterator i;
+ Button *b;
+
+ HASHMAP_FOREACH(b, m->buttons, i)
+ if (b->docked)
+ return true;
+
+ return false;
+}
diff --git a/src/login/logind.c b/src/login/logind.c
index 9cbd9e817f..3a514bbf81 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -1039,7 +1039,7 @@ int manager_startup(Manager *m) {
inhibitor_start(inhibitor);
HASHMAP_FOREACH(button, m->buttons, i)
- button_check_lid(button);
+ button_check_switches(button);
manager_dispatch_idle_action(NULL, 0, m);
diff --git a/src/login/logind.h b/src/login/logind.h
index 0bf52daeb1..0344acc8bd 100644
--- a/src/login/logind.h
+++ b/src/login/logind.h
@@ -148,6 +148,8 @@ int manager_get_idle_hint(Manager *m, dual_timestamp *t);
int manager_get_user_by_pid(Manager *m, pid_t pid, User **user);
int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session);
+bool manager_is_docked(Manager *m);
+
extern const sd_bus_vtable manager_vtable[];
int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);