Skip to content

Commit

Permalink
Additional convenient functions and enums (#1767)
Browse files Browse the repository at this point in the history
Added some missing API calls and enums when working with the Objective-C
Runtime.
  • Loading branch information
rtc11 authored Jan 5, 2025
1 parent fe7d423 commit c47cb51
Showing 1 changed file with 177 additions and 1 deletion.
178 changes: 177 additions & 1 deletion lib/std/os/macos/objc.c3
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ distinct ObjcMethod = void*;
distinct ObjcIvar = void*;
distinct ObjcSelector = void*;
def ObjcId = void*;
def SendVoid = fn void*(void*, ObjcSelector);

fault ObjcFailure
{
CLASS_NOT_FOUND
CLASS_NOT_FOUND,
UNKNOWN_EVENT
}

macro ZString ObjcClass.name(ObjcClass cls) => class_getName(cls);
Expand All @@ -19,6 +21,9 @@ macro ObjcMethod ObjcClass.method(ObjcClass cls, ObjcSelector name) => class_get
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");

macro ObjcClass! class_by_name(ZString c)
{
ObjcClass cls = objc::lookUpClass(c);
Expand Down Expand Up @@ -51,3 +56,174 @@ extern fn ObjcClass class_getSuperclass(ObjcClass cls);
extern fn ObjcMethod class_getClassMethod(ObjcClass cls, ObjcSelector name);
extern fn bool class_respondsToSelector(ObjcClass cls, ObjcSelector name);
extern fn ObjcSelector sel_registerName(ZString str);
extern fn bool class_addIvar(ObjcClass cls, ZString name, int size, double alignment, ZString types);
extern fn bool class_addMethod(ObjcClass cls, ObjcSelector name, void* imp, ZString types);

extern fn ObjcIvar getInstanceVariable(ObjcId id, ZString name, void* outValue) @extern("object_getInstanceVariable");
extern fn ObjcIvar setInstanceVariable(ObjcId id, ZString name, void* value) @extern("object_setInstanceVariable");
extern fn ObjcClass allocateClassPair(ObjcClass cls, ZString name, uint extraBytes) @extern("objc_allocateClassPair");

enum StatusItemLength : (double val)
{
VARIABLE = -1.0,
SQUARE = -2.0,
}

enum ApplicationActivationPolicy : (int val)
{
REGULAR = 0,
ACCESSORY = 1,
PROHIBITED = 2,
}

enum WindowStyleMask : (int val)
{
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 BackingStore : (int val)
{
RETAINED = 0,
NONRETAINED = 1,
BUFFERED = 2
}

enum EventType : (long val)
{
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)
{
switch(val) {
case EventType.LEFT_MOUSE_DOWN.val: return LEFT_MOUSE_DOWN;
case EventType.LEFT_MOUSE_UP.val: return LEFT_MOUSE_UP;
case EventType.RIGHT_MOUSE_DOWN.val: return RIGHT_MOUSE_DOWN;
case EventType.RIGHT_MOUSE_UP.val: return RIGHT_MOUSE_UP;
case EventType.MOUSE_MOVED.val: return MOUSE_MOVED;
case EventType.LEFT_MOUSE_DRAGGED.val: return LEFT_MOUSE_DRAGGED;
case EventType.RIGHT_MOUSE_DRAGGED.val: return RIGHT_MOUSE_DRAGGED;
case EventType.MOUSE_ENTERED.val: return MOUSE_ENTERED;
case EventType.MOUSE_EXITED.val: return MOUSE_EXITED;
case EventType.KEY_DOWN.val: return KEY_DOWN;
case EventType.KEY_UP.val: return KEY_UP;
case EventType.FLAGS_CHANGED.val: return FLAGS_CHANGED;
case EventType.APPKIT_DEFINED.val: return APPKIT_DEFINED;
case EventType.SYSTEM_DEFINED.val: return SYSTEM_DEFINED;
case EventType.APPLICATION_DEFINED.val: return APPLICATION_DEFINED;
case EventType.PERIODIC.val: return PERIODIC;
case EventType.CURSOR_UPDATE.val: return CURSOR_UPDATE;
case EventType.SCROLL_WHEEL.val: return SCROLL_WHEEL;
case EventType.TABLET_POINT.val: return TABLET_POINT;
case EventType.TABLET_PROXIMITY.val: return TABLET_PROXIMITY;
case EventType.OTHER_MOUSE_DOWN.val: return OTHER_MOUSE_DOWN;
case EventType.OTHER_MOUSE_UP.val: return OTHER_MOUSE_UP;
case EventType.OTHER_MOUSE_DRAGGED.val: return OTHER_MOUSE_DRAGGED;
case EventType.GESTURE.val: return GESTURE;
case EventType.MAGNIFY.val: return MAGNIFY;
case EventType.SWIPE.val: return SWIPE;
case EventType.ROTATE.val: return ROTATE;
case EventType.BEGIN_GESTURE.val: return BEGIN_GESTURE;
case EventType.END_GESTURE.val: return END_GESTURE;
case EventType.SMART_MAGNIFY.val: return SMART_MAGNIFY;
case EventType.QUICK_LOOK.val: return QUICK_LOOK;
case EventType.PRESSURE.val: return PRESSURE;
case EventType.DIRECT_TOUCH.val: return DIRECT_TOUCH;
case EventType.CHANGE_MODE.val: return CHANGE_MODE;
default: return ObjcFailure.UNKNOWN_EVENT?;
}
}

enum EventMask : (long val)
{
LEFT_MOUSE_DOWN = 1 << EventType.LEFT_MOUSE_DOWN.val,
LEFT_MOUSE_UP = 1 << EventType.LEFT_MOUSE_UP.val,
RIGHT_MOUSE_DOWN = 1 << EventType.RIGHT_MOUSE_DOWN.val,
RIGHT_MOUSE_UP = 1 << EventType.RIGHT_MOUSE_UP.val,
MOUSE_MOVED = 1 << EventType.MOUSE_MOVED.val,
LEFT_MOUSE_DRAGGED = 1 << EventType.LEFT_MOUSE_DRAGGED.val,
RIGHT_MOUSE_DRAGGED = 1 << EventType.RIGHT_MOUSE_DRAGGED.val,
MOUSE_ENTERED = 1 << EventType.MOUSE_ENTERED.val,
MOUSE_EXITED = 1 << EventType.MOUSE_EXITED.val,
KEY_DOWN = 1 << EventType.KEY_DOWN.val,
KEY_UP = 1 << EventType.KEY_UP.val,
FLAGS_CHANGED = 1 << EventType.FLAGS_CHANGED.val,
APPKIT_DEFINED = 1 << EventType.APPKIT_DEFINED.val,
SYSTEM_DEFINED = 1 << EventType.SYSTEM_DEFINED.val,
APPLICATION_DEFINED = 1 << EventType.APPLICATION_DEFINED.val,
PERIODIC = 1 << EventType.PERIODIC.val,
CURSOR_UPDATE = 1 << EventType.CURSOR_UPDATE.val,
SCROLL_WHEEL = 1 << EventType.SCROLL_WHEEL.val,
TABLET_POINT = 1 << EventType.TABLET_POINT.val,
TABLET_PROXIMITY = 1 << EventType.TABLET_PROXIMITY.val,
OTHER_MOUSE_DOWN = 1 << EventType.OTHER_MOUSE_DOWN.val,
OTHER_MOUSE_UP = 1 << EventType.OTHER_MOUSE_UP.val,
OTHER_MOUSE_DRAGGED = 1 << EventType.OTHER_MOUSE_DRAGGED.val,
GESTURE = 1 << EventType.GESTURE.val,
MAGNIFY = 1 << EventType.MAGNIFY.val,
SWIPE = 1 << EventType.SWIPE.val,
ROTATE = 1 << EventType.ROTATE.val,
BEGIN_GESTURE = 1 << EventType.BEGIN_GESTURE.val,
END_GESTURE = 1 << EventType.END_GESTURE.val,
SMART_MAGNIFY = 1L << EventType.SMART_MAGNIFY.val,
DIRECT_TOUCH = 1L << EventType.DIRECT_TOUCH.val,
ANY = long.max,
}

enum EventModifierFlag : (int val)
{
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,
}

0 comments on commit c47cb51

Please sign in to comment.