source: trunk/dll/command.c@ 909

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

Added quoting code to commands, associations and avv; Minor clean up and fixed one problem with quoting logic; Added warning re %a for commands to work on selected files.

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