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;
return -errno;
}
- 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);
-
break;
}
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) {
sysview_event event = {
- .type = SYSVIEW_EVENT_DEVICE_CHANGE,
- .device_change = {
+ .type = SYSVIEW_EVENT_SESSION_REFRESH,
+ .session_refresh = {
+ .session = session,
.device = device,
.ud = ud,
}
return error;
}
+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;
if (!device)
return 0;
- 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;
SYSVIEW_EVENT_SESSION_REMOVE,
SYSVIEW_EVENT_SESSION_ATTACH,
SYSVIEW_EVENT_SESSION_DETACH,
+ SYSVIEW_EVENT_SESSION_REFRESH,
SYSVIEW_EVENT_SESSION_CONTROL,
-
- SYSVIEW_EVENT_DEVICE_CHANGE,
};
struct sysview_event {
struct {
sysview_session *session;
- int error;
- } session_control;
-
- struct {
sysview_device *device;
struct udev_device *ud;
- } device_change;
+ } session_refresh;
+
+ struct {
+ sysview_session *session;
+ int error;
+ } session_control;
};
};