source: trunk/dll/command.c@ 551

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

Indentation cleanup

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