Coverage Report

Created: 2026-01-25 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qtbase/src/gui/kernel/qplatformtheme.cpp
Line
Count
Source
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4
#include "qplatformtheme.h"
5
6
#include "qplatformtheme_p.h"
7
8
#include <QtCore/QVariant>
9
#include <QtCore/QStringList>
10
#include <QtCore/qfileinfo.h>
11
#include <qicon.h>
12
#include <qpalette.h>
13
#include <qtextformat.h>
14
#include <private/qiconloader_p.h>
15
#include <private/qguiapplication_p.h>
16
#include <qpa/qplatformintegration.h>
17
#include <qpa/qplatformdialoghelper.h>
18
19
#include <algorithm>
20
21
QT_BEGIN_NAMESPACE
22
23
/*!
24
    \class QPlatformTheme
25
    \since 5.0
26
    \internal
27
    \preliminary
28
    \ingroup qpa
29
    \brief The QPlatformTheme class allows customizing the UI based on themes.
30
31
    See the init_platform function in qguiapplication.cpp for the complete
32
    platform initialization process.
33
*/
34
35
/*!
36
    \enum QPlatformTheme::ThemeHint
37
38
    This enum describes the available theme hints.
39
40
    \value CursorFlashTime (int) Cursor flash time in ms, overriding
41
                                 QPlatformIntegration::styleHint.
42
43
    \value KeyboardInputInterval (int) Keyboard input interval in ms, overriding
44
                                 QPlatformIntegration::styleHint.
45
46
    \value MouseDoubleClickInterval (int) Mouse double click interval in ms,
47
                                    overriding QPlatformIntegration::styleHint.
48
49
    \value MouseDoubleClickDistance (int) The maximum distance in logical pixels which the mouse can travel
50
                        between clicks in order for the click sequence to be handled as a double click.
51
                        The default value is 5 logical pixels.
52
53
    \value MousePressAndHoldInterval (int) Mouse press and hold interval in ms,
54
                                    overriding QPlatformIntegration::styleHint.
55
56
    \value StartDragDistance (int) Start drag distance,
57
                             overriding QPlatformIntegration::styleHint.
58
59
    \value StartDragTime (int) Start drag time in ms,
60
                               overriding QPlatformIntegration::styleHint.
61
62
    \value WheelScrollLines (int) The number of lines to scroll a widget, when the mouse wheel is rotated.
63
                        The default value is 3.  \sa QApplication::wheelScrollLines()
64
65
    \value KeyboardAutoRepeatRate (int) Keyboard auto repeat rate,
66
                                  overriding QPlatformIntegration::styleHint.
67
68
    \value PasswordMaskDelay (int) Pass word mask delay in ms,
69
                                   overriding QPlatformIntegration::styleHint.
70
71
    \value StartDragVelocity (int) Velocity of a drag,
72
                                   overriding QPlatformIntegration::styleHint.
73
74
    \value TextCursorWidth  (int) Determines the width of the text cursor.
75
76
    \value DropShadow       (bool) Determines whether the drop shadow effect for
77
                            tooltips or whatsthis is enabled.
78
79
    \value MaximumScrollBarDragDistance (int) Determines the value returned by
80
                            QStyle::pixelMetric(PM_MaximumDragDistance)
81
82
    \value ToolButtonStyle (int) A value representing a Qt::ToolButtonStyle.
83
84
    \value ToolBarIconSize Icon size for tool bars.
85
86
    \value SystemIconThemeName (QString) Name of the icon theme.
87
88
    \value SystemIconFallbackThemeName (QString) Name of the fallback icon theme.
89
90
    \value IconThemeSearchPaths (QStringList) Search paths for icons.
91
92
    \value ItemViewActivateItemOnSingleClick (bool) Activate items by single click.
93
94
    \value StyleNames (QStringList) A list of preferred style names.
95
96
    \value WindowAutoPlacement (bool) A boolean value indicating whether Windows
97
                               (particularly dialogs) are placed by the system
98
                               (see _NET_WM_FULL_PLACEMENT in X11).
99
100
    \value DialogButtonBoxLayout (int) An integer representing a
101
                                 QDialogButtonBox::ButtonLayout value.
102
103
    \value DialogButtonBoxButtonsHaveIcons (bool) A boolean value indicating whether
104
                                            the buttons of a QDialogButtonBox should have icons.
105
106
    \value UseFullScreenForPopupMenu (bool) Pop menus can cover the full screen including task bar.
107
108
    \value KeyboardScheme (int) An integer value (enum KeyboardSchemes) specifying the
109
                           keyboard scheme.
110
111
    \value UiEffects (int) A flag value consisting of UiEffect values specifying the enabled UI animations.
112
113
    \value SpellCheckUnderlineStyle (int) A QTextCharFormat::UnderlineStyle specifying
114
                                    the underline style used misspelled words when spell checking.
115
116
    \value TabFocusBehavior (int) A Qt::TabFocusBehavior specifying
117
                         the behavior of focus change when tab key was pressed.
118
                         This enum value was added in Qt 5.5.
119
120
    \value DialogSnapToDefaultButton (bool) Whether the mouse should snap to the default button when a dialog
121
                                     becomes visible.
122
123
    \value ContextMenuOnMouseRelease (bool) Whether the context menu should be shown on mouse release.
124
125
    \value MenuSelectionWraps (bool) Determines whether menu selection wraps. That is, whether key navigation moves
126
                                     the selection to the first menu item again after the last menu item has been
127
                                     reached, and vice versa.
128
                                     This enum value was added in Qt 6.10.
129
130
    \value TouchDoubleTapDistance (int) The maximum distance in logical pixels which a touchpoint can travel
131
                        between taps in order for the tap sequence to be handled as a double tap.
132
                        The default value is double the MouseDoubleClickDistance, or 10 logical pixels
133
                        if that is not specified.
134
135
    \value ShowShortcutsInContextMenus (bool) Whether to display shortcut key sequences in context menus.
136
137
    \value InteractiveResizeAcrossScreens (bool) Whether using the whole virtual geometry of all the screens
138
                        as basis for the resize.
139
                        This enum value has been added in Qt 6.2.
140
141
    \value ShowDirectoriesFirst (bool) Whether directories should be shown
142
           first (before files) in file dialogs.
143
           This enum value was added in Qt 6.3.
144
145
    \value PreselectFirstFileInDirectory (bool) Whether the first file in a directory
146
           should be automatically selected when a file dialog opens.
147
           This enum value was added in Qt 6.3.
148
149
    \value ButtonPressKeys (QList<Qt::Key>) A list of keys that can be used to press buttons via keyboard input.
150
151
    \value SetFocusOnTouchRelease (bool) Whether focus objects (line edits etc) should receive
152
           input focus after a touch/mouse release.
153
           This enum value has been added in Qt 6.5.
154
155
    \value MouseCursorTheme (QString) Name of the mouse cursor theme.
156
           This enum value has been added in Qt 6.5.
157
158
    \value MouseCursorSize (QSize) Size of the mouse cursor.
159
           This enum value has been added in Qt 6.5.
160
161
    \value ScrollSingleStepDistance (int) The distance in logical pixels that scrollable
162
           controls should scroll in response to a single step (e.g. scroll-bar arrow click,
163
           mouse wheel line).
164
165
    \sa themeHint(), QStyle::pixelMetric()
166
*/
167
168
169
#if QT_CONFIG(shortcut)
170
// Table of key bindings. It must be sorted on key sequence:
171
// The integer value of VK_KEY | Modifier Keys (e.g., VK_META, and etc.)
172
// A priority of 1 indicates that this is the primary key binding when multiple are defined.
173
174
enum KeyPlatform {
175
    KB_Win = (1 << QPlatformTheme::WindowsKeyboardScheme),
176
    KB_Mac = (1 << QPlatformTheme::MacKeyboardScheme),
177
    KB_X11 = (1 << QPlatformTheme::X11KeyboardScheme),
178
    KB_KDE = (1 << QPlatformTheme::KdeKeyboardScheme),
179
    KB_Gnome = (1 << QPlatformTheme::GnomeKeyboardScheme),
180
    KB_CDE = (1 << QPlatformTheme::CdeKeyboardScheme),
181
    KB_All = 0xffff
182
};
183
184
const QKeyBinding QPlatformThemePrivate::keyBindings[] = {
185
    //   StandardKey                            Priority    Key Sequence                            Platforms
186
    {QKeySequence::HelpContents,            1,          Qt::CTRL | Qt::Key_Question,            KB_Mac},
187
    {QKeySequence::HelpContents,            0,          Qt::Key_F1,                             KB_Win | KB_X11},
188
    {QKeySequence::HelpContents,            0,          Qt::Key_Help,                           KB_All},
189
    {QKeySequence::WhatsThis,               1,          Qt::SHIFT | Qt::Key_F1,                 KB_All},
190
    {QKeySequence::Open,                    1,          Qt::CTRL | Qt::Key_O,                   KB_All},
191
    {QKeySequence::Open,                    0,          Qt::Key_Open,                           KB_All},
192
    {QKeySequence::Close,                   0,          Qt::CTRL | Qt::Key_F4,                  KB_Mac},
193
    {QKeySequence::Close,                   1,          Qt::CTRL | Qt::Key_F4,                  KB_Win},
194
    {QKeySequence::Close,                   1,          Qt::CTRL | Qt::Key_W,                   KB_Mac},
195
    {QKeySequence::Close,                   0,          Qt::CTRL | Qt::Key_W,                   KB_Win | KB_X11},
196
    {QKeySequence::Close,                   0,          Qt::Key_Close,                          KB_All},
197
    {QKeySequence::Save,                    1,          Qt::CTRL | Qt::Key_S,                   KB_All},
198
    {QKeySequence::Save,                    0,          Qt::Key_Save,                           KB_All},
199
    {QKeySequence::New,                     1,          Qt::CTRL | Qt::Key_N,                   KB_All},
200
    {QKeySequence::New,                     0,          Qt::Key_New,                            KB_All},
201
    {QKeySequence::Delete,                  0,          Qt::CTRL | Qt::Key_D,                   KB_X11}, //emacs (line edit only)
202
    {QKeySequence::Delete,                  1,          Qt::Key_Delete,                         KB_All},
203
    {QKeySequence::Delete,                  0,          Qt::META | Qt::Key_D,                   KB_Mac},
204
    {QKeySequence::Cut,                     1,          Qt::CTRL | Qt::Key_X,                   KB_All},
205
    {QKeySequence::Cut,                     0,          Qt::SHIFT | Qt::Key_Delete,             KB_Win | KB_X11}, //## Check if this should work on mac
206
    {QKeySequence::Cut,                     0,          Qt::Key_F20,                            KB_X11}, //Cut on sun keyboards
207
    {QKeySequence::Cut,                     0,          Qt::META | Qt::Key_K,                   KB_Mac},
208
    {QKeySequence::Cut,                     0,          Qt::Key_Cut,                            KB_All},
209
    {QKeySequence::Copy,                    0,          Qt::CTRL | Qt::Key_Insert,              KB_X11 | KB_Win},
210
    {QKeySequence::Copy,                    1,          Qt::CTRL | Qt::Key_C,                   KB_All},
211
    {QKeySequence::Copy,                    0,          Qt::Key_F16,                            KB_X11}, //Copy on sun keyboards
212
    {QKeySequence::Copy,                    0,          Qt::Key_Copy,                           KB_All},
213
    {QKeySequence::Paste,                   0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Insert,  KB_X11},
214
    {QKeySequence::Paste,                   1,          Qt::CTRL | Qt::Key_V,                   KB_All},
215
    {QKeySequence::Paste,                   0,          Qt::SHIFT | Qt::Key_Insert,             KB_Win | KB_X11},
216
    {QKeySequence::Paste,                   0,          Qt::Key_F18,                            KB_X11}, //Paste on sun keyboards
217
    {QKeySequence::Paste,                   0,          Qt::META | Qt::Key_Y,                   KB_Mac},
218
    {QKeySequence::Paste,                   0,          Qt::Key_Paste,                          KB_All},
219
    {QKeySequence::Undo,                    0,          Qt::ALT  | Qt::Key_Backspace,           KB_Win},
220
    {QKeySequence::Undo,                    1,          Qt::CTRL | Qt::Key_Z,                   KB_All},
221
    {QKeySequence::Undo,                    0,          Qt::Key_F14,                            KB_X11}, //Undo on sun keyboards
222
    {QKeySequence::Undo,                    0,          Qt::Key_Undo,                           KB_All},
223
    {QKeySequence::Redo,                    0,          Qt::ALT  | Qt::SHIFT | Qt::Key_Backspace,KB_Win},
224
    {QKeySequence::Redo,                    0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Z,       KB_Mac},
225
    {QKeySequence::Redo,                    0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Z,       KB_Win | KB_X11},
226
    {QKeySequence::Redo,                    1,          Qt::CTRL | Qt::Key_Y,                   KB_Win},
227
    {QKeySequence::Redo,                    0,          Qt::Key_Redo,                           KB_All},
228
    {QKeySequence::Back,                    1,          Qt::ALT  | Qt::Key_Left,                KB_Win | KB_X11},
229
    {QKeySequence::Back,                    0,          Qt::CTRL | Qt::Key_Left,                KB_Mac},
230
    {QKeySequence::Back,                    1,          Qt::CTRL | Qt::Key_BracketLeft,         KB_Mac},
231
    {QKeySequence::Back,                    0,          Qt::Key_Backspace,                      KB_Win},
232
    {QKeySequence::Back,                    0,          Qt::Key_Back,                           KB_All},
233
    {QKeySequence::Forward,                 1,          Qt::ALT  | Qt::Key_Right,               KB_Win | KB_X11},
234
    {QKeySequence::Forward,                 0,          Qt::CTRL | Qt::Key_Right,               KB_Mac},
235
    {QKeySequence::Forward,                 1,          Qt::CTRL | Qt::Key_BracketRight,        KB_Mac},
236
    {QKeySequence::Forward,                 0,          Qt::SHIFT | Qt::Key_Backspace,          KB_Win},
237
    {QKeySequence::Forward,                 0,          Qt::Key_Forward,                        KB_All},
238
    {QKeySequence::Refresh,                 1,          Qt::CTRL | Qt::Key_R,                   KB_Gnome | KB_Mac},
239
    {QKeySequence::Refresh,                 0,          Qt::Key_F5,                             KB_Win | KB_X11},
240
    {QKeySequence::Refresh,                 0,          Qt::Key_Refresh,                        KB_All},
241
    {QKeySequence::ZoomIn,                  1,          Qt::CTRL | Qt::Key_Plus,                KB_All},
242
    {QKeySequence::ZoomIn,                  0,          Qt::Key_ZoomIn,                         KB_All},
243
    {QKeySequence::ZoomOut,                 1,          Qt::CTRL | Qt::Key_Minus,               KB_All},
244
    {QKeySequence::ZoomOut,                 0,          Qt::Key_ZoomOut,                        KB_All},
245
    {QKeySequence::Print,                   1,          Qt::CTRL | Qt::Key_P,                   KB_All},
246
    {QKeySequence::AddTab,                  1,          Qt::CTRL | Qt::SHIFT | Qt::Key_N,       KB_KDE},
247
    {QKeySequence::AddTab,                  0,          Qt::CTRL | Qt::Key_T,                   KB_All},
248
    {QKeySequence::NextChild,               0,          Qt::CTRL | Qt::Key_F6,                  KB_Win},
249
    {QKeySequence::NextChild,               0,          Qt::CTRL | Qt::Key_Tab,                 KB_Mac}, //different priority from above
250
    {QKeySequence::NextChild,               1,          Qt::CTRL | Qt::Key_Tab,                 KB_Win | KB_X11},
251
    {QKeySequence::NextChild,               1,          Qt::CTRL | Qt::Key_BraceRight,          KB_Mac},
252
    {QKeySequence::NextChild,               0,          Qt::CTRL | Qt::Key_Comma,               KB_KDE},
253
    {QKeySequence::NextChild,               0,          Qt::Key_Forward,                        KB_All},
254
    {QKeySequence::PreviousChild,           0,          Qt::CTRL | Qt::SHIFT | Qt::Key_F6,      KB_Win},
255
    {QKeySequence::PreviousChild,           0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Backtab, KB_Mac },//different priority from above
256
    {QKeySequence::PreviousChild,           1,          Qt::CTRL | Qt::SHIFT | Qt::Key_Backtab, KB_Win | KB_X11},
257
    {QKeySequence::PreviousChild,           1,          Qt::CTRL | Qt::Key_BraceLeft,           KB_Mac},
258
    {QKeySequence::PreviousChild,           0,          Qt::CTRL | Qt::Key_Period,              KB_KDE},
259
    {QKeySequence::PreviousChild,           0,          Qt::Key_Back,                           KB_All},
260
    {QKeySequence::Find,                    0,          Qt::CTRL | Qt::Key_F,                   KB_All},
261
    {QKeySequence::Find,                    0,          Qt::Key_Find,                           KB_All},
262
    {QKeySequence::FindNext,                0,          Qt::CTRL | Qt::Key_G,                   KB_Win},
263
    {QKeySequence::FindNext,                1,          Qt::CTRL | Qt::Key_G,                   KB_Gnome | KB_Mac},
264
    {QKeySequence::FindNext,                1,          Qt::Key_F3,                             KB_Win},
265
    {QKeySequence::FindNext,                0,          Qt::Key_F3,                             KB_X11},
266
    {QKeySequence::FindPrevious,            0,          Qt::CTRL | Qt::SHIFT | Qt::Key_G,       KB_Win},
267
    {QKeySequence::FindPrevious,            1,          Qt::CTRL | Qt::SHIFT | Qt::Key_G,       KB_Gnome | KB_Mac},
268
    {QKeySequence::FindPrevious,            1,          Qt::SHIFT | Qt::Key_F3,                 KB_Win},
269
    {QKeySequence::FindPrevious,            0,          Qt::SHIFT | Qt::Key_F3,                 KB_X11},
270
    {QKeySequence::Replace,                 0,          Qt::CTRL | Qt::Key_R,                   KB_KDE},
271
    {QKeySequence::Replace,                 0,          Qt::CTRL | Qt::Key_H,                   KB_Gnome},
272
    {QKeySequence::Replace,                 0,          Qt::CTRL | Qt::Key_H,                   KB_Win},
273
    {QKeySequence::SelectAll,               1,          Qt::CTRL | Qt::Key_A,                   KB_All},
274
    {QKeySequence::Bold,                    1,          Qt::CTRL | Qt::Key_B,                   KB_All},
275
    {QKeySequence::Italic,                  0,          Qt::CTRL | Qt::Key_I,                   KB_All},
276
    {QKeySequence::Underline,               1,          Qt::CTRL | Qt::Key_U,                   KB_All},
277
    {QKeySequence::MoveToNextChar,          1,          Qt::Key_Right,                          KB_All},
278
    {QKeySequence::MoveToNextChar,          0,          Qt::META | Qt::Key_F,                   KB_Mac},
279
    {QKeySequence::MoveToPreviousChar,      1,          Qt::Key_Left,                           KB_All},
280
    {QKeySequence::MoveToPreviousChar,      0,          Qt::META | Qt::Key_B,                   KB_Mac},
281
    {QKeySequence::MoveToNextWord,          0,          Qt::ALT  | Qt::Key_Right,               KB_Mac},
282
    {QKeySequence::MoveToNextWord,          0,          Qt::CTRL | Qt::Key_Right,               KB_Win | KB_X11},
283
    {QKeySequence::MoveToPreviousWord,      0,          Qt::ALT  | Qt::Key_Left,                KB_Mac},
284
    {QKeySequence::MoveToPreviousWord,      0,          Qt::CTRL | Qt::Key_Left,                KB_Win | KB_X11},
285
    {QKeySequence::MoveToNextLine,          1,          Qt::Key_Down,                           KB_All},
286
    {QKeySequence::MoveToNextLine,          0,          Qt::META | Qt::Key_N,                   KB_Mac},
287
    {QKeySequence::MoveToPreviousLine,      1,          Qt::Key_Up,                             KB_All},
288
    {QKeySequence::MoveToPreviousLine,      0,          Qt::META | Qt::Key_P,                   KB_Mac},
289
    {QKeySequence::MoveToNextPage,          0,          Qt::META | Qt::Key_PageDown,            KB_Mac},
290
    {QKeySequence::MoveToNextPage,          0,          Qt::META | Qt::Key_Down,                KB_Mac},
291
    {QKeySequence::MoveToNextPage,          0,          Qt::META | Qt::Key_V,                   KB_Mac},
292
    {QKeySequence::MoveToNextPage,          0,          Qt::ALT  | Qt::Key_PageDown,            KB_Mac },
293
    {QKeySequence::MoveToNextPage,          1,          Qt::Key_PageDown,                       KB_All},
294
    {QKeySequence::MoveToPreviousPage,      0,          Qt::META | Qt::Key_PageUp,              KB_Mac},
295
    {QKeySequence::MoveToPreviousPage,      0,          Qt::META | Qt::Key_Up,                  KB_Mac},
296
    {QKeySequence::MoveToPreviousPage,      0,          Qt::ALT  | Qt::Key_PageUp,              KB_Mac },
297
    {QKeySequence::MoveToPreviousPage,      1,          Qt::Key_PageUp,                         KB_All},
298
    {QKeySequence::MoveToStartOfLine,       0,          Qt::META | Qt::Key_Left,                KB_Mac},
299
    {QKeySequence::MoveToStartOfLine,       0,          Qt::CTRL | Qt::Key_Left,                KB_Mac },
300
    {QKeySequence::MoveToStartOfLine,       0,          Qt::Key_Home,                           KB_Win | KB_X11},
301
    {QKeySequence::MoveToEndOfLine,         0,          Qt::META | Qt::Key_Right,               KB_Mac},
302
    {QKeySequence::MoveToEndOfLine,         0,          Qt::CTRL | Qt::Key_Right,               KB_Mac },
303
    {QKeySequence::MoveToEndOfLine,         0,          Qt::Key_End,                            KB_Win | KB_X11},
304
    {QKeySequence::MoveToEndOfLine,         0,          Qt::CTRL | Qt::Key_E,                   KB_X11},
305
    {QKeySequence::MoveToStartOfBlock,      0,          Qt::META | Qt::Key_A,                   KB_Mac},
306
    {QKeySequence::MoveToStartOfBlock,      1,          Qt::ALT  | Qt::Key_Up,                  KB_Mac}, //mac only
307
    {QKeySequence::MoveToEndOfBlock,        0,          Qt::META | Qt::Key_E,                   KB_Mac},
308
    {QKeySequence::MoveToEndOfBlock,        1,          Qt::ALT  | Qt::Key_Down,                KB_Mac}, //mac only
309
    {QKeySequence::MoveToStartOfDocument,   1,          Qt::CTRL | Qt::Key_Up,                  KB_Mac},
310
    {QKeySequence::MoveToStartOfDocument,   0,          Qt::CTRL | Qt::Key_Home,                KB_Win | KB_X11},
311
    {QKeySequence::MoveToStartOfDocument,   0,          Qt::Key_Home,                           KB_Mac},
312
    {QKeySequence::MoveToEndOfDocument,     1,          Qt::CTRL | Qt::Key_Down,                KB_Mac},
313
    {QKeySequence::MoveToEndOfDocument,     0,          Qt::CTRL | Qt::Key_End,                 KB_Win | KB_X11},
314
    {QKeySequence::MoveToEndOfDocument,     0,          Qt::Key_End,                            KB_Mac},
315
    {QKeySequence::SelectNextChar,          0,          Qt::SHIFT | Qt::Key_Right,              KB_All},
316
    {QKeySequence::SelectPreviousChar,      0,          Qt::SHIFT | Qt::Key_Left,               KB_All},
317
    {QKeySequence::SelectNextWord,          0,          Qt::ALT  | Qt::SHIFT | Qt::Key_Right,   KB_Mac},
318
    {QKeySequence::SelectNextWord,          0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Right,   KB_Win | KB_X11},
319
    {QKeySequence::SelectPreviousWord,      0,          Qt::ALT  | Qt::SHIFT | Qt::Key_Left,    KB_Mac},
320
    {QKeySequence::SelectPreviousWord,      0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Left,    KB_Win | KB_X11},
321
    {QKeySequence::SelectNextLine,          0,          Qt::SHIFT | Qt::Key_Down,               KB_All},
322
    {QKeySequence::SelectPreviousLine,      0,          Qt::SHIFT | Qt::Key_Up,                 KB_All},
323
    {QKeySequence::SelectNextPage,          0,          Qt::SHIFT | Qt::Key_PageDown,           KB_All},
324
    {QKeySequence::SelectPreviousPage,      0,          Qt::SHIFT | Qt::Key_PageUp,             KB_All},
325
    {QKeySequence::SelectStartOfLine,       0,          Qt::META | Qt::SHIFT | Qt::Key_Left,    KB_Mac},
326
    {QKeySequence::SelectStartOfLine,       1,          Qt::CTRL | Qt::SHIFT | Qt::Key_Left,    KB_Mac },
327
    {QKeySequence::SelectStartOfLine,       0,          Qt::SHIFT | Qt::Key_Home,               KB_Win | KB_X11},
328
    {QKeySequence::SelectEndOfLine,         0,          Qt::META | Qt::SHIFT | Qt::Key_Right,   KB_Mac},
329
    {QKeySequence::SelectEndOfLine,         1,          Qt::CTRL | Qt::SHIFT | Qt::Key_Right,   KB_Mac },
330
    {QKeySequence::SelectEndOfLine,         0,          Qt::SHIFT | Qt::Key_End,                KB_Win | KB_X11},
331
    {QKeySequence::SelectStartOfBlock,      1,          Qt::ALT  | Qt::SHIFT | Qt::Key_Up,      KB_Mac}, //mac only
332
    {QKeySequence::SelectStartOfBlock,      0,          Qt::META | Qt::SHIFT | Qt::Key_A,       KB_Mac},
333
    {QKeySequence::SelectEndOfBlock,        1,          Qt::ALT  | Qt::SHIFT | Qt::Key_Down,    KB_Mac}, //mac only
334
    {QKeySequence::SelectEndOfBlock,        0,          Qt::META | Qt::SHIFT | Qt::Key_E,       KB_Mac},
335
    {QKeySequence::SelectStartOfDocument,   1,          Qt::CTRL | Qt::SHIFT | Qt::Key_Up,      KB_Mac},
336
    {QKeySequence::SelectStartOfDocument,   0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Home,    KB_Win | KB_X11},
337
    {QKeySequence::SelectStartOfDocument,   0,          Qt::SHIFT | Qt::Key_Home,               KB_Mac},
338
    {QKeySequence::SelectEndOfDocument,     1,          Qt::CTRL | Qt::SHIFT | Qt::Key_Down,    KB_Mac},
339
    {QKeySequence::SelectEndOfDocument,     0,          Qt::CTRL | Qt::SHIFT | Qt::Key_End,     KB_Win | KB_X11},
340
    {QKeySequence::SelectEndOfDocument,     0,          Qt::SHIFT | Qt::Key_End,                KB_Mac},
341
    {QKeySequence::DeleteStartOfWord,       0,          Qt::ALT  | Qt::Key_Backspace,           KB_Mac},
342
    {QKeySequence::DeleteStartOfWord,       0,          Qt::CTRL | Qt::Key_Backspace,           KB_X11 | KB_Win},
343
    {QKeySequence::DeleteEndOfWord,         0,          Qt::ALT  | Qt::Key_Delete,              KB_Mac},
344
    {QKeySequence::DeleteEndOfWord,         0,          Qt::CTRL | Qt::Key_Delete,              KB_X11 | KB_Win},
345
    {QKeySequence::DeleteEndOfLine,         0,          Qt::CTRL | Qt::Key_K,                   KB_X11}, //emacs (line edit only)
346
    {QKeySequence::InsertParagraphSeparator,0,          Qt::Key_Enter,                          KB_All},
347
    {QKeySequence::InsertParagraphSeparator,0,          Qt::Key_Return,                         KB_All},
348
    {QKeySequence::InsertLineSeparator,     0,          Qt::META | Qt::Key_Enter,               KB_Mac},
349
    {QKeySequence::InsertLineSeparator,     0,          Qt::META | Qt::Key_Return,              KB_Mac},
350
    {QKeySequence::InsertLineSeparator,     0,          Qt::SHIFT | Qt::Key_Enter,              KB_All},
351
    {QKeySequence::InsertLineSeparator,     0,          Qt::SHIFT | Qt::Key_Return,             KB_All},
352
    {QKeySequence::InsertLineSeparator,     0,          Qt::META | Qt::Key_O,                   KB_Mac},
353
    {QKeySequence::SaveAs,                  0,          Qt::CTRL | Qt::SHIFT | Qt::Key_S,       KB_All},
354
    {QKeySequence::SaveAs,                  0,          Qt::SHIFT | Qt::Key_Save,               KB_All},
355
    {QKeySequence::Preferences,             0,          Qt::CTRL | Qt::Key_Comma,               KB_Mac},
356
    {QKeySequence::Preferences,             0,          Qt::CTRL | Qt::SHIFT | Qt::Key_Comma,   KB_KDE},
357
    {QKeySequence::Preferences,             0,          Qt::Key_Settings,                       KB_All},
358
    {QKeySequence::Quit,                    0,          Qt::CTRL | Qt::Key_Q,                   KB_X11 | KB_Gnome | KB_KDE | KB_Mac},
359
    {QKeySequence::Quit,                    0,          Qt::Key_Exit,                           KB_All},
360
    {QKeySequence::FullScreen,              1,          Qt::META | Qt::CTRL | Qt::Key_F,        KB_Mac},
361
    {QKeySequence::FullScreen,              0,          Qt::ALT  | Qt::Key_Enter,               KB_Win},
362
    {QKeySequence::FullScreen,              0,          Qt::CTRL | Qt::SHIFT | Qt::Key_F,       KB_KDE},
363
    {QKeySequence::FullScreen,              1,          Qt::Key_F11,                            KB_Win | KB_Gnome | KB_KDE},
364
    {QKeySequence::Deselect,                0,          Qt::CTRL | Qt::SHIFT | Qt::Key_A,       KB_X11},
365
    {QKeySequence::DeleteCompleteLine,      0,          Qt::CTRL | Qt::Key_U,                   KB_X11},
366
    {QKeySequence::Backspace,               1,          Qt::Key_Backspace,                      KB_Mac},
367
    {QKeySequence::Backspace,               0,          Qt::META | Qt::Key_H,                   KB_Mac},
368
    {QKeySequence::Cancel,                  0,          Qt::Key_Escape,                         KB_All},
369
    {QKeySequence::Cancel,                  0,          Qt::CTRL | Qt::Key_Period,              KB_Mac},
370
    {QKeySequence::Cancel,                  0,          Qt::Key_Cancel,                         KB_All}
371
};
372
373
const uint QPlatformThemePrivate::numberOfKeyBindings = sizeof(QPlatformThemePrivate::keyBindings)/(sizeof(QKeyBinding));
374
#endif
375
376
QPlatformThemePrivate::QPlatformThemePrivate()
377
104k
        : systemPalette(nullptr)
