source: branches/ticket_150/dll/common.c@ 869

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

Reversion of some large file funtions where file sizes is not used

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: common.c 844 2007-09-23 23:06:44Z gyoung $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2001, 2007 Steven H. Levine
10
11 13 Aug 05 SHL Renames
12 22 Jul 06 SHL Check more run time errors
13 15 Aug 06 SHL Use Dos_Error
14 03 Nov 06 SHL Rework thread usage count logic
15 07 Jan 07 GKY Move error strings etc. to string file
16 07 Jan 07 GKY Updated Helv font to vector font Helvetica
17 22 Mar 07 GKY Use QWL_USER
18 30 Mar 07 GKY Remove GetPString for window class names
19 02 Aug 07 SHL Sync with CNRITEM mods
20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
21 26 Aug 07 SHL Change to DosSleep(0)
22
23***********************************************************************/
24
25#define INCL_DOS
26#define INCL_DOSERRORS
27#define INCL_WIN
28#define INCL_GPI
29#define INCL_LONGLONG
30#include <os2.h>
31
32#include <stdarg.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <ctype.h>
37#include <time.h>
38#include <direct.h>
39#include <share.h>
40#include <limits.h>
41
42#include "fm3dll.h"
43#include "fm3dlg.h"
44#include "fm3str.h"
45#include "mle.h"
46
47#pragma data_seg(DATA1)
48
49static PSZ pszSrcFile = __FILE__;
50
51MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
52 HWND hwnd,
53 ULONG msg, MPARAM mp1, MPARAM mp2)
54{
55 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
56
57 switch (msg) {
58 case UM_TIMER:
59 case UM_ACTION:
60 case UM_SHOWME:
61 case UM_OPENWINDOWFORME:
62 case UM_MINIMIZE:
63 case UM_MAXIMIZE:
64 case UM_CONTAINERDIR:
65 case UM_FILTER:
66 case UM_INITMENU:
67 case UM_COMMAND:
68 case UM_UPDATERECORD:
69 case UM_UPDATERECORDLIST:
70 case WM_COMMAND:
71 case MM_PORTHOLEINIT:
72 case WM_INITMENU:
73 case UM_CONTAINER_FILLED:
74 case UM_FILESMENU:
75 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
76
77 case UM_CONTEXTMENU:
78 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
79 return 0;
80
81 case UM_CONTAINERHWND:
82 return MRFROMLONG(WinWindowFromID(hwnd, id));
83
84 case DM_DROP:
85 case DM_DRAGOVER:
86 case DM_DRAGLEAVE:
87 case DM_DROPHELP:
88 {
89 CNRDRAGINFO cnd;
90 USHORT dcmd;
91
92 switch (msg) {
93 case DM_DROP:
94 dcmd = CN_DROP;
95 break;
96 case DM_DRAGOVER:
97 dcmd = CN_DRAGOVER;
98 break;
99 case DM_DRAGLEAVE:
100 dcmd = CN_DRAGLEAVE;
101 break;
102 case DM_DROPHELP:
103 dcmd = CN_DROPHELP;
104 break;
105 }
106 cnd.pDragInfo = (PDRAGINFO) mp1;
107 cnd.pRecord = NULL;
108 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
109 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
110 }
111
112 case UM_RESCAN:
113 if (fAutoTile &&
114 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
115 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
116 return 0;
117
118 case WM_MINMAXFRAME:
119 {
120 PSWP pswp = (PSWP) mp1;
121 MRESULT rc;
122
123 rc = oldproc(hwnd, msg, mp1, mp2);
124 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
125 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
126 return rc;
127 }
128
129 case WM_DESTROY:
130 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
131 break;
132 }
133 return oldproc(hwnd, msg, mp1, mp2);
134}
135
136MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
137{
138 switch (msg) {
139 case WM_CREATE:
140 {
141 MRESULT rc;
142
143 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
144 switch (WinQueryWindowUShort(hwnd, QWS_ID))
145 case DIR_SORT:
146 case DIR_VIEW:
147 case DIR_FILTER:
148
149 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVTEXT));
150 return rc;
151 }
152 }
153 return PFNWPStatic(hwnd, msg, mp1, mp2);
154}
155
156void CommonTextPaint(HWND hwnd, HPS hps)
157{
158 int x;
159 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
160 DIR_FILTER, DIR_SORT, DIR_MAX, 0
161 };
162 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
163
164 for (x = 0; ids[x]; x++) {
165 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
166 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
167 bools[x], FALSE);
168 }
169}
170
171void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
172{
173 int x;
174 CHAR s[33];
175 ULONG attrs;
176 HWND hwndTmp;
177
178 if (!hwnd || !class || !ids) {
179 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
180 return;
181 }
182
183 for (x = 0; ids[x]; x++) {
184 *s = 0;
185 switch (ids[x]) {
186 case DIR_SORT:
187 case DIR_FILTER:
188 case DIR_VIEW:
189 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
190 break;
191 case DIR_FOLDERICON:
192 case DIR_MAX:
193 attrs = SS_BITMAP;
194 sprintf(s, "#%d", ids[x]);
195 break;
196 default:
197 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
198 break;
199 }
200 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
201 HWND_TOP, ids[x], NULL, NULL);
202 if (!hwndTmp)
203 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
204 } // for
205}
206
207void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
208{
209 char dv[CCHMAXPATH];
210
211 if (!drive || !*drive)
212 return;
213 strcpy(dv, drive);
214 MakeValidDir(dv);
215
216 switch (cmd) {
217 case IDM_MKDIR:
218 PMMkDir(hwnd, dv, FALSE);
219 break;
220 case IDM_INFO:
221 WinDlgBox(HWND_DESKTOP,
222 HWND_DESKTOP,
223 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
224 break;
225 case IDM_DRVFLAGS:
226 strcpy(dv, drive); // Must use original drive letter
227 if (WinDlgBox(HWND_DESKTOP,
228 hwnd,
229 SetDrvProc,
230 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
231 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
232 break;
233 case IDM_SIZES:
234 WinDlgBox(HWND_DESKTOP,
235 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
236 break;
237 case IDM_SHOWALLFILES:
238 StartSeeAll(HWND_DESKTOP, FALSE, dv);
239 break;
240 case IDM_UNDELETE:
241 WinDlgBox(HWND_DESKTOP,
242 hwnd, UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
243 break;
244 case IDM_CHKDSK:
245 runemf2(SEPARATE | WINDOWED,
246 hwnd, NULL, NULL, "PMCHKDSK.EXE %c:", toupper(*dv));
247 break;
248 case IDM_OPTIMIZE:
249 {
250 CHAR FileSystem[CCHMAXPATH];
251 ULONG type;
252
253 CheckDrive(*dv, FileSystem, &type);
254 if (*FileSystem) {
255 strcat(FileSystem, "OPT.CMD");
256 runemf2(SEPARATE | WINDOWED,
257 hwnd,
258 NULL,
259 NULL,
260 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
261 }
262 }
263 break;
264 case IDM_FORMAT:
265 runemf2(SEPARATE | WINDOWED,
266 hwnd, NULL, NULL, "PMFORMAT.EXE %c:", toupper(*dv));
267 break;
268
269#if 0 // fixme to be gone?
270
271 case IDM_CLOSETRAY:
272 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
273
274 BYTE parm[4] = { "CD01" };
275 ULONGLONG dlen;
276 ULONG plen;
277 HFILE hfile;
278 APIRET rc;
279
280 dv[2] = 0;
281 rc = DosOpen(dv,
282 &hfile,
283 &dlen,
284 0,
285 0,
286 OPEN_ACTION_OPEN_IF_EXISTS |
287 OPEN_ACTION_CREATE_IF_NEW,
288 OPEN_FLAGS_DASD |
289 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
290 if (rc)
291 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
292 else {
293 dlen = 0;
294 plen = sizeof(parm);
295 rc = DosDevIOCtl(hfile,
296 0x80,
297 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
298 DosClose(hfile);
299 if (rc)
300 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
301 }
302 }
303 break;
304#endif // fixme to be gone?
305
306 case IDM_LOCK:
307 case IDM_UNLOCK:
308 case IDM_EJECT:
309 {
310 BYTE parm[2];
311 ULONG plen = sizeof(parm), dlen = 0L;
312
313 switch (SHORT1FROMMP(cmd)) {
314 case IDM_LOCK:
315 parm[0] = 1;
316 break;
317 case IDM_UNLOCK:
318 parm[0] = 0;
319 break;
320 case IDM_EJECT:
321 parm[0] = 2;
322 break;
323 }
324 parm[1] = (BYTE) (*dv - 'A');
325 DosError(FERR_DISABLEHARDERR);
326 DosDevIOCtl(-1L,
327 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
328 }
329 break;
330 }
331}
332
333void CommonCreateMainChildren(HWND hwnd, SWP * swp)
334{
335 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
336 HWND hwndTmp;
337 PFNWP oldproc;
338
339 // Create a children of frame window
340 hwndStatus = WinCreateWindow(hwndFrame,
341 WC_STATUS,
342 "Status",
343 WS_VISIBLE | SS_TEXT | DT_LEFT |
344 DT_VCENTER,
345 swp->x + 4 +
346 WinQuerySysValue(HWND_DESKTOP,
347 SV_CXSIZEBORDER),
348 swp->y + 4 +
349 WinQuerySysValue(HWND_DESKTOP,
350 SV_CYSIZEBORDER),
351 ((swp->cx / 2) - 8) -
352 (WinQuerySysValue(HWND_DESKTOP,
353 SV_CXSIZEBORDER) * 2),
354 20,
355 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
356 if (!hwndStatus)
357 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
358
359 hwndStatus2 = WinCreateWindow(hwndFrame,
360 WC_STATUS,
361 "Status2",
362 WS_VISIBLE | SS_TEXT | DT_LEFT |
363 DT_VCENTER,
364 ((swp->cx / 2) + 4) +
365 WinQuerySysValue(HWND_DESKTOP,
366 SV_CXSIZEBORDER),
367 ((swp->cy / 2) + 4) +
368 WinQuerySysValue(HWND_DESKTOP,
369 SV_CYSIZEBORDER),
370 ((swp->cx / 2) - 8) -
371 (WinQuerySysValue(HWND_DESKTOP,
372 SV_CXSIZEBORDER) * 2),
373 20,
374 hwndFrame,
375 HWND_TOP, MAIN_STATUS2, NULL, NULL);
376 if (!hwndStatus2)
377 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
378
379 hwndAttr = WinCreateWindow(hwndFrame,
380 WC_STATUS,
381 "Attr",
382 WS_VISIBLE | SS_TEXT | DT_CENTER |
383 DT_VCENTER,
384 swp->x + 4 +
385 WinQuerySysValue(HWND_DESKTOP,
386 SV_CXSIZEBORDER),
387 swp->y + 4 + 24 +
388 WinQuerySysValue(HWND_DESKTOP,
389 SV_CYSIZEBORDER),
390 ((swp->cx / 4) - 8) -
391 (WinQuerySysValue(HWND_DESKTOP,
392 SV_CXSIZEBORDER) * 2),
393 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
394 if (!hwndAttr)
395 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
396
397 hwndDate = WinCreateWindow(hwndFrame,
398 WC_STATUS,
399 "Date",
400 WS_VISIBLE | SS_TEXT | DT_CENTER |
401 DT_VCENTER,
402 ((swp->x / 4) * 2) + 4 +
403 WinQuerySysValue(HWND_DESKTOP,
404 SV_CXSIZEBORDER),
405 swp->y + 4 + 24 +
406 WinQuerySysValue(HWND_DESKTOP,
407 SV_CYSIZEBORDER),
408 ((swp->cx / 4) - 8) -
409 (WinQuerySysValue(HWND_DESKTOP,
410 SV_CXSIZEBORDER) * 2),
411 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
412 if (!hwndDate)
413 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
414
415 hwndName = WinCreateWindow(hwndFrame,
416 WC_STATUS,
417 "Name",
418 WS_VISIBLE | SS_TEXT | DT_LEFT |
419 DT_VCENTER,
420 ((swp->x / 4) * 3) + 4 +
421 WinQuerySysValue(HWND_DESKTOP,
422 SV_CXSIZEBORDER),
423 swp->y + 4 +
424 WinQuerySysValue(HWND_DESKTOP,
425 SV_CYSIZEBORDER),
426 ((swp->cx / 4) - 8) -
427 (WinQuerySysValue(HWND_DESKTOP,
428 SV_CXSIZEBORDER) * 2),
429 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
430 if (!hwndName)
431 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
432
433 hwndTmp = WinCreateWindow(hwndFrame,
434 WC_TOOLBACK,
435 NullStr,
436 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
437 swp->x +
438 WinQuerySysValue(HWND_DESKTOP,
439 SV_CXSIZEBORDER),
440 (swp->cy -
441 WinQuerySysValue(HWND_DESKTOP,
442 SV_CYSIZEBORDER)) - 30,
443 swp->cx -
444 (WinQuerySysValue(HWND_DESKTOP,
445 SV_CXSIZEBORDER) * 2),
446 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
447 if (!hwndTmp)
448 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
449
450 hwndBack = WinCreateWindow(hwndFrame,
451 WC_DRIVEBACK,
452 NullStr,
453 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
454 swp->x +
455 WinQuerySysValue(HWND_DESKTOP,
456 SV_CXSIZEBORDER),
457 (swp->cy -
458 WinQuerySysValue(HWND_DESKTOP,
459 SV_CYSIZEBORDER)) - 30,
460 swp->cx -
461 (WinQuerySysValue(HWND_DESKTOP,
462 SV_CXSIZEBORDER) * 2),
463 30,
464 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
465
466 if (!hwndBack)
467 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
468
469 hwndLED = WinCreateWindow(hwndFrame,
470 WC_LED,
471 "#920",
472 WS_VISIBLE | SS_BITMAP,
473 swp->cx - 58,
474 swp->y,
475 12,
476 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
477 if (!hwndLED)
478 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
479
480 hwndLEDHdr = WinCreateWindow(hwndFrame,
481 WC_LED,
482 "0",
483 WS_VISIBLE | SS_TEXT | DT_VCENTER |
484 DT_CENTER,
485 swp->cx - 58,
486 swp->y + 12,
487 12,
488 12,
489 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
490 if (!hwndLEDHdr)
491 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
492
493 hwndAutoview = WinCreateWindow(hwndFrame,
494 WC_AUTOVIEW,
495 NullStr,
496 WS_VISIBLE | SS_TEXT | DT_LEFT |
497 DT_TOP | DT_WORDBREAK,
498 swp->x + 4 +
499 WinQuerySysValue(HWND_DESKTOP,
500 SV_CXSIZEBORDER),
501 swp->y + 4 +
502 WinQuerySysValue(HWND_DESKTOP,
503 SV_CYSIZEBORDER) + 16,
504 (swp->cx - 8) -
505 (WinQuerySysValue(HWND_DESKTOP,
506 SV_CXSIZEBORDER) * 2),
507 48,
508 hwndFrame,
509 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
510 if (!hwndAutoview)
511 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
512
513 hwndAutoMLE = WinCreateWindow(hwndFrame,
514 // GetPString(IDS_WCAUTOVIEW),
515 WC_MLE,
516 NullStr,
517 WS_VISIBLE | MLS_HSCROLL |
518 MLS_VSCROLL | MLS_BORDER,
519 swp->x + 4 +
520 WinQuerySysValue(HWND_DESKTOP,
521 SV_CXSIZEBORDER),
522 swp->y + 4 +
523 WinQuerySysValue(HWND_DESKTOP,
524 SV_CYSIZEBORDER) + 16,
525 (swp->cx - 8) -
526 (WinQuerySysValue(HWND_DESKTOP,
527 SV_CXSIZEBORDER) * 2),
528 48,
529 hwndFrame,
530 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
531 if (!hwndAutoMLE)
532 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
533
534 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
535 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
536 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
537}
538
539MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
540 MPARAM mp2)
541{
542 switch (msg) {
543 case UM_THREADUSE:
544 if (hbmLEDon && hbmLEDoff) {
545 static LONG threaduse;
546 CHAR ts[33];
547
548 if (mp1) {
549 threaduse++;
550 if (threaduse == 1)
551 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
552 }
553 else {
554 threaduse--;
555 if (threaduse <= 0) {
556 threaduse = 0;
557 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
558 }
559 }
560 ltoa(threaduse, ts, 10);
561 WinSetWindowText(hwndLEDHdr, ts);
562 DosSleep(0);
563 }
564 return 0;
565
566 case UM_LOADFILE:
567 {
568 CHAR *s = NULL;
569 static CHAR lastfile[CCHMAXPATH] = "";
570
571 if (!fAutoView) {
572 if (*lastfile)
573 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
574 UM_LOADFILE, MPVOID, MPVOID);
575 *lastfile = 0;
576 }
577 else {
578 if (mp1) {
579 if (!mp2 && !stricmp(lastfile, (CHAR *) mp1))
580 return 0;
581 strcpy(lastfile, (CHAR *) mp1);
582 s = xstrdup(lastfile, pszSrcFile, __LINE__);
583 }
584 else
585 *lastfile = 0;
586 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
587 UM_LOADFILE, MPFROMP(s), MPVOID)) {
588 if (s)
589 free(s);
590 }
591 }
592 }
593 return 0;
594
595 case UM_BUILDDRIVEBAR:
596 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
597 MAIN_DRIVES));
598 return 0;
599 }
600 return WinDefWindowProc(hwnd, msg, mp1, mp2);
601}
602
603MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
604 MPARAM mp2)
605{
606 static HWND hwndLast = (HWND) 0;
607 static ULONG lastclick = 0;
608
609 switch (msg) {
610 case WM_MOUSEMOVE:
611 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
612 if (!fNoFinger) {
613 WinSetPointer(HWND_DESKTOP, hptrFinger);
614 return MRFROMLONG(TRUE);
615 }
616 break;
617
618 case WM_BUTTON1DOWN:
619 case WM_BUTTON3DOWN:
620 if (hwndBubble)
621 WinDestroyWindow(hwndBubble);
622 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
623 WinSetCapture(HWND_DESKTOP, hwnd);
624 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
625 break;
626
627 case WM_BUTTON2UP:
628 case WM_BUTTON2DOWN:
629 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
630 if (msg == WM_BUTTON2UP && hwndLast) {
631 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
632 hwndLast = (HWND) 0;
633 }
634 break;
635
636 case WM_BUTTON1UP:
637 case WM_BUTTON3UP:
638 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
639 WinSetCapture(HWND_DESKTOP, (HWND) 0);
640 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
641 {
642 ULONG check;
643
644 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
645 if (check > lastclick + 500) {
646
647 RECTL rcl;
648 POINTS pts;
649
650 pts.x = SHORT1FROMMP(mp1);
651 pts.y = SHORT2FROMMP(mp1);
652 WinQueryWindowRect(hwnd, &rcl);
653 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
654 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
655 }
656 lastclick = check;
657 }
658 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
659 hwndLast = (HWND) 0;
660 break;
661
662 case WM_SETFOCUS:
663 if (mp2)
664 hwndLast = (HWND) mp1;
665 break;
666
667 case UM_FOCUSME:
668 if (mp1) {
669
670 PID pid;
671 TID tid;
672
673 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
674 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
675 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
676 return 0;
677 }
678 }
679 {
680 HWND htemp = (HWND) 0;
681
682 if (hwndMain)
683 htemp = TopWindow(hwndMain, (HWND) 0);
684 if (!htemp)
685 htemp = hwndTree;
686 if (htemp)
687 WinSetFocus(HWND_DESKTOP, htemp);
688 else
689 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
690 }
691 return 0;
692 }
693
694 return PFNWPStatic(hwnd, msg, mp1, mp2);
695}
696
697MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
698{
699 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
700
701 switch (msg) {
702 case UM_FIXCNRMLE:
703 if (dcd) {
704
705 SWP swp, swpC;
706
707 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
708 if (WinQueryWindowPos(hwnd, &swpC)) {
709 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
710 swpC.cx -= swp.x;
711 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
712 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
713 }
714 }
715 if (mp1)
716 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
717 MLM_SETTEXTLIMIT, mp1, MPVOID);
718 }
719 return 0;
720
721 case UM_FIXEDITNAME:
722 if (dcd) {
723 if (mp1 && (INT) mp1 != -1) {
724
725 CHAR *p;
726
727 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
728 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
729 0, strlen((CHAR *) mp1) + 1);
730 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *) mp1);
731 p = strrchr((CHAR *) mp1, '\\');
732 if (p) {
733 p++;
734 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *) mp1));
735 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *) mp1));
736 }
737 else
738 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *) mp1));
739 }
740 else if (mp2) {
741 if ((INT) mp1 == -1) {
742 PCNRITEM pci = (PCNRITEM) mp2;
743 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
744 }
745 else {
746 Broadcast(WinQueryAnchorBlock(hwnd),
747 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
748 free(mp2);
749 }
750 }
751 }
752 return 0;
753 }
754 return PFNWPCnr(hwnd, msg, mp1, mp2);
755}
756
757HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
758 BOOL noautotile, char *directory)
759{
760 SWP swp;
761 HWND hwndDir;
762
763 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
764 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
765 else if (*(ULONG *) realappname == FM3UL) {
766 if (!fAutoTile)
767 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
768 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
769 if (hwndDir) {
770 if (!fAutoTile)
771 WinSetWindowPos(hwndDir,
772 HWND_TOP,
773 swp.x,
774 swp.y,
775 swp.cx,
776 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
777 else if (!noautotile)
778 TileChildren(hwndParent, TRUE);
779 WinSetWindowPos(hwndDir,
780 HWND_TOP,
781 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
782 }
783 }
784 else {
785
786 char s[256];
787
788 assign_ignores(s);
789 runemf2(WINDOWED | SEPARATE,
790 hwnd,
791 NULL,
792 NULL,
793 "VDIR.EXE %s%s\"%s%s\"",
794 (*s) ? s : NullStr, (*s) ? " " : NullStr,
795 directory,
796 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
797 }
798 return hwndDir;
799}
800
801//= IncrThreadUsage() Increment thread usage counter ==
802
803VOID IncrThreadUsage(VOID)
804{
805 if (hwndMain)
806 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
807}
808
809//= DecrThreadUsage() Decrement thread usage counter ==
810
811VOID DecrThreadUsage(VOID)
812{
813 if (hwndMain)
814 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
815}
816
817#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
818#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
819#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
820#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
821#pragma alloc_text(COMMON4,CommonCnrProc)
822#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.