source: trunk/dll/cmdline.c@ 1221

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

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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