reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/CMakeLists.txt | 2+-
Msrc/dialog.cpp | 6++++++
Msrc/dialog.hpp | 4++++
Asrc/dialog.mm | 13+++++++++++++
Msrc/richedit-gtk.cpp | 4+---
Msrc/richedit-win32.cpp | 4+---
Msrc/richedit.mm | 13++++---------
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) {