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/>.
29 #include <linux/input.h>
31 #include <systemd/sd-bus.h>
32 #include <systemd/sd-event.h>
33 #include <xkbcommon/xkbcommon.h>
35 typedef struct idev_data idev_data;
36 typedef struct idev_data_evdev idev_data_evdev;
37 typedef struct idev_data_keyboard idev_data_keyboard;
39 typedef struct idev_event idev_event;
40 typedef struct idev_device idev_device;
41 typedef struct idev_session idev_session;
42 typedef struct idev_context idev_context;
62 struct idev_data_evdev {
63 struct input_event event;
73 IDEV_KBDMOD_IDX_SHIFT,
76 IDEV_KBDMOD_IDX_LINUX,
80 IDEV_KBDMOD_SHIFT = 1 << IDEV_KBDMOD_IDX_SHIFT,
81 IDEV_KBDMOD_CTRL = 1 << IDEV_KBDMOD_IDX_CTRL,
82 IDEV_KBDMOD_ALT = 1 << IDEV_KBDMOD_IDX_ALT,
83 IDEV_KBDMOD_LINUX = 1 << IDEV_KBDMOD_IDX_LINUX,
84 IDEV_KBDMOD_CAPS = 1 << IDEV_KBDMOD_IDX_CAPS,
90 IDEV_KBDLED_IDX_SCROLL,
93 IDEV_KBDLED_NUM = 1 << IDEV_KBDLED_IDX_NUM,
94 IDEV_KBDLED_CAPS = 1 << IDEV_KBDLED_IDX_CAPS,
95 IDEV_KBDLED_SCROLL = 1 << IDEV_KBDLED_IDX_SCROLL,
98 struct idev_data_keyboard {
99 struct xkb_state *xkb_state;
104 uint32_t consumed_mods;
107 uint32_t *codepoints;
110 static inline bool idev_kbdmatch(idev_data_keyboard *kdata,
111 uint32_t mods, uint32_t n_syms,
112 const uint32_t *syms) {
113 const uint32_t significant = IDEV_KBDMOD_SHIFT |
119 if (n_syms != kdata->n_syms)
122 real = kdata->mods & ~kdata->consumed_mods & significant;
126 return !memcmp(syms, kdata->keysyms, n_syms * sizeof(*syms));
129 #define IDEV_KBDMATCH(_kdata, _mods, _sym) \
130 idev_kbdmatch((_kdata), (_mods), 1, (const uint32_t[]){ (_sym) })
148 idev_data_evdev evdev;
149 idev_data_keyboard keyboard;
158 IDEV_EVENT_DEVICE_ADD,
159 IDEV_EVENT_DEVICE_REMOVE,
160 IDEV_EVENT_DEVICE_DATA,
169 } device_add, device_remove;
178 typedef int (*idev_event_fn) (idev_session *s, void *userdata, idev_event *ev);
184 void idev_device_enable(idev_device *d);
185 void idev_device_disable(idev_device *d);
192 IDEV_SESSION_CUSTOM = (1 << 0),
193 IDEV_SESSION_MANAGED = (1 << 1),
196 int idev_session_new(idev_session **out,
200 idev_event_fn event_fn,
202 idev_session *idev_session_free(idev_session *s);
204 DEFINE_TRIVIAL_CLEANUP_FUNC(idev_session*, idev_session_free);
206 bool idev_session_is_enabled(idev_session *s);
207 void idev_session_enable(idev_session *s);
208 void idev_session_disable(idev_session *s);
210 int idev_session_add_evdev(idev_session *s, struct udev_device *ud);
211 int idev_session_remove_evdev(idev_session *s, struct udev_device *ud);
217 int idev_context_new(idev_context **out, sd_event *event, sd_bus *sysbus);
218 idev_context *idev_context_ref(idev_context *c);
219 idev_context *idev_context_unref(idev_context *c);
221 DEFINE_TRIVIAL_CLEANUP_FUNC(idev_context*, idev_context_unref);