source: trunk/dll/command.c@ 927

Last change on this file since 927 was 927, checked in by Gregg Young, 18 years ago

Free pszWorkBuf memory for NormalizeCmdLine calls. Add comments for ticket 161 fix.

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