gesture_recognition: Rework to use elput
With this: - Support for gestures in X *and* wayland. Wayland does not require the libinput group hack - Hotplugging support thanks to udev support This requires a new rebuild of efl.
This commit is contained in:
parent
fa836d5d6b
commit
ed5dcfbd60
|
@ -21,6 +21,7 @@ static Eina_List *acpi_bindings = NULL;
|
||||||
static Eina_List *swipe_bindings = NULL;
|
static Eina_List *swipe_bindings = NULL;
|
||||||
|
|
||||||
static unsigned int bindings_disabled = 0;
|
static unsigned int bindings_disabled = 0;
|
||||||
|
static int gesture_capable_devices = 0;
|
||||||
|
|
||||||
static E_Bindings_Swipe_Live_Update live_update;
|
static E_Bindings_Swipe_Live_Update live_update;
|
||||||
static E_Bindings_Swipe_Live_Update live_update_data;
|
static E_Bindings_Swipe_Live_Update live_update_data;
|
||||||
|
@ -1613,6 +1614,19 @@ _e_bindings_edge_cb_timer(void *data)
|
||||||
return ECORE_CALLBACK_CANCEL;
|
return ECORE_CALLBACK_CANCEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
E_API void
|
||||||
|
e_bindings_gesture_capable_devices_set(int number)
|
||||||
|
{
|
||||||
|
gesture_capable_devices = number;
|
||||||
|
}
|
||||||
|
|
||||||
|
E_API int
|
||||||
|
e_bindings_gesture_capable_devices_get(void)
|
||||||
|
{
|
||||||
|
return gesture_capable_devices;
|
||||||
|
}
|
||||||
|
|
||||||
E_API void
|
E_API void
|
||||||
e_bindings_swipe_add(E_Binding_Context ctxt, double direction, double length, unsigned int fingers, double error, const char *action, const char *params)
|
e_bindings_swipe_add(E_Binding_Context ctxt, double direction, double length, unsigned int fingers, double error, const char *action, const char *params)
|
||||||
{
|
{
|
||||||
|
|
|
@ -224,6 +224,8 @@ E_API E_Action* e_bindings_swipe_handle(E_Binding_Context ctxt, E_Object *ob
|
||||||
E_API Eina_Inarray/*<E_Bindings_Swipe_Candidate>*/* e_bindings_swipe_find_candidates(E_Binding_Context ctxt, double direction, double lenght, unsigned int fingers);
|
E_API Eina_Inarray/*<E_Bindings_Swipe_Candidate>*/* e_bindings_swipe_find_candidates(E_Binding_Context ctxt, double direction, double lenght, unsigned int fingers);
|
||||||
E_API void e_bindings_swipe_live_update_hook_set(E_Bindings_Swipe_Live_Update update, void *data);
|
E_API void e_bindings_swipe_live_update_hook_set(E_Bindings_Swipe_Live_Update update, void *data);
|
||||||
E_API E_Bindings_Swipe_Live_Update e_bindings_swipe_live_update_hook_get(void);
|
E_API E_Bindings_Swipe_Live_Update e_bindings_swipe_live_update_hook_get(void);
|
||||||
|
E_API void e_bindings_gesture_capable_devices_set(int number);
|
||||||
|
E_API int e_bindings_gesture_capable_devices_get(void);
|
||||||
E_API void* e_bindings_swipe_live_update_hook_data_get(void);
|
E_API void* e_bindings_swipe_live_update_hook_data_get(void);
|
||||||
|
|
||||||
E_API int e_bindings_evas_modifiers_convert(Evas_Modifier *modifiers);
|
E_API int e_bindings_evas_modifiers_convert(Evas_Modifier *modifiers);
|
||||||
|
|
|
@ -276,12 +276,12 @@ _action_change_cb(void *data)
|
||||||
static int
|
static int
|
||||||
_swipe_binding_sort_cb(E_Config_Binding_Swipe *a, E_Config_Binding_Swipe *b)
|
_swipe_binding_sort_cb(E_Config_Binding_Swipe *a, E_Config_Binding_Swipe *b)
|
||||||
{
|
{
|
||||||
int finger_diff = (a->fingers == b->fingers)*-1;
|
int finger_diff = a->fingers - b->fingers;
|
||||||
if (!finger_diff)
|
if (!finger_diff)
|
||||||
{
|
{
|
||||||
return a->direction - b->direction;
|
return a->direction - b->direction;
|
||||||
}
|
}
|
||||||
return finger_diff;
|
return finger_diff*-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -950,6 +950,38 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_user_part_of_input(void)
|
||||||
|
{
|
||||||
|
uid_t user = getuid();
|
||||||
|
struct passwd *user_pw = getpwuid(user);
|
||||||
|
gid_t *gids = NULL;
|
||||||
|
int number_of_groups = 0;
|
||||||
|
struct group *input_group = getgrnam("input");
|
||||||
|
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(user_pw, EINA_FALSE);
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(input_group, EINA_FALSE);
|
||||||
|
|
||||||
|
if (getgrouplist(user_pw->pw_name, getgid(), NULL, &number_of_groups) != -1)
|
||||||
|
{
|
||||||
|
ERR("Failed to enumerate groups of user");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
number_of_groups ++;
|
||||||
|
gids = alloca((number_of_groups) * sizeof(gid_t));
|
||||||
|
if (getgrouplist(user_pw->pw_name, getgid(), gids, &number_of_groups) == -1)
|
||||||
|
{
|
||||||
|
ERR("Failed to get groups of user");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < number_of_groups; ++i)
|
||||||
|
{
|
||||||
|
if (gids[i] == input_group->gr_gid)
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
E_Config_Dialog *
|
E_Config_Dialog *
|
||||||
e_int_config_swipebindings(Evas_Object *parent EINA_UNUSED, const char *params)
|
e_int_config_swipebindings(Evas_Object *parent EINA_UNUSED, const char *params)
|
||||||
|
@ -966,13 +998,22 @@ e_int_config_swipebindings(Evas_Object *parent EINA_UNUSED, const char *params)
|
||||||
v->basic.create_widgets = _basic_create_widgets;
|
v->basic.create_widgets = _basic_create_widgets;
|
||||||
v->override_auto_apply = 1;
|
v->override_auto_apply = 1;
|
||||||
|
|
||||||
|
if (!_user_part_of_input())
|
||||||
|
{
|
||||||
|
e_module_dialog_show(NULL, "Gesture Recognition", "Your user is not part of the input group, libinput cannot be used.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e_bindings_gesture_capable_devices_get() == 0)
|
||||||
|
{
|
||||||
|
e_module_dialog_show(NULL, "Gesture Recognition", "No devices detected that are capable of gesture recognition.");
|
||||||
|
}
|
||||||
|
|
||||||
cfd = e_config_dialog_new(NULL, _("Swipe Bindings Settings"), "E",
|
cfd = e_config_dialog_new(NULL, _("Swipe Bindings Settings"), "E",
|
||||||
"keyboard_and_mouse/swipe_bindings",
|
"keyboard_and_mouse/swipe_bindings",
|
||||||
"enlightenment/swipes", 0, v, NULL);
|
"enlightenment/swipes", 0, v, NULL);
|
||||||
if ((params) && (params[0]))
|
if ((params) && (params[0]))
|
||||||
{
|
{
|
||||||
cfd->cfdata->params = eina_stringshare_add(params);
|
cfd->cfdata->params = eina_stringshare_add(params);
|
||||||
// _add_swipe_binding_cb(cfd->cfdata, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return cfd;
|
return cfd;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#include <e.h>
|
#include <e.h>
|
||||||
#include <Eina.h>
|
#include <Eina.h>
|
||||||
#include <libinput.h>
|
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <Elput.h>
|
||||||
|
|
||||||
E_API E_Module_Api e_modapi =
|
E_API E_Module_Api e_modapi =
|
||||||
{
|
{
|
||||||
|
@ -11,9 +11,8 @@ E_API E_Module_Api e_modapi =
|
||||||
"Gesture Recognition"
|
"Gesture Recognition"
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct libinput *gesture_recognition_ctx;
|
|
||||||
static Ecore_Fd_Handler *fd_listener;
|
|
||||||
static Eina_Hash *active_gestures;
|
static Eina_Hash *active_gestures;
|
||||||
|
static Elput_Manager *manager;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Eina_Vector2 pos;
|
Eina_Vector2 pos;
|
||||||
|
@ -23,45 +22,8 @@ typedef struct {
|
||||||
} visuals;
|
} visuals;
|
||||||
} Swipe_Stats;
|
} Swipe_Stats;
|
||||||
|
|
||||||
static int
|
|
||||||
open_restricted(const char *path, int flags, void *user_data EINA_UNUSED)
|
|
||||||
{
|
|
||||||
int fd = open(path, flags);
|
|
||||||
return fd < 0 ? -errno : fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
close_restricted(int fd, void *user_data EINA_UNUSED)
|
|
||||||
{
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct libinput_interface interface = {
|
|
||||||
.open_restricted = open_restricted,
|
|
||||||
.close_restricted = close_restricted,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
_find_all_touch_input_devices(const char *path, struct libinput *li)
|
|
||||||
{
|
|
||||||
Eina_File_Direct_Info *info;
|
|
||||||
Eina_Iterator *input_devies = eina_file_direct_ls(path);
|
|
||||||
|
|
||||||
EINA_ITERATOR_FOREACH(input_devies, info)
|
|
||||||
{
|
|
||||||
struct libinput_device *dev = libinput_path_add_device(li, info->path);
|
|
||||||
|
|
||||||
if (!dev) continue;
|
|
||||||
|
|
||||||
if (!libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_GESTURE))
|
|
||||||
{
|
|
||||||
libinput_path_remove_device(dev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static Swipe_Stats*
|
static Swipe_Stats*
|
||||||
_find_swipe_gesture_recognizition(struct libinput_device *dev)
|
_find_swipe_gesture_recognizition(Elput_Device *dev)
|
||||||
{
|
{
|
||||||
Swipe_Stats *stats = eina_hash_find(active_gestures, dev);
|
Swipe_Stats *stats = eina_hash_find(active_gestures, dev);
|
||||||
|
|
||||||
|
@ -69,7 +31,7 @@ _find_swipe_gesture_recognizition(struct libinput_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Swipe_Stats*
|
static Swipe_Stats*
|
||||||
_start_swipe_gesture_recognizition(struct libinput_device *dev)
|
_start_swipe_gesture_recognizition(Elput_Device *dev)
|
||||||
{
|
{
|
||||||
Swipe_Stats *stats = _find_swipe_gesture_recognizition(dev);
|
Swipe_Stats *stats = _find_swipe_gesture_recognizition(dev);
|
||||||
|
|
||||||
|
@ -103,7 +65,7 @@ _start_swipe_gesture_recognizition(struct libinput_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_end_swipe_gesture_recognizition(struct libinput_device *dev)
|
_end_swipe_gesture_recognizition(Elput_Device *dev)
|
||||||
{
|
{
|
||||||
eina_hash_del_by_key(active_gestures, dev);
|
eina_hash_del_by_key(active_gestures, dev);
|
||||||
}
|
}
|
||||||
|
@ -118,137 +80,6 @@ _config_angle(Eina_Vector2 pos)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
|
||||||
_cb_input_dispatch(void *data, Ecore_Fd_Handler *hdlr EINA_UNUSED)
|
|
||||||
{
|
|
||||||
struct libinput *li = data;
|
|
||||||
struct libinput_event *event;
|
|
||||||
|
|
||||||
if (libinput_dispatch(li) != 0)
|
|
||||||
printf("Failed to dispatch libinput events");
|
|
||||||
|
|
||||||
while((event = libinput_get_event(li)))
|
|
||||||
{
|
|
||||||
E_Bindings_Swipe_Live_Update live_update = e_bindings_swipe_live_update_hook_get();
|
|
||||||
|
|
||||||
enum libinput_event_type type = libinput_event_get_type(event);
|
|
||||||
struct libinput_device *dev = libinput_event_get_device(event);
|
|
||||||
if (type == LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN)
|
|
||||||
{
|
|
||||||
struct libinput_event_gesture *gesture = libinput_event_get_gesture_event(event);
|
|
||||||
|
|
||||||
Swipe_Stats *stats = _start_swipe_gesture_recognizition(dev);
|
|
||||||
stats->fingers = libinput_event_gesture_get_finger_count(gesture);
|
|
||||||
stats->pos.x = stats->pos.y = 0;
|
|
||||||
}
|
|
||||||
else if (type == LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE)
|
|
||||||
{
|
|
||||||
struct libinput_event_gesture *gesture = libinput_event_get_gesture_event(event);
|
|
||||||
Swipe_Stats *stats = _find_swipe_gesture_recognizition(dev);
|
|
||||||
|
|
||||||
stats->pos.x += libinput_event_gesture_get_dx(gesture);
|
|
||||||
stats->pos.y += libinput_event_gesture_get_dy(gesture);
|
|
||||||
if (live_update)
|
|
||||||
{
|
|
||||||
live_update(e_bindings_swipe_live_update_hook_data_get(), EINA_FALSE, _config_angle(stats->pos), eina_vector2_length_get(&stats->pos), 0.8, stats->fingers);
|
|
||||||
}
|
|
||||||
else if (stats->visuals.win)
|
|
||||||
{
|
|
||||||
Eina_Inarray *res = e_bindings_swipe_find_candidates(E_BINDING_CONTEXT_NONE, _config_angle (stats->pos), eina_vector2_length_get(&stats->pos), stats->fingers);
|
|
||||||
E_Binding_Swipe_Candidate *itr;
|
|
||||||
double total = 0.0f;
|
|
||||||
unsigned int len = 0;
|
|
||||||
|
|
||||||
EINA_INARRAY_FOREACH(res, itr)
|
|
||||||
{
|
|
||||||
total += itr->acceptance;
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len > 0)
|
|
||||||
{
|
|
||||||
char text_buffer[1000];
|
|
||||||
|
|
||||||
snprintf(text_buffer, sizeof(text_buffer), "%d gestures possible", len);
|
|
||||||
elm_progressbar_value_set(stats->visuals.visuals, total/len);
|
|
||||||
elm_object_text_set(stats->visuals.visuals, text_buffer);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elm_progressbar_value_set(stats->visuals.visuals, 0.0f);
|
|
||||||
elm_object_text_set(stats->visuals.visuals, "No gesture found");
|
|
||||||
}
|
|
||||||
|
|
||||||
eina_inarray_free(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (type == LIBINPUT_EVENT_GESTURE_SWIPE_END)
|
|
||||||
{
|
|
||||||
Swipe_Stats *stats = _find_swipe_gesture_recognizition(dev);
|
|
||||||
|
|
||||||
if (live_update)
|
|
||||||
live_update(e_bindings_swipe_live_update_hook_data_get(), EINA_TRUE, _config_angle(stats->pos), eina_vector2_length_get(&stats->pos), 0.8, stats->fingers);
|
|
||||||
else
|
|
||||||
e_bindings_swipe_handle(E_BINDING_CONTEXT_NONE, NULL, _config_angle(stats->pos), eina_vector2_length_get(&stats->pos), stats->fingers);
|
|
||||||
|
|
||||||
_end_swipe_gesture_recognizition(dev);
|
|
||||||
}
|
|
||||||
libinput_event_destroy(event);
|
|
||||||
}
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_setup_libinput(void)
|
|
||||||
{
|
|
||||||
gesture_recognition_ctx = libinput_path_create_context(&interface, NULL);
|
|
||||||
|
|
||||||
_find_all_touch_input_devices("/dev/input/", gesture_recognition_ctx);
|
|
||||||
|
|
||||||
fd_listener = ecore_main_fd_handler_add(libinput_get_fd(gesture_recognition_ctx), ECORE_FD_READ, _cb_input_dispatch, gesture_recognition_ctx, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
_tear_down_libinput(void)
|
|
||||||
{
|
|
||||||
ecore_main_fd_handler_del(fd_listener);
|
|
||||||
libinput_unref(gesture_recognition_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Eina_Bool
|
|
||||||
_user_part_of_input(void)
|
|
||||||
{
|
|
||||||
uid_t user = getuid();
|
|
||||||
struct passwd *user_pw = getpwuid(user);
|
|
||||||
gid_t *gids = NULL;
|
|
||||||
int number_of_groups = 0;
|
|
||||||
struct group *input_group = getgrnam("input");
|
|
||||||
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(user_pw, EINA_FALSE);
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(input_group, EINA_FALSE);
|
|
||||||
|
|
||||||
if (getgrouplist(user_pw->pw_name, getgid(), NULL, &number_of_groups) != -1)
|
|
||||||
{
|
|
||||||
ERR("Failed to enumerate groups of user");
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
number_of_groups ++;
|
|
||||||
gids = alloca((number_of_groups) * sizeof(gid_t));
|
|
||||||
if (getgrouplist(user_pw->pw_name, getgid(), gids, &number_of_groups) == -1)
|
|
||||||
{
|
|
||||||
ERR("Failed to get groups of user");
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < number_of_groups; ++i)
|
|
||||||
{
|
|
||||||
if (gids[i] == input_group->gr_gid)
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_stats_free(void *ptr)
|
_stats_free(void *ptr)
|
||||||
{
|
{
|
||||||
|
@ -258,17 +89,135 @@ _stats_free(void *ptr)
|
||||||
free(stats);
|
free(stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_apply_visual_changes(Swipe_Stats *stats)
|
||||||
|
{
|
||||||
|
E_Bindings_Swipe_Live_Update live_update = e_bindings_swipe_live_update_hook_get();
|
||||||
|
if (live_update)
|
||||||
|
{
|
||||||
|
live_update(e_bindings_swipe_live_update_hook_data_get(), EINA_FALSE, _config_angle(stats->pos), eina_vector2_length_get(&stats->pos), 0.8, stats->fingers);
|
||||||
|
}
|
||||||
|
else if (stats->visuals.win)
|
||||||
|
{
|
||||||
|
Eina_Inarray *res = e_bindings_swipe_find_candidates(E_BINDING_CONTEXT_NONE, _config_angle (stats->pos), eina_vector2_length_get(&stats->pos), stats->fingers);
|
||||||
|
E_Binding_Swipe_Candidate *itr;
|
||||||
|
double total = 0.0f;
|
||||||
|
unsigned int len = 0;
|
||||||
|
|
||||||
|
EINA_INARRAY_FOREACH(res, itr)
|
||||||
|
{
|
||||||
|
total += itr->acceptance;
|
||||||
|
len ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
char text_buffer[1000];
|
||||||
|
|
||||||
|
snprintf(text_buffer, sizeof(text_buffer), "%d gestures possible", len);
|
||||||
|
elm_progressbar_value_set(stats->visuals.visuals, total/len);
|
||||||
|
elm_object_text_set(stats->visuals.visuals, text_buffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
elm_progressbar_value_set(stats->visuals.visuals, 0.0f);
|
||||||
|
elm_object_text_set(stats->visuals.visuals, "No gesture found");
|
||||||
|
}
|
||||||
|
|
||||||
|
eina_inarray_free(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_swipe_cb(void *data EINA_UNUSED, int type, void *event)
|
||||||
|
{
|
||||||
|
Elput_Swipe_Gesture *gesture = event;
|
||||||
|
Elput_Device *dev = elput_swipe_device_get(gesture);
|
||||||
|
|
||||||
|
if (type == ELPUT_EVENT_SWIPE_BEGIN)
|
||||||
|
{
|
||||||
|
Swipe_Stats *stats = _start_swipe_gesture_recognizition(dev);
|
||||||
|
stats->fingers = elput_swipe_finger_count_get(gesture);
|
||||||
|
stats->pos.x = stats->pos.y = 0;
|
||||||
|
}
|
||||||
|
else if (type == ELPUT_EVENT_SWIPE_UPDATE)
|
||||||
|
{
|
||||||
|
Swipe_Stats *stats = _find_swipe_gesture_recognizition(dev);
|
||||||
|
|
||||||
|
stats->pos.x += elput_swipe_dx_get(gesture);
|
||||||
|
stats->pos.y += elput_swipe_dy_get(gesture);
|
||||||
|
|
||||||
|
_apply_visual_changes(stats);
|
||||||
|
}
|
||||||
|
else if (type == ELPUT_EVENT_SWIPE_END)
|
||||||
|
{
|
||||||
|
E_Bindings_Swipe_Live_Update live_update = e_bindings_swipe_live_update_hook_get();
|
||||||
|
Swipe_Stats *stats = _find_swipe_gesture_recognizition(dev);
|
||||||
|
|
||||||
|
if (live_update)
|
||||||
|
live_update(e_bindings_swipe_live_update_hook_data_get(), EINA_TRUE, _config_angle(stats->pos), eina_vector2_length_get(&stats->pos), 0.8, stats->fingers);
|
||||||
|
else
|
||||||
|
e_bindings_swipe_handle(E_BINDING_CONTEXT_NONE, NULL, _config_angle(stats->pos), eina_vector2_length_get(&stats->pos), stats->fingers);
|
||||||
|
|
||||||
|
_end_swipe_gesture_recognizition(dev);
|
||||||
|
}
|
||||||
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_debug(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Elput_Event_Seat_Caps *caps = event;
|
||||||
|
const Eina_List *node, *devices = elput_seat_devices_get(caps->seat);
|
||||||
|
Elput_Device *device;
|
||||||
|
int number_of_gesture_devices = 0;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(devices, node, device)
|
||||||
|
{
|
||||||
|
if (elput_device_caps_get(device) & ELPUT_DEVICE_CAPS_GESTURE)
|
||||||
|
{
|
||||||
|
number_of_gesture_devices++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e_bindings_gesture_capable_devices_set(number_of_gesture_devices);
|
||||||
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_init_for_x11(E_Module *m EINA_UNUSED)
|
||||||
|
{
|
||||||
|
const char *device = NULL;
|
||||||
|
|
||||||
|
elput_init();
|
||||||
|
device = getenv("XDG_SEAT");
|
||||||
|
if (!device) device = "seat0";
|
||||||
|
manager = elput_manager_connect_gestures(device, 0);
|
||||||
|
elput_input_init(manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_shutdown_for_x11(void)
|
||||||
|
{
|
||||||
|
elput_manager_disconnect(manager);
|
||||||
|
manager = NULL;
|
||||||
|
elput_shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
E_API int
|
E_API int
|
||||||
e_modapi_init(E_Module *m EINA_UNUSED)
|
e_modapi_init(E_Module *m EINA_UNUSED)
|
||||||
{
|
{
|
||||||
if (!_user_part_of_input())
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
||||||
{
|
{
|
||||||
e_module_dialog_show(m, "Gesture Recognition", "Your user is not part of the input group, libinput cannot be used.");
|
_init_for_x11(m);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
active_gestures = eina_hash_pointer_new(_stats_free);
|
active_gestures = eina_hash_pointer_new(_stats_free);
|
||||||
_setup_libinput();
|
|
||||||
|
ecore_event_handler_add(ELPUT_EVENT_SWIPE_BEGIN, _swipe_cb, NULL);
|
||||||
|
ecore_event_handler_add(ELPUT_EVENT_SWIPE_UPDATE, _swipe_cb, NULL);
|
||||||
|
ecore_event_handler_add(ELPUT_EVENT_SWIPE_END, _swipe_cb, NULL);
|
||||||
|
ecore_event_handler_add(ELPUT_EVENT_SEAT_CAPS, _debug, NULL);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -276,7 +225,11 @@ e_modapi_init(E_Module *m EINA_UNUSED)
|
||||||
E_API int
|
E_API int
|
||||||
e_modapi_shutdown(E_Module *m EINA_UNUSED)
|
e_modapi_shutdown(E_Module *m EINA_UNUSED)
|
||||||
{
|
{
|
||||||
_tear_down_libinput();
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
||||||
|
{
|
||||||
|
_shutdown_for_x11();
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
src = files(
|
src = files(
|
||||||
'e_mod_main.c',
|
'e_mod_main.c',
|
||||||
)
|
)
|
||||||
deps += [dependency('libinput')]
|
deps += [dependency('elput')]
|
||||||
|
|
Loading…
Reference in New Issue