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/alfnotebook.cpp | |
| parent | 2a08707cf5a5207a19715907cdef6c2f7a8a52e7 (diff) | |
notebook: fix focus when changing tabs
Diffstat (limited to 'alf/alfnotebook.cpp')
| -rw-r--r-- | alf/alfnotebook.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
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; } |
