Zbigniew Jędrzejewski-Szmek 62fe94
From 965f7a3f9bf7afb85be62198fabc70ffa033d8b1 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 09:43:16 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] terminal: forward DEVICE_CHANGE events via sysview
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
Whe need to react to "change" events on devices, but we want to avoid
Zbigniew Jędrzejewski-Szmek 62fe94
duplicating udev-monitors everywhere. Therefore, make sysview forward
Zbigniew Jędrzejewski-Szmek 62fe94
change events to the sysview controllers, which can then properly react
Zbigniew Jędrzejewski-Szmek 62fe94
to it.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/sysview.c | 14 +++++++++++++-
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/sysview.h |  7 +++++++
Zbigniew Jędrzejewski-Szmek 62fe94
 2 files changed, 20 insertions(+), 1 deletion(-)
Zbigniew Jędrzejewski-Szmek 62fe94
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 6c1a9543b9..23d564d6a0 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,6 +517,18 @@ 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
+        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
+                        .device = device,
Zbigniew Jędrzejewski-Szmek 62fe94
+                        .ud = ud,
Zbigniew Jędrzejewski-Szmek 62fe94
+                }
Zbigniew Jędrzejewski-Szmek 62fe94
+        };
Zbigniew Jędrzejewski-Szmek 62fe94
+
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_add_device(sysview_context *c, sysview_device *device) {
Zbigniew Jędrzejewski-Szmek 62fe94
         sysview_session *session;
Zbigniew Jędrzejewski-Szmek 62fe94
         int r, error = 0;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -872,7 +884,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
-                /* TODO: send REFRESH event */
Zbigniew Jędrzejewski-Szmek 62fe94
+                return context_raise_device_change(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 de6ff371db..b9452fab89 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
@@ -64,6 +64,8 @@ enum {
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_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,6 +96,11 @@ struct sysview_event {
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
         };
Zbigniew Jędrzejewski-Szmek 62fe94
 };
Zbigniew Jędrzejewski-Szmek 62fe94