expedite: Add gl_cocoa support in expedite
authorcaptainigloo <captainigloo@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 2 Nov 2011 18:31:31 +0000 (18:31 +0000)
committercaptainigloo <captainigloo@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 2 Nov 2011 18:31:31 +0000 (18:31 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/expedite@64654 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

configure.ac
src/bin/Makefile.am
src/bin/engine_gl_cocoa.h [new file with mode: 0644]
src/bin/engine_gl_cocoa.m [new file with mode: 0644]
src/bin/main.c
src/bin/main.h

index 4d52f8e..8c715a2 100644 (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}"
index 20793b2..ba7cc04 100644 (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
diff --git a/src/bin/engine_gl_cocoa.h b/src/bin/engine_gl_cocoa.h
new file mode 100644 (file)
index 0000000..77430c9
--- /dev/null
@@ -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 (file)
index 0000000..a6878d7
--- /dev/null
@@ -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... */
+}
index ad63dc6..29c23d4 100644 (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
index fc78a7e..c0f1348 100644 (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