source: trunk/dll/command.c@ 552

Last change on this file since 552 was 552, checked in by Gregg Young, 18 years ago

font cleanup; new image and archiver masks; messages moved to string file; new drive flags including David's icons mostly working

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: command.c 552 2007-03-01 06:24:47Z gyoung $
5
6 Custom commands
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 06 Jun 05 SHL Drop unused code
13 14 Jul 06 SHL Use Runtime_Error
14 29 Jul 06 SHL Use xfgets_bstripcr
15 15 Aug 06 SHL Better can't add message
16 18 Sep 06 GKY Add replace command and update okay to add if changed
17 17 Feb 07 GKY Move error messages etc to string file
18
19***********************************************************************/
20
21#define INCL_DOS
22#define INCL_WIN
23#include <os2.h>
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28#include <ctype.h>
29#include <share.h>
30
31#include "fm3dll.h"
32#include "fm3dlg.h"
33#include "fm3str.h"
34#include "tools.h"
35
36typedef struct
37{
38 CHAR cl[1001];
39 INT flags;
40 CHAR title[34];
41}
42COMMAND;
43
44#pragma data_seg(DATA1)
45
46static PSZ pszSrcFile = __FILE__;
47
48#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
49#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
50
51MRESULT EXPENTRY CommandTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
52{
53 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, 0);
54 static BOOL emphasized = FALSE;
55
56 switch (msg) {
57 case DM_DRAGOVER:
58 if (!emphasized) {
59 emphasized = TRUE;
60 DrawTargetEmphasis(hwnd, emphasized);
61 }
62 if (AcceptOneDrop(mp1, mp2))
63 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
64 return MRFROM2SHORT(DOR_NEVERDROP, 0);
65
66 case DM_DRAGLEAVE:
67 if (emphasized) {
68 emphasized = FALSE;
69 DrawTargetEmphasis(hwnd, emphasized);
70 }
71 break;
72
73 case DM_DROPHELP:
74 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DROPCMDHELPTEXT));
75 return 0;
76
77 case DM_DROP:
78 {
79 char szFrom[CCHMAXPATH + 5];
80
81 if (emphasized) {
82 emphasized = FALSE;
83 DrawTargetEmphasis(hwnd, emphasized);
84 }
85 if (GetOneDrop(mp1, mp2, szFrom, CCHMAXPATH)) {
86 strcat(szFrom, " %a");
87 WinSetWindowText(hwnd, szFrom);
88 }
89 }
90 return 0;
91 }
92 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
93 WinDefWindowProc(hwnd, msg, mp1, mp2);
94}
95
96MRESULT EXPENTRY ReOrderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
97{
98 switch (msg) {
99 case WM_INITDLG:
100 if (!cmdhead) {
101 WinDismissDlg(hwnd, 0);
102 break;
103 }
104 {
105 LINKCMDS *info;
106 SHORT x;
107
108 info = cmdhead;
109 while (info) {
110 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_INSERTITEM,
111 MPFROMSHORT(LIT_END),
112 MPFROMP(info->title));
113 if (x < 0) {
114 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
115 WinDismissDlg(hwnd, 0);
116 }
117 else {
118 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SETITEMHANDLE,
119 MPFROMSHORT(x), MPFROMP(info));
120 }
121 info = info->next;
122 }
123 }
124 break;
125
126 case WM_CONTROL:
127 return 0;
128
129 case WM_COMMAND:
130 switch (SHORT1FROMMP(mp1)) {
131 case DID_CANCEL:
132 WinDismissDlg(hwnd, 0);
133 break;
134
135 case DID_OK:
136 {
137 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
138 SHORT sSelect, numitems;
139
140 sSelect = 0;
141 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
142 LM_QUERYITEMCOUNT,
143 MPVOID, MPVOID);
144 while (numitems) {
145 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
146 LM_QUERYITEMHANDLE,
147 MPFROMSHORT(sSelect++),
148 MPVOID);
149 if (info) {
150 if (!temphead) {
151 temphead = info;
152 info->prev = NULL;
153 }
154 else {
155 last->next = info;
156 info->prev = last;
157 }
158 temptail = info;
159 last = info;
160 info->next = NULL;
161 }
162 numitems--;
163 }
164 sSelect = 0;
165 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
166 LM_QUERYITEMCOUNT,
167 MPVOID, MPVOID);
168 while (numitems) {
169 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
170 LM_QUERYITEMHANDLE,
171 MPFROMSHORT(sSelect++),
172 MPVOID);
173 if (info) {
174 if (!temphead) {
175 temphead = info;
176 info->prev = NULL;
177 }
178 else {
179 last->next = info;
180 info->prev = last;
181 }
182 temptail = info;
183 last = info;
184 info->next = NULL;
185 }
186 numitems--;
187 }
188 cmdhead = temphead;
189 cmdtail = temptail;
190 }
191 WinDismissDlg(hwnd, 1);
192 break;
193
194 case IDM_HELP:
195 if (hwndHelp)
196 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
197 MPFROM2SHORT(HELP_REORDERCOMMANDS, 0),
198 MPFROMSHORT(HM_RESOURCEID));
199 break;
200
201 case RE_ADD:
202 {
203 SHORT sSelect, x;
204 LINKCMDS *info;
205
206 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
207 LM_QUERYSELECTION,
208 MPFROMSHORT(LIT_FIRST), MPVOID);
209 while (sSelect >= 0) {
210 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
211 LM_QUERYITEMHANDLE,
212 MPFROMSHORT(sSelect), MPVOID);
213 if (info) {
214 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
215 LM_INSERTITEM,
216 MPFROM2SHORT(LIT_END, 0),
217 MPFROMP(info->title));
218 if (x >= 0) {
219 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
220 LM_SETITEMHANDLE,
221 MPFROMSHORT(x), MPFROMP(info));
222 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_DELETEITEM,
223 MPFROMSHORT(sSelect), MPVOID);
224 }
225 }
226 else
227 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SELECTITEM,
228 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
229 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
230 LM_QUERYSELECTION,
231 MPFROMSHORT(LIT_FIRST),
232 MPVOID);
233 }
234 }
235 break;
236
237 case RE_REMOVE:
238 {
239 SHORT sSelect, x;
240 LINKCMDS *info;
241
242 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
243 LM_QUERYSELECTION,
244 MPFROMSHORT(LIT_FIRST), MPVOID);
245 while (sSelect >= 0) {
246 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
247 LM_QUERYITEMHANDLE,
248 MPFROMSHORT(sSelect), MPVOID);
249 if (info) {
250 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
251 LM_INSERTITEM,
252 MPFROM2SHORT(LIT_END, 0),
253 MPFROMP(info->title));
254 if (x >= 0) {
255 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
256 LM_SETITEMHANDLE,
257 MPFROMSHORT(x), MPFROMP(info));
258 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_DELETEITEM,
259 MPFROMSHORT(sSelect), MPVOID);
260 }
261 }
262 else
263 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_SELECTITEM,
264 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
265 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
266 LM_QUERYSELECTION,
267 MPFROMSHORT(LIT_FIRST),
268 MPVOID);
269 }
270 }
271 break;
272 }
273 return 0;
274 }
275 return WinDefDlgProc(hwnd, msg, mp1, mp2);
276}
277
278CHAR *command_title(INT cx)
279{
280 static CHAR duh[] = "???";
281 LINKCMDS *info;
282 INT x = 0;
283
284 if (!cmdloaded)
285 load_commands();
286 info = cmdhead;
287 while (info) {
288 if (x == cx)
289 return info->title;
290 info = info->next;
291 }
292 return duh;
293}
294
295VOID free_commands(VOID)
296{
297 LINKCMDS *info, *next;
298
299 info = cmdhead;
300 while (info) {
301 next = info->next;
302 free(info->title);
303 free(info->cl);
304 free(info);
305 info = next;
306 }
307 cmdhead = cmdtail = NULL;
308}
309
310VOID load_commands(VOID)
311{
312 FILE *fp;
313 LINKCMDS *info;
314 CHAR cl[1024];
315 CHAR title[100];
316 CHAR flags[72];
317
318 if (cmdhead)
319 free_commands();
320 cmdloaded = TRUE;
321 save_dir2(cl);
322 if (cl[strlen(cl) - 1] != '\\')
323 strcat(cl, "\\");
324 strcat(cl, "COMMANDS.DAT");
325 fp = _fsopen(cl, "r", SH_DENYWR);
326 if (fp) {
327 while (!feof(fp)) {
328 if (!xfgets_bstripcr(title, sizeof(title), fp, pszSrcFile, __LINE__))
329 break;
330 title[34] = 0; // fixme to know why chopped this way?
331 bstripcr(title);
332 if (!*title || *title == ';')
333 continue;
334 if (!xfgets(cl, sizeof(cl), fp, pszSrcFile, __LINE__))
335 break; /* error! */
336 if (!xfgets(flags, 72, fp, pszSrcFile, __LINE__))
337 break; /* error! */
338 cl[1000] = 0; // fixme to know why chopped this way?
339 bstripcr(cl);
340 flags[34] = 0;
341 bstripcr(flags);
342 if (!*cl)
343 continue;
344 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
345 if (info) {
346 info->cl = xstrdup(cl, pszSrcFile, __LINE__);
347 info->title = xstrdup(title, pszSrcFile, __LINE__);
348 info->flags = atol(flags);
349 if (!info->cl || !info->title) {
350 if (info->cl)
351 free(info->cl);
352 if (info->title)
353 free(info->title);
354 free(info);
355 break;
356 }
357 if (!cmdhead)
358 cmdhead = info;
359 else {
360 cmdtail->next = info;
361 info->prev = cmdtail;
362 }
363 cmdtail = info;
364 }
365 }
366 fclose(fp);
367 }
368}
369
370VOID save_commands(VOID)
371{
372 LINKCMDS *info;
373 FILE *fp;
374 CHAR s[CCHMAXPATH + 14];
375
376 if (!cmdloaded || !cmdhead)
377 return;
378 info = cmdhead;
379 save_dir2(s);
380 if (s[strlen(s) - 1] != '\\')
381 strcat(s, "\\");
382 strcat(s, "COMMANDS.DAT");
383 fp = xfopen(s, "w", pszSrcFile, __LINE__);
384 if (fp) {
385 fputs(GetPString(IDS_COMMANDFILETEXT), fp);
386 info = cmdhead;
387 while (info) {
388 fprintf(fp,
389 ";\n%0.34s\n%0.1000s\n%lu\n",
390 info->title, info->cl, info->flags);
391 info = info->next;
392 }
393 fclose(fp);
394 }
395}
396
397//== add_command() Add command to list ==
398
399LINKCMDS *add_command(COMMAND * addme)
400{
401 LINKCMDS *info;
402
403 if (!addme || !*addme->cl || !*addme->title)
404 return NULL; // No data
405 info = cmdhead;
406 while (info) {
407 if (!stricmp(info->title, addme->title))
408 return NULL; // Got a dup
409 info = info->next;
410 }
411 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
412 if (!info)
413 return NULL;
414 info->cl = xstrdup(addme->cl, pszSrcFile, __LINE__);
415 info->title = xstrdup(addme->title, pszSrcFile, __LINE__);
416 if (addme->flags)
417 info->flags = addme->flags;
418 if (!info->cl || !info->title) {
419 xfree(info->cl);
420 xfree(info->title);
421 free(info);
422 return NULL;
423 }
424 if (!cmdhead) /* only item in list */
425 cmdhead = cmdtail = info;
426 else {
427 /* place at tail */
428 cmdtail->next = info;
429 info->prev = cmdtail;
430 cmdtail = info;
431 }
432 return info;
433}
434
435BOOL kill_command(CHAR * killme)
436{
437 LINKCMDS *info;
438
439 if (killme && *killme) {
440 info = cmdhead;
441 while (info) {
442 if (!stricmp(info->title, killme)) {
443 if (info == cmdhead) {
444 cmdhead = info->next;
445 if (info == cmdtail)
446 cmdtail = info->prev;
447 }
448 else {
449 if (info->next)
450 (info->next)->prev = info->prev;
451 if (info->prev)
452 (info->prev)->next = info->next;
453 if (info == cmdtail)
454 cmdtail = info->prev;
455 }
456 free(info->cl);
457 free(info->title);
458 free(info);
459 return TRUE;
460 }
461 info = info->next;
462 }
463 }
464 return FALSE;
465}
466
467MRESULT EXPENTRY CommandDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
468{
469 SHORT x;
470 LINKCMDS *info;
471
472 switch (msg) {
473 case WM_INITDLG:
474 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
475 WinSendDlgItemMsg(hwnd, CMD_CL, EM_SETTEXTLIMIT,
476 MPFROM2SHORT(1000, 0), MPVOID);
477 WinSendDlgItemMsg(hwnd, CMD_TITLE, EM_SETTEXTLIMIT,
478 MPFROM2SHORT(33, 0), MPVOID);
479 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
480 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
481 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
482 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
483 WinCheckButton(hwnd, CMD_ONCE, FALSE);
484 info = cmdhead;
485 while (info) {
486 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_INSERTITEM,
487 MPFROM2SHORT(LIT_END, 0),
488 MPFROMP(info->title));
489 if (x >= 0)
490 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SETITEMHANDLE,
491 MPFROMSHORT(x), MPFROMP(info));
492 info = info->next;
493 }
494 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SELECTITEM,
495 MPFROMSHORT(0), MPFROMSHORT(TRUE));
496 {
497 PFNWP oldproc;
498
499 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, CMD_CL),
500 (PFNWP) CommandTextProc);
501 if (oldproc)
502 WinSetWindowPtr(WinWindowFromID(hwnd, CMD_CL), 0, (PVOID) oldproc);
503 }
504 break;
505
506 case WM_CONTROL:
507 if (SHORT1FROMMP(mp1) == CMD_LISTBOX) {
508 switch (SHORT2FROMMP(mp1)) {
509 case LN_ENTER:
510 case LN_SELECT:
511 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
512 LM_QUERYSELECTION,
513 MPFROMSHORT(LIT_FIRST), MPVOID);
514 if (x >= 0) {
515 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
516 LM_QUERYITEMHANDLE,
517 MPFROMSHORT(x), MPVOID);
518 if (!info) {
519 Runtime_Error(pszSrcFile, __LINE__, "LM_QUERYITEMHANDLE");
520 break;
521 }
522 WinSetDlgItemText(hwnd, CMD_CL, info->cl);
523 if (!(info->flags & 1023))
524 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
525 else {
526 if (info->flags & FULLSCREEN)
527 WinCheckButton(hwnd, CMD_FULLSCREEN, TRUE);
528 else if (info->flags & MINIMIZED)
529 WinCheckButton(hwnd, CMD_MINIMIZED, TRUE);
530 else if (info->flags & MAXIMIZED)
531 WinCheckButton(hwnd, CMD_MAXIMIZED, TRUE);
532 else if (info->flags & INVISIBLE)
533 WinCheckButton(hwnd, CMD_INVISIBLE, TRUE);
534 }
535 WinCheckButton(hwnd, CMD_PROMPT, ((info->flags & PROMPT) != 0));
536 WinCheckButton(hwnd, CMD_KEEP, ((info->flags & KEEP) != 0));
537 WinCheckButton(hwnd, CMD_ONCE, ((info->flags & ONCE) != 0));
538 WinSetDlgItemText(hwnd, CMD_TITLE, info->title);
539 {
540 CHAR env[1002];
541 ULONG size;
542
543 *env = 0;
544 size = sizeof(env) - 1;
545 if (PrfQueryProfileData(fmprof, FM3Str, info->cl, env, &size) &&
546 *env)
547 WinSetDlgItemText(hwnd, CMD_ENVIRON, env);
548 else
549 WinSetDlgItemText(hwnd, CMD_ENVIRON, NullStr);
550 }
551 }
552 break;
553 }
554 }
555 return 0;
556
557 case WM_COMMAND:
558 switch (SHORT1FROMMP(mp1)) {
559 case CMD_FIND:
560 {
561 CHAR filename[CCHMAXPATH + 9];
562
563 *filename = 0;
564 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
565 strcat(filename, " %a");
566 WinSetDlgItemText(hwnd, CMD_CL, filename);
567 }
568 }
569 break;
570
571 case CMD_REORDER:
572 if (!cmdhead || !cmdhead->next) {
573 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
574 break;
575 }
576 if (WinDlgBox(HWND_DESKTOP, hwnd, ReOrderProc, FM3ModHandle,
577 RE_FRAME, MPVOID)) {
578 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
579 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
580 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
581 info = cmdhead;
582 while (info) {
583 x = (SHORT) WinSendDlgItemMsg(hwnd,
584 CMD_LISTBOX,
585 LM_INSERTITEM,
586 MPFROM2SHORT(LIT_END, 0),
587 MPFROMP(info->title));
588 if (x >= 0)
589 WinSendDlgItemMsg(hwnd,
590 CMD_LISTBOX,
591 LM_SETITEMHANDLE,
592 MPFROMSHORT(x), MPFROMP(info));
593 info = info->next;
594 }
595 WinSendDlgItemMsg(hwnd,
596 CMD_LISTBOX,
597 LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
598 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
599 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
600 WinCheckButton(hwnd, CMD_ONCE, FALSE);
601 save_commands();
602 }
603 break;
604
605 case DID_OK:
606 {
607 x = (SHORT) WinSendDlgItemMsg(hwnd,
608 CMD_LISTBOX,
609 LM_QUERYSELECTION, MPVOID, MPVOID);
610 if (x == LIT_NONE)
611 x = (SHORT) WinSendDlgItemMsg(hwnd,
612 CMD_LISTBOX,
613 LM_SELECTITEM,
614 MPFROMSHORT(0), MPFROMSHORT(TRUE));
615 }
616 {
617 COMMAND temp;
618
619 memset(&temp, 0, sizeof(COMMAND));
620 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
621 bstrip(temp.cl);
622 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
623 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
624 temp.flags = 0;
625 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
626 temp.flags = FULLSCREEN;
627 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
628 temp.flags = MINIMIZED;
629 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
630 temp.flags = MAXIMIZED;
631 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
632 temp.flags = INVISIBLE;
633 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
634 temp.flags |= KEEP;
635 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
636 temp.flags |= PROMPT;
637 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
638 temp.flags |= ONCE;
639 info = add_command(&temp);
640 if (!info)
641 {
642 WinDismissDlg(hwnd, 0);
643 saymsg(MB_ENTER, hwnd,
644 GetPString(IDS_ERRORTEXT),
645 GetPString(IDS_CANTADDCOMMANDTEXT),
646 temp.title);
647 }
648 else {
649 CHAR env[1002];
650
651 *env = 0;
652 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
653 bstripcr(env);
654 if (*env) {
655 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
656 }
657 x = (SHORT) WinSendDlgItemMsg(hwnd,
658 CMD_LISTBOX,
659 LM_INSERTITEM,
660 MPFROM2SHORT(LIT_END, 0),
661 MPFROMP(temp.title));
662 if (x >= 0) {
663 WinSendDlgItemMsg(hwnd,
664 CMD_LISTBOX,
665 LM_SETITEMHANDLE,
666 MPFROMSHORT(x), MPFROMP(info));
667 WinSendDlgItemMsg(hwnd,
668 CMD_LISTBOX,
669 LM_SELECTITEM,
670 MPFROMSHORT(x), MPFROMSHORT(TRUE));
671 save_commands();
672 }
673 }
674 }
675 x = (SHORT) WinSendDlgItemMsg(hwnd,
676 CMD_LISTBOX,
677 LM_QUERYSELECTION,
678 MPFROMSHORT(LIT_FIRST), MPVOID);
679 WinDismissDlg(hwnd, 0);
680 break;
681
682 case DID_CANCEL:
683 WinDismissDlg(hwnd, 0);
684 break;
685
686 case IDM_HELP:
687 if (hwndHelp)
688 WinSendMsg(hwndHelp,
689 HM_DISPLAY_HELP,
690 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
691 break;
692
693 case CMD_ADD:
694 {
695 COMMAND temp;
696
697 memset(&temp, 0, sizeof(COMMAND));
698 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
699 bstrip(temp.cl);
700 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
701 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
702 temp.flags = 0;
703 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
704 temp.flags = FULLSCREEN;
705 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
706 temp.flags = MINIMIZED;
707 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
708 temp.flags = MAXIMIZED;
709 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
710 temp.flags = INVISIBLE;
711 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
712 temp.flags |= KEEP;
713 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
714 temp.flags |= PROMPT;
715 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
716 temp.flags |= ONCE;
717 info = add_command(&temp);
718 if (!info) {
719 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
720 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
721 }
722 else {
723 CHAR env[1002];
724
725 *env = 0;
726 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
727 bstripcr(env);
728 if (*env) {
729 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
730 }
731 x = (SHORT) WinSendDlgItemMsg(hwnd,
732 CMD_LISTBOX,
733 LM_INSERTITEM,
734 MPFROM2SHORT(LIT_END, 0),
735 MPFROMP(temp.title));
736 if (x >= 0) {
737 WinSendDlgItemMsg(hwnd,
738 CMD_LISTBOX,
739 LM_SETITEMHANDLE,
740 MPFROMSHORT(x), MPFROMP(info));
741 WinSendDlgItemMsg(hwnd,
742 CMD_LISTBOX,
743 LM_SELECTITEM,
744 MPFROMSHORT(x), MPFROMSHORT(TRUE));
745 save_commands();
746 }
747 }
748 }
749 break;
750
751 case CMD_DELETE:
752 {
753 CHAR temp[34];
754
755 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
756 bstrip(temp);
757 if (!kill_command(temp))
758 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
759 else {
760 x = (SHORT) WinSendDlgItemMsg(hwnd,
761 CMD_LISTBOX,
762 LM_QUERYSELECTION,
763 MPFROMSHORT(LIT_FIRST), MPVOID);
764 if (x >= 0) {
765 WinSendDlgItemMsg(hwnd,
766 CMD_LISTBOX,
767 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
768 WinSendDlgItemMsg(hwnd,
769 CMD_LISTBOX,
770 LM_SELECTITEM,
771 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
772 }
773 save_commands();
774 }
775 }
776 break;
777 case CMD_REPLACE:
778 {
779 CHAR temp[34];
780
781 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
782 bstrip(temp);
783 if (kill_command(temp))
784 {
785 x = (SHORT) WinSendDlgItemMsg(hwnd,
786 CMD_LISTBOX,
787 LM_QUERYSELECTION,
788 MPFROMSHORT(LIT_FIRST), MPVOID);
789 if (x >= 0) {
790 WinSendDlgItemMsg(hwnd,
791 CMD_LISTBOX,
792 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
793 WinSendDlgItemMsg(hwnd,
794 CMD_LISTBOX,
795 LM_SELECTITEM,
796 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
797 }
798 save_commands();
799 }
800 }
801 {
802 COMMAND temp;
803
804 memset(&temp, 0, sizeof(COMMAND));
805 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
806 bstrip(temp.cl);
807 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
808 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
809 temp.flags = 0;
810 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
811 temp.flags = FULLSCREEN;
812 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
813 temp.flags = MINIMIZED;
814 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
815 temp.flags = MAXIMIZED;
816 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
817 temp.flags = INVISIBLE;
818 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
819 temp.flags |= KEEP;
820 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
821 temp.flags |= PROMPT;
822 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
823 temp.flags |= ONCE;
824 info = add_command(&temp);
825 if (!info) {
826 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
827 GetPString(IDS_CANTADDCOMMANDTEXT),
828 temp.title);
829 }
830 else {
831 CHAR env[1002];
832
833 *env = 0;
834 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
835 bstripcr(env);
836 if (*env) {
837 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
838 }
839 x = (SHORT) WinSendDlgItemMsg(hwnd,
840 CMD_LISTBOX,
841 LM_INSERTITEM,
842 MPFROM2SHORT(LIT_END, 0),
843 MPFROMP(temp.title));
844 if (x >= 0) {
845 WinSendDlgItemMsg(hwnd,
846 CMD_LISTBOX,
847 LM_SETITEMHANDLE,
848 MPFROMSHORT(x), MPFROMP(info));
849 WinSendDlgItemMsg(hwnd,
850 CMD_LISTBOX,
851 LM_SELECTITEM,
852 MPFROMSHORT(x), MPFROMSHORT(TRUE));
853 save_commands();
854 }
855 }
856 }
857 break;
858 }
859 return 0;
860 }
861 return WinDefDlgProc(hwnd, msg, mp1, mp2);
862}
863
864VOID RunCommand(HWND hwnd, INT cx)
865{
866 INT x;
867 CHAR **list;
868 LINKCMDS *info;
869
870 list = BuildList(hwnd);
871 if (!list || !list[0])
872 return;
873 x = 0;
874 info = cmdhead;
875 while (info) {
876 x++;
877 if (x == cx)
878 break;
879 info = info->next;
880 }
881 if (info) {
882
883 INT flags;
884
885 x--;
886 flags = info->flags;
887 if (!(flags & FULLSCREEN))
888 flags |= WINDOWED;
889 if (flags & KEEP)
890 flags |= SEPARATEKEEP;
891 else
892 flags |= SEPARATE;
893 flags &= ~(KEEP | DIEAFTER);
894 if ((flags & ONCE) && list && list[0]) {
895
896 CHAR *fakelist[2];
897 INT cntr;
898
899 flags &= (~ONCE);
900 for (cntr = 0; list[cntr]; cntr++) {
901 *fakelist = list[cntr];
902 fakelist[1] = NULL;
903 ExecOnList(hwnd,
904 info->cl,
905 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT));
906 }
907 }
908 else
909 ExecOnList(hwnd,
910 info->cl,
911 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT));
912 }
913 FreeList(list);
914 DosPostEventSem(CompactSem);
915}
916
917VOID EditCommands(HWND hwnd)
918{
919 static CHAR stop = 0;
920
921 if (stop)
922 return;
923 stop++;
924 if (!cmdloaded)
925 load_commands();
926 WinDlgBox(HWND_DESKTOP,
927 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
928 stop = 0;
929}
Note: See TracBrowser for help on using the repository browser.