source: trunk/dll/command.c@ 1221

Last change on this file since 1221 was 1221, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: command.c 1221 2008-09-13 23:10:12Z jbs $
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
30***********************************************************************/
31
32#include <stdlib.h>
33#include <string.h>
34#include <share.h>
35
36#define INCL_DOS
37#define INCL_WIN
38#define INCL_LONGLONG // dircnrs.h
39
40#include "fm3dll.h"
41#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
42#include "notebook.h" // Data declaration(s)
43#include "init.h" // Data declaration(s)
44#include "mainwnd.h" // Data declaration(s)
45#include "newview.h" // Data declarations
46#include "fm3dlg.h"
47#include "fm3str.h"
48#include "tools.h"
49#include "arccnrs.h" // BldQuotedFileName
50#include "errutil.h" // Dos_Error...
51#include "strutil.h" // GetPString
52#include "droplist.h" // AcceptOneDrop, DropHelp, GetOneDrop
53#include "misc.h" // DrawTargetEmphasis
54#include "systemf.h" // ExecOnList
55#include "getnames.h" // insert_filename
56#include "wrappers.h" // xfgets
57#include "pathutil.h" // NormalizeCmdLine
58#include "command.h"
59#include "strips.h" // bstrip
60#include "dirs.h" // save_dir2
61#include "fortify.h"
62
63typedef struct
64{
65 PSZ pszCmdLine;
66 INT flags;
67 CHAR title[34];
68}
69COMMAND;
70
71// Data defintions
72#pragma data_seg(DATA1)
73
74static PSZ pszSrcFile = __FILE__;
75static LINKCMDS *cmdtail;
76
77#pragma data_seg(GLOBAL2)
78LINKCMDS *cmdhead;
79BOOL cmdloaded;
80
81MRESULT EXPENTRY CommandTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
82{
83 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
84 static BOOL emphasized = FALSE;
85
86 switch (msg) {
87 case DM_DRAGOVER:
88 if (!emphasized) {
89 emphasized = TRUE;
90 DrawTargetEmphasis(hwnd, emphasized);
91 }
92 if (AcceptOneDrop(hwnd, mp1, mp2))
93 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
94 return MRFROM2SHORT(DOR_NEVERDROP, 0);
95
96 case DM_DRAGLEAVE:
97 if (emphasized) {
98 emphasized = FALSE;
99 DrawTargetEmphasis(hwnd, emphasized);
100 }
101 break;
102
103 case DM_DROPHELP:
104 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DROPCMDHELPTEXT));
105 return 0;
106
107 case DM_DROP:
108 {
109 char szFrom[CCHMAXPATH + 5];
110
111 if (emphasized) {
112 emphasized = FALSE;
113 DrawTargetEmphasis(hwnd, emphasized);
114 }
115 if (GetOneDrop(hwnd, mp1, mp2, szFrom, CCHMAXPATH)) {
116 strcat(szFrom, " %a");
117 WinSetWindowText(hwnd, szFrom);
118 }
119 }
120 return 0;
121 }
122 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
123 WinDefWindowProc(hwnd, msg, mp1, mp2);
124}
125
126MRESULT EXPENTRY ReOrderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
127{
128 switch (msg) {
129 case WM_INITDLG:
130 if (!cmdhead) {
131 WinDismissDlg(hwnd, 0);
132 break;
133 }
134 {
135 LINKCMDS *info;
136 SHORT x;
137
138 info = cmdhead;
139 while (info) {
140 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_INSERTITEM,
141 MPFROMSHORT(LIT_END),
142 MPFROMP(info->title));
143 if (x < 0) {
144 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
145 WinDismissDlg(hwnd, 0);
146 }
147 else {
148 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SETITEMHANDLE,
149 MPFROMSHORT(x), MPFROMP(info));
150 }
151 info = info->next;
152 }
153 }
154 break;
155
156 case WM_CONTROL:
157 return 0;
158
159 case WM_COMMAND:
160 switch (SHORT1FROMMP(mp1)) {
161 case DID_CANCEL:
162 WinDismissDlg(hwnd, 0);
163 break;
164
165 case DID_OK:
166 {
167 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
168 SHORT sSelect, numitems;
169
170 sSelect = 0;
171 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
172 LM_QUERYITEMCOUNT,
173 MPVOID, MPVOID);
174 while (numitems) {
175 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
176 LM_QUERYITEMHANDLE,
177 MPFROMSHORT(sSelect++),
178 MPVOID);
179 if (info) {
180 if (!temphead) {
181 temphead = info;
182 info->prev = NULL;
183 }
184 else {
185 last->next = info;
186 info->prev = last;
187 }
188 temptail = info;
189 last = info;
190 info->next = NULL;
191 }
192 numitems--;
193 }
194 sSelect = 0;
195 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
196 LM_QUERYITEMCOUNT,
197 MPVOID, MPVOID);
198 while (numitems) {
199 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
200 LM_QUERYITEMHANDLE,
201 MPFROMSHORT(sSelect++),
202 MPVOID);
203 if (info) {
204 if (!temphead) {
205 temphead = info;
206 info->prev = NULL;
207 }
208 else {
209 last->next = info;
210 info->prev = last;
211 }
212 temptail = info;
213 last = info;
214 info->next = NULL;
215 }
216 numitems--;
217 }
218 cmdhead = temphead;
219 cmdtail = temptail;
220 }
221 WinDismissDlg(hwnd, 1);
222 break;
223
224 case IDM_HELP:
225 if (hwndHelp)
226 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
227 MPFROM2SHORT(HELP_REORDERCOMMANDS, 0),
228 MPFROMSHORT(HM_RESOURCEID));
229 break;
230
231 case RE_ADD:
232 {
233 SHORT sSelect, x;
234 LINKCMDS *info;
235
236 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
237 LM_QUERYSELECTION,
238 MPFROMSHORT(LIT_FIRST), MPVOID);
239 while (sSelect >= 0) {
240 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
241 LM_QUERYITEMHANDLE,
242 MPFROMSHORT(sSelect), MPVOID);
243 if (info) {
244 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
245 LM_INSERTITEM,
246 MPFROM2SHORT(LIT_END, 0),
247 MPFROMP(info->title));
248 if (x >= 0) {
249 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
250 LM_SETITEMHANDLE,
251 MPFROMSHORT(x), MPFROMP(info));
252 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_DELETEITEM,
253 MPFROMSHORT(sSelect), MPVOID);
254 }
255 }
256 else
257 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SELECTITEM,
258 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
259 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
260 LM_QUERYSELECTION,
261 MPFROMSHORT(LIT_FIRST),
262 MPVOID);
263 }
264 }
265 break;
266
267 case RE_REMOVE:
268 {
269 SHORT sSelect, x;
270 LINKCMDS *info;
271
272 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
273 LM_QUERYSELECTION,
274 MPFROMSHORT(LIT_FIRST), MPVOID);
275 while (sSelect >= 0) {
276 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
277 LM_QUERYITEMHANDLE,
278 MPFROMSHORT(sSelect), MPVOID);
279 if (info) {
280 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
281 LM_INSERTITEM,
282 MPFROM2SHORT(LIT_END, 0),
283 MPFROMP(info->title));
284 if (x >= 0) {
285 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
286 LM_SETITEMHANDLE,
287 MPFROMSHORT(x), MPFROMP(info));
288 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_DELETEITEM,
289 MPFROMSHORT(sSelect), MPVOID);
290 }
291 }
292 else
293 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_SELECTITEM,
294 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
295 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
296 LM_QUERYSELECTION,
297 MPFROMSHORT(LIT_FIRST),
298 MPVOID);
299 }
300 }
301 break;
302 }
303 return 0;
304 }
305 return WinDefDlgProc(hwnd, msg, mp1, mp2);
306}
307
308CHAR *command_title(INT cx)
309{
310 static CHAR duh[] = "???";
311 LINKCMDS *info;
312 INT x = 0;
313
314 if (!cmdloaded)
315 load_commands();
316 info = cmdhead;
317 while (info) {
318 if (x == cx)
319 return info->title;
320 info = info->next;
321 }
322 return duh;
323}
324
325VOID free_commands(VOID)
326{
327 LINKCMDS *info, *next;
328
329 info = cmdhead;
330 while (info) {
331 next = info->next;
332 xfree(info->title, pszSrcFile, __LINE__);
333 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
334 free(info);
335 info = next;
336 }
337 cmdhead = cmdtail = NULL;
338}
339
340VOID load_commands(VOID)
341{
342 FILE *fp;
343 LINKCMDS *info;
344 PSZ pszCmdLine;
345 CHAR title[100];
346 CHAR flags[72];
347
348 if (cmdhead)
349 free_commands();
350 cmdloaded = TRUE;
351 pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
352 if (pszCmdLine) {
353 BldFullPathName(pszCmdLine, pFM2SaveDirectory, "COMMANDS.DAT");
354 fp = _fsopen(pszCmdLine, "r", SH_DENYWR);
355 if (fp) {
356 while (!feof(fp)) {
357 if (!xfgets_bstripcr(title, sizeof(title), fp, pszSrcFile, __LINE__))
358 break;
359 title[34] = 0; // fixme to know why chopped this way?
360 bstripcr(title);
361 if (!*title || *title == ';')
362 continue;
363 if (!xfgets(pszCmdLine, MaxComLineStrg, fp, pszSrcFile, __LINE__))
364 break; /* error! */
365 if (!xfgets(flags, 72, fp, pszSrcFile, __LINE__))
366 break; /* error! */
367 pszCmdLine[MaxComLineStrg - 1] = 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.34s\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(1000, 0), MPVOID);
515 WinSendDlgItemMsg(hwnd, CMD_TITLE, EM_SETTEXTLIMIT,
516 MPFROM2SHORT(33, 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, '%')){
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, '%')){
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[34];
846
847 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, 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, '%')){
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 if (!list || !list[0])
1023 return;
1024 x = 0;
1025 info = cmdhead;
1026 while (info) {
1027 x++;
1028 if (x == cx)
1029 break;
1030 info = info->next;
1031 }
1032 if (info) {
1033
1034 INT flags;
1035
1036 x--;
1037 flags = info->flags;
1038 if (!(flags & FULLSCREEN))
1039 flags |= WINDOWED;
1040 if (flags & KEEP)
1041 flags |= SEPARATEKEEP;
1042 else
1043 flags |= SEPARATE;
1044 flags &= ~(KEEP | DIEAFTER);
1045 if ((flags & ONCE) && list && list[0]) {
1046
1047 CHAR *fakelist[2];
1048 INT cntr;
1049
1050 flags &= (~ONCE);
1051 for (cntr = 0; list[cntr]; cntr++) {
1052 *fakelist = list[cntr];
1053 fakelist[1] = NULL;
1054 ExecOnList(hwnd,
1055 info->pszCmdLine,
1056 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
1057 pszSrcFile, __LINE__);
1058 }
1059 }
1060 else
1061 ExecOnList(hwnd,
1062 info->pszCmdLine,
1063 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT),
1064 pszSrcFile, __LINE__);
1065 }
1066 FreeList(list);
1067 DosPostEventSem(CompactSem);
1068}
1069
1070VOID EditCommands(HWND hwnd)
1071{
1072 static CHAR stop = 0;
1073
1074 if (stop)
1075 return;
1076 stop++;
1077 if (!cmdloaded)
1078 load_commands();
1079 WinDlgBox(HWND_DESKTOP,
1080 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
1081 stop = 0;
1082}
1083
1084#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
1085#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.