source: trunk/dll/cmdline.c@ 1846

Last change on this file since 1846 was 1846, checked in by John Small, 10 years ago

Ticket #524: Ensure no "highmem-unsafe" functions are called directly
Calls to unsafe Dos... functions have been changed to call the wrapped xDos... functions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.7 KB
Line 
1
2/***********************************************************************
3
4 $Id: cmdline.c 1846 2015-08-12 20:31:54Z jbs $
5
6 User defined commands support
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2010 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 21 Dec 09 GKY Added CheckExecutibleFlags to streamline code in command.c assoc.c & cmdline.c
29 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
30 23 Oct 10 GKY Changes to populate and utilize a HELPTABLE for context specific help
31 28 Apr 14 JBS Ticket #522: Ensure use of wrapper functions where needed
32 12 Aug 15 JBS Ticket #524: Ensure no "highmem-unsafe" functions are called directly
33 Calls to unsafe Dos... functions have been changed to call the wrapped xDos... functions
34
35***********************************************************************/
36
37#include <stdlib.h>
38#include <string.h>
39#include <share.h>
40#include <io.h> // unlink
41
42#define INCL_DOS
43#define INCL_WIN
44#define INCL_LONGLONG // dircnrs.h
45
46#include "fm3dll.h"
47#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
48#include "arccnrs.h" // Data declaration(s)
49#include "fm2cmd.h" // Data declaration(s)
50#include "notebook.h" // Data declaration(s)
51#include "init.h" // Data declaration(s)
52#include "newview.h" // Data declarations
53#include "fm3dlg.h"
54#include "fm3str.h"
55#include "mle.h"
56#include "errutil.h" // Dos_Error...
57#include "strutil.h" // GetPString
58#include "mainwnd.h" // BubbleHelp
59#include "cmdline.h" // CmdLineDlgProc, CmdLine2DlgProc
60#include "chklist.h" // PosOverOkay
61#include "pathutil.h" // MaxCmdLineStr
62#include "strips.h" // bstrip
63#include "misc.h" // CheckDriveSpaceAvail
64#include "srchpath.h" // searchpath
65#include "wrappers.h" // xfgets_bstripcr
66#include "valid.h" // IsFile
67#include "dirs.h" // save_dir2
68#include "systemf.h"
69#include "fortify.h"
70
71#define MAXNUMCMDLINES 250
72
73typedef struct LINKCMDLINES
74{
75 CHAR *cmdline;
76 struct LINKCMDLINES *next;
77}
78LINKCMDLINES;
79
80static LINKCMDLINES *DoItYourselfCmdLine = NULL, *MiniCmdLine = NULL;
81static BOOL DoItYourselfLoaded = FALSE, MiniLoaded = FALSE;
82
83// Data definitions
84static PSZ pszSrcFile = __FILE__;
85
86#pragma data_seg(GLOBAL1)
87BOOL fSaveBigCmds;
88
89
90VOID load_cmdlines(BOOL DoItYourself)
91{
92 /** load linked list of cmdlines from CMDLINES.DAT file
93 * if DoItYourself = TRUE (main command line dialog)
94 * else load from CMDMINI.DAT (mini command line at
95 * bottom of main window).
96 */
97
98 FILE *fp;
99 LINKCMDLINES *info, *last = NULL, *CmdLineHead;
100 PSZ pszCmdLine;
101 //CHAR s[1024];
102 INT x = 0;
103 CHAR *moder = "r";
104
105 pszCmdLine = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
106 if (pszCmdLine) {
107 CmdLineHead = (DoItYourself) ? DoItYourselfCmdLine : MiniCmdLine;
108 if (DoItYourself)
109 DoItYourselfLoaded = TRUE;
110 else
111 MiniLoaded = TRUE;
112 BldFullPathName(pszCmdLine, pFM2SaveDirectory,
113 (DoItYourself) ? PCSZ_CMDLINESDAT : PCSZ_CMDMINIDAT);
114 fp = xfsopen(pszCmdLine, moder, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
115 if (fp) {
116 while (x < MAXNUMCMDLINES && !feof(fp)) {
117 if (!xfgets_bstripcr(pszCmdLine, MaxComLineStrg, fp, pszSrcFile, __LINE__))
118 break;
119 if (pszCmdLine && *pszCmdLine != ';') {
120 info = xmalloc(sizeof(LINKCMDLINES), pszSrcFile, __LINE__);
121 if (info) {
122 x++;
123 info->cmdline = xstrdup(pszCmdLine, pszSrcFile, __LINE__);
124 if (!info->cmdline)
125 free(info);
126 else {
127 info->next = NULL;
128 if (!CmdLineHead)
129 CmdLineHead = info;
130 else
131 last->next = info;
132 last = info;
133 }
134 }
135 }
136 }
137 fclose(fp);
138 }
139 free(pszCmdLine);
140 }
141 if (DoItYourself)
142 DoItYourselfCmdLine = CmdLineHead;
143 else
144 MiniCmdLine = CmdLineHead;
145}
146
147VOID save_cmdlines(BOOL DoItYourself)
148{
149 /** save linked list of cmdlines from CMDLINES.DAT file
150 * if DoItYourself = TRUE (main command line dialog)
151 * else load from CMDMINI.DAT (mini command line at
152 * bottom of main window).
153 */
154
155 LINKCMDLINES *info, *CmdLineHead;
156 FILE *fp;
157 PSZ pszCmdLine;
158 //CHAR s[CCHMAXPATH + 14];
159 CHAR *modew = "w";
160
161 CmdLineHead = (DoItYourself) ? DoItYourselfCmdLine : MiniCmdLine;
162 if ((DoItYourself && !DoItYourselfLoaded) || (!DoItYourself && !MiniLoaded))
163 return;
164 pszCmdLine = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
165 if (!pszCmdLine)
166 return;
167 BldFullPathName(pszCmdLine, pFM2SaveDirectory,
168 (DoItYourself) ? PCSZ_CMDLINESDAT : PCSZ_CMDMINIDAT);
169 if (CheckDriveSpaceAvail(pszCmdLine, ullDATFileSpaceNeeded, 1) == 2)
170 return; //already gave error msg
171 if (CmdLineHead) {
172 fp = xfopen(pszCmdLine, modew, pszSrcFile, __LINE__, FALSE);
173 if (fp) {
174 fputs(GetPString(IDS_COMMANDFILE2TEXT), fp);
175 info = CmdLineHead;
176 while (info) {
177 fprintf(fp, "%0.*s\n", 1000, info->cmdline);
178 info = info->next;
179 }
180 fclose(fp);
181 }
182 }
183 else
184 unlink(pszCmdLine);
185 if (DoItYourself)
186 DoItYourselfCmdLine = CmdLineHead;
187 else
188 MiniCmdLine = CmdLineHead;
189}
190
191BOOL add_cmdline(CHAR *cmdline, BOOL DoItYourself)
192{
193 LINKCMDLINES *info, *last = NULL, *CmdLineHead;
194 INT x = 0;
195
196 if (!cmdline || !*cmdline)
197 return FALSE;
198 CmdLineHead = (DoItYourself) ? DoItYourselfCmdLine : MiniCmdLine;
199 if ((DoItYourself && !DoItYourselfLoaded) || (!DoItYourself && !MiniLoaded))
200 load_cmdlines(DoItYourself);
201 info = CmdLineHead;
202 while (info) {
203 if (!stricmp(info->cmdline, cmdline))
204 return FALSE;
205 last = info;
206 info = info->next;
207 x++;
208 }
209 info = xmalloc(sizeof(LINKCMDLINES), pszSrcFile, __LINE__);
210 if (info) {
211 info->cmdline = xstrdup(cmdline, pszSrcFile, __LINE__);
212 if (!info->cmdline)
213 xfree(info, pszSrcFile, __LINE__);
214 else {
215 info->next = NULL;
216 if (!CmdLineHead)
217 CmdLineHead = info;
218 else
219 last->next = info;
220 if (x > MAXNUMCMDLINES) {
221 info = CmdLineHead;
222 CmdLineHead = CmdLineHead->next;
223 free(info);
224 }
225 if (DoItYourself)
226 DoItYourselfCmdLine = CmdLineHead;
227 else
228 MiniCmdLine = CmdLineHead;
229 return TRUE;
230 }
231 }
232 return FALSE;
233}
234
235BOOL remove_cmdline(CHAR *cmdline, BOOL DoItYourself)
236{
237 LINKCMDLINES *info, *last = NULL, *CmdLineHead;
238
239 if (!cmdline || !*cmdline)
240 return FALSE;
241 if ((DoItYourself && !DoItYourselfLoaded) || (!DoItYourself && !MiniLoaded))
242 load_cmdlines(DoItYourself);
243 CmdLineHead = (DoItYourself) ? DoItYourselfCmdLine : MiniCmdLine;
244 info = CmdLineHead;
245 while (info) {
246 if (!stricmp(info->cmdline, cmdline)) {
247 if (last)
248 last->next = info->next;
249 else
250 CmdLineHead = info->next;
251 xfree(info->cmdline, pszSrcFile, __LINE__);
252 free(info);
253 if (DoItYourself)
254 DoItYourselfCmdLine = CmdLineHead;
255 else
256 MiniCmdLine = CmdLineHead;
257 return TRUE;
258 }
259 last = info;
260 info = info->next;
261 }
262 return FALSE;
263}
264
265VOID free_cmdlines(BOOL DoItYourself)
266{
267 LINKCMDLINES *info, *next, *CmdLineHead;
268
269 CmdLineHead = (DoItYourself) ? DoItYourselfCmdLine : MiniCmdLine;
270 info = CmdLineHead;
271 while (info) {
272 next = info->next;
273 xfree(info->cmdline, pszSrcFile, __LINE__);
274 free(info);
275 info = next;
276 }
277 CmdLineHead = NULL;
278 if (DoItYourself)
279 DoItYourselfCmdLine = CmdLineHead;
280 else
281 MiniCmdLine = CmdLineHead;
282 DosPostEventSem(CompactSem);
283}
284
285MRESULT EXPENTRY CmdBtnSubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
286{
287 switch (msg) {
288 case WM_MOUSEMOVE:
289 {
290 ULONG strid = 0;
291
292 switch (WinQueryWindowUShort(hwnd, QWS_ID)) {
293 case EXEC2_CLR:
294 strid = IDS_CMDWIPEALLHELPTEXT;
295 break;
296 case EXEC2_DEL:
297 strid = IDS_CMDDELHILITEHELPTEXT;
298 break;
299 case IDM_HELP:
300 strid = IDS_CMDHELPHELPTEXT;
301 break;
302 case DID_CANCEL:
303 strid = IDS_CMDCLOSEBOXHELPTEXT;
304 break;
305 case EXEC2_OPEN:
306 strid = IDS_CMDOPENHELPTEXT;
307 break;
308 case EXEC2_CLOSE:
309 strid = IDS_CMDCLOSEHELPTEXT;
310 break;
311 case EXEC2_FILTER:
312 strid = IDS_CMDFILTERHELPTEXT;
313 break;
314 case EXEC2_KEEP:
315 strid = IDS_CMDKEEPHELPTEXT;
316 break;
317 case EXEC2_SAVE:
318 strid = IDS_CMDSAVEHELPTEXT;
319 break;
320 }
321 if (strid)
322 BubbleHelp(hwnd, TRUE, FALSE, FALSE, GetPString(strid));
323 }
324 break;
325 }
326 return PFNWPButton(hwnd, msg, mp1, mp2);
327}
328
329MRESULT EXPENTRY CmdListSubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
330{
331 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
332
333 switch (msg) {
334 case WM_MOUSEMOVE:
335 if (hwndBubble)
336 WinDestroyWindow(hwndBubble);
337 break;
338
339 case WM_CHAR:
340 if (SHORT1FROMMP(mp1) & KC_KEYUP) {
341 if ((SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
342 (SHORT2FROMMP(mp2)) == VK_DELETE) {
343 if ((SHORT1FROMMP(mp1) & KC_CTRL) != KC_CTRL)
344 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
345 MPFROM2SHORT(EXEC2_DEL, 0), MPVOID);
346 else
347 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
348 MPFROM2SHORT(EXEC2_CLR, 0), MPVOID);
349 }
350 }
351 break;
352 }
353 return oldproc(hwnd, msg, mp1, mp2);
354}
355
356MRESULT EXPENTRY CmdLineDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
357{
358 EXECARGS *ex;
359
360 switch (msg) {
361 case WM_INITDLG:
362 ex = (EXECARGS *) mp2;
363 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) ex);
364 if (!ex || !ex->commandline) {
365 WinDismissDlg(hwnd, 0);
366 break;
367 }
368 if (*ex->title)
369 WinSetWindowText(hwnd, ex->title);
370 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), FALSE);
371 WinCheckButton(hwnd, EXEC_SAVECMD, fSaveBigCmds);
372 WinSendDlgItemMsg(hwnd, EXEC_CL, EM_SETTEXTLIMIT,
373 MPFROM2SHORT(1000, 0), MPVOID);
374 WinSetDlgItemText(hwnd, EXEC_CL, ex->commandline);
375 WinSetWindowPtr(WinWindowFromID(hwnd, EXEC_LISTBOX),
376 QWL_USER,
377 (PVOID) WinSubclassWindow(WinWindowFromID(hwnd,
378 EXEC_LISTBOX),
379 (PFNWP) CmdListSubProc));
380 if (*ex->commandline == ' ')
381 WinSendDlgItemMsg(hwnd, EXEC_CL, EM_SETSEL, MPFROM2SHORT(0, 0), MPVOID);
382 WinSendDlgItemMsg(hwnd, EXEC_CL, EM_SETINSERTMODE,
383 MPFROMSHORT(TRUE), MPVOID);
384 if (ex->flags & MINIMIZED)
385 WinCheckButton(hwnd, EXEC_MINIMIZED, TRUE);
386 else if (ex->flags & MAXIMIZED)
387 WinCheckButton(hwnd, EXEC_MAXIMIZED, TRUE);
388 else if (ex->flags & FULLSCREEN)
389 WinCheckButton(hwnd, EXEC_FULLSCREEN, TRUE);
390 else if (ex->flags & INVISIBLE)
391 WinCheckButton(hwnd, EXEC_INVISIBLE, TRUE);
392 else
393 WinCheckButton(hwnd, EXEC_DEFAULT, TRUE);
394 if ((ex->flags & SEPARATEKEEP) == SEPARATEKEEP)
395 WinCheckButton(hwnd, EXEC_KEEP, TRUE);
396 else
397 WinCheckButton(hwnd, EXEC_KEEP, FALSE);
398 MLEsetformat(WinWindowFromID(hwnd, EXEC_ENVIRON), MLFIE_NOTRANS);
399 MLEsetlimit(WinWindowFromID(hwnd, EXEC_ENVIRON), 1000);
400 WinSetDlgItemText(hwnd, EXEC_ENVIRON, ex->environment);
401// WinEnableWindow(WinWindowFromID(hwnd,EXEC_ENVIRON),FALSE);
402 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
403 PosOverOkay(hwnd);
404 break;
405
406 case UM_SETUP:
407 {
408 ULONG apptype = 0L;
409 CHAR executable[CCHMAXPATH], commandline[1001], *p;
410
411 ex = INSTDATA(hwnd);
412 if (!ex)
413 return 0;
414 WinSetDlgItemText(hwnd, EXEC_WARNING, NullStr);
415 WinSetDlgItemText(hwnd, EXEC_WARNING2, NullStr);
416 *commandline = 0;
417 WinQueryDlgItemText(hwnd, EXEC_CL, 1000, commandline);
418 if (!*commandline)
419 return 0;
420 if (*ex->path) {
421 strcpy(executable, ex->path);
422 AddBackslashToPath(executable);
423 //if (executable[strlen(executable) - 1] != '\\')
424 // strcat(executable, "\\");
425 }
426 else
427 *executable = 0;
428 strncat(executable, commandline, CCHMAXPATH - strlen(executable));
429 executable[CCHMAXPATH - 1] = 0;
430 p = strchr(executable, ' ');
431 if (p)
432 *p = 0;
433 if (IsFile(executable) == -1) {
434 strncpy(executable, commandline, CCHMAXPATH);
435 executable[CCHMAXPATH - 1] = 0;
436 p = strchr(executable, ' ');
437 if (p)
438 *p = 0;
439 if (IsFile(executable) == -1) {
440// p = searchpath(executable);
441// if (*p)
442 if (SearchPathForFile(PCSZ_PATH, executable, executable)) // jbs: OK to have same source and destination?
443// strcpy(executable, p);
444// else {
445 WinSetDlgItemText(hwnd,
446 EXEC_WARNING2,
447 (CHAR *) GetPString(IDS_CANTFINDFILETEXT));
448 break;
449// }
450 }
451 }
452 if (xDosQueryAppType(executable, &apptype) ||
453 (apptype && !(apptype &
454 (FAPPTYP_NOTWINDOWCOMPAT |
455 FAPPTYP_WINDOWCOMPAT |
456 FAPPTYP_WINDOWAPI |
457 FAPPTYP_BOUND |
458 FAPPTYP_DOS |
459 FAPPTYP_WINDOWSREAL |
460 FAPPTYP_WINDOWSPROT | FAPPTYP_32BIT | 0x1000)))) {
461 p = strchr(executable, '.');
462 if (p) {
463 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
464 !stricmp(p, PCSZ_DOTBTM)) {
465 WinSetDlgItemText(hwnd,
466 EXEC_WARNING2,
467 (CHAR *) GetPString(IDS_RUNTHRUCMDEXETEXT));
468 break;
469 }
470 }
471 WinSetDlgItemText(hwnd, EXEC_WARNING2, (CHAR *) GetPString(IDS_NOTDIRECTEXETEXT));
472 }
473 else if (apptype) { // acceptable
474
475 CHAR s[257];
476
477 *s = 0;
478 WinSetDlgItemText(hwnd, EXEC_WARNING, (CHAR *) GetPString(IDS_ACCEPTABLEAPPTEXT));
479 if (apptype & FAPPTYP_DOS)
480 strcat(s, GetPString(IDS_DOSTEXT));
481 if (apptype & FAPPTYP_WINDOWSREAL) {
482 if (*s)
483 strcat(s, " ");
484 strcat(s, GetPString(IDS_WINDOWSREALTEXT));
485 }
486 if (apptype & FAPPTYP_WINDOWSPROT) {
487 if (*s)
488 strcat(s, " ");
489 strcat(s, GetPString(IDS_WINDOWSPROTTEXT));
490 }
491 if (apptype & 0x1000) {
492 if (*s)
493 strcat(s, " ");
494 strcat(s, GetPString(IDS_WINDOWSENHTEXT));
495 }
496 if ((apptype & FAPPTYP_WINDOWAPI) == FAPPTYP_WINDOWAPI) {
497 if (*s)
498 strcat(s, " ");
499 strcat(s, GetPString(IDS_PMTEXT));
500 WinCheckButton(hwnd, EXEC_FULLSCREEN, FALSE);
501 WinEnableWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), FALSE);
502 }
503 if (apptype & FAPPTYP_BOUND) {
504 if (*s)
505 strcat(s, " ");
506 strcat(s, GetPString(IDS_BOUNDTEXT));
507 }
508 if ((apptype & FAPPTYP_WINDOWCOMPAT) &&
509 !(apptype & FAPPTYP_NOTWINDOWCOMPAT)) {
510 if (*s)
511 strcat(s, " ");
512 strcat(s, GetPString(IDS_VIOTEXT));
513 }
514 if ((apptype & FAPPTYP_NOTWINDOWCOMPAT) &&
515 !(apptype & FAPPTYP_WINDOWCOMPAT)) {
516 if (*s)
517 strcat(s, " ");
518 strcat(s, GetPString(IDS_FULLSCREENTEXT));
519 }
520 if (apptype & FAPPTYP_32BIT) {
521 if (*s)
522 strcat(s, " ");
523 strcat(s, GetPString(IDS_32BITTEXT));
524 }
525 WinSetDlgItemText(hwnd, EXEC_WARNING2, s);
526 if ((apptype & (FAPPTYP_DOS | FAPPTYP_WINDOWSREAL |
527 FAPPTYP_WINDOWSPROT | 0x1000)) ||
528 ((apptype & FAPPTYP_WINDOWAPI) == FAPPTYP_WINDOWAPI)) {
529 WinCheckButton(hwnd, EXEC_KEEP, FALSE);
530 WinEnableWindow(WinWindowFromID(hwnd, EXEC_KEEP), FALSE);
531 }
532 if (apptype & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | 0x1000))
533 WinCheckButton(hwnd, EXEC_FULLSCREEN, TRUE);
534 }
535 else
536 WinSetDlgItemText(hwnd, EXEC_WARNING2, (CHAR *) GetPString(IDS_UNKNOWNDEFAULTTEXT));
537 }
538 return 0;
539
540 case WM_ADJUSTWINDOWPOS:
541 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
542 break;
543
544 case UM_SETDIR:
545 PaintRecessedWindow(WinWindowFromID(hwnd,
546 EXEC_WARNING2),
547 (HPS) 0, FALSE, FALSE);
548 return 0;
549
550 case UM_RESCAN:
551 WinSendDlgItemMsg(hwnd, EXEC_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
552 if (!DoItYourselfLoaded)
553 load_cmdlines(TRUE);
554 {
555 LINKCMDLINES *info;
556
557 info = DoItYourselfCmdLine;
558 while (info) {
559 WinSendDlgItemMsg(hwnd,
560 EXEC_LISTBOX,
561 LM_INSERTITEM,
562 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->cmdline));
563 info = info->next;
564 }
565 }
566 return 0;
567
568 case WM_CONTROL:
569 switch (SHORT1FROMMP(mp1)) {
570 case EXEC_SAVECMD:
571 {
572 fSaveBigCmds = (fSaveBigCmds) ? FALSE : TRUE;
573 WinCheckButton(hwnd, EXEC_SAVECMD, fSaveBigCmds);
574 PrfWriteProfileData(fmprof, appname, "SaveBigCmds", &fSaveBigCmds, sizeof(BOOL));
575 }
576 break;
577 case EXEC_CL:
578 switch (SHORT2FROMMP(mp1)) {
579 case EN_KILLFOCUS:
580 ex = INSTDATA(hwnd);
581 if (!ex || !ex->dropped)
582 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
583 break;
584 }
585 break;
586 case EXEC_LISTBOX:
587 switch (SHORT2FROMMP(mp1)) {
588 case LN_KILLFOCUS:
589 ex = INSTDATA(hwnd);
590 if (ex) {
591 if (ex->dropped)
592 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(EXEC_DROP, 0), MPVOID);
593 }
594 break;
595 case LN_ENTER:
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,
610 sizeof(cmdline)),
611 MPFROMP(cmdline));
612 bstrip(cmdline);
613 if (*cmdline) {
614 WinSetDlgItemText(hwnd, EXEC_CL, cmdline);
615 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(EXEC_DROP, 0), MPVOID);
616 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
617 }
618 }
619 }
620 break;
621 }
622 break;
623 }
624 return 0;
625
626 case WM_HELP:
627 if (hwndHelp)
628 WinSendMsg(hwndHelp,
629 HM_DISPLAY_HELP,
630 MPFROM2SHORT(HELP_CMDLINE, 0), MPFROMSHORT(HM_RESOURCEID));
631 break;
632
633 case WM_COMMAND:
634 switch (SHORT1FROMMP(mp1)) {
635 case EXEC2_CLR:
636 free_cmdlines(TRUE);
637 save_cmdlines(TRUE);
638 WinSendDlgItemMsg(hwnd, EXEC_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
639 break;
640 case EXEC2_DEL:
641 {
642 SHORT x;
643 CHAR cmdline[1001];
644
645 x = (SHORT) WinSendDlgItemMsg(hwnd,
646 EXEC_LISTBOX,
647 LM_QUERYSELECTION,
648 MPFROMSHORT(LIT_FIRST), MPVOID);
649 if (x >= 0) {
650 *cmdline = 0;
651 WinSendDlgItemMsg(hwnd,
652 EXEC_LISTBOX,
653 LM_QUERYITEMTEXT,
654 MPFROM2SHORT(x, sizeof(cmdline)),
655 MPFROMP(cmdline));
656 bstrip(cmdline);
657 if (*cmdline) {
658 if (remove_cmdline(cmdline, TRUE) && fSaveBigCmds) {
659 save_cmdlines(TRUE);
660 WinSendDlgItemMsg(hwnd,
661 EXEC_LISTBOX,
662 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
663 if (x)
664 x--;
665 WinSendDlgItemMsg(hwnd,
666 EXEC_LISTBOX,
667 LM_SELECTITEM,
668 MPFROMSHORT(x), MPFROMSHORT(TRUE));
669 }
670 }
671 }
672 }
673 break;
674 case EXEC_DROP:
675 ex = INSTDATA(hwnd);
676 if (ex) {
677 if (!ex->dropped) {
678 *ex->tempprompt = 0;
679 WinQueryDlgItemText(hwnd,
680 EXEC_WARNING2,
681 sizeof(ex->tempprompt), ex->tempprompt);
682 WinSetDlgItemText(hwnd, EXEC_WARNING2, (CHAR *) GetPString(IDS_CMDSELCMDHELPTEXT));
683 ex->dropped = TRUE;
684 if ((SHORT) WinSendDlgItemMsg(hwnd,
685 EXEC_LISTBOX,
686 LM_QUERYITEMCOUNT,
687 MPVOID, MPVOID) == 0)
688 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
689 WinShowWindow(WinWindowFromID(hwnd, EXEC_CL), FALSE);
690 WinShowWindow(WinWindowFromID(hwnd, EXEC_WARNING), FALSE);
691 WinShowWindow(WinWindowFromID(hwnd, EXEC_DEFAULT), FALSE);
692 WinShowWindow(WinWindowFromID(hwnd, EXEC_MINIMIZED), FALSE);
693 WinShowWindow(WinWindowFromID(hwnd, EXEC_MAXIMIZED), FALSE);
694 WinShowWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), FALSE);
695 WinShowWindow(WinWindowFromID(hwnd, EXEC_INVISIBLE), FALSE);
696 WinShowWindow(WinWindowFromID(hwnd, EXEC_KEEP), FALSE);
697 WinShowWindow(WinWindowFromID(hwnd, EXEC_ENVIRON), FALSE);
698 WinShowWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
699 WinShowWindow(WinWindowFromID(hwnd, IDM_HELP), FALSE);
700 WinShowWindow(WinWindowFromID(hwnd, EXEC_ABORT), FALSE);
701 WinShowWindow(WinWindowFromID(hwnd, DID_CANCEL), FALSE);
702 WinShowWindow(WinWindowFromID(hwnd, EXEC_LISTBOX), TRUE);
703 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, EXEC_LISTBOX));
704 WinSetDlgItemText(hwnd, EXEC_DROP, "^");
705 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), TRUE);
706 }
707 else {
708 ex->dropped = FALSE;
709 WinSetDlgItemText(hwnd, EXEC_WARNING2, ex->tempprompt);
710 WinShowWindow(WinWindowFromID(hwnd, EXEC_LISTBOX), FALSE);
711 WinShowWindow(WinWindowFromID(hwnd, EXEC_CL), TRUE);
712 WinShowWindow(WinWindowFromID(hwnd, EXEC_WARNING), TRUE);
713 WinShowWindow(WinWindowFromID(hwnd, EXEC_DEFAULT), TRUE);
714 WinShowWindow(WinWindowFromID(hwnd, EXEC_MINIMIZED), TRUE);
715 WinShowWindow(WinWindowFromID(hwnd, EXEC_MAXIMIZED), TRUE);
716 WinShowWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), TRUE);
717 WinShowWindow(WinWindowFromID(hwnd, EXEC_INVISIBLE), TRUE);
718 WinShowWindow(WinWindowFromID(hwnd, EXEC_KEEP), TRUE);
719 WinShowWindow(WinWindowFromID(hwnd, EXEC_ENVIRON), TRUE);
720 WinShowWindow(WinWindowFromID(hwnd, DID_OK), TRUE);
721 WinShowWindow(WinWindowFromID(hwnd, IDM_HELP), TRUE);
722 WinShowWindow(WinWindowFromID(hwnd, EXEC_ABORT), TRUE);
723 WinShowWindow(WinWindowFromID(hwnd, DID_CANCEL), TRUE);
724 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, EXEC_CL));
725 WinSetDlgItemText(hwnd, EXEC_DROP, "v");
726 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), FALSE);
727 }
728 }
729 break;
730
731 case DID_OK:
732 ex = INSTDATA(hwnd);
733 WinQueryDlgItemText(hwnd, EXEC_CL, 1000, ex->commandline);
734 ex->flags = CheckExecutibleFlags(hwnd, 2);
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.