Skip to content
Snippets Groups Projects
  1. Sep 02, 2021
    • Povilas Kanapickas's avatar
    • Povilas Kanapickas's avatar
      Add element to specify expression that defines length of a struct · c36dde3f
      Povilas Kanapickas authored
      Currently the layout of a struct is used to compute its size. This works
      fine in case of structs of fixed size. However this introduces
      forwards-compatibility problems in cases when the struct has multiple
      variants and the exact variant is specified by the value of some field
      (e.g. in the case of <switch> elements). Future revisions of protocols
      may introduce new layout variants, in which case the old code does not
      know the size of the struct variant and can't parse the incoming byte
      stream.
      
      Instead of relying on knowledge about the layout of data structures we
      should instead use the length field for length information. This way
      when old client libxcb communicates with newer server it can at least
      ignore unknown struct variants.
      c36dde3f
  2. Jul 22, 2021
    • Olivier Fourdan's avatar
      xfixes: Add ClientDisconnectMode · 78d0652a
      Olivier Fourdan authored
      
      The Xserver itself is capable of terminating itself once all X11 clients
      are gone, yet in a typical full session, there are a number of X11
      clients running continuously (e.g. the Xsettings daemon, IBus, etc.).
      
      Those always-running clients will prevent the Xserver from terminating,
      because the actual number of X11 clients will never drop to 0.
      
      To solve this issue directly at the Xserver level, this add new entries
      to the XFixes extension to let the X11 clients themselves specify the
      disconnect mode they expect.
      
      Typically, those X11 daemon clients would specify the disconnect mode
      XFixesClientDisconnectFlagTerminate to let the Xserver know that they
      should not be accounted for when checking the remaining clients prior
      to terminate.
      
      Signed-off-by: default avatarOlivier Fourdan <ofourdan@redhat.com>
      Reviewed-by: Simon Ser's avatarSimon Ser <contact@emersion.fr>
      78d0652a
  3. Jun 02, 2021
  4. Oct 08, 2020
  5. Oct 03, 2020
  6. Jun 04, 2020
  7. Jun 01, 2020
  8. Mar 21, 2020
    • Uli Schlachter's avatar
      Parse a field's "enum=" correctly · 2b3559c1
      Uli Schlachter authored
      
      In xv.xml, there is something like this:
      
        <struct name="ImageFormatInfo">
          [...]
          <field type="CARD8" name="byte_order" enum="ImageOrder" />
          <pad bytes="2" />
          <list type="CARD8" name="guid">
            <value>16</value>
          </list>
          [...]
        </struct>
      
      When parsing this, the Field instance for "guid" ended up with .enum ==
      "ImageOrder". This is because the loop that parses complex type did not
      unset a variable across iterations, meaning that the last "enum"
      property "stuck" and was also used for all following fields.
      
      Fix this by simply moving the initialisation of the "enum" variable
      inside of the loop.
      
      Signed-off-by: default avatarUli Schlachter <psychon@znc.in>
      2b3559c1
  9. Feb 22, 2020
  10. Dec 28, 2019
    • Uli Schlachter's avatar
      Allow access to the original type in the XML · e79f6b01
      Uli Schlachter authored
      
      xcbgen 'helpfully' transforms things to C types already so that libxcb
      does not have to do so. Thus, even though the XML says that a field has
      type CARD8, xcbgen will claim uint8_t. This might be a bit weird, but is
      so far totally fine.
      
      However, the type mapping that xcbgen uses is not injective. All of
      CARD8, BYTE and BOOL get turned into uint8_t and the original type is
      lost.
      
      This is totally fine for libxcb, but programming languages other than C
      do have built in boolean types. My personal problem is with Rust, where
      providing a boolean for an integer argument causes a compiler error.
      This results in (relatively) ugly "0 / 1" instead of "false / true".
      
      This commit adds a new xml_type member to SimpleType. This type contains
      the original string that appeared in the XML file.
      
      Since libxcb creates instances of SimpleType itself and to avoid
      breaking the API, the new argument to SimpleType.__init__ defaults to
      None.
      
      Signed-off-by: default avatarUli Schlachter <psychon@znc.in>
      e79f6b01
    • Uli Schlachter's avatar
      Fix size computation of imported lists · 3cc42f6d
      Uli Schlachter authored
      
      XFixes contains a CreateRegion request:
      
         <request name="CreateRegion" opcode="5">
           <field type="REGION"    name="region" />
           <list  type="RECTANGLE" name="rectangles" />
         </request>
      
      This request contains a list of type RECTANGLE. This struct comes from
      xproto and is thus not contained in xfixes itself.
      
      Normal "Struct"s have their resolve() method called early, because they
      appear in the module itself. However, in the CreateRegion case, this
      struct is imported and thus does not get resolved. Instead, ListType's
      resolve() method calls self.member.resolve(module). Thus, only at this
      point is the struct resolved.
      
      Why is this important? Struct.resolve() is the same as
      ComplexType.resolve() and this function does self.calc_size() at the
      end. Thus, only after the struct was resolved is its size known. Before
      that, the size is just set to 0 (this happens in ComplexType.__init__).
      
      However, ListType.__init__ already computes its size member based on its
      member. At this point, this is still 0 so the list ends up believing its
      size to be zero.
      
      Fix this by recomputing self.size in ListType.resolve().
      
      Signed-off-by: default avatarUli Schlachter <psychon@znc.in>
      3cc42f6d
  11. Nov 02, 2019
  12. Apr 27, 2019
    • Daniel Stone's avatar
      pkg-config: Add sysroot prefix · bd7a481a
      Daniel Stone authored and Jon Turney's avatar Jon Turney committed
      
      xcb-proto's pkg-config file exports static file paths for where to find
      its Python files and the XML definitions.
      
      When used to discover cflags, library paths, etc, pkg-config will
      prepend ${PKG_CONFIG_SYSROOT_DIR}, if any, to those paths. This makes
      the use of a sysroot prefix transparent to users. However, since it
      doesn't know about paths in custom variables, it cannot automatically
      prefix this.
      
      Adding ${pc_sysrootdir} to these absolute paths makes the behaviour
      match, and XCB builds work out of the box in a sysroot.
      
      Signed-off-by: default avatarDaniel Stone <daniels@collabora.com>
      Reviewed-by: default avatarEric Anholt <eric@anholt.net>
      bd7a481a
  13. Feb 17, 2019
  14. Mar 14, 2018
  15. Feb 28, 2018
  16. Dec 15, 2017
  17. Jun 05, 2017
  18. May 13, 2017
  19. Mar 11, 2017
    • Christian Linhart's avatar
      SendExtensionEvent uses eventstruct · 97fbba25
      Christian Linhart authored
      
      Use the eventstruct element to define the SendExtensionEvent request
      instead of using a byte-array.
      
      This has the advantage that the structure of the data to be sent
      is now defined in the xml definition.
      This can be used by generators to make sending events safer.
      Such as avoiding type-casts in C.
      
      It can also be useful for protocol analyzers and tools like that
      because the structure of the sent events is now defined in the xml-definition.
      
      Tested-by: default avatarChristian Linhart <chris@demorecorder.com>
      Signed-off-by: default avatarChristian Linhart <chris@demorecorder.com>
      97fbba25
    • Christian Linhart's avatar
      add support for eventstruct · 4aa40fbd
      Christian Linhart authored
      
      eventstruct is a new xml element that allows to use events
      as part of requests.
      
      This is, e.g., needed by the SendExtensionEvent request
      of the XINPUT extension.
      
      Signed-off-by: default avatarChristian Linhart <chris@demorecorder.com>
      4aa40fbd
    • Christian Linhart's avatar
      xinput: typedef for event_type_base · 89b022fd
      Christian Linhart authored
      
      member event_type_base in struct InputClassInfo is a CARD8.
      This patch replaces the type with the new typedef EventTypeBase
      which is defined as a CARD8.
      
      This does not alter the ABI or API for that struct because
      typedefs do not appear in the ABI.
      And C handles typedefs as aliases.
      So there'll be no API issues as well.
      
      The libxcb generator adds additional functions that implement
      an iterator over this type.
      This is harmless because adding code is ABI/API compatible.
      
      The purpose of this change is to add more semantic info to this
      member variable of this struct.
      
      This helps with xcb-based generators or automatic code-checkers
      and things like that.
      
      Signed-off-by: default avatarChristian Linhart <chris@demorecorder.com>
      89b022fd
    • Christian Linhart's avatar
      move symboltable lookup of sumof expr to the parser · f5218967
      Christian Linhart authored
      
      Set the lenfield of a sumof expression object, so that
      libxcb or other generators won't need to look it up.
      
      This object is trivially available in the parser but
      needs a complex lookup in generators.
      
      Signed-off-by: default avatarChristian Linhart <chris@demorecorder.com>
      f5218967
  20. Jan 24, 2017
  21. Jun 04, 2016
    • Jon Turney's avatar
      Update XML schema to fix 'make check' · 95a262e0
      Jon Turney authored and Uli Schlachter's avatar Uli Schlachter committed
      
      Here is an attempt at updating the schema to add serialize attribute to pad
      element and required_start_align element.
      
      Not sure if I've added required_start_align element in the right place. The
      default case in the switch element is removed as it doesn't seem to be used, and
      otherwise makes the schema ambiguous.
      
      $ make check
      Making check in src
      make[1]: Entering directory '/jhbuild/x86_64-pc-cygwin/build/xcb/proto/src'
      make  check-local
      make[2]: Entering directory '/jhbuild/x86_64-pc-cygwin/build/xcb/proto/src'
      /usr/bin/xmllint --noout --schema /jhbuild/checkout/xcb/proto/src/xcb.xsd
      /jhbuild/checkout/xcb/proto/src/*.xml
      /jhbuild/checkout/xcb/proto/src/bigreq.xml validates
      /jhbuild/checkout/xcb/proto/src/composite.xml validates
      /jhbuild/checkout/xcb/proto/src/damage.xml validates
      /jhbuild/checkout/xcb/proto/src/dpms.xml validates
      /jhbuild/checkout/xcb/proto/src/dri2.xml validates
      /jhbuild/checkout/xcb/proto/src/dri3.xml validates
      /jhbuild/checkout/xcb/proto/src/ge.xml validates
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd ).
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd ).
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd ).
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd ).
      /jhbuild/checkout/xcb/proto/src/glx.xml fails to validate
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd, exprfield, switch, reply, doc ).
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd, exprfield, switch, reply, doc ).
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd, doc ).
      Element 'required_start_align': This element is not expected. Expected is one of ( pad, field, list, fd, doc ).
      /jhbuild/checkout/xcb/proto/src/present.xml fails to validate
      /jhbuild/checkout/xcb/proto/src/randr.xml validates
      /jhbuild/checkout/xcb/proto/src/record.xml validates
      /jhbuild/checkout/xcb/proto/src/render.xml validates
      /jhbuild/checkout/xcb/proto/src/res.xml validates
      /jhbuild/checkout/xcb/proto/src/screensaver.xml validates
      /jhbuild/checkout/xcb/proto/src/shape.xml validates
      /jhbuild/checkout/xcb/proto/src/shm.xml validates
      /jhbuild/checkout/xcb/proto/src/sync.xml validates
      /jhbuild/checkout/xcb/proto/src/xc_misc.xml validates
      /jhbuild/checkout/xcb/proto/src/xevie.xml validates
      /jhbuild/checkout/xcb/proto/src/xf86dri.xml validates
      /jhbuild/checkout/xcb/proto/src/xf86vidmode.xml validates
      /jhbuild/checkout/xcb/proto/src/xfixes.xml validates
      /jhbuild/checkout/xcb/proto/src/xinerama.xml validates
      Element 'required_start_align': This element is not expected. Expected is one of ( bitcase, case, pad, field, list, fd ).
      Element 'required_start_align': This element is not expected. Expected is one of ( bitcase, case, pad, field, list, fd ).
      Element 'required_start_align': This element is not expected. Expected is one of ( bitcase, case, pad, field, list, fd ).
      /jhbuild/checkout/xcb/proto/src/xinput.xml fails to validate
      Element 'pad', attribute 'serialize': The attribute 'serialize' is not allowed.
      Element 'pad', attribute 'serialize': The attribute 'serialize' is not allowed.
      Element 'pad', attribute 'serialize': The attribute 'serialize' is not allowed.
      Element 'pad', attribute 'serialize': The attribute 'serialize' is not allowed.
      Element 'pad', attribute 'serialize': The attribute 'serialize' is not allowed.
      /jhbuild/checkout/xcb/proto/src/xkb.xml fails to validate
      /jhbuild/checkout/xcb/proto/src/xprint.xml validates
      /jhbuild/checkout/xcb/proto/src/xproto.xml validates
      /jhbuild/checkout/xcb/proto/src/xselinux.xml validates
      /jhbuild/checkout/xcb/proto/src/xtest.xml validates
      /jhbuild/checkout/xcb/proto/src/xv.xml validates
      /jhbuild/checkout/xcb/proto/src/xvmc.xml validates
      Makefile:534: recipe for target 'check-local' failed
      
      Signed-off-by: default avatarJon Turney <jon.turney@dronecode.org.uk>
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95494
      
      
      Reviewd-by: default avatarRan Benita <ran234@gmail.com>
      Signed-off-by: default avatarUli Schlachter <psychon@znc.in>
      95a262e0
  22. Jun 02, 2016
  23. May 28, 2016
  24. May 18, 2016
  25. Jan 27, 2016
  26. Jan 06, 2016
    • Jaya Tiwari's avatar
      calculate lengthless list · 811e038c
      Jaya Tiwari authored and Christian Linhart's avatar Christian Linhart committed
      
      Some rework done by Christian Linhart
      
      Signed-off-by: default avatarJaya Tiwari <tiwari.jaya18@gmail.com>
      Signed-off-by: default avatarChristian Linhart <chris@demorecorder.com>
      811e038c
    • Christian Linhart's avatar
      make xkb pass the alignment checker · fe8ae242
      Christian Linhart authored
      
      These are just minimal adjustments to get xkb through
      the checks of the alignment checker.
      
      It is not the big fixup which I have already posted an RFC patch
      a while ago.
      
      V2 of this patch:
        make indentation consistent with the file
        (tabs vs spaces)
      
      Signed-off-by: default avatarChristian Linhart <chris@demorecorder.com>
      fe8ae242
    • Christian Linhart's avatar
      automatic alignment checker / manual offsets · c499401b
      Christian Linhart authored
      
      The verification algorithm basically traverses the protocol-description
      of a protocol entity by recursively processing all fields and their
      types.
      
      A start-align consists of two numbers:
      * the alignment: This is a power of 2, and guarantees that the
        address (or protocol position) minus the offset can be divided
        by this number.
      
      * the offset: how many bytes the current position is after a
        position that can be divided by the alignment.
      
      The algorithm starts with the start-alignment and computes the alignment
      of each field from the start-align of the previous field as follows:
      * if the previous field is a primitive type then the offset is increased
        by the size of the primitive type module the alignment.
        If the alignment or offset are incompatible with the primitive type,
        then an error is reported.
      * if the previous field is a complex type, then it is processed recursively.
      * if the previous field is an alignment-pad, then the alignment is
        adjusted accordingly, as to be expected by the alignment-pad.
      
      Start-aligns can also be set manually with the xml-element
      "required_start_align" which has two attributes: "align" and "offset"
      If "offset" is omitted, it is assumed to 0.
      
      All toplevel protocol entities default to 4-byte start-alignment with offset 0.
      
      All non-toplevel complex entities, such as structs, switch, case, ...
      do not have a default alignment.
      If no alignment is explicitly specified for them, their alignment
      is computed by their usage in other entities.
      In that case, if they are used with aligments that violate the
      alignment requirements of some of their fields, an error is issued.
      
      If they are used with an alignment with non-zero offset,
      a warning is issued, which recommends to specify the required_start_align
      explicitly. (Reason: I don't want non-zero offsets to be silently
      computed automatically. These non-zero offsets have to be reviewed
      by a human and specified explicitely to record that this was reviewed
      by a human)
      
      If the required_start_align is explicitly specified for an entity
      then an error will be issued if it is used with an aligment that's
      incompatible with the explicitly specified alignment.
      
      If an entity is used in different contexts with different start-aligns
      then those start-aligns are combined to an align which is compatible
      with all aligns.
      E.g. (align 4, offset 0) and (align 4, offset 2) are combined
      to (align 2, offset 0).
      
      Error reports include the relevant context for a misalignment.
      For non-toplevel entities this includes the entity-usage stack.
      There is some complexity in the algorithm for reducing the size
      of the error-reports to include only the relevant info.
      
      This alignment verifier is also a prerequisite for getting
      rid of implicit alignment altogether.
      (This will then simplify the generated code and make it faster.)
      
      Signed-off-by: default avatarChristian Linhart <chris@demorecorder.com>
      c499401b
  27. Nov 15, 2015
Loading