source: trunk/dll/cmdline.c@ 689

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

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