source: trunk/dll/command.c@ 1345

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

Code cleanup address some fixmes in command.c; lengthen the command title field

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.4 KB
RevLine 
[123]1
2/***********************************************************************
3
4 $Id: command.c 1345 2008-12-19 19:23:07Z 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;
[1345]68 CHAR title[100];
[551]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];
[1345]347 CHAR flags[34];
[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;
[1345]360 title[strlen(title)] = 0; // Match size to entry file max
[989]361 if (!*title || *title == ';')
362 continue;
[1345]363 if (!xfgets_bstripcr(pszCmdLine, MaxComLineStrg, fp, pszSrcFile, __LINE__))
[989]364 break; /* error! */
[1345]365 if (!xfgets_bstripcr(flags, sizeof(flags), fp, pszSrcFile, __LINE__))
[989]366 break; /* error! */
[1345]367 pszCmdLine[strlen(pszCmdLine)] = 0; // fixme to know why chopped this way?
368 //bstripcr(pszCmdLine);
[989]369 flags[34] = 0;
[1345]370 //bstripcr(flags);
[989]371 if (!pszCmdLine)
372 continue;
373 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
374 if (info) {
[1078]375# ifdef FORTIFY
376 Fortify_SetOwner(info, 1);
377 Fortify_SetScope(info, 1);
378# endif
[989]379 info->pszCmdLine = xstrdup(pszCmdLine, pszSrcFile, __LINE__);
380 info->title = xstrdup(title, pszSrcFile, __LINE__);
381 info->flags = atol(flags);
382 if (!info->pszCmdLine || !info->title) {
[1009]383 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
384 xfree(info->title, pszSrcFile, __LINE__);
[1039]385 free(info);
[989]386 break;
387 }
[1078]388# ifdef FORTIFY
389 Fortify_SetOwner(info->pszCmdLine, 1);
390 Fortify_SetScope(info->pszCmdLine, 1);
391 Fortify_SetOwner(info->title, 1);
392 Fortify_SetScope(info->title, 1);
393# endif
[989]394 if (!cmdhead)
395 cmdhead = info;
396 else {
397 cmdtail->next = info;
398 info->prev = cmdtail;
399 }
400 cmdtail = info;
401 }
[2]402 }
[1039]403 free(pszCmdLine);
[989]404 fclose(fp);
[2]405 }
406 }
407}
408
[551]409VOID save_commands(VOID)
[347]410{
[2]411 LINKCMDS *info;
[551]412 FILE *fp;
413 CHAR s[CCHMAXPATH + 14];
[2]414
[551]415 if (!cmdloaded || !cmdhead)
[2]416 return;
417 info = cmdhead;
[1082]418 BldFullPathName(s, pFM2SaveDirectory, "COMMANDS.DAT");
[1118]419 if (CheckDriveSpaceAvail(s, ullDATFileSpaceNeeded, 1) == 2)
[1117]420 return; //already gave error msg
[551]421 fp = xfopen(s, "w", pszSrcFile, __LINE__);
[347]422 if (fp) {
[551]423 fputs(GetPString(IDS_COMMANDFILETEXT), fp);
[2]424 info = cmdhead;
[551]425 while (info) {
[2]426 fprintf(fp,
[1345]427 ";\n%0.99s\n%0.*s\n%lu\n",
[989]428 info->title, MaxComLineStrg, info->pszCmdLine, info->flags);
[2]429 info = info->next;
430 }
431 fclose(fp);
432 }
433}
434
[445]435//== add_command() Add command to list ==
436
[551]437LINKCMDS *add_command(COMMAND * addme)
[347]438{
[2]439 LINKCMDS *info;
440
[985]441 if (!addme || !*addme->pszCmdLine || !*addme->title)
[551]442 return NULL; // No data
[445]443 info = cmdhead;
444 while (info) {
[551]445 if (!stricmp(info->title, addme->title))
446 return NULL; // Got a dup
[445]447 info = info->next;
[2]448 }
[551]449 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
[445]450 if (!info)
451 return NULL;
[989]452 info->pszCmdLine = xstrdup(addme->pszCmdLine, pszSrcFile, __LINE__);
[551]453 info->title = xstrdup(addme->title, pszSrcFile, __LINE__);
[445]454 if (addme->flags)
455 info->flags = addme->flags;
[989]456 if (!info->pszCmdLine || !info->title) {
[1009]457 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
458 xfree(info->title, pszSrcFile, __LINE__);
[1039]459 free(info);
[445]460 return NULL;
461 }
462 if (!cmdhead) /* only item in list */
463 cmdhead = cmdtail = info;
464 else {
465 /* place at tail */
466 cmdtail->next = info;
467 info->prev = cmdtail;
468 cmdtail = info;
469 }
470 return info;
[2]471}
472
[551]473BOOL kill_command(CHAR * killme)
[347]474{
[2]475 LINKCMDS *info;
476
[551]477 if (killme && *killme) {
[2]478 info = cmdhead;
[551]479 while (info) {
480 if (!stricmp(info->title, killme)) {
481 if (info == cmdhead) {
[445]482 cmdhead = info->next;
[551]483 if (info == cmdtail)
[445]484 cmdtail = info->prev;
485 }
486 else {
[551]487 if (info->next)
[445]488 (info->next)->prev = info->prev;
[551]489 if (info->prev)
[445]490 (info->prev)->next = info->next;
[551]491 if (info == cmdtail)
[445]492 cmdtail = info->prev;
493 }
[1009]494 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
495 xfree(info->title, pszSrcFile, __LINE__);
[1039]496 free(info);
[445]497 return TRUE;
[2]498 }
499 info = info->next;
500 }
501 }
502 return FALSE;
503}
504
[551]505MRESULT EXPENTRY CommandDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[347]506{
[574]507 SHORT x, y;
[2]508 LINKCMDS *info;
509
[551]510 switch (msg) {
511 case WM_INITDLG:
512 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
513 WinSendDlgItemMsg(hwnd, CMD_CL, EM_SETTEXTLIMIT,
[1345]514 MPFROM2SHORT(MaxComLineStrg - 1, 0), MPVOID);
[551]515 WinSendDlgItemMsg(hwnd, CMD_TITLE, EM_SETTEXTLIMIT,
[1345]516 MPFROM2SHORT(99, 0), MPVOID);
[551]517 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
518 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
519 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
520 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
521 WinCheckButton(hwnd, CMD_ONCE, FALSE);
522 info = cmdhead;
523 while (info) {
524 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_INSERTITEM,
525 MPFROM2SHORT(LIT_END, 0),
526 MPFROMP(info->title));
527 if (x >= 0)
528 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SETITEMHANDLE,
529 MPFROMSHORT(x), MPFROMP(info));
530 info = info->next;
531 }
532 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SELECTITEM,
533 MPFROMSHORT(0), MPFROMSHORT(TRUE));
534 {
535 PFNWP oldproc;
536
537 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, CMD_CL),
538 (PFNWP) CommandTextProc);
539 if (oldproc)
[574]540 WinSetWindowPtr(WinWindowFromID(hwnd, CMD_CL), QWL_USER, (PVOID) oldproc);
[551]541 }
542 break;
543
544 case WM_CONTROL:
545 if (SHORT1FROMMP(mp1) == CMD_LISTBOX) {
546 switch (SHORT2FROMMP(mp1)) {
547 case LN_ENTER:
548 case LN_SELECT:
549 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
550 LM_QUERYSELECTION,
551 MPFROMSHORT(LIT_FIRST), MPVOID);
552 if (x >= 0) {
553 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
554 LM_QUERYITEMHANDLE,
555 MPFROMSHORT(x), MPVOID);
556 if (!info) {
557 Runtime_Error(pszSrcFile, __LINE__, "LM_QUERYITEMHANDLE");
558 break;
559 }
[989]560 WinSetDlgItemText(hwnd, CMD_CL, info->pszCmdLine);
[551]561 if (!(info->flags & 1023))
562 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
563 else {
564 if (info->flags & FULLSCREEN)
565 WinCheckButton(hwnd, CMD_FULLSCREEN, TRUE);
566 else if (info->flags & MINIMIZED)
567 WinCheckButton(hwnd, CMD_MINIMIZED, TRUE);
568 else if (info->flags & MAXIMIZED)
569 WinCheckButton(hwnd, CMD_MAXIMIZED, TRUE);
570 else if (info->flags & INVISIBLE)
571 WinCheckButton(hwnd, CMD_INVISIBLE, TRUE);
572 }
573 WinCheckButton(hwnd, CMD_PROMPT, ((info->flags & PROMPT) != 0));
574 WinCheckButton(hwnd, CMD_KEEP, ((info->flags & KEEP) != 0));
575 WinCheckButton(hwnd, CMD_ONCE, ((info->flags & ONCE) != 0));
576 WinSetDlgItemText(hwnd, CMD_TITLE, info->title);
577 {
578 CHAR env[1002];
579 ULONG size;
580
581 *env = 0;
582 size = sizeof(env) - 1;
[989]583 if (PrfQueryProfileData(fmprof, FM3Str, info->pszCmdLine, env, &size) &&
[551]584 *env)
585 WinSetDlgItemText(hwnd, CMD_ENVIRON, env);
586 else
587 WinSetDlgItemText(hwnd, CMD_ENVIRON, NullStr);
588 }
589 }
590 break;
[2]591 }
[551]592 }
593 return 0;
594
595 case WM_COMMAND:
596 switch (SHORT1FROMMP(mp1)) {
597 case CMD_FIND:
[2]598 {
[888]599 CHAR filename[CCHMAXPATH + 9], szfilename[CCHMAXPATH + 9];
[2]600
[551]601 *filename = 0;
[888]602 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
603 BldQuotedFileName(szfilename, filename);
604 WinSetDlgItemText(hwnd, CMD_CL, szfilename);
[551]605 }
[2]606 }
607 break;
608
[551]609 case CMD_REORDER:
610 if (!cmdhead || !cmdhead->next) {
611 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
612 break;
613 }
614 if (WinDlgBox(HWND_DESKTOP, hwnd, ReOrderProc, FM3ModHandle,
615 RE_FRAME, MPVOID)) {
616 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
617 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
618 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
619 info = cmdhead;
620 while (info) {
621 x = (SHORT) WinSendDlgItemMsg(hwnd,
622 CMD_LISTBOX,
623 LM_INSERTITEM,
624 MPFROM2SHORT(LIT_END, 0),
625 MPFROMP(info->title));
626 if (x >= 0)
627 WinSendDlgItemMsg(hwnd,
628 CMD_LISTBOX,
629 LM_SETITEMHANDLE,
630 MPFROMSHORT(x), MPFROMP(info));
631 info = info->next;
[445]632 }
[551]633 WinSendDlgItemMsg(hwnd,
634 CMD_LISTBOX,
635 LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
636 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
637 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
638 WinCheckButton(hwnd, CMD_ONCE, FALSE);
639 save_commands();
[2]640 }
[551]641 break;
[2]642
[551]643 case DID_OK:
644 {
645 x = (SHORT) WinSendDlgItemMsg(hwnd,
646 CMD_LISTBOX,
647 LM_QUERYSELECTION, MPVOID, MPVOID);
648 if (x == LIT_NONE)
649 x = (SHORT) WinSendDlgItemMsg(hwnd,
650 CMD_LISTBOX,
651 LM_SELECTITEM,
652 MPFROMSHORT(0), MPFROMSHORT(TRUE));
653 }
654 {
[909]655 COMMAND temp;
[920]656 PSZ pszWorkBuf;
[909]657 APIRET ret;
[2]658
[985]659 memset(&temp, 0, sizeof(COMMAND));
660 temp.pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
661 if (!temp.pszCmdLine)
[959]662 break; //already complained
[985]663 pszWorkBuf = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
664 if (!pszWorkBuf) {
[1039]665 free(temp.pszCmdLine);
[985]666 break; //already complained
667 }
668 WinQueryDlgItemText(hwnd, CMD_CL, MaxComLineStrg, temp.pszCmdLine);
669 NormalizeCmdLine(pszWorkBuf, temp.pszCmdLine);
670 memcpy(temp.pszCmdLine, pszWorkBuf, strlen(pszWorkBuf) + 1);
[1039]671 free(pszWorkBuf);
[1247]672 if (!strchr(temp.pszCmdLine, '%') && !fCancelAction){
[909]673 ret = saymsg(MB_YESNO,
674 HWND_DESKTOP,
675 NullStr,
676 GetPString(IDS_TOACTONSELECTEDTEXT));
677 if (ret == MBID_YES)
[985]678 strcat(temp.pszCmdLine, " %a");
[909]679 }
[551]680 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
681 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
682 temp.flags = 0;
683 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
684 temp.flags = FULLSCREEN;
685 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
686 temp.flags = MINIMIZED;
687 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
688 temp.flags = MAXIMIZED;
689 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
690 temp.flags = INVISIBLE;
691 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
692 temp.flags |= KEEP;
693 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
694 temp.flags |= PROMPT;
695 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
[909]696 temp.flags |= ONCE;
697 if (fCancelAction){
698 fCancelAction = FALSE;
[1039]699 free(temp.pszCmdLine);
[909]700 break;
701 }
702 else
703 info = add_command(&temp);
704 if (!info)
[552]705 {
[551]706 WinDismissDlg(hwnd, 0);
[574]707 /*saymsg(MB_ENTER, hwnd,
[551]708 GetPString(IDS_ERRORTEXT),
[552]709 GetPString(IDS_CANTADDCOMMANDTEXT),
[574]710 temp.title);*/
[552]711 }
[551]712 else {
713 CHAR env[1002];
[2]714
[551]715 *env = 0;
716 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
717 bstripcr(env);
718 if (*env) {
[985]719 PrfWriteProfileString(fmprof, FM3Str, temp.pszCmdLine, env);
[445]720 }
[551]721 x = (SHORT) WinSendDlgItemMsg(hwnd,
722 CMD_LISTBOX,
723 LM_INSERTITEM,
724 MPFROM2SHORT(LIT_END, 0),
725 MPFROMP(temp.title));
726 if (x >= 0) {
[445]727 WinSendDlgItemMsg(hwnd,
728 CMD_LISTBOX,
[551]729 LM_SETITEMHANDLE,
730 MPFROMSHORT(x), MPFROMP(info));
[445]731 WinSendDlgItemMsg(hwnd,
732 CMD_LISTBOX,
733 LM_SELECTITEM,
[551]734 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[445]735 save_commands();
736 }
[985]737 }
[1039]738 free(temp.pszCmdLine);
[551]739 }
740 x = (SHORT) WinSendDlgItemMsg(hwnd,
741 CMD_LISTBOX,
742 LM_QUERYSELECTION,
[985]743 MPFROMSHORT(LIT_FIRST), MPVOID);
[551]744 WinDismissDlg(hwnd, 0);
745 break;
[2]746
[551]747 case DID_CANCEL:
748 WinDismissDlg(hwnd, 0);
749 break;
[507]750
[551]751 case IDM_HELP:
752 if (hwndHelp)
753 WinSendMsg(hwndHelp,
754 HM_DISPLAY_HELP,
755 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
756 break;
[507]757
[551]758 case CMD_ADD:
759 {
[909]760 COMMAND temp;
[920]761 PSZ pszWorkBuf;
[909]762 APIRET ret;
[2]763
[985]764 memset(&temp, 0, sizeof(COMMAND));
765 temp.pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
766 if (!temp.pszCmdLine)
[959]767 break; //already complained
[985]768 pszWorkBuf = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
769 if (!pszWorkBuf) {
[1039]770 free(temp.pszCmdLine);
[985]771 break; //already complained
772 }
773 WinQueryDlgItemText(hwnd, CMD_CL, MaxComLineStrg, temp.pszCmdLine);
774 NormalizeCmdLine(pszWorkBuf, temp.pszCmdLine);
775 memcpy(temp.pszCmdLine, pszWorkBuf, strlen(pszWorkBuf) + 1);
[1039]776 free(pszWorkBuf);
[1247]777 if (!strchr(temp.pszCmdLine, '%') && !fCancelAction){
[909]778 ret = saymsg(MB_YESNO,
779 HWND_DESKTOP,
780 NullStr,
781 GetPString(IDS_TOACTONSELECTEDTEXT));
782 if (ret == MBID_YES)
[985]783 strcat(temp.pszCmdLine, " %a");
[909]784 }
[551]785 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
786 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
787 temp.flags = 0;
788 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
789 temp.flags = FULLSCREEN;
790 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
791 temp.flags = MINIMIZED;
792 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
793 temp.flags = MAXIMIZED;
794 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
795 temp.flags = INVISIBLE;
796 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
797 temp.flags |= KEEP;
798 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
799 temp.flags |= PROMPT;
800 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
[909]801 temp.flags |= ONCE;
802 if (fCancelAction){
803 fCancelAction = FALSE;
[1039]804 free(temp.pszCmdLine);
[909]805 break;
806 }
807 else
808 info = add_command(&temp);
[551]809 if (!info) {
810 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
[552]811 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
[551]812 }
813 else {
814 CHAR env[1002];
[2]815
[551]816 *env = 0;
817 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
818 bstripcr(env);
819 if (*env) {
[985]820 PrfWriteProfileString(fmprof, FM3Str, temp.pszCmdLine, env);
[445]821 }
[551]822 x = (SHORT) WinSendDlgItemMsg(hwnd,
823 CMD_LISTBOX,
824 LM_INSERTITEM,
825 MPFROM2SHORT(LIT_END, 0),
826 MPFROMP(temp.title));
827 if (x >= 0) {
828 WinSendDlgItemMsg(hwnd,
829 CMD_LISTBOX,
830 LM_SETITEMHANDLE,
831 MPFROMSHORT(x), MPFROMP(info));
832 WinSendDlgItemMsg(hwnd,
833 CMD_LISTBOX,
834 LM_SELECTITEM,
835 MPFROMSHORT(x), MPFROMSHORT(TRUE));
836 save_commands();
837 }
[985]838 }
[1039]839 free(temp.pszCmdLine);
[551]840 }
841 break;
[2]842
[551]843 case CMD_DELETE:
844 {
[1345]845 CHAR temp[100];
[2]846
[1345]847 WinQueryDlgItemText(hwnd, CMD_TITLE, 100, temp);
[551]848 bstrip(temp);
849 if (!kill_command(temp))
850 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
851 else {
852 x = (SHORT) WinSendDlgItemMsg(hwnd,
853 CMD_LISTBOX,
854 LM_QUERYSELECTION,
855 MPFROMSHORT(LIT_FIRST), MPVOID);
856 if (x >= 0) {
857 WinSendDlgItemMsg(hwnd,
858 CMD_LISTBOX,
859 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
860 WinSendDlgItemMsg(hwnd,
861 CMD_LISTBOX,
862 LM_SELECTITEM,
863 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
[445]864 }
[551]865 save_commands();
866 }
867 }
868 break;
[985]869
[551]870 case CMD_REPLACE:
[909]871 { //Delete first
[920]872 PSZ pszWorkBuf;
[909]873 COMMAND temp;
874 APIRET ret;
875
[985]876 pszWorkBuf = xmalloc(MaxComLineStrg, pszSrcFile, __LINE__);
877 if (!pszWorkBuf) {
[959]878 break; //already complained
[985]879 }
880 memset(&temp, 0, sizeof(COMMAND));
881 temp.pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
882 if (!temp.pszCmdLine) {
[1039]883 free(pszWorkBuf);
[985]884 break; //already complained
885 }
886 WinQueryDlgItemText(hwnd, CMD_CL, MaxComLineStrg, temp.pszCmdLine);
887 NormalizeCmdLine(pszWorkBuf, temp.pszCmdLine);
888 memcpy(temp.pszCmdLine, pszWorkBuf, strlen(pszWorkBuf) + 1);
[1039]889 free(pszWorkBuf);
[909]890 if (fCancelAction){
891 fCancelAction = FALSE;
[1039]892 free(temp.pszCmdLine);
[909]893 break;
894 }
[1247]895 if (!strchr(temp.pszCmdLine, '%') && !fCancelAction){
[909]896 ret = saymsg(MB_YESNO,
897 HWND_DESKTOP,
898 NullStr,
899 GetPString(IDS_TOACTONSELECTEDTEXT));
900 if (ret == MBID_YES)
[985]901 strcat(temp.pszCmdLine, " %a");
[909]902 }
903 //remember item location in the list
[574]904 y = (SHORT) WinSendDlgItemMsg(hwnd,
[909]905 CMD_LISTBOX,
906 LM_QUERYSELECTION,
907 MPFROMSHORT(LIT_CURSOR), MPVOID);
908 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
909 bstrip(temp.title);
910 if (kill_command(temp.title)){
[551]911 x = (SHORT) WinSendDlgItemMsg(hwnd,
912 CMD_LISTBOX,
913 LM_QUERYSELECTION,
914 MPFROMSHORT(LIT_FIRST), MPVOID);
915 if (x >= 0) {
916 WinSendDlgItemMsg(hwnd,
917 CMD_LISTBOX,
918 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
919 WinSendDlgItemMsg(hwnd,
920 CMD_LISTBOX,
921 LM_SELECTITEM,
922 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
[507]923 }
[909]924 } // then do an add
925 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
926 temp.flags = 0;
927 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
928 temp.flags = FULLSCREEN;
929 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
930 temp.flags = MINIMIZED;
931 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
932 temp.flags = MAXIMIZED;
933 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
934 temp.flags = INVISIBLE;
935 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
936 temp.flags |= KEEP;
937 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
938 temp.flags |= PROMPT;
939 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
940 temp.flags |= ONCE;
941 info = add_command(&temp);
942 if (!info) {
943 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
944 GetPString(IDS_CANTADDCOMMANDTEXT),
945 temp.title);
946 }
[507]947
[551]948 else {
949 CHAR env[1002];
[507]950
[551]951 *env = 0;
952 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
953 bstripcr(env);
954 if (*env) {
[985]955 PrfWriteProfileString(fmprof, FM3Str, temp.pszCmdLine, env);
[909]956 } //put item back in original place
[551]957 x = (SHORT) WinSendDlgItemMsg(hwnd,
958 CMD_LISTBOX,
959 LM_INSERTITEM,
[574]960 MPFROM2SHORT(y, 0),
[551]961 MPFROMP(temp.title));
[909]962 if (x >= 0) {
963 LINKCMDS *temphead = NULL,*last = NULL, *temptail = NULL;
964 SHORT numitems, sSelect = 0;
965
[551]966 WinSendDlgItemMsg(hwnd,
967 CMD_LISTBOX,
968 LM_SETITEMHANDLE,
969 MPFROMSHORT(x), MPFROMP(info));
970 WinSendDlgItemMsg(hwnd,
971 CMD_LISTBOX,
972 LM_SELECTITEM,
[574]973 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[909]974 //then reorder
975 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
976 LM_QUERYITEMCOUNT,
977 MPVOID, MPVOID);
[574]978
[909]979 while (numitems) {
980
981
982 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
983 LM_QUERYITEMHANDLE,
984 MPFROMSHORT(sSelect++),
985 MPVOID);
986 if (info) {
987 if (!temphead) {
988 temphead = info;
989 info->prev = NULL;
990 }
991 else {
992 last->next = info;
993 info->prev = last;
994 }
995 temptail = info;
996 last = info;
997 info->next = NULL;
998 }
999 numitems--;
1000 }
1001 cmdhead = temphead;
1002 cmdtail = temptail;
1003 save_commands();
1004 }
[574]1005 }
[1039]1006 free(temp.pszCmdLine);
[2]1007 }
[551]1008 break;
1009 }
1010 return 0;
[2]1011 }
[551]1012 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]1013}
1014
[551]1015VOID RunCommand(HWND hwnd, INT cx)
[347]1016{
[551]1017 INT x;
1018 CHAR **list;
1019 LINKCMDS *info;
[2]1020
1021 list = BuildList(hwnd);
1022 x = 0;
1023 info = cmdhead;
[551]1024 while (info) {
[2]1025 x++;
[551]1026 if (x == cx)
[2]1027 break;
1028 info = info->next;
1029 }
[551]1030 if (info) {
[2]1031
[551]1032 INT flags;
[2]1033
1034 x--;
1035 flags = info->flags;
[551]1036 if (!(flags & FULLSCREEN))
[2]1037 flags |= WINDOWED;
[551]1038 if (flags & KEEP)
[2]1039 flags |= SEPARATEKEEP;
1040 else
1041 flags |= SEPARATE;
[204]1042 flags &= ~(KEEP | DIEAFTER);
[1337]1043 if (!strchr(info->pszCmdLine, '%')) {
1044 CHAR *fakelist[2];
[2]1045
[1337]1046 *fakelist = "C";
1047 fakelist[1] = NULL;
1048 ExecOnList(hwnd,
1049 info->pszCmdLine,
1050 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
1051 pszSrcFile, __LINE__);
1052 }
1053 else if ((flags & ONCE) && list && list[0]) {
1054
[551]1055 CHAR *fakelist[2];
1056 INT cntr;
[2]1057
1058 flags &= (~ONCE);
[551]1059 for (cntr = 0; list[cntr]; cntr++) {
[445]1060 *fakelist = list[cntr];
1061 fakelist[1] = NULL;
1062 ExecOnList(hwnd,
[989]1063 info->pszCmdLine,
[888]1064 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
1065 pszSrcFile, __LINE__);
[2]1066 }
1067 }
[1337]1068 else if (list && list[0])
[2]1069 ExecOnList(hwnd,
[989]1070 info->pszCmdLine,
[888]1071 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT),
1072 pszSrcFile, __LINE__);
[1337]1073 else
1074 return;
[2]1075 }
1076 FreeList(list);
1077 DosPostEventSem(CompactSem);
1078}
1079
[551]1080VOID EditCommands(HWND hwnd)
[347]1081{
[2]1082 static CHAR stop = 0;
1083
[551]1084 if (stop)
[2]1085 return;
1086 stop++;
[551]1087 if (!cmdloaded)
[2]1088 load_commands();
1089 WinDlgBox(HWND_DESKTOP,
[551]1090 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
[2]1091 stop = 0;
1092}
[793]1093
1094#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
1095#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.