1/*
2 * Copyright 2004-2012, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		J��r��me Duval
7 */
8
9
10#include "Keymap.h"
11
12#include <ByteOrder.h>
13#include <File.h>
14#include <InputServerTypes.h>
15#include <Message.h>
16#include <input_globals.h>
17
18#include <errno.h>
19#include <new>
20#include <stdlib.h>
21#include <stdio.h>
22#include <string.h>
23
24
25static void
26print_key(char* chars, int32 offset, bool last = false)
27{
28	int size = chars[offset++];
29
30	switch (size) {
31		case 0:
32			// Not mapped
33			fputs("N/A", stdout);
34			break;
35
36		case 1:
37			// single-byte UTF-8/ASCII character
38			fputc(chars[offset], stdout);
39			break;
40
41		default:
42		{
43			// 2-, 3-, or 4-byte UTF-8 character
44			char* str = new (std::nothrow) char[size + 1];
45			if (str == NULL)
46				break;
47
48			strncpy(str, &(chars[offset]), size);
49			str[size] = 0;
50			fputs(str, stdout);
51			delete [] str;
52			break;
53		}
54	}
55
56	if (!last)
57		fputs("\t", stdout);
58}
59
60
61//	#pragma mark -
62
63
64Keymap::Keymap()
65{
66	RetrieveCurrent();
67}
68
69
70Keymap::~Keymap()
71{
72}
73
74
75void
76Keymap::DumpKeymap()
77{
78	if (fKeys.version != 3)
79		return;
80
81	// Print a chart of the normal, shift, control, option, option+shift,
82	// Caps, Caps+shift, Caps+option, and Caps+option+shift keys.
83	puts("Key #\tn\ts\tc\to\tos\tC\tCs\tCo\tCos\n");
84
85	for (uint8 i = 0; i < 128; i++) {
86		printf(" 0x%02x\t", i);
87		print_key(fChars, fKeys.normal_map[i]);
88		print_key(fChars, fKeys.shift_map[i]);
89		print_key(fChars, fKeys.control_map[i]);
90		print_key(fChars, fKeys.option_map[i]);
91		print_key(fChars, fKeys.option_shift_map[i]);
92		print_key(fChars, fKeys.caps_map[i]);
93		print_key(fChars, fKeys.caps_shift_map[i]);
94		print_key(fChars, fKeys.option_caps_map[i]);
95		print_key(fChars, fKeys.option_caps_shift_map[i], true);
96		fputs("\n", stdout);
97	}
98}
99
100
101status_t
102Keymap::RetrieveCurrent()
103{
104	Unset();
105
106	key_map* keys;
107	_get_key_map(&keys, &fChars, (ssize_t*)&fCharsSize);
108	if (!keys) {
109		fprintf(stderr, "error while getting current keymap!\n");
110		return B_ERROR;
111	}
112
113	memcpy(&fKeys, keys, sizeof(fKeys));
114	free(keys);
115	return B_OK;
116}
117
118