source: trunk/dll/command.c@ 911

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

Commenting, help file, history update for recent changes; Minor clean up.

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