D言語からObjective-CとCocoaAPIを使いたい

D言語で Mac の GUI を、extern(Objective-C) を使用して Cocoa API (Window) を表示する Web Site がありました。 Obj-C interop and D without druntime code to copy/paste の New Toys "Objective-C from D" です。 これに、少しずつ追加して利用させていただきました。

Index
  • NSApplication, NSApplicationActivationPolicy
  • NSApplicationDelegate
  • NSURL
  • NSWindow, NSBackingStoreType, NSWindowStyleMask
  • NSWindowDelegate, NSWindowController
  • NSColor
  • NSRectFill
  • NSBezierPath, lineCap, NSWindingRule, dashLine
  • NSViewController
  • NSView
  • CALayer
  • NSResponder
  • NSMenu
  • NSMenuItem
  • NSObject
  • NSProcessInfo
  • NSString, toNs, toDs, toCs, strCopy
  • NSLog
  • NSDictionary
  • NSAlert, alertButtonReturn, alertStyle, modalResponse
  • NSRect, NSMakeRect
  • NSPoint, NSMakePoint
  • NSSize, NSMakeSize
  • NSRange, NSMakeRange
  • CGPoint, CGPointMake
  • CGSize, CGSizeMake
  • CGRect, CGRectMake

サンプルコード

Powered by Prism

cocoa/window.d

/**
 *    cocoa/window.d        Version 0.0.26
 *			http://dpldocs.info/this-week-in-d/Blog.Posted_2019_02_25.html
 */

module cocoa.window;
import core.attribute : optional, selector;
import std.conv : to;
import cocoa.control;

extern (Objective-C)
__gshared NSApplication NSApp_;

NSApplication NSApp() {
    if(NSApp_ is null)
        NSApp_ = NSApplication.shared_;
    return NSApp_;
}

extern (Objective-C)
extern class NSApplication : NSResponder { 
    static NSApplication shared_() @selector("sharedApplication");
    void* delegate_() @selector("delegate");
    void delegate_(void*) @selector("setDelegate:");
    bool setActivationPolicy(NSApplicationActivationPolicy 
        activationPolicy) 
        @selector("setActivationPolicy:");
    bool activationPolicy(NSAppActivationPolicy) 
        @selector("setActivationPolicy:");
    /* use `int` as workaround for 
       https://github.com/ldc-developers/ldc/issues/2387 */
    void activateIgnoringOtherApps(int flag) 
        @selector("activateIgnoringOtherApps:");
    void run() @selector("run");
    NSMenu servicesMenu() @selector("servicesMenu"); //
    void servicesMenu(NSMenu) @selector("setServicesMenu:"); // 
    bool openURL(NSURL) @selector("canOpenURL:");
    void aboutPanelOptions(NSDictionary)
        @selector("orderFrontStandardAboutPanelWithOptions:");
}

extern (Objective-C)
class NSApplicationDelegate : NSObject {
    override static NSApplicationDelegate alloc() @selector("alloc");
    override NSApplicationDelegate init() @selector("init");
    void applicationDidFinishLaunching(NSNotification notification) 
        @selector("applicationDidFinishLaunching:");
    bool applicationShouldTerminateAfterLastWindowClosed(
        NSNotification notification) 
        @selector("applicationShouldTerminateAfterLastWindowClosed:");
}

extern (Objective-C)
extern class NSURL : NSObject {
    /* Creating ana NSURL Object */ 
    static NSURL url(NSString) @selector("URLWithString:"); // NSString -> NSURL
    static NSURL toNsURL(NSString) @selector("URLWithString:"); // ==
    static NSURL url(NSString, NSURL) @selector("URLWithString:relativeToURL:"); // ==
    static NSURL urlPath(NSString) @selector("fileURLWithPath:"); // ==
    NSURL init(NSString) @selector("initWithString:");
    NSURL url(string s) { return NSURL.url(s.toNs); }  
    /* Accessing the Parts of the URL */
    NSString abString() @selector("absoluteString"); // NSURL -> NSString
    NSString toNsStr() @selector("absoluteString"); // ==
}

