diff --git a/js/x11/core/ext/composite.js b/js/x11/core/ext/composite.js new file mode 100644 index 0000000..3136388 --- /dev/null +++ b/js/x11/core/ext/composite.js @@ -0,0 +1,117 @@ +// /usr/share/doc/x11proto-composite-dev/compositeproto.txt.gz +// http://cgit.freedesktop.org/xorg/proto/compositeproto/plain/compositeproto.txt +// +// /usr/include/X11/extensions/Xcomposite.h Xlib +// /usr/include/X11/extensions/composite.h constants +// /usr/include/X11/extensions/compositeproto.h structs +// +// http://ktown.kde.org/~fredrik/composite_howto.html +// +// server side source: +// http://cgit.freedesktop.org/xorg/xserver/tree/composite/compext.c +// + +var x11 = Require('x11/core/x11'); +// TODO: move to templates + +exports.requireExt = function(display, callback) +{ + var X = display.client; + X.QueryExtension('Composite', function(err, ext) { + + if (!ext.present) + return callback(new Error('extension not available')); + + ext.Redirect = { + Automatic: 0, + Manual: 1 + }; + + ext.QueryVersion = function(clientMaj, clientMin, callback) + { + X.seq_num++; + X.pack_stream.pack('CCSLL', [ext.majorOpcode, 0, 3, clientMaj, clientMin]); + X.replies[X.seq_num] = [ + function(buf, opt) { + var res = buf.unpack('LL'); + return res; + }, + callback + ]; + X.pack_stream.flush(); + } + + ext.RedirectWindow = function( window, updateType ) + { + X.seq_num++; + X.pack_stream.pack('CCSLCxxx', [ext.majorOpcode, 1, 3, window, updateType]); + X.pack_stream.flush(); + } + + ext.RedirectSubwindows = function( window, updateType ) + { + X.seq_num++; + X.pack_stream.pack('CCSLCxxx', [ext.majorOpcode, 2, 3, window, updateType]); + X.pack_stream.flush(); + } + + ext.UnredirectWindow = function(window) + { + X.seq_num++; + X.pack_stream.pack('CCSL', [ext.majorOpcode, 3, 2, window]); + X.pack_stream.flush(); + } + + ext.UnredirectSubwindows = function(window) + { + X.seq_num++; + X.pack_stream.pack('CCSL', [ext.majorOpcode, 4, 2, window]); + X.pack_stream.flush(); + } + + ext.CreateRegionFromBorderClip = function(region, window) + { + X.seq_num++; + X.pack_stream.pack('CCSLL', [ext.majorOpcode, 5, 3, damage, region]); + X.pack_stream.flush(); + } + + ext.NameWindowPixmap = function(window, pixmap) + { + X.seq_num++; + X.pack_stream.pack('CCSLL', [ext.majorOpcode, 6, 3, window, pixmap]); + X.pack_stream.flush(); + } + + ext.GetOverlayWindow = function(window, callback) + { + X.seq_num++; + X.pack_stream.pack('CCSL', [ext.majorOpcode, 7, 2, window]); + X.replies[X.seq_num] = [ + function(buf, opt) { + var res = buf.unpack('L'); + return res[0]; + }, + callback + ]; + X.pack_stream.flush(); + } + + ext.ReleaseOverlayWindow = function(window) + { + X.seq_num++; + X.pack_stream.pack('CCSL', [ext.majorOpcode, 8, 2, window]); + X.pack_stream.flush(); + } + + // currently version 0.4 TODO: bump up with coordinate translations + ext.QueryVersion(0, 4, function(err, vers) { + if (err) + return callback(err); + + ext.major = vers[0]; + ext.minor = vers[1]; + callback(null, ext); + }); + }); +}