source: trunk/dll/cmdline.c@ 1438

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

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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