diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-09 19:08:46 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-09 19:08:46 +0200 |
| commit | 860d61661b82198bae93736980c340f5d2c4e152 (patch) | |
| tree | e02570a90c25f51ddde6da6a08b1eae9ccbe5e2a /alf | |
| parent | 2a08707cf5a5207a19715907cdef6c2f7a8a52e7 (diff) | |
notebook: fix focus when changing tabs
Diffstat (limited to 'alf')
| -rw-r--r-- | alf/alf.cpp | 11 | ||||
| -rw-r--r-- | alf/alf.h | 3 | ||||
| -rw-r--r-- | alf/alfcombobox.cpp | 4 | ||||
| -rw-r--r-- | alf/alfnotebook.cpp | 26 |
4 files changed, 36 insertions, 8 deletions
diff --git a/alf/alf.cpp b/alf/alf.cpp index 7c0fa2a..0ab1901 100644 --- a/alf/alf.cpp +++ b/alf/alf.cpp @@ -442,7 +442,7 @@ ALF_ShouldMessageBubble(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) || msg == WM_MEASUREITEM || msg == WM_DRAWITEM || msg == WM_CTLCOLORBTN || msg == WM_CTLCOLOREDIT || msg == WM_CTLCOLORLISTBOX || msg == WM_CTLCOLORSCROLLBAR - || msg == WM_CTLCOLORSTATIC; + || msg == WM_CTLCOLORSTATIC || msg == ALF_WM_SETFOCUS; } void @@ -503,3 +503,12 @@ ALF_SetTextColor(HWND win, ALFColor color) { SendMessage(win, ALF_WM_SETTEXTCOLOR, 0, (LPARAM)color); } + +void +ALF_SetFocus(HWND target) +{ + if (GetWindowStyle(target) & WS_CHILD) + PostMessage(GetParent(target), ALF_WM_SETFOCUS, 0, (LPARAM)target); + else + PostMessage(target, ALF_WM_SETFOCUS, 0, (LPARAM)target); +} @@ -266,6 +266,9 @@ int ALF_GetModalResult(HWND win); void +ALF_SetFocus(HWND target); + +void ALF_SetText(HWND hwnd, const TCHAR *text); void diff --git a/alf/alfcombobox.cpp b/alf/alfcombobox.cpp index eebb269..a227a8d 100644 --- a/alf/alfcombobox.cpp +++ b/alf/alfcombobox.cpp @@ -285,6 +285,10 @@ ALF__ComboWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return TRUE; } + if (ALF_ShouldMessageBubble(hwnd, uMsg, wParam, lParam)) { + return SendMessage(GetParent(hwnd), uMsg, wParam, lParam); + } + return DefWindowProc(hwnd, uMsg, wParam, lParam); } diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp index b54829a..314ee85 100644 --- a/alf/alfnotebook.cpp +++ b/alf/alfnotebook.cpp @@ -18,6 +18,7 @@ typedef struct { ALFColor tabPaneBgColor; DWORD flags; int dpi; + int prevSelectedIndex; } ALFNotebookPriv; typedef struct { @@ -32,6 +33,7 @@ ALF_Notebook_CreatePriv(void) ALFNotebookPriv *priv = ALF_New(ALFNotebookPriv, 1); priv->tabPaneBgColor = ALF_COLOR_SYS(COLOR_BTNFACE); + priv->prevSelectedIndex = -1; return priv; } @@ -78,18 +80,28 @@ ALF_Notebook_InternalSelectedIndex(HWND notebook, HWND tabControl) static void -ALF_Notebook_InternalHandleTabChange(HWND hwndNotebook, HWND hwndTabCtrl) +ALF_Notebook_InternalHandleTabChange(HWND hwndNotebook, ALFNotebookPriv *priv) { - int selectedIndex = ALF_Notebook_InternalSelectedIndex(hwndNotebook, hwndTabCtrl); - int n = ALF_Notebook_InternalTabCount(hwndNotebook, hwndTabCtrl); + int selectedIndex = ALF_Notebook_InternalSelectedIndex(hwndNotebook, priv->hwndTabCtrl); + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); for (int i = 0; i < n; ++i) { if (i == selectedIndex) { - SetWindowPos(ALF_Notebook_InternalTabPanel(hwndNotebook, hwndTabCtrl, i), HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); + SetWindowPos(ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i), HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); } else { - ShowWindow(ALF_Notebook_InternalTabPanel(hwndNotebook, hwndTabCtrl, i), SW_HIDE); + ShowWindow(ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i), SW_HIDE); } } + + if (selectedIndex != priv->prevSelectedIndex) { + HWND currentFocus = GetFocus(); + if (currentFocus != priv->hwndTabCtrl && IsChild(hwndNotebook, currentFocus)) { + HWND focusControl = GetNextDlgTabItem(hwndNotebook, priv->hwndTabCtrl, FALSE); + ALF_SetFocus(focusControl); + } + } + + priv->prevSelectedIndex = selectedIndex; } static void @@ -257,7 +269,7 @@ ALF_Notebook_InternalAddTab(HWND notebook, ALFNotebookPriv *priv, const TCHAR *t p.panel = hwndPanel; TabCtrl_InsertItem(priv->hwndTabCtrl, ALF_Notebook_InternalTabCount(notebook, priv->hwndTabCtrl), &p); - ALF_Notebook_InternalHandleTabChange(notebook, priv->hwndTabCtrl); + ALF_Notebook_InternalHandleTabChange(notebook, priv); ALF_InvalidateLayout(notebook); @@ -380,7 +392,7 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (uMsg == WM_NOTIFY) { NMHDR *pnmh = (NMHDR*)lParam; if (pnmh->hwndFrom == priv->hwndTabCtrl && pnmh->code == TCN_SELCHANGE) { - ALF_Notebook_InternalHandleTabChange(hwnd, priv->hwndTabCtrl); + ALF_Notebook_InternalHandleTabChange(hwnd, priv); return TRUE; } |
