diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml index 4b43286594..92d6a220d2 100644 --- a/doc/classes/DisplayServer.xml +++ b/doc/classes/DisplayServer.xml @@ -819,6 +819,8 @@ + + Makes the mouse cursor visible if it is hidden. diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index c0e5aac938..212b6762e1 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -124,6 +124,7 @@ bool DisplayServerX11::has_feature(Feature p_feature) const { #ifdef DBUS_ENABLED case FEATURE_KEEP_SCREEN_ON: #endif + case FEATURE_CLIPBOARD_PRIMARY: return true; default: { } diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 99c5e3bf0c..dda1151273 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -235,7 +235,7 @@ void LineEdit::gui_input(const Ref &p_event) { return; } - if (is_middle_mouse_paste_enabled() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_MIDDLE && is_editable()) { + if (is_middle_mouse_paste_enabled() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_MIDDLE && is_editable() && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { String paste_buffer = DisplayServer::get_singleton()->clipboard_get_primary().strip_escapes(); deselect(); @@ -290,7 +290,7 @@ void LineEdit::gui_input(const Ref &p_event) { selection.double_click = true; last_dblclk = 0; caret_column = selection.begin; - if (!pass) { + if (!pass && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { DisplayServer::get_singleton()->clipboard_set_primary(text); } } else if (b->is_double_click()) { @@ -308,7 +308,7 @@ void LineEdit::gui_input(const Ref &p_event) { break; } } - if (!pass) { + if (!pass && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { DisplayServer::get_singleton()->clipboard_set_primary(text.substr(selection.begin, selection.end - selection.begin)); } } @@ -328,7 +328,7 @@ void LineEdit::gui_input(const Ref &p_event) { update(); } else { - if (selection.enabled && !pass && b->get_button_index() == MOUSE_BUTTON_LEFT) { + if (selection.enabled && !pass && b->get_button_index() == MOUSE_BUTTON_LEFT && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { DisplayServer::get_singleton()->clipboard_set_primary(text.substr(selection.begin, selection.end - selection.begin)); } if (!text.is_empty() && is_editable() && clear_button_enabled) { diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index b3788f6317..31767dd263 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -1596,14 +1596,16 @@ void RichTextLabel::gui_input(const Ref &p_event) { selection.to_char = words[i + 1]; selection.active = true; - DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { + DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + } update(); break; } } } } else if (!b->is_pressed()) { - if (selection.enabled) { + if (selection.enabled && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); } selection.click_item = nullptr; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index a1d66d8544..8cb3b23020 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1534,7 +1534,7 @@ void TextEdit::gui_input(const Ref &p_gui_input) { update(); } - if (is_middle_mouse_paste_enabled() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { + if (is_middle_mouse_paste_enabled() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { paste_primary_clipboard(); } @@ -1575,7 +1575,9 @@ void TextEdit::gui_input(const Ref &p_gui_input) { dragging_selection = false; can_drag_minimap = false; click_select_held->stop(); - DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { + DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + } } // Notify to show soft keyboard. @@ -5167,7 +5169,7 @@ void TextEdit::_paste_internal() { } void TextEdit::_paste_primary_clipboard_internal() { - if (!is_editable()) { + if (!is_editable() || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { return; } @@ -5520,7 +5522,9 @@ void TextEdit::_update_selection_mode_word() { } } - DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { + DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + } update(); @@ -5549,7 +5553,9 @@ void TextEdit::_update_selection_mode_line() { set_caret_column(0); select(selection.selecting_line, selection.selecting_column, line, col); - DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CLIPBOARD_PRIMARY)) { + DisplayServer::get_singleton()->clipboard_set_primary(get_selected_text()); + } update(); diff --git a/servers/display_server.cpp b/servers/display_server.cpp index a6101530c8..3fb47e8f05 100644 --- a/servers/display_server.cpp +++ b/servers/display_server.cpp @@ -497,6 +497,7 @@ void DisplayServer::_bind_methods() { BIND_ENUM_CONSTANT(FEATURE_NATIVE_ICON); BIND_ENUM_CONSTANT(FEATURE_ORIENTATION); BIND_ENUM_CONSTANT(FEATURE_SWAP_BUFFERS); + BIND_ENUM_CONSTANT(FEATURE_CLIPBOARD_PRIMARY); BIND_ENUM_CONSTANT(MOUSE_MODE_VISIBLE); BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN); diff --git a/servers/display_server.h b/servers/display_server.h index 8af7946a1e..2595cf2eb8 100644 --- a/servers/display_server.h +++ b/servers/display_server.h @@ -114,6 +114,7 @@ public: FEATURE_ORIENTATION, FEATURE_SWAP_BUFFERS, FEATURE_KEEP_SCREEN_ON, + FEATURE_CLIPBOARD_PRIMARY, }; virtual bool has_feature(Feature p_feature) const = 0;