source: trunk/dll/cmdline.c@ 1488

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

Fixed commands so reordering them in commands.dat no longer changes their ID or hot key assignment; added 20 new hot keys; the environment information is now used when executing a command; some code clean up in command.c; added CheckExecutibleFlags to systemf.c the eliminate repetative code in assoc.c, command.c & cmdline.c

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