aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/General/gen_ml/childwnd.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/Plugins/General/gen_ml/childwnd.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/General/gen_ml/childwnd.cpp')
-rw-r--r--Src/Plugins/General/gen_ml/childwnd.cpp235
1 files changed, 235 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ml/childwnd.cpp b/Src/Plugins/General/gen_ml/childwnd.cpp
new file mode 100644
index 00000000..a5e35ce1
--- /dev/null
+++ b/Src/Plugins/General/gen_ml/childwnd.cpp
@@ -0,0 +1,235 @@
+#include "main.h"
+#include "childwnd.h"
+#include "resource.h"
+
+typedef struct _CHILDREMOVERGN
+{
+ HWND hwndParent;
+ HRGN rgnUpdate;
+ HRGN rgnChild;
+} CHILDREMOVERGN;
+
+static BOOL useDeferWndPos = TRUE;
+
+
+void childresize_init(HWND hwndDlg, ChildWndResizeItem *list, int num)
+{
+ RECT r;
+ int x;
+
+ useDeferWndPos = (GetVersion() < 0x80000000);
+
+ GetClientRect(hwndDlg, &r);
+
+ for (x = 0; x < num; x ++)
+ {
+ RECT r2;
+ GetWindowRect(GetDlgItem(hwndDlg,list[x].id), &r2);
+ MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&r2, 2);
+
+ list[x].rinfo.left = (0xF000 & list[x].type) ? (r.right - r2.left) : r2.left;
+ list[x].rinfo.top = (0x0F00 & list[x].type) ? (r.bottom -r2.top) : r2.top;
+ list[x].rinfo.right = (0x00F0 & list[x].type) ? (r.right - r2.right) : r2.right;
+ list[x].rinfo.bottom= (0x000F & list[x].type) ? (r.bottom - r2.bottom) : r2.bottom;
+
+ list[x].type |= 0xF0000;
+ }
+
+}
+
+BOOL CALLBACK childresize_enumRemoveRegion(HWND hwnd, LPARAM lParam)
+{
+ if (IsWindowVisible(hwnd) && GetParent(hwnd) == ((CHILDREMOVERGN*)lParam)->hwndParent)
+ {
+ RECT r;
+ GetWindowRect(hwnd, &r);
+ MapWindowPoints(HWND_DESKTOP, ((CHILDREMOVERGN*)lParam)->hwndParent, (LPPOINT)&r, 2);
+
+ SetRectRgn(((CHILDREMOVERGN*)lParam)->rgnChild, r.left, r.top, r.right, r.bottom);
+ CombineRgn(((CHILDREMOVERGN*)lParam)->rgnUpdate, ((CHILDREMOVERGN*)lParam)->rgnUpdate, ((CHILDREMOVERGN*)lParam)->rgnChild, RGN_DIFF);
+ }
+
+ return TRUE;
+}
+
+void childresize_resize_to_rectlist(HWND hwndDlg, ChildWndResizeItem *list, int num, RECT *rectout)
+{
+ RECT r;
+ int x;
+ GetClientRect(hwndDlg,&r);
+
+ for (x = 0; x < num; x ++) if (list[x].type&0xf0000)
+ {
+ RECT r2;
+ if (list[x].type&0xF000) r2.left=r.right-list[x].rinfo.left;
+ else r2.left=list[x].rinfo.left;
+
+ if (list[x].type&0x0F00) r2.top=r.bottom-list[x].rinfo.top;
+ else r2.top=list[x].rinfo.top;
+
+ if (list[x].type&0x00F0) r2.right=r.right-list[x].rinfo.right;
+ else r2.right=list[x].rinfo.right;
+
+ if (list[x].type&0x000F) r2.bottom=r.bottom-list[x].rinfo.bottom;
+ else r2.bottom=list[x].rinfo.bottom;
+
+ *rectout = r2;
+ rectout++;
+ }
+}
+
+void childresize_resize_from_rectlist(HWND hwndDlg, ChildWndResizeItem *list, int num, RECT *rectin)
+{
+ RECT r, *pr;
+ CHILDREMOVERGN crr;
+ int x;
+ HDWP hdwp;
+ HWND h;
+
+ GetClientRect(hwndDlg,&r);
+
+ crr.hwndParent = hwndDlg;
+ crr.rgnUpdate = CreateRectRgnIndirect(&r);
+ crr.rgnChild = CreateRectRgn(0,0,0,0);
+
+ EnumChildWindows(hwndDlg,&childresize_enumRemoveRegion,(LPARAM)&crr);
+
+
+ hdwp = (useDeferWndPos) ? BeginDeferWindowPos(num) : NULL;
+ for (pr = rectin, x = 0; x < num && hdwp; x ++)
+ {
+ if (0xF0000 & list[x].type)
+ {
+ h = GetDlgItem(hwndDlg,list[x].id);
+ if (h && pr) hdwp = DeferWindowPos(hdwp, h, NULL, pr->left, pr->top, pr->right - pr->left, pr->bottom - pr->top, SWP_NOZORDER | SWP_NOACTIVATE);
+ pr++;
+ }
+ }
+ if (hdwp) EndDeferWindowPos(hdwp);
+ else
+ {
+ for (pr = rectin, x = 0; x < num; x ++)
+ {
+ if (0xF0000 & list[x].type)
+ {
+ h = GetDlgItem(hwndDlg,list[x].id);
+ if (h && pr) SetWindowPos(h, NULL, pr->left, pr->top, pr->right - pr->left, pr->bottom - pr->top, SWP_NOZORDER | SWP_NOACTIVATE);
+ pr++;
+ }
+ }
+ }
+ EnumChildWindows(hwndDlg,&childresize_enumRemoveRegion,(LPARAM)&crr);
+ InvalidateRgn(hwndDlg, crr.rgnUpdate, TRUE);
+ DeleteObject(crr.rgnUpdate);
+ DeleteObject(crr.rgnChild);
+}
+
+void childresize_resize(HWND hwndDlg, ChildWndResizeItem *list, int num)
+{
+ RECT rc, rw;
+ CHILDREMOVERGN crr;
+ int x, y, cx, cy;
+ DWORD flags;
+ HDWP hdwp;
+ ChildWndResizeItem *pi;
+
+ GetClientRect(hwndDlg,&rc);
+ crr.hwndParent = hwndDlg;
+ crr.rgnUpdate = CreateRectRgnIndirect(&rc);
+ crr.rgnChild = CreateRectRgn(0,0,0,0);
+
+ EnumChildWindows(hwndDlg,&childresize_enumRemoveRegion,(LPARAM)&crr);
+
+ hdwp = (useDeferWndPos) ? BeginDeferWindowPos(num) : NULL;
+
+ for (pi = list + num - 1; pi >= list && (!useDeferWndPos || hdwp); pi--)
+ {
+ HWND hwnd = GetDlgItem(hwndDlg, pi->id);
+ if (hwnd && (0xF0000 & pi->type))
+ {
+ x = (0xF000 & pi->type) ? (rc.right - pi->rinfo.left) : pi->rinfo.left;
+ y = (0x0F00 & pi->type) ? (rc.bottom - pi->rinfo.top) : pi->rinfo.top;
+ cx = ((0x00F0 & pi->type) ? (rc.right - pi->rinfo.right) : pi->rinfo.right) - x;
+ cy = ((0x000F & pi->type) ? (rc.bottom - pi->rinfo.bottom) : pi->rinfo.bottom) - y;
+ flags = SWP_NOZORDER | SWP_NOACTIVATE;
+
+ GetWindowRect(hwnd, &rw);
+ MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rw, 2);
+ if (rw.left == x && rw.top == y) flags |= SWP_NOMOVE;
+ if (rw.right == (x + cx) && rw.bottom == (y + cy)) flags |= SWP_NOSIZE;
+
+ if ((SWP_NOSIZE | SWP_NOMOVE) != ((SWP_NOSIZE | SWP_NOMOVE) & flags))
+ {
+ if (useDeferWndPos) hdwp = DeferWindowPos(hdwp, hwnd, NULL, x, y, cx, cy, flags);
+ else SetWindowPos( hwnd, NULL, x, y, cx, cy, flags);
+ }
+ }
+ }
+ if (hdwp) EndDeferWindowPos(hdwp);
+
+ EnumChildWindows(hwndDlg,&childresize_enumRemoveRegion,(LPARAM)&crr);
+ InvalidateRgn(hwndDlg, crr.rgnUpdate, TRUE);
+
+ DeleteObject(crr.rgnUpdate);
+ DeleteObject(crr.rgnChild);
+}
+
+void childresize_resize2(HWND hwndDlg, ChildWndResizeItem *list, int num, BOOL fRedraw, HRGN rgnUpdate)
+{
+ RECT rc, rw;
+ CHILDREMOVERGN crr;
+ int x, y, cx, cy;
+ DWORD flags;
+ HDWP hdwp;
+ ChildWndResizeItem *pi;
+
+ GetClientRect(hwndDlg,&rc);
+ crr.hwndParent = hwndDlg;
+ crr.rgnUpdate = CreateRectRgnIndirect(&rc);
+ crr.rgnChild = CreateRectRgn(0,0,0,0);
+
+// EnumChildWindows(hwndDlg,&childresize_enumRemoveRegion,(LPARAM)&crr);
+
+ hdwp = (useDeferWndPos) ? BeginDeferWindowPos(num) : NULL;
+
+ for (pi = list + num - 1; pi >= list && (!useDeferWndPos || hdwp); pi--)
+ {
+ HWND hwnd = GetDlgItem(hwndDlg, pi->id);
+ if (hwnd && (0xF0000 & pi->type))
+ {
+ x = (0xF000 & pi->type) ? (rc.right - pi->rinfo.left) : pi->rinfo.left;
+ y = (0x0F00 & pi->type) ? (rc.bottom - pi->rinfo.top) : pi->rinfo.top;
+ cx = ((0x00F0 & pi->type) ? (rc.right - pi->rinfo.right) : pi->rinfo.right) - x;
+ cy = ((0x000F & pi->type) ? (rc.bottom - pi->rinfo.bottom) : pi->rinfo.bottom) - y;
+ flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW;
+
+ GetWindowRect(hwnd, &rw);
+ MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rw, 2);
+ if (rw.left == x && rw.top == y) flags |= SWP_NOMOVE;
+ if (rw.right == (x + cx) && rw.bottom == (y + cy)) flags |= SWP_NOSIZE;
+
+ if ((SWP_NOSIZE | SWP_NOMOVE) != ((SWP_NOSIZE | SWP_NOMOVE) & flags))
+ {
+ if (useDeferWndPos) hdwp = DeferWindowPos(hdwp, hwnd, NULL, x, y, cx, cy, flags);
+ else SetWindowPos( hwnd, NULL, x, y, cx, cy, flags);
+ }
+ else
+ {
+ SetRectRgn(crr.rgnChild, rw.left, rw.top, rw.right, rw.bottom);
+ CombineRgn(crr.rgnUpdate, crr.rgnUpdate, crr.rgnChild, RGN_DIFF);
+ }
+ }
+ }
+ if (hdwp) EndDeferWindowPos(hdwp);
+
+// EnumChildWindows(hwndDlg,&childresize_enumRemoveRegion,(LPARAM)&crr);
+
+ if (fRedraw)
+ {
+ InvalidateRgn(hwndDlg, crr.rgnUpdate, TRUE);
+ RedrawWindow(hwndDlg, NULL, crr.rgnUpdate, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASENOW | RDW_ERASE | RDW_ALLCHILDREN);
+ //RedrawWindow(hwndDlg, NULL, crr.rgnUpdate, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASENOW | RDW_FRAME | RDW_ALLCHILDREN);
+ }
+ DeleteObject(crr.rgnUpdate);
+ DeleteObject(crr.rgnChild);
+} \ No newline at end of file