Hello community, here is the log from the commit of package xcb-proto for openSUSE:Factory checked in at 2018-03-08 10:53:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xcb-proto (Old) and /work/SRC/openSUSE:Factory/.xcb-proto.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xcb-proto" Thu Mar 8 10:53:36 2018 rev:12 rq:582992 version:7.6_1.13 Changes: -------- --- /work/SRC/openSUSE:Factory/xcb-proto/xcb-proto.changes 2018-01-19 11:48:43.484333126 +0100 +++ /work/SRC/openSUSE:Factory/.xcb-proto.new/xcb-proto.changes 2018-03-08 10:53:37.057721630 +0100 @@ -1,0 +2,15 @@ +Mon Mar 5 14:02:55 UTC 2018 - sndir...@suse.com + +- Update to version 1.13 + * This release of xcb-proto brings support for buffer modifiers and + multi-planar buffers through DRI3 v1.2 and Present v1.2, support for + leasing KMS devices to clients via RandR 1.6, and also allows clients + to send each other XInput2 events via support for the GenericEvent + extension's SendExtension event. +- supersedes U_xinput-typedef-for-event_type_base.patch, + U_add-support-for-eventstruct.patch, + U_SendExtensionEvent-uses-eventstruct.patch, + U_python-whitespace.patch, + U_python3-compat.patch + +------------------------------------------------------------------- Old: ---- U_SendExtensionEvent-uses-eventstruct.patch U_add-support-for-eventstruct.patch U_python-whitespace.patch U_python3-compat.patch U_xinput-typedef-for-event_type_base.patch xcb-proto-1.12.tar.bz2 New: ---- xcb-proto-1.13.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xcb-proto.spec ++++++ --- /var/tmp/diff_new_pack.gJseJe/_old 2018-03-08 10:53:37.601702047 +0100 +++ /var/tmp/diff_new_pack.gJseJe/_new 2018-03-08 10:53:37.605701903 +0100 @@ -16,7 +16,7 @@ # -%define dirsuffix 1.12 +%define dirsuffix 1.13 %if 0%{?suse_version} >= 1500 %bcond_with python2 %else @@ -31,11 +31,6 @@ Url: http://xorg.freedesktop.org/ #Git-Web: https://cgit.freedesktop.org/xcb/proto Source: http://xorg.freedesktop.org/archive/individual/xcb/%{name}-%{dirsuffix}.tar.bz2 -Patch1: U_xinput-typedef-for-event_type_base.patch -Patch2: U_add-support-for-eventstruct.patch -Patch3: U_SendExtensionEvent-uses-eventstruct.patch -Patch4: U_python-whitespace.patch -Patch5: U_python3-compat.patch BuildRequires: autoconf >= 2.57 BuildRequires: automake BuildRequires: fdupes ++++++ xcb-proto-1.12.tar.bz2 -> xcb-proto-1.13.tar.bz2 ++++++ ++++ 1623 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/NEWS new/xcb-proto-1.13/NEWS --- old/xcb-proto-1.12/NEWS 2016-05-18 18:33:57.000000000 +0200 +++ new/xcb-proto-1.13/NEWS 2018-03-05 10:18:15.000000000 +0100 @@ -1,3 +1,14 @@ +Release 1.13 (2018-02-28) +========================= +* dri3: Add multi-plane/modifier protocol for v1.2 +* present: Add suboptimal-copy protocol for v1.2 +* randr: Add output-lease protocol for v1.6 +* Add support for variable-sized lists of FDs +* xge: Add safe generic-event sending support +* Fix initial connection handshaking +* Updated XML DTD +* Python 3.x cleanups and compatibility + Release 1.12 (2016-05-18) ========================= * xinput: Various padding-related additions and fixes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/configure.ac new/xcb-proto-1.13/configure.ac --- old/xcb-proto-1.12/configure.ac 2016-05-14 10:32:35.000000000 +0200 +++ new/xcb-proto-1.13/configure.ac 2018-03-05 10:18:15.000000000 +0100 @@ -3,7 +3,7 @@ AC_PREREQ(2.57) AC_INIT([XCB Proto], - 1.12, + 1.13, [x...@lists.freedesktop.org]) AC_CONFIG_SRCDIR([xcb-proto.pc.in]) AM_INIT_AUTOMAKE([foreign dist-bzip2]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/doc/xml-xcb.txt new/xcb-proto-1.13/doc/xml-xcb.txt --- old/xcb-proto-1.12/doc/xml-xcb.txt 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/doc/xml-xcb.txt 2018-03-05 10:18:15.000000000 +0100 @@ -76,6 +76,12 @@ the field and pad elements described in the section "Structure Contents below". +<eventstruct name="identifier">event-type-selector list</struct> + + This element represents a data structure that is the wire-representation of + an event. The event can be any type that's selected by the + event-type-selector list. + <xidtype name="identifier" /> This element represents an identifier for a particular type of resource. @@ -359,6 +365,29 @@ This element represents the current list-element when used inside a list-iteration expression such as <sumof>. + +Event-Type-Selector List +------------------------ + + The event-type-selector list selects a set of eventtypes. + It consists of any number of the following elements: + + <allowed extension="identifier" xge="boolean" + opcode-min="integer" opcode-max="integer" /> + + The extension attribute selects events from the given extension. + + If the xge attribute is true, the event is an X Generic Event and + will be treated as such. + + opcode-min and opcode-max describe the minimum and maximum opcode + respectively. The opcode is the same number as the number-attribute + of an event definition. I.e. this is the offset from the event-base + to the actual number used on the wire. + + In the current implementation, only xge="false" is supported. + + Documentation ------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/missing new/xcb-proto-1.13/missing --- old/xcb-proto-1.12/missing 2016-05-18 18:35:29.000000000 +0200 +++ new/xcb-proto-1.13/missing 2018-03-05 10:18:17.000000000 +0100 @@ -1,9 +1,9 @@ #! /bin/sh # Common wrapper for a few potentially missing GNU programs. -scriptversion=2013-10-28.13; # UTC +scriptversion=2016-01-11.22; # UTC -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard <pin...@iro.umontreal.ca>, 1996. # This program is free software; you can redistribute it and/or modify @@ -210,6 +210,6 @@ # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/py-compile new/xcb-proto-1.13/py-compile --- old/xcb-proto-1.12/py-compile 2016-05-18 18:35:29.000000000 +0200 +++ new/xcb-proto-1.13/py-compile 2018-03-05 10:18:17.000000000 +0100 @@ -1,9 +1,9 @@ #!/bin/sh # py-compile - Compile a Python program -scriptversion=2011-06-08.12; # UTC +scriptversion=2016-01-11.22; # UTC -# Copyright (C) 2000-2014 Free Software Foundation, Inc. +# Copyright (C) 2000-2017 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -165,6 +165,6 @@ # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/src/dri3.xml new/xcb-proto-1.13/src/dri3.xml --- old/xcb-proto-1.12/src/dri3.xml 2015-05-15 16:25:43.000000000 +0200 +++ new/xcb-proto-1.13/src/dri3.xml 2018-03-05 10:18:15.000000000 +0100 @@ -23,7 +23,7 @@ --> <xcb header="dri3" extension-xname="DRI3" extension-name="DRI3" - major-version="1" minor-version="0"> + major-version="1" minor-version="2"> <import>xproto</import> <!-- Types --> @@ -94,4 +94,73 @@ </reply> </request> + <!-- v1.2 --> + <request name="GetSupportedModifiers" opcode="6"> + <field type="CARD32" name="window" /> + <field type="CARD8" name="depth"/> + <field type="CARD8" name="bpp"/> + <pad bytes="2"/> + <reply> + <required_start_align align="8" /> + <pad bytes="1" /> + <field type="CARD32" name="num_window_modifiers" /> + <field type="CARD32" name="num_screen_modifiers" /> + <pad bytes="16" /> + <list type="CARD64" name="window_modifiers"> + <fieldref>num_window_modifiers</fieldref> + </list> + <list type="CARD64" name="screen_modifiers"> + <fieldref>num_screen_modifiers</fieldref> + </list> + </reply> + </request> + + <request name="PixmapFromBuffers" opcode="7"> + <required_start_align align="8" /> + <field type="PIXMAP" name="pixmap" /> + <field type="WINDOW" name="window" /> + <field type="CARD8" name="num_buffers" /> + <pad bytes="3" /> + <field type="CARD16" name="width" /> + <field type="CARD16" name="height" /> + <field type="CARD32" name="stride0" /> + <field type="CARD32" name="offset0" /> + <field type="CARD32" name="stride1" /> + <field type="CARD32" name="offset1" /> + <field type="CARD32" name="stride2" /> + <field type="CARD32" name="offset2" /> + <field type="CARD32" name="stride3" /> + <field type="CARD32" name="offset3" /> + <field type="CARD8" name="depth" /> + <field type="CARD8" name="bpp" /> + <pad bytes="2" /> + <field type="CARD64" name="modifier" /> + <list type="fd" name="buffers"> + <fieldref>num_buffers</fieldref> + </list> + </request> + + <request name="BuffersFromPixmap" opcode="8"> + <field type="PIXMAP" name="pixmap" /> + <reply> + <required_start_align align="8" /> + <field type="CARD8" name="nfd"/> + <field type="CARD16" name="width" /> + <field type="CARD16" name="height" /> + <pad bytes="4"/> + <field type="CARD64" name="modifier" /> + <field type="CARD8" name="depth" /> + <field type="CARD8" name="bpp" /> + <pad bytes="6"/> + <list type="CARD32" name="strides"> + <fieldref>nfd</fieldref> + </list> + <list type="CARD32" name="offsets"> + <fieldref>nfd</fieldref> + </list> + <list type="fd" name="buffers"> + <fieldref>nfd</fieldref> + </list> + </reply> + </request> </xcb> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/src/present.xml new/xcb-proto-1.13/src/present.xml --- old/xcb-proto-1.12/src/present.xml 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/src/present.xml 2018-03-05 10:18:15.000000000 +0100 @@ -23,7 +23,7 @@ --> <xcb header="present" extension-xname="Present" extension-name="Present" - major-version="1" minor-version="0"> + major-version="1" minor-version="2"> <import>xproto</import> <import>randr</import> <import>xfixes</import> @@ -51,6 +51,7 @@ <item name="Async"><bit>0</bit></item> <item name="Copy"><bit>1</bit></item> <item name="UST"><bit>2</bit></item> + <item name="Suboptimal"><bit>3</bit></item> </enum> <enum name="Capability"> @@ -69,6 +70,7 @@ <item name="Copy"><value>0</value></item> <item name="Flip"><value>1</value></item> <item name="Skip"><value>2</value></item> + <item name="SuboptimalCopy"><value>3</value></item> </enum> <struct name="Notify"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/src/randr.xml new/xcb-proto-1.13/src/randr.xml --- old/xcb-proto-1.12/src/randr.xml 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/src/randr.xml 2018-03-05 10:18:15.000000000 +0100 @@ -27,7 +27,7 @@ --> <xcb header="randr" extension-xname="RANDR" extension-name="RandR" - major-version="1" minor-version="5"> + major-version="1" minor-version="6"> <import>xproto</import> <import>render</import> @@ -37,6 +37,7 @@ <xidtype name="CRTC" /> <xidtype name="OUTPUT" /> <xidtype name="PROVIDER" /> + <xidtype name="LEASE" /> <!-- Errors --> @@ -124,6 +125,7 @@ <item name="ProviderChange"> <bit>4</bit></item> <item name="ProviderProperty"><bit>5</bit></item> <item name="ResourceChange"> <bit>6</bit></item> + <item name="Lease"> <bit>7</bit></item> </enum> <request name="SelectInput" opcode="4"> @@ -798,6 +800,7 @@ <item name="ProviderChange"> <value>3</value></item> <item name="ProviderProperty"><value>4</value></item> <item name="ResourceChange"> <value>5</value></item> + <item name="Lease"> <value>6</value></item> </enum> <struct name="CrtcChange"> @@ -858,20 +861,6 @@ <pad bytes="20" /> </struct> - <union name="NotifyData"> - <field type="CrtcChange" name="cc" /> - <field type="OutputChange" name="oc" /> - <field type="OutputProperty" name="op" /> - <field type="ProviderChange" name="pc" /> - <field type="ProviderProperty" name="pp" /> - <field type="ResourceChange" name="rc" /> - </union> - - <event name="Notify" number="1"> - <field type="CARD8" name="subCode" enum="Notify" /> - <field type="NotifyData" name="u" /> - </event> - <!-- New in version 1.5 --> <struct name="MonitorInfo"> @@ -914,4 +903,52 @@ <field type="WINDOW" name="window" /> <field type="ATOM" name="name" /> </request> + + <!-- new in 1.6 --> + + <request name="CreateLease" opcode="45"> + <field type="WINDOW" name="window" /> + <field type="LEASE" name="lid" /> + <field type="CARD16" name="num_crtcs" /> + <field type="CARD16" name="num_outputs" /> + <list type="CRTC" name="crtcs"> + <fieldref>num_crtcs</fieldref> + </list> + <list type="OUTPUT" name="outputs"> + <fieldref>num_outputs</fieldref> + </list> + <reply> + <field type="CARD8" name="nfd" /> + <fd name="master_fd" /> + <pad bytes="24" /> + </reply> + </request> + + <request name="FreeLease" opcode="46"> + <field type="LEASE" name="lid" /> + <field type="BYTE" name="terminate" /> + </request> + + <struct name="LeaseNotify"> + <field type="TIMESTAMP" name="timestamp" /> + <field type="WINDOW" name="window" /> + <field type="LEASE" name="lease" /> + <field type="CARD8" name="created" /> + <pad bytes="15" /> + </struct> + + <union name="NotifyData"> + <field type="CrtcChange" name="cc" /> + <field type="OutputChange" name="oc" /> + <field type="OutputProperty" name="op" /> + <field type="ProviderChange" name="pc" /> + <field type="ProviderProperty" name="pp" /> + <field type="ResourceChange" name="rc" /> + <field type="LeaseNotify" name="lc" /> + </union> + + <event name="Notify" number="1"> + <field type="CARD8" name="subCode" enum="Notify" /> + <field type="NotifyData" name="u" /> + </event> </xcb> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/src/res.xml new/xcb-proto-1.13/src/res.xml --- old/xcb-proto-1.12/src/res.xml 2015-05-15 16:25:43.000000000 +0200 +++ new/xcb-proto-1.13/src/res.xml 2018-03-05 10:18:15.000000000 +0100 @@ -55,7 +55,15 @@ <field type="ClientIdSpec" name="spec" /> <field type="CARD32" name="length" /> <list type="CARD32" name="value"> - <fieldref>length</fieldref> + <!-- The specification says that the length is in units of CARD32, + but the specification also says that the length is 4 when a + single LocalClientPid is present (ie. the length is in bytes). + The current server implementation sets the length to 4 when a + single CARD32 is present on the wire (length is in bytes). --> + <op op="/"> + <fieldref>length</fieldref> + <value>4</value> + </op> </list> </struct> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/src/xcb.xsd new/xcb-proto-1.13/src/xcb.xsd --- old/xcb-proto-1.12/src/xcb.xsd 2015-09-06 13:10:31.000000000 +0200 +++ new/xcb-proto-1.13/src/xcb.xsd 2018-03-05 10:18:15.000000000 +0100 @@ -44,6 +44,15 @@ <xsd:complexType> <xsd:attribute name="bytes" type="xsd:integer" use="optional" /> <xsd:attribute name="align" type="xsd:integer" use="optional" /> + <xsd:attribute name="serialize" type="xsd:boolean" use="optional" /> + </xsd:complexType> + </xsd:element> + + <!-- Alignment --> + <xsd:element name="required_start_align" > + <xsd:complexType> + <xsd:attribute name="align" type="xsd:integer" use="required" /> + <xsd:attribute name="offset" type="xsd:integer" use="optional" /> </xsd:complexType> </xsd:element> @@ -76,14 +85,13 @@ <xsd:sequence> <!-- switch(expression) --> <xsd:group ref="expression" minOccurs="1" maxOccurs="1" /> + <xsd:element ref="required_start_align" minOccurs="0" maxOccurs="1" /> <xsd:choice> <!-- bitcase expression - bit test --> <xsd:element name="bitcase" type="caseexpr" minOccurs="0" maxOccurs="unbounded" /> <!-- case expression - value test --> <xsd:element name="case" type="caseexpr" minOccurs="0" maxOccurs="unbounded" /> </xsd:choice> - <!-- default: --> - <xsd:group ref="fields" minOccurs="0" maxOccurs="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> @@ -201,6 +209,7 @@ <xsd:element ref="field" /> <xsd:element ref="list" /> <xsd:element ref="fd" /> + <xsd:element ref="required_start_align" /> </xsd:choice> </xsd:group> @@ -231,6 +240,22 @@ <xsd:attribute name="ref" type="xsd:string" use="required" /> </xsd:complexType> + <!-- Type for a structure that is an event + which can be of an event type from a set of event types --> + <xsd:complexType name="eventstruct"> + <xsd:sequence> + <xsd:element name="allowed"> + <xsd:complexType> + <xsd:attribute name="extension" type="xsd:string" use="required" /> + <xsd:attribute name="xge" type="xsd:boolean" use="required" /> + <xsd:attribute name="opcode-min" type="xsd:integer" use="required" /> + <xsd:attribute name="opcode-max" type="xsd:integer" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + <!-- Type for bit values --> <xsd:simpleType name="bitType"> <xsd:restriction base="xsd:integer"> @@ -345,6 +370,7 @@ <xsd:element name="errorcopy" type="packet-struct-copy" /> <xsd:element name="struct" type="struct" /> <xsd:element name="union" type="struct" /> + <xsd:element name="eventstruct" type="eventstruct" /> <xsd:element name="xidtype"> <xsd:complexType> <xsd:attribute name="name" type="xsd:string" use="required" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/src/xinput.xml new/xcb-proto-1.13/src/xinput.xml --- old/xcb-proto-1.12/src/xinput.xml 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/src/xinput.xml 2018-03-05 10:18:15.000000000 +0100 @@ -32,27 +32,6 @@ http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt --> -<!-- TODO: Things which need to be done for full XInput support - but cannot be done now ( August 18, 2014 ) with the current feature-set - of the xml and the generator: - -***** - -replace "uninterpreted_data" or similar constructs -with a semantic that shows how to interpret this data. -This requires enhancements to the xml-schema and generator such as union with selector. - -This will, e.g., be necessary for automatically generated byte-order conversion code, -which will, e.g., be necessary for server-side xcb. - -This affects the following: -* SendExtensionEvent member "events" - -***** - ---> - - <xcb header="xinput" extension-xname="XInputExtension" extension-name="Input" major-version="2" minor-version="3"> <import>xfixes</import> @@ -226,10 +205,11 @@ </request> <!-- OpenDevice --> + <typedef oldname="CARD8" newname="EventTypeBase" /> <struct name="InputClassInfo"> <field type="CARD8" name="class_id" enum="InputClass" /> - <field type="CARD8" name="event_type_base" /> + <field type="EventTypeBase" name="event_type_base" /> </struct> <request name="OpenDevice" opcode="3"> @@ -986,25 +966,8 @@ </reply> </request> - <!-- SendExtensionEvent --> - - <request name="SendExtensionEvent" opcode="31"> - <field type="WINDOW" name="destination" /> - <field type="CARD8" name="device_id" /> - <field type="BOOL" name="propagate" /> - <field type="CARD16" name="num_classes" /> - <field type="CARD8" name="num_events" /> - <pad bytes="3" /> - <list type="CARD8" name="events"> - <op op="*"> - <fieldref>num_events</fieldref> - <value>32</value> - </op> - </list> - <list type="EventClass" name="classes"> - <fieldref>num_classes</fieldref> - </list> - </request> + <!-- SendExtensionEvent (opcode 16) has to be defined after the events + because we do not support backward references --> <!-- DeviceBell --> @@ -2641,6 +2604,42 @@ <eventcopy name="BarrierLeave" number="26" ref="BarrierHit" /> + <!-- ⋅⋅⋅ Requests that depend on events ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ --> + + <!-- SendExtensionEvent --> + <eventstruct name="EventForSend"> + <allowed extension="Input" xge="false" opcode-min="0" opcode-max="16" /> + <!-- We need not allow the newer events which are based on + the GenericEvent extension: + The wire-protocol-spec + https://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?idĺibXi-1.7.9#n1793 + only allows fixed sized events, which seems + to rule out GenericEvent. + + The xlib-implementation also assumes fixed-sized events. + https://cgit.freedesktop.org/xorg/lib/libXi/tree/src/XSndExEv.c?id=libXi-1.7.9#n106 + + The Xserver also allows only non-GE events: + https:g/xorg/xserver/tree/Xi/sendexev.c?id=xorg-server-1.19.1#n144 + --> + </eventstruct> + + <request name="SendExtensionEvent" opcode="31"> + <field type="WINDOW" name="destination" /> + <field type="CARD8" name="device_id" /> + <field type="BOOL" name="propagate" /> + <field type="CARD16" name="num_classes" /> + <field type="CARD8" name="num_events" /> + <pad bytes="3" /> + <list type="EventForSend" name="events"> + <fieldref>num_events</fieldref> + </list> + <list type="EventClass" name="classes"> + <fieldref>num_classes</fieldref> + </list> + </request> + + <!-- ⋅⋅⋅ Errors (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ --> <error name="Device" number="0" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/src/xproto.xml new/xcb-proto-1.13/src/xproto.xml --- old/xcb-proto-1.12/src/xproto.xml 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/src/xproto.xml 2018-03-05 10:18:15.000000000 +0100 @@ -198,9 +198,11 @@ <list type="char" name="authorization_protocol_name"> <fieldref>authorization_protocol_name_len</fieldref> </list> + <pad align="4" /> <list type="char" name="authorization_protocol_data"> <fieldref>authorization_protocol_data_len</fieldref> </list> + <pad align="4" /> </struct> <struct name="SetupFailed"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/xcbgen/align.py new/xcb-proto-1.13/xcbgen/align.py --- old/xcb-proto-1.12/xcbgen/align.py 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/xcbgen/align.py 2018-03-05 10:18:15.000000000 +0100 @@ -16,12 +16,12 @@ return self.align == other.align and self.offset == other.offset def __str__(self): - return "(align=%d, offset=%d)" % (self.align, self.offset) + return "(align=%d, offset=%d)" % (self.align, self.offset) @staticmethod def for_primitive_type(size): - # compute the required start_alignment based on the size of the type - if size % 8 == 0: + # compute the required start_alignment based on the size of the type + if size % 8 == 0: # do 8-byte primitives require 8-byte alignment in X11? return Alignment(8,0) elif size % 4 == 0: @@ -33,7 +33,7 @@ def align_after_fixed_size(self, size): - new_offset = (self.offset + size) % self.align + new_offset = (self.offset + size) % self.align return Alignment(self.align, new_offset) @@ -41,7 +41,7 @@ ''' Assuming the given external_align, checks whether self is fulfilled for all cases. - Returns True if yes, False otherwise. + Returns True if yes, False otherwise. ''' if self.align == 1 and self.offset == 0: # alignment 1 with offset 0 is always fulfilled @@ -55,9 +55,9 @@ # the external align guarantees less alignment -> not guaranteed return False - if external_align.align % self.align != 0: + if external_align.align % self.align != 0: # the external align cannot be divided by our align - # -> not guaranteed + # -> not guaranteed # (this can only happen if there are alignments that are not # a power of 2, which is highly discouraged. But better be # safe and check for it) @@ -72,7 +72,7 @@ def combine_with(self, other): # returns the alignment that is guaranteed when - # both, self or other, can happen + # both, self or other, can happen new_align = gcd(self.align, other.align) new_offset_candidate1 = self.offset % new_align new_offset_candidate2 = other.offset % new_align @@ -83,8 +83,8 @@ new_align = gcd(new_align, offset_diff) new_offset_candidate1 = self.offset % new_align new_offset_candidate2 = other.offset % new_align - assert new_offset_candidate1 == new_offset_candidate2 - new_offset = new_offset_candidate1 + assert new_offset_candidate1 == new_offset_candidate2 + new_offset = new_offset_candidate1 # return the result return Alignment(new_align, new_offset) @@ -92,44 +92,44 @@ class AlignmentLog(object): def __init__(self): - self.ok_list = [] - self.fail_list = [] - self.verbosity = 1 + self.ok_list = [] + self.fail_list = [] + self.verbosity = 1 def __str__(self): - result = "" + result = "" - # output the OK-list - for (align_before, field_name, type_obj, callstack, align_after) in self.ok_list: - stacksize = len(callstack) + # output the OK-list + for (align_before, field_name, type_obj, callstack, align_after) in self.ok_list: + stacksize = len(callstack) indent = ' ' * stacksize - if self.ok_callstack_is_relevant(callstack): + if self.ok_callstack_is_relevant(callstack): if field_name is None or field_name == "": - result += (" %sok: %s:\n\t%sbefore: %s, after: %s\n" - % (indent, str(type_obj), indent, str(align_before), str(align_after))) - else: - result += (" %sok: field \"%s\" in %s:\n\t%sbefore: %s, after: %s\n" - % (indent, str(field_name), str(type_obj), - indent, str(align_before), str(align_after))) + result += (" %sok: %s:\n\t%sbefore: %s, after: %s\n" + % (indent, str(type_obj), indent, str(align_before), str(align_after))) + else: + result += (" %sok: field \"%s\" in %s:\n\t%sbefore: %s, after: %s\n" + % (indent, str(field_name), str(type_obj), + indent, str(align_before), str(align_after))) if self.verbosity >= 1: - result += self.callstack_to_str(indent, callstack) + result += self.callstack_to_str(indent, callstack) - # output the fail-list - for (align_before, field_name, type_obj, callstack, reason) in self.fail_list: - stacksize = len(callstack) + # output the fail-list + for (align_before, field_name, type_obj, callstack, reason) in self.fail_list: + stacksize = len(callstack) indent = ' ' * stacksize - if field_name is None or field_name == "": - result += (" %sfail: align %s is incompatible with\n\t%s%s\n\t%sReason: %s\n" - % (indent, str(align_before), indent, str(type_obj), indent, reason)) - else: - result += (" %sfail: align %s is incompatible with\n\t%sfield \"%s\" in %s\n\t%sReason: %s\n" - % (indent, str(align_before), indent, str(field_name), str(type_obj), indent, reason)) + if field_name is None or field_name == "": + result += (" %sfail: align %s is incompatible with\n\t%s%s\n\t%sReason: %s\n" + % (indent, str(align_before), indent, str(type_obj), indent, reason)) + else: + result += (" %sfail: align %s is incompatible with\n\t%sfield \"%s\" in %s\n\t%sReason: %s\n" + % (indent, str(align_before), indent, str(field_name), str(type_obj), indent, reason)) if self.verbosity >= 1: - result += self.callstack_to_str(indent, callstack) + result += self.callstack_to_str(indent, callstack) - return result + return result def callstack_to_str(self, indent, callstack): @@ -137,41 +137,41 @@ for stack_elem in callstack: result += "\t %s%s\n" % (indent, str(stack_elem)) result += "\t%s]\n" % indent - return result + return result def ok_callstack_is_relevant(self, ok_callstack): # determine whether an ok callstack is relevant for logging - if self.verbosity >= 2: - return True + if self.verbosity >= 2: + return True # empty callstacks are always relevant - if len(ok_callstack) == 0: + if len(ok_callstack) == 0: return True - # check whether the ok_callstack is a subset or equal to a fail_callstack + # check whether the ok_callstack is a subset or equal to a fail_callstack for (align_before, field_name, type_obj, fail_callstack, reason) in self.fail_list: if len(ok_callstack) <= len(fail_callstack): zipped = zip(ok_callstack, fail_callstack[:len(ok_callstack)]) - is_subset = all([i == j for i, j in zipped]) - if is_subset: + is_subset = all([i == j for i, j in zipped]) + if is_subset: return True return False def ok(self, align_before, field_name, type_obj, callstack, align_after): - self.ok_list.append((align_before, field_name, type_obj, callstack, align_after)) + self.ok_list.append((align_before, field_name, type_obj, callstack, align_after)) def fail(self, align_before, field_name, type_obj, callstack, reason): - self.fail_list.append((align_before, field_name, type_obj, callstack, reason)) + self.fail_list.append((align_before, field_name, type_obj, callstack, reason)) def append(self, other): - self.ok_list.extend(other.ok_list) - self.fail_list.extend(other.fail_list) + self.ok_list.extend(other.ok_list) + self.fail_list.extend(other.fail_list) def ok_count(self): - return len(self.ok_list) + return len(self.ok_list) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/xcbgen/expr.py new/xcb-proto-1.13/xcbgen/expr.py --- old/xcb-proto-1.12/xcbgen/expr.py 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/xcbgen/expr.py 2018-03-05 10:18:15.000000000 +0100 @@ -169,6 +169,7 @@ else: self.lenfield_parent = p self.lenfield_type = fields[self.lenfield_name].field_type + self.lenfield = fields[self.lenfield_name] break self.recursive_resolve_tasks(module, parents) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/xcbgen/matcher.py new/xcb-proto-1.13/xcbgen/matcher.py --- old/xcb-proto-1.12/xcbgen/matcher.py 2015-05-15 16:25:43.000000000 +0200 +++ new/xcb-proto-1.13/xcbgen/matcher.py 2018-03-05 10:18:15.000000000 +0100 @@ -57,6 +57,12 @@ type = Struct(name, node) module.add_type(id, namespace.ns, name, type) +def eventstruct(node, module, namespace): + id = node.get('name') + name = namespace.prefix + (id,) + type = EventStruct(name, node) + module.add_type(id, namespace.ns, name, type) + def union(node, module, namespace): id = node.get('name') name = namespace.prefix + (id,) @@ -103,6 +109,7 @@ 'xidunion' : xidunion, 'enum' : enum, 'struct' : struct, + 'eventstruct' : eventstruct, 'union' : union, 'request' : request, 'event' : event, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/xcbgen/state.py new/xcb-proto-1.13/xcbgen/state.py --- old/xcb-proto-1.12/xcbgen/state.py 2015-05-15 16:25:43.000000000 +0200 +++ new/xcb-proto-1.13/xcbgen/state.py 2018-03-05 10:18:15.000000000 +0100 @@ -32,6 +32,9 @@ self.root = parse(filename).getroot() self.header = self.root.get('header') self.ns = self.header + ':' + + # Events + self.events = {} # Get root element attributes if self.root.get('extension-xname', False): @@ -46,6 +49,17 @@ self.ext_name = '' self.prefix = ('xcb',) + def add_event(self, id, name, item): + self.events[id] = (name, item) + + def get_event_by_opcode(self, opcode, is_ge_event): + for id, (name, event) in self.events.items(): + if event.is_ge_event == is_ge_event: + opcode_specific_name = event.get_name_for_opcode( opcode ) + if opcode_specific_name is not None: + return (opcode_specific_name, event) + return None + class Module(object): ''' @@ -72,6 +86,11 @@ self.errors = {} self.all = [] + # dict of namespaces by ext_name + self.namespaces = {} + # enter the main namespace here + self.namespaces[self.namespace.ext_name] = self.namespace + # Register some common types self.add_type('CARD8', '', ('uint8_t',), tcard8) self.add_type('CARD16', '', ('uint16_t',), tcard16) @@ -94,6 +113,7 @@ # Recursively resolve all types def resolve(self): + self.add_events_to_namespaces() for (name, item) in self.all: self.pads = 0 item.resolve(self) @@ -112,6 +132,7 @@ if self.import_level == 0: self.direct_imports.append((name, namespace.header)) self.imports.append((name, namespace.header)) + self.namespaces[namespace.ext_name] = namespace def has_import(self, name): for (name_, header) in self.imports: @@ -149,6 +170,9 @@ def get_type_name(self, id): return self.get_type_impl(id, 0) + def get_namespace(self, ext_name): + return self.namespaces[ext_name] + # Keeps track of request datatypes def add_request(self, id, name, item): if name[:-1] == self.namespace.prefix: @@ -160,6 +184,23 @@ if name[:-1] == self.namespace.prefix: self.all.append((name, item)) + + def add_events_to_namespaces(self): + # add to its namespace object + for id, (name,item) in self.events.items(): + if name[:-1] == ('xcb',): + # core event + namespace_name = '' + else: + # extension event + namespace_name = name[-2] + + namespace = self.namespaces[namespace_name] + + if namespace is not None: + namespace.add_event(id, name, item) + + def get_event(self, id): return self.events[id][1] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xcb-proto-1.12/xcbgen/xtypes.py new/xcb-proto-1.13/xcbgen/xtypes.py --- old/xcb-proto-1.12/xcbgen/xtypes.py 2016-05-01 09:44:48.000000000 +0200 +++ new/xcb-proto-1.13/xcbgen/xtypes.py 2018-03-05 10:18:15.000000000 +0100 @@ -36,10 +36,13 @@ self.is_reply = False self.is_union = False self.is_pad = False + self.is_eventstruct = False + self.is_event = False self.is_switch = False self.is_case_or_bitcase = False self.is_bitcase = False self.is_case = False + self.is_fd = False self.required_start_align = Alignment() # the biggest align value of an align-pad contained in this type @@ -66,7 +69,7 @@ ''' raise Exception('abstract fixed_size method not overridden!') - def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum=None): + def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum=None, is_fd=False): ''' Default method for making a data type a member of a structure. Extend this if the data type needs to add an additional length field or something. @@ -75,7 +78,7 @@ complex_type is the structure object. see Field for the meaning of the other parameters. ''' - new_field = Field(self, field_type, field_name, visible, wire, auto, enum) + new_field = Field(self, field_type, field_name, visible, wire, auto, enum, is_fd) # We dump the _placeholder_byte if any fields are added. for (idx, field) in enumerate(complex_type.fields): @@ -215,6 +218,18 @@ tfloat = SimpleType(('float',), 4) tdouble = SimpleType(('double',), 8) +class FileDescriptor(SimpleType): + ''' + Derived class which represents a file descriptor. + ''' + def __init__(self): + SimpleType.__init__(self, ('int'), 4) + self.is_fd = True + + def fixed_size(self): + return True + + out = __main__.output['simple'] class Enum(SimpleType): ''' @@ -308,7 +323,9 @@ type.make_member_of(module, complex_type, lenfield_type, lenfield_name, True, lenwire, False, enum) # Add ourself to the structure by calling our original method. - Type.make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum) + if self.member.is_fd: + wire = False + Type.make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum, self.member.is_fd) def resolve(self, module): if self.resolved: @@ -501,7 +518,7 @@ int(required_start_align_element.get('align', "4"), 0), int(required_start_align_element.get('offset', "0"), 0)) if verbose_align_log: - print "Explicit start-align for %s: %s\n" % (self, self.required_start_align) + print ("Explicit start-align for %s: %s\n" % (self, self.required_start_align)) def resolve(self, module): if self.resolved: @@ -530,7 +547,12 @@ elif child.tag == 'list': field_name = child.get('name') fkey = child.get('type') - type = ListType(child, module.get_type(fkey), *self.lenfield_parent) + if fkey == 'fd': + ftype = FileDescriptor() + fkey = 'INT32' + else: + ftype = module.get_type(fkey) + type = ListType(child, ftype, *self.lenfield_parent) visible = True elif child.tag == 'switch': field_name = child.get('name') @@ -592,7 +614,7 @@ if verbose_align_log: print ("calc_required_start_align: %s has start-align %s" % (str(self), str(self.required_start_align))) - print "Details:\n" + str(log) + print ("Details:\n" + str(log)) if self.required_start_align.offset != 0: print (("WARNING: %s\n\thas start-align with non-zero offset: %s" + "\n\tsuggest to add explicit definition with:" @@ -619,12 +641,12 @@ for offset in range(0,align): align_candidate = Alignment(align, offset) if verbose_align_log: - print "trying %s for %s" % (str(align_candidate), str(self)) + print ("trying %s for %s" % (str(align_candidate), str(self))) my_log = AlignmentLog() if self.is_possible_start_align(align_candidate, callstack, my_log): log.append(my_log) if verbose_align_log: - print "found start-align %s for %s" % (str(align_candidate), str(self)) + print ("found start-align %s for %s" % (str(align_candidate), str(self))) return align_candidate else: my_ok_count = my_log.ok_count() @@ -641,7 +663,7 @@ # none of the candidates applies # this type has illegal internal aligns for all possible start_aligns if verbose_align_log: - print "didn't find start-align for %s" % str(self) + print ("didn't find start-align for %s" % str(self)) log.append(best_log) return None @@ -900,7 +922,7 @@ # aux function for unchecked_get_alignment_after def get_align_for_selected_case_field(self, case_field, start_align, callstack, log): if verbose_align_log: - print "get_align_for_selected_case_field: %s, case_field = %s" % (str(self), str(case_field)) + print ("get_align_for_selected_case_field: %s, case_field = %s" % (str(self), str(case_field))) total_align = start_align for field in self.bitcases: my_callstack = callstack[:] @@ -1164,6 +1186,82 @@ out = __main__.output['request'] +class EventStructAllowedRule: + + def __init__(self, parent, elt): + self.elt = elt + self.extension = elt.get('extension') + self.ge_events = elt.get('xge') == "true" + self.min_opcode = int( elt.get('opcode-min') ) + self.max_opcode = int( elt.get('opcode-max') ) + + def resolve(self, parent, module): + # get the namespace of the specified extension + extension_namespace = module.get_namespace( self.extension ) + if extension_namespace is None: + raise Exception( "EventStructAllowedRule.resolve: cannot find extension \"" + self.extension + "\"" ) + return + + # find and add the selected events + for opcode in range(self.min_opcode, self.max_opcode): + name_and_event = extension_namespace.get_event_by_opcode( opcode, self.ge_events ) + if name_and_event is None: + # could not find event -> error handling + if self.ge_events: + raise Exception("EventStructAllowedRule.resolve: cannot find xge-event with opcode " + str(opcode) + " in extension " + self.extension ) + else: + raise Exception("EventStructAllowedRule.resolve: cannot find oldstyle-event with opcode " + str(opcode) + " in extension " + self.extension ) + return + + ( name, event ) = name_and_event + # add event to EventStruct + parent.add_event( module, self.extension, opcode, name, event ) + + +class EventStruct(Union): + ''' + Derived class representing an event-use-as-struct data type. + ''' + + def __init__(self, name, elt): + Union.__init__(self, name, elt) + self.is_eventstruct = True + self.events = [] + self.allowedRules = [] + self.contains_ge_events = False + for item in list(elt): + if item.tag == 'allowed': + allowedRule = EventStructAllowedRule(self, item) + self.allowedRules.append( allowedRule ) + if allowedRule.ge_events: + self.contains_ge_events = True + + out = __main__.output['eventstruct'] + + def resolve(self, module): + if self.resolved: + return + for allowedRule in self.allowedRules: + allowedRule.resolve(self, module) + Union.resolve(self,module) + self.resolved = True + + # add event. called by resolve + def add_event(self, module, extension, opcode, name, event_type ): + self.events.append( (extension, opcode, name, event_type) ) + # Add the field to ourself + event_type.make_member_of(module, self, name, name[-1], True, True, False) + # Recursively resolve the event (could be another structure, list) + event_type.resolve(module) + + def fixed_size(self): + is_fixed_size = True + for extension, opcode, name, event in self.events: + if not event.fixed_size(): + is_fixed_size = False + return is_fixed_size + + class Event(ComplexType): ''' Derived class representing an event data type. @@ -1183,6 +1281,8 @@ self.is_ge_event = bool(elt.get('xge')) + self.is_event = True + self.doc = None for item in list(elt): if item.tag == 'doc': @@ -1193,6 +1293,13 @@ if main: self.name = name + def get_name_for_opcode(self, opcode): + for name, my_opcode in self.opcodes.items(): + if int(my_opcode) == opcode: + return name + else: + return None + def resolve(self, module): def add_event_header(): self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))