input: shuffle headers and includes
[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 "eloop.h"
54
55 struct kmscon_input;
56
57 struct kmscon_input_event {
58         uint16_t keycode;  /* linux keycode - KEY_* - linux/input.h */
59         uint32_t keysym;   /* X keysym - XK_* - X11/keysym.h */
60         uint8_t modifiers; /* xkbcommon modifiers - XKB_COMMON_*_MASK */
61         uint32_t unicode;  /* UCS-4 unicode value, 0 if none */
62 };
63
64 typedef void (*kmscon_input_cb) (struct kmscon_input *input,
65                                 struct kmscon_input_event *ev, void *data);
66
67 /*
68  * These are the values sent by the kernel in the /value/ field of the
69  * /input_event/ struct.
70  * See Documentation/input/event-codes.txt in the kernel tree.
71  */
72 enum kmscon_key_state {
73         KMSCON_KEY_RELEASED = 0,
74         KMSCON_KEY_PRESSED = 1,
75         KMSCON_KEY_REPEATED = 2,
76 };
77
78 int kmscon_input_new(struct kmscon_input **out);
79 void kmscon_input_ref(struct kmscon_input *input);
80 void kmscon_input_unref(struct kmscon_input *input);
81
82 int kmscon_input_connect_eloop(struct kmscon_input *input,
83                 struct kmscon_eloop *eloop, kmscon_input_cb cb, void *data);
84 void kmscon_input_disconnect_eloop(struct kmscon_input *input);
85
86 void kmscon_input_sleep(struct kmscon_input *input);
87 void kmscon_input_wake_up(struct kmscon_input *input);
88 bool kmscon_input_is_asleep(struct kmscon_input *input);
89
90 #endif /* KMSCON_INPUT_H */