1 #include "e_illume_private.h"
2 #include "e_mod_kbd_device.h"
4 /* local function prototypes */
5 static void _e_mod_kbd_device_ignore_load(void);
6 static void _e_mod_kbd_device_ignore_load_file(const char *file);
7 static void _e_mod_kbd_device_kbd_add(const char *udi);
8 static void _e_mod_kbd_device_kbd_del(const char *udi);
9 static void _e_mod_kbd_device_kbd_eval(void);
12 static void _e_mod_kbd_device_udev_event(const char *device, Eeze_Udev_Event event, void *data __UNUSED__, Eeze_Udev_Watch *watch __UNUSED__);
15 static void _e_mod_kbd_device_cb_input_kbd(void *data __UNUSED__, void *reply, DBusError *err);
16 static void _e_mod_kbd_device_cb_input_kbd_is(void *data, void *reply, DBusError *err);
17 static void _e_mod_kbd_device_dbus_add(void *data __UNUSED__, DBusMessage *msg);
18 static void _e_mod_kbd_device_dbus_del(void *data __UNUSED__, DBusMessage *msg);
19 static void _e_mod_kbd_device_dbus_chg(void *data __UNUSED__, DBusMessage *msg);
23 static int have_real_kbd = 0;
25 static Eeze_Udev_Watch *watch;
27 static E_DBus_Connection *_dbus_conn = NULL;
28 static E_DBus_Signal_Handler *_dev_add = NULL;
29 static E_DBus_Signal_Handler *_dev_del = NULL;
30 static E_DBus_Signal_Handler *_dev_chg = NULL;
32 static Eina_List *_device_kbds = NULL, *_ignore_kbds = NULL;
35 e_mod_kbd_device_init(void)
37 /* load the 'ignored' keyboard file */
38 _e_mod_kbd_device_ignore_load();
41 watch = eeze_udev_watch_add(EEZE_UDEV_TYPE_KEYBOARD, EEZE_UDEV_EVENT_NONE,
42 _e_mod_kbd_device_udev_event, NULL);
46 /* try to attach to the system dbus */
47 if (!(_dbus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM))) return;
49 /* ask HAL for any input keyboards */
50 e_hal_manager_find_device_by_capability(_dbus_conn, "input.keyboard",
51 _e_mod_kbd_device_cb_input_kbd, NULL);
53 /* setup dbus signal handlers for when a device gets added/removed/changed */
55 e_dbus_signal_handler_add(_dbus_conn, E_HAL_SENDER,
57 E_HAL_MANAGER_INTERFACE,
58 "DeviceAdded", _e_mod_kbd_device_dbus_add, NULL);
60 e_dbus_signal_handler_add(_dbus_conn, E_HAL_SENDER,
62 E_HAL_MANAGER_INTERFACE,
63 "DeviceRemoved", _e_mod_kbd_device_dbus_del, NULL);
65 e_dbus_signal_handler_add(_dbus_conn, E_HAL_SENDER,
67 E_HAL_MANAGER_INTERFACE,
68 "NewCapability", _e_mod_kbd_device_dbus_chg, NULL);
73 e_mod_kbd_device_shutdown(void)
78 if (watch) eeze_udev_watch_del(watch);
81 /* remove the dbus signal handlers if we can */
82 if (_dev_add) e_dbus_signal_handler_del(_dbus_conn, _dev_add);
83 if (_dev_del) e_dbus_signal_handler_del(_dbus_conn, _dev_del);
84 if (_dev_chg) e_dbus_signal_handler_del(_dbus_conn, _dev_chg);
88 /* free the list of ignored keyboards */
89 EINA_LIST_FREE(_ignore_kbds, str)
90 eina_stringshare_del(str);
92 /* free the list of keyboards */
93 EINA_LIST_FREE(_device_kbds, str)
94 eina_stringshare_del(str);
99 _e_mod_kbd_device_ignore_load(void)
103 /* load the 'ignore' file from the user's home dir */
104 e_user_dir_concat_static(buff, "keyboards/ignore_built_in_keyboards");
105 _e_mod_kbd_device_ignore_load_file(buff);
107 /* load the 'ignore' file from the system/module dir */
108 snprintf(buff, sizeof(buff),
109 "%s/ignore_built_in_keyboards", _e_illume_mod_dir);
110 _e_mod_kbd_device_ignore_load_file(buff);
114 _e_mod_kbd_device_ignore_load_file(const char *file)
119 /* can this file be opened */
120 if (!(f = fopen(file, "r"))) return;
122 /* parse out the info in the ignore file */
123 while (fgets(buff, sizeof(buff), f))
128 if (buff[0] == '#') continue;
132 if (buff[len - 1] == '\n') buff[len - 1] = 0;
135 while (isspace(*p)) p++;
137 /* append this kbd to the ignore list */
141 eina_list_append(_ignore_kbds, eina_stringshare_add(p));
149 _e_mod_kbd_device_udev_event(const char *device, Eeze_Udev_Event event, void *data __UNUSED__, Eeze_Udev_Watch *watch __UNUSED__)
151 if ((!device) || (!event)) return;
153 if (((event & EEZE_UDEV_EVENT_ADD) == EEZE_UDEV_EVENT_ADD) ||
154 ((event & EEZE_UDEV_EVENT_ONLINE) == EEZE_UDEV_EVENT_ONLINE))
155 _e_mod_kbd_device_kbd_add(device);
156 else if (((event & EEZE_UDEV_EVENT_REMOVE) == EEZE_UDEV_EVENT_REMOVE) ||
157 ((event & EEZE_UDEV_EVENT_OFFLINE) == EEZE_UDEV_EVENT_OFFLINE))
158 _e_mod_kbd_device_kbd_del(device);
160 _e_mod_kbd_device_kbd_eval();
164 _e_mod_kbd_device_cb_input_kbd(void *data __UNUSED__, void *reply, DBusError *err)
166 E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply;
170 if ((!ret) || (!ret->strings)) return;
172 /* if dbus errored then cleanup and get out */
173 if (dbus_error_is_set(err))
175 dbus_error_free(err);
179 /* for each returned keyboard, add it and evaluate it */
180 EINA_LIST_FOREACH(ret->strings, l, dev)
182 _e_mod_kbd_device_kbd_add(dev);
183 _e_mod_kbd_device_kbd_eval();
188 _e_mod_kbd_device_cb_input_kbd_is(void *data, void *reply, DBusError *err)
190 E_Hal_Device_Query_Capability_Return *ret = reply;
193 /* if dbus errored then cleanup and get out */
194 if (dbus_error_is_set(err))
196 dbus_error_free(err);
200 /* if it's an input keyboard, than add it and eval */
201 if ((ret) && (ret->boolean))
205 _e_mod_kbd_device_kbd_add(udi);
206 _e_mod_kbd_device_kbd_eval();
212 _e_mod_kbd_device_dbus_add(void *data __UNUSED__, DBusMessage *msg)
217 dbus_error_init(&err);
218 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
219 e_hal_device_query_capability(_dbus_conn, udi, "input.keyboard",
220 _e_mod_kbd_device_cb_input_kbd_is, udi);
224 _e_mod_kbd_device_dbus_del(void *data __UNUSED__, DBusMessage *msg)
229 dbus_error_init(&err);
230 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
233 _e_mod_kbd_device_kbd_del(udi);
234 _e_mod_kbd_device_kbd_eval();
239 _e_mod_kbd_device_dbus_chg(void *data __UNUSED__, DBusMessage *msg)
244 dbus_error_init(&err);
245 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi,
246 DBUS_TYPE_STRING, &cap, DBUS_TYPE_INVALID);
249 if (!strcmp(cap, "input.keyboard"))
253 _e_mod_kbd_device_kbd_add(udi);
254 _e_mod_kbd_device_kbd_eval();
262 _e_mod_kbd_device_kbd_add(const char *udi)
268 EINA_LIST_FOREACH(_device_kbds, l, str)
269 if (!strcmp(str, udi)) return;
270 _device_kbds = eina_list_append(_device_kbds, eina_stringshare_add(udi));
274 _e_mod_kbd_device_kbd_del(const char *udi)
280 EINA_LIST_FOREACH(_device_kbds, l, str)
281 if (!strcmp(str, udi))
283 eina_stringshare_del(str);
284 _device_kbds = eina_list_remove_list(_device_kbds, l);
290 _e_mod_kbd_device_kbd_eval(void)
296 have_real = eina_list_count(_device_kbds);
297 EINA_LIST_FOREACH(_device_kbds, l, g)
298 EINA_LIST_FOREACH(_ignore_kbds, ll, gg)
299 if (e_util_glob_match(g, gg))
305 if (have_real != have_real_kbd)
307 have_real_kbd = have_real;
309 // if (have_real_kbd) e_mod_kbd_disable();
312 // e_mod_kbd_enable();