source: trunk/dll/command.c@ 888

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

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

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