macOS: Use the native emoji picker
fixes #79
4 files changed, 61 insertions, 0 deletions
diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp
index 7167f572..4a03762d 100644
--- a/src/TextInputWidget.cpp
+++ b/src/TextInputWidget.cpp
@@ -37,6 +37,10 @@
#include "ui/FlatButton.h"
#include "ui/LoadingIndicator.h"
+#if defined(Q_OS_MAC)
+#include "emoji/MacHelper.h"
+#endif
+
static constexpr size_t INPUT_HISTORY_SIZE = 127;
static constexpr int MAX_TEXTINPUT_HEIGHT = 120;
static constexpr int InputHeight = 26;
@@ -124,6 +128,12 @@ FilteredTextEdit::keyPressEvent(QKeyEvent *event)
{
const bool isModifier = (event->modifiers() != Qt::NoModifier);
+#if defined(Q_OS_MAC)
+ if (event->modifiers() == (Qt::ControlModifier | Qt::MetaModifier) &&
+ event->key() == Qt::Key_Space)
+ MacHelper::showEmojiWindow();
+#endif
+
if (!isModifier) {
if (!typingTimer_->isActive())
emit startedTyping();
@@ -503,6 +513,11 @@ TextInputWidget::TextInputWidget(QWidget *parent)
emojiBtn_ = new emoji::PickButton(this);
emojiBtn_->setToolTip(tr("Emoji"));
+#if defined(Q_OS_MAC)
+ // macOS has a native emoji picker.
+ emojiBtn_->hide();
+#endif
+
QIcon emoji_icon;
emoji_icon.addFile(":/icons/icons/ui/smile.png");
emojiBtn_->setIcon(emoji_icon);
diff --git a/src/emoji/MacHelper.h b/src/emoji/MacHelper.h
new file mode 100644
index 00000000..a2e94158
--- /dev/null
+++ b/src/emoji/MacHelper.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include <QMenuBar>
+
+class MacHelper
+{
+public:
+ static void showEmojiWindow();
+ static void initializeMenus();
+};
diff --git a/src/emoji/MacHelper.mm b/src/emoji/MacHelper.mm
new file mode 100644
index 00000000..11dbd7f4
--- /dev/null
+++ b/src/emoji/MacHelper.mm
@@ -0,0 +1,26 @@
+#include "MacHelper.h"
+
+#include <Cocoa/Cocoa.h>
+#include <Foundation/Foundation.h>
+#include <Foundation/NSString.h>
+#include <QCoreApplication>
+
+void
+MacHelper::showEmojiWindow()
+{
+ NSApplication *theNSApplication = [NSApplication sharedApplication];
+ [theNSApplication orderFrontCharacterPalette:nil];
+}
+
+void
+MacHelper::initializeMenus()
+{
+ NSApplication *theNSApplication = [NSApplication sharedApplication];
+
+ NSArray<NSMenuItem *> *menus = [theNSApplication mainMenu].itemArray;
+ NSUInteger size = menus.count;
+ for (NSUInteger i = 0; i < size; i++) {
+ NSMenuItem *item = [menus objectAtIndex:i];
+ [item setTitle:@"Edit"];
+ }
+}
diff --git a/src/main.cpp b/src/main.cpp
index 77e62381..65fb9b75 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -38,6 +38,10 @@
#include "Utils.h"
#include "version.h"
+#if defined(Q_OS_MAC)
+#include "emoji/MacHelper.h"
+#endif
+
#if defined(Q_OS_LINUX)
#include <boost/stacktrace.hpp>
#include <signal.h>
@@ -186,6 +190,12 @@ main(int argc, char *argv[])
}
});
+#if defined(Q_OS_MAC)
+ // Temporary solution for the emoji picker until
+ // nheko has a proper menu bar with more functionality.
+ MacHelper::initializeMenus();
+#endif
+
nhlog::ui()->info("starting nheko {}", nheko::version);
return app.exec();
|