foxygit / doom Log in
commit d4863b4c4ac47766b5fd3b8b0949be7af792e3d0
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Fri Jun 12 19:07:55 2009 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Fri Jun 12 19:07:55 2009 +0000

    On Windows CE systems without a keyboard, patch the default settings to
    use hardware keys.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 1600
---
 setup/configfile.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 setup/configfile.h |  2 ++
 setup/mainmenu.c   |  2 ++
 src/d_main.c       |  1 +
 src/m_config.c     | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/m_config.h     |  1 +
 6 files changed, 160 insertions(+)

diff --git a/setup/configfile.c b/setup/configfile.c
index 3b6007f5..fe3c13de 100644
--- a/setup/configfile.c
+++ b/setup/configfile.c
@@ -35,6 +35,8 @@

 #ifdef _WIN32
 #include <io.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
 #else
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -647,3 +649,77 @@ void M_SaveExtraDefaults(char *filename)
     extra_defaults.filename = main_filename;
 }

+#ifdef _WIN32_WCE
+
+static int SystemHasKeyboard(void)
+{
+    HKEY key;
+    DWORD valtype;
+    DWORD valsize;
+    DWORD result;
+
+    if (RegOpenKeyExW(HKEY_CURRENT_USER,
+                      L"\\Software\\Microsoft\\Shell", 0,
+                      KEY_READ, &key) != ERROR_SUCCESS)
+    {
+        return 0;
+    }
+
+    valtype = REG_SZ;
+    valsize = sizeof(DWORD);
+
+    if (RegQueryValueExW(key, L"HasKeyboard", NULL, &valtype,
+                         (LPBYTE) &result, &valsize) != ERROR_SUCCESS)
+    {
+        result = 0;
+    }
+
+    // Close the key
+
+    RegCloseKey(key);
+
+    return result;
+}
+
+//
+// Apply custom defaults for Windows CE.
+//
+
+static void M_ApplyWindowsCEDefaults(void)
+{
+    // If the system doesn't have a keyboard, patch the default
+    // configuration to use the hardware keys.
+
+    if (!SystemHasKeyboard())
+    {
+        key_use = KEY_F1;
+        key_fire = KEY_F2;
+        key_menu_activate = KEY_F3;
+        key_map_toggle = KEY_F4;
+
+        key_menu_help = 0;
+        key_menu_save = 0;
+        key_menu_load = 0;
+        key_menu_volume = 0;
+
+        key_menu_confirm = KEY_ENTER;
+        key_menu_back = KEY_F2;
+        key_menu_abort = KEY_F2;
+    }
+}
+
+
+#endif
+
+//
+// Apply custom patches to the default values depending on the
+// platform we are running on.
+//
+
+void M_ApplyPlatformDefaults(void)
+{
+#ifdef _WIN32_WCE
+    M_ApplyWindowsCEDefaults();
+#endif
+}
+
diff --git a/setup/configfile.h b/setup/configfile.h
index f7c6156e..3ef2cf9b 100644
--- a/setup/configfile.h
+++ b/setup/configfile.h
@@ -38,5 +38,7 @@ void M_SetConfigDir(void);
 void M_SaveMainDefaults(char *filename);
 void M_SaveExtraDefaults(char *filename);

+void M_ApplyPlatformDefaults(void);
+
 #endif

diff --git a/setup/mainmenu.c b/setup/mainmenu.c
index 6a1f01c2..c7e4f48d 100644
--- a/setup/mainmenu.c
+++ b/setup/mainmenu.c
@@ -143,6 +143,8 @@ void MainMenu(void)

 static void InitConfig(void)
 {
+    M_ApplyPlatformDefaults();
+
     SetChatMacroDefaults();
     SetPlayerNameDefault();

diff --git a/src/d_main.c b/src/d_main.c
index 29a366a1..c59a8fb7 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -974,6 +974,7 @@ void D_DoomMain (void)
     V_Init ();

     printf (DEH_String("M_LoadDefaults: Load system defaults.\n"));
+    M_ApplyPlatformDefaults();
     M_LoadDefaults ();              // load before initing other systems

     printf (DEH_String("W_Init: Init WADfiles.\n"));
diff --git a/src/m_config.c b/src/m_config.c
index 9e770e48..4f789845 100644
--- a/src/m_config.c
+++ b/src/m_config.c
@@ -31,6 +31,11 @@
 #include <ctype.h>
 #include <errno.h>

+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
 #include "config.h"
 #include "deh_main.h"
 #include "doomdef.h"
@@ -1380,3 +1385,76 @@ void M_SetConfigDir(void)
     }
 }

+#ifdef _WIN32_WCE
+
+static int SystemHasKeyboard(void)
+{
+    HKEY key;
+    DWORD valtype;
+    DWORD valsize;
+    DWORD result;
+
+    if (RegOpenKeyExW(HKEY_CURRENT_USER,
+                      L"\\Software\\Microsoft\\Shell", 0,
+                      KEY_READ, &key) != ERROR_SUCCESS)
+    {
+        return 0;
+    }
+
+    valtype = REG_SZ;
+    valsize = sizeof(DWORD);
+
+    if (RegQueryValueExW(key, L"HasKeyboard", NULL, &valtype,
+                         (LPBYTE) &result, &valsize) != ERROR_SUCCESS)
+    {
+        result = 0;
+    }
+
+    // Close the key
+
+    RegCloseKey(key);
+
+    return result;
+}
+
+//
+// Apply custom defaults for Windows CE.
+//
+
+static void M_ApplyWindowsCEDefaults(void)
+{
+    // If the system doesn't have a keyboard, patch the default
+    // configuration to use the hardware keys.
+
+    if (!SystemHasKeyboard())
+    {
+        key_use = KEY_F1;
+        key_fire = KEY_F2;
+        key_menu_activate = KEY_F3;
+        key_map_toggle = KEY_F4;
+
+        key_menu_help = 0;
+        key_menu_save = 0;
+        key_menu_load = 0;
+        key_menu_volume = 0;
+
+        key_menu_confirm = KEY_ENTER;
+        key_menu_back = KEY_F2;
+        key_menu_abort = KEY_F2;
+    }
+}
+
+#endif
+
+//
+// Apply custom patches to the default values depending on the
+// platform we are running on.
+//
+
+void M_ApplyPlatformDefaults(void)
+{
+#ifdef _WIN32_WCE
+    M_ApplyWindowsCEDefaults();
+#endif
+}
+
diff --git a/src/m_config.h b/src/m_config.h
index 747569cd..ff11e6d6 100644
--- a/src/m_config.h
+++ b/src/m_config.h
@@ -31,6 +31,7 @@
 void M_LoadDefaults(void);
 void M_SaveDefaults(void);
 void M_SetConfigDir(void);
+void M_ApplyPlatformDefaults(void);

 extern char *configdir;