summaryrefslogtreecommitdiff
path: root/hw/xwin/winconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xwin/winconfig.c')
-rw-r--r--hw/xwin/winconfig.c101
1 files changed, 83 insertions, 18 deletions
diff --git a/hw/xwin/winconfig.c b/hw/xwin/winconfig.c
index bc336527c..b42b1d6bf 100644
--- a/hw/xwin/winconfig.c
+++ b/hw/xwin/winconfig.c
@@ -27,7 +27,7 @@
*
* Authors: Alexander Gottwald
*/
-/* $XFree86: xc/programs/Xserver/hw/xwin/winconfig.c,v 1.1 2002/10/17 08:18:22 alanh Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xwin/winconfig.c,v 1.4 2003/10/08 11:13:02 eich Exp $ */
#include "win.h"
#include "winconfig.h"
@@ -112,11 +112,10 @@ static Bool GetBoolValue (OptionInfoPtr p, const char *s);
Bool
winReadConfigfile ()
{
- Bool retval = TRUE;
- const char *filename;
-
- MessageType from = X_DEFAULT;
- char *xf86ConfigFile = NULL;
+ Bool retval = TRUE;
+ const char *filename;
+ MessageType from = X_DEFAULT;
+ char *xf86ConfigFile = NULL;
if (g_cmdline.configFile)
{
@@ -146,16 +145,7 @@ winReadConfigfile ()
}
xf86closeConfigFile ();
- winMsg (X_NONE, "Markers: ");
- winMsg (X_PROBED, "probed, ");
- winMsg (X_CONFIG, "from config file, ");
- winMsg (X_DEFAULT, "default setting,\n ");
- winMsg (X_CMDLINE, "from command line, ");
- winMsg (X_NOTICE, "notice, ");
- winMsg (X_INFO, "informational,\n ");
- winMsg (X_WARNING, "warning, ");
- winMsg (X_ERROR, "error, ");
- winMsg (X_UNKNOWN, "unknown.\n");
+ LogPrintMarkers();
/* set options from data structure */
@@ -213,9 +203,46 @@ winReadConfigfile ()
/* Set the keyboard configuration */
+typedef struct {
+ unsigned int winlayout;
+ int winkbtype;
+ char *xkbmodel;
+ char *xkblayout;
+ char *xkbvariant;
+ char *xkboptions;
+ char *layoutname;
+} WinKBLayoutRec, *WinKBLayoutPtr;
+
+WinKBLayoutRec winKBLayouts[] = {
+ { 0x405, -1, "pc105", "cz", NULL, NULL, "Czech"},
+ { 0x406, -1, "pc105", "dk", NULL, NULL, "Danish"},
+ { 0x407, -1, "pc105", "de", NULL, NULL, "German (Germany)"},
+ {0x10407, -1, "pc105", "de", NULL, NULL, "German (Germany, IBM)"},
+ { 0x807, -1, "pc105", "de_CH", NULL, NULL, "German (Switzerland)"},
+ {0x10409, -1, "pc105", "dvorak", NULL, NULL, "English (USA, Dvorak)"},
+ {0x20409, -1, "pc105", "us_intl", NULL, NULL, "English (USA, International)"},
+ { 0x809, -1, "pc105", "gb", NULL, NULL, "English (United Kingdom)"},
+ { 0x40a, -1, "pc105", "es", NULL, NULL, "Spanish (Spain, Traditional Sort)"},
+ { 0x40b, -1, "pc105", "fi", NULL, NULL, "Finnish"},
+ { 0x40c, -1, "pc105", "fr", NULL, NULL, "French (Standard)"},
+ { 0x80c, -1, "pc105", "be", NULL, NULL, "French (Belgian)"},
+ { 0x410, -1, "pc105", "it", NULL, NULL, "Italian"},
+ { 0x411, -1, "jp", "jp", NULL, NULL, "Japanese"},
+ { 0x414, -1, "pc105", "no", NULL, NULL, "Norwegian"},
+ { 0x416, -1, "pc105", "pt", NULL, NULL, "Portuguese (Brazil, ABNT)"},
+ {0x10416, -1, "abnt2", "br", NULL, NULL, "Portuguese (Brazil, ABNT2)"},
+ { 0x816, -1, "pc105", "pt", NULL, NULL, "Portuguese (Portugal)"},
+ { 0x41d, -1, "pc105", "se", NULL, NULL, "Swedish (Sweden)"},
+ { -1, -1, NULL, NULL, NULL, NULL, NULL}
+};
+
+
Bool
winConfigKeyboard (DeviceIntPtr pDevice)
{
+ char layoutName[KL_NAMELENGTH];
+ unsigned int layoutNum;
+ int keyboardType;
XF86ConfInputPtr kbd = NULL;
XF86ConfInputPtr input_list = NULL;
MessageType from = X_DEFAULT;
@@ -237,6 +264,44 @@ winConfigKeyboard (DeviceIntPtr pDevice)
g_winInfo.xkb.variant = NULL;
g_winInfo.xkb.options = NULL;
# endif /* PC98 */
+
+
+
+ keyboardType = GetKeyboardType (0);
+ if (keyboardType > 0 && GetKeyboardLayoutName (layoutName))
+ {
+ WinKBLayoutPtr pLayout;
+
+ layoutNum = strtoul (layoutName, (char **)NULL, 16);
+ if ((layoutNum & 0xffff) == 0x411) {
+ /* The japanese layouts know a lot of different IMEs which all have
+ different layout numbers set. Map them to a single entry.
+ Same might apply for chinese, korean and other symbol languages
+ too */
+ layoutNum = (layoutNum & 0xffff);
+ }
+ winMsg (X_DEFAULT, "winConfigKeyboard - Layout: \"%s\" (%08x) \n",
+ layoutName, layoutNum);
+
+ for (pLayout = winKBLayouts; pLayout->winlayout != -1; pLayout++)
+ {
+ if (pLayout->winlayout != layoutNum)
+ continue;
+ if (pLayout->winkbtype > 0 && pLayout->winkbtype != keyboardType)
+ continue;
+
+ winMsg (X_DEFAULT,
+ "Using preset keyboard for \"%s\" (%s), type \"%d\"\n",
+ pLayout->layoutname, layoutName, keyboardType);
+
+ g_winInfo.xkb.model = pLayout->xkbmodel;
+ g_winInfo.xkb.layout = pLayout->xkblayout;
+ g_winInfo.xkb.variant = pLayout->xkbvariant;
+ g_winInfo.xkb.options = pLayout->xkboptions;
+ break;
+ }
+ }
+
g_winInfo.xkb.initialMap = NULL;
g_winInfo.xkb.keymap = NULL;
g_winInfo.xkb.types = NULL;
@@ -265,7 +330,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
{
/* Check if device name matches requested name */
if (g_cmdline.keyboard && winNameCompare (input_list->inp_identifier,
- g_cmdline.keyboard))
+ g_cmdline.keyboard))
continue;
kbd = input_list;
}
@@ -416,7 +481,7 @@ winConfigMouse (DeviceIntPtr pDevice)
{
/* Check if device name matches requested name */
if (g_cmdline.mouse && winNameCompare (input_list->inp_identifier,
- g_cmdline.mouse))
+ g_cmdline.mouse))
continue;
mouse = input_list;
}