On Tue, Sep 13, 2016 at 8:17 PM, Cedric BAIL <cedric.b...@free.fr> 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). > > > 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). > About the events - In Ecore_Wl2 section we said that after a wl_keyboard/wl_seat is added we would generate an ecore_event for that notifying that a new device is available. This event_info will be the Efl_Input_Device itself. Is this ok? We can do the same thing for focus, inform the object + seat + device itself. > > - > > > > 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 ? > Just wanted to keep the API sane. Should we ignore this one? > > > - > > > > 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). > Indeed, our idea was to implement refactor the old functions to use new seat functions passing the default seat as argument. > > > - > > > > 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. > ok > > > - > > > > 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); > We did 3 separated functions to make it easir for an user to start using vnc with he default configuration, but I see no problem in your approuch. > > > - > > > > 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. > Awesome. I will take a look once it's ready. > > > = 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, > -- > Cedric BAIL > > ------------------------------------------------------------ > ------------------ > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > Thanks. ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel