xref: /openbsd-src/sbin/wsconsctl/keysym.c (revision 75cfcc04ef7473142d9b57ba202c36fcbb5adbc2)
1*75cfcc04Stedu /*	$OpenBSD: keysym.c,v 1.8 2015/02/15 01:56:16 tedu Exp $	*/
2e0b2c52dSmickey /*	$NetBSD: keysym.c,v 1.3 1999/02/08 11:08:23 hannken Exp $ */
3e0b2c52dSmickey 
4e0b2c52dSmickey /*-
5e0b2c52dSmickey  * Copyright (c) 1998 The NetBSD Foundation, Inc.
6e0b2c52dSmickey  * All rights reserved.
7e0b2c52dSmickey  *
8e0b2c52dSmickey  * This code is derived from software contributed to The NetBSD Foundation
9e0b2c52dSmickey  * by Juergen Hannken-Illjes.
10e0b2c52dSmickey  *
11e0b2c52dSmickey  * Redistribution and use in source and binary forms, with or without
12e0b2c52dSmickey  * modification, are permitted provided that the following conditions
13e0b2c52dSmickey  * are met:
14e0b2c52dSmickey  * 1. Redistributions of source code must retain the above copyright
15e0b2c52dSmickey  *    notice, this list of conditions and the following disclaimer.
16e0b2c52dSmickey  * 2. Redistributions in binary form must reproduce the above copyright
17e0b2c52dSmickey  *    notice, this list of conditions and the following disclaimer in the
18e0b2c52dSmickey  *    documentation and/or other materials provided with the distribution.
19e0b2c52dSmickey  *
20e0b2c52dSmickey  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21e0b2c52dSmickey  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22e0b2c52dSmickey  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23e0b2c52dSmickey  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24e0b2c52dSmickey  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25e0b2c52dSmickey  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26e0b2c52dSmickey  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27e0b2c52dSmickey  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28e0b2c52dSmickey  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29e0b2c52dSmickey  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30e0b2c52dSmickey  * POSSIBILITY OF SUCH DAMAGE.
31e0b2c52dSmickey  */
32e0b2c52dSmickey 
33e0b2c52dSmickey #include <dev/wscons/wsksymdef.h>
34e0b2c52dSmickey #include <stdio.h>
35e0b2c52dSmickey #include <stdlib.h>
36b1b7cd8fSdavid #include <string.h>
37e0b2c52dSmickey #include <unistd.h>
38e0b2c52dSmickey #include "keysym.h"
39e0b2c52dSmickey #include "wsconsctl.h"
40e0b2c52dSmickey 
41e0b2c52dSmickey #define NUMKSYMS	(sizeof(ksym_tab_by_name)/sizeof(ksym_tab_by_name[0]))
42e0b2c52dSmickey 
43e0b2c52dSmickey static int first_time = 1;
44e0b2c52dSmickey static struct ksym ksym_tab_by_ksym[NUMKSYMS];
45fb9de198Smaja static int encoding = KEYSYM_ENC_ISO;
46e0b2c52dSmickey 
47e0b2c52dSmickey /* copied from dev/wscons/wskbdutil.c ... */
48e0b2c52dSmickey 
49e0b2c52dSmickey static const u_char latin1_to_upper[256] = {
50e0b2c52dSmickey /*      0  8  1  9  2  a  3  b  4  c  5  d  6  e  7  f               */
51e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 0 */
52e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 0 */
53e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 1 */
54e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 1 */
55e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 2 */
56e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 2 */
57e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 3 */
58e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 3 */
59e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 4 */
60e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 4 */
61e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 5 */
62e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 5 */
63e0b2c52dSmickey 	0x00,  'A',  'B',  'C',  'D',  'E',  'F',  'G',		/* 6 */
64e0b2c52dSmickey 	 'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',		/* 6 */
65e0b2c52dSmickey 	 'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',		/* 7 */
66e0b2c52dSmickey 	 'X',  'Y',  'Z', 0x00, 0x00, 0x00, 0x00, 0x00,		/* 7 */
67e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 8 */
68e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 8 */
69e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 9 */
70e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* 9 */
71e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* a */
72e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* a */
73e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* b */
74e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* b */
75e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* c */
76e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* c */
77e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* d */
78e0b2c52dSmickey 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		/* d */
79e0b2c52dSmickey 	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,		/* e */
80e0b2c52dSmickey 	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,		/* e */
81e0b2c52dSmickey 	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00,		/* f */
82e0b2c52dSmickey 	0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x00,		/* f */
83e0b2c52dSmickey };
84e0b2c52dSmickey 
85c72b5b24Smillert static void sort_ksym_tab(void);
86e0b2c52dSmickey 
87e0b2c52dSmickey static int
cmp_name(const void * a,const void * b)88*75cfcc04Stedu cmp_name(const void *a, const void *b)
89e0b2c52dSmickey {
90e0b2c52dSmickey 	return(strcmp(((struct ksym *) a)->name, ((struct ksym *) b)->name));
91e0b2c52dSmickey }
92e0b2c52dSmickey 
93e0b2c52dSmickey static int
cmp_ksym(const void * a,const void * b)94*75cfcc04Stedu cmp_ksym(const void *a, const void *b)
95e0b2c52dSmickey {
96fb9de198Smaja 	int i;
97fb9de198Smaja 
98fb9de198Smaja 	i=((struct ksym *) b)->value - ((struct ksym *) a)->value;
99fb9de198Smaja 	if (i == 0) {
100fb9de198Smaja 		i=((struct ksym *) a)->enc - ((struct ksym *) b)->enc;
101fb9de198Smaja 	}
102fb9de198Smaja 	return(i);
103e0b2c52dSmickey }
104e0b2c52dSmickey 
105e0b2c52dSmickey static void
sort_ksym_tab(void)106594ced23Sderaadt sort_ksym_tab(void)
107e0b2c52dSmickey {
108e0b2c52dSmickey 	int i;
109e0b2c52dSmickey 
110e0b2c52dSmickey 	for (i = 0; i < NUMKSYMS; i++)
111e0b2c52dSmickey 		ksym_tab_by_ksym[i] = ksym_tab_by_name[i];
112e0b2c52dSmickey 
113*75cfcc04Stedu 	qsort(ksym_tab_by_name, NUMKSYMS, sizeof(struct ksym), cmp_name);
114*75cfcc04Stedu 	qsort(ksym_tab_by_ksym, NUMKSYMS, sizeof(struct ksym), cmp_ksym);
115e0b2c52dSmickey 
116e0b2c52dSmickey 	first_time = 0;
117e0b2c52dSmickey }
118e0b2c52dSmickey 
119e0b2c52dSmickey char *
ksym2name(int k)120594ced23Sderaadt ksym2name(int k)
121e0b2c52dSmickey {
122e0b2c52dSmickey 	static char tmp[20];
123e0b2c52dSmickey 	struct ksym *r;
124*75cfcc04Stedu 	struct ksym key;
125e0b2c52dSmickey 
126e0b2c52dSmickey 	if (first_time)
127e0b2c52dSmickey 		sort_ksym_tab();
128e0b2c52dSmickey 
129*75cfcc04Stedu 	key.value = k;
130*75cfcc04Stedu 	key.enc = encoding;
131*75cfcc04Stedu 	r = bsearch(&key, ksym_tab_by_ksym,
132*75cfcc04Stedu 		    NUMKSYMS, sizeof(struct ksym), cmp_ksym);
133fb9de198Smaja 
134fb9de198Smaja 	if (r == NULL) {
135*75cfcc04Stedu 		key.enc = KEYSYM_ENC_ISO;
136*75cfcc04Stedu 		r = bsearch(&key, ksym_tab_by_ksym,
137*75cfcc04Stedu 			    NUMKSYMS, sizeof(struct ksym), cmp_ksym);
138fb9de198Smaja 	}
139e0b2c52dSmickey 
140e0b2c52dSmickey 	if (r != NULL)
141e0b2c52dSmickey 		return(r->name);
142e0b2c52dSmickey 	else {
143e0b2c52dSmickey 		snprintf(tmp, sizeof(tmp), "unknown_%d", k);
144e0b2c52dSmickey 		return(tmp);
145e0b2c52dSmickey 	}
146e0b2c52dSmickey }
147e0b2c52dSmickey 
148e0b2c52dSmickey int
name2ksym(char * n)149594ced23Sderaadt name2ksym(char *n)
150e0b2c52dSmickey {
151e0b2c52dSmickey 	int res;
152e0b2c52dSmickey 	struct ksym *r;
153*75cfcc04Stedu 	struct ksym key;
154e0b2c52dSmickey 
155e0b2c52dSmickey 	if (first_time)
156e0b2c52dSmickey 		sort_ksym_tab();
157e0b2c52dSmickey 
158*75cfcc04Stedu 	key.name = n;
159*75cfcc04Stedu 	r = bsearch(&key, ksym_tab_by_name,
160*75cfcc04Stedu 		    NUMKSYMS, sizeof(struct ksym), cmp_name);
161e0b2c52dSmickey 
162e0b2c52dSmickey 	if (r != NULL)
163e0b2c52dSmickey 		return(r->value);
164e0b2c52dSmickey 	else if (sscanf(n, "unknown_%d", &res) == 1)
165e0b2c52dSmickey 		return(res);
166e0b2c52dSmickey 	else
167e0b2c52dSmickey 		return(-1);
168e0b2c52dSmickey }
169e0b2c52dSmickey 
170fb9de198Smaja void
ksymenc(int enc)171fb9de198Smaja ksymenc(int enc)
172fb9de198Smaja {
173fb9de198Smaja 	switch(KB_ENCODING(enc)) {
174fb9de198Smaja 	case KB_HU:
175fb9de198Smaja 	case KB_PL:
176fb9de198Smaja 	case KB_SI:
177fb9de198Smaja 		encoding=KEYSYM_ENC_L2;
178fb9de198Smaja 		break;
179fb9de198Smaja 	case KB_TR:
180fb9de198Smaja 		encoding=KEYSYM_ENC_L5;
181fb9de198Smaja 		break;
182fb9de198Smaja 	case KB_LT:
183fb9de198Smaja 	case KB_LV:
184fb9de198Smaja 		encoding=KEYSYM_ENC_L7;
185fb9de198Smaja 		break;
186fb9de198Smaja 	case KB_RU:
187fb9de198Smaja 	case KB_UA:
188fb9de198Smaja 		encoding=KEYSYM_ENC_KOI;
189fb9de198Smaja 		break;
190fb9de198Smaja 	default:
191fb9de198Smaja 		encoding=KEYSYM_ENC_ISO;
192fb9de198Smaja 		break;
193fb9de198Smaja 	}
194fb9de198Smaja }
195fb9de198Smaja 
196e0b2c52dSmickey keysym_t
ksym_upcase(keysym_t ksym)197594ced23Sderaadt ksym_upcase(keysym_t ksym)
198e0b2c52dSmickey {
199e0b2c52dSmickey 	if (ksym >= KS_f1 && ksym <= KS_f20)
200e0b2c52dSmickey 		return(KS_F1 - KS_f1 + ksym);
201e0b2c52dSmickey 
202e0b2c52dSmickey 	if (KS_GROUP(ksym) == KS_GROUP_Ascii && ksym <= 0xff &&
203e0b2c52dSmickey 	    latin1_to_upper[ksym] != 0x00)
204e0b2c52dSmickey 		return(latin1_to_upper[ksym]);
205e0b2c52dSmickey 
206e0b2c52dSmickey 	return(ksym);
207e0b2c52dSmickey }
208