/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* $Id: rbgtkwidget.c,v 1.4 2003/08/27 18:29:18 isambart Exp $ */ /* OpenGL extension to Gtk::Widget * Copyright (C) 2003 Vincent Isambart * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "rbgtkglext.h" #define _CONTEXT(i) GDK_GL_CONTEXT(RVAL2GOBJ(i)) #define _CONFIG(i) GDK_GL_CONFIG(RVAL2GOBJ(i)) #define _WIDGET(i) GTK_WIDGET(RVAL2GOBJ(i)) #define _SELF(i) _WIDGET(i) static VALUE widget_set_gl_capability(argc, argv, self) int argc; VALUE *argv; VALUE self; { GdkGLConfig* glconfig; GdkGLContext* share_list = NULL; gboolean direct = TRUE; int render_type = GDK_GL_RGBA_TYPE; if (argc > 4) rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)", argc); else if (argc < 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc); switch (argc) { case 4: render_type = RVAL2GENUM(argv[3], GDK_TYPE_GL_RENDER_TYPE); case 3: direct = RVAL2CBOOL(argv[2]); case 2: share_list = _CONTEXT(argv[1]); default: glconfig = _CONFIG(argv[0]); } return CBOOL2RVAL(gtk_widget_set_gl_capability(_SELF(self), glconfig, share_list, direct, render_type)); } static VALUE widget_is_gl_capable(self) VALUE self; { return CBOOL2RVAL(gtk_widget_is_gl_capable(_SELF(self))); } static VALUE widget_get_gl_config(self) VALUE self; { return GOBJ2RVAL(gtk_widget_get_gl_config(_SELF(self))); } static VALUE widget_create_gl_context(argc, argv, self) int argc; VALUE *argv; VALUE self; { GdkGLContext* share_list = NULL; gboolean direct = TRUE; int render_type = GDK_GL_RGBA_TYPE; if (argc > 3) rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc); switch (argc) { case 3: render_type = RVAL2GENUM(argv[2], GDK_TYPE_GL_RENDER_TYPE); case 2: direct = RVAL2CBOOL(argv[1]); case 1: share_list = _CONTEXT(argv[0]); default: break; } return GOBJ2RVAL(gtk_widget_create_gl_context(_SELF(self), share_list, direct, render_type)); } static VALUE widget_get_gl_context(self) VALUE self; { return GOBJ2RVAL(gtk_widget_get_gl_context(_SELF(self))); } static VALUE widget_get_gl_window(self) VALUE self; { return GOBJ2RVAL(gtk_widget_get_gl_window(_SELF(self))); } static VALUE widget_get_gl_drawable(self) VALUE self; { return GOBJ2RVAL(gtk_widget_get_gl_drawable(_SELF(self))); } void Init_gtkglext_gtk_widget(void) { /* Gtk::Widget */ VALUE Widget = rb_const_get(mGtk, rb_intern("Widget")); rb_define_method(Widget, "set_gl_capability", widget_set_gl_capability,-1); rb_define_method(Widget, "gl_capable?", widget_is_gl_capable, 0); rb_define_method(Widget, "gl_config", widget_get_gl_config, 0); rb_define_method(Widget, "create_gl_context", widget_create_gl_context, 3); rb_define_method(Widget, "gl_context", widget_get_gl_context, 0); rb_define_method(Widget, "gl_window", widget_get_gl_window, 0); rb_define_method(Widget, "gl_drawable", widget_get_gl_drawable, 0); }