source: trunk/dll/shadow.c@ 793

Last change on this file since 793 was 793, checked in by Gregg Young, 18 years ago

Move #pragma alloc_text to end for OpenWatcom compat

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