Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
		
							parent
							
								
									cbe89285ac
								
							
						
					
					
						commit
						ce74eb39ff
					
				
							
								
								
									
										307
									
								
								js/x11/core/ext/randr.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								js/x11/core/ext/randr.js
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,307 @@ | ||||||
|  | // http://www.x.org/releases/X11R7.6/doc/randrproto/randrproto.txt
 | ||||||
|  | 
 | ||||||
|  | var x11 = Require('x11/core/x11'); | ||||||
|  | // TODO: move to templates
 | ||||||
|  | 
 | ||||||
|  | exports.requireExt = function(display, callback) | ||||||
|  | { | ||||||
|  |     var X = display.client; | ||||||
|  |     X.QueryExtension('RANDR', function(err, ext) { | ||||||
|  | 
 | ||||||
|  |         if (!ext.present) | ||||||
|  |             return callback(new Error('extension not available')); | ||||||
|  | 
 | ||||||
|  |         //ext.ReportLevel	= {
 | ||||||
|  |         //};
 | ||||||
|  | 
 | ||||||
|  |         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.events = { | ||||||
|  |             RRScreenChangeNotify: 0 | ||||||
|  |         }, | ||||||
|  | 
 | ||||||
|  |         ext.NotifyMask = { | ||||||
|  |             ScreenChange: 1, | ||||||
|  |             CrtcChange: 2, | ||||||
|  |             OutputChange: 4, | ||||||
|  |             OutputProperty: 8, | ||||||
|  |             All: 15 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         ext.Rotation = { | ||||||
|  |             Rotate_0: 1, | ||||||
|  |             Rotate_90: 2, | ||||||
|  |             Rotate_180: 4, | ||||||
|  |             Rotate_270: 8, | ||||||
|  |             Reflect_X: 16, | ||||||
|  |             Reflect_Y: 32 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         ext.ConfigStatus = { | ||||||
|  |             Sucess: 0, | ||||||
|  |             InvalidConfigTime: 1, | ||||||
|  |             InvalidTime: 2, | ||||||
|  |             Failed: 3 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         ext.ModeFlag = { | ||||||
|  |             HSyncPositive: 1, | ||||||
|  |             HSyncNegative: 2, | ||||||
|  |             VSyncPositive: 4, | ||||||
|  |             VSyncNegative: 8, | ||||||
|  |             Interlace: 16, | ||||||
|  |             DoubleScan: 32, | ||||||
|  |             CSync: 64, | ||||||
|  |             CSyncPositive: 128, | ||||||
|  |             CSyncNegative: 256, | ||||||
|  |             HSkewPresent: 512, | ||||||
|  |             BCast: 1024, | ||||||
|  |             PixelMultiplex: 2048, | ||||||
|  |             DoubleClock: 4096, | ||||||
|  |             ClockDivideBy2: 8192 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         ext.SetScreenConfig = function(win, ts, configTs, sizeId, rotation, rate, cb) { | ||||||
|  |             X.seq_num ++; | ||||||
|  |             X.pack_stream.pack('CCSLLLSSSS', [ext.majorOpcode, 2, 6, win, ts, configTs, sizeId, rotation, rate, 0]); | ||||||
|  |             X.replies[X.seq_num] = [ | ||||||
|  |                 function(buf, opt) { | ||||||
|  |                     var res = buf.unpack('LLLSSLL'); | ||||||
|  |                     return { | ||||||
|  |                         status : opt, | ||||||
|  |                         newTs : res [0], | ||||||
|  |                         configTs : res[1], | ||||||
|  |                         root : res[2], | ||||||
|  |                         subpixelOrder : res[3] | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 function(err, res) { | ||||||
|  |                     var err; | ||||||
|  |                     if (res.status !== 0) { | ||||||
|  |                         err = new Error('SetScreenConfig error'); | ||||||
|  |                         err.code = res.status; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     cb(err, res); | ||||||
|  |                 } | ||||||
|  |             ]; | ||||||
|  | 
 | ||||||
|  |             X.pack_stream.flush(); | ||||||
|  |         }, | ||||||
|  | 
 | ||||||
|  |         ext.SelectInput = function(win, mask) | ||||||
|  |         { | ||||||
|  |             X.seq_num++; | ||||||
|  |             X.pack_stream.pack('CCSLSS', [ext.majorOpcode, 4, 3, win, mask, 0]); | ||||||
|  |             X.pack_stream.flush(); | ||||||
|  |         }, | ||||||
|  | 
 | ||||||
|  |         ext.GetScreenInfo = function(win, cb) { | ||||||
|  |             X.seq_num ++; | ||||||
|  |             X.pack_stream.pack('CCSL', [ext.majorOpcode, 5, 2, win]); | ||||||
|  |             X.replies[X.seq_num] = [ | ||||||
|  |                 function(buf, opt) { | ||||||
|  |                     var i, j; | ||||||
|  |                     var res = buf.unpack('LLLSSSSSS'); | ||||||
|  |                     var info = { | ||||||
|  |                         rotations : opt, | ||||||
|  |                         root : res [0], | ||||||
|  |                         timestamp : res[1], | ||||||
|  |                         config_timestamp : res[2], | ||||||
|  |                         sizeID : res[4], | ||||||
|  |                         rotation : res[5], | ||||||
|  |                         rate : res[6], | ||||||
|  |                         rates: [] | ||||||
|  |                     }; | ||||||
|  | 
 | ||||||
|  |                     var nSizes = res[3]; | ||||||
|  |                     var nRates = res[7]; | ||||||
|  | 
 | ||||||
|  |                     var screens_len = nSizes << 2; | ||||||
|  |                     var format = Array(screens_len + 1).join('S'); | ||||||
|  |                     res = buf.unpack(format, 24); | ||||||
|  |                     info.screens = []; | ||||||
|  |                     for (i = 0; i < screens_len; i += 4) { | ||||||
|  |                         info.screens.push({ | ||||||
|  |                             px_width : res[i], | ||||||
|  |                             px_height : res[i + 1], | ||||||
|  |                             mm_width : res[i + 2], | ||||||
|  |                             mm_height : res[i + 3] | ||||||
|  |                         }); | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     format = Array(nRates + 1).join('S'); | ||||||
|  |                     info.rates = buf.unpack(format, 24 + screens_len * 2); | ||||||
|  |                     return info; | ||||||
|  |                 }, | ||||||
|  |                 cb | ||||||
|  |             ]; | ||||||
|  | 
 | ||||||
|  |             X.pack_stream.flush(); | ||||||
|  |         }, | ||||||
|  | 
 | ||||||
|  |         ext.GetScreenResources = function(win, cb) | ||||||
|  |         { | ||||||
|  |             X.seq_num ++; | ||||||
|  |             X.pack_stream.pack('CCSL', [ext.majorOpcode, 8, 2, win]); | ||||||
|  |             X.replies[X.seq_num] = [ | ||||||
|  |                 function(buf, opt) { | ||||||
|  |                     var i; | ||||||
|  |                     var pos = 0; | ||||||
|  |                     var res = buf.unpack('LLSSSSxxxxxxxx'); | ||||||
|  |                     var resources = { | ||||||
|  |                         timestamp : res[0], | ||||||
|  |                         config_timestamp : res[1], | ||||||
|  |                         modeinfos : [] | ||||||
|  |                     }; | ||||||
|  | 
 | ||||||
|  |                     pos += 24; | ||||||
|  |                     var format = Array(res[2] + 1).join('L'); | ||||||
|  |                     resources.crtcs = buf.unpack(format, pos); | ||||||
|  |                     pos +=  res[2] << 2; | ||||||
|  |                     format = Array(res[3] + 1).join('L'); | ||||||
|  |                     resources.outputs = buf.unpack(format, pos); | ||||||
|  |                     pos +=  res[3] << 2; | ||||||
|  |                     format = Array(res[4] + 1).join('LSSLSSSSSSSSL'); | ||||||
|  |                     res_modes = buf.unpack(format, pos); | ||||||
|  |                     pos +=  res[4] << 5; | ||||||
|  |                     for (i = 0; i < res[4]; i+= 13) { | ||||||
|  |                         resources.modeinfos.push({ | ||||||
|  |                             id : res_modes[i + 0], | ||||||
|  |                             width : res_modes[i + 1], | ||||||
|  |                             height : res_modes[i + 2], | ||||||
|  |                             dot_clock : res_modes[i + 3], | ||||||
|  |                             h_sync_start : res_modes[i + 4], | ||||||
|  |                             h_sync_end : res_modes[i + 5], | ||||||
|  |                             h_total : res_modes[i + 6], | ||||||
|  |                             h_skew : res_modes[i + 7], | ||||||
|  |                             v_sync_start : res_modes[i + 8], | ||||||
|  |                             v_sync_end : res_modes[i + 9], | ||||||
|  |                             v_total : res_modes[i + 10], | ||||||
|  |                             modeflags : res_modes[i + 12], | ||||||
|  |                             name : buf.slice(pos, pos + res_modes[i + 11]).toString() | ||||||
|  |                         }); | ||||||
|  | 
 | ||||||
|  |                         pos += res_modes[i + 11]; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     return resources; | ||||||
|  |                 }, | ||||||
|  |                 cb | ||||||
|  |             ]; | ||||||
|  | 
 | ||||||
|  |             X.pack_stream.flush(); | ||||||
|  |         }, | ||||||
|  |         ext.GetOutputInfo = function(output, ts, cb) | ||||||
|  |         { | ||||||
|  |             X.seq_num ++; | ||||||
|  |             X.pack_stream.pack('CCSLL', [ext.majorOpcode, 9, 3, output, ts ]); | ||||||
|  |             X.replies[X.seq_num] = [ | ||||||
|  |                 function(buf, opt) { | ||||||
|  |                     var i; | ||||||
|  |                     var pos = 0; | ||||||
|  |                     var res = buf.unpack('LLLLCCSSSSS'); | ||||||
|  |                     var info = { | ||||||
|  |                         timestamp : res[0], | ||||||
|  |                         crtc : res[1], | ||||||
|  |                         mm_width : res[2], | ||||||
|  |                         mm_height : res[3], | ||||||
|  |                         connection : res[4], | ||||||
|  |                         subpixelOrder : res[5], | ||||||
|  |                         preferredModes: res[8] | ||||||
|  |                     }; | ||||||
|  | 
 | ||||||
|  |                     pos += 28; | ||||||
|  |                     var format = Array(res[6] + 1).join('L'); | ||||||
|  |                     info.crtcs = buf.unpack(format, pos); | ||||||
|  |                     pos +=  res[6] << 2; | ||||||
|  |                     format = Array(res[7] + 1).join('L'); | ||||||
|  |                     info.modes = buf.unpack(format, pos); | ||||||
|  |                     pos +=  res[7] << 2; | ||||||
|  |                     format = Array(res[9] + 1).join('L'); | ||||||
|  |                     info.clones = buf.unpack(format, pos); | ||||||
|  |                     pos +=  res[9] << 2; | ||||||
|  |                     info.name = buf.slice(pos, pos + res_modes[10]).toString('binary'); | ||||||
|  |                     return info; | ||||||
|  |                 }, | ||||||
|  |                 cb | ||||||
|  |             ]; | ||||||
|  | 
 | ||||||
|  |             X.pack_stream.flush(); | ||||||
|  |         }, | ||||||
|  |         ext.GetCrtcInfo = function(crtc, configTs, cb) { | ||||||
|  |             X.seq_num ++; | ||||||
|  |             X.pack_stream.pack('CCSLL', [ext.majorOpcode, 20, 3, crtc, configTs ]); | ||||||
|  |             X.replies[X.seq_num] = [ | ||||||
|  |                 function(buf, opt) { | ||||||
|  |                     var pos = 0; | ||||||
|  |                     var res = buf.unpack('LssSSLSSSS'); | ||||||
|  |                     var info = { | ||||||
|  |                         status : opt, | ||||||
|  |                         timestamp : res[0], | ||||||
|  |                         x : res[1], | ||||||
|  |                         y : res[2], | ||||||
|  |                         width : res[3], | ||||||
|  |                         height : res[4], | ||||||
|  |                         mode : res[5], | ||||||
|  |                         rotation : res[6], | ||||||
|  |                         rotations : res[7] | ||||||
|  |                     }; | ||||||
|  | 
 | ||||||
|  |                     pos += 24; | ||||||
|  |                     var format = Array(res[8] + 1).join('L'); | ||||||
|  |                     info.output = buf.unpack(format, pos); | ||||||
|  |                     format = Array(res[9] + 1).join('L'); | ||||||
|  |                     info.possible = buf.unpack(format, pos); | ||||||
|  |                     return info; | ||||||
|  |                 }, | ||||||
|  |                 cb | ||||||
|  |             ]; | ||||||
|  | 
 | ||||||
|  |             X.pack_stream.flush(); | ||||||
|  |         }, | ||||||
|  | 
 | ||||||
|  |         X.eventParsers[ext.firstEvent + ext.events.RRScreenChangeNotify] = function(type, seq, extra, code, raw) | ||||||
|  |         { | ||||||
|  |             var event = {}; | ||||||
|  |             event.raw = raw; | ||||||
|  |             event.type = type | ||||||
|  |             event.seq = seq; | ||||||
|  |             event.rotation = code; | ||||||
|  |             var values = raw.unpack('LLLSSSSSS'); | ||||||
|  |             event.time = extra | ||||||
|  |             event.configtime = values[0]; | ||||||
|  |             event.root = values[1]; | ||||||
|  |             event.requestWindow = values[2]; | ||||||
|  |             event.sizeId = values[3]; | ||||||
|  |             event.subpixelOrder = values[4]; | ||||||
|  |             event.width = values[5]; | ||||||
|  |             event.height = values[6]; | ||||||
|  |             event.physWidth = values[7]; | ||||||
|  |             event.physHeight = values[8]; | ||||||
|  | 
 | ||||||
|  |             event.name = 'RRScreenChangeNotify'; | ||||||
|  |             return event; | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         ext.QueryVersion(255, 255, function(err, version) { | ||||||
|  |           if (err) return callback(err); | ||||||
|  |           ext.major_version = version[0]; | ||||||
|  |           ext.minor_version = version[1]; | ||||||
|  |           callback(null, ext); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user