dix: add CopyGrab() function

Not really needed at this point, but will be once touch support is added.
Since grabs are now expected to be allocated/freed with AllocGrab and
FreeGrab, CopyGrab must increase the refcount and duplicate the modifier
masks. Until the callers are switched to use FreeGrab, this introduces
memleaks.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
Peter Hutterer 2011-11-04 10:44:31 +10:00
parent 347f377f3b
commit b0e9e2e326
3 changed files with 37 additions and 2 deletions

View File

@ -1509,7 +1509,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
grabinfo->grabTime = time;
if (grab->cursor)
grab->cursor->refcnt++;
grabinfo->activeGrab = *grab;
CopyGrab(&grabinfo->activeGrab, grab);
grabinfo->grab = &grabinfo->activeGrab;
grabinfo->fromPassiveGrab = isPassive;
grabinfo->implicitGrab = autoGrab & ImplicitGrabMask;
@ -1586,7 +1586,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
grabinfo->grabTime = syncEvents.time;
else
grabinfo->grabTime = time;
grabinfo->activeGrab = *grab;
CopyGrab(&grabinfo->activeGrab, grab);
grabinfo->grab = &grabinfo->activeGrab;
grabinfo->fromPassiveGrab = passive;
grabinfo->implicitGrab = passive & ImplicitGrabMask;

View File

@ -246,6 +246,40 @@ FreeGrab(GrabPtr pGrab)
free(pGrab);
}
Bool
CopyGrab(GrabPtr dst, const GrabPtr src)
{
Mask *mdetails_mask = NULL;
Mask *details_mask = NULL;
if (src->cursor)
src->cursor->refcnt++;
if (src->modifiersDetail.pMask) {
int len = MasksPerDetailMask * sizeof(Mask);
mdetails_mask = malloc(len);
if (!mdetails_mask)
return FALSE;
memcpy(mdetails_mask, src->modifiersDetail.pMask, len);
}
if (src->detail.pMask) {
int len = MasksPerDetailMask * sizeof(Mask);
details_mask = malloc(len);
if (!details_mask) {
free(mdetails_mask);
return FALSE;
}
memcpy(details_mask, src->detail.pMask, len);
}
*dst = *src;
dst->modifiersDetail.pMask = mdetails_mask;
dst->detail.pMask = details_mask;
return TRUE;
}
int
DeletePassiveGrab(pointer value, XID id)
{

View File

@ -33,6 +33,7 @@ extern void UngrabAllDevices(Bool kill_client);
extern GrabPtr AllocGrab(void);
extern void FreeGrab(GrabPtr grab);
extern Bool CopyGrab(GrabPtr dst, const GrabPtr src);
extern GrabPtr CreateGrab(
int /* client */,