source: trunk/dll/cmdline.c@ 1438

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

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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