source: trunk/dll/cmdline.c@ 697

Last change on this file since 697 was 697, checked in by Steven Levine, 18 years ago

More OpenWatcom compatibility updates

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