xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

inpututils.c (33043B)


      1 /*
      2  * Copyright © 2008 Daniel Stone
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  *
     23  * Author: Daniel Stone <daniel@fooishbar.org>
     24  */
     25 
     26 #ifdef HAVE_DIX_CONFIG_H
     27 #include "dix-config.h"
     28 #endif
     29 
     30 #include "exevents.h"
     31 #include "exglobals.h"
     32 #include "misc.h"
     33 #include "input.h"
     34 #include "inputstr.h"
     35 #include "xace.h"
     36 #include "xkbsrv.h"
     37 #include "xkbstr.h"
     38 #include "inpututils.h"
     39 #include "eventstr.h"
     40 #include "scrnintstr.h"
     41 #include "optionstr.h"
     42 
     43 /* Check if a button map change is okay with the device.
     44  * Returns -1 for BadValue, as it collides with MappingBusy. */
     45 static int
     46 check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
     47                     ClientPtr client)
     48 {
     49     int i, ret;
     50 
     51     if (!dev || !dev->button) {
     52         client->errorValue = (dev) ? dev->id : 0;
     53         return BadDevice;
     54     }
     55 
     56     ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
     57     if (ret != Success) {
     58         client->errorValue = dev->id;
     59         return ret;
     60     }
     61 
     62     for (i = 0; i < len; i++) {
     63         if (dev->button->map[i + 1] != map[i] &&
     64             button_is_down(dev, i + 1, BUTTON_PROCESSED))
     65             return MappingBusy;
     66     }
     67 
     68     return Success;
     69 }
     70 
     71 static void
     72 do_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
     73 {
     74     int i;
     75     xEvent core_mn = { .u.u.type = MappingNotify };
     76     deviceMappingNotify xi_mn;
     77 
     78     /* The map in ButtonClassRec refers to button numbers, whereas the
     79      * protocol is zero-indexed.  Sigh. */
     80     memcpy(&(dev->button->map[1]), map, len);
     81 
     82     core_mn.u.mappingNotify.request = MappingPointer;
     83 
     84     /* 0 is the server client. */
     85     for (i = 1; i < currentMaxClients; i++) {
     86         /* Don't send irrelevant events to naïve clients. */
     87         if (!clients[i] || clients[i]->clientState != ClientStateRunning)
     88             continue;
     89 
     90         if (!XIShouldNotify(clients[i], dev))
     91             continue;
     92 
     93         WriteEventsToClient(clients[i], 1, &core_mn);
     94     }
     95 
     96     xi_mn = (deviceMappingNotify) {
     97         .type = DeviceMappingNotify,
     98         .request = MappingPointer,
     99         .deviceid = dev->id,
    100         .time = GetTimeInMillis()
    101     };
    102 
    103     SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) &xi_mn, 1);
    104 }
    105 
    106 /*
    107  * Does what it says on the box, both for core and Xi.
    108  *
    109  * Faithfully reports any errors encountered while trying to apply the map
    110  * to the requested device, faithfully ignores any errors encountered while
    111  * trying to apply the map to its master/slaves.
    112  */
    113 int
    114 ApplyPointerMapping(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
    115 {
    116     int ret;
    117 
    118     /* If we can't perform the change on the requested device, bail out. */
    119     ret = check_butmap_change(dev, map, len, &client->errorValue, client);
    120     if (ret != Success)
    121         return ret;
    122     do_butmap_change(dev, map, len, client);
    123 
    124     return Success;
    125 }
    126 
    127 /* Check if a modifier map change is okay with the device. Negative return
    128  * values mean BadValue, positive values mean Mapping{Busy,Failed}, 0 is
    129  * Success / MappingSuccess.
    130  */
    131 static int
    132 check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
    133 {
    134     int ret, i;
    135     XkbDescPtr xkb;
    136 
    137     ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
    138     if (ret != Success)
    139         return ret;
    140 
    141     if (!dev->key)
    142         return BadMatch;
    143     xkb = dev->key->xkbInfo->desc;
    144 
    145     for (i = 0; i < MAP_LENGTH; i++) {
    146         if (!modmap[i])
    147             continue;
    148 
    149         /* Check that all the new modifiers fall within the advertised
    150          * keycode range. */
    151         if (i < xkb->min_key_code || i > xkb->max_key_code) {
    152             client->errorValue = i;
    153             return -1;
    154         }
    155 
    156         /* None of the new modifiers may be down while we change the
    157          * map. */
    158         if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
    159             client->errorValue = i;
    160             return MappingBusy;
    161         }
    162     }
    163 
    164     /* None of the old modifiers may be down while we change the map,
    165      * either. */
    166     for (i = xkb->min_key_code; i < xkb->max_key_code; i++) {
    167         if (!xkb->map->modmap[i])
    168             continue;
    169         if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
    170             client->errorValue = i;
    171             return MappingBusy;
    172         }
    173     }
    174 
    175     return Success;
    176 }
    177 
    178 static int
    179 check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
    180                           DeviceIntPtr slave, CARD8 *modmap)
    181 {
    182     XkbDescPtr master_xkb, slave_xkb;
    183     int i, j;
    184 
    185     if (!slave->key || !master->key)
    186         return 0;
    187 
    188     master_xkb = master->key->xkbInfo->desc;
    189     slave_xkb = slave->key->xkbInfo->desc;
    190 
    191     /* Ignore devices with a clearly different keymap. */
    192     if (slave_xkb->min_key_code != master_xkb->min_key_code ||
    193         slave_xkb->max_key_code != master_xkb->max_key_code)
    194         return 0;
    195 
    196     for (i = 0; i < MAP_LENGTH; i++) {
    197         if (!modmap[i])
    198             continue;
    199 
    200         /* If we have different symbols for any modifier on an
    201          * extended keyboard, ignore the whole remap request. */
    202         for (j = 0;
    203              j < XkbKeyNumSyms(slave_xkb, i) &&
    204              j < XkbKeyNumSyms(master_xkb, i); j++)
    205             if (XkbKeySymsPtr(slave_xkb, i)[j] !=
    206                 XkbKeySymsPtr(master_xkb, i)[j])
    207                 return 0;
    208     }
    209 
    210     if (check_modmap_change(client, slave, modmap) != Success)
    211         return 0;
    212 
    213     return 1;
    214 }
    215 
    216 /* Actually change the modifier map, and send notifications.  Cannot fail. */
    217 static void
    218 do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
    219 {
    220     XkbApplyMappingChange(dev, NULL, 0, 0, modmap, serverClient);
    221 }
    222 
    223 /* Rebuild modmap (key -> mod) from map (mod -> key). */
    224 static int
    225 build_modmap_from_modkeymap(CARD8 *modmap, KeyCode *modkeymap,
    226                             int max_keys_per_mod)
    227 {
    228     int i, len = max_keys_per_mod * 8;
    229 
    230     memset(modmap, 0, MAP_LENGTH);
    231 
    232     for (i = 0; i < len; i++) {
    233         if (!modkeymap[i])
    234             continue;
    235 
    236 #if MAP_LENGTH < 256
    237         if (modkeymap[i] >= MAP_LENGTH)
    238             return BadValue;
    239 #endif
    240 
    241         if (modmap[modkeymap[i]])
    242             return BadValue;
    243 
    244         modmap[modkeymap[i]] = 1 << (i / max_keys_per_mod);
    245     }
    246 
    247     return Success;
    248 }
    249 
    250 int
    251 change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
    252               int max_keys_per_mod)
    253 {
    254     int ret;
    255     CARD8 modmap[MAP_LENGTH];
    256     DeviceIntPtr tmp;
    257 
    258     ret = build_modmap_from_modkeymap(modmap, modkeymap, max_keys_per_mod);
    259     if (ret != Success)
    260         return ret;
    261 
    262     /* If we can't perform the change on the requested device, bail out. */
    263     ret = check_modmap_change(client, dev, modmap);
    264     if (ret != Success)
    265         return ret;
    266     do_modmap_change(client, dev, modmap);
    267 
    268     /* Change any attached masters/slaves. */
    269     if (IsMaster(dev)) {
    270         for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
    271             if (!IsMaster(tmp) && GetMaster(tmp, MASTER_KEYBOARD) == dev)
    272                 if (check_modmap_change_slave(client, dev, tmp, modmap))
    273                     do_modmap_change(client, tmp, modmap);
    274         }
    275     }
    276     else if (!IsFloating(dev) &&
    277              GetMaster(dev, MASTER_KEYBOARD)->lastSlave == dev) {
    278         /* If this fails, expect the results to be weird. */
    279         if (check_modmap_change(client, dev->master, modmap) == Success)
    280             do_modmap_change(client, dev->master, modmap);
    281     }
    282 
    283     return Success;
    284 }
    285 
    286 int
    287 generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
    288                    KeyCode **modkeymap_out, int *max_keys_per_mod_out)
    289 {
    290     CARD8 keys_per_mod[8];
    291     int max_keys_per_mod;
    292     KeyCode *modkeymap = NULL;
    293     int i, j, ret;
    294 
    295     ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
    296     if (ret != Success)
    297         return ret;
    298 
    299     if (!dev->key)
    300         return BadMatch;
    301 
    302     /* Count the number of keys per modifier to determine how wide we
    303      * should make the map. */
    304     max_keys_per_mod = 0;
    305     for (i = 0; i < 8; i++)
    306         keys_per_mod[i] = 0;
    307     for (i = 8; i < MAP_LENGTH; i++) {
    308         for (j = 0; j < 8; j++) {
    309             if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
    310                 if (++keys_per_mod[j] > max_keys_per_mod)
    311                     max_keys_per_mod = keys_per_mod[j];
    312             }
    313         }
    314     }
    315 
    316     if (max_keys_per_mod != 0) {
    317         modkeymap = calloc(max_keys_per_mod * 8, sizeof(KeyCode));
    318         if (!modkeymap)
    319             return BadAlloc;
    320 
    321         for (i = 0; i < 8; i++)
    322             keys_per_mod[i] = 0;
    323 
    324         for (i = 8; i < MAP_LENGTH; i++) {
    325             for (j = 0; j < 8; j++) {
    326                 if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
    327                     modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i;
    328                     keys_per_mod[j]++;
    329                 }
    330             }
    331         }
    332     }
    333 
    334     *max_keys_per_mod_out = max_keys_per_mod;
    335     *modkeymap_out = modkeymap;
    336 
    337     return Success;
    338 }
    339 
    340 /**
    341  * Duplicate the InputAttributes in the most obvious way.
    342  * No special memory handling is used to give drivers the maximum
    343  * flexibility with the data. Drivers should be able to call realloc on the
    344  * product string if needed and perform similar operations.
    345  */
    346 InputAttributes *
    347 DuplicateInputAttributes(InputAttributes * attrs)
    348 {
    349     InputAttributes *new_attr;
    350     int ntags = 0;
    351     char **tags, **new_tags;
    352 
    353     if (!attrs)
    354         return NULL;
    355 
    356     if (!(new_attr = calloc(1, sizeof(InputAttributes))))
    357         goto unwind;
    358 
    359     if (attrs->product && !(new_attr->product = strdup(attrs->product)))
    360         goto unwind;
    361     if (attrs->vendor && !(new_attr->vendor = strdup(attrs->vendor)))
    362         goto unwind;
    363     if (attrs->device && !(new_attr->device = strdup(attrs->device)))
    364         goto unwind;
    365     if (attrs->pnp_id && !(new_attr->pnp_id = strdup(attrs->pnp_id)))
    366         goto unwind;
    367     if (attrs->usb_id && !(new_attr->usb_id = strdup(attrs->usb_id)))
    368         goto unwind;
    369 
    370     new_attr->flags = attrs->flags;
    371 
    372     if ((tags = attrs->tags)) {
    373         while (*tags++)
    374             ntags++;
    375 
    376         new_attr->tags = calloc(ntags + 1, sizeof(char *));
    377         if (!new_attr->tags)
    378             goto unwind;
    379 
    380         tags = attrs->tags;
    381         new_tags = new_attr->tags;
    382 
    383         while (*tags) {
    384             *new_tags = strdup(*tags);
    385             if (!*new_tags)
    386                 goto unwind;
    387 
    388             tags++;
    389             new_tags++;
    390         }
    391     }
    392 
    393     return new_attr;
    394 
    395  unwind:
    396     FreeInputAttributes(new_attr);
    397     return NULL;
    398 }
    399 
    400 void
    401 FreeInputAttributes(InputAttributes * attrs)
    402 {
    403     char **tags;
    404 
    405     if (!attrs)
    406         return;
    407 
    408     free(attrs->product);
    409     free(attrs->vendor);
    410     free(attrs->device);
    411     free(attrs->pnp_id);
    412     free(attrs->usb_id);
    413 
    414     if ((tags = attrs->tags))
    415         while (*tags)
    416             free(*tags++);
    417 
    418     free(attrs->tags);
    419     free(attrs);
    420 }
    421 
    422 /**
    423  * Alloc a valuator mask large enough for num_valuators.
    424  */
    425 ValuatorMask *
    426 valuator_mask_new(int num_valuators)
    427 {
    428     /* alloc a fixed size mask for now and ignore num_valuators. in the
    429      * flying-car future, when we can dynamically alloc the masks and are
    430      * not constrained by signals, we can start using num_valuators */
    431     ValuatorMask *mask = calloc(1, sizeof(ValuatorMask));
    432 
    433     if (mask == NULL)
    434         return NULL;
    435 
    436     mask->last_bit = -1;
    437     return mask;
    438 }
    439 
    440 void
    441 valuator_mask_free(ValuatorMask **mask)
    442 {
    443     free(*mask);
    444     *mask = NULL;
    445 }
    446 
    447 /**
    448  * Sets a range of valuators between first_valuator and num_valuators with
    449  * the data in the valuators array. All other values are set to 0.
    450  */
    451 void
    452 valuator_mask_set_range(ValuatorMask *mask, int first_valuator,
    453                         int num_valuators, const int *valuators)
    454 {
    455     int i;
    456 
    457     valuator_mask_zero(mask);
    458 
    459     for (i = first_valuator;
    460          i < min(first_valuator + num_valuators, MAX_VALUATORS); i++)
    461         valuator_mask_set(mask, i, valuators[i - first_valuator]);
    462 }
    463 
    464 /**
    465  * Reset mask to zero.
    466  */
    467 void
    468 valuator_mask_zero(ValuatorMask *mask)
    469 {
    470     memset(mask, 0, sizeof(*mask));
    471     mask->last_bit = -1;
    472 }
    473 
    474 /**
    475  * Returns the current size of the mask (i.e. the highest number of
    476  * valuators currently set + 1).
    477  */
    478 int
    479 valuator_mask_size(const ValuatorMask *mask)
    480 {
    481     return mask->last_bit + 1;
    482 }
    483 
    484 /**
    485  * Returns the number of valuators set in the given mask.
    486  */
    487 int
    488 valuator_mask_num_valuators(const ValuatorMask *mask)
    489 {
    490     return CountBits(mask->mask, min(mask->last_bit + 1, MAX_VALUATORS));
    491 }
    492 
    493 /**
    494  * Return true if the valuator is set in the mask, or false otherwise.
    495  */
    496 int
    497 valuator_mask_isset(const ValuatorMask *mask, int valuator)
    498 {
    499     return mask->last_bit >= valuator && BitIsOn(mask->mask, valuator);
    500 }
    501 
    502 static inline void
    503 _valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
    504 {
    505     mask->last_bit = max(valuator, mask->last_bit);
    506     SetBit(mask->mask, valuator);
    507     mask->valuators[valuator] = data;
    508 }
    509 
    510 /**
    511  * Set the valuator to the given floating-point data.
    512  */
    513 void
    514 valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
    515 {
    516     BUG_WARN_MSG(mask->has_unaccelerated,
    517                  "Do not mix valuator types, zero mask first\n");
    518     _valuator_mask_set_double(mask, valuator, data);
    519 }
    520 
    521 /**
    522  * Set the valuator to the given integer data.
    523  */
    524 void
    525 valuator_mask_set(ValuatorMask *mask, int valuator, int data)
    526 {
    527     valuator_mask_set_double(mask, valuator, data);
    528 }
    529 
    530 /**
    531  * Return the requested valuator value as a double. If the mask bit is not
    532  * set for the given valuator, the returned value is undefined.
    533  */
    534 double
    535 valuator_mask_get_double(const ValuatorMask *mask, int valuator)
    536 {
    537     return mask->valuators[valuator];
    538 }
    539 
    540 /**
    541  * Return the requested valuator value as an integer, rounding towards zero.
    542  * If the mask bit is not set for the given valuator, the returned value is
    543  * undefined.
    544  */
    545 int
    546 valuator_mask_get(const ValuatorMask *mask, int valuator)
    547 {
    548     return trunc(valuator_mask_get_double(mask, valuator));
    549 }
    550 
    551 /**
    552  * Set value to the requested valuator. If the mask bit is set for this
    553  * valuator, value contains the requested valuator value and TRUE is
    554  * returned.
    555  * If the mask bit is not set for this valuator, value is unchanged and
    556  * FALSE is returned.
    557  */
    558 Bool
    559 valuator_mask_fetch_double(const ValuatorMask *mask, int valuator,
    560                            double *value)
    561 {
    562     if (valuator_mask_isset(mask, valuator)) {
    563         *value = valuator_mask_get_double(mask, valuator);
    564         return TRUE;
    565     }
    566     else
    567         return FALSE;
    568 }
    569 
    570 /**
    571  * Set value to the requested valuator. If the mask bit is set for this
    572  * valuator, value contains the requested valuator value and TRUE is
    573  * returned.
    574  * If the mask bit is not set for this valuator, value is unchanged and
    575  * FALSE is returned.
    576  */
    577 Bool
    578 valuator_mask_fetch(const ValuatorMask *mask, int valuator, int *value)
    579 {
    580     if (valuator_mask_isset(mask, valuator)) {
    581         *value = valuator_mask_get(mask, valuator);
    582         return TRUE;
    583     }
    584     else
    585         return FALSE;
    586 }
    587 
    588 /**
    589  * Remove the valuator from the mask.
    590  */
    591 void
    592 valuator_mask_unset(ValuatorMask *mask, int valuator)
    593 {
    594     if (mask->last_bit >= valuator) {
    595         int i, lastbit = -1;
    596 
    597         ClearBit(mask->mask, valuator);
    598         mask->valuators[valuator] = 0.0;
    599         mask->unaccelerated[valuator] = 0.0;
    600 
    601         for (i = 0; i <= mask->last_bit; i++)
    602             if (valuator_mask_isset(mask, i))
    603                 lastbit = max(lastbit, i);
    604         mask->last_bit = lastbit;
    605 
    606         if (mask->last_bit == -1)
    607             mask->has_unaccelerated = FALSE;
    608     }
    609 }
    610 
    611 void
    612 valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src)
    613 {
    614     if (src)
    615         memcpy(dest, src, sizeof(*dest));
    616     else
    617         valuator_mask_zero(dest);
    618 }
    619 
    620 Bool
    621 valuator_mask_has_unaccelerated(const ValuatorMask *mask)
    622 {
    623     return mask->has_unaccelerated;
    624 }
    625 
    626 void
    627 valuator_mask_drop_unaccelerated(ValuatorMask *mask)
    628 {
    629     memset(mask->unaccelerated, 0, sizeof(mask->unaccelerated));
    630     mask->has_unaccelerated = FALSE;
    631 }
    632 
    633 void
    634 valuator_mask_set_absolute_unaccelerated(ValuatorMask *mask,
    635                                          int valuator,
    636                                          int absolute,
    637                                          double unaccel)
    638 {
    639     BUG_WARN_MSG(mask->last_bit != -1 && !mask->has_unaccelerated,
    640                  "Do not mix valuator types, zero mask first\n");
    641     _valuator_mask_set_double(mask, valuator, absolute);
    642     mask->has_unaccelerated = TRUE;
    643     mask->unaccelerated[valuator] = unaccel;
    644 }
    645 
    646 /**
    647  * Set both accelerated and unaccelerated value for this mask.
    648  */
    649 void
    650 valuator_mask_set_unaccelerated(ValuatorMask *mask,
    651                                 int valuator,
    652                                 double accel,
    653                                 double unaccel)
    654 {
    655     BUG_WARN_MSG(mask->last_bit != -1 && !mask->has_unaccelerated,
    656                  "Do not mix valuator types, zero mask first\n");
    657     _valuator_mask_set_double(mask, valuator, accel);
    658     mask->has_unaccelerated = TRUE;
    659     mask->unaccelerated[valuator] = unaccel;
    660 }
    661 
    662 double
    663 valuator_mask_get_accelerated(const ValuatorMask *mask,
    664                               int valuator)
    665 {
    666     return valuator_mask_get_double(mask, valuator);
    667 }
    668 
    669 double
    670 valuator_mask_get_unaccelerated(const ValuatorMask *mask,
    671                                 int valuator)
    672 {
    673     return mask->unaccelerated[valuator];
    674 }
    675 
    676 Bool
    677 valuator_mask_fetch_unaccelerated(const ValuatorMask *mask,
    678                                   int valuator,
    679                                   double *accel,
    680                                   double *unaccel)
    681 {
    682     if (valuator_mask_isset(mask, valuator)) {
    683         if (accel)
    684             *accel = valuator_mask_get_accelerated(mask, valuator);
    685         if (unaccel)
    686             *unaccel = valuator_mask_get_unaccelerated(mask, valuator);
    687         return TRUE;
    688     }
    689     else
    690         return FALSE;
    691 }
    692 
    693 int
    694 CountBits(const uint8_t * mask, int len)
    695 {
    696     int i;
    697     int ret = 0;
    698 
    699     for (i = 0; i < len; i++)
    700         if (BitIsOn(mask, i))
    701             ret++;
    702 
    703     return ret;
    704 }
    705 
    706 /**
    707  * Verifies sanity of the event. If the event is not an internal event,
    708  * memdumps the first 32 bytes of event to the log, a backtrace, then kill
    709  * the server.
    710  */
    711 void
    712 verify_internal_event(const InternalEvent *ev)
    713 {
    714     if (ev && ev->any.header != ET_Internal) {
    715         int i;
    716         const unsigned char *data = (const unsigned char *) ev;
    717 
    718         ErrorF("dix: invalid event type %d\n", ev->any.header);
    719 
    720         for (i = 0; i < sizeof(xEvent); i++, data++) {
    721             ErrorF("%02hhx ", *data);
    722 
    723             if ((i % 8) == 7)
    724                 ErrorF("\n");
    725         }
    726 
    727         xorg_backtrace();
    728         FatalError("Wrong event type %d. Aborting server\n", ev->any.header);
    729     }
    730 }
    731 
    732 /**
    733  * Initializes the given event to zero (or default values), for the given
    734  * device.
    735  */
    736 void
    737 init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms,
    738                   enum DeviceEventSource source_type)
    739 {
    740     memset(event, 0, sizeof(DeviceEvent));
    741     event->header = ET_Internal;
    742     event->length = sizeof(DeviceEvent);
    743     event->time = ms;
    744     event->deviceid = dev->id;
    745     event->sourceid = dev->id;
    746     event->source_type = source_type;
    747 }
    748 
    749 /**
    750  * Initializes the given gesture event to zero (or default values),
    751  * for the given device.
    752  */
    753 void
    754 init_gesture_event(GestureEvent *event, DeviceIntPtr dev, Time ms)
    755 {
    756     memset(event, 0, sizeof(GestureEvent));
    757     event->header = ET_Internal;
    758     event->length = sizeof(GestureEvent);
    759     event->time = ms;
    760     event->deviceid = dev->id;
    761     event->sourceid = dev->id;
    762 }
    763 
    764 int
    765 event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd)
    766 {
    767     int corestate;
    768 
    769     /* core state needs to be assembled BEFORE the device is updated. */
    770     corestate = (kbd &&
    771                  kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->
    772                                                   state) : 0;
    773     corestate |= (mouse && mouse->button) ? (mouse->button->state) : 0;
    774     corestate |= (mouse && mouse->touch) ? (mouse->touch->state) : 0;
    775 
    776     return corestate;
    777 }
    778 
    779 void
    780 event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd, DeviceEvent *event)
    781 {
    782     int i;
    783 
    784     for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
    785         if (BitIsOn(mouse->button->down, i))
    786             SetBit(event->buttons, mouse->button->map[i]);
    787 
    788     if (mouse && mouse->touch && mouse->touch->buttonsDown > 0)
    789         SetBit(event->buttons, mouse->button->map[1]);
    790 
    791     if (kbd && kbd->key) {
    792         XkbStatePtr state;
    793 
    794         /* we need the state before the event happens */
    795         if (event->type == ET_KeyPress || event->type == ET_KeyRelease)
    796             state = &kbd->key->xkbInfo->prev_state;
    797         else
    798             state = &kbd->key->xkbInfo->state;
    799 
    800         event->mods.base = state->base_mods;
    801         event->mods.latched = state->latched_mods;
    802         event->mods.locked = state->locked_mods;
    803         event->mods.effective = state->mods;
    804 
    805         event->group.base = state->base_group;
    806         event->group.latched = state->latched_group;
    807         event->group.locked = state->locked_group;
    808         event->group.effective = state->group;
    809     }
    810 }
    811 
    812 void
    813 event_set_state_gesture(DeviceIntPtr kbd, GestureEvent *event)
    814 {
    815     if (kbd && kbd->key) {
    816         XkbStatePtr state= &kbd->key->xkbInfo->state;
    817 
    818         event->mods.base = state->base_mods;
    819         event->mods.latched = state->latched_mods;
    820         event->mods.locked = state->locked_mods;
    821         event->mods.effective = state->mods;
    822 
    823         event->group.base = state->base_group;
    824         event->group.latched = state->latched_group;
    825         event->group.locked = state->locked_group;
    826         event->group.effective = state->group;
    827     }
    828 }
    829 
    830 /**
    831  * Return the event filter mask for the given device and the given core or
    832  * XI1 protocol type.
    833  */
    834 Mask
    835 event_get_filter_from_type(DeviceIntPtr dev, int evtype)
    836 {
    837     return event_filters[dev ? dev->id : 0][evtype];
    838 }
    839 
    840 /**
    841  * Return the event filter mask for the given device and the given core or
    842  * XI2 protocol type.
    843  */
    844 Mask
    845 event_get_filter_from_xi2type(int evtype)
    846 {
    847     return (1 << (evtype % 8));
    848 }
    849 
    850 Bool
    851 point_on_screen(ScreenPtr pScreen, int x, int y)
    852 {
    853     return x >= pScreen->x && x < pScreen->x + pScreen->width &&
    854         y >= pScreen->y && y < pScreen->y + pScreen->height;
    855 }
    856 
    857 /**
    858  * Update desktop dimensions on the screenInfo struct.
    859  */
    860 void
    861 update_desktop_dimensions(void)
    862 {
    863     int i;
    864     int x1 = INT_MAX, y1 = INT_MAX;     /* top-left */
    865     int x2 = INT_MIN, y2 = INT_MIN;     /* bottom-right */
    866 
    867     for (i = 0; i < screenInfo.numScreens; i++) {
    868         ScreenPtr screen = screenInfo.screens[i];
    869 
    870         x1 = min(x1, screen->x);
    871         y1 = min(y1, screen->y);
    872         x2 = max(x2, screen->x + screen->width);
    873         y2 = max(y2, screen->y + screen->height);
    874     }
    875 
    876     screenInfo.x = x1;
    877     screenInfo.y = y1;
    878     screenInfo.width = x2 - x1;
    879     screenInfo.height = y2 - y1;
    880 }
    881 
    882 /*
    883  * Delete the element with the key from the list, freeing all memory
    884  * associated with the element..
    885  */
    886 static void
    887 input_option_free(InputOption *o)
    888 {
    889     free(o->opt_name);
    890     free(o->opt_val);
    891     free(o->opt_comment);
    892     free(o);
    893 }
    894 
    895 /*
    896  * Create a new InputOption with the key/value pair provided.
    897  * If a list is provided, the new options is added to the list and the list
    898  * is returned.
    899  *
    900  * If a new option is added to a list that already contains that option, the
    901  * previous option is overwritten.
    902  *
    903  * @param list The list to add to.
    904  * @param key Option key, will be copied.
    905  * @param value Option value, will be copied.
    906  *
    907  * @return If list is not NULL, the list with the new option added. If list
    908  * is NULL, a new option list with one element. On failure, NULL is
    909  * returned.
    910  */
    911 InputOption *
    912 input_option_new(InputOption *list, const char *key, const char *value)
    913 {
    914     InputOption *opt = NULL;
    915 
    916     if (!key)
    917         return NULL;
    918 
    919     if (list) {
    920         nt_list_for_each_entry(opt, list, list.next) {
    921             if (strcmp(input_option_get_key(opt), key) == 0) {
    922                 input_option_set_value(opt, value);
    923                 return list;
    924             }
    925         }
    926     }
    927 
    928     opt = calloc(1, sizeof(InputOption));
    929     if (!opt)
    930         return NULL;
    931 
    932     nt_list_init(opt, list.next);
    933     input_option_set_key(opt, key);
    934     input_option_set_value(opt, value);
    935 
    936     if (list) {
    937         nt_list_append(opt, list, InputOption, list.next);
    938 
    939         return list;
    940     }
    941     else
    942         return opt;
    943 }
    944 
    945 InputOption *
    946 input_option_free_element(InputOption *list, const char *key)
    947 {
    948     InputOption *element;
    949 
    950     nt_list_for_each_entry(element, list, list.next) {
    951         if (strcmp(input_option_get_key(element), key) == 0) {
    952             nt_list_del(element, list, InputOption, list.next);
    953 
    954             input_option_free(element);
    955             break;
    956         }
    957     }
    958     return list;
    959 }
    960 
    961 /**
    962  * Free the list pointed at by opt.
    963  */
    964 void
    965 input_option_free_list(InputOption **opt)
    966 {
    967     InputOption *element, *tmp;
    968 
    969     nt_list_for_each_entry_safe(element, tmp, *opt, list.next) {
    970         nt_list_del(element, *opt, InputOption, list.next);
    971 
    972         input_option_free(element);
    973     }
    974     *opt = NULL;
    975 }
    976 
    977 /**
    978  * Find the InputOption with the given option name.
    979  *
    980  * @return The InputOption or NULL if not present.
    981  */
    982 InputOption *
    983 input_option_find(InputOption *list, const char *key)
    984 {
    985     InputOption *element;
    986 
    987     nt_list_for_each_entry(element, list, list.next) {
    988         if (strcmp(input_option_get_key(element), key) == 0)
    989             return element;
    990     }
    991 
    992     return NULL;
    993 }
    994 
    995 const char *
    996 input_option_get_key(const InputOption *opt)
    997 {
    998     return opt->opt_name;
    999 }
   1000 
   1001 const char *
   1002 input_option_get_value(const InputOption *opt)
   1003 {
   1004     return opt->opt_val;
   1005 }
   1006 
   1007 void
   1008 input_option_set_key(InputOption *opt, const char *key)
   1009 {
   1010     free(opt->opt_name);
   1011     if (key)
   1012         opt->opt_name = strdup(key);
   1013 }
   1014 
   1015 void
   1016 input_option_set_value(InputOption *opt, const char *value)
   1017 {
   1018     free(opt->opt_val);
   1019     if (value)
   1020         opt->opt_val = strdup(value);
   1021 }
   1022 
   1023 /* FP1616/FP3232 conversion functions.
   1024  * Fixed point types are encoded as signed integral and unsigned frac. So any
   1025  * negative number -n.m is encoded as floor(n) + (1 - 0.m).
   1026  */
   1027 double
   1028 fp1616_to_double(FP1616 in)
   1029 {
   1030     return pixman_fixed_to_double(in);
   1031 }
   1032 
   1033 double
   1034 fp3232_to_double(FP3232 in)
   1035 {
   1036     double ret;
   1037 
   1038     ret = (double) in.integral;
   1039     ret += (double) in.frac * (1.0 / (1ULL << 32));     /* Optimized: ldexp((double)in.frac, -32); */
   1040     return ret;
   1041 }
   1042 
   1043 FP1616
   1044 double_to_fp1616(double in)
   1045 {
   1046     return pixman_double_to_fixed(in);
   1047 }
   1048 
   1049 FP3232
   1050 double_to_fp3232(double in)
   1051 {
   1052     FP3232 ret;
   1053     int32_t integral;
   1054     double tmp;
   1055     uint32_t frac_d;
   1056 
   1057     tmp = floor(in);
   1058     integral = (int32_t) tmp;
   1059 
   1060     tmp = (in - integral) * (1ULL << 32);       /* Optimized: ldexp(in - integral, 32) */
   1061     frac_d = (uint32_t) tmp;
   1062 
   1063     ret.integral = integral;
   1064     ret.frac = frac_d;
   1065     return ret;
   1066 }
   1067 
   1068 /**
   1069  * DO NOT USE THIS FUNCTION. It only exists for the test cases. Use
   1070  * xi2mask_new() instead to get the standard sized masks.
   1071  *
   1072  * @param nmasks The number of masks (== number of devices)
   1073  * @param size The size of the masks in bytes
   1074  * @return The new mask or NULL on allocation error.
   1075  */
   1076 XI2Mask *
   1077 xi2mask_new_with_size(size_t nmasks, size_t size)
   1078 {
   1079     int i;
   1080     int alloc_size;
   1081     unsigned char *cursor;
   1082     XI2Mask *mask;
   1083 
   1084     alloc_size = sizeof(struct _XI2Mask)
   1085 	       + nmasks * sizeof(unsigned char *)
   1086 	       + nmasks * size;
   1087 
   1088     mask = calloc(1, alloc_size);
   1089 
   1090     if (!mask)
   1091         return NULL;
   1092 
   1093     mask->nmasks = nmasks;
   1094     mask->mask_size = size;
   1095 
   1096     mask->masks = (unsigned char **)(mask + 1);
   1097     cursor = (unsigned char *)(mask + 1) + nmasks * sizeof(unsigned char *);
   1098 
   1099     for (i = 0; i < nmasks; i++) {
   1100         mask->masks[i] = cursor;
   1101 	cursor += size;
   1102     }
   1103     return mask;
   1104 }
   1105 
   1106 /**
   1107  * Create a new XI2 mask of the standard size, i.e. for all devices + fake
   1108  * devices and for the highest supported XI2 event type.
   1109  *
   1110  * @return The new mask or NULL on allocation error.
   1111  */
   1112 XI2Mask *
   1113 xi2mask_new(void)
   1114 {
   1115     return xi2mask_new_with_size(EMASKSIZE, XI2MASKSIZE);
   1116 }
   1117 
   1118 /**
   1119  * Frees memory associated with mask and resets mask to NULL.
   1120  */
   1121 void
   1122 xi2mask_free(XI2Mask **mask)
   1123 {
   1124     if (!(*mask))
   1125         return;
   1126 
   1127     free((*mask));
   1128     *mask = NULL;
   1129 }
   1130 
   1131 /**
   1132  * Test if the bit for event type is set for this device only.
   1133  *
   1134  * @return TRUE if the bit is set, FALSE otherwise
   1135  */
   1136 Bool
   1137 xi2mask_isset_for_device(XI2Mask *mask, const DeviceIntPtr dev, int event_type)
   1138 {
   1139     BUG_WARN(dev->id < 0);
   1140     BUG_WARN(dev->id >= mask->nmasks);
   1141     BUG_WARN(bits_to_bytes(event_type + 1) > mask->mask_size);
   1142 
   1143     return BitIsOn(mask->masks[dev->id], event_type);
   1144 }
   1145 
   1146 /**
   1147  * Test if the bit for event type is set for this device, or the
   1148  * XIAllDevices/XIAllMasterDevices (if applicable) is set.
   1149  *
   1150  * @return TRUE if the bit is set, FALSE otherwise
   1151  */
   1152 Bool
   1153 xi2mask_isset(XI2Mask *mask, const DeviceIntPtr dev, int event_type)
   1154 {
   1155     int set = 0;
   1156 
   1157     if (xi2mask_isset_for_device(mask, inputInfo.all_devices, event_type))
   1158         set = 1;
   1159     else if (xi2mask_isset_for_device(mask, dev, event_type))
   1160         set = 1;
   1161     else if (IsMaster(dev) && xi2mask_isset_for_device(mask, inputInfo.all_master_devices, event_type))
   1162         set = 1;
   1163 
   1164     return set;
   1165 }
   1166 
   1167 /**
   1168  * Set the mask bit for this event type for this device.
   1169  */
   1170 void
   1171 xi2mask_set(XI2Mask *mask, int deviceid, int event_type)
   1172 {
   1173     BUG_WARN(deviceid < 0);
   1174     BUG_WARN(deviceid >= mask->nmasks);
   1175     BUG_WARN(bits_to_bytes(event_type + 1) > mask->mask_size);
   1176 
   1177     SetBit(mask->masks[deviceid], event_type);
   1178 }
   1179 
   1180 /**
   1181  * Zero out the xi2mask, for the deviceid given. If the deviceid is < 0, all
   1182  * masks are zeroed.
   1183  */
   1184 void
   1185 xi2mask_zero(XI2Mask *mask, int deviceid)
   1186 {
   1187     int i;
   1188 
   1189     BUG_WARN(deviceid > 0 && deviceid >= mask->nmasks);
   1190 
   1191     if (deviceid >= 0)
   1192         memset(mask->masks[deviceid], 0, mask->mask_size);
   1193     else
   1194         for (i = 0; i < mask->nmasks; i++)
   1195             memset(mask->masks[i], 0, mask->mask_size);
   1196 }
   1197 
   1198 /**
   1199  * Merge source into dest, i.e. dest |= source.
   1200  * If the masks are of different size, only the overlapping section is merged.
   1201  */
   1202 void
   1203 xi2mask_merge(XI2Mask *dest, const XI2Mask *source)
   1204 {
   1205     int i, j;
   1206 
   1207     for (i = 0; i < min(dest->nmasks, source->nmasks); i++)
   1208         for (j = 0; j < min(dest->mask_size, source->mask_size); j++)
   1209             dest->masks[i][j] |= source->masks[i][j];
   1210 }
   1211 
   1212 /**
   1213  * @return The number of masks in mask
   1214  */
   1215 size_t
   1216 xi2mask_num_masks(const XI2Mask *mask)
   1217 {
   1218     return mask->nmasks;
   1219 }
   1220 
   1221 /**
   1222  * @return The size of each mask in bytes
   1223  */
   1224 size_t
   1225 xi2mask_mask_size(const XI2Mask *mask)
   1226 {
   1227     return mask->mask_size;
   1228 }
   1229 
   1230 /**
   1231  * Set the mask for the given deviceid to the source mask.
   1232  * If the mask given is larger than the target memory, only the overlapping
   1233  * parts are copied.
   1234  */
   1235 void
   1236 xi2mask_set_one_mask(XI2Mask *xi2mask, int deviceid, const unsigned char *mask,
   1237                      size_t mask_size)
   1238 {
   1239     BUG_WARN(deviceid < 0);
   1240     BUG_WARN(deviceid >= xi2mask->nmasks);
   1241 
   1242     memcpy(xi2mask->masks[deviceid], mask, min(xi2mask->mask_size, mask_size));
   1243 }
   1244 
   1245 /**
   1246  * Get a reference to the XI2mask for this particular device.
   1247  */
   1248 const unsigned char *
   1249 xi2mask_get_one_mask(const XI2Mask *mask, int deviceid)
   1250 {
   1251     BUG_WARN(deviceid < 0);
   1252     BUG_WARN(deviceid >= mask->nmasks);
   1253 
   1254     return mask->masks[deviceid];
   1255 }
   1256 
   1257 /**
   1258  * Copies a sprite data from src to dst sprites.
   1259  *
   1260  * Returns FALSE on error.
   1261  */
   1262 Bool
   1263 CopySprite(SpritePtr src, SpritePtr dst)
   1264 {
   1265     WindowPtr *trace;
   1266     if (src->spriteTraceGood > dst->spriteTraceSize) {
   1267         trace = reallocarray(dst->spriteTrace,
   1268                              src->spriteTraceSize, sizeof(*trace));
   1269         if (!trace) {
   1270             dst->spriteTraceGood = 0;
   1271             return FALSE;
   1272         }
   1273         dst->spriteTrace = trace;
   1274         dst->spriteTraceSize = src->spriteTraceGood;
   1275     }
   1276     memcpy(dst->spriteTrace, src->spriteTrace,
   1277            src->spriteTraceGood * sizeof(*trace));
   1278     dst->spriteTraceGood = src->spriteTraceGood;
   1279     return TRUE;
   1280 }