source: trunk/dll/cmdline.c@ 1119

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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