source: trunk/dll/command.c@ 927

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

Free pszWorkBuf memory for NormalizeCmdLine calls. Add comments for ticket 161 fix.

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