input: use libxkbcommon to convert input events
[platform/upstream/kmscon.git] / src / input.h
1 /*
2  * kmscon - udev input hotplug and evdev handling
3  *
4  * Copyright (c) 2011 Ran Benita <ran234@gmail.com>
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files
8  * (the "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included
15  * in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25
26 /*
27  * This module provides an input object which can deliver all useful input
28  * events to the program.
29  *
30  * Its use should be as simple as the following (but also see below):
31  * - Create a new input object.
32  * - Provide a callback function to receive the events.
33  * - Connect the input object to a kmscon_eloop.
34  * - Wake up the input object to begin receiving input events through the
35  *   event loop.
36  *
37  * A few things to note:
38  * - This module uses evdev for input, and reads from input devices directly.
39  *   This requires root privileges; waking up the input object will fail
40  *   without them.
41  * - evdev  has no inhert notion of "focus" like tty input. In other words,
42  *   it will deliver input events whether they are intended for the program
43  *   or not. This may also pose a security risk. Therefore, make sure to put
44  *   the object to sleep when the program is not active, for example by
45  *   reacting to VT changes.
46  */
47
48 #ifndef KMSCON_INPUT_H
49 #define KMSCON_INPUT_H
50
51 #include <inttypes.h>
52 #include <stdbool.h>
53 #include <X11/extensions/XKBcommon.h>
54 #include <X11/keysym.h>
55 #include "eloop.h"
56
57 struct kmscon_input;
58
59 struct kmscon_input_event {
60         uint16_t keycode;  /* linux keycode - KEY_* - linux/input.h */
61         uint32_t keysym;   /* X keysym - XK_* - X11/keysym.h */
62         uint8_t modifiers; /* xkbcommon modifiers - XKB_COMMON_*_MASK */
63         uint32_t unicode;  /* UCS-4 unicode value, 0 if none */
64 };
65
66 typedef void (*kmscon_input_cb) (struct kmscon_input *input,
67                                 struct kmscon_input_event *ev, void *data);
68
69 int kmscon_input_new(struct kmscon_input **out);
70 void kmscon_input_ref(struct kmscon_input *input);
71 void kmscon_input_unref(struct kmscon_input *input);
72
73 int kmscon_input_connect_eloop(struct kmscon_input *input,
74                 struct kmscon_eloop *eloop, kmscon_input_cb cb, void *data);
75 void kmscon_input_disconnect_eloop(struct kmscon_input *input);
76
77 void kmscon_input_sleep(struct kmscon_input *input);
78 void kmscon_input_wake_up(struct kmscon_input *input);
79 bool kmscon_input_is_asleep(struct kmscon_input *input);
80
81 #endif /* KMSCON_INPUT_H */