e_desk_area: add redirect listener
authorSooChan Lim <sc1.lim@samsung.com>
Mon, 15 Apr 2024 05:02:31 +0000 (14:02 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 17 Apr 2024 23:32:21 +0000 (08:32 +0900)
Change-Id: Ie4cc66cdd07072e1073034f3d596fbd2e3729220

src/bin/e_desk_area.c

index b1d861f..91647e9 100644 (file)
@@ -93,6 +93,7 @@ struct _E_Desk_Area_Private_Client
    struct wl_listener delete_request;
    struct wl_listener kill_request;
    struct wl_listener ping;
+   struct wl_listener redirect;
 
    // comp_object listeners
    struct wl_listener comp_object_raise;
@@ -849,6 +850,7 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
    wl_list_remove(&eda_client->comp_object_lower.link);
    wl_list_remove(&eda_client->comp_object_raise.link);
 
+   wl_list_remove(&eda_client->redirect.link);
    wl_list_remove(&eda_client->ping.link);
    wl_list_remove(&eda_client->kill_request.link);
    wl_list_remove(&eda_client->delete_request.link);
@@ -1269,7 +1271,7 @@ _desk_area_cb_client_unfullscreen(struct wl_listener *listener, void *data)
      e_client_frame_update(ec);
 
    if (ec->comp_data->shell.configure_send)
-     _e_comp_wl_configure_send(ec, 0, 0);
+     _e_desk_area_configure_send(ec, 0, 0);
 
    ec->comp_data->maximize_pre = 0;
 
@@ -1901,6 +1903,47 @@ _desk_area_cb_client_ping(struct wl_listener *listener, void *data)
 }
 
 static void
+_desk_area_cb_client_redirect(struct wl_listener *listener, void *data)
+{
+   E_Desk_Area_Private_Client *eda_client;
+   E_Desk_Area *eda;
+   E_Client *ec;
+   int w, h, pw, ph;
+
+   eda_client = wl_container_of(listener, eda_client, redirect);
+   eda = eda_client->eda;
+   ec = eda_client->ec;
+
+   ELOGF("EDA", "CLIENT REDIRECT. eda:%p", ec, eda);
+
+   /* - get current size
+    * - calc new size
+    * - readjust for new frame size
+    */
+
+   w = ec->w, h = ec->h;
+   e_comp_object_frame_wh_unadjust(ec->frame, w, h, &pw, &ph);
+
+   e_comp_object_frame_recalc(ec->frame);
+
+   if (!ec->fullscreen)
+     e_comp_object_frame_wh_adjust(ec->frame, ec->client.w, ec->client.h, &w, &h);
+
+   if (ec->fullscreen)
+     {
+        evas_object_resize(ec->frame, eda->w, eda->h);
+     }
+   else if (ec->new_client)
+     {
+        if ((ec->w < 1) || (ec->h < 1)) return;
+        e_comp_object_frame_wh_adjust(ec->frame, pw, ph, &w, &h);
+        evas_object_resize(ec->frame, w, h);
+     }
+   else if ((w != ec->w) || (h != ec->h))
+     evas_object_resize(ec->frame, w, h);
+}
+
+static void
 _desk_area_cb_comp_object_lower(struct wl_listener *listener, void *data)
 {
    E_Desk_Area_Private_Client *eda_client;
@@ -2675,6 +2718,8 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    e_client_kill_request_listener_add(ec, &eda_client->kill_request);
    eda_client->ping.notify = _desk_area_cb_client_ping;
    e_client_ping_listener_add(ec, &eda_client->ping);
+   eda_client->redirect.notify = _desk_area_cb_client_redirect;
+   e_client_redirect_listener_add(ec, &eda_client->redirect);
 
    // e_comp_object listeners
    eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;