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