source: trunk/dll/cmdline.c@ 1398

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

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

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