source: trunk/dll/command.c@ 1205

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

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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