source: trunk/dll/shadow.c@ 1047

Last change on this file since 1047 was 1047, checked in by Gregg Young, 17 years ago

Minor code cleanup

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