diff --git a/ui/platform/linux/ui_utility_linux.h b/ui/platform/linux/ui_utility_linux.h index f2b58a7..bdde615 100644 --- a/ui/platform/linux/ui_utility_linux.h +++ b/ui/platform/linux/ui_utility_linux.h @@ -29,6 +29,9 @@ inline void UpdateOverlayed(not_null widget) { inline void ShowOverAll(not_null widget, bool canFocus) { } +inline void AcceptAllMouseInput(not_null widget) { +} + inline void DisableSystemWindowResize(not_null widget, QSize ratio) { } diff --git a/ui/platform/mac/ui_utility_mac.mm b/ui/platform/mac/ui_utility_mac.mm index 366b42f..9f30cec 100644 --- a/ui/platform/mac/ui_utility_mac.mm +++ b/ui/platform/mac/ui_utility_mac.mm @@ -77,6 +77,23 @@ void ShowOverAll(not_null widget, bool canFocus) { } } +void AcceptAllMouseInput(not_null widget) { + // https://github.com/telegramdesktop/tdesktop/issues/27025 + // + // By default system clicks through fully transparent pixels, + // and starting with macOS 14.1 it counts the transparency + // incorrectly (as if `y` is mirrored), so when clicking + // on a reactions strip outside of the menu column the click + // is ignored and made on the underlying window, because at the + // bottom of the menu in the same place there is nothing, empty. + // + // We explicitly request all the input to disable this behavior. + // + // See https://stackoverflow.com/a/29451199 and comments. + NSWindow *window = [reinterpret_cast(widget->winId()) window]; + [window setIgnoresMouseEvents:NO]; +} + void DrainMainQueue() { #ifndef OS_MAC_STORE _dispatch_main_queue_callback_4CF(nullptr); diff --git a/ui/platform/ui_platform_utility.h b/ui/platform/ui_platform_utility.h index 73d6c27..227c064 100644 --- a/ui/platform/ui_platform_utility.h +++ b/ui/platform/ui_platform_utility.h @@ -28,6 +28,7 @@ void UpdateOverlayed(not_null widget); void ShowOverAll(not_null widget, bool canFocus = true); void IgnoreAllActivation(not_null widget); void ClearTransientParent(not_null widget); +void AcceptAllMouseInput(not_null widget); void DisableSystemWindowResize(not_null widget, QSize ratio); diff --git a/ui/platform/win/ui_utility_win.h b/ui/platform/win/ui_utility_win.h index 26def3f..a4f79be 100644 --- a/ui/platform/win/ui_utility_win.h +++ b/ui/platform/win/ui_utility_win.h @@ -32,6 +32,9 @@ inline void ReInitOnTopPanel(not_null panel) { inline void ShowOverAll(not_null widget, bool canFocus) { } +inline void AcceptAllMouseInput(not_null widget) { +} + inline void ClearTransientParent(not_null widget) { } diff --git a/ui/widgets/popup_menu.cpp b/ui/widgets/popup_menu.cpp index fba91a9..ad7f62d 100644 --- a/ui/widgets/popup_menu.cpp +++ b/ui/widgets/popup_menu.cpp @@ -490,6 +490,7 @@ void PopupMenu::paintEvent(QPaintEvent *e) { PostponeCall(this, [=] { showChildren(); _animatePhase = AnimatePhase::Shown; + Platform::AcceptAllMouseInput(this); }); } else { paintBg(p);