e_client/e_desk_area: fix bug for maximize/unmaximize window 80/316380/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 20 Aug 2024 10:15:13 +0000 (19:15 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 20 Aug 2024 11:16:22 +0000 (20:16 +0900)
There was a bug that the e didn't send the configure event with maximize state to client.
By this, a client didn't receive configure event and cannot change its state to maximize.

So, we changed code to send configure event after changing maximize/unmaximize state.

Change-Id: I2898689122a219086d6abc11c1e84c73cbe831a2

src/bin/core/e_client.c
src/bin/core/e_client_intern.h
src/bin/core/e_desk_area.c

index 3dad06d2a4b04d65ae16d42e8bc3cfddcd29007f..a1e90fe9805f929455416ccc859200ea6b777589 100644 (file)
@@ -83,7 +83,9 @@ struct _E_Client_Private
         struct wl_signal iconify;
         struct wl_signal uniconify;
         struct wl_signal maximize;
+        struct wl_signal maximize_done;
         struct wl_signal unmaximize;
+        struct wl_signal unmaximize_done;
         struct wl_signal fullscreen_pre;
         struct wl_signal fullscreen;
         struct wl_signal unfullscreen;
@@ -1017,7 +1019,9 @@ _e_client_private_init(E_Client *ec)
    wl_signal_init(&priv->events.iconify);
    wl_signal_init(&priv->events.uniconify);
    wl_signal_init(&priv->events.maximize);
+   wl_signal_init(&priv->events.maximize_done);
    wl_signal_init(&priv->events.unmaximize);
+   wl_signal_init(&priv->events.unmaximize_done);
    wl_signal_init(&priv->events.fullscreen_pre);
    wl_signal_init(&priv->events.fullscreen);
    wl_signal_init(&priv->events.unfullscreen);
@@ -4162,6 +4166,9 @@ e_client_maximize(E_Client *ec, E_Maximize max)
         ec->maximized = max;
         ec->changes.need_unmaximize = 0;
      }
+
+   // call the maximize_done signal of a client
+   wl_signal_emit(&PRI(ec)->events.maximize_done, &max);
 }
 
 E_API void
@@ -4201,6 +4208,9 @@ e_client_unmaximize(E_Client *ec, E_Maximize max)
 
    ec->maximized = E_MAXIMIZE_NONE;
    ec->changes.need_unmaximize = 0;
+
+   // call the unmaximize_done signal of a client
+   wl_signal_emit(&PRI(ec)->events.unmaximize_done, &max);
 }
 
 EINTERN void
@@ -6860,6 +6870,13 @@ e_client_maximize_listener_add(E_Client *ec, struct wl_listener *listener)
    wl_signal_add(&priv->events.maximize, listener);
 }
 
+EINTERN void
+e_client_maximize_done_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.maximize_done, listener);
+}
+
 EINTERN void
 e_client_unmaximize_listener_add(E_Client *ec, struct wl_listener *listener)
 {
@@ -6867,6 +6884,13 @@ e_client_unmaximize_listener_add(E_Client *ec, struct wl_listener *listener)
    wl_signal_add(&priv->events.unmaximize, listener);
 }
 
