source: trunk/dll/cmdline.c@ 1482

Last change on this file since 1482 was 1482, checked in by Gregg Young, 16 years ago

Fixed separate parameters; added the ability to set it either globally or for just one app; some files only contain white space changes.

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