source: trunk/dll/command.c@ 1102

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

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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