summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2009-09-18 20:40:53 -0400
committerKristian Høgsberg <krh@redhat.com>2009-09-18 20:40:53 -0400
commit19919903ae471bdb3b2740179717f408a325921b (patch)
treea9d9fa50495c140ddc81b6ffbc0fe0da32f46c4a
parentd9d240c77911a1454afb0d474f99f949c54fe985 (diff)
Take CM selection, fixes and refactoring
-rw-r--r--src/i830_driver.c4
-rw-r--r--src/wayland.c167
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;