source: trunk/dll/shadow.c@ 1181

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

Ticket 187: Draft 2: Move remaining function declarations

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