source: trunk/dll/command.c@ 1345

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

Code cleanup address some fixmes in command.c; lengthen the command title field

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