extern (Objective-C)
extern class NSWindow : NSResponder {
    override static NSWindow alloc() @selector("alloc");
    override NSWindow init() @selector("init");
    NSWindow init(
        NSRect contentRect,
        NSWindowStyleMask style,
        NSBackingStoreType bufferingType,
        bool flag
    ) @selector("initWithContentRect:styleMask:backing:defer:");
    NSWindow initWithContentRect(
        NSRect contentRect,
        NSWindowStyleMask style,
        NSBackingStoreType bufferingType,
        bool flag
    ) @selector("initWithContentRect:styleMask:backing:defer:");
    void makeKeyAndOrderFront(void* sender) 
        @selector("makeKeyAndOrderFront:");
    NSView contentView() @selector("contentView");
    NSViewController viewCtrler() @selector("contentViewController"); //
    void viewCtrler(NSViewController) @selector("setContentViewController:"); // 
    void orderFrontRegardless() @selector("orderFrontRegardless");
    void center() @selector("center");
    void contentView(NSView view) @selector("setContentView:");
    void setDelegate(NSView view) @selector("setDelegate:");
    void delegate_(NSWindowDelegate) @selector("setDelegate:");
    NSWindowController windowController() @selector("windowController"); //
    void windowController(NSWindowController) @selector("setWindowController:"); //
    void frameOrigin(NSPoint) @selector("setFrameOrigin:");
    void origin(NSPoint) @selector("setFrameOrigin:");
    void frame(NSRect) @selector("setFrame:");
    NSRect frame() @selector("frame");
    void backgroundColor(NSColor) @selector("setBackgroundColor:");
    void bgColor(NSColor) @selector("setBackgroundColor:");
    void cascadeTop(NSPoint) @selector("cascadeTopLeftFromPoint:"); 
    void moveTop(NSPoint) @selector("setFrameTopLeftPoint:"); 
    void moveOrigin(NSPoint) @selector("setFrameOrigin:");
    void title(NSString) @selector("setTitle:");
    void minSize(NSSize) @selector("setMinSize:");
    void maxSize(NSSize) @selector("setMaxSize:"); // 23.12.19
    CGFloat backingScaleFactor() @selector("backingScaleFactor");
    /* Closing Windows */ 
    void close() @selector("close");
}

extern (Objective-C)
interface NSWindowDelegate {
    @optional void winDidEndSheet(NSNotification) @selector("windowDidEndSheet:"); //
    @optional void winDidResize(NSNotification) @selector("windowDidResize:");
    @optional void winWillClose(NSNotification) @selector("windowWillClose:"); //
}

extern (Objective-C)
extern class NSWindowController : NSResponder {  //
    override static NSWindowController alloc() @selector("alloc");  //
    NSWindowController init(NSWindow) @selector("initWithWindow:");
    void windowDidLoad() @selector("windowDidLoad");
    NSViewController viewCtrler() @selector("contentViewController"); //
    void showWindow(NSWindow) @selector("showWindow:"); //
}

extern (Objective-C)
extern class NSColor : NSObject {
    static NSColor black() @selector("blackColor");
    static NSColor blue() @selector("blueColor");
    static NSColor brown() @selector("brownColor");
    static NSColor clear() @selector("clearColor");
    static NSColor cyan() @selector("cyanColor");
    static NSColor darkGray() @selector("darkGrayColor");
    static NSColor gray() @selector("grayColor");
    static NSColor green() @selector("greenColor");
    static NSColor indigo() @selector("systemIndigoColor");
    static NSColor lightGray() @selector("lightGrayColor");
    static NSColor magenta() @selector("magentaColor");
    static NSColor mint() @selector("systemMintColor");
    static NSColor orange() @selector("orangeColor");
    static NSColor pink() @selector("systemPinkColor");
    static NSColor purple() @selector("purpleColor");
    static NSColor red() @selector("redColor");
    static NSColor teal() @selector("systemTealColor");
    static NSColor white() @selector("whiteColor");
    static NSColor yellow() @selector("yellowColor");
    static NSColor colorRGB(CGFloat, CGFloat, CGFloat, CGFloat)
        @selector("colorWithDeviceRed:green:blue:alpha:");
    static NSColor RGB(CGFloat, CGFloat, CGFloat, CGFloat)
        @selector("colorWithDeviceRed:green:blue:alpha:");
    static NSColor rgba(CGFloat, CGFloat, CGFloat, CGFloat) //  
        @selector("colorWithDeviceRed:green:blue:alpha:");
    static NSColor colorCMYK(CGFloat, CGFloat, CGFloat, CGFloat, CGFloat)
        @selector("colorWithDeviceCyan:magenta:yellow:black:alpha:");
    static NSColor cmyk(CGFloat, CGFloat, CGFloat, CGFloat, CGFloat)
        @selector("colorWithDeviceCyan:magenta:yellow:black:alpha:"); 
    static NSColor colorHSB(CGFloat, CGFloat, CGFloat, CGFloat)
        @selector("colorWithDeviceHue:saturation:brightness:alpha:");
    NSColor set() @selector("set");
    NSColor setFill() @selector("setFill");
    NSColor fill() @selector("setFill");
    NSColor setStroke() @selector("setStroke");
    NSColor stroke() @selector("setStroke");
    CGFloat redComponent() @selector("redComponent");
    CGFloat greenComponent() @selector("greenComponent");
    CGFloat blueComponent() @selector("blueComponent");
    CGFloat alphaComponent() @selector("alphaComponent");
    void components(CGFloat) @selector("getComponents:");
    NSColor spaceName(NSString) @selector("colorUsingColorSpaceName:");
    CGColorRef CGColor() @selector("CGColor");
    CGColorRef cgColor() @selector("CGColor");
}

extern (C) void NSRectFill(NSRect);

