source: trunk/dll/command.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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