From d4cefb8ba6bb43cfcbc80149f312dc8af683535d Mon Sep 17 00:00:00 2001 From: David Capello <david@igara.com> Date: Thu, 15 Dec 2022 19:29:28 -0300 Subject: [PATCH] Fix crash double clicking a Dialog:canvas() There were missing some setRecipient() when some messages are converted to other kind of message (e.g. DoubleClick -> MouseDown) --- src/app/script/dialog_class.cpp | 4 ++++ src/ui/combobox.cpp | 1 + src/ui/int_entry.cpp | 1 + src/ui/widget.cpp | 1 + 4 files changed, 7 insertions(+) diff --git a/src/app/script/dialog_class.cpp b/src/app/script/dialog_class.cpp index ecfe3d249..89585ce0a 100644 --- a/src/app/script/dialog_class.cpp +++ b/src/app/script/dialog_class.cpp @@ -927,6 +927,10 @@ int Dialog_canvas(lua_State* L) auto mouseCallback = [](lua_State* L, ui::MouseMessage* msg) { + ASSERT(msg->recipient()); + if (!msg->recipient()) + return; + lua_pushinteger(L, msg->position().x - msg->recipient()->bounds().x); lua_setfield(L, -2, "x"); diff --git a/src/ui/combobox.cpp b/src/ui/combobox.cpp index 87e65347b..d36be4832 100644 --- a/src/ui/combobox.cpp +++ b/src/ui/combobox.cpp @@ -538,6 +538,7 @@ bool ComboBoxEntry::onProcessMessage(Message* msg) kMouseDownMessage, *mouseMsg, mouseMsg->positionForDisplay(pick->display())); + mouseMsg2.setRecipient(pick); mouseMsg2.setDisplay(pick->display()); pick->sendMessage(&mouseMsg2); return true; diff --git a/src/ui/int_entry.cpp b/src/ui/int_entry.cpp index a76915d4d..db3fc8301 100644 --- a/src/ui/int_entry.cpp +++ b/src/ui/int_entry.cpp @@ -98,6 +98,7 @@ bool IntEntry::onProcessMessage(Message* msg) MouseMessage mouseMsg2(kMouseDownMessage, *mouseMsg, mouseMsg->positionForDisplay(pick->display())); + mouseMsg2.setRecipient(pick); mouseMsg2.setDisplay(pick->display()); pick->sendMessage(&mouseMsg2); } diff --git a/src/ui/widget.cpp b/src/ui/widget.cpp index d86d4934c..f10f4d599 100644 --- a/src/ui/widget.cpp +++ b/src/ui/widget.cpp @@ -1557,6 +1557,7 @@ bool Widget::onProcessMessage(Message* msg) MouseMessage mouseMsg2(kMouseDownMessage, *mouseMsg, mouseMsg->position()); + mouseMsg2.setRecipient(this); mouseMsg2.setDisplay(mouseMsg->display()); sendMessage(&mouseMsg2); break;