source: trunk/dll/command.c@ 1205

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

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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