diff options
author | Kristian Høgsberg <krh@redhat.com> | 2009-09-18 20:40:53 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2009-09-18 20:40:53 -0400 |
commit | 19919903ae471bdb3b2740179717f408a325921b (patch) | |
tree | a9d9fa50495c140ddc81b6ffbc0fe0da32f46c4a | |
parent | d9d240c77911a1454afb0d474f99f949c54fe985 (diff) |
Take CM selection, fixes and refactoring
-rw-r--r-- | src/i830_driver.c | 4 | ||||
-rw-r--r-- | src/wayland.c | 167 |
2 files changed, 94 insertions, 77 deletions
diff --git a/src/i830_driver.c b/src/i830_driver.c index 9d13fad9..f6dd9209 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -614,6 +614,8 @@ i830CreateScreenResources(ScreenPtr pScreen) i830_uxa_create_screen_resources(pScreen); + wayland_init_rootless (pScrn); + return TRUE; } @@ -2792,8 +2794,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pI830->CreateScreenResources = pScreen->CreateScreenResources; pScreen->CreateScreenResources = i830CreateScreenResources; - wayland_init_rootless (pScrn); - if (!xf86CrtcScreenInit (pScreen)) return FALSE; diff --git a/src/wayland.c b/src/wayland.c index bba2022a..c5406887 100644 --- a/src/wayland.c +++ b/src/wayland.c @@ -38,12 +38,11 @@ #include <wayland-client.h> #include <X11/extensions/compositeproto.h> #include <compositeext.h> +#include <selection.h> /* * TODO: - * - * - handle resize - * - menu window pop up over menu + * - lose X kb focus when wayland surface loses it * - active grabs, grab owner crack * - draw decorations in xserver, don't use metacity */ @@ -55,7 +54,6 @@ struct xwl_window { struct xwl_context *context; struct wl_surface *surface; struct wl_visual *visual; - int x, y; WindowPtr window; }; @@ -74,6 +72,7 @@ struct xwl_context { /* FIXME: Hack. */ int32_t width, height; + CreateWindowProcPtr CreateWindow; RealizeWindowProcPtr RealizeWindow; UnrealizeWindowProcPtr UnrealizeWindow; SetWindowPixmapProcPtr SetWindowPixmap; @@ -273,12 +272,10 @@ handle_motion(void *data, struct wl_input_device *input_device, } window = d->focus_window; - window->x = d->grab_x + x; - window->y = d->grab_y + y; - pScreen = window->window->drawable.pScreen; (*pScreen->MoveWindow)(window->window, - window->x, window->y, NullWindow, VTMove); + d->grab_x + x, d->grab_y + y, + NullWindow, VTMove); } static void @@ -290,8 +287,8 @@ handle_button(void *data, struct wl_input_device *input_device, int index; if (button == BTN_LEFT && state == 1 && d->alt) { - d->grab_x = d->focus_window->x - x; - d->grab_y = d->focus_window->y - y; + d->grab_x = d->focus_window->window->drawable.x - x; + d->grab_y = d->focus_window->window->drawable.y - y; d->grab = TRUE; return; } else if (button == BTN_LEFT && state == 0 && d->grab) { @@ -356,6 +353,8 @@ handle_keyboard_focus(void *data, struct wl_array *keys) { struct xwl_input_device *d = data; + struct xwl_window *window; + Window id; uint32_t *k, *end; end = (uint32_t *) ((char *) keys->data + keys->size); @@ -678,7 +677,8 @@ xwl_window_attach(struct xwl_window *window, PixmapPtr pPixmap) pPixmap->drawable.height, pPixmap->devKind, window->visual); wl_surface_map(window->surface, - window->x, window->y, + window->window->drawable.x, + window->window->drawable.y, pPixmap->drawable.width, pPixmap->drawable.height); wl_compositor_commit(context->compositor, context->ref_index); @@ -688,95 +688,113 @@ xwl_window_attach(struct xwl_window *window, PixmapPtr pPixmap) } static Bool -wayland_realize_window (WindowPtr pWin) +wayland_create_window(WindowPtr pWin) { ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); struct xwl_context *context = pI830->wayland_data; - Bool ret = TRUE; - PixmapPtr pPixmap; - struct xwl_window *priv; - - pScreen->RealizeWindow = context->RealizeWindow; + Selection *pSel; + char buffer[32]; + int len, rc; + Atom name; + Bool ret; + + pScreen->CreateWindow = context->CreateWindow; + ret = (*pScreen->CreateWindow)(pWin); + context->CreateWindow = pScreen->CreateWindow; + pScreen->CreateWindow = wayland_create_window; + + if (pWin->parent != NULL) + return ret; - if (!(*pScreen->RealizeWindow) (pWin)) - ret = FALSE; + len = snprintf(buffer, sizeof buffer, "_NET_WM_CM_S%d", pScreen->myNum); + ErrorF("selection name: %s (%d)\n", buffer, len); + name = MakeAtom(buffer, len, TRUE); + rc = AddSelection(&pSel, name, serverClient); + if (rc != Success) + return ret; - context->RealizeWindow = pScreen->RealizeWindow; - pScreen->RealizeWindow = wayland_realize_window; + pSel->lastTimeChanged = currentTime; + pSel->window = pWin->drawable.id; + pSel->pWin = pWin; + pSel->client = serverClient; - pPixmap = (*pScreen->GetWindowPixmap)(pWin); + CompositeRedirectSubwindows(pWin, CompositeRedirectManual); - if (!context->rootless) - return ret; - - /* Redirect child windows of root window. We're better off - * doing this at init time, but need to find the right time - * after the root window has been created. */ - if (pWin->parent == NULL) { - CompositeRedirectSubwindows(pWin, CompositeRedirectManual); - return ret; - } + return ret; +} - if (dixLookupPrivate(&pWin->devPrivates, wayland_window_private_key)) { - ErrorF("already realized window %p\n", pWin); - return ret; - } +static Bool +wayland_realize_window(WindowPtr pWin) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + I830Ptr pI830 = I830PTR(pScrn); + struct xwl_context *context = pI830->wayland_data; + struct xwl_window *window; + VisualID visual; + Bool ret; + int i; - /* FIXME: This doesn't deal with reparenting. Reparenting a - * toplevel window into another will have to destroy a wayland - * surface. */ + pScreen->RealizeWindow = context->RealizeWindow; + ret = (*pScreen->RealizeWindow)(pWin); + context->RealizeWindow = pScreen->RealizeWindow; + pScreen->RealizeWindow = wayland_realize_window; - if ((*pScreen->GetWindowPixmap)(pWin->parent) == pPixmap) + if (pWin->redirectDraw != RedirectDrawManual) return ret; - /* If not the root window, create a wayland surface using the - * backing pixmap. */ - - priv = malloc(sizeof *priv); - priv->context = context; - priv->surface = wl_compositor_create_surface(context->compositor); - if (priv->surface == NULL) { + window = malloc(sizeof *window); + window->context = context; + window->surface = wl_compositor_create_surface(context->compositor); + window->window = pWin; + if (window->surface == NULL) { ErrorF("wl_display_create_surface failed\n"); - return ret; + return FALSE; } - wl_surface_set_user_data(priv->surface, priv); - priv->window = pWin; - priv->visual = wl_display_get_rgb_visual(context->display); - priv->x = pWin->drawable.x; - priv->y = pWin->drawable.y; - /* FIXME: Set private in CreateWindow, probably. */ - dixSetPrivate(&pWin->devPrivates, wayland_window_private_key, priv); + visual = wVisual(pWin); + for (i = 0; i < pScreen->numVisuals; i++) + if (pScreen->visuals[i].vid == visual) + break; + + if (pScreen->visuals[i].nplanes == 32) + window->visual = wl_display_get_premultiplied_argb_visual(context->display); + else + window->visual = wl_display_get_rgb_visual(context->display); - xwl_window_attach(priv, pPixmap); + wl_surface_set_user_data(window->surface, window); + xwl_window_attach(window, (*pScreen->GetWindowPixmap)(pWin)); + + dixSetPrivate(&pWin->devPrivates, + wayland_window_private_key, window); return ret; } static Bool -wayland_unrealize_window (WindowPtr pWin) +wayland_unrealize_window(WindowPtr pWin) { ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); struct xwl_context *context = pI830->wayland_data; - struct xwl_window *priv; + struct xwl_window *window; Bool ret = TRUE; pScreen->UnrealizeWindow = context->UnrealizeWindow; - if (!(*pScreen->UnrealizeWindow)(pWin)) - ret = FALSE; - + ret = (*pScreen->UnrealizeWindow)(pWin); context->UnrealizeWindow = pScreen->UnrealizeWindow; pScreen->UnrealizeWindow = wayland_unrealize_window; - priv = dixLookupPrivate(&pWin->devPrivates, wayland_window_private_key); - if (priv) { - wl_surface_destroy(priv->surface); - free(priv); - dixSetPrivate(&pWin->devPrivates, wayland_window_private_key, NULL); + window = dixLookupPrivate(&pWin->devPrivates, + wayland_window_private_key); + if (window) { + wl_surface_destroy(window->surface); + free(window); + dixSetPrivate(&pWin->devPrivates, + wayland_window_private_key, NULL); } return ret; @@ -799,10 +817,9 @@ wayland_set_window_pixmap(WindowPtr pWin, PixmapPtr pPixmap) window = dixLookupPrivate(&pWin->devPrivates, wayland_window_private_key); - if (window == NULL) - return; - xwl_window_attach(window, pPixmap); + if (window) + xwl_window_attach(window, pPixmap); } static void @@ -825,12 +842,9 @@ wayland_move_window(WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind) if (window == NULL) return; - window->x = pWin->drawable.x; - window->y = pWin->drawable.y; - wl_surface_map(window->surface, - window->x, - window->y, + window->window->drawable.x, + window->window->drawable.y, window->window->drawable.width, window->window->drawable.height); wl_compositor_commit(context->compositor, 16); @@ -843,9 +857,12 @@ wayland_init_rootless(ScrnInfoPtr pScrn) I830Ptr pI830 = I830PTR(pScrn); struct xwl_context *context = pI830->wayland_data; + context->CreateWindow = pScreen->CreateWindow; + pScreen->CreateWindow = wayland_create_window; + context->RealizeWindow = pScreen->RealizeWindow; pScreen->RealizeWindow = wayland_realize_window; - + context->UnrealizeWindow = pScreen->UnrealizeWindow; pScreen->UnrealizeWindow = wayland_unrealize_window; |