chiark / gitweb /
terminal: modeset: forward DEVICE_CHANGE events into grdev
[elogind.git] / src / libsystemd-terminal / sysview.c
index d885cb4d4aee722e2764df158bfc2560c1dfd4c1..161ea117a4fbe88308e06186f557fdddbacba2ca 100644 (file)
@@ -98,6 +98,7 @@ sysview_device *sysview_device_free(sysview_device *device) {
                 break;
         }
 
+        free(device->name);
         free(device);
 
         return NULL;
@@ -262,7 +263,7 @@ static int session_take_control_fn(sd_bus *bus,
 
                 log_debug("sysview: %s: TakeControl failed: %s: %s",
                           session->name, e->name, e->message);
-                error = sd_bus_error_get_errno(e);
+                error = -sd_bus_error_get_errno(e);
         } else {
                 session->has_control = true;
                 error = 0;
@@ -367,11 +368,11 @@ int sysview_seat_new(sysview_seat **out, sysview_context *c, const char *name) {
         if (!seat->name)
                 return -ENOMEM;
 
-        seat->session_map = hashmap_new(string_hash_func, string_compare_func);
+        seat->session_map = hashmap_new(&string_hash_ops);
         if (!seat->session_map)
                 return -ENOMEM;
 
-        seat->device_map = hashmap_new(string_hash_func, string_compare_func);
+        seat->device_map = hashmap_new(&string_hash_ops);
         if (!seat->device_map)
                 return -ENOMEM;
 
@@ -516,6 +517,18 @@ static int context_raise_session_detach(sysview_context *c, sysview_session *ses
         return context_raise(c, &event, 0);
 }
 
+static int context_raise_device_change(sysview_context *c, sysview_device *device, struct udev_device *ud) {
+        sysview_event event = {
+                .type = SYSVIEW_EVENT_DEVICE_CHANGE,
+                .device_change = {
+                        .device = device,
+                        .ud = ud,
+                }
+        };
+
+        return context_raise(c, &event, 0);
+}
+
 static int context_add_device(sysview_context *c, sysview_device *device) {
         sysview_session *session;
         int r, error = 0;
@@ -766,15 +779,15 @@ int sysview_context_new(sysview_context **out,
                         return errno > 0 ? -errno : -EFAULT;
         }
 
-        c->seat_map = hashmap_new(string_hash_func, string_compare_func);
+        c->seat_map = hashmap_new(&string_hash_ops);
         if (!c->seat_map)
                 return -ENOMEM;
 
-        c->session_map = hashmap_new(string_hash_func, string_compare_func);
+        c->session_map = hashmap_new(&string_hash_ops);
         if (!c->session_map)
                 return -ENOMEM;
 
-        c->device_map = hashmap_new(string_hash_func, string_compare_func);
+        c->device_map = hashmap_new(&string_hash_ops);
         if (!c->device_map)
                 return -ENOMEM;
 
@@ -821,7 +834,7 @@ static int context_ud_prepare_monitor(sysview_context *c, struct udev_monitor *m
                         return r;
         }
 
-        return r;
+        return 0;
 }
 
 static int context_ud_prepare_scan(sysview_context *c, struct udev_enumerate *e) {
@@ -871,7 +884,7 @@ static int context_ud_hotplug(sysview_context *c, struct udev_device *d) {
                 if (!device)
                         return 0;
 
-                /* TODO: send REFRESH event */
+                return context_raise_device_change(c, device, d);
         } else if (!action || streq_ptr(action, "add")) {
                 struct udev_device *p;
                 unsigned int type, t;
@@ -882,7 +895,7 @@ static int context_ud_hotplug(sysview_context *c, struct udev_device *d) {
 
                 if (streq(subsystem, "input") && startswith(sysname, "event") && safe_atou(sysname + 5, &t) >= 0)
                         type = SYSVIEW_DEVICE_EVDEV;
-                else if (streq(subsystem, "drm") && startswith(sysname, "card") && safe_atou(sysname + 4, &t) >= 0)
+                else if (streq(subsystem, "drm") && startswith(sysname, "card"))
                         type = SYSVIEW_DEVICE_DRM;
                 else
                         type = (unsigned)-1;
@@ -892,11 +905,11 @@ static int context_ud_hotplug(sysview_context *c, struct udev_device *d) {
 
                 p = d;
                 seatname = NULL;
-                while ((p = udev_device_get_parent(p))) {
+                do {
                         seatname = udev_device_get_property_value(p, "ID_SEAT");
                         if (seatname)
                                 break;
-                }
+                } while ((p = udev_device_get_parent(p)));
 
                 seat = sysview_find_seat(c, seatname ? : "seat0");
                 if (!seat)
@@ -1194,7 +1207,7 @@ static int context_ld_list_seats_fn(sd_bus *bus,
 
                 log_debug("sysview: ListSeats on logind failed: %s: %s",
                           error->name, error->message);
-                return sd_bus_error_get_errno(error);
+                return -sd_bus_error_get_errno(error);
         }
 
         r = sd_bus_message_enter_container(reply, 'a', "(so)");
@@ -1246,7 +1259,7 @@ static int context_ld_list_sessions_fn(sd_bus *bus,
 
                 log_debug("sysview: ListSessions on logind failed: %s: %s",
                           error->name, error->message);
-                return sd_bus_error_get_errno(error);
+                return -sd_bus_error_get_errno(error);
         }
 
         r = sd_bus_message_enter_container(reply, 'a', "(susso)");