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;
|
grabinfo->grabTime = time;
|
||||||
if (grab->cursor)
|
if (grab->cursor)
|
||||||
grab->cursor->refcnt++;
|
grab->cursor->refcnt++;
|
||||||
grabinfo->activeGrab = *grab;
|
CopyGrab(&grabinfo->activeGrab, grab);
|
||||||
grabinfo->grab = &grabinfo->activeGrab;
|
grabinfo->grab = &grabinfo->activeGrab;
|
||||||
grabinfo->fromPassiveGrab = isPassive;
|
grabinfo->fromPassiveGrab = isPassive;
|
||||||
grabinfo->implicitGrab = autoGrab & ImplicitGrabMask;
|
grabinfo->implicitGrab = autoGrab & ImplicitGrabMask;
|
||||||
|
@ -1586,7 +1586,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
|
||||||
grabinfo->grabTime = syncEvents.time;
|
grabinfo->grabTime = syncEvents.time;
|
||||||
else
|
else
|
||||||
grabinfo->grabTime = time;
|
grabinfo->grabTime = time;
|
||||||
grabinfo->activeGrab = *grab;
|
CopyGrab(&grabinfo->activeGrab, grab);
|
||||||
grabinfo->grab = &grabinfo->activeGrab;
|
grabinfo->grab = &grabinfo->activeGrab;
|
||||||
grabinfo->fromPassiveGrab = passive;
|
grabinfo->fromPassiveGrab = passive;
|
||||||
grabinfo->implicitGrab = passive & ImplicitGrabMask;
|
grabinfo->implicitGrab = passive & ImplicitGrabMask;
|
||||||
|
|
34
dix/grabs.c
34
dix/grabs.c
|
@ -246,6 +246,40 @@ FreeGrab(GrabPtr pGrab)
|
||||||
free(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
|
int
|
||||||
DeletePassiveGrab(pointer value, XID id)
|
DeletePassiveGrab(pointer value, XID id)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,6 +33,7 @@ extern void UngrabAllDevices(Bool kill_client);
|
||||||
|
|
||||||
extern GrabPtr AllocGrab(void);
|
extern GrabPtr AllocGrab(void);
|
||||||
extern void FreeGrab(GrabPtr grab);
|
extern void FreeGrab(GrabPtr grab);
|
||||||
|
extern Bool CopyGrab(GrabPtr dst, const GrabPtr src);
|
||||||
|
|
||||||
extern GrabPtr CreateGrab(
|
extern GrabPtr CreateGrab(
|
||||||
int /* client */,
|
int /* client */,
|
||||||
|
|
Loading…
Reference in New Issue