Instead of raising DEVICE_CHANGE only per device, we now raise it per
device-session attachment. This is what we want for all sysview users,
anyway, as sessions are meant to be independent of each other. Lets avoid
any external session iterators and just do that in sysview itself.
if (type == SYSVIEW_DEVICE_DRM)
grdev_session_remove_drm(m->grdev_session, sysview_device_get_ud(d));
if (type == SYSVIEW_DEVICE_DRM)
grdev_session_remove_drm(m->grdev_session, sysview_device_get_ud(d));
+ break;
+ case SYSVIEW_EVENT_SESSION_REFRESH:
+ d = ev->session_refresh.device;
+ type = sysview_device_get_type(d);
+ if (type == SYSVIEW_DEVICE_DRM)
+ grdev_session_hotplug_drm(m->grdev_session, ev->session_refresh.ud);
+
break;
case SYSVIEW_EVENT_SESSION_CONTROL:
r = ev->session_control.error;
break;
case SYSVIEW_EVENT_SESSION_CONTROL:
r = ev->session_control.error;
- break;
- case SYSVIEW_EVENT_DEVICE_CHANGE:
- d = ev->device_change.device;
- type = sysview_device_get_type(d);
- if (type == SYSVIEW_DEVICE_DRM)
- grdev_session_hotplug_drm(m->grdev_session, ev->device_change.ud);
-
return context_raise(c, &event, 0);
}
return context_raise(c, &event, 0);
}
-static int context_raise_device_change(sysview_context *c, sysview_device *device, struct udev_device *ud) {
+static int context_raise_session_refresh(sysview_context *c, sysview_session *session, sysview_device *device, struct udev_device *ud) {
- .type = SYSVIEW_EVENT_DEVICE_CHANGE,
- .device_change = {
+ .type = SYSVIEW_EVENT_SESSION_REFRESH,
+ .session_refresh = {
+ .session = session,
.device = device,
.ud = ud,
}
.device = device,
.ud = ud,
}
+static int context_change_device(sysview_context *c, sysview_device *device, struct udev_device *ud) {
+ sysview_session *session;
+ int r, error = 0;
+ Iterator i;
+
+ assert(c);
+ assert(device);
+
+ log_debug("sysview: change device '%s'", device->name);
+
+ HASHMAP_FOREACH(session, device->seat->session_map, i) {
+ if (!session->public)
+ continue;
+
+ r = context_raise_session_refresh(c, session, device, ud);
+ if (r != 0)
+ error = r;
+ }
+
+ if (error < 0)
+ log_debug("sysview: error while changing device '%s': %s",
+ device->name, strerror(-r));
+ return error;
+}
+
static int context_add_session(sysview_context *c, sysview_seat *seat, const char *id) {
sysview_session *session;
sysview_device *device;
static int context_add_session(sysview_context *c, sysview_seat *seat, const char *id) {
sysview_session *session;
sysview_device *device;
- return context_raise_device_change(c, device, d);
+ return context_change_device(c, device, d);
} else if (!action || streq_ptr(action, "add")) {
struct udev_device *p;
unsigned int type, t;
} else if (!action || streq_ptr(action, "add")) {
struct udev_device *p;
unsigned int type, t;
SYSVIEW_EVENT_SESSION_REMOVE,
SYSVIEW_EVENT_SESSION_ATTACH,
SYSVIEW_EVENT_SESSION_DETACH,
SYSVIEW_EVENT_SESSION_REMOVE,
SYSVIEW_EVENT_SESSION_ATTACH,
SYSVIEW_EVENT_SESSION_DETACH,
+ SYSVIEW_EVENT_SESSION_REFRESH,
SYSVIEW_EVENT_SESSION_CONTROL,
SYSVIEW_EVENT_SESSION_CONTROL,
-
- SYSVIEW_EVENT_DEVICE_CHANGE,
};
struct sysview_event {
};
struct sysview_event {
struct {
sysview_session *session;
struct {
sysview_session *session;
- int error;
- } session_control;
-
- struct {
sysview_device *device;
struct udev_device *ud;
sysview_device *device;
struct udev_device *ud;
+ } session_refresh;
+
+ struct {
+ sysview_session *session;
+ int error;
+ } session_control;