diff src/ui/mfw/mfw_win.c @ 3:67bfe9f274f6

src/ui: import of src/ui3 from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:33:10 +0000
parents
children 92abb46dc1ba
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ui/mfw/mfw_win.c	Fri Oct 16 06:33:10 2020 +0000
@@ -0,0 +1,1199 @@
+/*
++--------------------------------------------------------------------+
+| 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;
+}
+