toggle x11 client iconic/mapped state based on mirror visibility

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
devs/devilhorns/ecore_wl2
Mike Blumenkrantz 8 years ago
parent 18fba8e5d7
commit bf2e36236c
  1. 30
      src/bin/e_comp_x.c
  2. 1
      src/bin/e_comp_x.h

@ -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);
}

@ -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);

Loading…
Cancel
Save