378
104k
{ }
379
380
QPlatformThemePrivate::~QPlatformThemePrivate()
381
104k
{
382
104k
    if (systemPalette)
383
104k
        delete systemPalette;
384
104k
}
385
386
Q_GUI_EXPORT QPalette qt_fusionPalette()
387
104k
{
388
104k
    auto theme = QGuiApplicationPrivate::platformTheme();
389
104k
    const bool darkAppearance = theme
390
104k
                              ? theme->colorScheme() == Qt::ColorScheme::Dark
391
104k
                              : false;
392
104k
    const QColor windowText = darkAppearance ? QColor(240, 240, 240) : Qt::black;
393
104k
    const QColor backGround = darkAppearance ? QColor(50, 50, 50) : QColor(239, 239, 239);
394
104k
    const QColor light = backGround.lighter(150);
395
104k
    const QColor mid = (backGround.darker(130));
396
104k
    const QColor midLight = mid.lighter(110);
397
104k
    const QColor base = darkAppearance ? backGround.darker(140) : Qt::white;
398
104k
    const QColor disabledBase(backGround);
399
104k
    const QColor dark = backGround.darker(150);
400
104k
    const QColor darkDisabled = QColor(209, 209, 209).darker(110);
401
104k
    const QColor text = darkAppearance ? windowText : Qt::black;
402
104k
    const QColor highlight = QColor(48, 140, 198);
403
104k
    const QColor hightlightedText = darkAppearance ? windowText : Qt::white;
404
104k
    const QColor disabledText = darkAppearance ? QColor(130, 130, 130) : QColor(190, 190, 190);
405
104k
    const QColor button = backGround;
406
104k
    const QColor shadow = dark.darker(135);
407
104k
    const QColor disabledShadow = shadow.lighter(150);
408
104k
    const QColor disabledHighlight(145, 145, 145);
409
104k
    QColor placeholder = text;
410
104k
    placeholder.setAlpha(128);
411
412
104k
    QPalette fusionPalette(windowText, backGround, light, dark, mid, text, base);
413
104k
    fusionPalette.setBrush(QPalette::Midlight, midLight);
414
104k
    fusionPalette.setBrush(QPalette::Button, button);
415
104k
    fusionPalette.setBrush(QPalette::Shadow, shadow);
416
104k
    fusionPalette.setBrush(QPalette::HighlightedText, hightlightedText);
417
418
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Text, disabledText);
419
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::WindowText, disabledText);
420
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledText);
421
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Base, disabledBase);
422
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Dark, darkDisabled);
423
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Shadow, disabledShadow);
424
425
104k
    fusionPalette.setBrush(QPalette::Active, QPalette::Highlight, highlight);
