Release 940405

Tue Apr  5 14:36:59 1994  Bob Amstadt  (bob@pooh)

	* [include/mdi.h] [windows/mdi.c]
	Use WM_PARENTNOTIFY messages to activate children.
	Generate WM_CHILDACTIVATE messages.
	Beginnings handler for maxmized child window.
	Clean up when children are destroyed.

	* [windows/message.c] [windows/nonclient.c] [windows/winpos.c]
	Removed code add 94/03/26.

Apr 4, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [control/menu.c]
	Make mouse menu navigation working again. :-))
	(be carefull, clicking outside menus (ie.: clientrect) 
	not resolved yet)

	* [windows/nonclient.c]  [controls/scroll.c]
	Bugs fix in NCTrackScrollBars().

	* [misc/dos_fs.c]
	Bug fix in 'ToDos()' in conversion for '/',
		(example: '/window/' was translated to 'WINDOWs').

	* [miscemu/int21.c]
	Function ChangeDir() extract possible drive before DOS_ChangeDir().

	* [loader/library.c]  [loader/wine.c]
	Playing around moving function GetProcAddress() and put some code in.

Mon Apr  4 21:39:07 1994  Alexandre Julliard (julliard@lamisun.epfl.ch)

	* [misc/main.c]
	Better explanation of command-line options.

	* [objects/dib.c]
	Implemented SetDIBitsToDevice().

	* [windows/dc.c]
	Bug fix in SetDCState().

	* [windows/event.c]
	Removed WS_DISABLED handling (now done in message.c).

	* [windows/message.c]
	Added sending a WM_PARENTNOTIFY message in MSG_TranslateMouseMsg().
	Use WindowFromPoint() to find the window for mouse events, taking
	into account disabled windows.

	* [windows/painting.c]
	Bug fix in BeginPaint() to allow calling it at other times than
	on WM_PAINT (Solitaire needs it...)

	* [windows/win.c]
	Implemented FindWindow().
	Rewritten EnableWindow() to behave more like Windows.

	* [windows/winpos.c]
	Rewritten WindowFromPoint() to also search child windows.

Mon Apr  4 17:36:32 1994  Erik Bos (erik@trashcan.hacktic.nl)

	* [include/int21.h] -> [msdos.h]
	renamed.

	* [miscemu/int10.h] [miscemu/int25.h] [miscemu/int26.h] 
	new, added for int 10, 25 and 26.

	* [miscemu/ioports.c]
	new, added to allow win apps to use ioports.

	* [loader/signal.c]
	Added support for in, inb, out, outb instructions.

Sun Mar 27 13:40:25 1994  Bob Amstadt  (bob@pooh)

	* controls/menu.c (InsertMenu): Changed to use FindMenuItem().

Sat Mar 26 21:23:55 1994  Bob Amstadt  (bob@pooh)

	* [windows/mdi.c]
	Window list properly updated.

	* [windows/message.c]
	Call WINPOS_ChildActivate() when mouse pressed.

	* [windows/nonclient.c]
	Use WINPOS_IsAnActiveWindow() instead of GetActiveWindow() in
	NC_HandleNCPaint().

	* [windows/winpos.c]
	Created functions WINPOS_IsAnActiveWindow() and WINPOS_ActivateChild()

Thu Mar 24 14:49:17 1994  Bob Amstadt  (bob@pooh)

	* controls/menu.c (DeleteMenu): Changed to use FindMenuItem
	(DeleteMenu): Many bug fixes.

	* [controls/menu.c]
	Created function FindMenuItem().

Thu Mar 24 14:17:24 1994  Bob Amstadt  (bob@pooh)

	* [windows/win.c]
	Removed incorrect MDI handling code from CreateWindowEx().

	* [controls/menu.c]
	MF_STRING items needed to allocate a private copy of string.

	* [controls/menu.c]
	Fixed buggy calls to GlobalFree().

	* [memory/global.c]
	Eliminated some redundant code with function call.

Wed Mar 23 1994 Pentti Moilanen (pentti.moilanen@ntc.nokia.com)

	* [windows/timer.c]
	timer list pointers looped in InsertTimer

Tue Mar 29 13:32:08 MET DST 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [misc/cursor.c]
	A few changes for desktop window support.

	* [misc/main.c]
	Added -depth option.

	* [misc/rect.c]
	Yet another bug fix in SubtractRect().

	* [objects/bitmap.c]
	Changes to use only one depth (specified with -depth)
	for color bitmaps.

	* [objects/brush.c]
	Added support for dithered solid brushes.

	* [objects/color.c]
	Use the same 20 system colors as in Windows.
	System palette initialisation now done in COLOR_InitPalette().
	Added support for a color mapping table to map logical color
	indexes to X colormap entries.
	Implemented GetNearestColor() and RealizeDefaultPalette().

	* [objects/dib.c]
	Added support for color mapping table.

	* [objects/dither.c]  (New file)
	Implemented solid color dithering.

	* [objects/palette.c]
	Implemented GetSystemPaletteEntries() and SelectPalette().

	* [windows/class.c]
	Make a copy of the menu name in RegisterClass().

	* [windows/dc.c]
	Fixed device caps when using a desktop window.
	Added support for the color mapping table in DCs.

	* [windows/event.c]
	Added ConfigureNotify handler on desktop window.

	* [windows/message.c]
	Removed call to XTranslateCoordinates() on every mouse motion
	New function MSG_Synchronize() to synchronize with the X server.

	* [windows/syscolor.c]
	Rewritten SYSCOLOR_Init() to read the system colors from WIN.INI.

	* [windows/winpos.c]
	Added synchronization on window mapping. Solves the double redraw
	problem when starting Solitaire.

