source: trunk/dll/command.c@ 888

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

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

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