source: trunk/dll/notify.c@ 775

Last change on this file since 775 was 775, checked in by Gregg Young, 18 years ago

Minor clean up add comments re recent changes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: notify.c 775 2007-08-11 21:07:07Z gyoung $
5
6 Notifications
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2006 Steven H.Levine
10
11 17 Jul 06 SHL Use Win_Error
12 22 Jul 06 SHL Check more run time errors
13 30 Mar 07 GKY Remove GetPString for window class names
14 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
15
16
17***********************************************************************/
18
19#define INCL_DOS
20#define INCL_WIN
21#define INCL_GPI
22#include <os2.h>
23
24#include <stdarg.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28#include <ctype.h>
29#include <time.h>
30#include <stddef.h>
31#include <process.h> // _beginthread
32
33#include "fm3dll.h"
34#include "fm3dlg.h"
35#include "fm3str.h"
36
37#pragma data_seg(DATA1)
38
39static PSZ pszSrcFile = __FILE__;
40
41#pragma alloc_text(NOTIFY,Notify,NotifyWndProc,StartNotify)
42#pragma alloc_text(NOTIFY,NotifyThread,NotifyError)
43#pragma alloc_text(NOTIFY2,AddNote,NoteThread,NoteWndProc)
44#pragma alloc_text(NOTIFY3,StartNotes,EndNote,HideNote,ShowNote)
45
46static HWND hwndNotify;
47
48MRESULT EXPENTRY NotifyWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
49{
50 static ULONG showing = 0;
51
52 switch (msg) {
53 case WM_CREATE:
54 showing++;
55 {
56 MRESULT rc;
57
58 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
59 if (!WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER2, 5000)) {
60 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "WinStartTimer");
61 WinDestroyWindow(hwnd);
62 }
63 else {
64
65 RGB2 rgb2F, rgb2;
66
67 memset(&rgb2F, 0, sizeof(RGB2));
68 rgb2F.bRed = (BYTE)65;
69 rgb2.bRed = rgb2.bGreen = rgb2.bBlue = (BYTE)255;
70 rgb2.fcOptions = 0;
71 SetPresParams(hwnd, &rgb2, &rgb2F, &rgb2, GetPString(IDS_8HELVTEXT));
72 if (hwndMain) {
73 if (hwndStatus)
74 WinShowWindow(hwndStatus, FALSE);
75 if (hwndStatus2)
76 WinShowWindow(hwndStatus2, FALSE);
77 }
78 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
79 }
80 return rc;
81 }
82
83 case UM_SETUP:
84 WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_SHOW);
85 WinInvalidateRect(hwnd, NULL, FALSE);
86 return 0;
87
88 case WM_SETFOCUS:
89 if (mp2)
90 PostMsg(hwnd, UM_REPLACEFOCUS, mp1, MPVOID);
91 break;
92
93 case UM_REPLACEFOCUS:
94 if (mp1)
95 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
96 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
97 return 0;
98
99 case WM_PAINT:
100 {
101 MRESULT mr;
102 HPS hps;
103 SWP swp;
104 POINTL ptl;
105
106 mr = PFNWPStatic(hwnd, msg, mp1, mp2);
107 hps = WinGetPS(hwnd);
108 if (hps) {
109 if (WinQueryWindowPos(hwnd, &swp)) {
110 ptl.x = 0;
111 ptl.y = 0;
112 GpiMove(hps, &ptl);
113 GpiSetColor(hps, CLR_RED);
114 ptl.x = swp.cx - 1;
115 ptl.y = swp.cy - 1;
116 GpiBox(hps, DRO_OUTLINE, &ptl, 2, 2);
117 }
118 WinReleasePS(hwnd);
119 }
120 return mr;
121 }
122
123 case WM_BUTTON1DOWN:
124 case WM_BUTTON2DOWN:
125 case WM_BUTTON3DOWN:
126 case WM_TIMER:
127 case WM_CLOSE:
128 WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER2);
129 WinDestroyWindow(hwnd);
130 return 0;
131
132 case WM_DESTROY:
133 showing--;
134 if (!showing && hwndMain) {
135 if (hwndStatus)
136 WinShowWindow(hwndStatus, TRUE);
137 if (hwndStatus2)
138 WinShowWindow(hwndStatus2, TRUE);
139 }
140 break;
141 }
142 return PFNWPStatic(hwnd, msg, mp1, mp2);
143}
144
145HWND DoNotify(char *str)
146{
147 char *p;
148 HWND hwnd = (HWND) 0, hwndP;
149 LONG x, y, cx, cy;
150 SWP swp, swpS, swpS2;
151 static USHORT id = NOTE_FRAME;
152
153 if (str && *str) {
154 /* figure out what size the window should be and where it should be */
155 hwndP = (hwndMain) ? WinQueryWindow(hwndMain, QW_PARENT) : HWND_DESKTOP;
156 WinQueryWindowPos(hwndP, &swp);
157 if (hwndStatus)
158 WinQueryWindowPos(hwndStatus, &swpS);
159 if (hwndStatus2)
160 WinQueryWindowPos(hwndStatus2, &swpS2);
161 x = (hwndMain) ? ((hwndStatus) ? swpS.x - 1 :
162 WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER)) : 0;
163 y = (hwndMain) ? ((hwndStatus) ? swpS.y - 1 :
164 WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER)) : 0;
165 if (hwndMain && hwndStatus) {
166 if (hwndStatus2)
167 cx = swpS2.cx + swpS.cx + 8;
168 else
169 cx = swpS.cx + 6;
170 }
171 else
172 cx = (swp.cx - ((x * 2) + 4));
173 cy = (hwndMain) ? ((hwndStatus) ? swpS.cy + 2 : 28) : 28;
174
175 /* pretty-up the note by putting on a leading space */
176 if (*str != ' ') {
177 p = xmalloc(strlen(str) + 2, pszSrcFile, __LINE__);
178 if (!p)
179 p = str;
180 else {
181 strcpy(p + 1, str);
182 *p = ' ';
183 }
184 }
185 else
186 p = str;
187
188 hwnd = WinCreateWindow(hwndP,
189 WC_ERRORWND,
190 p,
191 SS_TEXT | DT_LEFT | DT_VCENTER | WS_VISIBLE,
192 x, y, cx, cy, hwndP, HWND_TOP, id++, NULL, NULL);
193 if (!hwndP)
194 Win_Error2(hwndP, hwndP, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
195
196 if (p != str)
197 free(p);
198 if (id > NOTE_MAX)
199 id = NOTE_FRAME;
200 }
201
202 AddNote(str);
203
204 return hwnd;
205}
206
207HWND Notify(char *str)
208{
209 return (HWND) WinSendMsg(MainObjectHwnd, UM_NOTIFY, MPFROMP(str), MPVOID);
210}
211
212VOID NotifyError(CHAR * filename, APIRET status)
213{
214 CHAR errortext[512];
215
216 if (!filename)
217 return;
218 sprintf(errortext, GetPString(IDS_ERRORACCESSTEXT), status, filename);
219 if (toupper(*filename) > 'B') {
220 if (status == 21)
221 strcat(errortext, GetPString(IDS_EMPTYREMOVETEXT));
222 else if (status == 27)
223 strcat(errortext, GetPString(IDS_CDMUSICTEXT));
224 else if (status == 19)
225 strcat(errortext, GetPString(IDS_WRITEPROTECTTEXT));
226 else if (status == 108)
227 strcat(errortext, GetPString(IDS_DRIVELOCKEDTEXT));
228 }
229 else {
230 if (status == 21)
231 strcat(errortext, GetPString(IDS_EMPTYFLOPPYTEXT));
232 else if (status == 27)
233 strcat(errortext, GetPString(IDS_UNFORMATEDTEXT));
234 else if (status == 107)
235 sprintf(&errortext[strlen(errortext)],
236 GetPString(IDS_PHANTOMTEXT), toupper(*filename));
237 else if (status == 19)
238 strcat(errortext, GetPString(IDS_DISKWRITEPROTEXTTEXT));
239 else if (status == 108)
240 strcat(errortext, GetPString(IDS_DISKLOCKEDTEXT));
241 }
242 DosBeep(250, 10);
243 DosBeep(500, 10);
244 DosBeep(250, 10);
245 DosBeep(500, 10);
246 Notify(errortext);
247}
248
249MRESULT EXPENTRY NoteWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
250{
251 static HPOINTER hptrIcon = (HPOINTER) 0;
252
253 switch (msg) {
254 case WM_INITDLG:
255 if (hwndNotify != (HWND) 0) {
256 if (mp2) {
257 WinSendDlgItemMsg(hwndNotify,
258 NOTE_LISTBOX,
259 LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0), mp2);
260 PostMsg(hwndNotify, UM_NOTIFY, MPVOID, MPVOID);
261 free((CHAR *) mp2);
262 }
263 WinDismissDlg(hwnd, 0);
264 break;
265 }
266 hwndNotify = hwnd;
267 fThreadNotes = FALSE;
268 {
269 BOOL dummy = TRUE;
270
271 PrfWriteProfileData(fmprof,
272 FM3Str, "ThreadNotes", &dummy, sizeof(BOOL));
273 }
274 if (mp2) {
275 WinSendDlgItemMsg(hwnd,
276 NOTE_LISTBOX,
277 LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0), mp2);
278 free((CHAR *) mp2);
279 }
280 {
281 HWND hwndActive;
282
283 hwndActive = WinQueryActiveWindow(HWND_DESKTOP);
284 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(hwndActive), MPVOID);
285 }
286 hptrIcon = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, NOTE_FRAME);
287 if (hptrIcon)
288 WinDefDlgProc(hwnd, WM_SETICON, MPFROMLONG(hptrIcon), MPFROMLONG(0L));
289 break;
290
291 case UM_FOCUSME:
292 {
293 ULONG size = sizeof(SWP),
294 fl = SWP_ZORDER | SWP_FOCUSDEACTIVATE | SWP_SHOW;
295 SWP swp;
296
297 if (PrfQueryProfileData(fmprof,
298 FM3Str, "NoteWndSwp", (PVOID) & swp, &size)) {
299 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
300 fl |= SWP_MINIMIZE;
301 fl &= (~SWP_SHOW);
302 }
303 else
304 fl |= (SWP_MOVE | SWP_SIZE);
305 }
306 WinSetWindowPos(hwnd, HWND_BOTTOM, swp.x, swp.y, swp.cx, swp.cy, fl);
307 if (fl & SWP_MINIMIZE) {
308 WinSetWindowUShort(hwnd, QWS_XRESTORE, (USHORT) swp.x);
309 WinSetWindowUShort(hwnd, QWS_CXRESTORE, (USHORT) swp.cx);
310 WinSetWindowUShort(hwnd, QWS_YRESTORE, (USHORT) swp.y);
311 WinSetWindowUShort(hwnd, QWS_CYRESTORE, (USHORT) swp.cy);
312 }
313 }
314 if (mp1)
315 WinSetActiveWindow(HWND_DESKTOP, (HWND) mp1);
316 return 0;
317
318 case UM_STRETCH:
319 {
320 SWP swp;
321 LONG titl, szbx, szby;
322
323 WinQueryWindowPos(hwnd, &swp);
324 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
325 szbx = SysVal(SV_CXSIZEBORDER);
326 szby = SysVal(SV_CYSIZEBORDER);
327 titl = SysVal(SV_CYTITLEBAR);
328 WinSetWindowPos(WinWindowFromID(hwnd, NOTE_LISTBOX),
329 HWND_TOP,
330 szbx,
331 szby,
332 swp.cx - (szbx * 2L),
333 (swp.cy - titl) - (szby * 2L), SWP_MOVE | SWP_SIZE);
334 }
335 if (!(swp.fl & SWP_MAXIMIZE)) {
336 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
337 swp.x = WinQueryWindowUShort(hwnd, QWS_XRESTORE);
338 swp.y = WinQueryWindowUShort(hwnd, QWS_YRESTORE);
339 swp.cx = WinQueryWindowUShort(hwnd, QWS_CXRESTORE);
340 swp.cy = WinQueryWindowUShort(hwnd, QWS_CYRESTORE);
341 }
342 PrfWriteProfileData(fmprof,
343 FM3Str, "NoteWndSwp", (PVOID) & swp, sizeof(SWP));
344 }
345 }
346 return 0;
347
348 case WM_ADJUSTWINDOWPOS:
349 PostMsg(hwnd, UM_STRETCH, MPVOID, MPVOID);
350 break;
351
352 case UM_CONTAINER_FILLED:
353 {
354 SHORT x, y;
355
356 x = (SHORT) WinSendDlgItemMsg(hwnd,
357 NOTE_LISTBOX,
358 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
359 if (x > 60) {
360 for (y = 0; y < x - 50; y++)
361 WinSendDlgItemMsg(hwnd,
362 NOTE_LISTBOX,
363 LM_DELETEITEM, MPFROMSHORT(y), MPVOID);
364 }
365 }
366 return 0;
367
368 case UM_NOTIFY:
369 {
370 SHORT x;
371
372 x = (SHORT) WinSendDlgItemMsg(hwnd,
373 NOTE_LISTBOX,
374 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
375 if (x > 0)
376 WinSendDlgItemMsg(hwnd,
377 NOTE_LISTBOX,
378 LM_SETTOPINDEX, MPFROMSHORT(x), MPVOID);
379 }
380 return 0;
381
382 case UM_SHOWME:
383 WinSetWindowPos(hwnd,
384 HWND_TOP,
385 0,
386 0,
387 0, 0, SWP_SHOW | SWP_RESTORE | SWP_ZORDER | SWP_ACTIVATE);
388 return 0;
389
390 case WM_COMMAND:
391 return 0;
392
393 case WM_CLOSE:
394 WinDismissDlg(hwnd, 0);
395 return 0;
396
397 case WM_DESTROY:
398 if (hwndNotify == hwnd) {
399 fThreadNotes = FALSE;
400 PrfWriteProfileData(fmprof,
401 FM3Str, "ThreadNotes", &fThreadNotes, sizeof(BOOL));
402 hwndNotify = (HWND) 0;
403 }
404 if (hptrIcon)
405 WinDestroyPointer(hptrIcon);
406 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
407 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
408 break;
409 }
410 return WinDefDlgProc(hwnd, msg, mp1, mp2);
411}
412
413static VOID NoteThread(VOID * args)
414{
415 HAB hab2;
416 HMQ hmq2;
417
418 hab2 = WinInitialize(0);
419 if (hab2) {
420 hmq2 = WinCreateMsgQueue(hab2, 0);
421 if (hmq2) {
422 if (!hwndNotify)
423 WinDlgBox(HWND_DESKTOP,
424 HWND_DESKTOP,
425 NoteWndProc, FM3ModHandle, NOTE_FRAME, (CHAR *) args);
426 WinDestroyMsgQueue(hmq2);
427 }
428 WinTerminate(hab2);
429 }
430}
431
432VOID StartNotes(CHAR * note)
433{
434 if (!hwndNotify) {
435 if (_beginthread(NoteThread, NULL, 65536, (PVOID) note) == -1)
436 Runtime_Error(pszSrcFile, __LINE__,
437 GetPString(IDS_COULDNTSTARTTHREADTEXT));
438 }
439}
440
441BOOL AddNote(CHAR * note)
442{
443 CHAR *s, *p;
444 BOOL once = FALSE, ret = FALSE;
445
446 if ((fThreadNotes || hwndNotify) && note && *note) {
447 p = note;
448 while (*p == ' ')
449 p++;
450 if (*p) {
451 if (!hwndNotify) {
452 fThreadNotes = FALSE;
453 StartNotes(NULL);
454 if (!hwndNotify)
455 DosSleep(16);//05 Aug 07 GKY 33
456 if (!hwndNotify)
457 DosSleep(16);//05 Aug 07 GKY 33
458 if (!hwndNotify)
459 DosSleep(16);//05 Aug 07 GKY 33
460 }
461 if (hwndNotify) {
462 s = xmalloc(strlen(p) + 14, pszSrcFile, __LINE__);
463 if (s) {
464 sprintf(s, "%08lx %s", _threadid, p);
465 while (!once) {
466 if ((SHORT) WinSendDlgItemMsg(hwndNotify,
467 NOTE_LISTBOX,
468 LM_INSERTITEM,
469 MPFROM2SHORT(LIT_END, 0),
470 MPFROMP(s)) >= 0) {
471 ret = TRUE;
472 PostMsg(hwndNotify, UM_NOTIFY, MPVOID, MPVOID);
473 break;
474 }
475 PostMsg(hwndNotify, UM_CONTAINER_FILLED, MPVOID, MPVOID);
476 once = TRUE;
477 }
478 }
479 free(s);
480 }
481 }
482 }
483 return ret;
484}
485
486VOID EndNote(VOID)
487{
488 if (hwndNotify)
489 if (!PostMsg(hwndNotify, WM_CLOSE, MPVOID, MPVOID))
490 WinSendMsg(hwndNotify, WM_CLOSE, MPVOID, MPVOID);
491}
492
493VOID ShowNote(VOID)
494{
495 if (!hwndNotify)
496 StartNotes(NULL);
497 if (!hwndNotify)
498 DosSleep(16);//05 Aug 07 GKY 33
499 if (!hwndNotify)
500 DosSleep(16);//05 Aug 07 GKY 33
501 if (!hwndNotify)
502 DosSleep(16);//05 Aug 07 GKY 33
503 if (hwndNotify)
504 PostMsg(hwndNotify, UM_SHOWME, MPVOID, MPVOID);
505}
506
507VOID HideNote(VOID)
508{
509 if (hwndNotify)
510 WinSetWindowPos(hwndNotify,
511 HWND_BOTTOM,
512 0,
513 0, 0, 0, SWP_MINIMIZE | SWP_ZORDER | SWP_FOCUSDEACTIVATE);
514}
Note: See TracBrowser for help on using the repository browser.