source: trunk/src/kernel32/cvtmenu.cpp@ 581

Last change on this file since 581 was 581, checked in by sandervl, 26 years ago

PE loader resource convertion changes

File size: 8.9 KB
Line 
1/* $Id: cvtmenu.cpp,v 1.1 1999-08-19 14:19:14 sandervl 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#define INCL_DOSFILEMGR /* File Manager values */
13#define INCL_DOSERRORS /* DOS Error values */
14#define INCL_DOSPROCESS /* DOS Process values */
15#define INCL_DOSMISC /* DOS Miscellanous values */
16#define INCL_DOSNLS
17#define INCL_WIN
18#include <os2wrap.h>
19#include <pmmenu.h>
20#include <stdio.h>
21#include <string.h>
22#include <stdlib.h>
23#include <string.h>
24#include <win32type.h>
25#include <winmenu.h>
26#include <misc.h>
27#include "cvtresource.h"
28
29static int ProcessSubMenu(PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp);
30static int ProcessMenuItem(NormalMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp);
31static void menustrcpy(char *dest, char *src);
32//******************************************************************************
33//******************************************************************************
34void *ConvertMenu(MenuHeader *menu, int size, int cp)
35{
36 PopupMenuItem *popupitem = (PopupMenuItem *)((char *)menu + sizeof(MenuHeader));
37 NormalMenuItem *normalitem = (NormalMenuItem *)((char *)menu + sizeof(MenuHeader));
38 MT_OS2 *os2menu, *submenu;
39 MTI_OS2 *menuitem;
40 int newsize;
41 ULONG ulCpSize, ulCP;
42
43 os2menu = (MT_OS2 *)malloc(size*4); //should always be sufficient
44 os2menu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
45 if(cp == 0) {
46 os2menu->codepage = 437;
47 }
48 else
49 {
50 DosQueryCp(sizeof(ulCP), &ulCP, &ulCpSize);
51 os2menu->codepage = ulCP;
52 }
53 os2menu->reserved = 4;
54 os2menu->cMti = 0;
55 menuitem = &os2menu->rgMti[0];
56 submenu = os2menu;
57 while(size > 4)
58 {
59 if(popupitem->fItemFlags & POPUP) {
60 dprintf(("POPUP "));
61 newsize = ProcessSubMenu(popupitem, os2menu, menuitem, size, cp);
62 }
63 else newsize = ProcessMenuItem(normalitem, os2menu, menuitem, size, cp);
64
65 if(popupitem->fItemFlags & ENDMENU) break;
66
67 popupitem = (PopupMenuItem *)((char *)popupitem + (size - newsize));
68 normalitem = (NormalMenuItem *)((char *)normalitem + (size - newsize));
69
70 menuitem = (MTI_OS2 *)((int)os2menu + os2menu->len);
71 size = newsize;
72 }
73 return (void *)os2menu;
74}
75//******************************************************************************
76//******************************************************************************
77static int ProcessSubMenu(PopupMenuItem *popupitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp)
78{
79 static int uniqueid = 0;
80 NormalMenuItem *normalitem;
81 MT_OS2 *submenu;
82 int len = 0, newsize;
83 ULONG ulCpSize, ulCP;
84 char *menuname;
85
86 menuitem->afStyle = MIS_SUBMENU;
87
88 //A unique id is sufficient, since it's not possible to get info about
89 //the SUBMENU item being selected with the (win32) WM_INITMENU message
90 //(this is possible in OS/2)
91 menuitem->idItem = (USHORT)uniqueid++;
92 menuitem->pad = 0;
93
94 if(popupitem->fItemFlags & GRAYED) {
95 dprintf(("GRAYED "));
96 menuitem->pad |= MIA_DISABLED;
97 }
98 if(popupitem->fItemFlags & INACTIVE) {
99 dprintf(("INACTIVE "));
100 menuitem->pad |= MIA_DISABLED;
101 }
102 if(popupitem->fItemFlags & BITMAP) {
103 dprintf(("BITMAP "));
104 //where's the bitmap stored? (same id as id of this menu item?)
105 menuitem->afStyle |= MIS_BITMAP;
106 }
107 if(popupitem->fItemFlags & OWNERDRAW) {
108 dprintf(("OWNERDRAW "));
109 menuitem->afStyle |= MIS_OWNERDRAW;
110 }
111 if(popupitem->fItemFlags & CHECKED) {
112 menuitem->pad |= MIA_CHECKED;
113 dprintf(("CHECKED "));
114 }
115 if(popupitem->fItemFlags & MENUBREAK) {
116 menuitem->afStyle |= MIS_BREAK;
117 menuitem->pad |= MIA_DISABLED;
118 dprintf(("MENUBREAK "));
119 }
120 if(popupitem->fItemFlags & MENUBARBREAK) {
121 dprintf(("MENUBARBREAK"));
122 menuitem->afStyle |= MIS_BREAKSEPARATOR;
123 menuitem->pad |= MIA_DISABLED;
124 menuitem->c[0] = 0;
125 menuitem->c[1] = 0;
126 }
127 else {
128 len = (UniStrlen(popupitem->szItemText)+1)*2;
129 menuname = UnicodeToAsciiString(popupitem->szItemText);
130 dprintf(("%s", menuname));
131 menustrcpy(menuitem->c, menuname);
132 FreeAsciiString(menuname);
133 }
134 os2menu->len += sizeof(MTI_OS2);
135 if(len > 4) os2menu->len += (len/2 - sizeof(menuitem->c));
136 os2menu->cMti++;
137
138 size -= (sizeof(PopupMenuItem)-2 + len); /*PLF Sat 97-06-21 22:17:51*/
139 //process next menu item
140 submenu = (MT_OS2 *)(menuitem+1);
141 if(len > 4) {
142 submenu = (MT_OS2 *)((char *)submenu + len/2 - sizeof(menuitem->c));
143 }
144
145 submenu->len = sizeof(MT_OS2) - sizeof(MTI_OS2);
146
147 if(cp == 0) {
148 submenu->codepage = 437;
149 }
150 else
151 {
152 DosQueryCp(sizeof(ulCP), &ulCP, &ulCpSize);
153 submenu->codepage = ulCP;
154 }
155
156 submenu->reserved = 4;
157 submenu->cMti = 0;
158 menuitem = &submenu->rgMti[0];
159
160 //normalitem = (NormalMenuItem *)(popupitem + 1);
161 normalitem = (NormalMenuItem *)((char*)popupitem + sizeof(PopupMenuItem)-2); /*PLF Sat 97-06-21 23:54:50*/
162 normalitem = (NormalMenuItem *)((int)normalitem + len);
163
164 while(size > 4) {
165 if(normalitem->fItemFlags & POPUP) {
166 dprintf(("POPUP "));
167 newsize = ProcessSubMenu((PopupMenuItem *)normalitem, submenu, menuitem, size, cp);
168 }
169 else newsize = ProcessMenuItem(normalitem, submenu, menuitem, size, cp);
170
171 menuitem = (MTI_OS2 *)((int)submenu + submenu->len);
172 if(normalitem->fItemFlags & ENDMENU) {
173 os2menu->len += submenu->len;
174 return(newsize);
175 }
176 normalitem = (NormalMenuItem *)((char *)normalitem + (size - newsize));
177 size = newsize;
178 }
179 os2menu->len += submenu->len;
180 return(size);
181}
182//******************************************************************************
183//******************************************************************************
184static int ProcessMenuItem(NormalMenuItem *normalitem, MT_OS2 *os2menu, MTI_OS2 *menuitem, int size, int cp)
185{
186 WCHAR *menustring;
187 int len = 0;
188 char *menuname;
189
190 dprintf(("ID %d ", normalitem->wMenuID));
191 menustring = normalitem->szItemText;
192 menuitem->afStyle = MIS_TEXT;
193 menuitem->idItem = normalitem->wMenuID;
194 menuitem->pad = 0;
195
196 if(normalitem->fItemFlags & ENDMENU) {
197 //signals the end of a (sub)menu
198 dprintf(("ENDMENU"));
199 len = (UniStrlen(normalitem->szItemText)+1)*2;
200 //don't store this menu item, is it's empty
201 if(len == 2) {
202 size -= (sizeof(NormalMenuItem)-2 + len);
203 return(size);
204 }
205 }
206 if(normalitem->fItemFlags & GRAYED) {
207 dprintf(("GRAYED "));
208 menuitem->pad |= MIA_DISABLED;
209 }
210 if(normalitem->fItemFlags & INACTIVE) {
211 dprintf(("INACTIVE "));
212 menuitem->pad |= MIA_DISABLED;
213 }
214 if(normalitem->fItemFlags & BITMAP) {
215 dprintf(("BITMAP "));
216 //where's the bitmap stored? (same id as id of this menu item?)
217 menuitem->afStyle |= MIS_BITMAP;
218 }
219 if(normalitem->fItemFlags & OWNERDRAW) {
220 dprintf(("OWNERDRAW "));
221 menuitem->afStyle |= MIS_OWNERDRAW;
222 }
223 if(normalitem->fItemFlags & CHECKED) {
224 menuitem->pad |= MIA_CHECKED;
225 dprintf(("CHECKED "));
226 }
227 if(normalitem->fItemFlags & MENUBREAK) {
228 menuitem->afStyle |= MIS_BREAK;
229 menuitem->pad |= MIA_DISABLED;
230 dprintf(("MENUBREAK "));
231 }
232 if(normalitem->fItemFlags & MENUBARBREAK) {
233 dprintf(("MENUBARBREAK"));
234 menuitem->afStyle |= MIS_BREAKSEPARATOR;
235 menuitem->pad |= MIA_DISABLED;
236 menuitem->c[0] = 0;
237 menuitem->c[1] = 0;
238 }
239 else {
240 len = (UniStrlen(normalitem->szItemText)+1)*2;
241 if(normalitem->fItemFlags == 0 && len == 2) {
242 dprintf(("SEPARATOR"));
243 menuitem->afStyle = MIS_SEPARATOR;
244 menuitem->pad = MIA_DISABLED;
245 menuitem->idItem = 0xFFFF;
246 menuitem->c[0] = 0;
247 menuitem->c[1] = 0;
248 }
249 else {
250 menuname = UnicodeToAsciiString(normalitem->szItemText);
251 dprintf(("%s", menuname));
252 menustrcpy(menuitem->c, menuname);
253 FreeAsciiString(menuname);
254 }
255 }
256 os2menu->len += sizeof(MTI_OS2);
257 //SvL: Bugfix (>4), 19-10-'97
258 if(len >= 4) os2menu->len += (len/2 - sizeof(menuitem->c));
259 else os2menu->len -= 2; //REQUIRED (even though mi->c[2])
260
261 os2menu->cMti++;
262
263 size -= (sizeof(NormalMenuItem)-2 + len); /*PLF Sat 97-06-21 22:19:57*/
264
265 return(size);
266}
267//******************************************************************************
268//******************************************************************************
269static void menustrcpy(char *dest, char *src)
270{
271 int i, len = strlen(src);
272
273 for(i=0;i<len;i++) {
274 if(src[i] == '&') dest[i] = '~';
275 else dest[i] = src[i];
276 }
277 dest[len] = 0;
278}
279//******************************************************************************
280//******************************************************************************
Note: See TracBrowser for help on using the repository browser.