source: trunk/dll/common.c@ 793

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

Move #pragma alloc_text to end for OpenWatcom compat

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