source: trunk/dll/cmdline.c@ 1544

Last change on this file since 1544 was 1544, checked in by Gregg Young, 15 years ago

Changes to fopen and _fsopen to allow FM2 to be loaded in high memory

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