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
RevLine 
[334]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
[1498]9 Copyright (c) 2006, 2010 Steven H. Levine
[334]10
11 22 Jul 06 SHL Check more run time errors
[697]12 16 Jun 07 SHL Update for OpenWatcom
[773]13 06 Aug 07 SHL Use BldFullPathName
[793]14 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[1402]15 08 Mar 09 GKY Additional strings move to PCSZs declare change
[1480]16 12 Jul 09 GKY Add xDosQueryAppType and xDosAlloc... to allow FM/2 to load in high memory
[1498]17 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
[1782]18 28 Jun 14 GKY Fix errors identified with CPPCheck;
[1803]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.
[1805]21 23 May 15 GKY Option to restart desktop to prevent icon loss from JAVA object
[1811]22 13 Jun 15 GKY Fix failure to generate multiple real objects
[334]23
24***********************************************************************/
25
[907]26#include <stdlib.h>
27#include <string.h>
28
[2]29#define INCL_DOS
30#define INCL_WIN
[841]31#define INCL_LONGLONG
[2]32
[1212]33#include "fm3dll.h"
[1227]34#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1212]35#include "filldir.h" // Data declaration(s)
36#include "mainwnd.h" // Data declaration(s)
[2]37#include "fm3dlg.h"
38#include "fm3str.h"
[907]39#include "pathutil.h" // BldFullPathName
40#include "errutil.h" // Dos_Error...
41#include "strutil.h" // GetPString
[1158]42#include "shadow.h"
[1181]43#include "input.h" // InputDlgProc
[1212]44#include "defview.h" // Data declaration(s)
[1181]45#include "valid.h" // IsFile
46#include "wrappers.h" // xmalloc
[1039]47#include "fortify.h"
[1398]48#include "init.h" // Data declaration(s)
[1803]49#include "notebook.h" // Data declaration(s)
50#include "getnames.h" // insert_filename
51#include "srchpath.h" // SearchMultiplePathsForFile
[2]52
53#pragma data_seg(DATA1)
[334]54
55static PSZ pszSrcFile = __FILE__;
56
[1158]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,
[1803]62 CHAR * cnr);
63static HOBJECT CreateJAVAProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
[1158]64 CHAR * cnr);
65static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
[1805]66 BOOL executable, CHAR * cnr);
67BOOL32 EXPENTRY WinRestartWorkplace(VOID);
[1158]68
[551]69HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
70 CHAR * cnr)
[334]71{
[551]72 HOBJECT obj = (HOBJECT) 0;
73 CHAR *s;
[1803]74 CHAR objecttmp[CCHMAXPATH];
[2]75
[551]76 if (!cnr)
[2]77 return obj;
[1803]78 strcpy(objecttmp, objtitle);
79 s = strchr(objecttmp, '.');
80 if (s)
81 *s = 0;
[1498]82 obj = WinCreateObject((CHAR *) WPProgram,
[1803]83 objecttmp,
[551]84 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
85 (location) ? location : cnr, CO_FAILIFEXISTS);
86 if (obj) {
87 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]88 if (s) {
[2]89 sprintf(s,
[551]90 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
[1438]91 (path) ? path : NullStr,
92 (path) ? PCSZ_BACKSLASH : NullStr,
[551]93 objtitle,
[1438]94 (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr, objtitle);
[551]95 WinSetObjectData(obj, s);
[1039]96 free(s);
[2]97 }
98 }
99 return obj;
100}
101
[1803]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
[551]155HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
156 CHAR * cnr)
157{
[2]158
[551]159 HOBJECT obj = (HOBJECT) 0;
160 CHAR s[1050], s2[1050], *p,
161 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
[2]162
[551]163 if (!cnr)
[2]164 return obj;
[773]165 BldFullPathName(s, path, objtitle);
[551]166 p = strrchr(objtitle, '.');
167 if (p) {
[1398]168 if (!stricmp(p, PCSZ_DOTICO))
[2]169 p = type[1];
[1398]170 else if (!stricmp(p, PCSZ_DOTBMP))
[2]171 p = type[2];
172 else
173 p = type[0];
174 }
175 else
176 p = type[0];
177 obj = WinCreateObject(p,
[551]178 s,
179 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
180 (location) ? location : cnr, CO_FAILIFEXISTS);
181 if (obj) {
[2]182 sprintf(s2,
[1782]183 "%s%s%s%sOBJECTID=<FM2_%s>",
[551]184 objtitle,
[1438]185 (p == type[1]) ? "ICONFILE=" : NullStr,
186 (p == type[1]) ? s : NullStr, (p == type[1]) ? ";" : NullStr, objtitle);
[551]187 WinSetObjectData(obj, s2);
[2]188 }
189 return obj;
190}
191
[551]192HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
[334]193{
[551]194 HOBJECT obj = (HOBJECT) 0;
195 CHAR s[1050];
[2]196
[551]197 if (!cnr)
[2]198 return obj;
199 obj = WinCreateObject("WPFolder",
[551]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);
[2]206 }
207 return obj;
208}
209
[551]210HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
211 BOOL executable, CHAR * cnr)
212{
[2]213
[551]214 HOBJECT obj = (HOBJECT) 0;
215 CHAR *s;
[2]216
[551]217 if (!cnr)
[2]218 return obj;
[551]219 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]220 if (s) {
[2]221 sprintf(s,
[551]222 "SHADOWID=%s%s%s",
[1438]223 (path) ? path : NullStr, (path) ? PCSZ_BACKSLASH : NullStr, objtitle);
[1673]224 { // find an icon for it if possible
[551]225 CHAR *p, temp[CCHMAXPATH + 1];
[2]226
[773]227 BldFullPathName(temp, path, objtitle);
[551]228 p = strrchr(temp, '.');
229 if (p) {
230 *p = 0;
[1398]231 strcat(p, PCSZ_DOTICO);
[551]232 if (IsFile(temp) == 1)
233 sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
[2]234 }
235 }
[551]236 if (executable)
[2]237 sprintf(&s[strlen(s)],
[551]238 ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
[1438]239 (path) ? path : NullStr,
240 (path) ? PCSZ_BACKSLASH : NullStr,
241 objtitle, (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr);
[551]242 strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
243 sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
[2]244 obj = WinCreateObject("WPShadow",
[551]245 objtitle,
246 s, (location) ? location : cnr, CO_FAILIFEXISTS);
[1039]247 free(s);
[2]248 }
249 return obj;
250}
251
[551]252VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
253 CHAR * foldername)
[334]254{
[551]255 INT x = 0;
256 CHAR szBuff[CCHMAXPATH + 8];
257 HOBJECT obj = (HOBJECT) 0;
[847]258 FILESTATUS3 fsa;
[1803]259 BOOL JAVA = FALSE;
[1811]260 BOOL fJavaMade = FALSE;
[2]261
262 *szBuff = 0;
[551]263 if (foldername)
264 strcpy(szBuff, foldername);
265 if (list) {
266 if ((list[0] && list[1]) || Shadows > 1) {
[2]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);
[551]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 }
[2]287 }
288 else
[551]289 return;
[2]290 }
[551]291 while (list[x]) {
292 if (!DosQueryPathInfo(list[x],
[847]293 FIL_STANDARD, &fsa,
294 (ULONG) sizeof(FILESTATUS3))) {
[2]295
[551]296 ULONG apt;
297 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
[2]298
[1439]299 if (xDosQueryAppType(list[x], &apt))
[551]300 apt = 0;
301 p = strrchr(list[x], '.');
302 if (p) {
[1398]303 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
304 !stricmp(p, PCSZ_DOTBTM))
[1803]305 apt |= FAPPTYP_BOUND;
306 else if(!stricmp(p, ".jar"))
307 JAVA = TRUE;
[551]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)
[1803]336 CreateShadowObject(p, (obj) ? szBuffer : NULL, szDir, 0, cnr);
[1809]337 else if (JAVA) {
[1805]338 if (CreateJAVAProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr)) {
[1803]339 apt |= FAPPTYP_BOUND;
[1811]340 fJavaMade = TRUE;
[1805]341 }
[1809]342 }
[1673]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?
[551]346 CreateDataObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
347 else
348 CreateProgramObject(p, (obj) ? szBuffer : NULL, szDir, cnr);
[2]349 }
[1811]350 JAVA = FALSE;
[2]351 x++;
[766]352 DosSleep(1);
[1811]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();
[2]362 }
363 }
364}
365
[1402]366VOID OpenObject(CHAR *filename, PCSZ type, HWND hwnd)
[334]367{
[2]368 HOBJECT hWPSObject;
369
[551]370 if (!type)
[2]371 type = Default;
[551]372 if ((*filename == '<' &&
373 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
[2]374 hWPSObject = WinQueryObject(filename);
[1673]375 if (hWPSObject != NULLHANDLE) { // got something; try to to open it
[2]376
377 CHAR s[CCHMAXPATH];
378 HWND hwndDesktop;
379
[551]380 if (hwnd) {
381 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
382 WinSetFocus(HWND_DESKTOP, hwndDesktop);
[2]383 }
[551]384 sprintf(s, "OPEN=%s", type);
385 if (!WinSetObjectData(hWPSObject, s) && hwnd)
386 WinSetFocus(HWND_DESKTOP, hwnd);
[2]387 }
388 }
389}
390
[551]391BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
[334]392{
[2]393 CHAR settings[1024 + CCHMAXPATH + 80];
394 BOOL ret;
395
396 sprintf(settings,
[551]397 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
398 exename, args);
399 if (hwnd)
400 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
[1498]401 ret = WinCreateObject((CHAR *) WPProgram,
[551]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);
[2]406 return ret;
407}
[793]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.