objc2-app-kit 0.3.0

Bindings to the AppKit framework
Documentation
framework = "AppKit"
crate = "objc2-app-kit"
required-crates = ["objc2", "objc2-foundation"]
custom-lib-rs = true
macos = "10.0"
maccatalyst = "13.0"
gnustep = true

external.UTType.module = "UniformTypeIdentifiers.UTType"

# `objc_ownership` in .apinotes
class.NSBundle.methods."loadNibNamed:owner:topLevelObjects:".skipped = true
class.NSNib.methods."instantiateWithOwner:topLevelObjects:".skipped = true

# Return type `oneway void`
class.NSPasteboard.methods.releaseGlobally.skipped = true
class.NSView.methods.releaseGState.skipped = true
# + some more in IMServicePlugIn.framework

# Uses `NS_SWIFT_UI_ACTOR` on a static, which is hard to support.
#
# Will have to be a method that takes `MainThreadMarker`.
static.NSApp.skipped = true

# These protocol impls would return the wrong types
class.NSTextStorage.skipped-protocols = ["NSCopying", "NSMutableCopying"]

# Set counterparts
class.NSFontCollection.counterpart = "MutableSubclass(AppKit.NSFontCollection.NSMutableFontCollection)"
class.NSMutableFontCollection.counterpart = "ImmutableSuperclass(AppKit.NSFontCollection.NSFontCollection)"
class.NSParagraphStyle.counterpart = "MutableSubclass(AppKit.NSParagraphStyle.NSMutableParagraphStyle)"
class.NSMutableParagraphStyle.counterpart = "ImmutableSuperclass(AppKit.NSParagraphStyle.NSParagraphStyle)"

# Typedef that uses a generic from a class
typedef.NSCollectionViewDiffableDataSourceItemProvider.skipped = true
class.NSCollectionViewDiffableDataSource.methods."initWithCollectionView:itemProvider:".skipped = true

# Requires `MainThreadOnly`, which I'm not sure is a good idea here?
class.NSCollectionViewDiffableDataSource.skipped-protocols = ["NSCollectionViewDataSource"]
class.NSManagedObjectContext.skipped-protocols = ["NSEditor", "NSEditorRegistration"]

# Both protocols and classes
protocol.NSTextAttachmentCell.renamed = "NSTextAttachmentCellProtocol"
protocol.NSAccessibilityElement.renamed = "NSAccessibilityElementProtocol"

# Both property and method
class.NSDocument.methods."setDisplayName:".skipped = true

# Wrong type for enum
enum.anonymous.constants.NSOKButton.skipped = true
enum.anonymous.constants.NSCancelButton.skipped = true
enum.anonymous.constants.NSFileHandlingPanelCancelButton.skipped = true
enum.anonymous.constants.NSFileHandlingPanelOKButton.skipped = true

# These subclass a generic struct, and hence the type parameter defaults to
# `AnyObject`, which is not PartialEq, Eq nor Hash.
class.NSLayoutXAxisAnchor.derives = "Debug"
class.NSLayoutYAxisAnchor.derives = "Debug"
class.NSLayoutDimension.derives = "Debug"

# Different definitions depending on target
enum.NSImageResizingMode.skipped = true
enum.NSTextAlignment.skipped = true

# Uses constants from IOKit
enum.NSPointingDeviceType.use-value = true
enum.NSEventButtonMask.use-value = true
enum.NSEventSubtype.use-value = true
static.NSNormalWindowLevel.use-value = true
static.NSFloatingWindowLevel.use-value = true
static.NSSubmenuWindowLevel.use-value = true
static.NSTornOffMenuWindowLevel.use-value = true
static.NSMainMenuWindowLevel.use-value = true
static.NSStatusWindowLevel.use-value = true
static.NSModalPanelWindowLevel.use-value = true
static.NSPopUpMenuWindowLevel.use-value = true
static.NSScreenSaverWindowLevel.use-value = true
static.NSDockWindowLevel.use-value = true

# I'm unsure of the ABI of the array this takes
fn.NSDrawBitmap.skipped = true
class.NSView.methods."getRectsExposedDuringLiveResize:count:".skipped = true

# Uses a pointer to SEL, which doesn't implement Encode yet
protocol.NSMenuDelegate.methods."menuHasKeyEquivalent:forEvent:target:action:".skipped = true

# Duplicated method
class.NSSlider.methods.isVertical.skipped = true
class.NSSliderCell.methods.isVertical.skipped = true
class.NSGestureRecognizer.methods.state.skipped = true

# Needs `Symbols` framework
class.NSImageView.categories.NSSymbolEffect.skipped = true

# Needs IconRef from HIServices / Carbon
class.NSImage.methods."initWithIconRef:".skipped = true

