ecore_wl2: support maximize direction feature 94/283094/18
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 18 Oct 2022 05:01:40 +0000 (14:01 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 21 Nov 2022 08:35:11 +0000 (17:35 +0900)
We add a maximize direction feature to support various maximize type.

Change-Id: I56af363384e703779e485402b07964c8d14f5c37

src/lib/ecore_wl2/Ecore_Wl2.h
src/lib/ecore_wl2/ecore_wl2_display.c
src/lib/ecore_wl2/ecore_wl2_private.h
src/lib/ecore_wl2/ecore_wl2_window.c

index e38dfe7..1e7bf07 100644 (file)
@@ -535,6 +535,16 @@ typedef enum _Ecore_Wl2_Clipboard_State
 } Ecore_Wl2_Clipboard_State;
 //
 
+// TIZEN_ONLY(20221121): support a maximize direction
+typedef enum _Ecore_Wl2_Maximize_Direction
+{
+   ECORE_WL2_MAXIMIZE_DIRECTION_NONE, // unmaximize
+   ECORE_WL2_MAXIMIZE_DIRECTION_ALL, // maximize to full screen
+   ECORE_WL2_MAXIMIZE_DIRECTION_LEFT, // maximize to left side of screen
+   ECORE_WL2_MAXIMIZE_DIRECTION_RIGHT, // maximize to right side of screen
+} Ecore_Wl2_Maximize_Direction;
+//
+
 /** @internal */
 typedef struct _Ecore_Wl2_Event_Aux_Hint_Allowed
 {
@@ -1300,6 +1310,24 @@ EAPI Eina_Bool ecore_wl2_window_maximized_get(Ecore_Wl2_Window *window);
  */
 EAPI void ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized);
 
+// TIZEN_ONLY(20221121): support a maximize direction
+/**
+ * @internal
+ *
+ * Set the maximized state of a given window with a maximize direction
+ * If the type is ECORE_WL2_MAXIMIZE_DIRECTION_NONE, this means unmaximizing window.
+ * This is same to call ecore_wl2_window_maximized_set(window, EINA_FALSE).
+ * If the type is ECORE_WL2_MAXIMIZE_DIRECTION_ALL, this is same to call ecore_wl2_window_maximized_set(window, EINA_TRUE).
+ *
+ * @param window The window to set the maximized state of
+ * @param direction ECORE_WL2_MAXIMIZE_DIRECTION_NONE to unmaximize, otherwise maximize to specific direction
+ *
+ * @see ecore_wl2_window_maximized_set
+ * @ingroup Ecore_Wl2_Window_Group
+ */
+EAPI void ecore_wl2_window_maximized_set_with_direction(Ecore_Wl2_Window *window, Ecore_Wl2_Maximize_Direction direction);
+//
+
 /**
  * @internal
  *
index 1f4e322..1e432a2 100644 (file)
@@ -886,8 +886,8 @@ _cb_global_add(void *data, struct wl_registry *registry, unsigned int id, const
    // TIZEN_ONLY : To use tizen protocols
    else if (!strcmp(interface, "tizen_policy"))
      {
-        if (version >= 10)
-          client_version = 10;
+        if (version >= 12)
+          client_version = 12;
         else
           client_version = version;
 
index e319591..8263915 100644 (file)
@@ -451,6 +451,10 @@ struct _Ecore_Wl2_Window
    // TIZEN_ONLY(20210903): for transient_for below
    Eina_Bool below_child;
    //
+
+   // TIZEN_ONLY(20221121): for maximize direction
+   Ecore_Wl2_Maximize_Direction maximize_direction;
+   //
 };
 
 struct _Ecore_Wl2_Output
index f2dd236..a238708 100644 (file)
@@ -2084,16 +2084,54 @@ ecore_wl2_window_maximized_get(Ecore_Wl2_Window *window)
    return window->set_config.maximized;
 }
 
+static Eina_Bool
+_ecore_wl2_window_maximized_direction_set(Ecore_Wl2_Window *window, Ecore_Wl2_Maximize_Direction direction)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(window->surface, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(window->display->wl.tz_policy, EINA_FALSE);
+
+   window->maximize_direction = direction;
+
+   uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
+
+#ifdef TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION
+   if (ver < TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION)
+     {
+        ERR("[WINDOW] Maximize direction is not supported on this version(%d). It is supported since version %d.",
+            ver, TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION);
+        return EINA_FALSE;
+     }
+
+   tizen_policy_set_maximize_direction(window->display->wl.tz_policy, window->surface, direction);
+
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
+
 EAPI void
-ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
+ecore_wl2_window_maximized_set_with_direction(Ecore_Wl2_Window *window, Ecore_Wl2_Maximize_Direction direction)
 {
-   Eina_Bool prev;
+   Eina_Bool maximized = EINA_TRUE;
+   Eina_Bool changed_maximize_state = EINA_FALSE;
 
    EINA_SAFETY_ON_NULL_RETURN(window);
 
-   prev = window->set_config.maximized;
-   maximized = !!maximized;
-   if (prev == maximized) return;
+   if (window->maximize_direction == direction)
+     {
+        ERR("[WINDOW] win:%d, SAME direction:%d... so return.......", window->resource_id, direction);
+        return;
+     }
+
+   _ecore_wl2_window_maximized_direction_set(window, direction);
+
+   if (direction == ECORE_WL2_MAXIMIZE_DIRECTION_NONE)
+     maximized = EINA_FALSE;
+
+   if (window->set_config.maximized != maximized)
+     changed_maximize_state = EINA_TRUE;
 
    window->set_config.maximized = maximized;
    if (window->updating)
@@ -2102,23 +2140,27 @@ ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
         return;
      }
 
-   if (maximized)
+   if (changed_maximize_state)
      {
-        if (!window->set_config.fullscreen)
-          window->saved = window->set_config.geometry;
+        if (maximized)
+          {
+             if (!window->set_config.fullscreen)
+               window->saved = window->set_config.geometry;
 
-        if (window->xdg_toplevel)
-          xdg_toplevel_set_maximized(window->xdg_toplevel);
-        if (window->zxdg_toplevel)
-          zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
-     }
-   else
-     {
-        if (window->xdg_toplevel)
-          xdg_toplevel_unset_maximized(window->xdg_toplevel);
-        if (window->zxdg_toplevel)
-          zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
+             if (window->xdg_toplevel)
+               xdg_toplevel_set_maximized(window->xdg_toplevel);
+             if (window->zxdg_toplevel)
+               zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
+          }
+        else
+          {
+             if (window->xdg_toplevel)
+               xdg_toplevel_unset_maximized(window->xdg_toplevel);
+             if (window->zxdg_toplevel)
+               zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
+          }
      }
+
    /* TIZEN_ONLY(20190522): The window properties of ecore_evas are updated in
     * _ecore_evas_wl_common_cb_window_configure.
     * To call _ecore_evas_wl_common_cb_window_configure,
@@ -2130,6 +2172,15 @@ ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
    ecore_wl2_display_flush(window->display);
 }
 
+EAPI void
+ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
+{
+   if (maximized)
+     ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_ALL);
+   else
+     ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_NONE);
+}
+
 EAPI Eina_Bool
 ecore_wl2_window_fullscreen_get(Ecore_Wl2_Window *window)
 {