source: trunk/dll/command.c@ 1063

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

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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