# OpenGL
class.NSOpenGLContext.skipped = true
class.NSOpenGLLayer.skipped = true
class.NSOpenGLPixelFormat.skipped = true
class.NSOpenGLPixelBuffer.skipped = true
class.NSOpenGLView.skipped = true
fn.NSOpenGLSetOption.skipped = true
fn.NSOpenGLGetOption.skipped = true
fn.NSOpenGLGetVersion.skipped = true

# QTKit
class.NSMovie.methods."initWithMovie:".skipped = true
class.NSMovie.methods.QTMovie.skipped = true

# Needs `cpu_type_t` from `<mach/machine.h>`.
class.NSWorkspaceOpenConfiguration.methods.architecture.skipped = true
class.NSWorkspaceOpenConfiguration.methods."setArchitecture:".skipped = true

# Needs INIntent from Intents
protocol.NSApplicationDelegate.methods."application:handlerForIntent:".skipped = true

# We don't really want objc2-app-kit to depend on objc2-core-text
class.NSAdaptiveImageGlyph.skipped-protocols = ["CTAdaptiveImageProviding"]

# header-translator crashes when trying to figure out the return type of this.
class.NSTextView.methods."quickLookPreviewableItemsInRanges:".skipped = true

###
### Main Thread Overrides
###

# Most things in AppKit is marked as MainThreadOnly automatically, but there are a few things we have to tweak
class.NSColorPicker.main-thread-only = true
class.NSController.main-thread-only = true
class.NSObjectController.main-thread-only = true
class.NSArrayController.main-thread-only = true
class.NSDictionaryController.main-thread-only = true
class.NSTreeController.main-thread-only = true
class.NSUserDefaultsController.main-thread-only = true
class.NSFontManager.main-thread-only = true
class.NSMenu.main-thread-only = true
class.NSMenuItem.main-thread-only = true
class.NSWindowTabGroup.main-thread-only = true
class.NSTextInputContext.main-thread-only = true

# Most methods on these require MainThreadMarker anyhow
protocol.NSDraggingInfo.requires-mainthreadonly = true
protocol.NSBrowserDelegate.requires-mainthreadonly = true
protocol.NSSplitViewDelegate.requires-mainthreadonly = true

# Accesses the shared application, and hence is main thread only (even though not marked so in Swift).
class.NSScreen.main-thread-only = true

# Documented as "Main Thread Only".
# > generally thread safe, although operations on views such as creating,
# > resizing, and moving should happen on the main thread.
# <https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaFundamentals/AddingBehaviortoaCocoaProgram/AddingBehaviorCocoa.html#//apple_ref/doc/uid/TP40002974-CH5-SW47>
#
# > If you want to use a thread to draw to a view, bracket all drawing code
# > between the lockFocusIfCanDraw and unlockFocus methods of NSView.
# <https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-123351-BBCFIIEB>
class.NSView.main-thread-only = true

# Documented as "Main Thread Only", but:
# > Thread safe in that you can create and manage them on a secondary
# > thread.
# <https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaFundamentals/AddingBehaviortoaCocoaProgram/AddingBehaviorCocoa.html#//apple_ref/doc/uid/TP40002974-CH5-SW47>
# <https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-123364>
#
# So could in theory be `Send`, and perhaps also `Sync` - but we would
# like interior mutability on windows, since that's just much easier, and
# in that case, they can't be!
class.NSWindow.main-thread-only = true

# TODO: This should probably be MainThreadOnly, or maybe +Send/Sync?
# class.NSAppearance.main-thread-only = true

# Documented Thread-Unsafe, but:
# > One thread can create an NSImage object, draw to the image buffer,
# > and pass it off to the main thread for drawing. The underlying image
# > cache is shared among all threads.
# <https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-126728>
#
# So really only unsafe to mutate on several threads.
# class.NSImage.sendable = false

# Documented as "Thread-Unsafe"
# class.NSResponder.sendable = false

###
### Safety
###

class.NSAppearance.methods."appearanceNamed:".unsafe = false
class.NSAppearance.methods."bestMatchFromAppearancesWithNames:".unsafe = false

