expedite: Add gl_cocoa support in expedite

SVN revision: 64654
This commit is contained in:
Nicolas Aguirre 2011-11-02 18:31:31 +00:00
parent 7045c20e5b
commit 336c043d87
6 changed files with 256 additions and 1 deletions

View File

@ -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}"

View File

@ -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

View File

@ -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

231
src/bin/engine_gl_cocoa.m Normal file
View File

@ -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... */
}

View File

@ -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

View File

@ -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