484 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			484 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
#import "BasicOpenGLView.h"
 | 
						|
 | 
						|
#include <kinc/input/keyboard.h>
 | 
						|
#include <kinc/input/mouse.h>
 | 
						|
#include <kinc/input/pen.h>
 | 
						|
#include <kinc/system.h>
 | 
						|
 | 
						|
#ifdef KINC_METAL
 | 
						|
#include <kinc/graphics5/graphics.h>
 | 
						|
#endif
 | 
						|
 | 
						|
@implementation BasicOpenGLView
 | 
						|
 | 
						|
static bool shift = false;
 | 
						|
static bool ctrl = false;
 | 
						|
static bool alt = false;
 | 
						|
static bool cmd = false;
 | 
						|
 | 
						|
#ifndef KINC_METAL
 | 
						|
+ (NSOpenGLPixelFormat *)basicPixelFormat {
 | 
						|
	// TODO (DK) pass via argument in
 | 
						|
	int aa = 1; // Kore::Application::the()->antialiasing();
 | 
						|
	if (aa > 0) {
 | 
						|
		NSOpenGLPixelFormatAttribute attributes[] = {NSOpenGLPFADoubleBuffer,          NSOpenGLPFADepthSize,
 | 
						|
		                                             (NSOpenGLPixelFormatAttribute)24, // 16 bit depth buffer
 | 
						|
		                                             NSOpenGLPFAOpenGLProfile,         NSOpenGLProfileVersion3_2Core,
 | 
						|
		                                             NSOpenGLPFASupersample,           NSOpenGLPFASampleBuffers,
 | 
						|
		                                             (NSOpenGLPixelFormatAttribute)1,  NSOpenGLPFASamples,
 | 
						|
		                                             (NSOpenGLPixelFormatAttribute)aa, NSOpenGLPFAStencilSize,
 | 
						|
		                                             (NSOpenGLPixelFormatAttribute)8,  (NSOpenGLPixelFormatAttribute)0};
 | 
						|
		return [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		NSOpenGLPixelFormatAttribute attributes[] = {
 | 
						|
		    NSOpenGLPFADoubleBuffer,         NSOpenGLPFADepthSize,           (NSOpenGLPixelFormatAttribute)24, // 16 bit depth buffer
 | 
						|
		    NSOpenGLPFAOpenGLProfile,        NSOpenGLProfileVersion3_2Core,  NSOpenGLPFAStencilSize,
 | 
						|
		    (NSOpenGLPixelFormatAttribute)8, (NSOpenGLPixelFormatAttribute)0};
 | 
						|
		return [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
- (void)switchBuffers {
 | 
						|
	[[self openGLContext] flushBuffer];
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
- (void)flagsChanged:(NSEvent *)theEvent {
 | 
						|
	if (shift) {
 | 
						|
		kinc_internal_keyboard_trigger_key_up(KINC_KEY_SHIFT);
 | 
						|
		shift = false;
 | 
						|
	}
 | 
						|
	if (ctrl) {
 | 
						|
		kinc_internal_keyboard_trigger_key_up(KINC_KEY_CONTROL);
 | 
						|
		ctrl = false;
 | 
						|
	}
 | 
						|
	if (alt) {
 | 
						|
		kinc_internal_keyboard_trigger_key_up(KINC_KEY_ALT);
 | 
						|
		alt = false;
 | 
						|
	}
 | 
						|
	if (cmd) {
 | 
						|
		kinc_internal_keyboard_trigger_key_up(KINC_KEY_META);
 | 
						|
		cmd = false;
 | 
						|
	}
 | 
						|
 | 
						|
	if ([theEvent modifierFlags] & NSShiftKeyMask) {
 | 
						|
		kinc_internal_keyboard_trigger_key_down(KINC_KEY_SHIFT);
 | 
						|
		shift = true;
 | 
						|
	}
 | 
						|
	if ([theEvent modifierFlags] & NSControlKeyMask) {
 | 
						|
		kinc_internal_keyboard_trigger_key_down(KINC_KEY_CONTROL);
 | 
						|
		ctrl = true;
 | 
						|
	}
 | 
						|
	if ([theEvent modifierFlags] & NSAlternateKeyMask) {
 | 
						|
		kinc_internal_keyboard_trigger_key_down(KINC_KEY_ALT);
 | 
						|
		alt = true;
 | 
						|
	}
 | 
						|
	if ([theEvent modifierFlags] & NSCommandKeyMask) {
 | 
						|
		kinc_internal_keyboard_trigger_key_down(KINC_KEY_META);
 | 
						|
		cmd = true;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
- (void)keyDown:(NSEvent *)theEvent {
 | 
						|
	if ([theEvent isARepeat])
 | 
						|
		return;
 | 
						|
	NSString *characters = [theEvent charactersIgnoringModifiers];
 | 
						|
	if ([characters length]) {
 | 
						|
		unichar ch = [characters characterAtIndex:0];
 | 
						|
		switch (ch) { // keys that exist in keydown and keypress events
 | 
						|
		case 59:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_SEMICOLON);
 | 
						|
			break;
 | 
						|
		case 91:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_OPEN_BRACKET);
 | 
						|
			break;
 | 
						|
		case 93:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_CLOSE_BRACKET);
 | 
						|
			break;
 | 
						|
		case 39:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_QUOTE);
 | 
						|
			break;
 | 
						|
		case 92:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_BACK_SLASH);
 | 
						|
			break;
 | 
						|
		case 44:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_COMMA);
 | 
						|
			break;
 | 
						|
		case 46:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_PERIOD);
 | 
						|
			break;
 | 
						|
		case 47:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_SLASH);
 | 
						|
			break;
 | 
						|
		case 96:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_BACK_QUOTE);
 | 
						|
			break;
 | 
						|
		case 32:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_SPACE);
 | 
						|
			break;
 | 
						|
		case 45: // we need breaks because EQUALS triggered too for some reason
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_HYPHEN_MINUS);
 | 
						|
			break;
 | 
						|
		case 61:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_EQUALS);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		switch (ch) {
 | 
						|
		case NSRightArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_RIGHT);
 | 
						|
			break;
 | 
						|
		case NSLeftArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_LEFT);
 | 
						|
			break;
 | 
						|
		case NSUpArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_UP);
 | 
						|
			break;
 | 
						|
		case NSDownArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_DOWN);
 | 
						|
			break;
 | 
						|
		case 27:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_ESCAPE);
 | 
						|
			break;
 | 
						|
		case NSEnterCharacter:
 | 
						|
		case NSNewlineCharacter:
 | 
						|
		case NSCarriageReturnCharacter:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_RETURN);
 | 
						|
			kinc_internal_keyboard_trigger_key_press('\n');
 | 
						|
			break;
 | 
						|
		case 0x7f:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_BACKSPACE);
 | 
						|
			kinc_internal_keyboard_trigger_key_press('\x08');
 | 
						|
			break;
 | 
						|
		case 9:
 | 
						|
			kinc_internal_keyboard_trigger_key_down(KINC_KEY_TAB);
 | 
						|
			kinc_internal_keyboard_trigger_key_press('\t');
 | 
						|
			break;
 | 
						|
		default:
 | 
						|
			if (ch == 'x' && [theEvent modifierFlags] & NSCommandKeyMask) {
 | 
						|
				char *text = kinc_internal_cut_callback();
 | 
						|
				if (text != NULL) {
 | 
						|
					NSPasteboard *board = [NSPasteboard generalPasteboard];
 | 
						|
					[board clearContents];
 | 
						|
					[board setString:[NSString stringWithUTF8String:text] forType:NSStringPboardType];
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (ch == 'c' && [theEvent modifierFlags] & NSCommandKeyMask) {
 | 
						|
				char *text = kinc_internal_copy_callback();
 | 
						|
				if (text != NULL) {
 | 
						|
					NSPasteboard *board = [NSPasteboard generalPasteboard];
 | 
						|
					[board clearContents];
 | 
						|
					[board setString:[NSString stringWithUTF8String:text] forType:NSStringPboardType];
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (ch == 'v' && [theEvent modifierFlags] & NSCommandKeyMask) {
 | 
						|
				NSPasteboard *board = [NSPasteboard generalPasteboard];
 | 
						|
				NSString *data = [board stringForType:NSStringPboardType];
 | 
						|
				if (data != nil) {
 | 
						|
					char charData[4096];
 | 
						|
					strcpy(charData, [data UTF8String]);
 | 
						|
					kinc_internal_paste_callback(charData);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (ch >= L'a' && ch <= L'z') {
 | 
						|
				kinc_internal_keyboard_trigger_key_down(ch - L'a' + KINC_KEY_A);
 | 
						|
			}
 | 
						|
			else if (ch >= L'A' && ch <= L'Z') {
 | 
						|
				kinc_internal_keyboard_trigger_key_down(ch - L'A' + KINC_KEY_A);
 | 
						|
			}
 | 
						|
			else if (ch >= L'0' && ch <= L'9') {
 | 
						|
				kinc_internal_keyboard_trigger_key_down(ch - L'0' + KINC_KEY_0);
 | 
						|
			}
 | 
						|
			kinc_internal_keyboard_trigger_key_press(ch);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
- (void)keyUp:(NSEvent *)theEvent {
 | 
						|
	NSString *characters = [theEvent charactersIgnoringModifiers];
 | 
						|
	if ([characters length]) {
 | 
						|
		unichar ch = [characters characterAtIndex:0];
 | 
						|
		switch (ch) {
 | 
						|
		case 59:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_SEMICOLON);
 | 
						|
			break;
 | 
						|
		case 91:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_OPEN_BRACKET);
 | 
						|
			break;
 | 
						|
		case 93:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_CLOSE_BRACKET);
 | 
						|
			break;
 | 
						|
		case 39:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_QUOTE);
 | 
						|
			break;
 | 
						|
		case 92:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_BACK_SLASH);
 | 
						|
			break;
 | 
						|
		case 44:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_COMMA);
 | 
						|
			break;
 | 
						|
		case 46:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_PERIOD);
 | 
						|
			break;
 | 
						|
		case 47:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_SLASH);
 | 
						|
			break;
 | 
						|
		case 96:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_BACK_QUOTE);
 | 
						|
			break;
 | 
						|
		case 45:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_HYPHEN_MINUS);
 | 
						|
			break;
 | 
						|
		case 61:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_EQUALS);
 | 
						|
			break;
 | 
						|
		case NSRightArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_RIGHT);
 | 
						|
			break;
 | 
						|
		case NSLeftArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_LEFT);
 | 
						|
			break;
 | 
						|
		case NSUpArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_UP);
 | 
						|
			break;
 | 
						|
		case NSDownArrowFunctionKey:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_DOWN);
 | 
						|
			break;
 | 
						|
		case 27:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_ESCAPE);
 | 
						|
			break;
 | 
						|
		case NSEnterCharacter:
 | 
						|
		case NSNewlineCharacter:
 | 
						|
		case NSCarriageReturnCharacter:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_RETURN);
 | 
						|
			break;
 | 
						|
		case 0x7f:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_BACKSPACE);
 | 
						|
			break;
 | 
						|
		case 9:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_TAB);
 | 
						|
			break;
 | 
						|
		case 32:
 | 
						|
			kinc_internal_keyboard_trigger_key_up(KINC_KEY_SPACE);
 | 
						|
			break;
 | 
						|
		default:
 | 
						|
			if (ch >= L'a' && ch <= L'z') {
 | 
						|
				kinc_internal_keyboard_trigger_key_up(ch - L'a' + KINC_KEY_A);
 | 
						|
			}
 | 
						|
			else if (ch >= L'A' && ch <= L'Z') {
 | 
						|
				kinc_internal_keyboard_trigger_key_up(ch - L'A' + KINC_KEY_A);
 | 
						|
			}
 | 
						|
			else if (ch >= L'0' && ch <= L'9') {
 | 
						|
				kinc_internal_keyboard_trigger_key_up(ch - L'0' + KINC_KEY_0);
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
static int getMouseX(NSEvent *event) {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	NSWindow *window = [[NSApplication sharedApplication] mainWindow];
 | 
						|
	float scale = [window backingScaleFactor];
 | 
						|
	return (int)([event locationInWindow].x * scale);
 | 
						|
}
 | 
						|
 | 
						|
static int getMouseY(NSEvent *event) {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	NSWindow *window = [[NSApplication sharedApplication] mainWindow];
 | 
						|
	float scale = [window backingScaleFactor];
 | 
						|
	return (int)(kinc_height() - [event locationInWindow].y * scale);
 | 
						|
}
 | 
						|
 | 
						|
static bool controlKeyMouseButton = false;
 | 
						|
 | 
						|
- (void)mouseDown:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	if ([theEvent modifierFlags] & NSControlKeyMask) {
 | 
						|
		controlKeyMouseButton = true;
 | 
						|
		kinc_internal_mouse_trigger_press(0, 1, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		controlKeyMouseButton = false;
 | 
						|
		kinc_internal_mouse_trigger_press(0, 0, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
	}
 | 
						|
 | 
						|
	if ([theEvent subtype] == NSTabletPointEventSubtype) {
 | 
						|
		kinc_internal_pen_trigger_press(0, getMouseX(theEvent), getMouseY(theEvent), theEvent.pressure);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
- (void)mouseUp:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	if (controlKeyMouseButton) {
 | 
						|
		kinc_internal_mouse_trigger_release(0, 1, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		kinc_internal_mouse_trigger_release(0, 0, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
	}
 | 
						|
	controlKeyMouseButton = false;
 | 
						|
 | 
						|
	if ([theEvent subtype] == NSTabletPointEventSubtype) {
 | 
						|
		kinc_internal_pen_trigger_release(0, getMouseX(theEvent), getMouseY(theEvent), theEvent.pressure);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
- (void)mouseMoved:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	kinc_internal_mouse_trigger_move(0, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
}
 | 
						|
 | 
						|
- (void)mouseDragged:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	kinc_internal_mouse_trigger_move(0, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
 | 
						|
	if ([theEvent subtype] == NSTabletPointEventSubtype) {
 | 
						|
		kinc_internal_pen_trigger_move(0, getMouseX(theEvent), getMouseY(theEvent), theEvent.pressure);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
- (void)rightMouseDown:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	kinc_internal_mouse_trigger_press(0, 1, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
}
 | 
						|
 | 
						|
- (void)rightMouseUp:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	kinc_internal_mouse_trigger_release(0, 1, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
}
 | 
						|
 | 
						|
- (void)rightMouseDragged:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	kinc_internal_mouse_trigger_move(0, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
}
 | 
						|
 | 
						|
- (void)otherMouseDown:(NSEvent *)theEvent {
 | 
						|
	kinc_internal_mouse_trigger_press(0, 2, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
}
 | 
						|
 | 
						|
- (void)otherMouseUp:(NSEvent *)theEvent {
 | 
						|
	kinc_internal_mouse_trigger_release(0, 2, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
}
 | 
						|
 | 
						|
- (void)otherMouseDragged:(NSEvent *)theEvent {
 | 
						|
	kinc_internal_mouse_trigger_move(0, getMouseX(theEvent), getMouseY(theEvent));
 | 
						|
}
 | 
						|
 | 
						|
- (void)scrollWheel:(NSEvent *)theEvent {
 | 
						|
	// TODO (DK) map [theEvent window] to window id instead of 0
 | 
						|
	int delta = [theEvent deltaY];
 | 
						|
	kinc_internal_mouse_trigger_scroll(0, -delta);
 | 
						|
}
 | 
						|
 | 
						|
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
 | 
						|
	NSPasteboard *pboard = [sender draggingPasteboard];
 | 
						|
	NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
 | 
						|
	if ([[pboard types] containsObject:NSURLPboardType]) {
 | 
						|
		if (sourceDragMask & NSDragOperationLink) {
 | 
						|
			return NSDragOperationLink;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return NSDragOperationNone;
 | 
						|
}
 | 
						|
 | 
						|
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
 | 
						|
	NSPasteboard *pboard = [sender draggingPasteboard];
 | 
						|
	// NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
 | 
						|
	if ([[pboard types] containsObject:NSURLPboardType]) {
 | 
						|
		NSURL *fileURL = [NSURL URLFromPasteboard:pboard];
 | 
						|
		wchar_t *filePath = (wchar_t *)[fileURL.path cStringUsingEncoding:NSUTF32LittleEndianStringEncoding];
 | 
						|
		kinc_internal_drop_files_callback(filePath);
 | 
						|
	}
 | 
						|
	return YES;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef KINC_METAL
 | 
						|
- (void)prepareOpenGL {
 | 
						|
	const GLint swapInt = 1;
 | 
						|
	[[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
 | 
						|
	[super prepareOpenGL];
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
- (void)update { // window resizes, moves and display changes (resize, depth and display config change)
 | 
						|
#ifdef KINC_OPENGL
 | 
						|
	[super update];
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
#ifndef KINC_METAL
 | 
						|
- (id)initWithFrame:(NSRect)frameRect {
 | 
						|
	NSOpenGLPixelFormat *pf = [BasicOpenGLView basicPixelFormat];
 | 
						|
	self = [super initWithFrame:frameRect pixelFormat:pf];
 | 
						|
 | 
						|
	[self prepareOpenGL];
 | 
						|
	[[self openGLContext] makeCurrentContext];
 | 
						|
	[self setWantsBestResolutionOpenGLSurface:YES];
 | 
						|
	return self;
 | 
						|
}
 | 
						|
#else
 | 
						|
 | 
						|
- (id)initWithFrame:(NSRect)frameRect {
 | 
						|
	self = [super initWithFrame:frameRect];
 | 
						|
 | 
						|
	device = MTLCreateSystemDefaultDevice();
 | 
						|
	commandQueue = [device newCommandQueue];
 | 
						|
	library = [device newDefaultLibrary];
 | 
						|
 | 
						|
	CAMetalLayer *metalLayer = (CAMetalLayer *)self.layer;
 | 
						|
 | 
						|
	metalLayer.device = device;
 | 
						|
	metalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm;
 | 
						|
	metalLayer.framebufferOnly = YES;
 | 
						|
	// metalLayer.presentsWithTransaction = YES;
 | 
						|
 | 
						|
	metalLayer.opaque = YES;
 | 
						|
	metalLayer.backgroundColor = nil;
 | 
						|
 | 
						|
	return self;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
- (BOOL)acceptsFirstResponder {
 | 
						|
	return YES;
 | 
						|
}
 | 
						|
 | 
						|
- (BOOL)becomeFirstResponder {
 | 
						|
	return YES;
 | 
						|
}
 | 
						|
 | 
						|
- (BOOL)resignFirstResponder {
 | 
						|
	return YES;
 | 
						|
}
 | 
						|
 | 
						|
- (void)resize:(NSSize)size {
 | 
						|
	[self setFrameSize:size];
 | 
						|
}
 | 
						|
 | 
						|
#ifdef KINC_METAL
 | 
						|
- (CAMetalLayer *)metalLayer {
 | 
						|
	return (CAMetalLayer *)self.layer;
 | 
						|
}
 | 
						|
 | 
						|
- (id<MTLDevice>)metalDevice {
 | 
						|
	return device;
 | 
						|
}
 | 
						|
 | 
						|
- (id<MTLLibrary>)metalLibrary {
 | 
						|
	return library;
 | 
						|
}
 | 
						|
 | 
						|
- (id<MTLCommandQueue>)metalQueue {
 | 
						|
	return commandQueue;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
@end
 | 
						|
 | 
						|
void kinc_copy_to_clipboard(const char *text) {
 | 
						|
	NSPasteboard *board = [NSPasteboard generalPasteboard];
 | 
						|
	[board clearContents];
 | 
						|
	[board setString:[NSString stringWithUTF8String:text] forType:NSStringPboardType];
 | 
						|
}
 |