source: trunk/dll/shadow.c@ 1158

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

Ticket 187: Draft 1: Functions only

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