[grits] Add support for Mac OS



commit 76547a2ce3597d4d6e99d8057503be1ab957dad6
Author: Andy Spencer <andy753421 gmail com>
Date:   Mon Dec 12 06:42:23 2011 +0000

    Add support for Mac OS

 src/grits-opengl.c       |    5 +++-
 src/grits-test.c         |    1 +
 src/gtkgl.c              |   52 ++++++++++++++++++++++++++++++----------------
 src/objects/grits-poly.c |    6 ++--
 4 files changed, 42 insertions(+), 22 deletions(-)
---
diff --git a/src/grits-opengl.c b/src/grits-opengl.c
index a39fbda..7b5697e 100644
--- a/src/grits-opengl.c
+++ b/src/grits-opengl.c
@@ -210,6 +210,8 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _
 {
 	g_debug("GritsOpenGL: on_expose - begin");
 
+	gtk_gl_begin(GTK_WIDGET(opengl));
+
 	glClear(GL_COLOR_BUFFER_BIT);
 
 	_set_visuals(opengl);
@@ -551,7 +553,8 @@ static void grits_opengl_init(GritsOpenGL *opengl)
 	opengl->sphere       = roam_sphere_new(opengl);
 	opengl->sphere_lock  = g_mutex_new();
 	gtk_gl_enable(GTK_WIDGET(opengl));
-	g_signal_connect(opengl, "realize", G_CALLBACK(on_realize), NULL);
+	gtk_widget_add_events(GTK_WIDGET(opengl), GDK_KEY_PRESS_MASK);
+	g_signal_connect(opengl, "map", G_CALLBACK(on_realize), NULL);
 }
 static void grits_opengl_dispose(GObject *_opengl)
 {
diff --git a/src/grits-test.c b/src/grits-test.c
index 3a44f02..c2f4195 100644
--- a/src/grits-test.c
+++ b/src/grits-test.c
@@ -79,6 +79,7 @@ int main(int argc, char **argv)
 	GtkWidget *config = gtk_notebook_new();
 	g_signal_connect(window, "delete-event",    G_CALLBACK(on_delete),    NULL);
 	g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
+	gtk_widget_set_size_request(GTK_WIDGET(viewer), 300, 300);
 	gtk_notebook_set_tab_pos(GTK_NOTEBOOK(config), GTK_POS_BOTTOM);
 	gtk_container_add(GTK_CONTAINER(window), vbox);
 	gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(viewer), TRUE,  TRUE,  0);
diff --git a/src/gtkgl.c b/src/gtkgl.c
index 052f562..bb87494 100644
--- a/src/gtkgl.c
+++ b/src/gtkgl.c
@@ -191,41 +191,57 @@ void gtk_gl_disable(GtkWidget *widget)
  * Mac OSX implementation *
  **************************/
 #elif defined(SYS_MAC)
+#include <gdk/gdkquartz.h>
 void gtk_gl_enable(GtkWidget *widget)
 {
-	CGDisplayCapture( kCGDirectMainDisplay );
-	CGLPixelFormatAttribute attribs[] =
-	{
-		kCGLPFANoRecovery,
-		kCGLPFADoubleBuffer,
-		kCGLPFAFullScreen,
-		kCGLPFAStencilSize, ( CGLPixelFormatAttribute ) 8,
-		kCGLPFADisplayMask, ( CGLPixelFormatAttribute ) CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ),
-		( CGLPixelFormatAttribute ) NULL
-	};
-
-	CGLPixelFormatObj pixelFormatObj;
-	GLint numPixelFormats;
-	CGLChoosePixelFormat( attribs, &pixelFormatObj, &numPixelFormats );
+	g_debug("GtkGl: enable");
 
-	CGLCreateContext( pixelFormatObj, NULL, &contextObj );
+	/* Create context */
+	NSOpenGLPixelFormatAttribute attribs[] = {
+		NSOpenGLPFAColorSize, 24,
+		NSOpenGLPFAAlphaSize, 8,
+		NSOpenGLPFADepthSize, 1,
+		NSOpenGLPFADoubleBuffer,
+		0
+	};
+	NSOpenGLPixelFormat *pix = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
+	NSOpenGLContext     *ctx = [[NSOpenGLContext     alloc] initWithFormat:pix shareContext:nil];
 
-	CGLDestroyPixelFormat( pixelFormatObj );
+	/* Attach to widget */
+	gtk_widget_set_double_buffered(widget, FALSE);
 
-	CGLSetCurrentContext( contextObj );
-	CGLSetFullScreen( contextObj );
+	/* Save context */
+	g_object_set_data(G_OBJECT(widget), "glcontext", ctx);
 }
 
 void gtk_gl_begin(GtkWidget *widget)
 {
+	g_debug("GtkGl: begin");
+	GtkAllocation alloc;
+	gdk_window_ensure_native(gtk_widget_get_window(widget));
+	gtk_widget_get_allocation(widget, &alloc);
+
+	NSOpenGLContext *ctx  = g_object_get_data(G_OBJECT(widget), "glcontext");
+	GdkWindow       *win  = gtk_widget_get_window(widget);
+	NSView          *view = gdk_quartz_window_get_nsview(win);
+	NSRect           rect = NSMakeRect(alloc.x, alloc.y, alloc.width, alloc.height);
+
+	[ctx  setView:view];
+	[ctx  makeCurrentContext];
+	[ctx  update];
+	[view setFrame:rect];
 }
 
 void gtk_gl_end(GtkWidget *widget)
 {
+	g_debug("GtkGl: end");
+	NSOpenGLContext *ctx = g_object_get_data(G_OBJECT(widget), "glcontext");
+	[ctx flushBuffer];
 }
 
 void gtk_gl_disable(GtkWidget *widget)
 {
+	g_debug("GtkGl: disable");
 }
 
 
diff --git a/src/objects/grits-poly.c b/src/objects/grits-poly.c
index 5d54a70..25a81b5 100644
--- a/src/objects/grits-poly.c
+++ b/src/objects/grits-poly.c
@@ -31,9 +31,9 @@ static void grits_poly_tess(gdouble (**points)[3])
 {
 	//g_debug("GritsPoly: tess");
 	GLUtesselator *tess = gluNewTess();
-	gluTessCallback(tess, GLU_TESS_BEGIN,  (_GLUfuncptr)glBegin);
-	gluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)glVertex3dv);
-	gluTessCallback(tess, GLU_TESS_END,    (_GLUfuncptr)glEnd);
+	gluTessCallback(tess, GLU_TESS_BEGIN,  glBegin);
+	gluTessCallback(tess, GLU_TESS_VERTEX, glVertex3dv);
+	gluTessCallback(tess, GLU_TESS_END,    glEnd);
 	for (int pi = 0; points[pi]; pi++) {
 		gluTessBeginPolygon(tess, NULL);
 		gluTessBeginContour(tess);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]