[stdlib] macOS - Add objc and core foundation types and enums. (#2572)

* Add CGFloat, CGPoint, CGSize, CGRect
* Add WindowCollectionBehavior, WindowLevel, and WindowTabbingMode
* Change EventMask to ulong to match the objc unsigned long long
* Change int types to NS(U)Integer types to match objc
* Add core foundation tests
* Add objc tests
* Add darwin conditional to the test files
* Change enums to const inline to better match the NSEvent.h api.
Update the EventMask helper function to match the NSEvent.h api:
event_type_from -> event_mask_from_type.
* Update the release notes
* Deprecate original objc enums and replace with const inline enums backed with NS numerical types.
Rename the new objc enums with an NS prefix.
Update unit tests to account for new NS prefixed enums.
Add states item length constants to core_foundation.
Status item lengths don't really belong in either file, but as they are
dependant on CGFloat it made sense to move them to the same module.
Update release notes.
* Some tweaks

---------

Co-authored-by: Christoffer Lerno <christoffer@aegik.com>
This commit is contained in:
Glenn Kirk
2025-11-20 21:47:20 +00:00
committed by GitHub
parent 5b83108dd1
commit 49e836b1ab
6 changed files with 473 additions and 10 deletions

View File

@@ -13,6 +13,26 @@ struct CFRange
CFIndex length;
}
alias CGFloat = $typefrom(env::ARCH_64_BIT ??? double : float);
struct CGPoint
{
CGFloat x;
CGFloat y;
}
struct CGSize
{
CGFloat width;
CGFloat height;
}
struct CGRect
{
CGPoint origin;
CGSize size;
}
extern fn ZString CFString.getCStringPtr(&self, CFStringEncoding encoding) @cname("CFStringGetCStringPtr");
extern fn ZString CFString.getCString(&self, char* buffer, usz len, CFStringEncoding encoding) @cname("CFStringGetCString");

View File

