4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 1985,1997-1998 by Sun Microsystems, Inc.
24 * All rights reserved.
28 * This file is used by the code of a virtual user input device
29 * (vuid) state maintainence package (see ../sundev/vuid_event.h for a
30 * description of what vuid is) and is private to that implementation.
31 * It implements the interface defined by ../sunwindowdev/vuid_state.h.
34 #ifndef _SYS_VUID_STORE_H
35 #define _SYS_VUID_STORE_H
37 #pragma ident "%Z%%M% %I% %E% SMI"
44 * The typical struct vuid_seg state list contains 2 segments:
46 * First, the VKEY_FIRST segment with four values in its list,
47 * LOC_*_ABSOLUTE and LOC_*_DELTA. The rest of the values are
48 * booleans. The vuid storage package know to update the
49 * LOC_*_ABSOLUTE value when its gets a LOC_*_DELTA and visa
51 * The ascii/meta segment has all booleans.
53 * The implementation is skewed to optimize the space usage but
54 * still be efficient in terms of accessing short vuid_value lists
55 * (e.g., during high volume mouse tracking) and gang requests
56 * about the state of shift buttons.
60 * A component of virutal user input device (vuid) state storage.
61 * A struct vuid_value holds a single non-boolean value.
63 typedef struct vuid_value
{
64 struct vuid_value
*next
; /* Next node in list */
65 ushort_t offset
; /* Offset of value from seg addr */
66 int value
; /* Value */
68 #define VUID_VALUE_NULL ((Vuid_value *)0)
71 #define VUID_BIT_ARRAY_SIZE (VUID_SEG_SIZE/((sizeof (char))*BITSPERBYTE))
73 * A component of virutal user input device (vuid) state storage.
74 * A struct vuid_seg contains all the values for a vuid segment.
75 * Neither the vuid_seg list or the vuid_value list will be sorted
76 * unless a performance problem is identified. As a new event is
77 * sent to vuid_set_value, so the lists grow.
79 typedef struct vuid_seg
{
80 struct vuid_seg
*next
; /* Next state segment in list */
81 ushort_t addr
; /* Starting address of segment */
82 char booleans
[VUID_BIT_ARRAY_SIZE
];
83 /* Up/down value of boolean codes */
84 char ints
[VUID_BIT_ARRAY_SIZE
];
86 struct vuid_value
*list
; /* Linked list of values of */
87 /* non-boolean codes. If a code is */
88 /* in this list, the boolean value is */
89 /* ignored and the corresponding bit */
90 /* in values is on. */
92 #define VUID_SEG_NULL ((Vuid_seg *)0)
93 #define vuid_cstate_to_state(cstate) ((Vuid_seg *)cstate)
95 #define vuid_set_boolean_bit(seg, offset) \
96 (seg)->booleans[(offset)/BITSPERBYTE] |= \
97 (1<<((BITSPERBYTE-1)-((offset)%BITSPERBYTE)))
98 #define vuid_clear_boolean_bit(seg, offset) \
99 (seg)->booleans[(offset)/BITSPERBYTE] &= \
100 (~(1<<((BITSPERBYTE-1)-((offset)%BITSPERBYTE))))
101 #define vuid_get_boolean_bit(seg, offset) \
102 ((seg)->booleans[(offset)/BITSPERBYTE] & \
103 (1<<((BITSPERBYTE-1)-((offset)%BITSPERBYTE))))
105 #define vuid_set_int_bit(seg, offset) \
106 (seg)->ints[(offset)/BITSPERBYTE] |= \
107 (1<<((BITSPERBYTE-1)-((offset)%BITSPERBYTE)))
108 #define vuid_clear_int_bit(seg, offset) \
109 (seg)->ints[(offset)/BITSPERBYTE] &= \
110 (~(1<<((BITSPERBYTE-1)-((offset)%BITSPERBYTE))))
111 #define vuid_get_int_bit(seg, offset) \
112 ((seg)->ints[(offset)/BITSPERBYTE] & \
113 (1<<((BITSPERBYTE-1)-((offset)%BITSPERBYTE))))
119 #endif /* _SYS_VUID_STORE_H */