source: trunk/dll/command.c@ 1247

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

Fix issues with NormalizeCmdLine; it now uses searchapath to check for nonexe files in the path, it tries all 5 defined executible extensions when no exetension is provided, it closes dosfind, eliminates extra error message on failure to find extensionless file in commands, improved error message for extensionless file.

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