Annotation of researchv9/X11/src/X.V11R1/server/dix/grabs.c, revision 1.1

1.1     ! root        1: /* $Header: grabs.c,v 1.1 87/09/11 07:18:50 toddb Exp $ */
        !             2: /************************************************************
        !             3: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
        !             4: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
        !             5: 
        !             6:                         All Rights Reserved
        !             7: 
        !             8: Permission to use, copy, modify, and distribute this software and its 
        !             9: documentation for any purpose and without fee is hereby granted, 
        !            10: provided that the above copyright notice appear in all copies and that
        !            11: both that copyright notice and this permission notice appear in 
        !            12: supporting documentation, and that the names of Digital or MIT not be
        !            13: used in advertising or publicity pertaining to distribution of the
        !            14: software without specific, written prior permission.  
        !            15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
        !            16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
        !            17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
        !            18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
        !            19: WHETHER IN AN action OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
        !            21: SOFTWARE.
        !            22: 
        !            23: ********************************************************/
        !            24: 
        !            25: #include "X.h"
        !            26: #include "misc.h"
        !            27: #define NEED_EVENTS
        !            28: #include "Xproto.h"
        !            29: #include "windowstr.h"
        !            30: #include "inputstr.h"
        !            31: 
        !            32: #define BITMASK(i) (1 << ((i) & 31))
        !            33: #define MASKIDX(i) ((i) >> 5)
        !            34: #define MASKWORD(buf, i) buf[MASKIDX(i)]
        !            35: #define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i)
        !            36: #define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
        !            37: #define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))
        !            38: 
        !            39: static Mask *
        !            40: CreateDetailMask()
        !            41: {
        !            42:     Mask *pTempMask;
        !            43:     int i;
        !            44: 
        !            45:     pTempMask = (Mask *)Xalloc(sizeof(Mask) * MasksPerDetailMask);
        !            46: 
        !            47:     for ( i = 0; i < MasksPerDetailMask; i++)
        !            48:        pTempMask[i]= ~0;
        !            49: 
        !            50:     return pTempMask;
        !            51: 
        !            52: }
        !            53: 
        !            54: static void
        !            55: DeleteDetailFromMask(ppDetailMask, detail)
        !            56: Mask **ppDetailMask;
        !            57: int detail;
        !            58: {
        !            59:     if (*ppDetailMask == NULL)
        !            60:        *ppDetailMask = CreateDetailMask();
        !            61:  
        !            62:     BITCLEAR((*ppDetailMask), detail);
        !            63: }
        !            64: 
        !            65: static Mask *
        !            66: CopyDetailMask(pOriginalDetailMask)
        !            67: Mask *pOriginalDetailMask;
        !            68: {
        !            69:     Mask *pTempMask;
        !            70:     int i;
        !            71: 
        !            72:     if (pOriginalDetailMask == NULL)
        !            73:        return NULL;
        !            74: 
        !            75:     pTempMask = (Mask *)Xalloc(sizeof(Mask) * MasksPerDetailMask);
        !            76: 
        !            77:     for ( i = 0; i < MasksPerDetailMask; i++)
        !            78:        pTempMask[i]= pOriginalDetailMask[i];
        !            79: 
        !            80:     return pTempMask;
        !            81: 
        !            82: }
        !            83: 
        !            84: extern void PassiveClientGone();       /* This is defined in events.c */
        !            85: 
        !            86: void
        !            87: AddPassiveGrabToWindowList(pGrab)
        !            88: GrabPtr pGrab;
        !            89: {
        !            90:     pGrab->resource = FakeClientID(pGrab->client->index);
        !            91:     pGrab->next = PASSIVEGRABS(pGrab->window);
        !            92:     pGrab->window->passiveGrabs = (pointer)pGrab;
        !            93:     AddResource(pGrab->resource, RT_FAKE, pGrab->window, PassiveClientGone, RC_CORE);
        !            94: }
        !            95: 
        !            96: 
        !            97: GrabPtr
        !            98: CreateGrab(client, device, window, eventMask, ownerEvents, keyboardMode,
        !            99:        pointerMode, modifiers, key)
        !           100: ClientPtr client;
        !           101: DeviceIntPtr device;
        !           102: WindowPtr window;
        !           103: Mask eventMask;
        !           104: BOOL ownerEvents, keyboardMode, pointerMode;
        !           105: int modifiers, key;
        !           106: {
        !           107:     GrabPtr grab;
        !           108: 
        !           109:     grab = (GrabPtr)Xalloc(sizeof(GrabRec));
        !           110:     grab->client = client;
        !           111:     grab->device = device;
        !           112:     grab->window = window;
        !           113:     grab->eventMask = eventMask;
        !           114:     grab->ownerEvents = ownerEvents;
        !           115:     grab->keyboardMode = keyboardMode;
        !           116:     grab->pointerMode = pointerMode;
        !           117:     grab->modifiersDetail.exact = modifiers;
        !           118:     grab->modifiersDetail.pMask = NULL;
        !           119:     grab->u.keybd.keyDetail.exact = key;
        !           120:     grab->u.keybd.keyDetail.pMask = NULL;
        !           121:     return grab;
        !           122: 
        !           123: }
        !           124: 
        !           125: 
        !           126: 
        !           127: void
        !           128: DeleteGrab(pGrab)
        !           129: GrabPtr pGrab;
        !           130: {
        !           131:     if (pGrab->modifiersDetail.pMask != NULL)
        !           132:        Xfree(pGrab->modifiersDetail.pMask);
        !           133: 
        !           134:     if (pGrab->u.keybd.keyDetail.pMask != NULL)
        !           135:        Xfree(pGrab->u.keybd.keyDetail.pMask);
        !           136: 
        !           137:     Xfree(pGrab);
        !           138: 
        !           139: }
        !           140: 
        !           141: 
        !           142: static BOOL
        !           143: IsInGrabMask(firstDetail, secondExact, exception)
        !           144: DetailRec firstDetail;
        !           145: int secondExact;
        !           146: int exception;
        !           147: {
        !           148:     if (firstDetail.exact == exception)
        !           149:     {
        !           150:        if (firstDetail.pMask == NULL)
        !           151:            return TRUE;
        !           152:        
        !           153:        if (GETBIT(firstDetail.pMask, secondExact))
        !           154:            return TRUE;
        !           155:     }
        !           156:     
        !           157:     return FALSE;
        !           158: }
        !           159: 
        !           160: static BOOL 
        !           161: IdenticalExactDetails(firstExact, secondExact, exception)
        !           162: int firstExact, secondExact, exception;
        !           163: {
        !           164:     if ((firstExact == exception) || (secondExact == exception))
        !           165:        return FALSE;
        !           166:    
        !           167:     if (firstExact == secondExact)
        !           168:        return TRUE;
        !           169: 
        !           170:     return FALSE;
        !           171: }
        !           172: 
        !           173: static BOOL 
        !           174: DetailSupersedesSecond(firstDetail, secondDetail, exception)
        !           175: DetailRec firstDetail, secondDetail;
        !           176: int exception;
        !           177: {
        !           178:     if (IsInGrabMask(firstDetail, secondDetail.exact, exception))
        !           179:        return TRUE;
        !           180: 
        !           181:     if (IdenticalExactDetails(firstDetail.exact, secondDetail.exact, exception))
        !           182:        return TRUE;
        !           183:   
        !           184:     return FALSE;
        !           185: 
        !           186: }
        !           187: 
        !           188: BOOL
        !           189: GrabSupersedesSecond(pFirstGrab, pSecondGrab)
        !           190: GrabPtr pFirstGrab, pSecondGrab;
        !           191: {
        !           192:     if (!DetailSupersedesSecond(pFirstGrab->modifiersDetail,
        !           193:        pSecondGrab->modifiersDetail, 
        !           194:        AnyModifier))
        !           195:        return FALSE;
        !           196: 
        !           197:     if (DetailSupersedesSecond(pFirstGrab->u.keybd.keyDetail,
        !           198:        pSecondGrab->u.keybd.keyDetail, AnyKey))
        !           199:        return TRUE;
        !           200:  
        !           201:     return FALSE;
        !           202: }
        !           203: 
        !           204: BOOL
        !           205: GrabMatchesSecond(pFirstGrab, pSecondGrab)
        !           206: GrabPtr pFirstGrab, pSecondGrab;
        !           207: {
        !           208:     if (pFirstGrab->device != pSecondGrab->device)
        !           209:        return FALSE;
        !           210: 
        !           211:     if (GrabSupersedesSecond(pFirstGrab, pSecondGrab))
        !           212:        return TRUE;
        !           213: 
        !           214:     if (GrabSupersedesSecond(pSecondGrab, pFirstGrab))
        !           215:        return TRUE;
        !           216:  
        !           217:     if (DetailSupersedesSecond(pSecondGrab->u.keybd.keyDetail, 
        !           218:        pFirstGrab->u.keybd.keyDetail, AnyKey) 
        !           219:        && 
        !           220:        DetailSupersedesSecond(pFirstGrab->modifiersDetail, 
        !           221:        pSecondGrab->modifiersDetail, AnyModifier))
        !           222:        return TRUE;
        !           223: 
        !           224:     if (DetailSupersedesSecond(pFirstGrab->u.keybd.keyDetail, 
        !           225:        pSecondGrab->u.keybd.keyDetail, AnyKey) 
        !           226:        && 
        !           227:        DetailSupersedesSecond(pSecondGrab->modifiersDetail, 
        !           228:        pFirstGrab->modifiersDetail, AnyModifier))
        !           229:        return TRUE;
        !           230: 
        !           231:     return FALSE;
        !           232: 
        !           233: }
        !           234: 
        !           235: 
        !           236: 
        !           237: void
        !           238: DeletePassiveGrabFromList(pMinuendGrab)
        !           239: GrabPtr pMinuendGrab;
        !           240: {
        !           241:     register GrabPtr *next;
        !           242:     register GrabPtr grab;
        !           243: 
        !           244:     for (next = (GrabPtr *)&(pMinuendGrab->window->passiveGrabs); *next; )
        !           245:     {
        !           246:        grab = *next;
        !           247: 
        !           248:        if (GrabMatchesSecond(grab, pMinuendGrab) && 
        !           249:            (grab->client == pMinuendGrab->client))
        !           250:         {
        !           251:            if (GrabSupersedesSecond(pMinuendGrab, grab))
        !           252:            {
        !           253:                /* This is really sleazy and counts on FreeResource to update
        !           254:                    *next ( notice the continue ). */
        !           255: 
        !           256:                FreeResource(grab->resource, RC_NONE);
        !           257:                continue;
        !           258:             }
        !           259: 
        !           260:             if ((grab->u.keybd.keyDetail.exact == AnyKey)
        !           261:                && (grab->modifiersDetail.exact != AnyModifier))
        !           262:            {
        !           263:                DeleteDetailFromMask(&(grab->u.keybd.keyDetail.pMask),
        !           264:                        pMinuendGrab->u.keybd.keyDetail.exact);
        !           265:            }
        !           266:            else
        !           267:            {
        !           268:                if ((grab->modifiersDetail.exact == AnyModifier) 
        !           269:                    && (grab->u.keybd.keyDetail.exact != AnyKey))
        !           270:                {
        !           271:                    DeleteDetailFromMask(&(grab->modifiersDetail.pMask),
        !           272:                        pMinuendGrab->modifiersDetail.exact); 
        !           273:                }
        !           274:                else
        !           275:                {
        !           276:                    if ((pMinuendGrab->u.keybd.keyDetail.exact != AnyKey)
        !           277:                        && (pMinuendGrab->modifiersDetail.exact != AnyModifier))
        !           278:                    {
        !           279:                        GrabPtr pNewGrab;
        !           280:                
        !           281:                        DeleteDetailFromMask(&(grab->u.keybd.keyDetail.pMask),
        !           282:                            pMinuendGrab->u.keybd.keyDetail.exact);     
        !           283:                        
        !           284:                        pNewGrab = CreateGrab(grab->client, grab->device, 
        !           285:                            grab->window,
        !           286:                            grab->eventMask, grab->ownerEvents,
        !           287:                            grab->keyboardMode, grab->pointerMode, AnyModifier,
        !           288:                            pMinuendGrab->u.keybd.keyDetail.exact);
        !           289: 
        !           290:                        pNewGrab->modifiersDetail.pMask = 
        !           291:                                CopyDetailMask(grab->modifiersDetail.pMask);
        !           292: 
        !           293:                        DeleteDetailFromMask(&(pNewGrab->modifiersDetail.pMask),
        !           294:                            pMinuendGrab->modifiersDetail.exact); 
        !           295:                
        !           296:                        AddPassiveGrabToWindowList(pNewGrab);
        !           297:                    }   
        !           298:                    else
        !           299:                    {
        !           300:                        if (pMinuendGrab->u.keybd.keyDetail.exact ==
        !           301:                            AnyKey)
        !           302:                        {
        !           303:                            DeleteDetailFromMask(&(grab->modifiersDetail.pMask),
        !           304:                                pMinuendGrab->modifiersDetail.exact);           
        !           305:                        }
        !           306:                        else
        !           307:                        {
        !           308:                            DeleteDetailFromMask(
        !           309:                                &(grab->u.keybd.keyDetail.pMask),
        !           310:                                pMinuendGrab->u.keybd.keyDetail.exact);         
        !           311:                         }
        !           312:                    }
        !           313:                }
        !           314:        
        !           315:            }
        !           316:        }
        !           317:        next = &((*next)->next);
        !           318:     }
        !           319: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.