toggle x11 client iconic/mapped state based on mirror visibility
authorMike Blumenkrantz <zmike@osg.samsung.com>
Sat, 7 Nov 2015 18:10:02 +0000 (13:10 -0500)
committerMike Blumenkrantz <zmike@osg.samsung.com>
Sat, 7 Nov 2015 18:10:02 +0000 (13:10 -0500)
in order to continue rendering an iconic client without breaking icccm,
it's necessary to map the client's window again and unset iconic state
whenever rendering is needed, then re-set states when rendering
stops

ref T2788

src/bin/e_comp_x.c
src/bin/e_comp_x.h

index 63074c3ec06b59d77d7df94691c06d1eb1bc59de..e5a0989673505276d64fdb699b7330879b9c95c3 100644 (file)
@@ -969,9 +969,10 @@ _e_comp_x_client_hide(E_Client *ec)
    if ((!ec->iconic) && (!ec->override))
      ecore_x_window_prop_card32_set(e_client_util_win_get(ec), E_ATOM_MAPPED, &visible, 1);
 
-   if (ec->unredirected_single || ec->iconic)
+   ec->comp_data->iconic = ec->iconic && (!e_comp_object_mirror_visibility_check(ec->frame));
+   if (ec->unredirected_single || ec->comp_data->iconic)
      ecore_x_window_hide(_e_comp_x_client_window_get(ec));
-   if (ec->iconic)
+   if (ec->comp_data->iconic)
      e_hints_window_iconic_set(ec);
 }
 
@@ -1003,10 +1004,11 @@ _e_comp_x_client_show(E_Client *ec)
    ecore_x_window_shadow_tree_flush();
    if (!_e_comp_x_client_data_get(ec)->need_reparent)
      ecore_x_window_show(win);
-   if (ec->unredirected_single || ec->iconic)
+   if (ec->unredirected_single || ec->comp_data->iconic)
      {
         e_pixmap_clear(ec->pixmap);
         ecore_x_window_show(_e_comp_x_client_window_get(ec));
+        ec->comp_data->iconic = 0;
      }
    if (!ec->override)
      e_hints_window_visible_set(ec);
@@ -1169,6 +1171,26 @@ _e_comp_x_resize_request(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_E
    return ECORE_CALLBACK_RENEW;
 }
 
+static void
+_e_comp_x_evas_mirror_hidden(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   E_Client *ec = data;
+
+   if ((!ec->iconic) || (!ec->comp_data->iconic)) return;
+   if (_e_comp_x_client_data_get(ec))
+     _e_comp_x_client_hide(ec);
+}
+
+static void
+_e_comp_x_evas_mirror_visible(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   E_Client *ec = data;
+
+   if ((!ec->iconic) || ec->comp_data->iconic) return;
+   if (_e_comp_x_client_data_get(ec))
+     _e_comp_x_client_show(ec);
+}
+
 static void
 _e_comp_x_client_evas_init(E_Client *ec)
 {
@@ -1191,6 +1213,8 @@ _e_comp_x_client_evas_init(E_Client *ec)
    evas_object_smart_callback_add(ec->frame, "color_set", _e_comp_x_evas_color_set_cb, ec);
    evas_object_smart_callback_add(ec->frame, "fullscreen_zoom", _e_comp_x_evas_fullscreen_zoom_cb, ec);
    evas_object_smart_callback_add(ec->frame, "unfullscreen_zoom", _e_comp_x_evas_unfullscreen_zoom_cb, ec);
+   evas_object_smart_callback_add(ec->frame, "visibility_force", _e_comp_x_evas_mirror_visible, ec);
+   evas_object_smart_callback_add(ec->frame, "visibility_normal", _e_comp_x_evas_mirror_hidden, ec);
    /* force apply this since we haven't set up our smart cb previously */
    _e_comp_x_evas_comp_hidden_cb(ec, NULL, NULL);
 }
index 28da7b5a8cb739e9c01ecf12e06737214a533255..30f8981f31b50e15cdf9c4d8363465aa7afa0a83 100644 (file)
@@ -106,6 +106,7 @@ struct _E_Comp_X_Client_Data
    Eina_Bool evas_init : 1;
    Eina_Bool unredirected_single : 1;
    Eina_Bool fetch_gtk_frame_extents : 1;
+   Eina_Bool iconic : 1;
 };
 
 E_API Eina_Bool e_comp_x_init(void);