int manager_add_button(Manager *m, const char *name, Button **ret_button) {
Button *b;
+ bool is_new;
assert(m);
assert(name);
b = hashmap_get(m->buttons, name);
+ is_new = !b;
+
if (!b) {
b = button_new(m, name);
if (!b)
if (ret_button)
*ret_button = b;
- return 0;
+ return is_new;
}
int manager_process_seat_device(Manager *m, sd_device *d) {
return 0;
}
-int manager_process_button_device(Manager *m, sd_device *d) {
+int manager_process_button_device(Manager *m, sd_device *d, Button **ret_button) {
const char *sysname;
Button *b;
int r;
return r;
if (device_for_action(d, SD_DEVICE_REMOVE) ||
- sd_device_has_current_tag(d, "power-switch") <= 0)
+ sd_device_has_current_tag(d, "power-switch") <= 0) {
- button_free(hashmap_get(m->buttons, sysname));
+ b = hashmap_get(m->buttons, sysname);
+ goto unwatch;
+ }
- else {
- const char *sn;
+ r = manager_add_button(m, sysname, &b);
+ if (r < 0)
+ return r;
+ bool is_new = r > 0;
- r = manager_add_button(m, sysname, &b);
- if (r < 0)
- return r;
+ const char *sn;
+ r = device_get_seat(d, &sn);
+ if (r < 0)
+ return r;
- r = device_get_seat(d, &sn);
- if (r < 0)
- return r;
+ button_set_seat(b, sn);
- button_set_seat(b, sn);
+ r = button_open(b);
+ if (r < 0) /* event device doesn't have any keys or switches relevant to us? (or any other error
+ * opening the device?) let's close the button again. */
+ goto unwatch;
- r = button_open(b);
- if (r < 0) /* event device doesn't have any keys or switches relevant to us? (or any other error
- * opening the device?) let's close the button again. */
- button_free(b);
- }
+ if (ret_button)
+ *ret_button = b;
+
+ return is_new;
+
+unwatch:
+ button_free(b);
+
+ if (ret_button)
+ *ret_button = NULL;
return 0;
}
FOREACH_DEVICE(e, d) {
if (device_is_processed(d) <= 0)
continue;
- RET_GATHER(r, manager_process_button_device(m, d));
+ RET_GATHER(r, manager_process_button_device(m, d, /* ret_button= */ NULL));
}
return r;
static int manager_dispatch_button_udev(sd_device_monitor *monitor, sd_device *device, void *userdata) {
Manager *m = ASSERT_PTR(userdata);
+ Button *b;
assert(device);
- manager_process_button_device(m, device);
+ if (manager_process_button_device(m, device, &b) > 0)
+ (void) button_check_switches(b);
+
return 0;
}
int manager_add_inhibitor(Manager *m, const char* id, Inhibitor **ret_inhibitor);
int manager_process_seat_device(Manager *m, sd_device *d);
-int manager_process_button_device(Manager *m, sd_device *d);
+int manager_process_button_device(Manager *m, sd_device *d, Button **ret_button);
int manager_spawn_autovt(Manager *m, unsigned vtnr);