source: trunk/dll/shadow.c@ 773

Last change on this file since 773 was 773, checked in by Steven Levine, 18 years ago

Correct some compare directories collector nits
Use BldQuoted... functions
Move BldQuoted... functions near primary callers
Add RUNTYPE_MASK
Use Runtime_Error2 more

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