source: trunk/dll/cmdline.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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