VOID PropertiesUpdate( IN PCONSOLE_INFORMATION Console, IN HANDLE hClientSection ) /*++ Updates the console state from information sent by the properties dialog box. --*/ { HANDLE hSection; ULONG ulViewSize; NTSTATUS Status; PCONSOLE_STATE_INFO pStateInfo; PCONSOLE_PROCESS_HANDLE ProcessHandleRecord; PSCREEN_INFORMATION ScreenInfo; ULONG FontIndex; WINDOWPLACEMENT wp; COORD NewSize; /* * Map the shared memory block handle into our address space. */ ProcessHandleRecord = CONTAINING_RECORD(Console->ProcessHandleList.Blink, CONSOLE_PROCESS_HANDLE, ListLink); Status = NtDuplicateObject(ProcessHandleRecord->ProcessHandle, hClientSection, NtCurrentProcess(), &hSection, 0, 0, DUPLICATE_SAME_ACCESS); if (!NT_SUCCESS(Status)) { KdPrint(("CONSRV: error %x mapping client handle\n", Status)); return; } /* * Get a pointer to the shared memory block. */ pStateInfo = NULL; ulViewSize = 0; Status = NtMapViewOfSection(hSection, NtCurrentProcess(), &pStateInfo, 0, 0, NULL, &ulViewSize, ViewUnmap, 0, PAGE_READONLY); if (!NT_SUCCESS(Status)) { KdPrint(("CONSRV: error %x mapping view of file\n", Status)); NtClose(hSection); return; } /* * Verify the size of the shared memory block. */ if (ulViewSize < sizeof(CONSOLE_STATE_INFO)) { KdPrint(("CONSRV: sizeof(hSection) < sizeof(CONSOLE_STATE_INFO)\n")); NtUnmapViewOfSection(NtCurrentProcess(), pStateInfo); NtClose(hSection); return; } /* * Update the console state from the supplied values. */ ScreenInfo = Console->CurrentScreenBuffer; if (!(Console->Flags & CONSOLE_VDM_REGISTERED) && (pStateInfo->ScreenBufferSize.X != ScreenInfo->ScreenBufferSize.X || pStateInfo->ScreenBufferSize.Y != ScreenInfo->ScreenBufferSize.Y)) { ResizeScreenBuffer(ScreenInfo, pStateInfo->ScreenBufferSize, TRUE); } FontIndex = FindCreateFont(pStateInfo->FontFamily, pStateInfo->FaceName, pStateInfo->FontSize, pStateInfo->FontWeight); SetScreenBufferFont(ScreenInfo, FontIndex); SetCursorInformation(ScreenInfo, pStateInfo->CursorSize, ScreenInfo->BufferInfo.TextInfo.CursorVisible); NewSize.X = min(pStateInfo->WindowSize.X, ScreenInfo->MaximumWindowSize.X); NewSize.Y = min(pStateInfo->WindowSize.Y, ScreenInfo->MaximumWindowSize.Y); if (NewSize.X != CONSOLE_WINDOW_SIZE_X(ScreenInfo) || NewSize.Y != CONSOLE_WINDOW_SIZE_Y(ScreenInfo)) { wp.length = sizeof(wp); GetWindowPlacement(Console->hWnd, &wp); wp.rcNormalPosition.right += (NewSize.X - CONSOLE_WINDOW_SIZE_X(ScreenInfo)) * SCR_FONTSIZE(ScreenInfo).X; wp.rcNormalPosition.bottom += (NewSize.Y - CONSOLE_WINDOW_SIZE_Y(ScreenInfo)) * SCR_FONTSIZE(ScreenInfo).Y; SetWindowPlacement(Console->hWnd, &wp); } #ifdef i386 if (FullScreenInitialized) { if (pStateInfo->FullScreen == FALSE) { if (Console->FullScreenFlags & CONSOLE_FULLSCREEN) { ConvertToWindowed(Console); ASSERT(!(Console->FullScreenFlags & CONSOLE_FULLSCREEN_HARDWARE)); Console->FullScreenFlags = 0; ChangeDispSettings(Console, Console->hWnd, 0); } } else { if (Console->FullScreenFlags == 0) { ConvertToFullScreen(Console); Console->FullScreenFlags |= CONSOLE_FULLSCREEN; ChangeDispSettings(Console, Console->hWnd, CDS_FULLSCREEN); } } } #endif if (pStateInfo->QuickEdit) { Console->Flags |= CONSOLE_QUICK_EDIT_MODE; } else { Console->Flags &= ~CONSOLE_QUICK_EDIT_MODE; } if (pStateInfo->AutoPosition) { Console->Flags |= CONSOLE_AUTO_POSITION; } else { Console->Flags &= ~CONSOLE_AUTO_POSITION; SetWindowPos(Console->hWnd, NULL, pStateInfo->WindowPosX, pStateInfo->WindowPosY, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } if (Console->InsertMode != pStateInfo->InsertMode) { SetCursorMode(ScreenInfo, FALSE); Console->InsertMode = pStateInfo->InsertMode; } RtlCopyMemory(Console->ColorTable, pStateInfo->ColorTable, sizeof(Console->ColorTable)); SetScreenColors(ScreenInfo, pStateInfo->ScreenAttributes, pStateInfo->PopupAttributes, TRUE); Console->CommandHistorySize = pStateInfo->HistoryBufferSize; Console->MaxCommandHistories = pStateInfo->NumberOfHistoryBuffers; if (pStateInfo->HistoryNoDup) { Console->Flags |= CONSOLE_HISTORY_NODUP; } else { Console->Flags &= ~CONSOLE_HISTORY_NODUP; } NtUnmapViewOfSection(NtCurrentProcess(), pStateInfo); NtClose(hSection); return; }
bool GLContextWGL::ResizeOffscreen(const gfxIntSize& aNewSize) { return ResizeScreenBuffer(aNewSize); }
NTSTATUS SetScreenBufferFont( IN PSCREEN_INFORMATION ScreenInfo, IN ULONG FontIndex ) { COORD FontSize; NTSTATUS Status; ULONG ulFlagPrev; DBGFONTS(("SetScreenBufferFont %lx %x\n", ScreenInfo, FontIndex)); if (ScreenInfo == NULL) { /* If shutdown occurs with font dlg up */ return STATUS_SUCCESS; } /* * Don't try to set the font if we're not in text mode */ if (!(ScreenInfo->Flags & CONSOLE_TEXTMODE_BUFFER)) { return STATUS_UNSUCCESSFUL; } Status = GetFontSize(FontIndex, &FontSize); if (!NT_SUCCESS(Status)) { return((ULONG) Status); } ulFlagPrev = ScreenInfo->Flags; if (TM_IS_TT_FONT(FontInfo[FontIndex].Family)) { ScreenInfo->Flags &= ~CONSOLE_OEMFONT_DISPLAY; } else { ScreenInfo->Flags |= CONSOLE_OEMFONT_DISPLAY; } /* * Convert from UnicodeOem to Unicode or vice-versa if necessary */ if ((ulFlagPrev & CONSOLE_OEMFONT_DISPLAY) != (ScreenInfo->Flags & CONSOLE_OEMFONT_DISPLAY)) { if (ulFlagPrev & CONSOLE_OEMFONT_DISPLAY) { /* * Must convert from UnicodeOem to real Unicode */ DBGCHARS(("SetScreenBufferFont converts UnicodeOem to Unicode\n")); FalseUnicodeToRealUnicode( ScreenInfo->BufferInfo.TextInfo.TextRows, ScreenInfo->ScreenBufferSize.X * ScreenInfo->ScreenBufferSize.Y, ScreenInfo->Console->OutputCP); } else { /* * Must convert from real Unicode to UnicodeOem */ DBGCHARS(("SetScreenBufferFont converts Unicode to UnicodeOem\n")); RealUnicodeToFalseUnicode( ScreenInfo->BufferInfo.TextInfo.TextRows, ScreenInfo->ScreenBufferSize.X * ScreenInfo->ScreenBufferSize.Y, ScreenInfo->Console->OutputCP); } } /* * Store font properties */ SCR_FONTNUMBER(ScreenInfo) = FontIndex; SCR_FONTSIZE(ScreenInfo) = FontSize; SCR_FAMILY(ScreenInfo) = FontInfo[FontIndex].Family; SCR_FONTWEIGHT(ScreenInfo) = FontInfo[FontIndex].Weight; wcscpy(SCR_FACENAME(ScreenInfo), FontInfo[FontIndex].FaceName); // // set font // Status = SetFont(ScreenInfo); if (!NT_SUCCESS(Status)) { return((ULONG) Status); } ScreenInfo->MinX = (SHORT)((MinimumWidthX - VerticalClientToWindow + FontSize.X - 1) / FontSize.X); ScreenInfo->MaximumWindowSize.X = min(CONSOLE_MAXIMUM_WINDOW_SIZE_X(ScreenInfo),ScreenInfo->ScreenBufferSize.X); ScreenInfo->MaximumWindowSize.Y = min(CONSOLE_MAXIMUM_WINDOW_SIZE_Y(ScreenInfo),ScreenInfo->ScreenBufferSize.Y); ScreenInfo->MaxWindow.X = ScreenInfo->MaximumWindowSize.X*FontSize.X + VerticalClientToWindow; ScreenInfo->MaxWindow.Y = ScreenInfo->MaximumWindowSize.Y*FontSize.Y + HorizontalClientToWindow; // // if window is growing, make sure it's not bigger than the screen. // if (ScreenInfo->MaximumWindowSize.X < CONSOLE_WINDOW_SIZE_X(ScreenInfo)) { ScreenInfo->Window.Right -= CONSOLE_WINDOW_SIZE_X(ScreenInfo) - ScreenInfo->MaximumWindowSize.X; ScreenInfo->WindowMaximizedX = (ScreenInfo->Window.Left == 0 && (SHORT)(ScreenInfo->Window.Right+1) == ScreenInfo->ScreenBufferSize.X); } if (ScreenInfo->MaximumWindowSize.Y < CONSOLE_WINDOW_SIZE_Y(ScreenInfo)) { ScreenInfo->Window.Bottom -= CONSOLE_WINDOW_SIZE_Y(ScreenInfo) - ScreenInfo->MaximumWindowSize.Y; if (ScreenInfo->BufferInfo.TextInfo.CursorPosition.Y > ScreenInfo->Window.Bottom) { ScreenInfo->Window.Top += ScreenInfo->BufferInfo.TextInfo.CursorPosition.Y - ScreenInfo->Window.Bottom; ScreenInfo->Window.Bottom += ScreenInfo->BufferInfo.TextInfo.CursorPosition.Y - ScreenInfo->Window.Bottom; } ScreenInfo->WindowMaximizedY = (ScreenInfo->Window.Top == 0 && (SHORT)(ScreenInfo->Window.Bottom+1) == ScreenInfo->ScreenBufferSize.Y); } if (ScreenInfo->MinX > CONSOLE_WINDOW_SIZE_X(ScreenInfo)) { if (ScreenInfo->MinX > ScreenInfo->ScreenBufferSize.X) { COORD NewBufferSize; NewBufferSize.X = ScreenInfo->MinX; NewBufferSize.Y = ScreenInfo->ScreenBufferSize.Y; ResizeScreenBuffer(ScreenInfo, NewBufferSize, FALSE ); } if ((ScreenInfo->Window.Left+ScreenInfo->MinX) > ScreenInfo->ScreenBufferSize.X) { ScreenInfo->Window.Left = 0; ScreenInfo->Window.Right = ScreenInfo->MinX-1; } else { ScreenInfo->Window.Right = ScreenInfo->Window.Left+ScreenInfo->MinX-1; } ScreenInfo->WindowMaximizedX = (ScreenInfo->Window.Left == 0 && (SHORT)(ScreenInfo->Window.Right+1) == ScreenInfo->ScreenBufferSize.X); } // // resize window. this will take care of the scroll bars too. // if (ACTIVE_SCREEN_BUFFER(ScreenInfo)) { SetWindowSize(ScreenInfo); } // // adjust cursor size. // SetCursorInformation(ScreenInfo, ScreenInfo->BufferInfo.TextInfo.CursorSize, (BOOLEAN)ScreenInfo->BufferInfo.TextInfo.CursorVisible ); WriteToScreen(ScreenInfo, &ScreenInfo->Window); return STATUS_SUCCESS; }