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

Jon TURNEY jon.turney at dronecode.org.uk
Fri Oct 9 11:13:25 PDT 2009


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>
---
 hw/xquartz/xpr/xprFrame.c       |   40 +++++++++++++++++++++++++++++++
 hw/xwin/winscrinit.c            |    6 +++-
 miext/rootless/rootless.h       |    9 +++++++
 miext/rootless/rootlessWindow.c |   50 ++++++++------------------------------
 miext/rootless/rootlessWindow.h |    2 +
 5 files changed, 66 insertions(+), 41 deletions(-)

diff --git a/hw/xquartz/xpr/xprFrame.c b/hw/xquartz/xpr/xprFrame.c
index a3e2076..48656e9 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);
 
@@ -447,6 +449,8 @@ static RootlessFrameProcsRec xprRootlessProcs = {
     xprDamageRects,
     xprSwitchWindow,
     xprDoReorderWindow,
+    xprHideWindow,
+    xprUpdateColormap,
     xp_copy_bytes,
     xp_fill_bytes,
     xp_composite_pixels,
@@ -593,3 +597,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 = RootlessColormapCallback;
+  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/rootlessWindow.c b/miext/rootless/rootlessWindow.c
index d43301f..1b0ef1c 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;                             \
@@ -78,31 +76,10 @@ 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;
-
-  return t;
-  } */
-
+#ifdef __APPLE__
 void
 RootlessNativeWindowStateChanged (WindowPtr pWin, unsigned int state)
 {
@@ -172,6 +149,7 @@ set_screen_origin (WindowPtr pWin)
   dixChangeWindowProperty(serverClient, pWin, xa_native_screen_origin(),
 			  XA_INTEGER, 32, PropModeReplace, 2, data, TRUE);
 }
+#endif /* __APPLE__ */
 
 /*
  * RootlessCreateWindow
@@ -441,7 +419,7 @@ RootlessInitializeFrame(WindowPtr pWin, RootlessWindowRec *winRec)
 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);
+    return RootlessResolveColormap (data, first_color, n_colors, colors);
 }
 
 /*
@@ -1482,19 +1460,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 +1591,6 @@ RootlessHideAllWindows (void)
     ScreenPtr pScreen;
     WindowPtr pWin;
     RootlessWindowRec *winRec;
-    xp_window_changes wc;
     
     if (windows_hidden)
         return;
@@ -1641,9 +1614,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
-- 
1.6.4.2



More information about the xorg-devel mailing list