source: trunk/dll/command.c@ 1118

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

Clean up of fix for trap caused by FM/2 being on a full disk. It now preserves the data files. (Ticket 152, 271)

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