]> Pileus Git - grits/commitdiff
Add support for Mac OS
authorAndy Spencer <andy753421@gmail.com>
Mon, 12 Dec 2011 06:42:23 +0000 (06:42 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sun, 1 Jan 2012 23:32:06 +0000 (23:32 +0000)
src/grits-opengl.c
src/grits-test.c
src/gtkgl.c
src/objects/grits-poly.c

index a39fbda1733f87d8f55c9c8b1b354b00cabeb8ba..7b5697e4b19b529a36f28921c4f6f642114e1670 100644 (file)
@@ -210,6 +210,8 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _
 {
        g_debug("GritsOpenGL: on_expose - begin");
 
 {
        g_debug("GritsOpenGL: on_expose - begin");
 
+       gtk_gl_begin(GTK_WIDGET(opengl));
+
        glClear(GL_COLOR_BUFFER_BIT);
 
        _set_visuals(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));
        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)
 {
 }
 static void grits_opengl_dispose(GObject *_opengl)
 {
index 3a44f02b16c5c3fe66120b35761308a15df09db2..c2f419510a1b760eaeb49f474cbf2d8a8da80ba1 100644 (file)
@@ -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);
        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);
        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);
index 052f56256238cee402e9a48c138def126b92c2db..bb8749403e63ca72bee0dfb5a6356be9a4fc6f75 100644 (file)
@@ -191,41 +191,57 @@ void gtk_gl_disable(GtkWidget *widget)
  * Mac OSX implementation *
  **************************/
 #elif defined(SYS_MAC)
  * Mac OSX implementation *
  **************************/
 #elif defined(SYS_MAC)
+#include <gdk/gdkquartz.h>
 void gtk_gl_enable(GtkWidget *widget)
 {
 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)
 {
 }
 
 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)
 {
 }
 
 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)
 {
 }
 
 void gtk_gl_disable(GtkWidget *widget)
 {
+       g_debug("GtkGl: disable");
 }
 
 
 }
 
 
index 5d54a70da80d06d6f22ff2939c03d97af2421f44..25a81b54df2797eac37fd8ddd7f28fc13ab45624 100644 (file)
@@ -31,9 +31,9 @@ static void grits_poly_tess(gdouble (**points)[3])
 {
        //g_debug("GritsPoly: tess");
        GLUtesselator *tess = gluNewTess();
 {
        //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);
        for (int pi = 0; points[pi]; pi++) {
                gluTessBeginPolygon(tess, NULL);
                gluTessBeginContour(tess);