<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 23, 2014 at 8:17 AM, Nils Chr. Brause <span dir="ltr"><<a href="mailto:nilschrbrause@gmail.com" target="_blank">nilschrbrause@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="">On Tue, Sep 23, 2014 at 8:35 AM, Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>> wrote:<br>
> On Tue, 23 Sep 2014 13:59:39 +0800<br>
> Boyan Ding <<a href="mailto:stu_dby@126.com">stu_dby@126.com</a>> wrote:<br>
><br>
>> On Mon, 2014-09-22 at 11:27 -0700, Jason Ekstrand wrote:<br>
>><br>
>> > I'm a little unsure.  I think trying to completely solve this problem<br>
>> > in a way that will truly make strongly typed languages happy is<br>
>> > insanity.  That said, I'm cautiously ok with defining bitfields and<br>
>> > enums as long as we are very careful in scoping what "bitfield" and<br>
>> > "enum" mean.  A "bitfield" should have only power of two values and<br>
>> > the result should always be interpreted as an OR of those values.  An<br>
>> > enum should have every possible value enumerated.  If anyone has a<br>
>> > good example of something that validly doesn't fit into either of<br>
>> > these, please speak up.<br>
<br>
</span>Originally, the idea to distinct between enumerations and bitfields was that<br>
the user should be able to apply bitwise logic operations, where it might be<br>
useful (everything I marked with is_bitfield="true") and not be able to do this<br>
where this doesn't make sense (everywhere else).<br>
<br>
Therefore, everything should fall in either of these categories. Either it makes<br>
sense to use bitwise logic operations or it doesn't.<br></blockquote><div><br>In this case, what is the point of making the distinction?  Why not just
 specify everything as a bitfield?  What do you gain from knowing that 
