source: trunk/dll/command.c@ 793

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

Move #pragma alloc_text to end for OpenWatcom compat

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 23.1 KB
RevLine 
[123]1
2/***********************************************************************
3
4 $Id: command.c 793 2007-08-21 02:53:38Z 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 {
[551]563 CHAR filename[CCHMAXPATH + 9];
[2]564
[551]565 *filename = 0;
566 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
567 strcat(filename, " %a");
568 WinSetDlgItemText(hwnd, CMD_CL, filename);
569 }
[2]570 }
571 break;
572
[551]573 case CMD_REORDER:
574 if (!cmdhead || !cmdhead->next) {
575 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
576 break;
577 }
578 if (WinDlgBox(HWND_DESKTOP, hwnd, ReOrderProc, FM3ModHandle,
579 RE_FRAME, MPVOID)) {
580 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
581 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
582 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
583 info = cmdhead;
584 while (info) {
585 x = (SHORT) WinSendDlgItemMsg(hwnd,
586 CMD_LISTBOX,
587 LM_INSERTITEM,
588 MPFROM2SHORT(LIT_END, 0),
589 MPFROMP(info->title));
590 if (x >= 0)
591 WinSendDlgItemMsg(hwnd,
592 CMD_LISTBOX,
593 LM_SETITEMHANDLE,
594 MPFROMSHORT(x), MPFROMP(info));
595 info = info->next;
[445]596 }
[551]597 WinSendDlgItemMsg(hwnd,
598 CMD_LISTBOX,
599 LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
600 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
601 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
602 WinCheckButton(hwnd, CMD_ONCE, FALSE);
603 save_commands();
[2]604 }
[551]605 break;
[2]606
[551]607 case DID_OK:
608 {
609 x = (SHORT) WinSendDlgItemMsg(hwnd,
610 CMD_LISTBOX,
611 LM_QUERYSELECTION, MPVOID, MPVOID);
612 if (x == LIT_NONE)
613 x = (SHORT) WinSendDlgItemMsg(hwnd,
614 CMD_LISTBOX,
615 LM_SELECTITEM,
616 MPFROMSHORT(0), MPFROMSHORT(TRUE));
617 }
618 {
619 COMMAND temp;
[2]620
[551]621 memset(&temp, 0, sizeof(COMMAND));
622 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
623 bstrip(temp.cl);
624 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
625 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
626 temp.flags = 0;
627 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
628 temp.flags = FULLSCREEN;
629 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
630 temp.flags = MINIMIZED;
631 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
632 temp.flags = MAXIMIZED;
633 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
634 temp.flags = INVISIBLE;
635 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
636 temp.flags |= KEEP;
637 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
638 temp.flags |= PROMPT;
639 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
640 temp.flags |= ONCE;
641 info = add_command(&temp);
642 if (!info)
[552]643 {
[551]644 WinDismissDlg(hwnd, 0);
[574]645 /*saymsg(MB_ENTER, hwnd,
[551]646 GetPString(IDS_ERRORTEXT),
[552]647 GetPString(IDS_CANTADDCOMMANDTEXT),
[574]648 temp.title);*/
[552]649 }
[551]650 else {
651 CHAR env[1002];
[2]652
[551]653 *env = 0;
654 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
655 bstripcr(env);
656 if (*env) {
657 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]658 }
[551]659 x = (SHORT) WinSendDlgItemMsg(hwnd,
660 CMD_LISTBOX,
661 LM_INSERTITEM,
662 MPFROM2SHORT(LIT_END, 0),
663 MPFROMP(temp.title));
664 if (x >= 0) {
[445]665 WinSendDlgItemMsg(hwnd,
666 CMD_LISTBOX,
[551]667 LM_SETITEMHANDLE,
668 MPFROMSHORT(x), MPFROMP(info));
[445]669 WinSendDlgItemMsg(hwnd,
670 CMD_LISTBOX,
671 LM_SELECTITEM,
[551]672 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[445]673 save_commands();
674 }
[551]675 }
676 }
677 x = (SHORT) WinSendDlgItemMsg(hwnd,
678 CMD_LISTBOX,
679 LM_QUERYSELECTION,
680 MPFROMSHORT(LIT_FIRST), MPVOID);
681 WinDismissDlg(hwnd, 0);
682 break;
[2]683
[551]684 case DID_CANCEL:
685 WinDismissDlg(hwnd, 0);
686 break;
[507]687
[551]688 case IDM_HELP:
689 if (hwndHelp)
690 WinSendMsg(hwndHelp,
691 HM_DISPLAY_HELP,
692 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
693 break;
[507]694
[551]695 case CMD_ADD:
696 {
697 COMMAND temp;
[2]698
[551]699 memset(&temp, 0, sizeof(COMMAND));
700 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
701 bstrip(temp.cl);
702 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
703 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
704 temp.flags = 0;
705 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
706 temp.flags = FULLSCREEN;
707 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
708 temp.flags = MINIMIZED;
709 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
710 temp.flags = MAXIMIZED;
711 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
712 temp.flags = INVISIBLE;
713 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
714 temp.flags |= KEEP;
715 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
716 temp.flags |= PROMPT;
717 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
718 temp.flags |= ONCE;
719 info = add_command(&temp);
720 if (!info) {
721 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
[552]722 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
[551]723 }
724 else {
725 CHAR env[1002];
[2]726
[551]727 *env = 0;
728 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
729 bstripcr(env);
730 if (*env) {
731 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]732 }
[551]733 x = (SHORT) WinSendDlgItemMsg(hwnd,
734 CMD_LISTBOX,
735 LM_INSERTITEM,
736 MPFROM2SHORT(LIT_END, 0),
737 MPFROMP(temp.title));
738 if (x >= 0) {
739 WinSendDlgItemMsg(hwnd,
740 CMD_LISTBOX,
741 LM_SETITEMHANDLE,
742 MPFROMSHORT(x), MPFROMP(info));
743 WinSendDlgItemMsg(hwnd,
744 CMD_LISTBOX,
745 LM_SELECTITEM,
746 MPFROMSHORT(x), MPFROMSHORT(TRUE));
747 save_commands();
748 }
749 }
750 }
751 break;
[2]752
[551]753 case CMD_DELETE:
754 {
755 CHAR temp[34];
[2]756
[551]757 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
758 bstrip(temp);
759 if (!kill_command(temp))
760 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
761 else {
762 x = (SHORT) WinSendDlgItemMsg(hwnd,
763 CMD_LISTBOX,
764 LM_QUERYSELECTION,
765 MPFROMSHORT(LIT_FIRST), MPVOID);
766 if (x >= 0) {
767 WinSendDlgItemMsg(hwnd,
768 CMD_LISTBOX,
769 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
770 WinSendDlgItemMsg(hwnd,
771 CMD_LISTBOX,
772 LM_SELECTITEM,
773 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
[445]774 }
[551]775 save_commands();
776 }
777 }
778 break;
779 case CMD_REPLACE:
780 {
781 CHAR temp[34];
[574]782 y = (SHORT) WinSendDlgItemMsg(hwnd,
783 CMD_LISTBOX,
784 LM_QUERYSELECTION,
785 MPFROMSHORT(LIT_CURSOR), MPVOID);
[551]786 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
787 bstrip(temp);
[552]788 if (kill_command(temp))
789 {
[551]790 x = (SHORT) WinSendDlgItemMsg(hwnd,
791 CMD_LISTBOX,
792 LM_QUERYSELECTION,
793 MPFROMSHORT(LIT_FIRST), MPVOID);
794 if (x >= 0) {
795 WinSendDlgItemMsg(hwnd,
796 CMD_LISTBOX,
797 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
798 WinSendDlgItemMsg(hwnd,
799 CMD_LISTBOX,
800 LM_SELECTITEM,
801 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
[507]802 }
[551]803 save_commands();
804 }
805 }
806 {
807 COMMAND temp;
[507]808
[551]809 memset(&temp, 0, sizeof(COMMAND));
810 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
811 bstrip(temp.cl);
812 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
813 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
814 temp.flags = 0;
815 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
816 temp.flags = FULLSCREEN;
817 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
818 temp.flags = MINIMIZED;
819 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
820 temp.flags = MAXIMIZED;
821 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
822 temp.flags = INVISIBLE;
823 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
824 temp.flags |= KEEP;
825 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
826 temp.flags |= PROMPT;
827 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
828 temp.flags |= ONCE;
829 info = add_command(&temp);
830 if (!info) {
831 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
[552]832 GetPString(IDS_CANTADDCOMMANDTEXT),
833 temp.title);
[551]834 }
835 else {
836 CHAR env[1002];
[507]837
[551]838 *env = 0;
839 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
840 bstripcr(env);
841 if (*env) {
842 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[507]843 }
[551]844 x = (SHORT) WinSendDlgItemMsg(hwnd,
845 CMD_LISTBOX,
846 LM_INSERTITEM,
[574]847 MPFROM2SHORT(y, 0),
[551]848 MPFROMP(temp.title));
849 if (x >= 0) {
850 WinSendDlgItemMsg(hwnd,
851 CMD_LISTBOX,
852 LM_SETITEMHANDLE,
853 MPFROMSHORT(x), MPFROMP(info));
854 WinSendDlgItemMsg(hwnd,
855 CMD_LISTBOX,
856 LM_SELECTITEM,
[574]857 MPFROMSHORT(x), MPFROMSHORT(TRUE));
858 {
859 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
860 SHORT sSelect, numitems;
861
862 sSelect = 0;
863 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
864 LM_QUERYITEMCOUNT,
865 MPVOID, MPVOID);
866 while (numitems) {
867 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
868 LM_QUERYITEMHANDLE,
869 MPFROMSHORT(sSelect++),
870 MPVOID);
871 if (info) {
872 if (!temphead) {
873 temphead = info;
874 info->prev = NULL;
875 }
876 else {
877 last->next = info;
878 info->prev = last;
879 }
880 temptail = info;
881 last = info;
882 info->next = NULL;
883 }
884 numitems--;
885 }
886 }
[551]887 save_commands();
888 }
889 }
[2]890 }
[551]891 break;
892 }
893 return 0;
[2]894 }
[551]895 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]896}
897
[551]898VOID RunCommand(HWND hwnd, INT cx)
[347]899{
[551]900 INT x;
901 CHAR **list;
902 LINKCMDS *info;
[2]903
904 list = BuildList(hwnd);
[551]905 if (!list || !list[0])
[2]906 return;
907 x = 0;
908 info = cmdhead;
[551]909 while (info) {
[2]910 x++;
[551]911 if (x == cx)
[2]912 break;
913 info = info->next;
914 }
[551]915 if (info) {
[2]916
[551]917 INT flags;
[2]918
919 x--;
920 flags = info->flags;
[551]921 if (!(flags & FULLSCREEN))
[2]922 flags |= WINDOWED;
[551]923 if (flags & KEEP)
[2]924 flags |= SEPARATEKEEP;
925 else
926 flags |= SEPARATE;
[204]927 flags &= ~(KEEP | DIEAFTER);
[551]928 if ((flags & ONCE) && list && list[0]) {
[2]929
[551]930 CHAR *fakelist[2];
931 INT cntr;
[2]932
933 flags &= (~ONCE);
[551]934 for (cntr = 0; list[cntr]; cntr++) {
[445]935 *fakelist = list[cntr];
936 fakelist[1] = NULL;
937 ExecOnList(hwnd,
938 info->cl,
[551]939 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT));
[2]940 }
941 }
942 else
943 ExecOnList(hwnd,
[445]944 info->cl,
[551]945 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT));
[2]946 }
947 FreeList(list);
948 DosPostEventSem(CompactSem);
949}
950
[551]951VOID EditCommands(HWND hwnd)
[347]952{
[2]953 static CHAR stop = 0;
954
[551]955 if (stop)
[2]956 return;
957 stop++;
[551]958 if (!cmdloaded)
[2]959 load_commands();
960 WinDlgBox(HWND_DESKTOP,
[551]961 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
[2]962 stop = 0;
963}
[793]964
965#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
966#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
Note: See TracBrowser for help on using the repository browser.