TGUI 1.12
Loading...
Searching...
No Matches
Keyboard.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2026 Bruno Van de Velde (vdv_b@tgui.eu)
5//
6// This software is provided 'as-is', without any express or implied warranty.
7// In no event will the authors be held liable for any damages arising from the use of this software.
8//
9// Permission is granted to anyone to use this software for any purpose,
10// including commercial applications, and to alter it and redistribute it freely,
11// subject to the following restrictions:
12//
13// 1. The origin of this software must not be misrepresented;
14// you must not claim that you wrote the original software.
15// If you use this software in a product, an acknowledgment
16// in the product documentation would be appreciated but is not required.
17//
18// 2. Altered source versions must be plainly marked as such,
19// and must not be misrepresented as being the original software.
20//
21// 3. This notice may not be removed or altered from any source distribution.
22//
24
25#ifndef TGUI_KEYBOARD_HPP
26#define TGUI_KEYBOARD_HPP
27
29
30#include <TGUI/Config.hpp>
31#include <TGUI/Event.hpp>
32#include <TGUI/Container.hpp>
33#include <TGUI/Widgets/ScrollablePanel.hpp>
34#include <TGUI/Backend/Window/Backend.hpp>
35#include <TGUI/Backend/Window/BackendGui.hpp>
36
38
39namespace tgui
40{
41 namespace keyboard
42 {
44#ifndef TGUI_REMOVE_DEPRECATED_CODE
45 TGUI_DEPRECATED("Use BackendGui::startTextInput instead") inline void openVirtualKeyboard(const Widget* requestingWidget, FloatRect inputRect)
46 {
47 TGUI_ASSERT(requestingWidget != nullptr, "requestingWidget must not be nullptr");
48 if (!requestingWidget)
49 return;
50
51 const Widget* widget = requestingWidget;
52 while (widget)
53 {
54 const bool defaultOrigin = (widget->getOrigin().x == 0) && (widget->getOrigin().y == 0);
55 const bool scaledOrRotated = (widget->getScale().x != 1) || (widget->getScale().y != 1) || (widget->getRotation() != 0);
56 if (defaultOrigin && !scaledOrRotated)
57 inputRect.setPosition(inputRect.getPosition() + widget->getPosition());
58 else
59 {
60 const Vector2f origin{widget->getOrigin().x * widget->getSize().x, widget->getOrigin().y * widget->getSize().y};
61 if (!scaledOrRotated)
62 inputRect.setPosition(inputRect.getPosition() + widget->getPosition() - origin);
63 else
64 {
65 const Vector2f rotOrigin{widget->getRotationOrigin().x * widget->getSize().x, widget->getRotationOrigin().y * widget->getSize().y};
66 const Vector2f scaleOrigin{widget->getScaleOrigin().x * widget->getSize().x, widget->getScaleOrigin().y * widget->getSize().y};
67
68 Transform transform;
69 transform.translate(widget->getPosition() - origin);
70 transform.rotate(widget->getRotation(), rotOrigin);
71 transform.scale(widget->getScale(), scaleOrigin);
72 inputRect = transform.transformRect(inputRect);
73 }
74 }
75
76 const Container* parent = widget->getParent();
77 if (parent)
78 {
79 inputRect.setPosition(inputRect.getPosition() + parent->getChildWidgetsOffset());
80
81 const auto* panel = dynamic_cast<const ScrollablePanel*>(parent);
82 if (panel)
83 inputRect.setPosition(inputRect.getPosition() - panel->getContentOffset());
84 }
85
86 widget = parent;
87 }
88
89 const auto* gui = requestingWidget->getParentGui();
90 if (gui)
91 {
92 const Vector2f topLeftPos = gui->mapCoordsToPixel(inputRect.getPosition());
93 const Vector2f bottomRightPos = gui->mapCoordsToPixel(inputRect.getPosition() + inputRect.getSize());
94 inputRect = {topLeftPos, bottomRightPos - topLeftPos};
95 }
96
97 TGUI_IGNORE_DEPRECATED_WARNINGS_START
98 getBackend()->openVirtualKeyboard(inputRect);
99 TGUI_IGNORE_DEPRECATED_WARNINGS_END
100 }
101#endif
103
104 TGUI_NODISCARD inline bool isShiftPressed(const Event::KeyEvent& event)
105 {
106 return event.shift;
107 }
108
110#ifndef TGUI_REMOVE_DEPRECATED_CODE
111 TGUI_DEPRECATED("Use isShiftPressed(gui) instead") TGUI_NODISCARD inline bool isShiftPressed()
112 {
113 TGUI_IGNORE_DEPRECATED_WARNINGS_START
114 return getBackend()->isKeyboardModifierPressed(Event::KeyModifier::Shift);
115 TGUI_IGNORE_DEPRECATED_WARNINGS_END
116 }
117#endif
119
120 TGUI_NODISCARD inline bool isShiftPressed(const BackendGui* gui)
121 {
122 return gui->isKeyboardModifierPressed(Event::KeyModifier::Shift);
123 }
124
126#ifndef TGUI_REMOVE_DEPRECATED_CODE
127 TGUI_DEPRECATED("Use BackendGui::stopTextInput instead") inline void closeVirtualKeyboard()
128 {
129 TGUI_IGNORE_DEPRECATED_WARNINGS_START
130 getBackend()->closeVirtualKeyboard();
131 TGUI_IGNORE_DEPRECATED_WARNINGS_END
132 }
133#endif
135
136 TGUI_NODISCARD inline bool isMultiselectModifierPressed(const Event::KeyEvent& event)
137 {
138#ifdef TGUI_SYSTEM_MACOS
139 return event.system;
140#else
141 return event.control;
142#endif
143 }
144
146#ifndef TGUI_REMOVE_DEPRECATED_CODE
147 TGUI_DEPRECATED("Use isMultiselectModifierPressed(gui) instead") TGUI_NODISCARD inline bool isMultiselectModifierPressed()
148 {
149 TGUI_IGNORE_DEPRECATED_WARNINGS_START
150#ifdef TGUI_SYSTEM_MACOS
151 return getBackend()->isKeyboardModifierPressed(Event::KeyModifier::System);
152#else
153 return getBackend()->isKeyboardModifierPressed(Event::KeyModifier::Control);
154#endif
155 TGUI_IGNORE_DEPRECATED_WARNINGS_END
156 }
157#endif
159
160 TGUI_NODISCARD inline bool isMultiselectModifierPressed(const BackendGui* gui)
161 {
162#ifdef TGUI_SYSTEM_MACOS
163 return gui->isKeyboardModifierPressed(Event::KeyModifier::System);
164#else
165 return gui->isKeyboardModifierPressed(Event::KeyModifier::Control);
166#endif
167 }
168
170
171 TGUI_NODISCARD inline bool isKeyPressCopy(const Event::KeyEvent& event)
172 {
173#ifdef TGUI_SYSTEM_MACOS
174 return (event.code == Event::KeyboardKey::C) && !event.control && !event.alt && !event.shift && event.system;
175#else
176 return (event.code == Event::KeyboardKey::C) && event.control && !event.alt && !event.shift && !event.system;
177#endif
178 }
179
181
182 TGUI_NODISCARD inline bool isKeyPressCut(const Event::KeyEvent& event)
183 {
184#ifdef TGUI_SYSTEM_MACOS
185 return (event.code == Event::KeyboardKey::X) && !event.control && !event.alt && !event.shift && event.system;
186#else
187 return (event.code == Event::KeyboardKey::X) && event.control && !event.alt && !event.shift && !event.system;
188#endif
189 }
190
192
193 TGUI_NODISCARD inline bool isKeyPressPaste(const Event::KeyEvent& event)
194 {
195#ifdef TGUI_SYSTEM_MACOS
196 return (event.code == Event::KeyboardKey::V) && !event.control && !event.alt && !event.shift && event.system;
197#else
198 return (event.code == Event::KeyboardKey::V) && event.control && !event.alt && !event.shift && !event.system;
199#endif
200 }
201
203
204 TGUI_NODISCARD inline bool isKeyPressSelectAll(const Event::KeyEvent& event)
205 {
206#ifdef TGUI_SYSTEM_MACOS
207 return (event.code == Event::KeyboardKey::A) && !event.control && !event.alt && !event.shift && event.system;
208#else
209 return (event.code == Event::KeyboardKey::A) && event.control && !event.alt && !event.shift && !event.system;
210#endif
211 }
212
214
215 TGUI_NODISCARD inline bool isKeyPressMoveCaretLeft(const Event::KeyEvent& event)
216 {
217 return (event.code == Event::KeyboardKey::Left) && !event.control && !event.alt && !event.system;
218 }
219
221
222 TGUI_NODISCARD inline bool isKeyPressMoveCaretRight(const Event::KeyEvent& event)
223 {
224 return (event.code == Event::KeyboardKey::Right) && !event.control && !event.alt && !event.system;
225 }
226
228
229 TGUI_NODISCARD inline bool isKeyPressMoveCaretWordBegin(const Event::KeyEvent& event)
230 {
231#ifdef TGUI_SYSTEM_MACOS
232 return (event.code == Event::KeyboardKey::Left) && !event.control && event.alt && !event.system;
233#else
234 return (event.code == Event::KeyboardKey::Left) && event.control && !event.alt && !event.system;
235#endif
236 }
237
239
240 TGUI_NODISCARD inline bool isKeyPressMoveCaretWordEnd(const Event::KeyEvent& event)
241 {
242#ifdef TGUI_SYSTEM_MACOS
243 return (event.code == Event::KeyboardKey::Right) && !event.control && event.alt && !event.system;
244#else
245 return (event.code == Event::KeyboardKey::Right) && event.control && !event.alt && !event.system;
246#endif
247 }
248
250
251 TGUI_NODISCARD inline bool isKeyPressMoveCaretUp(const Event::KeyEvent& event)
252 {
253#ifdef TGUI_SYSTEM_MACOS
254 // Option+UpArrow should actually move to the beginning of the paragraph (or the previous one), but we don't support this
255 return (event.code == Event::KeyboardKey::Up) && !event.control && !event.system;
256#else
257 return (event.code == Event::KeyboardKey::Up) && !event.alt && !event.system;
258#endif
259 }
260
262
263 TGUI_NODISCARD inline bool isKeyPressMoveCaretDown(const Event::KeyEvent& event)
264 {
265#ifdef TGUI_SYSTEM_MACOS
266 // Option+DownArrow should actually move to the end of the paragraph (or the next one), but we don't support this
267 return (event.code == Event::KeyboardKey::Down) && !event.control && !event.system;
268#else
269 return (event.code == Event::KeyboardKey::Down) && !event.alt && !event.system;
270#endif
271 }
272
274
275 TGUI_NODISCARD inline bool isKeyPressMoveCaretLineStart(const Event::KeyEvent& event)
276 {
277#ifdef TGUI_SYSTEM_MACOS
278 if ((event.code == Event::KeyboardKey::Left) && !event.control && !event.alt && event.system)
279 return true;
280#endif
281 return (event.code == Event::KeyboardKey::Home) && !event.control && !event.alt && !event.system;
282 }
283
285
286 TGUI_NODISCARD inline bool isKeyPressMoveCaretLineEnd(const Event::KeyEvent& event)
287 {
288#ifdef TGUI_SYSTEM_MACOS
289 if ((event.code == Event::KeyboardKey::Right) && !event.control && !event.alt && event.system)
290 return true;
291#endif
292 return (event.code == Event::KeyboardKey::End) && !event.control && !event.alt && !event.system;
293 }
294
296
297 TGUI_NODISCARD inline bool isKeyPressMoveCaretDocumentBegin(const Event::KeyEvent& event)
298 {
299#ifdef TGUI_SYSTEM_MACOS
300 return ((event.code == Event::KeyboardKey::Up) && !event.control && !event.alt && event.system)
301 || ((event.code == Event::KeyboardKey::Home) && !event.control && !event.alt && event.system);
302#else
303 return (event.code == Event::KeyboardKey::Home) && event.control && !event.alt && !event.system;
304#endif
305 }
306
308
309 TGUI_NODISCARD inline bool isKeyPressMoveCaretDocumentEnd(const Event::KeyEvent& event)
310 {
311#ifdef TGUI_SYSTEM_MACOS
312 return ((event.code == Event::KeyboardKey::Down) && !event.control && !event.alt && event.system)
313 || ((event.code == Event::KeyboardKey::End) && !event.control && !event.alt && event.system);
314#else
315 return (event.code == Event::KeyboardKey::End) && event.control && !event.alt && !event.system;
316#endif
317 }
318
320
321 TGUI_NODISCARD inline bool isKeyPressDeleteWordLeft(const Event::KeyEvent& event)
322 {
323#ifdef TGUI_SYSTEM_MACOS
324 return (event.code == Event::KeyboardKey::Backspace) && !event.control && event.alt && !event.system;
325#else
326 return (event.code == Event::KeyboardKey::Backspace) && event.control && !event.alt && !event.system;
327#endif
328 }
329
331
332 TGUI_NODISCARD inline bool isKeyPressDeleteWordRight(const Event::KeyEvent& event)
333 {
334#ifdef TGUI_SYSTEM_MACOS
335 return (event.code == Event::KeyboardKey::Delete) && !event.control && event.alt && !event.system;
336#else
337 return (event.code == Event::KeyboardKey::Delete) && event.control && !event.alt && !event.system;
338#endif
339 }
340
342 }
343}
344
346
347#endif // TGUI_KEYBOARD_HPP
348
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:36
TGUI_API std::shared_ptr< Backend > getBackend()
Returns the global backend.
@ X
The X key.
Definition Event.hpp:67
@ Down
Down arrow.
Definition Event.hpp:118
@ C
The C key.
Definition Event.hpp:46
@ Up
Up arrow.
Definition Event.hpp:117
@ V
The V key.
Definition Event.hpp:65
@ A
The A key.
Definition Event.hpp:44
@ End
The End key.
Definition Event.hpp:107
@ Home
The Home key.
Definition Event.hpp:108
@ Right
Right arrow.
Definition Event.hpp:116
@ Left
Left arrow.
Definition Event.hpp:115
@ Backspace
The Backspace key.
Definition Event.hpp:103
@ Delete
The Delete key.
Definition Event.hpp:110