diff options
Diffstat (limited to 'hw/xquartz/applewm.c')
-rw-r--r-- | hw/xquartz/applewm.c | 333 |
1 files changed, 168 insertions, 165 deletions
diff --git a/hw/xquartz/applewm.c b/hw/xquartz/applewm.c index 55976c454..bc2c3b9f6 100644 --- a/hw/xquartz/applewm.c +++ b/hw/xquartz/applewm.c @@ -1,29 +1,32 @@ -/************************************************************************** - -Copyright (c) 2002-2007 Apple Inc. All Rights Reserved. -Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sub license, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice (including the -next paragraph) shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -**************************************************************************/ +/* + * Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved. + * Copyright (c) 2002-2012 Apple Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above + * copyright holders shall not be used in advertising or otherwise to + * promote the sale, use or other dealings in this Software without + * prior written authorization. + */ #include "sanitizedCarbon.h" @@ -106,36 +109,36 @@ make_box (int x, int y, int w, int h) /* Updates the _NATIVE_SCREEN_ORIGIN property on the given root window. */ void AppleWMSetScreenOrigin( - WindowPtr pWin -) + WindowPtr pWin + ) { int32_t data[2]; - + data[0] = pWin->drawable.pScreen->x + darwinMainScreenX; data[1] = pWin->drawable.pScreen->y + darwinMainScreenY; - + dixChangeWindowProperty(serverClient, pWin, xa_native_screen_origin(), - XA_INTEGER, 32, PropModeReplace, 2, data, TRUE); + XA_INTEGER, 32, PropModeReplace, 2, data, TRUE); } /* Window managers can set the _APPLE_NO_ORDER_IN property on windows - that are being genie-restored from the Dock. We want them to - be mapped but remain ordered-out until the animation - completes (when the Dock will order them in). */ + that are being genie-restored from the Dock. We want them to + be mapped but remain ordered-out until the animation + completes (when the Dock will order them in). */ Bool AppleWMDoReorderWindow( - WindowPtr pWin -) + WindowPtr pWin + ) { Atom atom; PropertyPtr prop; int rc; - + atom = xa_apple_no_order_in(); rc = dixLookupProperty(&prop, pWin, atom, serverClient, DixReadAccess); if(Success == rc && prop->type == atom) - return 0; + return 0; return 1; } @@ -143,11 +146,11 @@ AppleWMDoReorderWindow( static int ProcAppleWMQueryVersion( - register ClientPtr client -) + register ClientPtr client + ) { xAppleWMQueryVersionReply rep; - + REQUEST_SIZE_MATCH(xAppleWMQueryVersionReq); rep.type = X_Reply; rep.length = 0; @@ -163,14 +166,14 @@ ProcAppleWMQueryVersion( return Success; } - + /* events */ static inline void updateEventMask (WMEventPtr *pHead) { WMEventPtr pCur; - + eventMask = 0; for (pCur = *pHead; pCur != NULL; pCur = pCur->next) eventMask |= pCur->mask; @@ -182,7 +185,7 @@ WMFreeClient (pointer data, XID id) { WMEventPtr pEvent; WMEventPtr *pHead, pCur, pPrev; int i; - + pEvent = (WMEventPtr) data; i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, serverClient, DixReadAccess | DixWriteAccess | DixDestroyAccess); if (i == Success && pHead) { @@ -205,7 +208,7 @@ WMFreeClient (pointer data, XID id) { static int WMFreeEvents (pointer data, XID id) { WMEventPtr *pHead, pCur, pNext; - + pHead = (WMEventPtr *) data; for (pCur = *pHead; pCur; pCur = pNext) { pNext = pCur->next; @@ -224,7 +227,7 @@ ProcAppleWMSelectInput (register ClientPtr client) WMEventPtr pEvent, pNewEvent, *pHead; XID clientResource; int i; - + REQUEST_SIZE_MATCH (xAppleWMSelectInputReq); i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, client, DixWriteAccess); if (stuff->mask != 0) { @@ -240,7 +243,7 @@ ProcAppleWMSelectInput (register ClientPtr client) } } } - + /* build the entry */ pNewEvent = (WMEventPtr) malloc(sizeof (WMEventRec)); if (!pNewEvent) @@ -311,7 +314,7 @@ AppleWMSendEvent (int type, unsigned int mask, int which, int arg) { WMEventPtr *pHead, pEvent; xAppleWMNotifyEvent se; int i; - + i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, serverClient, DixReadAccess); if (i != Success || !pHead) return; @@ -333,60 +336,60 @@ AppleWMSelectedEvents (void) return eventMask; } - + /* general utility functions */ static int ProcAppleWMDisableUpdate( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST_SIZE_MATCH(xAppleWMDisableUpdateReq); - + appleWMProcs->DisableUpdate(); - + return Success; } static int ProcAppleWMReenableUpdate( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST_SIZE_MATCH(xAppleWMReenableUpdateReq); - + appleWMProcs->EnableUpdate(); - + return Success; } - + /* window functions */ static int ProcAppleWMSetWindowMenu( - register ClientPtr client -) + register ClientPtr client + ) { const char *bytes, **items; char *shortcuts; int max_len, nitems, i, j; REQUEST(xAppleWMSetWindowMenuReq); - + REQUEST_AT_LEAST_SIZE(xAppleWMSetWindowMenuReq); - + nitems = stuff->nitems; items = malloc(sizeof (char *) * nitems); shortcuts = malloc(sizeof (char) * nitems); - + max_len = (stuff->length << 2) - sizeof(xAppleWMSetWindowMenuReq); bytes = (char *) &stuff[1]; - + for (i = j = 0; i < max_len && j < nitems;) { shortcuts[j] = bytes[i++]; items[j++] = bytes + i; - + while (i < max_len) { if (bytes[i++] == 0) @@ -396,17 +399,17 @@ ProcAppleWMSetWindowMenu( X11ApplicationSetWindowMenu (nitems, items, shortcuts); free(items); free(shortcuts); - + return Success; } static int ProcAppleWMSetWindowMenuCheck( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST(xAppleWMSetWindowMenuCheckReq); - + REQUEST_SIZE_MATCH(xAppleWMSetWindowMenuCheckReq); X11ApplicationSetWindowMenuCheck(stuff->index); return Success; @@ -414,11 +417,11 @@ ProcAppleWMSetWindowMenuCheck( static int ProcAppleWMSetFrontProcess( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST_SIZE_MATCH(xAppleWMSetFrontProcessReq); - + X11ApplicationSetFrontProcess(); return Success; } @@ -429,22 +432,22 @@ ProcAppleWMSetWindowLevel(register ClientPtr client) REQUEST(xAppleWMSetWindowLevelReq); WindowPtr pWin; int err; - + REQUEST_SIZE_MATCH(xAppleWMSetWindowLevelReq); - + if (Success != dixLookupWindow(&pWin, stuff->window, client, - DixReadAccess)) + DixReadAccess)) return BadValue; - + if (stuff->level >= AppleWMNumWindowLevels) { return BadValue; } - - err = appleWMProcs->SetWindowLevel(pWin, stuff->level); - if (err != Success) { + + err = appleWMProcs->SetWindowLevel(pWin, stuff->level); + if (err != Success) { return err; } - + return Success; } @@ -458,12 +461,12 @@ ProcAppleWMSendPSN(register ClientPtr client) if(!appleWMProcs->SendPSN) return BadRequest; - + err = appleWMProcs->SendPSN(stuff->psn_hi, stuff->psn_lo); if (err != Success) { return err; } - + return Success; } @@ -478,191 +481,191 @@ ProcAppleWMAttachTransient(register ClientPtr client) 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 Success; } static int ProcAppleWMSetCanQuit( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST(xAppleWMSetCanQuitReq); - + REQUEST_SIZE_MATCH(xAppleWMSetCanQuitReq); - + X11ApplicationSetCanQuit(stuff->state); return Success; } - + /* frame functions */ static int ProcAppleWMFrameGetRect( - register ClientPtr client -) + register ClientPtr client + ) { xAppleWMFrameGetRectReply rep; BoxRec ir, or, rr; REQUEST(xAppleWMFrameGetRectReq); - + REQUEST_SIZE_MATCH(xAppleWMFrameGetRectReq); rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; - + ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih); or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh); - + if (appleWMProcs->FrameGetRect(stuff->frame_rect, stuff->frame_class, &or, &ir, &rr) != Success) { return BadValue; } - + rep.x = rr.x1; rep.y = rr.y1; rep.w = rr.x2 - rr.x1; rep.h = rr.y2 - rr.y1; - + WriteToClient(client, sizeof(xAppleWMFrameGetRectReply), (char *)&rep); return Success; } static int ProcAppleWMFrameHitTest( - register ClientPtr client -) + register ClientPtr client + ) { xAppleWMFrameHitTestReply rep; BoxRec ir, or; int ret; REQUEST(xAppleWMFrameHitTestReq); - + REQUEST_SIZE_MATCH(xAppleWMFrameHitTestReq); rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; - + ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih); or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh); - + if (appleWMProcs->FrameHitTest(stuff->frame_class, stuff->px, stuff->py, &or, &ir, &ret) != Success) { return BadValue; } - + rep.ret = ret; - + WriteToClient(client, sizeof(xAppleWMFrameHitTestReply), (char *)&rep); return Success; } static int ProcAppleWMFrameDraw( - register ClientPtr client -) + register ClientPtr client + ) { BoxRec ir, or; unsigned int title_length, title_max; unsigned char *title_bytes; REQUEST(xAppleWMFrameDrawReq); WindowPtr pWin; - + REQUEST_AT_LEAST_SIZE(xAppleWMFrameDrawReq); - + if (Success != dixLookupWindow(&pWin, stuff->window, client, - DixReadAccess)) + DixReadAccess)) return BadValue; - + ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih); or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh); - + title_length = stuff->title_length; title_max = (stuff->length << 2) - sizeof(xAppleWMFrameDrawReq); - + if (title_max < title_length) return BadValue; - + title_bytes = (unsigned char *) &stuff[1]; - + errno = appleWMProcs->FrameDraw(pWin, stuff->frame_class, stuff->frame_attr, &or, &ir, title_length, title_bytes); if (errno != Success) { return errno; } - + return Success; } - + /* dispatch */ static int ProcAppleWMDispatch ( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST(xReq); - + switch (stuff->data) { - case X_AppleWMQueryVersion: - return ProcAppleWMQueryVersion(client); + case X_AppleWMQueryVersion: + return ProcAppleWMQueryVersion(client); } - + if (!LocalClient(client)) return WMErrorBase + AppleWMClientNotLocal; - + switch (stuff->data) { - case X_AppleWMSelectInput: - return ProcAppleWMSelectInput(client); - case X_AppleWMDisableUpdate: - return ProcAppleWMDisableUpdate(client); - case X_AppleWMReenableUpdate: - return ProcAppleWMReenableUpdate(client); - case X_AppleWMSetWindowMenu: - return ProcAppleWMSetWindowMenu(client); - case X_AppleWMSetWindowMenuCheck: - return ProcAppleWMSetWindowMenuCheck(client); - case X_AppleWMSetFrontProcess: - return ProcAppleWMSetFrontProcess(client); - case X_AppleWMSetWindowLevel: - return ProcAppleWMSetWindowLevel(client); - case X_AppleWMSetCanQuit: - return ProcAppleWMSetCanQuit(client); - case X_AppleWMFrameGetRect: - return ProcAppleWMFrameGetRect(client); - case X_AppleWMFrameHitTest: - return ProcAppleWMFrameHitTest(client); - case X_AppleWMFrameDraw: - return ProcAppleWMFrameDraw(client); - case X_AppleWMSendPSN: - return ProcAppleWMSendPSN(client); - case X_AppleWMAttachTransient: - return ProcAppleWMAttachTransient(client); - default: - return BadRequest; + case X_AppleWMSelectInput: + return ProcAppleWMSelectInput(client); + case X_AppleWMDisableUpdate: + return ProcAppleWMDisableUpdate(client); + case X_AppleWMReenableUpdate: + return ProcAppleWMReenableUpdate(client); + case X_AppleWMSetWindowMenu: + return ProcAppleWMSetWindowMenu(client); + case X_AppleWMSetWindowMenuCheck: + return ProcAppleWMSetWindowMenuCheck(client); + case X_AppleWMSetFrontProcess: + return ProcAppleWMSetFrontProcess(client); + case X_AppleWMSetWindowLevel: + return ProcAppleWMSetWindowLevel(client); + case X_AppleWMSetCanQuit: + return ProcAppleWMSetCanQuit(client); + case X_AppleWMFrameGetRect: + return ProcAppleWMFrameGetRect(client); + case X_AppleWMFrameHitTest: + return ProcAppleWMFrameHitTest(client); + case X_AppleWMFrameDraw: + return ProcAppleWMFrameDraw(client); + case X_AppleWMSendPSN: + return ProcAppleWMSendPSN(client); + case X_AppleWMAttachTransient: + return ProcAppleWMAttachTransient(client); + default: + return BadRequest; } } @@ -677,8 +680,8 @@ SNotifyEvent(xAppleWMNotifyEvent *from, xAppleWMNotifyEvent *to) { static int SProcAppleWMQueryVersion( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST(xAppleWMQueryVersionReq); swaps(&stuff->length); @@ -687,35 +690,35 @@ SProcAppleWMQueryVersion( static int SProcAppleWMDispatch ( - register ClientPtr client -) + register ClientPtr client + ) { REQUEST(xReq); - + /* It is bound to be non-local when there is byte swapping */ if (!LocalClient(client)) return WMErrorBase + AppleWMClientNotLocal; - + /* only local clients are allowed WM access */ switch (stuff->data) { - case X_AppleWMQueryVersion: - return SProcAppleWMQueryVersion(client); - default: - return BadRequest; + case X_AppleWMQueryVersion: + return SProcAppleWMQueryVersion(client); + default: + return BadRequest; } } void AppleWMExtensionInit( - AppleWMProcsPtr procsPtr) + AppleWMProcsPtr procsPtr) { ExtensionEntry* extEntry; - + ClientType = CreateNewResourceType(WMFreeClient, "WMClient"); EventType = CreateNewResourceType(WMFreeEvents, "WMEvent"); eventResource = FakeClientID(0); - + if (ClientType && EventType && (extEntry = AddExtension(APPLEWMNAME, AppleWMNumberEvents, |