source: trunk/dll/command.c@ 1119

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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