diff --git a/common/control.c b/common/control.c index 98cb94aa..83254ef2 100644 --- a/common/control.c +++ b/common/control.c @@ -57,6 +57,11 @@ void uiControlDisable(uiControl *c) (*(c->Disable))(c); } +void uiControlSetFocus(uiControl *c) +{ + (*(c->SetFocus))(c); +} + #define uiprivControlSignature 0x7569436F uiControl *uiAllocControl(size_t size, uint32_t OSsig, uint32_t typesig, const char *typenamestr) diff --git a/ui.h b/ui.h index 9ce47d34..022178e4 100644 --- a/ui.h +++ b/ui.h @@ -97,6 +97,7 @@ struct uiControl { int (*Enabled)(uiControl *); void (*Enable)(uiControl *); void (*Disable)(uiControl *); + void (*SetFocus)(uiControl *); }; // TOOD add argument names to all arguments #define uiControl(this) ((uiControl *) (this)) @@ -111,6 +112,7 @@ _UI_EXTERN void uiControlHide(uiControl *); _UI_EXTERN int uiControlEnabled(uiControl *); _UI_EXTERN void uiControlEnable(uiControl *); _UI_EXTERN void uiControlDisable(uiControl *); +_UI_EXTERN void uiControlSetFocus(uiControl *); _UI_EXTERN uiControl *uiAllocControl(size_t n, uint32_t OSsig, uint32_t typesig, const char *typenamestr); _UI_EXTERN void uiFreeControl(uiControl *); diff --git a/ui_windows.h b/ui_windows.h index 69dda366..46cd9eee 100644 --- a/ui_windows.h +++ b/ui_windows.h @@ -102,6 +102,11 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); uiWindowsControl(c)->enabled = 0; \ uiWindowsControlSyncEnableState(uiWindowsControl(c), uiControlEnabledToUser(c)); \ } +#define uiWindowsControlDefaultSetFocus(type) \ + static void type ## SetFocus(uiControl *c) \ + { \ + uiWindowsSetFocus(type(c)->hwnd); \ + } #define uiWindowsControlDefaultSyncEnableState(type) \ static void type ## SyncEnableState(uiWindowsControl *c, int enabled) \ { \ @@ -152,6 +157,7 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); uiWindowsControlDefaultEnabled(type) \ uiWindowsControlDefaultEnable(type) \ uiWindowsControlDefaultDisable(type) \ + uiWindowsControlDefaultSetFocus(type) \ uiWindowsControlDefaultSyncEnableState(type) \ uiWindowsControlDefaultSetParentHWND(type) \ uiWindowsControlDefaultMinimumSizeChanged(type) \ @@ -177,6 +183,7 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); uiControl(var)->Enabled = type ## Enabled; \ uiControl(var)->Enable = type ## Enable; \ uiControl(var)->Disable = type ## Disable; \ + uiControl(var)->SetFocus = type ## SetFocus; \ uiWindowsControl(var)->SyncEnableState = type ## SyncEnableState; \ uiWindowsControl(var)->SetParentHWND = type ## SetParentHWND; \ uiWindowsControl(var)->MinimumSize = type ## MinimumSize; \ @@ -199,6 +206,8 @@ _UI_EXTERN void uiWindowsEnsureDestroyWindow(HWND hwnd); // TODO document that this should only be used in SetParentHWND() implementations _UI_EXTERN void uiWindowsEnsureSetParentHWND(HWND hwnd, HWND parent); +_UI_EXTERN void uiWindowsSetFocus(HWND hwnd); + // TODO document _UI_EXTERN void uiWindowsEnsureAssignControlIDZOrder(HWND hwnd, LONG_PTR *controlID, HWND *insertAfter); diff --git a/windows/box.cpp b/windows/box.cpp index 9567954b..c3069895 100644 --- a/windows/box.cpp +++ b/windows/box.cpp @@ -143,6 +143,7 @@ uiWindowsControlDefaultHide(uiBox) uiWindowsControlDefaultEnabled(uiBox) uiWindowsControlDefaultEnable(uiBox) uiWindowsControlDefaultDisable(uiBox) +uiWindowsControlDefaultSetFocus(uiBox) static void uiBoxSyncEnableState(uiWindowsControl *c, int enabled) { diff --git a/windows/form.cpp b/windows/form.cpp index ed194671..6cd2923b 100644 --- a/windows/form.cpp +++ b/windows/form.cpp @@ -147,6 +147,7 @@ uiWindowsControlDefaultHide(uiForm) uiWindowsControlDefaultEnabled(uiForm) uiWindowsControlDefaultEnable(uiForm) uiWindowsControlDefaultDisable(uiForm) +uiWindowsControlDefaultSetFocus(uiForm) static void uiFormSyncEnableState(uiWindowsControl *c, int enabled) { diff --git a/windows/grid.cpp b/windows/grid.cpp index cac87aff..a412a950 100644 --- a/windows/grid.cpp +++ b/windows/grid.cpp @@ -436,6 +436,7 @@ uiWindowsControlDefaultHide(uiGrid) uiWindowsControlDefaultEnabled(uiGrid) uiWindowsControlDefaultEnable(uiGrid) uiWindowsControlDefaultDisable(uiGrid) +uiWindowsControlDefaultSetFocus(uiGrid) static void uiGridSyncEnableState(uiWindowsControl *c, int enabled) { diff --git a/windows/group.cpp b/windows/group.cpp index 1a2cc6ed..d40c78bc 100644 --- a/windows/group.cpp +++ b/windows/group.cpp @@ -75,6 +75,7 @@ uiWindowsControlDefaultHide(uiGroup) uiWindowsControlDefaultEnabled(uiGroup) uiWindowsControlDefaultEnable(uiGroup) uiWindowsControlDefaultDisable(uiGroup) +uiWindowsControlDefaultSetFocus(uiGroup) static void uiGroupSyncEnableState(uiWindowsControl *c, int enabled) { diff --git a/windows/tab.cpp b/windows/tab.cpp index e7239585..03017a2c 100644 --- a/windows/tab.cpp +++ b/windows/tab.cpp @@ -112,6 +112,7 @@ uiWindowsControlDefaultHide(uiTab) uiWindowsControlDefaultEnabled(uiTab) uiWindowsControlDefaultEnable(uiTab) uiWindowsControlDefaultDisable(uiTab) +uiWindowsControlDefaultSetFocus(uiTab) static void uiTabSyncEnableState(uiWindowsControl *c, int enabled) { diff --git a/windows/window.cpp b/windows/window.cpp index 2ea5b7ce..66452009 100644 --- a/windows/window.cpp +++ b/windows/window.cpp @@ -236,6 +236,7 @@ uiWindowsControlDefaultDisable(uiWindow) uiWindowsControlDefaultSyncEnableState(uiWindow) // TODO uiWindowsControlDefaultSetParentHWND(uiWindow) +uiWindowsControlDefaultSetFocus(uiWindow) static void uiWindowMinimumSize(uiWindowsControl *c, int *width, int *height) { diff --git a/windows/winpublic.cpp b/windows/winpublic.cpp index 397a3b54..e4da9d66 100644 --- a/windows/winpublic.cpp +++ b/windows/winpublic.cpp @@ -59,3 +59,9 @@ void uiWindowsEnsureGetWindowRect(HWND hwnd, RECT *r) r->bottom = 0; } } + +void uiWindowsSetFocus(HWND hwnd) +{ + if (SetFocus(hwnd) == 0) + logLastError(L"error setting ficus"); +}