source: trunk/dll/shadow.c@ 1673

Last change on this file since 1673 was 1673, checked in by Gregg Young, 13 years ago

Update to Doxygen comment style Ticket 55. Also some minor code cleanup.

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