From: jeon Date: Tue, 22 Oct 2019 08:05:33 +0000 (+0900) Subject: e_comp_wl: move a cursor follow global positon X-Git-Tag: submit/tizen/20191219.081933~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F10%2F216210%2F8;p=platform%2Fupstream%2Fenlightenment.git e_comp_wl: move a cursor follow global positon - The enlightenment set evas_map to client for transform/zoom. - If an evas_map is set, mouse event's axis is changed but this changed axis is an window axis, so this is not matched to cursor position. - So get global position to calculate inverse from evas event's axis Change-Id: I7c237b042f9f48e0b60f6a1f0efe25fc64836594 --- diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index f957d438a4..1f78d00a53 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -411,6 +411,52 @@ e_comp_wl_map_apply(E_Client *ec) e_client_transform_core_update(ec); } +EINTERN void +e_comp_wl_map_inv_coord_get(E_Client *ec, int x, int y, int *mx, int *my) +{ + const Evas_Map *map; + int map_c; + int min_x = 0, min_y = 0, max_x = 0, max_y = 0; + int map_x = 0, map_y = 0; + double diff_w, diff_h; + + EINA_SAFETY_ON_NULL_RETURN(ec); + + map = evas_object_map_get(ec->frame); + map_c = evas_map_count_get(map); + + if (!map || map_c <= 0) + { + *mx = x; + *my = y; + return; + } + + for (int i = 0; i < map_c; i++) + { + evas_map_point_coord_get(map, i, &map_x, &map_y, NULL); + if (i == 0) + { + min_x = max_x = map_x; + min_y = max_y = map_y; + } + else + { + if (min_x > map_x) min_x = map_x; + else if (max_x < map_x) max_x = map_x; + + if (min_y > map_y) min_y = map_y; + else if (max_y < map_y) max_y = map_y; + } + } + + diff_w = (double)(max_x - min_x) / (double)ec->w; + diff_h = (double)(max_y - min_y) / (double)ec->h; + + *mx = (int)(x * diff_w) + min_x; + *my = (int)(y * diff_h) + min_y; +} + static void _e_comp_wl_evas_cb_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { @@ -1179,7 +1225,16 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o ec, 0, ev->radius_x, ev->radius_y, ev->pressure, ev->angle); _e_comp_wl_send_touch_move(ec, 0, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp); } - e_pointer_touch_move(e_comp->pointer, ev->cur.output.x, ev->cur.output.y); + + pointer_x = ev->cur.output.x; + pointer_y = ev->cur.output.y; + + if (evas_object_map_enable_get(ec->frame)) + { + e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y); + } + + e_pointer_touch_move(e_comp->pointer, pointer_x, pointer_y); } else { @@ -1194,8 +1249,11 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o pointer_x = ev->cur.output.x; pointer_y = ev->cur.output.y; - if (e_client_transform_core_enable_get(ec)) - e_client_transform_core_input_inv_rect_transform(ec, pointer_x, pointer_y, &pointer_x, &pointer_y); + + if (evas_object_map_enable_get(ec->frame)) + { + e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y); + } e_pointer_mouse_move(e_comp->pointer, pointer_x, pointer_y); if (e_config->use_cursor_timer) @@ -1244,7 +1302,16 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o _e_comp_wl_device_renew_axis(dev_name, evas_device_class_get(dev), ec, 0, ev->radius_x, ev->radius_y, ev->pressure, ev->angle); _e_comp_wl_evas_handle_mouse_button_to_touch(ec, ev->timestamp, ev->canvas.x, ev->canvas.y, EINA_TRUE); - e_pointer_touch_move(e_comp->pointer, ev->output.x, ev->output.y); + + pointer_x = ev->output.x; + pointer_y = ev->output.y; + + if (evas_object_map_enable_get(ec->frame)) + { + e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y); + } + + e_pointer_touch_move(e_comp->pointer, pointer_x, pointer_y); e_comp_wl->touch.pressed |= (1 << 0); } else @@ -1259,8 +1326,11 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o WL_POINTER_BUTTON_STATE_PRESSED); pointer_x = ev->output.x; pointer_y = ev->output.y; - if (e_client_transform_core_enable_get(ec)) - e_client_transform_core_input_inv_rect_transform(ec, pointer_x, pointer_y, &pointer_x, &pointer_y); + + if (evas_object_map_enable_get(ec->frame)) + { + e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y); + } e_pointer_mouse_move(e_comp->pointer, pointer_x, pointer_y); if (e_config->use_cursor_timer) diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index d0e7cc2f1b..49693b4747 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -573,6 +573,8 @@ E_API void e_comp_wl_map_size_cal_from_buffer(E_Client *ec); E_API void e_comp_wl_map_size_cal_from_viewport(E_Client *ec); E_API void e_comp_wl_map_apply(E_Client *ec); +EINTERN void e_comp_wl_map_inv_coord_get(E_Client *ec, int x, int y, int *mx, int *my); + E_API void e_comp_wl_input_cursor_timer_enable_set(Eina_Bool enabled); EINTERN void e_comp_wl_send_event_device(struct wl_client *wc, uint32_t timestamp, Ecore_Device *dev, uint32_t serial); diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index 326683f8e1..f89a381d80 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -950,9 +950,14 @@ e_desk_zoom_set(E_Desk *desk, double zoomx, double zoomy, int cx, int cy) { sd->zoom.enabled = EINA_TRUE; - evas_object_map_enable_set(desk->smart_obj, EINA_TRUE); - EINA_LIST_FOREACH(sd->clients, l, ec) - evas_object_map_enable_set(ec->frame, EINA_TRUE); + /* + * NOTE: evas_object_map_enable_set is called in _e_desk_client_zoom() + */ + /* + * evas_object_map_enable_set(desk->smart_obj, EINA_TRUE); + * EINA_LIST_FOREACH(sd->clients, l, ec) + * evas_object_map_enable_set(ec->frame, EINA_TRUE); + */ /* FIXME TEMP disable hwc */ _e_desk_util_comp_hwc_disable_set(EINA_TRUE); @@ -1051,7 +1056,12 @@ e_desk_zoom_unset(E_Desk *desk) _e_desk_object_zoom(desk->smart_obj, sd->zoom.ratio_x, sd->zoom.ratio_y, sd->zoom.cord_x, sd->zoom.cord_y); - evas_object_map_enable_set(desk->smart_obj, EINA_FALSE); + /* + * NOTE: evas_object_map_enable_set is called in _e_desk_client_zoom() + */ + /* + * evas_object_map_enable_set(desk->smart_obj, EINA_FALSE); + */ EINA_LIST_FOREACH(sd->clients, l, ec) { /* NOTE Is it really necessary? @@ -1460,6 +1470,8 @@ _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Eva Eina_Bool transformed; transformed = e_client_transform_core_enable_get(ec); + if (ec->is_cursor) return; + if (transformed) e_client_transform_core_update_with_desk_zoom(ec); else diff --git a/src/bin/e_devicemgr_input.c b/src/bin/e_devicemgr_input.c index 1ecc4e9a1b..aa960e5a14 100644 --- a/src/bin/e_devicemgr_input.c +++ b/src/bin/e_devicemgr_input.c @@ -53,9 +53,11 @@ e_devicemgr_input_pointer_warp(struct wl_client *client, struct wl_resource *res new_x = wl_fixed_to_int(x); new_y = wl_fixed_to_int(y); - if (e_client_transform_core_enable_get(ec)) - e_client_transform_core_input_inv_rect_transform(ec, wl_fixed_to_int(x), wl_fixed_to_int(y), &new_x, &new_y); + if (evas_object_map_enable_get(ec->frame)) + { + e_comp_wl_map_inv_coord_get(ec, new_x, new_y, &new_x, &new_y); + } ret = _e_devicemgr_input_pointer_warp(ec->client.x + new_x, ec->client.y + new_y); return ret; }