support a new feature for maximize direction 99/284299/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 8 Nov 2022 08:27:23 +0000 (17:27 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 15 Nov 2022 06:12:34 +0000 (15:12 +0900)
We add a feature for maximize direction.
- New enumeration : E_Maximize_Direction
- Implement a function for tizen_policy_set_maximize_direction

Change-Id: Ibb7741babcf050fd3f3d73293a0e2a4ea1f2f361

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_policy_wl.c
src/bin/e_xdg_shell_v6.c

index 526ac4af2f6dd17de4a2fc42398c6d819fd24863..8fcabd6aa4f79706c97d7ecd85c78c25eb785cac 100644 (file)
@@ -6104,9 +6104,9 @@ e_client_maximize(E_Client *ec, E_Maximize max)
 
    if ((ec->shaded) || (ec->shading)) return;
 
-   /* Only allow changes in vertical/ horizontal maximization */
-   if (((ec->maximized & E_MAXIMIZE_DIRECTION) == (max & E_MAXIMIZE_DIRECTION)) ||
-       ((ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
+   if ((ec->maximized & E_MAXIMIZE_DIRECTION) == (max & E_MAXIMIZE_DIRECTION))
+     return;
+
    if (ec->new_client)
      {
         ec->changes.need_maximize = 1;
@@ -6139,10 +6139,7 @@ e_client_maximize(E_Client *ec, E_Maximize max)
 
    _e_client_maximize(ec, max);
 
-   /* Remove previous type */
-   ec->maximized &= ~E_MAXIMIZE_TYPE;
-   /* Add new maximization. It must be added, so that VERTICAL + HORIZONTAL == BOTH */
-   ec->maximized |= max;
+   ec->maximized = max;
    ec->changes.need_unmaximize = 0;
 
    if ((ec->maximized & E_MAXIMIZE_DIRECTION) > E_MAXIMIZE_BOTH)
index 80e6eec03f6ebf18d1211d65c18d5e5490db4d60..0a881e34dc054f5505b01d25507948688922783c 100644 (file)
@@ -104,6 +104,14 @@ typedef enum _E_Maximize
    E_MAXIMIZE_DIRECTION = 0x000000f0
 } E_Maximize;
 
+typedef enum _E_Maximize_Direction
+{
+   E_MAXIMIZE_DIRECTION_NONE,
+   E_MAXIMIZE_DIRECTION_ALL,
+   E_MAXIMIZE_DIRECTION_LEFT,
+   E_MAXIMIZE_DIRECTION_RIGHT,
+} E_Maximize_Direction;
+
 // TODO: should be removed - yigl
 typedef enum _E_Fullscreen
 {
@@ -1055,6 +1063,8 @@ struct E_Client
    } maximized_info;
 
    Eina_Bool desk_zoom;
+
+   E_Maximize_Direction maximize_dir;
 };
 
 #define e_client_focus_policy_click(ec) \
index fc70df622e0689f3669d17422507cac76ccaec14..6ca3e180cdb0026419489f9ef0f5c0201dfbfdec 100644 (file)
@@ -3451,6 +3451,44 @@ _tzpol_iface_cb_set_parent_with_below(struct wl_client *client, struct wl_resour
    e_policy_stack_transient_for_below_set(ec, parent_ec, EINA_FALSE);
 }
 
+static void
+_tzpol_iface_cb_set_maximize_direction(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzpol EINA_UNUSED, struct wl_resource *surf, uint32_t direction)
+{
+   E_Client *ec;
+
+   ec = wl_resource_get_user_data(surf);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+   EINA_SAFETY_ON_NULL_RETURN(ec->frame);
+
+   ELOGF("TZPOL", "Set Maximize_direction. direction:%d", ec, direction);
+
+   if (direction == TIZEN_POLICY_MAXIMIZE_DIRECTION_NONE)
+     {
+        ec->maximize_dir = E_MAXIMIZE_DIRECTION_NONE;
+        e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
+     }
+   else if (direction == TIZEN_POLICY_MAXIMIZE_DIRECTION_ALL)
+     {
+        ec->maximize_dir = E_MAXIMIZE_DIRECTION_ALL;
+        e_client_maximize(ec, E_MAXIMIZE_EXPAND | E_MAXIMIZE_BOTH);
+     }
+   else if (direction == TIZEN_POLICY_MAXIMIZE_DIRECTION_LEFT)
+     {
+        ec->maximize_dir = E_MAXIMIZE_DIRECTION_LEFT;
+        e_client_maximize(ec, E_MAXIMIZE_EXPAND | E_MAXIMIZE_LEFT);
+     }
+   else if (direction == TIZEN_POLICY_MAXIMIZE_DIRECTION_RIGHT)
+     {
+        ec->maximize_dir = E_MAXIMIZE_DIRECTION_RIGHT;
+        e_client_maximize(ec, E_MAXIMIZE_EXPAND | E_MAXIMIZE_RIGHT);
+     }
+   else
+     {
+        ELOGF("TZPOL", "Not supported direction:%d", ec, direction);
+     }
+}
+
+
 // --------------------------------------------------------
 // tizen_policy_interface
 // --------------------------------------------------------
@@ -3500,6 +3538,7 @@ static const struct tizen_policy_interface _tzpol_iface =
    _tzpol_iface_cb_hide,
    _tzpol_iface_cb_set_transient_for_below,
    _tzpol_iface_cb_set_parent_with_below,
+   _tzpol_iface_cb_set_maximize_direction,
 };
 
 static void
@@ -8196,7 +8235,7 @@ e_policy_wl_init(void)
    /* create globals */
    global = wl_global_create(e_comp_wl->wl.disp,
                              &tizen_policy_interface,
-                             11,
+                             12,
                              NULL,
                              _tzpol_cb_bind);
    EINA_SAFETY_ON_NULL_GOTO(global, err);
index 7a75d9316d07e5017ced591727697d90e6fdc066..4133c1f6e7d2a07e5ab8482530a2a16db7e947ee 100644 (file)
@@ -794,11 +794,14 @@ _e_xdg_toplevel_cb_maximized_set(struct wl_client *client, struct wl_resource *r
         return;
      }
 
-   ELOGF("XDG6", "Toplevel Maximized Set. res:%p, lock_user_maximize:%d", ec, resource, ec->lock_user_maximize);
+   ELOGF("XDG6", "Toplevel Maximized Set. res:%p, lock_user_maximize:%d, dir:%d", ec, resource, ec->lock_user_maximize, ec->maximize_dir);
    if (!ec->lock_user_maximize)
      {
-        max = (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_BOTH;
-        e_client_maximize(ec, max);
+        if ((ec->maximize_dir == E_MAXIMIZE_DIRECTION_ALL) || (ec->maximize_dir == E_MAXIMIZE_DIRECTION_NONE))
+          {
+             max = (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_BOTH;
+             e_client_maximize(ec, max);
+          }
      }
 }
 
@@ -823,6 +826,8 @@ _e_xdg_toplevel_cb_maximized_unset(struct wl_client *client, struct wl_resource
      }
 
    ELOGF("XDG6", "Toplevel Maximized Unset. res:%p, lock_user_maximize:%d", ec, resource, ec->lock_user_maximize);
+
+   ec->maximize_dir = E_MAXIMIZE_DIRECTION_NONE;
    /* it's doubtful */
    e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
 }