source: trunk/dll/shadow.c@ 1438

Last change on this file since 1438 was 1438, checked in by Gregg Young, 16 years ago

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.1 KB
RevLine 
[334]1
2/***********************************************************************
3
4 $Id: shadow.c 1438 2009-06-28 20:47:00Z 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
[1402]15 08 Mar 09 GKY Additional strings move to PCSZs declare change
[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
[1212]26#include "fm3dll.h"
[1227]27#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1212]28#include "filldir.h" // Data declaration(s)
29#include "mainwnd.h" // Data declaration(s)
[2]30#include "fm3dlg.h"
31#include "fm3str.h"
[907]32#include "pathutil.h" // BldFullPathName
33#include "errutil.h" // Dos_Error...
34#include "strutil.h" // GetPString
[1158]35#include "shadow.h"
[1181]36#include "input.h" // InputDlgProc
[1212]37#include "defview.h" // Data declaration(s)
[1181]38#include "valid.h" // IsFile
39#include "wrappers.h" // xmalloc
[1039]40#include "fortify.h"
[1398]41#include "init.h" // Data declaration(s)
[2]42
43#pragma data_seg(DATA1)
[334]44
45static PSZ pszSrcFile = __FILE__;
46
[1158]47static HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
48 CHAR * cnr);
49static HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr);
50
51static HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
52 CHAR * cnr);
53static HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
54 BOOL executable, CHAR * cnr);
55
[551]56HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
57 CHAR * cnr)
[334]58{
[551]59 HOBJECT obj = (HOBJECT) 0;
60 CHAR *s;
[2]61
[551]62 if (!cnr)
[2]63 return obj;
64 obj = WinCreateObject(WPProgram,
[551]65 objtitle,
66 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
67 (location) ? location : cnr, CO_FAILIFEXISTS);
68 if (obj) {
69 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]70 if (s) {
[2]71 sprintf(s,
[551]72 "EXENAME=%s%s%s%s%s;PARAMETERS=%%*;OBJECTID=<FM2_%s>",
[1438]73 (path) ? path : NullStr,
74 (path) ? PCSZ_BACKSLASH : NullStr,
[551]75 objtitle,
[1438]76 (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr, objtitle);
[551]77 WinSetObjectData(obj, s);
[1039]78 free(s);
[2]79 }
80 }
81 return obj;
82}
83
[551]84HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
85 CHAR * cnr)
86{
[2]87
[551]88 HOBJECT obj = (HOBJECT) 0;
89 CHAR s[1050], s2[1050], *p,
90 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
[2]91
[551]92 if (!cnr)
[2]93 return obj;
[773]94 BldFullPathName(s, path, objtitle);
[551]95 p = strrchr(objtitle, '.');
96 if (p) {
[1398]97 if (!stricmp(p, PCSZ_DOTICO))
[2]98 p = type[1];
[1398]99 else if (!stricmp(p, PCSZ_DOTBMP))
[2]100 p = type[2];
101 else
102 p = type[0];
103 }
104 else
105 p = type[0];
106 obj = WinCreateObject(p,
[551]107 s,
108 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
109 (location) ? location : cnr, CO_FAILIFEXISTS);
110 if (obj) {
[2]111 sprintf(s2,
[551]112 "%s%s%sOBJECTID=<FM2_%s>",
113 objtitle,
[1438]114 (p == type[1]) ? "ICONFILE=" : NullStr,
115 (p == type[1]) ? s : NullStr, (p == type[1]) ? ";" : NullStr, objtitle);
[551]116 WinSetObjectData(obj, s2);
[2]117 }
118 return obj;
119}
120
[551]121HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
[334]122{
[551]123 HOBJECT obj = (HOBJECT) 0;
124 CHAR s[1050];
[2]125
[551]126 if (!cnr)
[2]127 return obj;
128 obj = WinCreateObject("WPFolder",
[551]129 objtitle,
130 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
131 cnr, CO_FAILIFEXISTS);
132 if (obj) {
133 sprintf(s, "OBJECTID=<FM2_%s>", objtitle);
134 WinSetObjectData(obj, s);
[2]135 }
136 return obj;
137}
138
[551]139HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
140 BOOL executable, CHAR * cnr)
141{
[2]142
[551]143 HOBJECT obj = (HOBJECT) 0;
144 CHAR *s;
[2]145
[551]146 if (!cnr)
[2]147 return obj;
[551]148 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]149 if (s) {
[2]150 sprintf(s,
[551]151 "SHADOWID=%s%s%s",
[1438]152 (path) ? path : NullStr, (path) ? PCSZ_BACKSLASH : NullStr, objtitle);
[551]153 { /* find an icon for it if possible */
154 CHAR *p, temp[CCHMAXPATH + 1];
[2]155
[773]156 BldFullPathName(temp, path, objtitle);
[551]157 p = strrchr(temp, '.');
158 if (p) {
159 *p = 0;
[1398]160 strcat(p, PCSZ_DOTICO);
[551]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=%%*",
[1438]168 (path) ? path : NullStr,
169 (path) ? PCSZ_BACKSLASH : NullStr,
170 objtitle, (path) ? ";STARTUPDIR=" : NullStr, (path) ? path : NullStr);
[551]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) {
[1398]230 if (!stricmp(p, PCSZ_DOTBAT) || !stricmp(p, PCSZ_DOTCMD) ||
231 !stricmp(p, PCSZ_DOTBTM))
[551]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
[1402]273VOID OpenObject(CHAR *filename, PCSZ 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.