Date: prev next · Thread: first prev next last
2014 Archives by date, by thread · List index


On 01/04/14 06:50, Tharindu Amila Perera wrote:
Hi all,

Using the reply I found out that the events coming from the keyboard
has this behavior.

Using the argument KeyEvent coming to function in file tabvwsh4.cxx
    bool ScTabViewShell::TabKeyInput(const KeyEvent& rKEvt)


I can get codes of all keys except of Caps-Lock, NumLock and
Scroll(Which is the needed input).

I noticed that when any of the above keys are pressed this function is
called twice. But in both events the keycodes are not accessible.

hmm... indeed the keycode is 0 there... it looks like the "lock" keys
are not mapped to a keycode in VCL... perhaps intentionally.

When CapsLock is on pressing key 'A' in keyboard will give the same
keycode as when it is not on. So there must be a place where it is
handled to differentiate a and A inputs. It would be appreciated if I
can get a code pointer for this.

if i read the bug correctly you don't actually need the key events, you
just need to know if the lock key is active when some other input happens.

vcl/unx/generic/app/saldisp.cxx:

 sal_uInt16 SalDisplay::GetIndicatorState() const
 {
    unsigned int _state = 0;
    sal_uInt16 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;
 }

there is an example for requesting the caps-lock key state in
editeng/source/misc/svxacorr.cxx:

 bool bLockKeyOn = pFrameWin && (pFrameWin->GetIndicatorState() &
INDICATOR_CAPSLOCK);

so you need a VCL Window to get the state; a SfxViewShell like the
ScTabVierwShell has a pointer to its Window.

(since i read the bug too late i've already got a patch to assign a
keycode for the scroll-lock key (see attachment), but i now think that
is actually useless)

diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx
index d96fd20..4960931 100644
--- a/vcl/unx/generic/app/saldisp.cxx
+++ b/vcl/unx/generic/app/saldisp.cxx
@@ -1251,6 +1251,9 @@ sal_uInt16 SalDisplay::GetKeyCode( KeySym keysym, char*pcPrintable ) const
             nKey = KEY_SEMICOLON;
             *pcPrintable = ';';
             break;
+        case XK_Scroll_Lock:
+            nKey = KEY_SCROLLLOCK;
+            break;
         // - - - - - - - - - - - - -  Apollo - - - - - - - - - - - - - 0x1000
         case 0x1000FF02: // apXK_Copy
             nKey = KEY_COPY;
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index f22b54e..baa94f2 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -255,6 +255,7 @@ static sal_uInt16 GetKeyCode( guint keyval )
             case GDK_bracketleft:  nCode = KEY_BRACKETLEFT;  break;
             case GDK_bracketright: nCode = KEY_BRACKETRIGHT; break;
             case GDK_semicolon:    nCode = KEY_SEMICOLON;   break;
+            case GDK_Scroll_Lock:  nCode = KEY_SCROLLLOCK;  break;
             // some special cases, also see saldisp.cxx
             // - - - - - - - - - - - - -  Apollo - - - - - - - - - - - - - 0x1000
             case 0x1000FF02: // apXK_Copy
diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx
index 90b36e0..227b6ae 100644
--- a/vcl/win/source/window/salframe.cxx
+++ b/vcl/win/source/window/salframe.cxx
@@ -666,7 +666,7 @@ static const sal_uInt16 aImplTranslateKeyTab[KEY_TAB_SIZE] =
     0,                    //                                 142
     0,                    //                                 143
     0,                    // NUMLOCK                         144
-    0                     // SCROLLLOCK                      145
+    KEY_SCROLLLOCK        // SCROLLLOCK                      145
 };
 
 static UINT ImplSalGetWheelScrollLines()

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.