source: trunk/dll/cmdline.c@ 1878

Last change on this file since 1878 was 1878, checked in by Gregg Young, 10 years ago

Remove some dead code and comments source files starting with A-D

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