//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
use objc2_foundation::*;

use crate::*;

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsresponder?language=objc)
    #[unsafe(super(NSObject))]
    #[thread_kind = MainThreadOnly]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSResponder;
);

extern_conformance!(
    unsafe impl NSCoding for NSResponder {}
);

extern_conformance!(
    unsafe impl NSObjectProtocol for NSResponder {}
);

impl NSResponder {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        /// # Safety
        ///
        /// `coder` possibly has further requirements.
        #[unsafe(method(initWithCoder:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;

        /// # Safety
        ///
        /// This is not retained internally, you must ensure the object is still alive.
        #[unsafe(method(nextResponder))]
        #[unsafe(method_family = none)]
        pub unsafe fn nextResponder(&self) -> Option<Retained<NSResponder>>;

        /// Setter for [`nextResponder`][Self::nextResponder].
        ///
        /// # Safety
        ///
        /// This is unretained, you must ensure the object is kept alive while in use.
        #[unsafe(method(setNextResponder:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setNextResponder(&self, next_responder: Option<&NSResponder>);

        /// # Safety
        ///
        /// - `action` must be a valid selector.
        /// - `object` should be of the correct type.
        #[unsafe(method(tryToPerform:with:))]
        #[unsafe(method_family = none)]
        pub unsafe fn tryToPerform_with(&self, action: Sel, object: Option<&AnyObject>) -> bool;

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(performKeyEquivalent:))]
        #[unsafe(method_family = none)]
        pub fn performKeyEquivalent(&self, event: &NSEvent) -> bool;

        #[cfg(feature = "NSPasteboard")]
        #[unsafe(method(validRequestorForSendType:returnType:))]
        #[unsafe(method_family = none)]
        pub fn validRequestorForSendType_returnType(
            &self,
            send_type: Option<&NSPasteboardType>,
            return_type: Option<&NSPasteboardType>,
        ) -> Option<Retained<AnyObject>>;

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(mouseDown:))]
        #[unsafe(method_family = none)]
        pub fn mouseDown(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(rightMouseDown:))]
        #[unsafe(method_family = none)]
        pub fn rightMouseDown(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(otherMouseDown:))]
        #[unsafe(method_family = none)]
        pub fn otherMouseDown(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(mouseUp:))]
        #[unsafe(method_family = none)]
        pub fn mouseUp(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(rightMouseUp:))]
        #[unsafe(method_family = none)]
        pub fn rightMouseUp(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(otherMouseUp:))]
        #[unsafe(method_family = none)]
        pub fn otherMouseUp(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(mouseMoved:))]
        #[unsafe(method_family = none)]
        pub fn mouseMoved(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(mouseDragged:))]
        #[unsafe(method_family = none)]
        pub fn mouseDragged(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(mouseCancelled:))]
        #[unsafe(method_family = none)]
        pub fn mouseCancelled(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(scrollWheel:))]
        #[unsafe(method_family = none)]
        pub fn scrollWheel(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(rightMouseDragged:))]
        #[unsafe(method_family = none)]
        pub fn rightMouseDragged(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(otherMouseDragged:))]
        #[unsafe(method_family = none)]
        pub fn otherMouseDragged(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(mouseEntered:))]
        #[unsafe(method_family = none)]
        pub fn mouseEntered(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(mouseExited:))]
        #[unsafe(method_family = none)]
        pub fn mouseExited(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(keyDown:))]
        #[unsafe(method_family = none)]
        pub fn keyDown(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(keyUp:))]
        #[unsafe(method_family = none)]
        pub fn keyUp(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(flagsChanged:))]
        #[unsafe(method_family = none)]
        pub fn flagsChanged(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(tabletPoint:))]
        #[unsafe(method_family = none)]
        pub fn tabletPoint(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(tabletProximity:))]
        #[unsafe(method_family = none)]
        pub fn tabletProximity(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(cursorUpdate:))]
        #[unsafe(method_family = none)]
        pub fn cursorUpdate(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(magnifyWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn magnifyWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(rotateWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn rotateWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(swipeWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn swipeWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(beginGestureWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn beginGestureWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(endGestureWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn endGestureWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(smartMagnifyWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn smartMagnifyWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(changeModeWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn changeModeWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(touchesBeganWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn touchesBeganWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(touchesMovedWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn touchesMovedWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(touchesEndedWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn touchesEndedWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(touchesCancelledWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn touchesCancelledWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(quickLookWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn quickLookWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(pressureChangeWithEvent:))]
        #[unsafe(method_family = none)]
        pub fn pressureChangeWithEvent(&self, event: &NSEvent);

        #[cfg(feature = "NSEvent")]
        /// Handle a key event that should present a context menu at the user focus.
        ///
        /// Most applications should not override this method. Instead, you should customize the context menu displayed from a keyboard event by implementing `menuForEvent:` and `selectionAnchorRect`, or `showContextMenuForSelection:`, rather than this method.
        ///
        /// You should only override this method when you do not want the system-provided default behavior for the context menu hotkey, either for a specific key combination, or for the hotkey in general. For example, if your application already provides a different behavior for control-Return (the default context menu hotkey definition), and you want to preserve that behavior, you should override this method to handle that specific key combination, and then return without calling `super`. Note that the user may customize the hotkey to a different key combination, so in this example, if any other key combination is passed to your method, you would call `super`.
        ///
        /// An implementation of this method should call `[super contextMenuKeyDown:event]` to pass the request up the responder chain. If the message reaches the application object, NSApplication's implementation of this method will send `showContextMenuForSelection:` to the responder chain. If you do not call `super`, then no further handling of the key event will be performed.
        ///
        ///
        /// Note: In some cases, `showContextMenuForSelection:` will be called without a prior call to `contextMenuKeyDown:`. This occurs when a view receives an Accessibility ShowMenu action, or when the user has created a Cocoa Text key binding to map a different key combination to the `showContextMenuForSelection:` action.
        ///
        ///
        /// Parameter `event`: The key down event that matches the system-wide context menu hotkey combination.
        ///
        ///
        /// See also: `showContextMenuForSelection:`
        #[unsafe(method(contextMenuKeyDown:))]
        #[unsafe(method_family = none)]
        pub fn contextMenuKeyDown(&self, event: &NSEvent);

        /// # Safety
        ///
        /// `event_selector` must be a valid selector.
        #[unsafe(method(noResponderFor:))]
        #[unsafe(method_family = none)]
        pub unsafe fn noResponderFor(&self, event_selector: Sel);

        #[unsafe(method(acceptsFirstResponder))]
        #[unsafe(method_family = none)]
        pub fn acceptsFirstResponder(&self) -> bool;

        #[unsafe(method(becomeFirstResponder))]
        #[unsafe(method_family = none)]
        pub fn becomeFirstResponder(&self) -> bool;

        #[unsafe(method(resignFirstResponder))]
        #[unsafe(method_family = none)]
        pub fn resignFirstResponder(&self) -> bool;

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(interpretKeyEvents:))]
        #[unsafe(method_family = none)]
        pub fn interpretKeyEvents(&self, event_array: &NSArray<NSEvent>);

        #[unsafe(method(flushBufferedKeyEvents))]
        #[unsafe(method_family = none)]
        pub fn flushBufferedKeyEvents(&self);

        #[cfg(feature = "NSMenu")]
        #[unsafe(method(menu))]
        #[unsafe(method_family = none)]
        pub fn menu(&self) -> Option<Retained<NSMenu>>;

        #[cfg(feature = "NSMenu")]
        /// Setter for [`menu`][Self::menu].
        #[unsafe(method(setMenu:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setMenu(&self, menu: Option<&NSMenu>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[unsafe(method(showContextHelp:))]
        #[unsafe(method_family = none)]
        pub unsafe fn showContextHelp(&self, sender: Option<&AnyObject>);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(helpRequested:))]
        #[unsafe(method_family = none)]
        pub fn helpRequested(&self, event_ptr: &NSEvent);

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(shouldBeTreatedAsInkEvent:))]
        #[unsafe(method_family = none)]
        pub fn shouldBeTreatedAsInkEvent(&self, event: &NSEvent) -> bool;

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(wantsScrollEventsForSwipeTrackingOnAxis:))]
        #[unsafe(method_family = none)]
        pub fn wantsScrollEventsForSwipeTrackingOnAxis(&self, axis: NSEventGestureAxis) -> bool;

        #[cfg(feature = "NSEvent")]
        #[unsafe(method(wantsForwardedScrollEventsForAxis:))]
        #[unsafe(method_family = none)]
        pub fn wantsForwardedScrollEventsForAxis(&self, axis: NSEventGestureAxis) -> bool;

        /// # Safety
        ///
        /// - `action` must be a valid selector.
        /// - `sender` should be of the correct type.
        #[unsafe(method(supplementalTargetForAction:sender:))]
        #[unsafe(method_family = none)]
        pub unsafe fn supplementalTargetForAction_sender(
            &self,
            action: Sel,
            sender: Option<&AnyObject>,
        ) -> Option<Retained<AnyObject>>;
    );
}

/// Methods declared on superclass `NSObject`.
impl NSResponder {
    extern_methods!(
        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new(mtm: MainThreadMarker) -> Retained<Self>;
    );
}

extern_protocol!(
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsstandardkeybindingresponding?language=objc)
    pub unsafe trait NSStandardKeyBindingResponding:
        NSObjectProtocol + MainThreadOnly
    {
        /// *********************** Key binding entry-points ************************
        ///
        /// # Safety
        ///
        /// `insert_string` should be of the correct type.
        #[optional]
        #[unsafe(method(insertText:))]
        #[unsafe(method_family = none)]
        unsafe fn insertText(&self, insert_string: &AnyObject);

        /// # Safety
        ///
        /// `selector` must be a valid selector.
        #[optional]
        #[unsafe(method(doCommandBySelector:))]
        #[unsafe(method_family = none)]
        unsafe fn doCommandBySelector(&self, selector: Sel);

        /// *********************** Standard bindable commands ************************
        ///
        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveForward:))]
        #[unsafe(method_family = none)]
        unsafe fn moveForward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveRight:))]
        #[unsafe(method_family = none)]
        unsafe fn moveRight(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveBackward:))]
        #[unsafe(method_family = none)]
        unsafe fn moveBackward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveLeft:))]
        #[unsafe(method_family = none)]
        unsafe fn moveLeft(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveUp:))]
        #[unsafe(method_family = none)]
        unsafe fn moveUp(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveDown:))]
        #[unsafe(method_family = none)]
        unsafe fn moveDown(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordForward:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordForward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordBackward:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordBackward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToBeginningOfLine:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToBeginningOfLine(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToEndOfLine:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToEndOfLine(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToBeginningOfParagraph:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToBeginningOfParagraph(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToEndOfParagraph:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToEndOfParagraph(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToEndOfDocument:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToEndOfDocument(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToBeginningOfDocument:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToBeginningOfDocument(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(pageDown:))]
        #[unsafe(method_family = none)]
        unsafe fn pageDown(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(pageUp:))]
        #[unsafe(method_family = none)]
        unsafe fn pageUp(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(centerSelectionInVisibleArea:))]
        #[unsafe(method_family = none)]
        unsafe fn centerSelectionInVisibleArea(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveBackwardAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveBackwardAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveForwardAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveForwardAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordForwardAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordForwardAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordBackwardAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordBackwardAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveUpAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveUpAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveDownAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveDownAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToBeginningOfLineAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToBeginningOfLineAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToEndOfLineAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToEndOfLineAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToBeginningOfParagraphAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToBeginningOfParagraphAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToEndOfParagraphAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToEndOfParagraphAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToEndOfDocumentAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToEndOfDocumentAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToBeginningOfDocumentAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToBeginningOfDocumentAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(pageDownAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn pageDownAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(pageUpAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn pageUpAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveParagraphForwardAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveParagraphForwardAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveParagraphBackwardAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveParagraphBackwardAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordRight:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordRight(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordLeft:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordLeft(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveRightAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveRightAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveLeftAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveLeftAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordRightAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordRightAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveWordLeftAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveWordLeftAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToLeftEndOfLine:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToLeftEndOfLine(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToRightEndOfLine:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToRightEndOfLine(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToLeftEndOfLineAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToLeftEndOfLineAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(moveToRightEndOfLineAndModifySelection:))]
        #[unsafe(method_family = none)]
        unsafe fn moveToRightEndOfLineAndModifySelection(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(scrollPageUp:))]
        #[unsafe(method_family = none)]
        unsafe fn scrollPageUp(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(scrollPageDown:))]
        #[unsafe(method_family = none)]
        unsafe fn scrollPageDown(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(scrollLineUp:))]
        #[unsafe(method_family = none)]
        unsafe fn scrollLineUp(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(scrollLineDown:))]
        #[unsafe(method_family = none)]
        unsafe fn scrollLineDown(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(scrollToBeginningOfDocument:))]
        #[unsafe(method_family = none)]
        unsafe fn scrollToBeginningOfDocument(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(scrollToEndOfDocument:))]
        #[unsafe(method_family = none)]
        unsafe fn scrollToEndOfDocument(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(transpose:))]
        #[unsafe(method_family = none)]
        unsafe fn transpose(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(transposeWords:))]
        #[unsafe(method_family = none)]
        unsafe fn transposeWords(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(selectAll:))]
        #[unsafe(method_family = none)]
        unsafe fn selectAll(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(selectParagraph:))]
        #[unsafe(method_family = none)]
        unsafe fn selectParagraph(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(selectLine:))]
        #[unsafe(method_family = none)]
        unsafe fn selectLine(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(selectWord:))]
        #[unsafe(method_family = none)]
        unsafe fn selectWord(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(indent:))]
        #[unsafe(method_family = none)]
        unsafe fn indent(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertTab:))]
        #[unsafe(method_family = none)]
        unsafe fn insertTab(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertBacktab:))]
        #[unsafe(method_family = none)]
        unsafe fn insertBacktab(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertNewline:))]
        #[unsafe(method_family = none)]
        unsafe fn insertNewline(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertParagraphSeparator:))]
        #[unsafe(method_family = none)]
        unsafe fn insertParagraphSeparator(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertNewlineIgnoringFieldEditor:))]
        #[unsafe(method_family = none)]
        unsafe fn insertNewlineIgnoringFieldEditor(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertTabIgnoringFieldEditor:))]
        #[unsafe(method_family = none)]
        unsafe fn insertTabIgnoringFieldEditor(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertLineBreak:))]
        #[unsafe(method_family = none)]
        unsafe fn insertLineBreak(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertContainerBreak:))]
        #[unsafe(method_family = none)]
        unsafe fn insertContainerBreak(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertSingleQuoteIgnoringSubstitution:))]
        #[unsafe(method_family = none)]
        unsafe fn insertSingleQuoteIgnoringSubstitution(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(insertDoubleQuoteIgnoringSubstitution:))]
        #[unsafe(method_family = none)]
        unsafe fn insertDoubleQuoteIgnoringSubstitution(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(changeCaseOfLetter:))]
        #[unsafe(method_family = none)]
        unsafe fn changeCaseOfLetter(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(uppercaseWord:))]
        #[unsafe(method_family = none)]
        unsafe fn uppercaseWord(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(lowercaseWord:))]
        #[unsafe(method_family = none)]
        unsafe fn lowercaseWord(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(capitalizeWord:))]
        #[unsafe(method_family = none)]
        unsafe fn capitalizeWord(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteForward:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteForward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteBackward:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteBackward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteBackwardByDecomposingPreviousCharacter:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteBackwardByDecomposingPreviousCharacter(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteWordForward:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteWordForward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteWordBackward:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteWordBackward(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteToBeginningOfLine:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteToBeginningOfLine(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteToEndOfLine:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteToEndOfLine(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteToBeginningOfParagraph:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteToBeginningOfParagraph(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteToEndOfParagraph:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteToEndOfParagraph(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(yank:))]
        #[unsafe(method_family = none)]
        unsafe fn yank(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(complete:))]
        #[unsafe(method_family = none)]
        unsafe fn complete(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(setMark:))]
        #[unsafe(method_family = none)]
        unsafe fn setMark(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(deleteToMark:))]
        #[unsafe(method_family = none)]
        unsafe fn deleteToMark(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(selectToMark:))]
        #[unsafe(method_family = none)]
        unsafe fn selectToMark(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(swapWithMark:))]
        #[unsafe(method_family = none)]
        unsafe fn swapWithMark(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(cancelOperation:))]
        #[unsafe(method_family = none)]
        unsafe fn cancelOperation(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(makeBaseWritingDirectionNatural:))]
        #[unsafe(method_family = none)]
        unsafe fn makeBaseWritingDirectionNatural(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(makeBaseWritingDirectionLeftToRight:))]
        #[unsafe(method_family = none)]
        unsafe fn makeBaseWritingDirectionLeftToRight(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(makeBaseWritingDirectionRightToLeft:))]
        #[unsafe(method_family = none)]
        unsafe fn makeBaseWritingDirectionRightToLeft(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(makeTextWritingDirectionNatural:))]
        #[unsafe(method_family = none)]
        unsafe fn makeTextWritingDirectionNatural(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(makeTextWritingDirectionLeftToRight:))]
        #[unsafe(method_family = none)]
        unsafe fn makeTextWritingDirectionLeftToRight(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(makeTextWritingDirectionRightToLeft:))]
        #[unsafe(method_family = none)]
        unsafe fn makeTextWritingDirectionRightToLeft(&self, sender: Option<&AnyObject>);

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(quickLookPreviewItems:))]
        #[unsafe(method_family = none)]
        unsafe fn quickLookPreviewItems(&self, sender: Option<&AnyObject>);

        /// Present a context menu at the text cursor position, selection, or wherever is appropriate for your responder.
        ///
        /// NSView has a default implementation of this method. For any view that returns a non-nil value from `-menuForEvent:`, the default implementation will display that menu automatically. The NSView implementation uses the `selectionAnchorRect` method in the `NSViewContentSelectionInfo` protocol to determine the location of the selection and of the menu. The NSView implementation determines the menu to display by calling `menuForEvent:` with a right-mouse-down event that is centered on the anchor rect. If `selectionAnchorRect` is not implemented, then the NSView implementation calls `menuForEvent` with a right-mouse-down event that is centered on the view's bounds, and also displays the menu at that location.
        ///
        /// You should only override this method in a custom view if you need full control over the display of a context menu from the keyboard or Accessibility, beyond what is provided by default by NSView.
        ///
        /// If the view does not support a context menu, then you should call `[[self nextResponder] tryToPerform:_cmd with:sender]` to pass the request up the responder chain.
        ///
        ///
        /// Note: In some cases, this method will be called without a prior call to `contextMenuKeyDown:`. This occurs when a view receives an Accessibility ShowMenu action, or when the user has created a Cocoa Text key binding to map a different key combination to the `showContextMenuForSelection:` action.
        ///
        ///
        /// Parameter `sender`: The object that originated the display of the context menu.
        ///
        ///
        /// See also: `menuForEvent:`
        ///
        /// See also: `selectionAnchorRect`
        ///
        /// See also: `contextMenuKeyDown:`
        ///
        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[optional]
        #[unsafe(method(showContextMenuForSelection:))]
        #[unsafe(method_family = none)]
        unsafe fn showContextMenuForSelection(&self, sender: Option<&AnyObject>);
    }
);

