e_dnd: move mouse motion callback for drag to e_dnd
[platform/upstream/enlightenment.git] / src / bin / e_comp_wl.c
index eaf5c97..f00f5d7 100644 (file)
@@ -1286,6 +1286,22 @@ _e_comp_wl_check_cursor_timer_needed(E_Client *ec)
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_e_comp_wl_check_block_input(E_Client *ec)
+{
+   E_Client *modal_child = e_client_modal_child_get(ec);
+   if (modal_child)
+     {
+        if (modal_child->visible && !modal_child->iconic && (modal_child->visibility.obscured == E_VISIBILITY_UNOBSCURED))
+          {
+             ELOGF("Touch", "Block touch by Modal child(ec:%p, win:0x%08zx)", ec, modal_child, e_client_util_win_get(modal_child));
+             return EINA_TRUE;
+          }
+     }
+
+   return EINA_FALSE;
+}
+
 static void
 _e_comp_wl_evas_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event)
 {
@@ -1344,8 +1360,10 @@ _e_comp_wl_evas_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
                               wl_fixed_from_int(ev->canvas.y - ec->client.y));
         ec->pointer_enter_sent = EINA_TRUE;
      }
-
-   wl_signal_emit(&e_comp_wl->ptr_constraints.surface_mousein_signal, ec);
+   if (ev->timestamp)
+     wl_signal_emit(&e_comp_wl->ptr_constraints.surface_mousein_signal, ec);
+   else
+     ELOGF("Mouse", "In. Event doesn't have timestamp. no need to send signal", NULL);
 }
 
 static void
@@ -1401,7 +1419,10 @@ _e_comp_wl_evas_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
         wl_pointer_send_leave(res, serial, surface);
         ec->pointer_enter_sent = EINA_FALSE;
      }
-   wl_signal_emit(&e_comp_wl->ptr_constraints.surface_mouseout_signal, ec);
+   if (ev->timestamp)
+     wl_signal_emit(&e_comp_wl->ptr_constraints.surface_mouseout_signal, ec);
+   else
+     ELOGF("Mouse", "Out. Event doesn't have timestamp. no need to send signal", NULL);
 }
 
 static void
