source: trunk/dll/command.c@ 1247

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

Fix issues with NormalizeCmdLine; it now uses searchapath to check for nonexe files in the path, it tries all 5 defined executible extensions when no exetension is provided, it closes dosfind, eliminates extra error message on failure to find extensionless file in commands, improved error message for extensionless file.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: command.c 1247 2008-10-15 13:44:29Z 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[34];
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[72];
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[34] = 0; // fixme to know why chopped this way?
361 bstripcr(title);
362 if (!*title || *title == ';')
363 continue;
364 if (!xfgets(pszCmdLine, MaxComLineStrg, fp, pszSrcFile, __LINE__))
365 break; /* error! */
366 if (!xfgets(flags, 72, fp, pszSrcFile, __LINE__))
367 break; /* error! */
368 pszCmdLine[MaxComLineStrg - 1] = 0; // fixme to know why chopped this way?
369 bstripcr(pszCmdLine);
370 flags[34] = 0;
371 bstripcr(flags);
372 if (!pszCmdLine)
373 continue;
374 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
375 if (info) {
376# ifdef FORTIFY
377 Fortify_SetOwner(info, 1);
378 Fortify_SetScope(info, 1);
379# endif
380 info->pszCmdLine = xstrdup(pszCmdLine, pszSrcFile, __LINE__);
381 info->title = xstrdup(title, pszSrcFile, __LINE__);
382 info->flags = atol(flags);
383 if (!info->pszCmdLine || !info->title) {
384 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
385 xfree(info->title, pszSrcFile, __LINE__);
386 free(info);
387 break;
388 }
389# ifdef FORTIFY
390 Fortify_SetOwner(info->pszCmdLine, 1);
391 Fortify_SetScope(info->pszCmdLine, 1);
392 Fortify_SetOwner(info->title, 1);
393 Fortify_SetScope(info->title, 1);
394# endif
395 if (!cmdhead)
396 cmdhead = info;
397 else {
398 cmdtail->next = info;
399 info->prev = cmdtail;
400 }
401 cmdtail = info;
402 }
403 }
404 free(pszCmdLine);
405 fclose(fp);
406 }
407 }
408}
409
410VOID save_commands(VOID)
411{
412 LINKCMDS *info;
413 FILE *fp;
414 CHAR s[CCHMAXPATH + 14];
415
416 if (!cmdloaded || !cmdhead)
417 return;
418 info = cmdhead;
419 BldFullPathName(s, pFM2SaveDirectory, "COMMANDS.DAT");
420 if (CheckDriveSpaceAvail(s, ullDATFileSpaceNeeded, 1) == 2)
421 return; //already gave error msg
422 fp = xfopen(s, "w", pszSrcFile, __LINE__);
423 if (fp) {
424 fputs(GetPString(IDS_COMMANDFILETEXT), fp);
425 info = cmdhead;
426 while (info) {
427 fprintf(fp,
428 ";\n%0.34s\n%0.*s\n%lu\n",
429 info->title, MaxComLineStrg, info->pszCmdLine, info->flags);
430 info = info->next;
431 }
432 fclose(fp);
433 }
434}
435
436//== add_command() Add command to list ==
437
438LINKCMDS *add_command(COMMAND * addme)
439{
440 LINKCMDS *info;
441
442 if (!addme || !*addme->pszCmdLine || !*addme->title)
443 return NULL; // No data
444 info = cmdhead;
445 while (info) {
446 if (!stricmp(info->title, addme->title))
447 return NULL; // Got a dup
448 info = info->next;
449 }
450 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
451 if (!info)
452 return NULL;
453 info->pszCmdLine = xstrdup(addme->pszCmdLine, pszSrcFile, __LINE__);
454 info->title = xstrdup(addme->title, pszSrcFile, __LINE__);
455 if (addme->flags)
456 info->flags = addme->flags;
457 if (!info->pszCmdLine || !info->title) {
458 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
459 xfree(info->title, pszSrcFile, __LINE__);
460 free(info);
461 return NULL;
462 }
463 if (!cmdhead) /* only item in list */
464 cmdhead = cmdtail = info;
465 else {
466 /* place at tail */
467 cmdtail->next = info;
468 info->prev = cmdtail;
469 cmdtail = info;
470 }
471 return info;
472}
473
474BOOL kill_command(CHAR * killme)
475{
476 LINKCMDS *info;
477
478 if (killme && *killme) {
479 info = cmdhead;
480 while (info) {
481 if (!stricmp(info->title, killme)) {
482 if (info == cmdhead) {
483 cmdhead = info->next;
484 if (info == cmdtail)
485 cmdtail = info->prev;
486 }
487 else {
488 if (info->next)
489 (info->next)->prev = info->prev;
490 if (info->prev)
491 (info->prev)->next = info->next;
492 if (info == cmdtail)
493 cmdtail = info->prev;
494 }
495 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
496 xfree(info->title, pszSrcFile, __LINE__);
497 free(info);
498 return TRUE;
499 }
500 info = info->next;
501 }
502 }
503 return FALSE;
504}
505
506MRESULT EXPENTRY CommandDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
507{
508 SHORT x, y;
509 LINKCMDS *info;
510
511 switch (msg) {
512 case WM_INITDLG:
513 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
514 WinSendDlgItemMsg(hwnd, CMD_CL, EM_SETTEXTLIMIT,
515 MPFROM2SHORT(1000, 0), MPVOID);
516 WinSendDlgItemMsg(hwnd, CMD_TITLE, EM_SETTEXTLIMIT,
517 MPFROM2SHORT(33, 0), MPVOID);
518 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
519 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
520 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
521 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
522 WinCheckButton(hwnd, CMD_ONCE, FALSE);
523 info = cmdhead;
524 while (info) {
525 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_INSERTITEM,
526 MPFROM2SHORT(LIT_END, 0),
527 MPFROMP(info->title));
528 if (x >= 0)
529 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SETITEMHANDLE,
530 MPFROMSHORT(x), MPFROMP(info));
531 info = info->next;
532 }
533 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SELECTITEM,
534 MPFROMSHORT(0), MPFROMSHORT(TRUE));
535 {
536 PFNWP oldproc;
537
538 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, CMD_CL),
539 (PFNWP) CommandTextProc);
540 if (oldproc)
541 WinSetWindowPtr(WinWindowFromID(hwnd, CMD_CL), QWL_USER, (PVOID) oldproc);
542 }
543 break;
544
545 case WM_CONTROL:
546 if (SHORT1FROMMP(mp1) == CMD_LISTBOX) {
547 switch (SHORT2FROMMP(mp1)) {
548 case LN_ENTER:
549 case LN_SELECT:
550 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
551 LM_QUERYSELECTION,
552 MPFROMSHORT(LIT_FIRST), MPVOID);
553 if (x >= 0) {
554 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
555 LM_QUERYITEMHANDLE,
556 MPFROMSHORT(x), MPVOID);
557 if (!info) {
558 Runtime_Error(pszSrcFile, __LINE__, "LM_QUERYITEMHANDLE");
559 break;
560 }
561 WinSetDlgItemText(hwnd, CMD_CL, info->pszCmdLine);
562 if (!(info->flags & 1023))
563 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
564 else {
565 if (info->flags & FULLSCREEN)
566 WinCheckButton(hwnd, CMD_FULLSCREEN, TRUE);
567 else if (info->flags & MINIMIZED)
568 WinCheckButton(hwnd, CMD_MINIMIZED, TRUE);
569 else if (info->flags & MAXIMIZED)
570 WinCheckButton(hwnd, CMD_MAXIMIZED, TRUE);
571 else if (info->flags & INVISIBLE)
572 WinCheckButton(hwnd, CMD_INVISIBLE, TRUE);
573 }
574 WinCheckButton(hwnd, CMD_PROMPT, ((info->flags & PROMPT) != 0));
575 WinCheckButton(hwnd, CMD_KEEP, ((info->flags & KEEP) != 0));
576 WinCheckButton(hwnd, CMD_ONCE, ((info->flags & ONCE) != 0));
577 WinSetDlgItemText(hwnd, CMD_TITLE, info->title);
578 {
579 CHAR env[1002];
580 ULONG size;
581
582 *env = 0;
583 size = sizeof(env) - 1;
584 if (PrfQueryProfileData(fmprof, FM3Str, info->pszCmdLine, env, &size) &&
585 *env)
586 WinSetDlgItemText(hwnd, CMD_ENVIRON, env);
587 else
588 WinSetDlgItemText(hwnd, CMD_ENVIRON, NullStr);
589 }
590 }
591 break;
592 }
593 }
594 return 0;
595
596 case WM_COMMAND:
597 switch (SHORT1FROMMP(mp1)) {
598 case CMD_FIND:
599 {
600 CHAR filename[CCHMAXPATH + 9], szfilename[CCHMAXPATH + 9];
601
602 *filename = 0;
603 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
604 BldQuotedFileName(szfilename, filename);
605 WinSetDlgItemText(hwnd, CMD_CL, szfilename);
606 }
607 }
608 break;
609
610 case CMD_REORDER:
611 if (!cmdhead || !cmdhead->next) {
612 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
613 break;
614 }
615 if (WinDlgBox(HWND_DESKTOP, hwnd, ReOrderProc, FM3ModHandle,
616 RE_FRAME, MPVOID)) {
617 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
618 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
619 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
620 info = cmdhead;
621 while (info) {
622 x = (SHORT) WinSendDlgItemMsg(hwnd,
623 CMD_LISTBOX,
624 LM_INSERTITEM,
625 MPFROM2SHORT(LIT_END, 0),
626 MPFROMP(info->title));
627 if (x >= 0)
628 WinSendDlgItemMsg(hwnd,
629 CMD_LISTBOX,
630 LM_SETITEMHANDLE,
631 MPFROMSHORT(x), MPFROMP(info));
632 info = info->next;
633 }
634 WinSendDlgItemMsg(hwnd,
635 CMD_LISTBOX,
636 LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
637 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
638 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
639 WinCheckButton(hwnd, CMD_ONCE, FALSE);
640 save_commands();
641 }
642 break;
643
644 case DID_OK:
645 {
646 x = (SHORT) WinSendDlgItemMsg(hwnd,
647 CMD_LISTBOX,
648 LM_QUERYSELECTION, MPVOID, MPVOID);
649 if (x == LIT_NONE)
650 x = (SHORT) WinSendDlgItemMsg(hwnd,
651 CMD_LISTBOX,
652 LM_SELECTITEM,
653 MPFROMSHORT(0), MPFROMSHORT(TRUE));
654 }
655 {
656 COMMAND temp;
657 PSZ pszWorkBuf;
658 APIRET ret;
659
660 memset(&temp, 0, sizeof(COMMAND));
661 temp.pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
662 if (!temp.pszCmdLine)
663 break; //already complained
664 pszWorkBuf = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
665 if (!pszWorkBuf) {
666 free(temp.pszCmdLine);
667 break; //already complained
668 }
669 WinQueryDlgItemText(hwnd, CMD_CL, MaxComLineStrg, temp.pszCmdLine);
670 NormalizeCmdLine(pszWorkBuf, temp.pszCmdLine);
671 memcpy(temp.pszCmdLine, pszWorkBuf, strlen(pszWorkBuf) + 1);
672 free(pszWorkBuf);
673 if (!strchr(temp.pszCmdLine, '%') && !fCancelAction){
674 ret = saymsg(MB_YESNO,
675 HWND_DESKTOP,
676 NullStr,
677 GetPString(IDS_TOACTONSELECTEDTEXT));
678 if (ret == MBID_YES)
679 strcat(temp.pszCmdLine, " %a");
680 }
681 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
682 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
683 temp.flags = 0;
684 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
685 temp.flags = FULLSCREEN;
686 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
687 temp.flags = MINIMIZED;
688 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
689 temp.flags = MAXIMIZED;
690 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
691 temp.flags = INVISIBLE;
692 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
693 temp.flags |= KEEP;
694 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
695 temp.flags |= PROMPT;
696 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
697 temp.flags |= ONCE;
698 if (fCancelAction){
699 fCancelAction = FALSE;
700 free(temp.pszCmdLine);
701 break;
702 }
703 else
704 info = add_command(&temp);
705 if (!info)
706 {
707 WinDismissDlg(hwnd, 0);
708 /*saymsg(MB_ENTER, hwnd,
709 GetPString(IDS_ERRORTEXT),
710 GetPString(IDS_CANTADDCOMMANDTEXT),
711 temp.title);*/
712 }
713 else {
714 CHAR env[1002];
715
716 *env = 0;
717 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
718 bstripcr(env);
719 if (*env) {
720 PrfWriteProfileString(fmprof, FM3Str, temp.pszCmdLine, env);
721 }
722 x = (SHORT) WinSendDlgItemMsg(hwnd,
723 CMD_LISTBOX,
724 LM_INSERTITEM,
725 MPFROM2SHORT(LIT_END, 0),
726 MPFROMP(temp.title));
727 if (x >= 0) {
728 WinSendDlgItemMsg(hwnd,
729 CMD_LISTBOX,
730 LM_SETITEMHANDLE,
731 MPFROMSHORT(x), MPFROMP(info));
732 WinSendDlgItemMsg(hwnd,
733 CMD_LISTBOX,
734 LM_SELECTITEM,
735 MPFROMSHORT(x), MPFROMSHORT(TRUE));
736 save_commands();
737 }
738 }
739 free(temp.pszCmdLine);
740 }
741 x = (SHORT) WinSendDlgItemMsg(hwnd,
742 CMD_LISTBOX,
743 LM_QUERYSELECTION,
744 MPFROMSHORT(LIT_FIRST), MPVOID);
745 WinDismissDlg(hwnd, 0);
746 break;
747
748 case DID_CANCEL:
749 WinDismissDlg(hwnd, 0);
750 break;
751
752 case IDM_HELP:
753 if (hwndHelp)
754 WinSendMsg(hwndHelp,
755 HM_DISPLAY_HELP,
756 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
757 break;
758
759 case CMD_ADD:
760 {
761 COMMAND temp;
762 PSZ pszWorkBuf;
763 APIRET ret;
764
765 memset(&temp, 0, sizeof(COMMAND));
766 temp.pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
767 if (!temp.pszCmdLine)
768 break; //already complained
769 pszWorkBuf = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
770 if (!pszWorkBuf) {
771 free(temp.pszCmdLine);
772 break; //already complained
773 }
774 WinQueryDlgItemText(hwnd, CMD_CL, MaxComLineStrg, temp.pszCmdLine);
775 NormalizeCmdLine(pszWorkBuf, temp.pszCmdLine);
776 memcpy(temp.pszCmdLine, pszWorkBuf, strlen(pszWorkBuf) + 1);
777 free(pszWorkBuf);
778 if (!strchr(temp.pszCmdLine, '%') && !fCancelAction){
779 ret = saymsg(MB_YESNO,
780 HWND_DESKTOP,
781 NullStr,
782 GetPString(IDS_TOACTONSELECTEDTEXT));
783 if (ret == MBID_YES)
784 strcat(temp.pszCmdLine, " %a");
785 }
786 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
787 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
788 temp.flags = 0;
789 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
790 temp.flags = FULLSCREEN;
791 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
792 temp.flags = MINIMIZED;
793 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
794 temp.flags = MAXIMIZED;
795 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
796 temp.flags = INVISIBLE;
797 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
798 temp.flags |= KEEP;
799 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
800 temp.flags |= PROMPT;
801 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
802 temp.flags |= ONCE;
803 if (fCancelAction){
804 fCancelAction = FALSE;
805 free(temp.pszCmdLine);
806 break;
807 }
808 else
809 info = add_command(&temp);
810 if (!info) {
811 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
812 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
813 }
814 else {
815 CHAR env[1002];
816
817 *env = 0;
818 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
819 bstripcr(env);
820 if (*env) {
821 PrfWriteProfileString(fmprof, FM3Str, temp.pszCmdLine, env);
822 }
823 x = (SHORT) WinSendDlgItemMsg(hwnd,
824 CMD_LISTBOX,
825 LM_INSERTITEM,
826 MPFROM2SHORT(LIT_END, 0),
827 MPFROMP(temp.title));
828 if (x >= 0) {
829 WinSendDlgItemMsg(hwnd,
830 CMD_LISTBOX,
831 LM_SETITEMHANDLE,
832 MPFROMSHORT(x), MPFROMP(info));
833 WinSendDlgItemMsg(hwnd,
834 CMD_LISTBOX,
835 LM_SELECTITEM,
836 MPFROMSHORT(x), MPFROMSHORT(TRUE));
837 save_commands();
838 }
839 }
840 free(temp.pszCmdLine);
841 }
842 break;
843
844 case CMD_DELETE:
845 {
846 CHAR temp[34];
847
848 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
849 bstrip(temp);
850 if (!kill_command(temp))
851 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
852 else {
853 x = (SHORT) WinSendDlgItemMsg(hwnd,
854 CMD_LISTBOX,
855 LM_QUERYSELECTION,
856 MPFROMSHORT(LIT_FIRST), MPVOID);
857 if (x >= 0) {
858 WinSendDlgItemMsg(hwnd,
859 CMD_LISTBOX,
860 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
861 WinSendDlgItemMsg(hwnd,
862 CMD_LISTBOX,
863 LM_SELECTITEM,
864 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
865 }
866 save_commands();
867 }
868 }
869 break;
870
871 case CMD_REPLACE:
872 { //Delete first
873 PSZ pszWorkBuf;
874 COMMAND temp;
875 APIRET ret;
876
877 pszWorkBuf = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
878 if (!pszWorkBuf) {
879 break; //already complained
880 }
881 memset(&temp, 0, sizeof(COMMAND));
882 temp.pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
883 if (!temp.pszCmdLine) {
884 free(pszWorkBuf);
885 break; //already complained
886 }
887 WinQueryDlgItemText(hwnd, CMD_CL, MaxComLineStrg, temp.pszCmdLine);
888 NormalizeCmdLine(pszWorkBuf, temp.pszCmdLine);
889 memcpy(temp.pszCmdLine, pszWorkBuf, strlen(pszWorkBuf) + 1);
890 free(pszWorkBuf);
891 if (fCancelAction){
892 fCancelAction = FALSE;
893 free(temp.pszCmdLine);
894 break;
895 }
896 if (!strchr(temp.pszCmdLine, '%') && !fCancelAction){
897 ret = saymsg(MB_YESNO,
898 HWND_DESKTOP,
899 NullStr,
900 GetPString(IDS_TOACTONSELECTEDTEXT));
901 if (ret == MBID_YES)
902 strcat(temp.pszCmdLine, " %a");
903 }
904 //remember item location in the list
905 y = (SHORT) WinSendDlgItemMsg(hwnd,
906 CMD_LISTBOX,
907 LM_QUERYSELECTION,
908 MPFROMSHORT(LIT_CURSOR), MPVOID);
909 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
910 bstrip(temp.title);
911 if (kill_command(temp.title)){
912 x = (SHORT) WinSendDlgItemMsg(hwnd,
913 CMD_LISTBOX,
914 LM_QUERYSELECTION,
915 MPFROMSHORT(LIT_FIRST), MPVOID);
916 if (x >= 0) {
917 WinSendDlgItemMsg(hwnd,
918 CMD_LISTBOX,
919 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
920 WinSendDlgItemMsg(hwnd,
921 CMD_LISTBOX,
922 LM_SELECTITEM,
923 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
924 }
925 } // then do an add
926 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
927 temp.flags = 0;
928 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
929 temp.flags = FULLSCREEN;
930 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
931 temp.flags = MINIMIZED;
932 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
933 temp.flags = MAXIMIZED;
934 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
935 temp.flags = INVISIBLE;
936 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
937 temp.flags |= KEEP;
938 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
939 temp.flags |= PROMPT;
940 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
941 temp.flags |= ONCE;
942 info = add_command(&temp);
943 if (!info) {
944 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
945 GetPString(IDS_CANTADDCOMMANDTEXT),
946 temp.title);
947 }
948
949 else {
950 CHAR env[1002];
951
952 *env = 0;
953 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
954 bstripcr(env);
955 if (*env) {
956 PrfWriteProfileString(fmprof, FM3Str, temp.pszCmdLine, env);
957 } //put item back in original place
958 x = (SHORT) WinSendDlgItemMsg(hwnd,
959 CMD_LISTBOX,
960 LM_INSERTITEM,
961 MPFROM2SHORT(y, 0),
962 MPFROMP(temp.title));
963 if (x >= 0) {
964 LINKCMDS *temphead = NULL,*last = NULL, *temptail = NULL;
965 SHORT numitems, sSelect = 0;
966
967 WinSendDlgItemMsg(hwnd,
968 CMD_LISTBOX,
969 LM_SETITEMHANDLE,
970 MPFROMSHORT(x), MPFROMP(info));
971 WinSendDlgItemMsg(hwnd,
972 CMD_LISTBOX,
973 LM_SELECTITEM,
974 MPFROMSHORT(x), MPFROMSHORT(TRUE));
975 //then reorder
976 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
977 LM_QUERYITEMCOUNT,
978 MPVOID, MPVOID);
979
980 while (numitems) {
981
982
983 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
984 LM_QUERYITEMHANDLE,
985 MPFROMSHORT(sSelect++),
986 MPVOID);
987 if (info) {
988 if (!temphead) {
989 temphead = info;
990 info->prev = NULL;
991 }
992 else {
993 last->next = info;
994 info->prev = last;
995 }
996 temptail = info;
997 last = info;
998 info->next = NULL;
999 }
1000 numitems--;
1001 }
1002 cmdhead = temphead;
1003 cmdtail = temptail;
1004 save_commands();
1005 }
1006 }
1007 free(temp.pszCmdLine);
1008 }
1009 break;
1010 }
1011 return 0;
1012 }
1013 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1014}
1015
1016VOID RunCommand(HWND hwnd, INT cx)
1017{
1018 INT x;
1019 CHAR **list;
1020 LINKCMDS *info;
1021
1022 list = BuildList(hwnd);
1023 if (!list || !list[0])
1024 return;
1025 x = 0;
1026 info = cmdhead;
1027 while (info) {
1028 x++;
1029 if (x == cx)
1030 break;
1031 info = info->next;
1032 }
1033 if (info) {
1034
1035 INT flags;
1036
1037 x--;
1038 flags = info->flags;
1039 if (!(flags & FULLSCREEN))
1040 flags |= WINDOWED;
1041 if (flags & KEEP)
1042 flags |= SEPARATEKEEP;
1043 else
1044 flags |= SEPARATE;
1045 flags &= ~(KEEP | DIEAFTER);
1046 if ((flags & ONCE) && list && list[0]) {
1047
1048 CHAR *fakelist[2];
1049 INT cntr;
1050
1051 flags &= (~ONCE);
1052 for (cntr = 0; list[cntr]; cntr++) {
1053 *fakelist = list[cntr];
1054 fakelist[1] = NULL;
1055 ExecOnList(hwnd,
1056 info->pszCmdLine,
1057 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
1058 pszSrcFile, __LINE__);
1059 }
1060 }
1061 else
1062 ExecOnList(hwnd,
1063 info->pszCmdLine,
1064 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT),
1065 pszSrcFile, __LINE__);
1066 }
1067 FreeList(list);
1068 DosPostEventSem(CompactSem);
1069}
1070
1071VOID EditCommands(HWND hwnd)
1072{
1073 static CHAR stop = 0;
1074
1075 if (stop)
1076 return;
1077 stop++;
1078 if (!cmdloaded)
1079 load_commands();
1080 WinDlgBox(HWND_DESKTOP,
1081 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
1082 stop = 0;
1083}
1084
1085#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
1086#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.