extern (Objective-C)
extern class NSBezierPath : NSObject {
    static NSBezierPath bezierPath() @selector("bezierPath"); 
    static NSBezierPath ovalInRect(NSRect) @selector("bezierPathWithOvalInRect:");
    static NSBezierPath oval(NSRect) @selector("bezierPathWithOvalInRect:");
    static NSBezierPath rect(NSRect) @selector("bezierPathWithRect:");
    static NSBezierPath bezierPathWithRoundedRect(NSRect, CGFloat, CGFloat)
        @selector("bezierPathWithRoundedRect:xRadius:yRadius:");
    static NSBezierPath roundedRect(NSRect, CGFloat, CGFloat)
        @selector("bezierPathWithRoundedRect:xRadius:yRadius:");
    // NSBezierPath init(NSRect) @selector("init:");
    void moveToPoint(NSPoint) @selector("moveToPoint:");
    void lineToPoint(NSPoint) @selector("lineToPoint:");
    void curveToPoint(NSPoint, NSPoint, NSPoint) 
        @selector("curveToPoint:controlPoint1:controlPoint2:");
    void closePath() @selector("closePath");
    void relativeMove(NSPoint) @selector("relativeMoveToPoint:");
    void relativeCurve(NSPoint, NSPoint, NSPoint)
        @selector("relativeCurveToPoint:controlPoint1:controlPoint2:");
    void append(NSRect) @selector("appendBezierPathWithRect:");
    void appendRect(NSRect) @selector("appendBezierPathWithRect:");
    void append(NSBezierPath) @selector("appendBezierPath:");
    void appendOvalIn(NSRect) @selector("appendBezierPathWithOvalInRect:");
    void arcFromPoint(NSPoint, NSPoint, CGFloat)
        @selector("appendBezierPathWithArcWithArcFromPoint:toPoint:radius:");
    void arcWithCenter(NSPoint, CGFloat, CGFloat, CGFloat)
        @selector("appendBezierPathWithArcWithCenter:radius:startAngle:endAngle:");
    void roundedRect(NSRect, CGFloat, CGFloat)
        @selector("appendBezierPathWithRoundedRect:xRadius:yRadius:");
    void windingRule(NSUInteger) @selector("setWindingRule:");
    void lineCapStyle(NSUInteger) @selector("setLineCapStyle:");
    static void setLineWidth(CGFloat) @selector("setLineWidth:");
    static void lineWidth(CGFloat) @selector("setLineWidth:");
    void dash(CGFloat*, NSInteger, CGFloat) @selector("setLineDash:count:phase:");
    void stroke() @selector("stroke");
    void fill() @selector("fill"); 
    static void fillRect(NSRect) @selector("fillRect:");
    static void fill(NSRect) @selector("fillRect:");
    static void strokeRect(NSRect) @selector("strokeRect:");
    static void strokeLine(NSPoint, NSPoint) 
        @selector("strokeLineFromPoint:toPoint:");
    static void defaultLineWidth(CGFloat) @selector("setDefaultLineWidth:");
    static NSRect bounds() @selector("bounds");
    void transformUsingAffineTransform(NSAffineTransform)
        @selector("setTransformUsingAffineTransform:");
} 

enum LineJoin : NSUInteger { Miter, Round, Bevel }
enum LineCap : NSUInteger { Butt, Round, Square } 
enum NSWindingRule : NSUInteger { NonZero, EvenOdd }

void dashLine(NSBezierPath path, CGFloat[] pattern) {
    NSInteger count = cast(long)pattern.length;
    path.dash(pattern.ptr, count, 0); } // pattern.ptr  == &pattern[0]

void lineDash(NSBezierPath path, CGFloat[] pattern) { dashLine(path, pattern); }

extern (Objective-C)
extern class NSAffineTransform : NSObject {
    static NSAffineTransform transform() @selector("transform");
    override NSAffineTransform init() @selector("init");
    NSAffineTransform init(NSAffineTransform) @selector("initWithTransform:");
    void translateXYBy(CGFloat, CGFloat) @selector("translateXBy:yBy:");
    void rotateByDegrees(CGFloat) @selector("rotateByDegrees:");
    void rotateByRadians(CGFloat) @selector("rotateByRadians:");
    void scaleBy(CGFloat) @selector("scaleBy:");
    void set() @selector("set");
    NSPoint transformPoint(NSPoint) @selector("transformPoint:");
    NSSize transformSize(NSSize) @selector("transformSize:");
    void concat() @selector("concat");
}

extern (Objective-C)
extern class NSViewController : NSResponder {
    NSView view() @selector("view");
    void view(NSView view) @selector("setView:");
    void loadView() @selector("loadView"); 
    void viewDidLoad() @selector("viewDidLoad");
}

