app.dhover×493 error×27all
// macOS/AppKit F09 demo — output enumeration & hotplug (../../../features/f09-outputs.md).
// The NSScreen-vs-CGDisplay duality: the same physical display surfaces as two object
// models — AppKit's NSScreen (points, y-up global space, per-screen scale) and
// CoreGraphics' CGDirectDisplayID (pixels, top-left-origin global space, modes) —
// bridged by the `NSScreenNumber` key in -[NSScreen deviceDescription]. Built on the
// scaffold/f08 recipe; run findings are A[ssh] (locked console, single built-in
// display — physical hotplug is Tier C).
//
// What it logs:
//   - CG-side enumeration BEFORE NSApplication exists (CGGetOnlineDisplayList /
//     CGGetActiveDisplayList — enumeration is global, no window or app object needed):
//     per display CGDisplayBounds, CGDisplayPixelsWide/High, vendor/model/serial,
//     CGDisplayScreenSize (physical mm), builtin/main/active/online/asleep flags, and
//     the current CGDisplayMode (points + pixels + CGDisplayModeGetRefreshRate);
//   - NSScreen-side enumeration: per screen frame, visibleFrame (and the
//     menubar/Dock delta between them), backingScaleFactor, localizedName,
//     maximumFramesPerSecond, and deviceDescription (NSScreenNumber + NSDeviceSize +
//     NSDeviceResolution);
//   - the bridge: NSScreenNumber == CGDirectDisplayID, matched against the CG list;
//   - which screen the window is on: -[NSWindow screen] — AppKit answers directly
//     (Win32 derives via MonitorFromWindow, X11 makes you intersect geometry yourself);
//   - change tracking: NSWindowDidChangeScreenNotification +
//     NSApplicationDidChangeScreenParametersNotification observers and a
//     CGDisplayRegisterReconfigurationCallback, with a hand-posted self-test proving
//     the NSNotification wiring (a real hotplug/reconfig is Tier C);
//   - the headless probe: a late re-enumeration diffs the active/online lists against
//     startup — does the locked session itself ever change the answer?
//
// Modes: WSI_AUTO_EXIT=1 = bounded scripted run; without it the window stays up for a
// manual (Tier C) plug/unplug session. Headless-safe: prints `SKIP:` and exits 0 when
// there is no window server.
module 
(module) app
app
;
import
(package) core
core
.
(module) core.attribute

This module contains UDA's (User Defined Attributes) either used in the runtime or special UDA's recognized by compiler.

Attribute Name, Linkage, Description

gnuAbiTag, C++, Declares an ABI tag on a C++ symbol. mustuse,, Ensures that values of a struct or union type are not discarded. optional, Objective-C, Makes an Objective-C interface method optional. selector, Objective-C, Attaches an Objective-C selector to a method. standalone,, Marks a shared module constructor as not depending on any other module constructor being run first. weak,, Specifies that a global symbol should be emitted with weak linkage.

Source

core/attribute.d

@copyrightCopyright Jacob Carlborg 2015.@licenseBoost License 1.0@authorsJacob Carlborg
attribute
: selector;
module `core.attribute` import `selector` not found
import
(package) core
core
.
(package) core.stdc
stdc
.
(module) core.stdc.stdio

D header file for C99 <stdio.h>

pubs.opengroup.org/onlinepubs/009695399/basedefs/stdio.h.html, stdio.h

Source

core/stdc/stdio.d

@copyrightCopyright Sean Kelly 2005 - 2009.@licenseDistributed under the Boost Software License 1.0. (See accompanying file LICENSE)@authorsSean Kelly, Alex Rønne Petersen@standardsISO/IEC 9899:1999 (E)
stdio
:
(alias) app.printf = int core.stdc.stdio.printf(scope const(char*) format, scope const ...) nothrow @nogc
printf
;
import
(package) core
core
.
(package) core.stdc
stdc
.
(module) core.stdc.stdlib

D header file for C99.

pubs.opengroup.org/onlinepubs/009695399/basedefs/stdlib.h.html, stdlib.h

Source

core/stdc/stdlib.d

