XQuartz: ProcAppleWMAttachTransient to play nice with the new Dock in SL

(cherry picked from commit ddc0242d8f)
This commit is contained in:
Jeremy Huddleston 2009-07-03 19:25:33 -07:00
parent a49ae50370
commit d6b8205e69
4 changed files with 70 additions and 3 deletions

View File

@ -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])

View File

@ -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;
}

View File

@ -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(

View File

@ -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
};