extern (Objective-C)
extern class NSView : NSResponder { 
    override static NSView alloc() @selector("alloc");
    override NSView init() @selector("init");
    NSView init(NSRect) @selector("initWithFrame:");
    NSArray subviews() @selector("subviews"); // 2023-10-25
    void addSubview(NSView) @selector("addSubview:");
    void subview(NSView) @selector("addSubview:");
    void subView(NSView) @selector("addSubview:");
    void drawRect(NSRect rect) @selector("drawRect:");
    // void backgroundColor(NSColor) @selector("setBackgroundColor:");
    // void bgColor(NSColor) @selector("setBackgroundColor:");
    void itemColor(NSColor) @selector("setItemColor:");
    void display() @selector("display"); 
    void displayRect(NSRect) @selector("displayRect:"); 
    bool flipped() @selector("flipped");
    bool autoresizesSubviews() @selector("autoresizesSubviews");
    void autoresizesSubviews(bool) @selector("setAutoresizesSubviews:");
    NSUInteger resizingMask(ResizingMask) @selector("setAutoresizingMask:");
    NSUInteger resizeMask(ResizeMask) @selector("setAutoresizingMask:"); 
   /* View Coordinates */
    NSRect frame() @selector("frame");
    void frame(NSRect) @selector("setFrame:"); // OK
    void setFrameOrigin(NSPoint) @selector("setFrameOrigin:");
    void frameOrigin(NSPoint) @selector("setFrameOrigin:");
    void setFrameSize(NSSize) @selector("setFrameSize:");
    void frameSize(NSSize) @selector("setFrameSize:");
    CGFloat frameRotation() @selector("frameRotation");
    void frameRotation(CGFloat) @selector("setFrameRotation:");
    CGFloat frameCenterRotation() @selector("frameCenterRotation");
    void frameCenterRotation(CGFloat) @selector("setFrameCenterRotation:");

    /* Modifying the Bounds Rectangle */
    NSRect bounds() @selector("bounds");
    void bounds(NSRect) @selector("setBounds:"); // OK
    void boundsOrigin(NSPoint) @selector("setBoundsOrigin:");
    void boundsSize(NSSize) @selector("setBoundsSize:");
    CGFloat boundsRotation() @selector("boundsRotation");
    void boundsRotation(CGFloat) @selector("setBoundsRotation:"); 

     /* Modifying the Coordinate System */
    void translateOriginToPoint(NSPoint) @selector("translateOriginToPoint:");
    void translateOrigin(NSPoint) @selector("translateOriginToPoint:");
    void rotateByAngle(CGFloat) @selector("rotateByAngle:");
    void rotate(CGFloat) @selector("rotateByAngle:"); 

   /* Core Animation Support */
    bool wantsLayer() @selector("wantsLayer");
    void wantsLayer(bool) @selector("setWantsLayer:");
    bool wantsUpdateLayer() @selector("wantsUpdateLayer");
    void redrawPolicy(Redraw) @selector("setLayerContentsRedrawPolicy:");
    void needsDisplay(bool) @selector("setNeedsDisplay:");
    CGPoint anchorPoint() @selector("anchorPoint");
    void anchorPoint(CGPoint) @selector("setAnchorPoint:");

   /* Managing interactions   Event Handling    Scrolling the View  */
    // void prepareContentInRect(NSRect) @selector("prepareContentInRect:");
    // void scrollPoint(NSPoint) @selector("scrollPoint:");
    // void scrollRectToVisible(bool) @selector("setScrollRectToVisible:");
    void autoscroll(NSEvent) @selector("autoscroll:");
}

enum ResizingMask : NSUInteger {
    NotSizable    = 0,  // 変更不可
    Not           = 0,
    MinXMargin    = 1,  // 左マージンは変更可
    MinX          = 1,
    WidthSizable  = 2,  // 幅は変更可
    Width         = 2,
    MaxXMargin    = 4,  // 右マージンは変更可
    MaxX          = 4,
    MinYMargin    = 8,  // 下マージンは変更可
    MinY          = 8,
    HeightSizable = 16, // 高さは変更可 
    Height        = 16,
    MaxYMargin    = 32, // 上マージン変更可
    MaxY          = 32
}
alias NSAutoresizingMaskOptions = ResizingMask;
alias ResizeMask = ResizingMask;

enum Redraw: NSInteger { 
    Never             = 0,
    OnSetNeedsDisplay = 1,
    DuringViewResize  = 2,
    BeforeViewResize  = 3,
    Crossfade         = 4
}

