source: trunk/dll/command.c@ 793

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

Move #pragma alloc_text to end for OpenWatcom compat

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 23.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: command.c 793 2007-08-21 02:53:38Z 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];
564
565 *filename = 0;
566 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
567 strcat(filename, " %a");
568 WinSetDlgItemText(hwnd, CMD_CL, filename);
569 }
570 }
571 break;
572
573 case CMD_REORDER:
574 if (!cmdhead || !cmdhead->next) {
575 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
576 break;
577 }
578 if (WinDlgBox(HWND_DESKTOP, hwnd, ReOrderProc, FM3ModHandle,
579 RE_FRAME, MPVOID)) {
580 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
581 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
582 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
583 info = cmdhead;
584 while (info) {
585 x = (SHORT) WinSendDlgItemMsg(hwnd,
586 CMD_LISTBOX,
587 LM_INSERTITEM,
588 MPFROM2SHORT(LIT_END, 0),
589 MPFROMP(info->title));
590 if (x >= 0)
591 WinSendDlgItemMsg(hwnd,
592 CMD_LISTBOX,
593 LM_SETITEMHANDLE,
594 MPFROMSHORT(x), MPFROMP(info));
595 info = info->next;
596 }
597 WinSendDlgItemMsg(hwnd,
598 CMD_LISTBOX,
599 LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
600 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
601 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
602 WinCheckButton(hwnd, CMD_ONCE, FALSE);
603 save_commands();
604 }
605 break;
606
607 case DID_OK:
608 {
609 x = (SHORT) WinSendDlgItemMsg(hwnd,
610 CMD_LISTBOX,
611 LM_QUERYSELECTION, MPVOID, MPVOID);
612 if (x == LIT_NONE)
613 x = (SHORT) WinSendDlgItemMsg(hwnd,
614 CMD_LISTBOX,
615 LM_SELECTITEM,
616 MPFROMSHORT(0), MPFROMSHORT(TRUE));
617 }
618 {
619 COMMAND temp;
620
621 memset(&temp, 0, sizeof(COMMAND));
622 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
623 bstrip(temp.cl);
624 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
625 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
626 temp.flags = 0;
627 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
628 temp.flags = FULLSCREEN;
629 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
630 temp.flags = MINIMIZED;
631 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
632 temp.flags = MAXIMIZED;
633 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
634 temp.flags = INVISIBLE;
635 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
636 temp.flags |= KEEP;
637 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
638 temp.flags |= PROMPT;
639 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
640 temp.flags |= ONCE;
641 info = add_command(&temp);
642 if (!info)
643 {
644 WinDismissDlg(hwnd, 0);
645 /*saymsg(MB_ENTER, hwnd,
646 GetPString(IDS_ERRORTEXT),
647 GetPString(IDS_CANTADDCOMMANDTEXT),
648 temp.title);*/
649 }
650 else {
651 CHAR env[1002];
652
653 *env = 0;
654 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
655 bstripcr(env);
656 if (*env) {
657 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
658 }
659 x = (SHORT) WinSendDlgItemMsg(hwnd,
660 CMD_LISTBOX,
661 LM_INSERTITEM,
662 MPFROM2SHORT(LIT_END, 0),
663 MPFROMP(temp.title));
664 if (x >= 0) {
665 WinSendDlgItemMsg(hwnd,
666 CMD_LISTBOX,
667 LM_SETITEMHANDLE,
668 MPFROMSHORT(x), MPFROMP(info));
669 WinSendDlgItemMsg(hwnd,
670 CMD_LISTBOX,
671 LM_SELECTITEM,
672 MPFROMSHORT(x), MPFROMSHORT(TRUE));
673 save_commands();
674 }
675 }
676 }
677 x = (SHORT) WinSendDlgItemMsg(hwnd,
678 CMD_LISTBOX,
679 LM_QUERYSELECTION,
680 MPFROMSHORT(LIT_FIRST), MPVOID);
681 WinDismissDlg(hwnd, 0);
682 break;
683
684 case DID_CANCEL:
685 WinDismissDlg(hwnd, 0);
686 break;
687
688 case IDM_HELP:
689 if (hwndHelp)
690 WinSendMsg(hwndHelp,
691 HM_DISPLAY_HELP,
692 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
693 break;
694
695 case CMD_ADD:
696 {
697 COMMAND temp;
698
699 memset(&temp, 0, sizeof(COMMAND));
700 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
701 bstrip(temp.cl);
702 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
703 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
704 temp.flags = 0;
705 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
706 temp.flags = FULLSCREEN;
707 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
708 temp.flags = MINIMIZED;
709 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
710 temp.flags = MAXIMIZED;
711 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
712 temp.flags = INVISIBLE;
713 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
714 temp.flags |= KEEP;
715 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
716 temp.flags |= PROMPT;
717 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
718 temp.flags |= ONCE;
719 info = add_command(&temp);
720 if (!info) {
721 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
722 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
723 }
724 else {
725 CHAR env[1002];
726
727 *env = 0;
728 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
729 bstripcr(env);
730 if (*env) {
731 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
732 }
733 x = (SHORT) WinSendDlgItemMsg(hwnd,
734 CMD_LISTBOX,
735 LM_INSERTITEM,
736 MPFROM2SHORT(LIT_END, 0),
737 MPFROMP(temp.title));
738 if (x >= 0) {
739 WinSendDlgItemMsg(hwnd,
740 CMD_LISTBOX,
741 LM_SETITEMHANDLE,
742 MPFROMSHORT(x), MPFROMP(info));
743 WinSendDlgItemMsg(hwnd,
744 CMD_LISTBOX,
745 LM_SELECTITEM,
746 MPFROMSHORT(x), MPFROMSHORT(TRUE));
747 save_commands();
748 }
749 }
750 }
751 break;
752
753 case CMD_DELETE:
754 {
755 CHAR temp[34];
756
757 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
758 bstrip(temp);
759 if (!kill_command(temp))
760 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
761 else {
762 x = (SHORT) WinSendDlgItemMsg(hwnd,
763 CMD_LISTBOX,
764 LM_QUERYSELECTION,
765 MPFROMSHORT(LIT_FIRST), MPVOID);
766 if (x >= 0) {
767 WinSendDlgItemMsg(hwnd,
768 CMD_LISTBOX,
769 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
770 WinSendDlgItemMsg(hwnd,
771 CMD_LISTBOX,
772 LM_SELECTITEM,
773 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
774 }
775 save_commands();
776 }
777 }
778 break;
779 case CMD_REPLACE:
780 {
781 CHAR temp[34];
782 y = (SHORT) WinSendDlgItemMsg(hwnd,
783 CMD_LISTBOX,
784 LM_QUERYSELECTION,
785 MPFROMSHORT(LIT_CURSOR), MPVOID);
786 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
787 bstrip(temp);
788 if (kill_command(temp))
789 {
790 x = (SHORT) WinSendDlgItemMsg(hwnd,
791 CMD_LISTBOX,
792 LM_QUERYSELECTION,
793 MPFROMSHORT(LIT_FIRST), MPVOID);
794 if (x >= 0) {
795 WinSendDlgItemMsg(hwnd,
796 CMD_LISTBOX,
797 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
798 WinSendDlgItemMsg(hwnd,
799 CMD_LISTBOX,
800 LM_SELECTITEM,
801 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
802 }
803 save_commands();
804 }
805 }
806 {
807 COMMAND temp;
808
809 memset(&temp, 0, sizeof(COMMAND));
810 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
811 bstrip(temp.cl);
812 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
813 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
814 temp.flags = 0;
815 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
816 temp.flags = FULLSCREEN;
817 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
818 temp.flags = MINIMIZED;
819 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
820 temp.flags = MAXIMIZED;
821 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
822 temp.flags = INVISIBLE;
823 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
824 temp.flags |= KEEP;
825 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
826 temp.flags |= PROMPT;
827 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
828 temp.flags |= ONCE;
829 info = add_command(&temp);
830 if (!info) {
831 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
832 GetPString(IDS_CANTADDCOMMANDTEXT),
833 temp.title);
834 }
835 else {
836 CHAR env[1002];
837
838 *env = 0;
839 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
840 bstripcr(env);
841 if (*env) {
842 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
843 }
844 x = (SHORT) WinSendDlgItemMsg(hwnd,
845 CMD_LISTBOX,
846 LM_INSERTITEM,
847 MPFROM2SHORT(y, 0),
848 MPFROMP(temp.title));
849 if (x >= 0) {
850 WinSendDlgItemMsg(hwnd,
851 CMD_LISTBOX,
852 LM_SETITEMHANDLE,
853 MPFROMSHORT(x), MPFROMP(info));
854 WinSendDlgItemMsg(hwnd,
855 CMD_LISTBOX,
856 LM_SELECTITEM,
857 MPFROMSHORT(x), MPFROMSHORT(TRUE));
858 {
859 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
860 SHORT sSelect, numitems;
861
862 sSelect = 0;
863 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
864 LM_QUERYITEMCOUNT,
865 MPVOID, MPVOID);
866 while (numitems) {
867 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
868 LM_QUERYITEMHANDLE,
869 MPFROMSHORT(sSelect++),
870 MPVOID);
871 if (info) {
872 if (!temphead) {
873 temphead = info;
874 info->prev = NULL;
875 }
876 else {
877 last->next = info;
878 info->prev = last;
879 }
880 temptail = info;
881 last = info;
882 info->next = NULL;
883 }
884 numitems--;
885 }
886 }
887 save_commands();
888 }
889 }
890 }
891 break;
892 }
893 return 0;
894 }
895 return WinDefDlgProc(hwnd, msg, mp1, mp2);
896}
897
898VOID RunCommand(HWND hwnd, INT cx)
899{
900 INT x;
901 CHAR **list;
902 LINKCMDS *info;
903
904 list = BuildList(hwnd);
905 if (!list || !list[0])
906 return;
907 x = 0;
908 info = cmdhead;
909 while (info) {
910 x++;
911 if (x == cx)
912 break;
913 info = info->next;
914 }
915 if (info) {
916
917 INT flags;
918
919 x--;
920 flags = info->flags;
921 if (!(flags & FULLSCREEN))
922 flags |= WINDOWED;
923 if (flags & KEEP)
924 flags |= SEPARATEKEEP;
925 else
926 flags |= SEPARATE;
927 flags &= ~(KEEP | DIEAFTER);
928 if ((flags & ONCE) && list && list[0]) {
929
930 CHAR *fakelist[2];
931 INT cntr;
932
933 flags &= (~ONCE);
934 for (cntr = 0; list[cntr]; cntr++) {
935 *fakelist = list[cntr];
936 fakelist[1] = NULL;
937 ExecOnList(hwnd,
938 info->cl,
939 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT));
940 }
941 }
942 else
943 ExecOnList(hwnd,
944 info->cl,
945 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT));
946 }
947 FreeList(list);
948 DosPostEventSem(CompactSem);
949}
950
951VOID EditCommands(HWND hwnd)
952{
953 static CHAR stop = 0;
954
955 if (stop)
956 return;
957 stop++;
958 if (!cmdloaded)
959 load_commands();
960 WinDlgBox(HWND_DESKTOP,
961 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
962 stop = 0;
963}
964
965#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
966#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.