source: trunk/dll/cmdline.c@ 1118

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

Clean up of fix for trap caused by FM/2 being on a full disk. It now preserves the data files. (Ticket 152, 271)

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