Advertisement
Guest User

Pure C winform on OS X Apple Silicon

a guest
Aug 26th, 2023
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.10 KB | Source Code | 0 0
  1. // based on https://stackoverflow.com/a/59596600/834108
  2. // Minimal Pure C code to create a window in Cocoa
  3. // Adapted to work on ARM64
  4.  
  5. // $ clang minimal.c -framework Cocoa -o minimal.app
  6.  
  7. #include <objc/runtime.h>
  8. #include <objc/message.h>
  9.  
  10. #include <Carbon/Carbon.h>
  11.  
  12. #define cls objc_getClass
  13. #define sel sel_getUid
  14. #define msg ((id (*)(id, SEL))objc_msgSend)
  15. #define msg_int ((id (*)(id, SEL, int))objc_msgSend)
  16. #define msg_id  ((id (*)(id, SEL, id))objc_msgSend)
  17. #define msg_ptr ((id (*)(id, SEL, void*))objc_msgSend)
  18. #define msg_cls ((id (*)(Class, SEL))objc_msgSend)
  19. #define msg_cls_chr ((id (*)(Class, SEL, char*))objc_msgSend)
  20.  
  21. // poor man's bindings!
  22. typedef enum NSApplicationActivationPolicy {
  23.     NSApplicationActivationPolicyRegular   = 0,
  24.     NSApplicationActivationPolicyAccessory = 1,
  25.     NSApplicationActivationPolicyERROR     = 2,
  26. } NSApplicationActivationPolicy;
  27.  
  28. typedef enum NSWindowStyleMask {
  29.     NSWindowStyleMaskBorderless     = 0,
  30.     NSWindowStyleMaskTitled         = 1 << 0,
  31.     NSWindowStyleMaskClosable       = 1 << 1,
  32.     NSWindowStyleMaskMiniaturizable = 1 << 2,
  33.     NSWindowStyleMaskResizable      = 1 << 3,
  34. } NSWindowStyleMask;
  35.  
  36. typedef enum NSBackingStoreType {
  37.     NSBackingStoreBuffered = 2,
  38. } NSBackingStoreType;
  39.  
  40. int main(int argc, char *argv[])
  41. {
  42.     id app = msg_cls(cls("NSApplication"), sel("sharedApplication"));
  43.     msg_int(app, sel("setActivationPolicy:"), NSApplicationActivationPolicyRegular);
  44.     struct CGRect frameRect = {0, 0, 600, 500};
  45.  
  46.     id window = ((id (*)(id, SEL, struct CGRect, int, int, int))objc_msgSend)(
  47.         msg_cls(cls("NSWindow"), sel("alloc")),
  48.         sel("initWithContentRect:styleMask:backing:defer:"),
  49.         frameRect,
  50.         NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable,
  51.         NSBackingStoreBuffered,
  52.         false
  53.     );
  54.     msg_id(window, sel("setTitle:"), msg_cls_chr(cls("NSString"), sel("stringWithUTF8String:"), "Pure C App"));
  55.     msg_ptr(window, sel("makeKeyAndOrderFront:"), nil);
  56.     msg_int(app, sel("activateIgnoringOtherApps:"), true);
  57.     msg(app, sel("run"));
  58. }
  59.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement