From d7e2a1d357155099ef3c431099a9ad8794b14b6e Mon Sep 17 00:00:00 2001 From: raster Date: Sat, 20 Sep 2008 02:06:48 +0000 Subject: [PATCH] tim horton's expedite patches part 2 - add files. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/expedite@36109 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/engine_quartz.h | 7 ++ src/bin/engine_quartz.m | 255 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100644 src/bin/engine_quartz.h create mode 100644 src/bin/engine_quartz.m diff --git a/src/bin/engine_quartz.h b/src/bin/engine_quartz.h new file mode 100644 index 0000000..efb32f6 --- /dev/null +++ b/src/bin/engine_quartz.h @@ -0,0 +1,7 @@ +#ifndef ENGINE_QUARTZ_H +#define ENGINE_QUARTZ_H + +int engine_quartz_args(int argc, char **argv); +void engine_quartz_loop(void); + +#endif diff --git a/src/bin/engine_quartz.m b/src/bin/engine_quartz.m new file mode 100644 index 0000000..d804341 --- /dev/null +++ b/src/bin/engine_quartz.m @@ -0,0 +1,255 @@ +/* NOTE: If you're using Expedite for performance testing, + set "Disable Beam Synchronization" in Quartz Debug. */ + +#include "main.h" + +#include +#include + +@interface EvasView : NSView +{ + CGContextRef ctx; +} +@end + +static EvasView * evas_view; +static NSWindow * main_window; + +@implementation EvasView + +- (id) init +{ + self = [super init]; + if (self != nil) + { + ctx = NULL; + } + return self; +} + +- (void)drawRect:(NSRect)rect +{ + if(ctx != NULL) + { + evas_damage_rectangle_add(evas, 0, 0, win_w, win_h); + return; + } + + ctx = [[NSGraphicsContext currentContext] graphicsPort]; + CGContextRetain(ctx); +} + +- (CGContextRef)context +{ + return ctx; +} + +@end + +int +engine_quartz_args(int argc, char **argv) +{ + Evas_Engine_Info_Quartz *einfo; + int i; + int ok = 0; + + for (i = 1; i < argc; i++) + { + if ((!strcmp(argv[i], "-e")) && (i < (argc - 1))) + { + i++; + if (!strcmp(argv[i], "quartz")) ok = 1; + } + } + if (!ok) return 0; + + evas_output_method_set(evas, evas_render_method_lookup("quartz")); + einfo = (Evas_Engine_Info_Quartz *)evas_engine_info_get(evas); + if (!einfo) + { + printf("Evas does not support the Quartz Engine\n"); + return 0; + } + + // Set up the Cocoa runtime + [[NSAutoreleasePool alloc] init]; + [NSApplication sharedApplication]; + + // Register ourselves as a full-fledged Cocoa app, instead of a NSUIElement. + // This gives benefits like window focus and a dock icon! + ProcessSerialNumber psn = { 0, kCurrentProcess }; + TransformProcessType (&psn, kProcessTransformToForegroundApplication); + + [NSApp finishLaunching]; + + // Create our main window, and embed an EvasView in it + main_window = [[NSWindow alloc] initWithContentRect:NSMakeRect(20,500,win_w,win_h) styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask) backing:NSBackingStoreBuffered defer:NO screen:nil]; + [main_window makeKeyAndOrderFront:NSApp]; + [main_window setTitle:@"Expedite"]; + [main_window makeMainWindow]; + [main_window setAcceptsMouseMovedEvents:YES]; + [NSApp activateIgnoringOtherApps:YES]; + + evas_view = [[EvasView alloc] initWithFrame:NSMakeRect(0,0,win_w,win_h)]; + [[main_window contentView] addSubview:evas_view]; + + // drawRect: must be run at least once, to make sure we've set ctx + [evas_view display]; + + evas_output_size_set(evas, win_w, win_h); + evas_output_viewport_set(evas, 0, 0, win_w, win_h); + + einfo->info.context = [evas_view context]; + evas_engine_info_set(evas, (Evas_Engine_Info *) einfo); + + return 1; +} + +void +engine_quartz_loop(void) +{ + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0.001]; + + NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:date + inMode:NSDefaultRunLoopMode + dequeue:YES]; + [date release]; + + if (!event) return; + + if([event type] == NSMouseMoved || [event type] == NSLeftMouseDragged || [event type] == NSRightMouseDragged) + { + evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL); + + // Also notify on entering or leaving the window + NSPoint mouseLoc = [[event window] convertBaseToScreen:[event locationInWindow]]; + + if(NSPointInRect(mouseLoc, [[event window] frame])) + evas_event_feed_mouse_in(evas, 0, NULL); + else + evas_event_feed_mouse_out(evas, 0, NULL); + + [NSApp sendEvent:event]; + } + else if([event type] == NSLeftMouseDown) + { + evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL); + evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + + [NSApp sendEvent:event]; + } + else if([event type] == NSLeftMouseUp) + { + evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL); + evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + + [NSApp sendEvent:event]; + } + else if([event type] == NSRightMouseDown) + { + evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL); + evas_event_feed_mouse_down(evas, 3, EVAS_BUTTON_NONE, 0, NULL); + [NSApp sendEvent:event]; + } + else if([event type] == NSRightMouseUp) + { + evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL); + evas_event_feed_mouse_up(evas, 3, EVAS_BUTTON_NONE, 0, NULL); + [NSApp sendEvent:event]; + } + else if([event type] == NSKeyDown) + { + NSString * chars = [event charactersIgnoringModifiers]; + + switch([chars characterAtIndex:0]) + { + case NSLeftArrowFunctionKey: + evas_event_feed_key_down(evas, "Left", "Left", NULL, NULL, 0, NULL); + break; + case NSRightArrowFunctionKey: + evas_event_feed_key_down(evas, "Right", "Right", NULL, NULL, 0, NULL); + break; + case NSEnterCharacter: + case NSCarriageReturnCharacter: + evas_event_feed_key_down(evas, "Return", "Return", NULL, NULL, 0, NULL); + break; + case 's': + case '\e': + evas_event_feed_key_down(evas, "Escape", "Escape", NULL, NULL, 0, NULL); + break; + case 'q': + evas_event_feed_key_down(evas, "q", "q", NULL, NULL, 0, NULL); + break; + } + + [chars release]; + } + else if([event type] == NSKeyUp) + { + NSString * chars = [event charactersIgnoringModifiers]; + + switch([chars characterAtIndex:0]) + { + case NSLeftArrowFunctionKey: + evas_event_feed_key_up(evas, "Left", "Left", NULL, NULL, 0, NULL); + break; + case NSRightArrowFunctionKey: + evas_event_feed_key_up(evas, "Right", "Right", NULL, NULL, 0, NULL); + break; + case NSEnterCharacter: + case NSCarriageReturnCharacter: + evas_event_feed_key_up(evas, "Return", "Return", NULL, NULL, 0, NULL); + break; + case '\e': + evas_event_feed_key_up(evas, "Escape", "Escape", NULL, NULL, 0, NULL); + break; + case 'q': + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock")) + evas_event_feed_key_up(evas, "Q", "Q", NULL, NULL, 0, NULL); + else + evas_event_feed_key_up(evas, "q", "q", NULL, NULL, 0, NULL); + break; + } + + [chars release]; + } + else if([event type] == NSFlagsChanged) + { + int flags = [event modifierFlags]; + + // Turn special key flags on + if(flags & NSShiftKeyMask) + evas_key_modifier_on(evas, "Shift"); + else if(flags & NSControlKeyMask) + evas_key_modifier_on(evas, "Control"); + else if(flags & NSAlternateKeyMask) + evas_key_modifier_on(evas, "Alt"); + else if(flags & NSCommandKeyMask) + evas_key_modifier_on(evas, "Super"); + else if(flags & NSAlphaShiftKeyMask) + { + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock")) + evas_key_lock_off(evas, "Caps_Lock"); + else + evas_key_lock_on(evas, "Caps_Lock"); + } + + // Turn special key flags off + if(!(flags & NSShiftKeyMask)) + evas_key_modifier_off(evas, "Shift"); + else if(!(flags & NSControlKeyMask)) + evas_key_modifier_off(evas, "Control"); + else if(!(flags & NSAlternateKeyMask)) + evas_key_modifier_off(evas, "Alt"); + else if(!(flags & NSCommandKeyMask)) + evas_key_modifier_off(evas, "Super"); + } + else + { + [NSApp sendEvent:event]; + } + + [event release]; + [NSAutoreleasePool release]; +} -- 2.7.4