source: trunk/dll/shadow.c@ 1402

Last change on this file since 1402 was 1402, checked in by Gregg Young, 16 years ago

Remove variable aurgs from docopy & unlinkf (not used); Move more strings to PCSZs and string table; Move PCSZs to compile time initialization; Fix hang on startup caused by a drive scan and a dircnr scan trying to update a drive in the tree at the same time (related to the "treeswitch options); Code cleanup mainly removal of old printfs, SayMsgs, DbgMsg and unneeded %s.

  • 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 1402 2009-03-14 17:17:59Z 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 08 Mar 09 GKY Additional strings move to PCSZs declare change
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 "fm3dll.h"
27#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
28#include "filldir.h" // Data declaration(s)
29#include "mainwnd.h" // Data declaration(s)
30#include "fm3dlg.h"
31#include "fm3str.h"
32#include "pathutil.h" // BldFullPathName
33#include "errutil.h" // Dos_Error...
34#include "strutil.h" // GetPString
35#include "shadow.h"
36#include "input.h" // InputDlgProc
37#include "defview.h" // Data declaration(s)
38#include "valid.h" // IsFile
39#include "wrappers.h" // xmalloc
40#include "fortify.h"
41#include "init.h" // Data declaration(s)
42
43#pragma data_seg(DATA1)
44
45static PSZ pszSrcFile = __FILE__;
46
47static HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
48 CHAR * cnr);
49static HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr);
50
51static HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
52 CHAR * cnr);
53static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
54 BOOL executable, CHAR * cnr);
55
56HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
57 CHAR * cnr)
58{
59 HOBJECT obj = (HOBJECT) 0;
60 CHAR *s;
61
62 if (!cnr)
63 return obj;
64 obj = WinCreateObject(WPProgram,
65 objtitle,
66 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
67 (location) ? location : cnr, CO_FAILIFEXISTS);
68 if (obj) {
69 s = xmalloc(5192, pszSrcFile, __LINE__);
70 if (s) {
71 sprintf(s,
72 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
73 (path) ? path : "",
74 (path) ? "\\" : "",
75 objtitle,
76 (path) ? ";STARTUPDIR=" : "", (path) ? path : "", objtitle);
77 WinSetObjectData(obj, s);
78 free(s);
79 }
80 }
81 return obj;
82}
83
84HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
85 CHAR * cnr)
86{
87
88 HOBJECT obj = (HOBJECT) 0;
89 CHAR s[1050], s2[1050], *p,
90 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
91
92 if (!cnr)
93 return obj;
94 BldFullPathName(s, path, objtitle);
95 p = strrchr(objtitle, '.');
96 if (p) {
97 if (!stricmp(p, PCSZ_DOTICO))
98 p = type[1];
99 else if (!stricmp(p, PCSZ_DOTBMP))
100 p = type[2];
101 else
102 p = type[0];
103 }
104 else
105 p = type[0];
106 obj = WinCreateObject(p,
107 s,
108 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
109 (location) ? location : cnr, CO_FAILIFEXISTS);
110 if (obj) {
111 sprintf(s2,
112 "%s%s%sOBJECTID=<FM2_%s>",
113 objtitle,
114 (p == type[1]) ? "ICONFILE=" : "",
115 (p == type[1]) ? s : "", (p == type[1]) ? ";" : "", objtitle);
116 WinSetObjectData(obj, s2);
117 }
118 return obj;
119}
120
121HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
122{
123 HOBJECT obj = (HOBJECT) 0;
124 CHAR s[1050];
125
126 if (!cnr)
127 return obj;
128 obj = WinCreateObject("WPFolder",
129 objtitle,
130 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
131 cnr, CO_FAILIFEXISTS);
132 if (obj) {
133 sprintf(s, "OBJECTID=<FM2_%s>", objtitle);
134 WinSetObjectData(obj, s);
135 }
136 return obj;
137}
138
139HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
140 BOOL executable, CHAR * cnr)
141{
142
143 HOBJECT obj = (HOBJECT) 0;
144 CHAR *s;
145
146 if (!cnr)
147 return obj;
148 s = xmalloc(5192, pszSrcFile, __LINE__);
149 if (s) {
150 sprintf(s,
151 "SHADOWID=%s%s%s",
152 (path) ? path : "", (path) ? "\\" : "", objtitle);
153 { /* find an icon for it if possible */
154 CHAR *p, temp[CCHMAXPATH + 1];
155
156 BldFullPathName(temp, path, objtitle);
157 p = strrchr(temp, '.');
158 if (p) {
159 *p = 0;
160 strcat(p, PCSZ_DOTICO);
161 if (IsFile(temp) == 1)
162 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
163 }
164 }
165 if (executable)
166 sprintf(&s[strlen(s)],
167 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
168 (path) ? path : "",
169 (path) ? "\\" : "",
170 objtitle, (path) ? ";STARTUPDIR=" : "", (path) ? path : "");
171 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
172 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
173 obj = WinCreateObject("WPShadow",
174 objtitle,
175 s, (location) ? location : cnr, CO_FAILIFEXISTS);
176 free(s);
177 }
178 return obj;
179}
180
181VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
182 CHAR * foldername)
183{
184 INT x = 0;
185 CHAR szBuff[CCHMAXPATH + 8];
186 HOBJECT obj = (HOBJECT) 0;
187 FILESTATUS3 fsa;
188
189 *szBuff = 0;
190 if (foldername)
191 strcpy(szBuff, foldername);
192 if (list) {
193 if ((list[0] && list[1]) || Shadows > 1) {
194
195 STRINGINPARMS sip;
196
197 sip.help = GetPString(IDS_MAKESHADOWHELPTEXT);
198 sip.ret = szBuff;
199 sip.prompt = GetPString(IDS_MAKESHADOWPROMPTTEXT);
200 sip.inputlen = CCHMAXPATHCOMP;
201 sip.title = GetPString(IDS_MAKESHADOWTITLETEXT);
202 if (WinDlgBox(HWND_DESKTOP,
203 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip)) {
204 if (*szBuff) {
205 obj = CreateFolderObject(szBuff, cnr);
206 if (!obj) {
207 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
208 hwnd,
209 GetPString(IDS_ERRORTEXT),
210 GetPString(IDS_MAKESHADOWCREATEFAILEDTEXT), szBuff);
211 return;
212 }
213 }
214 }
215 else
216 return;
217 }
218 while (list[x]) {
219 if (!DosQueryPathInfo(list[x],
220 FIL_STANDARD, &fsa,
221 (ULONG) sizeof(FILESTATUS3))) {
222
223 ULONG apt;
224 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
225
226 if (DosQueryAppType(list[x], &apt))
227 apt = 0;
228 p = strrchr(list[x], '.');
229 if (p) {
230 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
231 !stricmp(p, PCSZ_DOTBTM))
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, PCSZ 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.