commit 66efeb3830e71377fdd707d91c26b9adcbc0fab1
parent 2048d8d949a3adfd7e35df7d36c6ec01709708b4
Author: cfillion <cfillion@users.noreply.github.com>
Date: Tue, 18 Feb 2020 15:03:57 -0500
better solution for enabling link mouseover cursors on macOS
The previous solution (using SetCapture) was eating keyboard input
in all SWELL windows when using REAPER-provided up-to-date SWELL.
Diffstat:
7 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
@@ -65,7 +65,7 @@ add_library(reapack OBJECT
config.cpp
control.cpp
database.cpp
- dialog.cpp
+ dialog.cpp $<IF:$<BOOL:${APPLE}>,dialog.mm,>
download.cpp
event.cpp
filedialog.cpp
diff --git a/src/dialog.cpp b/src/dialog.cpp
@@ -72,6 +72,12 @@ WDL_DLGRET Dialog::Proc(HWND handle, UINT msg, WPARAM wParam, LPARAM lParam)
if(wParam != SIZE_MINIMIZED)
dlg->onResize();
break;
+#ifdef __APPLE__
+ // This stops SWELL_SendMouseMessageImpl from continuously resetting the
+ // mouse cursor allowing NSTextViews to change it on mouse hover.
+ case WM_SETCURSOR:
+ return dlg->isTextEditUnderMouse();
+#endif
case WM_DESTROY:
dlg->onClose();
break;
diff --git a/src/dialog.hpp b/src/dialog.hpp
@@ -143,6 +143,10 @@ private:
static WDL_DLGRET Proc(HWND, UINT, WPARAM, LPARAM);
static int HandleKey(MSG *, accelerator_register_t *);
+#ifdef __APPLE__
+ bool isTextEditUnderMouse() const;
+#endif
+
const int m_template;
POINT m_minimumSize;
WDL_WndSizer m_resizer;
diff --git a/src/dialog.mm b/src/dialog.mm
@@ -0,0 +1,13 @@
+#include "dialog.hpp"
+
+#include <AppKit/NSTextView.h>
+#include <swell/swell.h>
+
+bool Dialog::isTextEditUnderMouse() const
+{
+ POINT p;
+ GetCursorPos(&p);
+ const HWND ctrl = WindowFromPoint(p);
+
+ return ctrl && [static_cast<id>(ctrl) isKindOfClass:[NSTextView class]];
+}
diff --git a/src/richedit-gtk.cpp b/src/richedit-gtk.cpp
@@ -29,9 +29,7 @@ RichEdit::RichEdit(HWND handle)
{
}
-RichEdit::~RichEdit()
-{
-}
+RichEdit::~RichEdit() = default;
void RichEdit::onNotify(LPNMHDR, LPARAM)
{
diff --git a/src/richedit-win32.cpp b/src/richedit-win32.cpp
@@ -53,9 +53,7 @@ RichEdit::RichEdit(HWND handle)
SES_HYPERLINKTOOLTIPS, SES_HYPERLINKTOOLTIPS);
}
-RichEdit::~RichEdit()
-{
-}
+RichEdit::~RichEdit() = default;
void RichEdit::onNotify(LPNMHDR info, LPARAM lParam)
{
diff --git a/src/richedit.mm b/src/richedit.mm
@@ -17,7 +17,9 @@
#include "richedit.hpp"
-#include <Cocoa/Cocoa.h>
+#include <AppKit/NSAttributedString.h>
+#include <AppKit/NSColor.h>
+#include <AppKit/NSTextView.h>
void RichEdit::Init()
{
@@ -26,16 +28,9 @@ void RichEdit::Init()
RichEdit::RichEdit(HWND handle)
: Control(handle)
{
- // hack: restore NSTextView's default mouse cursors (eg. hover links)
- // this is an incomplete fix for the hyperlink's shy tooltips
- SetCapture(handle);
}
-RichEdit::~RichEdit()
-{
- if(GetCapture() == handle())
- ReleaseCapture();
-}
+RichEdit::~RichEdit() = default;
void RichEdit::onNotify(LPNMHDR, LPARAM)
{