refactor code to handle sync_client_geometry_add 88/288588/1 accepted/tizen/unified/20230222.161452
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 20 Feb 2023 01:59:46 +0000 (10:59 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 20 Feb 2023 07:10:09 +0000 (16:10 +0900)
There was a potential bug for handling tizen_position_set request if the ec is under
pending_geometry.
We refactored code handling sync_geometry_set to compare the buffer size not serial.
For this, if the tizen_position_set was called under pending geometry, then we called
e_comp_wl_commit_sync_client_geometry_add with size(0x0).
In this case, the client could not send the buffer chagne event for size(0x0), so the
tizen_position_set request remained not to handled.

To resolve this, we refactor the e_comp_wl_commit_sync_client_geometry_add function.

Change-Id: Ib36eec68b918a5ebacbb192037a9dc4a082137a0

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

index 0ff095b..7770fde 100644 (file)
@@ -8387,6 +8387,31 @@ e_client_pending_geometry_flush(E_Client *ec)
      }
 }
 
+EINTERN void
+e_client_pending_geometry_last_geometry_get(E_Client *ec, int *x, int *y, int *w, int *h)
+{
+   Eina_List *l;
+   E_Client_Pending_Geometry *geo;
+   int gx = 0;
+   int gy = 0;
+   int gw = 0;
+   int gh = 0;
+
+   EINA_LIST_REVERSE_FOREACH(ec->surface_sync.pending_geometry, l, geo)
+     {
+        gx = geo->x;
+        gy = geo->y;
+        gw = geo->w;
+        gh = geo->h;
+        break;
+     }
+
+   if (x) *x = gx;
+   if (y) *y = gy;
+   if (w) *w = gw;
+   if (h) *h = gh;
+}
+
 E_API void
 e_client_frame_focus_set(E_Client *ec, Eina_Bool focus)
 {
index 6504cc0..3a851ec 100644 (file)
@@ -350,16 +350,8 @@ struct _E_Event_Client_Rotation_Geometry_Set
    int x, y, w, h;
 };
 
-typedef enum
-{
-   E_GEOMETRY_NONE = 0,
-   E_GEOMETRY_POS  = (1 << 0),
-   E_GEOMETRY_SIZE = (1 << 1)
-} E_Client_Demand_Geometry;
-
 struct _E_Client_Pending_Geometry
 {
-   E_Client_Demand_Geometry      mode;
    int                           x, y, w, h;
    unsigned int                  serial;
 };
@@ -1286,6 +1278,7 @@ EINTERN Eina_Bool e_client_check_above_focused(E_Client *ec);
 
 EINTERN void      e_client_pending_geometry_flush(E_Client *ec);
 EINTERN Eina_Bool e_client_pending_geometry_has(E_Client *ec);
+EINTERN void      e_client_pending_geometry_last_geometry_get(E_Client *ec, int *x, int *y, int *w, int *h);
 
 E_API void e_client_frame_focus_set(E_Client *ec, Eina_Bool focus);
 E_API void e_client_frame_geometry_set(E_Client *ec, int x, int y, int w, int h);
