KiCad PCB EDA Suite
Loading...
Searching...
No Matches
wxmsw/ui.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2020 Ian McInerney <Ian.S.McInerney at ieee.org>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21#include <windows.h>
22
23#include <kiplatform/ui.h>
24
25#include <wx/cursor.h>
26#include <wx/dialog.h>
27#include <wx/display.h>
28#include <wx/nonownedwnd.h>
29#include <wx/window.h>
30#include <wx/msw/registry.h>
31
32
34{
35#if wxCHECK_VERSION( 3, 3, 0 )
36 wxSystemAppearance appearance = wxSystemSettings::GetAppearance();
37 return appearance.IsDark();
38#else
39 wxColour bg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW );
40
41 // Weighted W3C formula
42 double brightness = ( bg.Red() / 255.0 ) * 0.299 +
43 ( bg.Green() / 255.0 ) * 0.587 +
44 ( bg.Blue() / 255.0 ) * 0.117;
45
46 return brightness < 0.5;
47#endif
48}
49
50
52{
53 return wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE );
54}
55
56
57void KIPLATFORM::UI::GetInfoBarColours( wxColour& aFGColour, wxColour& aBGColour )
58{
59 aBGColour = wxSystemSettings::GetColour( wxSYS_COLOUR_INFOBK );
60 aFGColour = wxSystemSettings::GetColour( wxSYS_COLOUR_INFOTEXT );
61}
62
63
64wxWindow* KIPLATFORM::UI::CreateCanvasOverlay( wxWindow* aCanvas )
65{
66 return nullptr;
67}
68
69
70void KIPLATFORM::UI::ForceFocus( wxWindow* aWindow )
71{
72 aWindow->SetFocus();
73}
74
75
76bool KIPLATFORM::UI::IsWindowActive( wxWindow* aWindow )
77{
78 if(! aWindow )
79 {
80 return false;
81 }
82
83 return ( aWindow->GetHWND() == GetForegroundWindow() );
84}
85
86
87void KIPLATFORM::UI::EnsureVisible( wxWindow* aWindow )
88{
89 // Not needed on this platform
90}
91
92
93void KIPLATFORM::UI::StabilizeWindowPosition( wxWindow* aWindow )
94{
95 // Not needed on this platform
96}
97
98
99void KIPLATFORM::UI::ReparentModal( wxNonOwnedWindow* aWindow )
100{
101 // Not needed on this platform
102}
103
104
105void KIPLATFORM::UI::ReparentWindow( wxNonOwnedWindow* aWindow, wxTopLevelWindow* aParent )
106{
107 // Not needed on this platform (used only on macOS for child window ordering)
108}
109
110
112{
113 // Not needed on this platform
114}
115
116
117bool KIPLATFORM::UI::IsStockCursorOk( wxStockCursor aCursor )
118{
119 switch( aCursor )
120 {
121 case wxCURSOR_BULLSEYE:
122 case wxCURSOR_HAND:
123 case wxCURSOR_ARROW:
124 return true;
125 default:
126 return false;
127 }
128}
129
130
131void KIPLATFORM::UI::LargeChoiceBoxHack( wxChoice* aChoice )
132{
133 // Not implemented
134}
135
136
137void KIPLATFORM::UI::EllipsizeChoiceBox( wxChoice* aChoice )
138{
139 // Not implemented
140}
141
142
143double KIPLATFORM::UI::GetPixelScaleFactor( const wxWindow* aWindow )
144{
145 return aWindow->GetContentScaleFactor();
146}
147
148
149double KIPLATFORM::UI::GetContentScaleFactor( const wxWindow* aWindow )
150{
151 return aWindow->GetDPIScaleFactor();
152}
153
154
155double KIPLATFORM::UI::GetDisplayRefreshRate( const wxWindow* aWindow )
156{
157 // wx reports the hardware's default rate as 0
158 return wxDisplay( aWindow ).GetCurrentMode().refresh;
159}
160
161
162wxSize KIPLATFORM::UI::GetUnobscuredSize( const wxWindow* aWindow )
163{
164 return aWindow->GetClientSize();
165}
166
167
168void KIPLATFORM::UI::SetOverlayScrolling( const wxWindow* aWindow, bool overlay )
169{
170 // Not implemented
171}
172
173
175{
176 return true;
177}
178
179
181{
182 return true;
183}
184
185
187{
188 return wxGetMousePosition();
189}
190
191
192bool KIPLATFORM::UI::WarpPointer( wxWindow* aWindow, int aX, int aY )
193{
194 aWindow->WarpPointer( aX, aY );
195 return true;
196}
197
198
199void KIPLATFORM::UI::ImmControl( wxWindow* aWindow, bool aEnable )
200{
201 if ( !aEnable )
202 {
203 ImmAssociateContext( aWindow->GetHWND(), NULL );
204 }
205 else
206 {
207 ImmAssociateContextEx( aWindow->GetHWND(), 0, IACE_DEFAULT );
208 }
209}
210
211
212void KIPLATFORM::UI::ImeNotifyCancelComposition( wxWindow* aWindow )
213{
214 const HIMC himc = ImmGetContext( aWindow->GetHWND() );
215 ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 );
216 ImmReleaseContext( aWindow->GetHWND(), himc );
217}
218
219
220bool KIPLATFORM::UI::InfiniteDragPrepareWindow( wxWindow* aWindow )
221{
222 return true;
223}
224
225
227{
228 // Not needed on this platform
229}
230
231
232void KIPLATFORM::UI::SetFloatLevel( wxWindow* aWindow )
233{
234}
235
236void KIPLATFORM::UI::ReleaseChildWindow( wxNonOwnedWindow* aWindow )
237{
238 // Not needed on this platform
239}
240
241
242void KIPLATFORM::UI::AllowNetworkFileSystems( wxDialog* aDialog )
243{
244 // Not needed on Windows - file dialogs show network filesystems by default
245}
246
247
248void KIPLATFORM::UI::CancelPendingScroll( wxDataViewCtrl* aCtrl )
249{
250 // Not needed on this platform; the native control does not race on model resets.
251}
252
253
254void KIPLATFORM::UI::SetWMClass( wxWindow* aWindow, const wxString& aClass )
255{
256 // WM_CLASS is an X11/Wayland concept; taskbar identity on Windows is driven by the
257 // AppUserModelID (see KIPLATFORM::ENV::SetAppDetailsForWindow).
258}
259
260
261void KIPLATFORM::UI::GetNativeWindowHandles( wxWindow* aWindow, void** aHandle, void** aDisplay,
262 int* aDisplayType )
263{
264 *aHandle = nullptr;
265 *aDisplay = nullptr;
266
267 if( aDisplayType )
268 *aDisplayType = NATIVE_DISPLAY_TYPE::DISPLAY_WIN32;
269
270 if( aWindow )
271 *aHandle = static_cast<void*>( aWindow->GetHWND() );
272}
273
274
275void KIPLATFORM::UI::PrepareForExternalRendering( wxWindow* aWindow )
276{
277 // The GPU API owns Win32 surfaces natively
278}
279
280
281void KIPLATFORM::UI::KeepAboveExternalRendering( wxWindow* aChild )
282{
283 // Child windows are native and clip their parent's surface
284}
double GetDisplayRefreshRate(const wxWindow *aWindow)
Return the refresh rate in Hz of the display showing most of the window, or 0 if unknown.
Definition wxgtk/ui.cpp:448
wxWindow * CreateCanvasOverlay(wxWindow *aCanvas)
Create a window for widgets that are shown over a canvas without taking space from it.
Definition wxgtk/ui.cpp:197
bool AllowIconsInMenus()
If the user has disabled icons system-wide, we check that here.
Definition wxgtk/ui.cpp:481
void GetNativeWindowHandles(wxWindow *aWindow, void **aHandle, void **aDisplay, int *aDisplayType=nullptr)
Get the native handles needed to create a GPU surface for aWindow.
Definition wxgtk/ui.cpp:967
void SetFloatLevel(wxWindow *aWindow)
Intended to set the floating window level in macOS on a window.
Definition wxgtk/ui.cpp:629
void GetInfoBarColours(wxColour &aFGColour, wxColour &aBGColour)
Return the background and foreground colors for info bars in the current scheme.
Definition wxgtk/ui.cpp:73
void ReparentWindow(wxNonOwnedWindow *aWindow, wxTopLevelWindow *aParent)
Definition wxgtk/ui.cpp:341
void ReleaseChildWindow(wxNonOwnedWindow *aWindow)
Release a modal window's parent-child relationship with its parent window.
Definition wxgtk/ui.cpp:634
void EllipsizeChoiceBox(wxChoice *aChoice)
Configure a wxChoice control to ellipsize the shown text in the button with the ellipses placed at th...
Definition wxgtk/ui.cpp:407
void PrepareForExternalRendering(wxWindow *aWindow)
Prepare a realized widget for Vulkan or Metal rendering, before its first present.
void FixupCancelButtonCmdKeyCollision(wxWindow *aWindow)
Definition wxgtk/ui.cpp:347
void SetOverlayScrolling(const wxWindow *aWindow, bool overlay)
Used to set overlay/non-overlay scrolling mode in a window.
Definition wxgtk/ui.cpp:474
wxPoint GetMousePosition()
Returns the mouse position in screen coordinates.
Definition wxgtk/ui.cpp:958
void ImmControl(wxWindow *aWindow, bool aEnable)
Configures the IME mode of a given control handle.
Definition wxgtk/ui.cpp:610
void StabilizeWindowPosition(wxWindow *aWindow)
Prepare a top-level window for reliable position round-tripping.
Definition wxgtk/ui.cpp:251
double GetPixelScaleFactor(const wxWindow *aWindow)
Tries to determine the pixel scaling factor currently in use for the window.
Definition wxgtk/ui.cpp:428
void InfiniteDragReleaseWindow()
On Wayland, allows the cursor to freely move again after a drag (see InfiniteDragPrepareWindow).
Definition wxgtk/ui.cpp:952
void EnsureVisible(wxWindow *aWindow)
Ensure that a window is visible on the screen.
Definition wxgtk/ui.cpp:245
bool IsStockCursorOk(wxStockCursor aCursor)
Checks if we designated a stock cursor for this OS as "OK" or else we may need to load a custom one.
Definition wxgtk/ui.cpp:353
bool SupportsKeyState()
Return whether wxGetKeyState() can query ordinary keys, beyond modifiers and lock keys.
Definition wxgtk/ui.cpp:491
void KeepAboveExternalRendering(wxWindow *aChild)
Keep a child visible on top of a parent prepared with PrepareForExternalRendering().
double GetContentScaleFactor(const wxWindow *aWindow)
Tries to determine the content scaling factor currently in use for the window.
Definition wxgtk/ui.cpp:441
void ImeNotifyCancelComposition(wxWindow *aWindow)
Asks the IME to cancel.
Definition wxgtk/ui.cpp:615
void LargeChoiceBoxHack(wxChoice *aChoice)
Configure a wxChoice control to support a lot of entries by disabling functionality that makes adding...
Definition wxgtk/ui.cpp:389
bool WarpPointer(wxWindow *aWindow, int aX, int aY)
Move the mouse cursor to a specific position relative to the window.
Definition wxgtk/ui.cpp:537
wxColour GetDialogBGColour()
Definition wxgtk/ui.cpp:67
bool IsWindowActive(wxWindow *aWindow)
Check to see if the given window is the currently active window (e.g.
Definition wxgtk/ui.cpp:230
wxSize GetUnobscuredSize(const wxWindow *aWindow)
Tries to determine the size of the viewport of a scrollable widget (wxDataViewCtrl,...
Definition wxgtk/ui.cpp:467
void ForceFocus(wxWindow *aWindow)
Pass the current focus to the window.
Definition wxgtk/ui.cpp:208
bool InfiniteDragPrepareWindow(wxWindow *aWindow)
On Wayland, restricts the pointer movement to a rectangle slightly bigger than the given wxWindow.
Definition wxgtk/ui.cpp:945
void SetWMClass(wxWindow *aWindow, const wxString &aClass)
Tag a top-level window with the freedesktop application id of its installed launcher,...
Definition wxgtk/ui.cpp:307
void ReparentModal(wxNonOwnedWindow *aWindow)
Move a window's parent to be the top-level window and force the window to be on top.
Definition wxgtk/ui.cpp:335
void CancelPendingScroll(wxDataViewCtrl *aCtrl)
Cancel any pending scroll-to-item request on aCtrl.
Definition wxgtk/ui.cpp:649
bool IsDarkTheme()
Determine if the desktop interface is currently using a dark theme or a light theme.
Definition wxgtk/ui.cpp:54
void AllowNetworkFileSystems(wxDialog *aDialog)
Configure a file dialog to show network and virtual file systems.
Definition wxgtk/ui.cpp:640
std::shared_ptr< PNS_LOG_VIEWER_OVERLAY > overlay