win: Add quick hack to restore mouse inputs in E Wayland

E Wayland internal windows are a special beast. Somehow all their
events are intercepted by a special input_obj... but never get
propagated back to the elm_win.

Major side-effect: you get 2 window decorations. I believe there is
some dark magic inside E that tries to figure out when to show
a decoration and this conflicts with CSD.

But hey, it's late so I want to "fix" this and figure out the details
later.
This commit is contained in:
Jean-Philippe Andre 2016-11-23 20:21:57 +09:00
parent 72694331b4
commit aaaf77965a
1 changed files with 24 additions and 6 deletions

View File

@ -222,6 +222,7 @@ struct _Efl_Ui_Win_Data
Eina_Bool cur_bg_solid : 1;
Eina_Bool cur_menu : 1;
Eina_Bool cur_unresizable : 1;
Eina_Bool wayland : 1;
} csd;
struct {
@ -4152,6 +4153,14 @@ _elm_win_frame_style_update(Efl_Ui_Win_Data *sd, Eina_Bool force_emit, Eina_Bool
sd->csd.need_menu = EINA_FALSE;
}
/* TEMPORARY HACK FOR E WAYLAND
* Hiding the shadows makes the input region (elm.spacer.opaque) have the
* same geometry as the surface itself. This fixes inputs in E Wayland
* internal windows. FIXME FIXME FIXME.
*/
if (sd->csd.wayland)
sd->csd.need_shadow = EINA_FALSE;
borderless = sd->csd.need_borderless || (!sd->csd.need) || sd->fullscreen;
maximized = sd->maximized;
shadow = sd->csd.need_shadow && (!sd->fullscreen) && (!sd->maximized);
@ -4165,6 +4174,7 @@ _elm_win_frame_style_update(Efl_Ui_Win_Data *sd, Eina_Bool force_emit, Eina_Bool
{ \
const char *sig = state ? s1 : s2; \
edje_object_signal_emit(sd->frame_obj, sig, "elm"); \
DBG("frame style emit: %p %s", sd->obj, sig); \
sd->csd.cur_##state = state; \
changed = EINA_TRUE; \
} } while (0)
@ -4335,6 +4345,9 @@ _elm_win_need_frame_adjust(Efl_Ui_Win_Data *sd, const char *engine)
/* this is for debug only - don't keep forever, it's not an api! */
s = getenv("EFL_WIN_FRAME_MODE");
sd->csd.wayland = (eina_streq(engine, ELM_WAYLAND_SHM) ||
eina_streq(engine, ELM_WAYLAND_EGL));
if (sd->type == ELM_WIN_FAKE)
sd->csd.need = EINA_FALSE;
else if (eina_streq(s, "on"))
@ -4342,10 +4355,7 @@ _elm_win_need_frame_adjust(Efl_Ui_Win_Data *sd, const char *engine)
else if (eina_streq(s, "off"))
sd->csd.need = EINA_FALSE;
else
{
sd->csd.need = (eina_streq(engine, ELM_WAYLAND_SHM) ||
eina_streq(engine, ELM_WAYLAND_EGL));
}
sd->csd.need = sd->csd.wayland;
/* for now CSD implies shadows as well */
sd->csd.need_shadow = sd->csd.need && (!sd->maximized);
@ -5230,10 +5240,18 @@ EOLIAN static void
_efl_ui_win_borderless_set(Eo *obj, Efl_Ui_Win_Data *sd, Eina_Bool borderless)
{
sd->csd.need_borderless = borderless ? 1 : 0;
/* TEMPORARY HACK FOR E WAYLAND
* E Wayland sets the borderless flag on its internal windows, even though
* it actually expects to "see" borders. Not sure who is supposed to create
* them (E comp or the window).
*/
if (trap && trap->borderless_set && sd->csd.wayland)
sd->csd.need_borderless = 0;
_elm_win_frame_style_update(sd, 0, 1);
if (!sd->csd.need)
TRAP(sd, borderless_set, borderless);
TRAP(sd, borderless_set, borderless);
_elm_win_resize_objects_eval(obj);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);