[PATCH] Rootless: Abstract some of the Xplugin specific stuff which has crept into rootlessWindow.c

Jeremy Huddleston jeremyhu at freedesktop.org
Tue Oct 13 12:27:35 PDT 2009


On Oct 9, 2009, at 11:13, Jon TURNEY wrote:

> The rootless extension now directly calls some Xplugin functions,  
> and relies
> on types defined in Xplugin.h, which isn't very abstracted :-)
>
> This patch is a start at abstracting some of the Xplugin specific  
> stuff which
> has crept into rootlessWindow.c.  This has been done in a pretty  
> mindless fashion,
> without much thought as to if the additions to the generic rootless  
> interface are
> the correct ones
>
> There is some confusion as to if RootlesscolormapCallback() returns  
> a Bool or
> xp_error_enum value (not so abstact), but I have no way of checking,  
> of finding
> out if Xplugin actually checks the result :-)
>
> Based on patches from Colin Harrison, Jon Turney and Yaakov Selkowitz
>
> Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

I've merged your two patches and edited it a bit to fix some  
compilation warnings and errors.  Please give it a review/test on your  
end.

Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>

diff --git a/hw/xquartz/xpr/xprFrame.c b/hw/xquartz/xpr/xprFrame.c
index a3e2076..53dde7a 100644
--- a/hw/xquartz/xpr/xprFrame.c
+++ b/hw/xquartz/xpr/xprFrame.c
@@ -83,6 +83,8 @@ static void xprDamageRects(RootlessFrameID wid, int  
nrects, const BoxRec *rects,
                 int shift_x, int shift_y);
  static void xprSwitchWindow(RootlessWindowPtr pFrame, WindowPtr  
oldWin);
  static Bool xprDoReorderWindow(RootlessWindowPtr pFrame);
+static void xprHideWindow(RootlessFrameID wid);
+static void xprUpdateColormap(RootlessFrameID wid, ScreenPtr pScreen);
  static void xprCopyWindow(RootlessFrameID wid, int dstNrects, const  
BoxRec *dstRects,
                int dx, int dy);

@@ -117,6 +119,11 @@ xprSetNativeProperty(RootlessWindowPtr pFrame)
      }
  }