+EINTERN void
+e_client_unmaximize_done_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.unmaximize_done, listener);
+}
+
 EINTERN void
 e_client_fullscreen_pre_listener_add(E_Client *ec, struct wl_listener *listener)
 {
index bc077fac0fb1243349bb69fa81ec4d81511b8795..ae41fb1208874f46dfe7cf456eeb198c0f931362 100644 (file)
@@ -222,7 +222,9 @@ EINTERN void e_client_focus_latest_set_listener_add(E_Client *ec, struct wl_list
 EINTERN void e_client_iconify_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_uniconify_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_maximize_listener_add(E_Client *ec, struct wl_listener *listener);
+EINTERN void e_client_maximize_done_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_unmaximize_listener_add(E_Client *ec, struct wl_listener *listener);
+EINTERN void e_client_unmaximize_done_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_fullscreen_pre_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_fullscreen_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_unfullscreen_listener_add(E_Client *ec, struct wl_listener *listener);
index e80c015c53fb987f4dbd5aaa7411da9a712c44fd..823a5cd5099943eeffd41786d199cea4a59d9857 100644 (file)
@@ -80,7 +80,9 @@ struct _E_Desk_Area_Private_Client
    struct wl_listener client_stick;
    struct wl_listener client_unstick;
    struct wl_listener client_maximize;
+   struct wl_listener client_maximize_done;
    struct wl_listener client_unmaximize;
+   struct wl_listener client_unmaximize_done;
    struct wl_listener client_activate_done;
    struct wl_listener client_stay_within_margin;
    struct wl_listener client_mouse_move;
@@ -748,7 +750,9 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
    wl_list_remove(&eda_client->client_mouse_move.link);
    wl_list_remove(&eda_client->client_stay_within_margin.link);
    wl_list_remove(&eda_client->client_activate_done.link);
+   wl_list_remove(&eda_client->client_unmaximize_done.link);
    wl_list_remove(&eda_client->client_unmaximize.link);
+   wl_list_remove(&eda_client->client_maximize_done.link);
    wl_list_remove(&eda_client->client_maximize.link);
    wl_list_remove(&eda_client->client_unstick.link);
    wl_list_remove(&eda_client->client_stick.link);
@@ -1560,7 +1564,6 @@ _desk_area_cb_client_maximize(struct wl_listener *listener, void *data)
    E_Desk_Area *eda;
    E_Client *ec;
    E_Maximize max;
-   int w, h;
 
    eda_client = wl_container_of(listener, eda_client, client_maximize);
    eda = eda_client->eda;
@@ -1591,12 +1594,23 @@ _desk_area_cb_client_maximize(struct wl_listener *listener, void *data)
           }
 
         _e_desk_area_ec_maximize(eda, ec, max);
+     }
+}
 
-        e_client_maximized_geometry_get(ec, NULL, NULL, &w, &h);
-        e_client_shell_configure_send(ec, 0, w, h);
+static void
+_desk_area_cb_client_maximize_done(struct wl_listener *listener, void *data)
+{
+   E_Desk_Area_Private_Client *eda_client;
+   E_Client *ec;
+   int w, h;
 
-        e_client_maximize_pre_set(ec, EINA_FALSE);
-     }
+   eda_client = wl_container_of(listener, eda_client, client_maximize_done);
+   ec = eda_client->ec;
+
+   e_client_maximized_geometry_get(ec, NULL, NULL, &w, &h);
+   e_client_shell_configure_send(ec, 0, w, h);
+
+   e_client_maximize_pre_set(ec, EINA_FALSE);
 }
 
 static void
@@ -1713,12 +1727,22 @@ _desk_area_cb_client_unmaximize(struct wl_listener *listener, void *data)
              if (horiz)
                ec->saved.w = ec->saved.x = 0;
           }
+     }
+}
+
+static void
+_desk_area_cb_client_unmaximize_done(struct wl_listener *listener, void *data)
+{
+   E_Desk_Area_Private_Client *eda_client;
+   E_Client *ec;
 
-        if (ec->comp_data && ec->comp_data->shell.configure_send)
-          _e_desk_area_configure_send(ec, 0, 0);
+   eda_client = wl_container_of(listener, eda_client, client_unmaximize_done);
+   ec = eda_client->ec;
 
-        e_client_maximize_pre_set(ec, EINA_FALSE);
-     }
+   if (ec->comp_data && ec->comp_data->shell.configure_send)
+     _e_desk_area_configure_send(ec, 0, 0);
+
+   e_client_maximize_pre_set(ec, EINA_FALSE);
 }
 
 static void
@@ -2715,8 +2739,12 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    e_client_unstick_listener_add(ec, &eda_client->client_unstick);
    eda_client->client_maximize.notify = _desk_area_cb_client_maximize;
    e_client_maximize_listener_add(ec, &eda_client->client_maximize);
+   eda_client->client_maximize_done.notify = _desk_area_cb_client_maximize_done;
+   e_client_maximize_done_listener_add(ec, &eda_client->client_maximize_done);
    eda_client->client_unmaximize.notify = _desk_area_cb_client_unmaximize;
    e_client_unmaximize_listener_add(ec, &eda_client->client_unmaximize);
+   eda_client->client_unmaximize_done.notify = _desk_area_cb_client_unmaximize_done;
+   e_client_unmaximize_done_listener_add(ec, &eda_client->client_unmaximize_done);
    eda_client->client_activate_done.notify = _desk_area_cb_client_activate_done;
    e_client_activate_done_listener_add(ec, &eda_client->client_activate_done);
    eda_client->client_stay_within_margin.notify = _desk_area_cb_client_stay_within_margin;