Mar 27, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [control/menu.c]	* [windows/defwnd.c]
	Make keyboard navigation working with menubar,
	but temporarely inserted a bug in menubar mouse handling ... :-((
	(it will be fix next week !)

	* [windows/defwnd.c]
	Connect VK_MENU to menubar navigation.

	* [loader/library.c]
	GetModuleHandle() return 'fictive 0xF000+ handles' for built-in DLLs.

Sun Mar 20 22:32:13 1994 Erik Bos (erik@trashcan.hacktic.nl)

	* [misc/main.c]
	Added Copy(). Added a check for `-h' to show usage.

	* [misc/dos_fs.c]
	Fixed bug in FindFile(), to load directories as dlls.

	* [misc/dos_fs.c]
	Fixed ToUnix() and ToDos() again, as my previous patch
	didn't make it.

	* [misc/dos_fs.c] [miscemu/int21.c]
	Bug fixes, should be able to handle all winfile and progman int21
	requests now except for a few small things.

Tue Mar 29 06:25:54 1994  crw@harris.mlb.semi.harris.com (Carl Williams)

	* [memory/heap.c]
	Implemented GetFreeSystemResources().

Mon Mar 21 17:32:25 1994  Bob Amstadt  (bob@pooh)

	* controls/menu.c (GetSubMenu): Function did not return correct value

	* [windows/mdi.c]
	Beginnings of menu handling.

Thu Mar 10 11:32:06 1994  Stefan (SAM) Muenzel  (muenzel@tat.physik.uni-tuebingen.de)

	* [objects/font.c]
	if font.width equals zero use asterix instead.

Mon Mar 21 17:23:37 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [objects/bitmap.c]
	Rewritten bitmap code to use exclusively X pixmaps; *much* faster.

	* [objects/brush.c]
	Some changes with pattern brushes because of the new bitmap code.

	* [objects/color.c]
	Added function COLOR_ToPhysical for better color mapping.

	* [objects/dib.c]
	Heavily optimized SetDIBits().

	* [windows/dc.c]
	Opimized SetDCState() and DC_SetupGC*() functions.
	Added stub for CreateIC().

Mar 20, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [misc/message.c]
	Call SetFocus() after closing box to give back focus to previous owner.

	* [misc/files.c]
	Small bug fix in GetTempFilename() : replace a '\' to '\\'.

	* [control/scroll.c]
	Calls to BitBlt() replace by StretchBlt().

	* [control/menu.c]
	Call SetFocus() to previous owner after closing Popups.	
	Fill stub DeleteMenu().

	* [control/listbox.c]
	* [control/combo.c]
	Use SetFocus() in WM_LBUTTONDOWN.
	Close ComboBox List upon WM_KILLFOCUS.
	Early development of WM_MEASUREITEM mecanism.

	* [windows/defwnd.c]
	Early development of WM_MEASUREITEM mecanism.

Tue Mar 22 10:44:57 1994  Miguel de Icaza  (miguel@xochitl)

	* [misc/atom.c]
	Fixed sintaxis problem when building the library.

Tue Mar 15 13:11:56 1994  Bob Amstadt  (bob@pooh)

	* [include/windows.h]
	Added message types and structures for MDI

	* [include/mdi.h]
	Created internal structures for handling MDI

	* [windows/mdi.c]
	Began creating MDI support

Thu Mar 10 16:51:46 1994  Bob Amstadt  (bob@pooh)

	* [loader/wine.c] [include/wine.h]
	Added new field to "struct w_files" to hold the "name table"
	resource for Windows 3.0 programs

	* [loader/resource.c]
	Added code to handle programs with a "name table" resource.
	LoadResourceByName() modified to check for the existence of
	this resource.

Mon Mar 14 22:31:42 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [objects/color.c]
	Added installing the private colormap on the desktop window.

	* [windows/event.c]
	Cleaned up focus event handling (see focus.c).
	Use GetFocus() to direct key events to the correct window.

	* [windows/focus.c]
	Rewritten SetFocus() to:
	- only set X focus on top-level windows
	- send WM_SETFOCUS and WM_KILLFOCUS messages (was done in event.c)
	- prevent setting focus to disabled windows
	- install private colormap so -privatemap option works again

	* [windows/message.c] [windows/timer.c]
	Changed timer management to no longer use PostMessage(), but
	to generate timer messages on the fly. Also fixed a related bug
	in GetMessage() which could cause busy-waiting.

	* [windows/win.c]
	Only select focus events on top-level windows.

	* [windows/winpos.c]
	Added some sanity checks for desktop window.

Fri Mar  4 20:42:01 1994  Erik Bos (erik@trashcan.hacktic.nl)

	* [misc/dos_fs.c]
	bug fixes in ToUnix(), WinIniFileName(), GetUnixFileName(). 
	Support for tilde symbol added for rootdirectories in [drives]
	section of wine's configfile.

	* [misc/file.c]
	hread(), hwrite() added.

	* [misc/main.c]
	hmemcpy() added.

	* [if1632/stress.spec] [include/stress.h] [misc/stress.c]
	Added STRESS.DLL, an useless dll used to stress a windows system.

	* [*/*]
	Added missing #includes, fixed prototypes for prototype checking.

	* [include/prototypes.h]

	Added prototypes for loader/*c, if1632/*c.

Tue Mar  8 09:54:34 1994  Bob Amstadt  (bob@pooh)

	* [Configure]
	Added reminder to set WINEPATH, if it is not set.

	* [Imakefile]
	Removed #elif's

	* [controls/button.c]
	Added BN_CLICKED notification for owner-draw buttons.

	* [if1632/kernel.spec] [memory/heap.c]
	Changed Local* functions to WIN16_Local* to prevent unconcious use
	of these functions.

	* [if1632/relay.c]
	Push old Stack16Frame on stack before setting.

	* [include/atom.h] [misc/atom.c] [include/heap.h] [memory/local.c]
	Added multiple local heap handling in Atom* functions.

	* [include/regfunc.h] [miscemu/int21.c]
	Rewrote DOS3Call() use context frame that is already on the stack.

	* [misc/profile.c]
	Fixed to allow leading ";" to mark comments.

	* [misc/spy.c]
	Fixed bugs and added support for "include" and "exclude" filters.

	* [misc/user.c]
	Rearranged calls in InitApp().

	* [misc/font.c]
	Fixed font handling to create system fonts, if they are used.

	* [windows/dc.c]
	If text drawn on window with no font specified, then default the
	font to the system font.

Mon Mar  7 20:32:09 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [controls/desktop.c]
	Added handling of WM_NCCREATE and WM_ERASEBKGND functions.
	Implemented SetDeskPattern().

	* [misc/main.c]
	Added -desktop option to get a large desktop window with
	everything inside it.
	Added -name option.

	* [misc/rect.c]
	Bug fix in SubtractRect().

	* [objects/*.c]
	Replaced the DefaultRootWindow() macro by the rootWindow variable.

	* [windows/event.c] [windows/message.c]
	  [windows/nonclient.c] [windows/win.c]
	A few changes to accomodate the new desktop window.

 Tue Mar  8 11:13:03 1994  Miguel de Icaza  (miguel@xochitl.nuclecu.unam.mx)
 
 	* [toolkit/arch.c] --New file-- 
 	Routines for converting little endian data structures to
 	big-endian data structures, currently only BITMAP structures are 
 	converted.
 
 	* [misc/atom.c]
 	When used as part of the WineLib, the code is much simpler.
 	Doesn't depend on alignement.
 
 	* [loader/wine.c]
 	Ifdefed Emulator dependent code if compiling WineLib.
 
 	* [loader/resource.c]
 	Moved misc/resource.c to loader/resource.c.
 
 	* [loader/dump.c,ldt.c,ldtlib.c,library,c,selector.c,signal.c]
 	Ifdefed whole code if compiling WINELIB.
 
 	* [include/winsock.h]
 	Added compilation define to allow compilation on SunOS.
 
 	* [include/wine.h]
 	Removed load_typeinfo and load_nameinfo prototypes, they belong
 	to neexe.h
 
 	* [include/neexe.h]
 	Added load_typeinfo and load_nameinfo prototypes.
 
 	* [include/arch.h]
 	Fixed some bugs in the conversion routines.
 	Added macros for Bitmap loading.

Tue Mar  8 12:52:05 1994  crw@maniac.mlb.semi.harris.com (Carl Williams)
 	
	* [if1632/kernel.spec] [memory/global.c]
	Implemented GetFreeSpace()

	* [if1632/user.spec] [loader/resource.c]
	Implemented CreateIcon()
diff --git a/controls/menu.c b/controls/menu.c
index 53d9f0d..9ab0366 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -6,35 +6,44 @@
 
 /*
 #define DEBUG_MENU
-#define DEBUG_SYSMENU
 */
 
+#include <stdlib.h>
+#include <stdio.h>
 #include "windows.h"
 #include "sysmetrics.h"
+#include "prototypes.h"
 #include "menu.h"
 #include "heap.h"
 #include "win.h"
 
-#define SC_ABOUTWINE     SC_SCREENSAVE+1
-#define SC_SYSMENU	 SC_SCREENSAVE+2
-#define SC_ABOUTWINEDLG	 SC_SCREENSAVE+3
+#define SC_ABOUTWINE    	SC_SCREENSAVE+1
+#define SC_SYSMENU			SC_SCREENSAVE+2
+#define SC_ABOUTWINEDLG		SC_SCREENSAVE+3
 
 extern HINSTANCE hSysRes;
 HMENU	hSysMenu = 0;
 HBITMAP hStdCheck = 0;
 HBITMAP hStdMnArrow = 0;
+static BOOL	MenuHasFocus = FALSE;
 
 LPPOPUPMENU PopupMenuGetStorageHeader(HWND hwnd);
 LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr);
 void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
-void MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
+BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
 void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
 void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y);
 void StdDrawPopupMenu(HWND hwnd);
+void ResetHiliteFlags(LPPOPUPMENU lppop);
+BOOL ExecFocusedMenuItem(HWND hWnd, LPPOPUPMENU lppop);
+void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex);
 LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet);
 LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet);
+BOOL ActivateMenuFocus(HWND hWnd);
+BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu);
 void PopupMenuCalcSize(HWND hwnd);
 void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
+LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags);
 LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos);
 WORD GetSelectionKey(LPSTR str);
 LPSTR GetShortCutString(LPSTR str);
@@ -51,491 +60,538 @@
  */
 LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
 {    
-    CREATESTRUCT *createStruct;
-    WORD	wRet;
-    short	x, y;
-    WND  	*wndPtr;
-    LPPOPUPMENU lppop, lppop2;
-    LPMENUITEM	lpitem, lpitem2;
-    HMENU	hSubMenu;
-    RECT	rect;
-    HDC		hDC;
-    PAINTSTRUCT ps;
-    switch(message) 
-    {
-    case WM_CREATE:
+	CREATESTRUCT *createStruct;
+	WORD	wRet;
+	short	x, y;
+	WND  	*wndPtr;
+	LPPOPUPMENU lppop, lppop2;
+	LPMENUITEM	lpitem, lpitem2;
+	HMENU	hSubMenu;
+	RECT	rect;
+	HDC		hDC;
+	PAINTSTRUCT ps;
+	switch(message) {
+	case WM_CREATE:
 #ifdef DEBUG_MENU
-        printf("PopupMenu WM_CREATE lParam=%08X !\n", lParam);
+		printf("PopupMenu WM_CREATE lParam=%08X !\n", lParam);
 #endif
-	createStruct = (CREATESTRUCT *)lParam;
-     	lppop = (LPPOPUPMENU)createStruct->lpCreateParams;
-     	if (lppop == NULL) break;
-	wndPtr = WIN_FindWndPtr(hwnd);
-	*((LPPOPUPMENU *)&wndPtr->wExtra[1]) = lppop;
+		createStruct = (CREATESTRUCT *)lParam;
+		lppop = (LPPOPUPMENU)createStruct->lpCreateParams;
+		if (lppop == NULL) break;
+		wndPtr = WIN_FindWndPtr(hwnd);
+		*((LPPOPUPMENU *)&wndPtr->wExtra[1]) = lppop;
 #ifdef DEBUG_MENU
-        printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
+		printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
 #endif
-	if (hStdCheck == (HBITMAP)NULL) 
-	    hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
-	if (hStdMnArrow == (HBITMAP)NULL) 
-	    hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
-	return 0;
-    case WM_DESTROY:
-	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+		if (hStdCheck == (HBITMAP)NULL) 
+			hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
+		if (hStdMnArrow == (HBITMAP)NULL) 
+			hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
+		return 0;
+	case WM_DESTROY:
+		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
 #ifdef DEBUG_MENU
-        printf("PopupMenu WM_DESTROY %lX !\n", lppop);
+		printf("PopupMenu WM_DESTROY %lX !\n", lppop);
 #endif
-	return 0;
-    case WM_COMMAND:
-	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-	if (lppop->hWndParent != (HWND)NULL) {
-	    SendMessage(lppop->hWndParent, WM_COMMAND, wParam, lParam);
+		return 0;
+	case WM_COMMAND:
 #ifdef DEBUG_MENU
-	    printf("PopupMenu // push to lower parent WM_COMMAND !\n");
+		printf("PopupMenuWndProc // WM_COMMAND received !\n");
 #endif
-	    }
-	else {
-	    if (lppop->SysFlag == 0) {
-		SendMessage(lppop->ownerWnd, WM_COMMAND, wParam, lParam);
+		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+		if (lppop == NULL) break;
+/*		if (!lppop->BarFlag)  ShowWindow(hwnd, SW_HIDE); */
+		if (lppop->SysFlag) {
+			MenuHasFocus = FALSE;
+			if (wParam == SC_ABOUTWINE) {
+				printf("SysMenu // Show 'About Wine ...' !\n");
+/*				DialogBox(hSysRes, MAKEINTRESOURCE(SC_ABOUTWINEDLG), */
+				DialogBox(hSysRes, MAKEINTRESOURCE(2), 
+					GetParent(hwnd), (FARPROC)AboutWine_Proc);
+				}
+			else
 #ifdef DEBUG_MENU
-		printf("PopupMenu // push to Owner WM_COMMAND !\n");
+				printf("PopupMenuWndProc // push to Owner WM_SYSCOMMAND !\n");
 #endif
-		}
-	    else {
-#ifdef DEBUG_SYSMENU
-		printf("PopupMenu // push to Owner WM_SYSCOMMAND !\n");
-#endif
-		SendMessage(lppop->ownerWnd, WM_SYSCOMMAND, wParam, lParam);
-		}
-	    }
-	if (lppop->BarFlags == 0)  ShowWindow(hwnd, SW_HIDE);
-    	break;
-    case WM_SHOWWINDOW:
-	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-    	if (wParam == 0 && lParam == 0L) {
-	    HideAllSubPopupMenu(lppop);
-#ifdef DEBUG_MENU
-	    printf("PopupMenu WM_SHOWWINDOW -> HIDE!\n");
-#endif
-/*
-	    UpdateWindow(lppop->ownerWnd);
-*/
-	    break;
-	    }
-	lppop->FocusedItem = (WORD)-1;
-	if (lppop->BarFlags == 0) {
-	    PopupMenuCalcSize(hwnd);
-#ifdef DEBUG_MENU
-	    printf("PopupMenu WM_SHOWWINDOW Width=%d Height=%d !\n", 
-			lppop->Width, lppop->Height);
-#endif
-	    SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height, 
-		SWP_NOZORDER | SWP_NOMOVE);
-	    }
-    	break;
-    case WM_LBUTTONDOWN:
-	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-	SetCapture(hwnd);
-	MenuButtonDown(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
-	break;
-    case WM_LBUTTONUP:
-	lppop = PopupMenuGetStorageHeader(hwnd);
-	ReleaseCapture();
-	MenuButtonUp(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
-	break;
-    case WM_MOUSEMOVE:
-	lppop = PopupMenuGetStorageHeader(hwnd);
-	MenuMouseMove(hwnd, lppop, wParam, LOWORD(lParam), HIWORD(lParam));
-	break;
-
-    case WM_KEYDOWN:
-    case WM_KEYUP:
-	if (lParam < 0L) break;
-	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-	if (lppop->FocusedItem == (WORD)-1) {
-	    if (wParam == VK_UP || wParam == VK_DOWN || 
-		wParam == VK_LEFT || wParam == VK_RIGHT) {
-		hDC = GetDC(hwnd);
-		lppop->FocusedItem = 0;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		ReleaseDC(hwnd, hDC);
-		}
-	    break;
-	    }
-	switch(wParam) {
-	    case VK_UP:
-		if (lppop->BarFlags != 0) break;
-		if (lppop->FocusedItem < 1) break;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
-		    HideAllSubPopupMenu(lppop);
-		hDC = GetDC(hwnd);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		lppop->FocusedItem--;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		ReleaseDC(hwnd, hDC);
-		break;
-	    case VK_DOWN:
-		if (lppop->BarFlags != 0) goto ProceedSPACE;
-		if (lppop->FocusedItem >= lppop->nItems - 1) break;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
-		    HideAllSubPopupMenu(lppop);
-		hDC = GetDC(hwnd);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		lppop->FocusedItem++;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		ReleaseDC(hwnd, hDC);
-		break;
-	    case VK_LEFT:
-		if (lppop->BarFlags == 0) {
-		    if (lppop->hWndParent != 0) 
-			SendMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
-		    break;
-		    }
-		if (lppop->FocusedItem < 1) break;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
-		    HideAllSubPopupMenu(lppop);
-		hDC = GetDC(hwnd);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		lppop->FocusedItem--;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		ReleaseDC(hwnd, hDC);
-		break;
-	    case VK_RIGHT:
-		if (lppop->BarFlags == 0) {
-		    if (lppop->hWndParent != 0) 
-			SendMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
-		    break;
-		    }
-		if (lppop->FocusedItem >= lppop->nItems - 1) break;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
-		    HideAllSubPopupMenu(lppop);
-		hDC = GetDC(hwnd);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		lppop->FocusedItem++;
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		ReleaseDC(hwnd, hDC);
-		break;
-	    case VK_RETURN:
-	    case VK_SPACE:
-ProceedSPACE:
-		printf("PopupMenu VK_SPACE !\n");
-		lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-		    hSubMenu = (HMENU)lpitem->item_id;
-		    lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
-		    if (lppop2 == NULL) break;
-		    lppop2->hWndParent = hwnd;
-		    GetClientRect(hwnd, &rect);
-		    if (lppop->BarFlags != 0) {
-			y = rect.bottom - rect.top;
-			TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-				lpitem->rect.left, 0, 
-				0, lppop->ownerWnd, (LPRECT)NULL);
+				PostMessage(lppop->ownerWnd, WM_SYSCOMMAND, wParam, lParam);
+/*				PostMessage(lppop->hWndParent, WM_SYSCOMMAND, wParam, lParam); */
+			break;
 			}
-		    else {
-			x = rect.right;
-			GetWindowRect(hwnd, &rect);
-			x += rect.left;
-			TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-				x, lpitem->rect.top,
-				0, lppop->ownerWnd, (LPRECT)NULL);
-			}
-		    GlobalUnlock(hSubMenu);
-		    break;
-		    }
-		if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-		    ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
-		    ShowWindow(lppop->hWnd, SW_HIDE);
-		    if (lppop->hWndParent != (HWND)NULL)
-			SendMessage(lppop->hWndParent, WM_COMMAND, 
-					lpitem->item_id, 0L);
-		    else 
-			SendMessage(lppop->ownerWnd, WM_COMMAND, 
-					lpitem->item_id, 0L);
 #ifdef DEBUG_MENU
-		    printf("PopupMenu // SendMessage WM_COMMAND wParam=%d !\n", 
-				lpitem->item_id);
+		printf("PopupMenuWndProc // push to Owner WM_COMMAND !\n");
 #endif
-		   }
+		MenuHasFocus = FALSE;
+		PostMessage(lppop->hWndParent, WM_COMMAND, wParam, lParam);
+/*		PostMessage(lppop->ownerWnd, WM_COMMAND, wParam, lParam); */
 		break;
-	    }
-	break;
-    case WM_CHAR:
-	if (lParam < 0L) break;
-	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-	if (wParam == VK_ESCAPE) {
-	    if (lppop->hWndParent != 0) {
-		lppop2 = PopupMenuGetWindowAndStorage(
-			lppop->hWndParent, &wndPtr);
-		HideAllSubPopupMenu(lppop2);
-		break;
-		}
-	    if (lppop->FocusedItem != (WORD)-1) {
-		lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		hDC = GetDC(hwnd);
-		if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem2->rect);
-		    }
-		ReleaseDC(hwnd, hDC);
+	case WM_SHOWWINDOW:
+#ifdef DEBUG_MENU
+		printf("PopupMenuWndProc // WM_SHOWWINDOW received !\n");
+#endif
+		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+		if (lppop == NULL) break;
+		if (wParam == 0 && lParam == 0L) {
+			HideAllSubPopupMenu(lppop);
+#ifdef DEBUG_MENU
+			printf("PopupMenuWndProc hWnd=%04X WM_SHOWWINDOW -> HIDE!\n", hwnd);
+#endif
+			if (lppop->SysFlag) MenuHasFocus = FALSE;
+			SetFocus(lppop->hWndPrev);
+			break;
+			}
 		lppop->FocusedItem = (WORD)-1;
-		}
-	    }
-	if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A';
-	lpitem = MenuFindItemBySelKey(lppop, wParam, &wRet);
-	if (lpitem != NULL) {
-	    printf("Found  wRet=%d !\n", wRet);
-	    if (lppop->FocusedItem != (WORD)-1) {
-		lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP)
-		    HideAllSubPopupMenu(lppop);
-		hDC = GetDC(hwnd);
-		if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem2->rect);
-		    }
-		ReleaseDC(hwnd, hDC);
-		}
-	    lppop->FocusedItem = wRet;
-	    goto ProceedSPACE;
-	    }
-	break;
-    case WM_PAINT:
-	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-	if (lppop->BarFlags == 0) {
-	    PopupMenuCalcSize(hwnd);
-	    StdDrawPopupMenu(hwnd);
-	    }
-	break;
-    default:
-	return DefWindowProc( hwnd, message, wParam, lParam );
+		if (!lppop->BarFlag) {
+			PopupMenuCalcSize(hwnd);
+			ResetHiliteFlags(lppop);
+#ifdef DEBUG_MENU
+			printf("PopupMenuWndProc hWnd=%04X WM_SHOWWINDOW Width=%d Height=%d !\n", 
+									hwnd, lppop->Width, lppop->Height);
+#endif
+			SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height, 
+											SWP_NOZORDER | SWP_NOMOVE);
+#ifdef DEBUG_MENU
+			printf("PopupMenuWndProc // End of WM_SHOWWINDOW !\n");
+#endif
+			}
+    	break;
+	case WM_LBUTTONDOWN:
+		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+		if (lppop == NULL) break;
+		SetCapture(hwnd); 
+		MenuButtonDown(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
+		break;
+	case WM_LBUTTONUP:
+		lppop = PopupMenuGetStorageHeader(hwnd);
+		if (lppop == NULL) break;
+		ReleaseCapture(); 
+		MenuButtonUp(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
+		break;
+	case WM_MOUSEMOVE:
+		lppop = PopupMenuGetStorageHeader(hwnd);
+		if (lppop == NULL) break;
+		MenuMouseMove(hwnd, lppop, wParam, LOWORD(lParam), HIWORD(lParam));
+		break;
+
+	case WM_KEYUP:
+#ifdef DEBUG_MENU
+		printf("PopupMenuWndProc hWnd=%04X WM_KEYUP w=%04X l=%08X !\n", 
+												hwnd, wParam, lParam);
+#endif
+		break;
+	case WM_KEYDOWN:
+#ifdef DEBUG_MENU
+		printf("PopupMenuWndProc hWnd=%04X WM_KEYDOWN w=%04X l=%08X !\n", 
+												hwnd, wParam, lParam);
+#endif
+		if (lParam < 0L) break;
+		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+		if (lppop == NULL) break;
+		switch(wParam) {
+			case VK_HOME:
+				if (lppop->FocusedItem == 0) break;
+				MenuItemSelect(hwnd, lppop, 0);
+				break;
+			case VK_UP:
+				if (lppop->BarFlag) break;
+				if (lppop->FocusedItem < 1) break;
+				MenuItemSelect(hwnd, lppop, lppop->FocusedItem - 1);
+				break;
+			case VK_DOWN:
+				if (lppop->BarFlag) goto ProceedSPACE;
+				if (lppop->FocusedItem == (WORD)-1) {
+					MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+					break;
+					}
+				if (lppop->FocusedItem >= lppop->nItems - 1) break;
+				MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+				break;
+			case VK_LEFT:
+				if (lppop->SysFlag != 0) {
+					ShowWindow(hwnd, SW_HIDE);
+					hwnd = lppop->hWndParent;
+					lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+					if (lppop == NULL) break;
+					MenuItemSelect(hwnd, lppop, lppop->nItems - 1);
+				    break;
+					}
+				if (lppop->BarFlag) {
+					if (lppop->FocusedItem < 1) {
+						MenuItemSelect(hwnd, lppop, -1);
+						NC_TrackSysMenu(hwnd);
+						break;
+						}
+					if (HideAllSubPopupMenu(lppop)) {
+						MenuItemSelect(hwnd, lppop, lppop->FocusedItem - 1);
+						goto ProceedSPACE;
+						}
+					}
+			    if (lppop->hWndParent != 0) {
+					PostMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
+				    break;
+				    }
+				MenuItemSelect(hwnd, lppop, lppop->FocusedItem - 1);
+				break;
+			case VK_RIGHT:
+				if (lppop->SysFlag != 0) {
+					ShowWindow(hwnd, SW_HIDE);
+					hwnd = lppop->hWndParent;
+					lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+					if (lppop == NULL) break;
+					MenuItemSelect(hwnd, lppop, 0);
+				    break;
+					}
+				if (lppop->BarFlag) {
+					if (lppop->FocusedItem >= lppop->nItems - 1) {
+						MenuItemSelect(hwnd, lppop, -1);
+						NC_TrackSysMenu(hwnd);
+						break;
+						}
+					if (HideAllSubPopupMenu(lppop)) {
+						MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+						goto ProceedSPACE;
+						}
+					}
+			    if (lppop->hWndParent != 0) {
+					PostMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
+				    break;
+				    }
+				MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+				break;
+			case VK_RETURN:
+			case VK_SPACE:
+ProceedSPACE:	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+				ExecFocusedMenuItem(hwnd, lppop);
+				break;
+			default:
+				break;
+			}
+			break;
+	case WM_CHAR:
+#ifdef DEBUG_MENU
+		printf("PopupMenuWndProc hWnd=%04X WM_CHAR wParam=%04X !\n", hwnd, wParam);
+#endif
+		if (lParam < 0L) break;
+		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+		if (lppop == NULL) break;
+		if (wParam == VK_ESCAPE) {
+			if (lppop->BarFlag) {
+#ifdef DEBUG_MENU
+				printf("VK_ESCAPE // Unselect all MenuBar's Items !\n");
+#endif
+				if (lppop->FocusedItem != (WORD)-1)
+					MenuItemSelect(hwnd, lppop, -1);
+				}
+			if (lppop->SysFlag) {
+#ifdef DEBUG_MENU
+				printf("VK_ESCAPE // SysMenu !\n");
+#endif
+				ShowWindow(hwnd, SW_HIDE);
+				break;
+				}
+			if (lppop->hWndParent != 0) {
+#ifdef DEBUG_MENU
+				printf("VK_ESCAPE // Hide only SubPopup !\n");
+#endif
+				lppop2 = PopupMenuGetWindowAndStorage(lppop->hWndParent, &wndPtr);
+				if (lppop2 == NULL) break;
+				HideAllSubPopupMenu(lppop2);
+				break;
+				}
+			else {
+#ifdef DEBUG_MENU
+				printf("VK_ESCAPE // Hide Root Popup !\n");
+#endif
+				ShowWindow(hwnd, SW_HIDE);
+				MenuHasFocus = FALSE;
+				}
+			break;
+			}
+		if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A';
+		lpitem = MenuFindItemBySelKey(lppop, wParam, &wRet);
+		if (lpitem != NULL) {
+		    printf("Found  wRet=%d !\n", wRet);
+			MenuItemSelect(hwnd, lppop, wRet);
+			lppop->FocusedItem = wRet;
+			goto ProceedSPACE;
+			}
+		if (lppop->hWndParent != (HWND)NULL)
+			SendMessage(lppop->hWndParent, WM_MENUCHAR, wParam, 
+				MAKELONG(0, 0));
+		else 
+			SendMessage(lppop->ownerWnd, WM_MENUCHAR, wParam, 
+				MAKELONG(0, 0));
+		break;
+	case WM_PAINT:
+#ifdef DEBUG_MENU
+		printf("PopupMenuWndProc // WM_PAINT received !\n");
+#endif
+		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+		if (lppop == NULL) break;
+		if (!lppop->BarFlag) {
+			PopupMenuCalcSize(hwnd);
+			StdDrawPopupMenu(hwnd);
+			}
+		break;
+	default:
+		return DefWindowProc(hwnd, message, wParam, lParam);
     }
-return(0);
+return 0;
 }
 
 
-void MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
+BOOL ExecFocusedMenuItem(HWND hWnd, LPPOPUPMENU lppop)
 {
-    HDC		hDC;
-    LPMENUITEM	lpitem, lpitem2;
-    RECT	rect;
-    HMENU	hSubMenu;
-    WORD	wRet;
-    LPPOPUPMENU lppop2;
-    lpitem = MenuFindItem(lppop, x, y, &wRet);
-#ifdef DEBUG_MENU
-    printf("MenuButtonDown // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
-					x, y, wRet, lpitem);
-#endif
-    if (lpitem != NULL) {
-	if (lppop->FocusedItem != (WORD)-1) {
-	    HideAllSubPopupMenu(lppop);
-	    lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-	    if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-		((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	        hDC = GetWindowDC(hWnd);
-	        InvertRect(hDC, &lpitem2->rect);
-		ReleaseDC(hWnd, hDC);
-		}
-	    }
-	lppop->FocusedItem = wRet;
-	if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-	    ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	    hDC = GetWindowDC(hWnd);
-	    InvertRect(hDC, &lpitem->rect);
-	    ReleaseDC(hWnd, hDC);
-	    }
+	short	x, y;
+	LPPOPUPMENU lppop2;
+	LPMENUITEM	lpitem;
+	HMENU	hSubMenu;
+	RECT	rect;
+	lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
 	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-	    hSubMenu = (HMENU)lpitem->item_id;
-	    lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
-	    if (lppop2 == NULL) return;
-	    lppop2->hWndParent = hWnd;
-	    if (lppop->BarFlags != 0) {
-		GetWindowRect(hWnd, &rect);
-/*		y = rect.top + lppop->Height; */
-		y = rect.top + lppop->rect.bottom;
-		TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-			rect.left + lpitem->rect.left, 
-			y, 0, lppop->ownerWnd, (LPRECT)NULL);
+		hSubMenu = (HMENU)lpitem->item_id;
+		lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+		if (lppop2 == NULL) return FALSE;
+		lppop2->hWndParent = hWnd;
+		lppop2->hWndPrev = GetFocus();
+		GetClientRect(hWnd, &rect);
+		if (lppop->BarFlag) {
+			GetWindowRect(hWnd, &rect);
+			y = rect.top + lppop->rect.bottom;
+			TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+				rect.left + lpitem->rect.left, 
+				y, 0, lppop->ownerWnd, (LPRECT)NULL);
+			}
+		else {
+			x = lppop->rect.right;
+			GetWindowRect(hWnd, &rect);
+			x += rect.left;
+			TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+				x, rect.top + lpitem->rect.top,
+				0, lppop->ownerWnd, (LPRECT)NULL);
+			}
+		GlobalUnlock(hSubMenu);
+		return TRUE;
 		}
-	    else {
-		x = lppop->rect.right;
-		GetWindowRect(hWnd, &rect);
-		x += rect.left;
-		TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-			x, rect.top + lpitem->rect.top,
-			0, lppop->ownerWnd, (LPRECT)NULL);
+	if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+		((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
+		MenuHasFocus = FALSE;
+		if (lppop->BarFlag) {
+			PostMessage(lppop->ownerWnd, WM_COMMAND, lpitem->item_id, 0L);
+			}
+		else {
+			ShowWindow(lppop->hWnd, SW_HIDE);
+			SendMessage(lppop->hWnd, WM_COMMAND, lpitem->item_id, 0L);
+			}
 		}
-	    GlobalUnlock(hSubMenu);
-	    }
-	}
+	return TRUE;
+}
+
+
+
+BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
+{
+	HDC		hDC;
+	LPMENUITEM	lpitem, lpitem2;
+	RECT	rect;
+	HMENU	hSubMenu;
+	WORD	wRet;
+	LPPOPUPMENU lppop2;
+	if (lppop == NULL) return;
+	lpitem = MenuFindItem(lppop, x, y, &wRet);
+#ifdef DEBUG_MENU
+	printf("MenuButtonDown // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
+												x, y, wRet, lpitem);
+#endif
+	if (lpitem != NULL) {
+		MenuItemSelect(hWnd, lppop, wRet);
+		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+			hSubMenu = (HMENU)lpitem->item_id;
+			lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+			if (lppop2 == NULL) return;
+			lppop2->hWndParent = hWnd;
+			lppop2->hWndPrev = GetFocus();
+			if (lppop->BarFlag) {
+				GetWindowRect(hWnd, &rect);
+				y = rect.top + lppop->rect.bottom;
+				ReleaseCapture(); 
+				if (MenuHasFocus) {
+					TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+						rect.left + lpitem->rect.left, 
+						y, 0, lppop->ownerWnd, (LPRECT)NULL);
+					}
+				else {
+					MenuHasFocus = TRUE;
+					TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+						rect.left + lpitem->rect.left, 
+						y, 0, lppop->ownerWnd, (LPRECT)NULL);
+					MenuHasFocus = FALSE;
+					MenuFocusLoop(hWnd, lppop);
+					return TRUE;
+					}
+				}
+			else {
+				x = lppop->rect.right;
+				GetWindowRect(hWnd, &rect);
+				x += rect.left;
+				TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+					x, rect.top + lpitem->rect.top,
+					0, lppop->ownerWnd, (LPRECT)NULL);
+				}
+			GlobalUnlock(hSubMenu);
+			}
+		return TRUE;
+		}
+	printf("MenuButtonDown // x=%d y=%d // Not Found !\n", x, y);
+	MenuHasFocus = FALSE;
+	ShowWindow(lppop->hWnd, SW_HIDE);
+	return FALSE;
 }
 
 
 
 void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
 {
-    HDC		hDC;
-    LPMENUITEM	lpitem, lpitem2;
-    RECT	rect;
-    HMENU	hSubMenu;
-    WORD	wRet;
-    LPPOPUPMENU lppop2;
-    lpitem = MenuFindItem(lppop, x, y, &wRet);
+	HDC		hDC;
+	LPMENUITEM	lpitem, lpitem2;
+	RECT	rect;
+	HMENU	hSubMenu;
+	WORD	wRet;
+	LPPOPUPMENU lppop2;
+	if (lppop == NULL) return;
+	lpitem = MenuFindItem(lppop, x, y, &wRet);
 #ifdef DEBUG_MENU
-    printf("MenuButtonUp // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
-					x, y, wRet, lpitem);
+	printf("MenuButtonUp // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
+											x, y, wRet, lpitem);
 #endif
-    if (lpitem != NULL) {
-	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-	    return;
-	    }
-	if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-	    ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
-	    ShowWindow(lppop->hWnd, SW_HIDE);
-	    if (lppop->hWndParent != (HWND)NULL) {
-		SendMessage(lppop->hWndParent, WM_COMMAND, 
-				lpitem->item_id, 0L);
-#ifdef DEBUG_MENU
-		printf("MenuButtonUp // WM_COMMAND to ParentMenu wParam=%d !\n", 
-			lpitem->item_id);
-#endif
-		}
-	    else {
-		if (lppop->SysFlag == 0) {
-#ifdef DEBUG_MENU
-		    printf("PopupMenu // WM_COMMAND wParam=%d !\n", 
-				lpitem->item_id);
-#endif
-		    SendMessage(lppop->ownerWnd, WM_COMMAND, 
-					lpitem->item_id, 0L);
-		    }
-		else {
-		    if (lpitem->item_id == SC_ABOUTWINE) {
-			printf("SysMenu // Show 'About Wine ...' !\n");
-/*			DialogBox(hSysRes, MAKEINTRESOURCE(SC_ABOUTWINEDLG), */
-			DialogBox(hSysRes, MAKEINTRESOURCE(2), 
-				GetParent(hWnd), (FARPROC)AboutWine_Proc);
+	if (lpitem != NULL) {
+		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+			return;
 			}
-		    else {
-			SendMessage(lppop->ownerWnd, WM_SYSCOMMAND,
-					 lpitem->item_id, 0L);
-#ifdef DEBUG_SYSMENU
-			printf("MenuButtonUp // WM_SYSCOMMAND wParam=%04X !\n", 
-					lpitem->item_id);
-#endif
+		if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+			((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
+			MenuHasFocus = FALSE;
+			if (lppop->BarFlag) {
+				PostMessage(lppop->ownerWnd, WM_COMMAND, lpitem->item_id, 0L);
+				}
+			else {
+				ShowWindow(lppop->hWnd, SW_HIDE);
+				SendMessage(lppop->hWnd, WM_COMMAND, lpitem->item_id, 0L);
+				}
+			return;
 			}
-		    }
 		}
-#ifdef DEBUG_MENU
-	    printf("MenuButtonUp // SendMessage WM_COMMAND wParam=%d !\n", 
-			lpitem->item_id);
-#endif
-	    return;
-	    }
-	}
-    if (lppop->FocusedItem != (WORD)-1) {
-	HideAllSubPopupMenu(lppop); 
-	lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-	if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-	    ((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	    hDC = GetWindowDC(hWnd);
-	    InvertRect(hDC, &lpitem2->rect);
-	    ReleaseDC(hWnd, hDC);
-	    }
-	}
+	if (lppop->FocusedItem != (WORD)-1) {
+		MenuItemSelect(hWnd, lppop, lppop->FocusedItem);
+		}
 }
 
 
 
 void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y)
 {
-    HDC		hDC;
-    LPMENUITEM	lpitem, lpitem2;
-    RECT	rect;
-    HMENU	hSubMenu;
-    WORD	wRet;
-    LPPOPUPMENU lppop2;
-    if ((wParam & MK_LBUTTON) != 0) {
-	lpitem = MenuFindItem(lppop, x, y, &wRet);
+	HDC		hDC;
+	RECT	rect;
+	HMENU	hSubMenu;
+	LPMENUITEM	lpitem, lpitem2;
+	LPPOPUPMENU lppop2;
+	WORD	wRet;
+	if ((wParam & MK_LBUTTON) != 0) {
+		lpitem = MenuFindItem(lppop, x, y, &wRet);
 #ifdef DEBUG_MENU
-	printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
-					x, y, wRet, lpitem);
+		printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
+												x, y, wRet, lpitem);
 #endif
-	if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
-	    lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-	    hDC = GetWindowDC(hWnd);
-	    if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
-		((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
-		InvertRect(hDC, &lpitem2->rect);
+		if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
+			lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+			hDC = GetWindowDC(hWnd);
+			if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
+				HideAllSubPopupMenu(lppop);
+				}
+			MenuItemSelect(hWnd, lppop, wRet);
+			if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+				hSubMenu = (HMENU)lpitem->item_id;
+				lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+				if (lppop2 == NULL) {
+					ReleaseDC(hWnd, hDC);
+					return;
+					}
+				if (lppop->BarFlag) {
+					lppop2->hWndParent = hWnd;
+					lppop2->hWndPrev = GetFocus();
+					GetWindowRect(hWnd, &rect);
+					rect.top += lppop->rect.bottom;
+					TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+						rect.left + lpitem->rect.left, rect.top, 
+						0, lppop->ownerWnd, (LPRECT)NULL);
+					}
+				GlobalUnlock(hSubMenu);
+				}
+			ReleaseDC(hWnd, hDC);
+			}
 		}
-	    if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
-		HideAllSubPopupMenu(lppop);
-		}
-	    lppop->FocusedItem = wRet;
-	    if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		InvertRect(hDC, &lpitem->rect);
-		}
-	    if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-		hSubMenu = (HMENU)lpitem->item_id;
-		lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
-		if (lppop2 == NULL) {
-		    ReleaseDC(hWnd, hDC);
-		    return;
-		    }
-		if (lppop->BarFlags != 0) {
-		    lppop2->hWndParent = hWnd;
-		    GetWindowRect(hWnd, &rect);
-		    rect.top += lppop->rect.bottom;
-		    TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-				rect.left + lpitem->rect.left, rect.top, 
-				0, lppop->ownerWnd, (LPRECT)NULL);
-		    }
-		GlobalUnlock(hSubMenu);
-		}
-	    ReleaseDC(hWnd, hDC);
-	    }
-	}
 }
 
 
+void ResetHiliteFlags(LPPOPUPMENU lppop)
+{
+	HDC		hDC;
+	LPMENUITEM lpitem;
+	int		i;
+	if (lppop == NULL) return;
+	lpitem = lppop->firstItem;
+	for(i = 0; i < lppop->nItems; i++) {
+		if (lpitem == NULL) return;
+		lpitem->item_flags &= MF_HILITE ^ 0xFFFF;
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+}
+
+
+void MenuItemSelect0(HWND hWnd, LPPOPUPMENU lppop, 
+				LPMENUITEM lpitem, WORD wIndex)
+{
+	LPMENUITEM lpprev;
+	if (lppop == NULL) return;
+	if (lppop->FocusedItem != (WORD)-1) {
+	    lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem);
+		if (lpprev != NULL) {
+			lpprev->item_flags &= MF_HILITE ^ 0xFFFF;
+			if ((lpprev->item_flags & MF_POPUP) == MF_POPUP)
+				HideAllSubPopupMenu(lppop);
+			if (lppop->BarFlag)
+				DrawMenuBar(hWnd);
+			else {
+				InvalidateRect(hWnd, &lpprev->rect, TRUE);
+				UpdateWindow(hWnd);
+				}
+			}
+		}
+    lppop->FocusedItem = wIndex;
+	if (lpitem == NULL || wIndex == (WORD)-1) {
+		ResetHiliteFlags(lppop);
+		if (lppop->BarFlag) DrawMenuBar(hWnd);
+		}
+	else {
+		lpitem->item_flags |= MF_HILITE;
+		if (lppop->BarFlag)
+			DrawMenuBar(hWnd);
+		else {
+			InvalidateRect(hWnd, &lpitem->rect, TRUE);
+			UpdateWindow(hWnd);
+			}
+		}
+	SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id, 
+					MAKELONG(0, lpitem->item_flags));
+}
+
+
+void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex)
+{
+	LPMENUITEM lpitem;
+    lpitem = GetMenuItemPtr(lppop, wIndex);
+	MenuItemSelect0(hWnd, lppop, lpitem, wIndex);
+}
+
 
 LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr)
 {
@@ -543,10 +599,17 @@
     LPPOPUPMENU lppop;
     *(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
     if (Ptr == 0) {
-    	printf("Bad Window handle on PopupMenu !\n");
-    	return 0;
+    	printf("PopupMenuGetWindowAndStorage // Bad Window handle !\n");
+    	return NULL;
     	}
     lppop = *((LPPOPUPMENU *)&Ptr->wExtra[1]);
+	if (lppop == NULL) {
+		lppop = (LPPOPUPMENU) GlobalLock(Ptr->wIDmenu);
+		if (lppop == NULL) {
+			printf("PopupMenuGetWindowAndStorage // Bad Menu Handle !\n");
+	    	return NULL;
+			}
+		}
     return lppop;
 }
 
@@ -576,397 +639,446 @@
 
 void StdDrawPopupMenu(HWND hwnd)
 {
-    WND 	*wndPtr;
-    LPPOPUPMENU lppop;
-    LPMENUITEM 	lpitem;
-    PAINTSTRUCT ps;
-    HBRUSH 	hBrush;
-    HPEN	hOldPen;
-    HWND	hWndParent;
-    HDC 	hDC, hMemDC;
-    RECT 	rect, rect2, rect3;
-    DWORD	OldTextColor;
-    HFONT	hOldFont;
-    HBITMAP	hBitMap;
-    BITMAP	bm;
-    UINT  	i, x;
-    hDC = BeginPaint( hwnd, &ps );
-    if (!IsWindowVisible(hwnd)) {
-	EndPaint( hwnd, &ps );
-	return;
-	}
-    lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-    if (lppop == NULL) goto EndOfPaint;
-    hBrush = GetStockObject(WHITE_BRUSH);
-    GetClientRect(hwnd, &rect);
-    GetClientRect(hwnd, &rect2);
-    FillRect(hDC, &rect, hBrush);
-    FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
-    if (lppop->nItems == 0) goto EndOfPaint;
-    lpitem = lppop->firstItem;
-    if (lpitem == NULL) goto EndOfPaint;
-    for(i = 0; i < lppop->nItems; i++) {
+	WND 	*wndPtr;
+	LPPOPUPMENU lppop;
+	LPMENUITEM 	lpitem;
+	PAINTSTRUCT ps;
+	HBRUSH 	hBrush;
+	HPEN	hOldPen;
+	HWND	hWndParent;
+	HDC 	hDC, hMemDC;
+	RECT 	rect, rect2, rect3;
+	DWORD	OldTextColor;
+	int		OldBkMode;
+	HFONT	hOldFont;
+	HBITMAP	hBitMap;
+	BITMAP	bm;
+	UINT  	i, x;
+	hDC = BeginPaint(hwnd, &ps);
+	if (!IsWindowVisible(hwnd)) {
+		EndPaint(hwnd, &ps);
+		return;
+		}
+	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+	if (lppop == NULL) goto EndOfPaint;
+	hBrush = GetStockObject(WHITE_BRUSH);
+	GetClientRect(hwnd, &rect);
+	GetClientRect(hwnd, &rect2);
+	FillRect(hDC, &rect, hBrush);
+	FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+	if (lppop->nItems == 0) goto EndOfPaint;
+	lpitem = lppop->firstItem;
+	if (lpitem == NULL) goto EndOfPaint;
+	for(i = 0; i < lppop->nItems; i++) {
 	CopyRect(&rect2, &lpitem->rect);
 	if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
-    	    hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
-	    MoveTo(hDC, rect2.left, rect2.top + 1);
-	    LineTo(hDC, rect2.right, rect2.top + 1);
-	    SelectObject(hDC, hOldPen);
-	    }
+		hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
+		MoveTo(hDC, rect2.left, rect2.top + 1);
+		LineTo(hDC, rect2.right, rect2.top + 1);
+		SelectObject(hDC, hOldPen);
+		}
 	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
-	    hMemDC = CreateCompatibleDC(hDC);
-	    if (lpitem->hCheckBit == 0) {
-		SelectObject(hMemDC, hStdCheck);
-		GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
-		}
-	    else {
-		SelectObject(hMemDC, lpitem->hCheckBit);
-		GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
-		}
-	    BitBlt(hDC, rect2.left, rect2.top + 1,
-		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
-	    }
-	else {
-	    if (lpitem->hUnCheckBit != 0) {
 		hMemDC = CreateCompatibleDC(hDC);
-		SelectObject(hMemDC, lpitem->hUnCheckBit);
-		GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+		if (lpitem->hCheckBit == 0) {
+			SelectObject(hMemDC, hStdCheck);
+			GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+			}
+		else {
+			SelectObject(hMemDC, lpitem->hCheckBit);
+			GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+			}
 		BitBlt(hDC, rect2.left, rect2.top + 1,
-			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
 		DeleteDC(hMemDC);
 		}
-	    }
+	else {
+		if (lpitem->hUnCheckBit != 0) {
+			hMemDC = CreateCompatibleDC(hDC);
+			SelectObject(hMemDC, lpitem->hUnCheckBit);
+			GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+			BitBlt(hDC, rect2.left, rect2.top + 1,
+			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+			DeleteDC(hMemDC);
+			}
+		}
 	if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
-	    hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
-	    rect2.left += lppop->CheckWidth;
-	    hMemDC = CreateCompatibleDC(hDC);
-	    SelectObject(hMemDC, hBitMap);
-	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-	    BitBlt(hDC, rect2.left, rect2.top,
+		hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+		rect2.left += lppop->CheckWidth;
+		hMemDC = CreateCompatibleDC(hDC);
+		SelectObject(hMemDC, hBitMap);
+		GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+		BitBlt(hDC, rect2.left, rect2.top,
 		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
-	    }
+		DeleteDC(hMemDC);
+		if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+			InvertRect(hDC, &lpitem->rect);
+		}
 	if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
-	    ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-	    ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	    hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
-	    if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
-		OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+		((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+		((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+		hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+		OldBkMode = SetBkMode(hDC, TRANSPARENT);
+		if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
+			OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+		else {
+			if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+				OldTextColor = SetTextColor(hDC, 0x00FFFFFFL);
+			else
+				OldTextColor = SetTextColor(hDC, 0x00000000L);
+			}
+		CopyRect(&rect3, &lpitem->rect);
+		if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+			FillRect(hDC, &rect3, GetStockObject(BLACK_BRUSH));
+		InflateRect(&rect3, 0, -2);
+		rect3.left += lppop->CheckWidth;
+		if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) {
+			DrawText(hDC, lpitem->item_text, x, &rect3, 
+				DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+			DrawText(hDC, &lpitem->item_text[x], -1, &rect3, 
+				DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
+			} 
 	    else
-		OldTextColor = SetTextColor(hDC, 0x00000000L);
-	    CopyRect(&rect3, &lpitem->rect);
-	    InflateRect(&rect3, 0, -2);
-	    rect3.left += lppop->CheckWidth;
-	    if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) {
-		DrawText(hDC, lpitem->item_text, x, &rect3, 
-		    DT_LEFT | DT_VCENTER | DT_SINGLELINE);
-		DrawText(hDC, &lpitem->item_text[x], -1, &rect3, 
-		    DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
-		} 
-	    else
-		DrawText(hDC, lpitem->item_text, -1, &rect3, 
-		    DT_LEFT | DT_VCENTER | DT_SINGLELINE);
-	    SetTextColor(hDC, OldTextColor);
-	    SelectObject(hDC, hOldFont);
-	    CopyRect(&rect2, &lpitem->rect);
-	    }
+			DrawText(hDC, lpitem->item_text, -1, &rect3, 
+				DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+		SetTextColor(hDC, OldTextColor);
+		SetBkMode(hDC, OldBkMode);
+		SelectObject(hDC, hOldFont);
+		CopyRect(&rect2, &lpitem->rect);
+		}
 	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-	    CopyRect(&rect3, &lpitem->rect);
-	    rect3.left = rect3.right - lppop->PopWidth;
-	    hMemDC = CreateCompatibleDC(hDC);
-	    SelectObject(hMemDC, hStdMnArrow);
-	    GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
-	    BitBlt(hDC, rect3.left, rect3.top + 1,
+		CopyRect(&rect3, &lpitem->rect);
+		rect3.left = rect3.right - lppop->PopWidth;
+		hMemDC = CreateCompatibleDC(hDC);
+		SelectObject(hMemDC, hStdMnArrow);
+		GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
+		BitBlt(hDC, rect3.left, rect3.top + 1,
 		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
-	    }
+		DeleteDC(hMemDC);
+		}
 	if (lpitem->next == NULL) goto EndOfPaint;
 	lpitem = (LPMENUITEM)lpitem->next;
-    }
+	}
 EndOfPaint:
-    EndPaint( hwnd, &ps );
+	EndPaint( hwnd, &ps );
 }
 
 
 
 void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
 {
-    LPMENUITEM 	lpitem;
-    HBRUSH 	hBrush;
-    HPEN	hOldPen;
-    HDC 	hMemDC;
-    RECT 	rect, rect2, rect3;
-    HFONT	hOldFont;
-    DWORD	OldTextColor;
-    HBITMAP	hBitMap;
-    BITMAP	bm;
-    UINT  	i, textwidth;
-    if (lppop == NULL || lprect == NULL) return;
+	LPMENUITEM 	lpitem;
+	HBRUSH 	hBrush;
+	HPEN	hOldPen;
+	HDC 	hMemDC;
+	RECT 	rect, rect2, rect3;
+	HFONT	hOldFont;
+	DWORD	OldTextColor;
+	int		OldBkMode;
+	HBITMAP	hBitMap;
+	BITMAP	bm;
+	UINT  	i, textwidth;
+	if (lppop == NULL || lprect == NULL) return;
 #ifdef DEBUG_MENU
-    printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop);
+	printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop);
 #endif
-    MenuBarCalcSize(hDC, lprect, lppop);
-    hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
-    hBrush = GetStockObject(WHITE_BRUSH);
-    CopyRect(&rect, lprect);
-    FillRect(hDC, &rect, hBrush);
-    FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
-    if (lppop->nItems == 0) goto EndOfPaint;
-    lpitem = lppop->firstItem;
-    if (lpitem == NULL) goto EndOfPaint;
-    for(i = 0; i < lppop->nItems; i++) {
-	CopyRect(&rect2, &lpitem->rect);
-	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
-	    hMemDC = CreateCompatibleDC(hDC);
-	    if (lpitem->hCheckBit == 0) {
-		SelectObject(hMemDC, hStdCheck);
-		GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
-		}
-	    else {
-		SelectObject(hMemDC, lpitem->hCheckBit);
-		GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
-		}
-	    BitBlt(hDC, rect2.left, rect2.top + 1,
-		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
-	    }
-	else {
-	    if (lpitem->hUnCheckBit != 0) {
-		hMemDC = CreateCompatibleDC(hDC);
-		SelectObject(hMemDC, lpitem->hUnCheckBit);
-		GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
-		BitBlt(hDC, rect2.left, rect2.top + 1,
+	MenuBarCalcSize(hDC, lprect, lppop);
+	hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+	hBrush = GetStockObject(WHITE_BRUSH);
+	CopyRect(&rect, lprect);
+	FillRect(hDC, &rect, hBrush);
+	FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+	if (lppop->nItems == 0) goto EndOfPaint;
+	lpitem = lppop->firstItem;
+	if (lpitem == NULL) goto EndOfPaint;
+	for(i = 0; i < lppop->nItems; i++) {
+		CopyRect(&rect2, &lpitem->rect);
+		if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+			hMemDC = CreateCompatibleDC(hDC);
+			if (lpitem->hCheckBit == 0) {
+				SelectObject(hMemDC, hStdCheck);
+				GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+				}
+			else {
+				SelectObject(hMemDC, lpitem->hCheckBit);
+				GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+				}
+			BitBlt(hDC, rect2.left, rect2.top + 1,
 			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-		DeleteDC(hMemDC);
+			DeleteDC(hMemDC);
+			}
+		else {
+			if (lpitem->hUnCheckBit != 0) {
+				hMemDC = CreateCompatibleDC(hDC);
+				SelectObject(hMemDC, lpitem->hUnCheckBit);
+				GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+				BitBlt(hDC, rect2.left, rect2.top + 1,
+					bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+				DeleteDC(hMemDC);
+				}
+			}
+		if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+			hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+			hMemDC = CreateCompatibleDC(hDC);
+			SelectObject(hMemDC, hBitMap);
+			GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+			BitBlt(hDC, rect2.left, rect2.top,
+			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+			DeleteDC(hMemDC);
+			}
+		if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+			((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+			((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+			hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+			OldBkMode = SetBkMode(hDC, TRANSPARENT);
+			if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
+				OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+			else {
+				if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+					OldTextColor = SetTextColor(hDC, 0x00FFFFFFL);
+				else
+					OldTextColor = SetTextColor(hDC, 0x00000000L);
+				}
+			if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+				FillRect(hDC, &rect2, GetStockObject(BLACK_BRUSH));
+			DrawText(hDC, lpitem->item_text, -1, &rect2, 
+				DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+			SetTextColor(hDC, OldTextColor);
+			SetBkMode(hDC, OldBkMode);
+			SelectObject(hDC, hOldFont);
+			}
+		if (lpitem->next == NULL) goto EndOfPaint;
+		lpitem = (LPMENUITEM)lpitem->next;
 		}
-	    }
-	if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
-	    hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
-	    hMemDC = CreateCompatibleDC(hDC);
-	    SelectObject(hMemDC, hBitMap);
-	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-	    BitBlt(hDC, rect2.left, rect2.top,
-		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
-	    }
-	if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
-	    ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-	    ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	    hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
-	    if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
-		OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
-	    else
-		OldTextColor = SetTextColor(hDC, 0x00000000L);
-	    DrawText(hDC, lpitem->item_text, -1, &rect2, 
-	    	DT_LEFT | DT_VCENTER | DT_SINGLELINE);
-	    SetTextColor(hDC, OldTextColor);
-	    SelectObject(hDC, hOldFont);
-	    }
-	if (lpitem->next == NULL) goto EndOfPaint;
-	lpitem = (LPMENUITEM)lpitem->next;
-    }
 EndOfPaint:
-    SelectObject(hDC, hOldFont);
+	SelectObject(hDC, hOldFont);
 } 
 
 
 
 LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet)
 {
-    LPMENUITEM 	lpitem;
-    UINT  	i;
-    if (lpRet != NULL) *lpRet = 0;
-    if (lppop == NULL) return NULL;
-    if (lppop->nItems == 0) return NULL;
-    lpitem = lppop->firstItem;
-    for(i = 0; i < lppop->nItems; i++) {
-	if (lpitem == NULL) return NULL;
+	LPMENUITEM 	lpitem;
+	UINT  	i;
+	if (lpRet != NULL) *lpRet = 0;
+	if (lppop == NULL) return NULL;
+	if (lppop->nItems == 0) return NULL;
+	lpitem = lppop->firstItem;
+	for(i = 0; i < lppop->nItems; i++) {
+		if (lpitem == NULL) return NULL;
 #ifdef DEBUG_MENUFINDITEM
-	printf("FindItem // left=%d top=%d right=%d bottom=%d\n",
+		printf("FindItem // left=%d top=%d right=%d bottom=%d\n",
 		lpitem->rect.left, lpitem->rect.top, 
 		lpitem->rect.right, lpitem->rect.bottom);
 #endif
-	if (x > lpitem->rect.left && x < lpitem->rect.right && 
-	    y > lpitem->rect.top && y < lpitem->rect.bottom) {
-	    if (lpRet != NULL) *lpRet = i;
-	    return lpitem;
-	    }
-	lpitem = (LPMENUITEM)lpitem->next;
-    }
-    return NULL;
+		if (x > lpitem->rect.left && x < lpitem->rect.right && 
+			y > lpitem->rect.top && y < lpitem->rect.bottom) {
+			if (lpRet != NULL) *lpRet = i;
+			return lpitem;
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	return NULL;
 }
 
 
 LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet)
 {
-    LPMENUITEM 	lpitem;
-    UINT  	i;
-    if (lppop == NULL) return NULL;
-    if (lppop->nItems == 0) return NULL;
-    lpitem = lppop->firstItem;
-    for(i = 0; i < lppop->nItems; i++) {
-	if (lpitem == NULL) return NULL;
+	LPMENUITEM 	lpitem;
+	UINT  	i;
+	if (lppop == NULL) return NULL;
+	if (lppop->nItems == 0) return NULL;
+	lpitem = lppop->firstItem;
+	for(i = 0; i < lppop->nItems; i++) {
+		if (lpitem == NULL) return NULL;
 #ifdef DEBUG_MENUFINDITEM
-	printf("FindItemBySelKey // key=%d lpitem->sel_key=%d\n",
-		key, lpitem->sel_key);
+		printf("FindItemBySelKey // key=%d lpitem->sel_key=%d\n",
+										key, lpitem->sel_key);
 #endif
-	if (key == lpitem->sel_key) {
-	    if (lpRet != NULL) *lpRet = i;
-	    return lpitem;
-	    }
-	lpitem = (LPMENUITEM)lpitem->next;
-    }
-    return NULL;
+		if (key == lpitem->sel_key) {
+			if (lpRet != NULL) *lpRet = i;
+			return lpitem;
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	return NULL;
 }
 
 
 void PopupMenuCalcSize(HWND hwnd)
 {
-    WND 	*wndPtr;
-    LPPOPUPMENU lppop;
-    LPMENUITEM 	lpitem;
-    HDC		hDC;
-    RECT 	rect;
-    HBITMAP	hBitMap;
-    BITMAP	bm;
-    HFONT	hOldFont;
-    UINT  	i, OldWidth, TempWidth;
-    DWORD	dwRet;
+	WND 	*wndPtr;
+	LPPOPUPMENU lppop;
+	LPMENUITEM 	lpitem;
+	HDC		hDC;
+	RECT 	rect;
+	HBITMAP	hBitMap;
+	BITMAP	bm;
+	HFONT	hOldFont;
+	UINT  	i, OldWidth, TempWidth;
+	DWORD	dwRet;
 #ifdef DEBUG_MENUCALC
 	printf("PopupMenuCalcSize hWnd=%04X !\n", hWnd);
 #endif
-    lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-    if (lppop == NULL) return;
-    if (lppop->nItems == 0) return;
-    hDC = GetDC(hwnd);
-    lppop->Width = 20;
-    lppop->CheckWidth = lppop->PopWidth = 0;
-    hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+	if (lppop == NULL) return;
+	if (lppop->nItems == 0) return;
+	hDC = GetDC(hwnd);
+	lppop->Width = 20;
+	lppop->CheckWidth = lppop->PopWidth = 0;
+	hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
 CalcAGAIN:
-    OldWidth = lppop->Width;
-    SetRect(&rect, 1, 1, OldWidth, 0);
-    lpitem = lppop->firstItem;
-    for(i = 0; i < lppop->nItems; i++) {
-	if (lpitem == NULL) break;
+	OldWidth = lppop->Width;
+	SetRect(&rect, 1, 1, OldWidth, 0);
+	lpitem = lppop->firstItem;
+	for(i = 0; i < lppop->nItems; i++) {
+		if (lpitem == NULL) break;
 #ifdef DEBUG_MENUCALC
-	printf("PopupMenuCalcSize item #%d !\n", i);
+		printf("PopupMenuCalcSize item #%d !\n", i);
 #endif
-	rect.right = rect.left + lppop->Width;
-	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
-	    if (lpitem->hCheckBit != 0)
-		GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
-	    else
-		GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
-	    lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
-	    }
-	else {
-	    if (lpitem->hUnCheckBit != 0) {
-		GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
-		lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+		rect.right = rect.left + lppop->Width;
+		if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+			if (lpitem->hCheckBit != 0)
+				GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+			else
+				GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+			lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+			}
+		else {
+			if (lpitem->hUnCheckBit != 0) {
+				GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+				lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+				}
+			}
+		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+			GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
+			lppop->PopWidth = max(lppop->PopWidth, bm.bmWidth);
+			}
+		if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
+			rect.bottom = rect.top + 3;
+			}
+		if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+			hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+			GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+			rect.bottom = rect.top + bm.bmHeight;
+			lppop->Width = max(lppop->Width, bm.bmWidth);
+			}
+		if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+			((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+			((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+			dwRet = GetTextExtent(hDC, (char *)lpitem->item_text, 
+			strlen((char *)lpitem->item_text));
+			rect.bottom = rect.top + HIWORD(dwRet);
+			InflateRect(&rect, 0, 2);
+			TempWidth = LOWORD(dwRet);
+			if (GetShortCutPos(lpitem->item_text) != (WORD)-1) 
+				TempWidth += 15;
+			TempWidth += lppop->CheckWidth;
+			TempWidth += lppop->PopWidth;
+			lppop->Width = max(lppop->Width, TempWidth);
+			}
+		CopyRect(&lpitem->rect, &rect);
+		rect.top = rect.bottom;
+		lpitem = (LPMENUITEM)lpitem->next;
 		}
-	    }
-	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-	    GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
-	    lppop->PopWidth = max(lppop->PopWidth, bm.bmWidth);
-	    }
-	if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
-	    rect.bottom = rect.top + 3;
-	    }
-	if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
-	    hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
-	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-	    rect.bottom = rect.top + bm.bmHeight;
-	    lppop->Width = max(lppop->Width, bm.bmWidth);
-	    }
-	if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
-	    ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-	    ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	    dwRet = GetTextExtent(hDC, (char *)lpitem->item_text, 
-		strlen((char *)lpitem->item_text));
-	    rect.bottom = rect.top + HIWORD(dwRet);
-	    InflateRect(&rect, 0, 2);
-	    TempWidth = LOWORD(dwRet);
-	    if (GetShortCutPos(lpitem->item_text) != (WORD)-1)
-	        TempWidth += 15;
-	    TempWidth += lppop->CheckWidth;
-	    TempWidth += lppop->PopWidth;
-	    lppop->Width = max(lppop->Width, TempWidth);
-	    }
-	CopyRect(&lpitem->rect, &rect);
-	rect.top = rect.bottom;
-	lpitem = (LPMENUITEM)lpitem->next;
-	}
-    if (OldWidth < lppop->Width) goto CalcAGAIN;
-    lppop->Height = rect.bottom;
-    SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height);
+	if (OldWidth < lppop->Width) goto CalcAGAIN;
+	lppop->Height = rect.bottom;
+	SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height);
 #ifdef DEBUG_MENUCALC
-    printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
+	printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
 #endif
-    SelectObject(hDC, hOldFont);
-    ReleaseDC(hwnd, hDC);
+	SelectObject(hDC, hOldFont);
+	ReleaseDC(hwnd, hDC);
 }
 
 
 
 void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
 {
-    LPMENUITEM 	lpitem;
-    RECT 	rect;
-    HBITMAP	hBitMap;
-    BITMAP	bm;
-    HFONT	hOldFont;
-    UINT  	i, OldHeight;
-    DWORD	dwRet;
-    if (lppop == NULL) return;
-    if (lppop->nItems == 0) return;
+	LPMENUITEM 	lpitem;
+	RECT 	rect;
+	HBITMAP	hBitMap;
+	BITMAP	bm;
+	HFONT	hOldFont;
+	UINT  	i, OldHeight;
+	DWORD	dwRet;
+	if (lppop == NULL) return;
+	if (lppop->nItems == 0) return;
 #ifdef DEBUG_MENUCALC
-    printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", 
-    	lprect->left, lprect->top, lprect->right, lprect->bottom);
+	printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", 
+		lprect->left, lprect->top, lprect->right, lprect->bottom);
 #endif
-    hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
-    lppop->Height = lprect->bottom - lprect->top;
+	hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+	lppop->Height = lprect->bottom - lprect->top;
 CalcAGAIN:
-    OldHeight = lppop->Height;
-    SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + OldHeight);
-    lpitem = lppop->firstItem;
-    for(i = 0; i < lppop->nItems; i++) {
-	if (lpitem == NULL) break;
-	rect.bottom = lprect->top + lppop->Height;
-	if (rect.right > lprect->right) 
-	    SetRect(&rect, lprect->left, rect.bottom, 
-		0, rect.bottom + SYSMETRICS_CYMENU);
-	if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
-	    hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
-	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-	    rect.right = rect.left + bm.bmWidth;
-	    lppop->Height = max(lppop->Height, bm.bmHeight);
-	    }
-	if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
-	    ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-	    ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	    dwRet = GetTextExtent(hDC, (char *)lpitem->item_text, 
-		strlen((char *)lpitem->item_text));
-	    rect.right = rect.left + LOWORD(dwRet) + 10;
-	    lppop->Height = max(lppop->Height, HIWORD(dwRet) + 10);
-	    }
-	CopyRect(&lpitem->rect, &rect);
-	rect.left = rect.right;
-	lpitem = (LPMENUITEM)lpitem->next;
-	}
-    if (OldHeight < lppop->Height) goto CalcAGAIN;
-    lppop->Width = rect.right;
-    lprect->bottom =  lprect->top + lppop->Height;
-    CopyRect(&lppop->rect, lprect);
+	OldHeight = lppop->Height;
+	SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + OldHeight);
+	lpitem = lppop->firstItem;
+	for(i = 0; i < lppop->nItems; i++) {
+		if (lpitem == NULL) break;
+		rect.bottom = lprect->top + lppop->Height;
+		if (rect.right > lprect->right) 
+			SetRect(&rect, lprect->left, rect.bottom, 
+				0, rect.bottom + SYSMETRICS_CYMENU);
+		if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+			hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+			GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+			rect.right = rect.left + bm.bmWidth;
+			lppop->Height = max(lppop->Height, bm.bmHeight);
+			}
+		if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+			((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+			((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+			dwRet = GetTextExtent(hDC, (char *)lpitem->item_text, 
+			strlen((char *)lpitem->item_text));
+			rect.right = rect.left + LOWORD(dwRet) + 10;
+			dwRet = max(SYSMETRICS_CYMENU, (HIWORD(dwRet) + 6));
+			lppop->Height = max(lppop->Height, (WORD)dwRet);
+			}
+		CopyRect(&lpitem->rect, &rect);
+		rect.left = rect.right;
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	if (OldHeight < lppop->Height) goto CalcAGAIN;
+	lppop->Width = rect.right;
+	lprect->bottom =  lprect->top + lppop->Height;
+	CopyRect(&lppop->rect, lprect);
 #ifdef DEBUG_MENUCALC
-    printf("MenuBarCalcSize w=%d h=%d !\n", 
-    	lppop->Width, lppop->Height);
+	printf("MenuBarCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
 #endif
-    SelectObject(hDC, hOldFont);
+	SelectObject(hDC, hOldFont);
 }
 
 
 
+/***********************************************************************
+ *           FindMenuItem
+ */
+LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags)
+{
+	LPPOPUPMENU	menu;
+	LPMENUITEM 	lpitem;
+	int		i;
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) {
+		GlobalUnlock(hMenu);
+		return FALSE;
+		}
+	lpitem = menu->firstItem;
+	if (wFlags & MF_BYPOSITION) {
+		for (i = 0; i < nPos; i++, lpitem = lpitem->next) 
+			if (lpitem == NULL)	return NULL;
+		}
+	else {
+		for (i = 0; i < menu->nItems && lpitem != NULL; i++) {
+			if (lpitem->item_id == nPos) return lpitem;
+			lpitem = lpitem->next;
+			}
+		return NULL;
+		}
+    return lpitem;
+}
+
+
 LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos)
 {
     LPMENUITEM 	lpitem;
@@ -984,92 +1096,89 @@
 
 WORD GetSelectionKey(LPSTR str)
 {
-    int		i;
-    WORD	sel_key;
-    for (i = 0; i < strlen(str); i++) {
-	if (str[i] == '&' && str[i + 1] != '&') 
-	    {
-	    sel_key = str[i + 1];
-	    if (sel_key >= 'a' && sel_key <= 'z') sel_key -= 'a' - 'A';
+	int		i;
+	WORD	sel_key;
+	for (i = 0; i < strlen(str); i++) {
+		if (str[i] == '&' && str[i + 1] != '&') {
+			sel_key = str[i + 1];
+			if (sel_key >= 'a' && sel_key <= 'z') sel_key -= 'a' - 'A';
 #ifdef DEBUG_MENU
-	    printf("GetSelectionKey // %04X\n", sel_key);
+			printf("GetSelectionKey // %04X\n", sel_key);
 #endif
-	    return sel_key;
-	    }
-	}
+			return sel_key;
+			}
+		}
 #ifdef DEBUG_MENU
-    printf("GetSelectionKey NULL \n");
+	printf("GetSelectionKey NULL \n");
 #endif
-    return 0;
+	return 0;
 }
 
 
 
 LPSTR GetShortCutString(LPSTR str)
 {
-    int		i;
-    LPSTR	str2;
-    for (i = 0; i < strlen(str); i++) {
-	if (str[i] == '\t' && str[i + 1] != '\t') 
-	    {
-	    str2 = &str[i + 1];
+	int		i;
+	LPSTR	str2;
+	for (i = 0; i < strlen(str); i++) {
+		if (str[i] == '\t' && str[i + 1] != '\t') {
+			str2 = &str[i + 1];
 #ifdef DEBUG_MENUSHORTCUT
-	    printf("GetShortCutString // '%s' \n", str2);
+			printf("GetShortCutString // '%s' \n", str2);
 #endif
-	    return str2;
-	    }
-	}
+			return str2;
+			}
+		}
 #ifdef DEBUG_MENUSHORTCUT
-    printf("GetShortCutString NULL \n");
+	printf("GetShortCutString NULL \n");
 #endif
-    return NULL;
+	return NULL;
 }
 
 
 
 WORD GetShortCutPos(LPSTR str)
 {
-    int		i;
-    for (i = 0; i < strlen(str); i++) {
-	if (str[i] == '\t' && str[i + 1] != '\t') 
-	    {
+	int		i;
+	for (i = 0; i < strlen(str); i++) {
+		if (str[i] == '\t' && str[i + 1] != '\t') {
 #ifdef DEBUG_MENUSHORTCUT
-	    printf("GetShortCutPos = %d \n", i);
+			printf("GetShortCutPos = %d \n", i);
 #endif
-	    return i;
-	    }
-	}
+			return i;
+			}
+		}
 #ifdef DEBUG_MENUSHORTCUT
-    printf("GetShortCutString NULL \n");
+	printf("GetShortCutString NULL \n");
 #endif
-    return -1;
+	return -1;
 }
 
 
 
 BOOL HideAllSubPopupMenu(LPPOPUPMENU menu)
 {
-    LPPOPUPMENU submenu;
-    LPMENUITEM 	lpitem;
-    BOOL	someClosed = FALSE;
-    int		i;
-    if (menu == NULL) return;
-    lpitem = menu->firstItem;
-    for (i = 0; i < menu->nItems; i++) {
-    	if (lpitem == NULL) return;
-    	if (lpitem->item_flags & MF_POPUP) {
-	    submenu = (LPPOPUPMENU) GlobalLock((HMENU)lpitem->item_id);
-	    if (submenu != NULL) {
-		if (IsWindowVisible(submenu->hWnd)) {
-		    ShowWindow(submenu->hWnd, SW_HIDE);
-		    someClosed = TRUE;
-		    }
-		GlobalUnlock((HMENU)lpitem->item_id);
-	    	}
-    	    }
-    	lpitem = (LPMENUITEM)lpitem->next;
-    	}
-    return someClosed;
+	LPPOPUPMENU submenu;
+	LPMENUITEM 	lpitem;
+	BOOL	someClosed = FALSE;
+	int		i;
+	if (menu == NULL) return;
+	lpitem = menu->firstItem;
+	for (i = 0; i < menu->nItems; i++) {
+		if (lpitem == NULL) return;
+		if (lpitem->item_flags & MF_POPUP) {
+			submenu = (LPPOPUPMENU) GlobalLock((HMENU)lpitem->item_id);
+			if (submenu != NULL) {
+				if (IsWindowVisible(submenu->hWnd)) {
+					ShowWindow(submenu->hWnd, SW_HIDE);
+					someClosed = TRUE;
+					}
+				GlobalUnlock((HMENU)lpitem->item_id);
+		    	}
+	   	    }
+	   	lpitem = (LPMENUITEM)lpitem->next;
+	   	}
+	return someClosed;
 }
 
 
@@ -1081,22 +1190,17 @@
 BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem, 
 			WORD wItemID, WORD wFlags)
 {
-    if (wFlags & MF_APPEND) {
-    	return AppendMenu(hMenu, wFlags, wItemID, lpNewItem);
-	}
-    if (wFlags & MF_DELETE) {
-    	return DeleteMenu(hMenu, wItemID, wFlags);
-	}
-    if (wFlags & MF_INSERT) {
-    	return InsertMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
-	}
-    if (wFlags & MF_CHANGE) {
-    	return ModifyMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
-	}
-    if (wFlags & MF_REMOVE) {
-    	return RemoveMenu(hMenu, wItemID, wFlags);
-	}
-    return FALSE;
+	if (wFlags & MF_APPEND)
+		return AppendMenu(hMenu, wFlags, wItemID, lpNewItem);
+	if (wFlags & MF_DELETE)
+		return DeleteMenu(hMenu, wItemID, wFlags);
+	if (wFlags & MF_INSERT) 
+		return InsertMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
+	if (wFlags & MF_CHANGE) 
+		return ModifyMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
+	if (wFlags & MF_REMOVE) 
+		return RemoveMenu(hMenu, wItemID, wFlags);
+	return FALSE;
 }
 
 
@@ -1105,30 +1209,30 @@
  */
 BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 {
-    WND		*wndPtr;
-    LPPOPUPMENU	menu;
-    LPMENUITEM 	lpitem;
-    int		i;
+	WND		*wndPtr;
+	LPPOPUPMENU	menu;
+	LPMENUITEM 	lpitem;
+	int		i;
 #ifdef DEBUG_MENU
-    printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
+	printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
 #endif
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) return FALSE;
-    lpitem = menu->firstItem;
-    for (i = 0; i < menu->nItems; i++) {
-    	if (lpitem == NULL) break;
-    	if (i == wItemID) {
-	    if (wFlags && MF_CHECKED)
-		lpitem->item_flags |= MF_CHECKED;
-	    else
-		lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
-	    GlobalUnlock(hMenu);
-	    return(TRUE);
-	    }
-    	lpitem = (LPMENUITEM)lpitem->next;
-    	}
-    GlobalUnlock(hMenu);
-    return FALSE;
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return FALSE;
+	lpitem = menu->firstItem;
+	for (i = 0; i < menu->nItems; i++) {
+		if (lpitem == NULL) break;
+		if (i == wItemID) {
+			if (wFlags && MF_CHECKED)
+				lpitem->item_flags |= MF_CHECKED;
+			else
+				lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
+			GlobalUnlock(hMenu);
+			return(TRUE);
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	GlobalUnlock(hMenu);
+	return FALSE;
 }
 
 
@@ -1137,30 +1241,30 @@
  */
 BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 {
-    WND		*wndPtr;
-    LPPOPUPMENU	menu;
-    LPMENUITEM 	lpitem;
-    int		i;
+	WND		*wndPtr;
+	LPPOPUPMENU	menu;
+	LPMENUITEM 	lpitem;
+	int		i;
 #ifdef DEBUG_MENU
-    printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
+	printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
 #endif
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) return FALSE;
-    lpitem = menu->firstItem;
-    for (i = 0; i < menu->nItems; i++) {
-    	if (lpitem == NULL) break;
-    	if (i == wItemID) {
-	    if (wFlags && MF_DISABLED)
-		lpitem->item_flags |= MF_DISABLED;
-	    else
-		lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
-	    GlobalUnlock(hMenu);
-	    return(TRUE);
-	    }
-    	lpitem = (LPMENUITEM)lpitem->next;
-    	}
-    GlobalUnlock(hMenu);
-    return FALSE;
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return FALSE;
+	lpitem = menu->firstItem;
+	for (i = 0; i < menu->nItems; i++) {
+		if (lpitem == NULL) break;
+		if (i == wItemID) {
+			if (wFlags && MF_DISABLED)
+				lpitem->item_flags |= MF_DISABLED;
+			else
+				lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
+			GlobalUnlock(hMenu);
+			return(TRUE);
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	GlobalUnlock(hMenu);
+	return FALSE;
 }
 
 
@@ -1169,61 +1273,56 @@
  */
 BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
 {
-    WND		*wndPtr;
-    LPPOPUPMENU	menu;
-    HANDLE	hNewItem;
-    LPMENUITEM 	lpitem, lpitem2;
-    int		i;
+	WND		*wndPtr;
+	LPPOPUPMENU	menu;
+	HANDLE	hNewItem;
+	LPMENUITEM 	lpitem, lpitem2;
+	int		i;
 #ifdef DEBUG_MENU
-    if (wFlags & MF_STRING) 
-	printf("InsertMenu (%04X, %04X, %04X, '%s') !\n",
-		hMenu, wFlags, wItemID, lpNewItem);
-    else
-	printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
-		hMenu, nPos, wFlags, wItemID, lpNewItem);
+	if (wFlags & MF_STRING) 
+		printf("InsertMenu (%04X, %04X, %04X, '%s') !\n",
+					hMenu, wFlags, wItemID, lpNewItem);
+	else
+		printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
+					hMenu, nPos, wFlags, wItemID, lpNewItem);
 #endif
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) return FALSE;
-    lpitem = menu->firstItem;
-    for (i = 0; i < menu->nItems; i++) {
-    	if (lpitem == NULL) break;
-    	if (i == nPos) break;
-    	lpitem = (LPMENUITEM)lpitem->next;
-	printf("InsertMenu // during loop items !\n");
-    	}
-    printf("InsertMenu // after loop items !\n");
-    hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
-    if (hNewItem == 0) {
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return FALSE;
+	lpitem = FindMenuItem(hMenu, nPos, wFlags);
+	hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
+	if (hNewItem == 0) {
+		GlobalUnlock(hMenu);
+		return FALSE;
+		}
+	lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
+	if (lpitem2 == NULL) {
+		GlobalFree(hNewItem);
+		GlobalUnlock(hMenu);
+		return FALSE;
+		}
+	lpitem2->item_flags = wFlags;
+	lpitem2->item_id = wItemID;
+	if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
+			MF_MENUBREAK | MF_SEPARATOR))) {
+	        lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1);
+		strcpy(lpitem2->item_text, lpNewItem);
+		lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
+		}
+	else {
+	        lpitem2->item_text = lpNewItem;
+                }
+	
+	lpitem2->prev = lpitem;
+	if (lpitem->next != NULL)
+		lpitem2->next = lpitem->next;
+	else
+		lpitem2->next = NULL;
+	lpitem->next = lpitem2;
+	lpitem2->child = NULL;
+	lpitem2->parent = NULL;
+	menu->nItems++;
 	GlobalUnlock(hMenu);
-    	return FALSE;
-    	}
-    lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
-    if (lpitem2 == NULL) {
-	GlobalFree(hNewItem);
-	GlobalUnlock(hMenu);
-	return FALSE;
-	}
-    lpitem2->item_flags = wFlags;
-    lpitem2->item_id = wItemID;
-    if (((wFlags & MF_BITMAP) != MF_BITMAP) &&
-	((wFlags & MF_MENUBREAK) != MF_MENUBREAK) &&
-	((wFlags & MF_STRING) != MF_SEPARATOR)) {
-	lpitem2->item_text = lpNewItem;
-	lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
-	}
-    else
-	lpitem2->item_text = lpNewItem;
-    lpitem2->prev = lpitem;
-    if (lpitem->next != NULL)
-	lpitem2->next = lpitem->next;
-    else
-	lpitem2->next = NULL;
-    lpitem->next = lpitem2;
-    lpitem2->child = NULL;
-    lpitem2->parent = NULL;
-    menu->nItems++;
-    GlobalUnlock(hMenu);
-    return TRUE;
+	return TRUE;
 }
 
 
@@ -1232,61 +1331,62 @@
  */
 BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
 {
-    WND		*wndPtr;
-    LPPOPUPMENU	menu;
-    HANDLE	hNewItem;
-    LPMENUITEM 	lpitem, lpitem2;
+	WND		*wndPtr;
+	LPPOPUPMENU	menu;
+	HANDLE	hNewItem;
+	LPMENUITEM 	lpitem, lpitem2;
 #ifdef DEBUG_MENU
-    if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
-	printf("AppendMenu (%04X, %04X, %04X, '%s') !\n",
-		hMenu, wFlags, wItemID, lpNewItem);
-    else
-	printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
-		hMenu, wFlags, wItemID, lpNewItem);
+	if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
+		printf("AppendMenu (%04X, %04X, %04X, '%s') !\n",
+			hMenu, wFlags, wItemID, lpNewItem);
+	else
+		printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
+			hMenu, wFlags, wItemID, lpNewItem);
 #endif
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) return FALSE;
-    lpitem = menu->firstItem;
-    if (lpitem != NULL) {
-	while (lpitem->next != NULL) {
-	    lpitem = (LPMENUITEM)lpitem->next;
-	    }
-	}
-    hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
-    if (hNewItem == 0) {
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return FALSE;
+	lpitem = menu->firstItem;
+	if (lpitem != NULL) {
+		while (lpitem->next != NULL) {
+			lpitem = (LPMENUITEM)lpitem->next;
+			}
+		}
+	hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
+	if (hNewItem == 0) {
+		GlobalUnlock(hMenu);
+		return FALSE;
+		}
+	lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
+	if (lpitem2 == NULL) {
+		GlobalFree(hNewItem);
+		GlobalUnlock(hMenu);
+		return FALSE;
+		}
+	lpitem2->item_flags = wFlags;
+	lpitem2->item_id = wItemID;
+	if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
+			MF_MENUBREAK | MF_SEPARATOR))) {
+	        lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1);
+		strcpy(lpitem2->item_text, lpNewItem);
+		lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
+		}
+	else {
+	        lpitem2->item_text = lpNewItem;
+                }
+	
+	if (lpitem == NULL)
+		menu->firstItem = lpitem2;
+	else
+		lpitem->next = lpitem2;
+	lpitem2->prev = lpitem;
+	lpitem2->next = NULL;
+	lpitem2->child = NULL;
+	lpitem2->parent = NULL;
+	lpitem2->hCheckBit = (HBITMAP)NULL;
+	lpitem2->hUnCheckBit = (HBITMAP)NULL;
+	menu->nItems++;
 	GlobalUnlock(hMenu);
-	return FALSE;
-	}
-    lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
-    if (lpitem2 == NULL) {
-	GlobalFree(hNewItem);
-	GlobalUnlock(hMenu);
-	return FALSE;
-	}
-    lpitem2->item_flags = wFlags;
-    lpitem2->item_id = wItemID;
-    if (((wFlags & MF_BITMAP) != MF_BITMAP) &&
-	((wFlags & MF_MENUBREAK) != MF_MENUBREAK) &&
-	((wFlags & MF_STRING) != MF_SEPARATOR)) {
-	lpitem2->item_text = lpNewItem;
-	lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
-	lpitem2->shortcut = GetShortCutString(lpitem2->item_text);
-	}
-    else
-	lpitem2->item_text = lpNewItem;
-    if (lpitem == NULL)
-    	menu->firstItem = lpitem2;
-    else
-    	lpitem->next = lpitem2;
-    lpitem2->prev = lpitem;
-    lpitem2->next = NULL;
-    lpitem2->child = NULL;
-    lpitem2->parent = NULL;
-    lpitem2->hCheckBit = (HBITMAP)NULL;
-    lpitem2->hUnCheckBit = (HBITMAP)NULL;
-    menu->nItems++;
-    GlobalUnlock(hMenu);
-    return TRUE;
+	return TRUE;
 }
 
 
@@ -1295,31 +1395,36 @@
  */
 BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags)
 {
-    WND		*wndPtr;
-    LPPOPUPMENU	menu;
-    LPMENUITEM 	lpitem;
-    int		i;
+	WND		*wndPtr;
+	LPPOPUPMENU	menu;
+	LPMENUITEM 	lpitem;
+	int		i;
 #ifdef DEBUG_MENU
-    printf("RemoveMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
+	printf("RemoveMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
 #endif
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) return FALSE;
-    lpitem = menu->firstItem;
-    for (i = 0; i < menu->nItems; i++) {
-    	if (lpitem == NULL) break;
-    	if (i == nPos) {
-    	    lpitem->prev->next = lpitem->next;
-    	    lpitem->next->prev = lpitem->prev;
-    	    GlobalFree(HIWORD(lpitem));
-	    GlobalUnlock(hMenu);
-    	    return(TRUE);
-	    }
-    	lpitem = (LPMENUITEM)lpitem->next;
-	printf("RemoveMenu // during loop items !\n");
-    	}
-    printf("RemoveMenu // after loop items !\n");
-    GlobalUnlock(hMenu);
-    return FALSE;
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return FALSE;
+	lpitem = menu->firstItem;
+	for (i = 0; i < menu->nItems; i++) {
+		if (lpitem == NULL) break;
+		if (i == nPos) {
+			lpitem->prev->next = lpitem->next;
+			lpitem->next->prev = lpitem->prev;
+			if (!(lpitem->item_flags & 
+			      (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
+			       MF_MENUBREAK | MF_SEPARATOR))) {
+			        GlobalFree(lpitem->item_text);
+			        }
+			GlobalFree(lpitem);
+			GlobalUnlock(hMenu);
+			return TRUE;
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		printf("RemoveMenu // during loop items !\n");
+		}
+	printf("RemoveMenu // after loop items !\n");
+	GlobalUnlock(hMenu);
+	return FALSE;
 }
 
 
@@ -1328,10 +1433,42 @@
  */
 BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags)
 {
+    LPPOPUPMENU	menu;
+    LPMENUITEM 	lpitem;
+    int		i;
 #ifdef DEBUG_MENU
     printf("DeleteMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
 #endif
-    return TRUE;
+    menu = (LPPOPUPMENU) GlobalLock(hMenu);
+    if (menu == NULL) 
+    {
+	GlobalUnlock(hMenu);
+	return FALSE;
+    }
+	
+    lpitem = FindMenuItem(hMenu, nPos, wFlags);
+    if (lpitem != NULL)
+    {
+	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) 
+	    DestroyMenu((HMENU)lpitem->item_id);
+
+	if (!(lpitem->item_flags & 
+	      (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
+	       MF_MENUBREAK | MF_SEPARATOR))) 
+	{
+	    GlobalFree(lpitem->item_text);
+	}
+	if (lpitem->prev)
+	    lpitem->prev->next = lpitem->next;
+	if (lpitem->next)
+	    lpitem->next->prev = lpitem->prev;
+	GlobalFree(lpitem);
+	GlobalUnlock(hMenu);
+	return TRUE;
+    }
+
+    GlobalUnlock(hMenu);
+    return FALSE;
 }
 
 
@@ -1356,7 +1493,16 @@
     	if (i == nPos) {
     	    lpitem->item_flags = wFlags;
     	    lpitem->item_id    = wItemID;
-    	    lpitem->item_text  = lpNewItem;
+	    if (!(lpitem->item_flags & 
+		  (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | 
+		   MF_MENUBREAK | MF_SEPARATOR))) {
+		    lpitem->item_text = GlobalReAlloc(lpitem->item_text,
+						      strlen(lpNewItem) + 1,
+						      GLOBAL_FLAGS_MOVEABLE);
+		    strcpy(lpitem->item_text, lpNewItem);
+		    }
+	    else
+		    lpitem->item_text = lpNewItem;
 	    GlobalUnlock(hMenu);
     	    return(TRUE);
 	    }
@@ -1372,30 +1518,32 @@
  */
 HMENU CreatePopupMenu()
 {
-    HANDLE	hItem;
-    HMENU	hMenu;
-    LPPOPUPMENU menu;
+	HANDLE	hItem;
+	HMENU	hMenu;
+	LPPOPUPMENU menu;
 #ifdef DEBUG_MENU
-    printf("CreatePopupMenu !\n");
+	printf("CreatePopupMenu !\n");
 #endif
-    hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) {
-	GlobalFree(hMenu);
-	return 0;
- 	}
-    menu->nItems 	  = 0;
-    menu->firstItem       = NULL;
-    menu->ownerWnd	  = 0;
-    menu->hWnd		  = 0;
-    menu->hWndParent	  = 0;
-    menu->MouseFlags	  = 0;
-    menu->BarFlags	  = 0;
-    menu->SysFlag	  = FALSE;
-    menu->Width = 100;
-    menu->Height = 0;
-    GlobalUnlock(hMenu);
-    return hMenu;
+	hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) {
+		GlobalFree(hMenu);
+		return 0;
+		}
+	menu->nItems 		= 0;
+	menu->firstItem 	= NULL;
+	menu->ownerWnd		= 0;
+	menu->hWndPrev		= 0;
+	menu->hWnd			= 0;
+	menu->hWndParent	= 0;
+	menu->MouseFlags	= 0;
+	menu->BarFlag		= FALSE;
+	menu->SysFlag		= FALSE;
+	menu->ChildFlag		= TRUE;
+	menu->Width 		= 100;
+	menu->Height 		= 0;
+	GlobalUnlock(hMenu);
+	return hMenu;
 }
 
 
@@ -1405,36 +1553,112 @@
 BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y,
 	short nReserved, HWND hWnd, LPRECT lpRect)
 {
-    WND		*wndPtr;
-    LPPOPUPMENU	lppop;
-    RECT	rect;
+	WND		*wndPtr;
+	LPPOPUPMENU	lppop;
+	RECT	rect;
 #ifdef DEBUG_MENU
-    printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
-	hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
+	printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
+		hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
 #endif
-    lppop = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (lppop == NULL) return FALSE;
+	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (lppop == NULL) return FALSE;
+	wndPtr = WIN_FindWndPtr(hWnd);
+	lppop->ownerWnd = hWnd;
+	if (lppop->hWnd == (HWND)NULL) {
+		lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE,
+			x, y, lppop->Width, lppop->Height, (HWND)NULL, 0, 
+			wndPtr->hInstance, (LPSTR)lppop);
+		}
+	else {
+		ShowWindow(lppop->hWnd, SW_SHOW);
+		}
+	if (!lppop->BarFlag) {
+		PopupMenuCalcSize(lppop->hWnd);
+#ifdef DEBUG_MENU
+		printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n", 
+			x, y, lppop->Width, lppop->Height); 
+#endif
+		SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height, 
+			SWP_NOZORDER);
+		}
+	if (!MenuHasFocus) {
+#ifdef DEBUG_MENU
+		printf("TrackPopupMenu // before MenuFocusLoop !\n");
+#endif
+		MenuFocusLoop(hWnd, NULL);
+/*		ActivateMenuFocus(hWnd); */
+#ifdef DEBUG_MENU
+		printf("TrackPopupMenu // after MenuFocusLoop !\n");
+#endif
+		}
+	GlobalUnlock(hMenu);
+	return TRUE;
+}
+
+
+BOOL ActivateMenuFocus(HWND hWnd)
+{
+	WND		*wndPtr;
+	LPPOPUPMENU	lpmenu;
+	BOOL	bRet;
+	MSG		msg;
+	if (MenuHasFocus) return FALSE;
     wndPtr = WIN_FindWndPtr(hWnd);
-    lppop->ownerWnd = hWnd;
-    if (lppop->hWnd == (HWND)NULL) {
-        lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE,
-        	x, y, lppop->Width, lppop->Height, (HWND)NULL, 0, 
-        	wndPtr->hInstance, (LPSTR)lppop);
-        }
-    else {
-    	ShowWindow(lppop->hWnd, SW_SHOW);
-    	}
-    if (lppop->BarFlags == 0) {
-	PopupMenuCalcSize(lppop->hWnd);
+	if (wndPtr == NULL) return FALSE;
 #ifdef DEBUG_MENU
-	printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n", 
-		x, y, lppop->Width, lppop->Height); 
+	printf("ActivateMenuFocus (%04X) !\n", hWnd);
 #endif
-	SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height, 
-		SWP_NOZORDER);
-	}
-    GlobalUnlock(hMenu);
-    return TRUE;
+	if ((wndPtr->dwStyle & WS_CHILD) == 0 && wndPtr->wIDmenu != 0) {
+		lpmenu = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
+		MenuItemSelect(hWnd, lpmenu, 0);
+		bRet = MenuFocusLoop(hWnd, lpmenu);
+		if (lpmenu != NULL) GlobalUnlock(wndPtr->wIDmenu);
+		return bRet;
+		}
+	return FALSE;
+}
+
+
+BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu)
+{
+	WND		*wndPtr;
+	MSG		msg;
+#ifdef DEBUG_MENU
+	printf("Enter in Menu Focus Loop !\n");
+#endif
+	MenuHasFocus = TRUE;
+	while(TRUE) {
+		if (!MenuHasFocus) break;
+		if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
+		TranslateMessage(&msg);
+		if (hWnd == msg.hwnd && lpmenu != NULL) {
+			if ((msg.message == WM_SYSKEYDOWN && msg.wParam == VK_MENU) ||
+				(msg.message == WM_CHAR && msg.wParam == VK_ESCAPE)) {
+				HideAllSubPopupMenu(lpmenu);
+				break;
+				}
+			switch(msg.message) {
+				case WM_KEYDOWN:
+				case WM_KEYUP:
+				case WM_CHAR:
+				case WM_LBUTTONDOWN:
+				case WM_LBUTTONUP:
+				case WM_MOUSEMOVE:
+					PopupMenuWndProc(hWnd, msg.message, msg.wParam, msg.lParam);
+				default:
+					DispatchMessage(&msg);
+				}
+			}
+		else
+			DispatchMessage(&msg);
+		}
+EndOfFocus:
+	MenuHasFocus = FALSE;
+	if (lpmenu != NULL) MenuItemSelect(hWnd, lpmenu, -1);
+#ifdef DEBUG_MENU
+	printf("End of Menu Focus Loop !\n");
+#endif
+	return TRUE;
 }
 
 
@@ -1443,36 +1667,56 @@
  */
 void NC_TrackSysMenu(HWND hWnd)
 {
-    RECT	rect;
-    LPPOPUPMENU	lpsys;
-    WND *wndPtr = WIN_FindWndPtr(hWnd);    
+	RECT	rect;
+	LPPOPUPMENU	lpsys;
+	WND *wndPtr = WIN_FindWndPtr(hWnd);    
 #ifdef DEBUG_MENU
-    printf("NC_TrackSysMenu hWnd=%04X !\n", hWnd);
+	printf("NC_TrackSysMenu hWnd=%04X !\n", hWnd);
 #endif
-    if (!wndPtr) return;
-    lpsys = (LPPOPUPMENU)GlobalLock(wndPtr->hSysMenu);
+	if (!wndPtr) return;
+	lpsys = (LPPOPUPMENU)GlobalLock(wndPtr->hSysMenu);
 #ifdef DEBUG_MENU
-    printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
+	printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
 #endif
-    if (lpsys == NULL) return;
+	if (lpsys == NULL) return;
 #ifdef DEBUG_MENU
-    printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
+	printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
 #endif
-    lpsys->BarFlags = FALSE;
-    lpsys->SysFlag = TRUE;
-    if (!IsWindowVisible(lpsys->hWnd)) {
-	GetWindowRect(hWnd, &rect);
+	lpsys->BarFlag = FALSE;
+	lpsys->SysFlag = TRUE;
+	lpsys->ChildFlag = FALSE;
+	lpsys->hWndParent = hWnd;
+	if (!IsWindowVisible(lpsys->hWnd)) {
+		GetWindowRect(hWnd, &rect);
+		lpsys->hWndPrev = GetFocus();
 #ifdef DEBUG_MENU
-	printf("NC_TrackSysMenu lpsys->hWnd=%04X !\n", lpsys->hWnd);
+		printf("NC_TrackSysMenu lpsys->hWnd=%04X !\n", lpsys->hWnd);
 #endif
-	TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON, 
-		rect.left, rect.top + SYSMETRICS_CYSIZE, 
-		0, hWnd, (LPRECT)NULL);
-	}
-    else {
-	ShowWindow(lpsys->hWnd, SW_HIDE);
-	}
-    GlobalUnlock(wndPtr->hSysMenu);
+		if (MenuHasFocus) {
+			TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON, 
+				rect.left, rect.top + SYSMETRICS_CYSIZE, 
+				0, hWnd, (LPRECT)NULL);
+			}
+		else {
+			MenuHasFocus = TRUE;
+			TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON, 
+				rect.left, rect.top + SYSMETRICS_CYSIZE, 
+				0, hWnd, (LPRECT)NULL);
+			MenuHasFocus = FALSE;
+#ifdef DEBUG_MENU
+			printf("NC_TrackSysMenu // before MenuFocusLoop !\n");
+#endif
+			MenuFocusLoop(hWnd, NULL);
+/*			ActivateMenuFocus(hWnd); */
+#ifdef DEBUG_MENU
+			printf("NC_TrackSysMenu // after MenuFocusLoop !\n");
+#endif
+			}
+		}
+	else {
+		ShowWindow(lpsys->hWnd, SW_HIDE);
+		}
+	GlobalUnlock(wndPtr->hSysMenu);
 }
 
 
@@ -1495,29 +1739,29 @@
 BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags,
 		HBITMAP hNewCheck, HBITMAP hNewUnCheck)
 {
-    WND		*wndPtr;
-    LPPOPUPMENU	menu;
-    LPMENUITEM 	lpitem;
-    int		i;
+	WND		*wndPtr;
+	LPPOPUPMENU	menu;
+	LPMENUITEM 	lpitem;
+	int		i;
 #ifdef DEBUG_MENU
-    printf("SetMenuItemBitmaps (%04X, %04X, %04X, %04X, %08X) !\n",
-	hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
+	printf("SetMenuItemBitmaps (%04X, %04X, %04X, %04X, %08X) !\n",
+					hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
 #endif
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) return FALSE;
-    lpitem = menu->firstItem;
-    for (i = 0; i < menu->nItems; i++) {
-    	if (lpitem == NULL) break;
-    	if (i == nPos) {
-    	    lpitem->hCheckBit   = hNewCheck;
-     	    lpitem->hUnCheckBit = hNewUnCheck;
-	    GlobalUnlock(hMenu);
-    	    return TRUE;
-	    }
-    	lpitem = (LPMENUITEM)lpitem->next;
-    	}
-    GlobalUnlock(hMenu);
-    return FALSE;
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return FALSE;
+	lpitem = menu->firstItem;
+	for (i = 0; i < menu->nItems; i++) {
+		if (lpitem == NULL) break;
+		if (i == nPos) {
+			lpitem->hCheckBit   = hNewCheck;
+			lpitem->hUnCheckBit = hNewUnCheck;
+			GlobalUnlock(hMenu);
+			return TRUE;
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	GlobalUnlock(hMenu);
+	return FALSE;
 }
 
 
@@ -1526,30 +1770,32 @@
  */
 HMENU CreateMenu()
 {
-    HANDLE	hItem;
-    HMENU	hMenu;
-    LPPOPUPMENU menu;
+	HANDLE	hItem;
+	HMENU	hMenu;
+	LPPOPUPMENU menu;
 #ifdef DEBUG_MENU
-    printf("CreatePopupMenu !\n");
+	printf("CreatePopupMenu !\n");
 #endif
-    hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (menu == NULL) {
-	GlobalFree(hMenu);
-	return 0;
- 	}
-    menu->nItems 	  = 0;
-    menu->firstItem       = NULL;
-    menu->ownerWnd	  = 0;
-    menu->hWnd		  = 0;
-    menu->hWndParent	  = 0;
-    menu->MouseFlags	  = 0;
-    menu->BarFlags	  = TRUE;
-    menu->SysFlag	  = FALSE;
-    menu->Width = 100;
-    menu->Height = 0;
-    GlobalUnlock(hMenu);
-    return hMenu;
+	hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) {
+		GlobalFree(hMenu);
+		return 0;
+		}
+	menu->nItems 		= 0;
+	menu->firstItem 	= NULL;
+	menu->hWndPrev		= 0;
+	menu->ownerWnd		= 0;
+	menu->hWnd			= 0;
+	menu->hWndParent	= 0;
+	menu->MouseFlags	= 0;
+	menu->BarFlag		= TRUE;
+	menu->SysFlag		= FALSE;
+	menu->ChildFlag 	= TRUE;
+	menu->Width 		= 100;
+	menu->Height 		= 0;
+	GlobalUnlock(hMenu);
+	return hMenu;
 }
 
 
@@ -1558,31 +1804,31 @@
  */
 BOOL DestroyMenu(HMENU hMenu)
 {
-    LPPOPUPMENU lppop;
-    LPMENUITEM 	lpitem, lpitem2;
+	LPPOPUPMENU lppop;
+	LPMENUITEM 	lpitem, lpitem2;
 #ifdef DEBUG_MENU
-    printf("DestroyMenu (%04X) !\n", hMenu);
+	printf("DestroyMenu (%04X) !\n", hMenu);
 #endif
-    if (hMenu == 0) return FALSE;
-    lppop = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (lppop == NULL) return FALSE;
-    if (lppop->hWnd) DestroyWindow (lppop->hWnd);
-    lpitem = lppop->firstItem;
-    while (lpitem != NULL) {
+	if (hMenu == 0) return FALSE;
+	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (lppop == NULL) return FALSE;
+	if (lppop->hWnd) DestroyWindow (lppop->hWnd);
+	lpitem = lppop->firstItem;
+	while (lpitem != NULL) {
 #ifdef DEBUG_MENU
-	printf("DestroyMenu (%04X) // during loop items !\n", hMenu);
+		printf("DestroyMenu (%04X) // during loop items !\n", hMenu);
 #endif
-	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-	    DestroyMenu((HMENU)lpitem->item_id);
-	    }
-    	lpitem = (LPMENUITEM)lpitem->next;
-    	}
-    GlobalUnlock(hMenu);
-    GlobalFree(hMenu);
+		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+			DestroyMenu((HMENU)lpitem->item_id);
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	GlobalUnlock(hMenu);
+	GlobalFree(hMenu);
 #ifdef DEBUG_MENU
-    printf("DestroyMenu (%04X) // End !\n", hMenu);
+	printf("DestroyMenu (%04X) // End !\n", hMenu);
 #endif
-    return TRUE;
+	return TRUE;
 }
 
 
@@ -1591,29 +1837,23 @@
  */
 HMENU LoadMenu(HINSTANCE instance, char *menu_name)
 {
-    HMENU     		hMenu;
-    HANDLE		hMenu_desc;
-    MENU_HEADER 	*menu_desc;
+	HMENU     		hMenu;
+	HANDLE		hMenu_desc;
+	MENU_HEADER 	*menu_desc;
 #ifdef DEBUG_MENU
-    if ((LONG)menu_name & 0xFFFF0000L)
-	printf("LoadMenu: instance %02x, menu '%s'\n", instance, menu_name);
-    else
-	printf("LoadMenu: instance %02x, menu '%04X'\n", instance, menu_name);
+	if ((LONG)menu_name & 0xFFFF0000L)
+		printf("LoadMenu: instance %02x, menu '%s'\n", instance, menu_name);
+	else
+		printf("LoadMenu: instance %02x, menu '%04X'\n", instance, menu_name);
 #endif
-    if (instance == (HANDLE)NULL)  instance = hSysRes;
-    if (menu_name == NULL || 
-	(hMenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
-	(menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL) {
-	return 0;
-        }
-    hMenu = LoadMenuIndirect((LPSTR)menu_desc);
-/*
-    hMenu = CreateMenu();
-    ParseMenuResource((WORD *) (menu_desc + 1), 0, hMenu);
-    GlobalUnlock(hMenu_desc);
-    GlobalFree(hMenu_desc);
-*/
-    return hMenu;
+	if (instance == (HANDLE)NULL)  instance = hSysRes;
+	if (menu_name == NULL || 
+		(hMenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
+		(menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL) {
+		return 0;
+		}
+	hMenu = LoadMenuIndirect((LPSTR)menu_desc);
+	return hMenu;
 }
 
 
@@ -1622,16 +1862,16 @@
  */
 HMENU GetSystemMenu(HWND hWnd, BOOL bRevert)
 {
-    WND		*wndPtr;
-    wndPtr = WIN_FindWndPtr(hWnd);
-    if (!bRevert) {
+	WND		*wndPtr;
+	wndPtr = WIN_FindWndPtr(hWnd);
+	if (!bRevert) {
+		return wndPtr->hSysMenu;
+		}
+	else {
+		DestroyMenu(wndPtr->hSysMenu);
+		wndPtr->hSysMenu = CopySysMenu();
+		}
 	return wndPtr->hSysMenu;
-	}
-    else {
-	DestroyMenu(wndPtr->hSysMenu);
-	wndPtr->hSysMenu = CopySysMenu();
-	}
-    return wndPtr->hSysMenu;
 }
 
 
@@ -1640,9 +1880,9 @@
  */
 HMENU GetMenu(HWND hWnd) 
 { 
-    WND * wndPtr = WIN_FindWndPtr(hWnd);
-    if (wndPtr == NULL) return 0;
-    return wndPtr->wIDmenu;
+	WND * wndPtr = WIN_FindWndPtr(hWnd);
+	if (wndPtr == NULL) return 0;
+	return wndPtr->wIDmenu;
 }
 
 /**********************************************************************
@@ -1650,19 +1890,20 @@
  */
 BOOL SetMenu(HWND hWnd, HMENU hMenu)
 {
-    LPPOPUPMENU lppop;
-    WND * wndPtr = WIN_FindWndPtr(hWnd);
-    if (wndPtr == NULL) return FALSE;
+	LPPOPUPMENU lppop;
+	WND * wndPtr = WIN_FindWndPtr(hWnd);
+	if (wndPtr == NULL) return FALSE;
 #ifdef DEBUG_MENU
-    printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
+	printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
 #endif
-    wndPtr->wIDmenu = hMenu;
-    if (hMenu == 0) return TRUE;
-    lppop = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (lppop == NULL) return FALSE;
-    lppop->ownerWnd = hWnd;
-    GlobalUnlock(hMenu);
-    return TRUE;
+	wndPtr->wIDmenu = hMenu;
+	if (hMenu == 0) return TRUE;
+	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (lppop == NULL) return FALSE;
+	lppop->ownerWnd = hWnd;
+	ResetHiliteFlags(lppop);
+	GlobalUnlock(hMenu);
+	return TRUE;
 }
 
 
@@ -1671,28 +1912,31 @@
  */
 HMENU GetSubMenu(HMENU hMenu, short nPos)
 {
-    HMENU	hSubMenu;
-    LPPOPUPMENU lppop;
-    LPMENUITEM 	lpitem;
-    int		i;
+	HMENU	hSubMenu;
+	LPPOPUPMENU lppop;
+	LPMENUITEM 	lpitem;
+	int		i;
 #ifdef DEBUG_MENU
-    printf("GetSubMenu (%04X, %04X) !\n", hMenu, nPos);
+	printf("GetSubMenu (%04X, %04X) !\n", hMenu, nPos);
 #endif
-    if (hMenu == 0) return 0;
-    lppop = (LPPOPUPMENU) GlobalLock(hMenu);
-    if (lppop == NULL) return 0;
-    lpitem = lppop->firstItem;
-    for (i = 0; i < lppop->nItems; i++) {
-    	if (lpitem == NULL) break;
-    	if (i == nPos) {
-	    if (lpitem->item_flags & MF_POPUP)
-		return hSubMenu;
-	    else
-		return 0;
-	    }
-    	lpitem = (LPMENUITEM)lpitem->next;
-    	}
-    return 0;
+	if (hMenu == 0) return 0;
+	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (lppop == NULL) return 0;
+	lpitem = lppop->firstItem;
+	for (i = 0; i < lppop->nItems; i++) {
+		if (lpitem == NULL) break;
+		if (i == nPos) {
+#ifdef DEBUG_MENU
+			printf("    found %04x\n", lpitem->item_id);
+#endif	    
+			if (lpitem->item_flags & MF_POPUP)
+				return lpitem->item_id;
+			else
+				return 0;
+			}
+		lpitem = (LPMENUITEM)lpitem->next;
+		}
+	return 0;
 }
 
 
@@ -1701,17 +1945,29 @@
  */
 void DrawMenuBar(HWND hWnd)
 {
-    WND		*wndPtr;
+	WND		*wndPtr;
+	LPPOPUPMENU lppop;
+	HDC		hDC;
 #ifdef DEBUG_MENU
-    printf("DrawMenuBar (%04X)\n", hWnd);
+	printf("DrawMenuBar (%04X)\n", hWnd);
 #endif
-    wndPtr = WIN_FindWndPtr(hWnd);
-    if (wndPtr != NULL && wndPtr->wIDmenu != 0) {
+	wndPtr = WIN_FindWndPtr(hWnd);
+	if (wndPtr != NULL && (wndPtr->dwStyle & WS_CHILD) == 0 && 
+		wndPtr->wIDmenu != 0) {
 #ifdef DEBUG_MENU
-	printf("DrawMenuBar wIDmenu=%04X \n", wndPtr->wIDmenu);
+		printf("DrawMenuBar wIDmenu=%04X \n", wndPtr->wIDmenu);
 #endif
-	SendMessage(hWnd, WM_NCPAINT, 1, 0L);
-	}
+		lppop = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
+		if (lppop == NULL) return;
+		if ((lppop->rect.bottom - lppop->rect.top) != 0) {
+			hDC = GetWindowDC(hWnd);
+			StdDrawMenuBar(hDC, &lppop->rect, lppop);
+			ReleaseDC(hWnd, hDC);
+			}
+		else
+			SendMessage(hWnd, WM_NCPAINT, 1, 0L);
+		GlobalUnlock(wndPtr->wIDmenu);
+		}
 }
 
 
@@ -1720,15 +1976,19 @@
  */
 HMENU LoadMenuIndirect(LPSTR menu_template)
 {
-    HMENU     		hMenu;
-    MENU_HEADER 	*menu_desc;
+	HMENU     		hMenu;
+	MENU_HEADER 	*menu_desc;
+	LPPOPUPMENU lppop;
 #ifdef DEBUG_MENU
-    printf("LoadMenuIndirect: menu_template '%08X'\n", menu_template);
+	printf("LoadMenuIndirect: menu_template '%08X'\n", menu_template);
 #endif
-    hMenu = CreateMenu();
-    menu_desc = (MENU_HEADER *)menu_template;
-    ParseMenuResource((WORD *)(menu_desc + 1), 0, hMenu); 
-    return hMenu;
+	hMenu = CreateMenu();
+	menu_desc = (MENU_HEADER *)menu_template;
+	ParseMenuResource((WORD *)(menu_desc + 1), 0, hMenu); 
+	lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+	ResetHiliteFlags(lppop);
+	GlobalUnlock(hMenu);
+	return hMenu;
 }
 
 
@@ -1737,46 +1997,47 @@
  */
 HMENU CopySysMenu()
 {
-    HMENU     		hMenu;
-    LPPOPUPMENU 	menu;
-    LPPOPUPMENU 	sysmenu;
+	HMENU     		hMenu;
+	LPPOPUPMENU 	menu;
+	LPPOPUPMENU 	sysmenu;
 #ifdef DEBUG_MENU
-    printf("CopySysMenu entry !\n");
+	printf("CopySysMenu entry !\n");
 #endif
-    if (hSysMenu == 0) {
-	hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(1));
-/*	hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(SC_SYSMENU));*/
-/*	hSysMenu = LoadMenu((HINSTANCE)NULL, "SYSMENU"); */
 	if (hSysMenu == 0) {
-	    printf("SysMenu not found in system resources !\n");
-	    return (HMENU)NULL;
-	    }
+		hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(1));
+/*		hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(SC_SYSMENU));*/
+/*		hSysMenu = LoadMenu((HINSTANCE)NULL, "SYSMENU"); */
+		if (hSysMenu == 0) {
+			printf("SysMenu not found in system resources !\n");
+			return (HMENU)NULL;
+			}
 #ifdef DEBUG_MENU
-	else
-	    printf("SysMenu loaded from system resources %04X !\n", hSysMenu);
+		else
+			printf("SysMenu loaded from system resources %04X !\n", hSysMenu);
 #endif
-	}
-    hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
-    menu = (LPPOPUPMENU) GlobalLock(hMenu);
-    sysmenu = (LPPOPUPMENU) GlobalLock(hSysMenu);
-    if (menu != NULL && sysmenu != NULL) {
-	sysmenu->BarFlags = FALSE;
-	memcpy(menu, sysmenu, sizeof(POPUPMENU));
-	}
-    else {
-	printf("CopySysMenu // Bad SysMenu pointers !\n");
-	if (menu != NULL) {
-	    GlobalUnlock(hMenu);
-	    GlobalFree(hMenu);
-	    }
-	return (HMENU)NULL;
-	}
-    GlobalUnlock(hMenu);
-    GlobalUnlock(hSysMenu);
+		}
+	hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	sysmenu = (LPPOPUPMENU) GlobalLock(hSysMenu);
+	if (menu != NULL && sysmenu != NULL) {
+		sysmenu->BarFlag = FALSE;
+		sysmenu->SysFlag = TRUE;
+		memcpy(menu, sysmenu, sizeof(POPUPMENU));
+		}
+	else {
+		printf("CopySysMenu // Bad SysMenu pointers !\n");
+		if (menu != NULL) {
+			GlobalUnlock(hMenu);
+			GlobalFree(hMenu);
+			}
+		return (HMENU)NULL;
+		}
+	GlobalUnlock(hMenu);
+	GlobalUnlock(hSysMenu);
 #ifdef DEBUG_MENU
-    printf("CopySysMenu hMenu=%04X !\n", hMenu);
+	printf("CopySysMenu hMenu=%04X !\n", hMenu);
 #endif
-    return hMenu;
+	return hMenu;
 }
 
 
@@ -1806,11 +2067,13 @@
 	    	hSubMenu, popup_item->item_text);
 	    }
 	else {
-	    MENUITEMTEMPLATE *normal_item = (MENUITEMTEMPLATE *) item;
-	    next_item = (WORD *) (normal_item->item_text + 
-				  strlen(normal_item->item_text) + 1);
-	    AppendMenu(hMenu, normal_item->item_flags, 
-	    	normal_item->item_id, normal_item->item_text);
+		MENUITEMTEMPLATE *normal_item = (MENUITEMTEMPLATE *) item;
+		next_item = (WORD *) (normal_item->item_text + 
+		strlen(normal_item->item_text) + 1);
+		if (strlen(normal_item->item_text) == 0 && normal_item->item_id == 0) 
+			normal_item->item_flags |= MF_SEPARATOR;
+		AppendMenu(hMenu, normal_item->item_flags, 
+			normal_item->item_id, normal_item->item_text);
 	    }
 	}
     while (!(*item & MF_END));