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
RevLine 
[334]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
[697]9 Copyright (c) 2006, 2007 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
[2]18#define INCL_DOS
19#define INCL_WIN
[334]20#include <os2.h>
[2]21
22#include <stdlib.h>
23#include <stdio.h>
24#include <string.h>
[334]25
[2]26#include "fm3dll.h"
27#include "fm3dlg.h"
28#include "fm3str.h"
29
30#pragma data_seg(DATA1)
[334]31
32static PSZ pszSrcFile = __FILE__;
33
[551]34HOBJECT CreateProgramObject(CHAR * objtitle, CHAR * location, CHAR * path,
35 CHAR * cnr)
[334]36{
[551]37 HOBJECT obj = (HOBJECT) 0;
38 CHAR *s;
[2]39
[551]40 if (!cnr)
[2]41 return obj;
42 obj = WinCreateObject(WPProgram,
[551]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__);
[334]48 if (s) {
[2]49 sprintf(s,
[551]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);
[2]56 free(s);
57 }
58 }
59 return obj;
60}
61
[551]62HOBJECT CreateDataObject(CHAR * objtitle, CHAR * location, CHAR * path,
63 CHAR * cnr)
64{
[2]65
[551]66 HOBJECT obj = (HOBJECT) 0;
67 CHAR s[1050], s2[1050], *p,
68 *type[] = { "WPDataFile", "WPIcon", "WPBitmap" };
[2]69
[551]70 if (!cnr)
[2]71 return obj;
[773]72 BldFullPathName(s, path, objtitle);
73 // sprintf(s, "%s%s%s", (path) ? path : "", (path) ? "\\" : "", objtitle);
[551]74 p = strrchr(objtitle, '.');
75 if (p) {
76 if (!stricmp(p, ".ICO"))
[2]77 p = type[1];
[551]78 else if (!stricmp(p, ".BMP"))
[2]79 p = type[2];
80 else
81 p = type[0];
82 }
83 else
84 p = type[0];
85 obj = WinCreateObject(p,
[551]86 s,
87 "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
88 (location) ? location : cnr, CO_FAILIFEXISTS);
89 if (obj) {
[2]90 sprintf(s2,
[551]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);
[2]96 }
97 return obj;
98}
99
[551]100HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
[334]101{
[551]102 HOBJECT obj = (HOBJECT) 0;
103 CHAR s[1050];
[2]104
[551]105 if (!cnr)
[2]106 return obj;
107 obj = WinCreateObject("WPFolder",
[551]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);
[2]114 }
115 return obj;
116}
117
[551]118HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
119 BOOL executable, CHAR * cnr)
120{
[2]121
[551]122 HOBJECT obj = (HOBJECT) 0;
123 CHAR *s;
[2]124
[551]125 if (!cnr)
[2]126 return obj;
[551]127 s = xmalloc(5192, pszSrcFile, __LINE__);
[334]128 if (s) {
[2]129 sprintf(s,
[551]130 "SHADOWID=%s%s%s",
131 (path) ? path : "", (path) ? "\\" : "", objtitle);
132 { /* find an icon for it if possible */
133 CHAR *p, temp[CCHMAXPATH + 1];
[2]134
[773]135 BldFullPathName(temp, path, objtitle);
136 // sprintf(temp,
137 // "%s%s%s", (path) ? path : "", (path) ? "\\" : "", objtitle);
[551]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);
[2]144 }
145 }
[551]146 if (executable)
[2]147 sprintf(&s[strlen(s)],
[551]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);
[2]154 obj = WinCreateObject("WPShadow",
[551]155 objtitle,
156 s, (location) ? location : cnr, CO_FAILIFEXISTS);
[2]157 free(s);
158 }
159 return obj;
160}
161
[551]162VOID MakeShadows(HWND hwnd, CHAR ** list, ULONG Shadows, CHAR * cnr,
163 CHAR * foldername)
[334]164{
[551]165 INT x = 0;
166 CHAR szBuff[CCHMAXPATH + 8];
167 HOBJECT obj = (HOBJECT) 0;
168 FILESTATUS3 fsa;
[2]169
170 *szBuff = 0;
[551]171 if (foldername)
172 strcpy(szBuff, foldername);
173 if (list) {
174 if ((list[0] && list[1]) || Shadows > 1) {
[2]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);
[551]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 }
[2]195 }
196 else
[551]197 return;
[2]198 }
[551]199 while (list[x]) {
200 if (!DosQueryPathInfo(list[x],
201 FIL_STANDARD, &fsa,
202 (ULONG) sizeof(FILESTATUS3))) {
[2]203
[551]204 ULONG apt;
205 CHAR *p, *pp, szDir[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1];
[2]206
[697]207 if (DosQueryAppType(list[x], &apt))
[551]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);
[2]246 }
247 x++;
[766]248 DosSleep(1);
[2]249 }
250 }
251}
252
[551]253VOID OpenObject(CHAR * filename, CHAR * type, HWND hwnd)
[334]254{
[2]255 HOBJECT hWPSObject;
256
[551]257 if (!type)
[2]258 type = Default;
[551]259 if ((*filename == '<' &&
260 filename[strlen(filename) - 1] == '>') || IsFile(filename) != -1) {
[2]261 hWPSObject = WinQueryObject(filename);
[551]262 if (hWPSObject != NULLHANDLE) { /* got something; try to to open it */
[2]263
264 CHAR s[CCHMAXPATH];
265 HWND hwndDesktop;
266
[551]267 if (hwnd) {
268 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
269 WinSetFocus(HWND_DESKTOP, hwndDesktop);
[2]270 }
[551]271 sprintf(s, "OPEN=%s", type);
272 if (!WinSetObjectData(hWPSObject, s) && hwnd)
273 WinSetFocus(HWND_DESKTOP, hwnd);
[2]274 }
275 }
276}
277
[551]278BOOL RunSeamless(CHAR * exename, CHAR * args, HWND hwnd)
[334]279{
[2]280 CHAR settings[1024 + CCHMAXPATH + 80];
281 BOOL ret;
282
283 sprintf(settings,
[551]284 "EXENAME=%s;PROGTYPE=SEAMLESS;PARAMETERS=%s;OPEN=DEFAULT",
285 exename, args);
286 if (hwnd)
287 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
[2]288 ret = WinCreateObject(WPProgram,
[551]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);
[2]293 return ret;
294}
[793]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.