output->base.current->width,
output->base.current->height);
- if (!pixman_region32_not_empty(&cursor_region)) {
- ret = 0;
+ if (!pixman_region32_not_empty(&cursor_region))
goto out;
- }
if (eid->sprite->image == EGL_NO_IMAGE_KHR)
goto out;
goto out;
}
- printf("info: set hardware cursor\n");
-
out:
pixman_region32_fini(&cursor_region);
if (ret)
return -1;
memset(output, 0, sizeof *output);
- output->base.x = x;
- output->base.y = y;
- output->base.mm_width = connector->mmWidth;
- output->base.mm_height = connector->mmHeight;
output->base.subpixel = drm_subpixel_to_wayland(connector->subpixel);
output->base.make = "unknown";
output->base.model = "unknown";
drm_mode->base.flags =
WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
- wlsc_output_init(&output->base, &ec->base, x, y, 200, 100, 0);
+ wlsc_output_init(&output->base, &ec->base, x, y,
+ connector->mmWidth, connector->mmHeight, 0);
wl_list_insert(ec->base.output_list.prev, &output->base.link);
if (connector->connection == DRM_MODE_CONNECTED &&
(option_connector == 0 ||
- connector->connector_id == option_connector))
+ connector->connector_id == option_connector)) {
if (create_output_for_connector(ec, resources,
connector, x, y) < 0)
return -1;
- x += container_of(ec->base.output_list.prev, struct wlsc_output,
- link)->current->width;
+ x += container_of(ec->base.output_list.prev,
+ struct wlsc_output,
+ link)->current->width;
+ }
drmModeFreeConnector(connector);
}
struct drm_compositor *c = (struct drm_compositor *) ec;
struct gbm_bo *bo;
EGLImageKHR image;
+ uint32_t *pixels;
+ GLuint tex;
if (width > 64 || height > 64)
return EGL_NO_IMAGE_KHR;
EGL_NATIVE_PIXMAP_KHR, bo, NULL);
gbm_bo_destroy(bo);
+ /* If the requested size is smaller than the allocated one, make the
+ * whole image transparent. */
+ if (width != 64 || height != 64) {
+ pixels = calloc(64 * 64, sizeof *pixels);
+
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ c->base.image_target_texture_2d(GL_TEXTURE_2D, image);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 64, 64,
+ GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
+
+ glDeleteTextures(1, &tex);
+ free(pixels);
+ }
+
return image;
}
};
}
+static const char default_seat[] = "seat0";
+
static struct wlsc_compositor *
-drm_compositor_create(struct wl_display *display, int connector)
+drm_compositor_create(struct wl_display *display,
+ int connector, const char *seat)
{
struct drm_compositor *ec;
struct udev_enumerate *e;
struct udev_list_entry *entry;
- struct udev_device *device;
- const char *path;
+ struct udev_device *device, *drm_device;
+ const char *path, *device_seat;
struct wl_event_loop *loop;
ec = malloc(sizeof *ec);
e = udev_enumerate_new(ec->udev);
udev_enumerate_add_match_subsystem(e, "drm");
- udev_enumerate_add_match_property(e, "WAYLAND_SEAT", "1");
+
udev_enumerate_scan_devices(e);
- device = NULL;
+ drm_device = NULL;
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
path = udev_list_entry_get_name(entry);
device = udev_device_new_from_syspath(ec->udev, path);
- break;
+ device_seat =
+ udev_device_get_property_value(device, "ID_SEAT");
+ if (!device_seat)
+ device_seat = default_seat;
+ if (strcmp(device_seat, seat) == 0) {
+ drm_device = device;
+ break;
+ }
+ udev_device_unref(device);
}
+
udev_enumerate_unref(e);
- if (device == NULL) {
+ if (drm_device == NULL) {
fprintf(stderr, "no drm device found\n");
return NULL;
}
ec->base.wl_display = display;
- if (init_egl(ec, device) < 0) {
+ if (init_egl(ec, drm_device) < 0) {
fprintf(stderr, "failed to initialize egl\n");
return NULL;
}
+ udev_device_unref(drm_device);
+
ec->base.destroy = drm_destroy;
ec->base.create_cursor_image = drm_compositor_create_cursor_image;
return NULL;
}
- evdev_input_add_devices(&ec->base, ec->udev);
+ evdev_input_add_devices(&ec->base, ec->udev, seat);
loop = wl_display_get_event_loop(ec->base.wl_display);
ec->drm_source =
backend_init(struct wl_display *display, char *options)
{
int connector = 0, i;
+ const char *seat;
char *p, *value;
- static char * const tokens[] = { "connector", NULL };
+ static char * const tokens[] = { "connector", "seat", NULL };
p = options;
+ seat = default_seat;
while (i = getsubopt(&p, tokens, &value), i != -1) {
switch (i) {
case 0:
connector = strtol(value, NULL, 0);
break;
+ case 1:
+ seat = value;
+ break;
}
}
- return drm_compositor_create(display, connector);
+ return drm_compositor_create(display, connector, seat);
}