426
104k
    fusionPalette.setBrush(QPalette::Inactive, QPalette::Highlight, highlight);
427
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Highlight, disabledHighlight);
428
429
104k
    fusionPalette.setBrush(QPalette::Active, QPalette::Accent, highlight);
430
104k
    fusionPalette.setBrush(QPalette::Inactive, QPalette::Accent, highlight);
431
104k
    fusionPalette.setBrush(QPalette::Disabled, QPalette::Accent, disabledHighlight);
432
433
104k
    fusionPalette.setBrush(QPalette::PlaceholderText, placeholder);
434
435
    // Use a more legible light blue on dark backgrounds than the default Qt::blue.
436
104k
    if (darkAppearance)
437
0
        fusionPalette.setBrush(QPalette::Link, highlight);
438
439
104k
    return fusionPalette;
440
104k
}
441
442
void QPlatformThemePrivate::initializeSystemPalette()
443
104k
{
444
104k
    Q_ASSERT(!systemPalette);
445
104k
    systemPalette = new QPalette(qt_fusionPalette());
446
104k
}
447
448
QPlatformTheme::QPlatformTheme()
449
104k
    : d_ptr(new QPlatformThemePrivate)
450
104k
{
451
452
104k
}
453
454
QPlatformTheme::QPlatformTheme(QPlatformThemePrivate *priv)
455
0
    : d_ptr(priv)
