static int app_seat_add_video(struct app_seat *seat,
struct app_video **out,
unsigned int type,
+ unsigned int flags,
const char *node)
{
int ret;
struct app_video *vid;
if (seat->conf->fbdev) {
- if (type != UTERM_MONITOR_FBDEV &&
- type != UTERM_MONITOR_FBDEV_DRM) {
+ if (type != UTERM_MONITOR_FBDEV) {
log_info("ignoring video device %s on seat %s as it is not an fbdev device",
node, seat->name);
return -ERANGE;
}
- } else {
- if (type == UTERM_MONITOR_FBDEV_DRM) {
+ } else if (type == UTERM_MONITOR_FBDEV) {
+ if (flags & UTERM_MONITOR_DRM_BACKED) {
log_info("ignoring video device %s on seat %s as it is a DRM-fbdev device",
node, seat->name);
return -ERANGE;
switch (ev->dev_type) {
case UTERM_MONITOR_DRM:
case UTERM_MONITOR_FBDEV:
- case UTERM_MONITOR_FBDEV_DRM:
ret = app_seat_add_video(seat, &vid, ev->dev_type,
+ ev->dev_flags,
ev->dev_node);
if (ret)
return;
switch (ev->dev_type) {
case UTERM_MONITOR_DRM:
case UTERM_MONITOR_FBDEV:
- case UTERM_MONITOR_FBDEV_DRM:
if (ev->dev_data)
app_seat_remove_video(seat, ev->dev_data);
break;
switch (ev->dev_type) {
case UTERM_MONITOR_DRM:
case UTERM_MONITOR_FBDEV:
- case UTERM_MONITOR_FBDEV_DRM:
vid = ev->dev_data;
if (!vid)
return;
struct shl_dlist list;
struct uterm_monitor_seat *seat;
unsigned int type;
+ unsigned int flags;
char *node;
void *data;
};
static void seat_new_dev(struct uterm_monitor_seat *seat,
unsigned int type,
+ unsigned int flags,
const char *node)
{
struct uterm_monitor_dev *dev;
memset(dev, 0, sizeof(*dev));
dev->seat = seat;
dev->type = type;
+ dev->flags = flags;
dev->node = strdup(node);
if (!dev->node)
ev.seat_data = dev->seat->data;
ev.dev = dev;
ev.dev_type = dev->type;
+ ev.dev_flags = dev->flags;
ev.dev_node = dev->node;
ev.dev_data = dev->data;
dev->seat->mon->cb(dev->seat->mon, &ev, dev->seat->mon->data);
ev.seat_data = dev->seat->data;
ev.dev = dev;
ev.dev_type = dev->type;
+ ev.dev_flags = dev->flags;
ev.dev_node = dev->node;
ev.dev_data = dev->data;
dev->seat->mon->cb(dev->seat->mon, &ev, dev->seat->mon->data);
const char *sname, *subs, *node, *name, *sysname;
struct shl_dlist *iter;
struct uterm_monitor_seat *seat;
- unsigned int type;
+ unsigned int type, flags;
int id;
struct udev_device *p;
}
sname = udev_device_get_property_value(dev, "ID_SEAT");
type = UTERM_MONITOR_DRM;
+ flags = 0;
} else if (!strcmp(subs, "graphics")) {
#ifdef BUILD_ENABLE_MULTI_SEAT
if (udev_device_has_tag(dev, "seat") != 1) {
return;
}
sname = udev_device_get_property_value(dev, "ID_SEAT");
+ type = UTERM_MONITOR_FBDEV;
+ flags = 0;
if (is_drm_fbdev(node))
- type = UTERM_MONITOR_FBDEV_DRM;
- else
- type = UTERM_MONITOR_FBDEV;
+ flags |= UTERM_MONITOR_DRM_BACKED;
} else if (!strcmp(subs, "input")) {
sysname = udev_device_get_sysname(dev);
if (!sysname || strncmp(sysname, "event", 5)) {
#endif
sname = udev_device_get_property_value(p, "ID_SEAT");
type = UTERM_MONITOR_INPUT;
+ flags = 0;
} else {
log_debug("adding device with unknown subsystem %s (%s)",
subs, name);
return;
}
- seat_new_dev(seat, type, node);
+ seat_new_dev(seat, type, flags, node);
}
static void monitor_udev_remove(struct uterm_monitor *mon,