source: trunk/dll/command.c@ 1119

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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