456
0
{ }
457
458
QPlatformTheme::~QPlatformTheme()
459
104k
{
460
461
104k
}
462
463
bool QPlatformTheme::usePlatformNativeDialog(DialogType type) const
464
0
{
465
0
    Q_UNUSED(type);
466
0
    return false;
467
0
}
468
469
QPlatformDialogHelper *QPlatformTheme::createPlatformDialogHelper(DialogType type) const
470
0
{
471
0
    Q_UNUSED(type);
472
0
    return nullptr;
473
0
}
474
475
Qt::ColorScheme QPlatformTheme::colorScheme() const
476
209k
{
477
209k
    return Qt::ColorScheme::Unknown;
478
209k
}
479
480
void QPlatformTheme::requestColorScheme(Qt::ColorScheme scheme)
481
0
{
482
0
    Q_UNUSED(scheme);
483
0
    Q_D(QPlatformTheme);
484
0
    if (d->systemPalette) {
485
0
        delete d->systemPalette;
486
0
        d->systemPalette = nullptr;
487
0
    }
488
0
}
489
490
Qt::ContrastPreference QPlatformTheme::contrastPreference() const
491
104k
{
492
104k
    return Qt::ContrastPreference::NoPreference;
493
104k
}
494
495
/*!
496
    \internal
497
    \brief Return a color palette for type \a type.
498
499
    When relying on system color palette keep in mind that it is
500
    lazily initialized and cached. If it needs to be updated
501
    (i.e. due to ColorScheme changes), it's up to the caller
502
    to take care of it. See \c requestColorScheme.
503
*/
504
const QPalette *QPlatformTheme::palette(Palette type) const
505
209k
{
506
209k
    Q_D(const QPlatformTheme);
507
209k
    if (type == QPlatformTheme::SystemPalette) {
508
209k
        if (!d->systemPalette)
509
104k
            const_cast<QPlatformTheme *>(this)->d_ptr->initializeSystemPalette();
510
209k
        return d->systemPalette;
511
209k
    }
512
0
    return nullptr;
513
209k
}
514
515
const QFont *QPlatformTheme::font(Font type) const
516
26.4k
{
517
26.4k
    Q_UNUSED(type);
518
26.4k
    return nullptr;
519
26.4k
}
520
521
/*!
522
    \brief Return a pixmap for \a standardPixmap, at the given \a size.
523
524
    The implementation should not take system DPR into account, and
525
    always return a pixmap with a DPR of 1. It's up to the consumer
526
    to account for DPR and request a pixmap of the right size.
527
*/
528
QPixmap QPlatformTheme::standardPixmap(StandardPixmap standardPixmap, const QSizeF &size) const
529
0
{
530
0
    Q_UNUSED(standardPixmap);
531
0
    Q_UNUSED(size);
532
    // TODO Should return QCommonStyle pixmaps?
533
0
    return QPixmap();
534
0
}
535
536
/*!
537
    \brief Return an icon for \a fileInfo, observing \a iconOptions.
538
539
    This function is queried by QFileIconProvider and similar classes to obtain
540
    an icon for a file. If it does not return a non-null icon, fileIconPixmap()
541
    is queried for a specific size.
542
543
    \since 5.8
544
*/
545
546
QIcon QPlatformTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions iconOptions) const
547
0
{
548
0
    Q_UNUSED(fileInfo);
549
0
    Q_UNUSED(iconOptions);
550
    // TODO Should return QCommonStyle pixmaps?
551
0
    return QIcon();
552
0
}
553
554
QVariant QPlatformTheme::themeHint(ThemeHint hint) const
555
419k
{
556
    // For theme hints which mirror platform integration style hints, query
557
    // the platform integration. The base QPlatformIntegration::styleHint()
558
    // function will in turn query QPlatformTheme::defaultThemeHint() if there
559
    // is no custom value.
560
419k
    switch (hint) {
561
0
    case QPlatformTheme::CursorFlashTime:
562
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::CursorFlashTime);
563
0
    case QPlatformTheme::KeyboardInputInterval:
564
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::KeyboardInputInterval);
565
0
    case QPlatformTheme::KeyboardAutoRepeatRate:
