Copyright © 2008-2013 Kristian Høgsberg
    Copyright © 2013      Rafael Antognolli
    Copyright © 2013      Jasper St. Pierre
    Copyright © 2010-2013 Intel Corporation
    Permission to use, copy, modify, distribute, and sell this
    software and its documentation for any purpose is hereby granted
    without fee, provided that the above copyright notice appear in
    all copies and that both that copyright notice and this permission
    notice appear in supporting documentation, and that the name of
    the copyright holders not be used in advertising or publicity
    pertaining to distribution of the software without specific,
    written prior permission.  The copyright holders make no
    representations about the suitability of this software for any
    purpose.  It is provided "as is" without express or implied
    warranty.
    THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
    SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
    FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
    SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
    AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
    ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
    THIS SOFTWARE.
  
  
    
      xdg_shell allows clients to turn a wl_surface into a "real window"
      which can be dragged, resized, stacked, and moved around by the
      user. Everything about this interface is suited towards traditional
      desktop environments.
    
    
      
	The 'current' member of this enum gives the version of the
	protocol.  Implementations can compare this to the version
	they implement using static_assert to ensure the protocol and
	implementation versions match.
      
      
    
    
      
    
    
      
        Destroy this xdg_shell object.
        Destroying a bound xdg_shell object while there are surfaces
        still alive with roles from this interface is illegal and will
        result in a protocol error. Make sure to destroy all surfaces
        before destroying this object.
      
    
    
      
	Negotiate the unstable version of the interface.  This
	mechanism is in place to ensure client and server agree on the
	unstable versions of the protocol that they speak or exit
	cleanly if they don't agree.  This request will go away once
	the xdg-shell protocol is stable.
      
      
    
    
      
	This creates an xdg_surface for the given surface and gives it the
	xdg_surface role. See the documentation of xdg_surface for more details.
      
      
      
    
    
      
	This creates an xdg_popup for the given surface and gives it the
	xdg_popup role. See the documentation of xdg_popup for more details.
	This request must be used in response to some sort of user action
	like a button press, key press, or touch down event.
      
      
      
      
      
      
      
      
    
    
      
        The ping event asks the client if it's still alive. Pass the
        serial specified in the event back to the compositor by sending
        a "pong" request back with the specified serial.
        Compositors can use this to determine if the client is still
        alive. It's unspecified what will happen if the client doesn't
        respond to the ping request, or in what timeframe. Clients should
        try to respond in a reasonable amount of time.
      
      
    
    
      
	A client must respond to a ping event with a pong request or
	the client may be deemed unresponsive.
      
      
    
  
  
    
      An interface that may be implemented by a wl_surface, for
      implementations that provide a desktop-style user interface.
      It provides requests to treat surfaces like windows, allowing to set
      properties like maximized, fullscreen, minimized, and to move and resize
      them, and associate metadata like title and app id.
    
    
      
	Unmap and destroy the window. The window will be effectively
	hidden from the user's point of view, and all state like
	maximization, fullscreen, and so on, will be lost.
      
    
    
      
	Set the "parent" of this surface. This window should be stacked
	above a parent. The parent surface must be mapped as long as this
	surface is mapped.
	Parent windows should be set on dialogs, toolboxes, or other
	"auxiliary" surfaces, so that the parent is raised when the dialog
	is raised.
      
      
    
    
      
	Set a short title for the surface.
	This string may be used to identify the surface in a task bar,
	window list, or other user interface elements provided by the
	compositor.
	The string must be encoded in UTF-8.
      
      
    
    
      
	Set an application identifier for the surface.
	The app ID identifies the general class of applications to which
	the surface belongs. The compositor can use this to group multiple
	applications together, or to determine how to launch a new
	application.
	See the desktop-entry specification [0] for more details on
	application identifiers and how they relate to well-known DBus
	names and .desktop files.
	[0] http://standards.freedesktop.org/desktop-entry-spec/
      
      
    
    
      
        Clients implementing client-side decorations might want to show
        a context menu when right-clicking on the decorations, giving the
        user a menu that they can use to maximize or minimize the window.
        This request asks the compositor to pop up such a window menu at
        the given position, relative to the local surface coordinates of
        the parent surface. There are no guarantees as to what menu items
        the window menu contains.
        This request must be used in response to some sort of user action
        like a button press, key press, or touch down event.
      
      
      
      
      
    
    
      
	Start an interactive, user-driven move of the surface.
	This request must be used in response to some sort of user action
	like a button press, key press, or touch down event.
	The server may ignore move requests depending on the state of
	the surface (e.g. fullscreen or maximized).
      
      
      
    
    
      
	These values are used to indicate which edge of a surface
	is being dragged in a resize operation. The server may
	use this information to adapt its behavior, e.g. choose
	an appropriate cursor image.
      
      
      
      
      
      
      
      
      
      
    
    
      
	Start a user-driven, interactive resize of the surface.
	This request must be used in response to some sort of user action
	like a button press, key press, or touch down event.
	The server may ignore resize requests depending on the state of
	the surface (e.g. fullscreen or maximized).
      
      
      
      
    
    
      
        The different state values used on the surface. This is designed for
        state values like maximized, fullscreen. It is paired with the
        configure event to ensure that both the client and the compositor
        setting the state can be synchronized.
        States set in this way are double-buffered. They will get applied on
        the next commit.
        Desktop environments may extend this enum by taking up a range of
        values and documenting the range they chose in this description.
        They are not required to document the values for the range that they
        chose. Ideally, any good extensions from a desktop environment should
        make its way into standardization into this enum.
        The current reserved ranges are:
        0x0000 - 0x0FFF: xdg-shell core values, documented below.
        0x1000 - 0x1FFF: GNOME
      
      
        The surface is maximized. The window geometry specified in the configure
        event must be obeyed by the client.
      
      
        The surface is fullscreen. The window geometry specified in the configure
        event must be obeyed by the client.
      
      
        The surface is being resized. The window geometry specified in the
        configure event is a maximum; the client cannot resize beyond it.
        Clients that have aspect ratio or cell sizing configuration can use
        a smaller size, however.
      
      
        Client window decorations should be painted as if the window is
        active. Do not assume this means that the window actually has
        keyboard or pointer focus.
      
    
    
      
	The configure event asks the client to resize its surface or to
	change its state.
	The width and height arguments specify a hint to the window
	about how its surface should be resized in window geometry
	coordinates.
	The states listed in the event specify how the width/height
	arguments should be interpreted, and possibly how it should be
	drawn.
	Clients should arrange their surface for the new size and
	states, and then send a ack_configure request with the serial
	sent in this configure event at some point before committing
	the new surface.
	If the client receives multiple configure events before it
        can respond to one, it is free to discard all but the last
        event it received.
      
      
      
      
      
    
    
      
        When a configure event is received, if a client commits the
        surface in response to the configure event, then the client
        must make a ack_configure request before the commit request,
        passing along the serial of the configure event.
        The compositor might use this information to move a surface
        to the top left only when the client has drawn itself for
        the maximized or fullscreen state.
        If the client receives multiple configure events before it
        can respond to one, it only has to ack the last configure event.
      
      
    
    
      
        The window geometry of a window is its "visible bounds" from the
        user's perspective. Client-side decorations often have invisible
        portions like drop-shadows which should be ignored for the
        purposes of aligning, placing and constraining windows.
        Once the window geometry of the surface is set once, it is not
        possible to unset it, and it will remain the same until
        set_window_geometry is called again, even if a new subsurface or
        buffer is attached.
        If never set, the value is the full bounds of the surface,
        including any subsurfaces. This updates dynamically on every
        commit. This unset mode is meant for extremely simple clients.
        If responding to a configure event, the window geometry in here
        must respect the sizing negotiations specified by the states in
        the configure event.
        The width and height must be greater than zero.
      
      
      
      
      
    
    
    
    
      
	Make the surface fullscreen.
        You can specify an output that you would prefer to be fullscreen.
	If this value is NULL, it's up to the compositor to choose which
        display will be used to map this surface.
      
      
    
    
    
      
	Request that the compositor minimize your surface. There is no
	way to know if the surface is currently minimized, nor is there
	any way to unset minimization on this surface.
	If you are looking to throttle redrawing when minimized, please
	instead use the wl_surface.frame event for this, as this will
	also work with live previews on windows in Alt-Tab, Expose or
	similar compositor features.
      
    
    
      
        The close event is sent by the compositor when the user
        wants the surface to be closed. This should be equivalent to
        the user clicking the close button in client-side decorations,
        if your application has any...
        This is only a request that the user intends to close your
        window. The client may choose to ignore this request, or show
        a dialog to ask the user to save their data...
      
    
  
  
    
      A popup surface is a short-lived, temporary surface that can be
      used to implement menus. It takes an explicit grab on the surface
      that will be dismissed when the user dismisses the popup. This can
      be done by the user clicking outside the surface, using the keyboard,
      or even locking the screen through closing the lid or a timeout.
      When the popup is dismissed, a popup_done event will be sent out,
      and at the same time the surface will be unmapped. The xdg_popup
      object is now inert and cannot be reactivated, so clients should
      destroy it. Explicitly destroying the xdg_popup object will also
      dismiss the popup and unmap the surface.
      Clients will receive events for all their surfaces during this
      grab (which is an "owner-events" grab in X11 parlance). This is
      done so that users can navigate through submenus and other
      "nested" popup windows without having to dismiss the topmost
      popup.
      Clients that want to dismiss the popup when another surface of
      their own is clicked should dismiss the popup using the destroy
      request.
      The parent surface must have either an xdg_surface or xdg_popup
      role.
      Specifying an xdg_popup for the parent means that the popups are
      nested, with this popup now being the topmost popup. Nested
      popups must be destroyed in the reverse order they were created
      in, e.g. the only popup you are allowed to destroy at all times
      is the topmost one.
      If there is an existing popup when creating a new popup, the
      parent must be the current topmost popup.
      A parent surface must be mapped before the new popup is mapped.
      When compositors choose to dismiss a popup, they will likely
      dismiss every nested popup as well.
      The x and y arguments specify where the top left of the popup
      should be placed, relative to the local surface coordinates of the
      parent surface.
    
    
      
	These errors can be emitted in response to xdg_popup requests.
      
      
      
    
    
      
	This destroys the popup. Explicitly destroying the xdg_popup
	object will also dismiss the popup, and unmap the surface.
	If this xdg_popup is not the "topmost" popup, a protocol error
	will be sent.
      
    
    
      
	The popup_done event is sent out when a popup is dismissed
	by the compositor.