8#include <Carbon/Carbon.h>
36 Window_mac*
window =
new Window_mac();
37 if (!
window->initWindow()) {
53 if (nil == delegate) {
58 constexpr int initialWidth = 1280;
59 constexpr int initialHeight = 960;
60 NSRect windowRect = NSMakeRect(100, 100, initialWidth, initialHeight);
62 NSUInteger windowStyle = (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask |
63 NSMiniaturizableWindowMask);
65 fWindow = [[NSWindow alloc] initWithContentRect:windowRect styleMask:windowStyle
66 backing:NSBackingStoreBuffered defer:NO];
80 [fWindow setContentView:view];
81 [fWindow makeFirstResponder:view];
82 [fWindow setDelegate:delegate];
83 [fWindow setAcceptsMouseMovedEvents:YES];
84 [fWindow setRestorable:NO];
89 fWindowNumber = fWindow.windowNumber;
97 gWindowMap.remove(fWindowNumber);
98 if (sk_app::Window_mac::gWindowMap.
count() < 1) {
99 [NSApp terminate:fWindow];
107 if (NSString* titleStr = [NSString stringWithUTF8String:title]) {
108 [fWindow setTitle:titleStr];
113 [fWindow orderFront:nil];
115 [NSApp activateIgnoringOtherApps:YES];
116 [fWindow makeKeyAndOrderFront:NSApp];
124 switch (attachType) {
126 case kANGLE_BackendType:
131#if defined(SK_GRAPHITE)
132 case kGraphiteDawn_BackendType:
138 case kVulkan_BackendType:
143 case kMetal_BackendType:
146#if defined(SK_GRAPHITE)
147 case kGraphiteMetal_BackendType:
153 case kNativeGL_BackendType:
174 if (
window->fIsContentInvalidated) {
189 fWindow = initWindow;
194- (void)windowDidResize:(NSNotification *)notification {
195 NSView* view = fWindow->window().contentView;
197 fWindow->onResize(view.bounds.size.width *
scale, view.bounds.size.height *
scale);
201- (
BOOL)windowShouldClose:(NSWindow*)sender {
202 fWindow->closeWindow();
214 static const struct {
218 { kVK_Delete, skui::Key::kBack },
219 { kVK_Return, skui::Key::kOK },
220 { kVK_UpArrow, skui::Key::kUp },
221 { kVK_DownArrow, skui::Key::kDown },
222 { kVK_LeftArrow, skui::Key::kLeft },
223 { kVK_RightArrow, skui::Key::kRight },
224 { kVK_Tab, skui::Key::kTab },
225 { kVK_PageUp, skui::Key::kPageUp },
226 { kVK_PageDown, skui::Key::kPageDown },
227 { kVK_Home, skui::Key::kHome },
228 { kVK_End, skui::Key::kEnd },
229 { kVK_ForwardDelete, skui::Key::kDelete },
230 { kVK_Escape, skui::Key::kEscape },
231 { kVK_Shift, skui::Key::kShift },
232 { kVK_RightShift, skui::Key::kShift },
233 { kVK_Control, skui::Key::kCtrl },
234 { kVK_RightControl, skui::Key::kCtrl },
235 { kVK_Option, skui::Key::kOption },
236 { kVK_RightOption, skui::Key::kOption },
237 { kVK_Command, skui::Key::kSuper },
238 { kVK_RightCommand, skui::Key::kSuper },
239 { kVK_ANSI_A, skui::Key::kA },
240 { kVK_ANSI_C, skui::Key::kC },
241 { kVK_ANSI_V, skui::Key::kV },
242 { kVK_ANSI_X, skui::Key::kX },
243 { kVK_ANSI_Y, skui::Key::kY },
244 { kVK_ANSI_Z, skui::Key::kZ },
247 for (
size_t i = 0; i < std::size(gPair); i++) {
248 if (gPair[i].fVK == vk) {
249 return gPair[i].fKey;
253 return skui::Key::kNONE;
257 NSUInteger modifierFlags = [event modifierFlags];
260 if (modifierFlags & NSEventModifierFlagCommand) {
263 if (modifierFlags & NSEventModifierFlagShift) {
266 if (modifierFlags & NSEventModifierFlagControl) {
269 if (modifierFlags & NSEventModifierFlagOption) {
292 fWindow = initWindow;
295 [
self updateTrackingAreas];
302 [fTrackingArea release];
310- (
BOOL)canBecomeKeyView {
314- (
BOOL)acceptsFirstResponder {
318- (void)updateTrackingAreas {
320 [
self removeTrackingArea:fTrackingArea];
321 [fTrackingArea release];
324 const NSTrackingAreaOptions
options = NSTrackingMouseEnteredAndExited |
325 NSTrackingActiveInKeyWindow |
326 NSTrackingEnabledDuringMouseDrag |
327 NSTrackingCursorUpdate |
328 NSTrackingInVisibleRect |
329 NSTrackingAssumeInside;
331 fTrackingArea = [[NSTrackingArea alloc] initWithRect:[
self bounds]
336 [
self addTrackingArea:fTrackingArea];
337 [
super updateTrackingAreas];
340- (
skui::ModifierKey) updateModifierKeys:(NSEvent*) event {
357 if (
Any(changed & cur.modifier)) {
360 (void) fWindow->onKey(cur.key,
state, modifiers);
367- (
BOOL)performKeyEquivalent:(NSEvent *)event {
368 [
self updateModifierKeys:event];
375 [
self performSelector:@selector(keyUp:) withObject:event afterDelay:0.1];
379- (void)keyDown:(NSEvent *)event {
383 if (
key != skui::Key::kNONE) {
385 if (skui::Key::kEscape ==
key) {
386 [NSApp terminate:fWindow->window()];
391 NSString* characters = [event charactersIgnoringModifiers];
392 NSUInteger
len = [characters length];
394 unichar* charBuffer =
new unichar[len+1];
395 [characters getCharacters:charBuffer range:NSMakeRange(0, len)];
396 for (NSUInteger i = 0; i <
len; ++i) {
397 (void) fWindow->onChar((
SkUnichar) charBuffer[i], modifiers);
399 delete [] charBuffer;
403- (void)keyUp:(NSEvent *)event {
407 if (
key != skui::Key::kNONE) {
412-(void)flagsChanged:(NSEvent *)event {
413 [
self updateModifierKeys:event];
416- (void)mouseDown:(NSEvent *)event {
417 NSView* view = fWindow->window().contentView;
422 const NSPoint
pos = [event locationInWindow];
423 const NSRect
rect = [view frame];
424 fWindow->onMouse(
pos.
x * backingScaleFactor, (
rect.size.height -
pos.
y) * backingScaleFactor,
428- (void)mouseUp:(NSEvent *)event {
429 NSView* view = fWindow->window().contentView;
434 const NSPoint
pos = [event locationInWindow];
435 const NSRect
rect = [view frame];
436 fWindow->onMouse(
pos.
x * backingScaleFactor, (
rect.size.height -
pos.
y) * backingScaleFactor,
440- (void)mouseDragged:(NSEvent *)event {
441 [
self updateModifierKeys:event];
442 [
self mouseMoved:event];
445- (void)mouseMoved:(NSEvent *)event {
446 NSView* view = fWindow->window().contentView;
451 const NSPoint
pos = [event locationInWindow];
452 const NSRect
rect = [view frame];
453 fWindow->onMouse(
pos.
x * backingScaleFactor, (
rect.size.height -
pos.
y) * backingScaleFactor,
457- (void)scrollWheel:(NSEvent *)event {
458 NSView* view = fWindow->window().contentView;
464 const NSPoint
pos = [event locationInWindow];
465 const NSRect
rect = [view frame];
466 fWindow->onMouseWheel([
event scrollingDeltaY],
467 pos.
x * backingScaleFactor,
468 (
rect.size.height -
pos.
y) * backingScaleFactor,
472- (void)drawRect:(NSRect)rect {
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
#define SkASSERT_RELEASE(cond)
static constexpr bool SkToBool(const T &x)
static skui::ModifierKey get_modifiers(const NSEvent *event)
static skui::Key get_key(unsigned short vk)
NSTrackingArea * fTrackingArea
skui::ModifierKey fLastModifiers
void setTitle(const char *) override
float scaleFactor() const override
static void PaintWindows()
bool attach(BackendType) override
static Window * CreateNativeWindow(void *platformData)
DisplayParams fRequestedDisplayParams
std::unique_ptr< skwindow::WindowContext > fWindowContext
sk_sp< SkBlender > blender SkRect rect
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, bool > constexpr Any(E e)
static CGFloat GetBackingScaleFactor(NSView *view)
constexpr float y() const
constexpr float x() const