{
e_devicemgr->inputgen.resource_list =
eina_list_remove_list(e_devicemgr->inputgen.resource_list, list);
+ E_FREE_FUNC(rdata->sync_timer, ecore_timer_del);
E_FREE(rdata);
}
}
}
}
-static void
+static E_Devicemgr_Inputgen_Resource_Data *
_e_devicemgr_inputgen_resource_add(struct wl_resource *resource, const char *name)
{
E_Devicemgr_Inputgen_Resource_Data *rdata;
EINA_LIST_FOREACH(e_devicemgr->inputgen.resource_list, l, rdata)
{
- if (rdata->resource == resource) return;
+ if (rdata->resource == resource) return rdata;
}
rdata = NULL;
rdata = E_NEW(E_Devicemgr_Inputgen_Resource_Data, 1);
- EINA_SAFETY_ON_NULL_RETURN(rdata);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(rdata, NULL);
rdata->resource = resource;
strncpy(rdata->name, name, UINPUT_MAX_NAME_SIZE - 1);
e_devicemgr->inputgen.resource_list = eina_list_append(e_devicemgr->inputgen.resource_list, rdata);
+
+ return rdata;
}
static void
{
e_devicemgr->inputgen.resource_list =
eina_list_remove_list(e_devicemgr->inputgen.resource_list, l);
+ E_FREE_FUNC(rdata->sync_timer, ecore_timer_del);
E_FREE(rdata);
}
}
}
void
+e_devicemgr_inputgen_device_ready_send(E_Devicemgr_Input_Device *dev)
+{
+ E_Devicemgr_Inputgen_Resource_Data *rdata;
+ Eina_List *l;
+ int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
+
+ EINA_LIST_FOREACH(e_devicemgr->inputgen.resource_list, l, rdata)
+ {
+ if (e_devicemgr_strcmp(rdata->name, dev->name) == EINA_FALSE) continue;
+ if (rdata->sync_timer)
+ {
+ e_devicemgr_wl_generator_with_sync_send_event(rdata->resource, ret);
+
+ ecore_timer_del(rdata->sync_timer);
+ rdata->sync_timer = NULL;
+ }
+ }
+}
+
+Eina_Bool
+_e_devicemgr_inputgen_sync_timer(void *data)
+{
+ E_Devicemgr_Inputgen_Resource_Data *rdata = data;
+ int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES;
+
+ DMDBG("Init Generator with sync. timer expired!!! dev: %s", rdata->name);
+
+ if (!rdata || !rdata->resource) return ECORE_CALLBACK_CANCEL;
+
+ e_devicemgr_wl_generator_with_sync_send_event(rdata->resource, ret);
+
+ rdata->sync_timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+void
+e_devicemgr_inputgen_add_with_sync(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name)
+{
+ int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
+ E_Devicemgr_Inputgen_Resource_Data *rdata;
+
+ if (clas & TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD)
+ ret = _e_devicemgr_inputgen_create_device(ECORE_DEVICE_CLASS_KEYBOARD, client, name);
+ if (clas & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE)
+ ret = _e_devicemgr_inputgen_create_device(ECORE_DEVICE_CLASS_MOUSE, client, name);
+ if (clas & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN)
+ ret = _e_devicemgr_inputgen_create_device(ECORE_DEVICE_CLASS_TOUCH, client, name);
+
+ if (ret == TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
+ {
+ _e_devicemgr_inputgen_client_add(client, clas);
+ rdata = _e_devicemgr_inputgen_resource_add(resource, name);
+ if (!rdata) return;
+ rdata->sync_timer = ecore_timer_add(1.0, _e_devicemgr_inputgen_sync_timer, rdata);
+ }
+
+ return;
+}
+
+void
e_devicemgr_inputgen_remove(struct wl_client *client, struct wl_resource *resource, uint32_t clas)
{
Eina_List *l, *l_next;
{
struct wl_resource *resource;
char name[UINPUT_MAX_NAME_SIZE];
+ Ecore_Timer *sync_timer;
};
struct _E_Devicemgr_Conf_Edd
Eina_Bool e_devicemgr_block_remove_internal(E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data);
int e_devicemgr_inputgen_add(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name);
+void e_devicemgr_inputgen_add_with_sync(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name);
void e_devicemgr_inputgen_remove(struct wl_client *client, struct wl_resource *resource, uint32_t clas);
int e_devicemgr_inputgen_generate_key(struct wl_client *client, struct wl_resource *resource, const char *keyname, Eina_Bool pressed);
int e_devicemgr_inputgen_generate_pointer(struct wl_client *client, struct wl_resource *resource, uint32_t type, uint32_t x, uint32_t y, uint32_t button);
void e_devicemgr_input_shutdown(void);
void e_devicemgr_wl_touch_max_count_send(int slot, struct wl_resource *res, struct wl_resource *seat_res);
+void e_devicemgr_wl_generator_with_sync_send_event(struct wl_resource *resource, int error);
+void e_devicemgr_inputgen_device_ready_send(E_Devicemgr_Input_Device *dev);
}
}
+void
+e_devicemgr_wl_generator_with_sync_send_event(struct wl_resource *resource, int result)
+{
+ if (!resource) return;
+ DMDBG("Init Generator with sync. send result: %d", result);
+ tizen_input_device_manager_send_error(resource, result);
+}
static void
_e_devicemgr_wl_cb_block_events(struct wl_client *client, struct wl_resource *resource, uint32_t serial, uint32_t clas, uint32_t duration)
}
static void
+_e_devicemgr_wl_cb_init_generator_with_sync(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name)
+{
+#ifdef HAVE_CYNARA
+ if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
+ "http://tizen.org/privilege/inputgenerator"))
+ {
+ DMERR("_e_devicemgr_wl_cb_init_generator_with_sync request:priv check failed");
+ tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
+ return;
+ }
+#endif
+
+ e_devicemgr_inputgen_add_with_sync(client, resource, clas, name);
+}
+
+static void
_e_devicemgr_wl_cb_deinit_generator(struct wl_client *client, struct wl_resource *resource, uint32_t clas)
{
int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
_e_devicemgr_wl_cb_destroy,
_e_devicemgr_wl_cb_generate_axis,
_e_devicemgr_wl_cb_set_touch_count,
+ _e_devicemgr_wl_cb_init_generator_with_sync,
};
static void
/* try to add tizen_input_device_manager to wayland globals */
e_devicemgr->wl_data->global = wl_global_create(e_comp_wl->wl.disp,
- &tizen_input_device_manager_interface, 4,
+ &tizen_input_device_manager_interface, 5,
NULL, _e_devicemgr_wl_cb_bind);
if (!e_devicemgr->wl_data->global)
{