source: trunk/dll/cmdline.c@ 1104

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

Replace save_dir2(dir) with strcpy(dir, pFM2SaveDirectory)

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