commit ab5415844758da415df4048c923a95a1f1be4a26
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Mon May 16 22:16:53 2022 +0200

    Honor key bindings for commit string
    
    When the commit string from the inputMethodEvent can be interpreted as
    characters bound to some action, dispatch this action instead of
    inserting the string.
    
    This is useful on an international keyboard, when diaresis+space gives
    a plain double quote. It is better in this case to enter a smart
    quote.
    
    Adapted from a patch from Daniel Ramoeller <d....@web.de>.
    
    Fixes bug #10377.
---
 src/frontends/KeySymbol.h         |    3 +++
 src/frontends/qt/GuiKeySymbol.cpp |    8 ++++++++
 src/frontends/qt/GuiWorkArea.cpp  |   24 +++++++++++++++++++-----
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/src/frontends/KeySymbol.h b/src/frontends/KeySymbol.h
index cdb5f8f..7e67536 100644
--- a/src/frontends/KeySymbol.h
+++ b/src/frontends/KeySymbol.h
@@ -33,6 +33,9 @@ public:
        /// Initialize with the name of a key. F. ex. "space" or "a"
        void init(std::string const & symbolname);
 
+       /// Initialize with some platform specific sym value
+       void init(int key);
+
        /// Is this a valid key?
        bool isOK() const;
 
diff --git a/src/frontends/qt/GuiKeySymbol.cpp 
b/src/frontends/qt/GuiKeySymbol.cpp
index 77e3dc3..551ea8d 100644
--- a/src/frontends/qt/GuiKeySymbol.cpp
+++ b/src/frontends/qt/GuiKeySymbol.cpp
@@ -752,6 +752,14 @@ void KeySymbol::init(string const & symbolname)
 }
 
 
+void KeySymbol::init(int key)
+{
+       key_ = key;
+       text_ = from_utf8(qkey_to_string(key));
+       LYXERR(Debug::KEY, "Init key to " << key_ << ", " << to_utf8(text_));
+}
+
+
 bool KeySymbol::isOK() const
 {
        bool const ok = !(text_.empty() && qkey_to_string(key_).empty());
diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp
index e70563b..900273f 100644
--- a/src/frontends/qt/GuiWorkArea.cpp
+++ b/src/frontends/qt/GuiWorkArea.cpp
@@ -31,7 +31,9 @@
 #include "Cursor.h"
 #include "Font.h"
 #include "FuncRequest.h"
+#include "KeyMap.h"
 #include "KeySymbol.h"
+#include "KeySequence.h"
 #include "LyX.h"
 #include "LyXRC.h"
 #include "LyXVC.h"
@@ -47,7 +49,6 @@
 
 #include "frontends/Application.h"
 #include "frontends/CaretGeometry.h"
-
 #include "frontends/FontMetrics.h"
 #include "frontends/WorkAreaManager.h"
 
@@ -1313,11 +1314,24 @@ void GuiWorkArea::inputMethodEvent(QInputMethodEvent * 
e)
        LYXERR(Debug::KEY, "preeditString: " << e->preeditString()
                   << " commitString: " << e->commitString());
 
-       // insert the processed text in the document (handles undo)
        if (!e->commitString().isEmpty()) {
-               FuncRequest cmd(LFUN_SELF_INSERT,
-                               qstring_to_ucs4(e->commitString()),
-                               FuncRequest::KEYBOARD);
+               FuncRequest cmd;
+               // take care of commit string assigned to a shortcut
+               // e.g. quotation mark on international keyboard
+               KeySequence keyseq;
+               for (QChar const & ch : e->commitString()) {
+                       KeySymbol keysym;
+                       keysym.init(ch.unicode());
+                       keyseq.addkey(keysym, NoModifier);
+               }
+               cmd = theTopLevelKeymap().getBinding(keyseq);
+
+               if (cmd == FuncRequest::noaction || cmd == FuncRequest::unknown
+                   || cmd.action() == LFUN_SELF_INSERT)
+                       // insert the processed text in the document (handles 
undo)
+                       cmd = FuncRequest(LFUN_SELF_INSERT, 
qstring_to_ucs4(e->commitString()));
+
+               cmd.setOrigin(FuncRequest::KEYBOARD);
                dispatch(cmd);
                // FIXME: this is supposed to remove traces from preedit
                // string. Can we avoid calling it explicitly?
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to