Skip to main content

DAMAGE extension

Reports changes ("damage") to drawables. A client creates a damage object monitoring a drawable and receives DamageNotify events whenever the drawable's contents change — the building block of compositing managers and screen-sharing tools, usually together with Composite (ext/composite.md) and XFIXES regions (ext/fixes.md).

X.require('damage', (err, Damage) => {
const damage = X.AllocID();
Damage.Create(damage, wid, Damage.ReportLevel.NonEmpty);
X.on('event', ev => {
if (ev.name === 'DamageNotify') {
Damage.Subtract(damage, 0, 0); // acknowledge, rearm reporting
// repaint from ev.drawable here
}
});
});

The version is negotiated automatically while requiring; it is available as Damage.major / Damage.minor.

Requests

QueryVersion(clientMajor, clientMinor, cb)

Negotiates the protocol version. cb(err, [major, minor]) — the version the server will speak. Called automatically by X.require with 1.1.

Create(damage, drawable, reportLevel)

Creates damage object damage (a client-allocated XID) monitoring drawable. reportLevel is one of Damage.ReportLevel and controls how DamageNotify events are batched:

LevelValueMeaning
RawRectangles0an event per changed rectangle
DeltaRectangles1events only for areas not already damaged
BoundingBox2events when the damage bounding box grows
NonEmpty3a single event when the region becomes non-empty

No reply.

Destroy(damage)

Destroys damage object damage. No reply.

Subtract(damage, repair, parts)

Synchronously subtracts repair (an XFIXES region XID, or 0 for "the whole damage region") from the damage region of damage. If parts is a region XID it receives the intersection of the damage region and repair before the subtraction; pass 0 to discard it. Subtracting rearms event delivery: with NonEmpty reporting, call Subtract(damage, 0, 0) after each event to be told about the next change. No reply.

Add(drawable, region)

Reports damage in region (an XFIXES region XID) against drawable, as if the client had drawn there. Damage objects of other clients monitoring the drawable are notified. No reply. Note: the source names the first parameter damage, but the protocol field is a drawable.

Events

DamageNotify

Delivered when a monitored drawable changes, subject to the report level. Not selected via an event mask — creating a damage object selects delivery. Parsed fields:

  • level — report level of the damage object (Damage.ReportLevel); the server may set bit 0x80 when more events for the same drawable follow
  • seq — sequence number
  • drawable — the monitored drawable
  • damage — the damage object
  • time — server timestamp
  • area{x, y, w, h} changed rectangle, drawable-relative
  • geometry{x, y, w, h} current geometry of the drawable
  • name'DamageNotify'

Note the w/h field names (not width/height), and that the event has no type field, unlike most other extension events in this library.

Notes

  • Damage.ReportLevel = {RawRectangles: 0, DeltaRectangles: 1, BoundingBox: 2, NonEmpty: 3}.
  • Damage.events = {DamageNotify: 0} (offset from the extension's firstEvent).
  • Regions passed to Subtract and Add are XFIXES regions; create them with Fixes.CreateRegion (ext/fixes.md).