source: trunk/dll/shadow.c@ 1227

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

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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