Rewrote VirtualMemory, added some Haiku specific functionality (currently disabled).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13570 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,10 +1,20 @@
|
|||||||
SubDir OBOS_TOP src preferences virtualmemory ;
|
SubDir OBOS_TOP src preferences virtualmemory ;
|
||||||
|
|
||||||
|
if $(TARGET_PLATFORM) = r5 {
|
||||||
|
DRIVER_SETTINGS = driver_settings.c ;
|
||||||
|
}
|
||||||
|
|
||||||
Preference VirtualMemory :
|
Preference VirtualMemory :
|
||||||
main.cpp
|
VirtualMemory.cpp
|
||||||
Pref_Utils.cpp
|
SettingsWindow.cpp
|
||||||
MainWindow.cpp
|
Settings.cpp
|
||||||
VMSettings.cpp
|
$(DRIVER_SETTINGS)
|
||||||
: libbe.so libstdc++.r4.so
|
|
||||||
|
: libbe.so libstdc++.r4.so libroot.so
|
||||||
: VirtualMemory.rdef
|
: VirtualMemory.rdef
|
||||||
;
|
;
|
||||||
|
|
||||||
|
if $(TARGET_PLATFORM) = r5 {
|
||||||
|
SEARCH on [ FGristFiles driver_settings.c ] +=
|
||||||
|
[ FDirName $(OBOS_TOP) src system libroot os ] ;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,259 +0,0 @@
|
|||||||
/*! \file MainWindow.cpp
|
|
||||||
* \brief Code for the MainWindow class.
|
|
||||||
*
|
|
||||||
* Displays the main window, the essence of the app.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "MainWindow.h"
|
|
||||||
#include "Pref_Utils.h"
|
|
||||||
|
|
||||||
#include <String.h>
|
|
||||||
|
|
||||||
const char *kRequestStr = "Requested swap file size: ";
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
* @param frame The size to make the window.
|
|
||||||
* @param physMem The amount of physical memory in the machine.
|
|
||||||
* @param currSwp The current swap file size.
|
|
||||||
* @param minVal The minimum value of the swap file.
|
|
||||||
* @param maxSwapVal The maximum value of the swap file.
|
|
||||||
*/
|
|
||||||
MainWindow::MainWindow(BRect frame, int physMemVal, int currSwapVal, int minVal, int maxSwapVal, VMSettings *Settings)
|
|
||||||
:BWindow(frame, "VirtualMemory", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE){
|
|
||||||
|
|
||||||
fSettings = Settings;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the fill color for the "used" portion of the slider.
|
|
||||||
*/
|
|
||||||
rgb_color fillColor = { 0, 102, 152, 255 };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up variables to help handle font sensitivity
|
|
||||||
*/
|
|
||||||
float fontheight = FontHeight(true, NULL);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* boxRect sets the size of the visible box around the string views and
|
|
||||||
* the slider.
|
|
||||||
*/
|
|
||||||
BRect boxRect = Bounds();
|
|
||||||
boxRect.InsetBy(11, 11);
|
|
||||||
boxRect.bottom -= 25;
|
|
||||||
|
|
||||||
BString labels;
|
|
||||||
forigMemSize = currSwapVal;
|
|
||||||
fminSwapVal = minVal;
|
|
||||||
|
|
||||||
BRect rect(0.0, 0.0, boxRect.Width() -20.0, fontheight);
|
|
||||||
rect.OffsetTo(10.0, 10.0);
|
|
||||||
/**
|
|
||||||
* Set up the "Physical Memory" label.
|
|
||||||
*/
|
|
||||||
BStringView *physMem;
|
|
||||||
labels << "Physical memory: " << physMemVal << " MB";
|
|
||||||
physMem = new BStringView(rect, "PhysicalMemory", labels.String(), B_FOLLOW_ALL, B_WILL_DRAW);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up the "Current Swap File Size" label.
|
|
||||||
*/
|
|
||||||
BStringView *currSwap;
|
|
||||||
rect.OffsetBy(0, rect.Height() +5);
|
|
||||||
labels = "Current swap file size: ";
|
|
||||||
labels << currSwapVal << " MB";
|
|
||||||
currSwap = new BStringView(rect, "CurrentSwapSize", labels.String(), B_FOLLOW_ALL, B_WILL_DRAW);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up the "Requested Swap File Size" label.
|
|
||||||
*/
|
|
||||||
rect.OffsetBy(0, rect.Height() +5);
|
|
||||||
labels = kRequestStr;
|
|
||||||
labels << currSwapVal << " MB";
|
|
||||||
/**
|
|
||||||
* Set up the slider.
|
|
||||||
*/
|
|
||||||
BString sliderMinLabel;
|
|
||||||
BString sliderMaxLabel;
|
|
||||||
sliderMinLabel << fminSwapVal << " MB";
|
|
||||||
sliderMaxLabel << maxSwapVal << " MB";
|
|
||||||
|
|
||||||
rect.bottom = rect.top+2;
|
|
||||||
freqSizeSlider = new BSlider(rect, "ReqSwapSizeSlider", labels.String(),
|
|
||||||
new BMessage(MEMORY_SLIDER_MSG), fminSwapVal, maxSwapVal, B_TRIANGLE_THUMB, B_FOLLOW_LEFT, B_WILL_DRAW);
|
|
||||||
|
|
||||||
freqSizeSlider->SetLimitLabels(sliderMinLabel.String(), sliderMaxLabel.String());
|
|
||||||
freqSizeSlider->UseFillColor(true, &fillColor);
|
|
||||||
freqSizeSlider->SetModificationMessage(new BMessage(SLIDER_UPDATE_MSG));
|
|
||||||
|
|
||||||
freqSizeSlider->SetValue(currSwapVal);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the restart notice view.
|
|
||||||
*/
|
|
||||||
rect = freqSizeSlider->Frame();
|
|
||||||
rect.top = rect.bottom +2;
|
|
||||||
rect.bottom = rect.top +fontheight;
|
|
||||||
frestart = new BStringView(rect, "RestartMessage", B_EMPTY_STRING, B_FOLLOW_ALL, B_WILL_DRAW);
|
|
||||||
frestart->SetAlignment(B_ALIGN_CENTER);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This view holds the three labels and the slider.
|
|
||||||
*/
|
|
||||||
|
|
||||||
BBox *boxView;
|
|
||||||
boxView = new BBox(boxRect, "BoxView", B_FOLLOW_ALL, B_WILL_DRAW, B_FANCY_BORDER);
|
|
||||||
boxView->AddChild(freqSizeSlider);
|
|
||||||
boxView->AddChild(physMem);
|
|
||||||
boxView->AddChild(currSwap);
|
|
||||||
boxView->AddChild(frestart);
|
|
||||||
|
|
||||||
rect.Set(0.0, 0.0, 75.0, 20.0);
|
|
||||||
BButton *defaultButton;
|
|
||||||
rect.OffsetTo(10, boxRect.bottom +5);
|
|
||||||
defaultButton = new BButton(rect, "DefaultButton", "Default",
|
|
||||||
new BMessage(DEFAULT_BUTTON_MSG), B_FOLLOW_ALL, B_WILL_DRAW);
|
|
||||||
rect.OffsetBy(85, 0);
|
|
||||||
frevertButton = new BButton(rect, "RevertButton", "Revert",
|
|
||||||
new BMessage(REVERT_BUTTON_MSG), B_FOLLOW_ALL, B_WILL_DRAW);
|
|
||||||
frevertButton->SetEnabled(false);
|
|
||||||
|
|
||||||
BBox *topLevelView;
|
|
||||||
topLevelView = new BBox(Bounds(), "TopLevelView", B_FOLLOW_ALL, B_WILL_DRAW, B_PLAIN_BORDER);
|
|
||||||
topLevelView->AddChild(boxView);
|
|
||||||
topLevelView->AddChild(defaultButton);
|
|
||||||
topLevelView->AddChild(frevertButton);
|
|
||||||
|
|
||||||
AddChild(topLevelView);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays the "Changes will take effect on restart" message.
|
|
||||||
* @param setTo If true, displays the message If false, un-displays it.
|
|
||||||
*/
|
|
||||||
void MainWindow::toggleChangedMessage(bool setTo){
|
|
||||||
|
|
||||||
BString message = B_EMPTY_STRING;
|
|
||||||
if (setTo) {
|
|
||||||
frevertButton->SetEnabled(true);
|
|
||||||
message << "Changes will take effect on restart.";
|
|
||||||
} else {
|
|
||||||
frevertButton->SetEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
frestart->SetText(message.String());
|
|
||||||
}//toggleChangedMessage
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles messages.
|
|
||||||
* @param message The message recieved by the window.
|
|
||||||
*/
|
|
||||||
void MainWindow::MessageReceived(BMessage *message){
|
|
||||||
|
|
||||||
switch(message->what){
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the requested swap file size during a drag.
|
|
||||||
*/
|
|
||||||
case SLIDER_UPDATE_MSG:
|
|
||||||
{
|
|
||||||
int32 currVal = freqSizeSlider->Value();
|
|
||||||
BString label(kRequestStr);
|
|
||||||
label << currVal << " MB";
|
|
||||||
freqSizeSlider->SetLabel(label.String());
|
|
||||||
|
|
||||||
if (currVal != forigMemSize)
|
|
||||||
toggleChangedMessage(true);
|
|
||||||
else
|
|
||||||
toggleChangedMessage(false);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Case where the slider was moved.
|
|
||||||
* Resets the "Requested Swap File Size" label to the new value.
|
|
||||||
*/
|
|
||||||
case MEMORY_SLIDER_MSG:
|
|
||||||
{
|
|
||||||
int32 currVal = freqSizeSlider->Value();
|
|
||||||
BString label(kRequestStr);
|
|
||||||
label << currVal << " MB";
|
|
||||||
freqSizeSlider->SetLabel(label.String());
|
|
||||||
|
|
||||||
if (currVal != forigMemSize)
|
|
||||||
toggleChangedMessage(true);
|
|
||||||
else
|
|
||||||
toggleChangedMessage(false);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Case where the default button was pressed.
|
|
||||||
* Eventually will set the swap file size to the optimum size,
|
|
||||||
* as decided by this app (as soon as I can figure out how to
|
|
||||||
* do that).
|
|
||||||
*/
|
|
||||||
case DEFAULT_BUTTON_MSG:
|
|
||||||
{
|
|
||||||
freqSizeSlider->SetValue(fminSwapVal);
|
|
||||||
BString label(kRequestStr);
|
|
||||||
label << fminSwapVal << " MB";
|
|
||||||
freqSizeSlider->SetLabel(label.String());
|
|
||||||
|
|
||||||
if(fminSwapVal != forigMemSize)
|
|
||||||
toggleChangedMessage(true);
|
|
||||||
else
|
|
||||||
toggleChangedMessage(false);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Case where the revert button was pressed.
|
|
||||||
* Returns things to the way they were when the app was started,
|
|
||||||
* which is not necessarily the default size.
|
|
||||||
*/
|
|
||||||
case REVERT_BUTTON_MSG:
|
|
||||||
{
|
|
||||||
frevertButton->SetEnabled(false);
|
|
||||||
BString label(kRequestStr);
|
|
||||||
label << forigMemSize << " MB";
|
|
||||||
freqSizeSlider->SetLabel(label.String());
|
|
||||||
freqSizeSlider->SetValue(forigMemSize);
|
|
||||||
toggleChangedMessage(false);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Unhandled messages get passed to BWindow.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
BWindow::MessageReceived(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Quits and Saves.
|
|
||||||
* Sets the swap size and turns the virtual memory on by writing to the
|
|
||||||
* /boot/home/config/settings/kernel/drivers/virtual_memory file.
|
|
||||||
*/
|
|
||||||
bool MainWindow::QuitRequested(){
|
|
||||||
|
|
||||||
if (freqSizeSlider->Value() != forigMemSize) {
|
|
||||||
FILE *settingsFile = fopen("/boot/home/config/settings/kernel/drivers/virtual_memory", "w");
|
|
||||||
fprintf(settingsFile, "vm on\n");
|
|
||||||
fprintf(settingsFile, "swap_size %d\n", (int(freqSizeSlider->Value()) * 1048576));
|
|
||||||
fclose(settingsFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
|
||||||
return true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::FrameMoved(BPoint origin)
|
|
||||||
{
|
|
||||||
fSettings->SetWindowPosition(Frame());
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
/*! \file MainWindow.h
|
|
||||||
\brief Header for the MainWindow class.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MAIN_WINDOW_H
|
|
||||||
#define MAIN_WINDOW_H
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Default button message.
|
|
||||||
*/
|
|
||||||
#define DEFAULT_BUTTON_MSG 'dflt'
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Revert button message.
|
|
||||||
*/
|
|
||||||
#define REVERT_BUTTON_MSG 'rvrt'
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Slider message.
|
|
||||||
*/
|
|
||||||
#define MEMORY_SLIDER_MSG 'sldr'
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Slider dragging message.
|
|
||||||
*/
|
|
||||||
#define SLIDER_UPDATE_MSG 'sldu'
|
|
||||||
|
|
||||||
#include <Application.h>
|
|
||||||
#include <Box.h>
|
|
||||||
#include <Button.h>
|
|
||||||
#include <Slider.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <StringView.h>
|
|
||||||
#include <Window.h>
|
|
||||||
|
|
||||||
#include "VMSettings.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The main window of the app.
|
|
||||||
*
|
|
||||||
* Sets up and displays everything you need for the app.
|
|
||||||
*/
|
|
||||||
class MainWindow : public BWindow{
|
|
||||||
private:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the size of the swap file when the app is started
|
|
||||||
* so that it can be restored later if need be.
|
|
||||||
*/
|
|
||||||
int forigMemSize;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the minimum virtual memory value;
|
|
||||||
*/
|
|
||||||
int fminSwapVal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The slider that lets you adjust the size of the swap file.
|
|
||||||
*/
|
|
||||||
BSlider *freqSizeSlider;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The button that returns the swap file to the original
|
|
||||||
* size.
|
|
||||||
*/
|
|
||||||
BButton *frevertButton;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The BStringView that informs you that you need to
|
|
||||||
* restart.
|
|
||||||
*/
|
|
||||||
BStringView *frestart;
|
|
||||||
|
|
||||||
VMSettings *fSettings;
|
|
||||||
|
|
||||||
public:
|
|
||||||
MainWindow(BRect frame, int physMem, int currSwp, int sliderMin, int sliderMax, VMSettings *fSettings);
|
|
||||||
virtual bool QuitRequested();
|
|
||||||
virtual void MessageReceived(BMessage *message);
|
|
||||||
virtual void FrameMoved(BPoint origin);
|
|
||||||
virtual void toggleChangedMessage(bool setTo);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#include "Pref_Utils.h"
|
|
||||||
|
|
||||||
float
|
|
||||||
FontHeight(bool full, BView* target)
|
|
||||||
{
|
|
||||||
font_height finfo;
|
|
||||||
if (target != NULL)
|
|
||||||
target->GetFontHeight(&finfo);
|
|
||||||
else
|
|
||||||
be_plain_font->GetHeight(&finfo);
|
|
||||||
|
|
||||||
float height = ceil(finfo.ascent) + ceil(finfo.descent);
|
|
||||||
|
|
||||||
if (full)
|
|
||||||
height += ceil(finfo.leading);
|
|
||||||
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
color_map*
|
|
||||||
ColorMap()
|
|
||||||
{
|
|
||||||
color_map* cmap;
|
|
||||||
|
|
||||||
BScreen screen(B_MAIN_SCREEN_ID);
|
|
||||||
cmap = (color_map*)screen.ColorMap();
|
|
||||||
|
|
||||||
return cmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#ifndef SHARED_PREF_UTILS
|
|
||||||
#define SHARED_PREF_UTILS
|
|
||||||
|
|
||||||
#include <Screen.h>
|
|
||||||
#include <View.h>
|
|
||||||
|
|
||||||
float FontHeight(bool full, BView* view = NULL);
|
|
||||||
color_map* ColorMap();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
#include <File.h>
|
||||||
|
#include <Entry.h>
|
||||||
|
#include <FindDirectory.h>
|
||||||
|
#include <Path.h>
|
||||||
|
#include <Volume.h>
|
||||||
|
#include <VolumeRoster.h>
|
||||||
|
#include <driver_settings.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
static const char* kWindowSettingsFile = "VM_data";
|
||||||
|
static const char* kVirtualMemorySettings = "virtual_memory";
|
||||||
|
|
||||||
|
|
||||||
|
Settings::Settings()
|
||||||
|
:
|
||||||
|
fPositionUpdated(false),
|
||||||
|
fSwapUpdated(false)
|
||||||
|
{
|
||||||
|
ReadWindowSettings();
|
||||||
|
ReadSwapSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Settings::~Settings()
|
||||||
|
{
|
||||||
|
WriteWindowSettings();
|
||||||
|
WriteSwapSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::ReadWindowSettings()
|
||||||
|
{
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
BPath path;
|
||||||
|
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) {
|
||||||
|
path.Append(kWindowSettingsFile);
|
||||||
|
BFile file;
|
||||||
|
if (file.SetTo(path.Path(), B_READ_ONLY) == B_OK)
|
||||||
|
// Now read in the data
|
||||||
|
if (file.Read(&fWindowPosition, sizeof(BPoint)) == sizeof(BPoint))
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
fWindowPosition.Set(-1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::WriteWindowSettings()
|
||||||
|
{
|
||||||
|
if (!fPositionUpdated)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BPath path;
|
||||||
|
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) < B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
path.Append(kWindowSettingsFile);
|
||||||
|
|
||||||
|
BFile file;
|
||||||
|
if (file.SetTo(path.Path(), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE) == B_OK)
|
||||||
|
file.Write(&fWindowPosition, sizeof(BPoint));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::SetWindowPosition(BPoint position)
|
||||||
|
{
|
||||||
|
if (position == fWindowPosition)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fWindowPosition = position;
|
||||||
|
fPositionUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::ReadSwapSettings()
|
||||||
|
{
|
||||||
|
// read current swap settings from disk
|
||||||
|
void* settings = load_driver_settings("virtual_memory");
|
||||||
|
if (settings != NULL) {
|
||||||
|
fSwapEnabled = get_driver_boolean_parameter(settings, "vm", false, false);
|
||||||
|
|
||||||
|
const char* string = get_driver_parameter(settings, "swap_size", NULL, NULL);
|
||||||
|
fSwapSize = string ? atoll(string) : 0;
|
||||||
|
|
||||||
|
if (fSwapSize <= 0) {
|
||||||
|
fSwapEnabled = false;
|
||||||
|
fSwapSize = 0;
|
||||||
|
}
|
||||||
|
unload_driver_settings(settings);
|
||||||
|
} else {
|
||||||
|
// settings are not available, try to find out what the kernel is up to
|
||||||
|
// ToDo: introduce a kernel call for this!
|
||||||
|
fSwapSize = 0;
|
||||||
|
|
||||||
|
BPath path;
|
||||||
|
if (find_directory(B_COMMON_VAR_DIRECTORY, &path) == B_OK) {
|
||||||
|
path.Append("swap");
|
||||||
|
BEntry swap(path.Path());
|
||||||
|
if (swap.GetSize(&fSwapSize) != B_OK)
|
||||||
|
fSwapSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fSwapEnabled = fSwapSize != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToDo: read those as well
|
||||||
|
BVolumeRoster volumeRoster;
|
||||||
|
volumeRoster.GetBootVolume(&fSwapVolume);
|
||||||
|
|
||||||
|
fInitialSwapEnabled = fSwapEnabled;
|
||||||
|
fInitialSwapSize = fSwapSize;
|
||||||
|
fInitialSwapVolume = fSwapVolume.Device();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::WriteSwapSettings()
|
||||||
|
{
|
||||||
|
if (!SwapChanged())
|
||||||
|
return;
|
||||||
|
|
||||||
|
BPath path;
|
||||||
|
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
path.Append("kernel/drivers");
|
||||||
|
path.Append(kVirtualMemorySettings);
|
||||||
|
|
||||||
|
BFile file;
|
||||||
|
if (file.SetTo(path.Path(), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE) != B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char buffer[256];
|
||||||
|
snprintf(buffer, sizeof(buffer), "vm %s\nswap_size %Ld\n",
|
||||||
|
fSwapEnabled ? "on" : "off", fSwapSize);
|
||||||
|
|
||||||
|
file.Write(buffer, strlen(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::SetSwapEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
fSwapEnabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::SetSwapSize(off_t size)
|
||||||
|
{
|
||||||
|
fSwapSize = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::SetSwapVolume(BVolume &volume)
|
||||||
|
{
|
||||||
|
if (volume.Device() == fSwapVolume.Device()
|
||||||
|
|| volume.InitCheck() != B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fSwapVolume.SetTo(volume.Device());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::SetSwapDefaults()
|
||||||
|
{
|
||||||
|
fSwapEnabled = true;
|
||||||
|
|
||||||
|
BVolumeRoster volumeRoster;
|
||||||
|
volumeRoster.GetBootVolume(&fSwapVolume);
|
||||||
|
|
||||||
|
system_info info;
|
||||||
|
get_system_info(&info);
|
||||||
|
fSwapSize = (off_t)info.max_pages * B_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Settings::RevertSwapChanges()
|
||||||
|
{
|
||||||
|
fSwapEnabled = fInitialSwapEnabled;
|
||||||
|
fSwapSize = fInitialSwapSize;
|
||||||
|
fSwapVolume.SetTo(fInitialSwapVolume);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Settings::SwapChanged()
|
||||||
|
{
|
||||||
|
return fSwapEnabled != fInitialSwapEnabled
|
||||||
|
|| fSwapSize != fInitialSwapSize
|
||||||
|
|| fSwapVolume.Device() != fInitialSwapVolume;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef SETTINGS_H
|
||||||
|
#define SETTINGS_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <Point.h>
|
||||||
|
#include <Volume.h>
|
||||||
|
|
||||||
|
|
||||||
|
class Settings {
|
||||||
|
public :
|
||||||
|
Settings();
|
||||||
|
virtual ~Settings();
|
||||||
|
|
||||||
|
BPoint WindowPosition() const { return fWindowPosition; }
|
||||||
|
void SetWindowPosition(BPoint position);
|
||||||
|
|
||||||
|
bool SwapEnabled() const { return fSwapEnabled; }
|
||||||
|
off_t SwapSize() const { return fSwapSize; }
|
||||||
|
BVolume& SwapVolume() { return fSwapVolume; }
|
||||||
|
void SetSwapEnabled(bool enabled);
|
||||||
|
void SetSwapSize(off_t size);
|
||||||
|
void SetSwapVolume(BVolume& volume);
|
||||||
|
|
||||||
|
void SetSwapDefaults();
|
||||||
|
void RevertSwapChanges();
|
||||||
|
bool SwapChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ReadWindowSettings();
|
||||||
|
void WriteWindowSettings();
|
||||||
|
|
||||||
|
void ReadSwapSettings();
|
||||||
|
void WriteSwapSettings();
|
||||||
|
|
||||||
|
BPoint fWindowPosition;
|
||||||
|
|
||||||
|
bool fSwapEnabled;
|
||||||
|
off_t fSwapSize;
|
||||||
|
BVolume fSwapVolume;
|
||||||
|
|
||||||
|
bool fInitialSwapEnabled;
|
||||||
|
off_t fInitialSwapSize;
|
||||||
|
dev_t fInitialSwapVolume;
|
||||||
|
|
||||||
|
bool fPositionUpdated, fSwapUpdated;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* SETTINGS_H */
|
||||||
@@ -0,0 +1,366 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "SettingsWindow.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
#include <Application.h>
|
||||||
|
#include <Alert.h>
|
||||||
|
#include <Box.h>
|
||||||
|
#include <Button.h>
|
||||||
|
#include <CheckBox.h>
|
||||||
|
#include <StringView.h>
|
||||||
|
#include <String.h>
|
||||||
|
#include <Slider.h>
|
||||||
|
#include <PopUpMenu.h>
|
||||||
|
#include <MenuItem.h>
|
||||||
|
#include <MenuField.h>
|
||||||
|
#include <Screen.h>
|
||||||
|
#include <FindDirectory.h>
|
||||||
|
#include <Path.h>
|
||||||
|
#include <Volume.h>
|
||||||
|
#include <VolumeRoster.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
static const uint32 kMsgDefaults = 'dflt';
|
||||||
|
static const uint32 kMsgRevert = 'rvrt';
|
||||||
|
static const uint32 kMsgSliderUpdate = 'slup';
|
||||||
|
static const uint32 kMsgSwapEnabledUpdate = 'swen';
|
||||||
|
|
||||||
|
|
||||||
|
class SizeSlider : public BSlider {
|
||||||
|
public:
|
||||||
|
SizeSlider(BRect rect, const char* name, const char* label,
|
||||||
|
BMessage* message, int32 min, int32 max);
|
||||||
|
virtual ~SizeSlider();
|
||||||
|
|
||||||
|
virtual char* UpdateText() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
mutable BString fText;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const int64 kMegaByte = 1048576;
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
byte_string(int64 size)
|
||||||
|
{
|
||||||
|
double value = 1. * size;
|
||||||
|
static char string[64];
|
||||||
|
|
||||||
|
if (value < 1024)
|
||||||
|
snprintf(string, sizeof(string), "%Ld B", size);
|
||||||
|
else {
|
||||||
|
char *units[] = {"K", "M", "G", NULL};
|
||||||
|
int32 i = -1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
value /= 1024.0;
|
||||||
|
i++;
|
||||||
|
} while (value >= 1024 && units[i + 1]);
|
||||||
|
|
||||||
|
off_t rounded = off_t(value * 100LL);
|
||||||
|
sprintf(string, "%g %sB", rounded / 100.0, units[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
SizeSlider::SizeSlider(BRect rect, const char* name, const char* label,
|
||||||
|
BMessage* message, int32 min, int32 max)
|
||||||
|
: BSlider(rect, name, label, message, min, max)
|
||||||
|
{
|
||||||
|
rgb_color color = ui_color(B_CONTROL_HIGHLIGHT_COLOR);
|
||||||
|
UseFillColor(true, &color);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SizeSlider::~SizeSlider()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
SizeSlider::UpdateText() const
|
||||||
|
{
|
||||||
|
fText = byte_string(Value() * kMegaByte);
|
||||||
|
|
||||||
|
return const_cast<char*>(fText.String());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
SettingsWindow::SettingsWindow()
|
||||||
|
: BWindow(BRect(0, 0, 269, 172), "VirtualMemory", B_TITLED_WINDOW,
|
||||||
|
B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE)
|
||||||
|
{
|
||||||
|
// fSettings = new Settings();
|
||||||
|
|
||||||
|
BRect rect = Bounds();
|
||||||
|
BView* view = new BView(rect, "background", B_FOLLOW_ALL, B_WILL_DRAW);
|
||||||
|
view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||||
|
|
||||||
|
font_height fontHeight;
|
||||||
|
be_plain_font->GetHeight(&fontHeight);
|
||||||
|
|
||||||
|
float lineHeight = ceil(fontHeight.ascent + fontHeight.descent + fontHeight.ascent);
|
||||||
|
|
||||||
|
fSwapEnabledCheckBox = new BCheckBox(rect, "enable swap", "Enable Virtual Memory",
|
||||||
|
new BMessage(kMsgSwapEnabledUpdate));
|
||||||
|
fSwapEnabledCheckBox->SetValue(fSettings.SwapEnabled());
|
||||||
|
fSwapEnabledCheckBox->ResizeToPreferred();
|
||||||
|
|
||||||
|
rect.InsetBy(10, 10);
|
||||||
|
BBox* box = new BBox(rect, "box");
|
||||||
|
box->SetLabel(fSwapEnabledCheckBox);
|
||||||
|
view->AddChild(box);
|
||||||
|
|
||||||
|
system_info info;
|
||||||
|
get_system_info(&info);
|
||||||
|
|
||||||
|
rect.right -= 20;
|
||||||
|
rect.top = lineHeight;
|
||||||
|
BString string = "Physical Memory: ";
|
||||||
|
string << byte_string((off_t)info.max_pages * B_PAGE_SIZE);
|
||||||
|
BStringView* stringView = new BStringView(rect, "physical memory", string.String(),
|
||||||
|
B_FOLLOW_ALL);
|
||||||
|
stringView->ResizeToPreferred();
|
||||||
|
box->AddChild(stringView);
|
||||||
|
|
||||||
|
rect.OffsetBy(0, lineHeight);
|
||||||
|
string = "Current Swap File Size: ";
|
||||||
|
string << byte_string(fSettings.SwapSize());
|
||||||
|
stringView = new BStringView(rect, "current swap size", string.String(),
|
||||||
|
B_FOLLOW_ALL);
|
||||||
|
stringView->ResizeToPreferred();
|
||||||
|
box->AddChild(stringView);
|
||||||
|
|
||||||
|
BPopUpMenu* menu = new BPopUpMenu("volumes");
|
||||||
|
|
||||||
|
// collect volumes
|
||||||
|
// ToDo: listen to volume changes!
|
||||||
|
// ToDo: accept dropped volumes
|
||||||
|
|
||||||
|
BVolumeRoster volumeRoster;
|
||||||
|
BVolume volume;
|
||||||
|
while (volumeRoster.GetNextVolume(&volume) == B_OK) {
|
||||||
|
char name[B_FILE_NAME_LENGTH];
|
||||||
|
if (!volume.IsPersistent() || volume.GetName(name) != B_OK || !name[0])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BMenuItem* item = new BMenuItem(name, NULL);
|
||||||
|
menu->AddItem(item);
|
||||||
|
|
||||||
|
if (volume.Device() == fSettings.SwapVolume().Device())
|
||||||
|
item->SetMarked(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
rect.OffsetBy(0, lineHeight);
|
||||||
|
BMenuField* field = new BMenuField(rect, "devices", "Use Volume:", menu);
|
||||||
|
field->SetDivider(field->StringWidth(field->Label()) + 8);
|
||||||
|
field->ResizeToPreferred();
|
||||||
|
field->SetEnabled(false);
|
||||||
|
box->AddChild(field);
|
||||||
|
|
||||||
|
off_t minSize, maxSize;
|
||||||
|
GetSwapFileLimits(minSize, maxSize);
|
||||||
|
|
||||||
|
rect.OffsetBy(0, lineHeight + 8);
|
||||||
|
fSizeSlider = new SizeSlider(rect, "size slider", "Requested Swap File Size:",
|
||||||
|
new BMessage(kMsgSliderUpdate), minSize / kMegaByte, maxSize / kMegaByte);
|
||||||
|
fSizeSlider->SetLimitLabels("999 MB", "999 MB");
|
||||||
|
fSizeSlider->ResizeToPreferred();
|
||||||
|
box->AddChild(fSizeSlider);
|
||||||
|
|
||||||
|
rect.OffsetBy(0, fSizeSlider->Frame().Height() + 5);
|
||||||
|
rect.bottom = rect.top + stringView->Frame().Height();
|
||||||
|
fWarningStringView = new BStringView(rect, "", "", B_FOLLOW_ALL);
|
||||||
|
fWarningStringView->SetAlignment(B_ALIGN_CENTER);
|
||||||
|
box->AddChild(fWarningStringView);
|
||||||
|
|
||||||
|
box->ResizeTo(box->Frame().Width(), fWarningStringView->Frame().bottom + 10);
|
||||||
|
|
||||||
|
// Add "Defaults" and "Revert" buttons
|
||||||
|
|
||||||
|
rect.top = box->Frame().bottom + 10;
|
||||||
|
BButton* button = new BButton(rect, "defaults", "Defaults", new BMessage(kMsgDefaults));
|
||||||
|
button->ResizeToPreferred();
|
||||||
|
view->AddChild(button);
|
||||||
|
|
||||||
|
rect = button->Frame();
|
||||||
|
rect.OffsetBy(rect.Width() + 10, 0);
|
||||||
|
fRevertButton = new BButton(rect, "revert", "Revert", new BMessage(kMsgRevert));
|
||||||
|
button->ResizeToPreferred();
|
||||||
|
view->AddChild(fRevertButton);
|
||||||
|
|
||||||
|
view->ResizeTo(view->Frame().Width(), button->Frame().bottom + 10);
|
||||||
|
ResizeTo(view->Bounds().Width(), view->Bounds().Height());
|
||||||
|
AddChild(view);
|
||||||
|
// add view after resizing the window, so that the view's resizing
|
||||||
|
// mode is not used (we already layed out the views for the new size)
|
||||||
|
|
||||||
|
Update();
|
||||||
|
|
||||||
|
BScreen screen;
|
||||||
|
BRect screenFrame = screen.Frame();
|
||||||
|
|
||||||
|
if (!screenFrame.Contains(fSettings.WindowPosition())) {
|
||||||
|
// move on screen, centered
|
||||||
|
MoveTo((screenFrame.Width() - Bounds().Width()) / 2,
|
||||||
|
(screenFrame.Height() - Bounds().Height()) / 2);
|
||||||
|
} else
|
||||||
|
MoveTo(fSettings.WindowPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SettingsWindow::~SettingsWindow()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsWindow::Update()
|
||||||
|
{
|
||||||
|
if ((fSwapEnabledCheckBox->Value() != 0) != fSettings.SwapEnabled())
|
||||||
|
fSwapEnabledCheckBox->SetValue(fSettings.SwapEnabled());
|
||||||
|
|
||||||
|
off_t minSize, maxSize;
|
||||||
|
GetSwapFileLimits(minSize, maxSize);
|
||||||
|
|
||||||
|
BString minLabel, maxLabel;
|
||||||
|
minLabel << byte_string(minSize);
|
||||||
|
maxLabel << byte_string(maxSize);
|
||||||
|
if (minLabel != fSizeSlider->MinLimitLabel()
|
||||||
|
|| maxLabel != fSizeSlider->MaxLimitLabel()) {
|
||||||
|
fSizeSlider->SetLimitLabels(minLabel.String(), maxLabel.String());
|
||||||
|
#ifdef __HAIKU__
|
||||||
|
fSizeSlider->SetLimits(minSize / kMegaByte, maxSize / kMegaByte);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fSizeSlider->Value() != fSettings.SwapSize() / kMegaByte)
|
||||||
|
fSizeSlider->SetValue(fSettings.SwapSize() / kMegaByte);
|
||||||
|
|
||||||
|
// ToDo: set volume
|
||||||
|
|
||||||
|
bool changed = fSettings.SwapChanged();
|
||||||
|
if (fRevertButton->IsEnabled() != changed) {
|
||||||
|
fRevertButton->SetEnabled(changed);
|
||||||
|
if (changed)
|
||||||
|
fWarningStringView->SetText("Changes will take effect on restart!");
|
||||||
|
else
|
||||||
|
fWarningStringView->SetText("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsWindow::GetSwapFileLimits(off_t& minSize, off_t& maxSize)
|
||||||
|
{
|
||||||
|
// minimum size is the installed memory
|
||||||
|
system_info info;
|
||||||
|
get_system_info(&info);
|
||||||
|
minSize = (off_t)info.max_pages * B_PAGE_SIZE;
|
||||||
|
|
||||||
|
// maximum size is the free space on the current volume
|
||||||
|
// (minus some safety offset, depending on the disk size)
|
||||||
|
|
||||||
|
off_t freeSpace = fSettings.SwapVolume().FreeBytes();
|
||||||
|
off_t safetyFreeSpace = fSettings.SwapVolume().Capacity() / 100;
|
||||||
|
if (safetyFreeSpace > 1024 * kMegaByte)
|
||||||
|
safetyFreeSpace = 1024 * kMegaByte;
|
||||||
|
|
||||||
|
// check if there already is a page file on this disk and
|
||||||
|
// adjust the free space accordingly
|
||||||
|
|
||||||
|
BPath path;
|
||||||
|
if (find_directory(B_COMMON_VAR_DIRECTORY, &path, false,
|
||||||
|
&fSettings.SwapVolume()) == B_OK) {
|
||||||
|
path.Append("swap");
|
||||||
|
BEntry swap(path.Path());
|
||||||
|
|
||||||
|
off_t size;
|
||||||
|
if (swap.GetSize(&size) == B_OK)
|
||||||
|
freeSpace += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
maxSize = freeSpace - safetyFreeSpace;
|
||||||
|
// ToDo: we should issue some kind of warning here
|
||||||
|
if (maxSize < minSize)
|
||||||
|
maxSize = minSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsWindow::MessageReceived(BMessage* message)
|
||||||
|
{
|
||||||
|
switch (message->what) {
|
||||||
|
case kMsgRevert:
|
||||||
|
fSettings.RevertSwapChanges();
|
||||||
|
Update();
|
||||||
|
break;
|
||||||
|
case kMsgDefaults:
|
||||||
|
fSettings.SetSwapDefaults();
|
||||||
|
Update();
|
||||||
|
break;
|
||||||
|
case kMsgSliderUpdate:
|
||||||
|
fSettings.SetSwapSize((off_t)fSizeSlider->Value() * kMegaByte);
|
||||||
|
Update();
|
||||||
|
break;
|
||||||
|
case kMsgSwapEnabledUpdate:
|
||||||
|
{
|
||||||
|
int32 value;
|
||||||
|
if (message->FindInt32("be:value", &value) != B_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (value == 0) {
|
||||||
|
// print out warning, give the user the time to think about it :)
|
||||||
|
// ToDo: maybe we want to remove this possibility in the GUI
|
||||||
|
// as Be did, but I thought a proper warning could be helpful
|
||||||
|
// (for those that want to change that anyway)
|
||||||
|
int32 choice = (new BAlert("VirtualMemory",
|
||||||
|
"Disabling virtual memory will have unwanted effects on "
|
||||||
|
"system stability once the memory is used up.\n"
|
||||||
|
"Virtual memory does not affect system performance "
|
||||||
|
"until this point is reached.\n\n"
|
||||||
|
"Are you really sure you want to turn it off?",
|
||||||
|
"Turn Off", "Keep Enabled", NULL,
|
||||||
|
B_WIDTH_AS_USUAL, B_WARNING_ALERT))->Go();
|
||||||
|
if (choice == 1) {
|
||||||
|
fSwapEnabledCheckBox->SetValue(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fSettings.SetSwapEnabled(value != 0);
|
||||||
|
Update();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
BWindow::MessageReceived(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
SettingsWindow::QuitRequested()
|
||||||
|
{
|
||||||
|
fSettings.SetWindowPosition(Frame().LeftTop());
|
||||||
|
be_app->PostMessage(B_QUIT_REQUESTED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef SETTINGS_WINDOW_H
|
||||||
|
#define SETTINGS_WINDOW_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <Window.h>
|
||||||
|
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
class BStringView;
|
||||||
|
class BCheckBox;
|
||||||
|
class BSlider;
|
||||||
|
class BButton;
|
||||||
|
|
||||||
|
|
||||||
|
class SettingsWindow : public BWindow {
|
||||||
|
public:
|
||||||
|
SettingsWindow();
|
||||||
|
virtual ~SettingsWindow();
|
||||||
|
|
||||||
|
virtual bool QuitRequested();
|
||||||
|
virtual void MessageReceived(BMessage* message);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Update();
|
||||||
|
void GetSwapFileLimits(off_t& minSize, off_t& maxSize);
|
||||||
|
|
||||||
|
BCheckBox* fSwapEnabledCheckBox;
|
||||||
|
BSlider* fSizeSlider;
|
||||||
|
BButton* fRevertButton;
|
||||||
|
BStringView* fWarningStringView;
|
||||||
|
|
||||||
|
Settings fSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* SETTINGS_WINDOW_H */
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
#include "VMSettings.h"
|
|
||||||
|
|
||||||
#include <Application.h>
|
|
||||||
#include <File.h>
|
|
||||||
#include <FindDirectory.h>
|
|
||||||
#include <Path.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
const char VMSettings::kVMSettingsFile[] = "VM_data";
|
|
||||||
|
|
||||||
VMSettings::VMSettings()
|
|
||||||
{//VMSettings::VMSettings
|
|
||||||
|
|
||||||
BPath path;
|
|
||||||
if (find_directory(B_USER_SETTINGS_DIRECTORY,&path) == B_OK)
|
|
||||||
{
|
|
||||||
path.Append(kVMSettingsFile);
|
|
||||||
BFile file(path.Path(), B_READ_ONLY);
|
|
||||||
if (file.InitCheck() != B_OK)
|
|
||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
|
||||||
// Now read in the data
|
|
||||||
if (file.Read(&fcorner, sizeof(BPoint)) != sizeof(BPoint))
|
|
||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
|
||||||
}
|
|
||||||
printf("VM settings file read.\n");
|
|
||||||
printf("=========================\n");
|
|
||||||
printf("fcorner read in as ");
|
|
||||||
fcorner.PrintToStream();
|
|
||||||
|
|
||||||
fWindowFrame.left = fcorner.x;
|
|
||||||
fWindowFrame.top = fcorner.y;
|
|
||||||
fWindowFrame.right = fWindowFrame.left+269;
|
|
||||||
fWindowFrame.bottom = fWindowFrame.top+172;
|
|
||||||
|
|
||||||
//Check to see if the co-ords of the window are in the range of the Screen
|
|
||||||
BScreen screen;
|
|
||||||
if (screen.Frame().right >= fWindowFrame.right
|
|
||||||
&& screen.Frame().bottom >= fWindowFrame.bottom)
|
|
||||||
return;
|
|
||||||
// If they are not, lets just stick the window in the middle
|
|
||||||
// of the screen.
|
|
||||||
fWindowFrame = screen.Frame();
|
|
||||||
fWindowFrame.left = (fWindowFrame.right -269)/2;
|
|
||||||
fWindowFrame.right = fWindowFrame.left + 269;
|
|
||||||
fWindowFrame.top = (fWindowFrame.bottom -172)/2;
|
|
||||||
fWindowFrame.bottom = fWindowFrame.top + 172;
|
|
||||||
|
|
||||||
}//VMSettings::VMSettings
|
|
||||||
|
|
||||||
VMSettings::~VMSettings()
|
|
||||||
{//VMSettings::~VMSettings
|
|
||||||
BPath path;
|
|
||||||
if (find_directory(B_USER_SETTINGS_DIRECTORY,&path) < B_OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
path.Append(kVMSettingsFile);
|
|
||||||
|
|
||||||
BFile file(path.Path(), B_WRITE_ONLY | B_CREATE_FILE);
|
|
||||||
if (file.InitCheck() == B_OK)
|
|
||||||
{
|
|
||||||
file.Write(&fcorner, sizeof(BPoint));
|
|
||||||
}
|
|
||||||
}//MouseSettings::~MouseSettings
|
|
||||||
|
|
||||||
void VMSettings::SetWindowPosition(BRect f)
|
|
||||||
{//VMSettings::SetWindowFrame
|
|
||||||
fcorner.x = f.left;
|
|
||||||
fcorner.y = f.top;
|
|
||||||
}//VMSettings::SetWindowFrame
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#ifndef VM_SETTINGS_H_
|
|
||||||
#define VM_SETTINGS_H_
|
|
||||||
|
|
||||||
#include <Screen.h>
|
|
||||||
#include <SupportDefs.h>
|
|
||||||
|
|
||||||
class VMSettings{
|
|
||||||
public :
|
|
||||||
VMSettings();
|
|
||||||
virtual ~VMSettings();
|
|
||||||
BRect WindowPosition() const { return fWindowFrame; }
|
|
||||||
void SetWindowPosition(BRect);
|
|
||||||
|
|
||||||
private:
|
|
||||||
static const char kVMSettingsFile[];
|
|
||||||
BRect fWindowFrame;
|
|
||||||
BPoint fcorner;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "VirtualMemory.h"
|
||||||
|
#include "SettingsWindow.h"
|
||||||
|
|
||||||
|
#include <Alert.h>
|
||||||
|
#include <TextView.h>
|
||||||
|
|
||||||
|
|
||||||
|
VirtualMemory::VirtualMemory()
|
||||||
|
: BApplication("application/x-vnd.Haiku-VirtualMemory")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VirtualMemory::~VirtualMemory()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
VirtualMemory::ReadyToRun()
|
||||||
|
{
|
||||||
|
BWindow* window = new SettingsWindow();
|
||||||
|
window->Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
VirtualMemory::AboutRequested()
|
||||||
|
{
|
||||||
|
BAlert *alert = new BAlert("about", "VirtualMemory\n"
|
||||||
|
"\twritten by Axel Dörfler\n"
|
||||||
|
"\tCopyright 2005, Haiku.\n", "Ok");
|
||||||
|
BTextView *view = alert->TextView();
|
||||||
|
BFont font;
|
||||||
|
|
||||||
|
view->SetStylable(true);
|
||||||
|
|
||||||
|
view->GetFont(&font);
|
||||||
|
font.SetSize(18);
|
||||||
|
font.SetFace(B_BOLD_FACE);
|
||||||
|
view->SetFontAndColor(0, 13, &font);
|
||||||
|
|
||||||
|
alert->Go();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
VirtualMemory app;
|
||||||
|
app.Run();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef VIRTUAL_MEMORY_H
|
||||||
|
#define VIRTUAL_MEMORY_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <Application.h>
|
||||||
|
|
||||||
|
class VMSettings;
|
||||||
|
|
||||||
|
|
||||||
|
class VirtualMemory : public BApplication {
|
||||||
|
public:
|
||||||
|
VirtualMemory();
|
||||||
|
virtual ~VirtualMemory();
|
||||||
|
|
||||||
|
virtual void ReadyToRun();
|
||||||
|
virtual void AboutRequested();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void GetCurrentSettings(bool& enabled, off_t& size);
|
||||||
|
|
||||||
|
VMSettings *fSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* VIRTUAL_MEMORY_H */
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
/*! \file main.cpp
|
|
||||||
* \brief Code for the main class.
|
|
||||||
*
|
|
||||||
* This file contains the code for the main class. This class sets up all
|
|
||||||
* of the initial conditions for the app.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "MainWindow.h"
|
|
||||||
#include "main.h"
|
|
||||||
#include <iostream>
|
|
||||||
using namespace std;
|
|
||||||
#define MEGABITE 1048576
|
|
||||||
/**
|
|
||||||
* Main method.
|
|
||||||
*
|
|
||||||
* Starts the whole thing.
|
|
||||||
*/
|
|
||||||
int main(int, char**){
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An instance of the application.
|
|
||||||
*/
|
|
||||||
new VM_pref();
|
|
||||||
be_app->Run();
|
|
||||||
delete be_app;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* Provides a contstructor for the application.
|
|
||||||
*/
|
|
||||||
VM_pref::VM_pref()
|
|
||||||
:BApplication("application/x-vnd.Haiku-MEM$") {
|
|
||||||
|
|
||||||
// read current swap settings
|
|
||||||
FILE *settingsFile = fopen("/boot/home/config/settings/kernel/drivers/virtual_memory", "r");
|
|
||||||
char dummy[80];
|
|
||||||
|
|
||||||
int physMem; //The amount of physical memory in the machine.
|
|
||||||
int currSwap; //The current size of the swap file.
|
|
||||||
int setSwap; //The set size of the swap file.
|
|
||||||
double minSwap; //The minimum size the swap file can be.
|
|
||||||
int maxSwap; //The maximum size the swap file can be.
|
|
||||||
|
|
||||||
const char *swap_file= "/boot/var/swap";
|
|
||||||
BEntry swap(swap_file);
|
|
||||||
off_t swapsize;
|
|
||||||
swap.GetSize(&swapsize);
|
|
||||||
currSwap = swapsize / MEGABITE;
|
|
||||||
|
|
||||||
system_info info;
|
|
||||||
get_system_info(&info);
|
|
||||||
physMem = (info.max_pages * 4096) / MEGABITE;
|
|
||||||
|
|
||||||
float memcalc = (physMem +(int)(physMem/3.0));
|
|
||||||
cout << memcalc << endl;
|
|
||||||
modf(memcalc/128.0, &minSwap);
|
|
||||||
cout << minSwap << endl;
|
|
||||||
minSwap*= 128;
|
|
||||||
|
|
||||||
if (settingsFile != NULL) {
|
|
||||||
fscanf(settingsFile, "%s %s\n", dummy, dummy);
|
|
||||||
fscanf(settingsFile, "%s %d\n", dummy, &setSwap);
|
|
||||||
setSwap = setSwap / MEGABITE;
|
|
||||||
} else {
|
|
||||||
setSwap = (int)minSwap;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(settingsFile);
|
|
||||||
|
|
||||||
BVolume bootVol;
|
|
||||||
BVolumeRoster *vol_rost = new BVolumeRoster();
|
|
||||||
vol_rost->GetBootVolume(&bootVol);
|
|
||||||
/* maxSwap is defined by the amount of free space on your boot
|
|
||||||
* volume, plus the current swap file size, minus an arbitrary
|
|
||||||
* amount of space, just so you don't fill up your drive completly.
|
|
||||||
*/
|
|
||||||
maxSwap = (bootVol.FreeBytes() / MEGABITE) + currSwap - 16;
|
|
||||||
|
|
||||||
bool changeMsg = false;
|
|
||||||
if (currSwap != setSwap) {
|
|
||||||
currSwap = setSwap;
|
|
||||||
changeMsg = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
fSettings = new VMSettings();
|
|
||||||
window = new MainWindow(fSettings->WindowPosition(), physMem, currSwap, minSwap, maxSwap, fSettings);
|
|
||||||
if (changeMsg) {
|
|
||||||
window->toggleChangedMessage(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VM_pref::~VM_pref()
|
|
||||||
{
|
|
||||||
delete fSettings;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
VM_pref::ReadyToRun()
|
|
||||||
{
|
|
||||||
window->Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*! \file main.h
|
|
||||||
\brief Header file for the main class.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MAIN_H
|
|
||||||
#define MAIN_H
|
|
||||||
|
|
||||||
#include <Application.h>
|
|
||||||
#include <Volume.h>
|
|
||||||
#include <VolumeRoster.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "VMSettings.h"
|
|
||||||
#include <OS.h>
|
|
||||||
#include <Entry.h>
|
|
||||||
|
|
||||||
class MainWindow;
|
|
||||||
/**
|
|
||||||
* Main class.
|
|
||||||
*
|
|
||||||
* Gets everything going.
|
|
||||||
*/
|
|
||||||
class VM_pref : public BApplication{
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*/
|
|
||||||
VM_pref();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor.
|
|
||||||
*/
|
|
||||||
virtual ~VM_pref();
|
|
||||||
virtual void ReadyToRun();
|
|
||||||
private:
|
|
||||||
VMSettings *fSettings;
|
|
||||||
MainWindow *window;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user