diff foosdk/sdk/foobar2000/helpers/window_placement_helper.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/foobar2000/helpers/window_placement_helper.cpp	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,166 @@
+#include "StdAfx.h"
+
+#ifdef FOOBAR2000_DESKTOP_WINDOWS
+
+#include "window_placement_helper.h"
+#include <SDK/config_object.h>
+
+static bool g_is_enabled()
+{
+	return standard_config_objects::query_remember_window_positions();
+}
+
+static BOOL CALLBACK __MonitorEnumProc(
+  HMONITOR hMonitor,  // handle to display monitor
+  HDC hdcMonitor,     // handle to monitor DC
+  LPRECT lprcMonitor, // monitor intersection rectangle
+  LPARAM dwData       // data
+  ) {
+	RECT * clip = (RECT*)dwData;
+	RECT newclip;
+	if (UnionRect(&newclip,clip,lprcMonitor)) {
+		*clip = newclip;
+	}
+	return TRUE;
+}
+
+static bool test_rect(const RECT * rc) {
+	RECT clip = {};
+	if (EnumDisplayMonitors(NULL,NULL,__MonitorEnumProc,(LPARAM)&clip)) {
+		const LONG sanitycheck = 4;
+		const LONG cwidth = clip.right - clip.left;
+		const LONG cheight = clip.bottom - clip.top;
+		
+		const LONG width = rc->right - rc->left;
+		const LONG height = rc->bottom - rc->top;
+
+		if (width > cwidth * sanitycheck || height > cheight * sanitycheck) return false;
+	}
+	
+	return MonitorFromRect(rc,MONITOR_DEFAULTTONULL) != NULL;
+}
+
+
+bool cfg_window_placement::read_from_window(HWND window)
+{
+	WINDOWPLACEMENT wp = {};
+	if (g_is_enabled()) {
+		wp.length = sizeof(wp);
+		if (!GetWindowPlacement(window,&wp)) {
+			PFC_ASSERT(!"GetWindowPlacement fail!");
+			memset(&wp,0,sizeof(wp));
+		} else {
+			// bad, breaks with taskbar on top
+			/*if (wp.showCmd == SW_SHOWNORMAL) {
+				GetWindowRect(window, &wp.rcNormalPosition);
+			}*/
+
+			if ( !IsWindowVisible( window ) ) wp.showCmd = SW_HIDE;
+		}
+		/*else
+		{
+			if (!IsWindowVisible(window)) wp.showCmd = SW_HIDE;
+		}*/
+	}
+
+	try { set(wp); } catch(...) {} // this tends to be called often / we really couldn't care less about this failing
+
+	return wp.length == sizeof(wp);
+}
+
+bool applyWindowPlacement(HWND window, WINDOWPLACEMENT const& data, bool allowHidden) {
+	bool ret = false;
+	if (data.length == sizeof(data) && test_rect(&data.rcNormalPosition))
+	{
+		if (allowHidden || data.showCmd != SW_HIDE) {
+			if (data.showCmd == SW_HIDE && (data.flags & WPF_RESTORETOMAXIMIZED)) {
+				// Special case of hidden-from-maximized
+				auto fix = data;
+				fix.showCmd = SW_SHOWMINIMIZED;
+				if (SetWindowPlacement(window, &fix)) {
+					ShowWindow(window, SW_HIDE);
+					ret = true;
+				}
+			} else {
+				if (SetWindowPlacement(window, &data)) {
+					ret = true;
+				}
+			}
+		}
+	}
+	return ret;
+}
+
+bool cfg_window_placement::apply_to_window(HWND window, bool allowHidden) {
+	bool ret = false;
+	if (g_is_enabled())
+	{
+		auto data = get();
+		ret = applyWindowPlacement(window, data, allowHidden);
+	}
+
+	return ret;
+}
+
+void cfg_window_placement::on_window_creation_silent(HWND window) {
+}
+bool cfg_window_placement::on_window_creation(HWND window, bool allowHidden) {
+	
+	return apply_to_window(window, allowHidden);
+}
+
+
+void cfg_window_placement::on_window_destruction(HWND window)
+{
+	read_from_window(window);
+}
+
+static BOOL SetWindowSize(HWND p_wnd,unsigned p_x,unsigned p_y)
+{
+	if (p_x != ~0 && p_y != ~0)
+		return SetWindowPos(p_wnd,0,0,0,p_x,p_y,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
+	else
+		return FALSE;
+}
+
+bool cfg_window_size::apply_to_window(HWND p_wnd) {
+	bool ret = false;
+
+	if (g_is_enabled())
+	{
+		auto v = get();
+		if (v.cx > 0 && v.cy > 0) {
+			if (SetWindowSize(p_wnd, v.cx, v.cy)) ret = true;
+		}
+
+	}
+	return ret;
+}
+bool cfg_window_size::on_window_creation(HWND p_wnd)
+{
+	return apply_to_window(p_wnd);
+}
+
+void cfg_window_size::on_window_destruction(HWND p_wnd)
+{
+	read_from_window(p_wnd);
+}
+
+bool cfg_window_size::read_from_window(HWND p_wnd)
+{
+	SIZE val = {};
+	if (g_is_enabled())
+	{
+		RECT r;
+		if (GetWindowRect(p_wnd,&r))
+		{
+			val.cx = r.right - r.left;
+			val.cy = r.bottom - r.top;
+		}
+	}
+
+	set(val);
+	return val.cx > 0 && val.cy > 0;
+}
+
+#endif // FOOBAR2000_DESKTOP_WINDOWS