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