[PATCH] fdo#54165: Allow localized shortcut names on Windows

Jesús Corrius (via_Code_Review) gerrit at gerrit.libreoffice.org
Sat Jan 5 15:32:29 PST 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/1553

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/53/1553/1

fdo#54165: Allow localized shortcut names on Windows

Change-Id: I2de53cd8d888ecf819271e96f8eb2cc4a90e554d
---
M vcl/Library_vcl.mk
M vcl/inc/win/salframe.h
A vcl/win/source/window/keynames.cxx
M vcl/win/source/window/salframe.cxx
4 files changed, 145 insertions(+), 13 deletions(-)



diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index c3898bc..ed843bf 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -641,6 +641,7 @@
     vcl/win/source/gdi/winlayout \
     vcl/win/source/gdi/wntgdi \
     vcl/win/source/window/salframe \
+    vcl/win/source/window/keynames \
     vcl/win/source/window/salmenu \
     vcl/win/source/window/salobj \
 ))
diff --git a/vcl/inc/win/salframe.h b/vcl/inc/win/salframe.h
index 4c0f63c..54e10bd 100644
--- a/vcl/inc/win/salframe.h
+++ b/vcl/inc/win/salframe.h
@@ -137,6 +137,13 @@
 
 void ImplSalGetWorkArea( HWND hWnd, RECT *pRect, const RECT *pParentRect );
 
