Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
bcce248013
commit
37f8b8a559
270
js/x11/core/ext/apple-wm.js
Normal file
270
js/x11/core/ext/apple-wm.js
Normal file
|
@ -0,0 +1,270 @@
|
|||
// http://www.xfree86.org/current/AppleWM.3.html
|
||||
// http://opensource.apple.com/source/X11server/X11server-106.3/Xquartz/xorg-server-1.10.2/hw/xquartz/applewm.c
|
||||
// /usr/X11/include/X11/extensions/applewm.h
|
||||
|
||||
var x11 = Require('x11/core/x11');
|
||||
var xutil = Require('x11/core/xutil');
|
||||
// TODO: move to templates
|
||||
|
||||
/*
|
||||
#define X_AppleWMFrameGetRect 1
|
||||
#define X_AppleWMFrameHitTest 2
|
||||
#define X_AppleWMFrameDraw 3
|
||||
#define X_AppleWMDisableUpdate 4
|
||||
#define X_AppleWMReenableUpdate 5
|
||||
#define X_AppleWMSetWindowMenuCheck 7
|
||||
#define X_AppleWMSetWindowMenu 11
|
||||
#define X_AppleWMSendPSN 12
|
||||
#define X_AppleWMAttachTransient 13
|
||||
*/
|
||||
|
||||
exports.requireExt = function(display, callback)
|
||||
{
|
||||
var X = display.client;
|
||||
X.QueryExtension('Apple-WM', function(err, ext) {
|
||||
|
||||
if (!ext.present)
|
||||
callback(new Error('extension not available'));
|
||||
|
||||
ext.QueryVersion = function(cb)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCS', [ext.majorOpcode, 0, 1]);
|
||||
X.replies[X.seq_num] = [
|
||||
function(buf, opt) {
|
||||
var res = buf.unpack('SSL');
|
||||
return res;
|
||||
},
|
||||
cb
|
||||
];
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
ext.FrameRect = {
|
||||
Titlebar: 1,
|
||||
Tracking: 2,
|
||||
Growbox: 3
|
||||
};
|
||||
|
||||
ext.FrameGetRect = function(frame_class, frame_rect, ix, iy, iw, ih, ox, oy, ow, oh, cb)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCSSSSSSSSSSS', [ext.majorOpcode, 1, 6, frame_class, frame_rect, ix, iy, iw, ih, ox, oy, ow, oh, cb]);
|
||||
X.replies[X.seq_num] = [
|
||||
function(buf, opt) {
|
||||
var res = buf.unpack('SSSS');
|
||||
return {
|
||||
x: res[0],
|
||||
y: res[1],
|
||||
w: res[2],
|
||||
h: res[3]
|
||||
};
|
||||
},
|
||||
cb
|
||||
];
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
ext.FrameHitTest = function(frame_class, px, py, ix, iy, iw, ih, ox, oy, ow, oh, cb)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCSSxxSSSSSSSSSS', [ext.majorOpcode, 2, 7, frame_class, px, py, ix, iy, iw, ih, ox, oy, ow, oh]);
|
||||
X.replies[X.seq_num] = [
|
||||
function(buf, opt) {
|
||||
var res = buf.unpack('L');
|
||||
return res[0];
|
||||
},
|
||||
cb
|
||||
];
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
|
||||
// from /usr/include/Xplugin.h
|
||||
ext.FrameClass = {
|
||||
DecorLarge: 1,
|
||||
Reserved1: 2,
|
||||
Reserved2: 4,
|
||||
Reserved3: 8,
|
||||
DecorSmall: 16,
|
||||
Reserved5: 32,
|
||||
Reserved6: 64,
|
||||
Reserved8: 128,
|
||||
Managed: 1<<15,
|
||||
Transient: 1<<16,
|
||||
Stationary: 1<<17
|
||||
};
|
||||
|
||||
ext.FrameAttr = {
|
||||
Active: 1,
|
||||
Urgent: 2,
|
||||
Title: 4,
|
||||
Prelight: 8,
|
||||
Shaded: 16,
|
||||
CloseBox: 0x100,
|
||||
Collapse: 0x200,
|
||||
Zoom: 0x400,
|
||||
CloseBoxClicked: 0x800,
|
||||
CollapseBoxClicked: 0x1000,
|
||||
ZoomBoxClicked: 0x2000,
|
||||
GrowBox: 0x4000
|
||||
};
|
||||
|
||||
ext.FrameDraw = function(screen, window, frameClass, attr, ix, iy, iw, ih, ox, oy, ow, oh, title)
|
||||
{
|
||||
X.seq_num++;
|
||||
var titleReqWords = xutil.padded_length(title.length)/4;
|
||||
X.pack_stream.pack('CCSLLSSSSSSSSSSLp', [ext.majorOpcode, 3, 9+titleReqWords, screen, window, frameClass, attr, ix, iy, iw, ih, ox, oy, ow, oh, title.length, title]);
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
ext.NotifyMask = {
|
||||
Controller: 1,
|
||||
Activation: 2,
|
||||
Pasteboard: 4,
|
||||
All: 7
|
||||
};
|
||||
|
||||
// TODO: decode events
|
||||
/*
|
||||
#define AppleWMMinimizeWindow 0
|
||||
#define AppleWMZoomWindow 1
|
||||
#define AppleWMCloseWindow 2
|
||||
#define AppleWMBringAllToFront 3
|
||||
#define AppleWMHideWindow 4
|
||||
#define AppleWMHideAll 5
|
||||
#define AppleWMShowAll 6
|
||||
#define AppleWMWindowMenuItem 9
|
||||
#define AppleWMWindowMenuNotify 10
|
||||
#define AppleWMNextWindow 11
|
||||
#define AppleWMPreviousWindow 12
|
||||
|
||||
#define AppleWMIsActive 0
|
||||
#define AppleWMIsInactive 1
|
||||
#define AppleWMReloadPreferences 2
|
||||
|
||||
#define AppleWMCopyToPasteboard 0
|
||||
*/
|
||||
|
||||
ext.SelectInput = function(mask)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCSL', [ext.majorOpcode, 6, 2, mask]);
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
ext.SetFrontProcess = function()
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCS', [ext.majorOpcode, 8, 1]);
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
ext.WindowLevel = {
|
||||
Normal: 0,
|
||||
Floating: 1,
|
||||
TornOff: 2,
|
||||
Dock: 3,
|
||||
Desktop: 4
|
||||
};
|
||||
|
||||
ext.SetWindowLevel = function(window, level)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCSLL', [ext.majorOpcode, 9, 3, window, level]);
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
ext.CanQuit = function(state)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCSCxxx', [ext.majorOpcode, 10, 2, state]);
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
// shortcut is single-byte ASCII (optional, 0=no shortcut)
|
||||
// items example: [ 'item1', 'some item', ['C', 'item with C shortcut'] ]
|
||||
ext.SetWindowMenu = function(items)
|
||||
{
|
||||
var reqlen = 8;
|
||||
var extlength = 0;
|
||||
items.forEach(function(i) {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
// https://developer.apple.com
|
||||
// /library/mac/documentation/Carbon/Reference/Process_Manager/Reference/reference.html#//apple_ref/doc/c_ref/ProcessSerialNumber
|
||||
ext.SendPSN = function(hi, lo)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCSLL', [ext.majorOpcode, 12, 3, hi, lo]);
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
ext.AttachTransient = function(child, parent)
|
||||
{
|
||||
X.seq_num++;
|
||||
X.pack_stream.pack('CCSLL', [ext.majorOpcode, 13, 3, child, parent]);
|
||||
X.pack_stream.flush();
|
||||
}
|
||||
|
||||
callback(null, ext);
|
||||
/*
|
||||
ext.QueryVersion(function(err, vers) {
|
||||
ext.major = vers[0];
|
||||
ext.minor = vers[1];
|
||||
ext.patch = vers[2];
|
||||
callback(null, ext);
|
||||
});
|
||||
*/
|
||||
|
||||
ext.events = {
|
||||
AppleWMControllerNotify: 0,
|
||||
AppleWMActivationNotify: 1,
|
||||
AppleWMPasteboardNotify: 2,
|
||||
}
|
||||
|
||||
ext.EventKind = {
|
||||
Controller: {
|
||||
MinimizeWindow: 0,
|
||||
ZoomWindow: 1,
|
||||
CloseWindow: 2,
|
||||
BringAllToFront: 3,
|
||||
WideWindow: 4,
|
||||
HideAll: 5,
|
||||
ShowAll: 6,
|
||||
WindowMenuItem: 9,
|
||||
WindowMenuNotify: 10,
|
||||
NextWindow: 11,
|
||||
PreviousWindow: 12
|
||||
},
|
||||
Activation: {
|
||||
IsActive: 0,
|
||||
IsInactive:1,
|
||||
ReloadPreferences: 2
|
||||
},
|
||||
Pasteboard: {
|
||||
CopyToPasteboard: 0
|
||||
}
|
||||
};
|
||||
|
||||
X.eventParsers[ext.firstEvent + ext.events.AppleWMControllerNotify] =
|
||||
X.eventParsers[ext.firstEvent + ext.events.AppleWMActivationNotify] =
|
||||
X.eventParsers[ext.firstEvent + ext.events.AppleWMPasteboardNotify] = function(type, seq, extra, code, raw)
|
||||
{
|
||||
var event = {};
|
||||
switch(type) {
|
||||
case ext.firstEvent + ext.events.AppleWMControllerNotify: event.name = 'AppleWMControllerNotify'; break;
|
||||
case ext.firstEvent + ext.events.AppleWMActivationNotify: event.name = 'AppleWMActivationNotify'; break;
|
||||
case ext.firstEvent + ext.events.AppleWMPasteboardNotify: event.name = 'AppleWMPasteboardNotify'; break;
|
||||
}
|
||||
event.type = code;
|
||||
event.time = extra;
|
||||
event.arg = raw.unpack('xxL')[0];
|
||||
return event;
|
||||
};
|
||||
|
||||
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue
Block a user