source: trunk/dll/cmdline.c@ 1480

Last change on this file since 1480 was 1480, checked in by Gregg Young, 16 years ago

Fix failure to correctly check for large file support in FindSwapperDat fall back code minor streamling. Add LVM.EXE to partition submenu. Stop using xDosQueryAppType where the file name it is passed is already a local stack variable. Correct a typo in several file header comments.

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