diff options
-rw-r--r-- | hw/xquartz/xpr/xprFrame.c | 47 | ||||
-rw-r--r-- | hw/xwin/winscrinit.c | 6 | ||||
-rw-r--r-- | miext/rootless/rootless.h | 9 | ||||
-rw-r--r-- | miext/rootless/rootlessCommon.c | 3 | ||||
-rw-r--r-- | miext/rootless/rootlessCommon.h | 4 | ||||
-rw-r--r-- | miext/rootless/rootlessWindow.c | 76 | ||||
-rw-r--r-- | miext/rootless/rootlessWindow.h | 2 |
7 files changed, 76 insertions, 71 deletions
diff --git a/hw/xquartz/xpr/xprFrame.c b/hw/xquartz/xpr/xprFrame.c index a3e207616..53dde7acc 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 eab0c6ccf..99d5a464e 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 bde4cff52..00eac4e8a 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 e3dd9d97c..39a3eed0f 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 ba121c0f4..d4a94f8ca 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 d43301fc1..53209565d 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 2d2555ea5..ca104a4d7 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 |