source: trunk/src/win32k/pe2lx/menu.cpp@ 847

Last change on this file since 847 was 847, checked in by bird, 26 years ago

Initial checkin of Win32k. (not tested & pe2lx not up-to-date!)

File size: 10.0 KB
Line 
1/* $Id: menu.cpp,v 1.1 1999-09-06 02:20:07 bird Exp $ */
2
3/*
4 * PE2LX menu conversion code
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12
13#define INCL_DOSNLS
14/*******************************************************************************
15* Header Files *
16*******************************************************************************/
17#include "pe2lx.h"
18#include "menu.h"
19
20
21static int ProcessSubMenu(LXHeaderSuper &OS2Exe, PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp);
22static int ProcessMenuItem(NormalMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp);
23static void menustrcpy(char *dest, char *src);
24//******************************************************************************
25//******************************************************************************
26BOOL ShowMenu(LXHeaderSuper &OS2Exe, int id, MenuHeader *menu, int size, int cp)
27{
28 PopupMenuItem *popupitem = (PopupMenuItem *)((char *)menu + sizeof(MenuHeader));
29 NormalMenuItem *normalitem = (NormalMenuItem *)((char *)menu + sizeof(MenuHeader));
30 MT_OS2 *os2menu, *submenu;
31 MTI_OS2 *menuitem;
32 int newsize;
33 BOOL rc;
34 ULONG ulCpSize, ulCP;
35
36 ltassert((ULONG)menu > 0x10000UL)
37
38 //First save original win32 resource
39 ltassert(OS2Exe.StoreWin32Resource(id, RT_MENU, size, (char *)menu));
40
41
42 os2menu = (MT_OS2 *)malloc(size*4); //should always be sufficient
43 ltassert(os2menu != NULL);
44 os2menu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
45 #ifdef RING0
46 os2menu->codepage = cp;
47 #else
48 if (cp == 0)
49 os2menu->codepage = 437;
50 else
51 {
52 DosQueryCp(sizeof(ulCP), &ulCP, &ulCpSize);
53 os2menu->codepage = ulCP;
54 }
55 #endif
56 os2menu->reserved = 4;
57 os2menu->cMti = 0;
58 menuitem = &os2menu->rgMti[0];
59 submenu = os2menu;
60 while (size > 4)
61 {
62 if (popupitem->fItemFlags & POPUP)
63 {
64 cout << "POPUP ";
65 newsize = ProcessSubMenu(OS2Exe, popupitem, os2menu, menuitem, size, cp);
66 }
67 else
68 newsize = ProcessMenuItem(normalitem, os2menu, menuitem, size, cp);
69
70 if (popupitem->fItemFlags & ENDMENU) break;
71
72 popupitem = (PopupMenuItem *)((char *)popupitem + (size - newsize));
73 ltasserthp2(popupitem, free(os2menu));
74 normalitem = (NormalMenuItem *)((char *)normalitem + (size - newsize));
75 ltasserthp2(normalitem, free(os2menu));
76
77 menuitem = (MTI_OS2 *)((int)os2menu + os2menu->len);
78 ltasserthp2(menuitem, free(os2menu));
79 size = newsize;
80 }
81 rc = OS2Exe.StoreResource(id, RT_MENU, os2menu->len, (char *)os2menu);
82 free(os2menu);
83 return rc;
84}
85//******************************************************************************
86//******************************************************************************
87static int ProcessSubMenu(LXHeaderSuper &OS2Exe, PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp)
88{
89 NormalMenuItem *normalitem;
90 MT_OS2 *submenu;
91 int len = 0, newsize;
92 ULONG ulCpSize, ulCP;
93
94 ltassert((void*)menuitem != (void*)os2menu);
95
96 menuitem->afStyle = MIS_SUBMENU;
97
98 //A unique id is sufficient, since it's not possible to get info about
99 //the SUBMENU item being selected with the (win32) WM_INITMENU message
100 //(this is possible in OS/2)
101 menuitem->idItem = (USHORT)OS2Exe.GetUniqueId();
102 menuitem->pad = 0;
103
104 if (popupitem->fItemFlags & GRAYED)
105 {
106 cout << "GRAYED ";
107 menuitem->pad |= MIA_DISABLED;
108 }
109 if (popupitem->fItemFlags & INACTIVE)
110 {
111 cout << "INACTIVE ";
112 menuitem->pad |= MIA_DISABLED;
113 }
114 if (popupitem->fItemFlags & BITMAP)
115 {
116 cout << "BITMAP ";
117 //where's the bitmap stored? (same id as id of this menu item?)
118 menuitem->afStyle |= MIS_BITMAP;
119 }
120 if (popupitem->fItemFlags & OWNERDRAW)
121 {
122 cout << "OWNERDRAW ";
123 menuitem->afStyle |= MIS_OWNERDRAW;
124 }
125 if (popupitem->fItemFlags & CHECKED)
126 {
127 menuitem->pad |= MIA_CHECKED;
128 cout << "CHECKED ";
129 }
130 if (popupitem->fItemFlags & MENUBREAK)
131 {
132 menuitem->afStyle |= MIS_BREAK;
133 menuitem->pad |= MIA_DISABLED;
134 cout << "MENUBREAK ";
135 }
136 if (popupitem->fItemFlags & MENUBARBREAK)
137 {
138 cout << "MENUBARBREAK" << endl;
139 menuitem->afStyle |= MIS_BREAKSEPARATOR;
140 menuitem->pad |= MIA_DISABLED;
141 menuitem->c[0] = 0;
142 menuitem->c[1] = 0;
143 }
144 else
145 {
146 len = (UniStrlen(popupitem->szItemText)+1)*2;
147 cout << UnicodeToAscii(popupitem->szItemText, cp) << endl;
148 menustrcpy(menuitem->c, UnicodeToAscii(popupitem->szItemText, cp));
149 }
150 os2menu->len += sizeof(MTI_OS2);
151 if (len > 4) os2menu->len += (len/2 - sizeof(menuitem->c));
152 os2menu->cMti++;
153
154 size -= (sizeof(PopupMenuItem)-2 + len); /*PLF Sat 97-06-21 22:17:51*/
155 //process next menu item
156 submenu = (MT_OS2 *)(menuitem+1);
157 if (len > 4)
158 submenu = (MT_OS2 *)((char *)submenu + len/2 - sizeof(menuitem->c));
159 submenu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
160 #ifdef RING0
161 submenu->codepage = cp;
162 #else
163 if (cp == 0)
164 submenu->codepage = 437;
165 else
166 {
167 DosQueryCp(sizeof(ulCP), &ulCP, &ulCpSize);
168 submenu->codepage = ulCP;
169 }
170 #endif
171 submenu->reserved = 4;
172 submenu->cMti = 0;
173 menuitem = &submenu->rgMti[0];
174
175 //normalitem = (NormalMenuItem *)(popupitem + 1);
176 normalitem = (NormalMenuItem *)((char*)popupitem + sizeof(PopupMenuItem)-2); /*PLF Sat 97-06-21 23:54:50*/
177 normalitem = (NormalMenuItem *)((int)normalitem + len);
178
179 while (size > 4)
180 {
181 ltasserthp(normalitem);
182 if (normalitem->fItemFlags & POPUP)
183 {
184 cout << "POPUP ";
185 newsize = ProcessSubMenu(OS2Exe, (PopupMenuItem *)normalitem, submenu, menuitem, size, cp);
186 }
187 else
188 newsize = ProcessMenuItem(normalitem, submenu, menuitem, size, cp);
189
190 menuitem = (MTI_OS2*)((int)submenu + submenu->len);
191 if (normalitem->fItemFlags & ENDMENU)
192 {
193 os2menu->len += submenu->len;
194 return (newsize);
195 }
196 normalitem = (NormalMenuItem*)((char*)normalitem + (size - newsize));
197 size = newsize;
198 }
199 os2menu->len += submenu->len;
200
201 return (size);
202}
203//******************************************************************************
204//******************************************************************************
205static int ProcessMenuItem(NormalMenuItem *normalitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp)
206{
207 int len = 0;
208
209 ltassert((ULONG)normalitem > 0x10000);
210
211
212 cout << "ID " << normalitem->wMenuID << " ";
213 menuitem->afStyle = MIS_TEXT;
214 menuitem->idItem = normalitem->wMenuID;
215 menuitem->pad = 0;
216
217 if (normalitem->fItemFlags & ENDMENU)
218 {
219 //signals the end of a (sub)menu
220 cout << "ENDMENU ";
221 len = (UniStrlen(normalitem->szItemText)+1)*2;
222 //don't store this menu item, is it's empty
223 if (len == 2)
224 {
225 size -= (sizeof(NormalMenuItem)-2 + len);
226 return (size);
227 }
228 }
229 if (normalitem->fItemFlags & GRAYED)
230 {
231 cout << "GRAYED ";
232 menuitem->pad |= MIA_DISABLED;
233 }
234 if (normalitem->fItemFlags & INACTIVE)
235 {
236 cout << "INACTIVE ";
237 menuitem->pad |= MIA_DISABLED;
238 }
239 if (normalitem->fItemFlags & BITMAP)
240 {
241 cout << "BITMAP ";
242 //where's the bitmap stored? (same id as id of this menu item?)
243 menuitem->afStyle |= MIS_BITMAP;
244 }
245 if (normalitem->fItemFlags & OWNERDRAW)
246 {
247 cout << "OWNERDRAW ";
248 menuitem->afStyle |= MIS_OWNERDRAW;
249 }
250 if (normalitem->fItemFlags & CHECKED)
251 {
252 menuitem->pad |= MIA_CHECKED;
253 cout << "CHECKED ";
254 }
255 if (normalitem->fItemFlags & MENUBREAK)
256 {
257 menuitem->afStyle |= MIS_BREAK;
258 menuitem->pad |= MIA_DISABLED;
259 cout << "MENUBREAK ";
260 }
261 if (normalitem->fItemFlags & MENUBARBREAK)
262 {
263 cout << "MENUBARBREAK" << endl;
264 menuitem->afStyle |= MIS_BREAKSEPARATOR;
265 menuitem->pad |= MIA_DISABLED;
266 menuitem->c[0] = 0;
267 menuitem->c[1] = 0;
268 }
269 else
270 {
271 len = (UniStrlen(normalitem->szItemText)+1)*2;
272 if (normalitem->fItemFlags == 0 && len == 2)
273 {
274 cout << "SEPARATOR" << endl;
275 menuitem->afStyle = MIS_SEPARATOR;
276 menuitem->pad = MIA_DISABLED;
277 menuitem->idItem = 0xFFFF;
278 menuitem->c[0] = 0;
279 menuitem->c[1] = 0;
280 }
281 else
282 {
283 cout << UnicodeToAscii(normalitem->szItemText, cp) << endl;
284 menustrcpy(menuitem->c, UnicodeToAscii(normalitem->szItemText, cp));
285 }
286 }
287 os2menu->len += sizeof(MTI_OS2);
288 //SvL: Bugfix (>4), 19-10-'97
289 if (len >= 4) os2menu->len += (len/2 - sizeof(menuitem->c));
290 else os2menu->len -= 2; //REQUIRED (even though mi->c[2])
291
292 os2menu->cMti++;
293
294 size -= (sizeof(NormalMenuItem)-2 + len); /*PLF Sat 97-06-21 22:19:57*/
295
296 return (size);
297}
298//******************************************************************************
299//******************************************************************************
300static void menustrcpy(char *dest, char *src)
301{
302 int i, len = strlen(src);
303
304 for (i=0;i<len;i++)
305 {
306 if (src[i] == '&') dest[i] = '~';
307 else dest[i] = src[i];
308 }
309 dest[len] = 0;
310}
311//******************************************************************************
312//******************************************************************************
Note: See TracBrowser for help on using the repository browser.