source: trunk/dll/cmdline.c@ 1039

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

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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