source: trunk/dll/cmdline.c@ 1039

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

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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