Index: /trunk/quest-misc/.classpath
===================================================================
--- /trunk/quest-misc/.classpath	(revision 447)
+++ /trunk/quest-misc/.classpath	(revision 447)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" path="src/main/resources"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
Index: /trunk/quest-misc/.project
===================================================================
--- /trunk/quest-misc/.project	(revision 447)
+++ /trunk/quest-misc/.project	(revision 447)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>quest-misc</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/quest-misc/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /trunk/quest-misc/.settings/org.eclipse.jdt.core.prefs	(revision 447)
+++ /trunk/quest-misc/.settings/org.eclipse.jdt.core.prefs	(revision 447)
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
Index: /trunk/quest-misc/.settings/org.eclipse.m2e.core.prefs
===================================================================
--- /trunk/quest-misc/.settings/org.eclipse.m2e.core.prefs	(revision 447)
+++ /trunk/quest-misc/.settings/org.eclipse.m2e.core.prefs	(revision 447)
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
Index: /trunk/quest-misc/pom.xml
===================================================================
--- /trunk/quest-misc/pom.xml	(revision 447)
+++ /trunk/quest-misc/pom.xml	(revision 447)
@@ -0,0 +1,30 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>de.ugoe.cs.quest</groupId>
+  <artifactId>quest-misc</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>quest-misc</name>
+  <scm>
+    <url>https://www.trex.informatik.uni-goettingen.de/svn/swephd/pharms/tasktree/trunk/quest-misc</url>
+  </scm>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.5.1</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
Index: /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyStroke.java
===================================================================
--- /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyStroke.java	(revision 447)
+++ /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyStroke.java	(revision 447)
@@ -0,0 +1,222 @@
+//-------------------------------------------------------------------------------------------------
+// Module    : $RCSfile: KeyStroke.java,v $
+// Version   : $Revision: 0.0 $  $Author: patrick $  $Date: 11.07.2012 $
+// Project   : KeyboardMaps
+// Creation  : 2012 by patrick
+// Copyright : Patrick Harms, 2012
+//-------------------------------------------------------------------------------------------------
+package de.ugoe.cs.tasktree.keyboardmaps;
+
+//-------------------------------------------------------------------------------------------------
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 11.07.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+//-------------------------------------------------------------------------------------------------
+public class KeyStroke
+{
+
+  /** */
+  private String mKeyStrokeName;
+
+  /** */
+  private VirtualKey mVirtualKey;
+
+  /** */
+  private boolean mNumlock;
+
+  /** */
+  private boolean mLocalstate;
+
+  /** */
+  private boolean mShift;
+
+  /** */
+  private boolean mAltgr;
+
+  /** */
+  private boolean mInhibit;
+
+  /** */
+  private char mCharacter;
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyStrokeName
+   * @param mapKeyIdToVirtualKey
+   * @param numlock
+   * @param localstate
+   * @param b
+   * @param altgr
+   * @param inhibit
+   */
+  //-----------------------------------------------------------------------------------------------
+  public KeyStroke(String     keyStrokeName,
+                   VirtualKey virtualKey,
+                   boolean    numlock,
+                   boolean    localstate,
+                   boolean    shift,
+                   boolean    altgr,
+                   boolean    inhibit,
+                   char       character)
+  {
+    mKeyStrokeName = keyStrokeName;
+    mVirtualKey = virtualKey;
+    mNumlock = numlock;
+    mLocalstate = localstate;
+    mShift = shift;
+    mAltgr = altgr;
+    mInhibit = inhibit;
+    mCharacter = character;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * @return the keyStrokeName
+   */
+  //-----------------------------------------------------------------------------------------------
+  public String getKeyStrokeName()
+  {
+    return mKeyStrokeName;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public VirtualKey getVirtualKey()
+  {
+    return mVirtualKey;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public char getCharacter()
+  {
+    return mCharacter;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean getInhibit()
+  {
+    return mInhibit;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean getAltgr()
+  {
+    return mAltgr;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean getShift()
+  {
+    return mShift;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean getLocalstate()
+  {
+    return mLocalstate;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean getNumlock()
+  {
+    return mNumlock;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /* (non-Javadoc)
+   * @see java.lang.Object#toString()
+   */
+  //-----------------------------------------------------------------------------------------------
+  @Override
+  public String toString()
+  {
+    StringBuffer toString = new StringBuffer();
+    toString.append("KeyStroke(");
+    toString.append(mKeyStrokeName);
+    toString.append(", ");
+    toString.append(mVirtualKey);
+    
+    if (mCharacter != Character.UNASSIGNED)
+    {
+      toString.append(", \'");
+      toString.append(mCharacter);
+      toString.append("\'");
+    }
+    
+    if (mShift)
+    {
+      toString.append(", shift");
+    }
+    
+    if (mAltgr)
+    {
+      toString.append(", altgr");
+    }
+    
+    if (mNumlock)
+    {
+      toString.append(", numlock");
+    }
+    
+    if (mLocalstate)
+    {
+      toString.append(", localstate");
+    }
+    
+    if (mInhibit)
+    {
+      toString.append(", inhibit");
+    }
+    
+    toString.append(")");
+
+    return toString.toString();
+  }
+
+}
Index: /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMap.java
===================================================================
--- /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMap.java	(revision 447)
+++ /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMap.java	(revision 447)
@@ -0,0 +1,2920 @@
+//-------------------------------------------------------------------------------------------------
+// Module    : $RCSfile: KeyboardMap.java,v $
+// Version   : $Revision: 0.0 $  $Author: patrick $  $Date: 11.07.2012 $
+// Project   : KeyboardMaps
+// Creation  : 2012 by patrick
+// Copyright : Patrick Harms, 2012
+//-------------------------------------------------------------------------------------------------
+package de.ugoe.cs.tasktree.keyboardmaps;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+//-------------------------------------------------------------------------------------------------
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 11.07.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+//-------------------------------------------------------------------------------------------------
+public class KeyboardMap
+{
+  /** */
+  private static Logger LOG = Logger.getLogger(KeyboardMap.class.getName());
+
+  /** */
+  private Locale mLocale;
+
+  /** */
+  private String mFileName;
+
+  /** */
+  private Map<VirtualKey, List<KeyStroke>> mKeyStrokes = new HashMap<VirtualKey, List<KeyStroke>>();
+  
+  /** TODO: remove this stuff */
+  private List<Object[]> mKeyIds = new ArrayList<Object[]>();
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param locale
+   */
+  //-----------------------------------------------------------------------------------------------
+  KeyboardMap(Locale locale)
+  {
+    mLocale = locale;
+    
+    if ((mLocale == Locale.ENGLISH) || (mLocale == Locale.US) || (mLocale == Locale.CANADA))
+    {
+      mFileName = "en-us";
+    }
+    else if (mLocale == Locale.UK)
+    {
+      mFileName = "en-gb";
+    }
+    else
+    {
+      mFileName = locale.getLanguage();
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param digit1
+   * @param b
+   * @param c
+   * @param d
+   * @param e
+   * @param f
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public char getCharacterFor(VirtualKey key,
+                              boolean    numlock,
+                              boolean    shift,
+                              boolean    altgr,
+                              boolean    inhibit)
+    throws IllegalArgumentException
+  {
+    List<KeyStroke> candidates = mKeyStrokes.get(key);
+    
+    if (candidates == null)
+    {
+      return Character.UNASSIGNED;
+    }
+    
+    // try to find the key stroke 
+    for (KeyStroke keyStroke : candidates)
+    {
+      if ((numlock == keyStroke.getNumlock()) &&
+          (!keyStroke.getLocalstate()) &&
+          (shift == keyStroke.getShift()) &&
+          (altgr == keyStroke.getAltgr()) &&
+          (inhibit == keyStroke.getInhibit()))
+      {
+        return keyStroke.getCharacter();
+      }
+    }
+    
+    // try to find the key stroke with a local state ignoring the other keys
+    for (KeyStroke keyStroke : candidates)
+    {
+      if ((numlock == keyStroke.getNumlock()) &&
+          (keyStroke.getLocalstate()) &&
+          (inhibit == keyStroke.getInhibit()))
+      {
+        return keyStroke.getCharacter();
+      }
+    }
+    
+    return Character.UNASSIGNED;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  void init() throws IllegalArgumentException
+  {
+    LOG.info("initializing keymap for locale " + mLocale);
+
+    List<String[]> deadKeySequences = new ArrayList<String[]>();
+    List<String[]> keyStrokes = new ArrayList<String[]>();
+    readStream(getStream(mFileName), deadKeySequences, keyStrokes);
+    
+    LOG.info("read " + keyStrokes.size() + " key strokes and " + deadKeySequences.size() +
+             " dead key sequences");
+
+    VirtualKeySynonyms virtualKeySynonyms = determineVirtualKeySynonyms(keyStrokes);
+    processKeyStrokes(keyStrokes, virtualKeySynonyms);
+    processDeadKeySequences(deadKeySequences);
+    
+    for (Object[] keyId : mKeyIds)
+    {
+      System.out.println(Integer.toHexString((Integer) keyId[0]) + "  " + keyId[1]);
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param fileName
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  private InputStream getStream(String name)
+  {
+    LOG.info("reading keymap for locale " + mLocale + " from resource keymaps/" + name);
+
+    InputStream stream =
+      this.getClass().getClassLoader().getResourceAsStream("keymaps/" + name);
+      
+    if (stream == null)
+    {
+      throw new IllegalArgumentException("no keyboard map available for locale " + mLocale);
+    }
+    
+    return stream;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param stream
+   * @param virtualKeySynonyms 
+   * @param deadKeySequences 
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void readStream(InputStream    stream,
+                          List<String[]> deadKeySequences,
+                          List<String[]> keyStrokes)
+    throws IllegalArgumentException
+  {
+    BufferedReader in = new BufferedReader(new InputStreamReader(stream));
+    
+    try
+    {
+      String line;
+      while ((line = in.readLine()) != null)
+      {
+        if (!"".equals(line))
+        {
+          processLine(line, deadKeySequences, keyStrokes);
+        }
+      }
+    }
+    catch (IOException e)
+    {
+      LOG.log(Level.WARNING, "no keyboard map available for locale " + mLocale, e);
+      throw new IllegalArgumentException("no keyboard map available for locale " + mLocale, e);
+    }
+    finally
+    {
+      try
+      {
+        in.close();
+      }
+      catch (IOException e)
+      {
+        LOG.warning("could not close input stream for reading keyboard map");
+      }
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param line
+   * @param deadKeySequences 
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void processLine(String         line,
+                           List<String[]> deadKeySequences,
+                           List<String[]> keyStrokes)
+  {
+    String[] values = line.split(" ");
+    
+    if (values.length <= 0)
+    {
+      return;
+    }
+    
+    // ignore comments
+    if (values[0].startsWith("#"))
+    {
+      return;
+    }
+    
+    if ("map".equals(values[0]))
+    {
+      // this is the map id. Ignore it.
+    }
+    else if ("include".equals(values[0]))
+    {
+      // process all includes
+      for (int i = 1; i < values.length; i++)
+      {
+        if (!values[i].startsWith("#"))
+        {
+          readStream(getStream(values[i]), deadKeySequences, keyStrokes);
+        }
+        else
+        {
+          break;
+        }
+      }
+    }
+    else if ("sequence".equals(values[0]))
+    {
+      deadKeySequences.add(values);
+    }
+    else
+    {
+      boolean alreadyAdded = false;
+      
+      // check, if there is a replacement
+      for (int i = 0; i < keyStrokes.size(); i++)
+      {
+        if (keyStrokes.get(i)[0].equals(values[0]))
+        {
+          LOG.finest("replacing key stroke " + values[0] + " with former keyid " +
+                     keyStrokes.get(i)[1] + " with new key id " + values[1]);
+          keyStrokes.set(i, values);
+          alreadyAdded = true;
+          break;
+        }
+      }
+      
+      if (!alreadyAdded)
+      {
+        keyStrokes.add(values);
+      }
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyStrokes
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  private VirtualKeySynonyms determineVirtualKeySynonyms(List<String[]> keyStrokes)
+  {
+    LOG.info("determining virtual keys and synonyms for the keymap");
+
+    VirtualKeySynonyms virtualKeySynonyms = new VirtualKeySynonyms();
+    
+    // for debugging purposes, determine which key strokes are not matched to virtual keys.
+    List<String[]> unmatchedKeyStrokes = new ArrayList<String[]>();
+    
+    for (String[] keyStroke : keyStrokes)
+    {
+      String keyStrokeName = keyStroke[0];
+      int keyId = getKeyId(keyStroke[1]);
+      //System.err.println(keyStrokeName + "  0x" + Integer.toHexString(keyId));
+
+      VirtualKey virtualKey = determineVirtualKey(keyStrokeName);
+      
+      if (virtualKey != null)
+      {
+        virtualKeySynonyms.add(keyId, virtualKey);
+      }
+      else
+      {
+        unmatchedKeyStrokes.add(keyStroke);
+      }
+    }
+    
+    for (String[] unmatchedKeyStroke : unmatchedKeyStrokes)
+    {
+      if (!virtualKeySynonyms.containsKey(getKeyId(unmatchedKeyStroke[1])))
+      {
+        LOG.finest("no virtual key mapped to key stroke " + unmatchedKeyStroke[0] + "(" +
+                   unmatchedKeyStroke[1] + ") of keyboard map for locale " + mLocale);
+      }
+    }
+    
+    return virtualKeySynonyms;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param string
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  private int getKeyId(String keyIdString)
+  {
+    if (keyIdString.startsWith("0x"))
+    {
+      keyIdString = keyIdString.substring(2);
+    }
+  
+    return Integer.parseInt(keyIdString, 16);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyStrokes
+   * @param virtualKeySynonyms
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void processKeyStrokes(List<String[]> keyStrokes, VirtualKeySynonyms virtualKeySynonyms)
+  {
+    for (String[] keyStroke : keyStrokes)
+    {
+      handleKeyStroke(keyStroke, virtualKeySynonyms);
+    }
+    
+    addKeyStrokesIndependentOfNumLock();
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param values
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void handleKeyStroke(String[]           values,
+                               VirtualKeySynonyms virtualKeySynonyms)
+  {
+    String keyStrokeName = values[0];
+    String keyIdString = values[1];
+    if (keyIdString.startsWith("0x"))
+    {
+      keyIdString = keyIdString.substring(2);
+    }
+    
+    int keyId = Integer.parseInt(keyIdString, 16);
+    
+    // parse the conditions
+    boolean numlock = false;
+    boolean localstate = false;
+    boolean shift = false;
+    boolean altgr = false;
+    boolean addupper = false;
+    boolean inhibit = false;
+    
+    for (int i = 2; i < values.length; i++)
+    {
+      if (!values[i].startsWith("#"))
+      {
+        if ("numlock".equals(values[i]))
+        {
+          numlock = true;
+        }
+        else if ("localstate".equals(values[i]))
+        {
+          localstate = true;
+        }
+        else if ("shift".equals(values[i]))
+        {
+          shift = true;
+        }
+        else if ("altgr".equals(values[i]))
+        {
+          altgr = true;
+        }
+        else if ("addupper".equals(values[i]))
+        {
+          addupper = true;
+        }
+        else if ("inhibit".equals(values[i]))
+        {
+          inhibit = true;
+        }
+        else
+        {
+          LOG.severe("unknown condition " + values[i] + " specified for key stroke " +
+                     keyStrokeName + " through keyboard map for locale " + mLocale);
+          throw new IllegalArgumentException("no keyboard map available for locale " + mLocale);
+        }
+      }
+      else
+      {
+        break;
+      }
+    }
+    
+    addAllRepresentedKeyStrokes(keyStrokeName, keyId, numlock, localstate, shift, altgr, addupper,
+                                inhibit, virtualKeySynonyms);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyStrokeName
+   * @param keyId
+   * @param numlock
+   * @param localstate
+   * @param shift
+   * @param altgr
+   * @param addupper
+   * @param inhibit
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void addAllRepresentedKeyStrokes(String             keyStrokeName,
+                                           int                keyId,
+                                           boolean            numlock,
+                                           boolean            localstate,
+                                           boolean            shift,
+                                           boolean            altgr,
+                                           boolean            addupper,
+                                           boolean            inhibit,
+                                           VirtualKeySynonyms virtualKeySynonyms)
+  {
+    VirtualKey[] virtualKeys = virtualKeySynonyms.getVirtualKeySynonyms(keyId);
+    
+    if (virtualKeys == null)
+    {
+      LOG.severe("no virtual key mapped to key stroke " + keyStrokeName +
+                 " of keyboard map for locale " + mLocale);
+      //throw new IllegalArgumentException("no keyboard map available for locale " + mLocale);
+      return;
+    }
+    
+    for (VirtualKey virtualKey : virtualKeys)
+    {
+      if (addupper)
+      {
+        char c = determineCharacter(keyStrokeName, true);
+        addKeyStroke(keyStrokeName, virtualKey, numlock, localstate, true, altgr, inhibit, c);
+      
+        c = determineCharacter(keyStrokeName, false);
+        addKeyStroke(keyStrokeName, virtualKey, numlock, localstate, false, altgr, inhibit, c);
+      }
+      else
+      {
+        char c = determineCharacter(keyStrokeName, false);
+        addKeyStroke(keyStrokeName, virtualKey, numlock, localstate, shift, altgr, inhibit, c);
+      }
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyStroke
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void addKeyStroke(String     keyStrokeName,
+                            VirtualKey virtualKey,
+                            boolean    numlock,
+                            boolean    localstate,
+                            boolean    shift,
+                            boolean    altgr,
+                            boolean    inhibit,
+                            char       character)
+  {
+    KeyStroke keyStroke = new KeyStroke
+      (keyStrokeName, virtualKey, numlock, localstate, shift, altgr, inhibit, character);
+    
+    List<KeyStroke> keyStrokes = mKeyStrokes.get(keyStroke.getVirtualKey());
+    
+    if (keyStrokes == null)
+    {
+      keyStrokes = new ArrayList<KeyStroke>();
+      mKeyStrokes.put(keyStroke.getVirtualKey(), keyStrokes);
+    }
+    
+    keyStrokes.add(keyStroke);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void addKeyStrokesIndependentOfNumLock()
+  {
+    for (Map.Entry<VirtualKey, List<KeyStroke>> entry : mKeyStrokes.entrySet())
+    {
+      List<KeyStroke> keyStrokesToAdd = new ArrayList<KeyStroke>();
+      for (KeyStroke keyStroke : entry.getValue())
+      {
+        if (!keyStroke.getNumlock())
+        {
+          boolean foundPositiveNumlockVariant = false;
+          for (KeyStroke candidate : entry.getValue())
+          {
+            if ((candidate.getShift() == keyStroke.getShift()) &&
+                (candidate.getAltgr() == keyStroke.getAltgr()) &&
+                (candidate.getLocalstate() == keyStroke.getLocalstate()) &&
+                (candidate.getInhibit() == keyStroke.getInhibit()) &&
+                (candidate.getNumlock()))
+            {
+              foundPositiveNumlockVariant = true;
+              break;
+            }
+          }
+          
+          if (!foundPositiveNumlockVariant)
+          {
+            keyStrokesToAdd.add(keyStroke);
+          }
+        }
+      }
+      
+      for (KeyStroke keyStroke : keyStrokesToAdd)
+      {
+        addKeyStroke(keyStroke.getKeyStrokeName(), keyStroke.getVirtualKey(), true,
+                     keyStroke.getLocalstate(), keyStroke.getShift(), keyStroke.getAltgr(),
+                     keyStroke.getInhibit(), keyStroke.getCharacter());
+      }
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param deadKeySequences
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void processDeadKeySequences(List<String[]> deadKeySequences)
+  {
+    // TODO Auto-generated method stub
+    //System.out.println("PATRICK: KeyboardMap.processDeadKeySequences ");
+    
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyStrokeName
+   * @param shift
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  private VirtualKey determineVirtualKey(String keyStrokeName)
+  {
+    if ("Shift_R".equals(keyStrokeName))
+    {
+      return VirtualKey.SHIFT;
+    }
+    else if ("Shift_L".equals(keyStrokeName))
+    {
+      return VirtualKey.SHIFT;
+    }
+    else if ("Alt_R".equals(keyStrokeName))
+    {
+      return VirtualKey.ALT_GRAPH;
+    }
+    else if ("Mode_switch".equals(keyStrokeName))
+    {
+      return VirtualKey.MODECHANGE;
+    }
+    else if ("ISO_Level3_Shift".equals(keyStrokeName))
+    {
+      return VirtualKey.SHIFT;
+    }
+    else if ("Alt_L".equals(keyStrokeName))
+    {
+      return VirtualKey.ALT;
+    }
+    else if ("Control_R".equals(keyStrokeName))
+    {
+      return VirtualKey.CONTROL;
+    }
+    else if ("Control_L".equals(keyStrokeName))
+    {
+      return VirtualKey.CONTROL;
+    }
+    else if ("Menu".equals(keyStrokeName))
+    {
+      return VirtualKey.WINDOWS;
+    }
+    else if ("1".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_1;
+    }
+    else if ("2".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_2;
+    }
+    else if ("3".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_3;
+    }
+    else if ("4".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_4;
+    }
+    else if ("5".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_5;
+    }
+    else if ("6".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_6;
+    }
+    else if ("7".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_7;
+    }
+    else if ("8".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_8;
+    }
+    else if ("9".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_9;
+    }
+    else if ("0".equals(keyStrokeName))
+    {
+      return VirtualKey.DIGIT_0;
+    }
+    else if ("BackSpace".equals(keyStrokeName))
+    {
+      return VirtualKey.BACK_SPACE;
+    }
+    else if ("Tab".equals(keyStrokeName))
+    {
+      return VirtualKey.TAB;
+    }
+    else if ("q".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_Q;
+    }
+    else if ("w".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_W;
+    }
+    else if ("e".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_E;
+    }
+    else if ("r".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_R;
+    }
+    else if ("t".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_T;
+    }
+    else if ("y".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_Y;
+    }
+    else if ("u".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_U;
+    }
+    else if ("i".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_I;
+    }
+    else if ("o".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_O;
+    }
+    else if ("p".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_P;
+    }
+    else if ("a".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_A;
+    }
+    else if ("s".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_S;
+    }
+    else if ("d".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_D;
+    }
+    else if ("f".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_F;
+    }
+    else if ("g".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_G;
+    }
+    else if ("h".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_H;
+    }
+    else if ("j".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_J;
+    }
+    else if ("k".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_K;
+    }
+    else if ("l".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_L;
+    }
+    else if ("Return".equals(keyStrokeName))
+    {
+      return VirtualKey.ENTER;
+    }
+    else if ("z".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_Z;
+    }
+    else if ("x".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_X;
+    }
+    else if ("c".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_C;
+    }
+    else if ("v".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_V;
+    }
+    else if ("b".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_B;
+    }
+    else if ("n".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_N;
+    }
+    else if ("m".equals(keyStrokeName))
+    {
+      return VirtualKey.LETTER_M;
+    }
+    else if ("space".equals(keyStrokeName))
+    {
+      return VirtualKey.SPACE;
+    }
+    else if ("less".equals(keyStrokeName))
+    {
+      return VirtualKey.LESS;
+    }
+    else if ("greater".equals(keyStrokeName))
+    {
+      return VirtualKey.GREATER;
+    }
+    else if ("Escape".equals(keyStrokeName))
+    {
+      return VirtualKey.ESCAPE;
+    }
+    else if ("F1".equals(keyStrokeName))
+    {
+      return VirtualKey.F1;
+    }
+    else if ("F2".equals(keyStrokeName))
+    {
+      return VirtualKey.F2;
+    }
+    else if ("F3".equals(keyStrokeName))
+    {
+      return VirtualKey.F3;
+    }
+    else if ("F4".equals(keyStrokeName))
+    {
+      return VirtualKey.F4;
+    }
+    else if ("F5".equals(keyStrokeName))
+    {
+      return VirtualKey.F5;
+    }
+    else if ("F6".equals(keyStrokeName))
+    {
+      return VirtualKey.F6;
+    }
+    else if ("F7".equals(keyStrokeName))
+    {
+      return VirtualKey.F7;
+    }
+    else if ("F8".equals(keyStrokeName))
+    {
+      return VirtualKey.F8;
+    }
+    else if ("F9".equals(keyStrokeName))
+    {
+      return VirtualKey.F9;
+    }
+    else if ("F10".equals(keyStrokeName))
+    {
+      return VirtualKey.F10;
+    }
+    else if ("F11".equals(keyStrokeName))
+    {
+      return VirtualKey.F11;
+    }
+    else if ("F12".equals(keyStrokeName))
+    {
+      return VirtualKey.F12;
+    }
+    else if ("F13".equals(keyStrokeName))
+    {
+      return VirtualKey.F13;
+    }
+    else if ("F14".equals(keyStrokeName))
+    {
+      return VirtualKey.F14;
+    }
+    else if ("F15".equals(keyStrokeName))
+    {
+      return VirtualKey.F15;
+    }
+    else if ("F16".equals(keyStrokeName))
+    {
+      return VirtualKey.F16;
+    }
+    else if ("F17".equals(keyStrokeName))
+    {
+      return VirtualKey.F17;
+    }
+    else if ("F18".equals(keyStrokeName))
+    {
+      return VirtualKey.F18;
+    }
+    else if ("F19".equals(keyStrokeName))
+    {
+      return VirtualKey.F19;
+    }
+    else if ("F20".equals(keyStrokeName))
+    {
+      return VirtualKey.F20;
+    }
+    else if ("F21".equals(keyStrokeName))
+    {
+      return VirtualKey.F21;
+    }
+    else if ("F22".equals(keyStrokeName))
+    {
+      return VirtualKey.F22;
+    }
+    else if ("F23".equals(keyStrokeName))
+    {
+      return VirtualKey.F23;
+    }
+    else if ("F24".equals(keyStrokeName))
+    {
+      return VirtualKey.F24;
+    }
+    else if ("Print".equals(keyStrokeName))
+    {
+      return VirtualKey.PRINTSCREEN;
+    }
+    else if ("Scroll_Lock".equals(keyStrokeName))
+    {
+      return VirtualKey.SCROLL_LOCK;
+    }
+    else if ("Insert".equals(keyStrokeName))
+    {
+      return VirtualKey.INSERT;
+    }
+    else if ("Delete".equals(keyStrokeName))
+    {
+      return VirtualKey.DELETE;
+    }
+    else if ("Home".equals(keyStrokeName))
+    {
+      return VirtualKey.HOME;
+    }
+    else if ("End".equals(keyStrokeName))
+    {
+      return VirtualKey.END;
+    }
+    else if ("Page_Up".equals(keyStrokeName))
+    {
+      return VirtualKey.PAGE_UP;
+    }
+    else if ("Page_Down".equals(keyStrokeName))
+    {
+      return VirtualKey.PAGE_DOWN;
+    }
+    else if ("Left".equals(keyStrokeName))
+    {
+      return VirtualKey.LEFT;
+    }
+    else if ("Up".equals(keyStrokeName))
+    {
+      return VirtualKey.UP;
+    }
+    else if ("Down".equals(keyStrokeName))
+    {
+      return VirtualKey.DOWN;
+    }
+    else if ("Right".equals(keyStrokeName))
+    {
+      return VirtualKey.RIGHT;
+    }
+    else if ("Num_Lock".equals(keyStrokeName))
+    {
+      return VirtualKey.NUM_LOCK;
+    }
+    else if ("KP_Divide".equals(keyStrokeName))
+    {
+      return VirtualKey.SLASH;
+    }
+    else if ("KP_Multiply".equals(keyStrokeName))
+    {
+      return VirtualKey.ASTERISK;
+    }
+    else if ("KP_Subtract".equals(keyStrokeName))
+    {
+      return VirtualKey.MINUS;
+    }
+    else if ("KP_Add".equals(keyStrokeName))
+    {
+      return VirtualKey.PLUS;
+    }
+    else if ("KP_Enter".equals(keyStrokeName))
+    {
+      return VirtualKey.ENTER;
+    }
+    else if ("KP_Decimal".equals(keyStrokeName))
+    {
+      return VirtualKey.DECIMAL;
+    }
+    else if ("KP_Separator".equals(keyStrokeName))
+    {
+      return VirtualKey.SEPARATOR;
+    }
+    else if ("KP_Delete".equals(keyStrokeName))
+    {
+      return VirtualKey.DELETE;
+    }
+    else if ("KP_0".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_0;
+    }
+    else if ("KP_Insert".equals(keyStrokeName))
+    {
+      return VirtualKey.INSERT;
+    }
+    else if ("KP_1".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_1;
+    }
+    else if ("KP_End".equals(keyStrokeName))
+    {
+      return VirtualKey.END;
+    }
+    else if ("KP_2".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_2;
+    }
+    else if ("KP_Down".equals(keyStrokeName))
+    {
+      return VirtualKey.KP_DOWN;
+    }
+    else if ("KP_3".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_3;
+    }
+    else if ("KP_Next".equals(keyStrokeName))
+    {
+      return VirtualKey.PAGE_DOWN;
+    }
+    else if ("KP_4".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_4;
+    }
+    else if ("KP_Left".equals(keyStrokeName))
+    {
+      return VirtualKey.KP_LEFT;
+    }
+    else if ("KP_5".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_5;
+    }
+    else if ("KP_Begin".equals(keyStrokeName))
+    {
+      return VirtualKey.BEGIN;
+    }
+    else if ("KP_6".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_6;
+    }
+    else if ("KP_Right".equals(keyStrokeName))
+    {
+      return VirtualKey.KP_RIGHT;
+    }
+    else if ("KP_7".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_7;
+    }
+    else if ("KP_Home".equals(keyStrokeName))
+    {
+      return VirtualKey.HOME;
+    }
+    else if ("KP_8".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_8;
+    }
+    else if ("KP_Up".equals(keyStrokeName))
+    {
+      return VirtualKey.KP_UP;
+    }
+    else if ("KP_9".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMPAD_9;
+    }
+    else if ("KP_Prior".equals(keyStrokeName))
+    {
+      return VirtualKey.PAGE_UP;
+    }
+    else if ("Caps_Lock".equals(keyStrokeName))
+    {
+      return VirtualKey.CAPS_LOCK;
+    }
+    else if ("exclam".equals(keyStrokeName))
+    {
+      return VirtualKey.EXCLAMATION_MARK;
+    }
+    else if ("exclamdown".equals(keyStrokeName))
+    {
+      return VirtualKey.INVERTED_EXCLAMATION_MARK;
+    }
+    else if ("quotedbl".equals(keyStrokeName))
+    {
+      return VirtualKey.QUOTEDBL;
+    }
+    else if ("slash".equals(keyStrokeName))
+    {
+      return VirtualKey.SLASH;
+    }
+    else if ("backslash".equals(keyStrokeName))
+    {
+      return VirtualKey.BACK_SLASH;
+    }
+    else if ("dead_acute".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_ACUTE;
+    }
+    else if ("dead_diaresis".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_DIAERESIS;
+    }
+    else if ("dead_abovering".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_ABOVERING;
+    }
+    else if ("plus".equals(keyStrokeName))
+    {
+      return VirtualKey.PLUS;
+    }
+    else if ("asterisk".equals(keyStrokeName))
+    {
+      return VirtualKey.ASTERISK;
+    }
+    else if ("dead_tilde".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_TILDE;
+    }
+    else if ("dead_doubleacute".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_DOUBLEACUTE;
+    }
+    else if ("dead_caron".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_CARON;
+    }
+    else if ("dead_circumflex".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_CIRCUMFLEX;
+    }
+    else if ("comma".equals(keyStrokeName))
+    {
+      return VirtualKey.COMMA;
+    }
+    else if ("semicolon".equals(keyStrokeName))
+    {
+      return VirtualKey.SEMICOLON;
+    }
+    else if ("multiply".equals(keyStrokeName))
+    {
+      return VirtualKey.MULTIPLY;
+    }
+    else if ("period".equals(keyStrokeName))
+    {
+      return VirtualKey.PERIOD;
+    }
+    else if ("colon".equals(keyStrokeName))
+    {
+      return VirtualKey.COLON;
+    }
+    else if ("dead_breve".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_BREVE;
+    }
+    else if ("division".equals(keyStrokeName))
+    {
+      return VirtualKey.DIVIDE;
+    }
+    else if ("minus".equals(keyStrokeName))
+    {
+      return VirtualKey.MINUS;
+    }
+    else if ("underscore".equals(keyStrokeName))
+    {
+      return VirtualKey.UNDERSCORE;
+    }
+    else if ("dead_abovedot".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_ABOVEDOT;
+    }
+    else if ("bracketleft".equals(keyStrokeName))
+    {
+      return VirtualKey.OPEN_BRACKET;
+    }
+    else if ("bracketright".equals(keyStrokeName))
+    {
+      return VirtualKey.CLOSE_BRACKET;
+    }
+    else if ("grave".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_GRAVE;
+    }
+    else if ("equal".equals(keyStrokeName))
+    {
+      return VirtualKey.EQUALS;
+    }
+    else if ("dead_macron".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_MACRON;
+    }
+    else if ("dead_ogonek".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_OGONEK;
+    }
+    else if ("dead_cedilla".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_CEDILLA;
+    }
+    else if ("ampersand".equals(keyStrokeName))
+    {
+      return VirtualKey.AMPERSAND;
+    }
+    else if ("parenleft".equals(keyStrokeName))
+    {
+      return VirtualKey.LEFT_PARENTHESIS;
+    }
+    else if ("parenright".equals(keyStrokeName))
+    {
+      return VirtualKey.RIGHT_PARENTHESIS;
+    }
+    else if ("braceleft".equals(keyStrokeName))
+    {
+      return VirtualKey.BRACELEFT;
+    }
+    else if ("braceright".equals(keyStrokeName))
+    {
+      return VirtualKey.BRACERIGHT;
+    }
+    else if ("at".equals(keyStrokeName))
+    {
+      return VirtualKey.AT;
+    }
+    else if ("dollar".equals(keyStrokeName))
+    {
+      return VirtualKey.DOLLAR;
+    }
+    else if ("EuroSign".equals(keyStrokeName))
+    {
+      return VirtualKey.EURO_SIGN;
+    }
+    else if ("Begin".equals(keyStrokeName))
+    {
+      return VirtualKey.BEGIN;
+    }
+    else if ("numbersign".equals(keyStrokeName))
+    {
+      return VirtualKey.NUMBER_SIGN;
+    }
+    else if ("asciicircum".equals(keyStrokeName))
+    {
+      return VirtualKey.CIRCUMFLEX;
+    }
+    else if ("Kanji".equals(keyStrokeName))
+    {
+      return VirtualKey.KANJI;
+    }
+    else if ("Katakana".equals(keyStrokeName))
+    {
+      return VirtualKey.KATAKANA;
+    }
+    else if ("Hiragana_Katakana".equals(keyStrokeName))
+    {
+      return VirtualKey.HIRAGANA;
+    }
+    else if ("Muhenkan".equals(keyStrokeName))
+    {
+      // I found this in the KeyEvent description
+      return VirtualKey.NONCONVERT;
+    }
+    else if ("kan".equals(keyStrokeName))
+    {
+      // I found this in the KeyEvent description
+      return VirtualKey.NONCONVERT;
+    }
+    else if ("Henkan_Mode".equals(keyStrokeName))
+    {
+      // I found this in the key event description
+      return VirtualKey.CONVERT;
+    }
+    else if ("voicedsound".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_VOICED_SOUND;
+    }
+    else if ("semivoicedsound".equals(keyStrokeName))
+    {
+      return VirtualKey.DEAD_SEMIVOICED_SOUND;
+    }
+    else if ("Menu".equals(keyStrokeName))
+    {
+      return VirtualKey.CONTEXT_MENU;
+    }
+    else
+    {
+      LOG.finest("unknown virtual key for key stroke " + keyStrokeName + " specified through " +
+                 "keyboard map for locale " + mLocale);
+      
+      return null;
+    }
+    
+    // for the following virtual keys no key stroke names are provided in the key maps
+    /*CANCEL(KeyEvent.VK_CANCEL),
+    CLEAR(KeyEvent.VK_CLEAR),
+    PAUSE(KeyEvent.VK_PAUSE),
+    HELP(KeyEvent.VK_HELP),
+    META(KeyEvent.VK_META),
+
+    BACK_QUOTE(KeyEvent.VK_BACK_QUOTE),
+    QUOTE(KeyEvent.VK_QUOTE),
+
+    DEAD_IOTA(KeyEvent.VK_DEAD_IOTA),
+
+    FINAL(KeyEvent.VK_FINAL),
+    CONVERT(KeyEvent.VK_CONVERT),
+    NONCONVERT(KeyEvent.VK_NONCONVERT),
+    ACCEPT(KeyEvent.VK_ACCEPT),
+    KANA(KeyEvent.VK_KANA),
+    ALPHANUMERIC(KeyEvent.VK_ALPHANUMERIC),
+    FULL_WIDTH(KeyEvent.VK_FULL_WIDTH),
+    HALF_WIDTH(KeyEvent.VK_HALF_WIDTH),
+    ROMAN_CHARACTERS(KeyEvent.VK_ROMAN_CHARACTERS),
+    ALL_CANDIDATES(KeyEvent.VK_ALL_CANDIDATES),
+    PREVIOUS_CANDIDATE(KeyEvent.VK_PREVIOUS_CANDIDATE),
+    CODE_INPUT(KeyEvent.VK_CODE_INPUT),
+    JAPANESE_KATAKANA(KeyEvent.VK_JAPANESE_KATAKANA),
+    JAPANESE_HIRAGANA(KeyEvent.VK_JAPANESE_HIRAGANA),
+    JAPANESE_ROMAN(KeyEvent.VK_JAPANESE_ROMAN),
+    KANA_LOCK(KeyEvent.VK_KANA_LOCK),
+    INPUT_METHOD_ON_OFF(KeyEvent.VK_INPUT_METHOD_ON_OFF),
+
+    CUT(KeyEvent.VK_CUT),
+    COPY(KeyEvent.VK_COPY),
+    PASTE(KeyEvent.VK_PASTE),
+    UNDO(KeyEvent.VK_UNDO),
+    AGAIN(KeyEvent.VK_AGAIN),
+    FIND(KeyEvent.VK_FIND),
+    PROPS(KeyEvent.VK_PROPS),
+    STOP(KeyEvent.VK_STOP),
+    COMPOSE(KeyEvent.VK_COMPOSE),*/
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyStrokeName
+   * @param shift
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  private char determineCharacter(String keyStrokeName, boolean getUpper)
+  {
+    if ("Shift_R".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Shift_L".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Alt_R".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Mode_switch".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("ISO_Level3_Shift".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Alt_L".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Control_R".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Control_L".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Menu".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("1".equals(keyStrokeName))
+    {
+      return '1';
+    }
+    else if ("2".equals(keyStrokeName))
+    {
+      return '2';
+    }
+    else if ("3".equals(keyStrokeName))
+    {
+      return '3';
+    }
+    else if ("4".equals(keyStrokeName))
+    {
+      return '4';
+    }
+    else if ("5".equals(keyStrokeName))
+    {
+      return '5';
+    }
+    else if ("6".equals(keyStrokeName))
+    {
+      return '6';
+    }
+    else if ("7".equals(keyStrokeName))
+    {
+      return '7';
+    }
+    else if ("8".equals(keyStrokeName))
+    {
+      return '8';
+    }
+    else if ("9".equals(keyStrokeName))
+    {
+      return '9';
+    }
+    else if ("0".equals(keyStrokeName))
+    {
+      return '0';
+    }
+    else if ("BackSpace".equals(keyStrokeName))
+    {
+      return '\b';
+    }
+    else if ("Tab".equals(keyStrokeName))
+    {
+      return '\t';
+    }
+    else if ("ISO_Left_Tab".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("q".equals(keyStrokeName))
+    {
+      return getUpper ? 'Q' : 'q';
+    }
+    else if ("w".equals(keyStrokeName))
+    {
+      return getUpper ? 'W' : 'w';
+    }
+    else if ("e".equals(keyStrokeName))
+    {
+      return getUpper ? 'E' : 'e';
+    }
+    else if ("r".equals(keyStrokeName))
+    {
+      return getUpper ? 'R' : 'r';
+    }
+    else if ("t".equals(keyStrokeName))
+    {
+      return getUpper ? 'T' : 't';
+    }
+    else if ("y".equals(keyStrokeName))
+    {
+      return getUpper ? 'Y' : 'y';
+    }
+    else if ("u".equals(keyStrokeName))
+    {
+      return getUpper ? 'U' : 'u';
+    }
+    else if ("i".equals(keyStrokeName))
+    {
+      return getUpper ? 'I' : 'i';
+    }
+    else if ("o".equals(keyStrokeName))
+    {
+      return getUpper ? 'O' : 'o';
+    }
+    else if ("p".equals(keyStrokeName))
+    {
+      return getUpper ? 'P' : 'p';
+    }
+    else if ("a".equals(keyStrokeName))
+    {
+      return getUpper ? 'A' : 'a';
+    }
+    else if ("s".equals(keyStrokeName))
+    {
+      return getUpper ? 'S' : 's';
+    }
+    else if ("d".equals(keyStrokeName))
+    {
+      return getUpper ? 'D' : 'd';
+    }
+    else if ("f".equals(keyStrokeName))
+    {
+      return getUpper ? 'F' : 'f';
+    }
+    else if ("g".equals(keyStrokeName))
+    {
+      return getUpper ? 'G' : 'g';
+    }
+    else if ("h".equals(keyStrokeName))
+    {
+      return getUpper ? 'H' : 'h';
+    }
+    else if ("j".equals(keyStrokeName))
+    {
+      return getUpper ? 'J' : 'j';
+    }
+    else if ("k".equals(keyStrokeName))
+    {
+      return getUpper ? 'K' : 'k';
+    }
+    else if ("l".equals(keyStrokeName))
+    {
+      return getUpper ? 'L' : 'l';
+    }
+    else if ("Return".equals(keyStrokeName))
+    {
+      return '\n';
+    }
+    else if ("z".equals(keyStrokeName))
+    {
+      return getUpper ? 'Z' : 'z';
+    }
+    else if ("x".equals(keyStrokeName))
+    {
+      return getUpper ? 'X' : 'x';
+    }
+    else if ("c".equals(keyStrokeName))
+    {
+      return getUpper ? 'C' : 'c';
+    }
+    else if ("v".equals(keyStrokeName))
+    {
+      return getUpper ? 'V' : 'v';
+    }
+    else if ("b".equals(keyStrokeName))
+    {
+      return getUpper ? 'B' : 'b';
+    }
+    else if ("n".equals(keyStrokeName))
+    {
+      return getUpper ? 'N' : 'n';
+    }
+    else if ("m".equals(keyStrokeName))
+    {
+      return getUpper ? 'M' : 'm';
+    }
+    else if ("space".equals(keyStrokeName))
+    {
+      return ' ';
+    }
+    else if ("less".equals(keyStrokeName))
+    {
+      return '<';
+    }
+    else if ("greater".equals(keyStrokeName))
+    {
+      return '>';
+    }
+    else if ("bar".equals(keyStrokeName))
+    {
+      return '|';
+    }
+    else if ("brokenbar".equals(keyStrokeName))
+    {
+      return '¦';
+    }
+    else if ("Escape".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F1".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F2".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F3".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F4".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F5".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F6".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F7".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F8".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F9".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F10".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F11".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("SunF36".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F12".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("SunF37".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Print".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Sys_Req".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Execute".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F22".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Scroll_Lock".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F23".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Insert".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Delete".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Home".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("End".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Page_Up".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Page_Down".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Left".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Up".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Down".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Right".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Num_Lock".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_Divide".equals(keyStrokeName))
+    {
+      return '/';
+    }
+    else if ("KP_Multiply".equals(keyStrokeName))
+    {
+      return '*';
+    }
+    else if ("KP_Subtract".equals(keyStrokeName))
+    {
+      return '-';
+    }
+    else if ("KP_Add".equals(keyStrokeName))
+    {
+      return '+';
+    }
+    else if ("KP_Enter".equals(keyStrokeName))
+    {
+      return '\n';
+    }
+    else if ("KP_Decimal".equals(keyStrokeName))
+    {
+      return ',';
+    }
+    else if ("KP_Separator".equals(keyStrokeName))
+    {
+      return ',';
+    }
+    else if ("KP_Delete".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_0".equals(keyStrokeName))
+    {
+      return '0';
+    }
+    else if ("KP_Insert".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_1".equals(keyStrokeName))
+    {
+      return '1';
+    }
+    else if ("KP_End".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_2".equals(keyStrokeName))
+    {
+      return '2';
+    }
+    else if ("KP_Down".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_3".equals(keyStrokeName))
+    {
+      return '3';
+    }
+    else if ("KP_Next".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_4".equals(keyStrokeName))
+    {
+      return '4';
+    }
+    else if ("KP_Left".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_5".equals(keyStrokeName))
+    {
+      return '5';
+    }
+    else if ("KP_Begin".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_6".equals(keyStrokeName))
+    {
+      return '6';
+    }
+    else if ("KP_Right".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_7".equals(keyStrokeName))
+    {
+      return '7';
+    }
+    else if ("KP_Home".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_8".equals(keyStrokeName))
+    {
+      return '8';
+    }
+    else if ("KP_Up".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("KP_9".equals(keyStrokeName))
+    {
+      return '9';
+    }
+    else if ("KP_Prior".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Caps_Lock".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Multi_key".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("exclam".equals(keyStrokeName))
+    {
+      return '!';
+    }
+    else if ("onesuperior".equals(keyStrokeName))
+    {
+      return '¹';
+    }
+    else if ("exclamdown".equals(keyStrokeName))
+    {
+      return '¡';
+    }
+    else if ("quotedbl".equals(keyStrokeName))
+    {
+      return '"';
+    }
+    else if ("twosuperior".equals(keyStrokeName))
+    {
+      return '²';
+    }
+    else if ("oneeighth".equals(keyStrokeName))
+    {
+      return '⅛';
+    }
+    else if ("section".equals(keyStrokeName))
+    {
+      return '§';
+    }
+    else if ("threesuperior".equals(keyStrokeName))
+    {
+      return '³';
+    }
+    else if ("sterling".equals(keyStrokeName))
+    {
+      return '£';
+    }
+    else if ("dollar".equals(keyStrokeName))
+    {
+      return '$';
+    }
+    else if ("onequarter".equals(keyStrokeName))
+    {
+      return '¼';
+    }
+    else if ("currency".equals(keyStrokeName))
+    {
+      return '¤';
+    }
+    else if ("percent".equals(keyStrokeName))
+    {
+      return '%';
+    }
+    else if ("onehalf".equals(keyStrokeName))
+    {
+      return '½';
+    }
+    else if ("threeeighths".equals(keyStrokeName))
+    {
+      return '⅜';
+    }
+    else if ("ampersand".equals(keyStrokeName))
+    {
+      return '&';
+    }
+    else if ("threequarters".equals(keyStrokeName))
+    {
+      return '¾';
+    }
+    else if ("fiveeighths".equals(keyStrokeName))
+    {
+      return '⅝';
+    }
+    else if ("slash".equals(keyStrokeName))
+    {
+      return '/';
+    }
+    else if ("braceleft".equals(keyStrokeName))
+    {
+      return '{';
+    }
+    else if ("seveneighths".equals(keyStrokeName))
+    {
+      return '⅞';
+    }
+    else if ("parenleft".equals(keyStrokeName))
+    {
+      return '(';
+    }
+    else if ("bracketleft".equals(keyStrokeName))
+    {
+      return '[';
+    }
+    else if ("trademark".equals(keyStrokeName))
+    {
+      return '™';
+    }
+    else if ("parenright".equals(keyStrokeName))
+    {
+      return ')';
+    }
+    else if ("bracketright".equals(keyStrokeName))
+    {
+      return ']';
+    }
+    else if ("plusminus".equals(keyStrokeName))
+    {
+      return '±';
+    }
+    else if ("equal".equals(keyStrokeName))
+    {
+      return '=';
+    }
+    else if ("braceright".equals(keyStrokeName))
+    {
+      return '}';
+    }
+    else if ("ssharp".equals(keyStrokeName))
+    {
+      return 'ß';
+    }
+    else if ("question".equals(keyStrokeName))
+    {
+      return '?';
+    }
+    else if ("backslash".equals(keyStrokeName))
+    {
+      return '\\';
+    }
+    else if ("questiondown".equals(keyStrokeName))
+    {
+      return '¿';
+    }
+    else if ("acute".equals(keyStrokeName))
+    {
+      return '´';
+    }
+    else if ("dead_acute".equals(keyStrokeName))
+    {
+      return 0x0301;
+    }
+    else if ("grave".equals(keyStrokeName))
+    {
+      return '`';
+    }
+    else if ("dead_grave".equals(keyStrokeName))
+    {
+      return 0x0300;
+    }
+    else if ("dead_cedilla".equals(keyStrokeName))
+    {
+      return 0x0327;
+    }
+    else if ("dead_ogonek".equals(keyStrokeName))
+    {
+      return 0x0328;
+    }
+    else if ("at".equals(keyStrokeName))
+    {
+      return '@';
+    }
+    else if ("Greek_OMEGA".equals(keyStrokeName))
+    {
+      return 'Ω';
+    }
+    else if ("EuroSign".equals(keyStrokeName))
+    {
+      return '€';
+    }
+    else if ("paragraph".equals(keyStrokeName))
+    {
+      return 0x2029;
+    }
+    else if ("registered".equals(keyStrokeName))
+    {
+      return '®';
+    }
+    else if ("tslash".equals(keyStrokeName))
+    {
+      return 'ŧ';
+    }
+    else if ("Tslash".equals(keyStrokeName))
+    {
+      return 'Ŧ';
+    }
+    else if ("z".equals(keyStrokeName))
+    {
+      return getUpper ? 'Z' : 'z';
+    }
+    else if ("leftarrow".equals(keyStrokeName))
+    {
+      return '←';
+    }
+    else if ("yen".equals(keyStrokeName))
+    {
+      return '¥';
+    }
+    else if ("downarrow".equals(keyStrokeName))
+    {
+      return '↓';
+    }
+    else if ("uparrow".equals(keyStrokeName))
+    {
+      return '↑';
+    }
+    else if ("rightarrow".equals(keyStrokeName))
+    {
+      return '→';
+    }
+    else if ("idotless".equals(keyStrokeName))
+    {
+      return 'ı';
+    }
+    else if ("oslash".equals(keyStrokeName))
+    {
+      return 'ø';
+    }
+    else if ("Ooblique".equals(keyStrokeName))
+    {
+      return 'Ø';
+    }
+    else if ("thorn".equals(keyStrokeName))
+    {
+      return 'þ';
+    }
+    else if ("THORN".equals(keyStrokeName))
+    {
+      return 'Þ';
+    }
+    else if ("udiaeresis".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ü' : 'ü';
+    }
+    else if ("Udiaeresis".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ü' : 'ü';
+    }
+    else if ("dead_diaeresis".equals(keyStrokeName))
+    {
+      return 0x0308;
+    }
+    else if ("dead_abovering".equals(keyStrokeName))
+    {
+      return 0x030A;
+    }
+    else if ("plus".equals(keyStrokeName))
+    {
+      return '+';
+    }
+    else if ("asterisk".equals(keyStrokeName))
+    {
+      return '*';
+    }
+    else if ("asciitilde".equals(keyStrokeName))
+    {
+      return '~';
+    }
+    else if ("dead_tilde".equals(keyStrokeName))
+    {
+      return 0x0303;
+    }
+    else if ("dead_macron".equals(keyStrokeName))
+    {
+      return 0x0304;
+    }
+    else if ("ae".equals(keyStrokeName))
+    {
+      return 'æ';
+    }
+    else if ("AE".equals(keyStrokeName))
+    {
+      return 'Æ';
+    }
+    else if ("eth".equals(keyStrokeName))
+    {
+      return 'ð';
+    }
+    else if ("ETH".equals(keyStrokeName))
+    {
+      return 'Ð';
+    }
+    else if ("dstroke".equals(keyStrokeName))
+    {
+      return getUpper ? 'Đ' : 'đ';
+    }
+    else if ("ordfeminine".equals(keyStrokeName))
+    {
+      return 'ª';
+    }
+    else if ("eng".equals(keyStrokeName))
+    {
+      return 'ŋ';
+    }
+    else if ("ENG".equals(keyStrokeName))
+    {
+      return 'Ŋ';
+    }
+    else if ("hstroke".equals(keyStrokeName))
+    {
+      return 'ħ';
+    }
+    else if ("Hstroke".equals(keyStrokeName))
+    {
+      return 'Ħ';
+    }
+    else if ("kra".equals(keyStrokeName))
+    {
+      return 'ĸ';
+    }
+    else if ("odiaeresis".equals(keyStrokeName))
+    {
+      return 'ö';
+    }
+    else if ("Odiaeresis".equals(keyStrokeName))
+    {
+      return 'Ö';
+    }
+    else if ("dead_doubleacute".equals(keyStrokeName))
+    {
+      return 0x030B;
+    }
+    else if ("adiaeresis".equals(keyStrokeName))
+    {
+      return 'ä';
+    }
+    else if ("Adiaeresis".equals(keyStrokeName))
+    {
+      return 'Ä';
+    }
+    else if ("dead_caron".equals(keyStrokeName))
+    {
+      return 0x030C;
+    }
+    else if ("asciicircum".equals(keyStrokeName))
+    {
+      return '^';
+    }
+    else if ("dead_circumflex".equals(keyStrokeName))
+    {
+      return 0x0302;
+    }
+    else if ("degree".equals(keyStrokeName))
+    {
+      return '°';
+    }
+    else if ("notsign".equals(keyStrokeName))
+    {
+      return '¬';
+    }
+    else if ("numbersign".equals(keyStrokeName))
+    {
+      return '#';
+    }
+    else if ("apostrophe".equals(keyStrokeName))
+    {
+      return '\'';
+    }
+    else if ("dead_breve".equals(keyStrokeName))
+    {
+      return 0x0306;
+    }
+    else if ("y".equals(keyStrokeName))
+    {
+      return getUpper ? 'Y' : 'y';
+    }
+    else if ("guillemotleft".equals(keyStrokeName))
+    {
+      return '»';
+    }
+    else if ("guillemotright".equals(keyStrokeName))
+    {
+      return '«';
+    }
+    else if ("cent".equals(keyStrokeName))
+    {
+      return '¢';
+    }
+    else if ("copyright".equals(keyStrokeName))
+    {
+      return '©';
+    }
+    else if ("leftdoublequotemark".equals(keyStrokeName))
+    {
+      return '„';
+    }
+    else if ("rightdoublequotemark".equals(keyStrokeName))
+    {
+      return '“';
+    }
+    else if ("mu".equals(keyStrokeName))
+    {
+      return 'µ';
+    }
+    else if ("masculine".equals(keyStrokeName))
+    {
+      return 'º';
+    }
+    else if ("comma".equals(keyStrokeName))
+    {
+      return ',';
+    }
+    else if ("semicolon".equals(keyStrokeName))
+    {
+      return ';';
+    }
+    else if ("horizconnector".equals(keyStrokeName))
+    {
+      return '·';
+    }
+    else if ("multiply".equals(keyStrokeName))
+    {
+      return '×';
+    }
+    else if ("period".equals(keyStrokeName))
+    {
+      return '.';
+    }
+    else if ("colon".equals(keyStrokeName))
+    {
+      return ':';
+    }
+    else if ("periodcentered".equals(keyStrokeName))
+    {
+      return '…';
+    }
+    else if ("division".equals(keyStrokeName))
+    {
+      return '÷';
+    }
+    else if ("minus".equals(keyStrokeName))
+    {
+      return '-';
+    }
+    else if ("underscore".equals(keyStrokeName))
+    {
+      return '_';
+    }
+    else if ("dead_belowdot".equals(keyStrokeName))
+    {
+      return 0x0323;
+    }
+    else if ("dead_abovedot".equals(keyStrokeName))
+    {
+      return 0x0307;
+    }
+    else if ("eacute".equals(keyStrokeName))
+    {
+      return getUpper ? 'É' : 'é';
+    }
+    else if ("Eacute".equals(keyStrokeName))
+    {
+      return getUpper ? 'É' : 'é';
+    }
+    else if ("egrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'È' : 'è';
+    }
+    else if ("Egrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'È' : 'è';
+    }
+    else if ("ccedilla".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ç' : 'ç';
+    }
+    else if ("Ccedilla".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ç' : 'ç';
+    }
+    else if ("agrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'À' : 'à';
+    }
+    else if ("Agrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'À' : 'à';
+    }
+    else if ("lstroke".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ł' : 'ł';
+    }
+    else if ("Lstroke".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ł' : 'ł';
+    }
+    else if ("ugrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ù' : 'ù';
+    }
+    else if ("Ugrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ù' : 'ù';
+    }
+    else if ("igrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ì' : 'ì';
+    }
+    else if ("Igrave".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ì' : 'ì';
+    }
+    else if ("ograve".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ò' : 'ò';
+    }
+    else if ("ograve".equals(keyStrokeName))
+    {
+      return getUpper ? 'Ò' : 'ò';
+    }
+    else if ("keyboard_type".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("keyboard_subtype".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("keyboard_functionkeys".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("kana_NU".equals(keyStrokeName))
+    {
+      return 'ヌ';
+    }
+    else if ("kana_FU".equals(keyStrokeName))
+    {
+      return 'フ';
+    }
+    else if ("kana_A".equals(keyStrokeName))
+    {
+      return 'ア';
+    }
+    else if ("kana_a".equals(keyStrokeName))
+    {
+      return 'ァ';
+    }
+    else if ("kana_U".equals(keyStrokeName))
+    {
+      return 'ウ';
+    }
+    else if ("kana_u".equals(keyStrokeName))
+    {
+      return 'ゥ';
+    }
+    else if ("kana_E".equals(keyStrokeName))
+    {
+      return 'エ';
+    }
+    else if ("kana_e".equals(keyStrokeName))
+    {
+      return 'ェ';
+    }
+    else if ("kana_O".equals(keyStrokeName))
+    {
+      return 'オ';
+    }
+    else if ("kana_o".equals(keyStrokeName))
+    {
+      return 'ォ';
+    }
+    else if ("kana_YA".equals(keyStrokeName))
+    {
+      return 'ヤ';
+    }
+    else if ("kana_ya".equals(keyStrokeName))
+    {
+      return 'ャ';
+    }
+    else if ("kana_YU".equals(keyStrokeName))
+    {
+      return 'ユ';
+    }
+    else if ("kana_yu".equals(keyStrokeName))
+    {
+      return 'ュ';
+    }
+    else if ("kana_YO".equals(keyStrokeName))
+    {
+      return 'ヨ';
+    }
+    else if ("kana_yo".equals(keyStrokeName))
+    {
+      return 'ョ';
+    }
+    else if ("kana_WA".equals(keyStrokeName))
+    {
+      return 'ワ';
+    }
+    else if ("kana_WO".equals(keyStrokeName))
+    {
+      return 'ヲ';
+    }
+    else if ("kana_HO".equals(keyStrokeName))
+    {
+      return 'ホ';
+    }
+    else if ("kana_HE".equals(keyStrokeName))
+    {
+      return 'ヘ';
+    }
+    else if ("kana_TA".equals(keyStrokeName))
+    {
+      return 'タ';
+    }
+    else if ("kana_TE".equals(keyStrokeName))
+    {
+      return 'テ';
+    }
+    else if ("kana_I".equals(keyStrokeName))
+    {
+      return 'イ';
+    }
+    else if ("kana_i".equals(keyStrokeName))
+    {
+      return 'ィ';
+    }
+    else if ("kana_SU".equals(keyStrokeName))
+    {
+      return 'ス';
+    }
+    else if ("kana_KA".equals(keyStrokeName))
+    {
+      return 'カ';
+    }
+    else if ("kana_N".equals(keyStrokeName))
+    {
+      return 'ン';
+    }
+    else if ("kana_NA".equals(keyStrokeName))
+    {
+      return 'ナ';
+    }
+    else if ("kana_NI".equals(keyStrokeName))
+    {
+      return 'ニ';
+    }
+    else if ("kana_RA".equals(keyStrokeName))
+    {
+      return 'ラ';
+    }
+    else if ("kana_SE".equals(keyStrokeName))
+    {
+      return 'セ';
+    }
+    else if ("voicedsound".equals(keyStrokeName))
+    {
+      return 0x3099;
+    }
+    else if ("semivoicedsound".equals(keyStrokeName))
+    {
+      return 0x309A;
+    }
+    else if ("kana_openingbracket".equals(keyStrokeName))
+    {
+      return 0x04A2;
+    }
+    else if ("kana_closingbracket".equals(keyStrokeName))
+    {
+      return 0x04A3;
+    }
+    else if ("kana_CHI".equals(keyStrokeName))
+    {
+      return 'チ';
+    }
+    else if ("kana_TO".equals(keyStrokeName))
+    {
+      return 'ト';
+    }
+    else if ("kana_SHI".equals(keyStrokeName))
+    {
+      return 'シ';
+    }
+    else if ("kana_HA".equals(keyStrokeName))
+    {
+      return 'ハ';
+    }
+    else if ("kana_KI".equals(keyStrokeName))
+    {
+      return 'キ';
+    }
+    else if ("kana_KU".equals(keyStrokeName))
+    {
+      return 'ク';
+    }
+    else if ("kana_MA".equals(keyStrokeName))
+    {
+      return 'マ';
+    }
+    else if ("kana_NO".equals(keyStrokeName))
+    {
+      return 'ノ';
+    }
+    else if ("kana_RI".equals(keyStrokeName))
+    {
+      return 'リ';
+    }
+    else if ("kana_RE".equals(keyStrokeName))
+    {
+      return 'レ';
+    }
+    else if ("kana_KE".equals(keyStrokeName))
+    {
+      return 'ケ';
+    }
+    else if ("Zenkaku_Hankaku".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Kanji".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("kana_MU".equals(keyStrokeName))
+    {
+      return 'ム';
+    }
+    else if ("kana_TSU".equals(keyStrokeName))
+    {
+      return 'ツ';
+    }
+    else if ("kana_tsu".equals(keyStrokeName))
+    {
+      return 'ッ';
+    }
+    else if ("kana_SA".equals(keyStrokeName))
+    {
+      return 'サ';
+    }
+    else if ("kana_SO".equals(keyStrokeName))
+    {
+      return 'ソ';
+    }
+    else if ("kana_HI".equals(keyStrokeName))
+    {
+      return 'ヒ';
+    }
+    else if ("kana_KO".equals(keyStrokeName))
+    {
+      return 'コ';
+    }
+    else if ("kana_MI".equals(keyStrokeName))
+    {
+      return 'ミ';
+    }
+    else if ("kana_MO".equals(keyStrokeName))
+    {
+      return 'モ';
+    }
+    else if ("kana_NE".equals(keyStrokeName))
+    {
+      return 'ネ';
+    }
+    else if ("kana_comma".equals(keyStrokeName))
+    {
+      return '､';
+    }
+    else if ("kana_RU".equals(keyStrokeName))
+    {
+      return 'ル';
+    }
+    else if ("kana_fullstop".equals(keyStrokeName))
+    {
+      return '｡';
+    }
+    else if ("kana_ME".equals(keyStrokeName))
+    {
+      return 'メ';
+    }
+    else if ("kana_conjunctive".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Henkan_Mode".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Hiragana_Katakana".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Katakana".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Romaji".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Muhenkan".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Eisu_toggle".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Eisu_toggle".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("F13".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Hangul".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else if ("Hangul_Hanja".equals(keyStrokeName))
+    {
+      return Character.UNASSIGNED;
+    }
+    else
+    {
+      LOG.severe("unknown key stroke name " + keyStrokeName + " specified through keyboard map " +
+                 "for locale " + mLocale);
+      
+//      if (shift)
+//      {
+//        System.err.println("    else if (\"" + keyStrokeName + "\".equals(keyStrokeName))");
+//        System.err.println("    {");
+//        System.err.println("      return shift ? '" + Character.toUpperCase(keyStrokeName.charAt(0)) +
+//                           "' : '" + Character.toLowerCase(keyStrokeName.charAt(0)) + "';");
+//        System.err.println("    }");
+//      }
+//      else
+//      {
+//        System.err.println("    else if (\"" + keyStrokeName + "\".equals(keyStrokeName))");
+//        System.err.println("    {");
+//        System.err.println("      return '" + keyStrokeName + "';");
+//        System.err.println("    }");
+//      }
+//      
+//      return 0x0;
+      throw new IllegalArgumentException("no keyboard map available for locale " + mLocale);
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * this is a former implementation
+   *
+   * @param keyId
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  /*private VirtualKey[] mapKeyIdToVirtualKeys(int     keyId,
+                                             String  keyStrokeName)
+  {
+    
+    Set<String> names = null;
+    
+    for (int i = 0; i < mKeyIds.size(); i++)
+    {
+      if (((Integer) mKeyIds.get(i)[0]) == keyId)
+      {
+        names = (Set<String>) mKeyIds.get(i)[1];
+        break;
+      }
+    }
+    
+    if (names == null)
+    {
+      names = new HashSet<String>();
+      boolean added = false;
+      
+      for (int i = 0; i < mKeyIds.size(); i++)
+      {
+        if (((Integer) mKeyIds.get(i)[0]) > keyId)
+        {
+          mKeyIds.add(i, new Object[] { keyId, names });
+          added = true;
+          break;
+        }
+      }
+      
+      if (!added)
+      {
+        mKeyIds.add(new Object[] { keyId, names });
+      }
+    }
+    
+    names.add(keyStrokeName);
+    
+    
+    switch(keyId)
+    {
+      case 0x36:
+      case 0x2a:
+        return new VirtualKey[] { VirtualKey.SHIFT };
+      case 0xb8:
+        return new VirtualKey[] { VirtualKey.ALT_GRAPH };
+      case 0x38:
+        return new VirtualKey[] { VirtualKey.ALT };
+      case 0x9d:
+      case 0x1d:
+        return new VirtualKey[] { VirtualKey.CONTROL };
+      case 0xdd:
+        return new VirtualKey[] { VirtualKey.WINDOWS };
+      case 0x2:
+        return new VirtualKey[] { VirtualKey.DIGIT_1 };
+      case 0x3:
+        return new VirtualKey[] { VirtualKey.DIGIT_2 };
+      case 0x4:
+        return new VirtualKey[] { VirtualKey.DIGIT_3 };
+      case 0x5:
+        return new VirtualKey[] { VirtualKey.DIGIT_4 };
+      case 0x6:
+        return new VirtualKey[] { VirtualKey.DIGIT_5 };
+      case 0x7:
+        return new VirtualKey[] { VirtualKey.DIGIT_6 };
+      case 0x8:
+        return new VirtualKey[] { VirtualKey.DIGIT_7 };
+      case 0x9:
+        return new VirtualKey[] { VirtualKey.DIGIT_8 };
+      case 0xa:
+        return new VirtualKey[] { VirtualKey.DIGIT_9 };
+      case 0xb:
+        return new VirtualKey[] { VirtualKey.DIGIT_0 };
+      case 0xe:
+        return new VirtualKey[] { VirtualKey.BACK_SPACE };
+      case 0xf:
+        return new VirtualKey[] { VirtualKey.TAB };
+      case 0x10:
+        return new VirtualKey[] { VirtualKey.LETTER_Q };
+      case 0x11:
+        return new VirtualKey[] { VirtualKey.LETTER_W };
+      case 0x12:
+        return new VirtualKey[] { VirtualKey.LETTER_E };
+      case 0x13:
+        return new VirtualKey[] { VirtualKey.LETTER_R };
+      case 0x14:
+        return new VirtualKey[] { VirtualKey.LETTER_T };
+      case 0x15:
+        return new VirtualKey[] { VirtualKey.LETTER_Y };
+      case 0x16:
+        return new VirtualKey[] { VirtualKey.LETTER_U };
+      case 0x17:
+        return new VirtualKey[] { VirtualKey.LETTER_I };
+      case 0x18:
+        return new VirtualKey[] { VirtualKey.LETTER_O };
+      case 0x19:
+        return new VirtualKey[] { VirtualKey.LETTER_P };
+      case 0x1e:
+        return new VirtualKey[] { VirtualKey.LETTER_A };
+      case 0x1f:
+        return new VirtualKey[] { VirtualKey.LETTER_S };
+      case 0x20:
+        return new VirtualKey[] { VirtualKey.LETTER_D };
+      case 0x21:
+        return new VirtualKey[] { VirtualKey.LETTER_F };
+      case 0x22:
+        return new VirtualKey[] { VirtualKey.LETTER_G };
+      case 0x23:
+        return new VirtualKey[] { VirtualKey.LETTER_H };
+      case 0x24:
+        return new VirtualKey[] { VirtualKey.LETTER_J };
+      case 0x25:
+        return new VirtualKey[] { VirtualKey.LETTER_K };
+      case 0x26:
+        return new VirtualKey[] { VirtualKey.LETTER_L };
+      case 0x1c:
+        return new VirtualKey[] { VirtualKey.ENTER };
+      case 0x2c:
+        return new VirtualKey[] { VirtualKey.LETTER_Z };
+      case 0x2d:
+        return new VirtualKey[] { VirtualKey.LETTER_X };
+      case 0x2e:
+        return new VirtualKey[] { VirtualKey.LETTER_C };
+      case 0x2f:
+        return new VirtualKey[] { VirtualKey.LETTER_V };
+      case 0x30:
+        return new VirtualKey[] { VirtualKey.LETTER_B };
+      case 0x31:
+        return new VirtualKey[] { VirtualKey.LETTER_N };
+      case 0x32:
+        return new VirtualKey[] { VirtualKey.LETTER_M };
+      case 0x39:
+        return new VirtualKey[] { VirtualKey.SPACE };
+      case 0x56:
+        return new VirtualKey[] { VirtualKey.LESS };
+      case 0x1:
+        return new VirtualKey[] { VirtualKey.ESCAPE };
+      case 0x3b:
+        return new VirtualKey[] { VirtualKey.F1 };
+      case 0x3c:
+        return new VirtualKey[] { VirtualKey.F2 };
+      case 0x3d:
+        return new VirtualKey[] { VirtualKey.F3 };
+      case 0x3e:
+        return new VirtualKey[] { VirtualKey.F4 };
+      case 0x3f:
+        return new VirtualKey[] { VirtualKey.F5 };
+      case 0x40:
+        return new VirtualKey[] { VirtualKey.F6 };
+      case 0x41:
+        return new VirtualKey[] { VirtualKey.F7 };
+      case 0x42:
+        return new VirtualKey[] { VirtualKey.F8 };
+      case 0x43:
+        return new VirtualKey[] { VirtualKey.F9 };
+      case 0x44:
+        return new VirtualKey[] { VirtualKey.F10 };
+      case 0x57:
+        return new VirtualKey[] { VirtualKey.F11 };
+      case 0x58:
+        return new VirtualKey[] { VirtualKey.F12 };
+      case 0xb7:
+        return new VirtualKey[] { VirtualKey.PRINTSCREEN };
+      case 0x46:
+        return new VirtualKey[] { VirtualKey.SCROLL_LOCK };
+      case 0xd2:
+        return new VirtualKey[] { VirtualKey.INSERT };
+      case 0xd3:
+        return new VirtualKey[] { VirtualKey.DELETE };
+      case 0xc7:
+        return new VirtualKey[] { VirtualKey.HOME };
+      case 0xcf:
+        return new VirtualKey[] { VirtualKey.END };
+      case 0xc9:
+        return new VirtualKey[] { VirtualKey.PAGE_UP };
+      case 0xd1:
+        return new VirtualKey[] { VirtualKey.PAGE_DOWN };
+      case 0xcb:
+        return new VirtualKey[] { VirtualKey.LEFT };
+      case 0xc8:
+        return new VirtualKey[] { VirtualKey.UP };
+      case 0xd0:
+        return new VirtualKey[] { VirtualKey.DOWN };
+      case 0xcd:
+        return new VirtualKey[] { VirtualKey.RIGHT };
+      case 0x45:
+        return new VirtualKey[] { VirtualKey.NUM_LOCK };
+      case 0xb5:
+        return new VirtualKey[] { VirtualKey.DIVIDE };
+      case 0x37:
+        return new VirtualKey[] { VirtualKey.MULTIPLY };
+      case 0x4a:
+        return new VirtualKey[] { VirtualKey.SUBTRACT };
+      case 0x4e:
+        return new VirtualKey[] { VirtualKey.ADD };
+      case 0x9c:
+        return new VirtualKey[] { VirtualKey.ENTER };
+      case 0x53:
+        return new VirtualKey[] { VirtualKey.DECIMAL, VirtualKey.DELETE };
+      case 0x52:
+        return new VirtualKey[] { VirtualKey.NUMPAD_0, VirtualKey.INSERT };
+      case 0x4f:
+        return new VirtualKey[] { VirtualKey.NUMPAD_1, VirtualKey.END };
+      case 0x50:
+        return new VirtualKey[] { VirtualKey.NUMPAD_2, VirtualKey.KP_DOWN };
+      case 0x51:
+        return new VirtualKey[] { VirtualKey.NUMPAD_3, VirtualKey.PAGE_UP };
+      case 0x4b:
+        return new VirtualKey[] { VirtualKey.NUMPAD_4, VirtualKey.KP_LEFT };
+      case 0x4c:
+        return new VirtualKey[] { VirtualKey.NUMPAD_5, VirtualKey.BEGIN };
+      case 0x4d:
+        return new VirtualKey[] { VirtualKey.NUMPAD_6, VirtualKey.KP_RIGHT };
+      case 0x47:
+        return new VirtualKey[] { VirtualKey.NUMPAD_7, VirtualKey.HOME };
+      case 0x48:
+        return new VirtualKey[] { VirtualKey.NUMPAD_8, VirtualKey.KP_UP };
+      case 0x49:
+        return new VirtualKey[] { VirtualKey.NUMPAD_9, VirtualKey.PAGE_DOWN };
+      case 0x0:
+        return new VirtualKey[] { VirtualKey.CAPS_LOCK };
+      case 0xc:
+        return new VirtualKey[] { VirtualKey.MINUS, VirtualKey.UNDERSCORE };
+      case 0xd:
+        return new VirtualKey[] { VirtualKey.EQUALS, VirtualKey.PLUS };
+      case 0x1a:
+        return new VirtualKey[] { VirtualKey.OPEN_BRACKET, VirtualKey.BRACELEFT };
+      case 0x1b:
+        return new VirtualKey[] { VirtualKey.CLOSE_BRACKET, VirtualKey.BRACERIGHT };
+      case 0x27:
+        return new VirtualKey[] { VirtualKey.SEMICOLON, VirtualKey.COLON };
+/*      case 0x28:
+        return new VirtualKey[] { VirtualKey.APOSTROPHE, VirtualKey.QUOTEDBL };
+      case 0x29:
+        return new VirtualKey[] { VirtualKey.DEAD_GRAVE, VirtualKey.DEAD_TILDE };
+      case 0x2b:
+        return new VirtualKey[] { VirtualKey.BACK_SLASH, VirtualKey.BAR };
+      case 0x33:
+        return new VirtualKey[] { VirtualKey.COMMA, VirtualKey.LESS };
+      case 0x34:
+        return new VirtualKey[] { VirtualKey.PERIOD, VirtualKey.GREATER };
+      case 0x35:
+        return new VirtualKey[] { VirtualKey.SLASH, VirtualKey.QUESTIONMARK };
+      case 0x73:
+        return new VirtualKey[] { VirtualKey.BACK_SLASH, VirtualKey.DEGREE,
+                                  VirtualKey.QUESTIONMARK, VirtualKey.UNDERSCORE };
+      case 0x7d:
+        return new VirtualKey[] { VirtualKey.BAR };
+      case 0x79:
+        return new VirtualKey[] { VirtualKey.HENKAN_MODE };
+      case 0x70:
+        return new VirtualKey[] { VirtualKey.KATAKANA };
+      case 0x7b:
+        return new VirtualKey[] { VirtualKey.MUHENKAN };
+      case 0x3a:
+        return new VirtualKey[] { VirtualKey.EISU_TOGGLE, VirtualKey.CAPS_LOCK };
+      case 0xdc:
+        return new VirtualKey[] { VirtualKey.F13 };
+      case 0xf2:
+        return new VirtualKey[] { VirtualKey.HANGUL };
+      case 0xf1:
+        return new VirtualKey[] { VirtualKey.HANGUL_HANJA };
+      case 0x54:
+        return new VirtualKey[] { VirtualKey.EXECUTE };
+      default:
+        LOG.severe("unknown key id 0x" + Integer.toHexString(keyId) + " specified for key stroke " +
+                   keyStrokeName + " through keyboard map for locale " + mLocale);
+        throw new IllegalArgumentException("no keyboard map available for locale " + mLocale);
+    }
+  }*/
+
+}
Index: /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMapFactory.java
===================================================================
--- /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMapFactory.java	(revision 447)
+++ /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMapFactory.java	(revision 447)
@@ -0,0 +1,46 @@
+//-------------------------------------------------------------------------------------------------
+// Module    : $RCSfile: KeyboardMapFactory.java,v $
+// Version   : $Revision: 0.0 $  $Author: patrick $  $Date: 11.07.2012 $
+// Project   : KeyboardMaps
+// Creation  : 2012 by patrick
+// Copyright : Patrick Harms, 2012
+//-------------------------------------------------------------------------------------------------
+package de.ugoe.cs.tasktree.keyboardmaps;
+
+import java.util.Locale;
+
+//-------------------------------------------------------------------------------------------------
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 11.07.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+//-------------------------------------------------------------------------------------------------
+public class KeyboardMapFactory
+{
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  private KeyboardMapFactory()
+  {
+    // TODO Auto-generated constructor stub
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public static KeyboardMap createKeyboardMap(Locale locale)
+  {
+    KeyboardMap keyboardMap = new KeyboardMap(locale);
+    keyboardMap.init();
+    return keyboardMap;
+  }
+}
Index: /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/VirtualKey.java
===================================================================
--- /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/VirtualKey.java	(revision 447)
+++ /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/VirtualKey.java	(revision 447)
@@ -0,0 +1,470 @@
+//-------------------------------------------------------------------------------------------------
+// Module    : $RCSfile: Key.java,v $
+// Version   : $Revision: 0.0 $  $Author: patrick $  $Date: 01.04.2012 $
+// Project   : TaskTreeCreator
+// Creation  : 2012 by patrick
+// Copyright : Patrick Harms, 2012
+//-------------------------------------------------------------------------------------------------
+package de.ugoe.cs.tasktree.keyboardmaps;
+
+import java.awt.event.KeyEvent;
+
+//-------------------------------------------------------------------------------------------------
+/**
+ * TODO comment
+ *
+ * @version $Revision: $ $Date: 01.04.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+//-------------------------------------------------------------------------------------------------
+public enum VirtualKey
+{
+    ENTER(KeyEvent.VK_ENTER),
+    BACK_SPACE(KeyEvent.VK_BACK_SPACE),
+    TAB(KeyEvent.VK_TAB),
+    CANCEL(KeyEvent.VK_CANCEL),
+    CLEAR(KeyEvent.VK_CLEAR),
+    SHIFT(KeyEvent.VK_SHIFT),
+    CONTROL(KeyEvent.VK_CONTROL),
+    ALT(KeyEvent.VK_ALT),
+    PAUSE(KeyEvent.VK_PAUSE),
+    CAPS_LOCK(KeyEvent.VK_CAPS_LOCK),
+    ESCAPE(KeyEvent.VK_ESCAPE),
+    SPACE(KeyEvent.VK_SPACE),
+    PAGE_UP(KeyEvent.VK_PAGE_UP),
+    PAGE_DOWN(KeyEvent.VK_PAGE_DOWN),
+    END(KeyEvent.VK_END),
+    HOME(KeyEvent.VK_HOME),
+
+    LEFT(KeyEvent.VK_LEFT),
+    UP(KeyEvent.VK_UP),
+    RIGHT(KeyEvent.VK_RIGHT),
+    DOWN(KeyEvent.VK_DOWN),
+
+    COMMA(KeyEvent.VK_COMMA),
+    MINUS(KeyEvent.VK_MINUS),
+    PERIOD(KeyEvent.VK_PERIOD),
+    SLASH(KeyEvent.VK_SLASH),
+
+    DIGIT_0(KeyEvent.VK_0),
+    DIGIT_1(KeyEvent.VK_1),
+    DIGIT_2(KeyEvent.VK_2),
+    DIGIT_3(KeyEvent.VK_3),
+    DIGIT_4(KeyEvent.VK_4),
+    DIGIT_5(KeyEvent.VK_5),
+    DIGIT_6(KeyEvent.VK_6),
+    DIGIT_7(KeyEvent.VK_7),
+    DIGIT_8(KeyEvent.VK_8),
+    DIGIT_9(KeyEvent.VK_9),
+
+    SEMICOLON(KeyEvent.VK_SEMICOLON),
+    EQUALS(KeyEvent.VK_EQUALS),
+
+    LETTER_A(KeyEvent.VK_A),
+    LETTER_B(KeyEvent.VK_B),
+    LETTER_C(KeyEvent.VK_C),
+    LETTER_D(KeyEvent.VK_D),
+    LETTER_E(KeyEvent.VK_E),
+    LETTER_F(KeyEvent.VK_F),
+    LETTER_G(KeyEvent.VK_G),
+    LETTER_H(KeyEvent.VK_H),
+    LETTER_I(KeyEvent.VK_I),
+    LETTER_J(KeyEvent.VK_J),
+    LETTER_K(KeyEvent.VK_K),
+    LETTER_L(KeyEvent.VK_L),
+    LETTER_M(KeyEvent.VK_M),
+    LETTER_N(KeyEvent.VK_N),
+    LETTER_O(KeyEvent.VK_O),
+    LETTER_P(KeyEvent.VK_P),
+    LETTER_Q(KeyEvent.VK_Q),
+    LETTER_R(KeyEvent.VK_R),
+    LETTER_S(KeyEvent.VK_S),
+    LETTER_T(KeyEvent.VK_T),
+    LETTER_U(KeyEvent.VK_U),
+    LETTER_V(KeyEvent.VK_V),
+    LETTER_W(KeyEvent.VK_W),
+    LETTER_X(KeyEvent.VK_X),
+    LETTER_Y(KeyEvent.VK_Y),
+    LETTER_Z(KeyEvent.VK_Z),
+
+    OPEN_BRACKET(KeyEvent.VK_OPEN_BRACKET),
+    BACK_SLASH(KeyEvent.VK_BACK_SLASH),
+    CLOSE_BRACKET(KeyEvent.VK_CLOSE_BRACKET),
+
+    NUMPAD_0(KeyEvent.VK_NUMPAD0),
+    NUMPAD_1(KeyEvent.VK_NUMPAD1),
+    NUMPAD_2(KeyEvent.VK_NUMPAD2),
+    NUMPAD_3(KeyEvent.VK_NUMPAD3),
+    NUMPAD_4(KeyEvent.VK_NUMPAD4),
+    NUMPAD_5(KeyEvent.VK_NUMPAD5),
+    NUMPAD_6(KeyEvent.VK_NUMPAD6),
+    NUMPAD_7(KeyEvent.VK_NUMPAD7),
+    NUMPAD_8(KeyEvent.VK_NUMPAD8),
+    NUMPAD_9(KeyEvent.VK_NUMPAD9),
+    MULTIPLY(KeyEvent.VK_MULTIPLY),
+    ADD(KeyEvent.VK_ADD),
+
+    SEPARATOR(KeyEvent.VK_SEPARATOR),
+
+    SUBTRACT(KeyEvent.VK_SUBTRACT),
+    DECIMAL(KeyEvent.VK_DECIMAL),
+    DIVIDE(KeyEvent.VK_DIVIDE),
+    DELETE(KeyEvent.VK_DELETE),
+    NUM_LOCK(KeyEvent.VK_NUM_LOCK),
+    SCROLL_LOCK(KeyEvent.VK_SCROLL_LOCK),
+
+    F1(KeyEvent.VK_F1),
+    F2(KeyEvent.VK_F2),
+    F3(KeyEvent.VK_F3),
+    F4(KeyEvent.VK_F4),
+    F5(KeyEvent.VK_F5),
+    F6(KeyEvent.VK_F6),
+    F7(KeyEvent.VK_F7),
+    F8(KeyEvent.VK_F8),
+    F9(KeyEvent.VK_F9),
+    F10(KeyEvent.VK_F10),
+    F11(KeyEvent.VK_F11),
+    F12(KeyEvent.VK_F12),
+    F13(KeyEvent.VK_F13),
+    F14(KeyEvent.VK_F14),
+    F15(KeyEvent.VK_F15),
+    F16(KeyEvent.VK_F16),
+    F17(KeyEvent.VK_F17),
+    F18(KeyEvent.VK_F18),
+    F19(KeyEvent.VK_F19),
+    F20(KeyEvent.VK_F20),
+    F21(KeyEvent.VK_F21),
+    F22(KeyEvent.VK_F22),
+    F23(KeyEvent.VK_F23),
+    F24(KeyEvent.VK_F24),
+
+    PRINTSCREEN(KeyEvent.VK_PRINTSCREEN),
+    INSERT(KeyEvent.VK_INSERT),
+    HELP(KeyEvent.VK_HELP),
+    META(KeyEvent.VK_META),
+
+    BACK_QUOTE(KeyEvent.VK_BACK_QUOTE),
+    QUOTE(KeyEvent.VK_QUOTE),
+
+    KP_UP(KeyEvent.VK_KP_UP),
+    KP_DOWN(KeyEvent.VK_KP_DOWN),
+    KP_LEFT(KeyEvent.VK_KP_LEFT),
+    KP_RIGHT(KeyEvent.VK_KP_RIGHT),
+
+    DEAD_GRAVE(KeyEvent.VK_DEAD_GRAVE),
+    DEAD_ACUTE(KeyEvent.VK_DEAD_ACUTE),
+    DEAD_CIRCUMFLEX(KeyEvent.VK_DEAD_CIRCUMFLEX),
+    DEAD_TILDE(KeyEvent.VK_DEAD_TILDE),
+    DEAD_MACRON(KeyEvent.VK_DEAD_MACRON),
+    DEAD_BREVE(KeyEvent.VK_DEAD_BREVE),
+    DEAD_ABOVEDOT(KeyEvent.VK_DEAD_ABOVEDOT),
+    DEAD_DIAERESIS(KeyEvent.VK_DEAD_DIAERESIS),
+    DEAD_ABOVERING(KeyEvent.VK_DEAD_ABOVERING),
+    DEAD_DOUBLEACUTE(KeyEvent.VK_DEAD_DOUBLEACUTE),
+    DEAD_CARON(KeyEvent.VK_DEAD_CARON),
+    DEAD_CEDILLA(KeyEvent.VK_DEAD_CEDILLA),
+    DEAD_OGONEK(KeyEvent.VK_DEAD_OGONEK),
+    DEAD_IOTA(KeyEvent.VK_DEAD_IOTA),
+    DEAD_VOICED_SOUND(KeyEvent.VK_DEAD_VOICED_SOUND),
+    DEAD_SEMIVOICED_SOUND(KeyEvent.VK_DEAD_SEMIVOICED_SOUND),
+
+    AMPERSAND(KeyEvent.VK_AMPERSAND),
+    ASTERISK(KeyEvent.VK_ASTERISK),
+    QUOTEDBL(KeyEvent.VK_QUOTEDBL),
+    LESS(KeyEvent.VK_LESS),
+    GREATER(KeyEvent.VK_GREATER),
+    BRACELEFT(KeyEvent.VK_BRACELEFT),
+    BRACERIGHT(KeyEvent.VK_BRACERIGHT),
+
+    AT(KeyEvent.VK_AT),
+    COLON(KeyEvent.VK_COLON),
+    CIRCUMFLEX(KeyEvent.VK_CIRCUMFLEX),
+    DOLLAR(KeyEvent.VK_DOLLAR),
+    EURO_SIGN(KeyEvent.VK_EURO_SIGN),
+    EXCLAMATION_MARK(KeyEvent.VK_EXCLAMATION_MARK),
+    INVERTED_EXCLAMATION_MARK(KeyEvent.VK_INVERTED_EXCLAMATION_MARK),
+    LEFT_PARENTHESIS(KeyEvent.VK_LEFT_PARENTHESIS),
+    NUMBER_SIGN(KeyEvent.VK_NUMBER_SIGN),
+    PLUS(KeyEvent.VK_PLUS),
+    RIGHT_PARENTHESIS(KeyEvent.VK_RIGHT_PARENTHESIS),
+    UNDERSCORE(KeyEvent.VK_UNDERSCORE),
+
+    WINDOWS(KeyEvent.VK_WINDOWS),
+    CONTEXT_MENU(KeyEvent.VK_CONTEXT_MENU),
+
+    FINAL(KeyEvent.VK_FINAL),
+    CONVERT(KeyEvent.VK_CONVERT),
+    NONCONVERT(KeyEvent.VK_NONCONVERT),
+    ACCEPT(KeyEvent.VK_ACCEPT),
+    MODECHANGE(KeyEvent.VK_MODECHANGE),
+    KANA(KeyEvent.VK_KANA),
+    KANJI(KeyEvent.VK_KANJI),
+    ALPHANUMERIC(KeyEvent.VK_ALPHANUMERIC),
+    KATAKANA(KeyEvent.VK_KATAKANA),
+    HIRAGANA(KeyEvent.VK_HIRAGANA),
+    FULL_WIDTH(KeyEvent.VK_FULL_WIDTH),
+    HALF_WIDTH(KeyEvent.VK_HALF_WIDTH),
+    ROMAN_CHARACTERS(KeyEvent.VK_ROMAN_CHARACTERS),
+    ALL_CANDIDATES(KeyEvent.VK_ALL_CANDIDATES),
+    PREVIOUS_CANDIDATE(KeyEvent.VK_PREVIOUS_CANDIDATE),
+    CODE_INPUT(KeyEvent.VK_CODE_INPUT),
+    JAPANESE_KATAKANA(KeyEvent.VK_JAPANESE_KATAKANA),
+    JAPANESE_HIRAGANA(KeyEvent.VK_JAPANESE_HIRAGANA),
+    JAPANESE_ROMAN(KeyEvent.VK_JAPANESE_ROMAN),
+    KANA_LOCK(KeyEvent.VK_KANA_LOCK),
+    INPUT_METHOD_ON_OFF(KeyEvent.VK_INPUT_METHOD_ON_OFF),
+
+    CUT(KeyEvent.VK_CUT),
+    COPY(KeyEvent.VK_COPY),
+    PASTE(KeyEvent.VK_PASTE),
+    UNDO(KeyEvent.VK_UNDO),
+    AGAIN(KeyEvent.VK_AGAIN),
+    FIND(KeyEvent.VK_FIND),
+    PROPS(KeyEvent.VK_PROPS),
+    STOP(KeyEvent.VK_STOP),
+    COMPOSE(KeyEvent.VK_COMPOSE),
+    ALT_GRAPH(KeyEvent.VK_ALT_GRAPH),
+    BEGIN(KeyEvent.VK_BEGIN),
+
+    UNDEFINED(KeyEvent.VK_UNDEFINED);
+    
+    /*BAR(KeyEvent.VK_UNDEFINED),
+    APOSTROPHE(KeyEvent.VK_UNDEFINED),
+    QUESTIONMARK(KeyEvent.VK_UNDEFINED),
+    DEGREE(KeyEvent.VK_UNDEFINED),
+    HENKAN_MODE(KeyEvent.VK_UNDEFINED),
+    MUHENKAN(KeyEvent.VK_UNDEFINED),
+    EISU_TOGGLE(KeyEvent.VK_UNDEFINED),
+    HANGUL(KeyEvent.VK_UNDEFINED),
+    HANGUL_HANJA(KeyEvent.VK_UNDEFINED),
+    EXECUTE(KeyEvent.VK_UNDEFINED);*/
+
+  /** the virtual key code of the virtual key. */
+  private int mVirtualKeyCode = -1;
+
+  /** the description of the virtual key */
+  private String mDescription;
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  private VirtualKey(int virtualKeyCode)
+  {
+    mVirtualKeyCode = virtualKeyCode;
+    mDescription = KeyEvent.getKeyText(mVirtualKeyCode);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * @return Returns the description.
+   */
+  //-----------------------------------------------------------------------------------------------
+  String getDescription()
+  {
+    return mDescription;
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isCombinationKey()
+  {
+    switch (this)
+    {
+      case SHIFT:
+      case CONTROL:
+      case ALT:
+      case ALT_GRAPH:
+      case WINDOWS:
+        return true;
+
+    default:
+      return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isLockKey()
+  {
+    switch (this)
+    {
+      case CAPS_LOCK :
+      case NUM_LOCK:
+      case SCROLL_LOCK:
+
+      return true;
+
+    default:
+      return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isShiftKey()
+  {
+    switch (this)
+    {
+      case SHIFT:
+        return true;
+
+      default:
+        return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isAltKey()
+  {
+    switch (this)
+    {
+      case ALT:
+      case ALT_GRAPH:
+        return true;
+
+      default:
+        return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isControlKey()
+  {
+    switch (this)
+    {
+      case CONTROL:
+        return true;
+
+      default:
+        return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isWindowsKey()
+  {
+    switch (this)
+    {
+      case WINDOWS:
+        return true;
+
+      default:
+        return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isMetaKey()
+  {
+    switch (this)
+    {
+      case META:
+        return true;
+
+      default:
+        return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isLetter()
+  {
+    if (mVirtualKeyCode > -1)
+    {
+      return Character.isLetter((char) mVirtualKeyCode);
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean isDigit()
+  {
+    if (mVirtualKeyCode > -1)
+    {
+      return Character.isDigit(mVirtualKeyCode);
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param parameter
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public static VirtualKey parseVirtualKey(String string)
+  {
+    int virtualKeyCode = Integer.parseInt(string);
+    for (VirtualKey key1 : VirtualKey.values())
+    {
+      if (key1.mVirtualKeyCode == virtualKeyCode)
+      {
+        return key1;
+      }
+    }
+      
+    throw new IllegalArgumentException("there is no virtual key with id " + string);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public static VirtualKey valueOf(int number)
+  {
+    for (VirtualKey virtualKey : VirtualKey.values())
+    {
+      if (virtualKey.mVirtualKeyCode == number)
+      {
+        return virtualKey;
+      }
+    }
+    
+    throw new IllegalArgumentException("there is no virtual key with number " + number);
+  }
+
+}
Index: /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/VirtualKeySynonyms.java
===================================================================
--- /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/VirtualKeySynonyms.java	(revision 447)
+++ /trunk/quest-misc/src/main/java/de/ugoe/cs/tasktree/keyboardmaps/VirtualKeySynonyms.java	(revision 447)
@@ -0,0 +1,103 @@
+//-------------------------------------------------------------------------------------------------
+// Module    : $RCSfile: VirtualKeySynonyms.java,v $
+// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 12.07.2012 $
+// Project   : KeyboardMaps
+// Creation  : 2012 by pharms
+// Copyright : Patrick Harms, 2012
+//-------------------------------------------------------------------------------------------------
+package de.ugoe.cs.tasktree.keyboardmaps;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+//-------------------------------------------------------------------------------------------------
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 12.07.2012$
+ * @author 2012, last modified by $Author: pharms$
+ */
+//-------------------------------------------------------------------------------------------------
+class VirtualKeySynonyms
+{
+  /** */
+  private static Logger LOG = Logger.getLogger(KeyboardMap.class.getName());
+
+  /** */
+  private Map<Integer, List<VirtualKey>> mSynonyms = new HashMap<Integer, List<VirtualKey>>();
+  
+  /** */
+  private Map<VirtualKey, Integer> mKeyIds = new HashMap<VirtualKey, Integer>();
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyId
+   * @param virtualKey
+   */
+  //-----------------------------------------------------------------------------------------------
+  public void add(int keyId, VirtualKey virtualKey)
+  {
+    List<VirtualKey> synonyms = mSynonyms.get(keyId);
+    
+    if (synonyms == null)
+    {
+      synonyms = new ArrayList<VirtualKey>();
+      mSynonyms.put(keyId, synonyms);
+    }
+    
+    if (!synonyms.contains(virtualKey))
+    {
+      // ensure that the latest determined virtual keys are considered first
+      synonyms.add(0, virtualKey);
+    }
+    
+    Integer existingKeyId = mKeyIds.get(virtualKey);
+    
+    if ((existingKeyId != null) && (existingKeyId != keyId))
+    {
+      LOG.finest("virtual key " + virtualKey + " is mapped to more than one key id (current is " +
+                 existingKeyId + ", new is " + keyId + "). New key id will be used (" + keyId +
+                 ").");
+    }
+    
+    mKeyIds.put(virtualKey, keyId);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  public boolean containsKey(int keyId)
+  {
+    return mSynonyms.containsKey(keyId);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param keyId
+   * @return
+   */
+  //-----------------------------------------------------------------------------------------------
+  public VirtualKey[] getVirtualKeySynonyms(int keyId)
+  {
+    List<VirtualKey> virtualKeys = mSynonyms.get(keyId);
+    if (virtualKeys != null)
+    {
+      return virtualKeys.toArray(new VirtualKey[virtualKeys.size()]);
+    }
+    else
+    {
+      LOG.warning("no virtual key define for key id " + keyId);
+      return null;
+    }
+  }
+  
+}
Index: /trunk/quest-misc/src/main/resources/keymaps/ar
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/ar	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/ar	(revision 447)
@@ -0,0 +1,98 @@
+# generated from XKB map ar
+include common
+map 0x401
+exclam 0x02 shift
+at 0x03 shift
+numbersign 0x04 shift
+dollar 0x05 shift
+percent 0x06 shift
+asciicircum 0x07 shift
+ampersand 0x08 shift
+asterisk 0x09 shift
+parenleft 0x0a shift
+parenright 0x0b shift
+minus 0x0c
+underscore 0x0c shift
+equal 0x0d
+plus 0x0d shift
+Arabic_dad 0x10 altgr
+Arabic_fatha 0x10 shift altgr
+Arabic_sad 0x11 altgr
+Arabic_fathatan 0x11 shift altgr
+Arabic_theh 0x12 altgr
+Arabic_damma 0x12 shift altgr
+Arabic_qaf 0x13 altgr
+Arabic_dammatan 0x13 shift altgr
+Arabic_feh 0x14 altgr
+UFEF9 0x14 shift altgr
+Arabic_ghain 0x15 altgr
+Arabic_hamzaunderalef 0x15 shift altgr
+Arabic_ain 0x16 altgr
+grave 0x16 shift altgr
+Arabic_ha 0x17 altgr
+division 0x17 shift altgr
+Arabic_khah 0x18 altgr
+multiply 0x18 shift altgr
+Arabic_hah 0x19 altgr
+Arabic_semicolon 0x19 shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+Arabic_jeem 0x1a altgr
+bracketright 0x1b
+braceright 0x1b shift
+Arabic_dal 0x1b altgr
+Arabic_sheen 0x1e altgr
+backslash 0x1e shift altgr
+Arabic_seen 0x1f altgr
+Arabic_yeh 0x20 altgr
+bracketleft 0x20 shift altgr
+Arabic_beh 0x21 altgr
+bracketright 0x21 shift altgr
+Arabic_lam 0x22 altgr
+UFEF7 0x22 shift altgr
+Arabic_alef 0x23 altgr
+Arabic_hamzaonalef 0x23 shift altgr
+Arabic_teh 0x24 altgr
+Arabic_tatweel 0x24 shift altgr
+Arabic_noon 0x25 altgr
+Arabic_comma 0x25 shift altgr
+Arabic_meem 0x26 altgr
+slash 0x26 shift altgr
+semicolon 0x27
+colon 0x27 shift
+Arabic_kaf 0x27 altgr
+apostrophe 0x28
+quotedbl 0x28 shift
+Arabic_tah 0x28 altgr
+grave 0x29
+asciitilde 0x29 shift
+Arabic_thal 0x29 altgr
+Arabic_shadda 0x29 shift altgr
+backslash 0x2b
+bar 0x2b shift
+less 0x2b altgr
+greater 0x2b shift altgr
+Arabic_hamzaonyeh 0x2c altgr
+asciitilde 0x2c shift altgr
+Arabic_hamza 0x2d altgr
+Arabic_sukun 0x2d shift altgr
+Arabic_hamzaonwaw 0x2e altgr
+Arabic_kasra 0x2e shift altgr
+Arabic_ra 0x2f altgr
+Arabic_kasratan 0x2f shift altgr
+UFEFB 0x30 altgr
+UFEF5 0x30 shift altgr
+Arabic_alefmaksura 0x31 altgr
+Arabic_maddaonalef 0x31 shift altgr
+Arabic_tehmarbuta 0x32 altgr
+apostrophe 0x32 shift altgr
+comma 0x33
+less 0x33 shift
+Arabic_waw 0x33 altgr
+period 0x34
+greater 0x34 shift
+Arabic_zain 0x34 altgr
+slash 0x35
+question 0x35 shift
+Arabic_zah 0x35 altgr
+Arabic_question_mark 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/common
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/common	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/common	(revision 447)
@@ -0,0 +1,229 @@
+include modifiers
+
+#
+# Top row
+#
+1 0x2
+2 0x3
+3 0x4
+4 0x5
+5 0x6
+6 0x7
+7 0x8
+8 0x9
+9 0xa
+0 0xb
+BackSpace 0xe
+
+#
+# QWERTY first row
+#
+Tab 0xf localstate
+ISO_Left_Tab 0xf shift
+q 0x10 addupper
+w 0x11 addupper
+e 0x12 addupper
+sequence egrave dead_grave e
+sequence Egrave dead_grave E
+sequence eacute dead_acute e
+sequence Eacute dead_acute E
+sequence ecircumflex dead_circumflex e 
+sequence Ecircumflex dead_circumflex E 
+sequence ediaeresis dead_diaeresis e
+sequence Ediaeresis dead_diaeresis E
+r 0x13 addupper
+t 0x14 addupper
+y 0x15 addupper
+sequence ygrave dead_grave y
+sequence Ygrave dead_grave Y
+sequence yacute dead_acute y
+sequence Yacute dead_acute Y
+sequence ycircumflex dead_circumflex y
+sequence Ycircumflex dead_circumflex Y 
+sequence ydiaeresis dead_diaeresis y
+sequence Ydiaeresis dead_diaeresis Y
+u 0x16 addupper
+sequence ugrave dead_grave u
+sequence Ugrave dead_grave U
+sequence uacute dead_acute u
+sequence Uacute dead_acute U
+sequence ucircumflex dead_circumflex u 
+sequence Ucircumflex dead_circumflex U 
+sequence udiaeresis dead_diaeresis u
+sequence Udiaeresis dead_diaeresis U
+i 0x17 addupper
+sequence igrave dead_grave i
+sequence Igrave dead_grave I
+sequence iacute dead_acute i
+sequence Iacute dead_acute I
+sequence icircumflex dead_circumflex i 
+sequence Icircumflex dead_circumflex I 
+sequence idiaeresis dead_diaeresis i
+sequence Idiaeresis dead_diaeresis I
+o 0x18 addupper
+sequence ograve dead_grave o
+sequence Ograve dead_grave O
+sequence oacute dead_acute o
+sequence Oacute dead_acute O
+sequence ocircumflex dead_circumflex o 
+sequence Ocircumflex dead_circumflex O 
+sequence odiaeresis dead_diaeresis o
+sequence Odiaeresis dead_diaeresis O
+sequence otilde dead_tilde o
+sequence Otilde dead_tilde O
+p 0x19 addupper
+
+#
+# QWERTY second row
+#
+a 0x1e addupper
+sequence agrave dead_grave a
+sequence Agrave dead_grave A
+sequence aacute dead_acute a
+sequence Aacute dead_acute A
+sequence acircumflex dead_circumflex a 
+sequence Acircumflex dead_circumflex A 
+sequence adiaeresis dead_diaeresis a
+sequence Adiaeresis dead_diaeresis A
+sequence aring dead_abovering a
+sequence Aring dead_abovering A
+sequence atilde dead_tilde a
+sequence Atilde dead_tilde A
+s 0x1f addupper
+d 0x20 addupper
+f 0x21 addupper
+g 0x22 addupper
+h 0x23 addupper
+j 0x24 addupper
+k 0x25 addupper
+l 0x26 addupper
+Return 0x1c localstate
+
+#
+# QWERTY third row
+#
+z 0x2c addupper
+x 0x2d addupper
+c 0x2e addupper
+sequence ccedilla dead_cedilla c
+sequence Ccedilla dead_cedilla C
+v 0x2f addupper
+b 0x30 addupper
+n 0x31 addupper
+sequence ntilde dead_tilde n
+sequence Ntilde dead_tilde N
+m 0x32 addupper
+
+space 0x39 localstate
+
+less 0x56
+greater 0x56 shift
+bar 0x56 altgr
+brokenbar 0x56 shift altgr
+
+#
+# Translations for some other dead keys
+#
+sequence asciitilde dead_tilde space
+sequence diaeresis dead_diaeresis space
+sequence asciicircum dead_circumflex space
+sequence apostrophe dead_acute space
+sequence grave dead_grave space
+sequence acute dead_acute space
+
+#
+# Esc and Function keys
+#
+Escape 0x1 localstate
+F1 0x3b localstate
+F2 0x3c localstate
+F3 0x3d localstate
+F4 0x3e localstate
+F5 0x3f localstate
+F6 0x40 localstate
+F7 0x41 localstate
+F8 0x42 localstate
+F9 0x43 localstate
+F10 0x44 localstate
+F11 0x57 localstate
+SunF36 0x57 localstate
+F12 0x58 localstate
+SunF37 0x58 localstate
+
+# Printscreen, Scrollock and Pause
+# Printscreen really requires four scancodes (0xe0, 0x2a, 0xe0, 0x37),
+# but (0xe0, 0x37) seems to work. 
+Print 0xb7 localstate
+Sys_Req 0xb7 localstate
+Execute 0xb7 localstate
+F22 0xb7 localstate
+Scroll_Lock 0x46
+F23 0x46
+
+#
+# Insert - PgDown
+#
+Insert 0xd2 localstate
+Delete 0xd3 localstate
+Home 0xc7 localstate
+End 0xcf localstate
+Page_Up 0xc9 localstate
+Page_Down 0xd1 localstate
+
+#
+# Arrow keys
+#
+Left 0xcb localstate
+Up 0xc8 localstate
+Down 0xd0 localstate
+Right 0xcd localstate
+
+#
+# Numpad
+#
+Num_Lock 0x45
+KP_Divide 0xb5 localstate
+KP_Multiply 0x37 localstate
+KP_Subtract 0x4a localstate
+KP_Add 0x4e localstate
+KP_Enter 0x9c localstate
+
+KP_Decimal 0x53 numlock
+KP_Separator 0x53 numlock
+KP_Delete 0x53
+
+KP_0 0x52 numlock
+KP_Insert 0x52 localstate
+
+KP_1 0x4f numlock
+KP_End 0x4f localstate
+
+KP_2 0x50 numlock
+KP_Down 0x50 localstate
+
+KP_3 0x51 numlock
+KP_Next 0x51 localstate
+
+KP_4 0x4b numlock
+KP_Left 0x4b localstate
+
+KP_5 0x4c numlock
+KP_Begin 0x4c localstate
+
+KP_6 0x4d numlock
+KP_Right 0x4d localstate
+
+KP_7 0x47 numlock
+KP_Home 0x47 localstate
+
+KP_8 0x48 numlock
+KP_Up 0x48 localstate
+
+KP_9 0x49 numlock
+KP_Prior 0x49 localstate
+
+#
+# Inhibited keys
+#
+Caps_Lock 0x0 inhibit
+Multi_key 0x0 inhibit
Index: /trunk/quest-misc/src/main/resources/keymaps/cs
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/cs	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/cs	(revision 447)
@@ -0,0 +1,87 @@
+# Czech keymap
+include common
+map 0x405
+
+# AltGr
+ISO_Level3_Shift 0xb8
+
+#
+# Top row
+#
+
+# `
+grave 0x29
+asciitilde 0x29 shift
+# 1
+exclam 0x2 shift
+# 2
+at 0x3 shift
+ecaron 0x3 altgr
+# 3
+numbersign 0x4 shift
+# 4
+dollar 0x5 shift
+# 5
+percent 0x6 shift
+# 6
+asciicircum 0x7 shift
+# 7
+ampersand 0x8 shift
+# 8
+asterisk 0x9 shift
+# 9
+parenleft 0xa shift
+# 0
+parenright 0xb shift
+# -
+minus 0xc
+underscore 0xc shift
+# =
+equal 0xd
+plus 0xd shift
+
+
+#
+# QWERTZ first row
+#
+
+# q
+q 0x10 altgr
+# e
+e 0x12 altgr
+# [
+bracketleft 0x1a
+braceleft 0x1a shift
+# ]
+bracketright 0x1b
+braceright 0x1b shift
+
+#
+# QWERTZ second row
+#
+
+# ;
+semicolon 0x27
+# ;
+colon 0x27 shift
+# '
+apostrophe 0x28
+# '
+quotedbl 0x28 shift
+
+#
+# QWERTZ third row
+#
+
+# v
+v 0x2f altgr
+# ,
+comma 0x33
+less 0x33 shift
+# .
+period 0x34
+greater 0x34 shift
+# /
+slash 0x35
+question 0x35 shift
+
Index: /trunk/quest-misc/src/main/resources/keymaps/da
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/da	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/da	(revision 447)
@@ -0,0 +1,120 @@
+# generated from XKB map dk
+include common
+map 0x406
+exclam 0x02 shift
+exclamdown 0x02 altgr
+onesuperior 0x02 shift altgr
+quotedbl 0x03 shift
+at 0x03 altgr
+twosuperior 0x03 shift altgr
+numbersign 0x04 shift
+sterling 0x04 altgr
+threesuperior 0x04 shift altgr
+currency 0x05 shift
+dollar 0x05 altgr
+onequarter 0x05 shift altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+cent 0x06 shift altgr
+ampersand 0x07 shift
+yen 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+braceleft 0x08 altgr
+division 0x08 shift altgr
+parenleft 0x09 shift
+bracketleft 0x09 altgr
+guillemotleft 0x09 shift altgr
+parenright 0x0a shift
+bracketright 0x0a altgr
+guillemotright 0x0a shift altgr
+equal 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+plus 0x0c
+question 0x0c shift
+plusminus 0x0c altgr
+questiondown 0x0c shift altgr
+dead_acute 0x0d
+dead_grave 0x0d shift
+bar 0x0d altgr
+brokenbar 0x0d shift altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+cent 0x12 shift altgr
+registered 0x13 altgr
+thorn 0x14 altgr
+THORN 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oe 0x18 altgr
+OE 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+aring 0x1a
+Aring 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+dead_diaeresis 0x1b
+dead_circumflex 0x1b shift
+dead_tilde 0x1b altgr
+dead_caron 0x1b shift altgr
+ordfeminine 0x1e altgr
+masculine 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+ae 0x27
+AE 0x27 shift
+oslash 0x28
+Ooblique 0x28 shift
+dead_caron 0x28 shift altgr
+onehalf 0x29
+section 0x29 shift
+threequarters 0x29 altgr
+paragraph 0x29 shift altgr
+apostrophe 0x2b
+asterisk 0x2b shift
+dead_doubleacute 0x2b altgr
+multiply 0x2b shift altgr
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+copyright 0x2e altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+dead_cedilla 0x33 altgr
+dead_ogonek 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+dead_abovedot 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+hyphen 0x35 altgr
+macron 0x35 shift altgr
+nobreakspace 0x39 altgr
+less 0x56
+greater 0x56 shift
+backslash 0x56 altgr
+notsign 0x56 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/de
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/de	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/de	(revision 447)
@@ -0,0 +1,114 @@
+# generated from XKB map de
+include common
+map 0x407
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+quotedbl 0x03 shift
+twosuperior 0x03 altgr
+oneeighth 0x03 shift altgr
+section 0x04 shift
+threesuperior 0x04 altgr
+sterling 0x04 shift altgr
+dollar 0x05 shift
+onequarter 0x05 altgr
+currency 0x05 shift altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+ampersand 0x07 shift
+threequarters 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+parenleft 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+parenright 0x0a shift
+bracketright 0x0a altgr
+plusminus 0x0a shift altgr
+equal 0x0b shift
+braceright 0x0b altgr
+ssharp 0x0c
+question 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+acute 0x0d
+dead_acute 0x0d
+grave 0x0d shift
+dead_grave 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+at 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+EuroSign 0x12 altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+z 0x15 addupper
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+udiaeresis 0x1a
+Udiaeresis 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+plus 0x1b
+asterisk 0x1b shift
+asciitilde 0x1b altgr
+dead_tilde 0x1b altgr
+dead_macron 0x1b shift altgr
+ae 0x1e altgr
+AE 0x1e shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+odiaeresis 0x27
+Odiaeresis 0x27 shift
+dead_doubleacute 0x27 altgr
+adiaeresis 0x28
+Adiaeresis 0x28 shift
+dead_caron 0x28 shift altgr
+asciicircum 0x29
+dead_circumflex 0x29
+degree 0x29 shift
+notsign 0x29 altgr
+numbersign 0x2b
+apostrophe 0x2b shift
+dead_breve 0x2b shift altgr
+y 0x2c addupper
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/de-ch
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/de-ch	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/de-ch	(revision 447)
@@ -0,0 +1,169 @@
+# rdesktop Swiss-German (de-ch) keymap file 
+# 2003-06-03 by noldi@tristar.ch 
+#
+include common
+map 0x00000807
+#
+# Scan Code 1
+section 0x29
+degree 0x29 shift
+notsign 0x29 altgr inhibit
+#
+# Scan Code 2
+plus 0x2 shift
+brokenbar 0x02 altgr
+#
+# Scan Code 3
+quotedbl 0x03 shift
+at 0x03 altgr
+#
+# Scan Code 4
+asterisk 0x04 shift
+numbersign 0x04 altgr
+#
+# Scan Code 5
+ccedilla 0x05 shift
+onequarter 0x05 altgr inhibit
+#
+# Scan Code 6
+percent 0x06 shift
+onehalf 0x06 altgr inhibit
+#
+# Scan Code 7
+ampersand 0x07 shift
+notsign 0x07 altgr
+#
+# Scan Code 8
+slash 0x08 shift
+bar 0x08 altgr
+#
+# Scan Code 9
+parenleft 0x09 shift
+cent 0x09 altgr
+# 
+# Scan Code 10
+parenright 0x0a shift
+#
+# Scan Code 11
+equal 0x0b shift
+braceright 0x0b altgr inhibit
+#
+# Scan Code 12
+apostrophe 0x0c 
+question 0x0c shift
+dead_acute 0x0c altgr
+#
+# Scan Code 13
+dead_circumflex 0x0d
+dead_grave 0x0d shift
+dead_tilde 0x0d altgr
+#
+# Scan Code 19
+EuroSign 0x12 altgr
+#
+# Scan Code 22
+z 0x15 addupper
+#
+# Scan Code 27
+udiaeresis 0x1a
+egrave 0x1a shift
+bracketleft 0x1a altgr
+# 
+# Scan Code 28
+dead_diaeresis 0x1b
+exclam 0x1b shift 
+bracketright 0x1b altgr
+#
+# Scan Code 40
+odiaeresis 0x27
+eacute 0x27 shift
+#
+# Scan Code 41
+adiaeresis 0x28
+agrave 0x28 shift
+braceleft 0x28 altgr
+#
+# Scan Code 42 (only on international keyboards)
+dollar 0x2b
+sterling 0x2b shift
+braceright 0x2b altgr
+#
+# Scan Code 45 (only on international keyboards)
+backslash 0x56 altgr
+#
+# Scan Code 46
+y 0x2c addupper
+# 
+# Scan Code 53
+comma 0x33
+semicolon 0x33 shift
+# 
+# Scan Code 54
+period 0x34
+colon 0x34 shift
+#
+# Scan Code 55
+minus 0x35 
+underscore 0x35 shift
+#
+# Suppress Windows unsupported AltGr keys
+#
+# Scan Code 17
+paragraph 0x10 altgr inhibit
+#
+# Scan Code 21
+tslash 0x14 altgr inhibit
+#
+# Scan Code 22
+leftarrow 0x15 altgr inhibit
+#
+# Scan Code 23
+downarrow 0x16 altgr inhibit
+#
+# Scan Code 24
+rightarrow 0x17 altgr inhibit
+#
+# Scan Code 25
+oslash 0x18 altgr inhibit
+#
+# Scan Code 26
+thorn 0x19 altgr inhibit
+#
+# Scan Code 31
+ae 0x1e altgr inhibit
+#
+# Scan Code 32
+ssharp 0x1f altgr inhibit
+#
+# Scan Code 33
+eth 0x20 altgr inhibit
+#
+# Scan Code 34
+dstroke 0x21 altgr inhibit
+#
+# Scan Code 35
+eng 0x22 altgr inhibit
+#
+# Scan Code 36
+hstroke 0x23 altgr inhibit
+#
+# Scan Code 38
+kra 0x25 altgr inhibit
+#
+# Scan Code 39
+lstroke 0x26 altgr inhibit
+#
+# Scan Code 46
+guillemotleft 0x2c altgr inhibit
+#
+# Scan Code 47
+guillemotright 0x2d altgr inhibit
+#
+# Scan Code 49
+leftdoublequotemark 0x2f altgr inhibit
+#
+# Scan Code 50
+rightdoublequotemark 0x30 altgr inhibit
+#
+# Scan Code 52
+mu 0x32 altgr inhibit
Index: /trunk/quest-misc/src/main/resources/keymaps/en-dv
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/en-dv	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/en-dv	(revision 447)
@@ -0,0 +1,216 @@
+# American Dvorak
+map 0x10409
+
+# Note: we are not including the common section
+include modifiers
+
+#
+# Top row
+#
+1 0x2
+2 0x3
+3 0x4
+4 0x5
+5 0x6
+6 0x7
+7 0x8
+8 0x9
+9 0xa
+0 0xb
+BackSpace 0xe
+
+#
+# QWERTY first row
+
+# QWERTY:
+# q w e r t y u i o p
+
+# Dvorak:
+# ' , . p y f g c r l
+
+Tab 0xf localstate
+ISO_Left_Tab 0xf shift
+q 0x2d addupper
+w 0x33 addupper
+e 0x20 addupper
+r 0x18 addupper
+t 0x25 addupper
+y 0x14 addupper
+u 0x21 addupper
+i 0x22 addupper
+o 0x1f addupper
+p 0x13 addupper
+
+#
+# QWERTY second row
+
+# QUERTY:
+# a s d f g h j k l
+
+# Dvorak:
+# a o e u i d h t n
+ 
+a 0x1e addupper
+s 0x27 addupper
+d 0x23 addupper
+f 0x15 addupper
+g 0x16 addupper
+h 0x24 addupper
+j 0x2e addupper
+k 0x2f addupper
+l 0x19 addupper
+Return 0x1c localstate
+
+#
+# QWERTY third row
+
+# QUERTY:
+# z x c v b n m
+
+# Dvorak:
+# ; q j k x b m
+
+z 0x35 addupper
+x 0x30 addupper
+c 0x17 addupper
+v 0x34 addupper
+b 0x31 addupper
+n 0x26 addupper
+m 0x32 addupper
+
+space 0x39 localstate
+
+less 0x56
+greater 0x56 shift
+bar 0x56 altgr
+brokenbar 0x56 shift altgr
+
+#
+# Esc and Function keys
+#
+Escape 0x1 localstate
+F1 0x3b localstate
+F2 0x3c localstate
+F3 0x3d localstate
+F4 0x3e localstate
+F5 0x3f localstate
+F6 0x40 localstate
+F7 0x41 localstate
+F8 0x42 localstate
+F9 0x43 localstate
+F10 0x44 localstate
+F11 0x57 localstate
+SunF36 0x57 localstate
+F12 0x58 localstate
+SunF37 0x58 localstate
+
+# Printscreen, Scrollock and Pause
+# Printscreen really requires four scancodes (0xe0, 0x2a, 0xe0, 0x37),
+# but (0xe0, 0x37) seems to work. 
+Print 0xb7 localstate
+Sys_Req 0xb7 localstate
+Execute 0xb7 localstate
+F22 0xb7 localstate
+Scroll_Lock 0x46
+F23 0x46
+
+#
+# Insert - PgDown
+#
+Insert 0xd2 localstate
+Delete 0xd3 localstate
+Home 0xc7 localstate
+End 0xcf localstate
+Page_Up 0xc9 localstate
+Page_Down 0xd1 localstate
+
+#
+# Arrow keys
+#
+Left 0xcb localstate
+Up 0xc8 localstate
+Down 0xd0 localstate
+Right 0xcd localstate
+
+#
+# Numpad
+#
+Num_Lock 0x45
+KP_Divide 0xb5
+KP_Multiply 0x37
+KP_Subtract 0x4a
+KP_Add 0x4e
+KP_Enter 0x9c
+
+KP_Decimal 0x53 numlock
+KP_Separator 0x53 numlock
+KP_Delete 0x53
+
+KP_0 0x52 numlock
+KP_Insert 0x52
+
+KP_1 0x4f numlock
+KP_End 0x4f
+
+KP_2 0x50 numlock
+KP_Down 0x50
+
+KP_3 0x51 numlock
+KP_Next 0x51
+
+KP_4 0x4b numlock
+KP_Left 0x4b
+
+KP_5 0x4c numlock
+KP_Begin 0x4c
+
+KP_6 0x4d numlock
+KP_Right 0x4d
+
+KP_7 0x47 numlock
+KP_Home 0x47
+
+KP_8 0x48 numlock
+KP_Up 0x48
+
+KP_9 0x49 numlock
+KP_Prior 0x49
+
+#
+# Inhibited keys
+#
+Caps_Lock 0x0 inhibit
+Multi_key 0x0 inhibit
+
+exclam 0x02 shift
+at 0x03 shift
+numbersign 0x04 shift
+dollar 0x05 shift
+percent 0x06 shift
+asciicircum 0x07 shift
+ampersand 0x08 shift
+asterisk 0x09 shift
+parenleft 0x0a shift
+parenright 0x0b shift
+minus 0x28
+underscore 0x28 shift
+equal 0x1b
+plus 0x1b shift
+bracketleft 0x0c
+braceleft 0x0c shift
+bracketright 0x0d
+braceright 0x0d shift
+semicolon 0x2c
+colon 0x2c shift
+apostrophe 0x10
+quotedbl 0x10 shift
+grave 0x29
+asciitilde 0x29 shift
+backslash 0x2b
+bar 0x2b shift
+comma 0x11
+less 0x11 shift
+period 0x12
+greater 0x12 shift
+slash 0x1a
+question 0x1a shift
Index: /trunk/quest-misc/src/main/resources/keymaps/en-gb
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/en-gb	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/en-gb	(revision 447)
@@ -0,0 +1,119 @@
+# generated from XKB map gb
+include common
+map 0x809
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+quotedbl 0x03 shift
+twosuperior 0x03 altgr
+oneeighth 0x03 shift altgr
+sterling 0x04 shift
+threesuperior 0x04 altgr
+dollar 0x05 shift
+EuroSign 0x05 altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+asciicircum 0x07 shift
+threequarters 0x07 altgr
+fiveeighths 0x07 shift altgr
+ampersand 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+asterisk 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+parenleft 0x0a shift
+bracketright 0x0a altgr
+plusminus 0x0a shift altgr
+parenright 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+minus 0x0c
+underscore 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+equal 0x0d
+plus 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+at 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+bracketright 0x1b
+braceright 0x1b shift
+dead_tilde 0x1b altgr
+dead_macron 0x1b shift altgr
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+semicolon 0x27
+colon 0x27 shift
+dead_acute 0x27 altgr
+dead_doubleacute 0x27 shift altgr
+apostrophe 0x28
+at 0x28 shift
+dead_circumflex 0x28 altgr
+dead_caron 0x28 shift altgr
+grave 0x29
+notsign 0x29 shift
+bar 0x29 altgr
+numbersign 0x2b
+asciitilde 0x2b shift
+dead_grave 0x2b altgr
+dead_breve 0x2b shift altgr
+guillemotleft 0x2c altgr
+less 0x2c shift altgr
+guillemotright 0x2d altgr
+greater 0x2d shift altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+less 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+greater 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+slash 0x35
+question 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
+backslash 0x56
+bar 0x56 shift
Index: /trunk/quest-misc/src/main/resources/keymaps/en-us
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/en-us	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/en-us	(revision 447)
@@ -0,0 +1,35 @@
+# generated from XKB map us
+include common
+map 0x409
+exclam 0x02 shift
+at 0x03 shift
+numbersign 0x04 shift
+dollar 0x05 shift
+percent 0x06 shift
+asciicircum 0x07 shift
+ampersand 0x08 shift
+asterisk 0x09 shift
+parenleft 0x0a shift
+parenright 0x0b shift
+minus 0x0c
+underscore 0x0c shift
+equal 0x0d
+plus 0x0d shift
+bracketleft 0x1a
+braceleft 0x1a shift
+bracketright 0x1b
+braceright 0x1b shift
+semicolon 0x27
+colon 0x27 shift
+apostrophe 0x28
+quotedbl 0x28 shift
+grave 0x29
+asciitilde 0x29 shift
+backslash 0x2b
+bar 0x2b shift
+comma 0x33
+less 0x33 shift
+period 0x34
+greater 0x34 shift
+slash 0x35
+question 0x35 shift
Index: /trunk/quest-misc/src/main/resources/keymaps/es
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/es	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/es	(revision 447)
@@ -0,0 +1,105 @@
+# generated from XKB map es
+include common
+map 0x40a
+exclam 0x02 shift
+bar 0x02 altgr
+quotedbl 0x03 shift
+at 0x03 altgr
+oneeighth 0x03 shift altgr
+periodcentered 0x04 shift
+numbersign 0x04 altgr
+sterling 0x04 shift altgr
+dollar 0x05 shift
+asciitilde 0x05 altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+ampersand 0x07 shift
+notsign 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+seveneighths 0x08 shift altgr
+parenleft 0x09 shift
+trademark 0x09 shift altgr
+parenright 0x0a shift
+plusminus 0x0a shift altgr
+equal 0x0b shift
+degree 0x0b shift altgr
+apostrophe 0x0c
+question 0x0c shift
+exclamdown 0x0d
+questiondown 0x0d shift
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+dead_grave 0x1a
+dead_circumflex 0x1a shift
+bracketleft 0x1a altgr
+dead_abovering 0x1a shift altgr
+plus 0x1b
+asterisk 0x1b shift
+bracketright 0x1b altgr
+dead_macron 0x1b shift altgr
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+ntilde 0x27
+Ntilde 0x27 shift
+dead_doubleacute 0x27 shift altgr
+dead_acute 0x28
+dead_diaeresis 0x28 shift
+braceleft 0x28 altgr
+masculine 0x29
+ordfeminine 0x29 shift
+backslash 0x29 altgr
+ccedilla 0x2b
+Ccedilla 0x2b shift
+braceright 0x2b altgr
+dead_breve 0x2b shift altgr
+guillemotleft 0x2c altgr
+less 0x56
+greater 0x56 shift
+guillemotright 0x2d altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+comma 0x33
+semicolon 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+division 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/et
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/et	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/et	(revision 447)
@@ -0,0 +1,86 @@
+map 0x00000425
+include common
+
+#
+# Top row
+#
+dead_caron 0x29
+dead_tilde 0x29 shift
+
+# 1
+exclam 0x2 shift
+
+# 2
+quotedbl 0x3 shift
+at 0x3 altgr
+
+# 3
+numbersign 0x4 shift
+sterling 0x4 altgr
+# 4
+currency 0x5 shift
+dollar 0x5 altgr
+# 5
+percent 0x6 shift
+# 6
+ampersand 0x7 shift
+# 7
+slash 0x8 shift
+braceleft 0x8 altgr
+# 8
+parenleft 0x9 shift
+bracketleft 0x9 altgr
+# 9
+parenright 0xa shift
+bracketright 0xa altgr
+# 0
+equal 0xb shift
+braceright 0xb altgr
+
+plus 0xc
+question 0xc shift
+backslash 0xc altgr
+
+acute 0xd
+dead_acute 0xd
+grave 0xd shift
+dead_grave 0xd shift
+
+#
+# QWERTY first row
+#
+EuroSign 0x12 altgr
+udiaeresis 0x1a 
+Udiaeresis 0x1a shift
+otilde 0x1b 
+Otilde 0x1b shift
+section 0x1b altgr
+
+#
+# QWERTY second row
+#
+scaron 0x1f altgr
+Scaron 0x1f altgr shift
+odiaeresis 0x27 
+Odiaeresis 0x27 shift
+adiaeresis 0x28 
+Adiaeresis 0x28 shift
+asciicircum 0x28 altgr
+apostrophe 0x2b
+asterisk 0x2b shift
+onehalf 0x2b altgr
+#
+# QWERTY third row
+#
+less 0x56 
+greater 0x56 shift
+bar 0x56 altgr
+zcaron 0x2c altgr
+Zcaron 0x2c altgr shift
+comma 0x33
+semicolon 0x33 shift
+period 0x34
+colon 0x34 shift
+minus 0x35
+underscore 0x35 shift
+
Index: /trunk/quest-misc/src/main/resources/keymaps/fi
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/fi	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/fi	(revision 447)
@@ -0,0 +1,122 @@
+# Finnish keyboard layout
+# Originally generated from XKB map se_FI (wrong!), modified afterwards.
+
+include common
+map 0x40b
+
+exclam 0x02 shift
+exclamdown 0x02 altgr
+onesuperior 0x02 shift altgr
+quotedbl 0x03 shift
+at 0x03 altgr
+twosuperior 0x03 shift altgr
+numbersign 0x04 shift
+sterling 0x04 altgr
+threesuperior 0x04 shift altgr
+currency 0x05 shift
+dollar 0x05 altgr
+onequarter 0x05 shift altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+cent 0x06 shift altgr
+ampersand 0x07 shift
+yen 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+braceleft 0x08 altgr
+division 0x08 shift altgr
+parenleft 0x09 shift
+bracketleft 0x09 altgr
+guillemotleft 0x09 shift altgr
+parenright 0x0a shift
+bracketright 0x0a altgr
+guillemotright 0x0a shift altgr
+equal 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+plus 0x0c
+question 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+dead_acute 0x0d
+dead_grave 0x0d shift
+plusminus 0x0d altgr
+notsign 0x0d shift altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+cent 0x12 shift altgr
+registered 0x13 altgr
+thorn 0x14 altgr
+THORN 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oe 0x18 altgr
+OE 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+aring 0x1a
+Aring 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+dead_diaeresis 0x1b
+dead_circumflex 0x1b shift
+dead_tilde 0x1b altgr
+dead_caron 0x1b shift altgr
+ordfeminine 0x1e altgr
+masculine 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+odiaeresis 0x27
+Odiaeresis 0x27 shift
+oslash 0x27 altgr
+Ooblique 0x27 shift altgr
+adiaeresis 0x28
+Adiaeresis 0x28 shift
+ae 0x28 altgr
+AE 0x28 shift altgr
+section 0x29
+onehalf 0x29 shift
+paragraph 0x29 altgr
+threequarters 0x29 shift altgr
+apostrophe 0x2b
+asterisk 0x2b shift
+acute 0x2b altgr
+multiply 0x2b shift altgr
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+copyright 0x2e altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+dead_cedilla 0x33 altgr
+dead_ogonek 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+dead_abovedot 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+hyphen 0x35 altgr
+macron 0x35 shift altgr
+nobreakspace 0x39 altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/fo
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/fo	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/fo	(revision 447)
@@ -0,0 +1,77 @@
+map 0x438
+include common
+
+#
+# Top row
+#
+onehalf 0x29
+section 0x29 shift
+
+# 1
+exclam 0x2 shift
+
+# 2
+quotedbl 0x3 shift
+at 0x3 altgr
+
+# 3
+numbersign 0x4 shift
+sterling 0x4 altgr
+# 4
+currency 0x5 shift
+dollar 0x5 altgr
+# 5
+percent 0x6 shift
+# 6
+ampersand 0x7 shift
+# 7
+slash 0x8 shift
+braceleft 0x8 altgr
+# 8
+parenleft 0x9 shift
+bracketleft 0x9 altgr
+# 9
+parenright 0xa shift
+bracketright 0xa altgr
+# 0
+equal 0xb shift
+braceright 0xb altgr
+
+plus 0xc
+question 0xc shift
+plusminus 0xc altgr
+
+bar 0xd altgr
+dead_acute 0xd
+
+#
+# QWERTY first row
+#
+EuroSign 0x12 altgr
+aring 0x1a
+Aring 0x1a shift
+eth 0x1b addupper
+asciitilde 0x1b altgr
+
+#
+# QWERTY second row
+#
+ae 0x27 addupper
+oslash 0x28
+Ooblique 0x28 shift
+apostrophe 0x2b
+asterisk 0x2b shift
+
+#
+# QWERTY third row
+#
+less 0x56
+greater 0x56 shift
+backslash 0x56 altgr
+comma 0x33
+semicolon 0x33 shift
+period 0x34
+colon 0x34 shift
+minus 0x35
+underscore 0x35 shift
+
Index: /trunk/quest-misc/src/main/resources/keymaps/fr
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/fr	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/fr	(revision 447)
@@ -0,0 +1,181 @@
+include common
+map 0x40c
+#
+# Top row
+#
+twosuperior 0x29
+notsign 0x29 altgr
+
+ampersand 0x02
+1 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+
+eacute 0x03
+2 0x03 shift
+asciitilde 0x03 altgr
+oneeighth 0x03 shift altgr
+
+quotedbl 0x04
+3 0x04 shift
+numbersign 0x04 altgr
+
+apostrophe 0x05
+4 0x05 shift
+braceleft 0x05 altgr
+
+parenleft 0x06
+5 0x06 shift
+bracketleft 0x06 altgr
+threeeighths 0x06 shift altgr
+
+minus 0x07
+6 0x07 shift
+bar 0x07 altgr
+fiveeighths 0x07 shift altgr
+
+egrave 0x08
+7 0x08 shift
+grave 0x08 altgr
+seveneighths 0x08 shift altgr
+
+underscore 0x09
+8 0x09 shift
+backslash 0x09 altgr
+trademark 0x09 shift altgr
+
+ccedilla 0x0a
+9 0x0a shift
+asciicircum 0x0a altgr
+plusminus 0x0a shift altgr
+
+agrave 0x0b
+0 0x0b shift
+at 0x0b altgr
+
+parenright 0x0c
+degree 0x0c shift
+bracketright 0x0c altgr
+questiondown 0x0c shift altgr
+
+equal 0x0d
+plus 0x0d shift
+braceright 0x0d altgr
+dead_ogonek 0x0d shift altgr
+
+#
+# AZERTY first row
+#
+
+a 0x10 addupper
+ae 0x10 altgr
+AE 0x10 shift altgr
+
+z 0x11 addupper
+guillemotleft 0x11 altgr
+
+EuroSign 0x12 altgr
+
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+
+dead_circumflex 0x1a 
+dead_diaeresis 0x1a shift
+dead_abovering 0x1a shift altgr
+
+dollar 0x1b
+sterling 0x1b shift
+currency 0x1b altgr
+dead_macron 0x1b shift altgr
+
+#
+# AZERTY second row
+#
+q 0x1e addupper
+Greek_OMEGA 0x1e shift altgr
+
+ssharp 0x1f altgr
+
+eth 0x20 altgr
+ETH 0x20 shift altgr
+
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+
+eng 0x22 altgr
+ENG 0x22 shift altgr
+
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+
+kra 0x25 altgr
+
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+
+m 0x27 addupper
+masculine 0x27 shift altgr
+
+ugrave 0x28
+percent 0x28 shift
+dead_caron 0x28 shift altgr
+
+asterisk 0x2b
+mu 0x2b shift
+dead_grave 0x2b altgr
+dead_breve 0x2b shift altgr
+
+#
+# AZERTY third row
+#
+less 0x56
+greater 0x56 shift
+
+w 0x2c addupper
+
+guillemotright 0x2d altgr
+
+cent 0x2e altgr
+copyright 0x2e shift altgr
+
+leftdoublequotemark 0x2f altgr
+
+rightdoublequotemark 0x30 altgr
+
+comma 0x32
+question 0x32 shift
+dead_acute 0x32 altgr
+dead_doubleacute 0x32 shift altgr
+
+semicolon 0x33
+period 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+
+colon 0x34
+slash 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+
+exclam 0x35
+section 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/fr-be
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/fr-be	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/fr-be	(revision 447)
@@ -0,0 +1,135 @@
+# generated from XKB map be
+include common
+map 0x80c
+ampersand 0x02
+1 0x02 shift
+bar 0x02 altgr
+exclamdown 0x02 shift altgr
+eacute 0x03
+2 0x03 shift
+at 0x03 altgr
+oneeighth 0x03 shift altgr
+quotedbl 0x04
+3 0x04 shift
+numbersign 0x04 altgr
+sterling 0x04 shift altgr
+apostrophe 0x05
+4 0x05 shift
+onequarter 0x05 altgr
+dollar 0x05 shift altgr
+parenleft 0x06
+5 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+section 0x07
+6 0x07 shift
+asciicircum 0x07 altgr
+fiveeighths 0x07 shift altgr
+egrave 0x08
+7 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+exclam 0x09
+8 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+ccedilla 0x0a
+9 0x0a shift
+braceleft 0x0a altgr
+plusminus 0x0a shift altgr
+agrave 0x0b
+0 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+parenright 0x0c
+degree 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+minus 0x0d
+underscore 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+a 0x10 addupper
+Greek_OMEGA 0x10 shift altgr
+z 0x11 addupper
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+cent 0x12 shift altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+dead_circumflex 0x1a
+dead_diaeresis 0x1a shift
+bracketleft 0x1a altgr
+dead_abovering 0x1a shift altgr
+dollar 0x1b
+asterisk 0x1b shift
+bracketright 0x1b altgr
+dead_macron 0x1b shift altgr
+q 0x1e addupper
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+m 0x27 addupper
+dead_acute 0x27 altgr
+dead_doubleacute 0x27 shift altgr
+ugrave 0x28
+percent 0x28 shift
+dead_acute 0x28 altgr
+dead_caron 0x28 shift altgr
+twosuperior 0x29
+threesuperior 0x29 shift
+notsign 0x29 altgr
+mu 0x2b
+sterling 0x2b shift
+dead_grave 0x2b altgr
+dead_breve 0x2b shift altgr
+w 0x2c addupper
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+comma 0x32
+question 0x32 shift
+dead_cedilla 0x32 altgr
+masculine 0x32 shift altgr
+semicolon 0x33
+period 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+colon 0x34
+slash 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+equal 0x35
+plus 0x35 shift
+dead_tilde 0x35 altgr
+dead_abovedot 0x35 shift altgr
+backslash 0x56 altgr
+
Index: /trunk/quest-misc/src/main/resources/keymaps/fr-ca
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/fr-ca	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/fr-ca	(revision 447)
@@ -0,0 +1,53 @@
+# Canadian French
+# By Simon Germain
+include common
+map 0xc0c
+
+backslash 0x29 altgr
+plusminus 0x2 altgr
+at 0x3 altgr
+sterling 0x4 altgr
+cent 0x5 altgr
+currency 0x6 altgr
+notsign 0x7 altgr
+bar 0x29 shift
+twosuperior 0x9 altgr
+threesuperior 0xa altgr
+onequarter 0xb altgr
+onehalf 0xc altgr
+threequarters 0xd altgr
+section 0x18 altgr
+paragraph 0x19 altgr
+bracketleft 0x1a altgr
+bracketright 0x1b altgr
+asciitilde 0x27 altgr
+braceleft 0x28 altgr
+braceright 0x2b altgr
+less 0x2b
+greater 0x2b shift
+guillemotleft 0x56
+guillemotright 0x56 shift
+degree 0x56 altgr
+mu 0x32 altgr
+eacute 0x35
+dead_acute 0x35 altgr
+dead_grave 0x28
+dead_circumflex 0x1a
+dead_circumflex 0x1a shift
+dead_cedilla 0x1b
+dead_diaeresis 0x1b shift
+exclam 0x2 shift
+quotedbl 0x3 shift
+comma 0x33
+apostrophe 0x33 shift
+period 0x34 shift
+slash 0x4 shift
+dollar 0x5 shift
+percent 0x6 shift
+question 0x7 shift
+ampersand 0x8 shift
+asterisk 0x9 shift
+parenleft 0xa shift
+parenright 0xb shift
+underscore 0xc shift
+plus 0xd shift
Index: /trunk/quest-misc/src/main/resources/keymaps/fr-ch
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/fr-ch	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/fr-ch	(revision 447)
@@ -0,0 +1,169 @@
+# rdesktop suisse-french keymap file 
+#
+#map 0x00000807
+map 0x0000100C
+include common
+#
+# Scan Code 1
+section 0x29
+degree 0x29 shift
+notsign 0x29 altgr inhibit
+#
+# Scan Code 2
+plus 0x2 shift
+brokenbar 0x02 altgr
+#
+# Scan Code 3
+quotedbl 0x03 shift
+at 0x03 altgr
+#
+# Scan Code 4
+asterisk 0x04 shift
+numbersign 0x04 altgr
+#
+# Scan Code 5
+ccedilla 0x05 shift
+onequarter 0x05 altgr inhibit
+#
+# Scan Code 6
+percent 0x06 shift
+onehalf 0x06 altgr inhibit
+#
+# Scan Code 7
+ampersand 0x07 shift
+notsign 0x07 altgr
+#
+# Scan Code 8
+slash 0x08 shift
+bar 0x08 altgr
+#
+# Scan Code 9
+parenleft 0x09 shift
+cent 0x09 altgr
+# 
+# Scan Code 10
+parenright 0x0a shift
+#
+# Scan Code 11
+equal 0x0b shift
+braceright 0x0b altgr inhibit
+#
+# Scan Code 12
+apostrophe 0x0c 
+question 0x0c shift
+dead_acute 0x0c altgr
+#
+# Scan Code 13
+dead_circumflex 0x0d
+dead_grave 0x0d shift
+dead_tilde 0x0d altgr
+#
+# Scan Code 19
+EuroSign 0x12 altgr
+#
+# Scan Code 22
+z 0x15 addupper
+#
+# Scan Code 27
+udiaeresis 0x1a shift
+egrave 0x1a 
+bracketleft 0x1a altgr
+# 
+# Scan Code 28
+dead_diaeresis 0x1b
+exclam 0x1b shift 
+bracketright 0x1b altgr
+#
+# Scan Code 40
+odiaeresis 0x27 shift
+eacute 0x27 
+#
+# Scan Code 41
+adiaeresis 0x28 shift
+agrave 0x28 
+braceleft 0x28 altgr
+#
+# Scan Code 42 (only on international keyboards)
+dollar 0x2b
+sterling 0x2b shift
+braceright 0x2b altgr
+#
+# Scan Code 45 (only on international keyboards)
+backslash 0x56 altgr
+#
+# Scan Code 46
+y 0x2c addupper
+# 
+# Scan Code 53
+comma 0x33
+semicolon 0x33 shift
+# 
+# Scan Code 54
+period 0x34
+colon 0x34 shift
+#
+# Scan Code 55
+minus 0x35 
+underscore 0x35 shift
+#
+# Suppress Windows unsupported AltGr keys
+#
+# Scan Code 17
+paragraph 0x10 altgr inhibit
+#
+# Scan Code 21
+tslash 0x14 altgr inhibit
+#
+# Scan Code 22
+leftarrow 0x15 altgr inhibit
+#
+# Scan Code 23
+downarrow 0x16 altgr inhibit
+#
+# Scan Code 24
+rightarrow 0x17 altgr inhibit
+#
+# Scan Code 25
+oslash 0x18 altgr inhibit
+#
+# Scan Code 26
+thorn 0x19 altgr inhibit
+#
+# Scan Code 31
+ae 0x1e altgr inhibit
+#
+# Scan Code 32
+ssharp 0x1f altgr inhibit
+#
+# Scan Code 33
+eth 0x20 altgr inhibit
+#
+# Scan Code 34
+dstroke 0x21 altgr inhibit
+#
+# Scan Code 35
+eng 0x22 altgr inhibit
+#
+# Scan Code 36
+hstroke 0x23 altgr inhibit
+#
+# Scan Code 38
+kra 0x25 altgr inhibit
+#
+# Scan Code 39
+lstroke 0x26 altgr inhibit
+#
+# Scan Code 46
+guillemotleft 0x2c altgr inhibit
+#
+# Scan Code 47
+guillemotright 0x2d altgr inhibit
+#
+# Scan Code 49
+leftdoublequotemark 0x2f altgr inhibit
+#
+# Scan Code 50
+rightdoublequotemark 0x30 altgr inhibit
+#
+# Scan Code 52
+mu 0x32 altgr inhibit
Index: /trunk/quest-misc/src/main/resources/keymaps/he
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/he	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/he	(revision 447)
@@ -0,0 +1,91 @@
+# Generated by Shlomil
+# Please send your comments and corrections to <shlomister@gmail.com>
+include common
+map 0x040D
+
+
+#
+# Top row
+#
+
+slash 0x10 altgr
+apostrophe 0x11 altgr
+hebrew_qoph 0x12 altgr
+hebrew_resh 0x13 altgr
+hebrew_aleph 0x14 altgr
+hebrew_tet 0x15 altgr
+hebrew_waw 0x16 altgr
+hebrew_finalnun 0x17 altgr
+hebrew_finalmem 0x18 altgr
+hebrew_pe 0x19 altgr
+
+#
+# Second row
+#
+
+hebrew_shin 0x1e altgr
+hebrew_dalet 0x1f altgr
+hebrew_gimel 0x20 altgr
+hebrew_kaph 0x21 altgr
+hebrew_ayin 0x22 altgr
+hebrew_yod 0x23 altgr
+hebrew_chet 0x24 altgr
+hebrew_lamed 0x25 altgr
+hebrew_finalkaph 0x26 altgr
+hebrew_finalpe 0x27 altgr
+comma 0x28 altgr
+
+#
+# Third row
+#
+
+hebrew_zain 0x2c altgr
+hebrew_samech 0x2d altgr
+hebrew_bet 0x2e altgr
+hebrew_he 0x2f altgr
+hebrew_nun 0x30 altgr
+hebrew_mem 0x31 altgr
+hebrew_zade 0x32 altgr
+
+hebrew_taw 0x33 altgr
+hebrew_finalzade 0x34 altgr
+period 0x35 altgr
+
+
+#
+# en-us
+#
+
+
+exclam 0x02 shift
+at 0x03 shift
+numbersign 0x04 shift
+dollar 0x05 shift
+percent 0x06 shift
+asciicircum 0x07 shift
+ampersand 0x08 shift
+asterisk 0x09 shift
+parenleft 0x0a shift
+parenright 0x0b shift
+minus 0x0c
+underscore 0x0c shift
+equal 0x0d
+plus 0x0d shift
+bracketleft 0x1a
+braceleft 0x1a shift
+bracketright 0x1b
+braceright 0x1b shift
+semicolon 0x27
+colon 0x27 shift
+apostrophe 0x28
+quotedbl 0x28 shift
+grave 0x29
+asciitilde 0x29 shift
+backslash 0x2b
+bar 0x2b shift
+comma 0x33
+less 0x33 shift
+period 0x34
+greater 0x34 shift
+slash 0x35
+question 0x35 shift
Index: /trunk/quest-misc/src/main/resources/keymaps/hr
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/hr	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/hr	(revision 447)
@@ -0,0 +1,125 @@
+# generated from XKB map hr
+include common
+map 0x41a
+exclam 0x02 shift
+asciitilde 0x02 altgr
+dead_tilde 0x02 shift altgr
+quotedbl 0x03 shift
+dead_caron 0x03 altgr
+caron 0x03 shift altgr
+numbersign 0x04 shift
+asciicircum 0x04 altgr
+dead_circumflex 0x04 shift altgr
+dollar 0x05 shift
+dead_breve 0x05 altgr
+breve 0x05 shift altgr
+percent 0x06 shift
+degree 0x06 altgr
+dead_abovering 0x06 shift altgr
+ampersand 0x07 shift
+dead_ogonek 0x07 altgr
+ogonek 0x07 shift altgr
+slash 0x08 shift
+grave 0x08 altgr
+dead_grave 0x08 shift altgr
+parenleft 0x09 shift
+dead_abovedot 0x09 altgr
+abovedot 0x09 shift altgr
+parenright 0x0a shift
+dead_acute 0x0a altgr
+apostrophe 0x0a shift altgr
+equal 0x0b shift
+dead_doubleacute 0x0b altgr
+doubleacute 0x0b shift altgr
+apostrophe 0x0c
+question 0x0c shift
+dead_diaeresis 0x0c altgr
+diaeresis 0x0c shift altgr
+plus 0x0d
+asterisk 0x0d shift
+dead_cedilla 0x0d altgr
+cedilla 0x0d shift altgr
+backslash 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+bar 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+z 0x15 addupper
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+scaron 0x1a
+Scaron 0x1a shift
+division 0x1a altgr
+dead_abovering 0x1a shift altgr
+dstroke 0x1b
+Dstroke 0x1b shift
+multiply 0x1b altgr
+dead_macron 0x1b shift altgr
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+bracketleft 0x21 altgr
+ordfeminine 0x21 shift altgr
+bracketright 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+lstroke 0x25 altgr
+ampersand 0x25 shift altgr
+Lstroke 0x26 altgr
+ccaron 0x27
+Ccaron 0x27 shift
+dead_acute 0x27 altgr
+dead_doubleacute 0x27 shift altgr
+cacute 0x28
+Cacute 0x28 shift
+ssharp 0x28 altgr
+dead_caron 0x28 shift altgr
+dead_cedilla 0x29
+dead_diaeresis 0x29 shift
+notsign 0x29 altgr
+zcaron 0x2b
+Zcaron 0x2b shift
+currency 0x2b altgr
+dead_breve 0x2b shift altgr
+y 0x2c addupper
+guillemotleft 0x2c altgr
+less 0x2c shift altgr
+guillemotright 0x2d altgr
+greater 0x2d shift altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+at 0x2f altgr
+grave 0x2f shift altgr
+braceleft 0x30 altgr
+apostrophe 0x30 shift altgr
+braceright 0x31 altgr
+section 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/hu
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/hu	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/hu	(revision 447)
@@ -0,0 +1,115 @@
+# Hungarian keyboard layout (QWERTZ)
+# Created by: The NeverGone <never@delfin.klte.hu>
+
+include common
+map 0x40e
+
+
+# AltGr keys:
+notsign 0x29 altgr
+asciitilde 0x02 altgr
+caron 0x03 altgr
+asciicircum 0x04 altgr
+breve 0x05 altgr
+degree 0x06 altgr
+ogonek 0x07 altgr
+grave 0x08 altgr
+abovedot 0x09 altgr
+acute 0x0a altgr
+doubleacute 0x0b altgr
+diaeresis 0x0c altgr
+cedilla 0x0d altgr
+backslash 0x10 altgr
+bar 0x11 altgr
+EuroSign 0x12 altgr
+Iacute 0x17 altgr
+division 0x1a altgr
+multiply 0x1b altgr
+dstroke 0x1f altgr
+Dstroke 0x20 altgr
+bracketleft 0x21 altgr
+bracketright 0x22 altgr
+iacute 0x24 altgr
+lstroke 0x25 altgr
+Lstroke 0x26 altgr
+dollar 0x27 altgr
+ssharp 0x28 altgr
+currency 0x2b altgr
+less 0x56 altgr
+greater 0x2c altgr
+numbersign 0x2d altgr
+ampersand 0x2e altgr
+at 0x2f altgr
+braceleft 0x30 altgr
+braceright 0x31 altgr
+semicolon 0x33 altgr
+asterisk 0x35 altgr
+
+
+# Shift keys:
+section 0x29 shift
+apostrophe 0x02 shift
+quotedbl 0x03 shift
+plus 0x04 shift
+exclam 0x05 shift
+percent 0x06 shift
+slash 0x07 shift
+equal 0x08 shift
+parenleft 0x09 shift
+parenright 0x0a shift
+Odiaeresis 0x0b shift
+Udiaeresis 0x0c shift
+Oacute 0x0d shift
+Z 0x15 shift
+Odoubleacute 0x1a shift
+Uacute 0x1b shift
+Eacute 0x27 shift
+Aacute 0x28 shift
+Udoubleacute 0x2b shift
+Y 0x2c shift
+question 0x33 shift
+colon 0x34 shift
+underscore 0x35 shift
+F13 0x3b shift
+F14 0x3c shift
+F15 0x3d shift
+F16 0x3e shift
+F17 0x3f shift
+F18 0x40 shift
+F19 0x41 shift
+F20 0x42 shift
+F21 0x43 shift
+F22 0x44 shift
+F23 0x57 shift
+F24 0x58 shift
+
+
+# Ctrl keys:
+F25 0x3b ctrl
+F26 0x3c ctrl
+F27 0x3d ctrl
+F28 0x3e ctrl
+F29 0x3f ctrl
+F30 0x40 ctrl
+F31 0x41 ctrl
+F32 0x42 ctrl
+F33 0x43 ctrl
+F34 0x44 ctrl
+F35 0x57 ctrl
+#NoSymbol 0x58 ctrl
+
+
+0 0x29
+odiaeresis 0x0b
+udiaeresis 0x0c
+oacute 0x0d
+z 0x15
+odoubleacute 0x1a
+uacute 0x1b
+eacute 0x27
+aacute 0x28
+udoubleacute 0x2b
+y 0x2c
+comma 0x33
+period 0x34
+minus 0x35
Index: /trunk/quest-misc/src/main/resources/keymaps/is
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/is	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/is	(revision 447)
@@ -0,0 +1,140 @@
+# 2004-03-16 Halldór Guðmundsson and Morten Lange 
+# Keyboard definition file for the Icelandic keyboard
+# to be used in rdesktop 1.3.x ( See rdesktop.org) 
+# generated from XKB map de, and changed manually
+# Location for example /usr/local/share/rdesktop/keymaps/is
+include common
+map 0x40f
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+quotedbl 0x03 shift
+twosuperior 0x03 altgr
+oneeighth 0x03 shift altgr
+#section 0x04 shift
+numbersign 0x04 shift
+threesuperior 0x04 altgr
+sterling 0x04 shift altgr
+dollar 0x05 shift
+onequarter 0x05 altgr
+currency 0x05 shift altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+ampersand 0x07 shift
+threequarters 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+parenleft 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+parenright 0x0a shift
+bracketright 0x0a altgr
+plusminus 0x0a shift altgr
+equal 0x0b shift
+braceright 0x0b altgr
+#ssharp 0x0c
+odiaeresis 0x0c
+#question 0x0c shift
+Odiaeresis 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+#acute 0x0d
+minus  0x0d
+#dead_acute 0x0d
+#grave 0x0d shift
+#dead_grave 0x0d shift
+underscore 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+at 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+EuroSign 0x12 altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+#z 0x15 addupper
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+#thorn 0x19 altgr
+#THORN 0x19 shift altgr
+#udiaeresis 0x1a
+#Udiaeresis 0x1a shift
+#dead_diaeresis 0x1a altgr
+#dead_abovering 0x1a shift altgr
+eth 0x1a 
+ETH 0x1a shift 
+apostrophe 0x1b
+question 0x1b shift
+#plus 0x1b
+#asterisk 0x1b shift
+asciitilde 0x1b altgr
+#grave 0x1b altgr
+#dead_tilde 0x1b altgr
+#dead_macron 0x1b shift altgr
+#ae 0x1e altgr
+#AE 0x1e shift altgr
+#eth 0x20 altgr
+#eth 0x20 
+#ETH 0x20 shift altgr
+#ETH 0x20 shift 
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+#adiaeresis 0x27
+#Adiaeresis 0x27 shift
+ae 0x27 
+AE 0x27 shift 
+dead_doubleacute 0x27 altgr
+#adiaeresis 0x28
+#Adiaeresis 0x28 shift
+#dead_caron 0x28 shift altgr
+#asciicircum 0x29
+acute  0x28
+dead_acute 0x28
+#dead_circumflex 0x29
+#degree 0x29 shift
+#notsign 0x29 altgr
+plus 0x2b
+asterisk 0x2b shift
+grave 0x2b altgr
+#numbersign 0x2b
+#apostrophe 0x2b shift
+#dead_breve 0x2b shift altgr
+#y 0x2c addupper
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+#minus 0x35
+#underscore 0x35 shift
+thorn 0x35 
+THORN 0x35 shift 
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
+
Index: /trunk/quest-misc/src/main/resources/keymaps/it
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/it	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/it	(revision 447)
@@ -0,0 +1,115 @@
+# generated from XKB map it
+include common
+map 0x410
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+quotedbl 0x03 shift
+twosuperior 0x03 altgr
+oneeighth 0x03 shift altgr
+sterling 0x04 shift
+threesuperior 0x04 altgr
+dollar 0x05 shift
+onequarter 0x05 altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+ampersand 0x07 shift
+threequarters 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+parenleft 0x09 shift
+trademark 0x09 shift altgr
+parenright 0x0a shift
+plusminus 0x0a shift altgr
+equal 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+apostrophe 0x0c
+question 0x0c shift
+grave 0x0c altgr
+questiondown 0x0c shift altgr
+igrave 0x0d
+asciicircum 0x0d shift
+asciitilde 0x0d altgr
+dead_ogonek 0x0d shift altgr
+at 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+cent 0x12 shift altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+egrave 0x1a
+eacute 0x1a shift
+bracketleft 0x1a altgr
+braceleft 0x1a shift altgr
+plus 0x1b
+asterisk 0x1b shift
+bracketright 0x1b altgr
+braceright 0x1b shift altgr
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+ograve 0x27
+ccedilla 0x27 shift
+at 0x27 altgr
+dead_doubleacute 0x27 shift altgr
+agrave 0x28
+degree 0x28 shift
+numbersign 0x28 altgr
+backslash 0x29
+bar 0x29 shift
+notsign 0x29 altgr
+ugrave 0x2b
+section 0x2b shift
+dead_grave 0x2b altgr
+dead_breve 0x2b shift altgr
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/ja
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/ja	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/ja	(revision 447)
@@ -0,0 +1,119 @@
+# generated from XKB map jp106
+# See OADG Technical reference for official scancodes:
+# http://www.oadg.or.jp/tosho/index.htm#techref
+include common
+map 0xe0010411
+keyboard_type 0x7
+keyboard_subtype 0x2
+keyboard_functionkeys 0xc
+exclam 0x02 shift
+kana_NU 0x02 altgr
+quotedbl 0x03 shift
+kana_FU 0x03 altgr
+numbersign 0x04 shift
+kana_A 0x04 altgr
+kana_a 0x04 shift altgr
+dollar 0x05 shift
+kana_U 0x05 altgr
+kana_u 0x05 shift altgr
+percent 0x06 shift
+kana_E 0x06 altgr
+kana_e 0x06 shift altgr
+ampersand 0x07 shift
+kana_O 0x07 altgr
+kana_o 0x07 shift altgr
+apostrophe 0x08 shift
+kana_YA 0x08 altgr
+kana_ya 0x08 shift altgr
+parenleft 0x09 shift
+kana_YU 0x09 altgr
+kana_yu 0x09 shift altgr
+parenright 0x0a shift
+kana_YO 0x0a altgr
+kana_yo 0x0a shift altgr
+asciitilde 0x0b shift
+kana_WA 0x0b altgr
+kana_WO 0x0b shift altgr
+minus 0x0c
+equal 0x0c shift
+kana_HO 0x0c altgr
+asciicircum 0x0d
+asciitilde 0x0d shift
+kana_HE 0x0d altgr
+kana_TA 0x10 altgr
+kana_TE 0x11 altgr
+kana_I 0x12 altgr
+kana_i 0x12 shift altgr
+kana_SU 0x13 altgr
+kana_KA 0x14 altgr
+kana_N 0x15 altgr
+kana_NA 0x16 altgr
+kana_NI 0x17 altgr
+kana_RA 0x18 altgr
+kana_SE 0x19 altgr
+at 0x1a
+grave 0x1a shift
+voicedsound 0x1a altgr
+bracketleft 0x1b
+braceleft 0x1b shift
+semivoicedsound 0x1b altgr
+kana_openingbracket 0x1b shift altgr
+kana_CHI 0x1e altgr
+kana_TO 0x1f altgr
+kana_SHI 0x20 altgr
+kana_HA 0x21 altgr
+kana_KI 0x22 altgr
+kana_KU 0x23 altgr
+kana_MA 0x24 altgr
+kana_NO 0x25 altgr
+kana_RI 0x26 altgr
+semicolon 0x27
+plus 0x27 shift
+kana_RE 0x27 altgr
+colon 0x28
+asterisk 0x28 shift
+kana_KE 0x28 altgr
+Zenkaku_Hankaku 0x29
+Kanji 0x29
+bracketright 0x2b
+braceright 0x2b shift
+kana_MU 0x2b altgr
+kana_closingbracket 0x2b shift altgr
+kana_TSU 0x2c altgr
+kana_tsu 0x2c shift altgr
+kana_SA 0x2d altgr
+kana_SO 0x2e altgr
+kana_HI 0x2f altgr
+kana_KO 0x30 altgr
+kana_MI 0x31 altgr
+kana_MO 0x32 altgr
+comma 0x33
+less 0x33 shift
+kana_NE 0x33 altgr
+kana_comma 0x33 shift altgr
+period 0x34
+greater 0x34 shift
+kana_RU 0x34 altgr
+kana_fullstop 0x34 shift altgr
+slash 0x35
+question 0x35 shift
+kana_ME 0x35 altgr
+kana_conjunctive 0x35 shift altgr
+Execute 0x54 shift
+backslash 0x73
+bar 0x7d shift
+underscore 0x73 shift
+Henkan_Mode 0x79
+Hiragana_Katakana 0x70 localstate
+Katakana 0x70
+Romaji 0x70
+Muhenkan 0x7b
+# Plain [Eisu_toggle/Caps_Lock] should NOT have shift
+Eisu_toggle 0x3a
+# [Eisu_toggle/Caps_Lock] key will generate Caps_Lock keysym 
+# only with shift+capslock stroke. Windows also expect this, so prefix a shift
+Caps_Lock 0x3a shift
+# Windows,Menu
+F13 0xdc
+Menu 0xdd
+#todo: Alt_R+Romaji doesnt romaji the IME (Alt_L+Romaji works)
Index: /trunk/quest-misc/src/main/resources/keymaps/ko
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/ko	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/ko	(revision 447)
@@ -0,0 +1,37 @@
+# generated from XKB map ko
+include common
+map 0xe0010412
+exclam 0x02 shift
+at 0x03 shift
+numbersign 0x04 shift
+dollar 0x05 shift
+percent 0x06 shift
+asciicircum 0x07 shift
+ampersand 0x08 shift
+asterisk 0x09 shift
+parenleft 0x0a shift
+parenright 0x0b shift
+minus 0x0c
+underscore 0x0c shift
+equal 0x0d
+plus 0x0d shift
+bracketleft 0x1a
+braceleft 0x1a shift
+bracketright 0x1b
+braceright 0x1b shift
+semicolon 0x27
+colon 0x27 shift
+apostrophe 0x28
+quotedbl 0x28 shift
+grave 0x29
+asciitilde 0x29 shift
+backslash 0x2b
+bar 0x2b shift
+comma 0x33
+less 0x33 shift
+period 0x34
+greater 0x34 shift
+slash 0x35
+question 0x35 shift
+Hangul 0xf2
+Hangul_Hanja 0xf1
Index: /trunk/quest-misc/src/main/resources/keymaps/lt
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/lt	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/lt	(revision 447)
@@ -0,0 +1,57 @@
+# generated from XKB map lt
+include common
+map 0x427
+exclam 0x02 shift
+aogonek 0x02 altgr
+Aogonek 0x02 shift altgr
+at 0x03 shift
+ccaron 0x03 altgr
+Ccaron 0x03 shift altgr
+numbersign 0x04 shift
+eogonek 0x04 altgr
+Eogonek 0x04 shift altgr
+dollar 0x05 shift
+eabovedot 0x05 altgr
+Eabovedot 0x05 shift altgr
+percent 0x06 shift
+iogonek 0x06 altgr
+Iogonek 0x06 shift altgr
+asciicircum 0x07 shift
+scaron 0x07 altgr
+Scaron 0x07 shift altgr
+ampersand 0x08 shift
+uogonek 0x08 altgr
+Uogonek 0x08 shift altgr
+asterisk 0x09 shift
+umacron 0x09 altgr
+Umacron 0x09 shift altgr
+parenleft 0x0a shift
+doublelowquotemark 0x0a altgr
+parenright 0x0b shift
+leftdoublequotemark 0x0b altgr
+minus 0x0c
+underscore 0x0c shift
+equal 0x0d
+plus 0x0d shift
+zcaron 0x0d altgr
+Zcaron 0x0d shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+bracketright 0x1b
+braceright 0x1b shift
+semicolon 0x27
+colon 0x27 shift
+apostrophe 0x28
+quotedbl 0x28 shift
+grave 0x29
+asciitilde 0x29 shift
+backslash 0x2b
+bar 0x2b shift
+comma 0x33
+less 0x33 shift
+period 0x34
+greater 0x34 shift
+slash 0x35
+question 0x35 shift
+endash 0x56
+EuroSign 0x56 shift
Index: /trunk/quest-misc/src/main/resources/keymaps/lv
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/lv	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/lv	(revision 447)
@@ -0,0 +1,128 @@
+# generated from XKB map lv
+include common
+map 0x426
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+at 0x03 shift
+twosuperior 0x03 altgr
+oneeighth 0x03 shift altgr
+numbersign 0x04 shift
+threesuperior 0x04 altgr
+sterling 0x04 shift altgr
+dollar 0x05 shift
+EuroSign 0x05 altgr
+cent 0x05 shift altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+asciicircum 0x07 shift
+threequarters 0x07 altgr
+fiveeighths 0x07 shift altgr
+ampersand 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+asterisk 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+parenleft 0x0a shift
+bracketright 0x0a altgr
+plusminus 0x0a shift altgr
+parenright 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+minus 0x0c
+underscore 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+equal 0x0d
+plus 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+at 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+emacron 0x12 altgr
+Emacron 0x12 shift altgr
+rcedilla 0x13 altgr
+Rcedilla 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+umacron 0x16 altgr
+Umacron 0x16 shift altgr
+imacron 0x17 altgr
+Imacron 0x17 shift altgr
+omacron 0x18 altgr
+Omacron 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+bracketright 0x1b
+braceright 0x1b shift
+dead_tilde 0x1b altgr
+dead_macron 0x1b shift altgr
+ISO_Next_Group 0x1c shift
+amacron 0x1e altgr
+Amacron 0x1e shift altgr
+scaron 0x1f altgr
+Scaron 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+gcedilla 0x22 altgr
+Gcedilla 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kcedilla 0x25 altgr
+Kcedilla 0x25 shift altgr
+lcedilla 0x26 altgr
+Lcedilla 0x26 shift altgr
+semicolon 0x27
+colon 0x27 shift
+dead_acute 0x27 altgr
+dead_doubleacute 0x27 shift altgr
+apostrophe 0x28
+quotedbl 0x28 shift
+leftdoublequotemark 0x28 altgr
+doublelowquotemark 0x28 shift altgr
+grave 0x29
+asciitilde 0x29 shift
+notsign 0x29 altgr
+backslash 0x2b
+bar 0x2b shift
+dead_grave 0x2b altgr
+dead_breve 0x2b shift altgr
+zcaron 0x2c altgr
+Zcaron 0x2c shift altgr
+guillemotright 0x2d altgr
+greater 0x2d shift altgr
+ccaron 0x2e altgr
+Ccaron 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+apostrophe 0x30 shift altgr
+ncedilla 0x31 altgr
+Ncedilla 0x31 shift altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+less 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+greater 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+slash 0x35
+question 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
+nobreakspace 0x39 altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/mk
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/mk	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/mk	(revision 447)
@@ -0,0 +1,101 @@
+# generated from XKB map mk
+include common
+map 0x42f
+exclam 0x02 shift
+at 0x03 shift
+doublelowquotemark 0x03 shift altgr
+numbersign 0x04 shift
+leftdoublequotemark 0x04 shift altgr
+dollar 0x05 shift
+percent 0x06 shift
+asciicircum 0x07 shift
+ampersand 0x08 shift
+asterisk 0x09 shift
+parenleft 0x0a shift
+parenright 0x0b shift
+minus 0x0c
+underscore 0x0c shift
+equal 0x0d
+plus 0x0d shift
+Cyrillic_lje 0x10 altgr
+Cyrillic_LJE 0x10 shift altgr
+Cyrillic_nje 0x11 altgr
+Cyrillic_NJE 0x11 shift altgr
+Cyrillic_ie 0x12 altgr
+Cyrillic_IE 0x12 shift altgr
+Cyrillic_er 0x13 altgr
+Cyrillic_ER 0x13 shift altgr
+Cyrillic_te 0x14 altgr
+Cyrillic_TE 0x14 shift altgr
+Macedonia_dse 0x15 altgr
+Macedonia_DSE 0x15 shift altgr
+Cyrillic_u 0x16 altgr
+Cyrillic_U 0x16 shift altgr
+Cyrillic_i 0x17 altgr
+Cyrillic_I 0x17 shift altgr
+Cyrillic_o 0x18 altgr
+Cyrillic_O 0x18 shift altgr
+Cyrillic_pe 0x19 altgr
+Cyrillic_PE 0x19 shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+Cyrillic_sha 0x1a altgr
+Cyrillic_SHA 0x1a shift altgr
+bracketright 0x1b
+braceright 0x1b shift
+Macedonia_gje 0x1b altgr
+Macedonia_GJE 0x1b shift altgr
+Cyrillic_a 0x1e altgr
+Cyrillic_A 0x1e shift altgr
+Cyrillic_es 0x1f altgr
+Cyrillic_ES 0x1f shift altgr
+Cyrillic_de 0x20 altgr
+Cyrillic_DE 0x20 shift altgr
+Cyrillic_ef 0x21 altgr
+Cyrillic_EF 0x21 shift altgr
+Cyrillic_ghe 0x22 altgr
+Cyrillic_GHE 0x22 shift altgr
+Cyrillic_ha 0x23 altgr
+Cyrillic_HA 0x23 shift altgr
+Cyrillic_je 0x24 altgr
+Cyrillic_JE 0x24 shift altgr
+Cyrillic_ka 0x25 altgr
+Cyrillic_KA 0x25 shift altgr
+Cyrillic_el 0x26 altgr
+Cyrillic_EL 0x26 shift altgr
+semicolon 0x27
+colon 0x27 shift
+Cyrillic_che 0x27 altgr
+Cyrillic_CHE 0x27 shift altgr
+apostrophe 0x28
+quotedbl 0x28 shift
+Macedonia_kje 0x28 altgr
+Macedonia_KJE 0x28 shift altgr
+grave 0x29
+asciitilde 0x29 shift
+backslash 0x2b
+bar 0x2b shift
+Cyrillic_zhe 0x2b altgr
+Cyrillic_ZHE 0x2b shift altgr
+Cyrillic_ze 0x2c altgr
+Cyrillic_ZE 0x2c shift altgr
+Cyrillic_dzhe 0x2d altgr
+Cyrillic_DZHE 0x2d shift altgr
+Cyrillic_tse 0x2e altgr
+Cyrillic_TSE 0x2e shift altgr
+Cyrillic_ve 0x2f altgr
+Cyrillic_VE 0x2f shift altgr
+Cyrillic_be 0x30 altgr
+Cyrillic_BE 0x30 shift altgr
+Cyrillic_en 0x31 altgr
+Cyrillic_EN 0x31 shift altgr
+Cyrillic_em 0x32 altgr
+Cyrillic_EM 0x32 shift altgr
+comma 0x33
+less 0x33 shift
+semicolon 0x33 shift altgr
+period 0x34
+greater 0x34 shift
+colon 0x34 shift altgr
+slash 0x35
+question 0x35 shift
Index: /trunk/quest-misc/src/main/resources/keymaps/modifiers
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/modifiers	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/modifiers	(revision 447)
@@ -0,0 +1,18 @@
+Shift_R 0x36
+Shift_L 0x2a
+
+Alt_R 0xb8
+Mode_switch 0xb8
+ISO_Level3_Shift 0xb8
+
+Alt_L 0x38
+
+Control_R 0x9d
+Control_L 0x1d
+
+# Translate Meta, Super and Hyper to Windows keys. 
+# This is hardcoded. See documentation for details. 
+
+# Translate Menu to the Windows Application key. 
+# This one does not work either. 
+Menu 0xdd
Index: /trunk/quest-misc/src/main/resources/keymaps/nl
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/nl	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/nl	(revision 447)
@@ -0,0 +1,60 @@
+# Dutch (Netherlands)
+include common
+map 0x413
+
+exclam 0x02 shift
+onesuperior 0x02 altgr
+quotebl 0x03 shift
+twosuperior 0x03 altgr
+numbersign 0x04 shift
+threesuperior 0x04 altgr
+dollar 0x05 shift
+onequarter 0x05 altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+ampersand 0x07 shift
+threequarters 0x07 altgr
+underscore 0x08 shift
+sterling 0x08 altgr
+parenleft 0x09 shift
+braceleft 0x09 altgr
+parenright 0x0a shift
+braceright 0x0a altgr
+apostrophe 0x0b shift
+slash 0x0c
+question 0x0c shift
+backslash 0x0c altgr
+degree 0x0d
+dead_tilde 0x0d shift
+dead_cedilla 0x0d altgr
+EuroSign 0x12 altgr
+paragraph 0x13 altgr
+dead_diaeresis 0x1a
+dead_circumflex 0x1a shift
+asterisk 0x1b
+bar 0x1b shift
+ssharp 0x1f altgr
+plus 0x27
+plusminus 0x27 shift
+dead_acute 0x28
+dead_grave 0x28 shift
+at 0x29
+section 0x29 shift
+notsign 0x29 altgr
+less 0x2b
+greater 0x2b shift
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+copyright 0x2e altgr 
+mu 0x32 altgr
+comma 0x33
+semicolon 0x33 shift
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+hyphen 0x35
+equal 0x35 shift
+bracketright 0x56
+bracketleft 0x56 shift
+brokenbar 0x56 altgr
+
Index: /trunk/quest-misc/src/main/resources/keymaps/nl-be
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/nl-be	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/nl-be	(revision 447)
@@ -0,0 +1,142 @@
+# Dutch (Belgium)
+map 0x813
+include common
+ampersand 0x02
+1 0x02 shift
+bar 0x02 altgr
+exclamdown 0x02 shift altgr
+eacute 0x03
+2 0x03 shift
+at 0x03 altgr
+oneeighth 0x03 shift altgr
+quotedbl 0x04
+3 0x04 shift
+numbersign 0x04 altgr
+sterling 0x04 shift altgr
+apostrophe 0x05
+4 0x05 shift
+onequarter 0x05 altgr
+dollar 0x05 shift altgr
+parenleft 0x06
+5 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+section 0x07
+6 0x07 shift
+asciicircum 0x07 altgr
+fiveeighths 0x07 shift altgr
+egrave 0x08
+7 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+exclam 0x09
+8 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+ccedilla 0x0a
+9 0x0a shift
+braceleft 0x0a altgr
+plusminus 0x0a shift altgr
+agrave 0x0b
+0 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+parenright 0x0c
+degree 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+minus 0x0d
+underscore 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+a 0x10 addupper
+# at 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+z 0x11 addupper
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+cent 0x12 shift altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+dead_circumflex 0x1a
+dead_diaeresis 0x1a shift
+bracketleft 0x1a altgr
+dead_abovering 0x1a shift altgr
+dollar 0x1b
+asterisk 0x1b shift
+bracketright 0x1b altgr
+dead_macron 0x1b shift altgr
+q 0x1e addupper
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+# ampersand 0x25 shift altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+m 0x27 addupper
+dead_acute 0x27 altgr
+dead_doubleacute 0x27 shift altgr
+ugrave 0x28
+percent 0x28 shift
+dead_acute 0x28 altgr
+dead_caron 0x28 shift altgr
+twosuperior 0x29
+threesuperior 0x29 shift
+notsign 0x29 altgr
+mu 0x2b
+sterling 0x2b shift
+dead_grave 0x2b altgr
+dead_breve 0x2b shift altgr
+w 0x2c addupper
+guillemotleft 0x2c altgr
+less 0x2c shift altgr
+guillemotright 0x2d altgr
+greater 0x2d shift altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+# apostrophe 0x30 shift altgr
+comma 0x32
+question 0x32 shift
+dead_cedilla 0x32 altgr
+masculine 0x32 shift altgr
+semicolon 0x33
+period 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+colon 0x34
+slash 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+equal 0x35
+plus 0x35 shift
+dead_tilde 0x35 altgr
+dead_abovedot 0x35 shift altgr
+backslash 0x56 altgr
+less 0x56 
+greater 0x56 shift
Index: /trunk/quest-misc/src/main/resources/keymaps/no
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/no	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/no	(revision 447)
@@ -0,0 +1,119 @@
+# generated from XKB map no
+include common
+map 0x414
+exclam 0x02 shift
+exclamdown 0x02 altgr
+onesuperior 0x02 shift altgr
+quotedbl 0x03 shift
+at 0x03 altgr
+twosuperior 0x03 shift altgr
+numbersign 0x04 shift
+sterling 0x04 altgr
+threesuperior 0x04 shift altgr
+currency 0x05 shift
+dollar 0x05 altgr
+onequarter 0x05 shift altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+cent 0x06 shift altgr
+ampersand 0x07 shift
+yen 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+braceleft 0x08 altgr
+division 0x08 shift altgr
+parenleft 0x09 shift
+bracketleft 0x09 altgr
+guillemotleft 0x09 shift altgr
+parenright 0x0a shift
+bracketright 0x0a altgr
+guillemotright 0x0a shift altgr
+equal 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+plus 0x0c
+question 0x0c shift
+plusminus 0x0c altgr
+questiondown 0x0c shift altgr
+backslash 0x0d
+dead_grave 0x0d shift
+dead_acute 0x0d altgr
+notsign 0x0d shift altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+cent 0x12 shift altgr
+registered 0x13 altgr
+thorn 0x14 altgr
+THORN 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oe 0x18 altgr
+OE 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+aring 0x1a
+Aring 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+dead_diaeresis 0x1b
+dead_circumflex 0x1b shift
+asciicircum 0x01b shift
+dead_tilde 0x1b altgr
+asciitilde 0x1b altgr
+dead_caron 0x1b shift altgr
+ordfeminine 0x1e altgr
+masculine 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+oslash 0x27
+Ooblique 0x27 shift
+dead_doubleacute 0x27 shift altgr
+ae 0x28
+AE 0x28 shift
+dead_caron 0x28 shift altgr
+bar 0x29
+section 0x29 shift
+brokenbar 0x29 altgr
+paragraph 0x29 shift altgr
+apostrophe 0x2b
+asterisk 0x2b shift
+multiply 0x2b shift altgr
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+copyright 0x2e altgr
+leftdoublequotemark 0x2f altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+dead_cedilla 0x33 altgr
+dead_ogonek 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+dead_abovedot 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+hyphen 0x35 altgr
+macron 0x35 shift altgr
+nobreakspace 0x39 altgr
+onehalf 0x56 altgr
+threequarters 0x56 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/pl
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/pl	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/pl	(revision 447)
@@ -0,0 +1,122 @@
+# generated from XKB map pl
+include common
+map 0x415
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+at 0x03 shift
+twosuperior 0x03 altgr
+oneeighth 0x03 shift altgr
+numbersign 0x04 shift
+threesuperior 0x04 altgr
+sterling 0x04 shift altgr
+dollar 0x05 shift
+onequarter 0x05 altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+asciicircum 0x07 shift
+threequarters 0x07 altgr
+fiveeighths 0x07 shift altgr
+ampersand 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+asterisk 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+parenleft 0x0a shift
+bracketright 0x0a altgr
+plusminus 0x0a shift altgr
+parenright 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+minus 0x0c
+underscore 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+equal 0x0d
+plus 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+eogonek 0x12 altgr
+Eogonek 0x12 shift altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+EuroSign 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oacute 0x18 altgr
+Oacute 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+bracketright 0x1b
+braceright 0x1b shift
+dead_tilde 0x1b altgr
+dead_macron 0x1b shift altgr
+aogonek 0x1e altgr
+Aogonek 0x1e shift altgr
+sacute 0x1f altgr
+Sacute 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+semicolon 0x27
+colon 0x27 shift
+dead_acute 0x27 altgr
+dead_doubleacute 0x27 shift altgr
+apostrophe 0x28
+quotedbl 0x28 shift
+dead_circumflex 0x28 altgr
+dead_caron 0x28 shift altgr
+grave 0x29
+asciitilde 0x29 shift
+notsign 0x29 altgr
+backslash 0x2b
+bar 0x2b shift
+dead_grave 0x2b altgr
+dead_breve 0x2b shift altgr
+zabovedot 0x2c altgr
+Zabovedot 0x2c shift altgr
+zacute 0x2d altgr
+Zacute 0x2d shift altgr
+cacute 0x2e altgr
+Cacute 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+nacute 0x31 altgr
+Nacute 0x31 shift altgr
+mu 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+less 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+greater 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+slash 0x35
+question 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/pt
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/pt	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/pt	(revision 447)
@@ -0,0 +1,113 @@
+# generated from XKB map pt
+include common
+map 0x816
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+quotedbl 0x03 shift
+at 0x03 altgr
+oneeighth 0x03 shift altgr
+numbersign 0x04 shift
+sterling 0x04 altgr
+dollar 0x05 shift
+section 0x05 altgr
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+ampersand 0x07 shift
+threequarters 0x07 altgr
+fiveeighths 0x07 shift altgr
+slash 0x08 shift
+braceleft 0x08 altgr
+seveneighths 0x08 shift altgr
+parenleft 0x09 shift
+bracketleft 0x09 altgr
+trademark 0x09 shift altgr
+parenright 0x0a shift
+bracketright 0x0a altgr
+plusminus 0x0a shift altgr
+equal 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+apostrophe 0x0c
+question 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+guillemotleft 0x0d
+guillemotright 0x0d shift
+dead_cedilla 0x0d altgr
+dead_ogonek 0x0d shift altgr
+Greek_OMEGA 0x10 shift altgr
+lstroke 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+cent 0x12 shift altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+plus 0x1a
+asterisk 0x1a shift
+dead_diaeresis 0x1a altgr
+dead_abovering 0x1a shift altgr
+dead_acute 0x1b
+dead_grave 0x1b shift
+dead_tilde 0x1b altgr
+dead_macron 0x1b shift altgr
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+dstroke 0x21 altgr
+ordfeminine 0x21 shift altgr
+eng 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+kra 0x25 altgr
+lstroke 0x26 altgr
+Lstroke 0x26 shift altgr
+ccedilla 0x27
+Ccedilla 0x27 shift
+dead_doubleacute 0x27 shift altgr
+masculine 0x28
+ordfeminine 0x28 shift
+dead_circumflex 0x28 altgr
+dead_caron 0x28 shift altgr
+backslash 0x29
+bar 0x29 shift
+notsign 0x29 altgr
+dead_tilde 0x2b
+dead_circumflex 0x2b shift
+dead_breve 0x2b shift altgr
+less 0x56
+greater 0x56 shift
+cent 0x2e altgr
+copyright 0x2e shift altgr
+leftdoublequotemark 0x2f altgr
+grave 0x2f shift altgr
+rightdoublequotemark 0x30 altgr
+mu 0x32 altgr
+comma 0x33
+semicolon 0x33 shift
+horizconnector 0x33 altgr
+multiply 0x33 shift altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+minus 0x35
+underscore 0x35 shift
+dead_belowdot 0x35 altgr
+dead_abovedot 0x35 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/pt-br
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/pt-br	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/pt-br	(revision 447)
@@ -0,0 +1,69 @@
+# generated from XKB map br
+include common
+map 0x416
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+at 0x03 shift
+twosuperior 0x03 altgr
+onehalf 0x03 shift altgr
+numbersign 0x04 shift
+threesuperior 0x04 altgr
+threequarters 0x04 shift altgr
+dollar 0x05 shift
+sterling 0x05 altgr
+onequarter 0x05 shift altgr
+percent 0x06 shift
+cent 0x06 altgr
+dead_diaeresis 0x07 shift
+notsign 0x07 altgr
+diaeresis 0x07 shift altgr
+ampersand 0x08 shift
+braceleft 0x08 altgr
+asterisk 0x09 shift
+bracketleft 0x09 altgr
+parenleft 0x0a shift
+bracketright 0x0a altgr
+parenright 0x0b shift
+braceright 0x0b altgr
+minus 0x0c
+underscore 0x0c shift
+backslash 0x0c altgr
+equal 0x0d
+plus 0x0d shift
+section 0x0d altgr
+EuroSign 0x12 altgr
+registered 0x13 altgr
+dead_acute 0x1a
+dead_grave 0x1a shift
+acute 0x1a altgr
+grave 0x1a shift altgr
+bracketleft 0x1b
+braceleft 0x1b shift
+ordfeminine 0x1b altgr
+ccedilla 0x27
+Ccedilla 0x27 shift
+dead_tilde 0x28
+dead_circumflex 0x28 shift
+asciitilde 0x28 altgr
+asciicircum 0x28 shift altgr
+apostrophe 0x29
+quotedbl 0x29 shift
+bracketright 0x2b
+braceright 0x2b shift
+masculine 0x2b altgr
+copyright 0x2e altgr
+mu 0x32 altgr
+comma 0x33
+less 0x33 shift
+period 0x34
+greater 0x34 shift
+semicolon 0x35
+colon 0x35 shift
+comma 0x53 numlock
+backslash 0x56
+bar 0x56 shift
+slash 0x73
+question 0x73 shift
+degree 0x73 altgr
+KP_Decimal 0x34
Index: /trunk/quest-misc/src/main/resources/keymaps/ru
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/ru	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/ru	(revision 447)
@@ -0,0 +1,109 @@
+# generated from XKB map ru
+include common
+map 0x419
+exclam 0x02 shift
+at 0x03 shift
+quotedbl 0x03 shift altgr
+numbersign 0x04 shift
+dollar 0x05 shift
+asterisk 0x05 shift altgr
+percent 0x06 shift
+colon 0x06 shift altgr
+asciicircum 0x07 shift
+comma 0x07 shift altgr
+ampersand 0x08 shift
+period 0x08 shift altgr
+asterisk 0x09 shift
+semicolon 0x09 shift altgr
+parenleft 0x0a shift
+parenright 0x0b shift
+minus 0x0c
+underscore 0x0c shift
+equal 0x0d
+plus 0x0d shift
+Cyrillic_shorti 0x10 altgr
+Cyrillic_SHORTI 0x10 shift altgr
+Cyrillic_tse 0x11 altgr
+Cyrillic_TSE 0x11 shift altgr
+Cyrillic_u 0x12 altgr
+Cyrillic_U 0x12 shift altgr
+Cyrillic_ka 0x13 altgr
+Cyrillic_KA 0x13 shift altgr
+Cyrillic_ie 0x14 altgr
+Cyrillic_IE 0x14 shift altgr
+Cyrillic_en 0x15 altgr
+Cyrillic_EN 0x15 shift altgr
+Cyrillic_ghe 0x16 altgr
+Cyrillic_GHE 0x16 shift altgr
+Cyrillic_sha 0x17 altgr
+Cyrillic_SHA 0x17 shift altgr
+Cyrillic_shcha 0x18 altgr
+Cyrillic_SHCHA 0x18 shift altgr
+Cyrillic_ze 0x19 altgr
+Cyrillic_ZE 0x19 shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+Cyrillic_ha 0x1a altgr
+Cyrillic_HA 0x1a shift altgr
+bracketright 0x1b
+braceright 0x1b shift
+Cyrillic_hardsign 0x1b altgr
+Cyrillic_HARDSIGN 0x1b shift altgr
+Cyrillic_ef 0x1e altgr
+Cyrillic_EF 0x1e shift altgr
+Cyrillic_yeru 0x1f altgr
+Cyrillic_YERU 0x1f shift altgr
+Cyrillic_ve 0x20 altgr
+Cyrillic_VE 0x20 shift altgr
+Cyrillic_a 0x21 altgr
+Cyrillic_A 0x21 shift altgr
+Cyrillic_pe 0x22 altgr
+Cyrillic_PE 0x22 shift altgr
+Cyrillic_er 0x23 altgr
+Cyrillic_ER 0x23 shift altgr
+Cyrillic_o 0x24 altgr
+Cyrillic_O 0x24 shift altgr
+Cyrillic_el 0x25 altgr
+Cyrillic_EL 0x25 shift altgr
+Cyrillic_de 0x26 altgr
+Cyrillic_DE 0x26 shift altgr
+semicolon 0x27
+colon 0x27 shift
+Cyrillic_zhe 0x27 altgr
+Cyrillic_ZHE 0x27 shift altgr
+apostrophe 0x28
+quotedbl 0x28 shift
+Cyrillic_e 0x28 altgr
+Cyrillic_E 0x28 shift altgr
+grave 0x29
+asciitilde 0x29 shift
+Cyrillic_io 0x29 altgr
+Cyrillic_IO 0x29 shift altgr
+backslash 0x2b
+bar 0x2b shift
+Cyrillic_ya 0x2c altgr
+Cyrillic_YA 0x2c shift altgr
+Cyrillic_che 0x2d altgr
+Cyrillic_CHE 0x2d shift altgr
+Cyrillic_es 0x2e altgr
+Cyrillic_ES 0x2e shift altgr
+Cyrillic_em 0x2f altgr
+Cyrillic_EM 0x2f shift altgr
+Cyrillic_i 0x30 altgr
+Cyrillic_I 0x30 shift altgr
+Cyrillic_te 0x31 altgr
+Cyrillic_TE 0x31 shift altgr
+Cyrillic_softsign 0x32 altgr
+Cyrillic_SOFTSIGN 0x32 shift altgr
+comma 0x33
+less 0x33 shift
+Cyrillic_be 0x33 altgr
+Cyrillic_BE 0x33 shift altgr
+period 0x34
+greater 0x34 shift
+Cyrillic_yu 0x34 altgr
+Cyrillic_YU 0x34 shift altgr
+slash 0x35
+question 0x35 shift
+slash 0x56 altgr
+bar 0x56 shift altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/sl
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/sl	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/sl	(revision 447)
@@ -0,0 +1,110 @@
+# generated from XKB map sl
+include common
+map 0x424
+exclam 0x02 shift
+asciitilde 0x02 altgr
+dead_tilde 0x02 shift altgr
+quotedbl 0x03 shift
+dead_caron 0x03 altgr
+caron 0x03 shift altgr
+numbersign 0x04 shift
+asciicircum 0x04 altgr
+dead_circumflex 0x04 shift altgr
+dollar 0x05 shift
+dead_breve 0x05 altgr
+breve 0x05 shift altgr
+percent 0x06 shift
+degree 0x06 altgr
+dead_abovering 0x06 shift altgr
+ampersand 0x07 shift
+dead_ogonek 0x07 altgr
+ogonek 0x07 shift altgr
+slash 0x08 shift
+grave 0x08 altgr
+dead_grave 0x08 shift altgr
+parenleft 0x09 shift
+dead_abovedot 0x09 altgr
+abovedot 0x09 shift altgr
+parenright 0x0a shift
+dead_acute 0x0a altgr
+equal 0x0b shift
+dead_doubleacute 0x0b altgr
+doubleacute 0x0b shift altgr
+apostrophe 0x0c
+question 0x0c shift
+dead_diaeresis 0x0c altgr
+diaeresis 0x0c shift altgr
+plus 0x0d
+asterisk 0x0d shift
+dead_cedilla 0x0d altgr
+cedilla 0x0d shift altgr
+backslash 0x10 altgr
+Greek_OMEGA 0x10 shift altgr
+bar 0x11 altgr
+Lstroke 0x11 shift altgr
+EuroSign 0x12 altgr
+paragraph 0x13 altgr
+registered 0x13 shift altgr
+tslash 0x14 altgr
+Tslash 0x14 shift altgr
+z 0x15 addupper
+leftarrow 0x15 altgr
+yen 0x15 shift altgr
+downarrow 0x16 altgr
+uparrow 0x16 shift altgr
+rightarrow 0x17 altgr
+idotless 0x17 shift altgr
+oslash 0x18 altgr
+Ooblique 0x18 shift altgr
+thorn 0x19 altgr
+THORN 0x19 shift altgr
+scaron 0x1a
+Scaron 0x1a shift
+division 0x1a altgr
+dstroke 0x1b
+Dstroke 0x1b shift
+multiply 0x1b altgr
+dead_macron 0x1b shift altgr
+ae 0x1e altgr
+AE 0x1e shift altgr
+ssharp 0x1f altgr
+section 0x1f shift altgr
+eth 0x20 altgr
+ETH 0x20 shift altgr
+bracketleft 0x21 altgr
+ordfeminine 0x21 shift altgr
+bracketright 0x22 altgr
+ENG 0x22 shift altgr
+hstroke 0x23 altgr
+Hstroke 0x23 shift altgr
+lstroke 0x25 altgr
+Lstroke 0x26 altgr
+ccaron 0x27
+Ccaron 0x27 shift
+cacute 0x28
+Cacute 0x28 shift
+ssharp 0x28 altgr
+dead_cedilla 0x29
+notsign 0x29 altgr
+zcaron 0x2b
+Zcaron 0x2b shift
+currency 0x2b altgr
+y 0x2c addupper
+guillemotleft 0x2c altgr
+guillemotright 0x2d altgr
+cent 0x2e altgr
+copyright 0x2e shift altgr
+at 0x2f altgr
+braceleft 0x30 altgr
+braceright 0x31 altgr
+section 0x32 altgr
+masculine 0x32 shift altgr
+comma 0x33
+semicolon 0x33 shift
+horizconnector 0x33 altgr
+period 0x34
+colon 0x34 shift
+periodcentered 0x34 altgr
+minus 0x35
+underscore 0x35 shift
+dead_belowdot 0x35 altgr
Index: /trunk/quest-misc/src/main/resources/keymaps/sv
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/sv	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/sv	(revision 447)
@@ -0,0 +1,80 @@
+map 0x0000041d
+include common
+
+#
+# Top row
+#
+section 0x29
+onehalf 0x29 shift
+
+# 1
+exclam 0x2 shift
+
+# 2
+quotedbl 0x3 shift
+at 0x3 altgr
+
+# 3
+numbersign 0x4 shift
+sterling 0x4 altgr
+# 4
+currency 0x5 shift
+dollar 0x5 altgr
+# 5
+percent 0x6 shift
+# 6
+ampersand 0x7 shift
+# 7
+slash 0x8 shift
+braceleft 0x8 altgr
+# 8
+parenleft 0x9 shift
+bracketleft 0x9 altgr
+# 9
+parenright 0xa shift
+bracketright 0xa altgr
+# 0
+equal 0xb shift
+braceright 0xb altgr
+
+plus 0xc
+question 0xc shift
+backslash 0xc altgr
+
+dead_acute 0xd
+dead_grave 0xd shift
+
+#
+# QWERTY first row
+#
+EuroSign 0x12 altgr
+aring 0x1a 
+Aring 0x1a shift
+dead_diaeresis 0x1b 
+dead_circumflex 0x1b shift
+dead_tilde 0x1b altgr
+
+#
+# QWERTY second row
+#
+odiaeresis 0x27 
+Odiaeresis 0x27 shift
+adiaeresis 0x28 
+Adiaeresis 0x28 shift
+apostrophe 0x2b
+asterisk 0x2b shift
+
+#
+# QWERTY third row
+#
+less 0x56
+greater 0x56 shift
+bar 0x56 altgr
+mu 0x32 altgr
+comma 0x33
+semicolon 0x33 shift
+period 0x34
+colon 0x34 shift
+minus 0x35
+underscore 0x35 shift
+
Index: /trunk/quest-misc/src/main/resources/keymaps/th
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/th	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/th	(revision 447)
@@ -0,0 +1,131 @@
+# generated from XKB map th
+include common
+map 0x41e
+exclam 0x02 shift
+Thai_lakkhangyao 0x02 altgr
+plus 0x02 shift altgr
+at 0x03 shift
+slash 0x03 altgr
+Thai_leknung 0x03 shift altgr
+numbersign 0x04 shift
+minus 0x04 altgr
+Thai_leksong 0x04 shift altgr
+dollar 0x05 shift
+Thai_phosamphao 0x05 altgr
+Thai_leksam 0x05 shift altgr
+percent 0x06 shift
+Thai_thothung 0x06 altgr
+Thai_leksi 0x06 shift altgr
+asciicircum 0x07 shift
+Thai_sarau 0x07 altgr
+Thai_sarauu 0x07 shift altgr
+ampersand 0x08 shift
+Thai_saraue 0x08 altgr
+Thai_baht 0x08 shift altgr
+asterisk 0x09 shift
+Thai_khokhwai 0x09 altgr
+Thai_lekha 0x09 shift altgr
+parenleft 0x0a shift
+Thai_totao 0x0a altgr
+Thai_lekhok 0x0a shift altgr
+parenright 0x0b shift
+Thai_chochan 0x0b altgr
+Thai_lekchet 0x0b shift altgr
+minus 0x0c
+underscore 0x0c shift
+Thai_khokhai 0x0c altgr
+Thai_lekpaet 0x0c shift altgr
+equal 0x0d
+plus 0x0d shift
+Thai_chochang 0x0d altgr
+Thai_lekkao 0x0d shift altgr
+Thai_maiyamok 0x10 altgr
+Thai_leksun 0x10 shift altgr
+Thai_saraaimaimalai 0x11 altgr
+quotedbl 0x11 shift altgr
+Thai_saraam 0x12 altgr
+Thai_dochada 0x12 shift altgr
+Thai_phophan 0x13 altgr
+Thai_thonangmontho 0x13 shift altgr
+Thai_saraa 0x14 altgr
+Thai_thothong 0x14 shift altgr
+Thai_maihanakat 0x15 altgr
+Thai_nikhahit 0x15 shift altgr
+Thai_saraii 0x16 altgr
+Thai_maitri 0x16 shift altgr
+Thai_rorua 0x17 altgr
+Thai_nonen 0x17 shift altgr
+Thai_nonu 0x18 altgr
+Thai_paiyannoi 0x18 shift altgr
+Thai_yoyak 0x19 altgr
+Thai_yoying 0x19 shift altgr
+bracketleft 0x1a
+braceleft 0x1a shift
+Thai_bobaimai 0x1a altgr
+Thai_thothan 0x1a shift altgr
+bracketright 0x1b
+braceright 0x1b shift
+Thai_loling 0x1b altgr
+comma 0x1b shift altgr
+Thai_fofan 0x1e altgr
+Thai_ru 0x1e shift altgr
+Thai_hohip 0x1f altgr
+Thai_khorakhang 0x1f shift altgr
+Thai_kokai 0x20 altgr
+Thai_topatak 0x20 shift altgr
+Thai_dodek 0x21 altgr
+Thai_sarao 0x21 shift altgr
+Thai_sarae 0x22 altgr
+Thai_chochoe 0x22 shift altgr
+Thai_maitho 0x23 altgr
+Thai_maitaikhu 0x23 shift altgr
+Thai_maiek 0x24 altgr
+Thai_maichattawa 0x24 shift altgr
+Thai_saraaa 0x25 altgr
+Thai_sorusi 0x25 shift altgr
+Thai_sosua 0x26 altgr
+Thai_sosala 0x26 shift altgr
+semicolon 0x27
+colon 0x27 shift
+Thai_wowaen 0x27 altgr
+Thai_soso 0x27 shift altgr
+apostrophe 0x28
+quotedbl 0x28 shift
+Thai_ngongu 0x28 altgr
+period 0x28 shift altgr
+grave 0x29
+asciitilde 0x29 shift
+underscore 0x29 altgr
+percent 0x29 shift altgr
+ISO_First_Group 0x2a shift
+backslash 0x2b
+bar 0x2b shift
+Thai_khokhuat 0x2b altgr
+Thai_khokhon 0x2b shift altgr
+Thai_phophung 0x2c altgr
+parenleft 0x2c shift altgr
+Thai_popla 0x2d altgr
+parenright 0x2d shift altgr
+Thai_saraae 0x2e altgr
+Thai_choching 0x2e shift altgr
+Thai_oang 0x2f altgr
+Thai_honokhuk 0x2f shift altgr
+Thai_sarai 0x30 altgr
+Thai_phinthu 0x30 shift altgr
+Thai_sarauee 0x31 altgr
+Thai_thanthakhat 0x31 shift altgr
+Thai_thothahan 0x32 altgr
+question 0x32 shift altgr
+comma 0x33
+less 0x33 shift
+Thai_moma 0x33 altgr
+Thai_thophuthao 0x33 shift altgr
+period 0x34
+greater 0x34 shift
+Thai_saraaimaimuan 0x34 altgr
+Thai_lochula 0x34 shift altgr
+slash 0x35
+question 0x35 shift
+Thai_fofa 0x35 altgr
+Thai_lu 0x35 shift altgr
+ISO_Last_Group 0x36 shift
Index: /trunk/quest-misc/src/main/resources/keymaps/tr
===================================================================
--- /trunk/quest-misc/src/main/resources/keymaps/tr	(revision 447)
+++ /trunk/quest-misc/src/main/resources/keymaps/tr	(revision 447)
@@ -0,0 +1,138 @@
+# rdesktop Turkish Q Keyboard Layout
+#
+# Modified by Umit Oztosun <umit@liqia.com> 20040328
+#
+# Modified from the original mapping file provided with rdesktop 1.3.1.
+# This version works correctly with the right X settings.
+
+include common
+map 0x41f
+
+# First row
+quotedbl 0x29
+eacute 0x29 shift
+backslash 0x29 altgr
+
+exclam 0x02 shift
+onesuperior 0x02 altgr
+exclamdown 0x02 shift altgr
+
+apostrophe 0x03 shift
+sterling 0x03 altgr
+twosuperior 0x03 shift altgr
+
+dead_circumflex 0x04 shift
+numbersign 0x04 altgr
+threesuperior 0x04 shift altgr
+
+plus 0x05 shift
+dollar 0x05 altgr
+onequarter 0x05 shift altgr
+
+percent 0x06 shift
+onehalf 0x06 altgr
+threeeighths 0x06 shift altgr
+
+ampersand 0x07 shift
+threequarters 0x07 altgr
+
+slash 0x08 shift
+braceleft 0x08 altgr
+
+parenleft 0x09 shift
+bracketleft 0x09 altgr
+
+parenright 0x0a shift
+bracketright 0x0a altgr
+plusminus 0x0a shift altgr
+
+equal 0x0b shift
+braceright 0x0b altgr
+degree 0x0b shift altgr
+
+asterisk 0x0c
+question 0x0c shift
+backslash 0x0c altgr
+questiondown 0x0c shift altgr
+
+minus 0x0d
+underscore 0x0d shift
+division 0x0d altgr
+
+at 0x10 altgr
+
+EuroSign 0x12 altgr
+
+trademark 0x14 altgr
+
+ucircumflex 0x16 altgr
+Ucircumflex 0x16 shift altgr
+
+idotless 0x17
+I 0x17 shift
+icircumflex 0x17 altgr
+Icircumflex 0x17 altgr shift
+
+ocircumflex 0x18 altgr
+Ocircumflex 0x18 shift altgr
+
+gbreve 0x1a
+Gbreve 0x1a shift
+
+udiaeresis 0x1b
+Udiaeresis 0x1b shift
+asciitilde 0x1b altgr
+dead_macron 0x1b shift altgr
+
+comma 0x2b
+semicolon 0x2b shift
+grave 0x2b altgr
+dead_grave 0x2b altgr shift
+
+# Second row
+
+acircumflex 0x1e altgr
+Acircumflex 0x1e shift altgr
+
+section 0x1f altgr
+
+ordfeminine 0x21 altgr
+
+scedilla 0x27
+Scedilla 0x27 shift
+acute 0x27 altgr
+dead_acute 0x27 shift altgr
+
+i 0x28
+Iabovedot 0x28 shift
+dead_caron 0x28 shift altgr
+
+less 0x56
+greater 0x56 shift
+bar 0x56 altgr
+brokenbar 0x56 shift altgr
+
+cent 0x2e altgr
+copyright 0x2e shift altgr
+
+leftdoublequotemark 0x2f altgr
+
+rightdoublequotemark 0x30 altgr
+
+mu 0x32 altgr
+masculine 0x32 shift altgr
+
+odiaeresis 0x33
+Odiaeresis 0x33 shift
+multiply 0x33 altgr
+
+ccedilla 0x34
+Ccedilla 0x34 shift
+periodcentered 0x34 altgr
+division 0x34 shift altgr
+
+period 0x35
+colon 0x35 shift
+dead_abovedot 0x35 altgr
+dead_abovedot 0x35 shift altgr
+
Index: /trunk/quest-misc/src/test/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMapTest.java
===================================================================
--- /trunk/quest-misc/src/test/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMapTest.java	(revision 447)
+++ /trunk/quest-misc/src/test/java/de/ugoe/cs/tasktree/keyboardmaps/KeyboardMapTest.java	(revision 447)
@@ -0,0 +1,456 @@
+//-------------------------------------------------------------------------------------------------
+// Module    : $RCSfile: KeyboardMapTest.java,v $
+// Version   : $Revision: 0.0 $  $Author: patrick $  $Date: 11.07.2012 $
+// Project   : KeyboardMaps
+// Creation  : 2012 by patrick
+// Copyright : Patrick Harms, 2012
+//-------------------------------------------------------------------------------------------------
+package de.ugoe.cs.tasktree.keyboardmaps;
+
+import static org.junit.Assert.*;
+
+import java.util.Locale;
+
+import org.junit.Before;
+import org.junit.Test;
+
+//-------------------------------------------------------------------------------------------------
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 11.07.2012$
+ * @author 2012, last modified by $Author: patrick$
+ */
+//-------------------------------------------------------------------------------------------------
+public class KeyboardMapTest
+{
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  @Before
+  public void setUp()
+  {
+    //Logger.getLogger("").getHandlers()[0].setFormatter(new SimpleLogFormatter());
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  @Test
+  public void testInitialization()
+  {
+    KeyboardMap map = KeyboardMapFactory.createKeyboardMap(Locale.ENGLISH);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.FRENCH);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.GERMAN);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.ITALIAN);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.JAPANESE);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.KOREAN);
+    assertNotNull(map);
+    
+    try
+    {
+      map = KeyboardMapFactory.createKeyboardMap(Locale.CHINESE);
+      fail("expected exception did not occur");
+    }
+    catch (IllegalArgumentException e)
+    {
+      // was expected and is ignored
+    }
+    
+    try
+    {
+      map = KeyboardMapFactory.createKeyboardMap(Locale.SIMPLIFIED_CHINESE);
+      fail("expected exception did not occur");
+    }
+    catch (IllegalArgumentException e)
+    {
+      // was expected and is ignored
+    }
+    
+    try
+    {
+      map = KeyboardMapFactory.createKeyboardMap(Locale.TRADITIONAL_CHINESE);
+      fail("expected exception did not occur");
+    }
+    catch (IllegalArgumentException e)
+    {
+      // was expected and is ignored
+    }
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.FRANCE);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.GERMANY);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.ITALY);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.JAPAN);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.KOREA);
+    assertNotNull(map);
+    
+    try
+    {
+      map = KeyboardMapFactory.createKeyboardMap(Locale.CHINA);
+      fail("expected exception did not occur");
+    }
+    catch (IllegalArgumentException e)
+    {
+      // was expected and is ignored
+    }
+    
+    try
+    {
+      map = KeyboardMapFactory.createKeyboardMap(Locale.PRC);
+      fail("expected exception did not occur");
+    }
+    catch (IllegalArgumentException e)
+    {
+      // was expected and is ignored
+    }
+    
+    try
+    {
+      map = KeyboardMapFactory.createKeyboardMap(Locale.TAIWAN);
+      fail("expected exception did not occur");
+    }
+    catch (IllegalArgumentException e)
+    {
+      // was expected and is ignored
+    }
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.UK);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.US);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.CANADA);
+    assertNotNull(map);
+    
+    map = KeyboardMapFactory.createKeyboardMap(Locale.CANADA_FRENCH);
+    assertNotNull(map);
+
+    map = KeyboardMapFactory.createKeyboardMap(Locale.GERMAN);
+    assertNotNull(map);
+    
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  @Test
+  public void testGermanKeyboardMap()
+  {
+    KeyboardMap map = KeyboardMapFactory.createKeyboardMap(Locale.GERMAN);
+    assertNotNull(map);
+    
+    assertCombinations(map, VirtualKey.DIGIT_1, '1', '!', '¹', '¡', true);
+    assertCombinations(map, VirtualKey.EXCLAMATION_MARK, '1', '!', '¹', '¡', true);
+    assertCombinations(map, VirtualKey.INVERTED_EXCLAMATION_MARK, '1', '!', '¹', '¡', true);
+    
+    assertCombinations(map, VirtualKey.DIGIT_2, '2', '"', '²', '⅛', true);
+    assertCombinations(map, VirtualKey.QUOTEDBL, '2', '"', '²', '⅛', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_3, '3', '§', '³', '£', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_4, '4', '$', '¼', '¤', true);
+    assertCombinations(map, VirtualKey.DOLLAR, '4', '$', '¼', '¤', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_5, '5', '%', '½', '⅜', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_6, '6', '&', '¾', '⅝', true);
+    assertCombinations(map, VirtualKey.AMPERSAND, '6', '&', '¾', '⅝', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_7, '7', '/', '{', '⅞', true);
+    assertCombinations(map, VirtualKey.SLASH, '7', '/', '{', '⅞', true);
+    assertCombinations(map, VirtualKey.BRACELEFT, '7', '/', '{', '⅞', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_8, '8', '(', '[', '™', true);
+    assertCombinations(map, VirtualKey.LEFT_PARENTHESIS, '8', '(', '[', '™', true);
+    assertCombinations(map, VirtualKey.OPEN_BRACKET, '8', '(', '[', '™', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_9, '9', ')', ']', '±', true);
+    assertCombinations(map, VirtualKey.RIGHT_PARENTHESIS, '9', ')', ']', '±', true);
+    assertCombinations(map, VirtualKey.CLOSE_BRACKET, '9', ')', ']', '±', true);
+
+    assertCombinations(map, VirtualKey.DIGIT_0, '0', '=', '}', 0, true);
+    assertCombinations(map, VirtualKey.EQUALS, '0', '=', '}', 0, true);
+    assertCombinations(map, VirtualKey.BRACERIGHT, '0', '=', '}', 0, true);
+
+    assertCombinations(map, VirtualKey.BACK_SLASH, 'ß', '?', '\\', '¿', true);
+
+    assertCombinations(map, VirtualKey.LETTER_Q, 'q', 'Q', '@', 'Ω', true);
+    assertCombinations(map, VirtualKey.AT, 'q', 'Q', '@', 'Ω', true);
+
+    assertCombinations(map, VirtualKey.LETTER_W, 'w', 'W', 0, 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_E, 'e', 'E', '€', 0, true);
+    assertCombinations(map, VirtualKey.EURO_SIGN, 'e', 'E', '€', 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_R, 'r', 'R', 0, '®', true);
+
+    assertCombinations(map, VirtualKey.LETTER_T, 't', 'T', 'ŧ', 'Ŧ', true);
+
+    assertCombinations(map, VirtualKey.LETTER_Z, 'z', 'Z', '←', '¥', true);
+
+    assertCombinations(map, VirtualKey.LETTER_U, 'u', 'U', '↓', '↑', true);
+
+    assertCombinations(map, VirtualKey.LETTER_I, 'i', 'I', '→', 'ı', true);
+
+    assertCombinations(map, VirtualKey.LETTER_O, 'o', 'O', 'ø', 'Ø', true);
+
+    assertCombinations(map, VirtualKey.LETTER_P, 'p', 'P', 'þ', 'Þ', true);
+
+    assertCombinations(map, VirtualKey.LETTER_A, 'a', 'A', 'æ', 'Æ', true);
+
+    assertCombinations(map, VirtualKey.LETTER_S, 's', 'S', 0, 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_D, 'd', 'D', 'ð', 'Ð', true);
+
+    assertCombinations(map, VirtualKey.LETTER_F, 'f', 'F', 'đ', 'ª', true);
+
+    assertCombinations(map, VirtualKey.LETTER_G, 'g', 'G', 'ŋ', 'Ŋ', true);
+
+    assertCombinations(map, VirtualKey.LETTER_H, 'h', 'H', 'ħ', 'Ħ', true);
+
+    assertCombinations(map, VirtualKey.LETTER_J, 'j', 'J', 0, 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_K, 'k', 'K', 'ĸ', 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_L, 'l', 'L', 0, 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_Y, 'y', 'Y', '»', 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_X, 'x', 'X', '«', 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_C, 'c', 'C', '¢', '©', true);
+
+    assertCombinations(map, VirtualKey.LETTER_V, 'v', 'V', '„', 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_B, 'b', 'B', '“', 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_N, 'n', 'N', 0, 0, true);
+
+    assertCombinations(map, VirtualKey.LETTER_M, 'm', 'M', 'µ', 'º', true);
+
+    assertCombinations(map, VirtualKey.NUMPAD_0, '0', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_1, '1', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_2, '2', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_3, '3', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_4, '4', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_5, '5', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_6, '6', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_7, '7', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_8, '8', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.NUMPAD_9, '9', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.SEPARATOR, ',', 0, 0, 0, false);
+    assertCombinations(map, VirtualKey.DECIMAL, ',', 0, 0, 0, false);
+
+    assertCombinations(map, VirtualKey.CIRCUMFLEX, '^', '°', '¬', 0, true);
+
+    assertCombinations(map, VirtualKey.TAB, '\t', 0, '\t', 0, true);
+
+    assertCombinations(map, VirtualKey.SPACE, ' ', ' ', ' ', ' ', true);
+
+    assertCombinations(map, VirtualKey.COMMA, ',', ';', '·', '×', true);
+    assertCombinations(map, VirtualKey.SEMICOLON, ',', ';', '·', '×', true);
+    assertCombinations(map, VirtualKey.MULTIPLY, ',', ';', '·', '×', true);
+
+    assertCombinations(map, VirtualKey.MINUS, '-', '_', 0, 0, true);
+    assertCombinations(map, VirtualKey.UNDERSCORE, '-', '_', 0, 0, true);
+
+    assertCombinations(map, VirtualKey.PERIOD, '.', ':', '…', '÷', true);
+    assertCombinations(map, VirtualKey.COLON, '.', ':', '…', '÷', true);
+    assertCombinations(map, VirtualKey.DIVIDE, '.', ':', '…', '÷', true);
+
+    assertCombinations(map, VirtualKey.PLUS, '+', '*', '~', 0, true);
+    assertCombinations(map, VirtualKey.ASTERISK, '+', '*', '~', 0, true);
+    assertCombinations(map, VirtualKey.DEAD_TILDE, '+', '*', '~', 0, true);
+
+    assertCombinations(map, VirtualKey.LESS, '<', '>', '|', '¦', true);
+    assertCombinations(map, VirtualKey.GREATER, '<', '>', '|', '¦', true);
+
+    assertCombinations(map, VirtualKey.NUMBER_SIGN, '#', '\'', 0, 0, true);
+
+    /*DEAD_GRAVE(KeyEvent.VK_DEAD_GRAVE),
+    DEAD_ACUTE(KeyEvent.VK_DEAD_ACUTE),
+    DEAD_CIRCUMFLEX(KeyEvent.VK_DEAD_CIRCUMFLEX),
+    DEAD_TILDE(KeyEvent.VK_DEAD_TILDE),
+    DEAD_MACRON(KeyEvent.VK_DEAD_MACRON),
+    DEAD_BREVE(KeyEvent.VK_DEAD_BREVE),
+    DEAD_ABOVEDOT(KeyEvent.VK_DEAD_ABOVEDOT),
+    DEAD_DIAERESIS(KeyEvent.VK_DEAD_DIAERESIS),
+    DEAD_ABOVERING(KeyEvent.VK_DEAD_ABOVERING),
+    DEAD_DOUBLEACUTE(KeyEvent.VK_DEAD_DOUBLEACUTE),
+    DEAD_CARON(KeyEvent.VK_DEAD_CARON),
+    DEAD_CEDILLA(KeyEvent.VK_DEAD_CEDILLA),
+    DEAD_OGONEK(KeyEvent.VK_DEAD_OGONEK),
+    DEAD_IOTA(KeyEvent.VK_DEAD_IOTA),
+    DEAD_VOICED_SOUND(KeyEvent.VK_DEAD_VOICED_SOUND),
+    DEAD_SEMIVOICED_SOUND(KeyEvent.VK_DEAD_SEMIVOICED_SOUND),*/
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   *
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void assertCombinations(KeyboardMap map,
+                                  VirtualKey  key,
+                                  int         normal,
+                                  int         withShift,
+                                  int         withAltGr,
+                                  int         withShiftAndAltGr,
+                                  boolean     numLockIndependent)
+  {
+    if (numLockIndependent)
+    {
+      if (normal != 0)
+      {
+        assertCombination("normal", normal, map, key, false, false, false);
+      }
+    
+      if (withShift != 0)
+      {
+        assertCombination("shift", withShift, map, key, false, true, false);
+      }
+    
+      if (withAltGr != 0)
+      {
+        assertCombination("altgr", withAltGr, map, key, false, false, true);
+      }
+    
+      if (withShiftAndAltGr != 0)
+      {
+        assertCombination("shift and altgr", withShiftAndAltGr, map, key, false, true, true);
+      }
+    }
+    else
+    {
+      assertInvalidCombination("normal", normal, map, key, false, false, false);
+      assertInvalidCombination("shift", withShift, map, key, false, true, false);
+      assertInvalidCombination("altgr", withAltGr, map, key, false, false, true);
+      assertInvalidCombination("shift and altgr", withShiftAndAltGr, map, key, false, true, true);
+    }
+
+    if (normal != 0)
+    {
+      assertCombination("numlock", normal, map, key, true, false, false);
+    }
+      
+    if (withShift != 0)
+    {
+      assertCombination("numlock and shift", withShift, map, key, true, true, false);
+    }
+      
+    if (withAltGr != 0)
+    {
+      assertCombination("numlock and altgr", withAltGr, map, key, true, false, true);
+    }
+      
+    if (withShiftAndAltGr != 0)
+    {
+      assertCombination
+        ("numlock, shift and altgr", withShiftAndAltGr, map, key, true, true, true);
+    }
+  }
+  
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param string
+   * @param normal
+   * @param characterFor
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void assertCombination(String      type,
+                                 int         expectedChar,
+                                 KeyboardMap map,
+                                 VirtualKey  key,
+                                 boolean     numlock,
+                                 boolean     shift,
+                                 boolean     altgr)
+  {
+    String message = "checked for " + type + ": expected '" + ((char) expectedChar) + "'";
+
+    char retrievedChar;
+    try
+    {
+      retrievedChar = map.getCharacterFor(key, numlock, shift, altgr, false);
+    }
+    catch (IllegalArgumentException e)
+    {
+      fail("no character found. " + message);
+      return;
+    }
+    
+    message += " but got '" + retrievedChar + "'";
+    
+    assertEquals(message, expectedChar, retrievedChar);
+  }
+
+  //-----------------------------------------------------------------------------------------------
+  /**
+   * TODO: comment
+   *
+   * @param string
+   * @param normal
+   * @param characterFor
+   */
+  //-----------------------------------------------------------------------------------------------
+  private void assertInvalidCombination(String      type,
+                                        int         expectedChar,
+                                        KeyboardMap map,
+                                        VirtualKey  key,
+                                        boolean     numlock,
+                                        boolean     shift,
+                                        boolean     altgr)
+  {
+    char retrievedChar;
+    try
+    {
+      retrievedChar = map.getCharacterFor(key, numlock, shift, altgr, false);
+      assertEquals(Character.UNASSIGNED, retrievedChar);
+    }
+    catch (IllegalArgumentException e)
+    {
+      // this is ok and checked for
+    }
+    
+  }
+
+}
