1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
30 #include <linux/input.h>
33 #include <systemd/sd-bus.h>
34 #include <systemd/sd-event.h>
35 #include <xkbcommon/xkbcommon.h>
38 typedef struct idev_data idev_data;
39 typedef struct idev_data_evdev idev_data_evdev;
40 typedef struct idev_data_keyboard idev_data_keyboard;
42 typedef struct idev_event idev_event;
43 typedef struct idev_device idev_device;
44 typedef struct idev_session idev_session;
45 typedef struct idev_context idev_context;
65 struct idev_data_evdev {
66 struct input_event event;
76 IDEV_KBDMOD_IDX_SHIFT,
79 IDEV_KBDMOD_IDX_LINUX,
83 IDEV_KBDMOD_SHIFT = 1 << IDEV_KBDMOD_IDX_SHIFT,
84 IDEV_KBDMOD_CTRL = 1 << IDEV_KBDMOD_IDX_CTRL,
85 IDEV_KBDMOD_ALT = 1 << IDEV_KBDMOD_IDX_ALT,
86 IDEV_KBDMOD_LINUX = 1 << IDEV_KBDMOD_IDX_LINUX,
87 IDEV_KBDMOD_CAPS = 1 << IDEV_KBDMOD_IDX_CAPS,
93 IDEV_KBDLED_IDX_SCROLL,
96 IDEV_KBDLED_NUM = 1 << IDEV_KBDLED_IDX_NUM,
97 IDEV_KBDLED_CAPS = 1 << IDEV_KBDLED_IDX_CAPS,
98 IDEV_KBDLED_SCROLL = 1 << IDEV_KBDLED_IDX_SCROLL,
101 struct idev_data_keyboard {
102 struct xkb_state *xkb_state;
107 uint32_t consumed_mods;
110 uint32_t *codepoints;
113 static inline bool idev_kbdmatch(idev_data_keyboard *kdata,
114 uint32_t mods, uint32_t n_syms,
115 const uint32_t *syms) {
116 const uint32_t significant = IDEV_KBDMOD_SHIFT |
122 if (n_syms != kdata->n_syms)
125 real = kdata->mods & ~kdata->consumed_mods & significant;
129 return !memcmp(syms, kdata->keysyms, n_syms * sizeof(*syms));
132 #define IDEV_KBDMATCH(_kdata, _mods, _sym) \
133 idev_kbdmatch((_kdata), (_mods), 1, (const uint32_t[]){ (_sym) })
151 idev_data_evdev evdev;
152 idev_data_keyboard keyboard;
161 IDEV_EVENT_DEVICE_ADD,
162 IDEV_EVENT_DEVICE_REMOVE,
163 IDEV_EVENT_DEVICE_DATA,
172 } device_add, device_remove;
181 typedef int (*idev_event_fn) (idev_session *s, void *userdata, idev_event *ev);
187 void idev_device_enable(idev_device *d);
188 void idev_device_disable(idev_device *d);
195 IDEV_SESSION_CUSTOM = (1 << 0),
196 IDEV_SESSION_MANAGED = (1 << 1),
199 int idev_session_new(idev_session **out,
203 idev_event_fn event_fn,
205 idev_session *idev_session_free(idev_session *s);
207 DEFINE_TRIVIAL_CLEANUP_FUNC(idev_session*, idev_session_free);
209 bool idev_session_is_enabled(idev_session *s);
210 void idev_session_enable(idev_session *s);
211 void idev_session_disable(idev_session *s);
213 int idev_session_add_evdev(idev_session *s, struct udev_device *ud);
214 int idev_session_remove_evdev(idev_session *s, struct udev_device *ud);
220 int idev_context_new(idev_context **out, sd_event *event, sd_bus *sysbus);
221 idev_context *idev_context_ref(idev_context *c);
222 idev_context *idev_context_unref(idev_context *c);
224 DEFINE_TRIVIAL_CLEANUP_FUNC(idev_context*, idev_context_unref);