class.NSApplication.methods.sharedApplication.unsafe = false
class.NSApplication.methods.currentEvent.unsafe = false
class.NSApplication.methods."postEvent:atStart:".unsafe = false
class.NSApplication.methods.presentationOptions.unsafe = false
class.NSApplication.methods.windows.unsafe = false
class.NSApplication.methods.keyWindow.unsafe = false
class.NSApplication.methods."setDelegate:".unsafe = false
class.NSApplication.methods."setPresentationOptions:".unsafe = false
class.NSApplication.methods."hide:".unsafe = false
class.NSApplication.methods."orderFrontCharacterPalette:".unsafe = false
class.NSApplication.methods."hideOtherApplications:".unsafe = false
class.NSApplication.methods."stop:".unsafe = false
class.NSApplication.methods."activateIgnoringOtherApps:".unsafe = false
class.NSApplication.methods."requestUserAttention:".unsafe = false
class.NSApplication.methods."setActivationPolicy:".unsafe = false
class.NSApplication.methods."setMainMenu:".unsafe = false
class.NSApplication.methods.effectiveAppearance.unsafe = false
class.NSApplication.methods."setAppearance:".unsafe = false
# Re-entrancy here is safe, just very confusing.
class.NSApplication.methods.run.unsafe = false

class.NSColor.methods.clear.unsafe = false

class.NSControl.methods.isEnabled.unsafe = false
class.NSControl.methods."setEnabled:".unsafe = false

class.NSCursor.methods."initWithImage:hotSpot:".unsafe = false
class.NSCursor.methods.arrowCursor.unsafe = false
class.NSCursor.methods.IBeamCursor.unsafe = false
class.NSCursor.methods.pointingHandCursor.unsafe = false
class.NSCursor.methods.closedHandCursor.unsafe = false
class.NSCursor.methods.openHandCursor.unsafe = false
class.NSCursor.methods.resizeLeftCursor.unsafe = false
class.NSCursor.methods.resizeRightCursor.unsafe = false
class.NSCursor.methods.resizeLeftRightCursor.unsafe = false
class.NSCursor.methods.resizeUpCursor.unsafe = false
class.NSCursor.methods.resizeDownCursor.unsafe = false
class.NSCursor.methods.resizeUpDownCursor.unsafe = false
class.NSCursor.methods.crosshairCursor.unsafe = false
class.NSCursor.methods.disappearingItemCursor.unsafe = false
class.NSCursor.methods.operationNotAllowedCursor.unsafe = false
class.NSCursor.methods.dragLinkCursor.unsafe = false
class.NSCursor.methods.dragCopyCursor.unsafe = false
class.NSCursor.methods.contextualMenuCursor.unsafe = false
class.NSCursor.methods.IBeamCursorForVerticalLayout.unsafe = false

class.NSImage.methods."initWithData:".unsafe = false
class.NSImage.methods."initByReferencingFile:".unsafe = false

class.NSMenu.methods.init.unsafe = false
class.NSMenu.methods.new.unsafe = false
class.NSMenu.methods."addItem:".unsafe = false

# Any modification of the target or the action has to remain `unsafe`
class.NSMenuItem.methods.init.unsafe = false
class.NSMenuItem.methods.new.unsafe = false
class.NSMenuItem.methods.separatorItem.unsafe = false
class.NSMenuItem.methods."setKeyEquivalentModifierMask:".unsafe = false
class.NSMenuItem.methods."setSubmenu:".unsafe = false

class.NSPasteboard.methods."propertyListForType:".unsafe = false

class.NSScreen.methods.mainScreen.unsafe = false
class.NSScreen.methods.screens.unsafe = false
class.NSScreen.methods.frame.unsafe = false
class.NSScreen.methods.visibleFrame.unsafe = false
class.NSScreen.methods.deviceDescription.unsafe = false
class.NSScreen.methods.backingScaleFactor.unsafe = false

class.NSWindowTabGroup.methods.windows.unsafe = false
class.NSWindowTabGroup.methods."setSelectedWindow:".unsafe = false

class.NSTextInputContext.methods.invalidateCharacterCoordinates.unsafe = false
class.NSTextInputContext.methods.discardMarkedText.unsafe = false
class.NSTextInputContext.methods.selectedKeyboardInputSource.unsafe = false

class.NSView.methods.frame.unsafe = false
class.NSView.methods.bounds.unsafe = false
class.NSView.methods.inputContext.unsafe = false
class.NSView.methods.visibleRect.unsafe = false
class.NSView.methods.hasMarkedText.unsafe = false
class.NSView.methods."convertPoint:fromView:".unsafe = false
class.NSView.methods.window.unsafe = false
class.NSView.methods."setWantsBestResolutionOpenGLSurface:".unsafe = false
class.NSView.methods."setWantsLayer:".unsafe = false
class.NSView.methods."setPostsFrameChangedNotifications:".unsafe = false
class.NSView.methods."removeTrackingRect:".unsafe = false
class.NSView.methods."addCursorRect:cursor:".unsafe = false
class.NSView.methods."setHidden:".unsafe = false
class.NSView.methods."convertRect:toView:".unsafe = false
class.NSView.methods.isFlipped.unsafe = false

