[grits] Add support for Mac OS
- From: Andy Spencer <andys src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grits] Add support for Mac OS
- Date: Tue, 3 Jan 2012 01:21:29 +0000 (UTC)
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]