From 125809842e1ff0a550e1700cb03464bc48689771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 23 Jan 2007 17:14:32 +0000 Subject: [PATCH] Added special VESA mode support to the Screen preferences: the "Refresh Rate:" menu field will be hidden, and on resolution change, you get a message that tells you that the change will take effect with the next reboot. The "vesa" mode file will be written on exit if any changes were made. This closes bug #547. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19917 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/preferences/screen/ScreenWindow.cpp | 120 +++++++++++++++++++----- src/preferences/screen/ScreenWindow.h | 7 +- 2 files changed, 100 insertions(+), 27 deletions(-) diff --git a/src/preferences/screen/ScreenWindow.cpp b/src/preferences/screen/ScreenWindow.cpp index 074f00af74..b12495e3cb 100644 --- a/src/preferences/screen/ScreenWindow.cpp +++ b/src/preferences/screen/ScreenWindow.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006, Haiku. + * Copyright 2001-2007, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -12,25 +12,6 @@ */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - #include "AlertWindow.h" #include "Constants.h" #include "RefreshWindow.h" @@ -48,9 +29,31 @@ * It will be replaced as soon as we introduce an updated accelerant interface * which may even happen before R1 hits the streets. */ - #include "multimon.h" // the usual: DANGER WILL, ROBINSON! +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + const char* kBackgroundsSignature = "application/x-vnd.haiku-backgrounds"; @@ -208,11 +211,17 @@ stack_and_align_menu_fields(const BList& menuFields) ScreenWindow::ScreenWindow(ScreenSettings *settings) : BWindow(settings->WindowFrame(), "Screen", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE, B_ALL_WORKSPACES), + fIsVesa(false), + fVesaApplied(false), fScreenMode(this), fChangingAllWorkspaces(false) { BScreen screen(this); + accelerant_device_info info; + if (screen.GetDeviceInfo(&info) == B_OK && !strcasecmp(info.chipset, "VESA")) + fIsVesa = true; + fScreenMode.Get(fOriginal); fActive = fSelected = fOriginal; @@ -228,7 +237,11 @@ ScreenWindow::ScreenWindow(ScreenSettings *settings) fAllWorkspacesItem = new BMenuItem("All Workspaces", new BMessage(WORKSPACE_CHECK_MSG)); popUpMenu->AddItem(fAllWorkspacesItem); BMenuItem *item = new BMenuItem("Current Workspace", new BMessage(WORKSPACE_CHECK_MSG)); - item->SetMarked(true); + if (_IsVesa()) { + fAllWorkspacesItem->SetMarked(true); + item->SetEnabled(false); + } else + item->SetMarked(true); popUpMenu->AddItem(item); BMenuField* workspaceMenuField = new BMenuField(BRect(0, 0, 100, 15), @@ -351,6 +364,8 @@ ScreenWindow::ScreenWindow(ScreenSettings *settings) } fRefreshField = new BMenuField(rect, "RefreshMenu", "Refresh Rate:", fRefreshMenu, true); + if (_IsVesa()) + fRefreshField->Hide(); fControlsBox->AddChild(fRefreshField); view->AddChild(fControlsBox); @@ -497,6 +512,17 @@ bool ScreenWindow::QuitRequested() { fSettings->SetWindowFrame(Frame()); + if (fVesaApplied) { + status_t status = _WriteVesaModeFile(fSelected); + if (status < B_OK) { + BString warning = "Could not write VESA mode settings file:\n\t"; + warning << strerror(status); + (new BAlert("VesaAlert", warning.String(), "Okay", NULL, NULL, + B_WIDTH_AS_USUAL, B_WARNING_ALERT))->Go(); + + } + } + be_app->PostMessage(B_QUIT_REQUESTED); return BWindow::QuitRequested(); @@ -708,16 +734,16 @@ ScreenWindow::UpdateControls() } -/** reflect active mode in chosen settings */ - +/*! Reflect active mode in chosen settings */ void ScreenWindow::UpdateActiveMode() { - // usually, this function gets called after a mode + // Usually, this function gets called after a mode // has been set manually; still, as the graphics driver // is free to fiddle with mode passed, we better ask // what kind of mode we actually got - fScreenMode.Get(fActive); + if (!fVesaApplied) + fScreenMode.Get(fActive); fSelected = fActive; UpdateControls(); @@ -945,6 +971,37 @@ ScreenWindow::MessageReceived(BMessage* message) } +status_t +ScreenWindow::_WriteVesaModeFile(const screen_mode& mode) const +{ + BPath path; + status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path, true); + if (status < B_OK) + return status; + + path.Append("kernel/drivers"); + status = create_directory(path.Path(), 0755); + if (status < B_OK) + return status; + + path.Append("vesa"); + BFile file; + status = file.SetTo(path.Path(), B_CREATE_FILE | B_WRITE_ONLY | B_ERASE_FILE); + if (status < B_OK) + return status; + + char buffer[256]; + snprintf(buffer, sizeof(buffer), "mode %ld %ld %ld\n", + mode.width, mode.height, mode.BitsPerPixel()); + + ssize_t bytesWritten = file.Write(buffer, strlen(buffer)); + if (bytesWritten < B_OK) + return bytesWritten; + + return B_OK; +} + + bool ScreenWindow::CanApply() const { @@ -976,6 +1033,17 @@ ScreenWindow::CheckApplyEnabled() void ScreenWindow::Apply() { + if (_IsVesa()) { + (new BAlert("VesaAlert", + "Your graphics card is not supported. Resolution changes will be " + "adopted on next system startup.\n", "Okay", NULL, NULL, B_WIDTH_AS_USUAL, + B_INFO_ALERT))->Go(NULL); + + fVesaApplied = true; + fActive = fSelected; + return; + } + if (fAllWorkspacesItem->IsMarked()) { BAlert *workspacesAlert = new BAlert("WorkspacesAlert", "Change all workspaces? This action cannot be reverted.", "Okay", "Cancel", diff --git a/src/preferences/screen/ScreenWindow.h b/src/preferences/screen/ScreenWindow.h index 59085e054d..e09950dd4d 100644 --- a/src/preferences/screen/ScreenWindow.h +++ b/src/preferences/screen/ScreenWindow.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2005, Haiku. + * Copyright 2001-2007, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -52,10 +52,15 @@ class ScreenWindow : public BWindow { bool CanApply() const; bool CanRevert() const; + status_t _WriteVesaModeFile(const screen_mode& mode) const; + bool _IsVesa() const { return fIsVesa; } + void LayoutControls(uint32 flags); BRect LayoutMenuFields(uint32 flags, bool sideBySide = false); ScreenSettings* fSettings; + bool fIsVesa; + bool fVesaApplied; BBox* fScreenBox; BBox* fControlsBox;