source: trunk/dll/command.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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