xi2.c revision ed6184df
135c4bbdfSmrg/**
235c4bbdfSmrg * Copyright © 2011 Red Hat, Inc.
335c4bbdfSmrg *
435c4bbdfSmrg *  Permission is hereby granted, free of charge, to any person obtaining a
535c4bbdfSmrg *  copy of this software and associated documentation files (the "Software"),
635c4bbdfSmrg *  to deal in the Software without restriction, including without limitation
735c4bbdfSmrg *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
835c4bbdfSmrg *  and/or sell copies of the Software, and to permit persons to whom the
935c4bbdfSmrg *  Software is furnished to do so, subject to the following conditions:
1035c4bbdfSmrg *
1135c4bbdfSmrg *  The above copyright notice and this permission notice (including the next
1235c4bbdfSmrg *  paragraph) shall be included in all copies or substantial portions of the
1335c4bbdfSmrg *  Software.
1435c4bbdfSmrg *
1535c4bbdfSmrg *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1635c4bbdfSmrg *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1735c4bbdfSmrg *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1835c4bbdfSmrg *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1935c4bbdfSmrg *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2035c4bbdfSmrg *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2135c4bbdfSmrg *  DEALINGS IN THE SOFTWARE.
2235c4bbdfSmrg */
2335c4bbdfSmrg
24ed6184dfSmrg/* Test relies on assert() */
25ed6184dfSmrg#undef NDEBUG
26ed6184dfSmrg
2735c4bbdfSmrg#ifdef HAVE_DIX_CONFIG_H
2835c4bbdfSmrg#include <dix-config.h>
2935c4bbdfSmrg#endif
3035c4bbdfSmrg
3135c4bbdfSmrg#include <stdint.h>
3235c4bbdfSmrg#include "inpututils.h"
3335c4bbdfSmrg#include "inputstr.h"
3435c4bbdfSmrg#include "assert.h"
3535c4bbdfSmrg
361b5d61b8Smrg#include "protocol-common.h"
371b5d61b8Smrg
381b5d61b8SmrgClientRec client_window;
391b5d61b8Smrg
4035c4bbdfSmrgstatic void
4135c4bbdfSmrgxi2mask_test(void)
4235c4bbdfSmrg{
4335c4bbdfSmrg    XI2Mask *xi2mask = NULL, *mergemask = NULL;
4435c4bbdfSmrg    unsigned char *mask;
4535c4bbdfSmrg    DeviceIntRec dev;
4635c4bbdfSmrg    DeviceIntRec all_devices, all_master_devices;
4735c4bbdfSmrg    int i;
4835c4bbdfSmrg
4935c4bbdfSmrg    all_devices.id = XIAllDevices;
5035c4bbdfSmrg    inputInfo.all_devices = &all_devices;
5135c4bbdfSmrg    all_master_devices.id = XIAllMasterDevices;
5235c4bbdfSmrg    inputInfo.all_master_devices = &all_master_devices;
5335c4bbdfSmrg
5435c4bbdfSmrg    /* size >= nmasks * 2 for the test cases below */
5535c4bbdfSmrg    xi2mask = xi2mask_new_with_size(MAXDEVICES + 2, (MAXDEVICES + 2) * 2);
5635c4bbdfSmrg    assert(xi2mask);
5735c4bbdfSmrg    assert(xi2mask->nmasks > 0);
5835c4bbdfSmrg    assert(xi2mask->mask_size > 0);
5935c4bbdfSmrg
6035c4bbdfSmrg    assert(xi2mask_mask_size(xi2mask) == xi2mask->mask_size);
6135c4bbdfSmrg    assert(xi2mask_num_masks(xi2mask) == xi2mask->nmasks);
6235c4bbdfSmrg
6335c4bbdfSmrg    mask = calloc(1, xi2mask_mask_size(xi2mask));
6435c4bbdfSmrg    /* ensure zeros */
6535c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(xi2mask); i++) {
6635c4bbdfSmrg        const unsigned char *m = xi2mask_get_one_mask(xi2mask, i);
6735c4bbdfSmrg
6835c4bbdfSmrg        assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0);
6935c4bbdfSmrg    }
7035c4bbdfSmrg
7135c4bbdfSmrg    /* set various bits */
7235c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(xi2mask); i++) {
7335c4bbdfSmrg        const unsigned char *m;
7435c4bbdfSmrg
7535c4bbdfSmrg        xi2mask_set(xi2mask, i, i);
7635c4bbdfSmrg
7735c4bbdfSmrg        dev.id = i;
7835c4bbdfSmrg        assert(xi2mask_isset(xi2mask, &dev, i));
7935c4bbdfSmrg
8035c4bbdfSmrg        m = xi2mask_get_one_mask(xi2mask, i);
8135c4bbdfSmrg        SetBit(mask, i);
8235c4bbdfSmrg        assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0);
8335c4bbdfSmrg        ClearBit(mask, i);
8435c4bbdfSmrg    }
8535c4bbdfSmrg
8635c4bbdfSmrg    /* ensure zeros one-by-one */
8735c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(xi2mask); i++) {
8835c4bbdfSmrg        const unsigned char *m = xi2mask_get_one_mask(xi2mask, i);
8935c4bbdfSmrg
9035c4bbdfSmrg        assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) != 0);
9135c4bbdfSmrg        xi2mask_zero(xi2mask, i);
9235c4bbdfSmrg        assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0);
9335c4bbdfSmrg    }
9435c4bbdfSmrg
9535c4bbdfSmrg    /* re-set, zero all */
9635c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(xi2mask); i++)
9735c4bbdfSmrg        xi2mask_set(xi2mask, i, i);
9835c4bbdfSmrg    xi2mask_zero(xi2mask, -1);
9935c4bbdfSmrg
10035c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(xi2mask); i++) {
10135c4bbdfSmrg        const unsigned char *m = xi2mask_get_one_mask(xi2mask, i);
10235c4bbdfSmrg
10335c4bbdfSmrg        assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0);
10435c4bbdfSmrg    }
10535c4bbdfSmrg
10635c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(xi2mask); i++) {
10735c4bbdfSmrg        const unsigned char *m;
10835c4bbdfSmrg
10935c4bbdfSmrg        SetBit(mask, i);
11035c4bbdfSmrg        xi2mask_set_one_mask(xi2mask, i, mask, xi2mask_mask_size(xi2mask));
11135c4bbdfSmrg        m = xi2mask_get_one_mask(xi2mask, i);
11235c4bbdfSmrg        assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0);
11335c4bbdfSmrg        ClearBit(mask, i);
11435c4bbdfSmrg    }
11535c4bbdfSmrg
11635c4bbdfSmrg    mergemask = xi2mask_new_with_size(MAXDEVICES + 2, (MAXDEVICES + 2) * 2);
11735c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(mergemask); i++) {
11835c4bbdfSmrg        dev.id = i;
11935c4bbdfSmrg        xi2mask_set(mergemask, i, i * 2);
12035c4bbdfSmrg    }
12135c4bbdfSmrg
12235c4bbdfSmrg    /* xi2mask still has all i bits set, should now also have all i * 2 bits */
12335c4bbdfSmrg    xi2mask_merge(xi2mask, mergemask);
12435c4bbdfSmrg    for (i = 0; i < xi2mask_num_masks(mergemask); i++) {
12535c4bbdfSmrg        const unsigned char *m = xi2mask_get_one_mask(xi2mask, i);
12635c4bbdfSmrg
12735c4bbdfSmrg        SetBit(mask, i);
12835c4bbdfSmrg        SetBit(mask, i * 2);
12935c4bbdfSmrg        assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0);
13035c4bbdfSmrg        ClearBit(mask, i);
13135c4bbdfSmrg        ClearBit(mask, i * 2);
13235c4bbdfSmrg    }
13335c4bbdfSmrg
13435c4bbdfSmrg    xi2mask_free(&xi2mask);
13535c4bbdfSmrg    assert(xi2mask == NULL);
13635c4bbdfSmrg
13735c4bbdfSmrg    xi2mask_free(&mergemask);
13835c4bbdfSmrg    assert(mergemask == NULL);
13935c4bbdfSmrg    free(mask);
14035c4bbdfSmrg}
14135c4bbdfSmrg
14235c4bbdfSmrgint
1431b5d61b8Smrgxi2_test(void)
14435c4bbdfSmrg{
14535c4bbdfSmrg    xi2mask_test();
14635c4bbdfSmrg
14735c4bbdfSmrg    return 0;
14835c4bbdfSmrg}
149