two things will never be ORed together?<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span class=""><br>
>> ><br>
>> > The example of wl_output.transform is an enum because every<br>
>> > possibility is enumerated.  From C or a similar language, you can do<br>
>> > fun stuff like "if (transform & WL_OUTPUT_TRANSFORM_FLIPPED)" to<br>
>> > determine if there is a flip.  In a strongly typed language, you can't<br>
>> > do this and we shouldn't bend over backwards to make it possible.  If<br>
<br>
</span>With the logic explained above, this would fall in my bitfield category. Having<br>
more than the power-of-two values listed isn't a problem in my opinion. I see<br>
these extra values as some sort of shortcuts for often used OR-combinations.<br>
<br>
The strongly-typed part here only means that you can't compare<br>
enums/bitfields of different type or pass type B, where type A is expected.<br>
<br>
Therefore this can very well be done in a strongly typed language. As an<br>
example have a look at my C++ bindings:<br>
<a href="https://github.com/NilsBrause/waylandpp" target="_blank">https://github.com/NilsBrause/waylandpp</a><br>
Especially at this part of the example:<br>
<a href="https://github.com/NilsBrause/waylandpp/blob/master/example/test.cpp#L194" target="_blank">https://github.com/NilsBrause/waylandpp/blob/master/example/test.cpp#L194</a><br>
<span class=""><br>
>> > we try and come up with some convoluted system that makes this<br>
>> > possible with typed languages, we're going to cause far more pain than<br>
>> > it's worth.<br>
>> ><br>
>> ><br>
>> > One other thing that we need to keep in mind here is the primary<br>
>> > target audience of Wayland and its libraries.  That audience is<br>
>> > compositors and toolkits.  Most of those are written in C and C++.<br>
>> > What we don't want to do is to do a bunch of things for the sake of 1%<br>
>> > of the target audience that makes the rest have to bend over<br>
>> > backwards.  When I said "cautiously OK", I mean that I don't see that<br>
>> > happening yet and I don't see a valid use for an enum that doesn't<br>
>> > follow one of those two rules.  However, if we have a plausible case<br>
>> > where doing so would make everyone's lives easier, I'm going to not be<br>
>> > a big fan.<br>
>> ><br>
>> ><br>
>> > Please note that I'm not trying to insult Haskel or other functional<br>
>> > or strongly typed languages or the people who use them.  I'm simply<br>
>> > trying to be pragmatic and recognize that people who want to write an<br>
>> > app in haskel that manually bangs the Wayland protocol isn't the<br>
>> > target audience.<br>
<br>
</span>I understand, that the target audience of Wayland are high-level toolkits<br>
and compositors, but I don't agree, that this is a good idea. If you only want<br>
to create an EGL window and handle some input, there is no need for a huge<br>
toolkit like Qt, in my opinion. A small binding library for the programming<br>
language of your choice is much more useful and less wasteful in terms of<br>
memory and performance.<br>
<span class=""><br>
>> ><br>
>> ><br>
>> > --Jason<br>
>><br>
>> Completely agree with Jason here.<br>
>><br>
>> Actually the present "enum" are just mnemotic to 32-bit int or uint<br>
>> values (and that's why the type field in current protocol is "int" or<br>
>> "uint" instead of things like "enum"). Though developers of<br>
>> strongly-typed languages may not like it, it is versatile and makes<br>
>> sense. Any attempt to define what an "enum" or "bitfield" is will change<br>
>> the current semantics and introduce a lot of complexity. There may exist<br>
>> a way to make it work perfectly (and I'm okay with it if it really<br>
>> exists), but I doubt whether the effort worth it since it doesn't do any<br>
>> good to C or C++ wayland programmers, who are the main targeted audience<br>
>> of wayland.<br>
<br>
</span>Probably not for C programmers, but it can very well be useful for C++<br>
programmers. C++ has scoped enumerations since C++11, which turns<br>
an enumeration into a distinct type. My C++ bindings are using this feature<br>
for every enumeration that is not a bitfield.<br>
<span class=""><br>
><br>
> Yes, I agree. I think we have a concensus here. While it might be nice<br>
> for certain languages, they are not the intended audience. Of course it<br>
> doesn't mean that you should not create Wayland protocol bindings in<br>
> those languages, but it just means that we at upstream are not willing<br>
> to spend effort on making it convienient or proper all the way and<br>
> ensuring it does not cause problems. Particularly as it does not seem<br>
> obvious what would be the correct solution now and in the future, and<br>
> the impact of the benefit looks very small in this specific case.<br>
><br>
> Sorry Nils, I believe we are not going to take this. :-)<br>
<br>
</span>In that case, I will have to maintain my own version of wayland.xml.<br>
Since protocol changes are not happening on a daily basis, this should<br>
be doable. ;-)<br></blockquote><div><br></div><div>In any case, that's probably not a huge deal.  It doesn't change often and should usually be mergable.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
><br>
><br>
> Thanks,<br>
> pq<br>
<br>
Cheers,<br>
Nils<br>
</blockquote></div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 23, 2014 at 8:17 AM, Nils Chr. Brause <span dir="ltr"><<a href="mailto:nilschrbrause@gmail.com" target="_blank">nilschrbrause@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Tue, Sep 23, 2014 at 8:35 AM, Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>> wrote:<br>
> On Tue, 23 Sep 2014 13:59:39 +0800<br>
> Boyan Ding <<a href="mailto:stu_dby@126.com">stu_dby@126.com</a>> wrote:<br>
><br>
>> On Mon, 2014-09-22 at 11:27 -0700, Jason Ekstrand wrote:<br>
>><br>
>> > I'm a little unsure.  I think trying to completely solve this problem<br>
>> > in a way that will truly make strongly typed languages happy is<br>
>> > insanity.  That said, I'm cautiously ok with defining bitfields and<br>
>> > enums as long as we are very careful in scoping what "bitfield" and<br>
>> > "enum" mean.  A "bitfield" should have only power of two values and<br>
>> > the result should always be interpreted as an OR of those values.  An<br>
>> > enum should have every possible value enumerated.  If anyone has a<br>
>> > good example of something that validly doesn't fit into either of<br>
>> > these, please speak up.<br>
<br>
</span>Originally, the idea to distinct between enumerations and bitfields was that<br>
the user should be able to apply bitwise logic operations, where it might be<br>
useful (everything I marked with is_bitfield="true") and not be able to do this<br>
where this doesn't make sense (everywhere else).<br>
<br>
Therefore, everything should fall in either of these categories. Either it makes<br>
sense to use bitwise logic operations or it doesn't.<br>
<span class=""><br>
>> ><br>
>> > The example of wl_output.transform is an enum because every<br>
>> > possibility is enumerated.  From C or a similar language, you can do<br>
>> > fun stuff like "if (transform & WL_OUTPUT_TRANSFORM_FLIPPED)" to<br>
>> > determine if there is a flip.  In a strongly typed language, you can't<br>
>> > do this and we shouldn't bend over backwards to make it possible.  If<br>
<br>
</span>With the logic explained above, this would fall in my bitfield category. Having<br>
more than the power-of-two values listed isn't a problem in my opinion. I see<br>
these extra values as some sort of shortcuts for often used OR-combinations.<br>
<br>
The strongly-typed part here only means that you can't compare<br>
enums/bitfields of different type or pass type B, where type A is expected.<br>
<br>
Therefore this can very well be done in a strongly typed language. As an<br>
example have a look at my C++ bindings:<br>
<a href="https://github.com/NilsBrause/waylandpp" target="_blank">https://github.com/NilsBrause/waylandpp</a><br>
Especially at this part of the example:<br>
<a href="https://github.com/NilsBrause/waylandpp/blob/master/example/test.cpp#L194" target="_blank">https://github.com/NilsBrause/waylandpp/blob/master/example/test.cpp#L194</a><br>
<span class=""><br>
>> > we try and come up with some convoluted system that makes this<br>
>> > possible with typed languages, we're going to cause far more pain than<br>
>> > it's worth.<br>
>> ><br>
>> ><br>
>> > One other thing that we need to keep in mind here is the primary<br>
>> > target audience of Wayland and its libraries.  That audience is<br>
>> > compositors and toolkits.  Most of those are written in C and C++.<br>
>> > What we don't want to do is to do a bunch of things for the sake of 1%<br>
>> > of the target audience that makes the rest have to bend over<br>
>> > backwards.  When I said "cautiously OK", I mean that I don't see that<br>
>> > happening yet and I don't see a valid use for an enum that doesn't<br>
>> > follow one of those two rules.  However, if we have a plausible case<br>
>> > where doing so would make everyone's lives easier, I'm going to not be<br>
>> > a big fan.<br>
>> ><br>
>> ><br>
>> > Please note that I'm not trying to insult Haskel or other functional<br>
>> > or strongly typed languages or the people who use them.  I'm simply<br>
>> > trying to be pragmatic and recognize that people who want to write an<br>
>> > app in haskel that manually bangs the Wayland protocol isn't the<br>
>> > target audience.<br>
<br>
</span>I understand, that the target audience of Wayland are high-level toolkits<br>
and compositors, but I don't agree, that this is a good idea. If you only want<br>
to create an EGL window and handle some input, there is no need for a huge<br>
toolkit like Qt, in my opinion. A small binding library for the programming<br>
language of your choice is much more useful and less wasteful in terms of<br>
memory and performance.<br>
<span class=""><br>
>> ><br>
>> ><br>
>> > --Jason<br>
>><br>
>> Completely agree with Jason here.<br>
>><br>
>> Actually the present "enum" are just mnemotic to 32-bit int or uint<br>
>> values (and that's why the type field in current protocol is "int" or<br>
>> "uint" instead of things like "enum"). Though developers of<br>
>> strongly-typed languages may not like it, it is versatile and makes<br>
>> sense. Any attempt to define what an "enum" or "bitfield" is will change<br>
>> the current semantics and introduce a lot of complexity. There may exist<br>
>> a way to make it work perfectly (and I'm okay with it if it really<br>
>> exists), but I doubt whether the effort worth it since it doesn't do any<br>
>> good to C or C++ wayland programmers, who are the main targeted audience<br>
>> of wayland.<br>
<br>
</span>Probably not for C programmers, but it can very well be useful for C++<br>
programmers. C++ has scoped enumerations since C++11, which turns<br>
an enumeration into a distinct type. My C++ bindings are using this feature<br>
for every enumeration that is not a bitfield.<br>
<span class=""><br>
><br>
> Yes, I agree. I think we have a concensus here. While it might be nice<br>
> for certain languages, they are not the intended audience. Of course it<br>
> doesn't mean that you should not create Wayland protocol bindings in<br>
> those languages, but it just means that we at upstream are not willing<br>
> to spend effort on making it convienient or proper all the way and<br>
> ensuring it does not cause problems. Particularly as it does not seem<br>
> obvious what would be the correct solution now and in the future, and<br>
> the impact of the benefit looks very small in this specific case.<br>
><br>
> Sorry Nils, I believe we are not going to take this. :-)<br>
<br>
</span>In that case, I will have to maintain my own version of wayland.xml.<br>
Since protocol changes are not happening on a daily basis, this should<br>
be doable. ;-)<br>
<br>
><br>
><br>
> Thanks,<br>
> pq<br>
<br>
Cheers,<br>
Nils<br>
</blockquote></div><br></div>