source: trunk/dll/shadow.c@ 1227

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

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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