566
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::KeyboardAutoRepeatRate);
567
0
    case QPlatformTheme::MouseDoubleClickInterval:
568
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::MouseDoubleClickInterval);
569
0
    case QPlatformTheme::StartDragDistance:
570
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::StartDragDistance);
571
0
    case QPlatformTheme::StartDragTime:
572
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::StartDragTime);
573
0
    case QPlatformTheme::StartDragVelocity:
574
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::StartDragVelocity);
575
0
    case QPlatformTheme::PasswordMaskDelay:
576
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::PasswordMaskDelay);
577
0
    case QPlatformTheme::PasswordMaskCharacter:
578
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::PasswordMaskCharacter);
579
0
    case QPlatformTheme::MousePressAndHoldInterval:
580
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::MousePressAndHoldInterval);
581
0
    case QPlatformTheme::ItemViewActivateItemOnSingleClick:
582
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ItemViewActivateItemOnSingleClick);
583
0
    case QPlatformTheme::UiEffects:
584
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::UiEffects);
585
104k
    case QPlatformTheme::ShowShortcutsInContextMenus:
586
104k
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ShowShortcutsInContextMenus);
587
0
    case QPlatformTheme::SetFocusOnTouchRelease:
588
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::SetFocusOnTouchRelease);
589
0
    case QPlatformTheme::FlickStartDistance:
