source: trunk/dll/shadow.c@ 1498

Last change on this file since 1498 was 1498, checked in by Gregg Young, 16 years ago

Changes to get FM2 to compile with the latest watcom 1.9 beta (mostly type casts of CHAR CONSTANT * to CHAR *). Changes to get the environment settings working everywhere again (broken by the change that moved commands to the INI); Added an environment size variable (set to 2048 which was the largest I found hard coded). Still need to find everywhere the environment size is set and use this variable.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: shadow.c 1498 2010-01-18 00:57:01Z gyoung $
5
6 Desktop shadows
7
8 Copyright (c) 1993-97 M. Kimes
9 Copyright (c) 2006, 2010 Steven H. Levine
10
11 22 Jul 06 SHL Check more run time errors
12 16 Jun 07 SHL Update for OpenWatcom
13 06 Aug 07 SHL Use BldFullPathName
14 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
15 08 Mar 09 GKY Additional strings move to PCSZs declare change
16 12 Jul 09 GKY Add xDosQueryAppType and xDosAlloc... to allow FM/2 to load in high memory
17 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
18
19***********************************************************************/
20
21#include <stdlib.h>
22#include <string.h>
23
24#define INCL_DOS
25#define INCL_WIN
26#define INCL_LONGLONG
27
28#include "fm3dll.h"
29#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
30#include "filldir.h" // Data declaration(s)
31#include "mainwnd.h" // Data declaration(s)
32#include "fm3dlg.h"
33#include "fm3str.h"
34#include "pathutil.h" // BldFullPathName
35#include "errutil.h" // Dos_Error...
36#include "strutil.h" // GetPString
37#include "shadow.h"
38#include "input.h" // InputDlgProc
39#include "defview.h" // Data declaration(s)
40#include "valid.h" // IsFile
41#include "wrappers.h" // xmalloc
42#include "fortify.h"
43#include "init.h" // Data declaration(s)
44
45#pragma data_seg(DATA1)
46
47static PSZ pszSrcFile = __FILE__;
48
49static HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
50 CHAR * cnr);
51static HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr);
52
53static HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
54 CHAR * cnr);
55static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
56 BOOL executable, CHAR * cnr);
57
58HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
59 CHAR * cnr)
60{
61 HOBJECT obj = (HOBJECT) 0;
62 CHAR *s;
63
64 if (!cnr)
65 return obj;
66 obj = WinCreateObject((CHAR *) WPProgram,
67 objtitle,
68 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
69 (location) ? location : cnr, CO_FAILIFEXISTS);
70 if (obj) {
71 s = xmalloc(5192, pszSrcFile, __LINE__);
72 if (s) {
73 sprintf(s,
74 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
75 (path) ? path : NullStr,
76 (path) ? PCSZ_BACKSLASH : NullStr,
77 objtitle,
78 (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr, objtitle);
79 WinSetObjectData(obj, s);
80 free(s);
81 }
82 }
83 return obj;
84}
85
86HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
87 CHAR * cnr)
88{
89
90 HOBJECT obj = (HOBJECT) 0;
91 CHAR s[1050], s2[1050], *p,
92 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
93
94 if (!cnr)
95 return obj;
96 BldFullPathName(s, path, objtitle);
97 p = strrchr(objtitle, '.');
98 if (p) {
99 if (!stricmp(p, PCSZ_DOTICO))
100 p = type[1];
101 else if (!stricmp(p, PCSZ_DOTBMP))
102 p = type[2];
103 else
104 p = type[0];
105 }
106 else
107 p = type[0];
108 obj = WinCreateObject(p,
109 s,
110 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
111 (location) ? location : cnr, CO_FAILIFEXISTS);
112 if (obj) {
113 sprintf(s2,
114 "%s%s%sOBJECTID=<FM2_%s>",
115 objtitle,
116 (p == type[1]) ? "ICONFILE=" : NullStr,
117 (p == type[1]) ? s : NullStr, (p == type[1]) ? ";" : NullStr, objtitle);
118 WinSetObjectData(obj, s2);
119 }
120 return obj;
121}
122
123HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
124{
125 HOBJECT obj = (HOBJECT) 0;
126 CHAR s[1050];
127
128 if (!cnr)
129 return obj;
130 obj = WinCreateObject("WPFolder",
131 objtitle,
132 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
133 cnr, CO_FAILIFEXISTS);
134 if (obj) {
135 sprintf(s, "OBJECTID=<FM2_%s>", objtitle);
136 WinSetObjectData(obj, s);
137 }
138 return obj;
139}
140
141HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
142 BOOL executable, CHAR * cnr)
143{
144
145 HOBJECT obj = (HOBJECT) 0;
146 CHAR *s;
147
148 if (!cnr)
149 return obj;
150 s = xmalloc(5192, pszSrcFile, __LINE__);
151 if (s) {
152 sprintf(s,
153 "SHADOWID=%s%s%s",
154 (path) ? path : NullStr, (path) ? PCSZ_BACKSLASH : NullStr, objtitle);
155 { /* find an icon for it if possible */
156 CHAR *p, temp[CCHMAXPATH + 1];
157
158 BldFullPathName(temp, path, objtitle);
159 p = strrchr(temp, '.');
160 if (p) {
161 *p = 0;
162 strcat(p, PCSZ_DOTICO);
163 if (IsFile(temp) == 1)
164 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
165 }
166 }
167 if (executable)
168 sprintf(&s[strlen(s)],
169 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
170 (path) ? path : NullStr,
171 (path) ? PCSZ_BACKSLASH : NullStr,
172 objtitle, (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr);
173 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
174 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
175 obj = WinCreateObject("WPShadow",
176 objtitle,
177 s, (location) ? location : cnr, CO_FAILIFEXISTS);
178 free(s);
179 }
180 return obj;
181}
182
183VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
184 CHAR * foldername)
185{
186 INT x = 0;
187 CHAR szBuff[CCHMAXPATH + 8];
188 HOBJECT obj = (HOBJECT) 0;
189 FILESTATUS3 fsa;
190
191 *szBuff = 0;
192 if (foldername)
193 strcpy(szBuff, foldername);
194 if (list) {
195 if ((list[0] && list[1]) || Shadows > 1) {
196
197 STRINGINPARMS sip;
198
199 sip.help = GetPString(IDS_MAKESHADOWHELPTEXT);
200 sip.ret = szBuff;
201 sip.prompt = GetPString(IDS_MAKESHADOWPROMPTTEXT);
202 sip.inputlen = CCHMAXPATHCOMP;
203 sip.title = GetPString(IDS_MAKESHADOWTITLETEXT);
204 if (WinDlgBox(HWND_DESKTOP,
205 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip)) {
206 if (*szBuff) {
207 obj = CreateFolderObject(szBuff, cnr);
208 if (!obj) {
209 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
210 hwnd,
211 GetPString(IDS_ERRORTEXT),
212 GetPString(IDS_MAKESHADOWCREATEFAILEDTEXT), szBuff);
213 return;
214 }
215 }
216 }
217 else
218 return;
219 }
220 while (list[x]) {
221 if (!DosQueryPathInfo(list[x],
222 FIL_STANDARD, &fsa,
223 (ULONG) sizeof(FILESTATUS3))) {
224
225 ULONG apt;
226 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
227
228 if (xDosQueryAppType(list[x], &apt))
229 apt = 0;
230 p = strrchr(list[x], '.');
231 if (p) {
232 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
233 !stricmp(p, PCSZ_DOTBTM))
234 apt |= FAPPTYP_BOUND;
235 }
236 *szBuffer = 0;
237 p = strrchr(list[x], '\\');
238 if (!p)
239 p = strrchr(list[x], ':');
240 if (p)
241 p++;
242 else
243 p = list[x];
244 strcpy(szDir, list[x]);
245 pp = strrchr(szDir, '\\');
246 if (!pp) {
247 pp = strrchr(szDir, ':');
248 if (pp) {
249 pp++;
250 *pp = '\\';
251 pp++;
252 }
253 }
254 if (pp)
255 *pp = 0;
256 else
257 *szDir = 0;
258 if (obj && *szBuff)
259 sprintf(szBuffer, "<FM2_%s>", szBuff);
260 else
261 *szBuffer = 0;
262 if ((fsa.attrFile & FILE_DIRECTORY) || Shadows)
263 CreateShadowObject(p, (obj) ? szBuffer : NULL, szDir, 0, cnr);
264 else if (!(apt & (FAPPTYP_NOTWINDOWCOMPAT | FAPPTYP_WINDOWCOMPAT | FAPPTYP_WINDOWAPI | FAPPTYP_BOUND | FAPPTYP_DOS | FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT | 0x1000))) /* not an executable app? */
265 CreateDataObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
266 else
267 CreateProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
268 }
269 x++;
270 DosSleep(1);
271 }
272 }
273}
274
275VOID OpenObject(CHAR *filename, PCSZ type, HWND hwnd)
276{
277 HOBJECT hWPSObject;
278
279 if (!type)
280 type = Default;
281 if ((*filename == '<' &&
282 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
283 hWPSObject = WinQueryObject(filename);
284 if (hWPSObject != NULLHANDLE) { /* got something; try to to open it */
285
286 CHAR s[CCHMAXPATH];
287 HWND hwndDesktop;
288
289 if (hwnd) {
290 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
291 WinSetFocus(HWND_DESKTOP, hwndDesktop);
292 }
293 sprintf(s, "OPEN=%s", type);
294 if (!WinSetObjectData(hWPSObject, s) && hwnd)
295 WinSetFocus(HWND_DESKTOP, hwnd);
296 }
297 }
298}
299
300BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
301{
302 CHAR settings[1024 + CCHMAXPATH + 80];
303 BOOL ret;
304
305 sprintf(settings,
306 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
307 exename, args);
308 if (hwnd)
309 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
310 ret = WinCreateObject((CHAR *) WPProgram,
311 exename,
312 settings, "<WP_NOWHERE>", CO_REPLACEIFEXISTS);
313 if (!ret && hwnd)
314 WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
315 return ret;
316}
317
318#pragma alloc_text(SHADOW,CreateProgramObject,CreateDataObject,CreateFolderObject,CreateShadowObject)
319#pragma alloc_text(SHADOW2,MakeShadows,OpenObject)
Note: See TracBrowser for help on using the repository browser.