compositor-drm: Fix compilation error caused by typo.
[profile/ivi/weston.git] / compositor / compositor-drm.c
index 5c3e37a..536760b 100644 (file)
@@ -210,10 +210,8 @@ drm_output_set_cursor(struct wlsc_output *output_base,
                                       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;
@@ -250,8 +248,6 @@ drm_output_set_cursor(struct wlsc_output *output_base,
                goto out;
        }
 
-       printf("info: set hardware cursor\n");
-
 out:
        pixman_region32_fini(&cursor_region);
        if (ret)
@@ -416,10 +412,6 @@ create_output_for_connector(struct drm_compositor *ec,
                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";
@@ -441,7 +433,8 @@ create_output_for_connector(struct drm_compositor *ec,
        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);
 
@@ -523,13 +516,15 @@ create_outputs(struct drm_compositor *ec, int option_connector)
 
                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);
        }
@@ -686,6 +681,8 @@ drm_compositor_create_cursor_image(struct wlsc_compositor *ec,
        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;
@@ -699,6 +696,26 @@ drm_compositor_create_cursor_image(struct wlsc_compositor *ec,
                                 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;
 }
 
@@ -737,14 +754,17 @@ vt_func(struct wlsc_compositor *compositor, int event)
        };
 }
 
+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);
@@ -760,27 +780,38 @@ drm_compositor_create(struct wl_display *display, int connector)
 
        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;
 
@@ -798,7 +829,7 @@ drm_compositor_create(struct wl_display *display, int connector)
                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 =
@@ -832,18 +863,23 @@ WL_EXPORT struct wlsc_compositor *
 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);
 }