freertos_f407/User/system/lib/lcd/gui/WM/WM_SetFocusOnNextChild.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 ****************************/