free(gestures_ctx);
}
-static void _flick_gesture_mouse_down(Ecore_Event_Mouse_Button *ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- if (gestures_ctx->cov->flick_gesture.state == GESTURE_NOT_STARTED) {
- gestures_ctx->cov->flick_gesture.state = GESTURE_ONGOING;
- gestures_ctx->cov->flick_gesture.finger[0] = ev->multi.device;
- gestures_ctx->cov->flick_gesture.x_org[0] = ev->root.x;
- gestures_ctx->cov->flick_gesture.y_org[0] = ev->root.y;
- gestures_ctx->cov->flick_gesture.timestamp[0] = ev->timestamp;
- gestures_ctx->cov->flick_gesture.flick_to_scroll = EINA_FALSE;
- gestures_ctx->cov->flick_gesture.n_fingers = 1;
- gestures_ctx->cov->flick_gesture.n_fingers_left = 1;
- gestures_ctx->cov->flick_gesture.dir = FLICK_DIRECTION_UNDEFINED;
- gestures_ctx->cov->flick_gesture.finger_out[0] = EINA_FALSE;
- gestures_ctx->cov->flick_gesture.return_flick[0] = EINA_FALSE;
- } else if (gestures_ctx->cov->flick_gesture.state == GESTURE_ONGOING) {
- // abort gesture if too many fingers touched screen
- if ((gestures_ctx->cov->n_taps > 3) || (gestures_ctx->cov->flick_gesture.n_fingers > 2)) {
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- return;
- }
-
- gestures_ctx->cov->flick_gesture.x_org[gestures_ctx->cov->flick_gesture.n_fingers] = ev->root.x;
- gestures_ctx->cov->flick_gesture.y_org[gestures_ctx->cov->flick_gesture.n_fingers] = ev->root.y;
- gestures_ctx->cov->flick_gesture.timestamp[gestures_ctx->cov->flick_gesture.n_fingers] = ev->timestamp;
- gestures_ctx->cov->flick_gesture.finger[gestures_ctx->cov->flick_gesture.n_fingers] = ev->multi.device;
- gestures_ctx->cov->flick_gesture.n_fingers++;
- gestures_ctx->cov->flick_gesture.n_fingers_left++;
- if (gestures_ctx->cov->flick_gesture.n_fingers < 3) { /* n_fingers == 3 makes out of bounds write */
- gestures_ctx->cov->flick_gesture.finger_out[gestures_ctx->cov->flick_gesture.n_fingers] = EINA_FALSE;
- gestures_ctx->cov->flick_gesture.return_flick[gestures_ctx->cov->flick_gesture.n_fingers] = EINA_FALSE;
- }
- }
-}
-
-static Eina_Bool _flick_gesture_time_check(unsigned int event_time, unsigned int gesture_time)
-{
- DEBUG("Flick time: %d", event_time - gesture_time);
- if ((event_time - gesture_time) < _e_mod_config->one_finger_flick_max_time * 2) //Double time because of the possible of return flick
- return EINA_TRUE;
- else
- return EINA_FALSE;
-}
-
-static Eina_Bool _flick_gesture_length_check(int x, int y, int x_org, int y_org)
-{
- int dx = x - x_org;
- int dy = y - y_org;
-
- if ((dx * dx + dy * dy) > (_e_mod_config->one_finger_flick_min_length * _e_mod_config->one_finger_flick_min_length))
- return EINA_TRUE;
- else
- return EINA_FALSE;
-}
-
-static flick_direction_e _flick_gesture_direction_get(int x, int y, int x_org, int y_org, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- int dx = x - x_org;
- int dy = y - y_org;
- int tmp;
-
- switch (gestures_ctx->win_angle) {
- case 90:
- tmp = dx;
- dx = -dy;
- dy = tmp;
- break;
- case 270:
- tmp = dx;
- dx = dy;
- dy = -tmp;
- break;
- }
-
- if ((dy < 0) && (abs(dx) < -dy))
- return FLICK_DIRECTION_UP;
- if ((dy > 0) && (abs(dx) < dy))
- return FLICK_DIRECTION_DOWN;
- if ((dx > 0) && (dx > abs(dy)))
- return FLICK_DIRECTION_RIGHT;
- if ((dx < 0) && (-dx > abs(dy)))
- return FLICK_DIRECTION_LEFT;
-
- return FLICK_DIRECTION_UNDEFINED;
-}
-
-static void _flick_event_emit(Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- int ax, ay, axe, aye, i, type = -1;
- ax = ay = axe = aye = 0;
-
- for (i = 0; i < gestures_ctx->cov->flick_gesture.n_fingers; i++) {
- ax += gestures_ctx->cov->flick_gesture.x_org[i];
- ay += gestures_ctx->cov->flick_gesture.y_org[i];
- axe += gestures_ctx->cov->flick_gesture.x_end[i];
- aye += gestures_ctx->cov->flick_gesture.y_end[i];
- }
-
- ax /= gestures_ctx->cov->flick_gesture.n_fingers;
- ay /= gestures_ctx->cov->flick_gesture.n_fingers;
- axe /= gestures_ctx->cov->flick_gesture.n_fingers;
- aye /= gestures_ctx->cov->flick_gesture.n_fingers;
-
- if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_LEFT) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_LEFT;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_LEFT;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_LEFT;
- } else if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_RIGHT) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_RIGHT;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_RIGHT;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_RIGHT;
- } else if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UP) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_UP;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_UP;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_UP;
- } else if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_DOWN) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_DOWN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_DOWN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_DOWN;
- } else if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_DOWN_RETURN) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_DOWN_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_DOWN_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_DOWN_RETURN;
- } else if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UP_RETURN) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_UP_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_UP_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_UP_RETURN;
- } else if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_LEFT_RETURN) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_LEFT_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_LEFT_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_LEFT_RETURN;
- } else if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_RIGHT_RETURN) {
- if (gestures_ctx->cov->flick_gesture.n_fingers == 1)
- type = ONE_FINGER_FLICK_RIGHT_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 2)
- type = TWO_FINGERS_FLICK_RIGHT_RETURN;
- if (gestures_ctx->cov->flick_gesture.n_fingers == 3)
- type = THREE_FINGERS_FLICK_RIGHT_RETURN;
- }
- DEBUG("FLICK GESTURE: N: %d F: %d", gestures_ctx->cov->flick_gesture.n_fingers, gestures_ctx->cov->flick_gesture.dir);
- _event_emit(type, ax, ay, axe, aye, 2, gestures_ctx->cov->event_time);
-}
-
-static void _flick_gesture_mouse_up(Ecore_Event_Mouse_Button *ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- if (gestures_ctx->cov->flick_gesture.state == GESTURE_ONGOING) {
- int i;
- // check if fingers match
- for (i = 0; i < gestures_ctx->cov->flick_gesture.n_fingers; i++) {
- if (gestures_ctx->cov->flick_gesture.finger[i] == ev->multi.device)
- break;
- }
- if (i == gestures_ctx->cov->flick_gesture.n_fingers) {
- DEBUG("Finger id not recognized. Gesture aborted.");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- goto end;
- }
- if (gestures_ctx->cov->flick_gesture.flick_to_scroll)
- {
- if (ev->multi.device == 1) {
- //if it is second finger then update x and y,
- //We use last x and y coordinates in end_scroll.
- //So if the first finger is up before
- //the second one we will use latest x and y of second finger
- //because second was the finger that scroll follows.
- //Else we can encounter that delta between last continue_scroll
- //coordinates and end_scroll coordinates will be high.
- gestures_ctx->cov->flick_gesture.flick_to_scroll_last_x = ev->x;
- gestures_ctx->cov->flick_gesture.flick_to_scroll_last_y = ev->y;
- }
-
- DEBUG("Flick gesture was interpreted as scroll so we aborting it.");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- goto end;
- }
- // check if flick for given finger is valid
- if (!_flick_gesture_time_check(ev->timestamp, gestures_ctx->cov->flick_gesture.timestamp[i])) {
- DEBUG("finger flick gesture timeout expired. Gesture aborted.");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- goto end;
- }
- // check minimal flick length
- if (!_flick_gesture_length_check(ev->root.x, ev->root.y, gestures_ctx->cov->flick_gesture.x_org[i], gestures_ctx->cov->flick_gesture.y_org[i])) {
- if (!gestures_ctx->cov->flick_gesture.finger_out[i]) {
- DEBUG("Minimal gesture length not reached and no return flick. Gesture aborted.");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- goto end;
- }
- gestures_ctx->cov->flick_gesture.return_flick[i] = EINA_TRUE;
- }
-
- flick_direction_e s = gestures_ctx->cov->flick_gesture.return_flick[i] ? gestures_ctx->cov->flick_gesture.dir : _flick_gesture_direction_get(ev->root.x, ev->root.y,
- gestures_ctx->cov->flick_gesture.x_org[i],
- gestures_ctx->cov->flick_gesture.y_org[i],
- gestures_ctx);
-
- gestures_ctx->cov->flick_gesture.n_fingers_left--;
-
- if ((gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UNDEFINED || gestures_ctx->cov->flick_gesture.dir > FLICK_DIRECTION_RIGHT)
- && gestures_ctx->cov->flick_gesture.return_flick[i] == EINA_FALSE) {
- DEBUG("Flick gesture");
- gestures_ctx->cov->flick_gesture.dir = s;
- }
- // gesture is valid only if all flicks are in same direction
- if (gestures_ctx->cov->flick_gesture.dir != s) {
- DEBUG("Flick in different direction. Gesture aborted.");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- goto end;
- }
-
- gestures_ctx->cov->flick_gesture.x_end[i] = ev->root.x;
- gestures_ctx->cov->flick_gesture.y_end[i] = ev->root.y;
-
- if (!gestures_ctx->cov->flick_gesture.n_fingers_left) {
- _flick_event_emit(gestures_ctx);
- gestures_ctx->cov->flick_gesture.state = GESTURE_NOT_STARTED;
- }
- }
-
-end:
- // if no finger is touching a screen, gesture will be reseted.
- if (gestures_ctx->cov->flick_gesture.state == GESTURE_ABORTED) {
- if (gestures_ctx->cov->flick_gesture.flick_to_scroll) {
- end_scroll(gestures_ctx->cov->flick_gesture.flick_to_scroll_last_x, gestures_ctx->cov->flick_gesture.flick_to_scroll_last_y);
- gestures_ctx->cov->flick_gesture.flick_to_scroll = EINA_FALSE;
- }
- if (gestures_ctx->cov->n_taps == 0)
- gestures_ctx->cov->flick_gesture.state = GESTURE_NOT_STARTED;
- }
-}
-
-static Eina_Bool _flick_to_scroll_gesture_conditions_met(Ecore_Event_Mouse_Move * ev, int gesture_timestamp, int dx, int dy)
-{
- if (ev->timestamp - gesture_timestamp > _e_mod_config->two_finger_flick_to_scroll_timeout)
- if (abs(dx) > _e_mod_config->two_finger_flick_to_scroll_min_length || abs(dy) > _e_mod_config->two_finger_flick_to_scroll_min_length)
- return EINA_TRUE;
-
- return EINA_FALSE;
-}
-
-static void _flick_gesture_mouse_move(Ecore_Event_Mouse_Move * ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- if (gestures_ctx->cov->flick_gesture.state == GESTURE_ONGOING) {
- int i;
- for (i = 0; i < gestures_ctx->cov->flick_gesture.n_fingers; ++i) {
- if (gestures_ctx->cov->flick_gesture.finger[i] == ev->multi.device)
- break;
- }
- if (i == gestures_ctx->cov->flick_gesture.n_fingers) {
- if (gestures_ctx->cov->flick_gesture.n_fingers >= 3) //that is because of the EFL bug. Mouse move event before mouse down(!)
- {
- ERROR("Finger id not recognized. Gesture aborted.");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- return;
- }
- }
-
- int dx = ev->root.x - gestures_ctx->cov->flick_gesture.x_org[i];
- int dy = ev->root.y - gestures_ctx->cov->flick_gesture.y_org[i];
- int tmp;
-
- switch (gestures_ctx->win_angle) {
- case 90:
- tmp = dx;
- dx = -dy;
- dy = tmp;
- break;
- case 270:
- tmp = dx;
- dx = dy;
- dy = -tmp;
- break;
- }
- if (i == 1) {
- if (gestures_ctx->cov->flick_gesture.flick_to_scroll || _flick_to_scroll_gesture_conditions_met(ev, gestures_ctx->cov->flick_gesture.timestamp[i], dx, dy)) {
- if (!gestures_ctx->cov->flick_gesture.flick_to_scroll) {
- start_scroll(ev->x, ev->y, gestures_ctx);
- gestures_ctx->cov->flick_gesture.flick_to_scroll = EINA_TRUE;
- } else {
- continue_scroll(ev->x, ev->y);
- }
- gestures_ctx->cov->flick_gesture.flick_to_scroll_last_x = ev->x;
- gestures_ctx->cov->flick_gesture.flick_to_scroll_last_y = ev->y;
- return;
- }
- }
-
- if (!gestures_ctx->cov->flick_gesture.finger_out[i]) {
- if (abs(dx) > _e_mod_config->one_finger_flick_min_length) {
- gestures_ctx->cov->flick_gesture.finger_out[i] = EINA_TRUE;
- if (dx > 0) {
- if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UNDEFINED || gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_RIGHT_RETURN) {
- gestures_ctx->cov->flick_gesture.dir = FLICK_DIRECTION_RIGHT_RETURN;
- } else {
- ERROR("Invalid direction, abort");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- }
- } else {
- if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UNDEFINED || gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_LEFT_RETURN) {
- gestures_ctx->cov->flick_gesture.dir = FLICK_DIRECTION_LEFT_RETURN;
- } else {
- ERROR("Invalid direction, abort");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- }
- }
- return;
- }
-
- else if (abs(dy) > _e_mod_config->one_finger_flick_min_length) {
- gestures_ctx->cov->flick_gesture.finger_out[i] = EINA_TRUE;
- if (dy > 0) {
- if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UNDEFINED || gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_DOWN_RETURN) {
- gestures_ctx->cov->flick_gesture.dir = FLICK_DIRECTION_DOWN_RETURN;
- } else {
- ERROR("Invalid direction, abort");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- }
- } else {
- if (gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UNDEFINED || gestures_ctx->cov->flick_gesture.dir == FLICK_DIRECTION_UP_RETURN) {
- gestures_ctx->cov->flick_gesture.dir = FLICK_DIRECTION_UP_RETURN;
- } else {
- ERROR("Invalid direction, abort");
- gestures_ctx->cov->flick_gesture.state = GESTURE_ABORTED;
- }
- }
- return;
- }
- }
- }
- return;
-}
-
-static Eina_Bool _on_hover_timeout(void *data)
-{
- Screen_Reader_Gestures_Data *gestures_ctx = (Screen_Reader_Gestures_Data *) data;
- if(gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- DEBUG("Hover timer expierd");
-
- gestures_ctx->cov->hover_gesture.longpressed = EINA_TRUE;
- gestures_ctx->cov->hover_gesture.timer = NULL;
-
- if (gestures_ctx->cov->hover_gesture.last_emission_time == -1) {
- _hover_event_emit(gestures_ctx, 0);
- gestures_ctx->cov->hover_gesture.last_emission_time = gestures_ctx->cov->event_time;
- }
- return EINA_FALSE;
-}
-
-static void _hover_gesture_timer_reset(Screen_Reader_Gestures_Data *gestures_ctx, double time)
-{
- if (gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- DEBUG("Hover timer reset");
- gestures_ctx->cov->hover_gesture.longpressed = EINA_FALSE;
- if (gestures_ctx->cov->hover_gesture.timer) {
- ecore_timer_reset(gestures_ctx->cov->hover_gesture.timer);
- return;
- }
- gestures_ctx->cov->hover_gesture.timer = ecore_timer_add(time, _on_hover_timeout, gestures_ctx);
-}
-
-static void _hover_gesture_mouse_down(Ecore_Event_Mouse_Button * ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- if (gestures_ctx->cov->hover_gesture.state == GESTURE_NOT_STARTED && gestures_ctx->cov->n_taps == 1) {
- gestures_ctx->cov->hover_gesture.state = GESTURE_ONGOING;
- gestures_ctx->cov->hover_gesture.timestamp = ev->timestamp;
- gestures_ctx->cov->hover_gesture.last_emission_time = -1;
- gestures_ctx->cov->hover_gesture.x[0] = ev->root.x;
- gestures_ctx->cov->hover_gesture.y[0] = ev->root.y;
- gestures_ctx->cov->hover_gesture.finger[0] = ev->multi.device;
- gestures_ctx->cov->hover_gesture.n_fingers = 1;
- _hover_gesture_timer_reset(gestures_ctx, _e_mod_config->one_finger_hover_longpress_timeout);
- }
- if (gestures_ctx->cov->hover_gesture.state == GESTURE_ONGOING && gestures_ctx->cov->n_taps == 2) {
- if (gestures_ctx->cov->hover_gesture.longpressed) {
- _hover_event_emit(gestures_ctx, 2);
- goto abort;
- }
- gestures_ctx->cov->hover_gesture.timestamp = -1;
- gestures_ctx->cov->hover_gesture.last_emission_time = -1;
- gestures_ctx->cov->hover_gesture.x[1] = ev->root.x;
- gestures_ctx->cov->hover_gesture.y[1] = ev->root.y;
- gestures_ctx->cov->hover_gesture.finger[1] = ev->multi.device;
- gestures_ctx->cov->hover_gesture.n_fingers = 2;
- _hover_gesture_timer_reset(gestures_ctx, _e_mod_config->one_finger_hover_longpress_timeout);
- }
- // abort gesture if more then 2 fingers touched screen
- if ((gestures_ctx->cov->hover_gesture.state == GESTURE_ONGOING) && gestures_ctx->cov->n_taps > 2) {
- DEBUG("More then 2 finged. Abort hover gesture");
- _hover_event_emit(gestures_ctx, 2);
- goto abort;
- }
- return;
-
-abort:
- gestures_ctx->cov->hover_gesture.state = GESTURE_ABORTED;
- if (gestures_ctx->cov->hover_gesture.timer)
- ecore_timer_del(gestures_ctx->cov->hover_gesture.timer);
- gestures_ctx->cov->hover_gesture.timer = NULL;
-}
-
-static void _hover_gesture_mouse_up(Ecore_Event_Mouse_Button * ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- if (gestures_ctx->cov->hover_gesture.state == GESTURE_ONGOING) {
- int i;
- for (i = 0; i < gestures_ctx->cov->hover_gesture.n_fingers; i++) {
- if (gestures_ctx->cov->hover_gesture.finger[i] == ev->multi.device)
- break;
- }
- if (i == gestures_ctx->cov->hover_gesture.n_fingers) {
- DEBUG("Invalid finger id: %d", ev->multi.device);
- return;
- }
- else {
- gestures_ctx->cov->hover_gesture.state = GESTURE_ABORTED;
- if (gestures_ctx->cov->hover_gesture.timer)
- ecore_timer_del(gestures_ctx->cov->hover_gesture.timer);
- gestures_ctx->cov->hover_gesture.timer = NULL;
- // aditionally emit event to complete sequence
- if (gestures_ctx->cov->hover_gesture.longpressed)
- _hover_event_emit(gestures_ctx, 2);
- }
- }
- // reset gesture only if user released all his fingers
- if (gestures_ctx->cov->n_taps == 0)
- gestures_ctx->cov->hover_gesture.state = GESTURE_NOT_STARTED;
-}
-
#ifdef X11_ENABLED
static void _get_root_coords(Ecore_X_Window win, int *x, int *y)
{
}
return 0;
}
-#else
-Ecore_Wl_Window *top_window_get(int x, int y)
-{
- return 0;
-}
#endif
-void start_scroll(int x, int y, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if( gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
-#ifdef X11_ENABLED
- Ecore_X_Window wins[1] = { gestures_ctx->win };
- Ecore_X_Window under = ecore_x_window_at_xy_with_skip_get(x, y, wins, sizeof(wins) / sizeof(wins[0]));
- _get_root_coords(under, gestures_ctx.rx, gestures_ctx.ry);
- ecore_x_mouse_in_send(under, x - gestures_ctx->rx, y - gestures_ctx->ry);
- ecore_x_window_focus(under);
- ecore_x_mouse_down_send(under, x - gestures_ctx->rx, y - gestures_ctx->ry, 1);
- gestures_ctx->scrolled_win = under;
-#endif
-}
-
-void continue_scroll(int x, int y, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if( gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
-#ifdef X11_ENABLED
- ecore_x_mouse_move_send(gestures_ctx->scrolled_win, x - gestures_ctx->rx, y - gestures_ctx->ry);
-#endif
-}
-
-void end_scroll(int x, int y, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if( gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
-#ifdef X11_ENABLED
- ecore_x_mouse_up_send(gestures_ctx->scrolled_win, x - gestures_ctx->rx, y - gestures_ctx->ry, 1);
- ecore_x_mouse_out_send(gestures_ctx->scrolled_win, x - gestures_ctx->rx, y - gestures_ctx->ry);
-#endif
-}
-
static unsigned int _win_angle_get(void)
{
int angle = 0;
return angle;
}
-static void _hover_event_emit(Screen_Reader_Gestures_Data *gestures_ctx, int state)
-{
- if( gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- int ax = 0, ay = 0, j;
-
- for (j = 0; j < gestures_ctx->cov->hover_gesture.n_fingers; j++) {
- ax += gestures_ctx->cov->hover_gesture.x[j];
- ay += gestures_ctx->cov->hover_gesture.y[j];
- }
-
- ax /= gestures_ctx->cov->hover_gesture.n_fingers;
- ay /= gestures_ctx->cov->hover_gesture.n_fingers;
-
- switch (gestures_ctx->cov->hover_gesture.n_fingers) {
- case 1:
- INFO("ONE FINGER HOVER");
- _event_emit(ONE_FINGER_HOVER, ax, ay, ax, ay, state, gestures_ctx->cov->event_time);
- break;
- default:
- break;
- }
-}
-
-static void _hover_gesture_mouse_move(Ecore_Event_Mouse_Move * ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if( gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- if (gestures_ctx->cov->hover_gesture.state == GESTURE_ONGOING) {
- // check fingers
- int i;
- if (!gestures_ctx->cov->hover_gesture.longpressed)
- return;
-
- for (i = 0; i < gestures_ctx->cov->hover_gesture.n_fingers; i++) {
- if (gestures_ctx->cov->hover_gesture.finger[i] == ev->multi.device)
- break;
- }
- if (i == gestures_ctx->cov->hover_gesture.n_fingers) {
- DEBUG("Invalid finger id: %d", ev->multi.device);
- return;
- }
- gestures_ctx->cov->hover_gesture.x[i] = ev->root.x;
- gestures_ctx->cov->hover_gesture.y[i] = ev->root.y;
- _hover_event_emit(gestures_ctx, 1);
- }
-}
-
static void _tap_event_emit(Screen_Reader_Gestures_Data *gestures_ctx, int state)
{
if( gestures_ctx == NULL)
}
}
-static void _tap_gestures_mouse_up(Ecore_Event_Mouse_Button * ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- if (gestures_ctx->cov->tap_gesture_data.timer) {
- gestures_ctx->cov->tap_gesture_data.pressed = EINA_FALSE;
-
- if (ev->multi.device == gestures_ctx->cov->tap_gesture_data.finger[0]) {
- DEBUG("First finger up");
-
- int dx = ev->root.x - gestures_ctx->cov->tap_gesture_data.x_org[0];
- int dy = ev->root.y - gestures_ctx->cov->tap_gesture_data.y_org[0];
-
- if ((dx * dx + dy * dy) < _e_mod_config->one_finger_tap_radius * _e_mod_config->one_finger_tap_radius) {
- if (gestures_ctx->cov->n_taps == 0) {
- gestures_ctx->cov->tap_gesture_data.n_taps++;
- }
- } else {
- ERROR("Abort gesture");
- gestures_ctx->cov->tap_gesture_data.started = EINA_FALSE;
- }
- } else if (ev->multi.device == gestures_ctx->cov->tap_gesture_data.finger[1]) {
- DEBUG("Second finger up");
-
- int dx = ev->root.x - gestures_ctx->cov->tap_gesture_data.x_org[1];
- int dy = ev->root.y - gestures_ctx->cov->tap_gesture_data.y_org[1];
-
- if ((dx * dx + dy * dy) < _e_mod_config->one_finger_tap_radius * _e_mod_config->one_finger_tap_radius) {
- if (gestures_ctx->cov->n_taps == 0) {
- gestures_ctx->cov->tap_gesture_data.n_taps++;
- }
- } else {
- ERROR("Abort gesture");
- gestures_ctx->cov->tap_gesture_data.started = EINA_FALSE;
- }
- } else if (ev->multi.device == gestures_ctx->cov->tap_gesture_data.finger[2]) {
- DEBUG("Third finger up");
-
- int dx = ev->root.x - gestures_ctx->cov->tap_gesture_data.x_org[2];
- int dy = ev->root.y - gestures_ctx->cov->tap_gesture_data.y_org[2];
-
- if ((dx * dx + dy * dy) < _e_mod_config->one_finger_tap_radius * _e_mod_config->one_finger_tap_radius) {
- if (gestures_ctx->cov->n_taps == 0) {
- gestures_ctx->cov->tap_gesture_data.n_taps++;
- }
- } else {
- ERROR("Abort gesture");
- gestures_ctx->cov->tap_gesture_data.started = EINA_FALSE;
- }
- } else {
- ERROR("Unknown finger up, abort gesture");
- gestures_ctx->cov->tap_gesture_data.started = EINA_FALSE;
- }
- }
-}
-
-static void _tap_gestures_move(Ecore_Event_Mouse_Move * ev, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if (gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- int i;
- for (i = 0; i < sizeof(gestures_ctx->cov->tap_gesture_data.finger) / sizeof(gestures_ctx->cov->tap_gesture_data.finger[0]); i++) {
- if (ev->multi.device == gestures_ctx->cov->tap_gesture_data.finger[i]) {
- int dx = ev->root.x - gestures_ctx->cov->tap_gesture_data.x_org[i];
- int dy = ev->root.y - gestures_ctx->cov->tap_gesture_data.y_org[i];
-
- if ((dx * dx + dy * dy) > _e_mod_config->one_finger_tap_radius * _e_mod_config->one_finger_tap_radius) {
- DEBUG("abort tap gesutre");
- gestures_ctx->cov->tap_gesture_data.started = EINA_FALSE;
- ecore_timer_del(gestures_ctx->cov->tap_gesture_data.timer);
- gestures_ctx->cov->tap_gesture_data.timer = NULL;
- gestures_ctx->cov->tap_gesture_data.tap_type = ONE_FINGER_GESTURE;
- gestures_ctx->cov->tap_gesture_data.finger[0] = -1;
- gestures_ctx->cov->tap_gesture_data.finger[1] = -1;
- gestures_ctx->cov->tap_gesture_data.finger[2] = -1;
- }
- break;
- }
- }
-}
-
-static Eina_Bool _cb_mouse_down(void *data, int type EINA_UNUSED, void *event)
-{
- Ecore_Event_Mouse_Button *ev = event;
- Screen_Reader_Gestures_Data *gestures_ctx = (Screen_Reader_Gestures_Data *)data;
- if(gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- gestures_ctx->cov->n_taps++;
- gestures_ctx->cov->event_time = ev->timestamp;
-
- DEBUG("mouse down: multi.device: %d, taps: %d", ev->multi.device, gestures_ctx->cov->n_taps);
-
- win_angle = _win_angle_get();
-
- _flick_gesture_mouse_down(ev, gestures_ctx);
- _hover_gesture_mouse_down(ev, gestures_ctx);
- _tap_gestures_mouse_down(ev, gestures_ctx);
-
- free(gestures_ctx);
- return ECORE_CALLBACK_PASS_ON;
-}
-
-static Eina_Bool _cb_mouse_up(void *data, int type EINA_UNUSED, void *event)
-{
- Ecore_Event_Mouse_Button *ev = event;
- Screen_Reader_Gestures_Data *gestures_ctx = (Screen_Reader_Gestures_Data *)data;
- if(gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- gestures_ctx->cov->n_taps--;
- gestures_ctx->cov->event_time = ev->timestamp;
-
- DEBUG("mouse up, multi.device: %d, taps: %d", ev->multi.device, gestures_ctx->cov->n_taps);
-
- _flick_gesture_mouse_up(ev, gestures_ctx);
- _hover_gesture_mouse_up(ev, gestures_ctx);
- _tap_gestures_mouse_up(ev, gestures_ctx);
-
- return ECORE_CALLBACK_PASS_ON;
-}
-
-static Eina_Bool _cb_mouse_move(void *data, int type EINA_UNUSED, void *event)
-{
- Ecore_Event_Mouse_Move *ev = event;
- Screen_Reader_Gestures_Data *gestures_ctx = (Screen_Reader_Gestures_Data *)data;
- if(gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- gestures_ctx->cov->event_time = ev->timestamp;
-
- _flick_gesture_mouse_move(ev, gestures_ctx);
- _hover_gesture_mouse_move(ev, gestures_ctx);
- _tap_gestures_move(ev, gestures_ctx);
-
- return ECORE_CALLBACK_PASS_ON;
-}
-
-static Eina_Bool _gesture_input_win_create(Screen_Reader_Gestures_Data *gestures_ctx)
-{
- int w, h;
-
- if (gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- if (!gestures_ctx->win) {
-#ifdef X11_ENABLED
- Ecore_Window root = ecore_x_window_root_first_get();
- if (!root)
- return EINA_FALSE;
- ecore_x_window_geometry_get(root, NULL, NULL, &w, &h);
- gestures_ctx->win = ecore_x_window_input_new(root, 0, 0, w, h);
-#else
- ecore_wl_screen_size_get(&w, &h);
- gestures_ctx->win = ecore_wl_window_new(NULL, 0, 0, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW);
-#endif
- }
- if (!gestures_ctx->win)
- return EINA_FALSE;
-
-#ifdef X11_ENABLED
- ecore_x_input_multi_select(gestures_ctx->win);
- ecore_x_window_show(gestures_ctx->win);
- ecore_x_window_raise(gestures_ctx->win);
-#else
- ecore_wl_window_show(gestures_ctx->win);
- ecore_wl_window_raise(gestures_ctx->win);
-#endif
- // restet gestures
- memset(gestures_ctx->cov, 0x0, sizeof(gestures_ctx->cov));
-
- return EINA_TRUE;
-}
#ifdef X11_ENABLED
static Eina_Bool _win_property_changed(void *data, int type, void *event)
{
return EINA_TRUE;
}
#endif
-
-static Eina_Bool _gestures_input_window_init(Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if(gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return EINA_FALSE;
- }
-
-#ifdef X11_ENABLED
- Ecore_Window root = ecore_x_window_root_first_get();
- if (!root) {
- ERROR("No root window found. Is Window manager running?");
- return EINA_FALSE;
- }
- ecore_x_event_mask_set(root, ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
- gestures_ctx->property_changed_hld = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _win_property_changed, NULL);
-#endif
- return _gesture_input_win_create(gestures_ctx);
-}
-
-static void _gestures_input_widnow_shutdown(Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if(gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- return;
- }
-
- ecore_event_handler_del(gestures_ctx->property_changed_hld);
- if (gestures_ctx->win)
-#ifdef X11_ENABLED
- ecore_x_window_free(gestures_ctx->win);
-#else
- ecore_wl_window_free(gestures_ctx->win);
-#endif
- gestures_ctx->win = 0;
-}
-
-Screen_Reader_Gestures_Data *screen_reader_gestures_init(void)
-{
- Screen_Reader_Gestures_Data *gestures_ctx = calloc(1, sizeof(Screen_Reader_Gestures_Data));
- if (gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- free(gestures_ctx);
- return NULL;
- }
-
- ecore_init();
-#ifdef X11_ENABLED
- ecore_x_init(NULL);
-#else
- ecore_wl_init(NULL);
-#endif
-
- if (!_gestures_input_window_init(gestures_ctx)) {
- free(gestures_ctx);
- return NULL;
- }
-
- _e_mod_config = calloc(sizeof(Gestures_Config), 1);
- _e_mod_config->one_finger_flick_min_length = 100;
- _e_mod_config->one_finger_flick_max_time = 400;
- _e_mod_config->two_finger_flick_to_scroll_timeout = 100;
- _e_mod_config->two_finger_flick_to_scroll_min_length = 50;
- _e_mod_config->one_finger_hover_longpress_timeout = 0.81;
- _e_mod_config->one_finger_tap_timeout = 0.4;
- _e_mod_config->one_finger_tap_radius = 100;
-
- gestures_ctx->handlers = eina_list_append(NULL, ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _cb_mouse_move, gestures_ctx));
- gestures_ctx->handlers = eina_list_append(gestures_ctx->handlers, ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _cb_mouse_up, gestures_ctx));
- gestures_ctx->handlers = eina_list_append(gestures_ctx->handlers, ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _cb_mouse_down, gestures_ctx));
-
- return gestures_ctx;
-}
-
-void screen_reader_gestures_shutdown(Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if(gestures_ctx == NULL) {
- ERROR("NULL context parameter");
- free(gestures_ctx);
- return;
- }
-
- Ecore_Event_Handler *hdlr;
- EINA_LIST_FREE(gestures_ctx->handlers, hdlr) {
- ecore_event_handler_del(hdlr);
- }
- _gestures_input_widnow_shutdown(gestures_ctx);
-#ifdef X11_ENABLED
- ecore_x_shutdown();
-#else
- ecore_wl_shutdown();
-#endif
- ecore_shutdown();
- free(_e_mod_config);
- free(gestures_ctx);
-}
-
-void screen_reader_gestures_tracker_register(GestureCB cb, void *data, Screen_Reader_Gestures_Data *gestures_ctx)
-{
- if(gestures_ctx == NULL)
- ERROR("NULL context parameter");
-
- gestures_ctx->_global_cb = cb;
- gestures_ctx->_global_data = data;
-}
int last_caret_position;
};
-/**
- * @brief Debug function. Print current toolkit version/event
- * type/event source/event detail1/event detail2
- *
- * @param AtspiEvent instance
- *
- */
-static void display_info(const AtspiEvent *event)
-{
- AtspiAccessible *source = event->source;
- gchar *name = atspi_accessible_get_name(source, NULL);
- gchar *role = atspi_accessible_get_localized_role_name(source, NULL);
- gchar *toolkit = atspi_accessible_get_toolkit_name(source, NULL);
-
- DEBUG("--------------------------------------------------------");
- DEBUG("Toolkit: %s; Event_type: %s; (%d, %d)", toolkit, event->type, event->detail1, event->detail2);
- DEBUG("Name: %s; Role: %s", name, role);
- DEBUG("--------------------------------------------------------");
-}
-
bool allow_recursive_name(AtspiAccessible *obj)
{
AtspiRole r = atspi_accessible_get_role(obj, NULL);
return strdup(ret);
}
-static char *spi_on_state_changed_get_text(AtspiEvent *event, Screen_Reader_Spi_Data_t *spi_data)
-{
- char *name;
- char *names = NULL;
- char *description;
- char *role_name;
- char *other;
- char ret[256] = "\0";
-
- if (!spi_data)
- {
- ERROR("Invalid parameter");
- return NULL;
- }
-
- spi_data->currently_focused = event->source;
-
- description = atspi_accessible_get_description(spi_data->currently_focused, NULL);
- name = atspi_accessible_get_name(spi_data->currently_focused, NULL);
- role_name = atspi_accessible_get_localized_role_name(spi_data->currently_focused, NULL);
- other = generate_description_for_subtree(spi_data->currently_focused);
-
- DEBUG("->->->->->-> WIDGET GAINED HIGHLIGHT: %s <-<-<-<-<-<-<-", name);
- DEBUG("->->->->->-> FROM SUBTREE HAS NAME: %s <-<-<-<-<-<-<-", other);
-
- if (name && strncmp(name, "\0", 1))
- names = strdup(name);
- else if (other && strncmp(other, "\0", 1))
- names = strdup(other);
-
- if (names) {
- strncat(ret, names, sizeof(ret) - strlen(ret) - 1);
- strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
- }
-
- if (role_name)
- strncat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
-
- if (description) {
- if (strncmp(description, "\0", 1))
- strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
- strncat(ret, description, sizeof(ret) - strlen(ret) - 1);
- }
-
- free(name);
- free(names);
- free(description);
- free(role_name);
- free(other);
-
- return strdup(ret);
-}
-
-static char *spi_on_caret_move_get_text(AtspiEvent *event, void *user_data)
-{
- if (!user_data) {
- ERROR("Invalid parameter");
- return NULL;
- }
-
- Screen_Reader_Spi_Data_t *spi_data = (Screen_Reader_Spi_Data_t *)user_data;
- spi_data->currently_focused = event->source;
- if (spi_data->last_caret_position == event->detail1) // ignore fake moves, selection moves etc.
- return NULL;
-
- spi_data->last_caret_position = event->detail1;
-
- if (spi_data->ignore_next_caret_move) {
- spi_data->ignore_next_caret_move = EINA_FALSE;
- return NULL;
- }
-
- AtspiText *text_interface = atspi_accessible_get_text_iface(spi_data->currently_focused);
- char *return_text = NULL;
- if (text_interface) {
- DEBUG("->->->->->-> WIDGET CARET MOVED: %s <-<-<-<-<-<-<-", atspi_accessible_get_name(spi_data->currently_focused, NULL));
-
- int char_count = (int)atspi_text_get_character_count(text_interface, NULL);
- int caret_pos = atspi_text_get_caret_offset(text_interface, NULL);
- gchar *text = atspi_text_get_text(text_interface, caret_pos, caret_pos + 1, NULL);
- char *added_text = NULL;
-
- if (!caret_pos) {
- DEBUG("MIN POSITION REACHED");
- added_text = _("IDS_REACHED_MIN_POS");
- }
- else if (char_count == caret_pos) {
- DEBUG("MAX POSITION REACHED");
- added_text = _("IDS_REACHED_MAX_POS");
- }
-
- if (added_text)
- asprintf(&return_text, "%s %s", text, added_text);
- else
- asprintf(&return_text, "%s", text);
- g_free(text);
- g_object_unref(text_interface);
- }
-
- return return_text;
-}
-
-static int spi_get_text_interface_text_length(AtspiEvent *event, Screen_Reader_Spi_Data_t *spi_data)
-{
- AtspiText *text_interface;
-
- spi_data->currently_focused = event->source;
- text_interface = atspi_accessible_get_text_iface(spi_data->currently_focused);
-
- if (text_interface) {
- return (int)atspi_text_get_character_count(text_interface, NULL);
- }
-
- return -1;
-}
-
-static char *spi_on_value_changed_get_text(AtspiEvent *event, Screen_Reader_Spi_Data_t *spi_data)
-{
- char *text_to_read = NULL;
-
- spi_data->currently_focused = event->source;
-
- AtspiValue *value_interface = atspi_accessible_get_value_iface(spi_data->currently_focused);
-
- if (value_interface) {
- DEBUG("->->->->->-> WIDGET VALUE CHANGED: %s <-<-<-<-<-<-<-", atspi_accessible_get_name(spi_data->currently_focused, NULL));
-
- double current_temp_value = (double)atspi_value_get_current_value(value_interface, NULL);
-
- if (abs(current_temp_value - atspi_value_get_maximum_value(value_interface, NULL)) < EPS) {
- DEBUG("MAX VALUE REACHED");
-
- if (asprintf(&text_to_read, "%.2f %s", current_temp_value, _("IDS_REACHED_MAX_VAL")) < 0) {
- ERROR(MEMORY_ERROR);
- return NULL;
- }
- } else if (abs(current_temp_value - atspi_value_get_minimum_value(value_interface, NULL)) < EPS) {
- DEBUG("MIN VALUE REACHED");
- if (asprintf(&text_to_read, "%.2f %s", current_temp_value, _("IDS_REACHED_MIN_VAL")) < 0) {
- ERROR(MEMORY_ERROR);
- return NULL;
- }
- } else {
- if (asprintf(&text_to_read, "%.2f", current_temp_value) < 0) {
- ERROR(MEMORY_ERROR);
- return NULL;
- }
- }
- }
-
- return text_to_read;
-}
-
-static char *spi_on_text_delete(AtspiEvent *event, Screen_Reader_Spi_Data_t *spi_data)
-{
- char ret[TTS_MAX_TEXT_SIZE] = "\0";
-
- if (event->detail2 == 1) {
- strncpy(ret, g_value_get_string(&event->any_data), sizeof(ret) - 1);
- strncat(ret, _("IDS_REMOVED"), sizeof(ret) - strlen(ret) - 1);
- } else {
- strncpy(ret, _("IDS_TEXT_REMOVED"), sizeof(ret) - 1);
- }
-
- if (event->detail1 != spi_data->last_caret_position) {
- if (event->detail1 == 0) {
- strncat(ret, _("IDS_REACHED_MIN_POS"), sizeof(ret) - strlen(ret) - 1);
- }
- spi_data->ignore_next_caret_move = EINA_TRUE;
- } else if (event->detail1 == spi_get_text_interface_text_length(event, spi_data)) {
- strncat(ret, _("IDS_REACHED_MAX_POS"), sizeof(ret) - strlen(ret) - 1);
- }
-
- return strdup(ret);
-}
-
-char *spi_event_get_text_to_read(AtspiEvent *event, Service_Data *sd)
-{
- DEBUG("START");
-
- if (!sd) {
- ERROR("Invalid parameter");
- return NULL;
- }
-
- Screen_Reader_Spi_Data_t *spi_data = sd->spi_data;
-
- if (!spi_data) {
- ERROR("Invalid parameter");
- return NULL;
- }
-
- char *text_to_read = NULL;
-
- char *tracking_signal_name = get_tracking_signal_name(sd->vconf_data);
- if (!tracking_signal_name) {
- ERROR("Invalid tracking signal name");
- return NULL;
- }
-
- DEBUG("TRACK SIGNAL:%s", tracking_signal_name);
- DEBUG("WENT EVENT:%s", event->type);
-
- if (!strcmp(event->type, tracking_signal_name) && event->detail1 == 1) {
- text_to_read = spi_on_state_changed_get_text(event, spi_data);
-
- } else if (!strcmp(event->type, CARET_MOVED_SIG)) {
- text_to_read = spi_on_caret_move_get_text(event, spi_data);
-
- } else if (!strcmp(event->type, TEXT_INSERT_SIG)) {
- spi_data->ignore_next_caret_move = EINA_TRUE;
- if (event->detail2 == 1) {
- text_to_read = strdup(g_value_get_string(&event->any_data));
- } else {
- text_to_read = strdup(_("IDS_TEXT_INSERTED"));
- }
-
- } else if (!strcmp(event->type, TEXT_DELETE_SIG)) {
- text_to_read = spi_on_text_delete(event, spi_data);
-
- } else if (!strcmp(event->type, VALUE_CHANGED_SIG)) {
- text_to_read = spi_on_value_changed_get_text(event, spi_data);
-
- } else if (!strcmp(event->type, STATE_FOCUSED_SIG)) {
- spi_data->ignore_next_caret_move = EINA_TRUE;
- spi_data->last_caret_position = -1;
-
- } else {
- ERROR("Unknown event type");
- return NULL;
- }
-
- return text_to_read;
-}
-
-void spi_event_listener_cb(AtspiEvent *event, void *user_data)
-{
- DEBUG("START");
- display_info(event);
-
- if (!user_data) {
- ERROR("Invalid parameter");
- return;
- }
-
- Service_Data *service_data = (Service_Data *)user_data;
- if (!service_data) {
- ERROR("NULL context parameter");
- return;
- }
-
- Screen_Reader_Tts_Data_t *tts_data = service_data->tts_data;
- if (!tts_data) {
- ERROR("NULL context");
- return;
- }
- char *text_to_read = spi_event_get_text_to_read(event, service_data);
-
- if (!text_to_read) {
- DEBUG("No text to read");
- return;
- }
- DEBUG("SPEAK: %s", text_to_read);
- tts_speak_customized(text_to_read, EINA_TRUE, EINA_TRUE, event->source, tts_data);
-
- free(text_to_read);
- DEBUG("END");
-}
-
-/**
- * @brief Register new listener and log error if any
-**/
-static void spi_listener_register(AtspiEventListener *spi_listener, const char *signal_name)
-{
- GError *error = NULL;
-
- if (atspi_event_listener_register(spi_listener, signal_name, &error) == false) {
- ERROR("FAILED TO REGISTER spi %s listener. Error: %s", signal_name, error ? error->message : "no error message");
- if (error)
- g_clear_error(&error);
- } else {
- DEBUG("spi %s listener REGISTERED", signal_name);
- }
-}
-
-/**
- * @brief Initializer for screen-reader atspi listeners
- *
- * @param user_data screen-reader internal data
- *
-**/
-Screen_Reader_Spi_Data_t *spi_init(Service_Data *service_data)
-{
- DEBUG("--------------------- SPI_init START ---------------------");
-
- if (!service_data) {
- ERROR("Invalid parameter");
- return NULL;
- }
-
- char *tracking_signal_name = get_tracking_signal_name(service_data->vconf_data);
-
- Screen_Reader_Spi_Data_t *spi_data = malloc(sizeof(Screen_Reader_Spi_Data_t));
- spi_data->ignore_next_caret_move = EINA_FALSE;
- spi_data->last_caret_position = -1;
-
- DEBUG(">>> Creating listeners <<<");
-
- spi_data->spi_listener = atspi_event_listener_new(spi_event_listener_cb, service_data, NULL);
- if (spi_data->spi_listener == NULL) {
- DEBUG("FAILED TO CREATE spi state changed listener");
- }
- // ---------------------------------------------------------------------------------------------------
-
- DEBUG("TRACKING SIGNAL:%s", tracking_signal_name);
-
- spi_listener_register(spi_data->spi_listener, CARET_MOVED_SIG);
- spi_listener_register(spi_data->spi_listener, VALUE_CHANGED_SIG);
- spi_listener_register(spi_data->spi_listener, STATE_FOCUSED_SIG);
- spi_listener_register(spi_data->spi_listener, TEXT_INSERT_SIG);
- spi_listener_register(spi_data->spi_listener, TEXT_DELETE_SIG);
-
- DEBUG("---------------------- SPI_init END ----------------------\n\n");
-
- return spi_data;
-}
-
-void spi_shutdown(Screen_Reader_Spi_Data_t *spi_data)
-{
- DEBUG("[START]");
- //TODO unregister atspi listeners
- if (!spi_data) {
- ERROR("NULL context parameter");
- return;
- }
- free(spi_data);
- DEBUG("[END]");
-}