source: trunk/dll/shadow.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

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