From 336c043d87dbcb92b72c2d988cdcb2f264ca52b6 Mon Sep 17 00:00:00 2001 From: Nicolas Aguirre Date: Wed, 2 Nov 2011 18:31:31 +0000 Subject: [PATCH] expedite: Add gl_cocoa support in expedite SVN revision: 64654 --- configure.ac | 5 + src/bin/Makefile.am | 7 +- src/bin/engine_gl_cocoa.h | 8 ++ src/bin/engine_gl_cocoa.m | 231 ++++++++++++++++++++++++++++++++++++++ src/bin/main.c | 3 + src/bin/main.h | 3 + 6 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 src/bin/engine_gl_cocoa.h create mode 100644 src/bin/engine_gl_cocoa.m diff --git a/configure.ac b/configure.ac index 4d52f8e..8c715a2 100644 --- a/configure.ac +++ b/configure.ac @@ -85,6 +85,10 @@ EXPEDITE_CHECK_ENGINE([fb], [Framebuffer], "yes") # DIRECTFB EXPEDITE_CHECK_ENGINE([directfb], [DirectFB], "yes") +# GL Cocoa +EXPEDITE_CHECK_ENGINE([opengl-cocoa], [OpenGL Cocoa], "yes", [gl_cocoa_libs="-framework Cocoa"]) +AC_SUBST(gl_cocoa_libs) + # Software 16bit X11 EXPEDITE_CHECK_ENGINE([software-16-x11], [Software 16 bits X11], "yes") @@ -260,6 +264,7 @@ echo " Software DirectDraw..........: ${have_software_ddraw}" echo " Direct3D.....................: ${have_direct3d}" echo " Software SDL.................: ${have_software_sdl}" echo " Open GL SDL..................: ${have_opengl_sdl}" +echo " Open GL Cocoa................: ${have_opengl_cocoa}" echo " FB...........................: ${have_fb}" echo " DirectFB.....................: ${have_directfb}" echo " Software X11 16 bits.........: ${have_software_16_x11}" diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 20793b2..ba7cc04 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -144,7 +144,7 @@ proxy_text_random.c expedite_CFLAGS = @WIN32_CFLAGS@ expedite_CXXFLAGS = @EXPEDITE_CXXFLAGS@ -expedite_LDADD = @SDL_LIBS@ @x_libs@ @gdi_libs@ @ddraw_libs@ @ddraw_16_libs@ @d3d_libs@ @wince_16_libs@ @DIRECTFB_LIBS@ @XCB_LIBS@ @EVAS_LIBS@ @EINA_LIBS@ @EVIL_LIBS@ -lm +expedite_LDADD = @SDL_LIBS@ @x_libs@ @gdi_libs@ @ddraw_libs@ @ddraw_16_libs@ @d3d_libs@ @wince_16_libs@ @DIRECTFB_LIBS@ @XCB_LIBS@ @EVAS_LIBS@ @EINA_LIBS@ @EVIL_LIBS@ @gl_cocoa_libs@ -lm expedite_LDFLAGS = @lt_enable_auto_import@ if BUILD_SOFTWARE_XLIB @@ -207,6 +207,11 @@ expedite_SOURCES += \ engine_directfb.c engine_directfb.h endif +if BUILD_OPENGL_COCOA +expedite_SOURCES += \ +engine_gl_cocoa.m engine_gl_cocoa.h +endif + if BUILD_SOFTWARE_16_X11 expedite_SOURCES += \ engine_software_16_x11.c engine_software_16_x11.h diff --git a/src/bin/engine_gl_cocoa.h b/src/bin/engine_gl_cocoa.h new file mode 100644 index 0000000..77430c9 --- /dev/null +++ b/src/bin/engine_gl_cocoa.h @@ -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 diff --git a/src/bin/engine_gl_cocoa.m b/src/bin/engine_gl_cocoa.m new file mode 100644 index 0000000..a6878d7 --- /dev/null +++ b/src/bin/engine_gl_cocoa.m @@ -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 +#include + +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... */ +} diff --git a/src/bin/main.c b/src/bin/main.c index ad63dc6..29c23d4 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -1171,6 +1171,9 @@ static const Expedite_Engine engines[] = { #if HAVE_EVAS_DIRECTFB { "directfb",engine_directfb_args, engine_directfb_loop, engine_directfb_shutdown }, #endif +#if HAVE_EVAS_OPENGL_COCOA + { "gl-cocoa", engine_gl_cocoa_args, engine_gl_cocoa_loop, engine_gl_cocoa_shutdown }, +#endif #if HAVE_EVAS_SOFTWARE_16_X11 { "x11-16",engine_software_16_x11_args, engine_software_16_x11_loop, engine_software_16_x11_shutdown }, #endif diff --git a/src/bin/main.h b/src/bin/main.h index fc78a7e..c0f1348 100644 --- a/src/bin/main.h +++ b/src/bin/main.h @@ -61,6 +61,9 @@ #if HAVE_EVAS_DIRECTFB #include "engine_directfb.h" #endif +#if HAVE_EVAS_OPENGL_COCOA +#include "engine_gl_cocoa.h" +#endif #if HAVE_EVAS_SOFTWARE_16_X11 #include "engine_software_16_x11.h" #endif