115 lines
3.2 KiB
C
115 lines
3.2 KiB
C
/*
|
|
*********************************************************************************************************
|
|
* uC/GUI
|
|
* Universal graphic software for embedded applications
|
|
*
|
|
* (c) Copyright 2002, Micrium Inc., Weston, FL
|
|
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
|
|
*
|
|
* µC/GUI is protected by international copyright laws. Knowledge of the
|
|
* source code may not be used to write a similar product. This file may
|
|
* only be used in accordance with a license and should not be redistributed
|
|
* in any way. We appreciate your understanding and fairness.
|
|
*
|
|
----------------------------------------------------------------------
|
|
File : WM_SetFocusOnNextChild.c
|
|
Purpose : Implementation of WM_SetFocusOnNextChild
|
|
----------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "WM_Intern.h"
|
|
|
|
#if GUI_WINSUPPORT /* If 0, WM will not generate any code */
|
|
|
|
/*********************************************************************
|
|
*
|
|
* static code
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
/*********************************************************************
|
|
*
|
|
* _GetNextChild
|
|
*
|
|
* Purpose:
|
|
* Returns a handle to the next child of a window.
|
|
*
|
|
* Parameters:
|
|
* hParent: handle of parent window.
|
|
* hChild: handle of child to begin our search to its next sibling.
|
|
*
|
|
* Return value:
|
|
* Handle to next child if we found one.
|
|
* 0 if window has no other children.
|
|
*/
|
|
static WM_HWIN _GetNextChild(WM_HWIN hParent, WM_HWIN hChild) {
|
|
WM_HWIN hObj = 0;
|
|
WM_Obj* pObj;
|
|
if (hChild) {
|
|
pObj = WM_HANDLE2PTR(hChild);
|
|
hObj = pObj->hNext;
|
|
}
|
|
if (!hObj) {
|
|
pObj = WM_HANDLE2PTR(hParent);
|
|
hObj = pObj->hFirstChild;
|
|
}
|
|
if (hObj != hChild) {
|
|
return hObj;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*********************************************************************
|
|
*
|
|
* _SetFocusOnNextChild
|
|
*
|
|
* Purpose:
|
|
* Sets the focus on next focussable child of a window.
|
|
*
|
|
* Return value:
|
|
* Handle of focussed child, if we found an other focussable child
|
|
* as the current. Otherwise the return value is zero.
|
|
*/
|
|
static WM_HWIN _SetFocusOnNextChild(WM_HWIN hParent) {
|
|
WM_HWIN hChild, hWin;
|
|
hChild = WM__GetFocussedChild(hParent);
|
|
hChild = _GetNextChild(hParent, hChild);
|
|
hWin = hChild;
|
|
while ((WM_IsFocussable(hWin) == 0) && hWin) {
|
|
hWin = _GetNextChild(hParent, hWin);
|
|
if (hWin == hChild) {
|
|
break;
|
|
}
|
|
}
|
|
if (WM_SetFocus(hWin) == 0) {
|
|
return hWin;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Public code
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
/*********************************************************************
|
|
*
|
|
* WM_SetFocusOnNextChild
|
|
*/
|
|
WM_HWIN WM_SetFocusOnNextChild(WM_HWIN hParent) {
|
|
WM_HWIN r = 0;
|
|
if (hParent) {
|
|
WM_LOCK();
|
|
r = _SetFocusOnNextChild(hParent);
|
|
WM_UNLOCK();
|
|
}
|
|
return r;
|
|
}
|
|
|
|
#else
|
|
void WM_SetFocusOnNextChild_C(void) {} /* avoid empty object files */
|
|
#endif
|
|
|
|
/*************************** End of file ****************************/
|