annotate foosdk/sdk/foobar2000/helpers/WindowPositionUtils.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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "WindowPositionUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #define FB2K_WPU_DEBUG 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 static BOOL GetParentWndRect(CWindow wndParent, CRect& rc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 if (!wndParent.IsIconic()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 return wndParent.GetWindowRect(rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 WINDOWPLACEMENT pl = { sizeof(pl) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 if (!wndParent.GetWindowPlacement(&pl)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 rc = pl.rcNormalPosition;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 struct DeOverlapState {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 CWindow m_thisWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 CPoint m_topLeft;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 bool m_match;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 static BOOL CALLBACK MyEnumChildProc(HWND wnd, LPARAM param) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 DeOverlapState* state = reinterpret_cast<DeOverlapState*>(param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 if (wnd != state->m_thisWnd && IsWindowVisible(wnd)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 if (GetWindowRect(wnd, rc)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 if (rc.TopLeft() == state->m_topLeft) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 state->m_match = true; return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 static bool DeOverlapTest(CWindow wnd, CPoint topLeft) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 DeOverlapState state = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 state.m_thisWnd = wnd; state.m_topLeft = topLeft; state.m_match = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 EnumThreadWindows(GetCurrentThreadId(), MyEnumChildProc, reinterpret_cast<LPARAM>(&state));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 return state.m_match;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 static int DeOverlapDelta() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 return pfc::max_t<int>(GetSystemMetrics(SM_CYCAPTION), 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 static void DeOverlap(CWindow wnd, CRect& rc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 const int delta = DeOverlapDelta();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 if (!DeOverlapTest(wnd, rc.TopLeft())) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 rc.OffsetRect(delta, delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 bool cfgDialogPositionData::grabFrom(CWindow wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (!GetClientRectAsSC(wnd, rc)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 const CSize DPI = QueryScreenDPIEx(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 m_dpiX = DPI.cx; m_dpiY = DPI.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 m_width = rc.Width(); m_height = rc.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 m_posX = m_posY = posInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 CWindow parent = wnd.GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 if (parent != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 CRect rcParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 if (GetParentWndRect(parent, rcParent)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 m_posX = rc.left - rcParent.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 m_posY = rc.top - rcParent.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 m_posX = rc.left; m_posY = rc.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 pfc::string8 cfgDialogPositionData::debug() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 pfc::string_formatter ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 if (m_width != sizeInvalid) ret << "W: " << m_width << "\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if (m_height != sizeInvalid) ret << "H: " << m_height << "\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (m_posX != posInvalid) ret << "X: " << m_posX << "\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 if (m_posY != posInvalid) ret << "Y: " << m_posY << "\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 if (m_dpiX != dpiInvalid) ret << "DPI-X: " << m_dpiX << "\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 if (m_dpiY != dpiInvalid) ret << "DPI-Y: " << m_dpiY << "\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 cfgDialogPositionData cfgDialogPositionData::reDPI( CSize screenDPI ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 cfgDialogPositionData v = *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 if (screenDPI.cx == 0 || screenDPI.cy == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 PFC_ASSERT(!"Should not get here - something seriously wrong with the OS");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 return v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 if (v.m_dpiX != dpiInvalid && v.m_dpiX != screenDPI.cx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 if (v.m_width != sizeInvalid) v.m_width = MulDiv(v.m_width, screenDPI.cx, v.m_dpiX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (v.m_posX != posInvalid) v.m_posX = MulDiv(v.m_posX, screenDPI.cx, v.m_dpiX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 if (v.m_dpiY != dpiInvalid && v.m_dpiY != screenDPI.cy) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 if (v.m_height != sizeInvalid) v.m_height = MulDiv(v.m_height, screenDPI.cy, v.m_dpiY);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (v.m_posY != posInvalid) v.m_posY = MulDiv(v.m_posY, screenDPI.cy, v.m_dpiY);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 v.m_dpiX = screenDPI.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 v.m_dpiY = screenDPI.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 return v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 bool cfgDialogPositionData::overrideDefaultSize(t_uint32 width, t_uint32 height) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 bool rv = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 if (m_width == sizeInvalid && m_height == sizeInvalid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 m_width = width; m_height = height; m_posX = m_posY = posInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 m_dpiX = m_dpiY = 96;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 rv = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 bool cfgDialogPositionData::applyTo(CWindow wnd) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 #if FB2K_WPU_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 FB2K_console_formatter() << "cfgDialogPositionData::applyTo(0x" << pfc::format_window( wnd ) << ")";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 FB2K_console_formatter() << "data:\n" << this->debug();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 const auto v = reDPI(QueryScreenDPIEx(wnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 #if FB2K_WPU_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 FB2K_console_formatter() << "after reDPI:\n" << v.debug();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 CWindow wndParent = wnd.GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 UINT flags = SWP_NOACTIVATE | SWP_NOZORDER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (!GetClientRectAsSC(wnd, rc)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if (v.m_width != v.sizeInvalid && v.m_height != v.sizeInvalid && (wnd.GetWindowLong(GWL_STYLE) & WS_SIZEBOX) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 rc.right = rc.left + v.m_width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 rc.bottom = rc.top + v.m_height;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 flags |= SWP_NOSIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 if (wndParent != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 CRect rcParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 if (GetParentWndRect(wndParent, rcParent)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 if (v.m_posX != v.posInvalid && v.m_posY != v.posInvalid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 rc.MoveToXY(rcParent.TopLeft() + CPoint(v.m_posX, v.m_posY));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 CPoint center = rcParent.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 rc.MoveToXY(center.x - rc.Width() / 2, center.y - rc.Height() / 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if (v.m_posX != v.posInvalid && v.m_posY != v.posInvalid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 rc.MoveToXY( v.m_posX, v.m_posY );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 if (!AdjustWindowRectHelper(wnd, rc)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 DeOverlap(wnd, rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 CRect rcAdjust(0, 0, 1, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 if (wndParent != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 CRect temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if (wndParent.GetWindowRect(temp)) rcAdjust = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 AdjustRectToScreenArea(rc, rcAdjust);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 return wnd.SetWindowPos(NULL, rc, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 void cfgDialogPosition::read_from_window(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 cfgDialogPositionData data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 if (data.grabFrom(wnd)) this->set(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 bool cfgDialogPosition::apply_to_window(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 auto data = this->get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 return data.applyTo(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 bool cfgWindowPositionData::grabFrom(CWindow wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 WINDOWPLACEMENT wp = {sizeof(wp)};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 bool rv = !! wnd.GetWindowPlacement(&wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 if (rv) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 if ( !wnd.IsWindowVisible() ) wp.showCmd = SW_HIDE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 this->m_wp = wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 m_dpi = QueryScreenDPIEx(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 PFC_ASSERT( m_dpi.cx > 0 && m_dpi.cy > 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 static void reDPI(WINDOWPLACEMENT& wp, SIZE from, SIZE to) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 wp.rcNormalPosition.left = MulDiv(wp.rcNormalPosition.left, to.cx, from.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 wp.rcNormalPosition.right = MulDiv(wp.rcNormalPosition.right, to.cx, from.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 wp.rcNormalPosition.top = MulDiv(wp.rcNormalPosition.top, to.cy, from.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 wp.rcNormalPosition.bottom = MulDiv(wp.rcNormalPosition.bottom, to.cy, from.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 bool applyWindowPlacement(HWND window, WINDOWPLACEMENT const& data, bool allowHidden); // window_placement_helper.cpp
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 bool cfgWindowPositionData::applyTo(CWindow wnd, bool allowHidden) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 WINDOWPLACEMENT wp = m_wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 if ( wp.length == 0 ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 auto dpi = QueryScreenDPIEx(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 if (dpi.cx != m_dpi.cx || dpi.cy != m_dpi.cy) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 reDPI( wp, m_dpi, dpi );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 return applyWindowPlacement(wnd, wp, allowHidden);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 void cfgWindowPosition::read_from_window(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 // grabFrom might work partially, fail to obtain size due to window being hidden, use last values
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 cfgWindowPositionData data = get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 if ( data.grabFrom( wnd ) ) set(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 bool cfgWindowPosition::apply_to_window(HWND wnd, bool allowHidden) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 auto data = get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 return data.applyTo( wnd, allowHidden );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 void cfgWindowPosition::windowCreated(HWND wnd, bool allowHidden, DWORD showHow) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 auto data = get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 switch (showHow) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 case SW_HIDE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 case SW_MINIMIZE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 data.m_wp.showCmd = showHow;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 if (!data.applyTo(wnd, allowHidden)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 ::ShowWindow( wnd, showHow);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }