view src/ui/mfw/mfw_win.c @ 75:8697f358f505

backlight rework: Condat light driver accepts levels The present change is another intermediate step on the path toward new FreeCalypso backlight handling. At this intermediate step the Condat light driver accepts 0-255 backlight levels driven by MFW, and puts them out on PWL on Luna development boards. At the same time on C139 it is now possible to turn on the display backlight with or without the keypad bl - the lsb of the 0-255 backlight level controls the keypad bl. MFW presently drives only 0 and 255 backlight levels, thus there is no visible behavioral change yet - but the plan for subsequent stages of this backlight rework is to add a dimmed backlight state (no keypad bl on C139) during active calls.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 24 Oct 2020 20:44:04 +0000
parents 67bfe9f274f6
children 92abb46dc1ba
line wrap: on
line source

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         $Workfile:: mfw_win.c       $|
| $Author:: Es  $ CONDAT GmbH           $Revision:: 21              $|
| CREATED: 21.09.98                     $Modtime:: 23.03.00 9:08    $|
| STATE  : code                                                      |
+--------------------------------------------------------------------+

   MODULE  : MFW_WIN

   PURPOSE : window handling functions

   EXPORT  :

   TO DO   :

   $History:: mfw_win.c                                             $

    Oct 09, 2006 DR: OMAPS00095308 - xreddymn
    Description: mfwFocus is NULL when window callback function for MfwWinResume
    is invoked in winDelete.
    Solution: After deleting a window and all its components, set mfwFocus to
    the previous window, before calling window callback function for
    MfwWinResume.

	Mar 30, 2005	REF: CRR 29986	xpradipg
	Description: Optimisation 1: Removal of unused variables and dynamically
	allocate/ deallocate mbndata
	Solution: removed the unused varialbe mfw_twh_strlen
  
 * textMessage
 * *****************  Version 21  *****************
 * User: Es           Date: 23.03.00   Time: 14:42
 * Updated in $/GSM/Condat/MS/SRC/MFW
 * Added 'winUnhide()': no update(), no event.
 *
 * *****************  Version 20  *****************
 * User: Kk           Date: 14.03.00   Time: 15:52
 * Updated in $/GSM/Condat/MS/SRC/MFW
 * changed update sequence
 *
 * *****************  Version 19  *****************
 * User: Es           Date: 3.03.00    Time: 12:04
 * Updated in $/GSM/Condat/MS/SRC/MFW
 * winUpdate(): first update windows children, then! call event
 * handler
 *
 * *****************  Version 18  *****************
 * User: Es           Date: 18.02.00   Time: 17:46
 * Updated in $/GSM/Condat/MS/SRC/MFW
 * danger in winUpdate
 *
 * *****************  Version 17  *****************
 * User: Nm           Date: 17.02.00   Time: 9:23
 * Updated in $/GSM/Condat/MS/SRC/MFW
 * updated winIsFocussed
 *
 * *****************  Version 16  *****************
 * User: Kk           Date: 17.01.00   Time: 8:56
 * Updated in $/GSM/Condat/MS/SRC/MFW
 * added simple check functions for easy checking if win is visible,
 * focussed, closed
 *
 * *****************  Version 15  *****************
 * User: Kk           Date: 10.01.00   Time: 13:46
 * Updated in $/GSM/Condat/MS/SRC/MFW
 * some changes done by ES
 *
 * *****************  Version 3  *****************
 * User: Rm           Date: 12/22/99   Time: 4:34p
 * Updated in $/GSM/Condat/SND-MMI/MFW
 *
 * *****************  Version 2  *****************
 * User: Es           Date: 22.11.99   Time: 10:30
 * Updated in $/GSM/Condat/SND-MMI/MFW
 *
 * *****************  Version 1  *****************
 * User: Es           Date: 18.11.99   Time: 16:35
 * Created in $/GSM/Condat/SND-MMI/MFW
 * Initial
 *
 * *****************  Version 13  *****************
 * User: Es           Date: 6.07.99    Time: 12:37
 * Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 11  *****************
 * User: Es           Date: 14.04.99   Time: 17:34
 * Updated in $/GSM/DEV/MS/SRC/MFW
 * moved to CST
