On Thu, 25 Jun 2015 17:30:43 -0700 Mike Blumenkrantz <zm...@osg.samsung.com>
said:

sorry - i had to revert this due to a pretty bad behavior bug this commit
introduced. see my commit log in the revert. i pinged you on irc (zmike) but no
response, so i've had to do this to at least keep e working until this can come
back without this break. :]

> discomfitor pushed a commit to branch master.
> 
> http://git.enlightenment.org/core/enlightenment.git/commit/?id=2b38147c43270815ef71726d8700703968429d90
> 
> commit 2b38147c43270815ef71726d8700703968429d90
> Author: Mike Blumenkrantz <zm...@osg.samsung.com>
> Date:   Thu Jun 25 19:55:37 2015 -0400
> 
>     add hooking for WL_SURFACE_ID atom on XWayland windows and composite them
>     
>     in order to maximize the amount of reused code the following details the
> current process for xwayland compositing:
>     
>     * get map request from window
>     * force reparenting
>     * show window
>     * await WL_SURFACE_ID x11 message
>     * move x11 client data + pixmap onto corresponding wayland client
>     * business as usual with wayland compositing
>     
>     this is pretty similar to the method of the reference code in weston,
>     except that there's no x11 compositor in weston
> ---
>  src/bin/e_comp_wl.c |  21 ++++++++--
>  src/bin/e_comp_wl.h |  34 ++++++++++++++-
>  src/bin/e_comp_x.c  | 119 ++++++++++++++++++++++++++++++++++++++++++++
> +------- src/bin/e_comp_x.h  |   8 +++-
>  4 files changed, 161 insertions(+), 21 deletions(-)
> 
> diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
> index 101e62b..6c77a1a 100644
> --- a/src/bin/e_comp_wl.c
> +++ b/src/bin/e_comp_wl.c
> @@ -40,7 +40,7 @@ _e_comp_wl_focus_check(void)
>  
>     if (stopping) return;
>     ec = e_client_focused_get();
> -   if ((!ec) || (e_pixmap_type_get(ec->pixmap) != E_PIXMAP_TYPE_WL))
> +   if ((!ec) || e_pixmap_is_x(ec->pixmap))
>       e_grabinput_focus(e_comp->ee_win, E_FOCUS_METHOD_PASSIVE);
>  }
>  
> @@ -1442,7 +1442,8 @@ static void
>  _e_comp_wl_compositor_cb_surface_create(struct wl_client *client, struct
> wl_resource *resource, uint32_t id) {
>     struct wl_resource *res;
> -   E_Client *ec = NULL;
> +   E_Client *wc, *ec = NULL;
> +   Eina_List *l;
>     pid_t pid;
>  
>     DBG("Compositor Cb Surface Create: %d", id);
> @@ -1491,7 +1492,15 @@ _e_comp_wl_compositor_cb_surface_create(struct
> wl_client *client, struct wl_reso 
>     /* set reference to pixmap so we can fetch it later */
>     wl_resource_set_user_data(res, ec);
> -
> +#ifndef HAVE_WAYLAND_ONLY
> +   EINA_LIST_FOREACH(e_comp->wl_comp_data->xwl_pending, l, wc)
> +     {
> +        if (!e_pixmap_is_x(wc->pixmap)) continue;
> +        if (wl_resource_get_id(res) !=
> ((E_Comp_X_Client_Data*)ec->comp_data)->surface_id) continue;
> +        e_comp_x_xwayland_client_setup(wc, ec);
> +        break;
> +     }
> +#endif
>     /* emit surface create signal */
>     wl_signal_emit(&e_comp->wl_comp_data->signals.surface.create, res);
>  }
> @@ -2964,3 +2973,9 @@ e_comp_wl_output_remove(const char *id)
>          /* free(output); */
>       }
>  }
> +
> +EINTERN void
> +e_comp_wl_xwayland_client_queue(E_Client *ec)
> +{
> +   e_comp->wl_comp_data->xwl_pending = eina_list_append
> (e_comp->wl_comp_data->xwl_pending, ec); +}
> diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h
> index c20aa24..f0bc175 100644
> --- a/src/bin/e_comp_wl.h
> +++ b/src/bin/e_comp_wl.h
> @@ -1,5 +1,7 @@
>  #ifdef E_TYPEDEFS
> -
> +#  ifndef HAVE_WAYLAND_ONLY
> +#   include "e_comp_x.h"
> +#  endif
>  #else
>  # ifndef E_COMP_WL_H
>  #  define E_COMP_WL_H
> @@ -13,6 +15,10 @@
>  
>  #  include <xkbcommon/xkbcommon.h>
>  
> +#  ifndef HAVE_WAYLAND_ONLY
> +#   include "e_comp_x.h"
> +#  endif
> +
>  /* #  ifdef HAVE_WAYLAND_EGL */
>  /* #   include <EGL/egl.h> */
>  /* #   define GL_GLEXT_PROTOTYPES */
> @@ -211,6 +217,7 @@ struct _E_Comp_Wl_Data
>     Ecore_Idler *idler;
>  
>     struct wl_client *xwl_client;
> +   Eina_List *xwl_pending;
>  
>     /* Eina_List *retry_clients; */
>     /* Ecore_Timer *retry_timer; */
> @@ -254,6 +261,10 @@ struct _E_Comp_Wl_Client_Data
>       {
>          int32_t x, y;
>       } popup;
> +#ifndef HAVE_WAYLAND_ONLY
> +   E_Pixmap *xwayland_pixmap;
> +   E_Comp_X_Client_Data *xwayland_data;
> +#endif
>  
>     Eina_Bool keep_buffer : 1;
>     Eina_Bool mapped : 1;
> @@ -294,6 +305,27 @@ E_API struct wl_signal
> e_comp_wl_surface_create_signal_get(void); E_API double
> e_comp_wl_idle_time_get(void); E_API Eina_Bool e_comp_wl_output_init(const
> char *id, const char *make, const char *model, int x, int y, int w, int h,
> int pw, int ph, unsigned int refresh, unsigned int subpixel, unsigned int
> transform); E_API void e_comp_wl_output_remove(const char *id); +# ifndef
> HAVE_WAYLAND_ONLY +EINTERN void e_comp_wl_xwayland_client_queue(E_Client
> *ec); +static inline E_Comp_X_Client_Data * +e_comp_wl_client_xwayland_data
> (const E_Client *ec) +{
> +   return ec->comp_data ?
> ((E_Comp_Wl_Client_Data*)ec->comp_data)->xwayland_data : NULL; +}
> +
> +static inline E_Pixmap *
> +e_comp_wl_client_xwayland_pixmap(const E_Client *ec)
> +{
> +   return ((E_Comp_Wl_Client_Data*)ec->comp_data)->xwayland_pixmap;
> +}
>  
> +static inline void
> +e_comp_wl_client_xwayland_setup(E_Client *ec, E_Comp_X_Client_Data *cd,
> E_Pixmap *ep) +{
> +   ((E_Comp_Wl_Client_Data*)ec->comp_data)->xwayland_data = cd;
> +   ((E_Comp_Wl_Client_Data*)ec->comp_data)->xwayland_pixmap = ep;
> +   e_comp->wl_comp_data->xwl_pending = eina_list_remove
> (e_comp->wl_comp_data->xwl_pending, ec); +}
> +#  endif
>  # endif
>  #endif
> diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
> index 077b2a8..4e918f2 100644
> --- a/src/bin/e_comp_x.c
> +++ b/src/bin/e_comp_x.c
> @@ -57,6 +57,8 @@ static Eina_Bool screensaver_dimmed = EINA_FALSE;
>  static Ecore_X_Atom backlight_atom = 0;
>  extern double e_bl_val;
>  
> +static void _e_comp_x_hook_client_pre_frame_assign(void *d EINA_UNUSED,
> E_Client *ec); +
>  static Eina_Bool
>  _e_comp_x_flusher(void *data EINA_UNUSED)
>  {
> @@ -1142,6 +1144,15 @@ _e_comp_x_show_request(void *data EINA_UNUSED, int
> type EINA_UNUSED, Ecore_X_Eve ecore_x_window_show(ev->win);
>          return ECORE_CALLBACK_RENEW;
>       }
> +   if ((e_comp->comp_type != E_PIXMAP_TYPE_X) && ec->ignored)
> +     {
> +        ec->visible = 1;
> +        if (ec->comp_data->need_reparent)
> +          _e_comp_x_hook_client_pre_frame_assign(NULL, ec);
> +        else
> +          ecore_x_window_show(ev->win);
> +        return ECORE_CALLBACK_RENEW;
> +     }
>  
>     if ((!ec->comp_data->reparented) && (!e_client_util_ignored_get(ec)))
>       {
> @@ -1395,7 +1406,7 @@ _e_comp_x_configure(void *data EINA_UNUSED, int type
> EINA_UNUSED, Ecore_X_Event_ EINA_RECTANGLE_SET(&ec->client, ev->x, ev->y,
> ev->w, ev->h); if (move)
>       evas_object_move(ec->frame, ev->x, ev->y);
> -   if (resize)
> +   if (resize && e_pixmap_is_x(ec->pixmap))
>       {
>          e_pixmap_dirty(ec->pixmap);
>          evas_object_resize(ec->frame, ev->w, ev->h);
> @@ -1993,6 +2004,25 @@ _e_comp_x_message(void *data EINA_UNUSED, int type
> EINA_UNUSED, Ecore_X_Event_Cl break;
>            }
>       }
> +#ifdef HAVE_WAYLAND
> +   else if (ev->message_type == WL_SURFACE_ID)
> +     {
> +        void *res;
> +        E_Client *wc = NULL;
> +
> +        if (e_comp->comp_type != E_PIXMAP_TYPE_WL) return
> ECORE_CALLBACK_RENEW;
> +        res = wl_client_get_object(e_comp->wl_comp_data->xwl_client,
> ev->data.l[0]);
> +        if (res)
> +          wc = wl_resource_get_user_data(res);
> +        if (wc)
> +          e_comp_x_xwayland_client_setup(ec, wc);
> +        else
> +          {
> +             ec->comp_data->surface_id = ev->data.l[0];
> +             e_comp_wl_xwayland_client_queue(ec);
> +          }
> +     }
> +#endif
>     return ECORE_CALLBACK_PASS_ON;
>  }
>  
> @@ -2737,7 +2767,10 @@ _e_comp_x_hook_client_pre_frame_assign(void *d
> EINA_UNUSED, E_Client *ec) ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
>                              0, 0, 0, 0, 0,
>                              win, ECORE_X_WINDOW_STACK_ABOVE);
> -   ecore_x_event_mask_set(pwin, ECORE_X_EVENT_MASK_MOUSE_IN |
> ECORE_X_EVENT_MASK_MOUSE_OUT);
> +   ecore_x_event_mask_set(pwin, ECORE_X_EVENT_MASK_KEY_DOWN |
> ECORE_X_EVENT_MASK_KEY_UP |
> +                                ECORE_X_EVENT_MASK_MOUSE_MOVE |
> ECORE_X_EVENT_MASK_MOUSE_DOWN |
> +                                ECORE_X_EVENT_MASK_MOUSE_UP |
> ECORE_X_EVENT_MASK_MOUSE_WHEEL |
> +                                ECORE_X_EVENT_MASK_MOUSE_IN |
> ECORE_X_EVENT_MASK_MOUSE_OUT); ecore_x_window_border_width_set(win, 0);
>     ec->border_size = 0;
>  
> @@ -4090,6 +4123,7 @@ _e_comp_x_hook_client_new(void *d EINA_UNUSED, E_Client
> *ec) ec->icccm.state = ECORE_X_WINDOW_STATE_HINT_NONE;
>  
>     if (!_e_comp_x_client_new_helper(ec)) return;
> +   ec->ignored |= e_comp->comp_type == E_PIXMAP_TYPE_WL;
>  
>     ec->comp_data->first_damage = ec->internal;
>  
> @@ -4561,16 +4595,19 @@ _e_comp_x_randr_change(void *data EINA_UNUSED, int
> ev_type EINA_UNUSED, void *ev if ((e_comp->w != e_randr2->w) ||
>         (e_comp->h != e_randr2->h))
>       {
> -        e_comp_canvas_resize(e_randr2->w, e_randr2->h);
> +        if (e_comp->comp_type == E_PIXMAP_TYPE_X)
> +          e_comp_canvas_resize(e_randr2->w, e_randr2->h);
>       }
>     else
>       {
>          E_Client *ec;
>  
>          ecore_x_netwm_desk_size_set(e_comp->root, e_comp->w, e_comp->h);
> -        e_randr2_screens_setup(e_comp->w, e_comp->h);
> +        if (e_comp->comp_type == E_PIXMAP_TYPE_X)
> +          e_randr2_screens_setup(e_comp->w, e_comp->h);
>  
> -        e_comp_canvas_update();
> +        if (e_comp->comp_type == E_PIXMAP_TYPE_X)
> +          e_comp_canvas_update();
>          E_CLIENT_FOREACH(ec)
>            {
>               if (!e_client_util_ignored_get(ec))
> @@ -4891,6 +4928,7 @@ _e_comp_x_setup(Ecore_X_Window root, int w, int h)
>     e_hints_init(root, e_comp->cm_selection);
>     ecore_x_window_background_color_set(root, 0, 0, 0);
>     ecore_x_screen_is_composited_set(0, e_comp->cm_selection);
> +   ecore_x_selection_owner_set(e_comp->cm_selection, ecore_x_atom_get
> ("WM_S0"), ecore_x_current_time_get()); 
>     e_comp->win = ecore_x_composite_render_window_enable(root);
>     if (!e_comp->win)
> @@ -4937,7 +4975,10 @@ _e_comp_x_setup(Ecore_X_Window root, int w, int h)
>     e_comp->bindings_grab_cb = _e_comp_x_bindings_grab_cb;
>     e_comp->bindings_ungrab_cb = _e_comp_x_bindings_ungrab_cb;
>  
> -   if (!e_comp_canvas_init(w, h)) return EINA_FALSE;
> +   if (e_comp->comp_type == E_PIXMAP_TYPE_NONE)
> +     {
> +        if (!e_comp_canvas_init(w, h)) return EINA_FALSE;
> +     }
>  
>     e_grabinput_focus(e_comp->ee_win, E_FOCUS_METHOD_PASSIVE);
>  
> @@ -4959,6 +5000,7 @@ _e_comp_x_setup(Ecore_X_Window root, int w, int h)
>          ec->lock_client_stacking = 1;
>          ec->internal = 1;
>          ec->visible = 1;
> +        evas_object_del(e_comp->layers[i].obj);
>          e_comp->layers[i].obj = ec->frame;
>          evas_object_layer_set(ec->frame, e_comp_canvas_layer_map_to(i));
>          evas_object_pass_events_set(ec->frame, 1);
> @@ -4968,11 +5010,14 @@ _e_comp_x_setup(Ecore_X_Window root, int w, int h)
>       ecore_x_window_lower(e_comp->layers[i].win);
>  
>     ecore_evas_lower(e_comp->ee);
> -   e_comp->pointer = e_pointer_window_new(e_comp->root, 0);
> -   e_comp->pointer->color = ecore_x_cursor_color_supported_get();
> -   e_pointer_type_push(e_comp->pointer, e_comp->pointer, "default");
> +   if (e_comp->comp_type == E_PIXMAP_TYPE_NONE)
> +     {
> +        e_comp->pointer = e_pointer_window_new(e_comp->root, 0);
> +        e_comp->pointer->color = ecore_x_cursor_color_supported_get();
> +        e_pointer_type_push(e_comp->pointer, e_comp->pointer, "default");
> +        ecore_x_icccm_state_set(ecore_evas_window_get(e_comp->ee),
> ECORE_X_WINDOW_STATE_HINT_NORMAL);
> +     }
>     _e_comp_x_manage_windows();
> -   ecore_x_icccm_state_set(ecore_evas_window_get(e_comp->ee),
> ECORE_X_WINDOW_STATE_HINT_NORMAL); 
>     {
>        E_Client *ec;
> @@ -4994,8 +5039,11 @@ _e_comp_x_screens_setup(void)
>     Ecore_X_Window root;
>     int rw, rh;
>  
> -   e_comp_x_randr_screen_iface_set();
> -   if (!e_randr2_init()) return 0;
> +   if (e_comp->comp_type == E_PIXMAP_TYPE_NONE)
> +     {
> +        e_comp_x_randr_screen_iface_set();
> +        if (!e_randr2_init()) return 0;
> +     }
>     root = ecore_x_window_root_first_get();
>     if (!root)
>       {
> @@ -5003,11 +5051,12 @@ _e_comp_x_screens_setup(void)
>          return 0;
>       }
>     ecore_x_window_size_get(root, &rw, &rh);
> -   e_randr2_screens_setup(rw, rh);
> +   if (e_comp->comp_type == E_PIXMAP_TYPE_NONE)
> +     e_randr2_screens_setup(rw, rh);
>     return _e_comp_x_setup(root, rw, rh);
>  }
>  
> -EINTERN Eina_Bool
> +E_API Eina_Bool
>  e_comp_x_init(void)
>  {
>     if (!ecore_x_init(NULL))
> @@ -5143,7 +5192,7 @@ e_comp_x_init(void)
>     return EINA_TRUE;
>  }
>  
> -EINTERN void
> +E_API void
>  e_comp_x_shutdown(void)
>  {
>     E_FREE_LIST(handlers, ecore_event_handler_del);
> @@ -5170,3 +5219,43 @@ e_comp_x_nocomp_end(void)
>     ecore_x_composite_redirect_subwindows(e_comp->root,
> ECORE_X_COMPOSITE_UPDATE_MANUAL); _e_comp_x_focus_check();
>  }
> +
> +#ifdef HAVE_WAYLAND
> +EINTERN void
> +e_comp_x_xwayland_client_setup(E_Client *ec, E_Client *wc)
> +{
> +   Ecore_X_Window win;
> +   E_Comp_X_Client_Data *cd;
> +
> +   win = e_client_util_win_get(ec);
> +   cd = ec->comp_data;
> +   e_comp_wl_client_xwayland_setup(wc, cd, e_pixmap_ref(ec->pixmap));
> +   eina_hash_del(damages_hash, &cd->damage, ec);
> +   ecore_x_damage_free(cd->damage);
> +   E_FREE_FUNC(cd->first_draw_delay, ecore_timer_del);
> +   cd->damage = 0;
> +   ec->comp_data = NULL;
> +   cd->evas_init = 0;
> +   _e_comp_x_client_evas_init(wc);
> +   wc->borderless = ec->borderless;
> +   wc->border.changed = 1;
> +   EC_CHANGED(wc);
> +   wc->depth = ec->depth;
> +   wc->override = ec->override;
> +   wc->placed = ec->placed;
> +   wc->input_only = ec->input_only;
> +   wc->border_size = ec->border_size;
> +   memcpy(&wc->icccm, &ec->icccm, sizeof(ec->icccm));
> +   memcpy(&wc->netwm, &ec->netwm, sizeof(ec->netwm));
> +   memcpy(&wc->e, &ec->e, sizeof(ec->e));
> +   ec->new_client = 1;
> +   e_comp->new_clients++;
> +
> +   eina_hash_set(clients_win_hash, &win, wc);
> +   wc->visible = 1;
> +   evas_object_show(wc->frame);
> +   e_object_del(E_OBJECT(ec));
> +   e_hints_window_visible_set(wc);
> +   _e_comp_x_client_stack(wc);
> +}
> +#endif
> diff --git a/src/bin/e_comp_x.h b/src/bin/e_comp_x.h
> index b392d65..1be3d46 100644
> --- a/src/bin/e_comp_x.h
> +++ b/src/bin/e_comp_x.h
> @@ -87,6 +87,9 @@ struct _E_Comp_X_Client_Data
>           Ecore_X_Illume_Window_State state;
>        } win_state;
>     } illume;
> +#ifdef HAVE_WAYLAND
> +   uint32_t surface_id;
> +#endif
>  
>     Eina_Bool moving : 1;
>     Eina_Bool first_map : 1;
> @@ -102,10 +105,11 @@ struct _E_Comp_X_Client_Data
>     Eina_Bool unredirected_single : 1;
>  };
>  
> -EINTERN Eina_Bool e_comp_x_init(void);
> -EINTERN void e_comp_x_shutdown(void);
> +E_API Eina_Bool e_comp_x_init(void);
> +E_API void e_comp_x_shutdown(void);
>  
>  E_API void e_alert_composite_win(Ecore_X_Window root, Ecore_X_Window win);
>  EINTERN void e_comp_x_nocomp_end(void);
> +EINTERN void e_comp_x_xwayland_client_setup(E_Client *ec, E_Client *wc);
>  # endif
>  #endif
> 
> -- 
> 
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to