+    if ( IsModifierKey(iKey) )  // If iKey is a modifier key, use a different method
+    {
+        XModifierKeymap *map = XGetModifierMapping(pDisplay);
+        wxCHECK_MSG( map, false, wxT("failed to get X11 modifiers map") );
+
+        for (int i = 0; i < 8; ++i)
+        {
+            if ( map->modifiermap[map->max_keypermod * i] == keyCode)
+            {
+                iKeyMask = 1 << i;
+            }
+        }
+
+        XQueryPointer(pDisplay, DefaultRootWindow(pDisplay), &wDummy1, &wDummy2,
+                        &iDummy3, &iDummy4, &iDummy5, &iDummy6, &iMask );
+        XFreeModifiermap(map);
+        return (iMask & iKeyMask) != 0;
+    }
+
+    // From the XLib manual:
+    // The XQueryKeymap() function returns a bit vector for the logical state of the keyboard,
+    // where each bit set to 1 indicates that the corresponding key is currently pressed down.
+    // The vector is represented as 32 bytes. Byte N (from 0) contains the bits for keys 8N to 8N + 7
+    // with the least-significant bit in the byte representing key 8N.
+    char key_vector[32];
+    XQueryKeymap(pDisplay, key_vector);
+    return key_vector[keyCode >> 3] & (1 << (keyCode & 7));
+}
+
+// ----------------------------------------------------------------------------
+// Launch document with default app
+// ----------------------------------------------------------------------------
+
+bool wxLaunchDefaultApplication(const wxString& document, int flags)
+{
+    wxUnusedVar(flags);
+
+    // Our best best is to use xdg-open from freedesktop.org cross-desktop
+    // compatibility suite xdg-utils
+    // (see http://portland.freedesktop.org/wiki/) -- this is installed on
+    // most modern distributions and may be tweaked by them to handle
+    // distribution specifics.
+    wxString path, xdg_open;
+    if ( wxGetEnv("PATH", &path) &&
+         wxFindFileInPath(&xdg_open, path, "xdg-open") )
+    {
+        if ( wxExecute(xdg_open + " " + document) )
+            return true;
+    }
+
+    return false;
+}
+
+// ----------------------------------------------------------------------------
+// Launch default browser
+// ----------------------------------------------------------------------------
+
+bool wxDoLaunchDefaultBrowser(const wxString& url, int flags)
+{
+    wxUnusedVar(flags);
+
+    // Our best best is to use xdg-open from freedesktop.org cross-desktop
+    // compatibility suite xdg-utils
+    // (see http://portland.freedesktop.org/wiki/) -- this is installed on
+    // most modern distributions and may be tweaked by them to handle
+    // distribution specifics. Only if that fails, try to find the right
+    // browser ourselves.
+    wxString path, xdg_open;
+    if ( wxGetEnv("PATH", &path) &&
+         wxFindFileInPath(&xdg_open, path, "xdg-open") )
+    {
+        if ( wxExecute(xdg_open + " " + url) )
+            return true;
+    }
+
+    wxString desktop = wxTheApp->GetTraits()->GetDesktopEnvironment();
+
+    // GNOME and KDE desktops have some applications which should be always installed
+    // together with their main parts, which give us the
+    if (desktop == wxT("GNOME"))