source: trunk/dll/common.c@ 1041

Last change on this file since 1041 was 1041, checked in by Gregg Young, 17 years ago

Adds optional support for delete being move to X/Eworkplace trashcan (ticket 43)

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