#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "inputstr.h"
#include "windowstr.h"
#include <X11/extensions/XI2.h>
#include <X11/extensions/XI2proto.h>
#include "exglobals.h"
#include "xisetdevfocus.h"
int
SProcXISetFocus(ClientPtr client)
{
char n;
REQUEST(xXISetFocusReq);
swaps(&stuff->length, n);
swaps(&stuff->deviceid, n);
swapl(&stuff->focus, n);
swapl(&stuff->time, n);
return ProcXISetFocus(client);
}
int
SProcXIGetFocus(ClientPtr client)
{
char n;
REQUEST(xXIGetFocusReq);
swaps(&stuff->length, n);
swaps(&stuff->deviceid, n);
return ProcXIGetFocus(client);
}
int
ProcXISetFocus(ClientPtr client)
{
DeviceIntPtr dev;
int ret;
REQUEST(xXISetFocusReq);
REQUEST_AT_LEAST_SIZE(xXISetFocusReq);
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
if (ret != Success)
return ret;
if (!dev->focus)
return BadDevice;
return SetInputFocus(client, dev, stuff->focus, RevertToParent,
stuff->time, TRUE);
}
int
ProcXIGetFocus(ClientPtr client)
{
xXIGetFocusReply rep;
DeviceIntPtr dev;
int ret;
REQUEST(xXIGetFocusReq);
REQUEST_AT_LEAST_SIZE(xXIGetFocusReq);
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetFocusAccess);
if (ret != Success)
return ret;
if (!dev->focus)
return BadDevice;
rep.repType = X_Reply;
rep.RepType = X_XIGetFocus;
rep.length = 0;
rep.sequenceNumber = client->sequence;
if (dev->focus->win == NoneWin)
rep.focus = None;
else if (dev->focus->win == PointerRootWin)
rep.focus = PointerRoot;
else if (dev->focus->win == FollowKeyboardWin)
rep.focus = FollowKeyboard;
else
rep.focus = dev->focus->win->drawable.id;
WriteReplyToClient(client, sizeof(xXIGetFocusReply), &rep);
return Success;
}
void
SRepXIGetFocus(ClientPtr client, int len, xXIGetFocusReply *rep)
{
char n;
swaps(&rep->sequenceNumber, n);
swapl(&rep->length, n);
swapl(&rep->focus, n);
WriteToClient(client, len, (char *)rep);
}