source: trunk/dll/shadow.c@ 1811

Last change on this file since 1811 was 1811, checked in by Gregg Young, 10 years ago

Fix failure to generate multiple real objects

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: shadow.c 1811 2015-06-13 22:22:59Z gyoung $
5
6 Desktop shadows
7
8 Copyright (c) 1993-97 M. Kimes
9 Copyright (c) 2006, 2010 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 12 Jul 09 GKY Add xDosQueryAppType and xDosAlloc... to allow FM/2 to load in high memory
17 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
18 28 Jun 14 GKY Fix errors identified with CPPCheck;
19 02 May 15 GKY Changes to allow a JAVA executable object to be created using "Real object"
20 menu item on a jar file.
21 23 May 15 GKY Option to restart desktop to prevent icon loss from JAVA object
22 13 Jun 15 GKY Fix failure to generate multiple real objects
23
24***********************************************************************/
25
26#include <stdlib.h>
27#include <string.h>
28
29#define INCL_DOS
30#define INCL_WIN
31#define INCL_LONGLONG
32
33#include "fm3dll.h"
34#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
35#include "filldir.h" // Data declaration(s)
36#include "mainwnd.h" // Data declaration(s)
37#include "fm3dlg.h"
38#include "fm3str.h"
39#include "pathutil.h" // BldFullPathName
40#include "errutil.h" // Dos_Error...
41#include "strutil.h" // GetPString
42#include "shadow.h"
43#include "input.h" // InputDlgProc
44#include "defview.h" // Data declaration(s)
45#include "valid.h" // IsFile
46#include "wrappers.h" // xmalloc
47#include "fortify.h"
48#include "init.h" // Data declaration(s)
49#include "notebook.h" // Data declaration(s)
50#include "getnames.h" // insert_filename
51#include "srchpath.h" // SearchMultiplePathsForFile
52
53#pragma data_seg(DATA1)
54
55static PSZ pszSrcFile = __FILE__;
56
57static HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
58 CHAR * cnr);
59static HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr);
60
61static HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
62 CHAR * cnr);
63static HOBJECT CreateJAVAProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
64 CHAR * cnr);
65static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
66 BOOL executable, CHAR * cnr);
67BOOL32 EXPENTRY WinRestartWorkplace(VOID);
68
69HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
70 CHAR * cnr)
71{
72 HOBJECT obj = (HOBJECT) 0;
73 CHAR *s;
74 CHAR objecttmp[CCHMAXPATH];
75
76 if (!cnr)
77 return obj;
78 strcpy(objecttmp, objtitle);
79 s = strchr(objecttmp, '.');
80 if (s)
81 *s = 0;
82 obj = WinCreateObject((CHAR *) WPProgram,
83 objecttmp,
84 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
85 (location) ? location : cnr, CO_FAILIFEXISTS);
86 if (obj) {
87 s = xmalloc(5192, pszSrcFile, __LINE__);
88 if (s) {
89 sprintf(s,
90 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
91 (path) ? path : NullStr,
92 (path) ? PCSZ_BACKSLASH : NullStr,
93 objtitle,
94 (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr, objtitle);
95 WinSetObjectData(obj, s);
96 free(s);
97 }
98 }
99 return obj;
100}
101
102HOBJECT CreateJAVAProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
103 CHAR * cnr)
104{
105 HOBJECT obj = (HOBJECT) 0;
106 CHAR *s;
107 CHAR objecttmp[CCHMAXPATH];
108 CHAR javaexe[CCHMAXPATH] = {0};
109 CHAR icon[CCHMAXPATH] = {0};
110
111 if (!cnr)
112 return obj;
113 if (!PrfQueryProfileString(fmprof, appname, "JavaExe", NULL, javaexe, CCHMAXPATH - 1)) {
114 strcpy(javaexe, PCSZ_STARDOTEXE);
115 if (insert_filename(HWND_DESKTOP, javaexe, TRUE, FALSE) &&
116 *javaexe && !strchr(javaexe, '*') && !strchr(javaexe, '?'))
117 PrfWriteProfileString(fmprof, appname, "JavaExe", javaexe);
118 else
119 return obj;
120 }
121 strcpy(objecttmp, objtitle);
122 s = strchr(objecttmp, '.');
123 if (s)
124 *s = 0;
125 strcpy(icon, path);
126 strcat(icon, "\\*.ico");
127 insert_filename(HWND_DESKTOP, icon, TRUE, FALSE);
128 obj = WinCreateObject((CHAR *) WPProgram,
129 objecttmp,
130 "NOPRINT=YES;DEFAULTVIEW=RUNNING",
131 (location) ? location : cnr, CO_FAILIFEXISTS);
132 if (obj) {
133 s = xmalloc(5192, pszSrcFile, __LINE__);
134 if (s) {
135 sprintf(s,
136 "%s%s;EXENAME=%s%s%s;PARAMETERS= %s%s%s%s %%*;%sOBJECTID=<FM2_%s>",
137 "ICONFILE=",
138 icon,
139 javaexe,
140 (path) ? ";STARTUPDIR=" : NullStr,
141 (path) ? path : NullStr,
142 "-jar ",
143 (path) ? path : NullStr,
144 (path) ? PCSZ_BACKSLASH : NullStr,
145 objtitle,
146 "PROGTYPE=PM;",
147 objecttmp);
148 WinSetObjectData(obj, s);
149 free(s);
150 }
151 }
152 return obj;
153}
154
155HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
156 CHAR * cnr)
157{
158
159 HOBJECT obj = (HOBJECT) 0;
160 CHAR s[1050], s2[1050], *p,
161 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
162
163 if (!cnr)
164 return obj;
165 BldFullPathName(s, path, objtitle);
166 p = strrchr(objtitle, '.');
167 if (p) {
168 if (!stricmp(p, PCSZ_DOTICO))
169 p = type[1];
170 else if (!stricmp(p, PCSZ_DOTBMP))
171 p = type[2];
172 else
173 p = type[0];
174 }
175 else
176 p = type[0];
177 obj = WinCreateObject(p,
178 s,
179 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
180 (location) ? location : cnr, CO_FAILIFEXISTS);
181 if (obj) {
182 sprintf(s2,
183 "%s%s%s%sOBJECTID=<FM2_%s>",
184 objtitle,
185 (p == type[1]) ? "ICONFILE=" : NullStr,
186 (p == type[1]) ? s : NullStr, (p == type[1]) ? ";" : NullStr, objtitle);
187 WinSetObjectData(obj, s2);
188 }
189 return obj;
190}
191
192HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
193{
194 HOBJECT obj = (HOBJECT) 0;
195 CHAR s[1050];
196
197 if (!cnr)
198 return obj;
199 obj = WinCreateObject("WPFolder",
200 objtitle,
201 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
202 cnr, CO_FAILIFEXISTS);
203 if (obj) {
204 sprintf(s, "OBJECTID=<FM2_%s>", objtitle);
205 WinSetObjectData(obj, s);
206 }
207 return obj;
208}
209
210HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
211 BOOL executable, CHAR * cnr)
212{
213
214 HOBJECT obj = (HOBJECT) 0;
215 CHAR *s;
216
217 if (!cnr)
218 return obj;
219 s = xmalloc(5192, pszSrcFile, __LINE__);
220 if (s) {
221 sprintf(s,
222 "SHADOWID=%s%s%s",
223 (path) ? path : NullStr, (path) ? PCSZ_BACKSLASH : NullStr, objtitle);
224 { // find an icon for it if possible
225 CHAR *p, temp[CCHMAXPATH + 1];
226
227 BldFullPathName(temp, path, objtitle);
228 p = strrchr(temp, '.');
229 if (p) {
230 *p = 0;
231 strcat(p, PCSZ_DOTICO);
232 if (IsFile(temp) == 1)
233 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
234 }
235 }
236 if (executable)
237 sprintf(&s[strlen(s)],
238 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
239 (path) ? path : NullStr,
240 (path) ? PCSZ_BACKSLASH : NullStr,
241 objtitle, (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr);
242 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
243 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
244 obj = WinCreateObject("WPShadow",
245 objtitle,
246 s, (location) ? location : cnr, CO_FAILIFEXISTS);
247 free(s);
248 }
249 return obj;
250}
251
252VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
253 CHAR * foldername)
254{
255 INT x = 0;
256 CHAR szBuff[CCHMAXPATH + 8];
257 HOBJECT obj = (HOBJECT) 0;
258 FILESTATUS3 fsa;
259 BOOL JAVA = FALSE;
260 BOOL fJavaMade = FALSE;
261
262 *szBuff = 0;
263 if (foldername)
264 strcpy(szBuff, foldername);
265 if (list) {
266 if ((list[0] && list[1]) || Shadows > 1) {
267
268 STRINGINPARMS sip;
269
270 sip.help = GetPString(IDS_MAKESHADOWHELPTEXT);
271 sip.ret = szBuff;
272 sip.prompt = GetPString(IDS_MAKESHADOWPROMPTTEXT);
273 sip.inputlen = CCHMAXPATHCOMP;
274 sip.title = GetPString(IDS_MAKESHADOWTITLETEXT);
275 if (WinDlgBox(HWND_DESKTOP,
276 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip)) {
277 if (*szBuff) {
278 obj = CreateFolderObject(szBuff, cnr);
279 if (!obj) {
280 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
281 hwnd,
282 GetPString(IDS_ERRORTEXT),
283 GetPString(IDS_MAKESHADOWCREATEFAILEDTEXT), szBuff);
284 return;
285 }
286 }
287 }
288 else
289 return;
290 }
291 while (list[x]) {
292 if (!DosQueryPathInfo(list[x],
293 FIL_STANDARD, &fsa,
294 (ULONG) sizeof(FILESTATUS3))) {
295
296 ULONG apt;
297 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
298
299 if (xDosQueryAppType(list[x], &apt))
300 apt = 0;
301 p = strrchr(list[x], '.');
302 if (p) {
303 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
304 !stricmp(p, PCSZ_DOTBTM))
305 apt |= FAPPTYP_BOUND;
306 else if(!stricmp(p, ".jar"))
307 JAVA = TRUE;
308 }
309 *szBuffer = 0;
310 p = strrchr(list[x], '\\');
311 if (!p)
312 p = strrchr(list[x], ':');
313 if (p)
314 p++;
315 else
316 p = list[x];
317 strcpy(szDir, list[x]);
318 pp = strrchr(szDir, '\\');
319 if (!pp) {
320 pp = strrchr(szDir, ':');
321 if (pp) {
322 pp++;
323 *pp = '\\';
324 pp++;
325 }
326 }
327 if (pp)
328 *pp = 0;
329 else
330 *szDir = 0;
331 if (obj && *szBuff)
332 sprintf(szBuffer, "<FM2_%s>", szBuff);
333 else
334 *szBuffer = 0;
335 if ((fsa.attrFile & FILE_DIRECTORY) || Shadows)
336 CreateShadowObject(p, (obj) ? szBuffer : NULL, szDir, 0, cnr);
337 else if (JAVA) {
338 if (CreateJAVAProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr)) {
339 apt |= FAPPTYP_BOUND;
340 fJavaMade = TRUE;
341 }
342 }
343 else if (!(apt & (FAPPTYP_NOTWINDOWCOMPAT | FAPPTYP_WINDOWCOMPAT | FAPPTYP_WINDOWAPI |
344 FAPPTYP_BOUND | FAPPTYP_DOS | FAPPTYP_WINDOWSREAL |
345 FAPPTYP_WINDOWSPROT | 0x1000))) // not an executable app?
346 CreateDataObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
347 else
348 CreateProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
349 }
350 JAVA = FALSE;
351 x++;
352 DosSleep(1);
353 } //while
354 if (fJavaMade) {
355 ULONG ulResult;
356
357 ulResult = saymsg(MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1, HWND_DESKTOP,
358 GetPString(IDS_RESTARTDESKTOP),
359 GetPString(IDS_SETTINGLOSEICON));
360 if (ulResult == MBID_OK)
361 WinRestartWorkplace();
362 }
363 }
364}
365
366VOID OpenObject(CHAR *filename, PCSZ type, HWND hwnd)
367{
368 HOBJECT hWPSObject;
369
370 if (!type)
371 type = Default;
372 if ((*filename == '<' &&
373 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
374 hWPSObject = WinQueryObject(filename);
375 if (hWPSObject != NULLHANDLE) { // got something; try to to open it
376
377 CHAR s[CCHMAXPATH];
378 HWND hwndDesktop;
379
380 if (hwnd) {
381 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
382 WinSetFocus(HWND_DESKTOP, hwndDesktop);
383 }
384 sprintf(s, "OPEN=%s", type);
385 if (!WinSetObjectData(hWPSObject, s) && hwnd)
386 WinSetFocus(HWND_DESKTOP, hwnd);
387 }
388 }
389}
390
391BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
392{
393 CHAR settings[1024 + CCHMAXPATH + 80];
394 BOOL ret;
395
396 sprintf(settings,
397 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
398 exename, args);
399 if (hwnd)
400 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
401 ret = WinCreateObject((CHAR *) WPProgram,
402 exename,
403 settings, "<WP_NOWHERE>", CO_REPLACEIFEXISTS);
404 if (!ret && hwnd)
405 WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
406 return ret;
407}
408
409#pragma alloc_text(SHADOW,CreateProgramObject,CreateDataObject,CreateFolderObject,CreateShadowObject)
410#pragma alloc_text(SHADOW2,MakeShadows,OpenObject)
Note: See TracBrowser for help on using the repository browser.