/* 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_ACCELERATOR_H) #define INCLUDED_GTKUTIL_ACCELERATOR_H #include #include #include #include "generic/callback.h" // ignore numlock #define ALLOWED_MODIFIERS (~(GDK_MOD2_MASK | GDK_LOCK_MASK | GDK_MOD3_MASK | GDK_MOD4_MASK | GDK_MOD5_MASK)) struct Accelerator { Accelerator(guint _key) : key(gdk_keyval_to_upper(_key)), modifiers((GdkModifierType)0) { } Accelerator(guint _key, GdkModifierType _modifiers) : key(gdk_keyval_to_upper(_key)), modifiers((GdkModifierType) (_modifiers & ALLOWED_MODIFIERS)) { } Accelerator(const Accelerator &src) : key(gdk_keyval_to_upper(src.key)), modifiers((GdkModifierType) (src.modifiers & ALLOWED_MODIFIERS)) { } bool operator<(const Accelerator& other) const { guint k1 = key; guint k2 = other.key; int mod1 = modifiers & ALLOWED_MODIFIERS; int mod2 = other.modifiers & ALLOWED_MODIFIERS; return k1 < k2 || (!(k2 < k1) && mod1 < mod2); } bool operator==(const Accelerator& other) const { guint k1 = key; guint k2 = other.key; int mod1 = modifiers & ALLOWED_MODIFIERS; int mod2 = other.modifiers & ALLOWED_MODIFIERS; return k1 == k2 && mod1 == mod2; } Accelerator &operator=(const Accelerator& other) { key = other.key; modifiers = (GdkModifierType) (other.modifiers & ALLOWED_MODIFIERS); return *this; } guint key; GdkModifierType modifiers; }; inline Accelerator accelerator_null() { return Accelerator(0, (GdkModifierType)0); } const char* global_keys_find(unsigned int key); unsigned int global_keys_find(const char* name); class TextOutputStream; void accelerator_write(const Accelerator& accelerator, TextOutputStream& ostream); template TextOutputStreamType& ostream_write(TextOutputStreamType& ostream, const Accelerator& accelerator) { accelerator_write(accelerator, ostream); return ostream; } void keydown_accelerators_add(Accelerator accelerator, const Callback& callback); void keydown_accelerators_remove(Accelerator accelerator); void keyup_accelerators_add(Accelerator accelerator, const Callback& callback); void keyup_accelerators_remove(Accelerator accelerator); typedef struct _GtkWidget GtkWidget; typedef struct _GtkWindow GtkWindow; void global_accel_connect_window(GtkWindow* window); void global_accel_disconnect_window(GtkWindow* window); void GlobalPressedKeys_releaseAll(); typedef struct _GtkAccelGroup GtkAccelGroup; extern GtkAccelGroup* global_accel; void global_accel_init(); void global_accel_destroy(); GClosure* global_accel_group_find(Accelerator accelerator); void global_accel_group_connect(const Accelerator& accelerator, const Callback& callback); void global_accel_group_disconnect(const Accelerator& accelerator, const Callback& callback); class Command { public: Callback m_callback; const Accelerator& m_accelerator; Command(const Callback& callback, const Accelerator& accelerator) : m_callback(callback), m_accelerator(accelerator) { } }; class Toggle { public: Command m_command; BoolExportCallback m_exportCallback; Toggle(const Callback& callback, const Accelerator& accelerator, const BoolExportCallback& exportCallback) : m_command(callback, accelerator), m_exportCallback(exportCallback) { } }; class KeyEvent { public: const Accelerator& m_accelerator; Callback m_keyDown; Callback m_keyUp; KeyEvent(const Accelerator& accelerator, const Callback& keyDown, const Callback& keyUp) : m_accelerator(accelerator), m_keyDown(keyDown), m_keyUp(keyUp) { } }; struct PressedButtons; typedef struct _GtkWidget GtkWidget; void PressedButtons_connect(PressedButtons& pressedButtons, GtkWidget* widget); extern PressedButtons g_pressedButtons; #endif