source: trunk/dll/cmdline.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 21.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: cmdline.c 907 2008-01-06 07:26:17Z stevenhl $
5
6 User defined commands support
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2007 Steven H.Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 05 Jun 05 SHL Use QWL_USER
13 22 Jul 06 SHL Check more run time errors
14 29 Jul 06 SHL Use xfgets_bstripcr
15 22 Mar 07 GKY Use QWL_USER
16 16 Jun 07 SHL Update for OpenWatcom
17 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
18
19***********************************************************************/
20
21#include <stdlib.h>
22#include <string.h>
23#include <share.h>
24#include <io.h> // unlink
25
26#define INCL_DOS
27#define INCL_WIN
28#define INCL_LONGLONG // dircnrs.h
29
30#include "fm3dlg.h"
31#include "fm3str.h"
32#include "mle.h"
33#include "errutil.h" // Dos_Error...
34#include "strutil.h" // GetPString
35#include "fm3dll.h"
36
37static PSZ pszSrcFile = __FILE__;
38
39#define MAXNUMCLS 250
40
41typedef struct LINKCLS
42{
43 CHAR *cl;
44 struct LINKCLS *next;
45}
46LINKCLS;
47
48static LINKCLS *clbig = NULL, *clsmall = NULL;
49static BOOL loadedbig = FALSE, loadedsmall = FALSE;
50
51VOID load_cmdlines(BOOL big)
52{
53 /* load linked list of cmdlines from CMDLINES.DAT file */
54
55 FILE *fp;
56 LINKCLS *info, *last = NULL, *clhead;
57 CHAR s[1024];
58 INT x = 0;
59
60 clhead = (big) ? clbig : clsmall;
61 if (big)
62 loadedbig = TRUE;
63 else
64 loadedsmall = TRUE;
65 save_dir2(s);
66 if (s[strlen(s) - 1] != '\\')
67 strcat(s, "\\");
68 strcat(s, (big) ? "CMDLINES.DAT" : "CMDMINI.DAT");
69 fp = _fsopen(s, "r", SH_DENYWR);
70 if (fp) {
71 while (x < MAXNUMCLS && !feof(fp)) {
72 if (!xfgets_bstripcr(s, sizeof(s), fp, pszSrcFile, __LINE__))
73 break;
74 if (*s && *s != ';') {
75 info = xmalloc(sizeof(LINKCLS), pszSrcFile, __LINE__);
76 if (info) {
77 x++;
78 info->cl = xstrdup(s, pszSrcFile, __LINE__);
79 if (!info->cl)
80 free(info);
81 else {
82 info->next = NULL;
83 if (!clhead)
84 clhead = info;
85 else
86 last->next = info;
87 last = info;
88 }
89 }
90 }
91 }
92 fclose(fp);
93 }
94 if (big)
95 clbig = clhead;
96 else
97 clsmall = clhead;
98}
99
100VOID save_cmdlines(BOOL big)
101{
102 /* save linked list of cmdlines to CMDLINES.DAT file */
103
104 LINKCLS *info, *clhead;
105 FILE *fp;
106 CHAR s[CCHMAXPATH + 14];
107
108 clhead = (big) ? clbig : clsmall;
109 if ((big && !loadedbig) || (!big && !loadedsmall))
110 return;
111 save_dir2(s);
112 if (s[strlen(s) - 1] != '\\')
113 strcat(s, "\\");
114 strcat(s, (big) ? "CMDLINES.DAT" : "CMDMINI.DAT");
115 if (clhead) {
116 fp = xfopen(s, "w", pszSrcFile, __LINE__);
117 if (fp) {
118 fputs(GetPString(IDS_COMMANDFILE2TEXT), fp);
119 info = clhead;
120 while (info) {
121 fprintf(fp, "%0.*s\n", 1000, info->cl);
122 info = info->next;
123 }
124 fclose(fp);
125 }
126 }
127 else
128 unlink(s);
129 if (big)
130 clbig = clhead;
131 else
132 clsmall = clhead;
133}
134
135BOOL add_cmdline(CHAR * cl, BOOL big)
136{
137 LINKCLS *info, *last = NULL, *clhead;
138 INT x = 0;
139
140 if (!cl || !*cl)
141 return FALSE;
142 clhead = (big) ? clbig : clsmall;
143 if ((big && !loadedbig) || (!big && !loadedsmall))
144 load_cmdlines(big);
145 info = clhead;
146 while (info) {
147 if (!stricmp(info->cl, cl))
148 return FALSE;
149 last = info;
150 info = info->next;
151 x++;
152 }
153 info = xmalloc(sizeof(LINKCLS), pszSrcFile, __LINE__);
154 if (info) {
155 info->cl = xstrdup(cl, pszSrcFile, __LINE__);
156 if (!info->cl)
157 free(info);
158 else {
159 info->next = NULL;
160 if (!clhead)
161 clhead = info;
162 else
163 last->next = info;
164 if (x > MAXNUMCLS) {
165 info = clhead;
166 clhead = clhead->next;
167 free(info);
168 }
169 if (big)
170 clbig = clhead;
171 else
172 clsmall = clhead;
173 return TRUE;
174 }
175 }
176 return FALSE;
177}
178
179BOOL remove_cmdline(CHAR * cl, BOOL big)
180{
181 LINKCLS *info, *last = NULL, *clhead;
182
183 if (!cl || !*cl)
184 return FALSE;
185 if ((big && !loadedbig) || (!big && !loadedsmall))
186 load_cmdlines(big);
187 clhead = (big) ? clbig : clsmall;
188 info = clhead;
189 while (info) {
190 if (!stricmp(info->cl, cl)) {
191 if (last)
192 last->next = info->next;
193 else
194 clhead = info->next;
195 free(info->cl);
196 free(info);
197 if (big)
198 clbig = clhead;
199 else
200 clsmall = clhead;
201 return TRUE;
202 }
203 last = info;
204 info = info->next;
205 }
206 return FALSE;
207}
208
209VOID free_cmdlines(BOOL big)
210{
211 LINKCLS *info, *next, *clhead;
212
213 clhead = (big) ? clbig : clsmall;
214 info = clhead;
215 while (info) {
216 next = info->next;
217 free(info->cl);
218 free(info);
219 info = next;
220 }
221 clhead = NULL;
222 if (big)
223 clbig = clhead;
224 else
225 clsmall = clhead;
226 DosPostEventSem(CompactSem);
227}
228
229MRESULT EXPENTRY CmdBtnSubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
230{
231 switch (msg) {
232 case WM_MOUSEMOVE:
233 {
234 ULONG strid = 0;
235
236 switch (WinQueryWindowUShort(hwnd, QWS_ID)) {
237 case EXEC2_CLR:
238 strid = IDS_CMDWIPEALLHELPTEXT;
239 break;
240 case EXEC2_DEL:
241 strid = IDS_CMDDELHILITEHELPTEXT;
242 break;
243 case IDM_HELP:
244 strid = IDS_CMDHELPHELPTEXT;
245 break;
246 case DID_CANCEL:
247 strid = IDS_CMDCLOSEBOXHELPTEXT;
248 break;
249 case EXEC2_OPEN:
250 strid = IDS_CMDOPENHELPTEXT;
251 break;
252 case EXEC2_CLOSE:
253 strid = IDS_CMDCLOSEHELPTEXT;
254 break;
255 case EXEC2_FILTER:
256 strid = IDS_CMDFILTERHELPTEXT;
257 break;
258 case EXEC2_KEEP:
259 strid = IDS_CMDKEEPHELPTEXT;
260 break;
261 case EXEC2_SAVE:
262 strid = IDS_CMDSAVEHELPTEXT;
263 break;
264 }
265 if (strid)
266 BubbleHelp(hwnd, TRUE, FALSE, FALSE, GetPString(strid));
267 }
268 break;
269 }
270 return PFNWPButton(hwnd, msg, mp1, mp2);
271}
272
273MRESULT EXPENTRY CmdListSubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
274{
275 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
276
277 switch (msg) {
278 case WM_MOUSEMOVE:
279 if (hwndBubble)
280 WinDestroyWindow(hwndBubble);
281 break;
282
283 case WM_CHAR:
284 if (SHORT1FROMMP(mp1) & KC_KEYUP) {
285 if ((SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
286 (SHORT2FROMMP(mp2)) == VK_DELETE) {
287 if ((SHORT1FROMMP(mp1) & KC_CTRL) != KC_CTRL)
288 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
289 MPFROM2SHORT(EXEC2_DEL, 0), MPVOID);
290 else
291 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
292 MPFROM2SHORT(EXEC2_CLR, 0), MPVOID);
293 }
294 }
295 break;
296 }
297 return oldproc(hwnd, msg, mp1, mp2);
298}
299
300MRESULT EXPENTRY CmdLineDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
301{
302 EXECARGS *ex;
303
304 switch (msg) {
305 case WM_INITDLG:
306 ex = (EXECARGS *) mp2;
307 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) ex);
308 if (!ex || !ex->commandline) {
309 WinDismissDlg(hwnd, 0);
310 break;
311 }
312 if (*ex->title)
313 WinSetWindowText(hwnd, ex->title);
314 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), FALSE);
315 WinCheckButton(hwnd, EXEC_SAVECMD, fSaveBigCmds);
316 WinSendDlgItemMsg(hwnd, EXEC_CL, EM_SETTEXTLIMIT,
317 MPFROM2SHORT(1000, 0), MPVOID);
318 WinSetDlgItemText(hwnd, EXEC_CL, ex->commandline);
319 WinSetWindowPtr(WinWindowFromID(hwnd, EXEC_LISTBOX),
320 QWL_USER,
321 (PVOID) WinSubclassWindow(WinWindowFromID(hwnd,
322 EXEC_LISTBOX),
323 (PFNWP) CmdListSubProc));
324 if (*ex->commandline == ' ')
325 WinSendDlgItemMsg(hwnd, EXEC_CL, EM_SETSEL, MPFROM2SHORT(0, 0), MPVOID);
326 WinSendDlgItemMsg(hwnd, EXEC_CL, EM_SETINSERTMODE,
327 MPFROMSHORT(TRUE), MPVOID);
328 if (ex->flags & MINIMIZED)
329 WinCheckButton(hwnd, EXEC_MINIMIZED, TRUE);
330 else if (ex->flags & MAXIMIZED)
331 WinCheckButton(hwnd, EXEC_MAXIMIZED, TRUE);
332 else if (ex->flags & FULLSCREEN)
333 WinCheckButton(hwnd, EXEC_FULLSCREEN, TRUE);
334 else if (ex->flags & INVISIBLE)
335 WinCheckButton(hwnd, EXEC_INVISIBLE, TRUE);
336 else
337 WinCheckButton(hwnd, EXEC_DEFAULT, TRUE);
338 if ((ex->flags & SEPARATEKEEP) == SEPARATEKEEP)
339 WinCheckButton(hwnd, EXEC_KEEP, TRUE);
340 else
341 WinCheckButton(hwnd, EXEC_KEEP, FALSE);
342 MLEsetformat(WinWindowFromID(hwnd, EXEC_ENVIRON), MLFIE_NOTRANS);
343 MLEsetlimit(WinWindowFromID(hwnd, EXEC_ENVIRON), 1000);
344 WinSetDlgItemText(hwnd, EXEC_ENVIRON, ex->environment);
345// WinEnableWindow(WinWindowFromID(hwnd,EXEC_ENVIRON),FALSE);
346 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
347 PosOverOkay(hwnd);
348 break;
349
350 case UM_SETUP:
351 {
352 ULONG apptype = 0L;
353 CHAR executable[CCHMAXPATH], commandline[1001], *p;
354
355 ex = INSTDATA(hwnd);
356 if (!ex)
357 return 0;
358 WinSetDlgItemText(hwnd, EXEC_WARNING, NullStr);
359 WinSetDlgItemText(hwnd, EXEC_WARNING2, NullStr);
360 *commandline = 0;
361 WinQueryDlgItemText(hwnd, EXEC_CL, 1000, commandline);
362 if (!*commandline)
363 return 0;
364 if (*ex->path) {
365 strcpy(executable, ex->path);
366 if (executable[strlen(executable) - 1] != '\\')
367 strcat(executable, "\\");
368 }
369 else
370 *executable = 0;
371 strncat(executable, commandline, CCHMAXPATH - strlen(executable));
372 executable[CCHMAXPATH - 1] = 0;
373 p = strchr(executable, ' ');
374 if (p)
375 *p = 0;
376 if (IsFile(executable) == -1) {
377 strncpy(executable, commandline, CCHMAXPATH);
378 executable[CCHMAXPATH - 1] = 0;
379 p = strchr(executable, ' ');
380 if (p)
381 *p = 0;
382 if (IsFile(executable) == -1) {
383 p = searchpath(executable);
384 if (*p)
385 strcpy(executable, p);
386 else {
387 WinSetDlgItemText(hwnd,
388 EXEC_WARNING2,
389 GetPString(IDS_CANTFINDFILETEXT));
390 break;
391 }
392 }
393 }
394 if (DosQueryAppType(executable, &apptype) ||
395 (apptype && !(apptype &
396 (FAPPTYP_NOTWINDOWCOMPAT |
397 FAPPTYP_WINDOWCOMPAT |
398 FAPPTYP_WINDOWAPI |
399 FAPPTYP_BOUND |
400 FAPPTYP_DOS |
401 FAPPTYP_WINDOWSREAL |
402 FAPPTYP_WINDOWSPROT | FAPPTYP_32BIT | 0x1000)))) {
403 p = strchr(executable, '.');
404 if (p) {
405 if (!stricmp(p, ".BAT") || !stricmp(p, ".CMD")) {
406 WinSetDlgItemText(hwnd,
407 EXEC_WARNING2,
408 GetPString(IDS_RUNTHRUCMDEXETEXT));
409 break;
410 }
411 }
412 WinSetDlgItemText(hwnd,
413 EXEC_WARNING2, GetPString(IDS_NOTDIRECTEXETEXT));
414 }
415 else if (apptype) { /* acceptable */
416
417 CHAR s[257];
418
419 *s = 0;
420 WinSetDlgItemText(hwnd,
421 EXEC_WARNING, GetPString(IDS_ACCEPTABLEAPPTEXT));
422 if (apptype & FAPPTYP_DOS)
423 strcat(s, GetPString(IDS_DOSTEXT));
424 if (apptype & FAPPTYP_WINDOWSREAL) {
425 if (*s)
426 strcat(s, " ");
427 strcat(s, GetPString(IDS_WINDOWSREALTEXT));
428 }
429 if (apptype & FAPPTYP_WINDOWSPROT) {
430 if (*s)
431 strcat(s, " ");
432 strcat(s, GetPString(IDS_WINDOWSPROTTEXT));
433 }
434 if (apptype & 0x1000) {
435 if (*s)
436 strcat(s, " ");
437 strcat(s, GetPString(IDS_WINDOWSENHTEXT));
438 }
439 if ((apptype & FAPPTYP_WINDOWAPI) == FAPPTYP_WINDOWAPI) {
440 if (*s)
441 strcat(s, " ");
442 strcat(s, GetPString(IDS_PMTEXT));
443 WinCheckButton(hwnd, EXEC_FULLSCREEN, FALSE);
444 WinEnableWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), FALSE);
445 }
446 if (apptype & FAPPTYP_BOUND) {
447 if (*s)
448 strcat(s, " ");
449 strcat(s, GetPString(IDS_BOUNDTEXT));
450 }
451 if ((apptype & FAPPTYP_WINDOWCOMPAT) &&
452 !(apptype & FAPPTYP_NOTWINDOWCOMPAT)) {
453 if (*s)
454 strcat(s, " ");
455 strcat(s, GetPString(IDS_VIOTEXT));
456 }
457 if ((apptype & FAPPTYP_NOTWINDOWCOMPAT) &&
458 !(apptype & FAPPTYP_WINDOWCOMPAT)) {
459 if (*s)
460 strcat(s, " ");
461 strcat(s, GetPString(IDS_FULLSCREENTEXT));
462 }
463 if (apptype & FAPPTYP_32BIT) {
464 if (*s)
465 strcat(s, " ");
466 strcat(s, GetPString(IDS_32BITTEXT));
467 }
468 WinSetDlgItemText(hwnd, EXEC_WARNING2, s);
469 if ((apptype & (FAPPTYP_DOS | FAPPTYP_WINDOWSREAL |
470 FAPPTYP_WINDOWSPROT | 0x1000)) ||
471 ((apptype & FAPPTYP_WINDOWAPI) == FAPPTYP_WINDOWAPI)) {
472 WinCheckButton(hwnd, EXEC_KEEP, FALSE);
473 WinEnableWindow(WinWindowFromID(hwnd, EXEC_KEEP), FALSE);
474 }
475 if (apptype & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | 0x1000))
476 WinCheckButton(hwnd, EXEC_FULLSCREEN, TRUE);
477 }
478 else
479 WinSetDlgItemText(hwnd,
480 EXEC_WARNING2, GetPString(IDS_UNKNOWNDEFAULTTEXT));
481 }
482 return 0;
483
484 case WM_ADJUSTWINDOWPOS:
485 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
486 break;
487
488 case UM_SETDIR:
489 PaintRecessedWindow(WinWindowFromID(hwnd,
490 EXEC_WARNING2),
491 (HPS) 0, FALSE, FALSE);
492 return 0;
493
494 case UM_RESCAN:
495 WinSendDlgItemMsg(hwnd, EXEC_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
496 if (!loadedbig)
497 load_cmdlines(TRUE);
498 {
499 LINKCLS *info;
500
501 info = clbig;
502 while (info) {
503 WinSendDlgItemMsg(hwnd,
504 EXEC_LISTBOX,
505 LM_INSERTITEM,
506 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->cl));
507 info = info->next;
508 }
509 }
510 return 0;
511
512 case WM_CONTROL:
513 switch (SHORT1FROMMP(mp1)) {
514 case EXEC_SAVECMD:
515 {
516 fSaveBigCmds = (fSaveBigCmds) ? FALSE : TRUE;
517 WinCheckButton(hwnd, EXEC_SAVECMD, fSaveBigCmds);
518 PrfWriteProfileData(fmprof,
519 appname,
520 "SaveBigCmds", &fSaveBigCmds, sizeof(BOOL));
521 }
522 break;
523 case EXEC_CL:
524 switch (SHORT2FROMMP(mp1)) {
525 case EN_KILLFOCUS:
526 ex = INSTDATA(hwnd);
527 if (!ex || !ex->dropped)
528 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
529 break;
530 }
531 break;
532 case EXEC_LISTBOX:
533 switch (SHORT2FROMMP(mp1)) {
534 case LN_KILLFOCUS:
535 ex = INSTDATA(hwnd);
536 if (ex) {
537 if (ex->dropped)
538 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(EXEC_DROP, 0), MPVOID);
539 }
540 break;
541 case LN_ENTER:
542 {
543 SHORT x;
544 CHAR cmdline[1001];
545
546 x = (SHORT) WinSendDlgItemMsg(hwnd,
547 EXEC_LISTBOX,
548 LM_QUERYSELECTION,
549 MPFROMSHORT(LIT_FIRST), MPVOID);
550 if (x >= 0) {
551 *cmdline = 0;
552 WinSendDlgItemMsg(hwnd,
553 EXEC_LISTBOX,
554 LM_QUERYITEMTEXT,
555 MPFROM2SHORT(x,
556 sizeof(cmdline)),
557 MPFROMP(cmdline));
558 bstrip(cmdline);
559 if (*cmdline) {
560 WinSetDlgItemText(hwnd, EXEC_CL, cmdline);
561 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(EXEC_DROP, 0), MPVOID);
562 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
563 }
564 }
565 }
566 break;
567 }
568 break;
569 }
570 return 0;
571
572 case WM_COMMAND:
573 switch (SHORT1FROMMP(mp1)) {
574 case EXEC2_CLR:
575 free_cmdlines(TRUE);
576 save_cmdlines(TRUE);
577 WinSendDlgItemMsg(hwnd, EXEC_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
578 break;
579 case EXEC2_DEL:
580 {
581 SHORT x;
582 CHAR cmdline[1001];
583
584 x = (SHORT) WinSendDlgItemMsg(hwnd,
585 EXEC_LISTBOX,
586 LM_QUERYSELECTION,
587 MPFROMSHORT(LIT_FIRST), MPVOID);
588 if (x >= 0) {
589 *cmdline = 0;
590 WinSendDlgItemMsg(hwnd,
591 EXEC_LISTBOX,
592 LM_QUERYITEMTEXT,
593 MPFROM2SHORT(x, sizeof(cmdline)),
594 MPFROMP(cmdline));
595 bstrip(cmdline);
596 if (*cmdline) {
597 if (remove_cmdline(cmdline, TRUE) && fSaveBigCmds) {
598 save_cmdlines(TRUE);
599 WinSendDlgItemMsg(hwnd,
600 EXEC_LISTBOX,
601 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
602 if (x)
603 x--;
604 WinSendDlgItemMsg(hwnd,
605 EXEC_LISTBOX,
606 LM_SELECTITEM,
607 MPFROMSHORT(x), MPFROMSHORT(TRUE));
608 }
609 }
610 }
611 }
612 break;
613 case EXEC_DROP:
614 ex = INSTDATA(hwnd);
615 if (ex) {
616 if (!ex->dropped) {
617 *ex->tempprompt = 0;
618 WinQueryDlgItemText(hwnd,
619 EXEC_WARNING2,
620 sizeof(ex->tempprompt), ex->tempprompt);
621 WinSetDlgItemText(hwnd,
622 EXEC_WARNING2, GetPString(IDS_CMDSELCMDHELPTEXT));
623 ex->dropped = TRUE;
624 if ((SHORT) WinSendDlgItemMsg(hwnd,
625 EXEC_LISTBOX,
626 LM_QUERYITEMCOUNT,
627 MPVOID, MPVOID) == 0)
628 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
629 WinShowWindow(WinWindowFromID(hwnd, EXEC_CL), FALSE);
630 WinShowWindow(WinWindowFromID(hwnd, EXEC_WARNING), FALSE);
631 WinShowWindow(WinWindowFromID(hwnd, EXEC_DEFAULT), FALSE);
632 WinShowWindow(WinWindowFromID(hwnd, EXEC_MINIMIZED), FALSE);
633 WinShowWindow(WinWindowFromID(hwnd, EXEC_MAXIMIZED), FALSE);
634 WinShowWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), FALSE);
635 WinShowWindow(WinWindowFromID(hwnd, EXEC_INVISIBLE), FALSE);
636 WinShowWindow(WinWindowFromID(hwnd, EXEC_KEEP), FALSE);
637 WinShowWindow(WinWindowFromID(hwnd, EXEC_ENVIRON), FALSE);
638 WinShowWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
639 WinShowWindow(WinWindowFromID(hwnd, IDM_HELP), FALSE);
640 WinShowWindow(WinWindowFromID(hwnd, EXEC_ABORT), FALSE);
641 WinShowWindow(WinWindowFromID(hwnd, DID_CANCEL), FALSE);
642 WinShowWindow(WinWindowFromID(hwnd, EXEC_LISTBOX), TRUE);
643 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, EXEC_LISTBOX));
644 WinSetDlgItemText(hwnd, EXEC_DROP, "^");
645 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), TRUE);
646 }
647 else {
648 ex->dropped = FALSE;
649 WinSetDlgItemText(hwnd, EXEC_WARNING2, ex->tempprompt);
650 WinShowWindow(WinWindowFromID(hwnd, EXEC_LISTBOX), FALSE);
651 WinShowWindow(WinWindowFromID(hwnd, EXEC_CL), TRUE);
652 WinShowWindow(WinWindowFromID(hwnd, EXEC_WARNING), TRUE);
653 WinShowWindow(WinWindowFromID(hwnd, EXEC_DEFAULT), TRUE);
654 WinShowWindow(WinWindowFromID(hwnd, EXEC_MINIMIZED), TRUE);
655 WinShowWindow(WinWindowFromID(hwnd, EXEC_MAXIMIZED), TRUE);
656 WinShowWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), TRUE);
657 WinShowWindow(WinWindowFromID(hwnd, EXEC_INVISIBLE), TRUE);
658 WinShowWindow(WinWindowFromID(hwnd, EXEC_KEEP), TRUE);
659 WinShowWindow(WinWindowFromID(hwnd, EXEC_ENVIRON), TRUE);
660 WinShowWindow(WinWindowFromID(hwnd, DID_OK), TRUE);
661 WinShowWindow(WinWindowFromID(hwnd, IDM_HELP), TRUE);
662 WinShowWindow(WinWindowFromID(hwnd, EXEC_ABORT), TRUE);
663 WinShowWindow(WinWindowFromID(hwnd, DID_CANCEL), TRUE);
664 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, EXEC_CL));
665 WinSetDlgItemText(hwnd, EXEC_DROP, "v");
666 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), FALSE);
667 }
668 }
669 break;
670
671 case DID_OK:
672 ex = INSTDATA(hwnd);
673 WinQueryDlgItemText(hwnd, EXEC_CL, 1000, ex->commandline);
674 ex->flags = 0;
675 if (WinQueryButtonCheckstate(hwnd, EXEC_MINIMIZED))
676 ex->flags |= MINIMIZED;
677 if (WinQueryButtonCheckstate(hwnd, EXEC_MAXIMIZED))
678 ex->flags |= MAXIMIZED;
679 if (WinQueryButtonCheckstate(hwnd, EXEC_FULLSCREEN))
680 ex->flags |= FULLSCREEN;
681 else
682 ex->flags |= WINDOWED;
683 if (WinQueryButtonCheckstate(hwnd, EXEC_INVISIBLE))
684 ex->flags |= INVISIBLE;
685 if (WinQueryButtonCheckstate(hwnd, EXEC_KEEP))
686 ex->flags |= SEPARATEKEEP;
687 else
688 ex->flags |= SEPARATE;
689 strset(ex->environment, 0);
690 WinQueryDlgItemText(hwnd, EXEC_ENVIRON, 1000, ex->environment);
691 if (add_cmdline(ex->commandline, TRUE) && fSaveBigCmds)
692 save_cmdlines(TRUE);
693 WinDismissDlg(hwnd, 1);
694 break;
695
696 case DID_CANCEL:
697 WinDismissDlg(hwnd, 0);
698 break;
699
700 case EXEC_ABORT:
701 WinDismissDlg(hwnd, 2);
702 break;
703
704 case IDM_HELP:
705 if (hwndHelp)
706 WinSendMsg(hwndHelp,
707 HM_DISPLAY_HELP,
708 MPFROM2SHORT(HELP_CMDLINE, 0), MPFROMSHORT(HM_RESOURCEID));
709 break;
710 }
711 return 0;
712
713 case WM_DESTROY:
714 break;
715 }
716 return WinDefDlgProc(hwnd, msg, mp1, mp2);
717}
718
719MRESULT EXPENTRY CmdLine2DlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
720{
721 switch (msg) {
722 case WM_INITDLG:
723 if (!mp2) {
724 WinDismissDlg(hwnd, 0);
725 break;
726 }
727 WinSetWindowPtr(hwnd, QWL_USER, mp2);
728 {
729 int x;
730 USHORT ids[] = { IDM_HELP, EXEC2_CLR, EXEC2_DEL, EXEC2_KEEP, EXEC2_SAVE,
731 EXEC2_OPEN, EXEC2_CLOSE, EXEC2_FILTER, DID_CANCEL, 0
732 };
733
734 WinSetWindowPtr(WinWindowFromID(hwnd, EXEC2_LISTBOX),
735 QWL_USER,
736 (PVOID) WinSubclassWindow(WinWindowFromID(hwnd,
737 EXEC2_LISTBOX),
738 (PFNWP) CmdListSubProc));
739 for (x = 0; ids[x]; x++)
740 WinSetWindowPtr(WinWindowFromID(hwnd, ids[x]),
741 QWL_USER,
742 (PVOID) WinSubclassWindow(WinWindowFromID(hwnd,
743 ids[x]),
744 (PFNWP) CmdBtnSubProc));
745 }
746 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
747 break;
748
749 case UM_RESCAN:
750 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
751 if (!loadedsmall)
752 load_cmdlines(FALSE);
753 {
754 LINKCLS *info;
755
756 info = clsmall;
757 while (info) {
758 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_INSERTITEM,
759 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->cl));
760 info = info->next;
761 }
762 }
763 return 0;
764
765 case WM_CONTROL:
766 switch (SHORT1FROMMP(mp1)) {
767 case EXEC2_LISTBOX:
768 switch (SHORT2FROMMP(mp1)) {
769 case LN_ENTER:
770 {
771 SHORT x;
772 CHAR *cmdline = WinQueryWindowPtr(hwnd, QWL_USER);
773
774 x = (SHORT) WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX,
775 LM_QUERYSELECTION,
776 MPFROMSHORT(LIT_FIRST), MPVOID);
777 if (x >= 0) {
778 *cmdline = 0;
779 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_QUERYITEMTEXT,
780 MPFROM2SHORT(x, 1000), MPFROMP(cmdline));
781 bstrip(cmdline);
782 if (*cmdline)
783 WinDismissDlg(hwnd, 1);
784 }
785 }
786 break;
787 }
788 break;
789 }
790 return 0;
791
792 case WM_COMMAND:
793 switch (SHORT1FROMMP(mp1)) {
794 case EXEC2_KEEP:
795 case EXEC2_SAVE:
796 case EXEC2_FILTER:
797 case EXEC2_CLOSE:
798 case EXEC2_OPEN:
799 case IDM_HELP:
800 {
801 char *cmdline = WinQueryWindowPtr(hwnd, QWL_USER);
802 ULONG strid = 0;
803
804 if (cmdline) {
805 switch (SHORT1FROMMP(mp1)) {
806 case EXEC2_OPEN:
807 strid = IDS_OPENCMDTEXT;
808 break;
809 case EXEC2_CLOSE:
810 strid = IDS_CLOSECMDTEXT;
811 break;
812 case EXEC2_FILTER:
813 strid = IDS_FILTERCMDTEXT;
814 break;
815 case EXEC2_SAVE:
816 strid = (fSaveMiniCmds) ? IDS_NOSAVECMDTEXT : IDS_SAVECMDTEXT;
817 break;
818 case EXEC2_KEEP:
819 strid = (fKeepCmdLine) ? IDS_NOKEEPCMDTEXT : IDS_KEEPCMDTEXT;
820 break;
821 case IDM_HELP:
822 strid = IDS_HELPCMDTEXT;
823 break;
824 }
825 if (strid) {
826 strcpy(cmdline, GetPString(strid));
827 WinDismissDlg(hwnd, 1);
828 }
829 }
830 break;
831 }
832 case EXEC2_CLR:
833 free_cmdlines(FALSE);
834 save_cmdlines(FALSE);
835 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
836 break;
837 case EXEC2_DEL:
838 {
839 SHORT x;
840 CHAR cmdline[1001];
841
842 x = (SHORT) WinSendDlgItemMsg(hwnd,
843 EXEC2_LISTBOX,
844 LM_QUERYSELECTION,
845 MPFROMSHORT(LIT_FIRST), MPVOID);
846 if (x >= 0) {
847 *cmdline = 0;
848 WinSendDlgItemMsg(hwnd,
849 EXEC2_LISTBOX,
850 LM_QUERYITEMTEXT,
851 MPFROM2SHORT(x, sizeof(cmdline)),
852 MPFROMP(cmdline));
853 bstrip(cmdline);
854 if (*cmdline) {
855 if (remove_cmdline(cmdline, FALSE) && fSaveMiniCmds) {
856 save_cmdlines(FALSE);
857 WinSendDlgItemMsg(hwnd,
858 EXEC2_LISTBOX,
859 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
860 if (x)
861 x--;
862 WinSendDlgItemMsg(hwnd,
863 EXEC2_LISTBOX,
864 LM_SELECTITEM,
865 MPFROMSHORT(x), MPFROMSHORT(TRUE));
866 }
867 }
868 }
869 }
870 break;
871 case DID_CANCEL:
872 WinDismissDlg(hwnd, 0);
873 break;
874 }
875 return 0;
876
877 case WM_DESTROY:
878 break;
879 }
880 return WinDefDlgProc(hwnd, msg, mp1, mp2);
881}
882
883#pragma alloc_text(CMDLINE1,CmdLineDlgProc,CmdListSubProc,CmdLine2DlgProc,CmdBtnSubProc)
884#pragma alloc_text(CMDLINE2,save_cmdlines,load_cmdlines,add_cmdline,remove_cmdline,free_cmdlines)
Note: See TracBrowser for help on using the repository browser.