summaryrefslogtreecommitdiff
path: root/alf/alfnotebook.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-09 19:08:46 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-09 19:08:46 +0200
commit860d61661b82198bae93736980c340f5d2c4e152 (patch)
treee02570a90c25f51ddde6da6a08b1eae9ccbe5e2a /alf/alfnotebook.cpp
parent2a08707cf5a5207a19715907cdef6c2f7a8a52e7 (diff)
notebook: fix focus when changing tabs
Diffstat (limited to 'alf/alfnotebook.cpp')
-rw-r--r--alf/alfnotebook.cpp26
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;
}