source: trunk/dll/command.c@ 1082

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

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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