source: trunk/dll/command.c@ 920

Last change on this file since 920 was 920, checked in by Gregg Young, 18 years ago

Cleanup of NormalizeCmdLine moved to pathutil.c

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