590
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::FlickStartDistance);
591
0
    case QPlatformTheme::FlickMaximumVelocity:
592
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::FlickMaximumVelocity);
593
0
    case QPlatformTheme::FlickDeceleration:
594
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::FlickDeceleration);
595
0
    case QPlatformTheme::UnderlineShortcut:
596
0
        return QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::UnderlineShortcut);
597
314k
    default:
598
314k
        return QPlatformTheme::defaultThemeHint(hint);
599
419k
    }
600
419k
}
601
602
QVariant QPlatformTheme::defaultThemeHint(ThemeHint hint)
603
524k
{
604
524k
    switch (hint) {
605
0
    case QPlatformTheme::CursorFlashTime:
606
0
        return QVariant(1000);
607
0
    case QPlatformTheme::KeyboardInputInterval:
608
0
        return QVariant(400);
609
0
    case QPlatformTheme::KeyboardAutoRepeatRate:
610
0
        return QVariant(30);
611
0
    case QPlatformTheme::MouseDoubleClickInterval:
612
0
        return QVariant(400);
613
0
    case QPlatformTheme::StartDragDistance:
614
0
        return QVariant(10);
615
0
    case QPlatformTheme::StartDragTime:
616
0
        return QVariant(500);
617
0
    case QPlatformTheme::PasswordMaskDelay:
618
0
        return QVariant(int(0));
619
0
    case QPlatformTheme::PasswordMaskCharacter:
620
0
        return QVariant(QChar(u'\x25CF'));
621
0
    case QPlatformTheme::StartDragVelocity:
622
0
        return QVariant(int(0)); // no limit
623
0
    case QPlatformTheme::UseFullScreenForPopupMenu:
624
0
        return QVariant(false);
625
0
    case QPlatformTheme::WindowAutoPlacement:
626
0
        return QVariant(false);
627
0
    case QPlatformTheme::DialogButtonBoxLayout:
628
0
        return QVariant(int(0));
629
0
    case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
630
0
        return QVariant(false);
631
0
    case QPlatformTheme::ItemViewActivateItemOnSingleClick:
632
0
        return QVariant(false);
633
0
    case QPlatformTheme::ToolButtonStyle:
634
0
        return QVariant(int(Qt::ToolButtonIconOnly));
635
0
    case QPlatformTheme::ToolBarIconSize:
636
0
        return QVariant(int(0));
637
0
    case QPlatformTheme::SystemIconThemeName:
638
0
    case QPlatformTheme::SystemIconFallbackThemeName:
639
0
        return QVariant(QString());
640
0
    case QPlatformTheme::IconThemeSearchPaths:
641
0
        return QVariant(QStringList());
642
0
    case QPlatformTheme::IconFallbackSearchPaths:
643
0
        return QVariant(QStringList());
644
0
    case QPlatformTheme::StyleNames:
645
0
        return QVariant(QStringList());
646
104k
    case QPlatformTheme::ShowShortcutsInContextMenus:
647
104k
        return QVariant(true);
648
0
    case TextCursorWidth:
649
0
        return QVariant(1);
650
0
    case DropShadow:
651
0
        return QVariant(false);
652
0
    case MaximumScrollBarDragDistance:
653
0
        return QVariant(-1);
654
0
    case KeyboardScheme:
655
0
        return QVariant(int(WindowsKeyboardScheme));
656
0
    case UiEffects:
657
0
        return QVariant(int(0));
658
0
    case SpellCheckUnderlineStyle:
659
0
        return QVariant(int(QTextCharFormat::WaveUnderline));
660
0
    case TabFocusBehavior:
661
0
        return QVariant(int(Qt::TabFocusAllControls));
662
0
    case IconPixmapSizes:
663
0
        return QVariant::fromValue(QList<int>());
664
0
    case DialogSnapToDefaultButton:
665
0
    case ContextMenuOnMouseRelease:
666
0
        return QVariant(false);
667
0
    case MousePressAndHoldInterval:
668
0
        return QVariant(800);
669
209k
    case MouseDoubleClickDistance:
670
209k
        {
671
209k
            bool ok = false;
672
209k
            const int dist = qEnvironmentVariableIntValue("QT_DBL_CLICK_DIST", &ok);
673
209k
            return QVariant(ok ? dist : 5);
674
0
        }
675
0
    case WheelScrollLines:
676
0
        return QVariant(3);
677
104k
    case TouchDoubleTapDistance:
678
104k
        {
679
104k
            bool ok = false;
680
104k
            int dist = qEnvironmentVariableIntValue("QT_DBL_TAP_DIST", &ok);
681
104k
            if (!ok)
682
104k
                dist = defaultThemeHint(MouseDoubleClickDistance).toInt(&ok) * 2;
683
104k
            return QVariant(ok ? dist : 10);
684
0
        }
685
0
    case MouseQuickSelectionThreshold:
686
0
        return QVariant(10);
687
0
    case InteractiveResizeAcrossScreens:
688
0
        return true;
689
0
    case ShowDirectoriesFirst:
690
0
        return true;
691
0
    case PreselectFirstFileInDirectory:
692
0
        return false;
693
0
    case ButtonPressKeys:
694
0
        return QVariant::fromValue(QList<Qt::Key>({ Qt::Key_Space, Qt::Key_Select }));
695
0
    case SetFocusOnTouchRelease:
696
0
        return false;
697
0
    case FlickStartDistance:
698
0
        return QVariant(15);
699
0
    case FlickMaximumVelocity:
700
0
        return QVariant(2500);
701
0
    case FlickDeceleration:
702
0
        return QVariant(1500);
703
0
    case MenuBarFocusOnAltPressRelease:
704
0
        return false;
705
0
    case MouseCursorTheme:
706
0
        return QVariant(QString());
707
0
    case MouseCursorSize:
708
0
        return QVariant(QSize(16, 16));
709
0
    case UnderlineShortcut:
710
0
        return true;
711
104k
    case ShowIconsInMenus:
712
104k
        return true;
713
0
    case PreferFileIconFromTheme:
714
0
        return false;
715
0
    case MenuSelectionWraps:
716
0
        return true;
717
0
    case ScrollSingleStepDistance:
718
0
        return 20;
719
524k
    }
720
721
0
    return QVariant();
722
524k
}
723
724
QPlatformMenuItem *QPlatformTheme::createPlatformMenuItem() const
725
0
{
726
0
    return nullptr;
727
0
}
728
729
QPlatformMenu *QPlatformTheme::createPlatformMenu() const
730
0
{
731
0
    return nullptr;
732
0
}
733
734
QPlatformMenuBar *QPlatformTheme::createPlatformMenuBar() const
735
0
{
736
0
    return nullptr;
737
0
}
738
739
#ifndef QT_NO_SYSTEMTRAYICON
740
/*!
741
   Factory function for QSystemTrayIcon. This function will return 0 if the platform
742
   integration does not support creating any system tray icon.
743
*/
744
QPlatformSystemTrayIcon *QPlatformTheme::createPlatformSystemTrayIcon() const
745
0
{
746
0
    return nullptr;
747
0
}
748
#endif
749
750
/*!
751
   Factory function for the QIconEngine used by QIcon::fromTheme(). By default this
752
   function returns a QIconLoaderEngine, but subclasses can reimplement it to
753
   provide their own.
754
755
   It is especially useful to benefit from some platform specific facilities or
756
   optimizations like an inter-process cache in systems mostly built with Qt.
757
758
   \since 5.1
759
*/
760
QIconEngine *QPlatformTheme::createIconEngine(const QString &iconName) const
761
0
{
762
0
    return new QIconLoaderEngine(iconName);
763
0
}
764
765
#if QT_CONFIG(shortcut)
766
// mixed-mode predicate: all of these overloads are actually needed (but not all for every compiler)
767
struct ByStandardKey {
768
    typedef bool result_type;
769
770
    bool operator()(QKeySequence::StandardKey lhs, QKeySequence::StandardKey rhs) const
771
0
    { return lhs < rhs; }
772
773
    bool operator()(const QKeyBinding& lhs, const QKeyBinding& rhs) const
774
0
    { return operator()(lhs.standardKey, rhs.standardKey); }
775
776
    bool operator()(QKeySequence::StandardKey lhs, const QKeyBinding& rhs) const
777
0
    { return operator()(lhs, rhs.standardKey); }
778
779
    bool operator()(const QKeyBinding& lhs, QKeySequence::StandardKey rhs) const
780
0
    { return operator()(lhs.standardKey, rhs); }
781
};
782
783
/*!
784
   Returns the key sequence that should be used for a standard action.
785
786
  \since 5.2
787
 */
