source: trunk/dll/command.c@ 1221

Last change on this file since 1221 was 1221, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.0 KB
RevLine 
[123]1
2/***********************************************************************
3
4 $Id: command.c 1221 2008-09-13 23:10:12Z jbs $
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
[123]29
30***********************************************************************/
31
[2]32#include <stdlib.h>
33#include <string.h>
34#include <share.h>
[347]35
[907]36#define INCL_DOS
37#define INCL_WIN
38#define INCL_LONGLONG // dircnrs.h
39
[1188]40#include "fm3dll.h"
[1221]41#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1205]42#include "notebook.h" // Data declaration(s)
43#include "init.h" // Data declaration(s)
44#include "mainwnd.h" // Data declaration(s)
45#include "newview.h" // Data declarations
[2]46#include "fm3dlg.h"
47#include "fm3str.h"
48#include "tools.h"
[907]49#include "arccnrs.h" // BldQuotedFileName
50#include "errutil.h" // Dos_Error...
51#include "strutil.h" // GetPString
[1188]52#include "droplist.h" // AcceptOneDrop, DropHelp, GetOneDrop
53#include "misc.h" // DrawTargetEmphasis
54#include "systemf.h" // ExecOnList
55#include "getnames.h" // insert_filename
56#include "wrappers.h" // xfgets
[920]57#include "pathutil.h" // NormalizeCmdLine
[989]58#include "command.h"
[1188]59#include "strips.h" // bstrip
60#include "dirs.h" // save_dir2
[1039]61#include "fortify.h"
[2]62
[551]63typedef struct
64{
[985]65 PSZ pszCmdLine;
[551]66 INT flags;
67 CHAR title[34];
68}
69COMMAND;
[2]70
[1205]71// Data defintions
[2]72#pragma data_seg(DATA1)
[347]73
74static PSZ pszSrcFile = __FILE__;
[1205]75static LINKCMDS *cmdtail;
[347]76
[1205]77#pragma data_seg(GLOBAL2)
78LINKCMDS *cmdhead;
79BOOL cmdloaded;
80
[551]81MRESULT EXPENTRY CommandTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[347]82{
[574]83 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]84 static BOOL emphasized = FALSE;
85
[551]86 switch (msg) {
87 case DM_DRAGOVER:
88 if (!emphasized) {
89 emphasized = TRUE;
90 DrawTargetEmphasis(hwnd, emphasized);
91 }
[618]92 if (AcceptOneDrop(hwnd, mp1, mp2))
[551]93 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
94 return MRFROM2SHORT(DOR_NEVERDROP, 0);
[2]95
[551]96 case DM_DRAGLEAVE:
97 if (emphasized) {
98 emphasized = FALSE;
99 DrawTargetEmphasis(hwnd, emphasized);
100 }
101 break;
102
103 case DM_DROPHELP:
104 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DROPCMDHELPTEXT));
105 return 0;
106
107 case DM_DROP:
108 {
109 char szFrom[CCHMAXPATH + 5];
110
111 if (emphasized) {
[445]112 emphasized = FALSE;
[551]113 DrawTargetEmphasis(hwnd, emphasized);
[2]114 }
[618]115 if (GetOneDrop(hwnd, mp1, mp2, szFrom, CCHMAXPATH)) {
[551]116 strcat(szFrom, " %a");
117 WinSetWindowText(hwnd, szFrom);
118 }
119 }
120 return 0;
121 }
122 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
123 WinDefWindowProc(hwnd, msg, mp1, mp2);
124}
125
126MRESULT EXPENTRY ReOrderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
127{
128 switch (msg) {
129 case WM_INITDLG:
130 if (!cmdhead) {
131 WinDismissDlg(hwnd, 0);
[2]132 break;
[551]133 }
134 {
135 LINKCMDS *info;
136 SHORT x;
[2]137
[551]138 info = cmdhead;
139 while (info) {
140 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_INSERTITEM,
141 MPFROMSHORT(LIT_END),
142 MPFROMP(info->title));
143 if (x < 0) {
144 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
145 WinDismissDlg(hwnd, 0);
[445]146 }
[551]147 else {
148 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SETITEMHANDLE,
149 MPFROMSHORT(x), MPFROMP(info));
[445]150 }
[551]151 info = info->next;
[2]152 }
[551]153 }
154 break;
[2]155
[551]156 case WM_CONTROL:
157 return 0;
[2]158
[551]159 case WM_COMMAND:
160 switch (SHORT1FROMMP(mp1)) {
161 case DID_CANCEL:
162 WinDismissDlg(hwnd, 0);
163 break;
164
165 case DID_OK:
[2]166 {
[551]167 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
168 SHORT sSelect, numitems;
[2]169
[551]170 sSelect = 0;
171 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
172 LM_QUERYITEMCOUNT,
173 MPVOID, MPVOID);
174 while (numitems) {
175 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
176 LM_QUERYITEMHANDLE,
177 MPFROMSHORT(sSelect++),
178 MPVOID);
179 if (info) {
180 if (!temphead) {
181 temphead = info;
182 info->prev = NULL;
183 }
184 else {
185 last->next = info;
186 info->prev = last;
187 }
188 temptail = info;
189 last = info;
190 info->next = NULL;
[347]191 }
[551]192 numitems--;
193 }
194 sSelect = 0;
195 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
196 LM_QUERYITEMCOUNT,
197 MPVOID, MPVOID);
198 while (numitems) {
199 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
200 LM_QUERYITEMHANDLE,
201 MPFROMSHORT(sSelect++),
202 MPVOID);
203 if (info) {
204 if (!temphead) {
205 temphead = info;
206 info->prev = NULL;
207 }
208 else {
209 last->next = info;
210 info->prev = last;
211 }
212 temptail = info;
213 last = info;
214 info->next = NULL;
[347]215 }
[551]216 numitems--;
[445]217 }
[551]218 cmdhead = temphead;
219 cmdtail = temptail;
[2]220 }
[551]221 WinDismissDlg(hwnd, 1);
[2]222 break;
223
[551]224 case IDM_HELP:
225 if (hwndHelp)
226 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
227 MPFROM2SHORT(HELP_REORDERCOMMANDS, 0),
228 MPFROMSHORT(HM_RESOURCEID));
229 break;
[2]230
[551]231 case RE_ADD:
232 {
233 SHORT sSelect, x;
234 LINKCMDS *info;
[2]235
[551]236 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
237 LM_QUERYSELECTION,
238 MPFROMSHORT(LIT_FIRST), MPVOID);
239 while (sSelect >= 0) {
240 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
241 LM_QUERYITEMHANDLE,
242 MPFROMSHORT(sSelect), MPVOID);
243 if (info) {
244 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
245 LM_INSERTITEM,
246 MPFROM2SHORT(LIT_END, 0),
247 MPFROMP(info->title));
248 if (x >= 0) {
249 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
250 LM_SETITEMHANDLE,
251 MPFROMSHORT(x), MPFROMP(info));
252 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_DELETEITEM,
253 MPFROMSHORT(sSelect), MPVOID);
[445]254 }
255 }
[551]256 else
257 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SELECTITEM,
258 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
259 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
[445]260 LM_QUERYSELECTION,
261 MPFROMSHORT(LIT_FIRST),
262 MPVOID);
[551]263 }
264 }
265 break;
266
267 case RE_REMOVE:
268 {
269 SHORT sSelect, x;
270 LINKCMDS *info;
271
272 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
273 LM_QUERYSELECTION,
274 MPFROMSHORT(LIT_FIRST), MPVOID);
275 while (sSelect >= 0) {
276 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
277 LM_QUERYITEMHANDLE,
278 MPFROMSHORT(sSelect), MPVOID);
279 if (info) {
280 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
281 LM_INSERTITEM,
282 MPFROM2SHORT(LIT_END, 0),
283 MPFROMP(info->title));
284 if (x >= 0) {
285 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
286 LM_SETITEMHANDLE,
287 MPFROMSHORT(x), MPFROMP(info));
288 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_DELETEITEM,
289 MPFROMSHORT(sSelect), MPVOID);
[445]290 }
291 }
[551]292 else
293 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_SELECTITEM,
294 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
295 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
[445]296 LM_QUERYSELECTION,
297 MPFROMSHORT(LIT_FIRST),
298 MPVOID);
[551]299 }
[2]300 }
[551]301 break;
302 }
303 return 0;
[2]304 }
[551]305 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]306}
307
[551]308CHAR *command_title(INT cx)
[347]309{
[551]310 static CHAR duh[] = "???";
311 LINKCMDS *info;
312 INT x = 0;
[2]313
[551]314 if (!cmdloaded)
[2]315 load_commands();
316 info = cmdhead;
[551]317 while (info) {
318 if (x == cx)
[2]319 return info->title;
320 info = info->next;
321 }
322 return duh;
323}
324
[551]325VOID free_commands(VOID)
[347]326{
[551]327 LINKCMDS *info, *next;
[2]328
329 info = cmdhead;
[551]330 while (info) {
[2]331 next = info->next;
[1009]332 xfree(info->title, pszSrcFile, __LINE__);
333 xfree(info->pszCmdLine, pszSrcFile, __LINE__);
[1039]334 free(info);
[2]335 info = next;
336 }
337 cmdhead = cmdtail = NULL;
338}
339
[551]340VOID load_commands(VOID)
[347]341{
[551]342 FILE *fp;
[2]343 LINKCMDS *info;
[989]344 PSZ pszCmdLine;
[551]345 CHAR title[100];
346 CHAR flags[72];
[2]347
[551]348 if (cmdhead)
[2]349 free_commands();
350 cmdloaded = TRUE;
[989]351 pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
352 if (pszCmdLine) {
[1082]353 BldFullPathName(pszCmdLine, pFM2SaveDirectory, "COMMANDS.DAT");
[989]354 fp = _fsopen(pszCmdLine, "r", SH_DENYWR);
355 if (fp) {
356 while (!feof(fp)) {
357 if (!xfgets_bstripcr(title, sizeof(title), fp, pszSrcFile, __LINE__))
358 break;
359 title[34] = 0; // fixme to know why chopped this way?
360 bstripcr(title);
361 if (!*title || *title == ';')
362 continue;
363 if (!xfgets(pszCmdLine, MaxComLineStrg, fp, pszSrcFile, __LINE__))
364 break; /* error! */
365 if (!xfgets(flags, 72, fp, pszSrcFile, __LINE__))
366 break; /* error! */
367 pszCmdLine[MaxComLineStrg - 1] = 0; // fixme to know why chopped this way?
368 bstripcr(pszCmdLine);
369 flags[34] = 0;
370 bstripcr(flags);
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,
[989]427 ";\n%0.34s\n%0.*s\n%lu\n",
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,
514 MPFROM2SHORT(1000, 0), MPVOID);
515 WinSendDlgItemMsg(hwnd, CMD_TITLE, EM_SETTEXTLIMIT,
516 MPFROM2SHORT(33, 0), MPVOID);
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);
[985]672 if (!strchr(temp.pszCmdLine, '%')){
[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);
[985]777 if (!strchr(temp.pszCmdLine, '%')){
[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 {
845 CHAR temp[34];
[2]846
[551]847 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
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 }
[985]895 if (!strchr(temp.pszCmdLine, '%')){
[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);
[551]1022 if (!list || !list[0])
[2]1023 return;
1024 x = 0;
1025 info = cmdhead;
[551]1026 while (info) {
[2]1027 x++;
[551]1028 if (x == cx)
[2]1029 break;
1030 info = info->next;
1031 }
[551]1032 if (info) {
[2]1033
[551]1034 INT flags;
[2]1035
1036 x--;
1037 flags = info->flags;
[551]1038 if (!(flags & FULLSCREEN))
[2]1039 flags |= WINDOWED;
[551]1040 if (flags & KEEP)
[2]1041 flags |= SEPARATEKEEP;
1042 else
1043 flags |= SEPARATE;
[204]1044 flags &= ~(KEEP | DIEAFTER);
[551]1045 if ((flags & ONCE) && list && list[0]) {
[2]1046
[551]1047 CHAR *fakelist[2];
1048 INT cntr;
[2]1049
1050 flags &= (~ONCE);
[551]1051 for (cntr = 0; list[cntr]; cntr++) {
[445]1052 *fakelist = list[cntr];
1053 fakelist[1] = NULL;
1054 ExecOnList(hwnd,
[989]1055 info->pszCmdLine,
[888]1056 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
1057 pszSrcFile, __LINE__);
[2]1058 }
1059 }
1060 else
1061 ExecOnList(hwnd,
[989]1062 info->pszCmdLine,
[888]1063 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT),
1064 pszSrcFile, __LINE__);
[2]1065 }
1066 FreeList(list);
1067 DosPostEventSem(CompactSem);
1068}
1069
[551]1070VOID EditCommands(HWND hwnd)
[347]1071{
[2]1072 static CHAR stop = 0;
1073
[551]1074 if (stop)
[2]1075 return;
1076 stop++;
[551]1077 if (!cmdloaded)
[2]1078 load_commands();
1079 WinDlgBox(HWND_DESKTOP,
[551]1080 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
[2]1081 stop = 0;
1082}
[793]1083
1084#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
1085#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.