@@ -1416,6 +1437,8 @@ _e_comp_wl_send_touch(E_Client *ec, int idx, int canvas_x, int canvas_y, uint32_
 
    if (!ec) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
+   if (_e_comp_wl_check_block_input(ec)) return;
+
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
    if (!surface) return;
 
@@ -1464,6 +1487,8 @@ _e_comp_wl_send_touch_move(E_Client *ec, int idx, int canvas_x, int canvas_y, ui
    if (!ec) return;
    if (ec->cur_mouse_action) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
+   if (_e_comp_wl_check_block_input(ec)) return;
+
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
    if (!surface) return;
 
@@ -1626,6 +1651,7 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
 
    if (!ec) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
+   if (_e_comp_wl_check_block_input(ec)) return;
 
    dev = ev->dev;
    dev_name = evas_device_description_get(dev);
@@ -1684,6 +1710,7 @@ _e_comp_wl_evas_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *even
    if (!ec) return;
    if (ec->cur_mouse_action) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
+   if (_e_comp_wl_check_block_input(ec)) return;
 
    if (!need_send_released)
      {
@@ -1820,6 +1847,8 @@ _e_comp_wl_evas_cb_multi_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
 
    if (!ec) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
+   if (_e_comp_wl_check_block_input(ec)) return;
+
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
    if (!surface) return;
 
@@ -1864,6 +1893,8 @@ _e_comp_wl_evas_cb_multi_up(void *data, Evas *evas, Evas_Object *obj EINA_UNUSED
 
    if (!ec) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
+   if (_e_comp_wl_check_block_input(ec)) return;
+
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
    if (!surface) return;
 
@@ -2045,11 +2076,13 @@ static void
 _e_comp_wl_input_thread_focus_in(void *data)
 {
    struct wl_resource *surface = NULL;
-   memcpy(&surface, data, sizeof(struct wl_resource *));
    struct wl_resource *res;
    struct wl_client *wc;
    Eina_List *l;
 
+   EINA_SAFETY_ON_NULL_RETURN(data);
+   surface = *(struct wl_resource **)data;
+
    wc = wl_resource_get_client(surface);
 
    EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
@@ -2094,7 +2127,7 @@ e_comp_wl_feed_focus_in(E_Client *ec)
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
    if (!surface) return;
 
-   INF("send focus in request to input thread. resource %p\n", surface);
+   INF("send focus in request to input thread. surface(%p)\n", surface);
    e_input_thread_safe_call(_e_comp_wl_input_thread_focus_in, (void *)&surface, sizeof(struct wl_resource *));
 
    ec->comp_data->on_focus_timer =
@@ -2122,7 +2155,9 @@ _e_comp_wl_input_thread_focus_out(void *data)
    Eina_List *l, *ll;
    double t;
 
-   memcpy(&surface, data, sizeof(struct wl_resource *));
+   EINA_SAFETY_ON_NULL_RETURN(data);
+
+   surface = *(struct wl_resource **)data;
 
    /* update keyboard modifier state */
    wl_array_for_each(k, &e_comp_input_key->kbd.keys)
@@ -2168,220 +2203,11 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
      _e_comp_wl_client_priority_normal(ec);
 
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
-   INF("send focus out request to input thread. resource %p\n", surface);
+   INF("send focus out request to input thread. surface(%p)\n", surface);
    e_input_thread_safe_call(_e_comp_wl_input_thread_focus_out, (void *)&surface, sizeof(struct wl_resource *));
 }
 
 static void
-_e_comp_wl_evas_cb_resize(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec;
-
-   if (!(ec = data)) return;
-
-   if (!ec->comp_data->shell.configure_send) return;
-
-   /* TODO: calculate x, y with transfrom object */
-   if ((e_client_util_resizing_get(ec)) && (!ec->transformed) && (e_comp_wl->resize.edges))
-     {
-        int w, h;
-
-        w = ec->mouse.last_down[ec->moveinfo.down.button - 1].w;
-        h = ec->mouse.last_down[ec->moveinfo.down.button - 1].h;
-        if (e_comp_object_frame_exists(ec->frame))
-          e_comp_object_frame_wh_unadjust(ec->frame, w, h, &w, &h);
-
-        switch (ec->resize_mode)
-          {
-           case E_POINTER_RESIZE_TL:
-           case E_POINTER_RESIZE_L:
-           case E_POINTER_RESIZE_BL:
-             w += ec->mouse.last_down[ec->moveinfo.down.button - 1].mx -
-               ec->mouse.current.mx;
-             break;
-           case E_POINTER_RESIZE_TR:
-           case E_POINTER_RESIZE_R:
-           case E_POINTER_RESIZE_BR:
-             w += ec->mouse.current.mx - ec->mouse.last_down[ec->moveinfo.down.button - 1].mx;
-             break;
-           default:
-             break;;
-          }
-        switch (ec->resize_mode)
-          {
-           case E_POINTER_RESIZE_TL:
-           case E_POINTER_RESIZE_T:
-           case E_POINTER_RESIZE_TR:
-             h += ec->mouse.last_down[ec->moveinfo.down.button - 1].my -
-               ec->mouse.current.my;
-             break;
-           case E_POINTER_RESIZE_BL:
-           case E_POINTER_RESIZE_B:
-           case E_POINTER_RESIZE_BR:
-             h += ec->mouse.current.my - ec->mouse.last_down[ec->moveinfo.down.button - 1].my;
-             break;
-           default:
-             break;
-          }
-        w = E_CLAMP(w, 1, w);
-        h = E_CLAMP(h, 1, h);
-        e_client_resize_limit(ec, &w, &h);
-
-        e_client_shell_configure_send(ec, e_comp_wl->resize.edges, w, h);
-     }
-   else if ((!ec->fullscreen) && (!ec->maximized) &&
-            (!ec->comp_data->maximize_pre))
-     {
-        int pw = 0;
-        int ph = 0;
-        e_pixmap_size_get(ec->pixmap, &pw, &ph);
-        if ((pw != ec->w) || (ph != ec->h))
-          {
-             _e_comp_wl_configure_send(ec, 1, 1);
-          }
-     }
-
-   if (ec->comp_data->sub.below_obj)
-     e_comp_wl_subsurface_bg_rectangle_map_apply(ec);
-}
-
-static void
-_e_comp_wl_evas_cb_maximize_pre(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec = data;
-
-   ec->comp_data->maximize_pre = 1;
-}
-
-static void
-_e_comp_wl_evas_cb_maximize_done(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec = data;
-   int w, h;
-
-   if (e_object_is_del(E_OBJECT(ec))) return;
-
-   e_client_maximized_geometry_get(ec, NULL, NULL, &w, &h);
-   e_client_shell_configure_send(ec, 0, w, h);
-
-   ec->comp_data->maximize_pre = 0;
-}
-
-static void
-_e_comp_wl_evas_cb_unmaximize_pre(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec = data;
-
-   ec->comp_data->maximize_pre = 1;
-}
-
-static void
-_e_comp_wl_evas_cb_unmaximize_done(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec = data;
-
-   if (e_object_is_del(E_OBJECT(ec))) return;
-
-   /* check for wayland pixmap */
-
-   if (ec->comp_data->shell.configure_send)
-     _e_comp_wl_configure_send(ec, 0, 0);
-
-   ec->comp_data->maximize_pre = 0;
-}
-
-static void
-_e_comp_wl_evas_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec = data;
-
-   if (e_object_is_del(E_OBJECT(ec))) return;
-
-   /* check for wayland pixmap */
-
-   if (ec->comp_data->shell.configure_send)
-     _e_comp_wl_configure_send(ec, 0, 1);
-
-   ec->comp_data->maximize_pre = 0;
-}
-
-static void
-_e_comp_wl_evas_cb_unfullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec = data;
-
-   if (e_object_is_del(E_OBJECT(ec))) return;
-
-   /* check for wayland pixmap */
-
-   if (ec->comp_data->shell.configure_send)
-     _e_comp_wl_configure_send(ec, 0, 0);
-
-   ec->comp_data->maximize_pre = 0;
-}
-
-static void
-_e_comp_wl_evas_cb_delete_request(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec;
-
-   if (!(ec = data)) return;
-
-   e_comp_ignore_win_del(E_PIXMAP_TYPE_WL, e_pixmap_window_get(ec->pixmap));
-
-   e_object_del(E_OBJECT(ec));
-
-   _e_comp_wl_focus_check();
-
-   /* TODO: Delete request send ??
-    * NB: No such animal wrt wayland */
-}
-
-static void
-_e_comp_wl_evas_cb_kill_request(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec;
-
-   if (!(ec = data)) return;
-
-   e_comp_ignore_win_del(E_PIXMAP_TYPE_WL, e_pixmap_window_get(ec->pixmap));
-   if (ec->comp_data)
-     {
-        if (ec->comp_data->reparented)
-          e_client_comp_hidden_set(ec, EINA_TRUE);
-     }
-
-   evas_object_pass_events_set(ec->frame, EINA_TRUE);
-   if (ec->visible) evas_object_hide(ec->frame);
-   if (!ec->internal) e_object_del(E_OBJECT(ec));
-
-   _e_comp_wl_focus_check();
-}
-
-static void
-_e_comp_wl_evas_cb_ping(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Client *ec;
-
-   if (!(ec = data)) return;
-
-   e_client_shell_ping(ec);
-}
-
-static void
-_e_comp_wl_evas_cb_color_set(void *data, Evas_Object *obj, void *event EINA_UNUSED)
-{
-   E_Client *ec;
-   int a = 0;
-
-   if (!(ec = data)) return;
-   evas_object_color_get(obj, NULL, NULL, NULL, &a);
-   if (ec->netwm.opacity == a) return;
-   ec->netwm.opacity = a;
-   ec->netwm.opacity_changed = EINA_TRUE;
-}
-
-static void
 _e_comp_wl_buffer_damage_set(E_Comp_Wl_Buffer *buffer, Eina_List *buffer_damages)
 {
    Eina_Rectangle *damage_rect = NULL;
@@ -2447,25 +2273,6 @@ _e_comp_wl_client_evas_init(E_Client *ec)
    evas_object_event_callback_priority_add(ec->frame, EVAS_CALLBACK_FOCUS_IN,    EVAS_CALLBACK_PRIORITY_AFTER, _e_comp_wl_evas_cb_focus_in,    ec);
    evas_object_event_callback_priority_add(ec->frame, EVAS_CALLBACK_FOCUS_OUT,   EVAS_CALLBACK_PRIORITY_AFTER, _e_comp_wl_evas_cb_focus_out,   ec);
 
-   if (!ec->override)
-     {
-        evas_object_smart_callback_add(ec->frame, "client_resize",   _e_comp_wl_evas_cb_resize,          ec);
-        evas_object_smart_callback_add(ec->frame, "maximize_pre",    _e_comp_wl_evas_cb_maximize_pre,    ec);
-        evas_object_smart_callback_add(ec->frame, "maximize_done",   _e_comp_wl_evas_cb_maximize_done,   ec);
-        evas_object_smart_callback_add(ec->frame, "unmaximize_pre",  _e_comp_wl_evas_cb_unmaximize_pre,  ec);
-        evas_object_smart_callback_add(ec->frame, "unmaximize_done", _e_comp_wl_evas_cb_unmaximize_done, ec);
-        evas_object_smart_callback_add(ec->frame, "fullscreen",      _e_comp_wl_evas_cb_fullscreen,      ec);
-        evas_object_smart_callback_add(ec->frame, "unfullscreen",    _e_comp_wl_evas_cb_unfullscreen,    ec);
-     }
-
-   /* setup delete/kill callbacks */
-   evas_object_smart_callback_add(ec->frame, "delete_request", _e_comp_wl_evas_cb_delete_request, ec);
-   evas_object_smart_callback_add(ec->frame, "kill_request",   _e_comp_wl_evas_cb_kill_request,   ec);
-
-   /* setup ping callback */
-   evas_object_smart_callback_add(ec->frame, "ping",           _e_comp_wl_evas_cb_ping,           ec);
-   evas_object_smart_callback_add(ec->frame, "color_set",      _e_comp_wl_evas_cb_color_set,      ec);
-
    ec->comp_data->evas_init = EINA_TRUE;
 }
 
@@ -2493,23 +2300,6 @@ _e_comp_wl_client_evas_deinit(E_Client *ec)
    evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_FOCUS_IN,  _e_comp_wl_evas_cb_focus_in);
    evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_FOCUS_OUT, _e_comp_wl_evas_cb_focus_out);
 
