summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--redo/containerctrls_windows.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/redo/containerctrls_windows.c b/redo/containerctrls_windows.c
index e7f1f90..5a998b5 100644
--- a/redo/containerctrls_windows.c
+++ b/redo/containerctrls_windows.c
@@ -62,33 +62,21 @@ void tabGetContentRect(HWND hwnd, RECT *r)
SendMessageW(hwnd, TCM_ADJUSTRECT, FALSE, (LPARAM) r);
}
-/* TODO this assumes that all inactive tabs have the same height */
+/* theoretically we don't need to iterate over every tab for this, but let's do it just to be safe */
LONG tabGetTabHeight(HWND hwnd)
{
RECT r;
- RECT r2;
- LRESULT n, current, other;
+ LRESULT i, n;
+ LONG tallest;
n = SendMessageW(hwnd, TCM_GETITEMCOUNT, 0, 0);
- /* if there are no tabs, then the control just draws a box over the full window rect, reserving no space for tabs (TODO check on windows xp and 7) */
- if (n == 0)
- return 0;
- /* get the current tab's height */
- /* note that Windows calls the tabs themselves "items" */
- current = SendMessageW(hwnd, TCM_GETCURSEL, 0, 0);
- if (SendMessageW(hwnd, TCM_GETITEMRECT, (WPARAM) current, (LPARAM) (&r)) == FALSE)
- xpanic("error getting current tab's tab height for Tab.preferredSize()", GetLastError());
- /* if there's only one tab, then it's the current one; just get its size and return it */
- if (n == 1)
- goto onlyOne;
- /* otherwise, get an inactive tab's height and return the taller of the two heights */
- other = current + 1;
- if (other >= n)
- other = 0;
- if (SendMessageW(hwnd, TCM_GETITEMRECT, (WPARAM) other, (LPARAM) (&r2)) == FALSE)
- xpanic("error getting other tab's tab height for Tab.preferredSize()", GetLastError());
- if ((r2.bottom - r2.top) > (r.bottom - r.top))
- return r2.bottom - r2.top;
-onlyOne:
- return r.bottom - r.top;
+ /* if there are no tabs, then the control just draws a box over the full window rect, reserving no space for tabs (TODO check on windows xp and 7); this is handled here */
+ tallest = 0;
+ for (i = 0; i < n; i++) {
+ if (SendMessageW(hwnd, TCM_GETITEMRECT, (WPARAM) i, (LPARAM) (&r)) == FALSE)
+ xpanic("error getting tab height for Tab.preferredSize()", GetLastError());
+ if (tallest < (r.bottom - r.top))
+ tallest = r.bottom - r.top;
+ }
+ return tallest;
}