source: trunk/dll/shadow.c@ 1212

Last change on this file since 1212 was 1212, checked in by John Small, 17 years ago

Ticket 187: Move data declarations/definitions out of fm3dll.h

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