diff --git a/examples/smoketest/sstest.js b/examples/smoketest/sstest.js new file mode 100644 index 0000000..8790d53 --- /dev/null +++ b/examples/smoketest/sstest.js @@ -0,0 +1,28 @@ +var x11 = require('../../lib/x11'); + +x11.createClient(function(display) { + var X = display.client; + var root = display.screen[0].root; + //X.ForceScreenSaver(0); + X.SetScreenSaver(20, 10, 2, 2); + + + X.require('screen-saver', function(SS) { + SS.SelectInput(root, SS.eventMask.Notify|SS.eventMask.Cycle); + //console.log(SS); + //setTimeout(function() { + // X.ForceScreenSaver(1); + //}, 5000); + setInterval(function() { + SS.QueryInfo(root, function(err, info) { + console.log(info.until); + //SS.SelectInput(root, SS.eventMask.Notify|SS.eventMask.Cycle); + }); + }, 1000); + X.on('event', function(ev) { + console.log(ev); + }); + }); + X.on('error', function(err) { console.log(err); }); + +}); diff --git a/lib/x11/ext/screen-saver.js b/lib/x11/ext/screen-saver.js new file mode 100644 index 0000000..89da127 --- /dev/null +++ b/lib/x11/ext/screen-saver.js @@ -0,0 +1,108 @@ +// http://www.x.org/releases/X11R7.6/doc/scrnsaverproto/saver.pdf + +var x11 = require('..'); +// TODO: move to templates + +exports.requireExt = function(display, callback) +{ + var X = display.client; + X.QueryExtension('MIT-SCREEN-SAVER', function(err, ext) { + + if (!ext.present) + return callback(new Error('extension not available')); + + + ext.QueryVersion = function(clientMaj, clientMin, cb) + { + X.seq_num++; + X.pack_stream.pack('CCSCCxx', [ext.majorOpcode, 0, 2, clientMaj, clientMin]); + X.replies[X.seq_num] = [ + function(buf, opt) { + var res = buf.unpack('CC'); + return res; + }, + cb + ]; + X.pack_stream.flush(); + } + + ext.State = { + Off: 0, + On: 1, + Disabled: 2 + }; + + ext.Kind = { + Blanked: 0, + Internal: 1, + External: 2 + }; + + ext.QueryInfo = function(drawable, callback) + { + X.seq_num++; + X.pack_stream.pack('CCSL', [ext.majorOpcode, 1, 2, drawable]); + X.replies[X.seq_num] = [ + function(buf, opt) { + var info = {}; + info.state = opt; + var res = buf.unpack('LLLLC'); + info.window = res[0]; + info.until = res[1]; + info.idle = res[2]; + info.eventMask = res[3]; + info.kind = res[4] + return info; + }, + callback + ]; + X.pack_stream.flush(); + } + + ext.eventMask = { + Notify: 1, + Cycle: 2 + }; + + ext.SelectInput = function( drawable, eventMask ) + { + X.seq_num++; + console.log('CCSLL', [ext.majorOpcode, 2, 3, drawable, eventMask]); + X.pack_stream.pack('CCSLL', [ext.majorOpcode, 2, 3, drawable, eventMask]); + X.pack_stream.flush(); + } + + ext.QueryVersion(1, 1, function(err, vers) { + + ext.major = vers[0]; + ext.minor = vers[1]; + callback(ext); + }); + + ext.events = { + ScreenSaverNotify: 0 + } + + ext.NotifyState = { + Off: 0, + On: 1, + Cycle: 2 + } + + X.eventParsers[ext.firstEvent + ext.events.ScreenSaverNotify] = function(type, seq, extra, code, raw) + { + var event = {}; + event.state = code; + event.seq = seq; + event.time = extra; + // CCSL = type, code, seq, extra + var values = raw.unpack('LLCC'); + event.root = values[0]; + event.saverWindow = values[1]; + event.kind = values[2]; + event.forced = values[1]; + event.name = 'ScreenSaverNotify'; + return event; + }; + }); +}