extern (Objective-C)
class CALayer {  
    static CALayer layer() @selector("layer");
    CGColorRef borderColor() @selector("borderColor");
    void borderColor(CGColorRef) @selector("setBorderColor:");
    // CGColorRef bgColor(CGColorRef) @selector("setBackgroundColor:");
    void bgColor(CGColorRef) @selector("setBackgroundColor:");
    CATransform3D sublayerTransform() @selector("sublayerTransform");
    void sublayerTransform(CATransform3D) @selector("setSublayerTransform:");
    CGImage contents() @selector("contents");
    CGPoint anchorPoint() @selector("anchorPoint");
    void anchorPoint(CGPoint) @selector("setAnchorPoint:");
    void position(CGPoint) @selector("setPosition:");
    void addSublayer(CALayer) @selector("addSublayer:");
    CALayer subLayer(CALayer) @selector("addSublayer:");
    /* Creating a Layer */
    static CALayer layer() @selector("layer");
    CALayer init() @selector("init");
    CALayer init(NSObject) @selector("initWithLayer:");
    /* Accessing Related Layer Objects */
    /* Accessing the Delegate */
    CALayerDelegate setDelegate(NSView) @selector("setDelegate:"); // error?
    /* Providing the Layer's Content */
    /* Modifying the Layer's Appearance */
    CGFloat borderWidth() @selector("borderWidth");
    void borderWidth(CGFloat) @selector("setBorderWidth:");
    /* Layer Filters */
    /* Configuring the Layer's Rendering Behavior */
    /* Modifying the Layer Geometry */
    // CGRect frame() @selector("frame");
    // void frame(CGRect) @selector("frame:");
    // CGRect bounds() @selector("bounds");
    void bounds(CGRect) @selector("setBounds:");
    /* Managing the Layer's Transform */
    /* Managing the Layer Hierarchy */
    /* Updating Layer Display */
    /* Layer Animations */
    void addAnimation(CAAnimation, NSString) @selector("addAnimation:forKey:");
    /* Managing Layer Resizing and Layout */
    // CALayoutManager layoutManager() @selector("layoutManager");
    void layoutManager(CAConstraintLayoutManager) @selector("setLayoutManager:");
    /* Managing Layer Constraints */
    /* Getting the Layer's Actions */
    /* Mapping Between Coordinate and Time Spaces */
    /* Hit Testing */
    /* Scrolling */
    /* Identifying the Layer */
    NSString name() @selector("name");
    void name(NSString) @selector("setName:");
    /* Key-Value Coding Extensions */
    /* Constants */
    /* Instance Properties */
    /* Type Methods */
}

extern (Objective-C)
extern class CAAnimation : NSObject {
    static CAAnimation animation() @selector("animation");
    // CAAnimation delegate() @selector("delegate");
    static CAAnimation animationWithKeyPath(NSString)
        @selector("animationWithKeyPath:");
}

extern (Objective-C)
interface CALayerDelegate {}

extern (Objective-C)
interface CALayoutManager {}

extern (Objective-C)
extern class CAConstraintLayoutManager : NSObject {}

extern (Objective-C)
extern class NSResponder : NSObject {
    NSMenu menu() @selector("menu");
    void menu(NSMenu menu) @selector("setMenu:");
    /* Changing the FirstResponder */ 
    bool acceptsFirstResponder() @selector("acceptsFirstResponder"); // 
    // 
    // bool becomeFirstResponder() @selector("becomeFirstResponder");
    // void becomeFirstResponder(bool) @selector("setBecomeFirstResponder:");
    /* mouse */                                   
    void mouseDown(NSEvent) @selector("mouseDown:");
    void mouseDragged(NSEvent) @selector("mouseDragged:");
    void mouseUp(NSEvent) @selector("mouseUp:");
    void mouseMoved(NSEvent) @selector("mouseMoved:");
    void mouseEntered(NSEvent) @selector("mouseEntered:");
    void mouseExited(NSEvent) @selector("mouseExited:");
    void rightMouseDown(NSEvent) @selector("rightMouseDown:");
    void rightMouseDragged(NSEvent) @selector("rightMouseDragged:");
    void rightMouseUp(NSEvent) @selector("rightMouseUp:");
    void otherMouseDown(NSEvent) @selector("otherMouseDown:");
    void otherMouseDragged(NSEvent) @selector("otherMouseDragged:");
    void otherMouseUp(NSEvent) @selector("otherMouseUp:");
    // void flushBufferedKeyEvents() @selector("flushBufferedKeyEvents");
    void keyDown(NSEvent) @selector("keyDown:"); //
}

extern (C) NSRect  NSInsetRect(NSRect r, CGFloat x, CGFloat y);
CGFloat NSWidth(NSRect r) { return r.size.width; }
CGFloat NSHeight(NSRect r) { return r.size.height; }
CGFloat NSMidX(NSRect r) { return r.origin.x + r.size.width / 2; }
CGFloat NSMidY(NSRect r) { return r.origin.y + r.size.height / 2; }
CGFloat NSMaxX(NSRect r) { return r.origin.x + r.size.width; }
CGFloat NSMaxY(NSRect r) { return r.origin.y + r.size.height; }
CGFloat NSMinX(NSRect r) { return r.origin.x; }
CGFloat NSMinY(NSRect r) { return r.origin.y; }

NSRect nRect(double x, double y, double w, double h) {  //
    return NSMakeRect(x, y, w, h);
}

extern (Objective-C)            //
extern class NSScreen : NSObject {
    /* Getting Screen Objects */
    NSScreen mainScreen() @selector("mainScreen");
    NSRect frame() @selector("frame");
    NSRect visibleFrame() @selector("visibleFrame");
    NSArray screens() @selector("screens");  // 
}

