discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=5998f175b5b15bf723842ab1c3ec024821d5130f

commit 5998f175b5b15bf723842ab1c3ec024821d5130f
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Fri Aug 18 15:52:52 2017 -0400

    temporarily cache x11 configure requests which reposition hidden windows
    
    when an app tries to position itself before being shown, attempt to store 
this
    and apply it in order to effectively handle cases where an app attempts to 
show
    on a specific screen, e.g., presentation apps which show a console on one 
monitor
    and the presentation on a different monitor
    
    fix T1571
---
 src/bin/e_comp_x.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
index e73b7a341..9de63c9e1 100644
--- a/src/bin/e_comp_x.c
+++ b/src/bin/e_comp_x.c
@@ -40,6 +40,15 @@ struct _E_Comp_X_Data
    Eina_Bool restack : 1;
 };
 
+typedef struct Pending_Configure
+{
+   Evas_Point point;
+   Ecore_X_Window win;
+   Ecore_Timer *timer;
+} Pending_Configure;
+
+static Eina_Hash *pending_configures;
+
 static unsigned int focus_time = 0;
 static unsigned int focus_canvas_time = 0;
 static Ecore_Timer *focus_timer;
@@ -1652,6 +1661,15 @@ _e_comp_x_configure(void *data EINA_UNUSED, int type 
EINA_UNUSED, Ecore_X_Event_
 }
 
 static Eina_Bool
+_e_comp_x_configure_request_timer(void *d)
+{
+   Pending_Configure *pc = d;
+   eina_hash_list_remove(pending_configures, &pc->win, pc);
+   free(pc);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
 _e_comp_x_configure_request(void *data  EINA_UNUSED, int type EINA_UNUSED, 
Ecore_X_Event_Window_Configure_Request *ev)
 {
    E_Client *ec;
@@ -1675,6 +1693,16 @@ _e_comp_x_configure_request(void *data  EINA_UNUSED, int 
type EINA_UNUSED, Ecore
      }
    if (!ec)
      {
+        if ((ev->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_X) ||
+            (ev->value_mask & ECORE_X_WINDOW_CONFIGURE_MASK_Y))
+          {
+             Pending_Configure *pc = E_NEW(Pending_Configure, 1);
+             pc->point.x = ev->x;
+             pc->point.y = ev->y;
+             pc->timer = ecore_timer_loop_add(5.0, 
_e_comp_x_configure_request_timer, pc);
+             pc->win = ev->win;
+             eina_hash_list_append(pending_configures, &ev->win, pc);
+          }
         ecore_x_window_configure(ev->win, ev->value_mask,
                                  ev->x, ev->y, ev->w, ev->h, ev->border,
                                  ev->abovewin, ev->detail);
@@ -4622,6 +4650,8 @@ static void
 _e_comp_x_hook_client_new(void *d EINA_UNUSED, E_Client *ec)
 {
    Ecore_X_Window win;
+   Eina_List *pending;
+   Pending_Configure *pc;
 
    E_COMP_X_PIXMAP_CHECK;
    win = e_pixmap_window_get(ec->pixmap);
@@ -4640,6 +4670,27 @@ _e_comp_x_hook_client_new(void *d EINA_UNUSED, E_Client 
*ec)
 
    if (!_e_comp_x_client_new_helper(ec)) return;
    ec->ignored |= e_comp->comp_type == E_PIXMAP_TYPE_WL;
+   pending = eina_hash_set(pending_configures, &win, NULL);
+   if (pending)
+     {
+        Eina_List *l;
+        E_Zone *zone;
+        pc = eina_list_last_data_get(pending);
+        EINA_LIST_FOREACH(e_comp->zones, l, zone)
+          {
+             if (E_INTERSECTS(pc->point.x, pc->point.y, ec->w, ec->h,
+                              zone->x, zone->y, zone->w, zone->h))
+               {
+                  e_client_zone_set(ec, zone);
+                  break;
+               }
+          }
+     }
+   EINA_LIST_FREE(pending, pc)
+     {
+        ecore_timer_del(pc->timer);
+        free(pc);
+     }
 
    ec->comp_data->first_damage = ec->internal;
 
@@ -5710,6 +5761,7 @@ e_comp_x_init(void)
    damages_hash = eina_hash_int32_new(NULL);
    alarm_hash = eina_hash_int32_new(NULL);
    dead_wins = eina_hash_int32_new(NULL);
+   pending_configures = eina_hash_int32_new(NULL);
    frame_extents = eina_hash_string_superfast_new(free);
 
    h = eina_list_append(h, e_client_hook_add(E_CLIENT_HOOK_DESK_SET, 
_e_comp_x_hook_client_desk_set, NULL));
@@ -5846,6 +5898,7 @@ e_comp_x_shutdown(void)
    E_FREE_FUNC(clients_win_hash, eina_hash_free);
    E_FREE_FUNC(damages_hash, eina_hash_free);
    E_FREE_FUNC(alarm_hash, eina_hash_free);
+   E_FREE_FUNC(pending_configures, eina_hash_free);
    E_FREE_FUNC(frame_extents, eina_hash_free);
    E_FREE_FUNC(mouse_in_fix_check_timer, ecore_timer_del);
    e_xsettings_shutdown();

-- 


Reply via email to