devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=7f8387b4bc96016695d60a2b0ddc20535b95530d
commit 7f8387b4bc96016695d60a2b0ddc20535b95530d Author: Chris Michael <[email protected]> Date: Wed Nov 5 09:58:49 2014 -0500 e-comp-wl: Fix keyboard input with wayland clients when running in X11. Don't run client_post_new hook for deleted clients. Start work on client pre_frame hook. Signed-off-by: Chris Michael <[email protected]> --- src/bin/e_comp_wl.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 123 insertions(+), 5 deletions(-) diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 28ee3b7..b948e51 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -1981,8 +1981,6 @@ _e_comp_wl_client_cb_del(void *data EINA_UNUSED, E_Client *ec) /* uint64_t win; */ Eina_Rectangle *dmg; - DBG("Comp Hook Client Del"); - /* make sure this is a wayland client */ E_COMP_WL_PIXMAP_CHECK; @@ -2035,7 +2033,7 @@ _e_comp_wl_client_cb_post_new(void *data EINA_UNUSED, E_Client *ec) { E_COMP_WL_PIXMAP_CHECK; - DBG("Client Post New: %d", wl_resource_get_id(ec->comp_data->surface)); + if (e_object_is_del(E_OBJECT(ec))) return; ec->need_shape_merge = EINA_FALSE; @@ -2061,14 +2059,93 @@ _e_comp_wl_client_cb_post_new(void *data EINA_UNUSED, E_Client *ec) if (ec->need_shape_export) { - DBG("\tNeeds Shape Export"); - ec->shape_changed = EINA_TRUE; +// ec->shape_changed = EINA_TRUE; e_comp_shape_queue(ec->comp); ec->need_shape_export = EINA_FALSE; } } static void +_e_comp_wl_client_cb_pre_frame(void *data EINA_UNUSED, E_Client *ec) +{ + uint64_t parent; + + E_COMP_WL_PIXMAP_CHECK; + + if (!ec->comp_data->need_reparent) return; + + DBG("Client Pre Frame: %d", wl_resource_get_id(ec->comp_data->surface)); + + parent = e_client_util_pwin_get(ec); + + /* set pixmap parent window */ + e_pixmap_parent_window_set(ec->pixmap, parent); + + ec->border_size = 0; + ec->border.changed = EINA_TRUE; + ec->changes.shape = EINA_TRUE; + ec->changes.shape_input = EINA_TRUE; + EC_CHANGED(ec); + + if (ec->visible) + { + if ((ec->comp_data->set_win_type) && (ec->internal_ecore_evas)) + { + int type = ECORE_WL_WINDOW_TYPE_TOPLEVEL; + + switch (ec->netwm.type) + { + case E_WINDOW_TYPE_DIALOG: + /* NB: If there is No transient set, then dialogs get + * treated as Normal Toplevel windows */ + if (ec->icccm.transient_for) + type = ECORE_WL_WINDOW_TYPE_TRANSIENT; + break; + case E_WINDOW_TYPE_DESKTOP: + type = ECORE_WL_WINDOW_TYPE_FULLSCREEN; + break; + case E_WINDOW_TYPE_DND: + type = ECORE_WL_WINDOW_TYPE_DND; + break; + case E_WINDOW_TYPE_MENU: + case E_WINDOW_TYPE_DROPDOWN_MENU: + case E_WINDOW_TYPE_POPUP_MENU: + type = ECORE_WL_WINDOW_TYPE_MENU; + break; + case E_WINDOW_TYPE_NORMAL: + default: + break; + } + + ecore_evas_wayland_type_set(ec->internal_ecore_evas, type); + ec->comp_data->set_win_type = EINA_FALSE; + } + } + + e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, parent); + e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, parent); + + _e_comp_wl_client_evas_init(ec); + + /* if ((ec->netwm.ping) && (!ec->ping_poller)) */ + /* e_client_ping(ec); */ + + if (ec->visible) evas_object_show(ec->frame); + + ec->comp_data->need_reparent = EINA_FALSE; + ec->redirected = EINA_TRUE; + + if (ec->comp_data->change_icon) + { + ec->comp_data->change_icon = EINA_FALSE; + ec->changes.icon = EINA_TRUE; + EC_CHANGED(ec); + } + + ec->comp_data->reparented = EINA_TRUE; +} + +static void _e_comp_wl_client_cb_focus_set(void *data EINA_UNUSED, E_Client *ec) { E_COMP_WL_PIXMAP_CHECK; @@ -2256,6 +2333,45 @@ _e_comp_wl_compositor_create(void) goto input_err; } +#ifndef HAVE_WAYLAND_ONLY + if (getenv("DISPLAY")) + { + E_Config_XKB_Layout *ekbd; + Ecore_X_Atom xkb = 0; + Ecore_X_Window root = 0; + int len = 0; + unsigned char *dat; + char *rules, *model, *layout; + + if ((ekbd = e_xkb_layout_get())) + { + model = strdup(ekbd->model); + layout = strdup(ekbd->name); + } + + root = ecore_x_window_root_first_get(); + xkb = ecore_x_atom_get("_XKB_RULES_NAMES"); + ecore_x_window_prop_property_get(root, xkb, ECORE_X_ATOM_STRING, + 1024, &dat, &len); + if ((dat) && (len > 0)) + { + rules = (char *)dat; + dat += strlen((const char *)dat) + 1; + if (!model) model = strdup((const char *)dat); + dat += strlen((const char *)dat) + 1; + if (!layout) layout = strdup((const char *)dat); + } + + /* fallback */ + if (!rules) rules = strdup("evdev"); + if (!model) model = strdup("pc105"); + if (!layout) layout = strdup("us"); + + /* update compositor keymap */ + e_comp_wl_input_keymap_set(cdata, rules, model, layout); + } +#endif + /* initialize shm mechanism */ wl_display_init_shm(cdata->wl.disp); @@ -2334,6 +2450,8 @@ e_comp_wl_init(void) e_client_hook_add(E_CLIENT_HOOK_EVAL_POST_NEW_CLIENT, _e_comp_wl_client_cb_post_new, NULL); + /* e_client_hook_add(E_CLIENT_HOOK_EVAL_PRE_FRAME_ASSIGN, */ + /* _e_comp_wl_client_cb_pre_frame, NULL); */ e_client_hook_add(E_CLIENT_HOOK_FOCUS_SET, _e_comp_wl_client_cb_focus_set, NULL); --