extern (Objective-C)
extern class NSMenu : NSObject { 
    override static NSMenu alloc() @selector("alloc");
    override NSMenu init() @selector("init");
    NSMenu init(NSString title) @selector("initWithTitle:");
    extern (D) final
    NSMenu init(string title) { return init(title.toNs); }
    void setSubmenu(NSMenu, NSMenuItem) 
        @selector("setSubmenu:forItem:");
    void submenu(NSMenu, NSMenuItem) 
        @selector("setSubmenu:forItem:");
    void setSubmenu(NSMenu) @selector("setSubmenu:");
    void submenu(NSMenu) @selector("setSubmenu:");
    void addItem(NSMenuItem) @selector("addItem:");
    void item(NSMenuItem) @selector("addItem:");
    NSMenuItem addItem(
        NSString title,
        SEL selector,
        NSString charCode
    ) @selector("addItemWithTitle:action:keyEquivalent:");
    extern (D) final
    NSMenuItem addItem(string title, SEL selector, string charCode) {
        return addItem(title.toNs, selector, charCode.toNs);
    }
    NSMenuItem item(string title, SEL selector, string charCode) {
        return addItem(title.toNs, selector, charCode.toNs);
    }
}

extern (Objective-C)
extern class NSMenuItem : NSObject {
    override static NSMenuItem alloc() @selector("alloc");
    override NSMenuItem init() @selector("init");
    static NSMenuItem separatorItem() @selector("separatorItem");
    NSMenuItem setSubmenu(NSMenu) @selector("setSubmenu:"); 
    NSMenuItem submenu(NSMenu) @selector("setSubmenu:"); 
    void title(NSString) @selector("setTitle:");
    void target(NSObject) @selector("setTarget:");
    SEL action(SEL sel) @selector("setAction:");
    extern (D) final SEL action_(string str) { 
        return action(sel_registerName(str.toCs)); }
    NSMenuItem init(
        NSString title,
        SEL selector,  // 
        NSString charCode
    ) @selector("initWithTitle:action:keyEquivalent:");
    extern (D) final
    NSMenuItem init(string title, string selector, string charCode) { // 
        return init(title.toNs, sel_registerName(selector.toCs), charCode.toNs); //
    }
}

extern (Objective-C)
extern class NSObject {
    static NSObject alloc() @selector("alloc");
    NSObject init() @selector("init");
    SEL perform(SEL) @selector("performSelector:");
    void release() @selector("release");
    void dealloc() @selector("dealloc");
}

extern (Objective-C)
extern class NSProcessInfo : NSObject {
    static NSProcessInfo processInfo() @selector("processInfo");
    NSString processName() @selector("processName");
    NSString operatingSystemVersionString()
        @selector("operatingSystemVersionString");
    NSArray arguments() @selector("arguments"); // 引数文字列の配列
}

extern (Objective-C)
extern class NSNotification { }

/*  *** stringAPI *** */
extern (Objective-C)
extern class NSString : NSObject { 
    override static NSString alloc() @selector("alloc");
    override NSString init() @selector("init");
    NSString initWith(NSString) @selector("initWithString:"); // copy
    NSString init(NSString) @selector("initWithString:"); // copy
    NSString initWithBytes(
        const(ubyte)* bytes,
        NSUInteger length,
        NSStringEncoding encoding
    ) @selector("initWithBytes:length:encoding:");
    NSString init(char*) @selector("initWithUTF8String:"); // //
    NSString initWith(char*)	// //
        @selector("initWithUTF8String:"); // C -> ObjC	
    char* UTF8String() @selector("UTF8String");	// ObjC -> C
    // const(char*) toCs() @selector("UTF8String");	// ObjC -> C
    override void release() @selector("release");
    void draw(NSPoint, NSDictionary) @selector("drawAtPoint:withAttributes:");
    void drawAtPoint(NSPoint, NSDictionary) 
        @selector("drawAtPoint:withAttributes:");
    double doubleValue(NSString) @selector("doubleValue:");
    int intValue(NSString) @selector("intValue:");
    int length() @selector("length");
    NSRange rangeOfString(NSString) @selector("rangeOfString:");
    NSString substr(NSRange) @selector("substringWithRange:");
    static NSString contentsOfFile(  // reading data from the file
            NSString path, 
            NSStringEncoding enc, 
            NSError error)
        @selector("stringWithContentsOfFile:encoding:error:"); // 追加
    unichar charAt(NSUInteger) @selector("characterAtIndex:");
} 

extern (Objective-C)
extern class NSError : NSObject {}


NSString substr(NSString str, int a, int b) {
    return str.substr(NSRange(a, b));
}

NSString toNSString(string str) {
    return NSString.alloc.initWithBytes(
        cast(immutable(ubyte)*) str.ptr,
        str.length,
        NSStringEncoding.NSUTF8StringEncoding
    );
}

extern (Objective-C)
enum NSStringEncoding : NSInteger {
    NSUTF8StringEncoding = 4,
    UTF8Str = 4   //
}

alias strEncode = NSStringEncoding; //

NSString toNs(string str) { // D string -> NSString
    return toNSString(str); }

NSString toNs(char* cstr) { // C string -> NSString
    return NSString.alloc.init(cstr); } 
