xserver: Branch 'orib-soc-2006'

Ori Bernstein orib at kemper.freedesktop.org
Sat Jul 15 21:23:09 PDT 2006


 hw/xnest/Events.c   |  115 ++++++++++++++++++++++++++++-----------
 hw/xnest/Init.c     |  151 ++++++++++++++++++++++++++++------------------------
 hw/xnest/Window.c   |  123 +++++++++++++++++++++++++++++++++++++++---
 hw/xnest/XNWindow.h |    9 +++
 4 files changed, 290 insertions(+), 108 deletions(-)

New commits:
diff-tree a81adf16eff7163c1645e5b270ee038860105050 (from 912b65e4b818dadb09dc4ee1738066216c4b2e0b)
Author: Ori Bernstein <rand.chars at gmail.com>
Date:   Sun Jul 16 00:29:42 2006 -0500

    Added broken version of mirroring contents of backing server.
    VERY BROKEN. mainly so I'll have something to sync at DDC/OLS

diff --git a/hw/xnest/Events.c b/hw/xnest/Events.c
index 89e3f0e..cf6eebd 100644
--- a/hw/xnest/Events.c
+++ b/hw/xnest/Events.c
@@ -90,14 +90,22 @@ void xnestHandleEvent(XCBGenericEvent *e
     XCBExposeEvent          *xev;
     XCBResizeRequestEvent   *rev;
     XCBConfigureNotifyEvent *cev;
+    XCBButtonPressEvent     *bpe;
+    XCBButtonReleaseEvent   *bre;
+    XCBReparentNotifyEvent  *ev_reparent;
+    XCBCreateNotifyEvent    *ev_create;
+    XCBGetGeometryCookie gcook;
+    XCBGetGeometryRep   *grep;
+    CARD32 ev_mask;
     xEvent ev;
     ScreenPtr pScreen;
     WindowPtr pWin;
     WindowPtr pSib;
+    WindowPtr pParent;
     RegionRec Rgn;
     BoxRec Box;
     lastEventTime = GetTimeInMillis();
-
+    
     switch (e->response_type & ~0x80) {
         case XCBKeyPress:
             ErrorF("Key Pressed\n");
@@ -119,7 +127,8 @@ void xnestHandleEvent(XCBGenericEvent *e
 
         case XCBButtonPress:
             xnestUpdateModifierState(((XCBButtonPressEvent *)e)->state);
-            ((XCBButtonPressEvent *)e)->time.id = lastEventTime = GetTimeInMillis();
+            bpe = (XCBButtonPressEvent *)e;
+            bpe->time.id = lastEventTime = GetTimeInMillis();
             memcpy(&ev, e, sizeof(XCBGenericEvent));
             mieqEnqueue((xEventPtr) &ev);
             break;
@@ -140,8 +149,7 @@ void xnestHandleEvent(XCBGenericEvent *e
             mieqEnqueue(&x);
 #endif 
             pev = (XCBMotionNotifyEvent *)e;
-            miPointerAbsoluteCursor (pev->event_x, pev->event_y,
-                    lastEventTime = GetTimeInMillis());
+            miPointerAbsoluteCursor (pev->event_x, pev->event_y, lastEventTime = GetTimeInMillis());
             break;
 
         case XCBFocusIn:
@@ -179,8 +187,7 @@ void xnestHandleEvent(XCBGenericEvent *e
                     ErrorF("Entry Notify\n");
                     XCBTIMESTAMP t = { XCBCurrentTime };
                     XCBSetInputFocus(xnestConnection, RevertToNone, eev->child, t);
-                    miPointerAbsoluteCursor (eev->event_x, eev->event_y, 
-                            lastEventTime = GetTimeInMillis());
+                    miPointerAbsoluteCursor (eev->event_x, eev->event_y, lastEventTime = GetTimeInMillis());
                     xnestDirectInstallColormaps(pScreen);
                 }
             }
@@ -215,46 +222,90 @@ void xnestHandleEvent(XCBGenericEvent *e
                 miWindowExposures(pWin, &Rgn, NullRegion); 
             }
             break;
-        case XCBResizeRequest:
-            rev = (XCBResizeRequestEvent *)e;
-            pWin = xnestWindowPtr(rev->window);     
-            rev->window = xnestWindow(xnestWindowPtr(rev->window));
-            memcpy(&ev, rev, sizeof(XCBGenericEvent));            
-            if (pWin) {
-                DeliverEvents(pWin, &ev, 1, NULL);
-                //miSlideAndSizeWindow(pWin, pWin->drawable.x, pWin->drawable.y, rev->width, rev->height, NULL);
-            } 
-            break;
 
         case XCBConfigureNotify:
             cev = (XCBConfigureNotifyEvent *)e;
             pWin = xnestWindowPtr(cev->window);
-            cev->event = xnestWindow(xnestWindowPtr(cev->event));
-            cev->window = xnestWindow(xnestWindowPtr(cev->window));
-            pSib = xnestWindowPtr(cev->above_sibling);
-            if (pSib)
-                cev->above_sibling = xnestWindow(pSib);
-            memcpy(&ev, cev, sizeof(XCBGenericEvent));
-            if (pWin) {
+            if (xnestWindowPriv(pWin)->owner == XSCREEN_OWNED_XSCREEN) {
+                pScreen = pWin->drawable.pScreen;
+                pSib = xnestWindowPtr(cev->above_sibling);
+                cev->event = xnestWindow(xnestWindowPtr(cev->event));
+                cev->window = xnestWindow(xnestWindowPtr(cev->window));
+                if (pSib)
+                    cev->above_sibling = xnestWindow(pSib);
+                memcpy(&ev, cev, sizeof(XCBGenericEvent));
                 DeliverEvents(pWin, &ev, 1, NULL);
-                //miSlideAndSizeWindow(pWin, cev->x, cev->y, cev->width, cev->height, pSib);
+            }
+            pWin->origin.x = pWin->drawable.x + wBorderWidth(pWin) + cev->x;
+            pWin->origin.y = pWin->drawable.y + wBorderWidth(pWin) + cev->y;
+            pWin->drawable.height = cev->height;
+            pWin->drawable.width = cev->width;
+            ErrorF("drawable->x: %d, drawable->y: %d, origin->x: %d, origin->y: %d\n",
+                   pWin->drawable.x, pWin->drawable.y, pWin->origin.x, pWin->origin.y);
+                break;
+
+        case XCBReparentNotify:
+            /*Reparent windows. This is to track non-xscreen managed windows and their
+             * relationship to xscreen managed windows. It should be harmless to poke at 
+             * the relationships on xscreen managed windows too, I think.. or will it? FIXME and
+             * test.*/
+            ev_reparent = (XCBReparentNotifyEvent *)e;
+            pParent = xnestWindowPtr(ev_reparent->parent);
+            pWin = xnestWindowPtr(ev_reparent->window);
+            ReparentWindow(pWin, pParent, ev_reparent->x, ev_reparent->y, wClient(pWin));
+            break;
+
+        case XCBCreateNotify:
+            ev_create = (XCBCreateNotifyEvent *)e;
+            pParent = xnestWindowPtr(ev_create->parent);
+            /*make sure we didn't create this window. If we did, ignore it, we already track it*/
+            pWin = xnestWindowPtr(ev_create->window);
+            if (!pWin) {
+                gcook = XCBGetGeometry(xnestConnection, (XCBDRAWABLE)ev_create->window);
+
+                pWin = AllocateWindow(pScreen);
+
+                xnestWindowPriv(pWin)->window = ev_create->window;
+                xnestWindowPriv(pWin)->sibling_above = (XCBWINDOW){0};
+                xnestWindowPriv(pWin)->owner = XSCREEN_OWNED_BACKING;
+
+                pWin->parent = pParent;
+
+                grep = XCBGetGeometryReply(xnestConnection, gcook, NULL);
+                pWin->origin.x = grep->x;
+                pWin->origin.y = grep->y;
+                pWin->drawable.width = grep->width;
+                pWin->drawable.height = grep->height;
+                wClient(pWin) = serverClient;
+                pWin->drawable.id = FakeClientID(0);
+
+                pWin->firstChild = NULL;
+                pWin->lastChild = NULL;            
+                pWin->prevSib = NULL;
+                pWin->optional = NULL;
+                pWin->valdata = NULL;
+
+                REGION_NULL(pScreen, &pWin->winSize);
+                REGION_NULL(pScreen, &pWin->borderSize);
+                REGION_NULL(pScreen, &pWin->clipList);
+                REGION_NULL(pScreen, &pWin->borderClip);
+
+                /*set drawable relative to parent. FIXME: is this correct?*/
+                pWin->drawable.x = pWin->origin.x - pWin->parent->origin.x + wBorderWidth(pWin);
+                pWin->drawable.y = pWin->origin.y - pWin->parent->origin.y + wBorderWidth(pWin);
+                ev_mask = XCBEventMaskSubstructureNotify|XCBEventMaskStructureNotify;
+                XCBChangeWindowAttributes(xnestConnection, ev_create->window, XCBCWEventMask, &ev_mask);
             }
             break;
-            /*
-            pWin = xnestWindowPtr(cev->event);
-            pSib = xnestWindowPtr(cev->above_sibling);
-            if (pWin)
-            break;
-            */
+
         case XCBNoExposure:
         case XCBGraphicsExposure:
         case XCBCirculateNotify:
 
         case XCBGravityNotify:
         case XCBMapNotify:
-        case XCBReparentNotify:
         case XCBUnmapNotify:
-           // break;
+            // break;
 
         default:
             ErrorF("****xnest warning: unhandled event %d\n", e->response_type & ~0x80);
diff --git a/hw/xnest/Init.c b/hw/xnest/Init.c
index c217527..3a4cbd3 100644
--- a/hw/xnest/Init.c
+++ b/hw/xnest/Init.c
@@ -1,15 +1,15 @@
 /* $Xorg: Init.c,v 1.3 2000/08/17 19:53:28 cpqbld Exp $ */
 /*
 
-Copyright 1993 by Davor Matic
+   Copyright 1993 by Davor Matic
 
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.  Davor Matic makes no representations about
-the suitability of this software for any purpose.  It is provided "as
-is" without express or implied warranty.
+   Permission to use, copy, modify, distribute, and sell this software
+   and its documentation for any purpose is hereby granted without fee,
+   provided that the above copyright notice appear in all copies and that
+   both that copyright notice and this permission notice appear in
+   supporting documentation.  Davor Matic makes no representations about
+   the suitability of this software for any purpose.  It is provided "as
+   is" without express or implied warranty.
 
 */
 /* $XFree86: xc/programs/Xserver/hw/xnest/Init.c,v 3.24 2003/01/15 02:34:14 torrey Exp $ */
@@ -48,63 +48,80 @@ is" without express or implied warranty.
 
 Bool xnestDoFullGeneration = True;
 
-void
-InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
+
+void InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
 {
-  int i, j;
-  const XCBSetup *setup; 
+    int i, j;
+    const XCBSetup *setup; 
+
+    xnestOpenDisplay(argc, argv);
+    setup = XCBGetSetup(xnestConnection);
+
 
-  xnestOpenDisplay(argc, argv);
-  setup = XCBGetSetup(xnestConnection);
-  
-  screenInfo->imageByteOrder = setup->image_byte_order;
-  screenInfo->bitmapScanlineUnit = setup->bitmap_format_scanline_unit;
-  screenInfo->bitmapScanlinePad = setup->bitmap_format_scanline_pad;
-  screenInfo->bitmapBitOrder = setup->bitmap_format_bit_order;
-  
-  screenInfo->numPixmapFormats = 0;
-  for (i = 0; i < xnestNumPixmapFormats; i++) 
-    for (j = 0; j < xnestNumDepth; j++)
-      if ((xnestPixmapFormats[i].depth == 1) ||
-          (xnestPixmapFormats[i].depth == xnestDepths[j])) {
-        screenInfo->formats[screenInfo->numPixmapFormats].depth = 
-          xnestPixmapFormats[i].depth;
-        screenInfo->formats[screenInfo->numPixmapFormats].bitsPerPixel = 
-          xnestPixmapFormats[i].bits_per_pixel;
-        screenInfo->formats[screenInfo->numPixmapFormats].scanlinePad = 
-          xnestPixmapFormats[i].scanline_pad;
-        screenInfo->numPixmapFormats++;
-        break;
-      }
-  
-  xnestWindowPrivateIndex = AllocateWindowPrivateIndex();
-  xnestGCPrivateIndex = AllocateGCPrivateIndex();
-  xnestFontPrivateIndex = AllocateFontPrivateIndex();
-  
-  if (!xnestNumScreens) xnestNumScreens = 1;
-
-  for (i = 0; i < xnestNumScreens; i++)
-    AddScreen(xnestOpenScreen, argc, argv);
-
-  xnestNumScreens = screenInfo->numScreens;
-
-  xnestDoFullGeneration = xnestFullGeneration;
-}
-
-void
-InitInput(int argc, char *argv[])
-{
-  xnestPointerDevice = AddInputDevice(xnestPointerProc, TRUE);
-  xnestKeyboardDevice = AddInputDevice(xnestKeyboardProc, TRUE);
+    screenInfo->imageByteOrder = setup->image_byte_order;
+    screenInfo->bitmapScanlineUnit = setup->bitmap_format_scanline_unit;
+    screenInfo->bitmapScanlinePad = setup->bitmap_format_scanline_pad;
+    screenInfo->bitmapBitOrder = setup->bitmap_format_bit_order;
+
+    /**
+     * list the pixmap formats the backing server supports.
+     * FIXME: how do we get Xscreen to regenerate this properly?
+     * should this only connect to backing servers with compatible
+     * pixmap formats?
+     **/
+    screenInfo->numPixmapFormats = 0;
+    for (i = 0; i < xnestNumPixmapFormats; i++) {
+        for (j = 0; j < xnestNumDepth; j++) {
+            if ((xnestPixmapFormats[i].depth == 1) ||
+                    (xnestPixmapFormats[i].depth == xnestDepths[j])) {
+                screenInfo->formats[screenInfo->numPixmapFormats].depth = 
+                    xnestPixmapFormats[i].depth;
+                screenInfo->formats[screenInfo->numPixmapFormats].bitsPerPixel = 
+                    xnestPixmapFormats[i].bits_per_pixel;
+                screenInfo->formats[screenInfo->numPixmapFormats].scanlinePad = 
+                    xnestPixmapFormats[i].scanline_pad;
+                screenInfo->numPixmapFormats++;
+                break;
+            }
+        }
+    }
+
+    xnestWindowPrivateIndex = AllocateWindowPrivateIndex();
+    xnestGCPrivateIndex = AllocateGCPrivateIndex();
+    xnestFontPrivateIndex = AllocateFontPrivateIndex();
+
+    if (!xnestNumScreens) 
+        xnestNumScreens = 1;
+
+    for (i = 0; i < xnestNumScreens; i++)
+        AddScreen(xnestOpenScreen, argc, argv);
+
+    xnestNumScreens = screenInfo->numScreens;
+
+    xnestDoFullGeneration = xnestFullGeneration;
+
+    /**
+     * Add a tree representing the windows on the backing server, so that
+     * we can represent reparenting windows inside windows on other servers.
+     * don't need to create the root window's WindowPtr, this is handled
+     * when the DIX tells us to create the root window.
+     **/
+    //xscreenInitBackingWindows(xnestConnection, XCBSetupRootsIter(XCBGetSetup(xnestConnection)).data->root);
+}
+
+void InitInput(int argc, char *argv[])
+{
+    xnestPointerDevice = AddInputDevice(xnestPointerProc, TRUE);
+    xnestKeyboardDevice = AddInputDevice(xnestKeyboardProc, TRUE);
 
-  RegisterPointerDevice(xnestPointerDevice);
-  RegisterKeyboardDevice(xnestKeyboardDevice);
+    RegisterPointerDevice(xnestPointerDevice);
+    RegisterKeyboardDevice(xnestKeyboardDevice);
 
-  mieqInit((DevicePtr)xnestKeyboardDevice, (DevicePtr)xnestPointerDevice);
+    mieqInit((DevicePtr)xnestKeyboardDevice, (DevicePtr)xnestPointerDevice);
 
-  AddEnabledDevice(XCBGetFileDescriptor(xnestConnection));
+    AddEnabledDevice(XCBGetFileDescriptor(xnestConnection));
 
-  RegisterBlockAndWakeupHandlers(xnestBlockHandler, xnestWakeupHandler, NULL);
+    RegisterBlockAndWakeupHandlers(xnestBlockHandler, xnestWakeupHandler, NULL);
 }
 
 /*
@@ -112,18 +129,18 @@ InitInput(int argc, char *argv[])
  */
 void AbortDDX()
 {
-  xnestDoFullGeneration = True;
-  xnestCloseDisplay();
+    xnestDoFullGeneration = True;
+    xnestCloseDisplay();
 }
 
 /* Called by GiveUp(). */
 void ddxGiveUp()
 {
-  AbortDDX();
+    AbortDDX();
 }
 
 #ifdef __DARWIN__
-void
+    void
 DarwinHandleGUI(int argc, char *argv[])
 {
 }
@@ -131,15 +148,13 @@ DarwinHandleGUI(int argc, char *argv[])
 void GlxExtensionInit();
 void GlxWrapInitVisuals(void *procPtr);
 
-void
-DarwinGlxExtensionInit()
+void DarwinGlxExtensionInit()
 {
     GlxExtensionInit();
 }
 
-void
-DarwinGlxWrapInitVisuals(
-    void *procPtr)
+void DarwinGlxWrapInitVisuals(
+        void *procPtr)
 {
     GlxWrapInitVisuals(procPtr);
 }
diff --git a/hw/xnest/Window.c b/hw/xnest/Window.c
index 574ba8d..09c34dc 100644
--- a/hw/xnest/Window.c
+++ b/hw/xnest/Window.c
@@ -74,6 +74,106 @@ WindowPtr xnestWindowPtr(XCBWINDOW windo
     return wm.pWin;
 }
 
+/**
+ * Walk through all the windows on the backing server and
+ * add a representation of them to the Xscreen server, so that
+ * we can let Xscreen tell windows that they've been reparented,
+ * and other fun stuff.
+ **/
+static void xscreenInitBackingWindows(XCBConnection *c, WindowPtr pParent)
+{
+    int i;
+    XCBWINDOW *child;
+    XCBQueryTreeCookie   qcook;
+    XCBQueryTreeRep     *qrep;
+    XCBGetGeometryCookie gcook;
+    XCBGetGeometryRep   *grep;
+    XCBWINDOW            w = {0};
+    ScreenPtr pScreen;
+    WindowPtr pWin = NULL;
+    WindowPtr pPrev = NULL;
+    CARD32 ev_mask;
+
+
+    /*FIXME: THIS IS WRONG! How do I get the screen?
+     * No issue though, so far, since I only work with one screen.
+     * pScreen = xnestScreen(w);
+     */
+    w = xnestWindow(pParent);
+    pScreen = screenInfo.screens[0];
+    qcook = XCBQueryTree(c, w);
+    qrep = XCBQueryTreeReply(c, qcook, NULL);
+    child = XCBQueryTreeChildren(qrep);
+    /* Walk through the windows, initializing the privates.
+     * FIXME: initialize x, y, and pWin contents.. how? */
+    for (i=0; i < qrep->children_len; i++){
+        /*if we're not already tracking this one*/
+        pWin = xnestWindowPtr(child[i]);
+        if (!pWin) {
+            gcook = XCBGetGeometry(c, (XCBDRAWABLE)child[i]);
+
+            pWin = AllocateWindow(pScreen);
+
+            pWin->firstChild = NULL;
+            pWin->lastChild = NULL;            
+            pWin->prevSib = NULL;
+            pWin->optional = NULL;
+            pWin->valdata = NULL;            
+            pWin->parent = xnestWindowPtr(w);
+            wClient(pWin) = serverClient;
+            pWin->drawable.id = FakeClientID(0);
+
+            REGION_NULL(pScreen, &pWin->winSize);
+            REGION_NULL(pScreen, &pWin->borderSize);
+            REGION_NULL(pScreen, &pWin->clipList);
+            REGION_NULL(pScreen, &pWin->borderClip);
+
+            xnestWindowPriv(pWin)->window = child[i];
+            xnestWindowPriv(pWin)->parent = w;
+            xnestWindowPriv(pWin)->sibling_above = (i>0) ? child[i-1] : (XCBWINDOW){0};
+            xnestWindowPriv(pWin)->owner = XSCREEN_OWNED_BACKING;
+
+
+            grep = XCBGetGeometryReply(c, gcook, NULL);
+            pWin->origin.x = grep->x;
+            pWin->origin.y = grep->y;
+            pWin->drawable.width = grep->width;
+            pWin->drawable.height = grep->height;
+
+            if (pWin->parent) {
+                /*set drawable relative to parent. FIXME: is this correct?*/
+                pWin->drawable.x = pWin->origin.x - pWin->parent->origin.x + wBorderWidth(pWin);
+                pWin->drawable.y = pWin->origin.y - pWin->parent->origin.y + wBorderWidth(pWin);
+            } else {
+                /*root window*/
+                pWin->drawable.x = pWin->origin.x;
+                pWin->drawable.y = pWin->origin.y;
+            }
+            /*listen to events on the new window*/
+            ev_mask = XCBEventMaskSubstructureNotify|XCBEventMaskStructureNotify;
+            XCBChangeWindowAttributes(xnestConnection, child[i], XCBCWEventMask, &ev_mask);
+        }
+
+        /**
+         * append the window into the list. 
+         * NB: This reorders the WindowPtrs for windows we created in Xscreen.
+         * IS THIS RIGHT?!?
+         **/
+        if (!pParent->firstChild)
+            pParent->firstChild = pWin;
+        if (pPrev)
+            pPrev->nextSib = pWin;
+        pParent->lastChild = pWin;
+        pWin->prevSib = pPrev;
+        /*this is the last sibling in the list*/
+        pWin->nextSib = NULL;
+        pPrev = pWin;
+        /*and recurse, adding this window's children*/
+        xscreenInitBackingWindows(c, pWin);
+        /*FIXME: insert the window into the stack*/
+    }
+}
+
 Bool xnestCreateWindow(WindowPtr pWin)
 {
     unsigned long  mask;
@@ -88,6 +188,8 @@ Bool xnestCreateWindow(WindowPtr pWin)
     screen = XCBSetupRootsIter (XCBGetSetup (xnestConnection)).data;    
     if (xnestIsRoot(pWin)) {
         xnestWindowPriv(pWin)->window = screen->root;
+        /*now that we've created the root window, we can do the backing windows*/
+        xscreenInitBackingWindows(xnestConnection, pWin);
         return True;
     }
 
@@ -104,6 +206,9 @@ Bool xnestCreateWindow(WindowPtr pWin)
         param.backing_store = XCBBackingStoreNotUseful;
 
         if (pWin->parent) {
+            pWin->origin.x += pWin->parent->origin.x;
+            pWin->origin.y += pWin->parent->origin.y;
+
             if (pWin->optional && pWin->optional->visual != wVisual(pWin->parent)) {
                 vid.id = wVisual(pWin);
                 visual = xnestVisualFromID(pWin->drawable.pScreen, vid);
@@ -169,17 +274,19 @@ Bool xnestDestroyWindow(WindowPtr pWin)
     if (pWin->nextSib)
         xnestWindowPriv(pWin->nextSib)->sibling_above = 
             xnestWindowPriv(pWin)->sibling_above;
+    if (xnestWindowPriv(pWin)->owner == XSCREEN_OWNED_XSCREEN){
 #ifdef SHAPE
-    REGION_DESTROY(pWin->drawable.pScreen, 
-            xnestWindowPriv(pWin)->bounding_shape);
-    REGION_DESTROY(pWin->drawable.pScreen, 
-            xnestWindowPriv(pWin)->clip_shape);
+        REGION_DESTROY(pWin->drawable.pScreen, 
+                xnestWindowPriv(pWin)->bounding_shape);
+        REGION_DESTROY(pWin->drawable.pScreen, 
+                xnestWindowPriv(pWin)->clip_shape);
 #endif
-    XCBDestroyWindow(xnestConnection, xnestWindow(pWin));
-    xnestWindowPriv(pWin)->window.xid = None;
+        XCBDestroyWindow(xnestConnection, xnestWindow(pWin));
+        xnestWindowPriv(pWin)->window.xid = None;
 
-    if (pWin->optional && pWin->optional->colormap && pWin->parent)
-        xnestSetInstalledColormapWindows(pWin->drawable.pScreen);
+        if (pWin->optional && pWin->optional->colormap && pWin->parent)
+            xnestSetInstalledColormapWindows(pWin->drawable.pScreen);
+    }
 
     return True;
 }
diff --git a/hw/xnest/XNWindow.h b/hw/xnest/XNWindow.h
index d7adb20..46fd4f9 100644
--- a/hw/xnest/XNWindow.h
+++ b/hw/xnest/XNWindow.h
@@ -16,6 +16,10 @@ is" without express or implied warranty.
 
 #ifndef XNESTWINDOW_H
 #define XNESTWINDOW_H
+typedef enum  {
+    XSCREEN_OWNED_XSCREEN, /*Xscreen owns the window*/
+    XSCREEN_OWNED_BACKING,   /*The backing server owns the window*/
+} XscreenWindowOwner;
 
 typedef struct {
   XCBWINDOW window;
@@ -30,8 +34,13 @@ typedef struct {
   RegionPtr bounding_shape;
   RegionPtr clip_shape;
 #endif /* SHAPE */
+  /* is this a window from the backing server, or
+   * is it a window on Xscreen? true for window on
+   * backing server.*/
+  XscreenWindowOwner owner;
 } xnestPrivWin;
 
+
 typedef struct {
   WindowPtr pWin;
   XCBWINDOW window;



More information about the xorg-commit mailing list