diff --git a/configure.ac b/configure.ac index 8f00e28ef..e47b60e4d 100644 --- a/configure.ac +++ b/configure.ac @@ -1679,7 +1679,7 @@ if test "x$XQUARTZ" = xyes; then CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DROOTLESS_SAFEALPHA -DNO_ALLOCA" - PKG_CHECK_MODULES(XPBPROXY, [applewmproto >= 1.2] [applewm >= 1.2] xfixes fixesproto x11) + PKG_CHECK_MODULES(XPBPROXY, [applewmproto >= 1.3] [applewm >= 1.3] xfixes fixesproto x11) if test "x$STANDALONE_XPBPROXY" = xyes ; then AC_DEFINE(STANDALONE_XPBPROXY,1,[Build a standalone xpbproxy]) diff --git a/hw/xquartz/applewm.c b/hw/xquartz/applewm.c index 418c5de74..ad3858372 100644 --- a/hw/xquartz/applewm.c +++ b/hw/xquartz/applewm.c @@ -511,6 +511,36 @@ ProcAppleWMSendPSN(register ClientPtr client) return (client->noClientException); } +static int +ProcAppleWMAttachTransient(register ClientPtr client) +{ + WindowPtr pWinChild, pWinParent; + REQUEST(xAppleWMAttachTransientReq); + int err; + + REQUEST_SIZE_MATCH(xAppleWMAttachTransientReq); + + if(!appleWMProcs->AttachTransient) + return BadRequest; + + if (Success != dixLookupWindow(&pWinChild, stuff->child, client, DixReadAccess)) + return BadValue; + + if(stuff->parent) { + if(Success != dixLookupWindow(&pWinParent, stuff->parent, client, DixReadAccess)) + return BadValue; + } else { + pWinParent = NULL; + } + + err = appleWMProcs->AttachTransient(pWinChild, pWinParent); + if (err != Success) { + return err; + } + + return (client->noClientException); +} + static int ProcAppleWMSetCanQuit( register ClientPtr client @@ -673,6 +703,8 @@ ProcAppleWMDispatch ( return ProcAppleWMFrameDraw(client); case X_AppleWMSendPSN: return ProcAppleWMSendPSN(client); + case X_AppleWMAttachTransient: + return ProcAppleWMAttachTransient(client); default: return BadRequest; } diff --git a/hw/xquartz/applewmExt.h b/hw/xquartz/applewmExt.h index 3fc376639..5ef8b5496 100644 --- a/hw/xquartz/applewmExt.h +++ b/hw/xquartz/applewmExt.h @@ -46,6 +46,7 @@ typedef int (*FrameDrawProc)(WindowPtr pWin, int class, unsigned int attr, unsigned int title_len, const unsigned char *title_bytes); typedef int (*SendPSNProc)(uint32_t hi, uint32_t lo); +typedef int (*AttachTransientProc)(WindowPtr pWinChild, WindowPtr pWinParent); /* * AppleWM implementation function list @@ -58,6 +59,7 @@ typedef struct _AppleWMProcs { FrameHitTestProc FrameHitTest; FrameDrawProc FrameDraw; SendPSNProc SendPSN; + AttachTransientProc AttachTransient; } AppleWMProcsRec, *AppleWMProcsPtr; void AppleWMExtensionInit( diff --git a/hw/xquartz/xpr/xprAppleWM.c b/hw/xquartz/xpr/xprAppleWM.c index 9c44e20a2..0a2571975 100644 --- a/hw/xquartz/xpr/xprAppleWM.c +++ b/hw/xquartz/xpr/xprAppleWM.c @@ -82,6 +82,34 @@ static int xprSetWindowLevel( return Success; } +#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3 +static int xprAttachTransient(WindowPtr pWinChild, WindowPtr pWinParent) { + xp_window_id child_wid, parent_wid; + xp_window_changes wc; + + child_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinChild, TRUE)); + if (child_wid == 0) + return BadWindow; + + if(pWinParent) { + parent_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinParent, TRUE)); + if (parent_wid == 0) + return BadWindow; + } else { + parent_wid = 0; + } + + wc.transient_for = parent_wid; + + RootlessStopDrawing (pWinChild, FALSE); + + if (xp_configure_window(child_wid, XP_ATTACH_TRANSIENT, &wc) != Success) { + return BadValue; + } + + return Success; +} +#endif static int xprFrameDraw( WindowPtr pWin, @@ -114,9 +142,14 @@ static AppleWMProcsRec xprAppleWMProcs = { xp_frame_get_rect, xp_frame_hit_test, xprFrameDraw, -#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 2 - xp_set_dock_proxy +#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3 + xp_set_dock_proxy, + xprAttachTransient +#elif defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 2 + xp_set_dock_proxy, + NULL #else + NULL, NULL #endif };