source: trunk/dll/cmdline.c@ 1844

Last change on this file since 1844 was 1750, checked in by John Small, 12 years ago

Ticket #524: Made "searchapath" thread-safe. Function names and signatures were changed.

So calls to these functions, direct and indirect, had to be changed.

  • 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 1750 2014-03-01 13:55:57Z jbs $
5
6 User defined commands support
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2010 Steven H.Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 05 Jun 05 SHL Use QWL_USER
13 22 Jul 06 SHL Check more run time errors
14 29 Jul 06 SHL Use xfgets_bstripcr
15 22 Mar 07 GKY Use QWL_USER
16 16 Jun 07 SHL Update for OpenWatcom
17 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
18 29 Feb 08 GKY Use xfree where appropriate
19 20 Apr 08 GKY New variable names; Save and Load command lines of user set length
20 19 Jul 08 GKY Replace save_dir2(dir) with pFM2SaveDirectory and use BldFullPathName
21 24 Aug 08 GKY Warn full drive on save of .DAT file; prevent loss of existing file
22 28 Jun 09 GKY Added AddBackslashToPath() to remove repeatative code.
23 13 Dec 09 GKY Fixed separate paramenters. Please note that appname should be used in
24 profile calls for user settings that work and are setable in more than one
25 miniapp; FM3Str should be used for setting only relavent to FM/2 or that
26 aren't user settable; realappname should be used for setting applicable to
27 one or more miniapp but not to FM/2
28 21 Dec 09 GKY Added CheckExecutibleFlags to streamline code in command.c assoc.c & cmdline.c
29 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
30 23 Oct 10 GKY Changes to populate and utilize a HELPTABLE for context specific help
31 28 Apr 14 JBS Ticket #522: Ensure use of wrapper functions where needed
32
33***********************************************************************/
34
35#include <stdlib.h>
36#include <string.h>
37#include <share.h>
38#include <io.h> // unlink
39
40#define INCL_DOS
41#define INCL_WIN
42#define INCL_LONGLONG // dircnrs.h
43
44#include "fm3dll.h"
45#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
46#include "arccnrs.h" // Data declaration(s)
47#include "fm2cmd.h" // Data declaration(s)
48#include "notebook.h" // Data declaration(s)
49#include "init.h" // Data declaration(s)
50#include "newview.h" // Data declarations
51#include "fm3dlg.h"
52#include "fm3str.h"
53#include "mle.h"
54#include "errutil.h" // Dos_Error...
55#include "strutil.h" // GetPString
56#include "mainwnd.h" // BubbleHelp
57#include "cmdline.h" // CmdLineDlgProc, CmdLine2DlgProc
58#include "chklist.h" // PosOverOkay
59#include "pathutil.h" // MaxCmdLineStr
60#include "strips.h" // bstrip
61#include "misc.h" // CheckDriveSpaceAvail
62#include "srchpath.h" // searchpath
63#include "wrappers.h" // xfgets_bstripcr
64#include "valid.h" // IsFile
65#include "dirs.h" // save_dir2
66#include "systemf.h"
67#include "fortify.h"
68
69#define MAXNUMCMDLINES 250
70
71typedef struct LINKCMDLINES
72{
73 CHAR *cmdline;
74 struct LINKCMDLINES *next;
75}
76LINKCMDLINES;
77
78static LINKCMDLINES *DoItYourselfCmdLine = NULL, *MiniCmdLine = NULL;
79static BOOL DoItYourselfLoaded = FALSE, MiniLoaded = FALSE;
80
81// Data definitions
82static PSZ pszSrcFile = __FILE__;
83
84#pragma data_seg(GLOBAL1)
85BOOL fSaveBigCmds;
86
87
88VOID load_cmdlines(BOOL DoItYourself)
89{
90 /** load linked list of cmdlines from CMDLINES.DAT file
91 * if DoItYourself = TRUE (main command line dialog)
92 * else load from CMDMINI.DAT (mini command line at
93 * bottom of main window).
94 */
95
96 FILE *fp;
97 LINKCMDLINES *info, *last = NULL, *CmdLineHead;
98 PSZ pszCmdLine;
99 //CHAR s[1024];
100 INT x = 0;
101 CHAR *moder = "r";
102
103 pszCmdLine = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
104 if (pszCmdLine) {
105 CmdLineHead = (DoItYourself) ? DoItYourselfCmdLine : MiniCmdLine;
106 if (DoItYourself)
107 DoItYourselfLoaded = TRUE;
108 else
109 MiniLoaded = TRUE;
110 BldFullPathName(pszCmdLine, pFM2SaveDirectory,
111 (DoItYourself) ? PCSZ_CMDLINESDAT : PCSZ_CMDMINIDAT);
112 fp = xfsopen(pszCmdLine, moder, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
113 if (fp) {
114 while (x < MAXNUMCMDLINES && !feof(fp)) {
115 if (!xfgets_bstripcr(pszCmdLine, MaxComLineStrg, fp, pszSrcFile, __LINE__))
116 break;
117 if (pszCmdLine && *pszCmdLine != ';') {
118 info = xmalloc(sizeof(LINKCMDLINES), pszSrcFile, __LINE__);
119 if (info) {
120 x++;
121 info->cmdline = xstrdup(pszCmdLine, pszSrcFile, __LINE__);
122 if (!info->cmdline)
123 free(info);
124 else {
125 info->next = NULL;
126 if (!CmdLineHead)
127 CmdLineHead = info;
128 else
129 last->next = info;
130 last = info;
131 }
132 }
133 }
134 }
135 fclose(fp);
136 }
137 free(pszCmdLine);
138 }
139 if (DoItYourself)
140 DoItYourselfCmdLine = CmdLineHead;
141 else
142 MiniCmdLine = CmdLineHead;
143}
144
145VOID save_cmdlines(BOOL DoItYourself)
146{
147 /** save linked list of cmdlines from CMDLINES.DAT file
148 * if DoItYourself = TRUE (main command line dialog)
149 * else load from CMDMINI.DAT (mini command line at
150 * bottom of main window).
151 */
152
153 LINKCMDLINES *info, *CmdLineHead;
154 FILE *fp;
155 PSZ pszCmdLine;
156 //CHAR s[CCHMAXPATH + 14];
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// WinEnableWindow(WinWindowFromID(hwnd,EXEC_ENVIRON),FALSE);
400 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
401 PosOverOkay(hwnd);
402 break;
403
404 case UM_SETUP:
405 {
406 ULONG apptype = 0L;
407 // Change DosQueryAppType to xDosQueryAppType if "executable"is no longer local
408 CHAR executable[CCHMAXPATH], commandline[1001], *p;
409
410 ex = INSTDATA(hwnd);
411 if (!ex)
412 return 0;
413 WinSetDlgItemText(hwnd, EXEC_WARNING, NullStr);
414 WinSetDlgItemText(hwnd, EXEC_WARNING2, NullStr);
415 *commandline = 0;
416 WinQueryDlgItemText(hwnd, EXEC_CL, 1000, commandline);
417 if (!*commandline)
418 return 0;
419 if (*ex->path) {
420 strcpy(executable, ex->path);
421 AddBackslashToPath(executable);
422 //if (executable[strlen(executable) - 1] != '\\')
423 // strcat(executable, "\\");
424 }
425 else
426 *executable = 0;
427 strncat(executable, commandline, CCHMAXPATH - strlen(executable));
428 executable[CCHMAXPATH - 1] = 0;
429 p = strchr(executable, ' ');
430 if (p)
431 *p = 0;
432 if (IsFile(executable) == -1) {
433 strncpy(executable, commandline, CCHMAXPATH);
434 executable[CCHMAXPATH - 1] = 0;
435 p = strchr(executable, ' ');
436 if (p)
437 *p = 0;
438 if (IsFile(executable) == -1) {
439// p = searchpath(executable);
440// if (*p)
441 if (SearchPathForFile(PCSZ_PATH, executable, executable)) // jbs: OK to have same source and destination?
442// strcpy(executable, p);
443// else {
444 WinSetDlgItemText(hwnd,
445 EXEC_WARNING2,
446 (CHAR *) GetPString(IDS_CANTFINDFILETEXT));
447 break;
448// }
449 }
450 }
451 if (DosQueryAppType(executable, &apptype) ||
452 (apptype && !(apptype &
453 (FAPPTYP_NOTWINDOWCOMPAT |
454 FAPPTYP_WINDOWCOMPAT |
455 FAPPTYP_WINDOWAPI |
456 FAPPTYP_BOUND |
457 FAPPTYP_DOS |
458 FAPPTYP_WINDOWSREAL |
459 FAPPTYP_WINDOWSPROT | FAPPTYP_32BIT | 0x1000)))) {
460 p = strchr(executable, '.');
461 if (p) {
462 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
463 !stricmp(p, PCSZ_DOTBTM)) {
464 WinSetDlgItemText(hwnd,
465 EXEC_WARNING2,
466 (CHAR *) GetPString(IDS_RUNTHRUCMDEXETEXT));
467 break;
468 }
469 }
470 WinSetDlgItemText(hwnd, EXEC_WARNING2, (CHAR *) GetPString(IDS_NOTDIRECTEXETEXT));
471 }
472 else if (apptype) { // acceptable
473
474 CHAR s[257];
475
476 *s = 0;
477 WinSetDlgItemText(hwnd, EXEC_WARNING, (CHAR *) GetPString(IDS_ACCEPTABLEAPPTEXT));
478 if (apptype & FAPPTYP_DOS)
479 strcat(s, GetPString(IDS_DOSTEXT));
480 if (apptype & FAPPTYP_WINDOWSREAL) {
481 if (*s)
482 strcat(s, " ");
483 strcat(s, GetPString(IDS_WINDOWSREALTEXT));
484 }
485 if (apptype & FAPPTYP_WINDOWSPROT) {
486 if (*s)
487 strcat(s, " ");
488 strcat(s, GetPString(IDS_WINDOWSPROTTEXT));
489 }
490 if (apptype & 0x1000) {
491 if (*s)
492 strcat(s, " ");
493 strcat(s, GetPString(IDS_WINDOWSENHTEXT));
494 }
495 if ((apptype & FAPPTYP_WINDOWAPI) == FAPPTYP_WINDOWAPI) {
496 if (*s)
497 strcat(s, " ");
498 strcat(s, GetPString(IDS_PMTEXT));
499 WinCheckButton(hwnd, EXEC_FULLSCREEN, FALSE);
500 WinEnableWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), FALSE);
501 }
502 if (apptype & FAPPTYP_BOUND) {
503 if (*s)
504 strcat(s, " ");
505 strcat(s, GetPString(IDS_BOUNDTEXT));
506 }
507 if ((apptype & FAPPTYP_WINDOWCOMPAT) &&
508 !(apptype & FAPPTYP_NOTWINDOWCOMPAT)) {
509 if (*s)
510 strcat(s, " ");
511 strcat(s, GetPString(IDS_VIOTEXT));
512 }
513 if ((apptype & FAPPTYP_NOTWINDOWCOMPAT) &&
514 !(apptype & FAPPTYP_WINDOWCOMPAT)) {
515 if (*s)
516 strcat(s, " ");
517 strcat(s, GetPString(IDS_FULLSCREENTEXT));
518 }
519 if (apptype & FAPPTYP_32BIT) {
520 if (*s)
521 strcat(s, " ");
522 strcat(s, GetPString(IDS_32BITTEXT));
523 }
524 WinSetDlgItemText(hwnd, EXEC_WARNING2, s);
525 if ((apptype & (FAPPTYP_DOS | FAPPTYP_WINDOWSREAL |
526 FAPPTYP_WINDOWSPROT | 0x1000)) ||
527 ((apptype & FAPPTYP_WINDOWAPI) == FAPPTYP_WINDOWAPI)) {
528 WinCheckButton(hwnd, EXEC_KEEP, FALSE);
529 WinEnableWindow(WinWindowFromID(hwnd, EXEC_KEEP), FALSE);
530 }
531 if (apptype & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | 0x1000))
532 WinCheckButton(hwnd, EXEC_FULLSCREEN, TRUE);
533 }
534 else
535 WinSetDlgItemText(hwnd, EXEC_WARNING2, (CHAR *) GetPString(IDS_UNKNOWNDEFAULTTEXT));
536 }
537 return 0;
538
539 case WM_ADJUSTWINDOWPOS:
540 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
541 break;
542
543 case UM_SETDIR:
544 PaintRecessedWindow(WinWindowFromID(hwnd,
545 EXEC_WARNING2),
546 (HPS) 0, FALSE, FALSE);
547 return 0;
548
549 case UM_RESCAN:
550 WinSendDlgItemMsg(hwnd, EXEC_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
551 if (!DoItYourselfLoaded)
552 load_cmdlines(TRUE);
553 {
554 LINKCMDLINES *info;
555
556 info = DoItYourselfCmdLine;
557 while (info) {
558 WinSendDlgItemMsg(hwnd,
559 EXEC_LISTBOX,
560 LM_INSERTITEM,
561 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->cmdline));
562 info = info->next;
563 }
564 }
565 return 0;
566
567 case WM_CONTROL:
568 switch (SHORT1FROMMP(mp1)) {
569 case EXEC_SAVECMD:
570 {
571 fSaveBigCmds = (fSaveBigCmds) ? FALSE : TRUE;
572 WinCheckButton(hwnd, EXEC_SAVECMD, fSaveBigCmds);
573 PrfWriteProfileData(fmprof, appname, "SaveBigCmds", &fSaveBigCmds, sizeof(BOOL));
574 }
575 break;
576 case EXEC_CL:
577 switch (SHORT2FROMMP(mp1)) {
578 case EN_KILLFOCUS:
579 ex = INSTDATA(hwnd);
580 if (!ex || !ex->dropped)
581 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
582 break;
583 }
584 break;
585 case EXEC_LISTBOX:
586 switch (SHORT2FROMMP(mp1)) {
587 case LN_KILLFOCUS:
588 ex = INSTDATA(hwnd);
589 if (ex) {
590 if (ex->dropped)
591 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(EXEC_DROP, 0), MPVOID);
592 }
593 break;
594 case LN_ENTER:
595 {
596 SHORT x;
597 CHAR cmdline[1001];
598
599 x = (SHORT) WinSendDlgItemMsg(hwnd,
600 EXEC_LISTBOX,
601 LM_QUERYSELECTION,
602 MPFROMSHORT(LIT_FIRST), MPVOID);
603 if (x >= 0) {
604 *cmdline = 0;
605 WinSendDlgItemMsg(hwnd,
606 EXEC_LISTBOX,
607 LM_QUERYITEMTEXT,
608 MPFROM2SHORT(x,
609 sizeof(cmdline)),
610 MPFROMP(cmdline));
611 bstrip(cmdline);
612 if (*cmdline) {
613 WinSetDlgItemText(hwnd, EXEC_CL, cmdline);
614 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(EXEC_DROP, 0), MPVOID);
615 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
616 }
617 }
618 }
619 break;
620 }
621 break;
622 }
623 return 0;
624
625 case WM_HELP:
626 if (hwndHelp)
627 WinSendMsg(hwndHelp,
628 HM_DISPLAY_HELP,
629 MPFROM2SHORT(HELP_CMDLINE, 0), MPFROMSHORT(HM_RESOURCEID));
630 break;
631
632 case WM_COMMAND:
633 switch (SHORT1FROMMP(mp1)) {
634 case EXEC2_CLR:
635 free_cmdlines(TRUE);
636 save_cmdlines(TRUE);
637 WinSendDlgItemMsg(hwnd, EXEC_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
638 break;
639 case EXEC2_DEL:
640 {
641 SHORT x;
642 CHAR cmdline[1001];
643
644 x = (SHORT) WinSendDlgItemMsg(hwnd,
645 EXEC_LISTBOX,
646 LM_QUERYSELECTION,
647 MPFROMSHORT(LIT_FIRST), MPVOID);
648 if (x >= 0) {
649 *cmdline = 0;
650 WinSendDlgItemMsg(hwnd,
651 EXEC_LISTBOX,
652 LM_QUERYITEMTEXT,
653 MPFROM2SHORT(x, sizeof(cmdline)),
654 MPFROMP(cmdline));
655 bstrip(cmdline);
656 if (*cmdline) {
657 if (remove_cmdline(cmdline, TRUE) && fSaveBigCmds) {
658 save_cmdlines(TRUE);
659 WinSendDlgItemMsg(hwnd,
660 EXEC_LISTBOX,
661 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
662 if (x)
663 x--;
664 WinSendDlgItemMsg(hwnd,
665 EXEC_LISTBOX,
666 LM_SELECTITEM,
667 MPFROMSHORT(x), MPFROMSHORT(TRUE));
668 }
669 }
670 }
671 }
672 break;
673 case EXEC_DROP:
674 ex = INSTDATA(hwnd);
675 if (ex) {
676 if (!ex->dropped) {
677 *ex->tempprompt = 0;
678 WinQueryDlgItemText(hwnd,
679 EXEC_WARNING2,
680 sizeof(ex->tempprompt), ex->tempprompt);
681 WinSetDlgItemText(hwnd, EXEC_WARNING2, (CHAR *) GetPString(IDS_CMDSELCMDHELPTEXT));
682 ex->dropped = TRUE;
683 if ((SHORT) WinSendDlgItemMsg(hwnd,
684 EXEC_LISTBOX,
685 LM_QUERYITEMCOUNT,
686 MPVOID, MPVOID) == 0)
687 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
688 WinShowWindow(WinWindowFromID(hwnd, EXEC_CL), FALSE);
689 WinShowWindow(WinWindowFromID(hwnd, EXEC_WARNING), FALSE);
690 WinShowWindow(WinWindowFromID(hwnd, EXEC_DEFAULT), FALSE);
691 WinShowWindow(WinWindowFromID(hwnd, EXEC_MINIMIZED), FALSE);
692 WinShowWindow(WinWindowFromID(hwnd, EXEC_MAXIMIZED), FALSE);
693 WinShowWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), FALSE);
694 WinShowWindow(WinWindowFromID(hwnd, EXEC_INVISIBLE), FALSE);
695 WinShowWindow(WinWindowFromID(hwnd, EXEC_KEEP), FALSE);
696 WinShowWindow(WinWindowFromID(hwnd, EXEC_ENVIRON), FALSE);
697 WinShowWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
698 WinShowWindow(WinWindowFromID(hwnd, IDM_HELP), FALSE);
699 WinShowWindow(WinWindowFromID(hwnd, EXEC_ABORT), FALSE);
700 WinShowWindow(WinWindowFromID(hwnd, DID_CANCEL), FALSE);
701 WinShowWindow(WinWindowFromID(hwnd, EXEC_LISTBOX), TRUE);
702 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, EXEC_LISTBOX));
703 WinSetDlgItemText(hwnd, EXEC_DROP, "^");
704 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), TRUE);
705 }
706 else {
707 ex->dropped = FALSE;
708 WinSetDlgItemText(hwnd, EXEC_WARNING2, ex->tempprompt);
709 WinShowWindow(WinWindowFromID(hwnd, EXEC_LISTBOX), FALSE);
710 WinShowWindow(WinWindowFromID(hwnd, EXEC_CL), TRUE);
711 WinShowWindow(WinWindowFromID(hwnd, EXEC_WARNING), TRUE);
712 WinShowWindow(WinWindowFromID(hwnd, EXEC_DEFAULT), TRUE);
713 WinShowWindow(WinWindowFromID(hwnd, EXEC_MINIMIZED), TRUE);
714 WinShowWindow(WinWindowFromID(hwnd, EXEC_MAXIMIZED), TRUE);
715 WinShowWindow(WinWindowFromID(hwnd, EXEC_FULLSCREEN), TRUE);
716 WinShowWindow(WinWindowFromID(hwnd, EXEC_INVISIBLE), TRUE);
717 WinShowWindow(WinWindowFromID(hwnd, EXEC_KEEP), TRUE);
718 WinShowWindow(WinWindowFromID(hwnd, EXEC_ENVIRON), TRUE);
719 WinShowWindow(WinWindowFromID(hwnd, DID_OK), TRUE);
720 WinShowWindow(WinWindowFromID(hwnd, IDM_HELP), TRUE);
721 WinShowWindow(WinWindowFromID(hwnd, EXEC_ABORT), TRUE);
722 WinShowWindow(WinWindowFromID(hwnd, DID_CANCEL), TRUE);
723 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, EXEC_CL));
724 WinSetDlgItemText(hwnd, EXEC_DROP, "v");
725 WinShowWindow(WinWindowFromID(hwnd, EXEC2_DEL), FALSE);
726 }
727 }
728 break;
729
730 case DID_OK:
731 ex = INSTDATA(hwnd);
732 WinQueryDlgItemText(hwnd, EXEC_CL, 1000, ex->commandline);
733 ex->flags = CheckExecutibleFlags(hwnd, 2);
734 strset(ex->environment, 0);
735 WinQueryDlgItemText(hwnd, EXEC_ENVIRON, 1000, ex->environment);
736 if (add_cmdline(ex->commandline, TRUE) && fSaveBigCmds)
737 save_cmdlines(TRUE);
738 WinDismissDlg(hwnd, 1);
739 break;
740
741 case DID_CANCEL:
742 WinDismissDlg(hwnd, 0);
743 break;
744
745 case EXEC_ABORT:
746 WinDismissDlg(hwnd, 2);
747 break;
748
749 case IDM_HELP:
750 if (hwndHelp)
751 WinSendMsg(hwndHelp,
752 HM_DISPLAY_HELP,
753 MPFROM2SHORT(HELP_CMDLINE, 0), MPFROMSHORT(HM_RESOURCEID));
754 break;
755 }
756 return 0;
757
758 case WM_DESTROY:
759 break;
760 }
761 return WinDefDlgProc(hwnd, msg, mp1, mp2);
762}
763
764MRESULT EXPENTRY CmdLine2DlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
765{
766 switch (msg) {
767 case WM_INITDLG:
768 if (!mp2) {
769 WinDismissDlg(hwnd, 0);
770 break;
771 }
772 WinSetWindowPtr(hwnd, QWL_USER, mp2);
773 {
774 int x;
775 USHORT ids[] = { IDM_HELP, EXEC2_CLR, EXEC2_DEL, EXEC2_KEEP, EXEC2_SAVE,
776 EXEC2_OPEN, EXEC2_CLOSE, EXEC2_FILTER, DID_CANCEL, 0
777 };
778
779 WinSetWindowPtr(WinWindowFromID(hwnd, EXEC2_LISTBOX),
780 QWL_USER,
781 (PVOID) WinSubclassWindow(WinWindowFromID(hwnd,
782 EXEC2_LISTBOX),
783 (PFNWP) CmdListSubProc));
784 for (x = 0; ids[x]; x++)
785 WinSetWindowPtr(WinWindowFromID(hwnd, ids[x]),
786 QWL_USER,
787 (PVOID) WinSubclassWindow(WinWindowFromID(hwnd,
788 ids[x]),
789 (PFNWP) CmdBtnSubProc));
790 }
791 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
792 break;
793
794 case UM_RESCAN:
795 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
796 if (!MiniLoaded)
797 load_cmdlines(FALSE);
798 {
799 LINKCMDLINES *info;
800
801 info = MiniCmdLine;
802 while (info) {
803 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_INSERTITEM,
804 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->cmdline));
805 info = info->next;
806 }
807 }
808 return 0;
809
810 case WM_CONTROL:
811 switch (SHORT1FROMMP(mp1)) {
812 case EXEC2_LISTBOX:
813 switch (SHORT2FROMMP(mp1)) {
814 case LN_ENTER:
815 {
816 SHORT x;
817 CHAR *cmdline = WinQueryWindowPtr(hwnd, QWL_USER);
818
819 x = (SHORT) WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX,
820 LM_QUERYSELECTION,
821 MPFROMSHORT(LIT_FIRST), MPVOID);
822 if (x >= 0) {
823 *cmdline = 0;
824 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_QUERYITEMTEXT,
825 MPFROM2SHORT(x, 1000), MPFROMP(cmdline));
826 bstrip(cmdline);
827 if (*cmdline)
828 WinDismissDlg(hwnd, 1);
829 }
830 }
831 break;
832 }
833 break;
834 }
835 return 0;
836
837 case WM_COMMAND:
838 switch (SHORT1FROMMP(mp1)) {
839 case EXEC2_KEEP:
840 case EXEC2_SAVE:
841 case EXEC2_FILTER:
842 case EXEC2_CLOSE:
843 case EXEC2_OPEN:
844 case IDM_HELP:
845 {
846 char *cmdline = WinQueryWindowPtr(hwnd, QWL_USER);
847 ULONG strid = 0;
848
849 if (cmdline) {
850 switch (SHORT1FROMMP(mp1)) {
851 case EXEC2_OPEN:
852 strid = IDS_OPENCMDTEXT;
853 break;
854 case EXEC2_CLOSE:
855 strid = IDS_CLOSECMDTEXT;
856 break;
857 case EXEC2_FILTER:
858 strid = IDS_FILTERCMDTEXT;
859 break;
860 case EXEC2_SAVE:
861 strid = (fSaveMiniCmds) ? IDS_NOSAVECMDTEXT : IDS_SAVECMDTEXT;
862 break;
863 case EXEC2_KEEP:
864 strid = (fKeepCmdLine) ? IDS_NOKEEPCMDTEXT : IDS_KEEPCMDTEXT;
865 break;
866 case IDM_HELP:
867 strid = IDS_HELPCMDTEXT;
868 break;
869 }
870 if (strid) {
871 strcpy(cmdline, GetPString(strid));
872 WinDismissDlg(hwnd, 1);
873 }
874 }
875 break;
876 }
877 case EXEC2_CLR:
878 free_cmdlines(FALSE);
879 save_cmdlines(FALSE);
880 WinSendDlgItemMsg(hwnd, EXEC2_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
881 break;
882 case EXEC2_DEL:
883 {
884 SHORT x;
885 CHAR cmdline[1001];
886
887 x = (SHORT) WinSendDlgItemMsg(hwnd,
888 EXEC2_LISTBOX,
889 LM_QUERYSELECTION,
890 MPFROMSHORT(LIT_FIRST), MPVOID);
891 if (x >= 0) {
892 *cmdline = 0;
893 WinSendDlgItemMsg(hwnd,
894 EXEC2_LISTBOX,
895 LM_QUERYITEMTEXT,
896 MPFROM2SHORT(x, sizeof(cmdline)),
897 MPFROMP(cmdline));
898 bstrip(cmdline);
899 if (*cmdline) {
900 if (remove_cmdline(cmdline, FALSE) && fSaveMiniCmds) {
901 save_cmdlines(FALSE);
902 WinSendDlgItemMsg(hwnd,
903 EXEC2_LISTBOX,
904 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
905 if (x)
906 x--;
907 WinSendDlgItemMsg(hwnd,
908 EXEC2_LISTBOX,
909 LM_SELECTITEM,
910 MPFROMSHORT(x), MPFROMSHORT(TRUE));
911 }
912 }
913 }
914 }
915 break;
916 case DID_CANCEL:
917 WinDismissDlg(hwnd, 0);
918 break;
919 }
920 return 0;
921
922 case WM_DESTROY:
923 break;
924 }
925 return WinDefDlgProc(hwnd, msg, mp1, mp2);
926}
927
928#pragma alloc_text(CMDLINE1,CmdLineDlgProc,CmdListSubProc,CmdLine2DlgProc,CmdBtnSubProc)
929#pragma alloc_text(CMDLINE2,save_cmdlines,load_cmdlines,add_cmdline,remove_cmdline,free_cmdlines)
Note: See TracBrowser for help on using the repository browser.