account for race condition when creating initial comp object updates tiler
authorMike Blumenkrantz <zmike@osg.samsung.com>
Wed, 8 Jul 2015 16:36:36 +0000 (12:36 -0400)
committerMike Blumenkrantz <zmike@osg.samsung.com>
Wed, 8 Jul 2015 16:36:36 +0000 (12:36 -0400)
under wayland, some surfaces (eg. cursors) would attempt to show prior to
having acquired their actual size. these show attempts should be rejected
until the size has been set to ensure that rendering can proceed as expected

fix T2557

src/bin/e_comp_object.c

index 26ce07b02928926cd44633c9a200ea2b985c073f..ac1402010010dc6c9275fb932822a8cb1df572eb 100644 (file)
@@ -1401,6 +1401,24 @@ _e_comp_intercept_show_helper(E_Comp_Object *cw)
           }
         return;
      }
+   if ((!cw->updates) && (!cw->ec->input_only) && (!cw->ec->ignored))
+     {
+        int pw, ph;
+
+        pw = cw->ec->client.w, ph = cw->ec->client.h;
+        if ((!pw) || (!ph))
+          e_pixmap_size_get(cw->ec->pixmap, &pw, &ph);
+        cw->updates = eina_tiler_new(pw, ph);
+        if (!cw->updates)
+          {
+             cw->ec->changes.visible = !cw->ec->hidden;
+             cw->ec->visible = 1;
+             EC_CHANGED(cw->ec);
+             return;
+          }
+     }
+   if (cw->updates)
+     eina_tiler_tile_size_set(cw->updates, 1, 1);
    if (cw->ec->new_client)
      {
         /* ignore until client idler first run */
@@ -1491,17 +1509,6 @@ _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
 #endif
         cw->redirected = 1;
         evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
-
-        if ((!cw->ec->input_only) && (!cw->ec->ignored))
-          {
-             int w, h;
-
-             w = cw->ec->client.w, h = cw->ec->client.h;
-             if ((!w) || (!h))
-               e_pixmap_size_get(cw->ec->pixmap, &w, &h);
-             cw->updates = eina_tiler_new(w, h);
-             eina_tiler_tile_size_set(cw->updates, 1, 1);
-          }
      }
 
    _e_comp_intercept_show_helper(cw);