788
QList<QKeySequence> QPlatformTheme::keyBindings(QKeySequence::StandardKey key) const
789
0
{
790
0
    const uint platform = QPlatformThemePrivate::currentKeyPlatforms();
791
0
    QList <QKeySequence> list;
792
793
0
    std::pair<const QKeyBinding *, const QKeyBinding *> range =
794
0
        std::equal_range(QPlatformThemePrivate::keyBindings,
795
0
                         QPlatformThemePrivate::keyBindings + QPlatformThemePrivate::numberOfKeyBindings,
796
0
                         key, ByStandardKey());
797
798
0
    for (const QKeyBinding *it = range.first; it < range.second; ++it) {
799
0
        if (!(it->platform & platform))
800
0
            continue;
801
802
0
        uint shortcut = it->shortcut.toCombined();
803
804
0
        if (it->priority > 0)
805
0
            list.prepend(QKeySequence(shortcut));
806
0
        else
807
0
            list.append(QKeySequence(shortcut));
808
0
    }
809
810
0
    return list;
811
0
}
812
#endif
813
814
/*!
815
   Returns the text of a standard \a button.
816
817
  \since 5.3
818
  \sa QPlatformDialogHelper::StandardButton
819
 */
820
821
QString QPlatformTheme::standardButtonText(int button) const
822
0
{
823
0
    return QPlatformTheme::defaultStandardButtonText(button);
824
0
}
825
826
#if QT_CONFIG(shortcut)
827
/*!
828
   Returns the mnemonic that should be used for a standard \a button.
829
830
  \since 5.9
831
  \sa QPlatformDialogHelper::StandardButton
832
 */
