source: trunk/dll/cmdline.c@ 406

Last change on this file since 406 was 406, checked in by root, 19 years ago

Use xfgets_bstripcr

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