-   if (!ec->override)
-     {
-        evas_object_smart_callback_del(ec->frame, "client_resize",   _e_comp_wl_evas_cb_resize);
-        evas_object_smart_callback_del(ec->frame, "maximize_pre",    _e_comp_wl_evas_cb_maximize_pre);
-        evas_object_smart_callback_del(ec->frame, "maximize_done",   _e_comp_wl_evas_cb_maximize_done);
-        evas_object_smart_callback_del(ec->frame, "unmaximize_pre",  _e_comp_wl_evas_cb_unmaximize_pre);
-        evas_object_smart_callback_del(ec->frame, "unmaximize_done", _e_comp_wl_evas_cb_unmaximize_done);
-        evas_object_smart_callback_del(ec->frame, "fullscreen",      _e_comp_wl_evas_cb_fullscreen);
-        evas_object_smart_callback_del(ec->frame, "unfullscreen",    _e_comp_wl_evas_cb_unfullscreen);
-     }
-
-   evas_object_smart_callback_del(ec->frame, "delete_request", _e_comp_wl_evas_cb_delete_request);
-   evas_object_smart_callback_del(ec->frame, "kill_request",   _e_comp_wl_evas_cb_kill_request);
-
-   evas_object_smart_callback_del(ec->frame, "ping",           _e_comp_wl_evas_cb_ping);
-   evas_object_smart_callback_del(ec->frame, "color_set",      _e_comp_wl_evas_cb_color_set);
-
    ec->comp_data->evas_init = EINA_FALSE;
 }
 
