source: trunk/dll/command.c@ 920

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

Cleanup of NormalizeCmdLine moved to pathutil.c

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.9 KB
RevLine 
[123]1
2/***********************************************************************
3
4 $Id: command.c 920 2008-01-13 01:18:17Z 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);
[909]631 if (!strchr(temp.cl, '%')){
632 ret = saymsg(MB_YESNO,
633 HWND_DESKTOP,
634 NullStr,
635 GetPString(IDS_TOACTONSELECTEDTEXT));
636 if (ret == MBID_YES)
637 strcat(temp.cl, " %a");
638 }
[551]639 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
640 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
641 temp.flags = 0;
642 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
643 temp.flags = FULLSCREEN;
644 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
645 temp.flags = MINIMIZED;
646 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
647 temp.flags = MAXIMIZED;
648 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
649 temp.flags = INVISIBLE;
650 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
651 temp.flags |= KEEP;
652 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
653 temp.flags |= PROMPT;
654 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
[909]655 temp.flags |= ONCE;
656 if (fCancelAction){
657 fCancelAction = FALSE;
658 break;
659 }
660 else
661 info = add_command(&temp);
662 if (!info)
[552]663 {
[551]664 WinDismissDlg(hwnd, 0);
[574]665 /*saymsg(MB_ENTER, hwnd,
[551]666 GetPString(IDS_ERRORTEXT),
[552]667 GetPString(IDS_CANTADDCOMMANDTEXT),
[574]668 temp.title);*/
[552]669 }
[551]670 else {
671 CHAR env[1002];
[2]672
[551]673 *env = 0;
674 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
675 bstripcr(env);
676 if (*env) {
677 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]678 }
[551]679 x = (SHORT) WinSendDlgItemMsg(hwnd,
680 CMD_LISTBOX,
681 LM_INSERTITEM,
682 MPFROM2SHORT(LIT_END, 0),
683 MPFROMP(temp.title));
684 if (x >= 0) {
[445]685 WinSendDlgItemMsg(hwnd,
686 CMD_LISTBOX,
[551]687 LM_SETITEMHANDLE,
688 MPFROMSHORT(x), MPFROMP(info));
[445]689 WinSendDlgItemMsg(hwnd,
690 CMD_LISTBOX,
691 LM_SELECTITEM,
[551]692 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[445]693 save_commands();
694 }
[551]695 }
696 }
697 x = (SHORT) WinSendDlgItemMsg(hwnd,
698 CMD_LISTBOX,
699 LM_QUERYSELECTION,
700 MPFROMSHORT(LIT_FIRST), MPVOID);
701 WinDismissDlg(hwnd, 0);
702 break;
[2]703
[551]704 case DID_CANCEL:
705 WinDismissDlg(hwnd, 0);
706 break;
[507]707
[551]708 case IDM_HELP:
709 if (hwndHelp)
710 WinSendMsg(hwndHelp,
711 HM_DISPLAY_HELP,
712 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
713 break;
[507]714
[551]715 case CMD_ADD:
716 {
[909]717 COMMAND temp;
[920]718 PSZ pszWorkBuf;
[909]719 APIRET ret;
[2]720
[920]721 pszWorkBuf = xmalloc(MAXCOMLINESTRG, pszSrcFile, __LINE__);
[551]722 memset(&temp, 0, sizeof(COMMAND));
723 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
[920]724 NormalizeCmdLine(pszWorkBuf, temp.cl);
725 memcpy(temp.cl, pszWorkBuf, strlen(pszWorkBuf) + 1);
[909]726 if (!strchr(temp.cl, '%')){
727 ret = saymsg(MB_YESNO,
728 HWND_DESKTOP,
729 NullStr,
730 GetPString(IDS_TOACTONSELECTEDTEXT));
731 if (ret == MBID_YES)
732 strcat(temp.cl, " %a");
733 }
[551]734 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
735 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
736 temp.flags = 0;
737 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
738 temp.flags = FULLSCREEN;
739 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
740 temp.flags = MINIMIZED;
741 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
742 temp.flags = MAXIMIZED;
743 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
744 temp.flags = INVISIBLE;
745 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
746 temp.flags |= KEEP;
747 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
748 temp.flags |= PROMPT;
749 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
[909]750 temp.flags |= ONCE;
751 if (fCancelAction){
752 fCancelAction = FALSE;
753 break;
754 }
755 else
756 info = add_command(&temp);
[551]757 if (!info) {
758 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
[552]759 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
[551]760 }
761 else {
762 CHAR env[1002];
[2]763
[551]764 *env = 0;
765 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
766 bstripcr(env);
767 if (*env) {
768 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]769 }
[551]770 x = (SHORT) WinSendDlgItemMsg(hwnd,
771 CMD_LISTBOX,
772 LM_INSERTITEM,
773 MPFROM2SHORT(LIT_END, 0),
774 MPFROMP(temp.title));
775 if (x >= 0) {
776 WinSendDlgItemMsg(hwnd,
777 CMD_LISTBOX,
778 LM_SETITEMHANDLE,
779 MPFROMSHORT(x), MPFROMP(info));
780 WinSendDlgItemMsg(hwnd,
781 CMD_LISTBOX,
782 LM_SELECTITEM,
783 MPFROMSHORT(x), MPFROMSHORT(TRUE));
784 save_commands();
785 }
786 }
787 }
788 break;
[2]789
[551]790 case CMD_DELETE:
791 {
792 CHAR temp[34];
[2]793
[551]794 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
795 bstrip(temp);
796 if (!kill_command(temp))
797 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
798 else {
799 x = (SHORT) WinSendDlgItemMsg(hwnd,
800 CMD_LISTBOX,
801 LM_QUERYSELECTION,
802 MPFROMSHORT(LIT_FIRST), MPVOID);
803 if (x >= 0) {
804 WinSendDlgItemMsg(hwnd,
805 CMD_LISTBOX,
806 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
807 WinSendDlgItemMsg(hwnd,
808 CMD_LISTBOX,
809 LM_SELECTITEM,
810 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
[445]811 }
[551]812 save_commands();
813 }
814 }
815 break;
816 case CMD_REPLACE:
[909]817 { //Delete first
[920]818 PSZ pszWorkBuf;
[909]819 COMMAND temp;
820 APIRET ret;
821
[920]822 pszWorkBuf = xmalloc(MAXCOMLINESTRG, pszSrcFile, __LINE__);
[909]823 memset(&temp, 0, sizeof(COMMAND));
824 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
[920]825 NormalizeCmdLine(pszWorkBuf, temp.cl);
826 memcpy(temp.cl, pszWorkBuf, strlen(pszWorkBuf) + 1);
[909]827 if (fCancelAction){
828 fCancelAction = FALSE;
829 break;
830 }
831 if (!strchr(temp.cl, '%')){
832 ret = saymsg(MB_YESNO,
833 HWND_DESKTOP,
834 NullStr,
835 GetPString(IDS_TOACTONSELECTEDTEXT));
836 if (ret == MBID_YES)
837 strcat(temp.cl, " %a");
838 }
839 //remember item location in the list
[574]840 y = (SHORT) WinSendDlgItemMsg(hwnd,
[909]841 CMD_LISTBOX,
842 LM_QUERYSELECTION,
843 MPFROMSHORT(LIT_CURSOR), MPVOID);
844 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
845 bstrip(temp.title);
846 if (kill_command(temp.title)){
[551]847 x = (SHORT) WinSendDlgItemMsg(hwnd,
848 CMD_LISTBOX,
849 LM_QUERYSELECTION,
850 MPFROMSHORT(LIT_FIRST), MPVOID);
851 if (x >= 0) {
852 WinSendDlgItemMsg(hwnd,
853 CMD_LISTBOX,
854 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
855 WinSendDlgItemMsg(hwnd,
856 CMD_LISTBOX,
857 LM_SELECTITEM,
858 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
[507]859 }
[909]860 } // then do an add
861 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
862 temp.flags = 0;
863 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
864 temp.flags = FULLSCREEN;
865 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
866 temp.flags = MINIMIZED;
867 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
868 temp.flags = MAXIMIZED;
869 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
870 temp.flags = INVISIBLE;
871 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
872 temp.flags |= KEEP;
873 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
874 temp.flags |= PROMPT;
875 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
876 temp.flags |= ONCE;
877 info = add_command(&temp);
878 if (!info) {
879 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
880 GetPString(IDS_CANTADDCOMMANDTEXT),
881 temp.title);
882 }
[507]883
[551]884 else {
885 CHAR env[1002];
[507]886
[551]887 *env = 0;
888 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
889 bstripcr(env);
890 if (*env) {
891 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[909]892 } //put item back in original place
[551]893 x = (SHORT) WinSendDlgItemMsg(hwnd,
894 CMD_LISTBOX,
895 LM_INSERTITEM,
[574]896 MPFROM2SHORT(y, 0),
[551]897 MPFROMP(temp.title));
[909]898 if (x >= 0) {
899 LINKCMDS *temphead = NULL,*last = NULL, *temptail = NULL;
900 SHORT numitems, sSelect = 0;
901
[551]902 WinSendDlgItemMsg(hwnd,
903 CMD_LISTBOX,
904 LM_SETITEMHANDLE,
905 MPFROMSHORT(x), MPFROMP(info));
906 WinSendDlgItemMsg(hwnd,
907 CMD_LISTBOX,
908 LM_SELECTITEM,
[574]909 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[909]910 //then reorder
911 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
912 LM_QUERYITEMCOUNT,
913 MPVOID, MPVOID);
[574]914
[909]915 while (numitems) {
916
917
918 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
919 LM_QUERYITEMHANDLE,
920 MPFROMSHORT(sSelect++),
921 MPVOID);
922 if (info) {
923 if (!temphead) {
924 temphead = info;
925 info->prev = NULL;
926 }
927 else {
928 last->next = info;
929 info->prev = last;
930 }
931 temptail = info;
932 last = info;
933 info->next = NULL;
934 }
935 numitems--;
936 }
937 cmdhead = temphead;
938 cmdtail = temptail;
939 save_commands();
940 }
[574]941 }
[2]942 }
[551]943 break;
944 }
945 return 0;
[2]946 }
[551]947 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]948}
949
[551]950VOID RunCommand(HWND hwnd, INT cx)
[347]951{
[551]952 INT x;
953 CHAR **list;
954 LINKCMDS *info;
[2]955
956 list = BuildList(hwnd);
[551]957 if (!list || !list[0])
[2]958 return;
959 x = 0;
960 info = cmdhead;
[551]961 while (info) {
[2]962 x++;
[551]963 if (x == cx)
[2]964 break;
965 info = info->next;
966 }
[551]967 if (info) {
[2]968
[551]969 INT flags;
[2]970
971 x--;
972 flags = info->flags;
[551]973 if (!(flags & FULLSCREEN))
[2]974 flags |= WINDOWED;
[551]975 if (flags & KEEP)
[2]976 flags |= SEPARATEKEEP;
977 else
978 flags |= SEPARATE;
[204]979 flags &= ~(KEEP | DIEAFTER);
[551]980 if ((flags & ONCE) && list && list[0]) {
[2]981
[551]982 CHAR *fakelist[2];
983 INT cntr;
[2]984
985 flags &= (~ONCE);
[551]986 for (cntr = 0; list[cntr]; cntr++) {
[445]987 *fakelist = list[cntr];
988 fakelist[1] = NULL;
989 ExecOnList(hwnd,
990 info->cl,
[888]991 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT),
992 pszSrcFile, __LINE__);
[2]993 }
994 }
995 else
996 ExecOnList(hwnd,
[445]997 info->cl,
[888]998 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT),
999 pszSrcFile, __LINE__);
[2]1000 }
1001 FreeList(list);
1002 DosPostEventSem(CompactSem);
1003}
1004
[551]1005VOID EditCommands(HWND hwnd)
[347]1006{
[2]1007 static CHAR stop = 0;
1008
[551]1009 if (stop)
[2]1010 return;
1011 stop++;
[551]1012 if (!cmdloaded)
[2]1013 load_commands();
1014 WinDlgBox(HWND_DESKTOP,
[551]1015 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
[2]1016 stop = 0;
1017}
[793]1018
1019#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
1020#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.