// // lnkcon.c link console property pages implementation // //--------------------------------------------------------------------------- #include "shellprv.h" #pragma hdrstop #include "lnkcon.h" LRESULT PreviewWndProc( HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam ); BOOL_PTR CALLBACK _FontDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ); LRESULT _FontPreviewWndProc( HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam ); extern TCHAR g_szPreviewText[]; // Context-sensitive help ids const static DWORD rgdwHelpColor[] = { IDC_CNSL_COLOR_SCREEN_TEXT, IDH_CONSOLE_COLOR_SCR_TEXT, IDC_CNSL_COLOR_SCREEN_BKGND, IDH_CONSOLE_COLOR_SCR_BACK, IDC_CNSL_COLOR_POPUP_TEXT, IDH_CONSOLE_COLOR_POPUP_TEXT, IDC_CNSL_COLOR_POPUP_BKGND, IDH_CONSOLE_COLOR_POPUP_BACK, IDC_CNSL_COLOR_RED_LBL, IDH_CONSOLE_COLOR_RED, IDC_CNSL_COLOR_RED, IDH_CONSOLE_COLOR_RED, IDC_CNSL_COLOR_GREEN_LBL, IDH_CONSOLE_COLOR_RED, IDC_CNSL_COLOR_GREEN, IDH_CONSOLE_COLOR_RED, IDC_CNSL_COLOR_BLUE_LBL, IDH_CONSOLE_COLOR_RED, IDC_CNSL_COLOR_BLUE, IDH_CONSOLE_COLOR_RED, IDC_CNSL_COLOR_SCREEN_COLORS, IDH_CONSOLE_COLOR_SCR_COLORS, IDC_CNSL_COLOR_SCREEN_COLORS_LBL, IDH_CONSOLE_COLOR_SCR_COLORS, IDC_CNSL_COLOR_POPUP_COLORS, IDH_CONSOLE_COLOR_WIN_COLORS, IDC_CNSL_COLOR_POPUP_COLORS_LBL, IDH_CONSOLE_COLOR_WIN_COLORS, IDC_CNSL_COLOR_1, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_2, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_3, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_4, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_5, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_6, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_7, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_8, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_9, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_10, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_11, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_12, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_13, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_14, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_15, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_COLOR_16, IDH_CONSOLE_COLOR_COLOR_BAR, IDC_CNSL_GROUP0, -1, IDC_CNSL_GROUP1, -1, IDC_CNSL_GROUP2, -1, 0, 0 }; const static DWORD rgdwHelpSettings[] = { IDC_CNSL_HISTORY_NUM_LBL, IDH_CONSOLE_OPTIONS_BUFF_NUM, IDC_CNSL_HISTORY_NUM, IDH_CONSOLE_OPTIONS_BUFF_NUM, IDC_CNSL_HISTORY_SIZE_LBL, IDH_CONSOLE_OPTIONS_BUFF_SIZE, IDC_CNSL_HISTORY_SIZE, IDH_CONSOLE_OPTIONS_BUFF_SIZE, IDC_CNSL_CURSOR_SMALL, IDH_CONSOLE_OPTIONS_CURSOR, IDC_CNSL_CURSOR_LARGE, IDH_CONSOLE_OPTIONS_CURSOR, IDC_CNSL_CURSOR_MEDIUM, IDH_CONSOLE_OPTIONS_CURSOR, IDC_CNSL_HISTORY_NODUP, IDH_CONSOLE_OPTIONS_DISCARD_DUPS, IDC_CNSL_INSERT, IDH_CONSOLE_OPTIONS_INSERT, IDC_CNSL_QUICKEDIT, IDH_CONSOLE_OPTIONS_QUICK_EDIT, IDC_CNSL_LANGUAGELIST, IDH_CONSOLE_OPTIONS_LANGUAGE, IDC_CNSL_FULLSCREEN, IDH_DOS_SCREEN_USAGE_FULL, IDC_CNSL_WINDOWED, IDH_DOS_SCREEN_USAGE_WINDOW, IDC_CNSL_GROUP0, -1, IDC_CNSL_GROUP1, -1, IDC_CNSL_GROUP2, -1, 0, 0 }; const static DWORD rgdwHelpSize[] = { IDC_CNSL_SCRBUF_WIDTH_LBL, IDH_CONSOLE_SIZE_BUFF_WIDTH, IDC_CNSL_SCRBUF_WIDTH, IDH_CONSOLE_SIZE_BUFF_WIDTH, IDC_CNSL_SCRBUF_HEIGHT_LBL, IDH_CONSOLE_SIZE_BUFF_HEIGHT, IDC_CNSL_SCRBUF_HEIGHT, IDH_CONSOLE_SIZE_BUFF_HEIGHT, IDC_CNSL_WINDOW_WIDTH_LBL, IDH_CONSOLE_SIZE_WIN_WIDTH, IDC_CNSL_WINDOW_WIDTH, IDH_CONSOLE_SIZE_WIN_WIDTH, IDC_CNSL_WINDOW_HEIGHT_LBL, IDH_CONSOLE_SIZE_WIN_HEIGHT, IDC_CNSL_WINDOW_HEIGHT, IDH_CONSOLE_SIZE_WIN_HEIGHT, IDC_CNSL_WINDOW_POSX_LBL, IDH_CONSOLE_SIZE_POS_LEFT, IDC_CNSL_WINDOW_POSX, IDH_CONSOLE_SIZE_POS_LEFT, IDC_CNSL_WINDOW_POSY_LBL, IDH_CONSOLE_SIZE_POS_TOP, IDC_CNSL_WINDOW_POSY, IDH_CONSOLE_SIZE_POS_TOP, IDC_CNSL_AUTO_POSITION, IDH_CONSOLE_SIZE_LET_SYS, IDC_CNSL_PREVIEWLABEL, IDH_DOS_FONT_WINDOW_PREVIEW, IDC_CNSL_PREVIEWWINDOW, IDH_DOS_FONT_WINDOW_PREVIEW, IDC_CNSL_GROUP0, -1, IDC_CNSL_GROUP1, -1, IDC_CNSL_GROUP2, -1, 0, 0 }; #ifdef ADVANCED_PAGE VOID _AddEnvVariable( HWND hwndLV, INT iItem, LPTSTR pszVar ) { TCHAR szTemp[ 1024 ]; LV_ITEM lvi; LPTSTR p; for( p = szTemp; *pszVar!=TEXT('='); *p++ = *pszVar++ ); *p = TEXT('\0'); pszVar++; lvi.mask = LVIF_TEXT; lvi.iItem = iItem; lvi.iSubItem = 0; lvi.pszText = szTemp; SendMessage( hwndLV, LVM_SETITEM, 0, (LPARAM)&lvi ); for( p=szTemp; *pszVar!=TEXT('\0'); *p++ = *pszVar++ ); *p = TEXT('\0'); lvi.mask = LVIF_TEXT; lvi.iItem = iItem; lvi.iSubItem = 1; lvi.pszText = szTemp; SendMessage( hwndLV, LVM_SETITEM, 0, (LPARAM)&lvi ); } BOOL_PTR CALLBACK _AdvancedDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) /*++ Dialog proc for the settings dialog box. --*/ { UINT Item; HWND hWnd; RECT r; LV_COLUMN lvc; HWND hwndLV; LPTSTR pszEnv, pszSave; LV_ITEM lvi; INT i; LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER); switch (wMsg) { case WM_INITDIALOG: pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam; SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld); // Initialize Columns in listview hwndLV = GetDlgItem( hDlg, IDC_CNSL_ADVANCED_LISTVIEW ); GetClientRect( hwndLV, &r ); lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.cx = (((r.right - r.left) - GetSystemMetrics(SM_CXVSCROLL)) * 7) / 20; lvc.pszText = TEXT("Variable Name"); ListView_InsertColumn( hwndLV, 0, &lvc ); lvc.cx = (((r.right - r.left) - GetSystemMetrics(SM_CXVSCROLL)) * 13) / 20; lvc.pszText = TEXT("Value"); ListView_InsertColumn( hwndLV, 1, &lvc ); ZeroMemory( &lvi, sizeof(lvi) ); pszSave = pszEnv = GetEnvironmentStrings(); while (pszEnv && *pszEnv) { i = SendMessage( hwndLV, LVM_INSERTITEM, 0, (LPARAM)&lvi ); _AddEnvVariable( hwndLV, i, pszEnv ); for( ; *pszEnv; pszEnv++ ) { // do nothing } pszEnv++; } FreeEnvironmentStrings( pszSave ); return TRUE; case WM_DESTROY: EndDialog( hDlg, TRUE ); break; case WM_COMMAND: Item = LOWORD(wParam); switch (Item) { default: break; } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: /* * Write out the state values and exit. */ if (FAILED(SaveLink(pld))) SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); break; case PSN_KILLACTIVE: /* * Fake the dialog proc into thinking the edit control just * lost focus so it'll update properly */ if (Item = GetDlgCtrlID(GetFocus())) { SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0); } return TRUE; } break; default: break; } return FALSE; } #endif // ADVANCED_PAGE LRESULT ColorControlProc( HWND hColor, UINT wMsg, WPARAM wParam, LPARAM lParam ) /*++ Window proc for the color buttons --*/ { PAINTSTRUCT ps; int ColorId; RECT rColor; RECT rTemp; HBRUSH hbr; HDC hdc; HWND hWnd; HWND hDlg; COLORREF rgbBrush; CONSOLEPROP_DATA * pcpd = (CONSOLEPROP_DATA *)GetWindowLongPtr( hColor, 0 ); ColorId = GetWindowLong(hColor, GWL_ID); hDlg = GetParent(hColor); switch (wMsg) { case CM_COLOR_INIT: SetWindowLongPtr( hColor, 0, lParam ); break; case WM_GETDLGCODE: return DLGC_WANTARROWS | DLGC_WANTTAB; break; case WM_SETFOCUS: if (pcpd->ColorArray[pcpd->Index] != (BYTE)(ColorId - IDC_CNSL_COLOR_1)) { hWnd = GetDlgItem(hDlg, pcpd->ColorArray[pcpd->Index]+IDC_CNSL_COLOR_1); SetFocus(hWnd); } // Fall through case WM_KILLFOCUS: hdc = GetDC(hDlg); hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_1); GetWindowRect(hWnd, &rColor); hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_16); GetWindowRect(hWnd, &rTemp); rColor.right = rTemp.right; ScreenToClient(hDlg, (LPPOINT)&rColor.left); ScreenToClient(hDlg, (LPPOINT)&rColor.right); InflateRect(&rColor, 2, 2); DrawFocusRect(hdc, &rColor); ReleaseDC(hDlg, hdc); break; case WM_KEYDOWN: switch (wParam) { case VK_UP: case VK_LEFT: if (ColorId > IDC_CNSL_COLOR_1) { SendMessage(hDlg, CM_SETCOLOR, ColorId - 1 - IDC_CNSL_COLOR_1, (LPARAM)hColor); } break; case VK_DOWN: case VK_RIGHT: if (ColorId < IDC_CNSL_COLOR_16) { SendMessage(hDlg, CM_SETCOLOR, ColorId + 1 - IDC_CNSL_COLOR_1, (LPARAM)hColor); } break; case VK_TAB: hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_1); hWnd = GetNextDlgTabItem(hDlg, hWnd, GetKeyState(VK_SHIFT) < 0); SetFocus(hWnd); break; default: return DefWindowProc(hColor, wMsg, wParam, lParam); } break; case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: SendMessage(hDlg, CM_SETCOLOR, ColorId - IDC_CNSL_COLOR_1, (LPARAM)hColor); break; case WM_PAINT: BeginPaint(hColor, &ps); GetClientRect(hColor, &rColor); rgbBrush = GetNearestColor(ps.hdc, pcpd->lpConsole->ColorTable[ColorId-IDC_CNSL_COLOR_1]); if ((hbr = CreateSolidBrush(rgbBrush)) != NULL) { // // are we the selected color for the current object? // if (pcpd->ColorArray[pcpd->Index] == (BYTE)(ColorId - IDC_CNSL_COLOR_1)) { // // put current values in dialog box // SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_REDSCROLL, UDM_SETPOS, 0, MAKELONG( GetRValue(AttrToRGB(pcpd->ColorArray[pcpd->Index])),0)); SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_GREENSCROLL, UDM_SETPOS, 0, MAKELONG( GetGValue(AttrToRGB(pcpd->ColorArray[pcpd->Index])),0)); SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_BLUESCROLL, UDM_SETPOS, 0, MAKELONG( GetBValue(AttrToRGB(pcpd->ColorArray[pcpd->Index])),0)); // // highlight the selected color // FrameRect(ps.hdc, &rColor, GetStockObject(BLACK_BRUSH)); InflateRect(&rColor, -1, -1); FrameRect(ps.hdc, &rColor, GetStockObject(BLACK_BRUSH)); } InflateRect(&rColor, -1, -1); FillRect(ps.hdc, &rColor, hbr); DeleteObject(hbr); } EndPaint(hColor, &ps); break; default: return DefWindowProc(hColor, wMsg, wParam, lParam); break; } return TRUE; } LRESULT ColorTextProc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam ) /*++ Window proc for the color preview windows --*/ { PAINTSTRUCT ps; int ColorId; RECT rect; HBRUSH hbr; HFONT hfT; CONSOLEPROP_DATA * pcpd = (CONSOLEPROP_DATA *)GetWindowLongPtr( hWnd, 0 ); ColorId = GetWindowLong(hWnd, GWL_ID); switch (wMsg) { case CM_COLOR_INIT: SetWindowLongPtr( hWnd, 0, lParam ); break; case WM_PAINT: BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rect); InflateRect(&rect, -2, -2); if (ColorId == IDC_CNSL_COLOR_SCREEN_COLORS) { SetTextColor(ps.hdc, ScreenTextColor(pcpd)); SetBkColor(ps.hdc, ScreenBkColor(pcpd)); hbr = CreateSolidBrush( ScreenBkColor(pcpd) ); } else { SetTextColor(ps.hdc, PopupTextColor(pcpd)); SetBkColor(ps.hdc, PopupBkColor(pcpd)); hbr = CreateSolidBrush( PopupBkColor(pcpd) ); } /* Draw the text sample */ if (hbr) { FillRect(ps.hdc, &rect, hbr); DeleteObject(hbr); } hfT = SelectObject(ps.hdc, pcpd->FontInfo[pcpd->CurrentFontIndex].hFont); DrawText(ps.hdc, g_szPreviewText, -1, &rect, 0); SelectObject(ps.hdc, hfT); EndPaint(hWnd, &ps); break; default: return DefWindowProc(hWnd, wMsg, wParam, lParam); break; } return TRUE; } BOOL_PTR WINAPI _ColorDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) /*++ Dialog proc for the color selection dialog box. --*/ { UINT Value; UINT Red; UINT Green; UINT Blue; UINT Item; HWND hWnd; HWND hWndOld; BOOL bOK; LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER); switch (wMsg) { case WM_INITDIALOG: pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam; SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld); pld->cpd.bColorInit = FALSE; pld->cpd.ColorArray[IDC_CNSL_COLOR_SCREEN_TEXT - IDC_CNSL_COLOR_SCREEN_TEXT] = LOBYTE(pld->cpd.lpConsole->wFillAttribute) & 0x0F; pld->cpd.ColorArray[IDC_CNSL_COLOR_SCREEN_BKGND - IDC_CNSL_COLOR_SCREEN_TEXT] = LOBYTE(pld->cpd.lpConsole->wFillAttribute >> 4); pld->cpd.ColorArray[IDC_CNSL_COLOR_POPUP_TEXT - IDC_CNSL_COLOR_SCREEN_TEXT] = LOBYTE(pld->cpd.lpConsole->wPopupFillAttribute) & 0x0F; pld->cpd.ColorArray[IDC_CNSL_COLOR_POPUP_BKGND - IDC_CNSL_COLOR_SCREEN_TEXT] = LOBYTE(pld->cpd.lpConsole->wPopupFillAttribute >> 4); CheckRadioButton(hDlg,IDC_CNSL_COLOR_SCREEN_TEXT,IDC_CNSL_COLOR_POPUP_BKGND,IDC_CNSL_COLOR_SCREEN_BKGND); pld->cpd.Index = IDC_CNSL_COLOR_SCREEN_BKGND - IDC_CNSL_COLOR_SCREEN_TEXT; // initialize color controls for (Item=IDC_CNSL_COLOR_1; Item<=IDC_CNSL_COLOR_16; Item++) SendDlgItemMessage(hDlg, Item, CM_COLOR_INIT, 0, (LPARAM)&pld->cpd ); // initialize text preview controls SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_SCREEN_COLORS, CM_COLOR_INIT, 0, (LPARAM)&pld->cpd ); SendDlgItemMessage(hDlg, IDC_CNSL_COLOR_POPUP_COLORS, CM_COLOR_INIT, 0, (LPARAM)&pld->cpd ); // Set ranges & position for updown controls SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_REDSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 255, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_GREENSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 255, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_BLUESCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 255, 0 ) ); #define pcpd (&pld->cpd) SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_REDSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG(GetRValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])), 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_GREENSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG(GetGValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])), 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_COLOR_BLUESCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG(GetBValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])), 0 ) ); #undef pcpd pld->cpd.bColorInit = TRUE; return TRUE; // // handle help messages // case WM_HELP: /* F1 or title-bar help button */ WinHelp( (HWND) ((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP, (ULONG_PTR) (LPVOID) &rgdwHelpColor[0] ); break; case WM_CONTEXTMENU: /* right mouse click */ WinHelp( (HWND) wParam, NULL, HELP_CONTEXTMENU, (ULONG_PTR) (LPVOID) &rgdwHelpColor[0] ); break; case WM_COMMAND: Item = LOWORD(wParam); switch (Item) { case IDC_CNSL_COLOR_SCREEN_TEXT: case IDC_CNSL_COLOR_SCREEN_BKGND: case IDC_CNSL_COLOR_POPUP_TEXT: case IDC_CNSL_COLOR_POPUP_BKGND: hWndOld = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1); pld->cpd.Index = Item - IDC_CNSL_COLOR_SCREEN_TEXT; CheckRadioButton(hDlg,IDC_CNSL_COLOR_SCREEN_TEXT,IDC_CNSL_COLOR_POPUP_BKGND,Item); // repaint new color hWnd = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1); InvalidateRect(hWnd, NULL, TRUE); // repaint old color if (hWndOld != hWnd) { InvalidateRect(hWndOld, NULL, TRUE); } return TRUE; case IDC_CNSL_COLOR_RED: case IDC_CNSL_COLOR_GREEN: case IDC_CNSL_COLOR_BLUE: switch (HIWORD(wParam)) { case EN_UPDATE: Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE); if (bOK) { if (Value > 255) { Value = 255; SetDlgItemInt( hDlg, Item, Value, TRUE ); } if ((int)Value < 0) { Value = 0; SetDlgItemInt( hDlg, Item, Value, TRUE ); } } if (pld) pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); break; case EN_KILLFOCUS: if (!pld) return FALSE; // // Update the state info structure // #define pcpd (&pld->cpd) Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE); if (bOK) { if (Value > 255) { Value = 255; SetDlgItemInt( hDlg, Item, Value, TRUE ); } if ((int)Value < 0) { Value = 0; SetDlgItemInt( hDlg, Item, Value, TRUE ); } if (Item == IDC_CNSL_COLOR_RED) { Red = Value; } else { Red = GetRValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])); } if (Item == IDC_CNSL_COLOR_GREEN) { Green = Value; } else { Green = GetGValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])); } if (Item == IDC_CNSL_COLOR_BLUE) { Blue = Value; } else { Blue = GetBValue(AttrToRGB(pld->cpd.ColorArray[pld->cpd.Index])); } pld->cpd.lpConsole->ColorTable[pld->cpd.ColorArray[pld->cpd.Index]] = RGB(Red, Green, Blue); } #undef pcpd // // Update the preview windows with the new value // hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_SCREEN_COLORS); InvalidateRect(hWnd, NULL, FALSE); hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_POPUP_COLORS); InvalidateRect(hWnd, NULL, FALSE); hWnd = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1); InvalidateRect(hWnd, NULL, FALSE); break; } return TRUE; } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: /* * Write out the state values and exit. */ if (FAILED(SaveLink(pld))) SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); break; } break; case WM_VSCROLL: // minus 1 because edit control precedes the updown control in the .rc file Item = GetDlgCtrlID( (HWND)lParam ) - 1; switch (LOWORD(wParam)) { case SB_ENDSCROLL: SendDlgItemMessage(hDlg, Item, EM_SETSEL, 0, (DWORD)-1); break; default: /* * Get the new value for the control */ Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE); SendDlgItemMessage(hDlg, Item, EM_SETSEL, 0, (DWORD)-1); hWnd = GetDlgItem(hDlg, Item); SetFocus(hWnd); /* * Fake the dialog proc into thinking the edit control just * lost focus so it'll update properly */ SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); break; } return TRUE; case CM_SETCOLOR: switch( pld->cpd.Index + IDC_CNSL_COLOR_SCREEN_TEXT ) { case IDC_CNSL_COLOR_SCREEN_TEXT: pld->cpd.lpConsole->wFillAttribute = (WORD) ((pld->cpd.lpConsole->wFillAttribute & 0xF0) | (wParam & 0x0F)); break; case IDC_CNSL_COLOR_SCREEN_BKGND: pld->cpd.lpConsole->wFillAttribute = (WORD) ((pld->cpd.lpConsole->wFillAttribute & 0x0F) | (wParam << 4)); break; case IDC_CNSL_COLOR_POPUP_TEXT: pld->cpd.lpConsole->wPopupFillAttribute = (WORD) ((pld->cpd.lpConsole->wPopupFillAttribute & 0xF0) | (wParam & 0x0F)); break; case IDC_CNSL_COLOR_POPUP_BKGND: pld->cpd.lpConsole->wPopupFillAttribute = (WORD) ((pld->cpd.lpConsole->wPopupFillAttribute & 0x0F) | (wParam << 4)); break; } hWndOld = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1); pld->cpd.ColorArray[pld->cpd.Index] = (BYTE)wParam; pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); // Force the preview window to repaint if (pld->cpd.Index < (IDC_CNSL_COLOR_POPUP_TEXT - IDC_CNSL_COLOR_SCREEN_TEXT)) { hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_SCREEN_COLORS); } else { hWnd = GetDlgItem(hDlg, IDC_CNSL_COLOR_POPUP_COLORS); } InvalidateRect(hWnd, NULL, TRUE); // repaint new color hWnd = GetDlgItem(hDlg, pld->cpd.ColorArray[pld->cpd.Index]+IDC_CNSL_COLOR_1); InvalidateRect(hWnd, NULL, TRUE); SetFocus(hWnd); // repaint old color if (hWndOld != hWnd) { InvalidateRect(hWndOld, NULL, TRUE); } return TRUE; default: break; } return FALSE; } BOOL_PTR CALLBACK _ConsoleSettingsDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) /*++ Dialog proc for the settings dialog box. --*/ { UINT Item; SYSTEM_INFO SystemInfo; LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER); switch (wMsg) { case WM_INITDIALOG: pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam; SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld); GetSystemInfo(&SystemInfo); if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { if (pld->cpd.lpConsole->bFullScreen) CheckRadioButton(hDlg,IDC_CNSL_WINDOWED,IDC_CNSL_FULLSCREEN,IDC_CNSL_FULLSCREEN); else CheckRadioButton(hDlg,IDC_CNSL_WINDOWED,IDC_CNSL_FULLSCREEN,IDC_CNSL_WINDOWED); } else { ShowWindow(GetDlgItem(hDlg, IDC_CNSL_WINDOWED), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_CNSL_FULLSCREEN), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_CNSL_GROUP2), SW_HIDE); } CheckDlgButton(hDlg, IDC_CNSL_HISTORY_NODUP, pld->cpd.lpConsole->bHistoryNoDup); CheckDlgButton(hDlg, IDC_CNSL_QUICKEDIT, pld->cpd.lpConsole->bQuickEdit); CheckDlgButton(hDlg, IDC_CNSL_INSERT, pld->cpd.lpConsole->bInsertMode); // initialize cursor radio buttons if (pld->cpd.lpConsole->uCursorSize <= 25) { Item = IDC_CNSL_CURSOR_SMALL; } else if (pld->cpd.lpConsole->uCursorSize <= 50) { Item = IDC_CNSL_CURSOR_MEDIUM; } else { Item = IDC_CNSL_CURSOR_LARGE; } CheckRadioButton(hDlg, IDC_CNSL_CURSOR_SMALL, IDC_CNSL_CURSOR_LARGE, Item); // initialize updown controls SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_SIZESCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 999, 1 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_NUMSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 999, 1 ) ); // // put current values in dialog box // SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_SIZESCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->uHistoryBufferSize, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_HISTORY_NUMSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->uNumberOfHistoryBuffers, 0 ) ); if (IsFarEastCP(pld->cpd.uOEMCP)) LanguageListCreate(hDlg, pld->cpd.lpFEConsole->uCodePage); else { ShowWindow(GetDlgItem(hDlg, IDC_CNSL_GROUP3), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_CNSL_LANGUAGELIST), SW_HIDE); } return TRUE; case WM_DESTROY: EndDialog( hDlg, TRUE ); break; // // handle help messages // case WM_HELP: /* F1 or title-bar help button */ WinHelp( (HWND) ((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP, (ULONG_PTR) (LPVOID) &rgdwHelpSettings[0] ); break; case WM_CONTEXTMENU: /* right mouse click */ WinHelp( (HWND) wParam, NULL, HELP_CONTEXTMENU, (ULONG_PTR) (LPVOID) &rgdwHelpSettings[0] ); break; case WM_COMMAND: Item = LOWORD(wParam); switch (Item) { case IDC_CNSL_HISTORY_SIZE: if (pld && (HIWORD(wParam)==EN_UPDATE)) { pld->cpd.lpConsole->uHistoryBufferSize = GetDlgItemInt( hDlg, Item, NULL, FALSE ); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); } break; case IDC_CNSL_HISTORY_NUM: if (pld && (HIWORD(wParam)==EN_UPDATE)) { pld->cpd.lpConsole->uNumberOfHistoryBuffers = GetDlgItemInt( hDlg, Item, NULL, FALSE ); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); } break; #ifdef i386 case IDC_CNSL_WINDOWED: case IDC_CNSL_FULLSCREEN: CheckRadioButton(hDlg, IDC_CNSL_WINDOWED, IDC_CNSL_FULLSCREEN, Item); pld->cpd.lpConsole->bFullScreen = (Item == IDC_CNSL_FULLSCREEN); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); return TRUE; #endif case IDC_CNSL_LANGUAGELIST: switch (HIWORD(wParam)) { case CBN_KILLFOCUS: { HWND hWndLanguageCombo; LONG lListIndex; UINT Value; hWndLanguageCombo = GetDlgItem(hDlg, IDC_CNSL_LANGUAGELIST); lListIndex = (LONG) SendMessage(hWndLanguageCombo, CB_GETCURSEL, 0, 0L); Value = (UINT) SendMessage(hWndLanguageCombo, CB_GETITEMDATA, lListIndex, 0L); if (Value != (UINT)-1) { pld->cpd.fChangeCodePage = (Value != pld->cpd.lpFEConsole->uCodePage); pld->cpd.lpFEConsole->uCodePage = Value; PropSheet_Changed( GetParent( hDlg ), hDlg ); } break; } default: break; } return TRUE; case IDC_CNSL_CURSOR_SMALL: pld->cpd.lpConsole->uCursorSize = 25; goto SetCursorSize; case IDC_CNSL_CURSOR_MEDIUM: pld->cpd.lpConsole->uCursorSize = 50; goto SetCursorSize; case IDC_CNSL_CURSOR_LARGE: pld->cpd.lpConsole->uCursorSize = 100; SetCursorSize: pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); CheckRadioButton(hDlg, IDC_CNSL_CURSOR_SMALL, IDC_CNSL_CURSOR_LARGE, Item); return TRUE; case IDC_CNSL_HISTORY_NODUP: pld->cpd.lpConsole->bHistoryNoDup = IsDlgButtonChecked( hDlg, Item ); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); return TRUE; case IDC_CNSL_QUICKEDIT: pld->cpd.lpConsole->bQuickEdit = IsDlgButtonChecked( hDlg, Item ); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); return TRUE; case IDC_CNSL_INSERT: pld->cpd.lpConsole->bInsertMode = IsDlgButtonChecked( hDlg, Item ); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); return TRUE; default: break; } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: /* * Write out the state values and exit. */ if (FAILED(SaveLink(pld))) SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); break; case PSN_KILLACTIVE: /* * Fake the dialog proc into thinking the edit control just * lost focus so it'll update properly */ if (0 != (Item = GetDlgCtrlID(GetFocus()))) { SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0); } return TRUE; } break; default: break; } return FALSE; } BOOL CheckBufferSize( HWND hDlg, UINT Item, LINKDATA *pld, INT i ) /*++ Checks to make sure the buffer size is not smaller than the window size Returns: TRUE if preview window should be updated FALSE if not --*/ { BOOL fRet = FALSE; if (!pld) return fRet; switch (Item) { case IDC_CNSL_SCRBUF_WIDTHSCROLL: case IDC_CNSL_SCRBUF_WIDTH: if (i >= 1) { pld->cpd.lpConsole->dwScreenBufferSize.X = (SHORT) i; if (pld->cpd.lpConsole->dwWindowSize.X > i) { pld->cpd.lpConsole->dwWindowSize.X = (SHORT) i; SetDlgItemInt( hDlg, IDC_CNSL_WINDOW_WIDTH, pld->cpd.lpConsole->dwWindowSize.X, TRUE ); fRet = TRUE; } } break; case IDC_CNSL_SCRBUF_HEIGHTSCROLL: case IDC_CNSL_SCRBUF_HEIGHT: if (i >= 1) { pld->cpd.lpConsole->dwScreenBufferSize.Y = (SHORT) i; if (pld->cpd.lpConsole->dwWindowSize.Y > i) { pld->cpd.lpConsole->dwWindowSize.Y = (SHORT) i; SetDlgItemInt( hDlg, IDC_CNSL_WINDOW_HEIGHT, pld->cpd.lpConsole->dwWindowSize.Y, TRUE ); fRet = TRUE; } } break; case IDC_CNSL_WINDOW_WIDTHSCROLL: case IDC_CNSL_WINDOW_WIDTH: if (i >= 1) { pld->cpd.lpConsole->dwWindowSize.X = (SHORT) i; if (pld->cpd.lpConsole->dwScreenBufferSize.X < i) { pld->cpd.lpConsole->dwScreenBufferSize.X = (SHORT) i; SetDlgItemInt( hDlg, IDC_CNSL_SCRBUF_WIDTH, pld->cpd.lpConsole->dwScreenBufferSize.X, TRUE ); fRet = TRUE; } } break; case IDC_CNSL_WINDOW_HEIGHTSCROLL: case IDC_CNSL_WINDOW_HEIGHT: if (i >= 1) { pld->cpd.lpConsole->dwWindowSize.Y = (SHORT) i; if (pld->cpd.lpConsole->dwScreenBufferSize.Y < i) { pld->cpd.lpConsole->dwScreenBufferSize.Y = (SHORT) i; SetDlgItemInt( hDlg, IDC_CNSL_SCRBUF_HEIGHT, pld->cpd.lpConsole->dwScreenBufferSize.Y, TRUE ); fRet = TRUE; } } } return fRet; } BOOL IsValidSetting( HWND hDlg, UINT Item, LINKDATA *pld, INT i ) /*++ Checks to make sure the proposed new value is valid for the console Returns: TRUE if it is valid FALSE if not --*/ { BOOL fRet = TRUE; if (!pld) return FALSE; if (i>9999) i = -1; switch (Item) { case IDC_CNSL_WINDOW_HEIGHT: if (i <= 0) { SetDlgItemInt( hDlg, Item, pld->cpd.lpConsole->dwWindowSize.Y, TRUE ); fRet = FALSE; } else { pld->cpd.lpConsole->dwWindowSize.Y = (SHORT) i; } break; case IDC_CNSL_WINDOW_WIDTH: if (i <= 0) { SetDlgItemInt( hDlg, Item, pld->cpd.lpConsole->dwWindowSize.X, TRUE ); fRet = FALSE; } else { pld->cpd.lpConsole->dwWindowSize.X = (SHORT) i; } break; case IDC_CNSL_SCRBUF_WIDTH: if (i <= 0) { SetDlgItemInt( hDlg, Item, pld->cpd.lpConsole->dwScreenBufferSize.X, TRUE ); fRet = FALSE; } else { pld->cpd.lpConsole->dwScreenBufferSize.X = (SHORT) i; } break; case IDC_CNSL_SCRBUF_HEIGHT: if (i <= 0) { SetDlgItemInt( hDlg, Item, pld->cpd.lpConsole->dwScreenBufferSize.Y, TRUE ); fRet = FALSE; } else { pld->cpd.lpConsole->dwScreenBufferSize.Y = (SHORT) i; } break; } if (i <= 0) { SendDlgItemMessage( hDlg, Item, EM_SETSEL, (WPARAM)(INT)4, (WPARAM)(INT)4 ); } return fRet; } BOOL_PTR CALLBACK _ScreenSizeDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) /*++ Dialog proc for the screen size dialog box. --*/ { UINT Value; UINT Item; HWND hWnd; LONG xScreen; LONG yScreen; LONG cxScreen; LONG cyScreen; LONG cxFrame; LONG cyFrame; LINKDATA *pld = (LINKDATA *)GetWindowLongPtr(hDlg, DWLP_USER); switch (wMsg) { case WM_INITDIALOG: pld = (LINKDATA *)((PROPSHEETPAGE *)lParam)->lParam; SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pld); SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_INIT, 0, (LPARAM)&pld->cpd ); SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_UPDATE, 0, 0 ); // Get some system parameters xScreen = GetSystemMetrics(SM_XVIRTUALSCREEN); yScreen = GetSystemMetrics(SM_YVIRTUALSCREEN); cxScreen = GetSystemMetrics(SM_CXVIRTUALSCREEN); cyScreen = GetSystemMetrics(SM_CYVIRTUALSCREEN); cxFrame = GetSystemMetrics(SM_CXFRAME); cyFrame = GetSystemMetrics(SM_CYFRAME); // initialize updown controls SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_WIDTHSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( MAX_SCRBUF_WIDTH, 1 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_HEIGHTSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( MAX_SCRBUF_HEIGHT, 1 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_WIDTHSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 9999, 1 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_HEIGHTSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( 9999, 1 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSXSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( xScreen + cxScreen - cxFrame, xScreen - cxFrame ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSYSCROLL, UDM_SETRANGE, 0, (LPARAM)MAKELONG( yScreen + cyScreen - cyFrame, yScreen - cyFrame ) ); // // put current values in dialog box // SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_WIDTHSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwScreenBufferSize.X, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_SCRBUF_HEIGHTSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwScreenBufferSize.Y, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_WIDTHSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowSize.X, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_HEIGHTSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowSize.Y, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSXSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowOrigin.X, 0 ) ); SendDlgItemMessage( hDlg, IDC_CNSL_WINDOW_POSYSCROLL, UDM_SETPOS, 0, (LPARAM)MAKELONG( pld->cpd.lpConsole->dwWindowOrigin.Y, 0 ) ); CheckDlgButton(hDlg, IDC_CNSL_AUTO_POSITION, pld->cpd.lpConsole->bAutoPosition); SendMessage(hDlg, WM_COMMAND, IDC_CNSL_AUTO_POSITION, 0); return TRUE; case WM_DESTROY: EndDialog( hDlg, TRUE ); break; // // handle help messages // case WM_HELP: /* F1 or title-bar help button */ WinHelp( (HWND) ((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP, (ULONG_PTR) (LPVOID) &rgdwHelpSize[0] ); break; case WM_CONTEXTMENU: /* right mouse click */ WinHelp( (HWND) wParam, NULL, HELP_CONTEXTMENU, (ULONG_PTR) (LPVOID) &rgdwHelpSize[0] ); break; case WM_COMMAND: Item = LOWORD(wParam); if (Item==IDC_CNSL_AUTO_POSITION) { pld->cpd.lpConsole->bAutoPosition = IsDlgButtonChecked( hDlg, Item ); pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); Value = IsDlgButtonChecked(hDlg, IDC_CNSL_AUTO_POSITION); for (Item = IDC_CNSL_WINDOW_POSX; Item < IDC_CNSL_AUTO_POSITION; Item++) { hWnd = GetDlgItem(hDlg, Item); EnableWindow(hWnd, (Value == FALSE)); } } // // Make sure that we don't have a buffer size smaller than a window size // if (pld && (HIWORD(wParam)==EN_KILLFOCUS)) { INT i; i = GetDlgItemInt( hDlg, Item, NULL, FALSE ); if (CheckBufferSize( hDlg, Item, pld, i )) goto UpdatePrevWindow; } // // Verify that what is typed is a valid quantity... // if (pld && (HIWORD(wParam)==EN_UPDATE)) { INT i; i = GetDlgItemInt( hDlg, Item, NULL, FALSE ); IsValidSetting( hDlg, Item, pld, i ); switch( Item ) { case IDC_CNSL_WINDOW_POSX: pld->cpd.lpConsole->dwWindowOrigin.X = (SHORT) GetDlgItemInt( hDlg, Item, NULL, TRUE ); break; case IDC_CNSL_WINDOW_POSY: pld->cpd.lpConsole->dwWindowOrigin.Y = (SHORT) GetDlgItemInt( hDlg, Item, NULL, TRUE ); break; } UpdatePrevWindow: pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_UPDATE, 0, 0 ); } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case UDN_DELTAPOS: { NM_UPDOWN * lpud = (NM_UPDOWN *)lParam; INT i; i = lpud->iPos + lpud->iDelta; // Check for bad ranges if ((i > 9999) || (i < 1)) return TRUE; // check restrictions and alter values accordingly. (Buffer size // can never be smaller than window size!) CheckBufferSize( hDlg, (UINT)wParam, pld, i); // highlight the changed entry SendDlgItemMessage( hDlg, (UINT)wParam, EM_SETSEL, (WPARAM)(INT)4, (WPARAM)(INT)4 ); // Update the preview window pld->cpd.bConDirty = TRUE; PropSheet_Changed( GetParent( hDlg ), hDlg ); SendDlgItemMessage(hDlg, IDC_CNSL_PREVIEWWINDOW, CM_PREVIEW_UPDATE, 0, 0 ); } break; case PSN_APPLY: /* * Write out the state values and exit. */ if (FAILED(SaveLink(pld))) SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); break; // case PSN_HELP: // //WinHelp(hDlg, szHelpFileName, HELP_CONTEXT, DID_SCRBUFSIZE); // return TRUE; case PSN_KILLACTIVE: /* * Fake the dialog proc into thinking the edit control just * lost focus so it'll update properly */ if (0 != (Item = GetDlgCtrlID(GetFocus()))) { SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0); } return TRUE; } break; default: break; } return FALSE; } void *_CopyDataBlock(IShellLink *psl, DWORD dwSig) { void *pv = NULL; IShellLinkDataList *psld; if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IShellLinkDataList, (void **)&psld))) { psld->lpVtbl->CopyDataBlock(psld, dwSig, &pv); psld->lpVtbl->Release(psld); } return (void *)pv; } void _RemoveDataBlock(IShellLink *psl, DWORD dwSig) { IShellLinkDataList *psld; if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IShellLinkDataList, (void **)&psld))) { psld->lpVtbl->RemoveDataBlock(psld, dwSig); psld->lpVtbl->Release(psld); } } void _AddDataBlock(IShellLink *psl, void *pv) { IShellLinkDataList *psld; if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IShellLinkDataList, (void **)&psld))) { psld->lpVtbl->AddDataBlock(psld, pv); psld->lpVtbl->Release(psld); } } STDAPI_(void) LinkConsolePagesSave( LINKDATA *pld ) { // First, remove the console settings section if it exists _RemoveDataBlock(pld->cpd.psl, NT_CONSOLE_PROPS_SIG); _RemoveDataBlock(pld->cpd.psl, NT_FE_CONSOLE_PROPS_SIG); #ifndef UNICODE // if we're the ANSI shell, we need to convert FACENAME // over to UNICODE before saving... { WCHAR wszFaceName[LF_FACESIZE]; MultiByteToWideChar( CP_ACP, 0, pld->cpd.lpFaceName, LF_FACESIZE, wszFaceName, LF_FACESIZE ); hmemcpy(pld->cpd.lpConsole->FaceName, wszFaceName, LF_FACESIZE*SIZEOF(WCHAR)); } #endif // // Now, add back the new console settings _AddDataBlock(pld->cpd.psl, pld->cpd.lpConsole); // // Now, update registry settings for this title... SetRegistryValues( &pld->cpd ); if (IsFarEastCP(pld->cpd.uOEMCP)) { // Same for FarEast console settings // _AddDataBlock(pld->cpd.psl, pld->cpd.lpFEConsole); SetFERegistryValues( &pld->cpd ); } // And, mark the console data as current pld->cpd.bConDirty = FALSE; } #define PEMAGIC ((WORD)'P'+((WORD)'E'<<8)) STDAPI_(void) AddLinkConsolePages(LINKDATA *pld, IShellLink * psl, LPCTSTR pszFile, LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) { HPROPSHEETPAGE hpage; PROPSHEETPAGE psp; HRESULT hres; TCHAR szTarget[ MAX_PATH ]; TCHAR szBuffer[ MAX_PATH ]; WNDCLASS wc; IPersistFile *ppf; LPNT_FE_CONSOLE_PROPS lpFEConsole; LPNT_CONSOLE_PROPS lpConsole; // do this here so we don't slow down the loading // of other pages if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, &ppf))) { WCHAR wszPath[ MAX_PATH ]; SHTCharToUnicode(pszFile, wszPath, ARRAYSIZE(wszPath)); hres = ppf->lpVtbl->Load(ppf, wszPath, 0); ppf->lpVtbl->Release(ppf); } // Get the target of the link hres = psl->lpVtbl->GetPath(psl, szBuffer, ARRAYSIZE(szBuffer), NULL, 0); pld->cpd.psl = psl; if (FAILED(hres) || hres == S_FALSE) goto Exit; // Remove args first, to: // (1) shorten our string, avoiding ExpandEnvironmentStrings overflowing the buffer // (2) increase liklihood that PathRemoveArgs won't get confused by spaces in "Program Files" etc PathRemoveArgs(szTarget); // expand the target if (!SHExpandEnvironmentStrings(szBuffer, szTarget, ARRAYSIZE(szTarget))) goto Exit; // Check what kind of app target is LOWORD==PEMAGIC, HIWORD==0 if (GetExeType( szTarget )!=PEMAGIC) goto Exit; // It's a WIN32 console mode app, let's put up our property sheet wc.lpszClassName = TEXT("WOACnslWinPreview"); wc.hInstance = HINST_THISDLL; wc.lpfnWndProc = PreviewWndProc; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = NULL; wc.lpszMenuName = NULL; wc.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1); wc.style = 0L; wc.cbClsExtra = 0; wc.cbWndExtra = 2 * sizeof(PVOID); // (two pointers) if (!RegisterClass(&wc)) if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS) goto Exit; wc.lpszClassName = TEXT("WOACnslFontPreview"); wc.hInstance = HINST_THISDLL; wc.lpfnWndProc = _FontPreviewWndProc; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = NULL; wc.lpszMenuName = NULL; wc.hbrBackground = GetStockObject(BLACK_BRUSH); wc.style = 0L; wc.cbClsExtra = 0; wc.cbWndExtra = sizeof(PVOID); // (one pointer) if (!RegisterClass(&wc)) if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS) goto Exit; wc.lpszClassName = TEXT("cpColor"); wc.hInstance = HINST_THISDLL; wc.lpfnWndProc = ColorControlProc; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = NULL; wc.lpszMenuName = NULL; wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.style = 0L; wc.cbClsExtra = 0; wc.cbWndExtra = sizeof(PVOID); // (one pointer) if (!RegisterClass(&wc)) if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS) goto Exit; wc.lpszClassName = TEXT("cpShowColor"); wc.hInstance = HINST_THISDLL; wc.lpfnWndProc = ColorTextProc; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = NULL; wc.lpszMenuName = NULL; wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.style = 0L; wc.cbClsExtra = 0; wc.cbWndExtra = sizeof(PVOID); // (one pointer) if (!RegisterClass(&wc)) if (GetLastError()!=ERROR_CLASS_ALREADY_EXISTS) goto Exit; // Needs TTFontList for all platform. if (!NT_SUCCESS( InitializeDbcsMisc(&pld->cpd) )) goto Exit; GetTitleFromLinkName( (LPTSTR)pszFile, (LPTSTR)pld->cpd.ConsoleTitle, ARRAYSIZE(pld->cpd.ConsoleTitle)); // Check if Far East settings exist... lpFEConsole =(LPNT_FE_CONSOLE_PROPS)_CopyDataBlock(psl, NT_FE_CONSOLE_PROPS_SIG); if (lpFEConsole && lpFEConsole->cbSize != SIZEOF(NT_FE_CONSOLE_PROPS)) { LocalFree(lpFEConsole); lpFEConsole = NULL; } if (lpFEConsole) { pld->cpd.lpFEConsole = lpFEConsole; } else { pld->cpd.lpFEConsole = (LPNT_FE_CONSOLE_PROPS)LocalAlloc( LPTR, SIZEOF(NT_FE_CONSOLE_PROPS) ); if (pld->cpd.lpFEConsole) { // Initialize Far East Console settings pld->cpd.lpFEConsole->cbSize = SIZEOF( NT_FE_CONSOLE_PROPS ); pld->cpd.lpFEConsole->dwSignature = NT_FE_CONSOLE_PROPS_SIG; if (IsFarEastCP(pld->cpd.uOEMCP)) { InitFERegistryValues( &pld->cpd ); GetFERegistryValues( &pld->cpd ); } } } if (!pld->cpd.lpFEConsole) goto Exit; // Get standard settings from link if they exist... lpConsole = (LPNT_CONSOLE_PROPS)_CopyDataBlock(psl, NT_CONSOLE_PROPS_SIG); if (lpConsole != NULL && lpConsole->cbSize != SIZEOF(NT_CONSOLE_PROPS)) { LocalFree(lpConsole); lpConsole = NULL; } if (lpConsole) { pld->cpd.lpConsole = lpConsole; } else { pld->cpd.lpConsole = (LPNT_CONSOLE_PROPS)LocalAlloc(LPTR, SIZEOF(NT_CONSOLE_PROPS) ); if (pld->cpd.lpConsole) { // Initialize console settings pld->cpd.lpConsole->cbSize = SIZEOF( NT_CONSOLE_PROPS ); pld->cpd.lpConsole->dwSignature = NT_CONSOLE_PROPS_SIG; InitRegistryValues( &pld->cpd ); GetRegistryValues( &pld->cpd ); } else { // if the above alloc failes, we fault dereferencing lpConsole... ASSERT(FALSE); } } #ifndef UNICODE else { // we read the properties off of disk -- so need to convert the // UNICODE string to ANSI WCHAR wszFaceName[LF_FACESIZE]; hmemcpy(wszFaceName,pld->cpd.lpConsole->FaceName,LF_FACESIZE*SIZEOF(WCHAR)); WideCharToMultiByte( CP_ACP, 0, wszFaceName, LF_FACESIZE, pld->cpd.szFaceName, LF_FACESIZE, NULL, NULL ); } #endif if (!pld->cpd.lpConsole) goto Exit; // set facename pointer to correct place #ifdef UNICODE pld->cpd.lpFaceName = (LPTSTR)pld->cpd.lpConsole->FaceName; #else pld->cpd.lpFaceName = (LPTSTR)pld->cpd.szFaceName; #endif // // Initialize the font cache and current font index // if (STATUS_SUCCESS != InitializeFonts( &pld->cpd )) { goto Exit; } pld->cpd.CurrentFontIndex = FindCreateFont( &pld->cpd, pld->cpd.lpConsole->uFontFamily, pld->cpd.lpFaceName, pld->cpd.lpConsole->dwFontSize, pld->cpd.lpConsole->uFontWeight); // Mark the console data as current pld->cpd.bConDirty = FALSE; // add console settings property sheet psp.dwSize = SIZEOF( psp ); psp.dwFlags = PSP_DEFAULT; psp.hInstance = HINST_THISDLL; psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_SETTINGS); psp.pfnDlgProc = _ConsoleSettingsDlgProc; psp.lParam = (LPARAM)pld; hpage = CreatePropertySheetPage( &psp ); if (hpage) { if (!pfnAddPage(hpage, lParam)) { DestroyPropertySheetPage(hpage); goto Exit; } } else { if (pld->cpd.lpConsole) { LocalFree( pld->cpd.lpConsole ); pld->cpd.lpConsole = NULL; } if (pld->cpd.lpFEConsole) { LocalFree( pld->cpd.lpFEConsole ); pld->cpd.lpFEConsole = NULL; } goto Exit; } // add font selection property sheet psp.dwSize = SIZEOF( psp ); psp.dwFlags = PSP_DEFAULT; psp.hInstance = HINST_THISDLL; psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_FONTDLG); psp.pfnDlgProc = _FontDlgProc; psp.lParam = (LPARAM)pld; hpage = CreatePropertySheetPage( &psp ); if (hpage) { if (!pfnAddPage(hpage, lParam)) { DestroyPropertySheetPage(hpage); goto Exit; } } else { if (pld->cpd.lpConsole) { LocalFree( pld->cpd.lpConsole ); pld->cpd.lpConsole = NULL; } if (pld->cpd.lpFEConsole) { LocalFree( pld->cpd.lpFEConsole ); pld->cpd.lpFEConsole = NULL; } goto Exit; } // add console size propery sheet psp.dwSize = SIZEOF( psp ); psp.dwFlags = PSP_DEFAULT; psp.hInstance = HINST_THISDLL; psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_SCRBUFSIZE); psp.pfnDlgProc = _ScreenSizeDlgProc; psp.lParam = (LPARAM)pld; hpage = CreatePropertySheetPage( &psp ); if (hpage) { if (!pfnAddPage(hpage, lParam)) { DestroyPropertySheetPage(hpage); goto Exit; } } else { if (pld->cpd.lpConsole) { LocalFree( pld->cpd.lpConsole ); pld->cpd.lpConsole = NULL; } goto Exit; } // add console color propery sheet psp.dwSize = SIZEOF( psp ); psp.dwFlags = PSP_DEFAULT; psp.hInstance = HINST_THISDLL; psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_COLOR); psp.pfnDlgProc = _ColorDlgProc; psp.lParam = (LPARAM)pld; hpage = CreatePropertySheetPage( &psp ); if (hpage) { if (!pfnAddPage(hpage, lParam)) { DestroyPropertySheetPage(hpage); goto Exit; } } else { if (pld->cpd.lpConsole) { LocalFree( pld->cpd.lpConsole ); pld->cpd.lpConsole = NULL; } if (pld->cpd.lpFEConsole) { LocalFree( pld->cpd.lpFEConsole ); pld->cpd.lpFEConsole = NULL; } goto Exit; } #ifdef ADVANCED_PAGE // add "advanced" settings propery sheet psp.dwSize = SIZEOF( psp ); psp.dwFlags = PSP_DEFAULT; psp.hInstance = HINST_THISDLL; psp.pszTemplate = MAKEINTRESOURCE(IDD_CONSOLE_ADVANCED); psp.pfnDlgProc = _AdvancedDlgProc; psp.lParam = (LPARAM)pld; hpage = CreatePropertySheetPage( &psp ); if (hpage) { if (!pfnAddPage(hpage, lParam)) { DestroyPropertySheetPage(hpage); goto Exit; } } else { if (pld->cpd.lpConsole) { LocalFree( pld->cpd.lpConsole ); pld->cpd.lpConsole = NULL; } if (pld->cpd.lpFEConsole) { LocalFree( pld->cpd.lpFEConsole ); pld->cpd.lpFEConsole = NULL; } goto Exit; } #endif Exit: ; }