Zbigniew Jędrzejewski-Szmek 62fe94
From f6e3ee1493f20823b2c33465458b92f3581af88d Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: David Herrmann <dh.herrmann@gmail.com>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Sat, 20 Sep 2014 17:47:56 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] terminal: raise sysview DEVICE_CHANGE events per attachment
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
Instead of raising DEVICE_CHANGE only per device, we now raise it per
Zbigniew Jędrzejewski-Szmek 62fe94
device-session attachment. This is what we want for all sysview users,
Zbigniew Jędrzejewski-Szmek 62fe94
anyway, as sessions are meant to be independent of each other. Lets avoid
Zbigniew Jędrzejewski-Szmek 62fe94
any external session iterators and just do that in sysview itself.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/modeset.c | 14 +++++++-------
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/sysview.c | 34 ++++++++++++++++++++++++++++++----
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/sysview.h | 14 +++++++-------
Zbigniew Jędrzejewski-Szmek 62fe94
 3 files changed, 44 insertions(+), 18 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd-terminal/modeset.c b/src/libsystemd-terminal/modeset.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 33c79a2036..7a28e7ab97 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd-terminal/modeset.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd-terminal/modeset.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -348,6 +348,13 @@ static int modeset_sysview_fn(sysview_context *c, void *userdata, sysview_event
Zbigniew Jędrzejewski-Szmek 62fe94
                         grdev_session_remove_drm(m->grdev_session, sysview_device_get_ud(d));
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case SYSVIEW_EVENT_SESSION_REFRESH:
Zbigniew Jędrzejewski-Szmek 62fe94
+                d = ev->session_refresh.device;
Zbigniew Jędrzejewski-Szmek 62fe94
+                type = sysview_device_get_type(d);
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (type == SYSVIEW_DEVICE_DRM)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        grdev_session_hotplug_drm(m->grdev_session, ev->session_refresh.ud);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
         case SYSVIEW_EVENT_SESSION_CONTROL:
Zbigniew Jędrzejewski-Szmek 62fe94
                 r = ev->session_control.error;
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (r < 0) {
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -362,13 +369,6 @@ static int modeset_sysview_fn(sysview_context *c, void *userdata, sysview_event
Zbigniew Jędrzejewski-Szmek 62fe94
                 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 break;
Zbigniew Jędrzejewski-Szmek 62fe94
-        case SYSVIEW_EVENT_DEVICE_CHANGE:
Zbigniew Jędrzejewski-Szmek 62fe94
-                d = ev->device_change.device;
Zbigniew Jędrzejewski-Szmek 62fe94
-                type = sysview_device_get_type(d);
Zbigniew Jędrzejewski-Szmek 62fe94
-                if (type == SYSVIEW_DEVICE_DRM)
Zbigniew Jędrzejewski-Szmek 62fe94
-                        grdev_session_hotplug_drm(m->grdev_session, ev->device_change.ud);
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-                break;
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd-terminal/sysview.c b/src/libsystemd-terminal/sysview.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 161ea117a4..5b623c1e6c 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd-terminal/sysview.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd-terminal/sysview.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -517,10 +517,11 @@ static int context_raise_session_detach(sysview_context *c, sysview_session *ses
Zbigniew Jędrzejewski-Szmek 62fe94
         return context_raise(c, &event, 0);
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-static int context_raise_device_change(sysview_context *c, sysview_device *device, struct udev_device *ud) {
Zbigniew Jędrzejewski-Szmek 62fe94
+static int context_raise_session_refresh(sysview_context *c, sysview_session *session, sysview_device *device, struct udev_device *ud) {
Zbigniew Jędrzejewski-Szmek 62fe94
         sysview_event event = {
Zbigniew Jędrzejewski-Szmek 62fe94
-                .type = SYSVIEW_EVENT_DEVICE_CHANGE,
Zbigniew Jędrzejewski-Szmek 62fe94
-                .device_change = {
Zbigniew Jędrzejewski-Szmek 62fe94
+                .type = SYSVIEW_EVENT_SESSION_REFRESH,
Zbigniew Jędrzejewski-Szmek 62fe94
+                .session_refresh = {
Zbigniew Jędrzejewski-Szmek 62fe94
+                        .session = session,
Zbigniew Jędrzejewski-Szmek 62fe94
                         .device = device,
Zbigniew Jędrzejewski-Szmek 62fe94
                         .ud = ud,
Zbigniew Jędrzejewski-Szmek 62fe94
                 }
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -581,6 +582,31 @@ static int context_remove_device(sysview_context *c, sysview_device *device) {
Zbigniew Jędrzejewski-Szmek 62fe94
         return error;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+static int context_change_device(sysview_context *c, sysview_device *device, struct udev_device *ud) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        sysview_session *session;
Zbigniew Jędrzejewski-Szmek 62fe94
+        int r, error = 0;
Zbigniew Jędrzejewski-Szmek 62fe94
+        Iterator i;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        assert(c);
Zbigniew Jędrzejewski-Szmek 62fe94
+        assert(device);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        log_debug("sysview: change device '%s'", device->name);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        HASHMAP_FOREACH(session, device->seat->session_map, i) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (!session->public)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        continue;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                r = context_raise_session_refresh(c, session, device, ud);
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (r != 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        error = r;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (error < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                log_debug("sysview: error while changing device '%s': %s",
Zbigniew Jędrzejewski-Szmek 62fe94
+                          device->name, strerror(-r));
Zbigniew Jędrzejewski-Szmek 62fe94
+        return error;
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
 static int context_add_session(sysview_context *c, sysview_seat *seat, const char *id) {
Zbigniew Jędrzejewski-Szmek 62fe94
         sysview_session *session;
Zbigniew Jędrzejewski-Szmek 62fe94
         sysview_device *device;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -884,7 +910,7 @@ static int context_ud_hotplug(sysview_context *c, struct udev_device *d) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (!device)
Zbigniew Jędrzejewski-Szmek 62fe94
                         return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                return context_raise_device_change(c, device, d);
Zbigniew Jędrzejewski-Szmek 62fe94
+                return context_change_device(c, device, d);
Zbigniew Jędrzejewski-Szmek 62fe94
         } else if (!action || streq_ptr(action, "add")) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 struct udev_device *p;
Zbigniew Jędrzejewski-Szmek 62fe94
                 unsigned int type, t;
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd-terminal/sysview.h b/src/libsystemd-terminal/sysview.h
Zbigniew Jędrzejewski-Szmek 62fe94
index b9452fab89..4d800f8d69 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd-terminal/sysview.h
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd-terminal/sysview.h
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -63,9 +63,8 @@ enum {
Zbigniew Jędrzejewski-Szmek 62fe94
         SYSVIEW_EVENT_SESSION_REMOVE,
Zbigniew Jędrzejewski-Szmek 62fe94
         SYSVIEW_EVENT_SESSION_ATTACH,
Zbigniew Jędrzejewski-Szmek 62fe94
         SYSVIEW_EVENT_SESSION_DETACH,
Zbigniew Jędrzejewski-Szmek 62fe94
+        SYSVIEW_EVENT_SESSION_REFRESH,
Zbigniew Jędrzejewski-Szmek 62fe94
         SYSVIEW_EVENT_SESSION_CONTROL,
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-        SYSVIEW_EVENT_DEVICE_CHANGE,
Zbigniew Jędrzejewski-Szmek 62fe94
 };
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 struct sysview_event {
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -94,13 +93,14 @@ struct sysview_event {
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 struct {
Zbigniew Jędrzejewski-Szmek 62fe94
                         sysview_session *session;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        int error;
Zbigniew Jędrzejewski-Szmek 62fe94
-                } session_control;
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-                struct {
Zbigniew Jędrzejewski-Szmek 62fe94
                         sysview_device *device;
Zbigniew Jędrzejewski-Szmek 62fe94
                         struct udev_device *ud;
Zbigniew Jędrzejewski-Szmek 62fe94
-                } device_change;
Zbigniew Jędrzejewski-Szmek 62fe94
+                } session_refresh;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                struct {
Zbigniew Jędrzejewski-Szmek 62fe94
+                        sysview_session *session;
Zbigniew Jędrzejewski-Szmek 62fe94
+                        int error;
Zbigniew Jędrzejewski-Szmek 62fe94
+                } session_control;
Zbigniew Jędrzejewski-Szmek 62fe94
         };
Zbigniew Jędrzejewski-Szmek 62fe94
 };
Zbigniew Jędrzejewski-Szmek 62fe94