source: trunk/dll/shadow.c@ 1178

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

Ticket 187: Draft 1: Functions only

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