source: trunk/dll/cmdline.c@ 1204

Last change on this file since 1204 was 1204, checked in by John Small, 17 years ago

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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