diff options
Diffstat (limited to 'bin/gfcocoa.m')
-rw-r--r-- | bin/gfcocoa.m | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/bin/gfcocoa.m b/bin/gfcocoa.m new file mode 100644 index 00000000..ae2a1445 --- /dev/null +++ b/bin/gfcocoa.m @@ -0,0 +1,105 @@ +/* Copyright (c) 2018, Curtis McEnroe <programble@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#import <Cocoa/Cocoa.h> +#import <stdint.h> +#import <stdlib.h> + +extern int init(int argc, char *argv[]); +extern void draw(uint32_t *buf, size_t xres, size_t yres); +extern void input(char in); + +#define WIDTH (640) +#define HEIGHT (480) + +static size_t size = 4 * WIDTH * HEIGHT; +static uint32_t buf[WIDTH * HEIGHT]; + +@interface BufferView : NSView { } +@end + +@implementation BufferView +- (void) drawRect: (NSRect) dirtyRect { + CGContextRef ctx = [[NSGraphicsContext currentContext] CGContext]; + CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); + CGDataProviderRef data = CGDataProviderCreateWithData(NULL, buf, size, NULL); + CGImageRef image = CGImageCreate( + WIDTH, + HEIGHT, + 8, + 32, + WIDTH * 4, + rgb, + kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst, + data, + NULL, + false, + kCGRenderingIntentDefault + ); + CGContextDrawImage(ctx, CGRectMake(0, 0, WIDTH, HEIGHT), image); + CGImageRelease(image); + CGDataProviderRelease(data); + CGColorSpaceRelease(rgb); +} + +- (BOOL) acceptsFirstResponder { + return YES; +} + +- (void) keyDown: (NSEvent *) event { + char in; + [ + [event characters] + getBytes: &in + maxLength: 1 + usedLength: NULL + encoding: NSASCIIStringEncoding + options: NSStringEncodingConversionAllowLossy + range: NSMakeRange(0, 1) + remainingRange: NULL + ]; + input(in); + draw(buf, WIDTH, HEIGHT); + [self setNeedsDisplay: YES]; +} +@end + +int main(int argc, char *argv[]) { + int error = init(argc, argv); + if (error) return error; + + [NSApplication sharedApplication]; + [NSApp setActivationPolicy: NSApplicationActivationPolicyRegular]; + + NSWindow *window = [ + [NSWindow alloc] + initWithContentRect: NSMakeRect(0, 0, 640, 480) + styleMask: NSTitledWindowMask | NSClosableWindowMask + backing: NSBackingStoreBuffered + defer: NO + ]; + [window setTitle: [[NSString alloc] initWithUTF8String: argv[0]]]; + [window center]; + + BufferView *view = [[BufferView alloc] initWithFrame: [window frame]]; + [window setContentView: view]; + + draw(buf, WIDTH, HEIGHT); + + [window makeKeyAndOrderFront: nil]; + [NSApp activateIgnoringOtherApps: YES]; + [NSApp run]; +} |