source: trunk/dll/command.c@ 1194

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

Ticket 187: Draft 2: Move remaining function declarations

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