/// NSStandardKeyBindingMethods.
impl NSResponder {
    extern_methods!();
}

extern_conformance!(
    unsafe impl NSStandardKeyBindingResponding for NSResponder {}
);

/// NSUndoSupport.
impl NSResponder {
    extern_methods!(
        #[unsafe(method(undoManager))]
        #[unsafe(method_family = none)]
        pub fn undoManager(&self) -> Option<Retained<NSUndoManager>>;
    );
}

/// NSControlEditingSupport.
impl NSResponder {
    extern_methods!(
        #[cfg(feature = "NSEvent")]
        #[unsafe(method(validateProposedFirstResponder:forEvent:))]
        #[unsafe(method_family = none)]
        pub fn validateProposedFirstResponder_forEvent(
            &self,
            responder: &NSResponder,
            event: Option<&NSEvent>,
        ) -> bool;
    );
}

/// NSErrorPresentation.
impl NSResponder {
    extern_methods!(
        #[cfg(feature = "NSWindow")]
        /// # Safety
        ///
        /// - `delegate` should be of the correct type.
        /// - `did_present_selector` must be a valid selector.
        /// - `context_info` must be a valid pointer or null.
        #[unsafe(method(presentError:modalForWindow:delegate:didPresentSelector:contextInfo:))]
        #[unsafe(method_family = none)]
        pub unsafe fn presentError_modalForWindow_delegate_didPresentSelector_contextInfo(
            &self,
            error: &NSError,
            window: &NSWindow,
            delegate: Option<&AnyObject>,
            did_present_selector: Option<Sel>,
            context_info: *mut c_void,
        );

        #[unsafe(method(presentError:))]
        #[unsafe(method_family = none)]
        pub fn presentError(&self, error: &NSError) -> bool;

        #[unsafe(method(willPresentError:))]
        #[unsafe(method_family = none)]
        pub fn willPresentError(&self, error: &NSError) -> Retained<NSError>;
    );
}

/// NSTextFinderSupport.
impl NSResponder {
    extern_methods!(
        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[unsafe(method(performTextFinderAction:))]
        #[unsafe(method_family = none)]
        pub unsafe fn performTextFinderAction(&self, sender: Option<&AnyObject>);
    );
}

/// NSWindowTabbing.
impl NSResponder {
    extern_methods!(
        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[unsafe(method(newWindowForTab:))]
        #[unsafe(method_family = none)]
        pub unsafe fn newWindowForTab(&self, sender: Option<&AnyObject>);
    );
}

/// NSWritingToolsSupport.
impl NSResponder {
    extern_methods!(
        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[unsafe(method(showWritingTools:))]
        #[unsafe(method_family = none)]
        pub unsafe fn showWritingTools(&self, sender: Option<&AnyObject>);
    );
}

/// NSDeprecated.
impl NSResponder {
    extern_methods!(
        #[deprecated = "This has always returned NO and had no effect on macOS"]
        #[unsafe(method(performMnemonic:))]
        #[unsafe(method_family = none)]
        pub fn performMnemonic(&self, string: &NSString) -> bool;
    );
}
