source: trunk/dll/shadow.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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