|
| *****************  Version 10  *****************
| User: Le           Date: 14.04.99   Time: 9:51
| Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 9  *****************
 * User: Es           Date: 1.04.99    Time: 17:07
 * Updated in $/GSM/DEV/MS/SRC/MFW
 * removed lots of traces
 *
 * *****************  Version 8  *****************
 * User: Es           Date: 20.02.99   Time: 19:24
 * Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 7  *****************
 * User: Es           Date: 20.02.99   Time: 18:22
 * Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 6  *****************
 * User: Es           Date: 20.02.99   Time: 15:37
 * Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 5  *****************
 * User: Es           Date: 18.02.99   Time: 17:01
 * Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 4  *****************
 * User: Es           Date: 17.02.99   Time: 19:11
 * Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 3  *****************
 * User: Es           Date: 14.01.99   Time: 17:19
 * Updated in $/GSM/DEV/MS/SRC/MFW
 *
 * *****************  Version 2  *****************
 * User: Es           Date: 23.12.98   Time: 16:19
 * Updated in $/GSM/DEV/MS/SRC/MFW
*/


#define ENTITY_MFW

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif

#include "mfw_mfw.h"
#include "mfw_sys.h"
#include "gdi.h"
#include "dspl.h"
#include "mfw_win.h"

static MfwHdr *autoFocus;               /* focus of toplevel window */
static U8 winUseAutoFocus = 0;          /* automatic focussing flag */
static int winCommand (U32 cmd, void *h);



/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winInit            |
+--------------------------------------------------------------------+

  PURPOSE : initialize window handler

*/

