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 BOOL ConsInitialized = FALSE;
static HWND NotifyWnd; 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 *****************************************************************/ /* 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 static VOID FASTCALL
GuiConsoleGetDataPointers(HWND hWnd, PCSRSS_CONSOLE *Console, PGUI_CONSOLE_DATA *GuiData) GuiConsoleGetDataPointers(HWND hWnd, PCSRSS_CONSOLE *Console, PGUI_CONSOLE_DATA *GuiData)
{ {
@ -338,6 +434,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
PCSRSS_PROCESS_DATA ProcessData; PCSRSS_PROCESS_DATA ProcessData;
HKEY hKey; HKEY hKey;
Console->hWindow = hWnd;
if (NULL == GuiData) if (NULL == GuiData)
{ {
DPRINT1("GuiConsoleNcCreate: HeapAlloc failed\n"); DPRINT1("GuiConsoleNcCreate: HeapAlloc failed\n");
@ -432,6 +530,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
SetTimer(hWnd, 1, CURSOR_BLINK_TIME, NULL); SetTimer(hWnd, 1, CURSOR_BLINK_TIME, NULL);
SetEvent(GuiData->hGuiInitEvent); SetEvent(GuiData->hGuiInitEvent);
GuiConsoleCreateSysMenu(Console);
return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create); 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 // then exchange this info with console.dll in
// some private way // some private way
} }
static LRESULT FASTCALL static BOOL FASTCALL
GuiConsoleHandleSysMenuCommand(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam)
{ {
DPRINT1("GuiConsoleHandleSysMenuCommand entered %d\n", wParam); BOOL Ret = TRUE;
switch(wParam) switch(wParam)
{ {
case IDS_MARK: case ID_SYSTEM_EDIT_MARK:
case IDS_COPY: case ID_SYSTEM_EDIT_COPY:
case IDS_PASTE: case ID_SYSTEM_EDIT_PASTE:
case IDS_SELECTALL: case ID_SYSTEM_EDIT_SELECTALL:
case IDS_SCROLL: case ID_SYSTEM_EDIT_SCROLL:
case IDS_FIND: case ID_SYSTEM_EDIT_FIND:
break; break;
case IDS_DEFAULTS: case ID_SYSTEM_DEFAULTS:
GuiConsoleShowConsoleProperties(hWnd, TRUE); GuiConsoleShowConsoleProperties(hWnd, TRUE);
break; break;
case IDS_PROPERTIES:
case ID_SYSTEM_PROPERTIES:
GuiConsoleShowConsoleProperties(hWnd, FALSE); GuiConsoleShowConsoleProperties(hWnd, FALSE);
break; break;
default: default:
return DefWindowProcW(hWnd, Msg, wParam, lParam); Ret = FALSE;
break;
} }
return 0; return Ret;
}
static BOOLEAN FASTCALL
InsertItem(HMENU hMenu, INT fType, INT fMask, INT fState, HMENU hSubMenu, INT ResourceId)
{
MENUITEMINFO MenuItemInfo;
TCHAR szBuffer[MAX_PATH];
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;
}
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);
} }
static LRESULT CALLBACK static LRESULT CALLBACK
@ -1272,7 +1310,9 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
GuiConsoleMouseMove(hWnd, wParam, lParam); GuiConsoleMouseMove(hWnd, wParam, lParam);
break; break;
case WM_SYSCOMMAND: case WM_SYSCOMMAND:
return GuiConsoleHandleSysMenuCommand(hWnd, msg, wParam, lParam); if (!GuiConsoleHandleSysMenuCommand(hWnd, wParam))
Result = DefWindowProcW(hWnd, msg, wParam, lParam);
break;
default: default:
Result = DefWindowProcW(hWnd, msg, wParam, lParam); Result = DefWindowProcW(hWnd, msg, wParam, lParam);
break; break;
@ -1325,10 +1365,8 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
HeapFree(Win32CsrApiHeap, 0, Buffer); HeapFree(Win32CsrApiHeap, 0, Buffer);
} }
Console->hWindow = NewWindow;
if (NULL != NewWindow) if (NULL != NewWindow)
{ {
GuiConsoleCreateSysMenu(NewWindow);
//ShowScrollBar(NewWindow, SB_VERT, FALSE); //ShowScrollBar(NewWindow, SB_VERT, FALSE);
//ShowScrollBar(NewWindow, SB_HORZ, FALSE); //ShowScrollBar(NewWindow, SB_HORZ, FALSE);
SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1); SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1);

View file

@ -15,6 +15,14 @@
#define IDC_PROGRESS 101 #define IDC_PROGRESS 101
#define IDC_END_NOW 102 #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 #define NCPOPUP_MENU 103