summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorleo2004-11-19 19:51:14 +0000
committerleo2004-11-19 19:51:14 +0000
commit7a4d9fd9e4c0b651c64c912b1d42c9f38fef2a2b (patch)
tree0d8fe8298577580d94d1e7f0e327fa49847ec880 /common
parent0f5654b264e729918f48fc4c95aba636d673ed3a (diff)
Added support for custom user shortcut keys.
git-svn-id: http://svn.leocad.org/trunk@363 c7d43263-9d01-0410-8a33-9dba5d9f93d6
Diffstat (limited to 'common')
-rw-r--r--common/defines.h5
-rw-r--r--common/file.cpp3
-rw-r--r--common/file.h116
-rw-r--r--common/keyboard.cpp382
-rw-r--r--common/keyboard.h143
5 files changed, 583 insertions, 66 deletions
diff --git a/common/defines.h b/common/defines.h
index 1ca0fd3..9c05646 100644
--- a/common/defines.h
+++ b/common/defines.h
@@ -7,10 +7,13 @@
/////////////////////////////////////////////////////////////////////////////
// System specific
-#if ! ( defined( LC_WINDOWS ) || defined( LC_LINUX ) || defined( LC_MACINTOSH ))
+#if !(defined(LC_WINDOWS) || defined(LC_LINUX))
#error YOU NEED TO DEFINE YOUR OS
#endif
+// ============================================================================
+// Old defines (mostly deprecated).
+
#ifdef LC_WINDOWS
#define LC_MAXPATH 260 //_MAX_PATH
#define KEY_SHIFT VK_SHIFT
diff --git a/common/file.cpp b/common/file.cpp
index 2df77f1..8962401 100644
--- a/common/file.cpp
+++ b/common/file.cpp
@@ -400,6 +400,9 @@ int FileDisk::PutChar(int c)
bool FileDisk::Open(const char *filename, const char *mode)
{
+ if (*filename == 0)
+ return false;
+
strcpy(FileName, filename);
m_hFile = fopen(filename, mode);
diff --git a/common/file.h b/common/file.h
index 950a5e6..d891e9c 100644
--- a/common/file.h
+++ b/common/file.h
@@ -1,7 +1,3 @@
-//
-// file.h
-////////////////////////////////////////////////////
-
#ifndef _FILE_H_
#define _FILE_H_
@@ -12,46 +8,46 @@
class File
{
public:
- // Constructors
- File();
- virtual ~File();
+ // Constructors
+ File();
+ virtual ~File();
- // Implementation
+ // Implementation
public:
- virtual unsigned long GetPosition() const = 0;
- virtual unsigned long Seek(long lOff, int nFrom) = 0;
- virtual void SetLength(unsigned long nNewLen) = 0;
- virtual unsigned long GetLength() const = 0;
-
- virtual char* ReadString(char* pBuf, unsigned long nMax)=0;
- virtual unsigned long Read(void* pBuf, unsigned long nCount)=0;
- virtual unsigned long Write(const void* pBuf, unsigned long nCount)=0;
- virtual int GetChar()=0;
- virtual int PutChar(int c)=0;
-
- unsigned long ReadByte (void* pBuf, unsigned long nCount);
- unsigned long ReadShort (void* pBuf, unsigned long nCount);
- unsigned long ReadLong (void* pBuf, unsigned long nCount);
- unsigned long ReadFloat (void* pBuf, unsigned long nCount);
- unsigned long ReadDouble (void* pBuf, unsigned long nCount);
- unsigned long WriteByte (const void* pBuf, unsigned long nCount);
- unsigned long WriteShort (const void* pBuf, unsigned long nCount);
- unsigned long WriteLong (const void* pBuf, unsigned long nCount);
- unsigned long WriteFloat (const void* pBuf, unsigned long nCount);
- unsigned long WriteDouble (const void* pBuf, unsigned long nCount);
-
- virtual void Abort()=0;
- virtual void Flush()=0;
- virtual void Close()=0;
-
- const char* GetFileName() const
- { return FileName; }
-
- void SetFileName(const char* Name)
- { strncpy(FileName, Name, LC_MAXPATH); }
+ virtual unsigned long GetPosition() const = 0;
+ virtual unsigned long Seek(long lOff, int nFrom) = 0;
+ virtual void SetLength(unsigned long nNewLen) = 0;
+ virtual unsigned long GetLength() const = 0;
+
+ virtual char* ReadString(char* pBuf, unsigned long nMax)=0;
+ virtual unsigned long Read(void* pBuf, unsigned long nCount)=0;
+ virtual unsigned long Write(const void* pBuf, unsigned long nCount)=0;
+ virtual int GetChar()=0;
+ virtual int PutChar(int c)=0;
+
+ unsigned long ReadByte(void* pBuf, unsigned long nCount);
+ unsigned long ReadShort(void* pBuf, unsigned long nCount);
+ unsigned long ReadLong(void* pBuf, unsigned long nCount);
+ unsigned long ReadFloat(void* pBuf, unsigned long nCount);
+ unsigned long ReadDouble(void* pBuf, unsigned long nCount);
+ unsigned long WriteByte(const void* pBuf, unsigned long nCount);
+ unsigned long WriteShort(const void* pBuf, unsigned long nCount);
+ unsigned long WriteLong(const void* pBuf, unsigned long nCount);
+ unsigned long WriteFloat(const void* pBuf, unsigned long nCount);
+ unsigned long WriteDouble(const void* pBuf, unsigned long nCount);
+
+ virtual void Abort()=0;
+ virtual void Flush()=0;
+ virtual void Close()=0;
+
+ const char* GetFileName() const
+ { return FileName; }
+
+ void SetFileName(const char* Name)
+ { strncpy(FileName, Name, LC_MAXPATH); }
protected:
- char FileName[LC_MAXPATH];
+ char FileName[LC_MAXPATH];
};
class FileMem : public File
@@ -62,16 +58,6 @@ public:
~FileMem();
// Implementation
-protected:
- // MemFile specific:
- unsigned long m_nGrowBytes;
- unsigned long m_nPosition;
- unsigned long m_nBufferSize;
- unsigned long m_nFileSize;
- unsigned char* m_pBuffer;
- bool m_bAutoDelete;
- void GrowFile(unsigned long nNewLen);
-
public:
unsigned long GetPosition() const;
unsigned long Seek(long lOff, int nFrom);
@@ -88,6 +74,16 @@ public:
void Flush();
void Close();
bool Open(const char *filename, const char *mode);
+
+protected:
+ // MemFile specific:
+ unsigned long m_nGrowBytes;
+ unsigned long m_nPosition;
+ unsigned long m_nBufferSize;
+ unsigned long m_nFileSize;
+ unsigned char* m_pBuffer;
+ bool m_bAutoDelete;
+ void GrowFile(unsigned long nNewLen);
};
class FileDisk : public File
@@ -98,11 +94,6 @@ public:
~FileDisk();
// Implementation
-protected:
- // DiscFile specific:
- FILE* m_hFile;
- bool m_bCloseOnDelete;
-
public:
unsigned long GetPosition() const;
unsigned long Seek(long lOff, int nFrom);
@@ -119,16 +110,11 @@ public:
void Flush();
void Close();
bool Open(const char *filename, const char *mode);
-};
-
-
-
-
-
-
-
-
-
+protected:
+ // DiscFile specific:
+ FILE* m_hFile;
+ bool m_bCloseOnDelete;
+};
#endif // _FILE_H_
diff --git a/common/keyboard.cpp b/common/keyboard.cpp
new file mode 100644
index 0000000..da2cf88
--- /dev/null
+++ b/common/keyboard.cpp
@@ -0,0 +1,382 @@
+//
+// Code to handle user-defined keyboard shortcuts.
+//
+
+#include <stdio.h>
+#include "system.h"
+#include "keyboard.h"
+#include "file.h"
+#include "str.h"
+
+// ============================================================================
+// Globals.
+
+LC_KEYBOARD_COMMAND DefaultKeyboardShortcuts[] =
+{
+ { LC_FILE_NEW, "New Project", LC_KEYMOD1_CONTROL, LC_KEY_N, 0 },
+ { LC_FILE_OPEN, "Open Project", LC_KEYMOD1_CONTROL, LC_KEY_O, 0 },
+ { LC_FILE_MERGE, "Merge Project", 0, 0, 0 },
+ { LC_FILE_SAVE, "Save Project", LC_KEYMOD1_CONTROL, LC_KEY_S, 0 },
+ { LC_FILE_SAVEAS, "Save Project As", 0, 0, 0 },
+ { LC_FILE_PICTURE, "Save Picture", 0, 0, 0 },
+ { LC_FILE_3DS, "Export 3D Studio", 0, 0, 0 },
+ { LC_FILE_HTML, "Export HTML", 0, 0, 0 },
+ { LC_FILE_POVRAY, "Export POV-Ray", 0, 0, 0 },
+ { LC_FILE_WAVEFRONT, "Export Wavefront", 0, 0, 0 },
+ { LC_FILE_PROPERTIES, "Project Properties", 0, 0, 0 },
+// { LC_FILE_TERRAIN, "Terrain Editor", 0, 0, 0 },
+ { LC_FILE_LIBRARY, "Piece Library Manager", 0, 0, 0 },
+// { LC_FILE_RECENT, "Open Recent File", 0, 0, 0 },
+ { LC_EDIT_UNDO, "Undo", LC_KEYMOD1_CONTROL, LC_KEY_Z, 0 },
+ { LC_EDIT_REDO, "Redo", LC_KEYMOD1_CONTROL, LC_KEY_Y, 0 },
+ { LC_EDIT_CUT, "Cut", LC_KEYMOD1_CONTROL, LC_KEY_X, 0 },
+ { LC_EDIT_COPY, "Copy", LC_KEYMOD1_CONTROL, LC_KEY_C, 0 },
+ { LC_EDIT_PASTE, "Paste", LC_KEYMOD1_CONTROL, LC_KEY_V, 0 },
+ { LC_EDIT_SELECT_ALL, "Select All", LC_KEYMOD1_CONTROL, LC_KEY_A, 0 },
+ { LC_EDIT_SELECT_NONE, "Select None", 0, 0, 0 },
+ { LC_EDIT_SELECT_INVERT, "Select Invert", 0, 0, 0 },
+ { LC_EDIT_SELECT_BYNAME, "Select By Name", 0, 0, 0 },
+ { LC_PIECE_INSERT, "Piece Insert", 0, LC_KEY_INSERT, 0 },
+ { LC_PIECE_DELETE, "Piece Delete", 0, LC_KEY_DELETE, 0 },
+// { LC_PIECE_MINIFIG, "Minifig Wizard", 0, 0, 0 },
+ { LC_PIECE_ARRAY, "Piece Array", 0, 0, 0 },
+// { LC_PIECE_COPYKEYS, "", 0, 0, 0 },
+ { LC_PIECE_GROUP, "Piece Group", LC_KEYMOD1_CONTROL, LC_KEY_G, 0 },
+ { LC_PIECE_UNGROUP, "Piece Ungroup", LC_KEYMOD1_CONTROL, LC_KEY_U, 0 },
+ { LC_PIECE_GROUP_ADD, "Group Add Piece", 0, 0, 0 },
+ { LC_PIECE_GROUP_REMOVE, "Group Remove Piece", 0, 0, 0 },
+ { LC_PIECE_GROUP_EDIT, "Group Edit", 0, 0, 0 },
+ { LC_PIECE_HIDE_SELECTED, "Hide Selection", LC_KEYMOD1_CONTROL, LC_KEY_H, 0 },
+ { LC_PIECE_HIDE_UNSELECTED, "Unhide Selection", 0, 0, 0 },
+ { LC_PIECE_UNHIDE_ALL, "Unhide All", 0, 0, 0 },
+ { LC_PIECE_PREVIOUS, "Piece Previous Step", 0, 0, 0 },
+ { LC_PIECE_NEXT, "Piece Next Step", 0, 0, 0 },
+ { LC_VIEW_PREFERENCES, "Preferences", 0, 0, 0 },
+// { LC_VIEW_ZOOM, "", 0, 0, 0 },
+ { LC_VIEW_ZOOMIN, "Zoom In", 0, 0, 0 },
+ { LC_VIEW_ZOOMOUT, "Zoom Out", 0, 0, 0 },
+ { LC_VIEW_ZOOMEXTENTS, "Zoom Extents", 0, 0, 0 },
+// { LC_VIEW_VIEWPORTS, "", 0, 0, 0 },
+ { LC_VIEW_STEP_NEXT, "Step Next", 0, 0, 0 },
+ { LC_VIEW_STEP_PREVIOUS, "Step Previous", 0, 0, 0 },
+ { LC_VIEW_STEP_FIRST, "Step First", 0, 0, 0 },
+ { LC_VIEW_STEP_LAST, "Step Last", 0, 0, 0 },
+// { LC_VIEW_STEP_CHOOSE, "", 0, 0, 0 },
+// { LC_VIEW_STEP_SET, "", 0, 0, 0 },
+ { LC_VIEW_STEP_INSERT, "Step Insert", 0, 0, 0 },
+ { LC_VIEW_STEP_DELETE, "Step Delete", 0, 0, 0 },
+// { LC_VIEW_STOP, "", 0, 0, 0 },
+// { LC_VIEW_PLAY, "", 0, 0, 0 },
+// { LC_VIEW_CAMERA_MENU, "", 0, 0, 0 },
+// { LC_VIEW_CAMERA_RESET, "", 0, 0, 0 },
+// { LC_VIEW_AUTOPAN, "", 0, 0, 0 },
+// { LC_HELP_ABOUT, "", 0, 0, 0 },
+// { LC_TOOLBAR_ANIMATION, "", 0, 0, 0 },
+// { LC_TOOLBAR_ADDKEYS, "", 0, 0, 0 },
+// { LC_TOOLBAR_SNAPMENU, "", 0, 0, 0 },
+// { LC_TOOLBAR_LOCKMENU, "", 0, 0, 0 },
+// { LC_TOOLBAR_SNAPMOVEMENU, "", 0, 0, 0 },
+// { LC_TOOLBAR_FASTRENDER, "", 0, 0, 0 },
+// { LC_TOOLBAR_BACKGROUND, "", 0, 0, 0 },
+};
+
+const int KeyboardShortcutsCount = sizeof(DefaultKeyboardShortcuts)/sizeof(KeyboardShortcuts[0]);
+
+LC_KEYBOARD_COMMAND KeyboardShortcuts[KeyboardShortcutsCount];
+
+// ============================================================================
+// Functions
+
+bool SaveKeyboardShortcuts(const char* FileName)
+{
+ FileDisk f;
+
+ if (!f.Open(FileName, "wt"))
+ return false;
+
+ for (int i = 0; i < KeyboardShortcutsCount; i++)
+ {
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[i];
+ String str;
+
+ str = Cmd.Description;
+ str += "=";
+
+ if (Cmd.Key1)
+ {
+ if (Cmd.Modifiers & LC_KEYMOD1_SHIFT)
+ str += "Shift+";
+
+ if (Cmd.Modifiers & LC_KEYMOD1_CONTROL)
+ str += "Ctrl+";
+
+ str += "\"";
+ str += GetKeyName(Cmd.Key1);
+ str += "\"";
+ }
+
+ if (Cmd.Key2)
+ {
+ str += ",";
+
+ if (Cmd.Modifiers & LC_KEYMOD2_SHIFT)
+ str += "Shift+";
+
+ if (Cmd.Modifiers & LC_KEYMOD2_CONTROL)
+ str += "Ctrl+";
+
+ str += "\"";
+ str += GetKeyName(Cmd.Key2);
+ str += "\"";
+ }
+
+ str += "\n";
+
+ f.Write((const char*)str, str.GetLength());
+ }
+
+ return true;
+}
+
+bool LoadKeyboardShortcuts(const char* FileName)
+{
+ FileDisk f;
+ int i;
+
+ if (!f.Open(FileName, "rt"))
+ return false;
+
+ // Remove all existing shortcuts
+ for (i = 0; i < KeyboardShortcutsCount; i++)
+ {
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[i];
+
+ Cmd.Key1 = 0;
+ Cmd.Key2 = 0;
+ Cmd.Modifiers = 0;
+ }
+
+ char Line[1024];
+ while (f.ReadString(Line, 1024))
+ {
+ char* ptr = strchr(Line, '=');
+
+ if (ptr == NULL)
+ continue;
+
+ *ptr = 0;
+ ptr++;
+
+
+ for (i = 0; i < KeyboardShortcutsCount; i++)
+ {
+ LC_KEYBOARD_COMMAND& Cmd = KeyboardShortcuts[i];
+
+ if (strcmp(Line, Cmd.Description))
+ continue;
+
+ if (!strncmp(ptr, "Shift+", 6))
+ {
+ Cmd.Modifiers |= LC_KEYMOD1_SHIFT;
+ ptr += 6;
+ }
+
+ if (!strncmp(ptr, "Ctrl+", 5))
+ {
+ Cmd.Modifiers |= LC_KEYMOD1_CONTROL;
+ ptr += 5;
+ }
+
+ ptr++;
+ char* ptr2 = strchr(ptr, '\"');
+
+ if (ptr2 == NULL)
+ {
+ Cmd.Modifiers = 0;
+ continue;
+ }
+
+ *ptr2 = 0;
+ Cmd.Key1 = GetKeyFromName(ptr);
+
+ ptr = ptr2 + 1;
+
+ if (*ptr != ',')
+ continue;
+ ptr++;
+
+ if (!strncmp(ptr, "Shift+", 6))
+ {
+ Cmd.Modifiers |= LC_KEYMOD2_SHIFT;
+ ptr += 6;
+ }
+
+ if (!strncmp(ptr, "Ctrl+", 5))
+ {
+ Cmd.Modifiers |= LC_KEYMOD2_CONTROL;
+ ptr += 5;
+ }
+
+ ptr++;
+ ptr2 = strchr(ptr, '\"');
+
+ if (ptr2 == NULL)
+ {
+ Cmd.Modifiers &= ~(LC_KEYMOD2_SHIFT | LC_KEYMOD2_CONTROL);
+ continue;
+ }
+
+ *ptr2 = 0;
+ Cmd.Key2 = GetKeyFromName(ptr);
+ }
+ }
+
+ return true;
+}
+
+void ResetKeyboardShortcuts()
+{
+ memcpy(KeyboardShortcuts, DefaultKeyboardShortcuts, sizeof(KeyboardShortcuts));
+}
+
+void InitKeyboardShortcuts()
+{
+ const char* FileName = Sys_ProfileLoadString("Settings", "Keyboard", "");
+
+ ResetKeyboardShortcuts();
+ LoadKeyboardShortcuts(FileName);
+}
+
+typedef struct
+{
+ int Key;
+ const char* Name;
+
+} LC_KEYNAME_ENTRY;
+
+static LC_KEYNAME_ENTRY KeyNames[] =
+{
+ { LC_KEY_BACK, "Backspace" },
+ { LC_KEY_TAB, "Tab" },
+ { LC_KEY_RETURN, "Return" },
+ { LC_KEY_PAUSE, "Pause" },
+ { LC_KEY_CAPITAL, "Caps" },
+ { LC_KEY_ESCAPE, "Escape" },
+ { LC_KEY_SPACE, "Space" },
+ { LC_KEY_PRIOR, "Page Up" },
+ { LC_KEY_NEXT, "Page Down" },
+ { LC_KEY_END, "End" },
+ { LC_KEY_HOME, "Home" },
+ { LC_KEY_LEFT, "Left" },
+ { LC_KEY_UP, "Up" },
+ { LC_KEY_RIGHT, "Right" },
+ { LC_KEY_DOWN, "Down" },
+ { LC_KEY_SELECT, "Select" },
+ { LC_KEY_PRINT, "Print" },
+ { LC_KEY_INSERT, "Insert" },
+ { LC_KEY_DELETE, "Delete" },
+ { LC_KEY_0, "0" },
+ { LC_KEY_1, "1" },
+ { LC_KEY_2, "2" },
+ { LC_KEY_3, "3" },
+ { LC_KEY_4, "4" },
+ { LC_KEY_5, "5" },
+ { LC_KEY_6, "6" },
+ { LC_KEY_7, "7" },
+ { LC_KEY_8, "8" },
+ { LC_KEY_9, "9" },
+ { LC_KEY_A, "A" },
+ { LC_KEY_B, "B" },
+ { LC_KEY_C, "C" },
+ { LC_KEY_D, "D" },
+ { LC_KEY_E, "E" },
+ { LC_KEY_F, "F" },
+ { LC_KEY_G, "G" },
+ { LC_KEY_H, "H" },
+ { LC_KEY_I, "I" },
+ { LC_KEY_J, "J" },
+ { LC_KEY_K, "K" },
+ { LC_KEY_L, "L" },
+ { LC_KEY_M, "M" },
+ { LC_KEY_N, "N" },
+ { LC_KEY_O, "O" },
+ { LC_KEY_P, "P" },
+ { LC_KEY_Q, "Q" },
+ { LC_KEY_R, "R" },
+ { LC_KEY_S, "S" },
+ { LC_KEY_T, "T" },
+ { LC_KEY_U, "U" },
+ { LC_KEY_V, "V" },
+ { LC_KEY_W, "W" },
+ { LC_KEY_X, "X" },
+ { LC_KEY_Y, "Y" },
+ { LC_KEY_Z, "Z" },
+ { LC_KEY_NUMPAD0, "Numpad 0" },
+ { LC_KEY_NUMPAD1, "Numpad 1" },
+ { LC_KEY_NUMPAD2, "Numpad 2" },
+ { LC_KEY_NUMPAD3, "Numpad 3" },
+ { LC_KEY_NUMPAD4, "Numpad 4" },
+ { LC_KEY_NUMPAD5, "Numpad 5" },
+ { LC_KEY_NUMPAD6, "Numpad 6" },
+ { LC_KEY_NUMPAD7, "Numpad 7" },
+ { LC_KEY_NUMPAD8, "Numpad 8" },
+ { LC_KEY_NUMPAD9, "Numpad 9" },
+ { LC_KEY_MULTIPLY, "Numpad *" },
+ { LC_KEY_ADD, "Numpad +" },
+ { LC_KEY_SUBTRACT, "Numpad -" },
+ { LC_KEY_DECIMAL, "Numpad ." },
+ { LC_KEY_DIVIDE, "Numpad /" },
+ { LC_KEY_F1, "F1" },
+ { LC_KEY_F2, "F2" },
+ { LC_KEY_F3, "F3" },
+ { LC_KEY_F4, "F4" },
+ { LC_KEY_F5, "F5" },
+ { LC_KEY_F6, "F6" },
+ { LC_KEY_F7, "F7" },
+ { LC_KEY_F8, "F8" },
+ { LC_KEY_F9, "F9" },
+ { LC_KEY_F10, "F10" },
+ { LC_KEY_F11, "F11" },
+ { LC_KEY_F12, "F12" },
+ { LC_KEY_F13, "F13" },
+ { LC_KEY_F14, "F14" },
+ { LC_KEY_F15, "F15" },
+ { LC_KEY_F16, "F16" },
+ { LC_KEY_F17, "F17" },
+ { LC_KEY_F18, "F18" },
+ { LC_KEY_F19, "F19" },
+ { LC_KEY_F20, "F20" },
+ { LC_KEY_F21, "F21" },
+ { LC_KEY_F22, "F22" },
+ { LC_KEY_F23, "F23" },
+ { LC_KEY_F24, "F24" },
+ { LC_KEY_NUMLOCK, "Num Lock" },
+ { LC_KEY_SCROLL, "Scroll" }
+};
+
+// Returns a string with the name of the key.
+const char* GetKeyName(char Key)
+{
+ int Count = sizeof(KeyNames)/sizeof(KeyNames[0]);
+
+ for (int i = 0; i < Count; i++)
+ {
+ if (Key == KeyNames[i].Key)
+ return KeyNames[i].Name;
+ }
+
+ return NULL;
+}
+
+char GetKeyFromName(const char* Name)
+{
+ int Count = sizeof(KeyNames)/sizeof(KeyNames[0]);
+
+ for (int i = 0; i < Count; i++)
+ {
+ if (!strcmp(Name, KeyNames[i].Name))
+ return KeyNames[i].Key;
+ }
+
+ return 0;
+}
diff --git a/common/keyboard.h b/common/keyboard.h
new file mode 100644
index 0000000..9151542
--- /dev/null
+++ b/common/keyboard.h
@@ -0,0 +1,143 @@
+#ifndef _KEYBOARD_H_
+#define _KEYBOARD_H_
+
+#include "typedefs.h"
+
+// ============================================================================
+// Keyboard keys.
+
+#define LC_KEY_BACK 0x08
+#define LC_KEY_TAB 0x09
+
+#define LC_KEY_RETURN 0x0D
+
+#define LC_KEY_PAUSE 0x13
+#define LC_KEY_CAPITAL 0x14
+
+#define LC_KEY_ESCAPE 0x1B
+
+#define LC_KEY_SPACE 0x20
+#define LC_KEY_PRIOR 0x21
+#define LC_KEY_NEXT 0x22
+#define LC_KEY_END 0x23
+#define LC_KEY_HOME 0x24
+#define LC_KEY_LEFT 0x25
+#define LC_KEY_UP 0x26
+#define LC_KEY_RIGHT 0x27
+#define LC_KEY_DOWN 0x28
+#define LC_KEY_SELECT 0x29
+#define LC_KEY_PRINT 0x2A
+#define LC_KEY_INSERT 0x2D
+#define LC_KEY_DELETE 0x2E
+
+#define LC_KEY_0 0x30
+#define LC_KEY_1 0x31
+#define LC_KEY_2 0x32
+#define LC_KEY_3 0x33
+#define LC_KEY_4 0x34
+#define LC_KEY_5 0x35
+#define LC_KEY_6 0x36
+#define LC_KEY_7 0x37
+#define LC_KEY_8 0x38
+#define LC_KEY_9 0x39
+
+#define LC_KEY_A 0x41
+#define LC_KEY_B 0x42
+#define LC_KEY_C 0x43
+#define LC_KEY_D 0x44
+#define LC_KEY_E 0x45
+#define LC_KEY_F 0x46
+#define LC_KEY_G 0x47
+#define LC_KEY_H 0x48
+#define LC_KEY_I 0x49
+#define LC_KEY_J 0x4A
+#define LC_KEY_K 0x4B
+#define LC_KEY_L 0x4C
+#define LC_KEY_M 0x4D
+#define LC_KEY_N 0x4E
+#define LC_KEY_O 0x4F
+#define LC_KEY_P 0x50
+#define LC_KEY_Q 0x51
+#define LC_KEY_R 0x52
+#define LC_KEY_S 0x53
+#define LC_KEY_T 0x54
+#define LC_KEY_U 0x55
+#define LC_KEY_V 0x56
+#define LC_KEY_W 0x57
+#define LC_KEY_X 0x58
+#define LC_KEY_Y 0x59
+#define LC_KEY_Z 0x5A
+
+#define LC_KEY_NUMPAD0 0x60
+#define LC_KEY_NUMPAD1 0x61
+#define LC_KEY_NUMPAD2 0x62
+#define LC_KEY_NUMPAD3 0x63
+#define LC_KEY_NUMPAD4 0x64
+#define LC_KEY_NUMPAD5 0x65
+#define LC_KEY_NUMPAD6 0x66
+#define LC_KEY_NUMPAD7 0x67
+#define LC_KEY_NUMPAD8 0x68
+#define LC_KEY_NUMPAD9 0x69
+#define LC_KEY_MULTIPLY 0x6A
+#define LC_KEY_ADD 0x6B
+//#define LC_KEY_SEPARATOR 0x6C
+#define LC_KEY_SUBTRACT 0x6D
+#define LC_KEY_DECIMAL 0x6E
+#define LC_KEY_DIVIDE 0x6F
+#define LC_KEY_F1 0x70
+#define LC_KEY_F2 0x71
+#define LC_KEY_F3 0x72
+#define LC_KEY_F4 0x73
+#define LC_KEY_F5 0x74
+#define LC_KEY_F6 0x75
+#define LC_KEY_F7 0x76
+#define LC_KEY_F8 0x77
+#define LC_KEY_F9 0x78
+#define LC_KEY_F10 0x79
+#define LC_KEY_F11 0x7A
+#define LC_KEY_F12 0x7B
+#define LC_KEY_F13 0x7C
+#define LC_KEY_F14 0x7D
+#define LC_KEY_F15 0x7E
+#define LC_KEY_F16 0x7F
+#define LC_KEY_F17 0x80
+#define LC_KEY_F18 0x81
+#define LC_KEY_F19 0x82
+#define LC_KEY_F20 0x83
+#define LC_KEY_F21 0x84
+#define LC_KEY_F22 0x85
+#define LC_KEY_F23 0x86
+#define LC_KEY_F24 0x87
+
+#define LC_KEY_NUMLOCK 0x90
+#define LC_KEY_SCROLL 0x91
+
+// ============================================================================
+// Functions.
+
+#define LC_KEYMOD1_SHIFT 0x01
+#define LC_KEYMOD1_CONTROL 0x02
+#define LC_KEYMOD2_SHIFT 0x10
+#define LC_KEYMOD2_CONTROL 0x20
+
+typedef struct
+{
+ LC_COMMANDS ID;
+ const char* Description;
+ unsigned char Modifiers;
+ unsigned char Key1;
+ unsigned char Key2;
+} LC_KEYBOARD_COMMAND;
+
+extern LC_KEYBOARD_COMMAND KeyboardShortcuts[];
+extern const int KeyboardShortcutsCount;
+
+const char* GetKeyName(char Key);
+char GetKeyFromName(const char* Name);
+
+void InitKeyboardShortcuts();
+void ResetKeyboardShortcuts();
+bool SaveKeyboardShortcuts(const char* FileName);
+bool LoadKeyboardShortcuts(const char* FileName);
+
+#endif // _KEYBOARD_H_