Skip to content

Commit 5dbf87e

Browse files
authored
[BROWSEUI] Handle resolution change when fullscreen (reactos#7852)
CORE-20072
1 parent 32fad87 commit 5dbf87e

File tree

1 file changed

+45
-9
lines changed

1 file changed

+45
-9
lines changed

dll/win32/browseui/shellbrowser.cpp

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ struct MenuBandInfo {
256256
BOOL fVertical;
257257
};
258258

259+
#define BWM_ONDISPLAYCHANGEDELAYED (WM_APP)
260+
259261
class CShellBrowser :
260262
public CWindowImpl<CShellBrowser, CWindow, CFrameWinTraits>,
261263
public CComObjectRootEx<CComMultiThreadModelNoCS>,
@@ -276,6 +278,7 @@ class CShellBrowser :
276278
{
277279
private:
278280
enum { BSF_ROS_REGBROWSER = 0x04, BSF_ROS_KIOSK = 0x08 }; // Custom values
281+
279282
class barInfo
280283
{
281284
public:
@@ -315,6 +318,9 @@ class CShellBrowser :
315318
DWORD m_BrowserSvcFlags;
316319
bool m_Destroyed;
317320
BYTE m_NonFullscreenState;
321+
322+
enum { FSF_MBAR = 0x1, FSF_SBAR = 0x2, FSF_RESIZE = 0x4, FSF_MAXIMIZED = 0x8 };
323+
318324
public:
319325
#if 0
320326
ULONG InternalAddRef()
@@ -623,6 +629,8 @@ class CShellBrowser :
623629
LRESULT RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
624630
LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
625631
LRESULT OnSysColorChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
632+
LRESULT OnDisplayChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
633+
LRESULT OnDisplayChangeDelayed(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
626634
LRESULT OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
627635
LRESULT OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
628636
LRESULT OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
@@ -676,6 +684,8 @@ class CShellBrowser :
676684
MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView)
677685
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
678686
MESSAGE_HANDLER(WM_SYSCOLORCHANGE, OnSysColorChange)
687+
MESSAGE_HANDLER(WM_DISPLAYCHANGE, OnDisplayChange)
688+
MESSAGE_HANDLER(BWM_ONDISPLAYCHANGEDELAYED, OnDisplayChangeDelayed)
679689
COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose)
680690
COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions)
681691
COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive)
@@ -3715,6 +3725,13 @@ LRESULT CShellBrowser::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
37153725
LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
37163726
{
37173727
HRESULT hr;
3728+
if (m_BrowserSvcFlags & (BSF_THEATERMODE | BSF_ROS_KIOSK))
3729+
{
3730+
if (m_NonFullscreenState & FSF_MBAR)
3731+
put_MenuBar(VARIANT_TRUE);
3732+
if (m_NonFullscreenState & FSF_SBAR)
3733+
put_StatusBar(VARIANT_TRUE);
3734+
}
37183735
SaveViewState();
37193736

37203737
/* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
@@ -4159,18 +4176,17 @@ LRESULT CShellBrowser::OnAppCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOO
41594176

41604177
LRESULT CShellBrowser::OnToggleFullscreen(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
41614178
{
4162-
enum { SF_MBAR = 0x1, SF_SBAR = 0x2, SF_RESIZE = 0x4, SF_MAXIMIZED = 0x8 };
41634179
const UINT OrgUiSetAuto = m_BrowserSvcFlags & BSF_UISETBYAUTOMATION;
41644180
const BOOL fCurrentlyFullscreen = (m_BrowserSvcFlags & BSF_THEATERMODE);
41654181
const BOOL fEnter = wID ? !fCurrentlyFullscreen : wNotifyCode;
41664182
const HWND hWnd = GetTopLevelBrowserWindow();
41674183
if (fEnter)
41684184
{
41694185
VARIANT_BOOL varb;
4170-
m_NonFullscreenState = (m_BrowserSvcFlags & BSF_RESIZABLE) ? SF_RESIZE : 0;
4171-
m_NonFullscreenState |= (FAILED(get_MenuBar(&varb)) || varb) ? SF_MBAR : 0;
4172-
m_NonFullscreenState |= (FAILED(get_StatusBar(&varb)) || varb) ? SF_SBAR : 0;
4173-
m_NonFullscreenState |= (SHSetWindowBits(hWnd, GWL_STYLE, 0, 0) & WS_MAXIMIZE) ? SF_MAXIMIZED : 0;
4186+
m_NonFullscreenState = (m_BrowserSvcFlags & BSF_RESIZABLE) ? FSF_RESIZE : 0;
4187+
m_NonFullscreenState |= (FAILED(get_MenuBar(&varb)) || varb) ? FSF_MBAR : 0;
4188+
m_NonFullscreenState |= (FAILED(get_StatusBar(&varb)) || varb) ? FSF_SBAR : 0;
4189+
m_NonFullscreenState |= (SHSetWindowBits(hWnd, GWL_STYLE, 0, 0) & WS_MAXIMIZE) ? FSF_MAXIMIZED : 0;
41744190
SetFlags(BSF_THEATERMODE, BSF_THEATERMODE);
41754191
put_MenuBar(VARIANT_FALSE);
41764192
put_StatusBar(VARIANT_FALSE);
@@ -4186,21 +4202,41 @@ LRESULT CShellBrowser::OnToggleFullscreen(WORD wNotifyCode, WORD wID, HWND hWndC
41864202
else
41874203
{
41884204
SetFlags(0, BSF_THEATERMODE);
4189-
put_MenuBar((m_NonFullscreenState & SF_MBAR) ? VARIANT_TRUE : VARIANT_FALSE);
4190-
put_StatusBar((m_NonFullscreenState & SF_SBAR) ? VARIANT_TRUE : VARIANT_FALSE);
4205+
put_MenuBar((m_NonFullscreenState & FSF_MBAR) ? VARIANT_TRUE : VARIANT_FALSE);
4206+
put_StatusBar((m_NonFullscreenState & FSF_SBAR) ? VARIANT_TRUE : VARIANT_FALSE);
41914207
SHSetWindowBits(hWnd, GWL_EXSTYLE, WS_EX_WINDOWEDGE, WS_EX_WINDOWEDGE);
4192-
UINT styles = WS_CAPTION | WS_BORDER | WS_DLGFRAME | ((m_NonFullscreenState & SF_RESIZE) ? WS_THICKFRAME : 0);
4208+
UINT styles = WS_CAPTION | WS_BORDER | WS_DLGFRAME | ((m_NonFullscreenState & FSF_RESIZE) ? WS_THICKFRAME : 0);
41934209
SHSetWindowBits(hWnd, GWL_STYLE, styles | WS_THICKFRAME, styles);
41944210
::SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
41954211
::ShowWindow(hWnd, SW_SHOWNOACTIVATE);
4196-
if (m_NonFullscreenState & SF_MAXIMIZED)
4212+
if (m_NonFullscreenState & FSF_MAXIMIZED)
41974213
::ShowWindow(hWnd, SW_SHOWMAXIMIZED);
41984214
}
41994215
SetFlags(OrgUiSetAuto, BSF_UISETBYAUTOMATION);
42004216
::RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
42014217
return 0;
42024218
}
42034219

4220+
LRESULT CShellBrowser::OnDisplayChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
4221+
{
4222+
PostMessage(BWM_ONDISPLAYCHANGEDELAYED, wParam, lParam);
4223+
return 0;
4224+
}
4225+
4226+
LRESULT CShellBrowser::OnDisplayChangeDelayed(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
4227+
{
4228+
if (m_BrowserSvcFlags & (BSF_THEATERMODE | BSF_ROS_KIOSK)) // Resize fullscreen on resolution change (CORE-20072)
4229+
{
4230+
const HWND hWnd = GetTopLevelBrowserWindow();
4231+
MONITORINFO mi;
4232+
GetWindowMonitorInfo(hWnd, mi);
4233+
int x = mi.rcMonitor.left, w = mi.rcMonitor.right - x;
4234+
int y = mi.rcMonitor.top, h = mi.rcMonitor.bottom - y;
4235+
::SetWindowPos(hWnd, HWND_TOPMOST, x, y, w, h, SWP_NOZORDER | SWP_NOCOPYBITS);
4236+
}
4237+
return 0;
4238+
}
4239+
42044240
HRESULT CShellBrowser_CreateInstance(REFIID riid, void **ppv)
42054241
{
42064242
return ShellObjectCreatorInit<CShellBrowser>(riid, ppv);

0 commit comments

Comments
 (0)