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
RevLine 
[123]1
2/***********************************************************************
3
4 $Id: command.c 909 2008-01-06 20:02:31Z gyoung $
5
[347]6 Custom commands
7
[123]8 Copyright (c) 1993-98 M. Kimes
[907]9 Copyright (c) 2004, 2008 Steven H. Levine
[123]10
[204]11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 06 Jun 05 SHL Drop unused code
[347]13 14 Jul 06 SHL Use Runtime_Error
[406]14 29 Jul 06 SHL Use xfgets_bstripcr
[445]15 15 Aug 06 SHL Better can't add message
[507]16 18 Sep 06 GKY Add replace command and update okay to add if changed
[552]17 17 Feb 07 GKY Move error messages etc to string file
[574]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
[618]21 19 Apr 07 SHL Sync with AcceptOneDrop GetOneDrop mods
[793]22 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[123]23
24***********************************************************************/
25
[2]26#include <stdlib.h>
27#include <string.h>
28#include <share.h>
[347]29
[907]30#define INCL_DOS
31#define INCL_WIN
32#define INCL_LONGLONG // dircnrs.h
33
[2]34#include "fm3dlg.h"
35#include "fm3str.h"
36#include "tools.h"
[907]37#include "arccnrs.h" // BldQuotedFileName
38#include "errutil.h" // Dos_Error...
39#include "strutil.h" // GetPString
40#include "fm3dll.h"
[2]41
[907]42
[551]43typedef struct
44{
45 CHAR cl[1001];
46 INT flags;
47 CHAR title[34];
48}
49COMMAND;
[2]50
51#pragma data_seg(DATA1)
[347]52
53static PSZ pszSrcFile = __FILE__;
54
[551]55MRESULT EXPENTRY CommandTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[347]56{
[574]57 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]58 static BOOL emphasized = FALSE;
59
[551]60 switch (msg) {
61 case DM_DRAGOVER:
62 if (!emphasized) {
63 emphasized = TRUE;
64 DrawTargetEmphasis(hwnd, emphasized);
65 }
[618]66 if (AcceptOneDrop(hwnd, mp1, mp2))
[551]67 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
68 return MRFROM2SHORT(DOR_NEVERDROP, 0);
[2]69
[551]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) {
[445]86 emphasized = FALSE;
[551]87 DrawTargetEmphasis(hwnd, emphasized);
[2]88 }
[618]89 if (GetOneDrop(hwnd, mp1, mp2, szFrom, CCHMAXPATH)) {
[551]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);
[2]106 break;
[551]107 }
108 {
109 LINKCMDS *info;
110 SHORT x;
[2]111
[551]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);
[445]120 }
[551]121 else {
122 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SETITEMHANDLE,
123 MPFROMSHORT(x), MPFROMP(info));
[445]124 }
[551]125 info = info->next;
[2]126 }
[551]127 }
128 break;
[2]129
[551]130 case WM_CONTROL:
131 return 0;
[2]132
[551]133 case WM_COMMAND:
134 switch (SHORT1FROMMP(mp1)) {
135 case DID_CANCEL:
136 WinDismissDlg(hwnd, 0);
137 break;
138
139 case DID_OK:
[2]140 {
[551]141 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
142 SHORT sSelect, numitems;
[2]143
[551]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;
[347]165 }
[551]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;
[347]189 }
[551]190 numitems--;
[445]191 }
[551]192 cmdhead = temphead;
193 cmdtail = temptail;
[2]194 }
[551]195 WinDismissDlg(hwnd, 1);
[2]196 break;
197
[551]198 case IDM_HELP:
199 if (hwndHelp)
200 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
201 MPFROM2SHORT(HELP_REORDERCOMMANDS, 0),
202 MPFROMSHORT(HM_RESOURCEID));
203 break;
[2]204
[551]205 case RE_ADD:
206 {
207 SHORT sSelect, x;
208 LINKCMDS *info;
[2]209
[551]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);
[445]228 }
229 }
[551]230 else
231 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SELECTITEM,
232 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
233 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
[445]234 LM_QUERYSELECTION,
235 MPFROMSHORT(LIT_FIRST),
236 MPVOID);
[551]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);
[445]264 }
265 }
[551]266 else
267 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_SELECTITEM,
268 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
269 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
[445]270 LM_QUERYSELECTION,
271 MPFROMSHORT(LIT_FIRST),
272 MPVOID);
[551]273 }
[2]274 }
[551]275 break;
276 }
277 return 0;
[2]278 }
[551]279 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]280}
281
[551]282CHAR *command_title(INT cx)
[347]283{
[551]284 static CHAR duh[] = "???";
285 LINKCMDS *info;
286 INT x = 0;
[2]287
[551]288 if (!cmdloaded)
[2]289 load_commands();
290 info = cmdhead;
[551]291 while (info) {
292 if (x == cx)
[2]293 return info->title;
294 info = info->next;
295 }
296 return duh;
297}
298
[551]299VOID free_commands(VOID)
[347]300{
[551]301 LINKCMDS *info, *next;
[2]302
303 info = cmdhead;
[551]304 while (info) {
[2]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
[551]314VOID load_commands(VOID)
[347]315{
[551]316 FILE *fp;
[2]317 LINKCMDS *info;
[551]318 CHAR cl[1024];
319 CHAR title[100];
320 CHAR flags[72];
[2]321
[551]322 if (cmdhead)
[2]323 free_commands();
324 cmdloaded = TRUE;
325 save_dir2(cl);
[551]326 if (cl[strlen(cl) - 1] != '\\')
327 strcat(cl, "\\");
328 strcat(cl, "COMMANDS.DAT");
329 fp = _fsopen(cl, "r", SH_DENYWR);
330 if (fp) {
[406]331 while (!feof(fp)) {
[551]332 if (!xfgets_bstripcr(title, sizeof(title), fp, pszSrcFile, __LINE__))
[445]333 break;
[406]334 title[34] = 0; // fixme to know why chopped this way?
[123]335 bstripcr(title);
[406]336 if (!*title || *title == ';')
[445]337 continue;
[551]338 if (!xfgets(cl, sizeof(cl), fp, pszSrcFile, __LINE__))
339 break; /* error! */
340 if (!xfgets(flags, 72, fp, pszSrcFile, __LINE__))
341 break; /* error! */
[406]342 cl[1000] = 0; // fixme to know why chopped this way?
343 bstripcr(cl);
[2]344 flags[34] = 0;
[123]345 bstripcr(flags);
[551]346 if (!*cl)
[445]347 continue;
[551]348 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
[406]349 if (info) {
[551]350 info->cl = xstrdup(cl, pszSrcFile, __LINE__);
351 info->title = xstrdup(title, pszSrcFile, __LINE__);
[445]352 info->flags = atol(flags);
[551]353 if (!info->cl || !info->title) {
354 if (info->cl)
[445]355 free(info->cl);
[551]356 if (info->title)
[445]357 free(info->title);
358 free(info);
359 break;
360 }
[551]361 if (!cmdhead)
[445]362 cmdhead = info;
363 else {
364 cmdtail->next = info;
365 info->prev = cmdtail;
366 }
367 cmdtail = info;
[2]368 }
369 }
370 fclose(fp);
371 }
372}
373
[551]374VOID save_commands(VOID)
[347]375{
[2]376 LINKCMDS *info;
[551]377 FILE *fp;
378 CHAR s[CCHMAXPATH + 14];
[2]379
[551]380 if (!cmdloaded || !cmdhead)
[2]381 return;
382 info = cmdhead;
383 save_dir2(s);
[551]384 if (s[strlen(s) - 1] != '\\')
385 strcat(s, "\\");
386 strcat(s, "COMMANDS.DAT");
387 fp = xfopen(s, "w", pszSrcFile, __LINE__);
[347]388 if (fp) {
[551]389 fputs(GetPString(IDS_COMMANDFILETEXT), fp);
[2]390 info = cmdhead;
[551]391 while (info) {
[2]392 fprintf(fp,
[445]393 ";\n%0.34s\n%0.1000s\n%lu\n",
[551]394 info->title, info->cl, info->flags);
[2]395 info = info->next;
396 }
397 fclose(fp);
398 }
399}
400
[445]401//== add_command() Add command to list ==
402
[551]403LINKCMDS *add_command(COMMAND * addme)
[347]404{
[2]405 LINKCMDS *info;
406
[445]407 if (!addme || !*addme->cl || !*addme->title)
[551]408 return NULL; // No data
[445]409 info = cmdhead;
410 while (info) {
[551]411 if (!stricmp(info->title, addme->title))
412 return NULL; // Got a dup
[445]413 info = info->next;
[2]414 }
[551]415 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
[445]416 if (!info)
417 return NULL;
[551]418 info->cl = xstrdup(addme->cl, pszSrcFile, __LINE__);
419 info->title = xstrdup(addme->title, pszSrcFile, __LINE__);
[445]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;
[2]437}
438
[551]439BOOL kill_command(CHAR * killme)
[347]440{
[2]441 LINKCMDS *info;
442
[551]443 if (killme && *killme) {
[2]444 info = cmdhead;
[551]445 while (info) {
446 if (!stricmp(info->title, killme)) {
447 if (info == cmdhead) {
[445]448 cmdhead = info->next;
[551]449 if (info == cmdtail)
[445]450 cmdtail = info->prev;
451 }
452 else {
[551]453 if (info->next)
[445]454 (info->next)->prev = info->prev;
[551]455 if (info->prev)
[445]456 (info->prev)->next = info->next;
[551]457 if (info == cmdtail)
[445]458 cmdtail = info->prev;
459 }
460 free(info->cl);
461 free(info->title);
462 free(info);
463 return TRUE;
[2]464 }
465 info = info->next;
466 }
467 }
468 return FALSE;
469}
470
[551]471MRESULT EXPENTRY CommandDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[347]472{
[574]473 SHORT x, y;
[2]474 LINKCMDS *info;
475
[551]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)
[574]506 WinSetWindowPtr(WinWindowFromID(hwnd, CMD_CL), QWL_USER, (PVOID) oldproc);
[551]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;
[2]557 }
[551]558 }
559 return 0;
560
561 case WM_COMMAND:
562 switch (SHORT1FROMMP(mp1)) {
563 case CMD_FIND:
[2]564 {
[888]565 CHAR filename[CCHMAXPATH + 9], szfilename[CCHMAXPATH + 9];
[2]566
[551]567 *filename = 0;
[888]568 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
569 BldQuotedFileName(szfilename, filename);
570 WinSetDlgItemText(hwnd, CMD_CL, szfilename);
[551]571 }
[2]572 }
573 break;
574
[551]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;
[445]598 }
[551]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();
[2]606 }
[551]607 break;
[2]608
[551]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 {
[909]621 COMMAND temp;
622 char *psz[1002];
623 APIRET ret;
[2]624
[551]625 memset(&temp, 0, sizeof(COMMAND));
626 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
[909]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 }
[551]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))
[909]653 temp.flags |= ONCE;
654 if (fCancelAction){
655 fCancelAction = FALSE;
656 break;
657 }
658 else
659 info = add_command(&temp);
660 if (!info)
[552]661 {
[551]662 WinDismissDlg(hwnd, 0);
[574]663 /*saymsg(MB_ENTER, hwnd,
[551]664 GetPString(IDS_ERRORTEXT),
[552]665 GetPString(IDS_CANTADDCOMMANDTEXT),
[574]666 temp.title);*/
[552]667 }
[551]668 else {
669 CHAR env[1002];
[2]670
[551]671 *env = 0;
672 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
673 bstripcr(env);
674 if (*env) {
675 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]676 }
[551]677 x = (SHORT) WinSendDlgItemMsg(hwnd,
678 CMD_LISTBOX,
679 LM_INSERTITEM,
680 MPFROM2SHORT(LIT_END, 0),
681 MPFROMP(temp.title));
682 if (x >= 0) {
[445]683 WinSendDlgItemMsg(hwnd,
684 CMD_LISTBOX,
[551]685 LM_SETITEMHANDLE,
686 MPFROMSHORT(x), MPFROMP(info));
[445]687 WinSendDlgItemMsg(hwnd,
688 CMD_LISTBOX,
689 LM_SELECTITEM,
[551]690 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[445]691 save_commands();
692 }
[551]693 }
694 }
695 x = (SHORT) WinSendDlgItemMsg(hwnd,
696 CMD_LISTBOX,
697 LM_QUERYSELECTION,
698 MPFROMSHORT(LIT_FIRST), MPVOID);
699 WinDismissDlg(hwnd, 0);
700 break;
[2]701
[551]702 case DID_CANCEL:
703 WinDismissDlg(hwnd, 0);
704 break;
[507]705
[551]706 case IDM_HELP:
707 if (hwndHelp)
708 WinSendMsg(hwndHelp,
709 HM_DISPLAY_HELP,
710 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
711 break;
[507]712
[551]713 case CMD_ADD:
714 {
[909]715 COMMAND temp;
716 CHAR *psz[1002];
717 APIRET ret;
[2]718
[551]719 memset(&temp, 0, sizeof(COMMAND));
720 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
[909]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 }
[551]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))
[909]747 temp.flags |= ONCE;
748 if (fCancelAction){
749 fCancelAction = FALSE;
750 break;
751 }
752 else
753 info = add_command(&temp);
[551]754 if (!info) {
755 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
[552]756 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
[551]757 }
758 else {
759 CHAR env[1002];
[2]760
[551]761 *env = 0;
762 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
763 bstripcr(env);
764 if (*env) {
765 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]766 }
[551]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;
[2]786
[551]787 case CMD_DELETE:
788 {
789 CHAR temp[34];
[2]790
[551]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));
[445]808 }
[551]809 save_commands();
810 }
811 }
812 break;
813 case CMD_REPLACE:
[909]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
[574]836 y = (SHORT) WinSendDlgItemMsg(hwnd,
[909]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)){
[551]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));
[507]855 }
[909]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 }
[507]879
[551]880 else {
881 CHAR env[1002];
[507]882
[551]883 *env = 0;
884 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
885 bstripcr(env);
886 if (*env) {
887 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[909]888 } //put item back in original place
[551]889 x = (SHORT) WinSendDlgItemMsg(hwnd,
890 CMD_LISTBOX,
891 LM_INSERTITEM,
[574]892 MPFROM2SHORT(y, 0),
[551]893 MPFROMP(temp.title));
[909]894 if (x >= 0) {
895 LINKCMDS *temphead = NULL,*last = NULL, *temptail = NULL;
896 SHORT numitems, sSelect = 0;
897
[551]898 WinSendDlgItemMsg(hwnd,
899 CMD_LISTBOX,
900 LM_SETITEMHANDLE,
901 MPFROMSHORT(x), MPFROMP(info));
902 WinSendDlgItemMsg(hwnd,
903 CMD_LISTBOX,
904 LM_SELECTITEM,
[574]905 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[909]906 //then reorder
907 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
908 LM_QUERYITEMCOUNT,
909 MPVOID, MPVOID);
[574]910
[909]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 }
[574]937 }
[2]938 }
[551]939 break;
940 }
941 return 0;
[2]942 }
[551]943 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]944}
945
[551]946VOID RunCommand(HWND hwnd, INT cx)
[347]947{
[551]948 INT x;
949 CHAR **list;
950 LINKCMDS *info;
[2]951
952 list = BuildList(hwnd);
[551]953 if (!list || !list[0])
[2]954 return;
955 x = 0;
956 info = cmdhead;
[551]957 while (info) {
[2]958 x++;
[551]959 if (x == cx)
[2]960 break;
961 info = info->next;
962 }
[551]963 if (info) {
[2]964
[551]965 INT flags;
[2]966
967 x--;
968 flags = info->flags;
[551]969 if (!(flags & FULLSCREEN))
[2]970 flags |= WINDOWED;
[551]971 if (flags & KEEP)
[2]972 flags |= SEPARATEKEEP;
973 else
974 flags |= SEPARATE;
[204]975 flags &= ~(KEEP | DIEAFTER);
[551]976 if ((flags & ONCE) && list && list[0]) {
[2]977
[551]978 CHAR *fakelist[2];
979 INT cntr;
[2]980
981 flags &= (~ONCE);
[551]982 for (cntr = 0; list[cntr]; cntr++) {
[445]983 *fakelist = list[cntr];
984 fakelist[1] = NULL;
985 ExecOnList(hwnd,
986 info->cl,
[888]987 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
988 pszSrcFile, __LINE__);
[2]989 }
990 }
991 else
992 ExecOnList(hwnd,
[445]993 info->cl,
[888]994 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT),
995 pszSrcFile, __LINE__);
[2]996 }
997 FreeList(list);
998 DosPostEventSem(CompactSem);
999}
1000
[551]1001VOID EditCommands(HWND hwnd)
[347]1002{
[2]1003 static CHAR stop = 0;
1004
[551]1005 if (stop)
[2]1006 return;
1007 stop++;
[551]1008 if (!cmdloaded)
[2]1009 load_commands();
1010 WinDlgBox(HWND_DESKTOP,
[551]1011 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
[2]1012 stop = 0;
1013}
[793]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.