source: trunk/dll/notify.c@ 593

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

Changes to remove GetPString from window class names

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