@copyrightCopyright Sean Kelly 2005 - 2014.@licenseDistributed under the Boost Software License 1.0. (See accompanying file LICENSE)@authorsSean Kelly@standardsISO/IEC 9899:1999 (E)
stdlib
:
(alias) app.getenv = char* core.stdc.stdlib.getenv(scope const(char*) name) nothrow @nogc
getenv
;
import instrument : instr, instrInit;
unable to read module `instrument` Expected 'instrument.d' or 'instrument/package.d' in one of the following import paths:
unable to read module `instrument` Expected 'instrument.d' or 'instrument/package.d' in one of the following import paths:
unable to read module `instrument` Expected 'instrument.d' or 'instrument/package.d' in one of the following import paths:
import objc.autorelease : autoreleasepool_push, autoreleasepool_pop; // objective-d
unable to read module `autorelease` Expected 'objc/autorelease.d' or 'objc/autorelease/package.d' in one of the following import paths:
unable to read module `autorelease` Expected 'objc/autorelease.d' or 'objc/autorelease/package.d' in one of the following import paths:
unable to read module `autorelease` Expected 'objc/autorelease.d' or 'objc/autorelease/package.d' in one of the following import paths:
import objc.rt : SEL;
unable to read module `rt` Expected 'objc/rt.d' or 'objc/rt/package.d' in one of the following import paths:
unable to read module `rt` Expected 'objc/rt.d' or 'objc/rt/package.d' in one of the following import paths:
unable to read module `rt` Expected 'objc/rt.d' or 'objc/rt/package.d' in one of the following import paths:
// --- C-level declarations --------------------------------------------------------- extern (C) struct
(struct) app.NSPoint
NSPoint
{ double
(field) double app.NSPoint.x
x
,
(field) double app.NSPoint.y
y
;
} extern (C) struct
(struct) app.NSSize
NSSize
{ double
(field) double app.NSSize.width
width
,
(field) double app.NSSize.height
height
;
} extern (C) struct
(struct) app.NSRect
NSRect
{
(struct) app.NSPoint
NSPoint
(field) app.NSPoint app.NSRect.origin
origin
;
(struct) app.NSSize
NSSize
(field) app.NSSize app.NSRect.size
size
;
} extern (C) nothrow @nogc { uint
uint app.CGMainDisplayID() nothrow @nogc
CGMainDisplayID
();
int
int app.CGGetOnlineDisplayList(uint maxDisplays, uint* displays, uint* count) nothrow @nogc
CGGetOnlineDisplayList
(uint
(parameter) uint maxDisplays
maxDisplays
, uint*
(parameter) uint* displays
displays
, uint*
(parameter) uint* count
count
);
int
int app.CGGetActiveDisplayList(uint maxDisplays, uint* displays, uint* count) nothrow @nogc
CGGetActiveDisplayList
(uint
(parameter) uint maxDisplays
maxDisplays
, uint*
(parameter) uint* displays
displays
, uint*
(parameter) uint* count
count
);
(struct) app.NSRect
NSRect
app.NSRect app.CGDisplayBounds(uint display) nothrow @nogc
CGDisplayBounds
(uint
(parameter) uint display
display
); // CGRect, top-left-origin global space
(alias) object.size_t = ulong
size_t
ulong app.CGDisplayPixelsWide(uint display) nothrow @nogc
CGDisplayPixelsWide
(uint
(parameter) uint display
display
);
(alias) object.size_t = ulong
size_t
ulong app.CGDisplayPixelsHigh(uint display) nothrow @nogc
CGDisplayPixelsHigh
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayVendorNumber(uint display) nothrow @nogc
CGDisplayVendorNumber
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayModelNumber(uint display) nothrow @nogc
CGDisplayModelNumber
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplaySerialNumber(uint display) nothrow @nogc
CGDisplaySerialNumber
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayIsBuiltin(uint display) nothrow @nogc
CGDisplayIsBuiltin
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayIsMain(uint display) nothrow @nogc
CGDisplayIsMain
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayIsActive(uint display) nothrow @nogc
CGDisplayIsActive
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayIsOnline(uint display) nothrow @nogc
CGDisplayIsOnline
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayIsAsleep(uint display) nothrow @nogc
CGDisplayIsAsleep
(uint
(parameter) uint display
display
);
uint
uint app.CGDisplayIsInMirrorSet(uint display) nothrow @nogc
CGDisplayIsInMirrorSet
(uint
(parameter) uint display
display
);
(struct) app.NSSize
NSSize
app.NSSize app.CGDisplayScreenSize(uint display) nothrow @nogc
CGDisplayScreenSize
(uint
(parameter) uint display
display
); // physical size in millimetres
void*
void* app.CGDisplayCopyDisplayMode(uint display) nothrow @nogc
CGDisplayCopyDisplayMode
(uint
(parameter) uint display
display
);
(alias) object.size_t = ulong
size_t
ulong app.CGDisplayModeGetWidth(void* mode) nothrow @nogc
CGDisplayModeGetWidth
(void*
(parameter) void* mode
mode
); // points
(alias) object.size_t = ulong
size_t
ulong app.CGDisplayModeGetHeight(void* mode) nothrow @nogc
CGDisplayModeGetHeight
(void*
(parameter) void* mode
mode
);
(alias) object.size_t = ulong
size_t
ulong app.CGDisplayModeGetPixelWidth(void* mode) nothrow @nogc
CGDisplayModeGetPixelWidth
(void*
(parameter) void* mode
mode
); // pixels
(alias) object.size_t = ulong
size_t
ulong app.CGDisplayModeGetPixelHeight(void* mode) nothrow @nogc
CGDisplayModeGetPixelHeight
(void*
(parameter) void* mode
mode
);
double
double app.CGDisplayModeGetRefreshRate(void* mode) nothrow @nogc
CGDisplayModeGetRefreshRate
(void*
(parameter) void* mode
mode
);
void
void app.CGDisplayModeRelease(void* mode) nothrow @nogc
CGDisplayModeRelease
(void*
(parameter) void* mode
mode
);
void
void app.CGContextSetRGBFillColor(void* ctx, double r, double g, double b, double a) nothrow @nogc
CGContextSetRGBFillColor
(void*
(parameter) void* ctx
ctx
, double
(parameter) double r
r
, double
(parameter) double g
g
, double
(parameter) double b
b
, double
(parameter) double a
a
);
void
void app.CGContextFillRect(void* ctx, app.NSRect rect) nothrow @nogc
CGContextFillRect
(void*
(parameter) void* ctx
ctx
,
(struct) app.NSRect
NSRect
(parameter) app.NSRect rect
rect
);
// AppKit-exported notification-name constants (NSString*). extern __gshared void*
(__gshared global) void* app.NSApplicationDidChangeScreenParametersNotification
NSApplicationDidChangeScreenParametersNotification
;
extern __gshared void*
(__gshared global) void* app.NSWindowDidChangeScreenNotification
NSWindowDidChangeScreenNotification
;
} // Declared outside the @nogc block above: the callback logs (fprintf is not @nogc). extern (C) nothrow { alias
(alias) app.CGDisplayReconfigurationCallBack = extern (C) void function(uint display, uint flags, void* userInfo) nothrow
CGDisplayReconfigurationCallBack
=
void function(uint
(parameter) uint display
display
, uint
(parameter) uint flags
flags
, void*
(parameter) void* userInfo
userInfo
) nothrow;
int
int app.CGDisplayRegisterReconfigurationCallback(extern (C) void function(uint display, uint flags, void* userInfo) nothrow callback, void* userInfo) nothrow
CGDisplayRegisterReconfigurationCallback
(
(alias) app.CGDisplayReconfigurationCallBack = extern (C) void function(uint display, uint flags, void* userInfo) nothrow
CGDisplayReconfigurationCallBack
(parameter) extern (C) void function(uint display, uint flags, void* userInfo) nothrow callback
callback
, void*
(parameter) void* userInfo
userInfo
);
} // CGDisplayChangeSummaryFlags bits (CGDisplayConfiguration.h). enum : uint {
(enum value) app.kCGDisplayBeginConfigurationFlag = 1u
kCGDisplayBeginConfigurationFlag
= 1 << 0,
(enum value) app.kCGDisplayMovedFlag = 2u
kCGDisplayMovedFlag
= 1 << 1,
(enum value) app.kCGDisplaySetMainFlag = 4u
kCGDisplaySetMainFlag
= 1 << 2,
(enum value) app.kCGDisplaySetModeFlag = 8u
kCGDisplaySetModeFlag
= 1 << 3,
(enum value) app.kCGDisplayAddFlag = 16u
kCGDisplayAddFlag
= 1 << 4,
(enum value) app.kCGDisplayRemoveFlag = 32u
kCGDisplayRemoveFlag
= 1 << 5,
(enum value) app.kCGDisplayEnabledFlag = 256u
kCGDisplayEnabledFlag
= 1 << 8,
(enum value) app.kCGDisplayDisabledFlag = 512u
kCGDisplayDisabledFlag
= 1 << 9,
(enum value) app.kCGDisplayMirrorFlag = 1024u
kCGDisplayMirrorFlag
= 1 << 10,
(enum value) app.kCGDisplayUnMirrorFlag = 2048u
kCGDisplayUnMirrorFlag
= 1 << 11,
(enum value) app.kCGDisplayDesktopShapeChangedFlag = 4096u
kCGDisplayDesktopShapeChangedFlag
= 1 << 12,
} // The reconfiguration callback fires twice per change (begin + after) per display. // Headless expectation: never — the registration + the static answer is the // deliverable; counting proves it. extern (C) void
void app.displayReconfigCb(uint display, uint flags, void* userInfo) nothrow
displayReconfigCb
(uint
(parameter) uint display
display
, uint
(parameter) uint flags
flags
, void*
(parameter) void* userInfo
userInfo
) nothrow
{ ++
(__gshared global) int app.g_reconfigCalls
g_reconfigCalls
;
try instr("cg_reconfig", "id=%u flags=0x%x begin=%d add=%d remove=%d set_mode=%d", display, flags, (flags & kCGDisplayBeginConfigurationFlag) != 0, (flags & kCGDisplayAddFlag) != 0, (flags & kCGDisplayRemoveFlag) != 0, (flags & kCGDisplaySetModeFlag) != 0); catch (
(class) object.Exception

The base class of all errors that are safe to catch and handle.

In principle, only thrown objects derived from this class are safe to catch inside a catch block. Thrown objects not derived from Exception represent runtime errors that should not be caught, as certain runtime guarantees may not hold, making it unsafe to continue program execution.

Examples

bool gotCaught;
try
{
    throw new Exception("msg");
}
catch (Exception e)
{
    gotCaught = true;
    assert(e.msg == "msg");
}
assert(gotCaught);
Exception
)
{ } } // --- AppKit class declarations ---------------------------------------------------- extern (Objective-C): extern class
(class) app.NSObject
NSObject
class `app.NSObject` Objective-C classes not supported
{ } extern class
(class) app.NSString
NSString
:
(class) app.NSObject
NSObject
class `app.NSString` Objective-C classes not supported
{ static
(class) app.NSString
NSString
app.NSString app.NSString.alloc()
alloc
() @selector("alloc");
(class) app.NSString
NSString
app.NSString app.NSString.initWithUTF8String(const(char)* s)
initWithUTF8String
(const(char)*
(parameter) const(char)* s
s
) @selector("initWithUTF8String:");
const(char)*
const(char)* app.NSString.UTF8String()
UTF8String
() @selector("UTF8String");
} extern class
(class) app.NSArray
NSArray
:
(class) app.NSObject
NSObject
class `app.NSArray` Objective-C classes not supported
{ ulong
ulong app.NSArray.count()
count
() @selector("count");
(class) app.NSObject
NSObject
app.NSObject app.NSArray.objectAtIndex(ulong index)
objectAtIndex
(ulong
(parameter) ulong index
index
) @selector("objectAtIndex:");
} extern class
(class) app.NSNumber
NSNumber
:
(class) app.NSObject
NSObject
class `app.NSNumber` Objective-C classes not supported
{ uint
uint app.NSNumber.unsignedIntValue()
unsignedIntValue
() @selector("unsignedIntValue");
} extern class
(class) app.NSValue
NSValue
:
(class) app.NSObject
NSObject
class `app.NSValue` Objective-C classes not supported
{
(struct) app.NSSize
NSSize
app.NSSize app.NSValue.sizeValue()
sizeValue
() @selector("sizeValue");
} extern class
(class) app.NSDictionary
NSDictionary
:
(class) app.NSObject
NSObject
class `app.NSDictionary` Objective-C classes not supported
{
(class) app.NSObject
NSObject
app.NSObject app.NSDictionary.objectForKey(app.NSObject key)
objectForKey
(
(class) app.NSObject
NSObject
(parameter) app.NSObject key
key
) @selector("objectForKey:");
} extern class
(class) app.NSNotification
NSNotification
:
(class) app.NSObject
NSObject
class `app.NSNotification` Objective-C classes not supported
{ } extern class
(class) app.NSNotificationCenter
NSNotificationCenter
:
(class) app.NSObject
NSObject
class `app.NSNotificationCenter` Objective-C classes not supported
{ static
(class) app.NSNotificationCenter
NSNotificationCenter
app.NSNotificationCenter app.NSNotificationCenter.defaultCenter()
defaultCenter
() @selector("defaultCenter");
void
app.NSNotificationCenter.addObserver
addObserver
(
(class) app.NSObject
NSObject
observer, SEL sel,
(class) app.NSObject
NSObject
(parameter) NSObject name
name
,
(class) app.NSObject
NSObject
(parameter) NSObject obj
obj
)
@selector("addObserver:selector:name:object:"); void
void app.NSNotificationCenter.postNotificationName(app.NSObject name, app.NSObject obj)
postNotificationName
(
(class) app.NSObject
NSObject
(parameter) app.NSObject name
name
,
(class) app.NSObject
NSObject
(parameter) app.NSObject obj
obj
)
@selector("postNotificationName:object:"); } extern class
(class) app.NSScreen
NSScreen
:
(class) app.NSObject
NSObject
class `app.NSScreen` Objective-C classes not supported
{ static
(class) app.NSArray
NSArray
app.NSArray app.NSScreen.screens()
screens
() @selector("screens");
static
(class) app.NSScreen
NSScreen
app.NSScreen app.NSScreen.mainScreen()
mainScreen
() @selector("mainScreen");
(struct) app.NSRect
NSRect
app.NSRect app.NSScreen.frame()
frame
() @selector("frame");
(struct) app.NSRect
NSRect
app.NSRect app.NSScreen.visibleFrame()
visibleFrame
() @selector("visibleFrame");
double
double app.NSScreen.backingScaleFactor()
backingScaleFactor
() @selector("backingScaleFactor");
(class) app.NSString
NSString
app.NSString app.NSScreen.localizedName()
localizedName
() @selector("localizedName");
long
long app.NSScreen.maximumFramesPerSecond()
maximumFramesPerSecond
() @selector("maximumFramesPerSecond");
(class) app.NSDictionary
NSDictionary
app.NSDictionary app.NSScreen.deviceDescription()
deviceDescription
() @selector("deviceDescription");
} extern class
(class) app.NSResponder
NSResponder
:
(class) app.NSObject
NSObject
class `app.NSResponder` Objective-C classes not supported
{ } extern class
(class) app.NSEvent
NSEvent
:
(class) app.NSObject
NSObject
class `app.NSEvent` Objective-C classes not supported
{ static
(class) app.NSEvent
NSEvent
app.NSEvent app.NSEvent.otherEventWithType(long type, app.NSPoint location, ulong modifierFlags, double timestamp, long windowNumber, app.NSObject context, short subtype, long data1, long data2)
otherEventWithType
(long
(parameter) long type
type
,
(struct) app.NSPoint
NSPoint
(parameter) app.NSPoint location
location
, ulong
(parameter) ulong modifierFlags
modifierFlags
,
double
(parameter) double timestamp
timestamp
, long
(parameter) long windowNumber
windowNumber
,
(class) app.NSObject
NSObject
(parameter) app.NSObject context
context
, short
(parameter) short subtype
subtype
,
long
(parameter) long data1
data1
, long
(parameter) long data2
data2
)
@selector("otherEventWithType:location:modifierFlags:timestamp:windowNumber:context:subtype:data1:data2:"); } extern class
(class) app.NSTimer
NSTimer
:
(class) app.NSObject
NSObject
class `app.NSTimer` Objective-C classes not supported
{ static
(class) app.NSTimer
NSTimer
app.NSTimer.scheduledTimerWithTimeInterval
scheduledTimerWithTimeInterval
(double interval,
(class) app.NSObject
NSObject
target,
SEL sel,
(class) app.NSObject
NSObject
(parameter) NSObject userInfo
userInfo
, bool repeats)
@selector("scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:"); } extern class
(class) app.NSGraphicsContext
NSGraphicsContext
:
(class) app.NSObject
NSObject
class `app.NSGraphicsContext` Objective-C classes not supported
{ static
(class) app.NSGraphicsContext
NSGraphicsContext
app.NSGraphicsContext app.NSGraphicsContext.currentContext()
currentContext
() @selector("currentContext");
void*
void* app.NSGraphicsContext.CGContext()
CGContext
() @selector("CGContext");
} extern class
(class) app.NSApplication
NSApplication
:
(class) app.NSResponder
NSResponder
class `app.NSApplication` Objective-C classes not supported
{ static
(class) app.NSApplication
NSApplication
app.NSApplication app.NSApplication.sharedApplication()
sharedApplication
() @selector("sharedApplication");
void
void app.NSApplication.setActivationPolicy(long policy)
setActivationPolicy
(long
(parameter) long policy
policy
) @selector("setActivationPolicy:");
void
void app.NSApplication.run()
run
() @selector("run");
void
void app.NSApplication.stop(app.NSObject sender)
stop
(
(class) app.NSObject
NSObject
(parameter) app.NSObject sender
sender
) @selector("stop:");
void
void app.NSApplication.postEvent(app.NSEvent event, bool atStart)
postEvent
(
(class) app.NSEvent
NSEvent
(parameter) app.NSEvent event
event
, bool
(parameter) bool atStart
atStart
) @selector("postEvent:atStart:");
} extern class
(class) app.NSView
NSView
:
(class) app.NSResponder
NSResponder
class `app.NSView` Objective-C classes not supported
{
(struct) app.NSRect
NSRect
app.NSRect app.NSView.bounds()
bounds
() @selector("bounds");
} extern class
(class) app.NSWindow
NSWindow
:
(class) app.NSResponder
NSResponder
class `app.NSWindow` Objective-C classes not supported
{ static
(class) app.NSWindow
NSWindow
app.NSWindow app.NSWindow.alloc()
alloc
() @selector("alloc");
(class) app.NSWindow
NSWindow
app.NSWindow app.NSWindow.initWithContentRect(app.NSRect contentRect, ulong styleMask, ulong backing, bool defer)
initWithContentRect
(
(struct) app.NSRect
NSRect
(parameter) app.NSRect contentRect
contentRect
, ulong
(parameter) ulong styleMask
styleMask
,
ulong
(parameter) ulong backing
backing
, bool
(parameter) bool defer
defer
) @selector("initWithContentRect:styleMask:backing:defer:");
void
void app.NSWindow.setTitle(app.NSString title)
setTitle
(
(class) app.NSString
NSString
(parameter) app.NSString title
title
) @selector("setTitle:");
void
void app.NSWindow.setContentView(app.NSView view)
setContentView
(
(class) app.NSView
NSView
(parameter) app.NSView view
view
) @selector("setContentView:");
void
void app.NSWindow.setDelegate(app.NSObject anObject)
setDelegate
(
(class) app.NSObject
NSObject
(parameter) app.NSObject anObject
anObject
) @selector("setDelegate:");
void
void app.NSWindow.makeKeyAndOrderFront(app.NSObject sender)
makeKeyAndOrderFront
(
(class) app.NSObject
NSObject
(parameter) app.NSObject sender
sender
) @selector("makeKeyAndOrderFront:");
(struct) app.NSRect
NSRect
app.NSRect app.NSWindow.frame()
frame
() @selector("frame");
(class) app.NSScreen
NSScreen
app.NSScreen app.NSWindow.screen()
screen
() @selector("screen");
} // The instrumented view: flat fill + notification handlers + the tick schedule. class
(class) app.OutputView
OutputView
:
(class) app.NSView
NSView
class `app.OutputView` Objective-C classes not supported
{ static
(class) app.OutputView
OutputView
app.OutputView app.OutputView.alloc()
alloc
() @selector("alloc");
(class) app.OutputView
OutputView
app.OutputView app.OutputView.initWithFrame(app.NSRect frame)
initWithFrame
(
(struct) app.NSRect
NSRect
(parameter) app.NSRect frame
frame
) @selector("initWithFrame:");
void
void app.OutputView.drawRect(app.NSRect dirtyRect)
drawRect
(
(struct) app.NSRect
NSRect
(parameter) app.NSRect dirtyRect
dirtyRect
) @selector("drawRect:")
{ void*
_error_ ctx
ctx
= NSGraphicsContext.
NSGraphicsContext.currentContext
currentContext
().
NSGraphicsContext.currentContext().CGContext
CGContext
();
CGContextSetRGBFillColor(ctx, 0.15, 0.3, 0.5, 1); CGContextFillRect(ctx, this.
this.bounds
bounds
());
} void
void app.OutputView.tick(app.NSTimer timer)
tick
(
(class) app.NSTimer
NSTimer
(parameter) app.NSTimer timer
timer
) @selector("tick:")
{ onTick(); } // App-level: display configuration changed — re-enumerate everything. void
void app.OutputView.screenParamsChanged(app.NSNotification n)
screenParamsChanged
(
(class) app.NSNotification
NSNotification
(parameter) app.NSNotification n
n
) @selector("screenParamsChanged:")
{ ++g_screenParamsEvents; instr("screen_params_changed", "n=%d", g_screenParamsEvents); logNSScreens("notification"); } // Window-level: THIS window moved to a different screen. void
void app.OutputView.windowScreenChanged(app.NSNotification n)
windowScreenChanged
(
(class) app.NSNotification
NSNotification
(parameter) app.NSNotification n
n
) @selector("windowScreenChanged:")
{ ++g_windowScreenEvents; instr("window_screen_changed", "n=%d", g_windowScreenEvents); logWindowScreen("notification"); } void
void app.OutputView.windowWillClose(app.NSObject notification)
windowWillClose
(
(class) app.NSObject
NSObject
(parameter) app.NSObject notification
notification
) @selector("windowWillClose:")
{ instr("close_requested"); g_app.
g_app.stop
stop
(null);
} } extern (D): // back to D linkage enum
(constant) int app.NSApplicationActivationPolicyRegular = 0
NSApplicationActivationPolicyRegular
= 0;
enum : ulong {
(enum value) app.NSWindowStyleMaskTitled = 1LU
NSWindowStyleMaskTitled
= 1,
(enum value) app.NSWindowStyleMaskClosable = 2LU
NSWindowStyleMaskClosable
= 2,
(enum value) app.NSWindowStyleMaskResizable = 8LU
NSWindowStyleMaskResizable
= 8,
} enum ulong
(constant) ulong app.NSBackingStoreBuffered = 2LU
NSBackingStoreBuffered
= 2;
enum long
(constant) long app.NSEventTypeApplicationDefined = 15L
NSEventTypeApplicationDefined
= 15;
enum
(constant) int app.maxDisplays = 16
maxDisplays
= 16;
// --- Demo state -------------------------------------------------------------------- __gshared
(class) app.NSApplication
NSApplication
(__gshared global) app.NSApplication app.g_app
g_app
;
__gshared
(class) app.NSWindow
NSWindow
(__gshared global) app.NSWindow app.g_win
g_win
;
__gshared int
(__gshared global) int app.g_tick
g_tick
,
(__gshared global) int app.g_reconfigCalls
g_reconfigCalls
,
(__gshared global) int app.g_screenParamsEvents
g_screenParamsEvents
,
(__gshared global) int app.g_windowScreenEvents
g_windowScreenEvents
;
__gshared bool
(__gshared global) bool app.g_auto
g_auto
,
(__gshared global) bool app.g_stopRequested
g_stopRequested
;
__gshared uint
(__gshared global) uint app.g_startupActive
g_startupActive
,
(__gshared global) uint app.g_startupOnline
g_startupOnline
; // startup counts for the late diff
// Schedule (ticks of a ~16 ms timer). enum
(constant) int app.windowScreenTick = 10
windowScreenTick
= 10;
enum
(constant) int app.reEnumTick = 20
reEnumTick
= 20;
enum
(constant) int app.selftestTick = 30
selftestTick
= 30;
enum
(constant) int app.autoExitTick = 45
autoExitTick
= 45;
(class) app.NSString
NSString
app.NSString app.nsstr(const(char)* s)
nsstr
(const(char)*
(parameter) const(char)* s
s
)
{ return NSString.
NSString.alloc
alloc
().
NSString.alloc().initWithUTF8String
initWithUTF8String
(s);
} // The bridge key: -[NSScreen deviceDescription][@"NSScreenNumber"] IS the // CGDirectDisplayID, boxed in an NSNumber. uint
uint app.screenNumber(app.NSScreen s)
screenNumber
(
(class) app.NSScreen
NSScreen
(parameter) app.NSScreen s
s
)
{
(unresolved type) NSDictionary
NSDictionary
_error_ dd
dd
= s.
s.deviceDescription
deviceDescription
();
auto
_error_ num
num
= cast(
(unresolved type) NSNumber
NSNumber
) dd.
dd.objectForKey
objectForKey
(cast(
(unresolved type) NSObject
NSObject
) nsstr("NSScreenNumber"));
return num !is null ? num.
num.unsignedIntValue
unsignedIntValue
() : 0;
} // --- CG-side enumeration (pixels, top-left-origin, modes) -------------------------- uint[2]
uint[2] app.logCGDisplays(const(char)* when)
logCGDisplays
(const(char)*
(parameter) const(char)* when
when
)
{ uint[
(unresolved type) maxDisplays
maxDisplays
]
_error_ online
online
,
_error_ active
active
;
uint
_error_ nOnline
nOnline
,
_error_ nActive
nActive
;
CGGetOnlineDisplayList(maxDisplays, online.ptr, &nOnline); CGGetActiveDisplayList(maxDisplays, active.ptr, &nActive); instr("cg_displays", "when=%s online=%u active=%u", when, nOnline, nActive); // Iterate the ONLINE list: in a locked session the ACTIVE list can be empty // (drawable-desktop displays only) while the hardware is still online. foreach (
(parameter) i
i
; 0 .. nOnline)
{ immutable
_error_ id
id
= online[i];
immutable
_error_ b
b
= CGDisplayBounds(id);
immutable
_error_ mm
mm
= CGDisplayScreenSize(id);
instr("output", "api=cg id=%u bounds=(%.0f,%.0f %.0fx%.0f) px=%zux%zu mm=%.0fx%.0f " ~ "vendor=0x%x model=0x%x serial=0x%x builtin=%u main=%u " ~ "active=%u online=%u asleep=%u mirror=%u", id, b.
b.origin
origin
.
b.origin.x
x
, b.
b.origin
origin
.
b.origin.y
y
, b.
b.size
size
.
b.size.width
width
, b.
b.size
size
.
b.size.height
height
,
CGDisplayPixelsWide(id), CGDisplayPixelsHigh(id), mm.
mm.width
width
, mm.
mm.height
height
,
CGDisplayVendorNumber(id), CGDisplayModelNumber(id), CGDisplaySerialNumber(id), CGDisplayIsBuiltin(id), CGDisplayIsMain(id), CGDisplayIsActive(id), CGDisplayIsOnline(id), CGDisplayIsAsleep(id), CGDisplayIsInMirrorSet(id)); void*
_error_ mode
mode
= CGDisplayCopyDisplayMode(id);
if (mode !is null) { instr("output_mode", "api=cg id=%u mode_pt=%zux%zu mode_px=%zux%zu refresh=%.2f", id, CGDisplayModeGetWidth(mode), CGDisplayModeGetHeight(mode), CGDisplayModeGetPixelWidth(mode), CGDisplayModeGetPixelHeight(mode), CGDisplayModeGetRefreshRate(mode)); CGDisplayModeRelease(mode); } else instr("output_mode", "api=cg id=%u mode=nil", id); } return [nActive, nOnline]; } // --- NSScreen-side enumeration (points, y-up, per-screen scale) -------------------- void
void app.logNSScreens(const(char)* when)
logNSScreens
(const(char)*
(parameter) const(char)* when
when
)
{
(unresolved type) NSArray
NSArray
_error_ screens
screens
= NSScreen.
NSScreen.screens
screens
();
immutable
_error_ n
n
= screens !is null ? screens.
screens.count
count
() : 0;
instr("ns_screens", "when=%s count=%llu", when, n); foreach (
(parameter) i
i
; 0 .. n)
{ auto
_error_ s
s
= cast(
(unresolved type) NSScreen
NSScreen
) screens.
screens.objectAtIndex
objectAtIndex
(i);
immutable
_error_ f
f
= s.
s.frame
frame
();
immutable
_error_ v
v
= s.
s.visibleFrame
visibleFrame
();
(unresolved type) NSString
NSString
_error_ name
name
= s.
s.localizedName
localizedName
();
instr("output", "api=appkit idx=%llu id=%u frame=(%.0f,%.0f %.0fx%.0f) " ~ "visible=(%.0f,%.0f %.0fx%.0f) scale=%.1f max_fps=%ld name=\"%s\"", i, screenNumber(s), f.
f.origin
origin
.
f.origin.x
x
, f.
f.origin
origin
.
f.origin.y
y
, f.
f.size
size
.
f.size.width
width
, f.
f.size
size
.
f.size.height
height
,
v.
v.origin
origin
.
v.origin.x
x
, v.
v.origin
origin
.
v.origin.y
y
, v.
v.size
size
.
v.size.width
width
, v.
v.size
size
.
v.size.height
height
,
s.
s.backingScaleFactor
backingScaleFactor
(), s.
s.maximumFramesPerSecond
maximumFramesPerSecond
(),
name !is null ? name.
name.UTF8String
UTF8String
() : "");
// The frame/visibleFrame split: menubar shaves the top, the Dock the bottom. instr("output_insets", "api=appkit id=%u menubar_pt=%.0f dock_pt=%.0f side_pt=%.0f", screenNumber(s), (f.
f.origin
origin
.
f.origin.y
y
+ f.
f.size
size
.
f.size.height
height
) - (v.
v.origin
origin
.
v.origin.y
y
+ v.
v.size
size
.
v.size.height
height
),
v.
v.origin
origin
.
v.origin.y
y
- f.
f.origin
origin
.
f.origin.y
y
, v.
v.origin
origin
.
v.origin.x
x
- f.
f.origin
origin
.
f.origin.x
x
);
// deviceDescription extras: NSDeviceSize (points) + NSDeviceResolution (dpi).
(unresolved type) NSDictionary
NSDictionary
_error_ dd
dd
= s.
s.deviceDescription
deviceDescription
();
auto
_error_ devSize
devSize
= cast(
(unresolved type) NSValue
NSValue
) dd.
dd.objectForKey
objectForKey
(cast(
(unresolved type) NSObject
NSObject
) nsstr("NSDeviceSize"));
auto
_error_ devRes
devRes
= cast(
(unresolved type) NSValue
NSValue
) dd.
dd.objectForKey
objectForKey
(cast(
(unresolved type) NSObject
NSObject
) nsstr("NSDeviceResolution"));
if (devSize !is null && devRes !is null) { immutable
_error_ sz
sz
= devSize.
devSize.sizeValue
sizeValue
();
immutable
_error_ res
res
= devRes.
devRes.sizeValue
sizeValue
();
instr("output_device", "api=appkit id=%u device_size_pt=%.0fx%.0f device_dpi=%.0fx%.0f", screenNumber(s), sz.
sz.width
width
, sz.
sz.height
height
, res.
res.width
width
, res.
res.height
height
);
} } } // The NSScreenNumber <-> CGDirectDisplayID bridge, checked both ways. void
void app.logBridge()
logBridge
()
{ uint[
(unresolved type) maxDisplays
maxDisplays
]
_error_ online
online
,
_error_ active
active
;
uint
_error_ nOnline
nOnline
,
_error_ nActive
nActive
;
CGGetOnlineDisplayList(maxDisplays, online.ptr, &nOnline); CGGetActiveDisplayList(maxDisplays, active.ptr, &nActive);
(unresolved type) NSArray
NSArray
_error_ screens
screens
= NSScreen.
NSScreen.screens
screens
();
immutable
_error_ n
n
= screens !is null ? screens.
screens.count
count
() : 0;
foreach (
(parameter) i
i
; 0 .. n)
{ auto
_error_ s
s
= cast(
(unresolved type) NSScreen
NSScreen
) screens.
screens.objectAtIndex
objectAtIndex
(i);
immutable
_error_ id
id
= screenNumber(s);
bool
_error_ foundActive
foundActive
= false,
_error_ foundOnline
foundOnline
= false;
foreach (
(parameter) j
j
; 0 .. nActive)
foundActive |= active[j] == id; foreach (
(parameter) j
j
; 0 .. nOnline)
foundOnline |= online[j] == id; instr("bridge", "nsscreen_idx=%llu nsscreen_number=%u in_cg_online_list=%d " ~ "in_cg_active_list=%d px_check=%zux%zu", i, id, foundOnline ? 1 : 0, foundActive ? 1 : 0, CGDisplayPixelsWide(id), CGDisplayPixelsHigh(id)); } } // Which screen is the window on? AppKit answers directly — no derivation needed. void
void app.logWindowScreen(const(char)* when)
logWindowScreen
(const(char)*
(parameter) const(char)* when
when
)
{
(unresolved type) NSScreen
NSScreen
_error_ s
s
= g_win.
g_win.screen
screen
();
immutable
_error_ f
f
= g_win.
g_win.frame
frame
();
if (s is null) { instr("window_screen", "when=%s screen=nil note=offscreen_window", when); return; }
(unresolved type) NSString
NSString
_error_ name
name
= s.
s.localizedName
localizedName
();
instr("window_screen", "when=%s id=%u name=\"%s\" window_frame=(%.0f,%.0f %.0fx%.0f) " ~ "api=window.screen derived=no", when, screenNumber(s), name !is null ? name.
name.UTF8String
UTF8String
() : "",
f.
f.origin
origin
.
f.origin.x
x
, f.
f.origin
origin
.
f.origin.y
y
, f.
f.size
size
.
f.size.width
width
, f.
f.size
size
.
f.size.height
height
);
} void
void app.onTick()
onTick
()
{ ++g_tick; if (!g_auto) return; // interactive mode: keep the window up for a manual plug/unplug if (g_tick == windowScreenTick) { instr("step", "name=window_screen_steady"); logWindowScreen("steady"); } else if (g_tick == reEnumTick) { // The headless probe: does the locked session itself ever change the lists? instr("step", "name=re_enumerate note=locked_session_diff"); immutable
_error_ counts
counts
= logCGDisplays("re_enum");
logNSScreens("re_enum"); instr("hotplug_probe", "active_delta=%d online_delta=%d reconfig_cb_calls=%d " ~ "note=locked_session_static", cast(int) counts[0] - cast(int) g_startupActive, cast(int) counts[1] - cast(int) g_startupOnline, g_reconfigCalls); } else if (g_tick == selftestTick) { // Prove the NSNotification wiring (nothing fires it headless): post both by hand. instr("step", "name=post_notifications note=selftest");
(unresolved type) NSNotificationCenter
NSNotificationCenter
_error_ nc
nc
= NSNotificationCenter.
NSNotificationCenter.defaultCenter
defaultCenter
();
nc.
nc.postNotificationName
postNotificationName
(
cast(
(unresolved type) NSObject
NSObject
) NSApplicationDidChangeScreenParametersNotification, null);
nc.
nc.postNotificationName
postNotificationName
(
cast(
(unresolved type) NSObject
NSObject
) NSWindowDidChangeScreenNotification, cast(
(unresolved type) NSObject
NSObject
) g_win);
} else if (g_tick >= autoExitTick && !g_stopRequested) { g_stopRequested = true; instr("step", "name=NSApp_stop tick=%d", g_tick); g_app.
g_app.stop
stop
(null);
(unresolved type) NSEvent
NSEvent
_error_ ev
ev
= NSEvent.
NSEvent.otherEventWithType
otherEventWithType
(NSEventTypeApplicationDefined,
NSPoint(0, 0), 0, 0, 0, null, 0, 0, 0); g_app.
g_app.postEvent
postEvent
(ev, true); // stop: needs an event dispatch to take effect
} } int
int D main()
main
()
{ g_auto = getenv("WSI_AUTO_EXIT") !is null; instrInit("APPKIT_F09"); instr("init_start", "auto_exit=%d", g_auto ? 1 : 0); if (CGMainDisplayID() == 0) { printf("SKIP: no macOS window server (CGMainDisplayID == 0)\n"); return 0; } auto
_error_ pool
pool
= autoreleasepool_push();
scope (exit) autoreleasepool_pop(pool); // CG enumeration FIRST — before NSApplication.sharedApplication() even exists. // CoreGraphics enumeration needs only the WindowServer connection, no app object, // no window: it is global. (NSScreen is AppKit, so it waits for the app below.) instr("step", "name=cg_enumeration note=pre_NSApplication main_id=%u", CGMainDisplayID()); immutable
_error_ counts
counts
= logCGDisplays("startup");
g_startupActive = counts[0]; g_startupOnline = counts[1]; // Hotplug/reconfiguration callback — also app-object-free, registered pre-AppKit. immutable
_error_ cbErr
cbErr
= CGDisplayRegisterReconfigurationCallback(&displayReconfigCb, null);
instr("step", "name=CGDisplayRegisterReconfigurationCallback err=%d", cbErr); g_app = NSApplication.
NSApplication.sharedApplication
sharedApplication
();
g_app.
g_app.setActivationPolicy
setActivationPolicy
(NSApplicationActivationPolicyRegular);
logNSScreens("startup"); logBridge(); immutable
_error_ contentRect
contentRect
= NSRect(NSPoint(120, 120), NSSize(480, 320));
g_win = NSWindow.
NSWindow.alloc
alloc
().
NSWindow.alloc().initWithContentRect
initWithContentRect
(contentRect,
NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable, NSBackingStoreBuffered, false); g_win.
g_win.setTitle
setTitle
(nsstr("wsi-f09-outputs"));
// -[NSWindow screen] answers before the window is even ordered in. logWindowScreen("post_init");
(unresolved type) OutputView
OutputView
_error_ view
view
= OutputView.
OutputView.alloc
alloc
().
OutputView.alloc().initWithFrame
initWithFrame
(contentRect);
(unresolved type) NSNotificationCenter
NSNotificationCenter
_error_ nc
nc
= NSNotificationCenter.
NSNotificationCenter.defaultCenter
defaultCenter
();
nc.
nc.addObserver
addObserver
(view, SEL.register("screenParamsChanged:"),
cast(
(unresolved type) NSObject
NSObject
) NSApplicationDidChangeScreenParametersNotification, null);
nc.
nc.addObserver
addObserver
(view, SEL.register("windowScreenChanged:"),
cast(
(unresolved type) NSObject
NSObject
) NSWindowDidChangeScreenNotification, cast(
(unresolved type) NSObject
NSObject
) g_win);
instr("step", "name=notification_observers " ~ "registered=didChangeScreenParameters,windowDidChangeScreen"); g_win.
g_win.setContentView
setContentView
(view);
g_win.
g_win.setDelegate
setDelegate
(view);
g_win.
g_win.makeKeyAndOrderFront
makeKeyAndOrderFront
(null);
logWindowScreen("post_order_front"); instr("step", "name=NSTimer_scheduledTimerWithTimeInterval interval_ms=16"); NSTimer.
NSTimer.scheduledTimerWithTimeInterval
scheduledTimerWithTimeInterval
(0.016, view, SEL.register("tick:"), null, true);
instr("step", "name=NSApp_run"); g_app.
g_app.run
run
();
instr("loop_exit", "ticks=%d reconfig_cb=%d screen_params=%d window_screen=%d", g_tick, g_reconfigCalls, g_screenParamsEvents, g_windowScreenEvents); return 0; }