Blame synfig-osx/launcher/applewm-impl.c

Carlos Lopez a09598
/* $XFree86: xc/programs/Xserver/GL/dri/xf86dri.c,v 1.10 2000/12/07 20:26:14 dawes Exp $ */
Carlos Lopez a09598
/**************************************************************************
Carlos Lopez a09598
Carlos Lopez a09598
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
Carlos Lopez a09598
Copyright 2000 VA Linux Systems, Inc.
Carlos Lopez a09598
Copyright (c) 2002 Apple Computer, Inc.
Carlos Lopez a09598
All Rights Reserved.
Carlos Lopez a09598
Carlos Lopez a09598
Permission is hereby granted, free of charge, to any person obtaining a
Carlos Lopez a09598
copy of this software and associated documentation files (the
Carlos Lopez a09598
"Software"), to deal in the Software without restriction, including
Carlos Lopez a09598
without limitation the rights to use, copy, modify, merge, publish,
Carlos Lopez a09598
distribute, sub license, and/or sell copies of the Software, and to
Carlos Lopez a09598
permit persons to whom the Software is furnished to do so, subject to
Carlos Lopez a09598
the following conditions:
Carlos Lopez a09598
Carlos Lopez a09598
The above copyright notice and this permission notice (including the
Carlos Lopez a09598
next paragraph) shall be included in all copies or substantial portions
Carlos Lopez a09598
of the Software.
Carlos Lopez a09598
Carlos Lopez a09598
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Carlos Lopez a09598
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Carlos Lopez a09598
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
Carlos Lopez a09598
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
Carlos Lopez a09598
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Carlos Lopez a09598
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Carlos Lopez a09598
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Carlos Lopez a09598
Carlos Lopez a09598
**************************************************************************/
Carlos Lopez a09598
Carlos Lopez a09598
#define NEED_REPLIES
Carlos Lopez a09598
#define NEED_EVENTS
Carlos Lopez a09598
#include "X.h"
Carlos Lopez a09598
#include "Xproto.h"
Carlos Lopez a09598
#include "misc.h"
Carlos Lopez a09598
#include "dixstruct.h"
Carlos Lopez a09598
#include "extnsionst.h"
Carlos Lopez a09598
#include "colormapst.h"
Carlos Lopez a09598
#include "cursorstr.h"
Carlos Lopez a09598
#include "scrnintstr.h"
Carlos Lopez a09598
#include "servermd.h"
Carlos Lopez a09598
#define _APPLEWM_SERVER_
Carlos Lopez a09598
#include "applewmstr.h"
Carlos Lopez a09598
#include "swaprep.h"
Carlos Lopez a09598
#include "rootless-common.h"
Carlos Lopez a09598
#include "X11Application.h"
Carlos Lopez a09598
Carlos Lopez a09598
static int WMErrorBase;
Carlos Lopez a09598
Carlos Lopez a09598
static DISPATCH_PROC(ProcAppleWMDispatch);
Carlos Lopez a09598
static DISPATCH_PROC(SProcAppleWMDispatch);
Carlos Lopez a09598
Carlos Lopez a09598
static void AppleWMResetProc(ExtensionEntry* extEntry);
Carlos Lopez a09598
Carlos Lopez a09598
static unsigned char WMReqCode = 0;
Carlos Lopez a09598
static int WMEventBase = 0;
Carlos Lopez a09598
Carlos Lopez a09598
static RESTYPE ClientType, EventType; /* resource types for event masks */
Carlos Lopez a09598
static XID eventResource;
Carlos Lopez a09598
Carlos Lopez a09598
/* Currently selected events */
Carlos Lopez a09598
static unsigned int eventMask = 0;
Carlos Lopez a09598
Carlos Lopez a09598
extern void AppleWMExtensionInit(void);
Carlos Lopez a09598
Carlos Lopez a09598
static int WMFreeClient (pointer data, XID id);
Carlos Lopez a09598
static int WMFreeEvents (pointer data, XID id);
Carlos Lopez a09598
static void SNotifyEvent(xAppleWMNotifyEvent *from, xAppleWMNotifyEvent *to);
Carlos Lopez a09598
Carlos Lopez a09598
typedef struct _WMEvent *WMEventPtr;
Carlos Lopez a09598
typedef struct _WMEvent {
Carlos Lopez a09598
    WMEventPtr     next;
Carlos Lopez a09598
    ClientPtr	    client;
Carlos Lopez a09598
    XID		    clientResource;
Carlos Lopez a09598
    unsigned int    mask;
Carlos Lopez a09598
} WMEventRec;
Carlos Lopez a09598
Carlos Lopez a09598
static inline BoxRec
Carlos Lopez a09598
make_box (int x, int y, int w, int h)
Carlos Lopez a09598
{
Carlos Lopez a09598
    BoxRec r;
Carlos Lopez a09598
    r.x1 = x;
Carlos Lopez a09598
    r.y1 = y;
Carlos Lopez a09598
    r.x2 = x + w;
Carlos Lopez a09598
    r.y2 = y + h;
Carlos Lopez a09598
    return r;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
AppleWMExtensionInit(void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ExtensionEntry* extEntry;
Carlos Lopez a09598
Carlos Lopez a09598
    ClientType = CreateNewResourceType(WMFreeClient);
Carlos Lopez a09598
    EventType = CreateNewResourceType(WMFreeEvents);
Carlos Lopez a09598
    eventResource = FakeClientID(0);
Carlos Lopez a09598
Carlos Lopez a09598
    if (ClientType && EventType &&
Carlos Lopez a09598
	(extEntry = AddExtension(APPLEWMNAME,
Carlos Lopez a09598
				 AppleWMNumberEvents,
Carlos Lopez a09598
				 AppleWMNumberErrors,
Carlos Lopez a09598
				 ProcAppleWMDispatch,
Carlos Lopez a09598
				 SProcAppleWMDispatch,
Carlos Lopez a09598
				 AppleWMResetProc,
Carlos Lopez a09598
				 StandardMinorOpcode))) {
Carlos Lopez a09598
	WMReqCode = (unsigned char)extEntry->base;
Carlos Lopez a09598
	WMErrorBase = extEntry->errorBase;
Carlos Lopez a09598
	WMEventBase = extEntry->eventBase;
Carlos Lopez a09598
	EventSwapVector[WMEventBase] = (EventSwapPtr) SNotifyEvent;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/*ARGSUSED*/
Carlos Lopez a09598
static void
Carlos Lopez a09598
AppleWMResetProc (
Carlos Lopez a09598
    ExtensionEntry* extEntry
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMQueryVersion(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    xAppleWMQueryVersionReply rep;
Carlos Lopez a09598
    register int n;
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMQueryVersionReq);
Carlos Lopez a09598
    rep.type = X_Reply;
Carlos Lopez a09598
    rep.length = 0;
Carlos Lopez a09598
    rep.sequenceNumber = client->sequence;
Carlos Lopez a09598
    rep.majorVersion = APPLE_WM_MAJOR_VERSION;
Carlos Lopez a09598
    rep.minorVersion = APPLE_WM_MINOR_VERSION;
Carlos Lopez a09598
    rep.patchVersion = APPLE_WM_PATCH_VERSION;
Carlos Lopez a09598
    if (client->swapped) {
Carlos Lopez a09598
    	swaps(&rep.sequenceNumber, n);
Carlos Lopez a09598
    	swapl(&rep.length, n);
Carlos Lopez a09598
    }
Carlos Lopez a09598
    WriteToClient(client, sizeof(xAppleWMQueryVersionReply), (char *)&rep);
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* events */
Carlos Lopez a09598
Carlos Lopez a09598
static inline void
Carlos Lopez a09598
updateEventMask (WMEventPtr *pHead)
Carlos Lopez a09598
{
Carlos Lopez a09598
    WMEventPtr pCur;
Carlos Lopez a09598
Carlos Lopez a09598
    eventMask = 0;
Carlos Lopez a09598
    for (pCur = *pHead; pCur != NULL; pCur = pCur->next)
Carlos Lopez a09598
	eventMask |= pCur->mask;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/*ARGSUSED*/
Carlos Lopez a09598
static int
Carlos Lopez a09598
WMFreeClient (data, id)
Carlos Lopez a09598
    pointer	    data;
Carlos Lopez a09598
    XID		    id;
Carlos Lopez a09598
{
Carlos Lopez a09598
    WMEventPtr   pEvent;
Carlos Lopez a09598
    WMEventPtr   *pHead, pCur, pPrev;
Carlos Lopez a09598
Carlos Lopez a09598
    pEvent = (WMEventPtr) data;
Carlos Lopez a09598
    pHead = (WMEventPtr *) LookupIDByType(eventResource, EventType);
Carlos Lopez a09598
    if (pHead) {
Carlos Lopez a09598
	pPrev = 0;
Carlos Lopez a09598
	for (pCur = *pHead; pCur && pCur != pEvent; pCur=pCur->next)
Carlos Lopez a09598
	    pPrev = pCur;
Carlos Lopez a09598
	if (pCur)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    if (pPrev)
Carlos Lopez a09598
	    	pPrev->next = pEvent->next;
Carlos Lopez a09598
	    else
Carlos Lopez a09598
	    	*pHead = pEvent->next;
Carlos Lopez a09598
	}
Carlos Lopez a09598
	updateEventMask (pHead);
Carlos Lopez a09598
    }
Carlos Lopez a09598
    xfree ((pointer) pEvent);
Carlos Lopez a09598
    return 1;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/*ARGSUSED*/
Carlos Lopez a09598
static int
Carlos Lopez a09598
WMFreeEvents (data, id)
Carlos Lopez a09598
    pointer	    data;
Carlos Lopez a09598
    XID		    id;
Carlos Lopez a09598
{
Carlos Lopez a09598
    WMEventPtr   *pHead, pCur, pNext;
Carlos Lopez a09598
Carlos Lopez a09598
    pHead = (WMEventPtr *) data;
Carlos Lopez a09598
    for (pCur = *pHead; pCur; pCur = pNext) {
Carlos Lopez a09598
	pNext = pCur->next;
Carlos Lopez a09598
	FreeResource (pCur->clientResource, ClientType);
Carlos Lopez a09598
	xfree ((pointer) pCur);
Carlos Lopez a09598
    }
Carlos Lopez a09598
    xfree ((pointer) pHead);
Carlos Lopez a09598
    eventMask = 0;
Carlos Lopez a09598
    return 1;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMSelectInput (client)
Carlos Lopez a09598
    register ClientPtr	client;
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xAppleWMSelectInputReq);
Carlos Lopez a09598
    WMEventPtr	pEvent, pNewEvent, *pHead;
Carlos Lopez a09598
    XID			clientResource;
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH (xAppleWMSelectInputReq);
Carlos Lopez a09598
    pHead = (WMEventPtr *)SecurityLookupIDByType(client,
Carlos Lopez a09598
			eventResource, EventType, SecurityWriteAccess);
Carlos Lopez a09598
    if (stuff->mask != 0) {
Carlos Lopez a09598
	if (pHead) {
Carlos Lopez a09598
	    /* check for existing entry. */
Carlos Lopez a09598
	    for (pEvent = *pHead; pEvent; pEvent = pEvent->next)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		if (pEvent->client == client)
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    pEvent->mask = stuff->mask;
Carlos Lopez a09598
		    updateEventMask (pHead);
Carlos Lopez a09598
		    return Success;
Carlos Lopez a09598
		}
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	/* build the entry */
Carlos Lopez a09598
    	pNewEvent = (WMEventPtr) xalloc (sizeof (WMEventRec));
Carlos Lopez a09598
    	if (!pNewEvent)
Carlos Lopez a09598
	    return BadAlloc;
Carlos Lopez a09598
    	pNewEvent->next = 0;
Carlos Lopez a09598
    	pNewEvent->client = client;
Carlos Lopez a09598
	pNewEvent->mask = stuff->mask;
Carlos Lopez a09598
    	/*
Carlos Lopez a09598
 	 * add a resource that will be deleted when
Carlos Lopez a09598
     	 * the client goes away
Carlos Lopez a09598
     	 */
Carlos Lopez a09598
   	clientResource = FakeClientID (client->index);
Carlos Lopez a09598
    	pNewEvent->clientResource = clientResource;
Carlos Lopez a09598
    	if (!AddResource (clientResource, ClientType, (pointer)pNewEvent))
Carlos Lopez a09598
	    return BadAlloc;
Carlos Lopez a09598
    	/*
Carlos Lopez a09598
     	 * create a resource to contain a pointer to the list
Carlos Lopez a09598
     	 * of clients selecting input.  This must be indirect as
Carlos Lopez a09598
     	 * the list may be arbitrarily rearranged which cannot be
Carlos Lopez a09598
     	 * done through the resource database.
Carlos Lopez a09598
     	 */
Carlos Lopez a09598
    	if (!pHead)
Carlos Lopez a09598
    	{
Carlos Lopez a09598
	    pHead = (WMEventPtr *) xalloc (sizeof (WMEventPtr));
Carlos Lopez a09598
	    if (!pHead ||
Carlos Lopez a09598
	    	!AddResource (eventResource, EventType, (pointer)pHead))
Carlos Lopez a09598
	    {
Carlos Lopez a09598
	    	FreeResource (clientResource, RT_NONE);
Carlos Lopez a09598
	    	return BadAlloc;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	    *pHead = 0;
Carlos Lopez a09598
    	}
Carlos Lopez a09598
    	pNewEvent->next = *pHead;
Carlos Lopez a09598
    	*pHead = pNewEvent;
Carlos Lopez a09598
	updateEventMask (pHead);
Carlos Lopez a09598
    } else if (stuff->mask == 0) {
Carlos Lopez a09598
	/* delete the interest */
Carlos Lopez a09598
	if (pHead) {
Carlos Lopez a09598
	    pNewEvent = 0;
Carlos Lopez a09598
	    for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
Carlos Lopez a09598
		if (pEvent->client == client)
Carlos Lopez a09598
		    break;
Carlos Lopez a09598
		pNewEvent = pEvent;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	    if (pEvent) {
Carlos Lopez a09598
		FreeResource (pEvent->clientResource, ClientType);
Carlos Lopez a09598
		if (pNewEvent)
Carlos Lopez a09598
		    pNewEvent->next = pEvent->next;
Carlos Lopez a09598
		else
Carlos Lopez a09598
		    *pHead = pEvent->next;
Carlos Lopez a09598
		xfree (pEvent);
Carlos Lopez a09598
		updateEventMask (pHead);
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	}
Carlos Lopez a09598
    } else {
Carlos Lopez a09598
	client->errorValue = stuff->mask;
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    return Success;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/*
Carlos Lopez a09598
 * deliver the event
Carlos Lopez a09598
 */
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
AppleWMSendEvent (type, mask, which, arg)
Carlos Lopez a09598
    int type, which, arg;
Carlos Lopez a09598
    unsigned int mask;
Carlos Lopez a09598
{
Carlos Lopez a09598
    WMEventPtr	*pHead, pEvent;
Carlos Lopez a09598
    ClientPtr		client;
Carlos Lopez a09598
    xAppleWMNotifyEvent se;
Carlos Lopez a09598
Carlos Lopez a09598
    pHead = (WMEventPtr *) LookupIDByType(eventResource, EventType);
Carlos Lopez a09598
    if (!pHead)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
    for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
Carlos Lopez a09598
	client = pEvent->client;
Carlos Lopez a09598
	if ((pEvent->mask & mask) == 0
Carlos Lopez a09598
	    || client == serverClient || client->clientGone)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    continue;
Carlos Lopez a09598
	}
Carlos Lopez a09598
	se.type = type + WMEventBase;
Carlos Lopez a09598
	se.kind = which;
Carlos Lopez a09598
	se.arg = arg;
Carlos Lopez a09598
	se.sequenceNumber = client->sequence;
Carlos Lopez a09598
	se.time = currentTime.milliseconds;
Carlos Lopez a09598
	WriteEventsToClient (client, 1, (xEvent *) &se);
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* Safe to call from any thread. */
Carlos Lopez a09598
unsigned int
Carlos Lopez a09598
AppleWMSelectedEvents (void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    return eventMask;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* general utility functions */
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMDisableUpdate(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMDisableUpdateReq);
Carlos Lopez a09598
Carlos Lopez a09598
    xp_disable_update ();
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMReenableUpdate(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMReenableUpdateReq);
Carlos Lopez a09598
Carlos Lopez a09598
    xp_reenable_update ();
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* window functions */
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMSetWindowMenu(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    const char *bytes, **items;
Carlos Lopez a09598
    char *shortcuts;
Carlos Lopez a09598
    int max_len, nitems, i, j;
Carlos Lopez a09598
    REQUEST(xAppleWMSetWindowMenuReq);
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_AT_LEAST_SIZE(xAppleWMSetWindowMenuReq);
Carlos Lopez a09598
Carlos Lopez a09598
    nitems = stuff->nitems;
Carlos Lopez a09598
    items = alloca (sizeof (char *) * nitems);
Carlos Lopez a09598
    shortcuts = alloca (sizeof (char) * nitems);
Carlos Lopez a09598
Carlos Lopez a09598
    max_len = (stuff->length << 2) - sizeof(xAppleWMSetWindowMenuReq);
Carlos Lopez a09598
    bytes = (char *) &stuff[1];
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = j = 0; i < max_len && j < nitems;)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	shortcuts[j] = bytes[i++];
Carlos Lopez a09598
	items[j++] = bytes + i;
Carlos Lopez a09598
Carlos Lopez a09598
	while (i < max_len)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    if (bytes[i++] == 0)
Carlos Lopez a09598
		break;
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    X11ApplicationSetWindowMenu (nitems, items, shortcuts);
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMSetWindowMenuCheck(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xAppleWMSetWindowMenuCheckReq);
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMSetWindowMenuCheckReq);
Carlos Lopez a09598
Carlos Lopez a09598
    X11ApplicationSetWindowMenuCheck (stuff->index);
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMSetFrontProcess(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMSetFrontProcessReq);
Carlos Lopez a09598
Carlos Lopez a09598
    X11ApplicationSetFrontProcess ();
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMSetWindowLevel(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xAppleWMSetWindowLevelReq);
Carlos Lopez a09598
    WindowPtr pWin;
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMSetWindowLevelReq);
Carlos Lopez a09598
Carlos Lopez a09598
    if (!(pWin = SecurityLookupWindow((Drawable)stuff->window,
Carlos Lopez a09598
				      client, SecurityReadAccess))) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (stuff->level < 0 || stuff->level >= AppleWMNumWindowLevels) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    RootlessSetWindowLevel (pWin, stuff->level);
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMSetCanQuit(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xAppleWMSetCanQuitReq);
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMSetCanQuitReq);
Carlos Lopez a09598
Carlos Lopez a09598
    X11ApplicationSetCanQuit (stuff->state);
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* frame functions */
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMFrameGetRect(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    xAppleWMFrameGetRectReply rep;
Carlos Lopez a09598
    BoxRec ir, or, rr;
Carlos Lopez a09598
    REQUEST(xAppleWMFrameGetRectReq);
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMFrameGetRectReq);
Carlos Lopez a09598
    rep.type = X_Reply;
Carlos Lopez a09598
    rep.length = 0;
Carlos Lopez a09598
    rep.sequenceNumber = client->sequence;
Carlos Lopez a09598
Carlos Lopez a09598
    ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
Carlos Lopez a09598
    or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
Carlos Lopez a09598
Carlos Lopez a09598
    if (xp_frame_get_rect (stuff->frame_rect,
Carlos Lopez a09598
			   stuff->frame_class,
Carlos Lopez a09598
			   &or, &ir, &rr) != Success) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    rep.x = rr.x1;
Carlos Lopez a09598
    rep.y = rr.y1;
Carlos Lopez a09598
    rep.w = rr.x2 - rr.x1;
Carlos Lopez a09598
    rep.h = rr.y2 - rr.y1;
Carlos Lopez a09598
Carlos Lopez a09598
    WriteToClient(client, sizeof(xAppleWMFrameGetRectReply), (char *)&rep);
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMFrameHitTest(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    xAppleWMFrameHitTestReply rep;
Carlos Lopez a09598
    BoxRec ir, or;
Carlos Lopez a09598
    int ret;
Carlos Lopez a09598
    REQUEST(xAppleWMFrameHitTestReq);
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleWMFrameHitTestReq);
Carlos Lopez a09598
    rep.type = X_Reply;
Carlos Lopez a09598
    rep.length = 0;
Carlos Lopez a09598
    rep.sequenceNumber = client->sequence;
Carlos Lopez a09598
Carlos Lopez a09598
    ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
Carlos Lopez a09598
    or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
Carlos Lopez a09598
Carlos Lopez a09598
    if (xp_frame_hit_test (stuff->frame_class, stuff->px,
Carlos Lopez a09598
			   stuff->py, &or, &ir, &ret) != Success)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    rep.ret = ret;
Carlos Lopez a09598
Carlos Lopez a09598
    WriteToClient(client, sizeof(xAppleWMFrameHitTestReply), (char *)&rep);
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMFrameDraw(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    BoxRec ir, or;
Carlos Lopez a09598
    unsigned int title_length, title_max;
Carlos Lopez a09598
    unsigned char *title_bytes;
Carlos Lopez a09598
    REQUEST(xAppleWMFrameDrawReq);
Carlos Lopez a09598
    WindowPtr pWin;
Carlos Lopez a09598
    xp_window_id wid;
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_AT_LEAST_SIZE(xAppleWMFrameDrawReq);
Carlos Lopez a09598
Carlos Lopez a09598
    if (!(pWin = SecurityLookupWindow((Drawable)stuff->window,
Carlos Lopez a09598
				      client, SecurityReadAccess))) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
Carlos Lopez a09598
    or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
Carlos Lopez a09598
Carlos Lopez a09598
    title_length = stuff->title_length;
Carlos Lopez a09598
    title_max = (stuff->length << 2) - sizeof(xAppleWMFrameDrawReq);
Carlos Lopez a09598
Carlos Lopez a09598
    if (title_max < title_length)
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
Carlos Lopez a09598
    title_bytes = (unsigned char *) &stuff[1];
Carlos Lopez a09598
Carlos Lopez a09598
    wid = RootlessGetPhysicalWindow (pWin, FALSE);
Carlos Lopez a09598
    if (wid == 0)
Carlos Lopez a09598
	return BadWindow;
Carlos Lopez a09598
Carlos Lopez a09598
    if (xp_frame_draw (wid, stuff->frame_class,
Carlos Lopez a09598
		       stuff->frame_attr, &or, &ir,
Carlos Lopez a09598
		       title_length, title_bytes) != Success) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* dispatch */
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleWMDispatch (
Carlos Lopez a09598
    register ClientPtr	client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xReq);
Carlos Lopez a09598
Carlos Lopez a09598
    switch (stuff->data)
Carlos Lopez a09598
    {
Carlos Lopez a09598
    case X_AppleWMQueryVersion:
Carlos Lopez a09598
	return ProcAppleWMQueryVersion(client);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (!LocalClient(client))
Carlos Lopez a09598
	return WMErrorBase + AppleWMClientNotLocal;
Carlos Lopez a09598
Carlos Lopez a09598
    switch (stuff->data)
Carlos Lopez a09598
    {
Carlos Lopez a09598
    case X_AppleWMSelectInput:
Carlos Lopez a09598
	return ProcAppleWMSelectInput(client);
Carlos Lopez a09598
    case X_AppleWMDisableUpdate:
Carlos Lopez a09598
	return ProcAppleWMDisableUpdate(client);
Carlos Lopez a09598
    case X_AppleWMReenableUpdate:
Carlos Lopez a09598
	return ProcAppleWMReenableUpdate(client);
Carlos Lopez a09598
    case X_AppleWMSetWindowMenu:
Carlos Lopez a09598
	return ProcAppleWMSetWindowMenu(client);
Carlos Lopez a09598
    case X_AppleWMSetWindowMenuCheck:
Carlos Lopez a09598
	return ProcAppleWMSetWindowMenuCheck(client);
Carlos Lopez a09598
    case X_AppleWMSetFrontProcess:
Carlos Lopez a09598
	return ProcAppleWMSetFrontProcess(client);
Carlos Lopez a09598
    case X_AppleWMSetWindowLevel:
Carlos Lopez a09598
	return ProcAppleWMSetWindowLevel(client);
Carlos Lopez a09598
    case X_AppleWMSetCanQuit:
Carlos Lopez a09598
	return ProcAppleWMSetCanQuit(client);
Carlos Lopez a09598
    case X_AppleWMFrameGetRect:
Carlos Lopez a09598
	return ProcAppleWMFrameGetRect(client);
Carlos Lopez a09598
    case X_AppleWMFrameHitTest:
Carlos Lopez a09598
	return ProcAppleWMFrameHitTest(client);
Carlos Lopez a09598
    case X_AppleWMFrameDraw:
Carlos Lopez a09598
	return ProcAppleWMFrameDraw(client);
Carlos Lopez a09598
    default:
Carlos Lopez a09598
	return BadRequest;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static void
Carlos Lopez a09598
SNotifyEvent(from, to)
Carlos Lopez a09598
    xAppleWMNotifyEvent *from, *to;
Carlos Lopez a09598
{
Carlos Lopez a09598
    to->type = from->type;
Carlos Lopez a09598
    to->kind = from->kind;
Carlos Lopez a09598
    cpswaps (from->sequenceNumber, to->sequenceNumber);
Carlos Lopez a09598
    cpswapl (from->time, to->time);
Carlos Lopez a09598
    cpswapl (from->arg, to->arg);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
SProcAppleWMQueryVersion(
Carlos Lopez a09598
    register ClientPtr	client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    register int n;
Carlos Lopez a09598
    REQUEST(xAppleWMQueryVersionReq);
Carlos Lopez a09598
    swaps(&stuff->length, n);
Carlos Lopez a09598
    return ProcAppleWMQueryVersion(client);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
SProcAppleWMDispatch (
Carlos Lopez a09598
    register ClientPtr	client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xReq);
Carlos Lopez a09598
Carlos Lopez a09598
    /* It is bound to be non-local when there is byte swapping */
Carlos Lopez a09598
    if (!LocalClient(client))
Carlos Lopez a09598
	return WMErrorBase + AppleWMClientNotLocal;
Carlos Lopez a09598
Carlos Lopez a09598
    /* only local clients are allowed WM access */
Carlos Lopez a09598
    switch (stuff->data)
Carlos Lopez a09598
    {
Carlos Lopez a09598
    case X_AppleWMQueryVersion:
Carlos Lopez a09598
	return SProcAppleWMQueryVersion(client);
Carlos Lopez a09598
    default:
Carlos Lopez a09598
	return BadRequest;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}