diff options
author | Kohei Yoshida <kyoshida@novell.com> | 2010-09-29 16:21:04 -0400 |
---|---|---|
committer | Kohei Yoshida <kyoshida@novell.com> | 2010-09-29 16:21:04 -0400 |
commit | 49b7f991a509528302d2d1987d3f6c38bd108798 (patch) | |
tree | c205628d3f47dc5b8dc7fe79c74263bc3b5eea4a /vcl/unx/source | |
parent | 13b0fc7375271ed58f563306ef57f81808ac9289 (diff) |
Ported autocorrect-accidental-caps-lock-vcl.diff from ooo-build.
Diffstat (limited to 'vcl/unx/source')
-rw-r--r-- | vcl/unx/source/app/saldisp.cxx | 73 | ||||
-rw-r--r-- | vcl/unx/source/window/salframe.cxx | 12 |
2 files changed, 84 insertions, 1 deletions
diff --git a/vcl/unx/source/app/saldisp.cxx b/vcl/unx/source/app/saldisp.cxx index f3220c106797..ca1f0052d8f0 100644 --- a/vcl/unx/source/app/saldisp.cxx +++ b/vcl/unx/source/app/saldisp.cxx @@ -54,7 +54,7 @@ #define XK_KOREAN #endif #include <X11/keysym.h> - +#include <X11/XKBlib.h> #include <X11/Xatom.h> #ifdef USE_XINERAMA @@ -1037,6 +1037,77 @@ void SalDisplay::Beep() const // Keyboard // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +namespace { + +bool InitXkb(Display* dpy) +{ + int nOpcode, nEvent, nError; + int nXkbMajor = XkbMajorVersion; + int nXkbMinor = XkbMinorVersion; + + if (!XkbLibraryVersion(&nXkbMajor, &nXkbMinor)) + return false; + + return XkbQueryExtension( + dpy, &nOpcode, &nEvent, &nError, &nXkbMajor, &nXkbMinor); +} + +unsigned int GetKeySymMask(Display* dpy, KeySym nKeySym) +{ + int nMask = 0; + XModifierKeymap* pXmkMap = XGetModifierMapping(dpy); + KeyCode nKeyCode = XKeysymToKeycode(dpy, nKeySym); + if (nKeyCode == NoSymbol) + return 0; + + for (int i = 0; i < 8; ++i) + { + KeyCode nThisKeyCode = pXmkMap->modifiermap[pXmkMap->max_keypermod*i]; + if (nThisKeyCode == nKeyCode) + nMask = 1 << i; + } + XFreeModifiermap(pXmkMap); + return nMask; +} + +} + +void SalDisplay::SimulateKeyPress( USHORT nKeyCode ) +{ + if (nKeyCode == KEY_CAPSLOCK) + { + Display* dpy = GetDisplay(); + if (!InitXkb(dpy)) + return; + + unsigned int nMask = GetKeySymMask(dpy, XK_Caps_Lock); + XkbStateRec xkbState; + XkbGetState(dpy, XkbUseCoreKbd, &xkbState); + unsigned int nCapsLockState = xkbState.locked_mods & nMask; + if (nCapsLockState) + XkbLockModifiers (dpy, XkbUseCoreKbd, nMask, 0); + else + XkbLockModifiers (dpy, XkbUseCoreKbd, nMask, nMask); + } +} + +USHORT SalDisplay::GetIndicatorState() const +{ + unsigned int _state = 0; + USHORT nState = 0; + XkbGetIndicatorState(pDisp_, XkbUseCoreKbd, &_state); + + if ((_state & 0x00000001)) + nState |= INDICATOR_CAPSLOCK; + if ((_state & 0x00000002)) + nState |= INDICATOR_NUMLOCK; + if ((_state & 0x00000004)) + nState |= INDICATOR_SCROLLLOCK; + + return nState; +} + String SalDisplay::GetKeyNameFromKeySym( KeySym nKeySym ) const { String aRet; diff --git a/vcl/unx/source/window/salframe.cxx b/vcl/unx/source/window/salframe.cxx index b0248662a2a2..cb0b7b08f8ec 100644 --- a/vcl/unx/source/window/salframe.cxx +++ b/vcl/unx/source/window/salframe.cxx @@ -2849,6 +2849,18 @@ SalFrame::SalPointerState X11SalFrame::GetPointerState() return aState; } +SalFrame::SalIndicatorState X11SalFrame::GetIndicatorState() +{ + SalIndicatorState aState; + aState.mnState = GetX11SalData()->GetDisplay()->GetIndicatorState(); + return aState; +} + +void X11SalFrame::SimulateKeyPress( USHORT nKeyCode ) +{ + GetX11SalData()->GetDisplay()->SimulateKeyPress(nKeyCode); +} + long X11SalFrame::HandleMouseEvent( XEvent *pEvent ) { SalMouseEvent aMouseEvt; |