diff options
author | Alexis211 <alexis211@gmail.com> | 2009-12-21 18:56:08 +0100 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-12-21 18:56:08 +0100 |
commit | e7a0a24fa88e369eb3d345573200955e99324156 (patch) | |
tree | afe3d9481f9851da9c26cbd6656b5299d7ea72a2 /Source/Kernel/Core | |
parent | a975053605a0f041fd2003792d81c80391527e71 (diff) | |
download | Melon-e7a0a24fa88e369eb3d345573200955e99324156.tar.gz Melon-e7a0a24fa88e369eb3d345573200955e99324156.zip |
More work on the status bar
Diffstat (limited to 'Source/Kernel/Core')
-rw-r--r-- | Source/Kernel/Core/SB.ns.cpp | 81 | ||||
-rw-r--r-- | Source/Kernel/Core/SB.ns.h | 3 | ||||
-rw-r--r-- | Source/Kernel/Core/kmain.wtf.cpp | 60 |
3 files changed, 71 insertions, 73 deletions
diff --git a/Source/Kernel/Core/SB.ns.cpp b/Source/Kernel/Core/SB.ns.cpp index 62714a1..f5b21ec 100644 --- a/Source/Kernel/Core/SB.ns.cpp +++ b/Source/Kernel/Core/SB.ns.cpp @@ -4,6 +4,8 @@ #include <MemoryManager/PhysMem.ns.h> #include <DeviceManager/Disp.ns.h> +#define BOOT_ITEMS 17 + namespace SB { SimpleVT *sb = NULL; @@ -11,50 +13,83 @@ SimpleVT *sb = NULL; String msg; u16int boot_progress = 0; +u16int height; bool gone_multi = false; Mutex lock(MUTEX_FALSE); void init() { sb = new SimpleVT(1, 80, STATUSBAR_FGCOLOR, STATUSBAR_BGCOLOR); + height = 1; sb->map(0, 0); sb->hideCursor(); } -void reinit() { - if (!gone_multi) return; - lock.waitLock(); - delete sb; - sb = new SimpleVT(1, Disp::mode.textCols, STATUSBAR_FGCOLOR, STATUSBAR_BGCOLOR); - sb->map(0, 0); - sb->hideCursor(); - lock.unlock(); -} - void drawprogress(const String& s) { - *sb << "\nMelon is loading : {"; + sb->clear(); + int d = (sb->width() / 2) - ((BOOT_ITEMS + 4) / 2); + if (height == 1) d -= 4; + sb->moveCursor(0, d); + *sb << "{"; for (u32int i = 0; i < boot_progress; i++) *sb << ":"; *sb << "."; - sb->moveCursor(0, 45); + sb->moveCursor(0, BOOT_ITEMS + d + 3); *sb << "}"; - sb->moveCursor(0, 51); - *sb << "[" << s; - sb->moveCursor(0, 78); - *sb << "]"; + if (height > 1) { + *sb << "\n"; + *sb << "Loading : [" << s; + sb->moveCursor(1, sb->width() - 2); + *sb << "]"; + } else { + sb->moveCursor(0, 0); + *sb << "Melon is loading :"; + sb->moveCursor(0, d + BOOT_ITEMS + 6); + *sb << "[" << s; + sb->moveCursor(0, sb->width() - 2); + *sb << "]"; + } } void drawnormal() { - *sb << "\n [Up:" << (s64int)Time::uptime() << "s"; + sb->clear(); + sb->moveCursor(0, 0); + *sb << " [Up:" << (s64int)Time::uptime() << "s"; sb->moveCursor(0, 10); *sb << "] [Mem:" << (s64int)PhysMem::free() << "/" << (s64int)PhysMem::total(); sb->moveCursor(0, 28); *sb << "] [Proc.:" << (s64int)Task::processes->size(); - sb->moveCursor(0, 39); - *sb << "] [Threads:" << (s64int)Task::threads->size(); - sb->moveCursor(0, 52); - *sb << "] [" << msg; - sb->moveCursor(0, sb->width() - 2); - *sb << "]"; + sb->setCursorCol(39); + if (height > 1) { + *sb << "]"; + sb->moveCursor(1, 0); + *sb << " [Threads:" << (s64int)Task::threads->size(); + sb->setCursorCol(12); + *sb << "] [" << msg; + sb->setCursorCol(sb->width() - 2); + *sb << "]"; + } else { + *sb << "] [Threads:" << (s64int)Task::threads->size(); + sb->setCursorCol(52); + *sb << "] [" << msg; + sb->setCursorCol(sb->width() - 2); + *sb << "]"; + } +} + +void reinit() { + if (!gone_multi) return; + lock.waitLock(); + delete sb; + height = (Disp::mode.textCols < 80 ? 2 : 1); + sb = new SimpleVT(height, Disp::mode.textCols, STATUSBAR_FGCOLOR, STATUSBAR_BGCOLOR); + sb->map(0, 0); + sb->hideCursor(); + if (boot_progress != 0) { + drawprogress(msg); + } else { + drawnormal(); + } + lock.unlock(); } u32int thread(void*) { diff --git a/Source/Kernel/Core/SB.ns.h b/Source/Kernel/Core/SB.ns.h index 687be02..7b3b65c 100644 --- a/Source/Kernel/Core/SB.ns.h +++ b/Source/Kernel/Core/SB.ns.h @@ -5,12 +5,13 @@ #include <VTManager/SimpleVT.class.h> namespace SB { + extern u16int height; + void init(); //Setup status bar with default 80col configuration void reinit(); //Setup status bar querying Disp:: for text screen width void gomulti(); //Launch new thread for status bar void progress(const String& s); //Update progress void message(const String& s); //Set a message - } #endif diff --git a/Source/Kernel/Core/kmain.wtf.cpp b/Source/Kernel/Core/kmain.wtf.cpp index 83fca7b..aa87d49 100644 --- a/Source/Kernel/Core/kmain.wtf.cpp +++ b/Source/Kernel/Core/kmain.wtf.cpp @@ -86,38 +86,6 @@ u32int logoAnimation(void* p) { return 0; } -void selectVideoMode(SimpleVT& v) { - Disp::getModes(); - v << "\nPlease select a graphic mode in the list below:\n"; - - for (u32int i = 0; i < Disp::modes.size(); i++) { - Disp::mode_t& m = Disp::modes[i]; - v << (s32int)i << ":\t" << "Text " << m.textRows << "x" << m.textCols << "\t"; - if (m.graphWidth != 0 and m.graphHeight != 0) { - v << "Graphics " << m.graphWidth << "x" << m.graphHeight << "x" << m.graphDepth << "\t"; - } else { - v << "No graphics"; - } - v.setCursorCol(50); - v << m.device->getName() << "\n"; - } - - while (1) { - v << "\nYour selection: "; - String answer = v.readLine(); - u32int n = answer.toInt(); - v.unmap(); - if (n >= 0 and n < Disp::modes.size() and Disp::setMode(Disp::modes[n])) { - SB::reinit(); - return; - } else { - Disp::setMode(Disp::modes[1]); - v.map(); - v << "Error while switching video mode, please select another one."; - } - } -} - void kmain(multiboot_info_t* mbd, u32int magic) { DEBUG("Entering kmain."); @@ -151,7 +119,12 @@ void kmain(multiboot_info_t* mbd, u32int magic) { SB::progress("Create kernel VT"); kvt = new ScrollableVT(24, 80, 20, KVT_FGCOLOR, KVT_BGCOLOR); kvt->map(1, 0); - kvt->moveCursor(0, 0); + kvt->setColor(TXTLOGO_FGCOLOR, TXTLOGO_BGCOLOR); + for (int i = 0; i < melonLogoLines; i++) { + kvt->setCursorCol(40 - (melonLogoCols / 2)); + *kvt << melonLogo[i] << "\n"; + } + kvt->setColor(KVT_FGCOLOR, KVT_BGCOLOR); SB::progress("IDT"); IDT::init(); //Setup interrupts @@ -225,7 +198,6 @@ void kmain(multiboot_info_t* mbd, u32int magic) { if (!m.empty() && m[0] != WChar("#")) VFS::mount(m, kvt, mbd); } } - //*************************************** LOAD SYSTEM STUFF @@ -242,36 +214,26 @@ void kmain(multiboot_info_t* mbd, u32int magic) { Usr::load(); //Setup user managment Log::log(KL_STATUS, "kmain : User list loaded"); + SB::progress("Video mode selection"); + Disp::selectMode(); if (init.empty()) { SB::progress("Start kernel shell"); *kvt << "\n"; new KernelShell(cwd, kvt); - SB::message("Melon is running \\o/"); + SB::message("Melon is running"); while (KernelShell::getInstances() > 0) { Task::currThread()->sleep(100); } Sys::halt(); } else { - SB::progress("Video mode selection"); - selectVideoMode(*kvt); - SB::progress("Logo setup"); - //Create a VT for handling the Melon bootup logo - SimpleVT *melonLogoVT = new SimpleVT(melonLogoLines, melonLogoCols, TXTLOGO_FGCOLOR, TXTLOGO_BGCOLOR); - melonLogoVT->map(1); - new Thread(logoAnimation, (void*)melonLogoVT, true); - SB::progress("Launch INIT"); Process* p = Process::run(init, 0); if (p == 0) { PANIC((char*)(u8int*)ByteArray(String("Could not launch init : ") += init)); } else { Log::log(KL_STATUS, String("kmain : Starting init : ") += init); - VirtualTerminal* vt = new ScrollableVT(Disp::textRows() - 10, Disp::textCols() - 4, - 200, SHELL_FGCOLOR, SHELL_BGCOLOR); - Kbd::setFocus(vt); - ((ScrollableVT*)vt)->map(9); - p->setInVT(vt); - p->setOutVT(vt); + p->setInVT(kvt); + p->setOutVT(kvt); p->start(); SB::message("Init started"); while (p->getState() != P_FINISHED) Task::currThread()->sleep(100); |