# NSWindow initializers are not safe, since it is critical to memory
# safety that `window.setReleasedWhenClosed(false)` is called.
class.NSWindow.methods.frame.unsafe = false
class.NSWindow.methods.backingScaleFactor.unsafe = false
class.NSWindow.methods.contentView.unsafe = false
class.NSWindow.methods."setContentView:".unsafe = false
class.NSWindow.methods."setInitialFirstResponder:".unsafe = false
class.NSWindow.methods."makeFirstResponder:".unsafe = false
class.NSWindow.methods."contentRectForFrameRect:".unsafe = false
class.NSWindow.methods.screen.unsafe = false
class.NSWindow.methods."setContentSize:".unsafe = false
class.NSWindow.methods."setFrameTopLeftPoint:".unsafe = false
class.NSWindow.methods."setMinSize:".unsafe = false
class.NSWindow.methods."setMaxSize:".unsafe = false
class.NSWindow.methods."setResizeIncrements:".unsafe = false
class.NSWindow.methods.contentResizeIncrements.unsafe = false
class.NSWindow.methods."setContentResizeIncrements:".unsafe = false
class.NSWindow.methods."setFrame:display:".unsafe = false
class.NSWindow.methods."setMovable:".unsafe = false
class.NSWindow.methods."setSharingType:".unsafe = false
class.NSWindow.methods."setTabbingMode:".unsafe = false
class.NSWindow.methods."setOpaque:".unsafe = false
class.NSWindow.methods.hasShadow.unsafe = false
class.NSWindow.methods."setHasShadow:".unsafe = false
class.NSWindow.methods."setIgnoresMouseEvents:".unsafe = false
class.NSWindow.methods."setBackgroundColor:".unsafe = false
class.NSWindow.methods.styleMask.unsafe = false
class.NSWindow.methods."setStyleMask:".unsafe = false
class.NSWindow.methods."registerForDraggedTypes:".unsafe = false
class.NSWindow.methods."makeKeyAndOrderFront:".unsafe = false
class.NSWindow.methods."orderFront:".unsafe = false
class.NSWindow.methods."miniaturize:".unsafe = false
# TODO: class.NSWindow.methods."deminiaturize:".unsafe = false
class.NSWindow.methods."toggleFullScreen:".unsafe = false
class.NSWindow.methods."orderOut:".unsafe = false
class.NSWindow.methods."zoom:".unsafe = false
class.NSWindow.methods."selectNextKeyView:".unsafe = false
class.NSWindow.methods."selectPreviousKeyView:".unsafe = false
class.NSWindow.methods.firstResponder.unsafe = false
class.NSWindow.methods."standardWindowButton:".unsafe = false
class.NSWindow.methods."setTitle:".unsafe = false
class.NSWindow.methods.title.unsafe = false
class.NSWindow.methods."setAcceptsMouseMovedEvents:".unsafe = false
class.NSWindow.methods."setTitlebarAppearsTransparent:".unsafe = false
class.NSWindow.methods."setTitleVisibility:".unsafe = false
class.NSWindow.methods."setMovableByWindowBackground:".unsafe = false
class.NSWindow.methods."setLevel:".unsafe = false
class.NSWindow.methods."setAllowsAutomaticWindowTabbing:".unsafe = false
class.NSWindow.methods."setTabbingIdentifier:".unsafe = false
class.NSWindow.methods."setDocumentEdited:".unsafe = false
class.NSWindow.methods.occlusionState.unsafe = false
class.NSWindow.methods.center.unsafe = false
class.NSWindow.methods.isResizable.unsafe = false
class.NSWindow.methods.isMiniaturizable.unsafe = false
class.NSWindow.methods.hasCloseBox.unsafe = false
class.NSWindow.methods.isMiniaturized.unsafe = false
class.NSWindow.methods.isVisible.unsafe = false
class.NSWindow.methods.isKeyWindow.unsafe = false
class.NSWindow.methods.isZoomed.unsafe = false
class.NSWindow.methods.allowsAutomaticWindowTabbing.unsafe = false
class.NSWindow.methods."selectNextTab:".unsafe = false
class.NSWindow.methods.tabbingIdentifier.unsafe = false
class.NSWindow.methods.tabGroup.unsafe = false
class.NSWindow.methods.isDocumentEdited.unsafe = false
class.NSWindow.methods.close.unsafe = false
class.NSWindow.methods."performWindowDragWithEvent:".unsafe = false
class.NSWindow.methods."invalidateCursorRectsForView:".unsafe = false
class.NSWindow.methods."setDelegate:".unsafe = false
class.NSWindow.methods."sendEvent:".unsafe = false
class.NSWindow.methods."convertPointFromScreen:".unsafe = false
class.NSWindow.methods."convertRectToScreen:".unsafe = false
# Cycles must be prevented
class.NSWindow.methods."addChildWindow:ordered:".unsafe = true