source: trunk/dll/shadow.c@ 1805

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

Add option to restart desktop to JAVA object creation to prevent loss of icon on opening object settings. Ticket 37

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