string toDs(NSString str) { // NSString -> D string
    return str.toCs.to!string; }
string toDs(char* str) {    // C string -> D string
    return str.to!string; }
char* toCs(NSString str) {  // NSString -> C string
    return str.UTF8String; }
char* toCs(string str) {    // D string -> C string
    //return cast(char*) str; 
    return str.toNs.toCs; } 
NSString strCopy(NSString str) { // NSString -> NSString Copy
    return NSString.alloc.init(str); }

extern (C) void NSLog(NSString, ...);
/* *** end of stringAPI *** */

extern (Objective-C):
extern class NSAlert : NSObject {
    override static NSAlert alloc() @selector("alloc");
    override NSAlert init() @selector("init");
    void addButton(NSString) @selector("addButtonWithTitle:"); 
    void messageText(NSString) @selector("setMessageText:");
    void information(NSString) @selector("setInformativeText:");
    void style(NSUInteger) @selector("setAlertStyle:");
    uint run() @selector("runModal");
    override void release() @selector("release");
    void showSuppressionButton(bool) @selector("setShowsSuppressionButton:");
    void suppressionButton(bool) @selector("setShowsSuppressionButton:");
    void showSupBtn(bool) @selector("setShowsSuppressionButton:");
    NSButton suppressionButton() @selector("suppressionButton");
    NSButton supBtn() @selector("suppressionButton");
    NSImage icon() @selector("icon");
    void icon(NSImage) @selector("setIcon:");
}

enum NSAlertButtonReturn : NSUInteger {first = 1000, second, third }
alias AlertButtonReturn = NSAlertButtonReturn;
alias alertButtonReturn = NSAlertButtonReturn;
alias AlertButton = NSAlertButtonReturn;
// enum AlertButtonReturn : NSUInteger {first = 1000, second, third }
// enum AlertButton : NSInteger { first = 1000, second, third } 
enum AlertReturn : NSInteger { OK = 1000, Cancel, Other }
// enum Response : NSUInteger { OK = 1000, Cancel, Other }
alias Response = AlertReturn;
alias response  = AlertReturn; 
enum AlertStyle : NSUInteger { warning, informational, critical }
alias alertStyle = AlertStyle;
enum NSModalResponse : NSInteger {
    Cancel = 0, 
    OK = 1,  
    Continue = -1002, 
    Stop     = -1000, 
    Abort    = -1001 }
alias ModalResponse = NSModalResponse;
alias modalResponse = NSModalResponse;

enum NSBackingStoreType : size_t {
    retained    = 0,
    Retained    = 0, 
    nonretained = 1,
    Nonretained = 1, 
    buffered    = 2,
    Buffered    = 2, }   
alias NSBacking = NSBackingStoreType;
alias Backing   = NSBackingStoreType;
alias backing   = NSBackingStoreType;

enum NSApplicationActivationPolicy : ptrdiff_t {
    regular    = 0, 
    Regular    = 0,
    accessory  = 1,
    Accessory  = 1,
    prohibited = 2,
    Prohibited = 2, } 
alias NSAppActivationPolicy = NSApplicationActivationPolicy;

enum NSWindowStyleMask : size_t {
    borderless              = 0,
    Borderless              = 0,
    titled                  = 1 << 0,
    Titled                  = 1 << 0,
    closable                = 1 << 1,
    Closable                = 1 << 1,
    miniaturizable          = 1 << 2,
    Miniaturizable          = 1 << 2,
    resizable               = 1 << 3,
    Resizable               = 1 << 3,
    utilityWindow           = 1 << 4,  // panel or subclass of NSPanel
    UtilityWindow           = 1 << 4,
    docModalWindow          = 1 << 6,  // doc-modal Panel (or subclass of NSPanel)
    DocModalWindow          = 1 << 6,
    nonactivatingPanel      = 1 << 7,  // panel or subclass of NSPanel
    NonactivatingPanel      = 1 << 7,
    texturedBackground      = 1 << 8,  // Deprecated
    TexturedBackground      = 1 << 8,
    unifiedTitleAndToolbar  = 1 << 12, // no effect
    UnifiedTitleAndToolbar  = 1 << 12,
    hUDWindow               = 1 << 13, // HUD panel
    HUDWindow               = 1 << 13,
    fullScreen              = 1 << 14,
    FullScreen              = 1 << 14,
    fullSizeContentView     = 1 << 15, 
    FullSizeContentView     = 1 << 15, }
alias NSWinStyle = NSWindowStyleMask;
alias WinStyle   = NSWindowStyleMask;

enum NSEventModifierFlag : size_t {
    CapsLock    = 1 << 16,
    Shift       = 1 << 17,
    Control     = 1 << 18,
    Option      = 1 << 19,  // AlternateKey
    Command     = 1 << 20,
    NumericPad  = 1 << 21,
    Help        = 1 << 22,
    Function    = 1 << 23,
    DeviceIndependent = 0xffff0000 }

struct objc_selector;
alias SEL = objc_selector*;
extern (C) SEL sel_registerName(char* str); // 

