From 668cf5e46e8b2be3c7f76ff5ae50fbc95093e71c Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sat, 2 Aug 2014 12:24:04 -0400 Subject: [PATCH] Rewrote the tab height calculation function from the previous commit to consider all tabs, just to be safe. --- redo/containerctrls_windows.c | 36 ++++++++++++----------------------- 1 file 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; }