source: trunk/dll/cmdline.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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