source: trunk/dll/cmdline.c@ 1119

Last change on this file since 1119 was 1119, checked in by Gregg Young, 17 years ago

Comments for CS 1118 (Tickets 154 (not 152), 270)

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