summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editor/rename_dialog.cpp2
-rw-r--r--platform/windows/display_server_windows.cpp6
-rw-r--r--scene/gui/popup.cpp16
-rw-r--r--scene/gui/popup.h4
4 files changed, 26 insertions, 2 deletions
diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp
index 1d9e799a30..e47250fcf8 100644
--- a/editor/rename_dialog.cpp
+++ b/editor/rename_dialog.cpp
@@ -356,6 +356,8 @@ void RenameDialog::_update_substitute() {
}
void RenameDialog::_post_popup() {
+ ConfirmationDialog::_post_popup();
+
EditorSelection *editor_selection = EditorNode::get_singleton()->get_editor_selection();
preview_node = nullptr;
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index 32af329d09..e771057d2e 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -2158,7 +2158,10 @@ void DisplayServerWindows::popup_close(WindowID p_window) {
WindowID win_id = E->get();
popup_list.erase(E);
- _send_window_event(windows[win_id], DisplayServerWindows::WINDOW_EVENT_CLOSE_REQUEST);
+ if (win_id != p_window) {
+ // Only request close on related windows, not this window. We are already processing it.
+ _send_window_event(windows[win_id], DisplayServerWindows::WINDOW_EVENT_CLOSE_REQUEST);
+ }
E = F;
}
}
@@ -2173,6 +2176,7 @@ LRESULT DisplayServerWindows::MouseProc(int code, WPARAM wParam, LPARAM lParam)
case WM_NCRBUTTONDOWN:
case WM_NCMBUTTONDOWN:
case WM_LBUTTONDOWN:
+ case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN: {
MOUSEHOOKSTRUCT *ms = (MOUSEHOOKSTRUCT *)lParam;
Point2i pos = Point2i(ms->pt.x, ms->pt.y);
diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp
index b9e3e7814e..6532fc5934 100644
--- a/scene/gui/popup.cpp
+++ b/scene/gui/popup.cpp
@@ -108,11 +108,25 @@ void Popup::_close_pressed() {
_deinitialize_visible_parents();
- call_deferred(SNAME("hide"));
+ // Hide after returning to process events, but only if we don't
+ // get popped up in the interim.
+ call_deferred(SNAME("_popup_conditional_hide"));
+}
+
+void Popup::_post_popup() {
+ Window::_post_popup();
+ popped_up = true;
+}
+
+void Popup::_popup_conditional_hide() {
+ if (!popped_up) {
+ hide();
+ }
}
void Popup::_bind_methods() {
ADD_SIGNAL(MethodInfo("popup_hide"));
+ ClassDB::bind_method(D_METHOD("_popup_conditional_hide"), &Popup::_popup_conditional_hide);
}
Rect2i Popup::_popup_adjust_rect() const {
diff --git a/scene/gui/popup.h b/scene/gui/popup.h
index 6211af4d20..27f46d4a97 100644
--- a/scene/gui/popup.h
+++ b/scene/gui/popup.h
@@ -57,6 +57,10 @@ protected:
void _notification(int p_what);
static void _bind_methods();
+ void _popup_conditional_hide();
+
+ virtual void _post_popup() override;
+
public:
Popup();
~Popup();