From 8d7c65187ede7b6e7695c6bcb798bd5bb746295a Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:03:40 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/x11/core/ext/screen-saver.js | 109 ++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 js/x11/core/ext/screen-saver.js diff --git a/js/x11/core/ext/screen-saver.js b/js/x11/core/ext/screen-saver.js new file mode 100644 index 0000000..81a11ad --- /dev/null +++ b/js/x11/core/ext/screen-saver.js @@ -0,0 +1,109 @@ +// http://www.x.org/releases/X11R7.6/doc/scrnsaverproto/saver.pdf + +var x11 = Require('x11/core/x11'); +// 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) { + if (err) + return callback(err); + ext.major = vers[0]; + ext.minor = vers[1]; + callback(null, 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; + }; + }); +}