[PATCH wayland-protocols 0/7] xdg-shell: Tooltips revisited and xdg_positioner

Jonas Ådahl jadahl at gmail.com
Thu Apr 14 08:47:02 UTC 2016


On Thu, Apr 14, 2016 at 04:28:11PM +0800, Jonas Ådahl wrote:
> Hi,
> 
> This is the continuation of the previous patch series meaning to split up
> xdg_surface into different per-role interfaces, while making it possible to map
> more types of surfaces. It enables using xdg_shell to create tooltips and other
> non-grabbing popups, as well as introduces a declarative system for enabling
> clients to position its child surfaces (such as menus and popovers) within the
> "work area" of the compositor.
> 
> Regarding the new popup interface, it should make it possible to use popups for
> both grabbing popup chains such as menus with sub menus, as well as tooltips
> and non-grabbing popups. The one-popup-chain rule still exists, but one can now
> have multiple popups on the same surface. For example it is possible to a
> non-grabbing pop over surface, while still showing tooltips on the toplevel
> surface.
> 
> One currently unsolved stacking related issue is how to avoid newly created
> popups being stacked above previous ones. For example a tooltip on a menu item
> will stacked under a sub menu surface if the sub menu is created after the
> tooltip.
> 
> The new positioning API is meant to provide a declarative high level
> description of how the compositor should try to position the child surface if
> it would overflow outside of some compositor specific "work area" (in the
> protocol referred to as "constrained"). With this it should be possible to
> describe most if not all common menu positioning semantics out there, with the
> possibility to adding more rules later.
> 
> With the new API, a client will perform the following operations to map a menu
> that is to be expanded right of and below some user interface element (such as
> button), flips vertically to the other side of the button if doesn't fit below,
> and slides along the x-axis if it would end up outside of the left or right
> screen edge:
> 
>  toplevel_xdg_surface = xdg_surface of the toplevel surface
>  button_rect = surface window geometry relative rectangle of the button widget
>  menu_window_rect = window geometry of the menu surface
> 
>  /* Create base interfaces. */
>  menu_wl_surface = wl_compositor.create_surface()
>  menu_xdg_surface = xdg_shell.get_xdg_surface(menu_wl_surface)
> 
>  /* Set up positioning description. */
>  menu_xdg_positioner = xdg_shell.create_positioner()
>  menu_xdg_positioner.set_anchor_rect(button_rect)
>  menu_xdg_positioner.set_gravity(gravity_bottom|gravity_right)
>  menu_xdg_positioner.set_anchor(anchor_bottom|anchor_right)
>  menu_xdg_positioner.set_constrain_action(slide_x|flip_y)
> 
>  /* Make it a popup. */
>  menu_xdg_popup = xdg_surface.get_popup(menu_xdg_surface,
>                                         toplevel_xdg_surface,
>                                         menu_xdg_positioner)
>  menu_xdg_positioner.destroy()
> 
>  /* Set up initial required state. */
>  menu_xdg_surface.set_window_geometry(menu_window_rect)
>  menu_xdg_popup.grab(seat, serial)
> 
>  /* Commit intial state (note now content is attached!). */
>  menu_wl_surface.commit()

Obviously "now" here is a typo, and should be "no". *no* content is
attached at this stage. (Thanks Pekka for pointing this out)


Jonas

> 
>  ... compositor will given the window geometry and parent surface compute a
>      resulting position. ....
> 
>  *** received from the compositor: menu_xdg_popup.configure(x, y),
>                                    menu_xdg_surface.configure(serial)
> 
>  menu_wl_surface.attach(buffer_with_menu_content_drawn_into_it)
>  menu_wl_surface.commit()
> 
>  .. compositor will map the surface at the previously computer position
> 
> The currently unsolved problems with the positioning API is whether it is
> within scope to provide wl_subsurface like parent-child state synchronization
> capabilities, whether a popup can ever be moved once it has been initially
> positioned, and whether to allow the client to move the popup after it has been
> positioned (by setting new positioners).
> 
> Moving could easily be added in a later revision, but parent-child state
> synchronization and whether the compositor is allowed move the popup after it
> was initially positioned are probably questions that should be answered up
> front.
> 
> 
> Jonas
> 
> 
> 
> Jonas Ådahl (7):
>   xdg-shell: Turn xdg_surface into a generic base interface
>   xdg-shell: Put xdg_shell events after requests
>   xdg-shell: Add error codes for invalid surface state
>   xdg-shell: Improve error enum formatting some
>   xdg-shell: Make get_popup take a xdg_surface instead of wl_surface
>   xdg-shell: Make xdg_popup non-grabbing by default
>   xdg-shell: Introduce xdg_positioner
> 
>  unstable/xdg-shell/xdg-shell-unstable-v6.xml | 586 ++++++++++++++++++++-------
>  1 file changed, 437 insertions(+), 149 deletions(-)
> 
> -- 
> 2.4.3
> 


More information about the wayland-devel mailing list