source: trunk/dll/cmdline.c@ 1204

Last change on this file since 1204 was 1204, checked in by John Small, 17 years ago

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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