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


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/1554

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/54/1554/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/1554
To unsubscribe, visit https://gerrit.libreoffice.org/settings

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


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.