source: trunk/dll/cmdline.c@ 1117

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

Check disk free space before writing data files to prevent traps from being on a full disk (ticket 154)

  • 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 1117 2008-08-24 18:31:35Z 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");
[1117]131 if (CheckDriveSpaceAvail(pszCmdLine, ullDATFileSpaceNeeded, 0) == 2)
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.