Fix creating the console system menu items

svn path=/trunk/; revision=23878
This commit is contained in:
Thomas Bluemel 2006-09-01 23:18:23 +00:00
parent c2d18fb0b6
commit dbf97f3b50
2 changed files with 132 additions and 86 deletions

View file

@ -53,8 +53,104 @@ typedef struct GUI_CONSOLE_DATA_TAG
static BOOL ConsInitialized = FALSE;
static HWND NotifyWnd;
typedef struct _GUICONSOLE_MENUITEM
{
UINT uID;
const struct _GUICONSOLE_MENUITEM *SubMenu;
WORD wCmdID;
} GUICONSOLE_MENUITEM, *PGUICONSOLE_MENUITEM;
static const GUICONSOLE_MENUITEM GuiConsoleEditMenuItems[] =
{
{ IDS_MARK, NULL, ID_SYSTEM_EDIT_MARK },
{ IDS_COPY, NULL, ID_SYSTEM_EDIT_COPY },
{ IDS_PASTE, NULL, ID_SYSTEM_EDIT_PASTE },
{ IDS_SELECTALL, NULL, ID_SYSTEM_EDIT_SELECTALL },
{ IDS_SCROLL, NULL, ID_SYSTEM_EDIT_SCROLL },
{ IDS_FIND, NULL, ID_SYSTEM_EDIT_FIND },
{ 0, NULL, 0 } /* End of list */
};
static const GUICONSOLE_MENUITEM GuiConsoleMainMenuItems[] =
{
{ (UINT)-1, NULL, 0 }, /* Separator */
{ IDS_EDIT, GuiConsoleEditMenuItems, 0 },
{ IDS_DEFAULTS, NULL, ID_SYSTEM_DEFAULTS },
{ IDS_PROPERTIES, NULL, ID_SYSTEM_PROPERTIES },
{ 0, NULL, 0 } /* End of list */
};
/* FUNCTIONS *****************************************************************/
static VOID FASTCALL
GuiConsoleAppendMenuItems(HMENU hMenu,
const GUICONSOLE_MENUITEM *Items)
{
UINT i;
WCHAR szMenuString[255];
HMENU hSubMenu;
for (i = 0; Items[i].uID != 0; i++)
{
if (Items[i].uID != (UINT)-1)
{
if (LoadStringW(Win32CsrDllHandle,
Items[i].uID,
szMenuString,
sizeof(szMenuString) / sizeof(szMenuString[0])) > 0)
{
if (Items[i].SubMenu != NULL)
{
hSubMenu = CreatePopupMenu();
if (hSubMenu != NULL)
{
GuiConsoleAppendMenuItems(hSubMenu,
Items[i].SubMenu);
if (!AppendMenuW(hMenu,
MF_STRING | MF_POPUP,
(UINT_PTR)hSubMenu,
szMenuString))
{
DestroyMenu(hSubMenu);
}
}
}
else
{
AppendMenuW(hMenu,
MF_STRING,
Items[i].wCmdID,
szMenuString);
}
}
}
else
{
AppendMenuW(hMenu,
MF_SEPARATOR,
0,
NULL);
}
}
}
static VOID FASTCALL
GuiConsoleCreateSysMenu(PCSRSS_CONSOLE Console)
{
HMENU hMenu;
hMenu = GetSystemMenu(Console->hWindow,
FALSE);
if (hMenu != NULL)
{
GuiConsoleAppendMenuItems(hMenu,
GuiConsoleMainMenuItems);
}
}
static VOID FASTCALL
GuiConsoleGetDataPointers(HWND hWnd, PCSRSS_CONSOLE *Console, PGUI_CONSOLE_DATA *GuiData)
{
@ -338,6 +434,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
PCSRSS_PROCESS_DATA ProcessData;
HKEY hKey;
Console->hWindow = hWnd;
if (NULL == GuiData)
{
DPRINT1("GuiConsoleNcCreate: HeapAlloc failed\n");
@ -432,6 +530,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
SetTimer(hWnd, 1, CURSOR_BLINK_TIME, NULL);
SetEvent(GuiData->hGuiInitEvent);
GuiConsoleCreateSysMenu(Console);
return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create);
}
@ -1137,97 +1237,35 @@ GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults)
// then exchange this info with console.dll in
// some private way
}
static LRESULT FASTCALL
GuiConsoleHandleSysMenuCommand(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
static BOOL FASTCALL
GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam)
{
DPRINT1("GuiConsoleHandleSysMenuCommand entered %d\n", wParam);
BOOL Ret = TRUE;
switch(wParam)
switch(wParam)
{
case IDS_MARK:
case IDS_COPY:
case IDS_PASTE:
case IDS_SELECTALL:
case IDS_SCROLL:
case IDS_FIND:
break;
case ID_SYSTEM_EDIT_MARK:
case ID_SYSTEM_EDIT_COPY:
case ID_SYSTEM_EDIT_PASTE:
case ID_SYSTEM_EDIT_SELECTALL:
case ID_SYSTEM_EDIT_SCROLL:
case ID_SYSTEM_EDIT_FIND:
break;
case IDS_DEFAULTS:
GuiConsoleShowConsoleProperties(hWnd, TRUE);
break;
case IDS_PROPERTIES:
GuiConsoleShowConsoleProperties(hWnd, FALSE);
break;
default:
return DefWindowProcW(hWnd, Msg, wParam, lParam);
}
case ID_SYSTEM_DEFAULTS:
GuiConsoleShowConsoleProperties(hWnd, TRUE);
break;
return 0;
}
static BOOLEAN FASTCALL
InsertItem(HMENU hMenu, INT fType, INT fMask, INT fState, HMENU hSubMenu, INT ResourceId)
{
MENUITEMINFO MenuItemInfo;
TCHAR szBuffer[MAX_PATH];
case ID_SYSTEM_PROPERTIES:
GuiConsoleShowConsoleProperties(hWnd, FALSE);
break;
memset(&MenuItemInfo, 0x0, sizeof(MENUITEMINFO));
MenuItemInfo.cbSize = sizeof (MENUITEMINFO);
MenuItemInfo.fMask = fMask;
MenuItemInfo.fType = fType;
MenuItemInfo.fState = fState;
MenuItemInfo.hSubMenu = hSubMenu;
MenuItemInfo.wID = ResourceId;
if (fType != MFT_SEPARATOR)
{
MenuItemInfo.cch = LoadString(Win32CsrDllHandle, ResourceId, szBuffer, MAX_PATH);
if (!MenuItemInfo.cch)
{
DPRINT("LoadString failed ResourceId %d Error %x\n", ResourceId, GetLastError());
return FALSE;
}
MenuItemInfo.dwTypeData = szBuffer;
default:
Ret = FALSE;
break;
}
if (InsertMenuItem(hMenu, ResourceId, FALSE, &MenuItemInfo))
return TRUE;
DPRINT("InsertMenuItem failed Last error %x\n", GetLastError());
return FALSE;
}
static VOID FASTCALL
GuiConsoleCreateSysMenu(HWND hWnd)
{
HMENU hMenu;
HMENU hSubMenu;
hMenu = GetSystemMenu(hWnd, FALSE);
if (hMenu == NULL)
{
DPRINT("GetSysMenu failed\n");
return;
}
/* insert seperator */
InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1);
/* create submenu */
hSubMenu = CreatePopupMenu();
InsertItem(hSubMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_MARK);
InsertItem(hSubMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING | MIIM_STATE, MFS_GRAYED, NULL, IDS_COPY);
InsertItem(hSubMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_PASTE);
InsertItem(hSubMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SELECTALL);
InsertItem(hSubMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLL);
InsertItem(hSubMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_FIND);
InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING | MIIM_SUBMENU, 0, hSubMenu, IDS_EDIT);
/* create default/properties item */
InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_DEFAULTS);
InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_PROPERTIES);
DrawMenuBar(hWnd);
return Ret;
}
static LRESULT CALLBACK
@ -1272,7 +1310,9 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
GuiConsoleMouseMove(hWnd, wParam, lParam);
break;
case WM_SYSCOMMAND:
return GuiConsoleHandleSysMenuCommand(hWnd, msg, wParam, lParam);
if (!GuiConsoleHandleSysMenuCommand(hWnd, wParam))
Result = DefWindowProcW(hWnd, msg, wParam, lParam);
break;
default:
Result = DefWindowProcW(hWnd, msg, wParam, lParam);
break;
@ -1325,10 +1365,8 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HeapFree(Win32CsrApiHeap, 0, Buffer);
}
Console->hWindow = NewWindow;
if (NULL != NewWindow)
{
GuiConsoleCreateSysMenu(NewWindow);
//ShowScrollBar(NewWindow, SB_VERT, FALSE);
//ShowScrollBar(NewWindow, SB_HORZ, FALSE);
SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1);

View file

@ -15,6 +15,14 @@
#define IDC_PROGRESS 101
#define IDC_END_NOW 102
#define ID_SYSTEM_EDIT_MARK 1001
#define ID_SYSTEM_EDIT_COPY 1002
#define ID_SYSTEM_EDIT_PASTE 1003
#define ID_SYSTEM_EDIT_SELECTALL 1004
#define ID_SYSTEM_EDIT_SCROLL 1005
#define ID_SYSTEM_EDIT_FIND 1006
#define ID_SYSTEM_DEFAULTS 1007
#define ID_SYSTEM_PROPERTIES 1008
#define NCPOPUP_MENU 103