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:
parent
347f377f3b
commit
b0e9e2e326
|
@ -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;
|
||||
|
|
34
dix/grabs.c
34
dix/grabs.c
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */,
|
||||
|
|
Loading…
Reference in New Issue
Block a user