source: trunk/dll/command.c@ 1104

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

Replace save_dir2(dir) with strcpy(dir, pFM2SaveDirectory)

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