source: trunk/dll/shadow.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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