source: trunk/dll/shadow.c @ 766

Last change on this file since 766 was 766, checked in by Gregg Young, 13 years ago

format cleanup

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.0 KB
Line 
1
2/***********************************************************************
3
4  $Id: shadow.c 766 2007-08-05 20:21:20Z 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
14***********************************************************************/
15
16#define INCL_DOS
17#define INCL_WIN
18#include <os2.h>
19
20#include <stdlib.h>
21#include <stdio.h>
22#include <string.h>
23
24#include "fm3dll.h"
25#include "fm3dlg.h"
26#include "fm3str.h"
27
28#pragma data_seg(DATA1)
29
30static PSZ pszSrcFile = __FILE__;
31
32#pragma alloc_text(SHADOW,CreateProgramObject,CreateDataObject,CreateFolderObject,CreateShadowObject)
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  sprintf(s, "%s%s%s", (path) ? path : "", (path) ? "\\" : "", objtitle);
73  p = strrchr(objtitle, '.');
74  if (p) {
75    if (!stricmp(p, ".ICO"))
76      p = type[1];
77    else if (!stricmp(p, ".BMP"))
78      p = type[2];
79    else
80      p = type[0];
81  }
82  else
83    p = type[0];
84  obj = WinCreateObject(p,
85                        s,
86                        "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
87                        (location) ? location : cnr, CO_FAILIFEXISTS);
88  if (obj) {
89    sprintf(s2,
90            "%s%s%sOBJECTID=<FM2_%s>",
91            objtitle,
92            (p == type[1]) ? "ICONFILE=" : "",
93            (p == type[1]) ? s : "", (p == type[1]) ? ";" : "", objtitle);
94    WinSetObjectData(obj, s2);
95  }
96  return obj;
97}
98
99HOBJECT CreateFolderObject(CHAR * objtitle, CHAR * cnr)
100{
101  HOBJECT obj = (HOBJECT) 0;
102  CHAR s[1050];
103
104  if (!cnr)
105    return obj;
106  obj = WinCreateObject("WPFolder",
107                        objtitle,
108                        "NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO",
109                        cnr, CO_FAILIFEXISTS);
110  if (obj) {
111    sprintf(s, "OBJECTID=<FM2_%s>", objtitle);
112    WinSetObjectData(obj, s);
113  }
114  return obj;
115}
116
117HOBJECT CreateShadowObject(CHAR * objtitle, CHAR * location, CHAR * path,
118                           BOOL executable, CHAR * cnr)
119{
120
121  HOBJECT obj = (HOBJECT) 0;
122  CHAR *s;
123
124  if (!cnr)
125    return obj;
126  s = xmalloc(5192, pszSrcFile, __LINE__);
127  if (s) {
128    sprintf(s,
129            "SHADOWID=%s%s%s",
130            (path) ? path : "", (path) ? "\\" : "", objtitle);
131    {                                   /* find an icon for it if possible */
132      CHAR *p, temp[CCHMAXPATH + 1];
133
134      sprintf(temp,
135              "%s%s%s", (path) ? path : "", (path) ? "\\" : "", objtitle);
136      p = strrchr(temp, '.');
137      if (p) {
138        *p = 0;
139        strcat(p, ".ICO");
140        if (IsFile(temp) == 1)
141          sprintf(&s[strlen(s)], ";ICONFILE=%s", temp);
142      }
143    }
144    if (executable)
145      sprintf(&s[strlen(s)],
146              ";EXENAME=%s%s%s%s%s;PARAMETERS=%%*",
147              (path) ? path : "",
148              (path) ? "\\" : "",
149              objtitle, (path) ? ";STARTUPDIR=" : "", (path) ? path : "");
150    strcat(s, ";NODELETE=NO;TEMPLATE=NO;NOCOPY=NO;NOMOVE=NO");
151    sprintf(&s[strlen(s)], ";OBJECTID=<FM2_%s>", objtitle);
152    obj = WinCreateObject("WPShadow",
153                          objtitle,
154                          s, (location) ? location : cnr, CO_FAILIFEXISTS);
155    free(s);
156  }
157  return obj;
158}
159
160#pragma alloc_text(SHADOW2,MakeShadows,OpenObject)
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}
Note: See TracBrowser for help on using the repository browser.