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