source: trunk/dll/command.c@ 1078

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

More Fortify infrastructure enhancements
Rework Fortify_SetOwner
Add Fortify_BecomeOwner
Avoid more spurious leak reports

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