@@ -2587,65 +2377,9 @@ _e_comp_wl_cb_comp_object_add(void *data EINA_UNUSED, int type EINA_UNUSED, E_Ev
 static Eina_Bool
 _e_comp_wl_cb_mouse_move(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Move *ev)
 {
-   int ec_x, ec_y;
-
    e_comp_wl->ptr.x = wl_fixed_from_int(ev->x);
    e_comp_wl->ptr.y = wl_fixed_from_int(ev->y);
 
-   if (e_comp_wl->selection.target &&
-       e_comp_wl->drag)
-     {
-        struct wl_resource *res;
-        int x, y;
-        E_Client *ec = NULL;
-        E_Client *legacy_target = e_comp_wl->selection.target;
-        int device_id = e_comp_wl_data_current_device_id_get();
-
-        if (device_id < 0)
-          {
-             e_comp_wl_data_current_device_id_set(ev->multi.device);
-          }
-        else if (device_id != ev->multi.device)
-          {
-             return ECORE_CALLBACK_RENEW;
-          }
-
-        ec = e_client_under_position_input_get(legacy_target->desk, ev->x, ev->y);
-        EINA_SAFETY_ON_NULL_RETURN_VAL(ec, ECORE_CALLBACK_RENEW);
-
-        struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
-        EINA_SAFETY_ON_NULL_RETURN_VAL(surface, ECORE_CALLBACK_RENEW);
-
-        res = e_comp_wl_data_find_for_client(wl_resource_get_client(surface));
-        EINA_SAFETY_ON_NULL_RETURN_VAL(res, ECORE_CALLBACK_RENEW);
-
-        if ((e_comp_wl->drag_offer != wl_resource_get_user_data(res)) &&
-            (ec != legacy_target))
-          {
-             e_comp_wl_data_device_send_leave(legacy_target);
-             e_comp_wl_data_device_send_enter(ec);
-          }
-
-        if (e_comp_wl->drag)
-          e_drag_move(e_comp_wl->drag, ev->x, ev->y);
-
-        if (e_client_transform_core_enable_get(ec))
-          {
-             int trans_x, trans_y;
-             e_client_transform_core_input_transform(ec, ev->x, ev->y, &trans_x, &trans_y);
-             x = trans_x - ec->client.x;
-             y = trans_y - ec->client.y;
-          }
-        else
-          {
-             e_client_geometry_get(ec, &ec_x, &ec_y, NULL, NULL);
-             x = ev->x - ec_x;
-             y = ev->y - ec_y;
-          }
-
-        wl_data_device_send_motion(res, ev->timestamp, wl_fixed_from_int(x), wl_fixed_from_int(y));
-     }
-
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -3256,10 +2990,10 @@ _e_comp_wl_surface_render_stop(E_Client *ec)
 static void
 _e_input_thread_client_free(void *data)
 {
-   E_Input_Thread_Request_EClient_Data ec_free_data;
-   memcpy(&ec_free_data, data, sizeof(E_Input_Thread_Request_EClient_Data));
+   E_Input_Thread_Request_EClient_Data *ec_data = data;
+   EINA_SAFETY_ON_NULL_RETURN(ec_data);
 
-   INF("[input thread|e_client_free] ec: %p, surface: %p\n", ec_free_data.ec, ec_free_data.wl_surface);
+   INF("[input thread|%s] ec: %p, surface: %p\n", __func__, ec_data->ec, ec_data->wl_surface);
 }
 
 EINTERN void
@@ -3678,45 +3412,6 @@ _e_comp_wl_gl_popup_cb_focus(void *data,
 static Eina_Bool
 _e_comp_wl_gl_idle(void *data)
 {
-   if (!e_comp->gl)
-     {
-        /* show warning window to notify failure of gl init */
-        // TODO: yigl
-#if 0
-        Evas_Object *win, *bg, *popup, *btn;
-
-        win = elm_win_add(NULL, "compositor warning", ELM_WIN_BASIC);
-        elm_win_title_set(win, "Compositor Warning");
-        elm_win_autodel_set(win, EINA_TRUE);
-        elm_win_borderless_set(win, EINA_TRUE);
-        elm_win_role_set(win, "notification-low");
-        elm_win_alpha_set(win, EINA_TRUE);
-
-        bg = evas_object_rectangle_add(evas_object_evas_get(win));
-        evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-        elm_win_resize_object_add(win, bg);
-        evas_object_color_set(bg, 125, 125, 125, 125);
-        evas_object_show(bg);
-
-        popup = elm_popup_add(win);
-        elm_object_text_set(popup,
-                            _( "Your screen does not support OpenGL.<br>"
-                               "Falling back to software engine."));
-        elm_object_part_text_set(popup, "title,text", "Compositor Warning");
-
-        btn = elm_button_add(popup);
-        elm_object_text_set(btn, "Close");
-        elm_object_part_content_set(popup, "button1", btn);
-        evas_object_show(btn);
-
-        evas_object_smart_callback_add(win, "focus,in", _e_comp_wl_gl_popup_cb_focus, popup);
-        evas_object_smart_callback_add(btn, "unpressed", _e_comp_wl_gl_popup_cb_close, win);
-
-        evas_object_show(popup);
-        evas_object_show(win);
-#endif
-     }
-
    return ECORE_CALLBACK_CANCEL;
 }