aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/fullscreen.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/fullscreen.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Winamp/fullscreen.cpp')
-rw-r--r--Src/Winamp/fullscreen.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/Src/Winamp/fullscreen.cpp b/Src/Winamp/fullscreen.cpp
new file mode 100644
index 00000000..f092973f
--- /dev/null
+++ b/Src/Winamp/fullscreen.cpp
@@ -0,0 +1,159 @@
+/** (c) Nullsoft, Inc. C O N F I D E N T I A L
+ ** Filename:
+ ** Project:
+ ** Description:
+ ** Author:
+ ** Created:
+ **/
+
+#include "main.h"
+
+
+
+HWND hFSMonitorWindow;
+extern "C"
+{
+ int g_fsapp = 0;
+ int g_restoreaot_timer_set = 0;
+ int g_dropaot_timer_set = 0;
+}
+#define APPBAR_CALLBACK WM_USER + 1010
+#define appbartag L"wa_fsmonitorclass"
+LRESULT CALLBACK fsMonitorWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+void BeginFullscreenAppMonitor()
+{
+ // this lets us receive appbar messages.
+ // we're interested in ABN_FULLSCREENAPP so we can turn AOT off temporarily
+ APPBARDATA abd;
+
+ WNDCLASSW wc;
+ if (!GetClassInfoW(hMainInstance, appbartag, &wc))
+ {
+ memset(&wc, 0, sizeof(wc));
+ wc.lpfnWndProc = fsMonitorWndProc;
+ wc.hInstance = hMainInstance;
+ wc.lpszClassName = appbartag;
+ wc.style = 0;
+
+ RegisterClassW(&wc);
+ }
+
+ hFSMonitorWindow = CreateWindowExW(0, appbartag, L"", 0, 0, 0, 1, 1, NULL, NULL, hMainInstance, NULL);
+
+ abd.cbSize = sizeof(APPBARDATA);
+ abd.hWnd = hFSMonitorWindow;
+ abd.uCallbackMessage = APPBAR_CALLBACK;
+ abd.uEdge = ABE_TOP;
+ memset(&abd.rc, 0, sizeof(RECT));
+
+ SHAppBarMessage(ABM_NEW, &abd);
+}
+
+void EndFullscreenAppMonitor()
+{
+ APPBARDATA abd;
+
+ abd.cbSize = sizeof(APPBARDATA);
+ abd.hWnd = hFSMonitorWindow;
+
+ SHAppBarMessage(ABM_REMOVE, &abd);
+
+ if (IsWindow(hFSMonitorWindow))
+ DestroyWindow(hFSMonitorWindow);
+}
+
+
+void OnFullscreenApp()
+{
+ // ignore this event if the window going fullscreen is a winamp window
+ if (!is_fullscreen_video && !vis_fullscreen)
+ {
+ if (g_restoreaot_timer_set)
+ {
+ g_restoreaot_timer_set = 0;
+ KillTimer(hMainWindow, 100);
+ }
+ else
+ {
+ g_dropaot_timer_set = 1;
+ SetTimer(hMainWindow, 99, 250, NULL);
+ }
+ }
+}
+
+void OnCancelFullscreenApp()
+{
+ if (!is_fullscreen_video && !vis_fullscreen)
+ {
+ if (g_dropaot_timer_set)
+ {
+ KillTimer(hMainWindow, 99);
+ g_dropaot_timer_set = 0;
+ }
+ else
+ {
+ SetTimer(hMainWindow, 100, 250, NULL);
+ g_restoreaot_timer_set = 1;
+ }
+ }
+}
+
+LRESULT CALLBACK fsMonitorWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case APPBAR_CALLBACK:
+ switch (wParam)
+ {
+ case ABN_FULLSCREENAPP:
+ if (lParam && !g_fsapp)
+ {
+ g_fsapp = 1;
+ OnFullscreenApp();
+ }
+ else if (!lParam && g_fsapp)
+ {
+ g_fsapp = 0;
+ OnCancelFullscreenApp();
+ }
+ }
+ return 0;
+ }
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+
+
+void dropAOT()
+{
+ if (!config_dropaotfs) return ;
+ set_aot(0);
+ if (config_aot)
+ {
+ SetWindowPos(hMainWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ SetWindowPos(hMainWindow, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ }
+}
+
+void restoreAOT()
+{
+ if (!config_dropaotfs) return ;
+ if (config_aot)
+ {
+ // normally, changing hMainWindow's ONTOP flag should be enough to change all the owned window' z-orders too,
+ // but for some reason I cannot figure out, it does not work unless WA has been clicked away and back in focus.
+ // if that hasn't been done, then reseting the flag on each window is necessary.
+ // now for the fun part: the above is true for classic skin, but in modern skins, reseting the flag
+ // on those windows actually prevents the player from coming back ONTOP! FUN!
+ if (GetParent(hPLWindow) == NULL)
+ {
+ SetWindowPos(hPLWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOOWNERZORDER);
+ SetWindowPos(hVideoWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOOWNERZORDER);
+ SetWindowPos(hEQWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOOWNERZORDER);
+ }
+ SetWindowPos(hMainWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ SetWindowPos(hMainWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ }
+ set_aot(0);
+}