source: trunk/dll/shadow.c@ 1181

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

Ticket 187: Draft 2: Move remaining function declarations

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