source: trunk/dll/command.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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