+ 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"))