Well clearly gmail does line wrapping, which I did not realize. So
while I figure that out, please enjoy the patch which I attached.

On 19 April 2015 at 22:30, Auke Booij <a...@tulcod.com> wrote:
> On 19 April 2015 at 14:51, Jeroen Bollen <jbin...@gmail.com> wrote:
>> Hello,
>>
>> It seems like this discussion died off. Currently there is no way to tell,
>> from the Wayland XML specification whether an argument is a bitfield, or
>> whether the argument takes an enum and what enum this is.
>>
>> I am currently in the progress of writing a Wayland binding generator for
>> the Rust language. This language, like many others is strongly typed. To
>> make full usage of this type system, it would be beneficial to know from the
>> specification whether an argument is a bitfield, and what enum type it
>> takes.
>>
>> Surely there are more people who generate bindings to these strongly typed
>> languages. How have you fixed the issue? Are there patched versions
>> available, and maybe pending to be merged? I have looked around a bit, and
>> didn't find anything, but then again, I'm not familiar with Wayland
>> development. (This is the first time I use a mailing list!)
>
> Quite coincidentally, I was planning on writing a similar email quite
> soon, so I'll just go ahead and write what I wanted to say!
>
> I wrote Haskell bindings, and the same problem occurs there. I did not
> find a way to solve the problem, and it would be best if such an enum
> argument be added to the spec.
>
> I wrote the patch below. It introduces an "enum" attribute that allows
> message arguments to refer to the enum collection they're using (it is
> understood that this enum is part of the same interface). I also added
> a "bitfield" attribute to enums that indicates whether the enum values
> are to be OR'ed together, or to be used as-is: ie whether the enum
> values are actually enums or actually flag fields.
>
>
>
> This improvement to the protocol allows you to refer to the kind of
> enum you are expecting.
> It also introduces a distinction between enums that are bitfields, ie
> that can be OR'ed together.
> ---
>  protocol/wayland.dtd |  2 ++
>  protocol/wayland.xml | 32 ++++++++++++++++----------------
>  2 files changed, 18 insertions(+), 16 deletions(-)
>
> diff --git a/protocol/wayland.dtd b/protocol/wayland.dtd
> index b8b1573..3b67ca8 100644
> --- a/protocol/wayland.dtd
> +++ b/protocol/wayland.dtd
> @@ -14,6 +14,7 @@
>  <!ELEMENT enum (description?,entry*)>
>    <!ATTLIST enum name CDATA #REQUIRED>
>    <!ATTLIST enum since CDATA #IMPLIED>
> +  <!ATTLIST enum bitfield CDATA #IMPLIED>
>  <!ELEMENT entry (description?)>
>    <!ATTLIST entry name CDATA #REQUIRED>
>    <!ATTLIST entry value CDATA #REQUIRED>
> @@ -25,5 +26,6 @@
>    <!ATTLIST arg summary CDATA #IMPLIED>
>    <!ATTLIST arg interface CDATA #IMPLIED>
>    <!ATTLIST arg allow-null CDATA #IMPLIED>
> +  <!ATTLIST arg enum CDATA #IMPLIED>
>  <!ELEMENT description (#PCDATA)>
>    <!ATTLIST description summary CDATA #REQUIRED>
> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
> index f52677f..2b9efa1 100644
> --- a/protocol/wayland.xml
> +++ b/protocol/wayland.xml
> @@ -367,7 +367,7 @@
>   can be used for buffers. Known formats include
>   argb8888 and xrgb8888.
>        </description>
> -      <arg name="format" type="uint"/>
> +      <arg name="format" type="uint" enum="format"/>
>      </event>
>    </interface>
>
> @@ -774,7 +774,7 @@
>        </description>
>        <arg name="seat" type="object" interface="wl_seat" summary="the
> wl_seat whose pointer is used"/>
>        <arg name="serial" type="uint" summary="serial of the implicit
> grab on the pointer"/>
> -      <arg name="edges" type="uint" summary="which edge or corner is
> being dragged"/>
> +      <arg name="edges" type="uint" summary="which edge or corner is
> being dragged" enum="resize"/>
>      </request>
>
>      <request name="set_toplevel">
> @@ -785,7 +785,7 @@
>        </description>
>      </request>
>
> -    <enum name="transient">
> +    <enum name="transient" bitfield="true">
>        <description summary="details of transient behaviour">
>   These flags specify details of the expected behaviour
>   of transient surfaces. Used in the set_transient request.
> @@ -807,7 +807,7 @@
>        <arg name="parent" type="object" interface="wl_surface"/>
>        <arg name="x" type="int"/>
>        <arg name="y" type="int"/>
> -      <arg name="flags" type="uint"/>
> +      <arg name="flags" type="uint" enum="transient"/>
>      </request>
>
>      <enum name="fullscreen_method">
> @@ -891,7 +891,7 @@
>        <arg name="parent" type="object" interface="wl_surface"/>
>        <arg name="x" type="int"/>
>        <arg name="y" type="int"/>
> -      <arg name="flags" type="uint"/>
> +      <arg name="flags" type="uint" enum="transient"/>
>      </request>
>
>      <request name="set_maximized">
> @@ -972,7 +972,7 @@
>   in surface local coordinates.
>        </description>
>
> -      <arg name="edges" type="uint"/>
> +      <arg name="edges" type="uint" enum="resize"/>
>        <arg name="width" type="int"/>
>        <arg name="height" type="int"/>
>      </event>
> @@ -1337,7 +1337,7 @@
>        maintains a keyboard focus and a pointer focus.
>      </description>
>
> -    <enum name="capability">
> +    <enum name="capability" bitfield="true">
>        <description summary="seat capability bitmask">
>          This is a bitmask of capabilities this seat has; if a member is
>          set, then it is present on the seat.
> @@ -1353,7 +1353,7 @@
>   keyboard or touch capabilities.  The argument is a capability
>   enum containing the complete set of capabilities this seat has.
>        </description>
> -      <arg name="capabilities" type="uint"/>
> +      <arg name="capabilities" type="uint" enum="capability"/>
>      </event>
>
>      <request name="get_pointer">
> @@ -1521,7 +1521,7 @@
>        <arg name="serial" type="uint"/>
>        <arg name="time" type="uint" summary="timestamp with
> millisecond granularity"/>
>        <arg name="button" type="uint"/>
> -      <arg name="state" type="uint"/>
> +      <arg name="state" type="uint" enum="button_state"/>
>      </event>
>
>      <enum name="axis">
> @@ -1553,7 +1553,7 @@
>        </description>
>
>        <arg name="time" type="uint" summary="timestamp with
> millisecond granularity"/>
> -      <arg name="axis" type="uint"/>
> +      <arg name="axis" type="uint" enum="axis"/>
>        <arg name="value" type="fixed"/>
>      </event>
>
> @@ -1593,7 +1593,7 @@
>   This event provides a file descriptor to the client which can be
>   memory-mapped to provide a keyboard mapping description.
>        </description>
> -      <arg name="format" type="uint"/>
> +      <arg name="format" type="uint" enum="keymap_format"/>
>        <arg name="fd" type="fd"/>
>        <arg name="size" type="uint"/>
>      </event>
> @@ -1638,7 +1638,7 @@
>        <arg name="serial" type="uint"/>
>        <arg name="time" type="uint" summary="timestamp with
> millisecond granularity"/>
>        <arg name="key" type="uint"/>
> -      <arg name="state" type="uint"/>
> +      <arg name="state" type="uint" enum="key_state"/>
>      </event>
>
>      <event name="modifiers">
> @@ -1819,17 +1819,17 @@
>     summary="width in millimeters of the output"/>
>        <arg name="physical_height" type="int"
>     summary="height in millimeters of the output"/>
> -      <arg name="subpixel" type="int"
> +      <arg name="subpixel" type="int" enum="subpixel"
>     summary="subpixel orientation of the output"/>
>        <arg name="make" type="string"
>     summary="textual description of the manufacturer"/>
>        <arg name="model" type="string"
>     summary="textual description of the model"/>
> -      <arg name="transform" type="int"
> +      <arg name="transform" type="int" enum="transform"
>     summary="transform that maps framebuffer to output"/>
>      </event>
>
> -    <enum name="mode">
> +    <enum name="mode" bitfield="true">
>        <description summary="mode information">
>   These flags describe properties of an output mode.
>   They are used in the flags bitfield of the mode event.
> @@ -1856,7 +1856,7 @@
>          the output may be scaled, as described in wl_output.scale,
>          or transformed , as described in wl_output.transform.
>        </description>
> -      <arg name="flags" type="uint" summary="bitfield of mode flags"/>
> +      <arg name="flags" type="uint" summary="bitfield of mode flags"
> enum="mode"/>
>        <arg name="width" type="int" summary="width of the mode in
> hardware units"/>
>        <arg name="height" type="int" summary="height of the mode in
> hardware units"/>
>        <arg name="refresh" type="int" summary="vertical refresh rate in mHz"/>
> --
> 2.3.5
From 2a8ad2d93465048b4c6869cd3266d3c66b1693e7 Mon Sep 17 00:00:00 2001
From: Auke Booij <a...@tulcod.com>
Date: Sat, 18 Apr 2015 13:34:43 +0200
Subject: [PATCH] Clarify the enum argument type

This improvement to the protocol allows you to refer to the kind of enum you are expecting.
It also introduces a distinction between enums that are bitfields, ie
that can be OR'ed together.
---
 protocol/wayland.dtd |  2 ++
 protocol/wayland.xml | 32 ++++++++++++++++----------------
 2 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/protocol/wayland.dtd b/protocol/wayland.dtd
index b8b1573..3b67ca8 100644
--- a/protocol/wayland.dtd
+++ b/protocol/wayland.dtd
@@ -14,6 +14,7 @@
 <!ELEMENT enum (description?,entry*)>
   <!ATTLIST enum name CDATA #REQUIRED>
   <!ATTLIST enum since CDATA #IMPLIED>
+  <!ATTLIST enum bitfield CDATA #IMPLIED>
 <!ELEMENT entry (description?)>
   <!ATTLIST entry name CDATA #REQUIRED>
   <!ATTLIST entry value CDATA #REQUIRED>
@@ -25,5 +26,6 @@
   <!ATTLIST arg summary CDATA #IMPLIED>
   <!ATTLIST arg interface CDATA #IMPLIED>
   <!ATTLIST arg allow-null CDATA #IMPLIED>
+  <!ATTLIST arg enum CDATA #IMPLIED>
 <!ELEMENT description (#PCDATA)>
   <!ATTLIST description summary CDATA #REQUIRED>
diff --git a/protocol/wayland.xml b/protocol/wayland.xml
index f52677f..2b9efa1 100644
--- a/protocol/wayland.xml
+++ b/protocol/wayland.xml
@@ -367,7 +367,7 @@
 	can be used for buffers. Known formats include
 	argb8888 and xrgb8888.
       </description>
-      <arg name="format" type="uint"/>
+      <arg name="format" type="uint" enum="format"/>
     </event>
   </interface>
 
@@ -774,7 +774,7 @@
       </description>
       <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
       <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
-      <arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
+      <arg name="edges" type="uint" summary="which edge or corner is being dragged" enum="resize"/>
     </request>
 
     <request name="set_toplevel">
@@ -785,7 +785,7 @@
       </description>
     </request>
 
-    <enum name="transient">
+    <enum name="transient" bitfield="true">
       <description summary="details of transient behaviour">
 	These flags specify details of the expected behaviour
 	of transient surfaces. Used in the set_transient request.
@@ -807,7 +807,7 @@
       <arg name="parent" type="object" interface="wl_surface"/>
       <arg name="x" type="int"/>
       <arg name="y" type="int"/>
-      <arg name="flags" type="uint"/>
+      <arg name="flags" type="uint" enum="transient"/>
     </request>
 
     <enum name="fullscreen_method">
@@ -891,7 +891,7 @@
       <arg name="parent" type="object" interface="wl_surface"/>
       <arg name="x" type="int"/>
       <arg name="y" type="int"/>
-      <arg name="flags" type="uint"/>
+      <arg name="flags" type="uint" enum="transient"/>
     </request>
 
     <request name="set_maximized">
@@ -972,7 +972,7 @@
 	in surface local coordinates.
       </description>
 
-      <arg name="edges" type="uint"/>
+      <arg name="edges" type="uint" enum="resize"/>
       <arg name="width" type="int"/>
       <arg name="height" type="int"/>
     </event>
@@ -1337,7 +1337,7 @@
       maintains a keyboard focus and a pointer focus.
     </description>
 
-    <enum name="capability">
+    <enum name="capability" bitfield="true">
       <description summary="seat capability bitmask">
         This is a bitmask of capabilities this seat has; if a member is
         set, then it is present on the seat.
@@ -1353,7 +1353,7 @@
 	keyboard or touch capabilities.  The argument is a capability
 	enum containing the complete set of capabilities this seat has.
       </description>
-      <arg name="capabilities" type="uint"/>
+      <arg name="capabilities" type="uint" enum="capability"/>
     </event>
 
     <request name="get_pointer">
@@ -1521,7 +1521,7 @@
       <arg name="serial" type="uint"/>
       <arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
       <arg name="button" type="uint"/>
-      <arg name="state" type="uint"/>
+      <arg name="state" type="uint" enum="button_state"/>
     </event>
 
     <enum name="axis">
@@ -1553,7 +1553,7 @@
       </description>
 
       <arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
-      <arg name="axis" type="uint"/>
+      <arg name="axis" type="uint" enum="axis"/>
       <arg name="value" type="fixed"/>
     </event>
 
@@ -1593,7 +1593,7 @@
 	This event provides a file descriptor to the client which can be
 	memory-mapped to provide a keyboard mapping description.
       </description>
-      <arg name="format" type="uint"/>
+      <arg name="format" type="uint" enum="keymap_format"/>
       <arg name="fd" type="fd"/>
       <arg name="size" type="uint"/>
     </event>
@@ -1638,7 +1638,7 @@
       <arg name="serial" type="uint"/>
       <arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
       <arg name="key" type="uint"/>
-      <arg name="state" type="uint"/>
+      <arg name="state" type="uint" enum="key_state"/>
     </event>
 
     <event name="modifiers">
@@ -1819,17 +1819,17 @@
 	   summary="width in millimeters of the output"/>
       <arg name="physical_height" type="int"
 	   summary="height in millimeters of the output"/>
-      <arg name="subpixel" type="int"
+      <arg name="subpixel" type="int" enum="subpixel"
 	   summary="subpixel orientation of the output"/>
       <arg name="make" type="string"
 	   summary="textual description of the manufacturer"/>
       <arg name="model" type="string"
 	   summary="textual description of the model"/>
-      <arg name="transform" type="int"
+      <arg name="transform" type="int" enum="transform"
 	   summary="transform that maps framebuffer to output"/>
     </event>
 
-    <enum name="mode">
+    <enum name="mode" bitfield="true">
       <description summary="mode information">
 	These flags describe properties of an output mode.
 	They are used in the flags bitfield of the mode event.
@@ -1856,7 +1856,7 @@
         the output may be scaled, as described in wl_output.scale,
         or transformed , as described in wl_output.transform.
       </description>
-      <arg name="flags" type="uint" summary="bitfield of mode flags"/>
+      <arg name="flags" type="uint" summary="bitfield of mode flags" enum="mode"/>
       <arg name="width" type="int" summary="width of the mode in hardware units"/>
       <arg name="height" type="int" summary="height of the mode in hardware units"/>
       <arg name="refresh" type="int" summary="vertical refresh rate in mHz"/>
-- 
2.3.5

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to