+static xp_error
+xprColormapCallback(void *data, int first_color, int n_colors,  
uint32_t *colors)
+{
+    return (RootlessResolveColormap (data, first_color, n_colors,  
colors) ? XP_Success : XP_BadMatch);
+}

  /*
   * Create and display a new frame.
@@ -142,7 +149,7 @@ xprCreateFrame(RootlessWindowPtr pFrame, ScreenPtr  
pScreen,
      if (pWin->drawable.depth == 8)
      {
          wc.depth = XP_DEPTH_INDEX8;
-        wc.colormap = RootlessColormapCallback;
+        wc.colormap = xprColormapCallback;
          wc.colormap_data = pScreen;
          mask |= XP_COLORMAP;
      }
@@ -447,6 +454,8 @@ static RootlessFrameProcsRec xprRootlessProcs = {
      xprDamageRects,
      xprSwitchWindow,
      xprDoReorderWindow,
+    xprHideWindow,
+    xprUpdateColormap,
      xp_copy_bytes,
      xp_fill_bytes,
      xp_composite_pixels,
@@ -593,3 +602,39 @@ xprHideWindows(Bool hide)
          }
      }
  }
+
+// XXX: identical to x_cvt_vptr_to_uint ?
+#define MAKE_WINDOW_ID(x)		((xp_window_id)((size_t)(x)))
+
+Bool no_configure_window;
+
+static inline int
+configure_window (xp_window_id id, unsigned int mask,
+                  const xp_window_changes *values)
+{
+  if (!no_configure_window)
+    return xp_configure_window (id, mask, values);
+  else
+    return XP_Success;
+}
+
+
+static
+void xprUpdateColormap(RootlessFrameID wid, ScreenPtr pScreen)
+{
+  /* This is how we tell xp that the colormap may have changed. */
+  xp_window_changes wc;
+  wc.colormap = xprColormapCallback;
+  wc.colormap_data = pScreen;
+
+  configure_window(MAKE_WINDOW_ID(wid), XP_COLORMAP, &wc);
+}
+
+static
+void xprHideWindow(RootlessFrameID wid)
+{
+  xp_window_changes wc;
+  wc.stack_mode = XP_UNMAPPED;
+  wc.sibling = 0;
+  configure_window(MAKE_WINDOW_ID(wid), XP_STACKING, &wc);
+}
diff --git a/hw/xwin/winscrinit.c b/hw/xwin/winscrinit.c
index eab0c6c..99d5a46 100644
--- a/hw/xwin/winscrinit.c
+++ b/hw/xwin/winscrinit.c
@@ -58,8 +58,10 @@ winMWExtWMProcs = {
    winMWExtWMDamageRects,
  #endif
    winMWExtWMRootlessSwitchWindow,
-  NULL,//winWMExtWMDoReorderWindow,
-
+  NULL,//winMWExtWMDoReorderWindow,
+  NULL,//winMWExtWMHideWindow,
+  NULL,//winMWExtWMUpdateColorMap,
+
    NULL,//winMWExtWMCopyBytes,
    NULL,//winMWExtWMFillBytes,
    NULL,//winMWExtWMCompositePixels,
diff --git a/miext/rootless/rootless.h b/miext/rootless/rootless.h
index bde4cff..00eac4e 100644
--- a/miext/rootless/rootless.h
+++ b/miext/rootless/rootless.h
@@ -351,6 +351,13 @@ typedef void (*RootlessCopyWindowProc)
      (RootlessFrameID wid, int dstNrects, const BoxRec *dstRects,
       int dx, int dy);

+
+typedef void (*RootlessHideWindowProc)
+     (RootlessFrameID wid);
+
+typedef void (*RootlessUpdateColormapProc)
+     (RootlessFrameID wid, ScreenPtr pScreen);
+
  /*
   * Rootless implementation function list
   */
@@ -374,6 +381,8 @@ typedef struct _RootlessFrameProcs {
      /* Optional frame functions */
      RootlessSwitchWindowProc SwitchWindow;
      RootlessDoReorderWindowProc DoReorderWindow;
+    RootlessHideWindowProc HideWindow;
+    RootlessUpdateColormapProc UpdateColormap;

      /* Optional acceleration functions */
      RootlessCopyBytesProc CopyBytes;
diff --git a/miext/rootless/rootlessCommon.c b/miext/rootless/ 
rootlessCommon.c
index e3dd9d9..39a3eed 100644
--- a/miext/rootless/rootlessCommon.c
+++ b/miext/rootless/rootlessCommon.c
@@ -146,6 +146,7 @@ void RootlessStartDrawing(WindowPtr pWindow)
      ScreenPtr pScreen = pWindow->drawable.pScreen;
      WindowPtr top = TopLevelParent(pWindow);
      RootlessWindowRec *winRec;
+    PixmapPtr curPixmap;

      if (top == NULL)
          return;
@@ -172,7 +173,7 @@ void RootlessStartDrawing(WindowPtr pWindow)
          winRec->is_drawing = TRUE;
      }

-    PixmapPtr curPixmap = pScreen->GetWindowPixmap(pWindow);
+    curPixmap = pScreen->GetWindowPixmap(pWindow);
      if (curPixmap == winRec->pixmap)
      {
          RL_DEBUG_MSG("Window %p already has winRec->pixmap %p; not  
pushing\n", pWindow, winRec->pixmap);
diff --git a/miext/rootless/rootlessCommon.h b/miext/rootless/ 
rootlessCommon.h
index ba121c0..d4a94f8 100644
--- a/miext/rootless/rootlessCommon.h
+++ b/miext/rootless/rootlessCommon.h
@@ -268,9 +268,6 @@ Bool RootlessResolveColormap (ScreenPtr pScreen,  
int first_color,
  void RootlessFlushWindowColormap (WindowPtr pWin);
  void RootlessFlushScreenColormaps (ScreenPtr pScreen);

-// xp_error
-int RootlessColormapCallback(void *data, int first_color, int  
n_colors, uint32_t *colors);
-
  // Move a window to its proper location on the screen.
  void RootlessRepositionWindow(WindowPtr pWin);

@@ -285,5 +282,6 @@ void RootlessUpdateRooted (Bool state);
  void RootlessEnableRoot (ScreenPtr pScreen);
  void RootlessDisableRoot (ScreenPtr pScreen);

+void RootlessSetPixmapOfAncestors(WindowPtr pWin);

  #endif /* _ROOTLESSCOMMON_H */
diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/ 
rootlessWindow.c
index d43301f..5320956 100644
--- a/miext/rootless/rootlessWindow.c
+++ b/miext/rootless/rootlessWindow.c
@@ -36,15 +36,15 @@
  #include <stddef.h> /* For NULL */
  #include <limits.h> /* For CHAR_BIT */
  #include <assert.h>
-#ifdef __APPLE__
-//#include <X11/Xlib.h>
  #include <X11/Xatom.h>
+#ifdef __APPLE__
+#include <Xplugin.h>
  #include "mi.h"
  #include "pixmapstr.h"
  #include "windowstr.h"
-#include <Xplugin.h>
  //#include <X11/extensions/applewm.h>
  extern int darwinMainScreenX, darwinMainScreenY;
+extern Bool no_configure_window;
  #endif
  #include "fb.h"

@@ -61,8 +61,6 @@ extern int darwinMainScreenX, darwinMainScreenY;
  #define SCREEN_TO_GLOBAL_Y 0
  #endif

-#define MAKE_WINDOW_ID(x)		((xp_window_id)((size_t)(x)))
-
  #define DEFINE_ATOM_HELPER(func,atom_name)                      \
    static Atom func (void) {                                       \
      static unsigned int generation = 0;                             \
@@ -74,34 +72,15 @@ extern int darwinMainScreenX, darwinMainScreenY;
      return atom;                                                \
    }

-DEFINE_ATOM_HELPER (xa_native_screen_origin, "_NATIVE_SCREEN_ORIGIN")
  DEFINE_ATOM_HELPER (xa_native_window_id, "_NATIVE_WINDOW_ID")
-DEFINE_ATOM_HELPER (xa_apple_no_order_in, "_APPLE_NO_ORDER_IN")

-static Bool no_configure_window;
  static Bool windows_hidden;
  // TODO - abstract xp functions

-static inline int
-configure_window (xp_window_id id, unsigned int mask,
-                  const xp_window_changes *values)
-{
-  if (!no_configure_window)
-    return xp_configure_window (id, mask, values);
-  else
-    return XP_Success;
-}
-
-/*static inline unsigned long
-current_time_in_seconds (void)
-{
-  unsigned long t = 0;
-
-  t += currentTime.milliseconds / 1000;
-  t += currentTime.months * 4294967;
+#ifdef __APPLE__

-  return t;
-  } */
+// XXX: identical to x_cvt_vptr_to_uint ?
+#define MAKE_WINDOW_ID(x)		((xp_window_id)((size_t)(x)))

  void
  RootlessNativeWindowStateChanged (WindowPtr pWin, unsigned int state)
@@ -153,25 +132,7 @@ void RootlessNativeWindowMoved (WindowPtr pWin) {
      no_configure_window = FALSE;
  }

-/* Updates the _NATIVE_SCREEN_ORIGIN property on the given root  
window. */
-static void
-set_screen_origin (WindowPtr pWin)
-{
-  long data[2];
-
-  if (!IsRoot (pWin))
-    return;
-
-  /* FIXME: move this to an extension? */
-
-  data[0] = (dixScreenOrigins[pWin->drawable.pScreen->myNum].x
-	     + darwinMainScreenX);
-  data[1] = (dixScreenOrigins[pWin->drawable.pScreen->myNum].y
-	     + darwinMainScreenY);
-
-  dixChangeWindowProperty(serverClient, pWin,  
xa_native_screen_origin(),
-			  XA_INTEGER, 32, PropModeReplace, 2, data, TRUE);
-}
+#endif /* __APPLE__ */

  /*
   * RootlessCreateWindow
@@ -437,13 +398,6 @@ RootlessInitializeFrame(WindowPtr pWin,  
RootlessWindowRec *winRec)
  #endif
  }

-
-Bool
-RootlessColormapCallback (void *data, int first_color, int n_colors,  
uint32_t *colors)
-{
-    return (RootlessResolveColormap (data, first_color, n_colors,  
colors) ? XP_Success : XP_BadMatch);
-}
-
  /*
   * RootlessEnsureFrame
   *  Make sure the given window is framed. If the window doesn't have a
@@ -1482,19 +1436,15 @@ void
  RootlessFlushWindowColormap (WindowPtr pWin)
  {
    RootlessWindowRec *winRec = WINREC (pWin);
-  xp_window_changes wc;
+  ScreenPtr pScreen = pWin->drawable.pScreen;

    if (winRec == NULL)
      return;

    RootlessStopDrawing (pWin, FALSE);

-  /* This is how we tell xp that the colormap may have changed. */
-
-  wc.colormap = RootlessColormapCallback;
-  wc.colormap_data = pWin->drawable.pScreen;
-
-  configure_window (MAKE_WINDOW_ID(winRec->wid), XP_COLORMAP, &wc);
+  if (SCREENREC(pScreen)->imp->UpdateColormap)
+    SCREENREC(pScreen)->imp->UpdateColormap(winRec->wid, pScreen);
  }

  /*
@@ -1617,7 +1567,6 @@ RootlessHideAllWindows (void)
      ScreenPtr pScreen;
      WindowPtr pWin;
      RootlessWindowRec *winRec;
-    xp_window_changes wc;

      if (windows_hidden)
          return;
@@ -1641,9 +1590,8 @@ RootlessHideAllWindows (void)
              winRec = WINREC (pWin);
              if (winRec != NULL)
              {
-                wc.stack_mode = XP_UNMAPPED;
-                wc.sibling = 0;
-                configure_window (MAKE_WINDOW_ID(winRec->wid),  
XP_STACKING, &wc);
+              if (SCREENREC(pScreen)->imp->HideWindow)
+                SCREENREC(pScreen)->imp->HideWindow(winRec->wid);
              }
          }
      }
diff --git a/miext/rootless/rootlessWindow.h b/miext/rootless/ 
rootlessWindow.h
index 2d2555e..ca104a4 100644
--- a/miext/rootless/rootlessWindow.h
+++ b/miext/rootless/rootlessWindow.h
@@ -52,7 +52,9 @@ void RootlessResizeWindow(WindowPtr pWin, int x, int  
y,
  			  unsigned int w, unsigned int h, WindowPtr pSib);
  void RootlessReparentWindow(WindowPtr pWin, WindowPtr pPriorParent);
  void RootlessChangeBorderWidth(WindowPtr pWin, unsigned int width);
+#ifdef __APPLE__
  void RootlessNativeWindowMoved (WindowPtr pWin);
  void RootlessNativeWindowStateChanged (WindowPtr pWin, unsigned int  
state);
+#endif

  #endif


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3333 bytes
Desc: not available
Url : http://lists.x.org/archives/xorg-devel/attachments/20091013/f44abdfc/attachment.bin 


More information about the xorg-devel mailing list