uterm: monitor: add "dev_flags" field to event-structure

Instead of using different types we now use flags. This is more
appropriate and will allow us more easily to add new flags.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-10-27 13:41:23 +02:00
parent 89e84aa78c
commit 9015f3107d
3 changed files with 22 additions and 13 deletions

View File

@ -203,6 +203,7 @@ static void app_seat_video_event(struct uterm_video *video,
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;
@ -210,14 +211,13 @@ static int app_seat_add_video(struct app_seat *seat,
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;
@ -328,8 +328,8 @@ static void app_monitor_event(struct uterm_monitor *mon,
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;
@ -350,7 +350,6 @@ static void app_monitor_event(struct uterm_monitor *mon,
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;
@ -369,7 +368,6 @@ static void app_monitor_event(struct uterm_monitor *mon,
switch (ev->dev_type) {
case UTERM_MONITOR_DRM:
case UTERM_MONITOR_FBDEV:
case UTERM_MONITOR_FBDEV_DRM:
vid = ev->dev_data;
if (!vid)
return;

View File

@ -397,10 +397,13 @@ enum uterm_monitor_event_type {
enum uterm_monitor_dev_type {
UTERM_MONITOR_DRM,
UTERM_MONITOR_FBDEV,
UTERM_MONITOR_FBDEV_DRM,
UTERM_MONITOR_INPUT,
};
enum uterm_monitor_dev_flag {
UTERM_MONITOR_DRM_BACKED = 0x01,
};
struct uterm_monitor_event {
unsigned int type;
@ -410,6 +413,7 @@ struct uterm_monitor_event {
struct uterm_monitor_dev *dev;
unsigned int dev_type;
unsigned int dev_flags;
const char *dev_node;
void *dev_data;
};

View File

@ -55,6 +55,7 @@ struct uterm_monitor_dev {
struct shl_dlist list;
struct uterm_monitor_seat *seat;
unsigned int type;
unsigned int flags;
char *node;
void *data;
};
@ -212,6 +213,7 @@ static void monitor_sd_deinit(struct uterm_monitor *mon)
static void seat_new_dev(struct uterm_monitor_seat *seat,
unsigned int type,
unsigned int flags,
const char *node)
{
struct uterm_monitor_dev *dev;
@ -223,6 +225,7 @@ static void seat_new_dev(struct uterm_monitor_seat *seat,
memset(dev, 0, sizeof(*dev));
dev->seat = seat;
dev->type = type;
dev->flags = flags;
dev->node = strdup(node);
if (!dev->node)
@ -237,6 +240,7 @@ static void seat_new_dev(struct uterm_monitor_seat *seat,
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);
@ -263,6 +267,7 @@ static void seat_free_dev(struct uterm_monitor_dev *dev)
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);
@ -451,7 +456,7 @@ static void monitor_udev_add(struct uterm_monitor *mon,
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;
@ -490,6 +495,7 @@ static void monitor_udev_add(struct uterm_monitor *mon,
}
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) {
@ -503,10 +509,10 @@ static void monitor_udev_add(struct uterm_monitor *mon,
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)) {
@ -527,6 +533,7 @@ static void monitor_udev_add(struct uterm_monitor *mon,
#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);
@ -550,7 +557,7 @@ static void monitor_udev_add(struct uterm_monitor *mon,
return;
}
seat_new_dev(seat, type, node);
seat_new_dev(seat, type, flags, node);
}
static void monitor_udev_remove(struct uterm_monitor *mon,