[E_BORDER] Add missing code to delete timer when the window gets DEICONIFY_APPROVE...
[platform/core/uifw/e17.git] / src / bin / e_border.c
index 638a57f..b1f5316 100644 (file)
@@ -3764,6 +3764,7 @@ static void
 _e_border_deiconify_approve_send_pending_end(void *data)
 {
    E_Border *bd = (E_Border *)data;
+   E_Border *bd_ancestor;
 
    if (e_config->deiconify_approve)
      {
@@ -3779,8 +3780,14 @@ _e_border_deiconify_approve_send_pending_end(void *data)
                                            ECORE_X_ATOM_E_DEICONIFY_APPROVE,
                                            ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
                                            bd->client.win, 0, 0, 0, 0);
+             bd_ancestor = bd->client.e.state.deiconify_approve.ancestor;
+             if (bd_ancestor)
+               {
+                  bd_ancestor->client.e.state.deiconify_approve.req_list = eina_list_append(bd_ancestor->client.e.state.deiconify_approve.req_list, bd);
+               }
 
-             bd->client.e.state.deiconify_approve.wait_timer = ecore_timer_add(e_config->deiconify_timeout, _e_border_uniconify_timeout, bd);
+             if (!bd->client.e.state.deiconify_approve.wait_timer)
+               bd->client.e.state.deiconify_approve.wait_timer = ecore_timer_add(e_config->deiconify_timeout, _e_border_uniconify_timeout, bd);
           }
      }
 }
@@ -3817,7 +3824,7 @@ _e_border_deiconify_approve_send(E_Border *bd, E_Border *bd_ancestor, Eina_Bool
                   _e_border_deiconify_approve_send(child, bd_ancestor, p);
                   if (child->client.e.state.deiconify_approve.support)
                     {
-                       if (p)
+                       if (!p)
                          {
                             ELBF(ELBT_BD, 0, child->client.win,
                                  "SEND DEICONIFY_APPROVE. ancestor:%x pending(%d,%d)",
@@ -3837,6 +3844,7 @@ _e_border_deiconify_approve_send(E_Border *bd, E_Border *bd_ancestor, Eina_Bool
                             ELBF(ELBT_BD, 0, child->client.win,
                                  "SEND DEICONIFY_APPROVE. (PENDING) ancestor:%x",
                                  bd_ancestor->client.win);
+                            child->client.e.state.deiconify_approve.ancestor = bd_ancestor;
                             child->client.e.state.deiconify_approve.pending_job = ecore_job_add(_e_border_deiconify_approve_send_pending_end, child);
                          }
                     }
@@ -3911,6 +3919,13 @@ e_border_uniconify(E_Border *bd)
                   ELB(ELBT_BD, "DEICONIFY_APPROVE WAIT_TIMER is already running", bd->client.win);
                   return;
                }
+
+             if (bd->client.e.state.deiconify_approve.pending_job)
+               {
+                  ELB(ELBT_BD, "DEICONIFY_APPROVE PENDING_JOB is already running", bd->client.win);
+                  return;
+               }
+
              if (bd->client.e.state.deiconify_approve.render_done == 0)
                {
                   ELB(ELBT_BD, "DEICONIFY_APPROVE to all transient", bd->client.win);
@@ -5897,6 +5912,12 @@ _e_border_del(E_Border *bd)
         bd->client.e.state.deiconify_approve.wait_timer = NULL;
      }
 
+   if (bd->client.e.state.deiconify_approve.pending_job)
+     {
+        ecore_job_del(bd->client.e.state.deiconify_approve.pending_job);
+        bd->client.e.state.deiconify_approve.pending_job = NULL;
+     }
+
    if (bd->client.e.state.deiconify_approve.req_list)
      {
         EINA_LIST_FREE(bd->client.e.state.deiconify_approve.req_list, child)
@@ -7065,6 +7086,13 @@ _e_border_cb_client_message(void *data  __UNUSED__,
                          {
                             ecore_timer_del(ancestor_bd->client.e.state.deiconify_approve.wait_timer);
                             ancestor_bd->client.e.state.deiconify_approve.wait_timer = NULL;
+
+                            if (bd->client.e.state.deiconify_approve.wait_timer)
+                              {
+                                 ecore_timer_del(bd->client.e.state.deiconify_approve.wait_timer);
+                                 bd->client.e.state.deiconify_approve.wait_timer = NULL;
+                              }
+
                             e_border_uniconify(ancestor_bd);
                          }
                        else
@@ -7073,6 +7101,15 @@ _e_border_cb_client_message(void *data  __UNUSED__,
                             ancestor_bd->client.e.state.deiconify_approve.render_done = 0;
                          }
                     }
+
+                  if (bd != ancestor_bd)
+                    {
+                       if (bd->client.e.state.deiconify_approve.wait_timer)
+                         {
+                            ecore_timer_del(bd->client.e.state.deiconify_approve.wait_timer);
+                            bd->client.e.state.deiconify_approve.wait_timer = NULL;
+                         }
+                    }
                }
           }
         return ECORE_CALLBACK_PASS_ON;
@@ -8887,7 +8924,7 @@ _e_border_rotation_pre_resize(E_Border *bd, int rotation, int *x, int *y, int *w
         if (rot_dif < 0) rot_dif = -rot_dif;
         if (rot_dif != 180)
           {
-             if (w != h)
+             if (_w != _h)
                {
                   _w = bd->h;
                   _h = bd->w;
@@ -10322,7 +10359,8 @@ _e_border_eval0(E_Border *bd)
 #ifdef _F_ZONE_WINDOW_ROTATION_
    if (e_config->wm_win_rotation)
      {
-        if (need_rotation_set)
+        if ((need_rotation_set) &&
+            (bd->client.e.state.rot.type == E_BORDER_ROTATION_TYPE_NORMAL))
           {
              Eina_Bool hint = EINA_FALSE;
              int ang = 0;