+// get foreign key names
+namespace vcl_sal {
+    rtl::OUString getKeysReplacementName(
+        rtl::OUString pLang,
+        LONG nSymbol );
+}
+
 #endif // _SV_SALFRAME_H
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/win/source/window/keynames.cxx b/vcl/win/source/window/keynames.cxx
new file mode 100755
index 0000000..153fc07
--- /dev/null
+++ b/vcl/win/source/window/keynames.cxx
@@ -0,0 +1,112 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <string.h>
+#include <rtl/ustring.hxx>
+#include <sal/macros.h>
+
+#include <windows.h>
+
+#define KEY_ESC         0x10000
+#define KEY_BACK        0xE0000
+#define KEY_ENTER       0x1C0000
+#define KEY_SPACEBAR    0x390000
+#define KEY_HOME        0x1470000
+#define KEY_UP          0x1480000
+#define KEY_PAGEUP      0x1490000
+#define KEY_LEFT        0x14B0000
+#define KEY_RIGHT       0x14D0000
+#define KEY_END         0x14F0000
+#define KEY_DOWN        0x1500000
+#define KEY_PAGEDOWN    0x1510000
+#define KEY_INSERT      0x1520000
+#define KEY_DELETE      0x1530000
+#define KEY_CONTROL     0x21D0000
+#define KEY_SHIFT       0x22A0000
+#define KEY_ALT         0x2380000
+
+
+namespace vcl_sal {
+
+    struct KeysNameReplacement
+    {
+        LONG            aSymbol;
+        const char*     pName;
+    };
+
+    struct KeyboardReplacements
+    {
+        const char*                     pLangName;
+        const KeysNameReplacement*      pReplacements;
+        int                             nReplacements;
+    };
+
+    // ====================================================================
+    //
+    // CAUTION CAUTION CAUTION
+    // every string value in the replacements tables must be in UTF8
+    // be careful with your editor !
+    //
+    // ====================================================================
+
+    static const struct KeysNameReplacement aImplReplacements_Catalan[] =
+    {
+        { KEY_BACK, "Retrocés" },
+        { KEY_ENTER, "Retorn" },
+        { KEY_SPACEBAR, "Espai" },
+        { KEY_HOME, "Inici" },
+        { KEY_UP, "Amunt" },
+        { KEY_PAGEUP, "Re Pàg" },
+        { KEY_LEFT, "Esquerra" },
+        { KEY_RIGHT, "Dreta" },
+        { KEY_END, "Fi" },
+        { KEY_DOWN, "Avall" },
+        { KEY_PAGEDOWN, "Av Pàg" },
+        { KEY_INSERT, "Ins" },
+        { KEY_DELETE, "Supr" },
+        { KEY_SHIFT, "Maj" },
+    };
+
+    static const struct KeyboardReplacements aKeyboards[] =
+    {
+        { "ca", aImplReplacements_Catalan, SAL_N_ELEMENTS(aImplReplacements_Catalan) },
+    };
+
+    // translate keycodes, used within the displayed menu shortcuts
+    rtl::OUString getKeysReplacementName( rtl::OUString pLang, LONG nSymbol )
+    {
+        for( unsigned int n = 0; n < SAL_N_ELEMENTS(aKeyboards); n++ )
+        {
+            if( pLang.equalsAscii( aKeyboards[n].pLangName ) )
+            {
+                const struct KeysNameReplacement* pRepl = aKeyboards[n].pReplacements;
+                for( int m = aKeyboards[n].nReplacements ; m ; )
+                {
+                    if( nSymbol == pRepl[--m].aSymbol )
+                        return rtl::OUString( pRepl[m].pName, strlen(pRepl[m].pName), RTL_TEXTENCODING_UTF8 );
+                }
+            }
+        }
+
+        return rtl::OUString();
+    }
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx
index bdee3e1..17646f2 100644
--- a/vcl/win/source/window/salframe.cxx
+++ b/vcl/win/source/window/salframe.cxx
@@ -2387,23 +2387,35 @@
     int nKeyLen = 0;
     if ( lParam )
     {
-        nKeyLen = GetKeyNameTextW( lParam, aKeyBuf, nMaxKeyLen );
-        DBG_ASSERT( nKeyLen <= nMaxKeyLen, "Invalid key name length!" );
-        if( nKeyLen > nMaxKeyLen )
-            nKeyLen = 0;
-        else if( nKeyLen > 0 )
-        {
-            // Capitalize just the first letter of key names
-            CharLowerBuffW( aKeyBuf, nKeyLen );
+        rtl::OUString aLang = Application::GetSettings().GetUILanguageTag().getLanguage();
+        rtl::OUString aRet;
 
-            bool bUpper = true;
-            for( WCHAR *pW=aKeyBuf, *pE=pW+nKeyLen; pW < pE; ++pW )
+        aRet = ::vcl_sal::getKeysReplacementName( aLang, lParam );
+        if( aRet.isEmpty() )
+        {
+            nKeyLen = GetKeyNameTextW( lParam, aKeyBuf, nMaxKeyLen );
+            DBG_ASSERT( nKeyLen <= nMaxKeyLen, "Invalid key name length!" );
+            if( nKeyLen > nMaxKeyLen )
+                nKeyLen = 0;
+            else if( nKeyLen > 0 )
             {
-                if( bUpper )
-                    CharUpperBuffW( pW, 1 );
-                bUpper = (*pW=='+') || (*pW=='-') || (*pW==' ') || (*pW=='.');
+                // Capitalize just the first letter of key names
+                CharLowerBuffW( aKeyBuf, nKeyLen );
+
+                bool bUpper = true;
+                for( WCHAR *pW=aKeyBuf, *pE=pW+nKeyLen; pW < pE; ++pW )
+                {
+                    if( bUpper )
+                        CharUpperBuffW( pW, 1 );
+                    bUpper = (*pW=='+') || (*pW=='-') || (*pW==' ') || (*pW=='.');
+                }
             }
         }
+        else
+        {
+            nKeyLen = aRet.getLength();
+            wcscpy_s( aKeyBuf, nMaxKeyLen, aRet.getStr() );
+        }
     }
 
     if ( (nKeyLen > 0) || pReplace )

-- 
To view, visit https://gerrit.libreoffice.org/1553
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2de53cd8d888ecf819271e96f8eb2cc4a90e554d
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Jesús Corrius <jcorrius at gmail.com>



More information about the LibreOffice mailing list