833
834
QKeySequence QPlatformTheme::standardButtonShortcut(int button) const
835
0
{
836
0
    Q_UNUSED(button);
837
0
    return QKeySequence();
838
0
}
839
#endif // QT_CONFIG(shortcut)
840
841
QString QPlatformTheme::defaultStandardButtonText(int button)
842
0
{
843
0
    switch (button) {
844
0
    case QPlatformDialogHelper::Ok:
845
0
        return QCoreApplication::translate("QPlatformTheme", "OK");
846
0
    case QPlatformDialogHelper::Save:
847
0
        return QCoreApplication::translate("QPlatformTheme", "Save");
848
0
    case QPlatformDialogHelper::SaveAll:
849
0
        return QCoreApplication::translate("QPlatformTheme", "Save All");
850
0
    case QPlatformDialogHelper::Open:
851
0
        return QCoreApplication::translate("QPlatformTheme", "Open");
852
0
    case QPlatformDialogHelper::Yes:
853
0
        return QCoreApplication::translate("QPlatformTheme", "&Yes");
854
0
    case QPlatformDialogHelper::YesToAll:
855
0
        return QCoreApplication::translate("QPlatformTheme", "Yes to &All");
856
0
    case QPlatformDialogHelper::No:
857
0
        return QCoreApplication::translate("QPlatformTheme", "&No");
858
0
    case QPlatformDialogHelper::NoToAll:
859
0
        return QCoreApplication::translate("QPlatformTheme", "N&o to All");
860
0
    case QPlatformDialogHelper::Abort:
861
0
        return QCoreApplication::translate("QPlatformTheme", "Abort");
862
0
    case QPlatformDialogHelper::Retry:
863
0
        return QCoreApplication::translate("QPlatformTheme", "Retry");
864
0
    case QPlatformDialogHelper::Ignore:
865
0
        return QCoreApplication::translate("QPlatformTheme", "Ignore");
866
0
    case QPlatformDialogHelper::Close:
867
0
        return QCoreApplication::translate("QPlatformTheme", "Close");
868
0
    case QPlatformDialogHelper::Cancel:
869
0
        return QCoreApplication::translate("QPlatformTheme", "Cancel");
870
0
    case QPlatformDialogHelper::Discard:
871
0
        return QCoreApplication::translate("QPlatformTheme", "Discard");
872
0
    case QPlatformDialogHelper::Help:
873
0
        return QCoreApplication::translate("QPlatformTheme", "Help");
874
0
    case QPlatformDialogHelper::Apply:
875
0
        return QCoreApplication::translate("QPlatformTheme", "Apply");
876
0
    case QPlatformDialogHelper::Reset:
877
0
        return QCoreApplication::translate("QPlatformTheme", "Reset");
878
0
    case QPlatformDialogHelper::RestoreDefaults:
879
0
        return QCoreApplication::translate("QPlatformTheme", "Restore Defaults");
880
0
    default:
881
0
        break;
882
0
    }
883
0
    return QString();
884
0
}
885
886
QString QPlatformTheme::removeMnemonics(const QString &original)
887
0
{
888
0
    const auto mnemonicInParentheses = [](QStringView text) {
889
        /* Format of mnemonics to remove is /\(&[^&]\)/ but accept full-width
890
           forms of ( and ) as equivalent, for cross-platform compatibility with
891
           MS (and consequent behavior of translators, see QTBUG-110829).
892
        */
893
0
        Q_ASSERT(text.size() == 4); // Caller's responsibility.
894
0
        constexpr QChar wideOpen = u'\uff08', wideClose = u'\uff09';
895
0
        if (!text.startsWith(u'(') && !text.startsWith(wideOpen))
896
0
            return false;
897
0
        if (text[1] != u'&' || text[2] == u'&')
898
0
            return false;
899
0
        return text.endsWith(u')') || text.endsWith(wideClose);
900
0
    };
901
0
    QString returnText(original.size(), u'\0');
902
0
    int finalDest = 0;
903
0
    QStringView text(original);
904
0
    while (!text.isEmpty()) {
905
0
        if (text.startsWith(u'&')) {
906
0
            text = text.sliced(1);
907
0
            if (text.isEmpty())
908
0
                break;
909
0
        } else if (text.size() >= 4 && mnemonicInParentheses(text.first(4))) {
910
            // Advance over the matched mnemonic:
911
0
            text = text.sliced(4);
912
            // Also strip any leading space before it:
913
0
            while (finalDest > 0 && returnText.at(finalDest - 1).isSpace())
914
0
                --finalDest;
915
0
            continue;
916
0
        }
917
0
        returnText[finalDest] = text.front();
918
0
        text = text.sliced(1);
919
0
        ++finalDest;
920
0
    }
921
0
    returnText.truncate(finalDest);
922
0
    return returnText;
923
0
}
924
925
unsigned QPlatformThemePrivate::currentKeyPlatforms()
926
0
{
927
0
    const uint keyboardScheme = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::KeyboardScheme).toInt();
928
0
    unsigned result = 1u << keyboardScheme;
929
0
#if QT_CONFIG(shortcut)
930
0
    if (keyboardScheme == QPlatformTheme::KdeKeyboardScheme
931
0
        || keyboardScheme == QPlatformTheme::GnomeKeyboardScheme
932
0
        || keyboardScheme == QPlatformTheme::CdeKeyboardScheme)
933
0
        result |= KB_X11;
934
0
#endif
935
0
    return result;
936
0
}
937
938
QString QPlatformTheme::name() const
939
0
{
940
0
    return d_func()->name;
941
0
}
942
943
QT_END_NAMESPACE
944
945
#include "moc_qplatformtheme.cpp"