463 lines
18 KiB
Plaintext
463 lines
18 KiB
Plaintext
|
DRAFT FOR REVIEW
|
||
|
The X Resource Extension
|
||
|
Version 1.2
|
||
|
Rami Ylimäki
|
||
|
rami.ylimaki@vincit.fi
|
||
|
|
||
|
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
|
||
|
1. Introduction
|
||
|
|
||
|
The protocol description of X Resource Extension version 1.1 has been
|
||
|
either lost or has never been written. This specification documents
|
||
|
version 1.0 based on reverse engineered library and server
|
||
|
code. Version 1.1 has been accidentally released from the version
|
||
|
control and while it doesn't have differences to version 1.0, this
|
||
|
version is labeled 1.2 in order to remove the risk of confusion. In
|
||
|
addition to the 1.0 description, this document introduces a new 1.2
|
||
|
version of the extension.
|
||
|
|
||
|
Version 1.2 is a minor release and therefore the changes are
|
||
|
compatible with the previous version. Main enhancements over version
|
||
|
1.0 are:
|
||
|
|
||
|
- Client identification is now possible. For example, servers
|
||
|
supporting version 1.2 may report PID of local clients.
|
||
|
|
||
|
- Size of any resource can be queried from the server. Servers may not
|
||
|
necessarily support size calculation for every resource. However,
|
||
|
clients have now at least the chance to let the server do resource
|
||
|
size estimation for them.
|
||
|
|
||
|
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
|
||
|
2. Notations used in this document
|
||
|
|
||
|
Notation for data types and requests follows the guidelines set in
|
||
|
sections 2-4 of X Window System Protocol standard.
|
||
|
|
||
|
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
|
||
|
3. Interoperability between version 1.1 and 1.2
|
||
|
|
||
|
Version 1.2 only introduces two new requests. However, these requests
|
||
|
could be seen as generalized versions of existing requests. Even
|
||
|
though we aren't deprecating any old requests, libraries could
|
||
|
implement some old requests using the new ones.
|
||
|
|
||
|
The new XResQueryClientIds request could be used instead of
|
||
|
XResQueryClients.
|
||
|
|
||
|
The new XResQueryResourceBytes request could be used instead of
|
||
|
XResQueryClientPixmapBytes.
|
||
|
|
||
|
Using the old requests is still acceptable because we don't want to
|
||
|
change the semantics of existing requests between version 1.1 and 1.2.
|
||
|
|
||
|
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
|
||
|
4. Data types
|
||
|
|
||
|
4.1 Types in version 1.0
|
||
|
|
||
|
CLIENTXIDRANGE [ resource_base: CARD32
|
||
|
resource_mask: CARD32 ]
|
||
|
|
||
|
This type is used for reply of XResQueryClients in version 1.1. It
|
||
|
represents the range of resource allocated for a client and can be
|
||
|
also used for client identification.
|
||
|
|
||
|
resource_base
|
||
|
First resource ID reserved for a client. Used also to identify the
|
||
|
clients themselves.
|
||
|
resource_mask
|
||
|
Mask that can be used to identify a client from some resource
|
||
|
ID. Just zero the bits indicated by this mask from any resource ID
|
||
|
to identify the client that owns the resource.
|
||
|
|
||
|
CLIENTXID [ client: XID ]
|
||
|
|
||
|
This type identifies a single client by a resource owned by that
|
||
|
client or by the first resource ID allocated for the client
|
||
|
(resource_base of CLIENTXIDRANGE). Whenever a resource ID is used, it
|
||
|
is masked by resource_mask of CLIENTXIDRANGE to find out the client
|
||
|
that owns the resource.
|
||
|
|
||
|
CLIENTRESOURCETYPECOUNT [ resource_type: ATOM
|
||
|
count: CARD32 ]
|
||
|
|
||
|
This type is used for reply of XResQueryClientResources in version
|
||
|
1.1. It represents the number of certain type of resources that are
|
||
|
owned by some client.
|
||
|
|
||
|
resource_type
|
||
|
Atom specifying the type of a resource.
|
||
|
count
|
||
|
Number of resources of the given type owned by a client.
|
||
|
|
||
|
4.2 Types in version 1.2
|
||
|
|
||
|
4.2.1 Types used by XResQueryClientIds
|
||
|
|
||
|
CLIENTIDMASK { ClientXid = 0x1, LocalClientPid = 0x2 }
|
||
|
|
||
|
A bitmask specifying a client identification method. Currently only
|
||
|
the PID of local clients is supported in the form of
|
||
|
LocalClientPid. ClientXid is provided for backward compatibility with
|
||
|
version 1.0 so that the new 1.2 requests (XResQueryClientIds) can be
|
||
|
used in place of the older ones (XResQueryClients).
|
||
|
|
||
|
CLIENTIDSPEC [ client: CLIENTXID or None
|
||
|
mask: SETofCLIENTIDMASK or None ]
|
||
|
|
||
|
A data structure for selecting client IDs.
|
||
|
|
||
|
client
|
||
|
ID of a resource allocated for some client. Only the part
|
||
|
identifying a client is actually used. The resource_base of
|
||
|
CLIENTXIDRANGE can be used if the client doesn't own any
|
||
|
resources. However, any resource ID is accepted because that makes
|
||
|
identifying the owners of existing resources easy. The null
|
||
|
resource None can be used to select all clients.
|
||
|
mask
|
||
|
Collection of identification methods that should be applied on the
|
||
|
client. The special value None can be used to apply all supported
|
||
|
identification methods.
|
||
|
|
||
|
CLIENTIDVALUE [ spec: CLIENTIDSPEC
|
||
|
length: CARD32
|
||
|
value: LISTofCARD32 ]
|
||
|
|
||
|
A data structure specifying a single client ID.
|
||
|
|
||
|
spec
|
||
|
A unique identifier for a specific ID of some client. Wildcards
|
||
|
such as None and bitmask unions aren't allowed. The data structure
|
||
|
must always identify a single client and single ID type. However,
|
||
|
the client doesn't have to be specified as the resource_base of
|
||
|
CLIENTXIDRANGE and can be any resource owned by the client.
|
||
|
length
|
||
|
Specifies the length of an ID in units of CARD32. The length
|
||
|
depends on the ID type. In version 1.2 the lengths are 0 for
|
||
|
ClientXid and 4 for LocalClientPid. The length of ClientXid is 0
|
||
|
because that is already stored in the spec field.
|
||
|
value
|
||
|
Actual ID data. In version 1.2 this is missing for ClientXid and
|
||
|
consists of a single CARD32 for LocalClientPid.
|
||
|
|
||
|
4.2.2 Types used by XResQueryResourceBytes
|
||
|
|
||
|
To better understand how resources are related to each other, it's
|
||
|
useful to introduce the concepts of main resource and cross
|
||
|
reference. By main resource we just mean a normal resource that has a
|
||
|
valid XID. By cross reference we mean a resource that is used by some
|
||
|
other resource.
|
||
|
|
||
|
The same resource may have both of these roles depending on the
|
||
|
context. For example, there could be an ordinary pixmap resource. When
|
||
|
we talk about this resource in isolation the term main resource is
|
||
|
used. We call the exact same resource a cross reference when we are
|
||
|
concentrating on some higher level resource, such as window or
|
||
|
graphics context, that is using the lower level resource. Cross
|
||
|
references may also be internal server resources that don't have a
|
||
|
valid XID.
|
||
|
|
||
|
RESOURCEIDSPEC [ resource: XID or None
|
||
|
type: ATOM or None/AnyPropertyType ]
|
||
|
|
||
|
A data structure for selecting or identifying resources. The
|
||
|
interpretation of fields changes depending on the context. The
|
||
|
differences in interpretation are described below.
|
||
|
|
||
|
resource
|
||
|
An XID of a resource. The null resource None can be used to select
|
||
|
all resources matching some type if the data structure is used in
|
||
|
XResQueryResourceBytes request. The null resource None can be used
|
||
|
to mark private server resources if the data structure is used in
|
||
|
a cross reference of XResQueryResourceBytes reply.
|
||
|
type
|
||
|
An atom identifying the resource type. The null atom
|
||
|
None/AnyPropertyType can be used to select all resource types
|
||
|
matching some resource ID if the data structure is used in
|
||
|
XResQueryResourceBytes request.
|
||
|
|
||
|
RESOURCESIZESPEC [ spec: RESOURCEIDSPEC
|
||
|
bytes: CARD32
|
||
|
ref_count: CARD32
|
||
|
use_count: CARD32 ]
|
||
|
|
||
|
A data structure specifying the size of a single resource.
|
||
|
|
||
|
spec
|
||
|
Uniquely identifies a single resource. Wildcards such as None and
|
||
|
AnyPropertyType aren't allowed for main resources. In cross
|
||
|
references, None is used to mark internal server resources.
|
||
|
bytes
|
||
|
Number of bytes allocated for the resource. The size of a resource
|
||
|
is never divided by a reference count. This is the number of bytes
|
||
|
released in server when there are no more references left to the
|
||
|
resource.
|
||
|
ref_count
|
||
|
Number of total users of the resource. Typically the reference
|
||
|
count is 1 but for pixmaps and other resources used from different
|
||
|
contexts the count may be larger.
|
||
|
use_count
|
||
|
Number of times the resource is used by some other resource. For
|
||
|
main resources this is typically 1, because a resource doesn't
|
||
|
usually use itself recursively. For cross references this is the
|
||
|
number of times the resource is used and is also 1 usually.
|
||
|
|
||
|
RESOURCESIZEVALUE [ size: RESOURCESIZESPEC
|
||
|
num_cross_references: CARD32
|
||
|
cross_references: LISTofRESOURCESIZESPEC ]
|
||
|
|
||
|
A data structure specifying sizes of cross references to other
|
||
|
resources in addition to the main resource size.
|
||
|
|
||
|
size
|
||
|
Size of a main resource.
|
||
|
num_cross_references
|
||
|
Number of cross references to other resources from the main
|
||
|
resource. Currently resources can only have pixmaps as cross
|
||
|
references but this can be extended to other types in the
|
||
|
future. For simple resources this field is therefore 0 and the
|
||
|
cross_references list is missing.
|
||
|
cross_references:
|
||
|
Size specifications for cross references. Note that cross
|
||
|
references may contain resources that don't have a valid XID. For
|
||
|
example, a DRI2 drawable might have a cross reference to a private
|
||
|
pixmap that is used internally in the server only. These private
|
||
|
cross references are contained in this list also. This makes it
|
||
|
possible to emulate XResGetClientPixmapBytes with
|
||
|
XResGetResourceBytes.
|
||
|
|
||
|
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
|
||
|
5. Requests
|
||
|
|
||
|
5.1 Requests in version 1.0
|
||
|
|
||
|
┌───
|
||
|
XResQueryVersion
|
||
|
client_major: CARD8
|
||
|
client_minor: CARD8
|
||
|
▶
|
||
|
server_major: CARD16
|
||
|
server_minor: CARD16
|
||
|
└───
|
||
|
|
||
|
The client sends the highest supported version to the server and the
|
||
|
server sends the highest version it supports, but no higher than the
|
||
|
requested version. Major version changes can introduce
|
||
|
incompatibilities in existing functionality, minor version changes
|
||
|
introduce only backward compatible changes. It is the client's
|
||
|
responsibility to ensure that the server supports a version which is
|
||
|
compatible with its expectations.
|
||
|
|
||
|
client_major
|
||
|
Major X Resource Extension version supported by client.
|
||
|
client_minor
|
||
|
Minor X Resource Extension version supported by client.
|
||
|
server_major
|
||
|
Highest version supported by server that is compatible with
|
||
|
client.
|
||
|
server_minor
|
||
|
Highest version supported by server that is compatible with
|
||
|
client.
|
||
|
|
||
|
┌───
|
||
|
XResQueryClients
|
||
|
▶
|
||
|
num_clients: CARD32
|
||
|
clients: LISTofCLIENTXIDRANGE
|
||
|
└───
|
||
|
|
||
|
The request asks X server to return the list of all currently
|
||
|
connected clients.
|
||
|
|
||
|
num_clients
|
||
|
Number of currently connected clients.
|
||
|
clients
|
||
|
List of XID ranges allocated for the connected clients.
|
||
|
|
||
|
┌───
|
||
|
XResQueryClientResources
|
||
|
client: CLIENTXID
|
||
|
▶
|
||
|
num_types: CARD32
|
||
|
types: LISTofCLIENTRESOURCETYPECOUNT
|
||
|
|
||
|
Errors: Value
|
||
|
└───
|
||
|
|
||
|
This request can be used to ask the number of resources owned by a
|
||
|
client. The server will return the counts of each type of resource.
|
||
|
|
||
|
client
|
||
|
An XID in the resource range of a client. This identifies the
|
||
|
client and not some specific resource.
|
||
|
num_types
|
||
|
Number of different resource types owned by the client.
|
||
|
types
|
||
|
A list of counts for each resource type.
|
||
|
|
||
|
A value error is generated if invalid resource or client XID is given
|
||
|
in the request.
|
||
|
|
||
|
┌───
|
||
|
XResQueryClientPixmapBytes
|
||
|
client: CLIENTXID
|
||
|
▶
|
||
|
bytes: CARD32
|
||
|
bytes_overflow: CARD32
|
||
|
|
||
|
Errors: Value
|
||
|
└───
|
||
|
|
||
|
This request is used to get the pixmap usage of some client. The
|
||
|
returned number is a sum of memory usage of each pixmap that can be
|
||
|
attributed to the given client. Ideally the server goes through all
|
||
|
pixmaps and divides each pixmap size by the pixmap reference count to
|
||
|
get a pixmap reference size. The reference size is then added to the
|
||
|
returned sum if the client happens to be referencing that pixmap. In
|
||
|
practice some pixmap references may be missed, because it would be too
|
||
|
difficult to keep track of all pixmap references. However, the server
|
||
|
will check the most important client resources that are using pixmaps
|
||
|
and tries to estimate the pixmap usage as well as is possible. In
|
||
|
other words, the server need only make a best-effort attempt to
|
||
|
calculate resource source, so actual resource size may differ from
|
||
|
that reported in practice.
|
||
|
|
||
|
client
|
||
|
Identifies a client by an ID in its resource ID range.
|
||
|
bytes:
|
||
|
Number of bytes attributed to pixmap references from the client
|
||
|
resources.
|
||
|
bytes_overflow:
|
||
|
Higher order word for the bytes field in case the sum of pixmap
|
||
|
reference sizes doesn't fit in CARD32.
|
||
|
|
||
|
A value error is generated if invalid resource or client XID is given
|
||
|
in the request.
|
||
|
|
||
|
5.2 Requests in version 1.2
|
||
|
|
||
|
┌───
|
||
|
XResQueryClientIds
|
||
|
num_specs: CARD32
|
||
|
client_specs: LISTofCLIENTIDSPEC
|
||
|
▶
|
||
|
num_ids: CARD32
|
||
|
client_ids: LISTofCLIENTIDVALUE
|
||
|
|
||
|
Errors: Value
|
||
|
└───
|
||
|
|
||
|
XResQueryClientIds can be used to identify a given set of clients with
|
||
|
some identification method. The request sends a list of specifiers
|
||
|
that select clients and identification methods to server. The server
|
||
|
then tries to identify the chosen clients using the identification
|
||
|
methods specified for each client. The server returns IDs for those
|
||
|
clients that were successfully identified. It's not an error condition
|
||
|
if some identification method couldn't be applied to a client. If the
|
||
|
server is unable to identify some clients, they simply aren't included
|
||
|
in the returned list.
|
||
|
|
||
|
The request supports wildcards in the client specifications so that in
|
||
|
the most general case all IDs of all clients can be queried with a
|
||
|
single CLIENTIDSPEC.
|
||
|
|
||
|
The CLIENTIDSPEC of request and CLIENTIDSPEC of CLIENTIDVALUE in reply
|
||
|
usually match each other. For example, if a request selected a client
|
||
|
by a resource ID owned by the client, then the client is identified by
|
||
|
the same resource ID in the reply. This has been done so that it would
|
||
|
be easy to identify an owner of some resource.
|
||
|
|
||
|
However, the CLIENTIDSPEC of returned CLIENTIDVALUE never contains any
|
||
|
wildcards. If the request used a wildcard to specify all clients in a
|
||
|
single CLIENTIDSPEC, then the reply has expanded the wildcard and
|
||
|
returns separate CLIENTIDVALUE records for each client. In this case
|
||
|
wildcarded clients are identified by resource_base of CLIENTXIDRANGE.
|
||
|
|
||
|
The LocalClientPid type of IDs are included in the reply list only if
|
||
|
the client executing the request asked for it and was also a local
|
||
|
client itself. It doesn't make sense for remote clients to ask PIDs of
|
||
|
local clients.
|
||
|
|
||
|
num_specs
|
||
|
Number of client ID specifications.
|
||
|
client_specs
|
||
|
A list specifying identification methods for clients. Supports
|
||
|
multiple identification methods and clients in a single
|
||
|
specification. See CLIENTIDSPEC for details.
|
||
|
num_ids
|
||
|
Number of IDs that were successfully determined. Can be different
|
||
|
from num_specs or even zero if the server didn't support any
|
||
|
identification methods for the given clients.
|
||
|
client_ids
|
||
|
A list specifying ID information for successfully identified
|
||
|
clients. If wildcards were used in a single CLIENTIDSPEC of
|
||
|
client_specs, then multiple CLIENTIDVALUE records may be returned
|
||
|
for that CLIENTIDSPEC. See CLIENTIDVALUE for details.
|
||
|
|
||
|
A Value error is returned if the request specifies an invalid client
|
||
|
XID or invalid identification method type.
|
||
|
|
||
|
┌───
|
||
|
XResQueryResourceBytes
|
||
|
client: CLIENTXID or None
|
||
|
num_specs: CARD32
|
||
|
resource_specs: LISTofRESOURCEIDSPEC
|
||
|
▶
|
||
|
num_sizes: CARD32
|
||
|
sizes: LISTofRESOURCESIZEVALUE
|
||
|
|
||
|
Errors: Atom, Value
|
||
|
└───
|
||
|
|
||
|
XResQueryResourceBytes can be used to ask the sizes of resources from
|
||
|
X server. The request sends a list of specifiers that selects
|
||
|
resources for size calculation. The server tries to calculate the
|
||
|
sizes of chosen resources and returns an estimate for a resource only
|
||
|
if the size could be determined. It's not an error condition if a size
|
||
|
couldn't be calculated. In that case the resources simply aren't
|
||
|
included in the returned list.
|
||
|
|
||
|
The request supports wildcards so that in the most general case sizes
|
||
|
of all resources of all clients can be queried with a single
|
||
|
RESOURCEIDSPEC. However, the reply has all wildcards expanded and
|
||
|
reports a size of a single resource in each RESOURCESIZEVALUE.
|
||
|
|
||
|
client
|
||
|
An ID of a client can be given to limit the query to resources of
|
||
|
that client. Just like in CLIENTIDSPEC, any resource ID can be
|
||
|
given to identify a client and None can be used if the query
|
||
|
shouldn't be limited to a specific client. Note that in some cases
|
||
|
this field is redundant because resource_specs already fully
|
||
|
determines which resources are selected. If the client ID doesn't
|
||
|
match the owner of any resource in resource_specs, no sizes are
|
||
|
returned and no error is generated.
|
||
|
num_specs
|
||
|
Number of resource specifications.
|
||
|
resource_specs
|
||
|
A list of resource specifications. Each specification can either
|
||
|
uniquely identify a single resource or multiple resources if
|
||
|
wildcarding is used. See RESOURCEIDSPEC for details.
|
||
|
num_sizes
|
||
|
Number of resources whose size could be determined. Can be
|
||
|
different from num_specs or even zero if the server didn't support
|
||
|
size calculation for the given resources.
|
||
|
sizes
|
||
|
A list of resource sizes. Each resource size is linked to a unique
|
||
|
resource. Wildcards are never used in the returned size
|
||
|
records. For example, it's not possible to receive a single
|
||
|
RESOURCESIZEVALUE that would specify the size of all pixmaps if
|
||
|
the sizes of pixmap type resources were asked. Instead, a single
|
||
|
RESOURCESIZEVALUE would be returned for each pixmap in that case.
|
||
|
|
||
|
An Atom error is returned if the request specifies an invalid resource
|
||
|
type. A Value error is returned if the request specifies an invalid
|
||
|
XID for a client or a resource.
|
||
|
|
||
|
❧❧❧❧❧❧❧❧❧❧❧
|