index bd19726..b10b145 100644 (file)
@@ -5990,7 +5990,6 @@ e_comp_wl_output_find_all(E_Client *ec)
 // --------------------------------------------------------
 EINTERN Eina_Bool
 e_comp_wl_commit_sync_client_geometry_add(E_Client *ec,
-                                          E_Client_Demand_Geometry mode,
                                           uint32_t serial,
                                           int32_t x,
                                           int32_t y,
@@ -6002,23 +6001,15 @@ e_comp_wl_commit_sync_client_geometry_add(E_Client *ec,
    if (!ec) goto ret;
    if (e_object_is_del(E_OBJECT(ec))) goto ret;
    if (ec->fullscreen || ec->maximized) goto err;
-   if (mode == E_GEOMETRY_NONE) goto err;
 
    geo = E_NEW(E_Client_Pending_Geometry, 1);
    if (!geo) goto err;
 
    geo->serial = serial;
-   geo->mode = mode;
-   if (mode & E_GEOMETRY_POS)
-     {
-        geo->x = x;
-        geo->y = y;
-     }
-   if (mode & E_GEOMETRY_SIZE)
-     {
-        geo->w = w;
-        geo->h = h;
-     }
+   geo->x = x;
+   geo->y = y;
+   geo->w = w;
+   geo->h = h;
 
    ec->surface_sync.pending_geometry = eina_list_append(ec->surface_sync.pending_geometry, geo);
    ec->surface_sync.wait_commit = EINA_TRUE;
@@ -6037,8 +6028,9 @@ e_comp_wl_commit_sync_configure(E_Client *ec)
 {
    Eina_List *l;
    E_Client_Pending_Geometry *geo;
-   E_Client_Demand_Geometry change = 0;
    int bw, bh;
+   Eina_Bool match_size = EINA_FALSE;
+
    struct
      {
         int x, y, w, h;
@@ -6054,7 +6046,6 @@ e_comp_wl_commit_sync_configure(E_Client *ec)
    if (eina_list_count(ec->surface_sync.pending_geometry))
      {
         Eina_List *ll = NULL;
-        Eina_Bool match_size = EINA_FALSE;
         EINA_LIST_REVERSE_FOREACH_SAFE(ec->surface_sync.pending_geometry, l, ll, geo)
           {
              if (match_size)
@@ -6067,23 +6058,16 @@ e_comp_wl_commit_sync_configure(E_Client *ec)
              if ((geo->w == bw) && (geo->h == bh))
                {
                   match_size = EINA_TRUE;
-                  if (geo->mode & E_GEOMETRY_SIZE)
-                    {
-                       config.w = geo->w;
-                       config.h = geo->h;
-                    }
-                  if (geo->mode & E_GEOMETRY_POS)
-                    {
-                       config.x = geo->x;
-                       config.y = geo->y;
-                    }
-                  change |= geo->mode;
+                  config.w = geo->w;
+                  config.h = geo->h;
+                  config.x = geo->x;
+                  config.y = geo->y;
                   ec->surface_sync.pending_geometry = eina_list_remove(ec->surface_sync.pending_geometry, geo);
                   E_FREE(geo);
                }
           }
 
-        if (change & E_GEOMETRY_SIZE)
+        if (match_size)
           {
              if ((config.w != ec->w) || (config.h != ec->h))
                {
@@ -6091,20 +6075,19 @@ e_comp_wl_commit_sync_configure(E_Client *ec)
                   ec->changes.size = EINA_TRUE;
                   EC_CHANGED(ec);
                }
-          }
 
-        if (change & E_GEOMETRY_POS)
-          {
              ec->client.x = ec->desk->geom.x + config.x;
              ec->client.y = ec->desk->geom.y + config.y;
-             e_client_pos_set(ec, ec->client.x, ec->client.y);
-             ec->placed = 1;
-             ec->changes.pos = 1;
-             EC_CHANGED(ec);
-          }
+             if ((ec->client.x != ec->x) || (ec->client.y != ec->y))
+               {
+                  e_client_pos_set(ec, ec->client.x, ec->client.y);
+                  ec->placed = 1;
+                  ec->changes.pos = 1;
+                  EC_CHANGED(ec);
+               }
 
-        if (change)
-          ELOGF("POSSIZE", "Configure pending geometry mode:%d(%d,%d - %dx%d)", ec, change, ec->x, ec->y, ec->w, ec->h);
+             ELOGF("POSSIZE", "Configure pending geometry (%d,%d,%dx%d)", ec, ec->x, ec->y, ec->w, ec->h);
+          }
      }
 
    // cw interceptor(move,resize) won't work if wait_commit is TRUE
@@ -6171,7 +6154,7 @@ _tz_move_resize_iface_cb_set_geometry(struct wl_client *client EINA_UNUSED,
           }
      }
 
-   if (!e_comp_wl_commit_sync_client_geometry_add(ec, E_GEOMETRY_POS | E_GEOMETRY_SIZE, serial, x, y, w, h)) goto err;
+   if (!e_comp_wl_commit_sync_client_geometry_add(ec, serial, x, y, w, h)) goto err;
    return;
 
 err:
index 33f7688..123a81b 100644 (file)
@@ -615,7 +615,7 @@ EINTERN void          e_comp_wl_feed_focus_in(E_Client *ec);
 
 EINTERN extern int E_EVENT_WAYLAND_GLOBAL_ADD;
 
-EINTERN Eina_Bool e_comp_wl_commit_sync_client_geometry_add(E_Client *ec, E_Client_Demand_Geometry mode, uint32_t serial, int32_t x, int32_t y, int32_t w, int32_t h);
+EINTERN Eina_Bool e_comp_wl_commit_sync_client_geometry_add(E_Client *ec, uint32_t serial, int32_t x, int32_t y, int32_t w, int32_t h);
 EINTERN Eina_Bool e_comp_wl_commit_sync_configure(E_Client *ec);
 
 EINTERN Eina_Bool         e_comp_wl_pid_output_configured_resolution_send(pid_t pid, int w, int h);
index caa3c10..d67bc20 100644 (file)
@@ -1253,7 +1253,9 @@ _tzpos_iface_cb_set(struct wl_client *client EINA_UNUSED, struct wl_resource *re
              // if there is geometry pending list, add move job at the end of the list.
              // so client to be applied new position at the same time with the pending requests
              // pending geometries are flushed when 'wl surface commit' and matched serial are delivered.
-             e_comp_wl_commit_sync_client_geometry_add(ec, E_GEOMETRY_POS, ec->surface_sync.serial, x, y, 0, 0);
+             int w, h;
+             e_client_pending_geometry_last_geometry_get(ec, NULL, NULL, &w, &h);
+             e_comp_wl_commit_sync_client_geometry_add(ec, ec->surface_sync.serial, x, y, w, h);
           }
         else
           {