alias NSUInteger = size_t;  // ulong = 8bit
alias NSInteger  = ptrdiff_t;  // long = 8bit
struct CGColor;
alias CGColorRef = CGColor*;
alias CGFloat    = double; // 8bit
alias unichar    = wchar;

ulong NSUIntegerMax = ulong.max;

const NSPoint NSZeroPoint = NSMakePoint(0,0);

struct NSPoint {
    CGFloat x;
    CGFloat y;
}

struct NSSize {
    CGFloat width;
    CGFloat height;
}

struct NSRect {
    NSPoint origin;
    NSSize size;
}

pragma(inline, true) NSPoint NSMakePoint(CGFloat x, CGFloat y) {
    NSPoint p;
    p.x = x;
    p.y = y;
    return p;
}

pragma(inline, true) NSSize NSMakeSize(CGFloat w, CGFloat h) {
    NSSize s;
    s.width = w;
    s.height = h;
    return s;
}

pragma(inline, true) NSRect NSMakeRect(
        CGFloat x, CGFloat y, CGFloat w, CGFloat h) {
    NSRect r;
    r.origin.x = x;
    r.origin.y = y;
    r.size.width = w;
    r.size.height = h;
    return r;
}

struct NSRange {
    NSUInteger location;
    NSUInteger length;
}

pragma(inline, true) NSRange NSMakeRange(NSUInteger loc, NSUInteger len) {
    NSRange r;
    r.location = loc;
    r.length = len;
    return r;
}

struct CATransform3D { 
    CGFloat m11, m12, m13, m14;
    CGFloat m21, m22, m23, m24;
    CGFloat m31, m32, m33, m34;
    CGFloat m41, m42, m43, m44;
}
/*
struct CGAffineTransform {
    CGFloat  a,  b; // [1,1], [1,2], [1,3]=0
    CGFloat  c,  d; // [2,1], [2,2], [2,3]=0
    CGFloat tx, ty; // [3,1], [3,2], [3,3]=1
}

const CGAffineTransform CGAffineTransformIdentity;
*/
struct CGImage { }

struct CGPoint { 
    CGFloat x;
    CGFloat y;
}

struct CGSize {
    CGFloat width;
    CGFloat height;
}

struct CGRect {
    CGPoint origin;
    CGSize size;
}
/*
struct CGVector {
     CGFloat dx;
     CGFloat dy;
} */

pragma(inline, true) CGPoint CGPointMake(CGFloat x, CGFloat y) {
    CGPoint p;
    p.x = x;
    p.y = y;
    return p;
}

pragma(inline, true) CGSize CGSizeMake(CGFloat w, CGFloat h) {
    CGSize s;
    s.width = w;
    s.height = h;
    return s;
}

pragma(inline, true) CGRect CGRectMake( 
        CGFloat x, CGFloat y, CGFloat w, CGFloat h) {
    CGRect r;
    r.origin.x = x;
    r.origin.y = y;
    r.size.width = w;
    r.size.height = h;
    return r;
}

NSPoint nP(double x, double y) {  //
    return NSMakePoint(x, y);
}

NSSize nS(double w, double h) {  // 
    return NSMakeSize(w, h);
}

NSRect nR(double x, double  y, double w, double h) {  //
    return NSMakeRect(x, y, w, h);
}               
cocoa/control.d
Log
  • 2025-03-31 追加・修正しました。
  • 2025-03-25 追加・修正しました。
  • 2024-08-23 追加・修正しました。
  • 2024-08-20 追加・修正しました。
  • 2024-08-14 追加・修正しました。
  • 2024-07-27 修正しました。
  • 2024-06-14 追加・修正しました。
  • 2024-06-05 修正しました。
  • 2024-04-05 タイポ訂正しました。
  • 2024-04-01 削除・修正しました。
  • 2024-03-25 追加・修正しました。
  • 2024-03-07 追加・修正しました。
  • 2024-03-05 追加・修正しました。
  • 2024-01-25 追加・修正しました。
  • 2023-12-05 追加・修正しました。
  • 2023-11-09 追加・修正しました。
  • 2023-10-20 追加・修正しました。
  • 2023-10-07 追加・修正しました。
  • 2023-09-22 追加・修正しました。
  • 2023-07-06 修正しました。
  • 2023-05-24 追加・修正しました。
  • 2023-05-16 追加・修正しました。
  • 2023-03-20 追加・修正しました。
  • 2023-01-21 修正しました。
  • 2023-01-14 toNSStringを追加、toNsの修正をしました。
  • 2022-12-21 修正しました。
  • 2022-11-18 NSColor に追加しました。
  • 2022-11-11 修正しました。
  • 2022-07-23 修正、NSRangeを追加しました。
  • 2022-06-24 修正しました。
  • 2022-05-20 一部修正しました。
  • 2022-02-23 ViewController を CocoaAPI の外に置きました。
  • 2022-01-22 NSString drawAtPoint 訂正
  • 2022-01-01 upload