summaryrefslogtreecommitdiff
path: root/vcl/unx/source
diff options
context:
space:
mode:
authorKohei Yoshida <kyoshida@novell.com>2010-09-29 16:21:04 -0400
committerKohei Yoshida <kyoshida@novell.com>2010-09-29 16:21:04 -0400
commit49b7f991a509528302d2d1987d3f6c38bd108798 (patch)
treec205628d3f47dc5b8dc7fe79c74263bc3b5eea4a /vcl/unx/source
parent13b0fc7375271ed58f563306ef57f81808ac9289 (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.cxx73
-rw-r--r--vcl/unx/source/window/salframe.cxx12
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;