On 09/13/2016 07:17 PM, Cedric BAIL wrote:
> Hello,
>
> On Tue, Sep 13, 2016 at 3:00 PM, Bruno Dilly <bdi...@profusion.mobi> wrote:
>> We’re working on improve EFL to support multi-seat in the same application
>> window.
>
> For people who do not know what multi-seat means in this context, we
> are talking about allowing multiple set of keyboard/mouse grouped into
> seat behave independently in the same application. There is no toolkit
> that support this at the moment, but Wayland/Weston does as you can
> see in this video: https://www.youtube.com/watch?v=WO2L_ihO_rI . This
> has nothing to do with systemd/logind multi seat, which actually
> account to a group of screen/keyboard/mouse per user just sharing the
> same CPU (like an hold X terminal on a mainframe).
>

Ok, some of my previous comments may not entirely apply then. I was 
thinking in the systemd/logind context....

dh

>> For make it doable, we’re considering the following approaches:
>>
>>    -
>>
>>    When using Wayland (Weston compositor) just get seat information from it
>>    -
>>
>>    When using X11 or FB, use VNC server to gather multiple seats mapped to
>>    remote clients
>>
>>
>> To make it possible, the following changes on Evas, Ecore_Evas, Ecore and
>> Ecore_Wl2 APIs are proposed. Please let us read your comments about it  =)
>>
>> After this work is done we’ll support it on Edje, but it’s not covered by
>> this discussion (we’ll send another RFC if it seems required at the time).
>>
>> Some tests and PoC were written on this repository:
>>
>> https://github.com/profusion/multi-seat-tests/
>>
>> Also could somebody please help us creating dev accounts for Iscaro and me?
>> So we could create dev branches and avoid keeping our work on external
>> repositories and making our workflow a bit more straightforward?
>
> Sure, we have the probie status for that purpose. With the large work
> to be done here, I don't think there is any problem to let you become
> probies. Please send me your info.txt properly filled and a ssh public
> keys. I will wait for a week before pushing it to let a chance to
> everyone to complain here if they feel like it is not motivated.
>
>> Thanks in advance
>>
>> = Changes on Evas =
>>
>>    -
>>
>>    _Evas_Public_Data should contain a hash indexed by seat of focused
>>    Evas_Objects. From “pd->focused” to “pd->focused[seat]”.
>
> Wouldn't it make sense to actually just give internally a number to
> each seat and use this as a mapping ? This way instead of a hash, you
> would have an array, which is nicer for just holding a pointer I
> think. Also I don't see anywhere in your proposal any event to notify
> the registration/unregistration of a seat. This will be necessary in
> the future for handling for example focus in elementary. There is an
> EFL_CANVAS_EVENT_DEVICE_CHANGED, but I don't think it match the use
> case. Would an EFL_CANVAS_EVENT_DEVICE_ADD and
> EFL_CANVAS_EVENT_DEVICE_DEL make sense to everyone ? Speaking of event
> you have also not talked about the focus event (object and canvas).
>
>>    -
>>
>>    A function similar to evas_object_top_at_pointer_get(const Evas *e)
>>    should be added. This new function will receive the Efl_Input_Device (the
>>    seat) as argument. The old function should return the top Evas_Object
>>    according to the default seat
>
> For what purpose ?
>
>>    -
>>
>>    evas_canvas_focus_get() should return the object focused by the default
>>    seat.
>>    -
>>
>>    evas_canvas_pointer_canvas_xy_get() Should return the XY from the
>>    default seat.
>>    -
>>
>>    evas_canvas_seat_pointer_canvas_xy_get() - Same thing as
>>    evas_canvas_pointer_canvas_xy_get(), however it returns the XY based on 
>> the
>>    seat.
>
> It will be nice in code to refactor evas_canvas_pointer_canvas_xy_get
> to reuse evas_canvas_seat_pointer_canvas_xy_get. Also at this stage, I
> think none of the multi seat function should be part of the legacy API
> and the efl/eo interface should all be multi seat by default (If you
> pass NULL as a device, I think it should target the default seat).
>
>>    -
>>
>>    evas_object_focus_set() - Will set/unset the focus only for the default
>>    seat.
>>    -
>>
>>    evas_object_focus_by_seat_set() should be added
>
> Same as above.
>
>>    -
>>
>>    evas_event_feed_hold - Will act in the default seat
>>    -
>>
>>    Add evas_event_feed_hold_by_seat() - Should we support this ?
>>    -
>>
>>    Add evas_device_seat_get(Evas_Device *dev);
>
> What will be the purpose of this function ?
>
>>    -
>>
>>       We may create a helper function in Efl_Input_Device::seat_get
>>       -
>>
>>    All evas_event_* functions will work on the top most seat. So in order
>>    to add an event for ‘seat 1’ one should do: evas_device_push(evas,
>>    seatOne); evas_event_*(); evas_device_pop(evas);
>
> evas_event functions are legacy only and mostly used internaly. I
> think we can just go with extending them and refactor the old version
> to call the new version with a NULL for seat.
>
>>    -
>>
>>    Evas will automatically create Evas_Devices
>>
>>
>>
>> = Changes on Ecore_Evas =
>>
>>    -
>>
>>    ecore_evas_x11_vnc_server_enabled(Ecore_Evas *ee, bool enable); -> This
>>    will enable vnc server for the ecore_evas x11 module.
>
> Hum, why not the following instead of 3 differents functions :
>
> Ecore_Evas_VNC_Handler *ecore_evas_vnc_server_add(Ecore_Evas *ee,
> const char *addr, int port, Cb accept_cb);
> void ecore_evas_vnc_server_del(Ecore_Evas_VNC_Handler *h);
>
>>    -
>>
>>    The struct _Ecore_Evas_Interface_X11 should contain a new function with
>>    the following signature Eina_Bool _setup_vnc_server() that will create the
>>    vnc server and start listening for clients.
>>    -
>>
>>    ecore_evas_x11_vnc_server_addr_set(Ecore_Evas *ee, const char *addr);
>>    -
>>
>>    ecore_evas_x11_vnc_server_accept_cb_set(Ecore_Evas *ee, Cb accept_cb);
>>    -
>>
>>    Ecore_Evas_x11 will create Efl_Input_Devices for every new user and set
>>    the emulated seat.
>>    -
>>
>>    In case of x11 - For every new vnc client an Efl_Input_Device will be
>>    created and added to the Evas canvas.
>>
>> = Changes on Evas x11 engine =
>>
>>    -
>>
>>    A callback will be created in order to notify the ecore_evas_x11 backend
>>    with the modified pixels. This will be used to properly draw the VNC 
>> remote
>>    screen.
>
> I am working on Efl_Canvas_Output (in Evas). This enable the
> possibility to define specific output from a canvas and you can have
> multiple output at the same time. If no output is set, we have the
> same behavior as today. If an output is set, it will only render the
> part of the canvas covered by that output. Each output is backend
> specific and can be extended by some custom engine info, but if no
> engine information is provided, it will just create a buffer. An
> output is also always also providing an Efl.Gfx.Buffer API and allow
> to get pixels back (I only plan to implement it for software backend
> at the moment, but it could be extended for OpenGL backend later).
>
> The use case for this feature are multi screen support in Wayland (and
> maybe improving the X one by limiting the size of the output to each
> screen instead of a max of both), screen casting, wireless display and
> remote display. I should be done by end of next week if everything
> goes as planned.
>
>> = Changes on Ecore_Wl2 =
>>
>>    -
>>
>>    In _Ecore_Wl2_Input - a Eina_Stringshare * will be added to the wl
>>    substruct. This Eina_Stringshare * will represent the seat name.
>>    -
>>
>>    Implement the _seat_cb_name() function in order to collect the seat name.
>>    -
>>
>>    For every wl_pointer/wl_keyboard/wl_seat it will be create an
>>    Efl_Input_Device. The wl_pointer and wl_keyboard will have the wl_seat as
>>    parent. After creation of these Efl_Input_Devices an ecore_event will be
>>    generated, so ecore_evas_input can grab it and properly add the devices
>>    into the canvas.
>
> I am not versed enough in Wayland, so will let Chris and Derek comment here.
>
>> = Ecore =
>>
>>    -
>>
>>    Ecore_Events structs should contain the Efl_Input_Device that originated
>>    the event.
>>
>>    -
>>
>>    These functions may be useful:
>>    -
>>
>>       Eina_List *ecore_input_get_seats() - Return all the available seats
>>       -
>>
>>       Ecore_Seat * ecore_input_seat_find(const char *name)
>
> Thanks,
>



------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to