-/*\r
-Copyright (c) 2001, Loki software, inc.\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without modification, \r
-are permitted provided that the following conditions are met:\r
-\r
-Redistributions of source code must retain the above copyright notice, this list \r
-of conditions and the following disclaimer.\r
-\r
-Redistributions in binary form must reproduce the above copyright notice, this\r
-list of conditions and the following disclaimer in the documentation and/or\r
-other materials provided with the distribution.\r
-\r
-Neither the name of Loki software nor the names of its contributors may be used \r
-to endorse or promote products derived from this software without specific prior \r
-written permission. \r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' \r
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \r
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY \r
-DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; \r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS \r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
-*/\r
-\r
-//\r
-// GLWindow - Base class for the small views used by Radiant\r
-//\r
-// Leonardo Zide (leo@lokigames.com\r
-//\r
-\r
-#include "stdafx.h"\r
-#include "glwidget.h"\r
-#include "glwindow.h"\r
-\r
-// =============================================================================\r
-// static functions\r
-\r
-static void realize (GtkWidget *widget, gpointer data)\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
-\r
- wnd->OnCreate ();\r
-}\r
-\r
-static gint expose (GtkWidget *widget, GdkEventExpose *event, gpointer data)\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
-\r
-#ifndef _WIN32\r
- if (event->count > 0)\r
- return TRUE;\r
-#endif\r
-\r
- if (!g_pParentWnd->IsSleeping ())\r
- wnd->OnExpose ();\r
-\r
- return TRUE;\r
-}\r
-\r
-static void button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
- guint32 flags = 0;\r
-\r
- gdk_pointer_grab (widget->window, FALSE,\r
- (GdkEventMask)(GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK),\r
- NULL, NULL, GDK_CURRENT_TIME);\r
-\r
- gtk_window_set_focus (GTK_WINDOW (g_pParentWnd->m_pWidget), widget);\r
-\r
- switch (event->button)\r
- {\r
- case 1: flags |= MK_LBUTTON; break;\r
- case 2: flags |= MK_MBUTTON; break;\r
- case 3: flags |= MK_RBUTTON; break;\r
-#if !GTK_CHECK_VERSION (1,3,0)\r
- case 4: wnd->OnMouseWheel(true); break;\r
- case 5: wnd->OnMouseWheel(false); break;\r
-#endif\r
- }\r
-\r
- if ((event->state & GDK_CONTROL_MASK) != 0)\r
- flags |= MK_CONTROL;\r
-\r
- if ((event->state & GDK_SHIFT_MASK) != 0)\r
- flags |= MK_SHIFT;\r
-\r
- if (event->type == GDK_BUTTON_PRESS)\r
- {\r
- switch (event->button)\r
- {\r
- case 1:\r
- wnd->OnLButtonDown (flags, (int)event->x, (int)event->y); break;\r
- case 2:\r
- wnd->OnMButtonDown (flags, (int)event->x, (int)event->y); break;\r
- case 3:\r
- wnd->OnRButtonDown (flags, (int)event->x, (int)event->y); break;\r
- }\r
- }\r
- else if (event->type == GDK_2BUTTON_PRESS)\r
- {\r
- // do nothing\r
- }\r
-}\r
-\r
-static void button_release (GtkWidget *widget, GdkEventButton *event, gpointer data)\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
- guint32 flags = 0;\r
-\r
- gdk_pointer_ungrab (GDK_CURRENT_TIME);\r
-\r
- if ((event->state & GDK_CONTROL_MASK) != 0)\r
- flags |= MK_CONTROL;\r
-\r
- if ((event->state & GDK_SHIFT_MASK) != 0)\r
- flags |= MK_SHIFT;\r
-\r
- switch (event->button)\r
- {\r
- case 1:\r
- wnd->OnLButtonUp (flags, (int)event->x, (int)event->y); break;\r
- case 2:\r
- wnd->OnMButtonUp (flags, (int)event->x, (int)event->y); break;\r
- case 3:\r
- wnd->OnRButtonUp (flags, (int)event->x, (int)event->y); break;\r
- }\r
-}\r
-\r
-static void motion (GtkWidget *widget, GdkEventMotion *event, gpointer data)\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
- guint32 flags = 0;\r
-\r
- if ((event->state & GDK_BUTTON1_MASK) != 0)\r
- flags |= MK_LBUTTON;\r
-\r
- if ((event->state & GDK_BUTTON2_MASK) != 0)\r
- flags |= MK_MBUTTON;\r
-\r
- if ((event->state & GDK_BUTTON3_MASK) != 0)\r
- flags |= MK_RBUTTON;\r
-\r
- if ((event->state & GDK_CONTROL_MASK) != 0)\r
- flags |= MK_CONTROL;\r
-\r
- if ((event->state & GDK_SHIFT_MASK) != 0)\r
- flags |= MK_SHIFT;\r
-\r
- wnd->OnMouseMove (flags, (int)event->x, (int)event->y);\r
-}\r
-\r
-static void resize (GtkWidget *widget, GtkAllocation *allocation, gpointer data)\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
- wnd->OnSize (allocation->width, allocation->height);\r
-}\r
-\r
-static gint timer (gpointer data)\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
- wnd->OnTimer ();\r
-\r
- return TRUE;\r
-}\r
-\r
-//! GtkGLExt port.\r
-/*\r
-static void create_context (GtkWidget *widget, gpointer data)\r
-{\r
- if (g_qeglobals_gui.d_glBase == NULL)\r
- g_qeglobals_gui.d_glBase = widget;\r
-}\r
-\r
-static void destroy_context (GtkWidget *widget, gpointer data)\r
-{\r
- if (g_qeglobals_gui.d_glBase == widget)\r
- g_qeglobals_gui.d_glBase = NULL;\r
-}\r
-*/\r
-\r
-#if GTK_CHECK_VERSION (1,3,0)\r
-static gint scroll_event( GtkWidget *widget,\r
- GdkEventScroll *event,\r
- gpointer data )\r
-{\r
- GLWindow *wnd = (GLWindow*)data;\r
- wnd->OnMouseWheel((event->direction == GDK_SCROLL_UP) ? true : false);\r
- return TRUE;\r
-}\r
-#endif\r
-\r
-// =============================================================================\r
-// GLWindow class\r
-\r
-#ifdef _DEBUG\r
-//#define DBG_GLWINDOW\r
-#endif\r
-\r
-GLWindow::GLWindow (bool zbuffer)\r
-{\r
- m_nTimer = 0;\r
- m_bMouseCapture = FALSE;\r
- m_pParent = NULL;\r
-\r
- m_pWidget = gtk_glwidget_new (zbuffer, g_qeglobals_gui.d_glBase);\r
- GTK_WIDGET_SET_FLAGS (m_pWidget, GTK_CAN_FOCUS);\r
-\r
-#ifdef DBG_GLWINDOW\r
- Sys_Printf("GLWindow::GLWindow m_pWidget = %p\n", m_pWidget);\r
-#endif\r
-\r
-//! GtkGLExt port.\r
-//#if defined (__linux__) || defined (__APPLE__)\r
- if (g_qeglobals_gui.d_glBase == NULL)\r
- g_qeglobals_gui.d_glBase = m_pWidget;\r
-//#endif\r
-\r
-#if GTK_CHECK_VERSION (1,3,0)\r
- gtk_widget_set_events (m_pWidget, GDK_DESTROY | GDK_EXPOSURE_MASK |\r
- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK);\r
-#else\r
- gtk_widget_set_events (m_pWidget, GDK_DESTROY | GDK_EXPOSURE_MASK |\r
- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);\r
-#endif\r
-\r
- // Connect signal handlers\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "realize", GTK_SIGNAL_FUNC (realize), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "expose_event", GTK_SIGNAL_FUNC (expose), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "motion_notify_event", GTK_SIGNAL_FUNC (motion), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "button_press_event", GTK_SIGNAL_FUNC (button_press), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "button_release_event",GTK_SIGNAL_FUNC (button_release), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "size_allocate", GTK_SIGNAL_FUNC (resize), this);\r
-//! GtkGLExt port.\r
-// gtk_signal_connect (GTK_OBJECT (m_pWidget), "create_context", GTK_SIGNAL_FUNC (create_context), this);\r
-// gtk_signal_connect (GTK_OBJECT (m_pWidget), "destroy_context", GTK_SIGNAL_FUNC (destroy_context), this);\r
-#if GTK_CHECK_VERSION (1,3,0)\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "scroll_event", GTK_SIGNAL_FUNC (scroll_event), this);\r
-#endif\r
-}\r
-\r
-GLWindow::~GLWindow ()\r
-{\r
-#ifdef DBG_GLWINDOW\r
- Sys_Printf("GLWindow::~GLWindow m_pWidget = %p\n", m_pWidget);\r
-#endif\r
-\r
- if (m_pWidget && GTK_IS_WIDGET (m_pWidget))\r
- gtk_widget_destroy (m_pWidget);\r
-}\r
-\r
-void GLWindow::DestroyContext ()\r
-{\r
- gtk_glwidget_destroy_context (m_pWidget);\r
-}\r
-\r
-void GLWindow::CreateContext ()\r
-{\r
- gtk_glwidget_create_context (m_pWidget);\r
-}\r
-\r
-void GLWindow::SetTimer (guint millisec)\r
-{\r
- m_nTimer = gtk_timeout_add (millisec, timer, this);\r
-}\r
-\r
-void GLWindow::KillTimer ()\r
-{\r
- gtk_timeout_remove (m_nTimer);\r
- m_nTimer = 0;\r
-}\r
-\r
-bool GLWindow::MakeCurrent ()\r
-{\r
- return gtk_glwidget_make_current (m_pWidget);\r
-}\r
-\r
-void GLWindow::SwapBuffers ()\r
-{\r
- gtk_glwidget_swap_buffers (m_pWidget);\r
-}\r
+/*
+Copyright (c) 2001, Loki software, inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list
+of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+Neither the name of Loki software nor the names of its contributors may be used
+to endorse or promote products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+//
+// GLWindow - Base class for the small views used by Radiant
+//
+// Leonardo Zide (leo@lokigames.com
+//
+
+#include "stdafx.h"
+#include "glwidget.h"
+#include "glwindow.h"
+
+// =============================================================================
+// static functions
+
+static void realize (GtkWidget *widget, gpointer data)
+{
+ GLWindow *wnd = (GLWindow*)data;
+
+ wnd->OnCreate ();
+}
+
+static gint expose (GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+ GLWindow *wnd = (GLWindow*)data;
+
+#ifndef _WIN32
+ if (event->count > 0)
+ return TRUE;
+#endif
+
+ if (!g_pParentWnd->IsSleeping ())
+ wnd->OnExpose ();
+
+ return TRUE;
+}
+
+static void button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ GLWindow *wnd = (GLWindow*)data;
+ guint32 flags = 0;
+
+ gdk_pointer_grab (widget->window, FALSE,
+ (GdkEventMask)(GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK),
+ NULL, NULL, GDK_CURRENT_TIME);
+
+ gtk_window_set_focus (GTK_WINDOW (g_pParentWnd->m_pWidget), widget);
+
+ switch (event->button)
+ {
+ case 1: flags |= MK_LBUTTON; break;
+ case 2: flags |= MK_MBUTTON; break;
+ case 3: flags |= MK_RBUTTON; break;
+#if !GTK_CHECK_VERSION (1,3,0)
+ case 4: wnd->OnMouseWheel(true); break;
+ case 5: wnd->OnMouseWheel(false); break;
+#endif
+ }
+
+ if ((event->state & GDK_CONTROL_MASK) != 0)
+ flags |= MK_CONTROL;
+
+ if ((event->state & GDK_SHIFT_MASK) != 0)
+ flags |= MK_SHIFT;
+
+ if (event->type == GDK_BUTTON_PRESS)
+ {
+ switch (event->button)
+ {
+ case 1:
+ wnd->OnLButtonDown (flags, (int)event->x, (int)event->y); break;
+ case 2:
+ wnd->OnMButtonDown (flags, (int)event->x, (int)event->y); break;
+ case 3:
+ wnd->OnRButtonDown (flags, (int)event->x, (int)event->y); break;
+ }
+ }
+ else if (event->type == GDK_2BUTTON_PRESS)
+ {
+ // do nothing
+ }
+}
+
+static void button_release (GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ GLWindow *wnd = (GLWindow*)data;
+ guint32 flags = 0;
+
+ gdk_pointer_ungrab (GDK_CURRENT_TIME);
+
+ if ((event->state & GDK_CONTROL_MASK) != 0)
+ flags |= MK_CONTROL;
+
+ if ((event->state & GDK_SHIFT_MASK) != 0)
+ flags |= MK_SHIFT;
+
+ switch (event->button)
+ {
+ case 1:
+ wnd->OnLButtonUp (flags, (int)event->x, (int)event->y); break;
+ case 2:
+ wnd->OnMButtonUp (flags, (int)event->x, (int)event->y); break;
+ case 3:
+ wnd->OnRButtonUp (flags, (int)event->x, (int)event->y); break;
+ }
+}
+
+static void motion (GtkWidget *widget, GdkEventMotion *event, gpointer data)
+{
+ GLWindow *wnd = (GLWindow*)data;
+ guint32 flags = 0;
+
+ if ((event->state & GDK_BUTTON1_MASK) != 0)
+ flags |= MK_LBUTTON;
+
+ if ((event->state & GDK_BUTTON2_MASK) != 0)
+ flags |= MK_MBUTTON;
+
+ if ((event->state & GDK_BUTTON3_MASK) != 0)
+ flags |= MK_RBUTTON;
+
+ if ((event->state & GDK_CONTROL_MASK) != 0)
+ flags |= MK_CONTROL;
+
+ if ((event->state & GDK_SHIFT_MASK) != 0)
+ flags |= MK_SHIFT;
+
+ wnd->OnMouseMove (flags, (int)event->x, (int)event->y);
+}
+
+static void resize (GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+{
+ GLWindow *wnd = (GLWindow*)data;
+ wnd->OnSize (allocation->width, allocation->height);
+}
+
+static gint timer (gpointer data)
+{
+ GLWindow *wnd = (GLWindow*)data;
+ wnd->OnTimer ();
+
+ return TRUE;
+}
+
+//! GtkGLExt port.
+/*
+static void create_context (GtkWidget *widget, gpointer data)
+{
+ if (g_qeglobals_gui.d_glBase == NULL)
+ g_qeglobals_gui.d_glBase = widget;
+}
+
+static void destroy_context (GtkWidget *widget, gpointer data)
+{
+ if (g_qeglobals_gui.d_glBase == widget)
+ g_qeglobals_gui.d_glBase = NULL;
+}
+*/
+
+#if GTK_CHECK_VERSION (1,3,0)
+static gint scroll_event( GtkWidget *widget,
+ GdkEventScroll *event,
+ gpointer data )
+{
+ GLWindow *wnd = (GLWindow*)data;
+ wnd->OnMouseWheel((event->direction == GDK_SCROLL_UP) ? true : false);
+ return TRUE;
+}
+#endif
+
+// =============================================================================
+// GLWindow class
+
+#ifdef _DEBUG
+//#define DBG_GLWINDOW
+#endif
+
+GLWindow::GLWindow (bool zbuffer)
+{
+ m_nTimer = 0;
+ m_bMouseCapture = FALSE;
+ m_pParent = NULL;
+
+ m_pWidget = gtk_glwidget_new (zbuffer, g_qeglobals_gui.d_glBase);
+ GTK_WIDGET_SET_FLAGS (m_pWidget, GTK_CAN_FOCUS);
+
+#ifdef DBG_GLWINDOW
+ Sys_Printf("GLWindow::GLWindow m_pWidget = %p\n", m_pWidget);
+#endif
+
+//! GtkGLExt port.
+//#if defined (__linux__) || defined (__APPLE__)
+ if (g_qeglobals_gui.d_glBase == NULL)
+ g_qeglobals_gui.d_glBase = m_pWidget;
+//#endif
+
+#if GTK_CHECK_VERSION (1,3,0)
+ gtk_widget_set_events (m_pWidget, GDK_DESTROY | GDK_EXPOSURE_MASK |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK);
+#else
+ gtk_widget_set_events (m_pWidget, GDK_DESTROY | GDK_EXPOSURE_MASK |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);
+#endif
+
+ // Connect signal handlers
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "realize", GTK_SIGNAL_FUNC (realize), this);
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "expose_event", GTK_SIGNAL_FUNC (expose), this);
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "motion_notify_event", GTK_SIGNAL_FUNC (motion), this);
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "button_press_event", GTK_SIGNAL_FUNC (button_press), this);
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "button_release_event",GTK_SIGNAL_FUNC (button_release), this);
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "size_allocate", GTK_SIGNAL_FUNC (resize), this);
+//! GtkGLExt port.
+// gtk_signal_connect (GTK_OBJECT (m_pWidget), "create_context", GTK_SIGNAL_FUNC (create_context), this);
+// gtk_signal_connect (GTK_OBJECT (m_pWidget), "destroy_context", GTK_SIGNAL_FUNC (destroy_context), this);
+#if GTK_CHECK_VERSION (1,3,0)
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "scroll_event", GTK_SIGNAL_FUNC (scroll_event), this);
+#endif
+}
+
+GLWindow::~GLWindow ()
+{
+#ifdef DBG_GLWINDOW
+ Sys_Printf("GLWindow::~GLWindow m_pWidget = %p\n", m_pWidget);
+#endif
+
+ if (m_pWidget && GTK_IS_WIDGET (m_pWidget))
+ gtk_widget_destroy (m_pWidget);
+}
+
+void GLWindow::DestroyContext ()
+{
+ gtk_glwidget_destroy_context (m_pWidget);
+}
+
+void GLWindow::CreateContext ()
+{
+ gtk_glwidget_create_context (m_pWidget);
+}
+
+void GLWindow::SetTimer (guint millisec)
+{
+ m_nTimer = gtk_timeout_add (millisec, timer, this);
+}
+
+void GLWindow::KillTimer ()
+{
+ gtk_timeout_remove (m_nTimer);
+ m_nTimer = 0;
+}
+
+bool GLWindow::MakeCurrent ()
+{
+ return gtk_glwidget_make_current (m_pWidget);
+}
+
+void GLWindow::SwapBuffers ()
+{
+ gtk_glwidget_swap_buffers (m_pWidget);
+}