source: trunk/dll/command.c@ 1104

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

Replace save_dir2(dir) with strcpy(dir, pFM2SaveDirectory)

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