Skip to main content

DOUBLE-BUFFER (DBE) extension

Flicker-free drawing: associates a back buffer with a window, lets you render into it with ordinary core drawing requests, then swaps it to the front in one atomic operation.

X.require('dbe', (err, Dbe) => {
const backBuf = X.AllocID();
Dbe.AllocateBackBufferName(wid, backBuf, Dbe.SwapAction.Untouched);
// the back buffer is a drawable: draw with core requests
X.PolyFillRectangle(backBuf, gc, [0, 0, 100, 100]);
Dbe.SwapBuffers([{ window: wid, swapAction: Dbe.SwapAction.Untouched }]);
});

The version is negotiated automatically while requiring (the spec requires GetVersion before any other DBE request); it is available as Dbe.major / Dbe.minor.

Requests​

GetVersion(clientMajor, clientMinor, cb)​

Negotiates the protocol version. cb(err, [major, minor]). Called automatically by X.require with 1.0.

AllocateBackBufferName(window, backBuffer, swapActionHint)​

Associates backBuffer (a fresh XID from X.AllocID()) with the back buffer of window. swapActionHint is a Dbe.SwapAction value hinting the swap behavior the client intends to use. The back buffer is a drawable usable with any core drawing request. No reply.

DeallocateBackBufferName(backBuffer)​

Frees the buffer name. The window stays double-buffered while other names reference its back buffer. No reply.

SwapBuffers(swapInfos)​

swapInfos is an array of {window, swapAction} — swaps front and back buffers of each listed window in one atomic request. swapAction (a Dbe.SwapAction value) determines what the new back buffer contains afterwards. No reply.

BeginIdiom()​

Marks the start of a request sequence the server may optimize as a unit. Purely a hint. No reply.

EndIdiom()​

Ends the sequence started by BeginIdiom. No reply.

GetVisualInfo(drawables, cb)​

drawables is an array of screen specifiers (any drawable on each screen of interest, e.g. root windows). cb(err, screens) — one entry per drawable, each an array of {visual, depth, perfLevel} describing the double-buffer capable visuals of that screen (higher perfLevel means better expected performance).

GetBackBufferAttributes(backBuffer, cb)​

cb(err, {window}) — the window the buffer name is attached to, or 0 (None) if it has been deallocated or the window was destroyed.

Events / errors​

None.

Notes​

  • Dbe.SwapAction = {Undefined: 0, Background: 1, Untouched: 2, Copied: 3} — the new back-buffer contents after a swap: undefined, cleared to the window background, left as-is (the old front buffer), or a copy of the old back buffer.
  • Only the untouched front-buffer contents change on SwapBuffers; a GetImage on the window before and after a swap is the easiest way to verify it worked (see test/dbe.js).