]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/ui.cpp
more eol-style
[xonotic/netradiant.git] / radiant / ui.cpp
index 661c6f9b18490486edb2b01851784ee9112ac5e9..83966dd95afd8f3b3bacd17f1761266c073ad425 100644 (file)
-/*\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;
+}