protocol: introduce wl_shell_surface
authorPekka Paalanen <ppaalanen@gmail.com>
Thu, 24 Nov 2011 14:19:03 +0000 (16:19 +0200)
committerPekka Paalanen <ppaalanen@gmail.com>
Tue, 29 Nov 2011 12:46:49 +0000 (14:46 +0200)
Requests like 'move' and 'set_toplevel' are really methods of a surface,
not methods of a global shell object. Move all these methods to a new
interface, wl_shell_surface.

The global object wl_shell will contain only 'get_shell_surface'
request, which creates and associates a wl_shell_surface object to a
given wl_surface object.

This will also give the shell plugin (if you look at the demo
compositor) means to store per-surface private data in a natural way.

Due to a limitation in delete_id event handling on client side, the
client must destroy its wl_shell_surface object before destroying the
wl_surface object. Otherwise it may just leak an id.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
protocol/wayland.xml

index 51a83ef..b80f25e 100644 (file)
   </interface>
 
   <interface name="wl_shell" version="1">
-    <request name="move">
+    <request name="get_shell_surface">
+      <arg name="id" type="new_id" interface="wl_shell_surface"/>
       <arg name="surface" type="object" interface="wl_surface"/>
+    </request>
+  </interface>
+
+  <!-- A wrapper interface for shell related actions on a wl_surface.
+       On server side the object is automatically destroyed when the
+       related wl_surface is destroyed.
+       On client side, wl_shell_surface_destroy() must be called
+       before destroying the wl_surface object. -->
+  <interface name="wl_shell_surface" version="1">
+    <request name="move">
       <arg name="input_device" type="object" interface="wl_input_device"/>
       <arg name="time" type="uint"/>
     </request>
     </enum>
 
     <request name="resize">
-      <arg name="surface" type="object" interface="wl_surface"/>
       <arg name="input_device" type="object" interface="wl_input_device"/>
       <arg name="time" type="uint"/>
       <!-- edges is an enum, need to get the values in here -->
     </request>
 
     <!-- Make the surface visible as a toplevel window. -->
-    <request name="set_toplevel">
-      <arg name="surface" type="object" interface="wl_surface"/>
-    </request>
+    <request name="set_toplevel"/>
 
     <!-- Map the surface relative to an existing surface. The x and y
          arguments specify the locations of the upper left corner of
          determines the initial position or if the surface is locked
          to that relative position during moves. -->
     <request name="set_transient">
-      <arg name="surface" type="object" interface="wl_surface"/>
-      <arg name="parent" type="object" interface="wl_surface"/>
+      <arg name="parent" type="object" interface="wl_shell_surface"/>
       <arg name="x" type="int"/>
       <arg name="y" type="int"/>
       <arg name="flags" type="uint"/>
          fullscreen? what if there's already a fullscreen surface on
          the output, maybe you can only go fullscreen if you're
          active?  -->
-    <request name="set_fullscreen">
-      <arg name="surface" type="object" interface="wl_surface"/>
-    </request>
+    <request name="set_fullscreen"/>
 
     <!-- The configure event asks the client to resize its surface.
          The size is a hint, in the sense that the client is free to
     <event name="configure">
       <arg name="time" type="uint"/>
       <arg name="edges" type="uint"/>
-      <arg name="surface" type="object" interface="wl_surface"/>
       <arg name="width" type="int"/>
       <arg name="height" type="int"/>
     </event>