From: Andy Spencer Date: Mon, 12 Dec 2011 06:42:23 +0000 (+0000) Subject: Add support for Mac OS X-Git-Tag: v0.7~41 X-Git-Url: http://pileus.org/git/?p=grits;a=commitdiff_plain;h=76547a2ce3597d4d6e99d8057503be1ab957dad6 Add support for Mac OS --- 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 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);