source: trunk/dll/cmdline.c@ 1439

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

Changes to allow high mem loading of dll; Refactor .LONGNAME and .SUBJECT EA fetch to FetchCommonEAs. Add szFSType to FillInRecordFromFSA use to bypass EA scan and size formatting for tree container; Fix labels/FS type to work on scan on NOPRESCAN Drives; Fixed dbl directory names on restore of dir cnrs; (Tickets 47, 339, 363, 368, 369, 370)

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