source: trunk/dll/command.c@ 1078

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

More Fortify infrastructure enhancements
Rework Fortify_SetOwner
Add Fortify_BecomeOwner
Avoid more spurious leak reports

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