1 #include "e_devicemgr_private.h"
4 #define E_DEVMGR_CYNARA_ERROR_CHECK_GOTO(func_name, ret, label) \
7 if (EINA_UNLIKELY(CYNARA_API_SUCCESS != ret)) \
9 _e_devicemgr_util_cynara_log(func_name, ret); \
16 _e_devicemgr_util_cynara_log(const char *func_name, int err)
18 #define CYNARA_BUFSIZE 128
19 char buf[CYNARA_BUFSIZE] = "\0";
22 ret = cynara_strerror(err, buf, CYNARA_BUFSIZE);
23 if (ret != CYNARA_API_SUCCESS)
25 DMDBG("Failed to cynara_strerror: %d (error log about %s: %d)\n", ret, func_name, err);
28 DMDBG("%s is failed: %s\n", func_name, buf);
32 _e_devicemgr_util_do_privilege_check(struct wl_client *client, int socket_fd, const char *rule)
35 char *clientSmack=NULL, *uid=NULL, *client_session=NULL;
36 Eina_Bool res = EINA_FALSE;
38 /* If initialization of cynara has been failed, let's not to do further permission checks. */
39 if (e_devicemgr->wl_data->p_cynara == NULL && e_devicemgr->wl_data->cynara_initialized) return EINA_TRUE;
40 if (socket_fd < 0) return EINA_FALSE;
42 ret = cynara_creds_socket_get_client(socket_fd, CLIENT_METHOD_SMACK, &clientSmack);
43 E_DEVMGR_CYNARA_ERROR_CHECK_GOTO("cynara_creds_socket_get_client", ret, finish);
45 ret = cynara_creds_socket_get_user(socket_fd, USER_METHOD_UID, &uid);
46 E_DEVMGR_CYNARA_ERROR_CHECK_GOTO("cynara_creds_socket_get_user", ret, finish);
48 ret = cynara_creds_socket_get_pid(socket_fd, &pid);
49 E_DEVMGR_CYNARA_ERROR_CHECK_GOTO("cynara_creds_socket_get_pid", ret, finish);
51 client_session = cynara_session_from_pid(pid);
53 ret = cynara_check(e_devicemgr->wl_data->p_cynara, clientSmack, client_session, uid, rule);
55 if (CYNARA_API_ACCESS_ALLOWED == ret)
59 E_FREE(client_session);
68 _e_devicemgr_wl_device_cb_axes_select(struct wl_client *client, struct wl_resource *resource, struct wl_array *axes)
74 _e_devicemgr_wl_device_cb_release(struct wl_client *client, struct wl_resource *resource)
76 wl_resource_destroy(resource);
79 static const struct tizen_input_device_interface _e_devicemgr_wl_device_interface =
81 _e_devicemgr_wl_device_cb_axes_select,
82 _e_devicemgr_wl_device_cb_release,
86 _e_devicemgr_wl_device_cb_unbind(struct wl_resource *resource)
88 E_Devicemgr_Input_Device *dev;
89 E_Devicemgr_Input_Device_User_Data *device_user_data;
90 E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
92 DMDBG("Unbind tizen_input_device: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
93 if (!(device_user_data = wl_resource_get_user_data(resource))) return;
95 mgr_data = device_user_data->mgr_data;
98 mgr_data->user_data_list = eina_list_remove(mgr_data->user_data_list, device_user_data);
101 dev = device_user_data->dev;
103 device_user_data->dev = NULL;
104 device_user_data->dev_mgr_res = NULL;
105 device_user_data->seat_res = NULL;
106 device_user_data->dev_res = NULL;
107 device_user_data->mgr_data = NULL;
108 E_FREE(device_user_data);
109 wl_resource_set_user_data(resource, NULL);
112 dev->resources = eina_list_remove(dev->resources, resource);
116 e_devicemgr_wl_device_update(E_Devicemgr_Input_Device *dev)
118 struct wl_array axes;
120 struct wl_resource *res;
122 wl_array_init(&axes);
124 EINA_LIST_FOREACH(dev->resources, l, res)
126 tizen_input_device_send_device_info(res, dev->name, dev->clas, dev->subclas, &axes);
131 e_devicemgr_wl_device_add(E_Devicemgr_Input_Device *dev)
133 struct wl_resource *res, *seat_res, *dev_mgr_res;
136 struct wl_client *wc;
137 E_Devicemgr_Input_Device_User_Data *device_user_data;
138 struct wl_array axes;
139 E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
140 E_Comp_Wl_Seat *seat_data;
142 /* TODO: find the seat corresponding to event */
143 serial = wl_display_next_serial(e_comp_wl->wl.disp);
144 wl_array_init(&axes);
146 EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_res)
148 seat_data = wl_resource_get_user_data(seat_res);
149 if (!seat_data) continue;
150 if (!seat_data->is_first_resource)
152 DMDBG("The seat (res:%d) is not the first resource bound to client (%p)",
153 wl_resource_get_id(seat_res), wl_resource_get_client(seat_res));
157 wc = wl_resource_get_client(seat_res);
159 EINA_LIST_FOREACH(e_devicemgr->wl_data->mgr_data_list, ll, mgr_data)
161 dev_mgr_res = mgr_data->resource;
162 if (wl_resource_get_client(dev_mgr_res) != wc) continue;
163 if (!mgr_data->is_first_resource)
165 DMDBG("This device_manager (res:%d) not the first resource bound to client (%p)",
166 wl_resource_get_id(dev_mgr_res), wc);
169 res = wl_resource_create(wc, &tizen_input_device_interface, 1, 0);
172 DMERR("Could not create tizen_input_device resource");
173 wl_client_post_no_memory(wc);
177 device_user_data = E_NEW(E_Devicemgr_Input_Device_User_Data, 1);
178 if (!device_user_data)
180 DMERR("Failed to allocate memory for input device user data\n");
181 wl_client_post_no_memory(wc);
182 wl_resource_destroy(res);
185 device_user_data->dev = dev;
186 device_user_data->dev_mgr_res = dev_mgr_res;
187 device_user_data->seat_res = seat_res;
188 device_user_data->dev_res = res;
189 device_user_data->mgr_data = mgr_data;
191 dev->resources = eina_list_append(dev->resources, res);
192 mgr_data->user_data_list = eina_list_append(mgr_data->user_data_list, device_user_data);
194 wl_resource_set_implementation(res, &_e_devicemgr_wl_device_interface, device_user_data,
195 _e_devicemgr_wl_device_cb_unbind);
196 tizen_input_device_manager_send_device_add(dev_mgr_res, serial, dev->identifier, res, seat_res);
197 tizen_input_device_send_device_info(res, dev->name, dev->clas, dev->subclas, &axes);
203 e_devicemgr_wl_device_del(E_Devicemgr_Input_Device *dev)
205 struct wl_client *wc;
206 Eina_List *l, *ll, *lll;
207 struct wl_resource *res, *seat_res, *dev_mgr_res;
209 E_Devicemgr_Input_Device_User_Data *device_user_data;
210 E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
212 serial = wl_display_next_serial(e_comp_wl->wl.disp);
214 /* TODO: find the seat corresponding to event */
215 EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_res)
217 wc = wl_resource_get_client(seat_res);
218 EINA_LIST_FOREACH(e_devicemgr->wl_data->mgr_data_list, ll, mgr_data)
220 dev_mgr_res = mgr_data->resource;
221 if (wl_resource_get_client(dev_mgr_res) != wc) continue;
222 EINA_LIST_FOREACH(dev->resources, lll, res)
224 if (wl_resource_get_client(res) != wc) continue;
225 device_user_data = wl_resource_get_user_data(res);
226 if (!device_user_data) continue;
227 if (device_user_data->dev_mgr_res != dev_mgr_res)
229 if (device_user_data->seat_res != seat_res)
232 device_user_data->dev = NULL;
233 tizen_input_device_manager_send_device_remove(dev_mgr_res, serial, dev->identifier, res, seat_res);
238 dev->resources = eina_list_free(dev->resources);
242 e_devicemgr_wl_detent_send_event(int detent)
244 E_Devicemgr_Input_Device *input_dev;
245 struct wl_resource *dev_res;
246 struct wl_client *wc;
251 ec = e_client_focused_get();
254 if (e_object_is_del(E_OBJECT(ec))) return;
255 if (ec->ignored) return;
256 if (!ec->comp_data || !ec->comp_data->surface) return;
258 f_value = wl_fixed_from_double(detent * 1.0);
259 wc = wl_resource_get_client(ec->comp_data->surface);
261 EINA_LIST_FOREACH(e_devicemgr->device_list, l, input_dev)
263 if (!strncmp(input_dev->name, DETENT_DEVICE_NAME, sizeof(DETENT_DEVICE_NAME)))
265 EINA_LIST_FOREACH(input_dev->resources, ll, dev_res)
267 if (wl_resource_get_client(dev_res) != wc) continue;
268 tizen_input_device_send_axis(dev_res, TIZEN_INPUT_DEVICE_AXIS_TYPE_DETENT, f_value);
270 DMINF("DETENT : %d => E_Client: %p (pid: %d) (pname: %s)",
271 detent, ec, ec->netwm.pid, e_client_util_name_get(ec));
278 e_devicemgr_wl_block_send_expired(struct wl_resource *resource)
280 if (!resource) return;
281 tizen_input_device_manager_send_block_expired(resource);
285 e_devicemgr_wl_touch_max_count_send(int slot, struct wl_resource *res, struct wl_resource *seat_res)
287 struct wl_resource *seat_resource, *dev_mgr_resource;
290 struct wl_client *wc;
291 E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
293 serial = wl_display_next_serial(e_comp_wl->wl.disp);
297 if (wl_resource_get_version(res) < 4) return;
298 tizen_input_device_manager_send_max_touch_count(res, serial, slot, seat_res);
302 EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_resource)
304 wc = wl_resource_get_client(seat_resource);
306 EINA_LIST_FOREACH(e_devicemgr->wl_data->mgr_data_list, ll, mgr_data)
308 dev_mgr_resource = mgr_data->resource;
309 if (wl_resource_get_client(dev_mgr_resource) != wc) continue;
310 if (wl_resource_get_version(dev_mgr_resource) < 4) continue;
311 tizen_input_device_manager_send_max_touch_count(dev_mgr_resource, serial, slot, seat_resource);
318 e_devicemgr_wl_generator_with_sync_send_event(struct wl_resource *resource, int result)
320 if (!resource) return;
321 DMDBG("Init Generator with sync. send result: %d", result);
322 tizen_input_device_manager_send_error(resource, result);
326 _e_devicemgr_wl_cb_block_events(struct wl_client *client, struct wl_resource *resource, uint32_t serial, uint32_t clas, uint32_t duration)
328 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
331 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
332 "http://tizen.org/privilege/internal/inputdevice.block"))
334 DMERR("block_events request:priv check failed");
335 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
340 ret = e_devicemgr_block_add(client, resource, clas, duration);
341 tizen_input_device_manager_send_error(resource, ret);
345 _e_devicemgr_wl_cb_unblock_events(struct wl_client *client, struct wl_resource *resource, uint32_t serial)
350 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
351 "http://tizen.org/privilege/internal/inputdevice.block"))
353 DMERR("unblock_events request:priv check failed");
354 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
359 ret = e_devicemgr_block_remove(client);
360 tizen_input_device_manager_send_error(resource, ret);
364 _e_devicemgr_wl_cb_init_generator(struct wl_client *client, struct wl_resource *resource, uint32_t clas)
366 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
369 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
370 "http://tizen.org/privilege/inputgenerator"))
372 DMERR("init_generator request:priv check failed");
373 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
378 ret = e_devicemgr_inputgen_add(client, resource, clas, INPUT_GENERATOR_DEVICE);
379 tizen_input_device_manager_send_error(resource, ret);
383 _e_devicemgr_wl_cb_init_generator_with_name(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name)
385 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
388 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
389 "http://tizen.org/privilege/inputgenerator"))
391 DMERR("init_generator_with_name request:priv check failed");
392 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
397 ret = e_devicemgr_inputgen_add(client, resource, clas, name);
398 tizen_input_device_manager_send_error(resource, ret);
402 _e_devicemgr_wl_cb_init_generator_with_sync(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name)
405 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
406 "http://tizen.org/privilege/inputgenerator"))
408 DMERR("_e_devicemgr_wl_cb_init_generator_with_sync request:priv check failed");
409 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
414 e_devicemgr_inputgen_add_with_sync(client, resource, clas, name);
418 _e_devicemgr_wl_cb_deinit_generator(struct wl_client *client, struct wl_resource *resource, uint32_t clas)
420 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
423 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
424 "http://tizen.org/privilege/inputgenerator"))
426 DMERR("deinit_generator request:priv check failed");
427 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
432 e_devicemgr_inputgen_remove(client, resource, clas);
433 tizen_input_device_manager_send_error(resource, ret);
437 _e_devicemgr_wl_cb_generate_key(struct wl_client *client, struct wl_resource *resource, const char *keyname, uint32_t pressed)
439 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
442 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
443 "http://tizen.org/privilege/inputgenerator"))
445 DMERR("generate_key request:priv check failed");
446 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
451 ret = e_devicemgr_inputgen_generate_key(client, resource, keyname, (Eina_Bool)!!pressed);
452 tizen_input_device_manager_send_error(resource, ret);
456 _e_devicemgr_wl_cb_generate_pointer(struct wl_client *client, struct wl_resource *resource, uint32_t type, uint32_t x, uint32_t y, uint32_t button)
458 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
461 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
462 "http://tizen.org/privilege/inputgenerator"))
464 DMERR("_generate_pointer request:priv check failed");
465 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
470 ret = e_devicemgr_inputgen_generate_pointer(client, resource, type, x, y, button);
471 tizen_input_device_manager_send_error(resource, ret);
475 _e_devicemgr_wl_cb_generate_touch(struct wl_client *client, struct wl_resource *resource, uint32_t type, uint32_t x, uint32_t y, uint32_t finger)
477 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
480 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client), "http://tizen.org/privilege/inputgenerator"))
482 DMERR("_e_input_devmgr_cb_generate_touch:priv check failed");
483 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
488 ret = e_devicemgr_inputgen_generate_touch(client, resource, type, x, y, finger);
489 tizen_input_device_manager_send_error(resource, ret);
493 _e_devicemgr_wl_cb_pointer_warp(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, wl_fixed_t x, wl_fixed_t y)
495 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
497 ret = e_devicemgr_input_pointer_warp(client, resource, surface, x, y);
499 tizen_input_device_manager_send_error(resource, ret);
503 _e_devicemgr_wl_cb_destroy(struct wl_client *client, struct wl_resource *resource)
505 wl_resource_destroy(resource);
509 _e_devicemgr_wl_cb_generate_axis(struct wl_client *client, struct wl_resource *resource, uint32_t type, wl_fixed_t value)
511 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
514 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
515 "http://tizen.org/privilege/inputgenerator"))
517 DMERR("_generate_pointer request:priv check failed");
518 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
523 if (type == TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_WHEEL ||
524 type == TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_HWHEEL)
525 ret = e_devicemgr_inputgen_generate_wheel(client, resource, type, (int)wl_fixed_to_double(value));
527 ret = e_devicemgr_inputgen_touch_axis_store(client, resource, type, wl_fixed_to_double(value));
528 tizen_input_device_manager_send_error(resource, ret);
532 _e_devicemgr_wl_cb_set_touch_count(struct wl_client *client, struct wl_resource *resource, int32_t max_count)
534 int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
537 if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
538 "http://tizen.org/privilege/inputgenerator"))
540 DMERR("_generate_pointer request:priv check failed");
541 tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
546 if (e_config->configured_max_touch.use)
548 ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NOT_ALLOWED;
552 if (max_count > e_input_touch_max_count_get())
554 e_input_touch_max_count_set(max_count);
558 tizen_input_device_manager_send_error(resource, ret);
562 static const struct tizen_input_device_manager_interface _e_devicemgr_wl_implementation = {
563 _e_devicemgr_wl_cb_block_events,
564 _e_devicemgr_wl_cb_unblock_events,
565 _e_devicemgr_wl_cb_init_generator,
566 _e_devicemgr_wl_cb_deinit_generator,
567 _e_devicemgr_wl_cb_generate_key,
568 _e_devicemgr_wl_cb_generate_pointer,
569 _e_devicemgr_wl_cb_generate_touch,
570 _e_devicemgr_wl_cb_pointer_warp,
571 _e_devicemgr_wl_cb_init_generator_with_name,
572 _e_devicemgr_wl_cb_destroy,
573 _e_devicemgr_wl_cb_generate_axis,
574 _e_devicemgr_wl_cb_set_touch_count,
575 _e_devicemgr_wl_cb_init_generator_with_sync,
579 _e_devicemgr_wl_cb_unbind(struct wl_resource *resource)
581 E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
582 E_Devicemgr_Input_Device_User_Data *device_user_data;
584 if(!e_comp_wl) return;
586 mgr_data = wl_resource_get_user_data(resource);
587 if (!mgr_data) return;
589 DMDBG("Unbind tizen_input_device_manager: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
591 EINA_LIST_FREE(mgr_data->user_data_list, device_user_data)
593 DMDBG("Destroy dev_res:%u", wl_resource_get_id(device_user_data->dev_res));
594 device_user_data->mgr_data = NULL;
595 wl_resource_destroy(device_user_data->dev_res);
597 e_devicemgr->wl_data->mgr_data_list = eina_list_remove(e_devicemgr->wl_data->mgr_data_list, mgr_data);
603 _e_devicemgr_wl_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
605 struct wl_resource *res, *seat_res, *device_res;
608 E_Devicemgr_Input_Device *dev;
609 struct wl_array axes;
610 E_Devicemgr_Input_Device_User_Data *device_user_data;
611 E_Devicemgr_Input_Device_Mgr_Data *mgr_data, *tmp_data;
613 mgr_data = E_NEW(E_Devicemgr_Input_Device_Mgr_Data, 1);
616 DMERR("Failed to allocate memory for input device mgr data\n");
617 wl_client_post_no_memory(client);
620 mgr_data->is_first_resource = 1;
622 EINA_LIST_FOREACH(e_devicemgr->wl_data->mgr_data_list, l, tmp_data)
624 if (wl_resource_get_client(tmp_data->resource) != client) continue;
625 DMDBG("tizen_input_device_manager (res: %d) is already bound to client (%p)",
626 wl_resource_get_id(tmp_data->resource), client);
627 mgr_data->is_first_resource = 0;
631 if (!(res = wl_resource_create(client, &tizen_input_device_manager_interface, version, id)))
633 DMERR("Could not create tizen_input_device_manager_interface resource: %m");
634 wl_client_post_no_memory(client);
639 DMDBG("Bind tizen_input_device_manager: %u (client: %p)", wl_resource_get_id(res), wl_resource_get_client(res));
641 mgr_data->resource = res;
642 mgr_data->user_data_list = NULL;
643 e_devicemgr->wl_data->mgr_data_list = eina_list_append(e_devicemgr->wl_data->mgr_data_list, mgr_data);
645 wl_resource_set_implementation(res, &_e_devicemgr_wl_implementation, mgr_data,
646 _e_devicemgr_wl_cb_unbind);
648 EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_res)
650 if (wl_resource_get_client(seat_res) != client) continue;
652 wl_array_init(&axes);
653 serial = wl_display_next_serial(e_comp_wl->wl.disp);
655 if (e_devicemgr->max_touch_count > 0)
657 e_devicemgr_wl_touch_max_count_send(e_devicemgr->max_touch_count, res, seat_res);
660 if (!mgr_data->is_first_resource)
662 DMDBG("This device_manager (res:%d) is not the first resource bound to client (%p)",
663 wl_resource_get_id(res), client);
667 EINA_LIST_FOREACH(e_devicemgr->device_list, ll, dev)
669 device_res = wl_resource_create(client, &tizen_input_device_interface, 1, 0);
672 DMERR("Could not create tizen_input_device resource: %m");
673 wl_client_post_no_memory(client);
676 device_user_data = E_NEW(E_Devicemgr_Input_Device_User_Data, 1);
677 if (!device_user_data)
679 DMERR("Failed to allocate memory for input device user data\n");
680 wl_client_post_no_memory(client);
681 wl_resource_destroy(device_res);
684 device_user_data->dev = dev;
685 device_user_data->dev_mgr_res = res;
686 device_user_data->seat_res = seat_res;
687 device_user_data->dev_res = device_res;
688 device_user_data->mgr_data = mgr_data;
690 dev->resources = eina_list_append(dev->resources, device_res);
691 mgr_data->user_data_list = eina_list_append(mgr_data->user_data_list, device_user_data);
693 wl_resource_set_implementation(device_res, &_e_devicemgr_wl_device_interface, device_user_data,
694 _e_devicemgr_wl_device_cb_unbind);
696 tizen_input_device_manager_send_device_add(res, serial, dev->identifier, device_res, seat_res);
697 tizen_input_device_send_device_info(device_res, dev->name, dev->clas, dev->subclas, &axes);
703 e_devicemgr_wl_init(void)
705 if (!e_comp_wl) return EINA_FALSE;
706 if (!e_comp_wl->wl.disp) return EINA_FALSE;
708 if (e_devicemgr->wl_data) return EINA_TRUE;
710 e_devicemgr->wl_data = E_NEW(E_Devicemgr_Wl_Data, 1);
711 EINA_SAFETY_ON_NULL_RETURN_VAL(e_devicemgr->wl_data, EINA_FALSE);
713 /* try to add tizen_input_device_manager to wayland globals */
714 e_devicemgr->wl_data->global = wl_global_create(e_comp_wl->wl.disp,
715 &tizen_input_device_manager_interface, 5,
716 NULL, _e_devicemgr_wl_cb_bind);
717 if (!e_devicemgr->wl_data->global)
719 DMERR("Could not add tizen_input_device_manager to wayland globals");
722 e_devicemgr->wl_data->mgr_data_list = NULL;
724 /* initialization of cynara for checking privilege */
728 ret = cynara_initialize(&e_devicemgr->wl_data->p_cynara, NULL);
729 if (EINA_UNLIKELY(CYNARA_API_SUCCESS != ret))
731 _e_devicemgr_util_cynara_log("cynara_initialize", ret);
732 e_devicemgr->wl_data->p_cynara = NULL;
734 e_devicemgr->wl_data->cynara_initialized = EINA_TRUE;
741 e_devicemgr_wl_shutdown(void)
743 if (!e_devicemgr->wl_data) return;
744 /* destroy the global seat resource */
745 if (e_devicemgr->wl_data->global)
746 wl_global_destroy(e_devicemgr->wl_data->global);
747 e_devicemgr->wl_data->global = NULL;
748 eina_list_free(e_devicemgr->wl_data->mgr_data_list);
750 /* deinitialization of cynara if it has been initialized */
752 if (e_devicemgr->wl_data->p_cynara) cynara_finish(e_devicemgr->wl_data->p_cynara);
753 e_devicemgr->wl_data->cynara_initialized = EINA_FALSE;
756 E_FREE(e_devicemgr->wl_data);