source: trunk/dll/command.c@ 959

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

Use xfree where appropriate. Check that buffer exists following all xmallocs. Stopped at eas.c with xfree checking. One remaining xmalloc without test in dirsize.c

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 26.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: command.c 959 2008-02-18 00:47:31Z 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 xfree(info->title);
308 xfree(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 xfree(info->cl);
356 xfree(info->title);
357 free(info);
358 break;
359 }
360 if (!cmdhead)
361 cmdhead = info;
362 else {
363 cmdtail->next = info;
364 info->prev = cmdtail;
365 }
366 cmdtail = info;
367 }
368 }
369 fclose(fp);
370 }
371}
372
373VOID save_commands(VOID)
374{
375 LINKCMDS *info;
376 FILE *fp;
377 CHAR s[CCHMAXPATH + 14];
378
379 if (!cmdloaded || !cmdhead)
380 return;
381 info = cmdhead;
382 save_dir2(s);
383 if (s[strlen(s) - 1] != '\\')
384 strcat(s, "\\");
385 strcat(s, "COMMANDS.DAT");
386 fp = xfopen(s, "w", pszSrcFile, __LINE__);
387 if (fp) {
388 fputs(GetPString(IDS_COMMANDFILETEXT), fp);
389 info = cmdhead;
390 while (info) {
391 fprintf(fp,
392 ";\n%0.34s\n%0.1000s\n%lu\n",
393 info->title, info->cl, info->flags);
394 info = info->next;
395 }
396 fclose(fp);
397 }
398}
399
400//== add_command() Add command to list ==
401
402LINKCMDS *add_command(COMMAND * addme)
403{
404 LINKCMDS *info;
405
406 if (!addme || !*addme->cl || !*addme->title)
407 return NULL; // No data
408 info = cmdhead;
409 while (info) {
410 if (!stricmp(info->title, addme->title))
411 return NULL; // Got a dup
412 info = info->next;
413 }
414 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
415 if (!info)
416 return NULL;
417 info->cl = xstrdup(addme->cl, pszSrcFile, __LINE__);
418 info->title = xstrdup(addme->title, pszSrcFile, __LINE__);
419 if (addme->flags)
420 info->flags = addme->flags;
421 if (!info->cl || !info->title) {
422 xfree(info->cl);
423 xfree(info->title);
424 free(info);
425 return NULL;
426 }
427 if (!cmdhead) /* only item in list */
428 cmdhead = cmdtail = info;
429 else {
430 /* place at tail */
431 cmdtail->next = info;
432 info->prev = cmdtail;
433 cmdtail = info;
434 }
435 return info;
436}
437
438BOOL kill_command(CHAR * killme)
439{
440 LINKCMDS *info;
441
442 if (killme && *killme) {
443 info = cmdhead;
444 while (info) {
445 if (!stricmp(info->title, killme)) {
446 if (info == cmdhead) {
447 cmdhead = info->next;
448 if (info == cmdtail)
449 cmdtail = info->prev;
450 }
451 else {
452 if (info->next)
453 (info->next)->prev = info->prev;
454 if (info->prev)
455 (info->prev)->next = info->next;
456 if (info == cmdtail)
457 cmdtail = info->prev;
458 }
459 xfree(info->cl);
460 xfree(info->title);
461 free(info);
462 return TRUE;
463 }
464 info = info->next;
465 }
466 }
467 return FALSE;
468}
469
470MRESULT EXPENTRY CommandDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
471{
472 SHORT x, y;
473 LINKCMDS *info;
474
475 switch (msg) {
476 case WM_INITDLG:
477 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
478 WinSendDlgItemMsg(hwnd, CMD_CL, EM_SETTEXTLIMIT,
479 MPFROM2SHORT(1000, 0), MPVOID);
480 WinSendDlgItemMsg(hwnd, CMD_TITLE, EM_SETTEXTLIMIT,
481 MPFROM2SHORT(33, 0), MPVOID);
482 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
483 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
484 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
485 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
486 WinCheckButton(hwnd, CMD_ONCE, FALSE);
487 info = cmdhead;
488 while (info) {
489 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_INSERTITEM,
490 MPFROM2SHORT(LIT_END, 0),
491 MPFROMP(info->title));
492 if (x >= 0)
493 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SETITEMHANDLE,
494 MPFROMSHORT(x), MPFROMP(info));
495 info = info->next;
496 }
497 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SELECTITEM,
498 MPFROMSHORT(0), MPFROMSHORT(TRUE));
499 {
500 PFNWP oldproc;
501
502 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, CMD_CL),
503 (PFNWP) CommandTextProc);
504 if (oldproc)
505 WinSetWindowPtr(WinWindowFromID(hwnd, CMD_CL), QWL_USER, (PVOID) oldproc);
506 }
507 break;
508
509 case WM_CONTROL:
510 if (SHORT1FROMMP(mp1) == CMD_LISTBOX) {
511 switch (SHORT2FROMMP(mp1)) {
512 case LN_ENTER:
513 case LN_SELECT:
514 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
515 LM_QUERYSELECTION,
516 MPFROMSHORT(LIT_FIRST), MPVOID);
517 if (x >= 0) {
518 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
519 LM_QUERYITEMHANDLE,
520 MPFROMSHORT(x), MPVOID);
521 if (!info) {
522 Runtime_Error(pszSrcFile, __LINE__, "LM_QUERYITEMHANDLE");
523 break;
524 }
525 WinSetDlgItemText(hwnd, CMD_CL, info->cl);
526 if (!(info->flags & 1023))
527 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
528 else {
529 if (info->flags & FULLSCREEN)
530 WinCheckButton(hwnd, CMD_FULLSCREEN, TRUE);
531 else if (info->flags & MINIMIZED)
532 WinCheckButton(hwnd, CMD_MINIMIZED, TRUE);
533 else if (info->flags & MAXIMIZED)
534 WinCheckButton(hwnd, CMD_MAXIMIZED, TRUE);
535 else if (info->flags & INVISIBLE)
536 WinCheckButton(hwnd, CMD_INVISIBLE, TRUE);
537 }
538 WinCheckButton(hwnd, CMD_PROMPT, ((info->flags & PROMPT) != 0));
539 WinCheckButton(hwnd, CMD_KEEP, ((info->flags & KEEP) != 0));
540 WinCheckButton(hwnd, CMD_ONCE, ((info->flags & ONCE) != 0));
541 WinSetDlgItemText(hwnd, CMD_TITLE, info->title);
542 {
543 CHAR env[1002];
544 ULONG size;
545
546 *env = 0;
547 size = sizeof(env) - 1;
548 if (PrfQueryProfileData(fmprof, FM3Str, info->cl, env, &size) &&
549 *env)
550 WinSetDlgItemText(hwnd, CMD_ENVIRON, env);
551 else
552 WinSetDlgItemText(hwnd, CMD_ENVIRON, NullStr);
553 }
554 }
555 break;
556 }
557 }
558 return 0;
559
560 case WM_COMMAND:
561 switch (SHORT1FROMMP(mp1)) {
562 case CMD_FIND:
563 {
564 CHAR filename[CCHMAXPATH + 9], szfilename[CCHMAXPATH + 9];
565
566 *filename = 0;
567 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
568 BldQuotedFileName(szfilename, filename);
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 PSZ pszWorkBuf;
622 APIRET ret;
623
624 pszWorkBuf = xmalloc(MAXCOMLINESTRG, pszSrcFile, __LINE__);
625 if (!pszWorkBuf)
626 break; //already complained
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 if (!pszWorkBuf)
724 break; //already complained
725 memset(&temp, 0, sizeof(COMMAND));
726 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
727 NormalizeCmdLine(pszWorkBuf, temp.cl);
728 memcpy(temp.cl, pszWorkBuf, strlen(pszWorkBuf) + 1);
729 xfree(pszWorkBuf);
730 if (!strchr(temp.cl, '%')){
731 ret = saymsg(MB_YESNO,
732 HWND_DESKTOP,
733 NullStr,
734 GetPString(IDS_TOACTONSELECTEDTEXT));
735 if (ret == MBID_YES)
736 strcat(temp.cl, " %a");
737 }
738 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
739 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
740 temp.flags = 0;
741 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
742 temp.flags = FULLSCREEN;
743 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
744 temp.flags = MINIMIZED;
745 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
746 temp.flags = MAXIMIZED;
747 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
748 temp.flags = INVISIBLE;
749 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
750 temp.flags |= KEEP;
751 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
752 temp.flags |= PROMPT;
753 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
754 temp.flags |= ONCE;
755 if (fCancelAction){
756 fCancelAction = FALSE;
757 break;
758 }
759 else
760 info = add_command(&temp);
761 if (!info) {
762 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
763 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
764 }
765 else {
766 CHAR env[1002];
767
768 *env = 0;
769 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
770 bstripcr(env);
771 if (*env) {
772 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
773 }
774 x = (SHORT) WinSendDlgItemMsg(hwnd,
775 CMD_LISTBOX,
776 LM_INSERTITEM,
777 MPFROM2SHORT(LIT_END, 0),
778 MPFROMP(temp.title));
779 if (x >= 0) {
780 WinSendDlgItemMsg(hwnd,
781 CMD_LISTBOX,
782 LM_SETITEMHANDLE,
783 MPFROMSHORT(x), MPFROMP(info));
784 WinSendDlgItemMsg(hwnd,
785 CMD_LISTBOX,
786 LM_SELECTITEM,
787 MPFROMSHORT(x), MPFROMSHORT(TRUE));
788 save_commands();
789 }
790 }
791 }
792 break;
793
794 case CMD_DELETE:
795 {
796 CHAR temp[34];
797
798 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
799 bstrip(temp);
800 if (!kill_command(temp))
801 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
802 else {
803 x = (SHORT) WinSendDlgItemMsg(hwnd,
804 CMD_LISTBOX,
805 LM_QUERYSELECTION,
806 MPFROMSHORT(LIT_FIRST), MPVOID);
807 if (x >= 0) {
808 WinSendDlgItemMsg(hwnd,
809 CMD_LISTBOX,
810 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
811 WinSendDlgItemMsg(hwnd,
812 CMD_LISTBOX,
813 LM_SELECTITEM,
814 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
815 }
816 save_commands();
817 }
818 }
819 break;
820 case CMD_REPLACE:
821 { //Delete first
822 PSZ pszWorkBuf;
823 COMMAND temp;
824 APIRET ret;
825
826 pszWorkBuf = xmalloc(MAXCOMLINESTRG, pszSrcFile, __LINE__);
827 if (!pszWorkBuf)
828 break; //already complained
829 memset(&temp, 0, sizeof(COMMAND));
830 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
831 NormalizeCmdLine(pszWorkBuf, temp.cl);
832 memcpy(temp.cl, pszWorkBuf, strlen(pszWorkBuf) + 1);
833 xfree(pszWorkBuf);
834 if (fCancelAction){
835 fCancelAction = FALSE;
836 break;
837 }
838 if (!strchr(temp.cl, '%')){
839 ret = saymsg(MB_YESNO,
840 HWND_DESKTOP,
841 NullStr,
842 GetPString(IDS_TOACTONSELECTEDTEXT));
843 if (ret == MBID_YES)
844 strcat(temp.cl, " %a");
845 }
846 //remember item location in the list
847 y = (SHORT) WinSendDlgItemMsg(hwnd,
848 CMD_LISTBOX,
849 LM_QUERYSELECTION,
850 MPFROMSHORT(LIT_CURSOR), MPVOID);
851 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
852 bstrip(temp.title);
853 if (kill_command(temp.title)){
854 x = (SHORT) WinSendDlgItemMsg(hwnd,
855 CMD_LISTBOX,
856 LM_QUERYSELECTION,
857 MPFROMSHORT(LIT_FIRST), MPVOID);
858 if (x >= 0) {
859 WinSendDlgItemMsg(hwnd,
860 CMD_LISTBOX,
861 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
862 WinSendDlgItemMsg(hwnd,
863 CMD_LISTBOX,
864 LM_SELECTITEM,
865 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
866 }
867 } // then do an add
868 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
869 temp.flags = 0;
870 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
871 temp.flags = FULLSCREEN;
872 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
873 temp.flags = MINIMIZED;
874 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
875 temp.flags = MAXIMIZED;
876 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
877 temp.flags = INVISIBLE;
878 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
879 temp.flags |= KEEP;
880 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
881 temp.flags |= PROMPT;
882 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
883 temp.flags |= ONCE;
884 info = add_command(&temp);
885 if (!info) {
886 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
887 GetPString(IDS_CANTADDCOMMANDTEXT),
888 temp.title);
889 }
890
891 else {
892 CHAR env[1002];
893
894 *env = 0;
895 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
896 bstripcr(env);
897 if (*env) {
898 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
899 } //put item back in original place
900 x = (SHORT) WinSendDlgItemMsg(hwnd,
901 CMD_LISTBOX,
902 LM_INSERTITEM,
903 MPFROM2SHORT(y, 0),
904 MPFROMP(temp.title));
905 if (x >= 0) {
906 LINKCMDS *temphead = NULL,*last = NULL, *temptail = NULL;
907 SHORT numitems, sSelect = 0;
908
909 WinSendDlgItemMsg(hwnd,
910 CMD_LISTBOX,
911 LM_SETITEMHANDLE,
912 MPFROMSHORT(x), MPFROMP(info));
913 WinSendDlgItemMsg(hwnd,
914 CMD_LISTBOX,
915 LM_SELECTITEM,
916 MPFROMSHORT(x), MPFROMSHORT(TRUE));
917 //then reorder
918 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
919 LM_QUERYITEMCOUNT,
920 MPVOID, MPVOID);
921
922 while (numitems) {
923
924
925 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
926 LM_QUERYITEMHANDLE,
927 MPFROMSHORT(sSelect++),
928 MPVOID);
929 if (info) {
930 if (!temphead) {
931 temphead = info;
932 info->prev = NULL;
933 }
934 else {
935 last->next = info;
936 info->prev = last;
937 }
938 temptail = info;
939 last = info;
940 info->next = NULL;
941 }
942 numitems--;
943 }
944 cmdhead = temphead;
945 cmdtail = temptail;
946 save_commands();
947 }
948 }
949 }
950 break;
951 }
952 return 0;
953 }
954 return WinDefDlgProc(hwnd, msg, mp1, mp2);
955}
956
957VOID RunCommand(HWND hwnd, INT cx)
958{
959 INT x;
960 CHAR **list;
961 LINKCMDS *info;
962
963 list = BuildList(hwnd);
964 if (!list || !list[0])
965 return;
966 x = 0;
967 info = cmdhead;
968 while (info) {
969 x++;
970 if (x == cx)
971 break;
972 info = info->next;
973 }
974 if (info) {
975
976 INT flags;
977
978 x--;
979 flags = info->flags;
980 if (!(flags & FULLSCREEN))
981 flags |= WINDOWED;
982 if (flags & KEEP)
983 flags |= SEPARATEKEEP;
984 else
985 flags |= SEPARATE;
986 flags &= ~(KEEP | DIEAFTER);
987 if ((flags & ONCE) && list && list[0]) {
988
989 CHAR *fakelist[2];
990 INT cntr;
991
992 flags &= (~ONCE);
993 for (cntr = 0; list[cntr]; cntr++) {
994 *fakelist = list[cntr];
995 fakelist[1] = NULL;
996 ExecOnList(hwnd,
997 info->cl,
998 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
999 pszSrcFile, __LINE__);
1000 }
1001 }
1002 else
1003 ExecOnList(hwnd,
1004 info->cl,
1005 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT),
1006 pszSrcFile, __LINE__);
1007 }
1008 FreeList(list);
1009 DosPostEventSem(CompactSem);
1010}
1011
1012VOID EditCommands(HWND hwnd)
1013{
1014 static CHAR stop = 0;
1015
1016 if (stop)
1017 return;
1018 stop++;
1019 if (!cmdloaded)
1020 load_commands();
1021 WinDlgBox(HWND_DESKTOP,
1022 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
1023 stop = 0;
1024}
1025
1026#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
1027#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.