source: trunk/dll/command.c@ 1188

Last change on this file since 1188 was 1188, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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