|
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 |
|