e_client: added to show resize rect while interactive resize instead of real time... 06/266506/1
authorJunseok, Kim <juns.kim@samsung.com>
Wed, 13 Oct 2021 00:40:44 +0000 (09:40 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Sat, 13 Nov 2021 04:19:06 +0000 (13:19 +0900)
This patch changes to show resize rectangle while interactive resizing.

Known Issue: If the resize evoke evas_object_move(resizing top-left edge),
then it can show flickering during move->resize sequence.

Known Issue2: Transformed window could be resize abnormaly

Change-Id: I74ea8df8f844cd68bf059979764a939cc7d78733

src/bin/e_client.c
src/bin/e_client.h

index c0a60082148041f8eb5b38cb7c43bb8cf25b769f..aae90bbe1cc2ac3a371d5f828a96c1065106a408 100644 (file)
@@ -72,6 +72,8 @@ static Eina_Bool _e_visibility_changed = EINA_FALSE;
 EINTERN void e_client_focused_set(E_Client *ec);
 static void _e_client_transient_for_group_make(E_Client *ec, Eina_List **list);
 static void _e_client_transform_core_update_with_zoom(E_Client *ec, double zoomx, double zoomy, int cx, int cy);
+static Evas_Object *_e_client_resize_object_create(E_Client *ec);
+static void _e_client_resize_object_del(E_Client *ec);
 
 static Eina_Inlist *_e_client_hooks[] =
 {
@@ -1366,6 +1368,8 @@ _e_client_del(E_Client *ec)
    e_util_transform_del(ec->desk_group.transform);
    ec->desk_group.transform = NULL;
 
+   _e_client_resize_object_del(ec);
+
    e_client_visibility_calculate();
 }
 
@@ -1637,6 +1641,34 @@ _e_client_moveinfo_gather(E_Client *ec, const char *source)
      }
 }
 
+static Evas_Object *
+_e_client_resize_object_create(E_Client *ec)
+{
+   Evas_Object *resize_obj;
+   resize_obj = evas_object_rectangle_add(ec->frame);
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(resize_obj, NULL);
+
+   evas_object_pass_events_set(resize_obj, EINA_TRUE);
+   evas_object_layer_set(resize_obj, evas_object_layer_get(ec->frame));
+   evas_object_stack_above(resize_obj, ec->frame);
+   evas_object_color_set(resize_obj, 128, 128, 128, 100);
+   evas_object_name_set(resize_obj, "resize_object");
+
+   return resize_obj;
+}
+
+static void
+_e_client_resize_object_del(E_Client *ec)
+{
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+   EINA_SAFETY_ON_NULL_RETURN(ec->manage_resize.resize_obj);
+
+   evas_object_hide(ec->manage_resize.resize_obj);
+   evas_object_del(ec->manage_resize.resize_obj);
+   ec->manage_resize.resize_obj = NULL;
+}
+
 static void
 _e_client_resize_handle(E_Client *ec)
 {
@@ -1741,7 +1773,19 @@ _e_client_resize_handle(E_Client *ec)
        (ec->resize_mode == E_POINTER_RESIZE_TR))
      new_y += (h - new_h);
 
-   evas_object_geometry_set(ec->frame, new_x, new_y, new_w, new_h);
+   if (ec->manage_resize.resize_obj == NULL)
+     {
+        ec->manage_resize.resize_obj = _e_client_resize_object_create(ec);
+        EINA_SAFETY_ON_NULL_RETURN(ec->manage_resize.resize_obj);
+     }
+
+   evas_object_geometry_set(ec->manage_resize.resize_obj, new_x, new_y, new_w, new_h);
+   evas_object_show(ec->manage_resize.resize_obj);
+
+   ec->manage_resize.x = new_x;
+   ec->manage_resize.y = new_y;
+   ec->manage_resize.w = new_w;
+   ec->manage_resize.h = new_h;
 }
 
 static int
@@ -1766,6 +1810,16 @@ _e_client_resize_end(E_Client *ec)
 
    ecresize = NULL;
 
+   if (ec->manage_resize.resize_obj)
+     {
+        evas_object_geometry_set(ec->frame,
+                                 ec->manage_resize.x,
+                                 ec->manage_resize.y,
+                                 ec->manage_resize.w,
+                                 ec->manage_resize.h);
+        _e_client_resize_object_del(ec);
+     }
+
    return 1;
 }
 
@@ -4455,6 +4509,9 @@ e_client_new(E_Pixmap *cp, int first_map, int internal)
    _e_client_hook_call(E_CLIENT_HOOK_NEW_CLIENT_POST, ec);
 #endif
 
+   ec->manage_resize.resize_obj = NULL;
+   ec->manage_resize.x = ec->manage_resize.y = ec->manage_resize.w = ec->manage_resize.h = 0;
+
    return ec;
 }
 
index d5798c5c702abb8b6ca8a6ae2f4198489dcf3b93..4b135b7aec978ddf7b41483f595d4b2021b64ad2 100644 (file)
@@ -1025,6 +1025,12 @@ struct E_Client
    } show_pending;
 
    E_Layer floating_saved_layer;
+
+   struct
+   {
+      int x, y, w, h;
+      Evas_Object *resize_obj;
+   } manage_resize;
 };
 
 #define e_client_focus_policy_click(ec) \