parent
7045c20e5b
commit
336c043d87
6 changed files with 256 additions and 1 deletions
@ -0,0 +1,8 @@ |
||||
#ifndef ENGINE_GL_COCOA_H |
||||
#define ENGINE_GL_COCOA_H |
||||
|
||||
int engine_gl_cocoa_args(int argc, char **argv); |
||||
void engine_gl_cocoa_loop(void); |
||||
void engine_gl_cocoa_shutdown(void); |
||||
|
||||
#endif |
@ -0,0 +1,231 @@ |
||||
/* NOTE: If you're using Expedite for performance testing, |
||||
set "Disable Beam Synchronization" in GL_Cocoa Debug. */ |
||||
|
||||
#include "main.h" |
||||
|
||||
#include <Cocoa/Cocoa.h> |
||||
#include <Evas_Engine_GL_Cocoa.h> |
||||
|
||||
static NSView * evas_view; |
||||
static NSWindow * main_window; |
||||
|
||||
|
||||
int |
||||
engine_gl_cocoa_args(int argc, char **argv) |
||||
{ |
||||
Evas_Engine_Info_GL_Cocoa *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], "gl-cocoa")) ok = 1; |
||||
} |
||||
} |
||||
if (!ok) return 0; |
||||
*/ |
||||
|
||||
evas_output_method_set(evas, evas_render_method_lookup("gl_cocoa")); |
||||
einfo = (Evas_Engine_Info_GL_Cocoa *)evas_engine_info_get(evas); |
||||
if (!einfo) |
||||
{ |
||||
printf("Evas is a goat and can't run GL_COCOA ... or .... it's me the goat\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 EvasGLView 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_output_size_set(evas, win_w, win_h); |
||||
evas_output_viewport_set(evas, 0, 0, win_w, win_h); |
||||
|
||||
einfo->window = main_window; |
||||
|
||||
//einfo->info.context = [evas_view context]; |
||||
if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo)) |
||||
{ |
||||
printf("Evas can not setup the informations of the GL_Cocoa Engine\n"); |
||||
exit(-1); |
||||
} |
||||
|
||||
evas_view = (NSView*)einfo->view; |
||||
[[main_window contentView] addSubview:evas_view]; |
||||
[evas_view display]; |
||||
|
||||
evas_damage_rectangle_add(evas,0,0, win_w ,win_h); |
||||
return 1; |
||||
} |
||||
|
||||
void |
||||
engine_gl_cocoa_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]; |
||||
} |
||||
|
||||
void |
||||
engine_gl_cocoa_shutdown(void) |
||||
{ |
||||
/* If someone knows what to do here... */ |
||||
} |
Loading…
Reference in new issue