comparison g23m/condat/ms/src/mfw/mfw_win.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /*
2 +--------------------------------------------------------------------+
3 | PROJECT: MMI-Framework (8417) $Workfile:: mfw_win.c $|
4 | $Author:: Es $ CONDAT GmbH $Revision:: 21 $|
5 | CREATED: 21.09.98 $Modtime:: 23.03.00 9:08 $|
6 | STATE : code |
7 +--------------------------------------------------------------------+
8
9 MODULE : MFW_WIN
10
11 PURPOSE : window handling functions
12
13 EXPORT :
14
15 TO DO :
16
17 $History:: mfw_win.c $
18
19 Mar 30, 2005 REF: CRR 29986 xpradipg
20 Description: Optimisation 1: Removal of unused variables and dynamically
21 allocate/ deallocate mbndata
22 Solution: removed the unused varialbe mfw_twh_strlen
23
24 * textMessage
25 * ***************** Version 21 *****************
26 * User: Es Date: 23.03.00 Time: 14:42
27 * Updated in $/GSM/Condat/MS/SRC/MFW
28 * Added 'winUnhide()': no update(), no event.
29 *
30 * ***************** Version 20 *****************
31 * User: Kk Date: 14.03.00 Time: 15:52
32 * Updated in $/GSM/Condat/MS/SRC/MFW
33 * changed update sequence
34 *
35 * ***************** Version 19 *****************
36 * User: Es Date: 3.03.00 Time: 12:04
37 * Updated in $/GSM/Condat/MS/SRC/MFW
38 * winUpdate(): first update windows children, then! call event
39 * handler
40 *
41 * ***************** Version 18 *****************
42 * User: Es Date: 18.02.00 Time: 17:46
43 * Updated in $/GSM/Condat/MS/SRC/MFW
44 * danger in winUpdate
45 *
46 * ***************** Version 17 *****************
47 * User: Nm Date: 17.02.00 Time: 9:23
48 * Updated in $/GSM/Condat/MS/SRC/MFW
49 * updated winIsFocussed
50 *
51 * ***************** Version 16 *****************
52 * User: Kk Date: 17.01.00 Time: 8:56
53 * Updated in $/GSM/Condat/MS/SRC/MFW
54 * added simple check functions for easy checking if win is visible,
55 * focussed, closed
56 *
57 * ***************** Version 15 *****************
58 * User: Kk Date: 10.01.00 Time: 13:46
59 * Updated in $/GSM/Condat/MS/SRC/MFW
60 * some changes done by ES
61 *
62 * ***************** Version 3 *****************
63 * User: Rm Date: 12/22/99 Time: 4:34p
64 * Updated in $/GSM/Condat/SND-MMI/MFW
65 *
66 * ***************** Version 2 *****************
67 * User: Es Date: 22.11.99 Time: 10:30
68 * Updated in $/GSM/Condat/SND-MMI/MFW
69 *
70 * ***************** Version 1 *****************
71 * User: Es Date: 18.11.99 Time: 16:35
72 * Created in $/GSM/Condat/SND-MMI/MFW
73 * Initial
74 *
75 * ***************** Version 13 *****************
76 * User: Es Date: 6.07.99 Time: 12:37
77 * Updated in $/GSM/DEV/MS/SRC/MFW
78 *
79 * ***************** Version 11 *****************
80 * User: Es Date: 14.04.99 Time: 17:34
81 * Updated in $/GSM/DEV/MS/SRC/MFW
82 * moved to CST
83 |
84 | ***************** Version 10 *****************
85 | User: Le Date: 14.04.99 Time: 9:51
86 | Updated in $/GSM/DEV/MS/SRC/MFW
87 *
88 * ***************** Version 9 *****************
89 * User: Es Date: 1.04.99 Time: 17:07
90 * Updated in $/GSM/DEV/MS/SRC/MFW
91 * removed lots of traces
92 *
93 * ***************** Version 8 *****************
94 * User: Es Date: 20.02.99 Time: 19:24
95 * Updated in $/GSM/DEV/MS/SRC/MFW
96 *
97 * ***************** Version 7 *****************
98 * User: Es Date: 20.02.99 Time: 18:22
99 * Updated in $/GSM/DEV/MS/SRC/MFW
100 *
101 * ***************** Version 6 *****************
102 * User: Es Date: 20.02.99 Time: 15:37
103 * Updated in $/GSM/DEV/MS/SRC/MFW
104 *
105 * ***************** Version 5 *****************
106 * User: Es Date: 18.02.99 Time: 17:01
107 * Updated in $/GSM/DEV/MS/SRC/MFW
108 *
109 * ***************** Version 4 *****************
110 * User: Es Date: 17.02.99 Time: 19:11
111 * Updated in $/GSM/DEV/MS/SRC/MFW
112 *
113 * ***************** Version 3 *****************
114 * User: Es Date: 14.01.99 Time: 17:19
115 * Updated in $/GSM/DEV/MS/SRC/MFW
116 *
117 * ***************** Version 2 *****************
118 * User: Es Date: 23.12.98 Time: 16:19
119 * Updated in $/GSM/DEV/MS/SRC/MFW
120 */
121
122
123 #define ENTITY_MFW
124
125 #if defined (NEW_FRAME)
126
127 #include "typedefs.h"
128 #include "vsi.h"
129 #include "custom.h"
130 #include "gsm.h"
131
132 #else
133
134 #include "STDDEFS.H"
135 #include "custom.h"
136 #include "gsm.h"
137 #include "vsi.h"
138
139 #endif
140
141 #include "mfw_mfw.h"
142 #include "mfw_sys.h"
143 #include "gdi.h"
144 #include "dspl.h"
145 #include "mfw_win.h"
146
147 static MfwHdr *autoFocus; /* focus of toplevel window */
148 static U8 winUseAutoFocus = 0; /* automatic focussing flag */
149 static int winCommand (U32 cmd, void *h);
150
151
152
153 /*
154 +--------------------------------------------------------------------+
155 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
156 | STATE : code ROUTINE : winInit |
157 +--------------------------------------------------------------------+
158
159 PURPOSE : initialize window handler
160
161 */
162
163 MfwRes winInit (U16 *sx, U16 *sy)
164 {
165 dspl_DevCaps displayData;
166
167 dspl_Init(); /* init display driver */
168
169 displayData.DisplayType = DSPL_TYPE_GRAPHIC;
170 dspl_SetDeviceCaps(&displayData);
171 dspl_GetDeviceCaps(&displayData);
172 *sx = displayData.Width;
173 *sy = displayData.Height;
174 winUseAutoFocus = 0;
175
176 mfwCommand[MfwTypWin] = (MfwCb) winCommand;
177
178 return MfwResOk;
179 }
180
181
182 /*
183 +--------------------------------------------------------------------+
184 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
185 | STATE : code ROUTINE : winExit |
186 +--------------------------------------------------------------------+
187
188 PURPOSE : finalize window handler
189
190 */
191
192 MfwRes winExit (void)
193 {
194 mfwCommand[MfwTypWin] = 0;
195 dspl_Exit(); /* finit display driver */
196
197 return MfwResOk;
198 }
199
200
201 /*
202 +--------------------------------------------------------------------+
203 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
204 | STATE : code ROUTINE : winCreate |
205 +--------------------------------------------------------------------+
206
207 PURPOSE : create window control
208
209 */
210
211 MfwHnd winCreate (MfwHnd w, MfwWinAttr *a, MfwEvt e, MfwCb f)
212 {
213
214
215 MfwHdr *hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
216 MfwWin *win = (MfwWin *) mfwAlloc(sizeof(MfwWin));
217 MfwHdr *eoc = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
218 MfwHdr *insert_status =0;
219
220 /* xreddymn Aug-09-2004, MMI-SPR-23964 (TII_MMS33)
221 * Implemented suspend and resume functionality for MFW windows
222 * The following code posts MfwWinSuspend event
223 */
224 #if 1
225 MfwWin *ee;
226 MfwHnd window;
227 window = mfwParent(mfwFocus);
228 if(window)
229 {
230 ee = (MfwWin*) ((MfwHdr *) window)->data;
231 if(ee && (((MfwHdr *) window)->type == MfwTypWin))
232 {
233 if (ee->handler && ee->mask & MfwWinSuspend)
234 {
235 ee->handler(MfwWinSuspend,ee);
236 }
237 }
238 }
239 #endif
240
241
242
243
244 if (!hdr || !win || !eoc)
245 {
246 TRACE_ERROR("ERROR: winCreate() Mem Alloc Failed.");
247
248 if(hdr)
249 mfwFree((U8*)hdr,sizeof(MfwHdr));
250
251 if(win)
252 mfwFree((U8*)win,sizeof(MfwWin));
253
254 if(eoc)
255 mfwFree((U8*)eoc,sizeof(MfwHdr));
256
257 return 0;
258 }
259
260 eoc->next = hdr; /* setup eoc element */
261 eoc->type = MfwTypMax;
262 eoc->data = 0;
263
264 win->mask = e; /* setup window control */
265 win->flags = 0;
266 win->handler = f;
267 win->attr = a;
268 win->elems = eoc;
269 win->user = 0;
270
271 hdr->data = win; /* setup header element */
272 hdr->type = MfwTypWin;
273
274 if (mfwSignallingMethod == 0)
275 insert_status = mfwInsert(w,hdr);
276 else
277 {
278 insert_status = mfwInsert(mfwParent(mfwFocus),hdr);
279 mfwSetFocus(eoc);
280 }
281
282 /* Release memory if handler installation failed. */
283 if(!insert_status)
284 {
285 TRACE_ERROR("ERROR: winCreate() Failed to Install Handler. ");
286 mfwFree((U8*)hdr,sizeof(MfwHdr));
287 mfwFree((U8*)win,sizeof(MfwWin));
288 mfwFree((U8*)eoc,sizeof(MfwHdr));
289 return 0;
290 }
291
292 return insert_status;
293 }
294
295
296 /*
297 +--------------------------------------------------------------------+
298 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
299 | STATE : code ROUTINE : winDelete |
300 +--------------------------------------------------------------------+
301
302 PURPOSE : delete window control
303
304 */
305
306 MfwRes winDelete (MfwHnd w)
307 {
308 MfwCb f;
309 MfwHdr *e, *t, *r;
310 MfwRes res;
311
312 /*NM, p012a*/
313 MfwWin *parent_controlBlock;
314 MfwHdr *parent_win;
315 /* U8 uMode;
316 p012a end*/
317
318 TRACE_FUNCTION("win_delete()");
319
320 if (!w)
321 return MfwResIllHnd;
322 if (((MfwHdr *) w)->type != MfwTypWin)
323 return MfwResIllHnd; /* element is not a window */
324
325 e = ((MfwHdr *) w)->data;
326 if (!e)
327 return MfwResErr;
328
329 ((MfwWin *) e)->flags |= MfwWinDelete;
330 if (((MfwWin *) e)->handler)
331 if (((MfwWin *) e)->mask & MfwWinDelete)
332 ((MfwWin *) e)->handler(MfwWinDelete,e);
333
334 e = ((MfwWin *) e)->elems;
335 if (!e)
336 return MfwResErr;
337
338 if (mfwFocus == e) /* was focus window */
339 mfwSetFocus(0); /* no focus anymore */
340
341
342
343 while (e && e->type != MfwTypMax) /* try to delete all elems */
344 {
345 t = e->next;
346 if (e->data)
347 {
348 if (mfwSignallingMethod != 0 && e->type == MfwTypWin)
349 {
350 r = (MfwHdr*) mfwParent(w);
351 mfwRemove(e); /* move up child window */
352 mfwAppend(&(((MfwWin*)(r->data))->elems),e);
353 }
354 else
355 {
356 f = mfwCommand[e->type];
357 if (f)
358 f(MfwCmdDelete,e);
359 }
360 }
361 e = t;
362 }
363 res = (mfwRemove(w)) ? MfwResOk : MfwResIllHnd;
364
365
366 /*NM, p012d
367 old: after deleting the focus-win start from root to top
368 new: after deleting the focus-win just give the new focus to
369 his parent-win (faster)
370 */
371 if (mfwSignallingMethod != 0 && mfwRoot && (!mfwFocus))
372 {
373 parent_win = (MfwHdr*) mfwParent(w);
374
375 if (((MfwHdr *) parent_win)->type == MfwTypWin)
376 {
377 parent_controlBlock = ((MfwHdr *) parent_win)->data;
378
379 /* xreddymn Aug-09-2004, MMI-SPR-23964 (TII_MMS33)
380 * Implemented suspend and resume functionality for MFW windows
381 * The following code posts MfwWinResume event
382 */
383 #if 1
384 if (parent_controlBlock->handler && parent_controlBlock->mask & MfwWinResume)
385 {
386 parent_controlBlock->handler(MfwWinResume,parent_controlBlock);
387 }
388 #endif
389
390
391
392 winUpdate(parent_controlBlock);
393 mfwSetFocus(autoFocus);
394 }
395
396 }
397
398
399
400 mfwFree((MfwHnd) e,sizeof(MfwHdr));
401 mfwFree(((MfwHdr *) w)->data,sizeof(MfwWin));
402 mfwFree(w,sizeof(MfwHdr));
403
404 return res;
405 }
406
407
408 /*
409 +--------------------------------------------------------------------+
410 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
411 | STATE : code ROUTINE : winShow |
412 +--------------------------------------------------------------------+
413
414 PURPOSE : show window (put in front of visibles)
415
416 */
417
418 MfwRes winShow (MfwHnd w)
419 {
420 MfwWin *win;
421
422
423 TRACE_FUNCTION("winShow()");
424
425 if (!w)
426 return MfwResIllHnd; /* window does not exist */
427
428 if (((MfwHdr *) w)->type != MfwTypWin)
429 return MfwResIllHnd; /* element is not a window */
430
431 win = ((MfwHdr *) w)->data; /* get control block */
432
433 mfwAppend(mfwRemove(w),w); /* to front (draw at last) */
434 win->flags |= MfwWinVisible; /* window is visible */
435
436 winUpdate(win); /* draw window elements */
437 if (winUseAutoFocus) /* automatic focussing */
438 mfwSetFocus(autoFocus); /* determined by update() */
439
440 return MfwResOk;
441 }
442
443
444 /*
445 +--------------------------------------------------------------------+
446 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
447 | STATE : code ROUTINE : winHide |
448 +--------------------------------------------------------------------+
449
450 PURPOSE : hide window (and redraw remaining)
451
452 */
453
454 MfwRes winHide (MfwHnd w)
455 {
456 MfwHdr *r;
457 MfwWin *win;
458
459 if (!w)
460 return MfwResIllHnd; /* element does not exist */
461 if (((MfwHdr *) w)->type != MfwTypWin)
462 return MfwResIllHnd; /* element is not a window */
463
464 win = ((MfwHdr *) w)->data;
465 win->flags &= ~MfwWinVisible; /* window is not visible */
466 if (win->handler) /* call event handler */
467 if (win->mask & MfwWinVisible)
468 win->handler(MfwWinVisible,win);
469 r = mfwRoot; /* the beginning */
470 autoFocus = 0; /* reset focus */
471 while (r->type != MfwTypMax) /* more links in chain */
472 {
473 if (r->type == MfwTypWin) /* link is a window */
474 winUpdate(r->data);
475 r = r->next;
476 }
477 if (winUseAutoFocus) /* automatic focussing */
478 mfwSetFocus(autoFocus); /* determined by update() */
479
480 return MfwResOk;
481 }
482
483
484 /*
485 +--------------------------------------------------------------------+
486 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
487 | STATE : code ROUTINE : winUnhide |
488 +--------------------------------------------------------------------+
489
490 PURPOSE : unhide window (without redrawing, no event)
491
492 */
493
494 MfwRes winUnhide (MfwHnd w)
495 {
496 MfwWin *win;
497
498 if (!w)
499 return MfwResIllHnd; /* element does not exist */
500 if (((MfwHdr *) w)->type != MfwTypWin)
501 return MfwResIllHnd; /* element is not a window */
502
503 win = ((MfwHdr *) w)->data;
504 win->flags |= MfwWinVisible; /* window will be visible */
505
506 return MfwResOk;
507 }
508
509
510 /*
511 +--------------------------------------------------------------------+
512 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
513 | STATE : code ROUTINE : winFocus |
514 +--------------------------------------------------------------------+
515
516 PURPOSE : assign input/event focus to window
517
518 */
519
520 MfwHnd winFocus (MfwHnd w)
521 {
522 MfwWin *wNew, *wOld = 0;
523
524 if (winUseAutoFocus) /* automatic focussing */
525 return 0; /* ES!! only for testing !! */
526 if (!w)
527 {
528 w = mfwFocus;
529 mfwSetFocus(0); /* delete focus */
530 return w; /* return old focus */
531 }
532
533 if (((MfwHdr *) w)->type != MfwTypWin)
534 return 0; /* element is not a window */
535
536 if (mfwFocus)
537 {
538 while (mfwFocus->type != MfwTypMax)
539 mfwSetFocus(mfwFocus->next); /* search focus root */
540 mfwSetFocus(mfwFocus->next); /* the focus window */
541 if (mfwFocus->type != MfwTypWin)
542 {
543 mfwSetFocus(0); /* serious error: */
544 return 0; /* element is not a window */
545 }
546 wOld = mfwFocus->data; /* window control block */
547 wOld->flags &= ~MfwWinFocussed; /* input focus / deselected */
548 }
549
550 wNew = ((MfwHdr *) w)->data;
551 w = mfwFocus; /* save old focus */
552 mfwSetFocus(wNew->elems); /* focus on window elements */
553 wNew->flags |= MfwWinFocussed; /* input focus / selected */
554
555 if (wNew->handler) /* call new event handler */
556 if (wNew->mask & MfwWinFocussed)
557 wNew->handler(MfwWinFocussed,wNew);
558 if (wOld && wOld->handler) /* call old event handler */
559 if (wOld->mask & MfwWinFocussed)
560 wOld->handler(MfwWinFocussed,wOld);
561
562 return w; /* return old focus */
563 }
564
565
566 /*
567 +--------------------------------------------------------------------+
568 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
569 | STATE : code ROUTINE : winAutoFocus |
570 +--------------------------------------------------------------------+
571
572 PURPOSE : set auto focus mode
573
574 */
575
576 U8 winAutoFocus (U8 useit)
577 {
578 U8 winUseAutoFocusOld = winUseAutoFocus; /* save previous state */
579
580 winUseAutoFocus = useit;
581
582 return winUseAutoFocusOld; /* return previous state */
583 }
584
585
586 /*
587 +--------------------------------------------------------------------+
588 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
589 | STATE : code ROUTINE : winClear |
590 +--------------------------------------------------------------------+
591
592 PURPOSE : clear window
593
594 */
595
596 MfwRes winClear (MfwHnd w)
597 {
598 MfwWin *win;
599
600 if (!w)
601 {
602 dspl_ClearAll(); /* clear screen */
603 return MfwResOk;
604 }
605
606 win = ((MfwHdr *) w)->data; /* clear window area */
607 dspl_Clear(win->attr->win.px,win->attr->win.py,
608 (U16) (win->attr->win.sx+win->attr->win.px-2),
609 (U16) (win->attr->win.sy+win->attr->win.py-2));
610
611 return MfwResOk;
612 }
613
614
615 /*
616 +--------------------------------------------------------------------+
617 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
618 | STATE : code ROUTINE : winUpdate |
619 +--------------------------------------------------------------------+
620
621 PURPOSE : draw all visible windows
622
623 */
624
625 MfwRes winUpdate (MfwWin *w)
626 {
627 MfwCb f = 0; /* modules command handler */
628 MfwHdr *e; /* windows elements */
629
630 // TRACE_FUNCTION("winUpdate()");
631
632 if (!w)
633 return MfwResIllHnd;
634
635 if (mfwSignallingMethod == 0)
636 {
637 if (!(w->flags & MfwWinVisible))
638 return MfwResOk; /* hidden window */
639
640 if (w->handler) /* THEN: call event handler */
641 if (w->mask & MfwWinVisible)
642 w->handler(MfwWinVisible,w);
643 e = w->elems; /* FIRST: update children */
644 autoFocus = e; /* gets focus of top window */
645 while (e->type != MfwTypMax) /* window has elements */
646 {
647 if (e->type > MfwTypNone && e->type < MfwTypMax)
648 {
649 f = mfwCommand[e->type];
650 if (f) /* cmd function implemented */
651 f(MfwCmdUpdate,e);
652 }
653 e = e->next;
654 }
655 }
656 else
657 {
658 if (w->handler && (w->flags & MfwWinVisible))
659 if (w->mask & MfwWinVisible){
660 w->handler(MfwWinVisible,w);
661 }
662
663 e = w->elems; /* FIRST: update children */
664 autoFocus = e; /* gets focus of top window */
665 while (e->type != MfwTypMax) /* window has elements */
666 {
667 if (e->type > MfwTypNone && e->type < MfwTypMax)
668 {
669 f = mfwCommand[e->type];
670 if (f && ((w->flags & MfwWinVisible)
671 || (e->type == MfwTypWin)))
672 f(MfwCmdUpdate,e);
673 }
674 e = e->next;
675 }
676 }
677
678 return MfwResOk;
679 }
680
681
682 /*
683 +--------------------------------------------------------------------+
684 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
685 | STATE : code ROUTINE : winNext |
686 +--------------------------------------------------------------------+
687
688 PURPOSE : show next window (for testing purposes only)
689
690 */
691
692 MfwHnd winNext (MfwHnd winCur)
693 {
694 MfwHdr *cw; /* current window pointer */
695
696 if (!winCur)
697 return 0;
698
699 cw = ((MfwWin *) (((MfwHdr *) winCur)->data))->elems;
700 while (cw->type != MfwTypWin)
701 {
702 if (cw->type == MfwTypMax)
703 {
704 cw = cw->next;
705 if (!cw)
706 cw = mfwRoot;
707 else
708 cw = cw->next; /* windows successor */
709 }
710 else
711 cw = cw->next;
712 }
713
714 return cw;
715 }
716
717
718 /*
719 +--------------------------------------------------------------------+
720 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
721 | STATE : code ROUTINE : winPrev |
722 +--------------------------------------------------------------------+
723
724 PURPOSE : show previous window (for testing purposes only)
725
726 */
727
728 MfwHnd winPrev (MfwHnd winCur)
729 {
730 MfwHnd wo, wc;
731
732 wo = wc = winNext(winCur);
733 while (wc != winCur)
734 {
735 wo = wc;
736 wc = winNext(wc);
737 }
738
739 return wo;
740 }
741
742
743 /*
744 +--------------------------------------------------------------------+
745 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
746 | STATE : code ROUTINE : winCommand |
747 +--------------------------------------------------------------------+
748
749 PURPOSE : handle mfw windows command
750
751 */
752
753 static int winCommand (U32 cmd, void *h)
754 {
755 switch (cmd)
756 {
757 case MfwCmdDelete: /* delete me */
758 if (!h)
759 return 0;
760 winDelete(h);
761 return 1;
762 case MfwCmdUpdate: /* repaint */
763 if (!h || ((MfwHdr *) h)->type != MfwTypWin)
764 return 0;
765 winUpdate(((MfwHdr *) h)->data);
766 return 1;
767 default:
768 break;
769 }
770
771 return 0;
772 }
773
774 /*
775 +--------------------------------------------------------------------+
776 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
777 | STATE : code ROUTINE : winIsVisible |
778 +--------------------------------------------------------------------+
779
780 PURPOSE : check if window is visible
781
782 */
783 int winIsVisible(MfwHnd w)
784 {
785 MfwWin *win;
786
787 if (!w)
788 return 0; /* no handle */
789
790 if (((MfwHdr *) w)->type != MfwTypWin)
791 return 0; /* element is not a window */
792
793 win = ((MfwHdr *) w)->data;
794
795 return (win->flags & MfwWinVisible);
796 }
797
798
799 /*
800 +--------------------------------------------------------------------+
801 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
802 | STATE : code ROUTINE : winIsFocussed |
803 +--------------------------------------------------------------------+
804
805 PURPOSE : check if window is focussed
806
807 */
808 int winIsFocussed(MfwHnd w)
809 {
810 MfwWin *win;
811
812 if (!w)
813 return 0; /* no handle */
814
815 if (((MfwHdr *) w)->type != MfwTypWin)
816 return 0; /* element is not a window */
817
818 win = ((MfwHdr *) w)->data;
819
820 return (win->elems == mfwFocus);
821
822 }
823
824
825 /*
826 +--------------------------------------------------------------------+
827 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
828 | STATE : code ROUTINE : winIcClosed |
829 +--------------------------------------------------------------------+
830
831 PURPOSE : check if window is closed
832
833 */
834 int winIsClosed(MfwHnd w)
835 {
836 MfwWin *win;
837
838 if (!w)
839 return 0; /* no handle */
840
841 if (((MfwHdr *) w)->type != MfwTypWin)
842 return 0; /* element is not a window */
843
844 win = ((MfwHdr *) w)->data;
845
846 return (win->flags & MfwWinClosed);
847 }
848
849 MfwHdr* getHdr( MfwHnd win)
850 {
851 return((MfwHdr *) win);
852 }
853 MfwWin* getWinData( MfwHnd win)
854 {
855 MfwHdr* winHdr;
856 winHdr = getHdr(win);
857 return (winHdr->data);
858 }
859
860 #define TWH_MAX_STR_LEN 90
861 #define TWH_MAX_SINGLE_SIZE 21 // This is the length of the Level, Address, Type and Callback in hex plus a zero terminator
862
863 static unsigned char trc_lvl;
864 static char mfw_twh_str[TWH_MAX_STR_LEN];
865
866 // Mar 30, 2005 REF: CRR 29986 xpradipg
867 // remove the definition since its not used
868 #ifndef FF_MMI_OPTIM
869 static unsigned int mfw_twh_strlen;
870 #endif
871
872 static void mfw_twhNext(MfwHdr *next);
873 static char *mfw_twhType(MfwTyp type);
874 static void mfw_twhOut(void *ptr, MfwTyp typ);
875 static void mfw_twhCb(void *ptr);
876 static void mfw_twh_str_purge(void);
877
878 #include <string.h>
879
880 /*
881 +--------------------------------------------------------------------+
882 | PROJECT : MMI-Framework (8417) MODULE : MFW_WIN |
883 | STATE : code ROUTINE : mfw_traceWinHdrs |
884 +--------------------------------------------------------------------+
885
886 PURPOSE : This function will trace out the entire window tree.
887 : EXTREME care should be taken using this function as it will cause a
888 : massive overhead on the CPU and processing WILL be affected!!!!
889
890 */
891 void mfw_traceWinHdrs(void)
892 {
893 TRACE_FUNCTION(">>>>> mfw_traceWinHdrs");
894
895 trc_lvl = 0;
896
897 TRACE_EVENT("mfwRoot");
898
899 if (mfwRoot)
900 mfw_twhNext(mfwRoot);
901
902 /*
903 ** Trace out the last remaining line (there will always be one)
904 */
905 mfw_twh_str_purge();
906
907 TRACE_FUNCTION("<<<<< mfw_traceWinHdrs");
908 return;
909 }
910
911 static void mfw_twhNext(MfwHdr *next)
912 {
913 while (next)
914 {
915 if (next->type != MfwTypMax)
916 {
917 /*
918 ** Trace out this address, and its Type
919 */
920 mfw_twhOut(next, next->type);
921
922 /*
923 ** If this type is a Window, then it may have sub-elements
924 ** Trace them out before continuing the tree on this level
925 */
926 if (next->type == MfwTypWin)
927 {
928 MfwWin *win_ptr = (MfwWin *)next->data;
929
930 if (win_ptr)
931 {
932 MfwHdr *win_elems = win_ptr->elems;
933
934 /*
935 ** Add the Callback Address before doing the sub-elements
936 */
937 mfw_twhCb((void *)win_ptr->handler);
938 trc_lvl++;
939 mfw_twhNext(win_elems);
940 trc_lvl--;
941 }
942 }
943
944 if (next->next == NULL)
945 {
946 mfw_twhOut(0, 0);
947 }
948
949 next = next->next;
950 }
951 else
952 {
953 /*
954 ** Trace out this address, and its Type
955 */
956 mfw_twhOut(next, next->type);
957
958 next = NULL;
959 }
960 }
961
962 return;
963 }
964
965 static char *mfw_twhType(MfwTyp type)
966 {
967 switch (type)
968 {
969 case MfwTypNone: /* no element (first !!) */
970 return("MfwTypNone");
971 // break; // RAVI
972
973 case MfwTypWin: /* window */
974 return("MfwTypWin");
975 // break; // RAVI
976
977 case MfwTypEdt: /* editor */
978 return("MfwTypEdt");
979 // break; // RAVI
980
981 case MfwTypMnu: /* menu handler */
982 return("MfwTypMnu");
983 // break; // RAVI
984
985 case MfwTypIcn: /* icon handler */
986 return("MfwTypIcn");
987 // break; // RAVI
988
989 case MfwTypKbd: /* keyboard */
990 return("MfwTypKbd");
991 // break; // RAVI
992
993 case MfwTypTim: /* timer */
994 return("MfwTypTim");
995 // break; // RAVI
996
997 case MfwTypMme: /* misc. mobile equipment */
998 return("MfwTypMme");
999 // break; //RAVI
1000
1001 case MfwTypVmm: /* MDL virtual machine */
1002 return("MfwTypVmm");
1003 // break; // RAVI
1004
1005 case MfwTypNm: /* network */
1006 return("MfwTypNm");
1007 // break; // RAVI
1008
1009 case MfwTypSim: /* SIM card */
1010 return("MfwTypSim");
1011 // break; // RAVI
1012
1013 case MfwTypCm: /* call handling */
1014 return("MfwTypCm");
1015 // break; // RAVI
1016
1017 case MfwTypPhb: /* phonebook handling */
1018 return("MfwTypPhb");
1019 // break; // RAVI
1020
1021 case MfwTypSms: /* short message handling */
1022 return("MfwTypSms");
1023 // break; // RAVI
1024
1025 case MfwTypSs: /* supl. services handling */
1026 return("MfwTypSs");
1027 // break; // RAVI
1028
1029 case MfwTypSat: /* SIM Toolkit handling */
1030 return("MfwTypSat");
1031 // break; // RAVI
1032
1033 case MfwTypLng: /* language handling */
1034 return("MfwTypLng");
1035 // break; // RAVI
1036
1037 case MfwTypInp: /* input handling */
1038 return("MfwTypInp");
1039 // break; // RAVI
1040
1041 case MfwTypNode: /* node element */
1042 return("MfwTypNode");
1043 // break; // RAVI
1044
1045 case MfwTypCphs: /* CPHS element */
1046 return("MfwTypCphs");
1047 // break; // RAVI
1048
1049 case MfwTypGprs: /* GPRS handling */
1050 return("MfwTypGprs");
1051 // break; // RAVI
1052
1053 case MfwTypEm: /*MC, SPR 1209 Eng Mode handling*/
1054 return("MfwTypEm");
1055 // break; // RAVI
1056
1057 #ifdef BT_INTERFACE
1058 case MfwTypBt: /* bluetooth handling */
1059 return("MfwTypBt");
1060 // break; // RAVI
1061 #endif
1062
1063 #ifdef BTE_MOBILE
1064 case MfwTypBte: /* bluetooth handling */
1065 return("MfwTypBte");
1066 // break; // RAVI
1067 #endif
1068
1069 case MfwTypMax: /* end of types (last !!) */
1070 return("MfwTypMax");
1071 // break; // RAVI
1072
1073 default:
1074 return("Not Known");
1075 }
1076 }
1077
1078 static void mfw_twhOut(void *ptr, MfwTyp typ)
1079 {
1080 unsigned char i;
1081 char fmt_str[30];
1082
1083 memset(fmt_str, 0, 30);
1084
1085 #if 0
1086 /* The code here will output the information in hex format which will need
1087 ** more decoding, but which may be necessary if the amount of information
1088 ** being output causes problems in the BMI. Change the above #if to be '#if 1'
1089 ** to use this format
1090 */
1091 sprintf(fmt_str,"%02x%08lx%02x", trc_lvl, ptr, typ);
1092
1093 /*
1094 ** Determine whether a new string is required
1095 */
1096 if (mfw_twh_strlen > (TWH_MAX_STR_LEN - TWH_MAX_SINGLE_SIZE))
1097 {
1098 /*
1099 ** Need to output the previous trace and start a new line
1100 */
1101 mfw_twh_str_purge();
1102 }
1103
1104 strcat(mfw_twh_str, fmt_str);
1105
1106 mfw_twh_strlen += 12;
1107 #else
1108
1109 memset(mfw_twh_str, 0, TWH_MAX_STR_LEN);
1110
1111 for (i=0; i<trc_lvl; i++)
1112 {
1113 strcat(mfw_twh_str, " ");
1114 }
1115
1116 strcat(mfw_twh_str, "-> ");
1117
1118 sprintf(fmt_str,"N:%08lx T:%s", ptr, mfw_twhType(typ));
1119
1120 strcat(mfw_twh_str, fmt_str);
1121
1122 if (typ != MfwTypWin)
1123 {
1124 /*
1125 ** Trace out the details - There will be no callback
1126 */
1127 TRACE_EVENT(mfw_twh_str);
1128 }
1129 #endif
1130 return;
1131 }
1132
1133 static void mfw_twhCb(void *ptr)
1134 {
1135 char fmt_str[20];
1136
1137 memset(fmt_str, 0, 20);
1138 #if 0
1139 /* The code here will output the information in hex format which will need
1140 ** more decoding, but which may be necessary if the amount of information
1141 ** being output causes problems in the BMI. Change the above #if to be '#if 1'
1142 ** to use this format
1143 */
1144 /*
1145 ** No Need to test whether there is enough space for the callback ...already checked in mfw_twhOut()
1146 */
1147 sprintf(fmt_str,"%08lx", ptr);
1148
1149 strcat(mfw_twh_str, fmt_str);
1150
1151 mfw_twh_strlen += 8;
1152 #else
1153 /*
1154 ** No Need to test whether there is enough space for the callback ...already checked in mfw_twhOut()
1155 */
1156 sprintf(fmt_str," Cb:%08lx", ptr);
1157
1158 strcat(mfw_twh_str, fmt_str);
1159
1160 TRACE_EVENT(mfw_twh_str);
1161 #endif
1162 return;
1163 }
1164
1165 static void mfw_twh_str_purge(void)
1166 {
1167 #if 0
1168 /* The code here is needed when using the hex format output which will need
1169 ** more decoding, but which may be necessary if the amount of information
1170 ** being output causes problems in the BMI. Change the above #if to be '#if 1'
1171 ** to use this format
1172 */
1173 TRACE_EVENT(mfw_twh_str);
1174
1175 memset(mfw_twh_str, 0, TWH_MAX_STR_LEN);
1176 mfw_twh_strlen = 0;
1177
1178 vsi_t_sleep(VSI_CALLER 10);
1179 #endif
1180 return;
1181 }
1182