/* 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 #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 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 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 WindowPositionTrackerImportStringCaller; inline void WindowPositionTracker_exportString(const WindowPositionTracker& self, const StringImportCallback& importer) { WindowPosition_Write(self.getPosition(), importer); } typedef ConstReferenceCaller1 WindowPositionTrackerExportStringCaller; #endif