source: trunk/dll/cmdline.c@ 1118

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

Clean up of fix for trap caused by FM/2 being on a full disk. It now preserves the data files. (Ticket 152, 271)

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