-/*\r
-Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
-For a list of contributors, see the accompanying CONTRIBUTORS file.\r
-\r
-This file is part of GtkRadiant.\r
-\r
-GtkRadiant is free software; you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation; either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-GtkRadiant is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with GtkRadiant; if not, write to the Free Software\r
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
-*/\r
-\r
-//-----------------------------------------------------------------------------\r
-//\r
-// DESCRIPTION:\r
-// implementation of IMessaging specific interface\r
-// \r
-\r
-#include "stdafx.h"\r
-\r
-CPtrArray l_Listeners[RADIANT_MSGCOUNT];\r
-CPtrArray l_WindowListeners;\r
-CXYWndWrapper l_XYWndWrapper;\r
-\r
-// CGtkWindow implementation -------------------------------------\r
-\r
-static void button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)\r
-{\r
- IWindowListener *pListen = static_cast<IWindowListener *>(data);\r
- switch (event->button)\r
- {\r
- case 1:\r
- pListen->OnLButtonDown(event->state, event->x, event->y); break;\r
- case 3:\r
- pListen->OnRButtonDown(event->state, event->x, event->y); break;\r
- }\r
-}\r
-\r
-static void button_release (GtkWidget *widget, GdkEventButton *event, gpointer data)\r
-{\r
- IWindowListener *pListen = static_cast<IWindowListener *>(data);\r
- switch (event->button)\r
- {\r
- case 1:\r
- pListen->OnLButtonUp(event->state, event->x, event->y); break;\r
- case 3:\r
- pListen->OnRButtonUp(event->state, event->x, event->y); break;\r
- }\r
-}\r
-\r
-static void motion (GtkWidget *widget, GdkEventMotion *event, gpointer data)\r
-{\r
- IWindowListener *pListen = static_cast<IWindowListener *>(data);\r
- pListen->OnMouseMove(event->state, event->x, event->y);\r
-}\r
-\r
-static gint expose (GtkWidget *widget, GdkEventExpose *event, gpointer data)\r
-{\r
- if (event->count > 0)\r
- return TRUE;\r
-\r
- CGtkWindow *pWindow = static_cast<CGtkWindow *>(data);\r
- pWindow->DoExpose();\r
-\r
- return TRUE;\r
-}\r
-\r
-// we use the string versions of the keys for now..\r
-static gint keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)\r
-{\r
- gint ret;\r
-\r
- IWindowListener *pListen = static_cast<IWindowListener *>(data);\r
- ret = pListen->OnKeyPressed(gdk_keyval_name(event->keyval));\r
- if (ret)\r
- {\r
- gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event");\r
- }\r
- return ret;\r
-}\r
-\r
-// close_widget is not hooked on the listener but on the CGtkWindow object to handle the closure\r
-static gint close_widget (GtkWidget *widget, GdkEvent* event, gpointer data)\r
-{\r
- CGtkWindow *pWindow = static_cast<CGtkWindow *>(data);\r
- pWindow->Close();\r
-\r
- return TRUE;\r
-}\r
-\r
-void CGtkWindow::DoExpose()\r
-{\r
- gtk_glwidget_make_current(m_pGLWidget);\r
- if (m_pListen->Paint())\r
- gtk_glwidget_swap_buffers(m_pGLWidget);\r
-}\r
-\r
-void CGtkWindow::Redraw()\r
-{\r
- gtk_widget_queue_draw(m_pGLWidget);\r
-}\r
-\r
-void CGtkWindow::Close()\r
-{\r
- // similar to a destructor, except we warn first\r
- m_pListen->Close();\r
- m_pListen->DecRef(); m_pListen = NULL;\r
- gtk_widget_destroy(m_pWnd); m_pWnd = NULL;\r
-}\r
-\r
-bool CGtkWindow::Show()\r
-{\r
- // check we got everything and are reading to instanciate\r
- if (m_nWidthParam == 0 || m_nHeightParam == 0)\r
- {\r
- Sys_FPrintf(SYS_ERR, "Height and Width params not set in CGtkWindow::Show\n");\r
- return false;\r
- }\r
- if (!m_pListen)\r
- {\r
- Sys_FPrintf(SYS_ERR, "No listener set in CGtkWindow::Show\n");\r
- return false;\r
- }\r
-\r
- // seems all good, here we go\r
- m_pWnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_window_set_title (GTK_WINDOW (m_pWnd), m_Name.GetBuffer());\r
- gtk_window_set_default_size (GTK_WINDOW (m_pWnd), m_nWidthParam, m_nHeightParam);\r
- gtk_widget_show (m_pWnd);\r
-\r
- // GL widget creation\r
- m_pGLWidget = gtk_glwidget_new(FALSE, g_qeglobals_gui.d_glBase);\r
-\r
- gtk_widget_set_events (m_pGLWidget, GDK_DESTROY | GDK_EXPOSURE_MASK | GDK_KEY_PRESS_MASK |\r
- GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);\r
-\r
- // Connect signal handlers\r
- gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "expose_event", GTK_SIGNAL_FUNC (expose), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "motion_notify_event",\r
- GTK_SIGNAL_FUNC (motion), m_pListen);\r
- gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "button_press_event",\r
- GTK_SIGNAL_FUNC (button_press), m_pListen);\r
- gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "button_release_event",\r
- GTK_SIGNAL_FUNC (button_release), m_pListen);\r
-\r
- gtk_signal_connect (GTK_OBJECT (m_pWnd), "delete_event", GTK_SIGNAL_FUNC (close_widget), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pWnd), "key_press_event",\r
- GTK_SIGNAL_FUNC (keypress), m_pListen);\r
-\r
- gtk_widget_show (m_pGLWidget);\r
- gtk_container_add (GTK_CONTAINER (m_pWnd), m_pGLWidget);\r
-\r
- return true;\r
-}\r
-\r
-IWindow* WINAPI QERApp_CreateGLWindow()\r
-{\r
- return new CGtkWindow;\r
-}\r
-\r
-void WINAPI QERApp_HookWindow(IWindowListener* pListen)\r
-{\r
- l_WindowListeners.Add( pListen );\r
- pListen->IncRef();\r
-}\r
-\r
-void WINAPI QERApp_UnHookWindow(IWindowListener* pListen)\r
-{\r
- for ( int i = 0; i < l_WindowListeners.GetSize(); i++ )\r
- {\r
- if (l_WindowListeners.GetAt(i) == pListen)\r
- {\r
- l_WindowListeners.RemoveAt(i);\r
- pListen->DecRef();\r
- return;\r
- }\r
- }\r
-#ifdef _DEBUG\r
- Sys_Printf("WARNING: IWindowListener not found in QERApp_UnHookWindow\n");\r
-#endif\r
-}\r
-\r
-void DispatchOnMouseMove(guint32 nFlags, int x, int y)\r
-{\r
- for( int i = 0; i < l_WindowListeners.GetSize(); i++ )\r
- static_cast<IWindowListener*>(l_WindowListeners.GetAt(i))->OnMouseMove( nFlags, x, y );\r
-}\r
-\r
-bool DispatchOnLButtonDown(guint32 nFlags, int x, int y)\r
-{\r
- for( int i = 0; i < l_WindowListeners.GetSize(); i++ )\r
- if (static_cast<IWindowListener*>(l_WindowListeners.GetAt(i))->OnLButtonDown( nFlags, x, y ))\r
- return true;\r
- return false;\r
-}\r
-\r
-bool DispatchOnLButtonUp(guint32 nFlags, int x, int y)\r
-{\r
- for( int i = 0; i < l_WindowListeners.GetSize(); i++ )\r
- if (static_cast<IWindowListener*>(l_WindowListeners.GetAt(i))->OnLButtonUp( nFlags, x, y ))\r
- return true;\r
- return false;\r
-}\r
-\r
-void WINAPI QERApp_HookListener(IListener* pListen, int Msg)\r
-{\r
-#ifdef _DEBUG\r
- if (Msg >= RADIANT_MSGCOUNT)\r
- {\r
- Sys_Printf("ERROR: bad index in QERApp_HookListener\n");\r
- return;\r
- }\r
-#endif\r
- l_Listeners[Msg].Add( pListen );\r
- pListen->IncRef();\r
-}\r
-\r
-int WINAPI QERApp_UnHookListener(IListener* pListen)\r
-{\r
- int count = 0;\r
- for( int i = 0; i<RADIANT_MSGCOUNT; i++ )\r
- for( int j = 0; j<l_Listeners[i].GetSize(); j++ )\r
- if (l_Listeners[i].GetAt(j) == pListen)\r
- {\r
- l_Listeners[i].RemoveAt(j);\r
- pListen->DecRef();\r
- count++;\r
- }\r
- return count;\r
-}\r
-\r
-void DispatchRadiantMsg( int Msg )\r
-{\r
-#ifdef _DEBUG\r
- if (Msg >= RADIANT_MSGCOUNT)\r
- {\r
- Sys_Printf("ERROR: bad index in DispatchRadiantMsg\n");\r
- return;\r
- }\r
-#endif\r
- for(int i = 0; i<l_Listeners[Msg].GetSize(); i++)\r
- static_cast<IListener *>(l_Listeners[Msg].GetAt(i))->DispatchRadiantMsg(Msg);\r
-}\r
-\r
-void CXYWndWrapper::SnapToGrid( int x1, int y1, vec3_t pt )\r
-{\r
- int height = g_pParentWnd->ActiveXY()->GetWidget()->allocation.height;\r
- g_pParentWnd->ActiveXY()->SnapToPoint( x1, height - 1 - y1, pt );\r
-}\r
-\r
-VIEWTYPE CXYWndWrapper::GetViewType( void )\r
-{\r
- return (VIEWTYPE)g_pParentWnd->ActiveXY()->GetViewType();\r
-}\r
-\r
-IXYWndWrapper* WINAPI QERApp_GetXYWndWrapper()\r
-{\r
- return &l_XYWndWrapper;\r
-}\r
+/*
+Copyright (C) 1999-2007 id Software, Inc. and contributors.
+For a list of contributors, see the accompanying CONTRIBUTORS file.
+
+This file is part of GtkRadiant.
+
+GtkRadiant is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+GtkRadiant 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GtkRadiant; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+//-----------------------------------------------------------------------------
+//
+// DESCRIPTION:
+// implementation of IMessaging specific interface
+//
+
+#include "stdafx.h"
+
+CPtrArray l_Listeners[RADIANT_MSGCOUNT];
+CPtrArray l_WindowListeners;
+CXYWndWrapper l_XYWndWrapper;
+
+// CGtkWindow implementation -------------------------------------
+
+static void button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ IWindowListener *pListen = static_cast<IWindowListener *>(data);
+ switch (event->button)
+ {
+ case 1:
+ pListen->OnLButtonDown(event->state, event->x, event->y); break;
+ case 3:
+ pListen->OnRButtonDown(event->state, event->x, event->y); break;
+ }
+}
+
+static void button_release (GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+ IWindowListener *pListen = static_cast<IWindowListener *>(data);
+ switch (event->button)
+ {
+ case 1:
+ pListen->OnLButtonUp(event->state, event->x, event->y); break;
+ case 3:
+ pListen->OnRButtonUp(event->state, event->x, event->y); break;
+ }
+}
+
+static void motion (GtkWidget *widget, GdkEventMotion *event, gpointer data)
+{
+ IWindowListener *pListen = static_cast<IWindowListener *>(data);
+ pListen->OnMouseMove(event->state, event->x, event->y);
+}
+
+static gint expose (GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+ if (event->count > 0)
+ return TRUE;
+
+ CGtkWindow *pWindow = static_cast<CGtkWindow *>(data);
+ pWindow->DoExpose();
+
+ return TRUE;
+}
+
+// we use the string versions of the keys for now..
+static gint keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)
+{
+ gint ret;
+
+ IWindowListener *pListen = static_cast<IWindowListener *>(data);
+ ret = pListen->OnKeyPressed(gdk_keyval_name(event->keyval));
+ if (ret)
+ {
+ gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event");
+ }
+ return ret;
+}
+
+// close_widget is not hooked on the listener but on the CGtkWindow object to handle the closure
+static gint close_widget (GtkWidget *widget, GdkEvent* event, gpointer data)
+{
+ CGtkWindow *pWindow = static_cast<CGtkWindow *>(data);
+ pWindow->Close();
+
+ return TRUE;
+}
+
+void CGtkWindow::DoExpose()
+{
+ gtk_glwidget_make_current(m_pGLWidget);
+ if (m_pListen->Paint())
+ gtk_glwidget_swap_buffers(m_pGLWidget);
+}
+
+void CGtkWindow::Redraw()
+{
+ gtk_widget_queue_draw(m_pGLWidget);
+}
+
+void CGtkWindow::Close()
+{
+ // similar to a destructor, except we warn first
+ m_pListen->Close();
+ m_pListen->DecRef(); m_pListen = NULL;
+ gtk_widget_destroy(m_pWnd); m_pWnd = NULL;
+}
+
+bool CGtkWindow::Show()
+{
+ // check we got everything and are reading to instanciate
+ if (m_nWidthParam == 0 || m_nHeightParam == 0)
+ {
+ Sys_FPrintf(SYS_ERR, "Height and Width params not set in CGtkWindow::Show\n");
+ return false;
+ }
+ if (!m_pListen)
+ {
+ Sys_FPrintf(SYS_ERR, "No listener set in CGtkWindow::Show\n");
+ return false;
+ }
+
+ // seems all good, here we go
+ m_pWnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (m_pWnd), m_Name.GetBuffer());
+ gtk_window_set_default_size (GTK_WINDOW (m_pWnd), m_nWidthParam, m_nHeightParam);
+ gtk_widget_show (m_pWnd);
+
+ // GL widget creation
+ m_pGLWidget = gtk_glwidget_new(FALSE, g_qeglobals_gui.d_glBase);
+
+ gtk_widget_set_events (m_pGLWidget, GDK_DESTROY | GDK_EXPOSURE_MASK | GDK_KEY_PRESS_MASK |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);
+
+ // Connect signal handlers
+ gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "expose_event", GTK_SIGNAL_FUNC (expose), this);
+ gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "motion_notify_event",
+ GTK_SIGNAL_FUNC (motion), m_pListen);
+ gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "button_press_event",
+ GTK_SIGNAL_FUNC (button_press), m_pListen);
+ gtk_signal_connect (GTK_OBJECT (m_pGLWidget), "button_release_event",
+ GTK_SIGNAL_FUNC (button_release), m_pListen);
+
+ gtk_signal_connect (GTK_OBJECT (m_pWnd), "delete_event", GTK_SIGNAL_FUNC (close_widget), this);
+ gtk_signal_connect (GTK_OBJECT (m_pWnd), "key_press_event",
+ GTK_SIGNAL_FUNC (keypress), m_pListen);
+
+ gtk_widget_show (m_pGLWidget);
+ gtk_container_add (GTK_CONTAINER (m_pWnd), m_pGLWidget);
+
+ return true;
+}
+
+IWindow* WINAPI QERApp_CreateGLWindow()
+{
+ return new CGtkWindow;
+}
+
+void WINAPI QERApp_HookWindow(IWindowListener* pListen)
+{
+ l_WindowListeners.Add( pListen );
+ pListen->IncRef();
+}
+
+void WINAPI QERApp_UnHookWindow(IWindowListener* pListen)
+{
+ for ( int i = 0; i < l_WindowListeners.GetSize(); i++ )
+ {
+ if (l_WindowListeners.GetAt(i) == pListen)
+ {
+ l_WindowListeners.RemoveAt(i);
+ pListen->DecRef();
+ return;
+ }
+ }
+#ifdef _DEBUG
+ Sys_Printf("WARNING: IWindowListener not found in QERApp_UnHookWindow\n");
+#endif
+}
+
+void DispatchOnMouseMove(guint32 nFlags, int x, int y)
+{
+ for( int i = 0; i < l_WindowListeners.GetSize(); i++ )
+ static_cast<IWindowListener*>(l_WindowListeners.GetAt(i))->OnMouseMove( nFlags, x, y );
+}
+
+bool DispatchOnLButtonDown(guint32 nFlags, int x, int y)
+{
+ for( int i = 0; i < l_WindowListeners.GetSize(); i++ )
+ if (static_cast<IWindowListener*>(l_WindowListeners.GetAt(i))->OnLButtonDown( nFlags, x, y ))
+ return true;
+ return false;
+}
+
+bool DispatchOnLButtonUp(guint32 nFlags, int x, int y)
+{
+ for( int i = 0; i < l_WindowListeners.GetSize(); i++ )
+ if (static_cast<IWindowListener*>(l_WindowListeners.GetAt(i))->OnLButtonUp( nFlags, x, y ))
+ return true;
+ return false;
+}
+
+void WINAPI QERApp_HookListener(IListener* pListen, int Msg)
+{
+#ifdef _DEBUG
+ if (Msg >= RADIANT_MSGCOUNT)
+ {
+ Sys_Printf("ERROR: bad index in QERApp_HookListener\n");
+ return;
+ }
+#endif
+ l_Listeners[Msg].Add( pListen );
+ pListen->IncRef();
+}
+
+int WINAPI QERApp_UnHookListener(IListener* pListen)
+{
+ int count = 0;
+ for( int i = 0; i<RADIANT_MSGCOUNT; i++ )
+ for( int j = 0; j<l_Listeners[i].GetSize(); j++ )
+ if (l_Listeners[i].GetAt(j) == pListen)
+ {
+ l_Listeners[i].RemoveAt(j);
+ pListen->DecRef();
+ count++;
+ }
+ return count;
+}
+
+void DispatchRadiantMsg( int Msg )
+{
+#ifdef _DEBUG
+ if (Msg >= RADIANT_MSGCOUNT)
+ {
+ Sys_Printf("ERROR: bad index in DispatchRadiantMsg\n");
+ return;
+ }
+#endif
+ for(int i = 0; i<l_Listeners[Msg].GetSize(); i++)
+ static_cast<IListener *>(l_Listeners[Msg].GetAt(i))->DispatchRadiantMsg(Msg);
+}
+
+void CXYWndWrapper::SnapToGrid( int x1, int y1, vec3_t pt )
+{
+ int height = g_pParentWnd->ActiveXY()->GetWidget()->allocation.height;
+ g_pParentWnd->ActiveXY()->SnapToPoint( x1, height - 1 - y1, pt );
+}
+
+VIEWTYPE CXYWndWrapper::GetViewType( void )
+{
+ return (VIEWTYPE)g_pParentWnd->ActiveXY()->GetViewType();
+}
+
+IXYWndWrapper* WINAPI QERApp_GetXYWndWrapper()
+{
+ return &l_XYWndWrapper;
+}