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 };