source: trunk/dll/cmdline.c@ 1439

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

Changes to allow high mem loading of dll; Refactor .LONGNAME and .SUBJECT EA fetch to FetchCommonEAs. Add szFSType to FillInRecordFromFSA use to bypass EA scan and size formatting for tree container; Fix labels/FS type to work on scan on NOPRESCAN Drives; Fixed dbl directory names on restore of dir cnrs; (Tickets 47, 339, 363, 368, 369, 370)

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