source: trunk/dll/shadow.c@ 1212

Last change on this file since 1212 was 1212, checked in by John Small, 17 years ago

Ticket 187: Move data declarations/definitions out of fm3dll.h

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