[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