]> de.git.xonotic.org Git - voretournament/voretournament.git/blobdiff - misc/mediasource/extra/netradiant-src/libs/gtkutil/window.h
Include netRadiant source in this GIT
[voretournament/voretournament.git] / misc / mediasource / extra / netradiant-src / libs / gtkutil / window.h
diff --git a/misc/mediasource/extra/netradiant-src/libs/gtkutil/window.h b/misc/mediasource/extra/netradiant-src/libs/gtkutil/window.h
new file mode 100644 (file)
index 0000000..5ab1e50
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+Copyright (C) 2001-2006, William Joseph.
+All Rights Reserved.
+
+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
+*/
+
+#if !defined(INCLUDED_GTKUTIL_WINDOW_H)
+#define INCLUDED_GTKUTIL_WINDOW_H
+
+#include <gtk/gtkwindow.h>
+
+#include "debugging/debugging.h"
+#include "generic/callback.h"
+#include "widget.h"
+
+inline gboolean window_focus_in_clear_focus_widget(GtkWidget* widget, GdkEventKey* event, gpointer data)
+{
+  gtk_window_set_focus(GTK_WINDOW(widget), NULL);
+  return FALSE;
+}
+
+inline guint window_connect_focus_in_clear_focus_widget(GtkWindow* window)
+{
+  return g_signal_connect(G_OBJECT(window), "focus_in_event", G_CALLBACK(window_focus_in_clear_focus_widget), NULL);
+}
+
+
+unsigned int connect_floating(GtkWindow* main_window, GtkWindow* floating);
+GtkWindow* create_floating_window(const char* title, GtkWindow* parent);
+void destroy_floating_window(GtkWindow* window);
+
+GtkWindow* create_persistent_floating_window(const char* title, GtkWindow* main_window);
+gboolean persistent_floating_window_delete(GtkWindow* floating, GdkEvent *event, GtkWindow* main_window);
+
+void window_remove_minmax(GtkWindow* window);
+
+typedef struct _GtkScrolledWindow GtkScrolledWindow;
+GtkScrolledWindow* create_scrolled_window(GtkPolicyType hscrollbar_policy, GtkPolicyType vscrollbar_policy, int border = 0);
+
+
+struct WindowPosition
+{
+  int x, y, w, h;
+
+  WindowPosition()
+  {
+  }
+  WindowPosition(int _x, int _y, int _w, int _h)
+    : x(_x), y(_y), w(_w), h(_h)
+  {
+  }
+};
+
+const WindowPosition c_default_window_pos(50, 25, 400, 300);
+
+inline void window_get_position(GtkWindow* window, WindowPosition& position)
+{
+  ASSERT_MESSAGE(window != 0, "error saving window position");
+
+  gtk_window_get_position(window, &position.x, &position.y);
+  gtk_window_get_size(window, &position.w, &position.h);
+}
+
+inline void window_set_position(GtkWindow* window, const WindowPosition& position)
+{
+  gtk_window_set_gravity(window, GDK_GRAVITY_STATIC);
+
+  GdkScreen* screen = gdk_screen_get_default();
+  if(position.x < 0
+    || position.y < 0
+    || position.x > gdk_screen_get_width(screen)
+    || position.y > gdk_screen_get_height(screen))
+  {
+    gtk_window_set_position(window, GTK_WIN_POS_CENTER_ON_PARENT);
+  }
+  else
+  {
+    gtk_window_move(window, position.x, position.y);
+  }
+
+  gtk_window_set_default_size(window, position.w, position.h);
+}
+
+inline void WindowPosition_Parse(WindowPosition& position, const char* value)
+{
+  if(sscanf(value, "%d %d %d %d", &position.x, &position.y, &position.w, &position.h) != 4)
+  {
+    position = WindowPosition(c_default_window_pos); // ensure sane default value for window position
+  }
+}
+typedef ReferenceCaller1<WindowPosition, const char*, WindowPosition_Parse> WindowPositionImportStringCaller;
+
+inline void WindowPosition_Write(const WindowPosition& position, const StringImportCallback& importCallback)
+{
+  char buffer[64];
+  sprintf(buffer, "%d %d %d %d", position.x, position.y, position.w, position.h);
+  importCallback(buffer);
+}
+typedef ConstReferenceCaller1<WindowPosition, const StringImportCallback&, WindowPosition_Write> WindowPositionExportStringCaller;
+
+
+
+class WindowPositionTracker
+{
+  WindowPosition m_position;
+
+  static gboolean configure(GtkWidget* widget, GdkEventConfigure *event, WindowPositionTracker* self)
+  {
+    self->m_position = WindowPosition(event->x, event->y, event->width, event->height);
+    return FALSE;
+  }
+
+public:
+  WindowPositionTracker()
+    : m_position(c_default_window_pos)
+  {
+  }
+
+  void sync(GtkWindow* window)
+  {
+    window_set_position(window, m_position);
+  }
+
+  void connect(GtkWindow* window)
+  {
+    sync(window);
+    g_signal_connect(G_OBJECT(window), "configure_event", G_CALLBACK(configure), this);
+  }
+
+  const WindowPosition& getPosition() const
+  {
+    return m_position;
+  }
+
+  //hack
+  void setPosition(const WindowPosition& position)
+  {
+    m_position = position;
+  }
+};
+
+
+inline void WindowPositionTracker_importString(WindowPositionTracker& self, const char* value)
+{
+  WindowPosition position;
+  WindowPosition_Parse(position, value);
+  self.setPosition(position);
+}
+typedef ReferenceCaller1<WindowPositionTracker, const char*, WindowPositionTracker_importString> WindowPositionTrackerImportStringCaller;
+
+inline void WindowPositionTracker_exportString(const WindowPositionTracker& self, const StringImportCallback& importer)
+{
+  WindowPosition_Write(self.getPosition(), importer);
+}
+typedef ConstReferenceCaller1<WindowPositionTracker, const StringImportCallback&, WindowPositionTracker_exportString> WindowPositionTrackerExportStringCaller;
+
+
+
+#endif