commit 9ccfa62

Michael Forney  ·  2014-02-03 03:38:41 +0000 UTC
parent 50ff0cb
Make sure framebuffer and cursor planes are positioned correctly
5 files changed,  +28, -9
+4, -1
 1@@ -26,6 +26,7 @@
 2 #include "drm.h"
 3 #include "internal.h"
 4 #include "launch.h"
 5+#include "screen.h"
 6 #include "util.h"
 7 
 8 #include <errno.h>
 9@@ -75,7 +76,9 @@ static bool move(struct swc_view * view, int32_t x, int32_t y)
10 {
11     struct swc_cursor_plane * plane = CONTAINER_OF(view, typeof(*plane), view);
12 
13-    if (drmModeMoveCursor(swc.drm->fd, plane->crtc, x, y) != 0)
14+    if (drmModeMoveCursor(swc.drm->fd, plane->crtc,
15+                          x - view->screen->base.geometry.x,
16+                          y - view->screen->base.geometry.y) != 0)
17     {
18         ERROR("Could not move cursor: %s\n", strerror(errno));
19         return false;
+9, -1
 1@@ -142,9 +142,15 @@ static bool attach(struct swc_view * view, struct swc_buffer * buffer)
 2     return true;
 3 }
 4 
 5+static bool move(struct swc_view * view, int32_t x, int32_t y)
 6+{
 7+    return true;
 8+}
 9+
10 const static struct swc_view_impl view_impl = {
11     .update = &update,
12-    .attach = &attach
13+    .attach = &attach,
14+    .move = &move
15 };
16 
17 static void handle_page_flip(struct swc_drm_handler * handler, uint32_t time)
18@@ -192,6 +198,8 @@ bool swc_framebuffer_plane_initialize(struct swc_framebuffer_plane * plane,
19     plane->drm_handler.page_flip = &handle_page_flip;
20     plane->need_modeset = true;
21     swc_view_initialize(&plane->view, &view_impl);
22+    plane->view.geometry.width = mode->width;
23+    plane->view.geometry.height = mode->height;
24     plane->mode = *mode;
25 
26     return true;
+1, -2
 1@@ -135,8 +135,7 @@ static void handle_view_event(struct wl_listener * listener, void * data)
 2             wl_list_for_each(screen, &swc.screens, link)
 3             {
 4                 swc_view_move(&screen->planes.cursor.view,
 5-                              view->geometry.x - screen->base.geometry.x,
 6-                              view->geometry.y - screen->base.geometry.y);
 7+                              view->geometry.x, view->geometry.y);
 8 
 9                 if (view->screens & swc_screen_mask(screen))
10                 {
+7, -5
 1@@ -68,11 +68,6 @@ struct swc_screen_internal * swc_screen_new(uint32_t crtc,
 2     if (!(screen = malloc(sizeof *screen)))
 3         goto error0;
 4 
 5-    screen->base.geometry.x = x;
 6-    screen->base.geometry.y = 0;
 7-    screen->base.geometry.width = output->preferred_mode->width;
 8-    screen->base.geometry.height = output->preferred_mode->height;
 9-    screen->base.usable_geometry = screen->base.geometry;
10     wl_signal_init(&screen->base.event_signal);
11     wl_list_init(&screen->outputs);
12     wl_list_insert(&INTERNAL(screen)->outputs, &output->link);
13@@ -92,6 +87,13 @@ struct swc_screen_internal * swc_screen_new(uint32_t crtc,
14         goto error2;
15     }
16 
17+    screen->planes.framebuffer.view.screen = screen;
18+    screen->planes.cursor.view.screen = screen;
19+
20+    swc_view_move(&screen->planes.framebuffer.view, x, 0);
21+    screen->base.geometry = screen->planes.framebuffer.view.geometry;
22+    screen->base.usable_geometry = screen->base.geometry;
23+
24     swc.manager->new_screen(&screen->base);
25 
26     return screen;
+7, -0
 1@@ -86,6 +86,13 @@ struct swc_view
 2     uint32_t screens;
 3 
 4     struct swc_rectangle geometry;
 5+
 6+    /**
 7+     * The screen that the view belongs to (for example if framebuffer or
 8+     * cursor plane), or NULL.
 9+     */
10+    struct screen * screen;
11+
12     struct swc_buffer * buffer;
13     struct wl_listener buffer_destroy_listener;
14 };