@@ -18,7 +18,7 @@ macro bool ObjcSelector.equals(ObjcSelector a, ObjcSelector b) => a == b;
macro bool ObjcClass.equals(ObjcClass a, ObjcClass b) => a == b;
fn ObjcId alloc(ObjcClass cls) => objc::msg_send(cls, SendVoid, "alloc");
fn void release(ObjcId id) => objc::msg_send(id, SendVoid, "release");
fn void release(ObjcId id) => objc::msg_send(id, SendVoid, "release");
alias NSUInteger = $typefrom(env::ARCH_64_BIT ??? ulong : uint);
alias NSInteger = $typefrom(env::ARCH_64_BIT ??? long : int);
@@ -71,20 +71,30 @@ extern fn ObjcIvar getInstanceVariable(ObjcId id, ZString name, void* outValue)
extern fn ObjcIvar setInstanceVariable(ObjcId id, ZString name, void* value) @cname("object_setInstanceVariable");
extern fn ObjcClass allocateClassPair(ObjcClass cls, ZString name, uint extraBytes) @cname("objc_allocateClassPair");
enum StatusItemLength : (double val)
module std::os::macos::objc::ns @if(env::DARWIN) @link(env::DARWIN, "CoreFoundation.framework");
import std::os::macos::cf;
enum StatusItemLength : (double val) @deprecated("Use NSStatusItemLength.")
{
VARIABLE = -1.0,
SQUARE = -2.0,
}
enum ApplicationActivationPolicy : (int val)
enum ApplicationActivationPolicy : (int val) @deprecated("Use NSApplicationActivationPolicy.")
{
REGULAR = 0,
ACCESSORY = 1,
PROHIBITED = 2,
}
enum WindowStyleMask : (int val)
enum NSApplicationActivationPolicy : const inline NSInteger
{
REGULAR = 0,
ACCESSORY = 1,
PROHIBITED = 2,
}
enum WindowStyleMask : (int val) @deprecated("Use NSWindowStyleMask.")
{
BORDERLESS = 0,
TITLED = 1 << 0,
@@ -101,14 +111,21 @@ enum WindowStyleMask : (int val)
HUD_WINDOW = 1 << 13
}
enum BackingStore : (int val)
enum BackingStore : (int val) @deprecated("Use NSBackingStoreType.")
{
RETAINED = 0,
NONRETAINED = 1,
BUFFERED = 2
}
enum EventType : (long val)
enum NSBackingStoreType : const inline NSUInteger
{
RETAINED = 0,
NONRETAINED = 1,
BUFFERED = 2
}
enum EventType : (long val) @deprecated("Use NSEventType.")
{
LEFT_MOUSE_DOWN = 1,
LEFT_MOUSE_UP = 2,
@@ -146,7 +163,45 @@ enum EventType : (long val)
CHANGE_MODE = 38,
}
fn EventType? event_type_from(int val)
enum NSEventType : const inline NSUInteger
{
LEFT_MOUSE_DOWN = 1,
LEFT_MOUSE_UP = 2,
RIGHT_MOUSE_DOWN = 3,
RIGHT_MOUSE_UP = 4,
MOUSE_MOVED = 5,
LEFT_MOUSE_DRAGGED = 6,
RIGHT_MOUSE_DRAGGED = 7,
MOUSE_ENTERED = 8,
MOUSE_EXITED = 9,
KEY_DOWN = 10,
KEY_UP = 11,
FLAGS_CHANGED = 12,
APPKIT_DEFINED = 13,
SYSTEM_DEFINED = 14,
APPLICATION_DEFINED = 15,
PERIODIC = 16,
CURSOR_UPDATE = 17,
SCROLL_WHEEL = 22,
TABLET_POINT = 23,
TABLET_PROXIMITY = 24,
OTHER_MOUSE_DOWN = 25,
OTHER_MOUSE_UP = 26,
OTHER_MOUSE_DRAGGED = 27,
GESTURE = 29,
MAGNIFY = 30,
SWIPE = 31,
ROTATE = 18,
BEGIN_GESTURE = 19,
END_GESTURE = 20,
SMART_MAGNIFY = 32,
QUICK_LOOK = 33,
PRESSURE = 34,
DIRECT_TOUCH = 37,
CHANGE_MODE = 38,
}
fn EventType? event_type_from(int val) @deprecated("Use NSEventType directly.")
{
switch(val)
{
@@ -184,11 +239,11 @@ fn EventType? event_type_from(int val)
case EventType.PRESSURE.val: return PRESSURE;
case EventType.DIRECT_TOUCH.val: return DIRECT_TOUCH;
case EventType.CHANGE_MODE.val: return CHANGE_MODE;
default: return UNKNOWN_EVENT?;
default: return objc::UNKNOWN_EVENT?;
}
}
enum EventMask : (long val)
enum EventMask : (long val) @deprecated("Use NSEventMask.")
{
LEFT_MOUSE_DOWN = 1 << EventType.LEFT_MOUSE_DOWN.val,
LEFT_MOUSE_UP = 1 << EventType.LEFT_MOUSE_UP.val,
@@ -224,7 +279,48 @@ enum EventMask : (long val)
ANY = long.max,
}
enum EventModifierFlag : (int val)
enum NSEventMask : const inline ulong
{
LEFT_MOUSE_DOWN = 1ul << NSEventType.LEFT_MOUSE_DOWN,
LEFT_MOUSE_UP = 1ul << NSEventType.LEFT_MOUSE_UP,
RIGHT_MOUSE_DOWN = 1ul << NSEventType.RIGHT_MOUSE_DOWN,
RIGHT_MOUSE_UP = 1ul << NSEventType.RIGHT_MOUSE_UP,
MOUSE_MOVED = 1ul << NSEventType.MOUSE_MOVED,
LEFT_MOUSE_DRAGGED = 1ul << NSEventType.LEFT_MOUSE_DRAGGED,
RIGHT_MOUSE_DRAGGED = 1ul << NSEventType.RIGHT_MOUSE_DRAGGED,
MOUSE_ENTERED = 1ul << NSEventType.MOUSE_ENTERED,
MOUSE_EXITED = 1ul << NSEventType.MOUSE_EXITED,
KEY_DOWN = 1ul << NSEventType.KEY_DOWN,
KEY_UP = 1ul << NSEventType.KEY_UP,
FLAGS_CHANGED = 1ul << NSEventType.FLAGS_CHANGED,
APPKIT_DEFINED = 1ul << NSEventType.APPKIT_DEFINED,
SYSTEM_DEFINED = 1ul << NSEventType.SYSTEM_DEFINED,
APPLICATION_DEFINED = 1ul << NSEventType.APPLICATION_DEFINED,
PERIODIC = 1ul << NSEventType.PERIODIC,
CURSOR_UPDATE = 1ul << NSEventType.CURSOR_UPDATE,
ROTATE = 1ul << NSEventType.ROTATE,
BEGIN_GESTURE = 1ul << NSEventType.BEGIN_GESTURE,
END_GESTURE = 1ul << NSEventType.END_GESTURE,
SCROLL_WHEEL = 1ul << NSEventType.SCROLL_WHEEL,
TABLET_POINT = 1ul << NSEventType.TABLET_POINT,
TABLET_PROXIMITY = 1ul << NSEventType.TABLET_PROXIMITY,
OTHER_MOUSE_DOWN = 1ul << NSEventType.OTHER_MOUSE_DOWN,
OTHER_MOUSE_UP = 1ul << NSEventType.OTHER_MOUSE_UP,
OTHER_MOUSE_DRAGGED = 1ul << NSEventType.OTHER_MOUSE_DRAGGED,
GESTURE = 1ul << NSEventType.GESTURE,
MAGNIFY = 1ul << NSEventType.MAGNIFY,
SWIPE = 1ul << NSEventType.SWIPE,
SMART_MAGNIFY = 1ul << NSEventType.SMART_MAGNIFY,
QUICK_LOOK = 1ul << NSEventType.QUICK_LOOK,
PRESSURE = 1ul << NSEventType.PRESSURE,
DIRECT_TOUCH = 1ul << NSEventType.DIRECT_TOUCH,
CHANGE_MODE = 1ul << NSEventType.CHANGE_MODE,
ANY = ulong.max,
}
fn NSEventMask event_mask_from_type(NSEventType type) => (NSEventMask)1ul << type;
enum EventModifierFlag : (int val) @deprecated("Use NSEventModifierFlags.")
{
CAPS_LOCK = 1 << 16,
SHIFT = 1 << 17,
@@ -236,3 +332,78 @@ enum EventModifierFlag : (int val)
HELP = 1 << 22,
}
enum NSEventModifierFlags : const inline NSUInteger
{
CAPS_LOCK = 1 << 16,
SHIFT = 1 << 17,
CONTROL = 1 << 18,
OPTION = 1 << 19,
COMMAND = 1 << 20,
NUMERIC_PAD = 1 << 21,
FUNCTION = 1 << 23,
HELP = 1 << 22,
}
enum NSWindowCollectionBehavior : const inline NSUInteger
{
DEFAULT = 0,
CAN_JOIN_ALL_SPACES = 1 << 0,
MOVE_TO_ACTIVE_SPACE = 1 << 1,
MANAGED = 1 << 2,
TRANSIENT = 1 << 3,
STATIONARY = 1 << 4,
PARTICIPATES_IN_CYCLE = 1 << 5,
IGNORES_CYCLE = 1 << 6,
FULL_SCREEN_PRIMARY = 1 << 7,
FULL_SCREEN_AUXILIARY = 1 << 8,
FULL_SCREEN_NONE = 1 << 9,
FULL_SCREEN_ALLOWS_TILING = 1 << 11,
FULL_SCREEN_DISALLOWS_TILING = 1 << 12,
PRIMARY = 1 << 16,
AUXILIARY = 1 << 17,
CAN_JOIN_ALL_APPLICATIONS = 1 << 18,
}
enum NSWindowLevel : const inline NSInteger
{
NORMAL = 0,
FLOATING = 3,
SUBMENU = 3,
TORN_OFF_MENU = 3,
MODAL_PANEL = 8,
MAIN_MENU = 24,
STATUS = 25,
POP_UP_MENU = 101,
SCREEN_SAVER = 1000,
}
enum NSWindowStyleMask : const inline NSUInteger
{
BORDERLESS = 0,
TITLED = 1 << 0,
CLOSABLE = 1 << 1,
MINIATURIZABLE = 1 << 2,
RESIZABLE = 1 << 3,
TEXTURED_BACKGROUND = 1 << 8,
UNIFIED_TITLE_AND_TOOLBAR = 1 << 12,
FULL_SCREEN = 1 << 14,
FULL_SIZE_CONTENT_VIEW = 1 << 15,
UTILITY_WINDOW = 1 << 4,
DOC_MODAL_WINDOW = 1 << 6,
NONACTIVATING_PANEL = 1 << 7,
HUD_WINDOW = 1 << 13
}
enum NSWindowTabbingMode : const inline NSInteger
{
AUTOMATIC = 0,
DISALLOWED = 2,
PREFERRED = 1,
}
enum NSStatusItemLength : const inline CGFloat
{
VARIABLE = -1.0,
SQUARE = -2.0
}