diff --git a/examples/cl-repl/app.pro b/examples/cl-repl/app.pro index 5df5dbc..bca4f3f 100644 --- a/examples/cl-repl/app.pro +++ b/examples/cl-repl/app.pro @@ -75,7 +75,7 @@ android { } ios { - DEFINES += INI_ASDF NO_TEXT_HANDLES + DEFINES += INI_ASDF NO_TEXT_HANDLES DISABLE_SMART_QUOTES DEFINES -= DESKTOP_APP INCLUDEPATH = $$(ECL_IOS)/include ECL_VERSION = $$lower($$system($ECL_IOS/../ecl-ios-host/bin/ecl -v)) diff --git a/src/cpp/lqml.cpp b/src/cpp/lqml.cpp index c769c9e..458af19 100644 --- a/src/cpp/lqml.cpp +++ b/src/cpp/lqml.cpp @@ -7,7 +7,7 @@ #include #include -const char LQML::version[] = "22.8.2"; // August 2022 +const char LQML::version[] = "22.11.1"; // November 2022 extern "C" void ini_LQML(cl_object); diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 32e1917..741b93d 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -2,7 +2,6 @@ #include "lqml.h" #include "qml_ext.h" #include -#include #include #include #include @@ -65,9 +64,7 @@ int main(int argc, char* argv[]) { #ifdef INI_WEBVIEW QtWebView::initialize(); #endif - QGuiApplication app(argc, argv); - //app.setOrganizationName("MyProject"); - //app.setOrganizationDomain("my.org"); + EventFilterApp app(argc, argv); app.setApplicationName(QFileInfo(app.applicationFilePath()).baseName()); QStringList arguments(QCoreApplication::arguments()); diff --git a/src/cpp/main.h b/src/cpp/main.h index fa2da63..3dfa119 100644 --- a/src/cpp/main.h +++ b/src/cpp/main.h @@ -1,13 +1,81 @@ #pragma once #include +#include +#include + +QT_BEGIN_NAMESPACE class Engine : public QQmlEngine { - Q_OBJECT + Q_OBJECT public: - Engine(QObject* parent = nullptr) : QQmlEngine(parent) {} + Engine(QObject* parent = nullptr) : QQmlEngine(parent) {} - Q_PROPERTY (QUrl baseUrl READ baseUrl WRITE setBaseUrl) + Q_PROPERTY (QUrl baseUrl READ baseUrl WRITE setBaseUrl) - Q_INVOKABLE void clearCache() { clearComponentCache(); } + Q_INVOKABLE void clearCache() { clearComponentCache(); } }; + +class EventFilterApp : public QGuiApplication { + Q_OBJECT +public: + EventFilterApp(int& argc, char* argv[]) : QGuiApplication(argc, argv) { +#if (defined Q_OS_IOS) && (defined DISABLE_SMART_QUOTES) + installEventFilter(this); +#endif + } + +#if (defined Q_OS_IOS) && (defined DISABLE_SMART_QUOTES) + bool eventFilter(QObject* object, QEvent* event) override { + if (event->type() == QEvent::InputMethod) { + QInputMethodEvent* input = static_cast(event); + QString s = input->commitString(); + if (s.size() == 1) { + bool changed = true; + const int code = s.at(0).unicode(); + switch (code) { + // replace iOS smart quotation marks with standard ones + // (English, French, German, ...) + case 8216: + case 8217: + case 8218: + s[0] = QChar('\''); + break; + case 171: + case 187: + case 8220: + case 8221: + case 8222: + s[0] = QChar('"'); + break; + default: + changed = false; + } + if (changed) { + input->setCommitString(s); + } + } else if (s.size() == 2) { + bool changed = true; + s = s.trimmed(); + const int code = s.at(0).unicode(); + switch (code) { + // replace iOS smart quotation marks with standard ones + // (Frensh, ...) + case 171: + case 187: + s[0] = QChar('"'); + break; + default: + changed = false; + } + if (changed) { + input->setCommitString(s); + } + } + } + return QGuiApplication::eventFilter(object, event); + } +#endif +}; + +QT_END_NAMESPACE