]> git.lizzy.rs Git - irrlicht.git/commitdiff
CGUIEditBox: Use primary selection
authorDesour <vorunbekannt75@web.de>
Tue, 23 Aug 2022 16:55:08 +0000 (18:55 +0200)
committersfan5 <sfan5@live.de>
Fri, 24 Mar 2023 16:59:06 +0000 (17:59 +0100)
This is essentially the same as the commit in the minetest repo for GUIEditBox.

source/Irrlicht/CGUIEditBox.cpp

index cf4b64eec5d07f3a85bb14a0bb38f50b0dc44a25..24b8099aa7ee444aa93ae98411f4cdb93e2b1582 100644 (file)
@@ -1135,6 +1135,34 @@ bool CGUIEditBox::processMouse(const SEvent& event)
                                return true;\r
                        }\r
                }\r
+       case EMIE_MMOUSE_PRESSED_DOWN: {\r
+               if (!AbsoluteClippingRect.isPointInside(core::position2d<s32>(\r
+                                       event.MouseInput.X, event.MouseInput.Y)))\r
+                       return false;\r
+\r
+               if (!Environment->hasFocus(this)) {\r
+                       BlinkStartTime = os::Timer::getTime();\r
+               }\r
+\r
+               // move cursor and disable marking\r
+               CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);\r
+               MouseMarking = false;\r
+               setTextMarkers(CursorPos, CursorPos);\r
+\r
+               // paste from the primary selection\r
+               inputString([&] {\r
+                       irr::core::stringw inserted_text;\r
+                       if (!Operator)\r
+                               return inserted_text;\r
+                       const c8 *inserted_text_utf8 = Operator->getTextFromPrimarySelection();\r
+                       if (!inserted_text_utf8)\r
+                               return inserted_text;\r
+                       core::multibyteToWString(inserted_text, inserted_text_utf8);\r
+                       return inserted_text;\r
+               }());\r
+\r
+               return true;\r
+       }\r
        default:\r
                break;\r
        }\r
@@ -1624,6 +1652,17 @@ void CGUIEditBox::setTextMarkers(s32 begin, s32 end)
        {\r
                MarkBegin = begin;\r
                MarkEnd = end;\r
+\r
+               if (!PasswordBox && Operator && MarkBegin != MarkEnd) {\r
+                       // copy to primary selection\r
+                       const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;\r
+                       const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;\r
+\r
+                       core::stringc s;\r
+                       wStringToMultibyte(s, Text.subString(realmbgn, realmend - realmbgn));\r
+                       Operator->copyToPrimarySelection(s.c_str());\r
+               }\r
+\r
                sendGuiEvent(EGET_EDITBOX_MARKING_CHANGED);\r
        }\r
 }\r