MfwRes winInit (U16 *sx, U16 *sy)
{
    dspl_DevCaps displayData;

    dspl_Init();                        /* init display driver      */

    displayData.DisplayType = DSPL_TYPE_GRAPHIC;
    dspl_SetDeviceCaps(&displayData);
    dspl_GetDeviceCaps(&displayData);
    *sx = displayData.Width;
    *sy = displayData.Height;
    winUseAutoFocus = 0;

    mfwCommand[MfwTypWin] = (MfwCb) winCommand;

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winExit            |
+--------------------------------------------------------------------+

  PURPOSE : finalize window handler

*/

MfwRes winExit (void)
{
    mfwCommand[MfwTypWin] = 0;
    dspl_Exit();                        /* finit display driver     */

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winCreate          |
+--------------------------------------------------------------------+

  PURPOSE : create window control

*/

MfwHnd winCreate (MfwHnd w, MfwWinAttr *a, MfwEvt e, MfwCb f)
{


    MfwHdr *hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
    MfwWin *win = (MfwWin *) mfwAlloc(sizeof(MfwWin));
    MfwHdr *eoc = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
    MfwHdr *insert_status =0;

    /* xreddymn Aug-09-2004, MMI-SPR-23964 (TII_MMS33) 
     * Implemented suspend and resume functionality for MFW windows
     * The following code posts MfwWinSuspend event
     */
    MfwWin *ee;
    MfwHnd window;
    window = mfwParent(mfwFocus);
    if(window)
    {
    	ee = (MfwWin*) ((MfwHdr *) window)->data;
    	if(ee && (((MfwHdr *) window)->type == MfwTypWin))
    	{
    		if (ee->handler && ee->mask & MfwWinSuspend)
    		{
	    		/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
    			(void)(ee->handler(MfwWinSuspend,ee));
    		}
    	}
    }
    if (!hdr || !win || !eoc)
    	{
    	TRACE_ERROR("ERROR: winCreate() Mem Alloc Failed.");
			
	   	if(hdr)
   			mfwFree((U8*)hdr,sizeof(MfwHdr));

   		if(win)
   			mfwFree((U8*)win,sizeof(MfwWin));

   		if(eoc)
   			mfwFree((U8*)eoc,sizeof(MfwHdr));
   		
	   	return 0;
    }

    eoc->next = hdr;                    /* setup eoc element        */
    eoc->type = MfwTypMax;
    eoc->data = 0;

    win->mask = e;                      /* setup window control     */
    win->flags = 0;
    win->handler = f;
    win->attr = a;
    win->elems = eoc;
    win->user = 0;

    hdr->data = win;                    /* setup header element     */
    hdr->type = MfwTypWin;

    if (mfwSignallingMethod == 0)
        insert_status = mfwInsert(w,hdr);
    else
	{
        insert_status = mfwInsert(mfwParent(mfwFocus),hdr);
        mfwSetFocus(eoc);
	}

	/* Release memory if handler installation failed. */
	if(!insert_status)
	{
  		TRACE_ERROR("ERROR: winCreate() Failed to Install Handler. ");
   		mfwFree((U8*)hdr,sizeof(MfwHdr));
   		mfwFree((U8*)win,sizeof(MfwWin));
   		mfwFree((U8*)eoc,sizeof(MfwHdr)); 
		return 0;
  	}
  	
  	return insert_status;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winDelete          |
+--------------------------------------------------------------------+

  PURPOSE : delete window control

*/

MfwRes winDelete (MfwHnd w)
{
    MfwCb f;
    MfwHdr *e, *t, *r;
    MfwRes res;

    /*NM, p012a*/
    MfwWin *parent_controlBlock;
    MfwHdr  *parent_win;
	/*    U8 uMode;
	 p012a end*/

	TRACE_FUNCTION("win_delete()");

    if (!w)
        return MfwResIllHnd;
    if (((MfwHdr *) w)->type != MfwTypWin)
        return MfwResIllHnd;            /* element is not a window  */

    e = ((MfwHdr *) w)->data;
    if (!e)
        return MfwResErr;

    ((MfwWin *) e)->flags |= MfwWinDelete;
    if (((MfwWin *) e)->handler)
        if (((MfwWin *) e)->mask & MfwWinDelete)
            (void)(((MfwWin *) e)->handler(MfwWinDelete,e));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/

    e = ((MfwWin *) e)->elems;
    if (!e)
        return MfwResErr;

    if (mfwFocus == e)                  /* was focus window         */
        mfwSetFocus(0);                   /* no focus anymore         */



    while (e && e->type != MfwTypMax)   /* try to delete all elems  */
    {
        t = e->next;
        if (e->data)
        {
            if (mfwSignallingMethod != 0 && e->type == MfwTypWin)
            {
                r = (MfwHdr*) mfwParent(w);
                mfwRemove(e);           /* move up child window     */
                /* xreddymn OMAPS00095308 Oct-09-2006
                 * Check if r is valid.
                 */                
                if (r) 
                {
                mfwAppend(&(((MfwWin*)(r->data))->elems),e);
            }
            else
            {
                    mfwAppend(0,e);
                }
            }
            else
            {
                f = mfwCommand[e->type];
                if (f)
                    (void)(f(MfwCmdDelete,e));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
            }
        }
        e = t;
    }
    res = (mfwRemove(w)) ? MfwResOk : MfwResIllHnd;


	/*NM, p012d 
 	old: after deleting the focus-win start from root to top
   	new: after deleting the focus-win just give the new focus to 
   	      his parent-win (faster)
   	*/
   if (mfwSignallingMethod != 0 && mfwRoot && (!mfwFocus))
    {
	   parent_win = (MfwHdr*) mfwParent(w);

   		if (((MfwHdr *) parent_win)->type == MfwTypWin)
		{
		    parent_controlBlock = ((MfwHdr *) parent_win)->data;      

    /* xreddymn Aug-09-2004, MMI-SPR-23964 (TII_MMS33)
     * Implemented suspend and resume functionality for MFW windows
     * The following code posts MfwWinResume event
     */
    		if (parent_controlBlock->handler && parent_controlBlock->mask & MfwWinResume)
    		{
                    /* xreddymn OMAPS00095308 Oct-09-2006
                     * Set new value for mfwFocus before invoking the window
                     * handler for MfwWinResume.
                     */
                    mfwFocus = (MfwHdr*)((MfwWin*)parent_controlBlock)->elems;
                    (void)(parent_controlBlock->handler(MfwWinResume, parent_controlBlock));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
                }

	        winUpdate(parent_controlBlock);
	        mfwSetFocus(autoFocus);
		}

	}



    mfwFree((MfwHnd) e,sizeof(MfwHdr));
    mfwFree(((MfwHdr *) w)->data,sizeof(MfwWin));
    mfwFree(w,sizeof(MfwHdr));

    return res;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winShow            |
+--------------------------------------------------------------------+

  PURPOSE : show window (put in front of visibles)

*/
//TISH current_mfw_elem should not changed after winShow
EXTERN MfwHdr * current_mfw_elem;

MfwRes winShow (MfwHnd w)
{
    MfwWin *win;
	MfwHdr * temp_current_mfw_elem;

	TRACE_FUNCTION("winShow()");

    if (!w)
        return MfwResIllHnd;            /* window does not exist    */
	
    if (((MfwHdr *) w)->type != MfwTypWin)
        return MfwResIllHnd;            /* element is not a window  */
	
    win = ((MfwHdr *) w)->data;         /* get control block        */

	temp_current_mfw_elem = current_mfw_elem;
    mfwAppend(mfwRemove(w),w);          /* to front (draw at last)  */
	current_mfw_elem = temp_current_mfw_elem;
    win->flags |= MfwWinVisible;        /* window is visible        */

    winUpdate(win);                     /* draw window elements     */
    if (winUseAutoFocus)                /* automatic focussing      */
        mfwSetFocus(autoFocus);           /* determined by update()   */

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winHide            |
+--------------------------------------------------------------------+

  PURPOSE : hide window (and redraw remaining)

*/

MfwRes winHide (MfwHnd w)
{
    MfwHdr *r;
    MfwWin *win;

    if (!w)
        return MfwResIllHnd;            /* element does not exist   */
    if (((MfwHdr *) w)->type != MfwTypWin)
        return MfwResIllHnd;            /* element is not a window  */

    win = ((MfwHdr *) w)->data;
    win->flags &= ~MfwWinVisible;       /* window is not visible    */
    if (win->handler)                   /* call event handler       */
        if (win->mask & MfwWinVisible)
            (void)(win->handler(MfwWinVisible,win));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
    r = mfwRoot;                        /* the beginning            */
    autoFocus = 0;                      /* reset focus              */
    while (r->type != MfwTypMax)        /* more links in chain      */
    {
        if (r->type == MfwTypWin)       /* link is a window         */
            winUpdate(r->data);
        r = r->next;
    }
    if (winUseAutoFocus)                /* automatic focussing      */
        mfwSetFocus(autoFocus);           /* determined by update()   */

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winUnhide          |
+--------------------------------------------------------------------+

  PURPOSE : unhide window (without redrawing, no event)

*/

MfwRes winUnhide (MfwHnd w)
{
    MfwWin *win;

    if (!w)
        return MfwResIllHnd;            /* element does not exist   */
    if (((MfwHdr *) w)->type != MfwTypWin)
        return MfwResIllHnd;            /* element is not a window  */

    win = ((MfwHdr *) w)->data;
    win->flags |= MfwWinVisible;        /* window will be visible   */

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winFocus           |
+--------------------------------------------------------------------+

  PURPOSE : assign input/event focus to window

*/

MfwHnd winFocus (MfwHnd w)
{
    MfwWin *wNew, *wOld = 0;

    if (winUseAutoFocus)                /* automatic focussing      */
        return 0;                       /* ES!! only for testing !! */
    if (!w)
    {
        w = mfwFocus;
        mfwSetFocus(0);                   /* delete focus             */
        return w;                       /* return old focus         */
    }

    if (((MfwHdr *) w)->type != MfwTypWin)
        return 0;                       /* element is not a window  */

    if (mfwFocus)
    {
        while (mfwFocus->type != MfwTypMax)
            mfwSetFocus(mfwFocus->next);  /* search focus root        */
        mfwSetFocus(mfwFocus->next);      /* the focus window         */
        if (mfwFocus->type != MfwTypWin)
        {
            mfwSetFocus(0);               /* serious error:           */
            return 0;                   /* element is not a window  */
        }
        wOld = mfwFocus->data;          /* window control block     */
        wOld->flags &= ~MfwWinFocussed; /* input focus / deselected */
    }

    wNew = ((MfwHdr *) w)->data;
    w = mfwFocus;                       /* save old focus           */
    mfwSetFocus(wNew->elems);             /* focus on window elements */
    wNew->flags |= MfwWinFocussed;      /* input focus / selected   */

    if (wNew->handler)                  /* call new event handler   */
        if (wNew->mask & MfwWinFocussed)
            (void)(wNew->handler(MfwWinFocussed,wNew));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
    if (wOld && wOld->handler)          /* call old event handler   */
        if (wOld->mask & MfwWinFocussed)
            (void)(wOld->handler(MfwWinFocussed,wOld));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/

    return w;                           /* return old focus         */
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winAutoFocus       |
+--------------------------------------------------------------------+

  PURPOSE : set auto focus mode

*/

U8 winAutoFocus (U8 useit)
{
    U8 winUseAutoFocusOld = winUseAutoFocus; /* save previous state */

    winUseAutoFocus = useit;

    return winUseAutoFocusOld;          /* return previous state    */
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winClear           |
+--------------------------------------------------------------------+

  PURPOSE : clear window

*/

MfwRes winClear (MfwHnd w)
{
    MfwWin *win;

    if (!w)
    {
        dspl_ClearAll();                /* clear screen             */
        return MfwResOk;
    }

    win = ((MfwHdr *) w)->data;         /* clear window area        */
    dspl_Clear(win->attr->win.px,win->attr->win.py,
               (U16) (win->attr->win.sx+win->attr->win.px-2),
               (U16) (win->attr->win.sy+win->attr->win.py-2));

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winUpdate          |
+--------------------------------------------------------------------+

  PURPOSE : draw all visible windows

*/

MfwRes winUpdate (MfwWin *w)
{
    MfwCb f = 0;                        /* modules command handler  */
    MfwHdr *e;                          /* windows elements         */

//	TRACE_FUNCTION("winUpdate()");

    if (!w)
        return MfwResIllHnd;

    if (mfwSignallingMethod == 0)
    {
        if (!(w->flags & MfwWinVisible))
            return MfwResOk;                /* hidden window            */

        if (w->handler)                     /* THEN: call event handler */
            if (w->mask & MfwWinVisible)
                (void)(w->handler(MfwWinVisible,w));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
        e = w->elems;                       /* FIRST: update children   */
        autoFocus = e;                      /* gets focus of top window */
        while (e->type != MfwTypMax)        /* window has elements      */
        {
            if (e->type > MfwTypNone && e->type < MfwTypMax)
            {
                f = mfwCommand[e->type];
                if (f)                      /* cmd function implemented */
                    (void)(f(MfwCmdUpdate,e));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
            }
            e = e->next;
        }
    }
    else
    {
        if (w->handler && (w->flags & MfwWinVisible))
            if (w->mask & MfwWinVisible){
                (void)(w->handler(MfwWinVisible,w));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
            }

        e = w->elems;                       /* FIRST: update children   */
        autoFocus = e;                      /* gets focus of top window */
        while (e && (e->type != MfwTypMax))        /* OMAPS00145866 Added Null pointer check by Sameer  */
        {
            if (e->type > MfwTypNone && e->type < MfwTypMax)
            {
                f = mfwCommand[e->type];
                if (f && ((w->flags & MfwWinVisible)
                                || (e->type == MfwTypWin)))
                    (void)(f(MfwCmdUpdate,e));/*a0393213 lint warnings removal - void cast is done to avoid lint warning though the function returns int*/
            }
            e = e->next;
        }
    }

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winNext            |
+--------------------------------------------------------------------+

  PURPOSE : show next window (for testing purposes only)

*/

MfwHnd winNext (MfwHnd winCur)
{
    MfwHdr *cw;                         /* current window pointer   */

    if (!winCur)
        return 0;

    cw = ((MfwWin *) (((MfwHdr *) winCur)->data))->elems;
    while (cw->type != MfwTypWin)
    {
        if (cw->type == MfwTypMax)
        {
            cw = cw->next;
            if (!cw)
                cw = mfwRoot;
            else
                cw = cw->next;          /* windows successor        */
        }
        else
            cw = cw->next;
    }

    return cw;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winPrev            |
+--------------------------------------------------------------------+

  PURPOSE : show previous window (for testing purposes only)

*/

MfwHnd winPrev (MfwHnd winCur)
{
    MfwHnd wo, wc;

    wo = wc = winNext(winCur);
    while (wc != winCur)
    {
        wo = wc;
        wc = winNext(wc);
    }

    return wo;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winCommand         |
+--------------------------------------------------------------------+

  PURPOSE : handle mfw windows command

*/

static int winCommand (U32 cmd, void *h)
{
    switch (cmd)
    {
        case MfwCmdDelete:              /* delete me                */
            if (!h)
                return 0;
            winDelete(h);
            return 1;
        case MfwCmdUpdate:              /* repaint                  */
            if (!h || ((MfwHdr *) h)->type != MfwTypWin)
                return 0;
            winUpdate(((MfwHdr *) h)->data);
            return 1;
        default:
            break;
    }

    return 0;
}

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winIsVisible       |
+--------------------------------------------------------------------+

  PURPOSE : check if window is visible

*/
int winIsVisible(MfwHnd w)
{
    MfwWin *win;

    if (!w)
        return 0;                       /* no handle                */

    if (((MfwHdr *) w)->type != MfwTypWin)
        return 0;                       /* element is not a window  */

    win = ((MfwHdr *) w)->data;

    return (win->flags & MfwWinVisible);
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winIsFocussed      |
+--------------------------------------------------------------------+

  PURPOSE : check if window is focussed

*/
int winIsFocussed(MfwHnd w)
{
    MfwWin *win;

    if (!w)
        return 0;                       /* no handle                */

    if (((MfwHdr *) w)->type != MfwTypWin)
        return 0;                       /* element is not a window  */

    win = ((MfwHdr *) w)->data;

    return (win->elems == mfwFocus);

}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : winIcClosed        |
+--------------------------------------------------------------------+

  PURPOSE : check if window is closed

*/
int winIsClosed(MfwHnd w)
{
    MfwWin *win;

    if (!w)
        return 0;                       /* no handle                */

    if (((MfwHdr *) w)->type != MfwTypWin)
        return 0;                       /* element is not a window  */

    win = ((MfwHdr *) w)->data;

    return (win->flags & MfwWinClosed);
}

MfwHdr* getHdr( MfwHnd win)
{
	return((MfwHdr *) win);
}
MfwWin* getWinData( MfwHnd win)
{
	MfwHdr* winHdr;
	winHdr = getHdr(win);
	return (winHdr->data);
}

#define TWH_MAX_STR_LEN 90
#define TWH_MAX_SINGLE_SIZE	21		// This is the length of the Level, Address, Type and Callback in hex plus a zero terminator

static unsigned char trc_lvl;
static char mfw_twh_str[TWH_MAX_STR_LEN];

//	Mar 30, 2005	REF: CRR 29986	xpradipg
//	remove the definition since its not used
#ifndef FF_MMI_OPTIM
static unsigned int mfw_twh_strlen;
#endif

static void mfw_twhNext(MfwHdr *next);
static char *mfw_twhType(MfwTyp type);
static void mfw_twhOut(void *ptr, MfwTyp typ);
static void mfw_twhCb(void *ptr);
static void mfw_twh_str_purge(void);

#include <string.h>

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_WIN            |
| STATE   : code                        ROUTINE : mfw_traceWinHdrs   |
+--------------------------------------------------------------------+

  PURPOSE	: This function will trace out the entire window tree.
  			: EXTREME care should be taken using this function as it will cause a
  			: massive overhead on the CPU and processing WILL be affected!!!!

*/
void mfw_traceWinHdrs(void)
{
	TRACE_FUNCTION(">>>>> mfw_traceWinHdrs");

	trc_lvl = 0;

	TRACE_EVENT("mfwRoot");

	if (mfwRoot)
		mfw_twhNext(mfwRoot);

	/*
	** Trace out the last remaining line (there will always be one)
	*/
	mfw_twh_str_purge();

	TRACE_FUNCTION("<<<<< mfw_traceWinHdrs");
	return;
}

static void mfw_twhNext(MfwHdr *next)
{
	while (next)
	{
		if (next->type != MfwTypMax)
		{
			/*
			** Trace out this address, and its Type
			*/
			mfw_twhOut(next, next->type);

			/*
			** If this type is a Window, then it may have sub-elements
			** Trace them out before continuing the tree on this level
			*/
			if (next->type == MfwTypWin)
			{
				MfwWin *win_ptr = (MfwWin *)next->data;

				if (win_ptr)
				{
					MfwHdr *win_elems = win_ptr->elems;

					/*
					** Add the Callback Address before doing the sub-elements
					*/
					mfw_twhCb((void*)win_ptr->handler);
					trc_lvl++;
					mfw_twhNext(win_elems);
					trc_lvl--;
				}
			}

			if (next->next == NULL)
			{
				mfw_twhOut(0, MfwTypNone); /*a0393213 compiler warnings removal - 0 changed to MfwTypNone*/
			}

			next = next->next;
		}
		else
		{
			/*
			** Trace out this address, and its Type
			*/
			mfw_twhOut(next, next->type);

			next = NULL;
		}
	}
		
	return;
}

static char *mfw_twhType(MfwTyp type)
{
	switch (type)
	{
    	case MfwTypNone:                         /* no element (first !!)    */
    		return("MfwTypNone");
//    		break;  

    	case MfwTypWin:                          /* window                   */
    		return("MfwTypWin");
//    		break;  

		case MfwTypEdt:                          /* editor                   */
			return("MfwTypEdt");
//			break;  

    	case MfwTypMnu:                          /* menu handler             */
    		return("MfwTypMnu");
//    		break;  

		case MfwTypIcn:                          /* icon handler             */
			return("MfwTypIcn");
//			break;  

		case MfwTypKbd:                          /* keyboard                 */
			return("MfwTypKbd");
//			break;  

		case MfwTypTim:                          /* timer                    */
			return("MfwTypTim");
//			break;  

		case MfwTypMme:                          /* misc. mobile equipment   */
			return("MfwTypMme");
//			break;  

		case MfwTypVmm:                          /* MDL virtual machine      */
			return("MfwTypVmm");
//			break;  

		case MfwTypNm:                           /* network                  */
			return("MfwTypNm");
//			break;  

		case MfwTypSim:                          /* SIM card                 */
			return("MfwTypSim");
//			break;  

		case MfwTypCm:                           /* call handling            */
			return("MfwTypCm");
//			break;  

		case MfwTypPhb:                          /* phonebook handling       */
			return("MfwTypPhb");
//			break;  

		case MfwTypSms:                          /* short message handling   */
			return("MfwTypSms");
//			break;  

		case MfwTypSs:                           /* supl. services handling  */
			return("MfwTypSs");
//			break;  

		case MfwTypSat:                          /* SIM Toolkit handling     */
			return("MfwTypSat");
//			break;  

		case MfwTypLng:                          /* language handling        */
			return("MfwTypLng");
//			break;  

		case MfwTypInp:                          /* input handling           */
			return("MfwTypInp");
//			break; 

		case MfwTypNode:                         /* node element             */
			return("MfwTypNode");
//			break; 

		case MfwTypCphs:                         /* CPHS element             */
			return("MfwTypCphs");
//			break; 

		case MfwTypGprs:                         /* GPRS handling            */
			return("MfwTypGprs");
//			break;  

		case MfwTypEm:							/*MC, SPR 1209 Eng Mode handling*/
			return("MfwTypEm");
//			break; 

#ifdef BT_INTERFACE
		case MfwTypBt:                           /* bluetooth handling       */
			return("MfwTypBt");
//			break;  
#endif

#ifdef BTE_MOBILE
		case MfwTypBte:                           /* bluetooth handling       */
			return("MfwTypBte");
//			break;		
#endif

		case MfwTypMax:                          /* end of types (last !!)   */
			return("MfwTypMax");
//			break;  

		default:
			return("Not Known");
	}
}

static void mfw_twhOut(void *ptr, MfwTyp typ)
{
	unsigned char i;
	char	fmt_str[30];

	memset(fmt_str, 0, 30);
	
#if 0
	/* The code here will output the information in hex format which will need
    ** more decoding, but which may be necessary if the amount of information
    ** being output causes problems in the BMI. Change the above #if to be '#if 1'
    ** to use this format
    */
	sprintf(fmt_str,"%02x%08lx%02x", trc_lvl, ptr, typ);

	/*
	** Determine whether a new string is required
	*/
	if (mfw_twh_strlen > (TWH_MAX_STR_LEN - TWH_MAX_SINGLE_SIZE))
	{
		/*
		** Need to output the previous trace and start a new line
		*/
		mfw_twh_str_purge();
	}
		
	strcat(mfw_twh_str, fmt_str);

	mfw_twh_strlen += 12;
#else

	memset(mfw_twh_str, 0, TWH_MAX_STR_LEN);
	
	for (i=0; i<trc_lvl; i++)
	{
		strcat(mfw_twh_str, "   ");
	}

	strcat(mfw_twh_str, "-> ");
	
	sprintf(fmt_str,"N:%08p T:%s", ptr, mfw_twhType(typ));/*a0393213 lint warnings removal-format specifier %08lx changed to %p*/

	strcat(mfw_twh_str, fmt_str);

	if (typ != MfwTypWin)
	{
		/*
		** Trace out the details - There will be no callback
		*/
		TRACE_EVENT(mfw_twh_str);
	}
#endif
	return;
}

static void mfw_twhCb(void *ptr)
{
	char	fmt_str[20];

	memset(fmt_str, 0, 20);
#if 0
	/* The code here will output the information in hex format which will need
    ** more decoding, but which may be necessary if the amount of information
    ** being output causes problems in the BMI. Change the above #if to be '#if 1'
    ** to use this format
    */
	/*
	** No Need to test whether there is enough space for the callback ...already checked in mfw_twhOut()
	*/
	sprintf(fmt_str,"%08lx", ptr);
		
	strcat(mfw_twh_str, fmt_str);

	mfw_twh_strlen += 8;
#else
	/*
	** No Need to test whether there is enough space for the callback ...already checked in mfw_twhOut()
	*/
	sprintf(fmt_str," Cb:%08p", ptr);/*a0393213 lint warnings removal-format specifier %08lx changed to %p*/
		
	strcat(mfw_twh_str, fmt_str);

	TRACE_EVENT(mfw_twh_str);
#endif
	return;
}

static void mfw_twh_str_purge(void)
{
#if 0
	/* The code here is needed when using the hex format output which will need
    ** more decoding, but which may be necessary if the amount of information
    ** being output causes problems in the BMI. Change the above #if to be '#if 1'
    ** to use this format
    */
	TRACE_EVENT(mfw_twh_str);

	memset(mfw_twh_str, 0, TWH_MAX_STR_LEN);
	mfw_twh_strlen = 0;

	vsi_t_sleep(VSI_CALLER 10);
#endif
	return;
}