-/*\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;
+}