source: trunk/dll/cmdline.c@ 1177

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

Ticket 187: Draft 2: Move remaining function declarations

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