-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
339 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,339 @@ | ||
#include <stdint.h> | ||
#include <stddef.h> | ||
#include <limine.h> | ||
#include <stdlib.h> | ||
|
||
// The Limine requests can be placed anywhere, but it is important that | ||
// the compiler does not optimise them away, so, usually, they should | ||
// be made volatile or equivalent. | ||
// Define the font bitmap data and metrics. | ||
void outb(uint16_t port, uint8_t value) { | ||
asm volatile("outb %0, %1" : : "a"(value), "Nd"(port)); | ||
} | ||
|
||
uint8_t inb(uint16_t port) { | ||
uint8_t ret; | ||
asm volatile("inb %1, %0" | ||
: "=a"(ret) | ||
: "Nd"(port)); | ||
return ret; | ||
} | ||
|
||
|
||
static volatile struct limine_framebuffer_request framebuffer_request = { | ||
.id = LIMINE_FRAMEBUFFER_REQUEST, | ||
.revision = 0 | ||
}; | ||
|
||
|
||
|
||
void *memcpy(void *dest, const void *src, size_t n) { | ||
uint8_t *pdest = (uint8_t *)dest; | ||
const uint8_t *psrc = (const uint8_t *)src; | ||
|
||
for (size_t i = 0; i < n; i++) { | ||
pdest[i] = psrc[i]; | ||
} | ||
|
||
return dest; | ||
} | ||
|
||
void *memset(void *s, int c, size_t n) { | ||
uint8_t *p = (uint8_t *)s; | ||
|
||
for (size_t i = 0; i < n; i++) { | ||
p[i] = (uint8_t)c; | ||
} | ||
|
||
return s; | ||
} | ||
|
||
void *memmove(void *dest, const void *src, size_t n) { | ||
uint8_t *pdest = (uint8_t *)dest; | ||
const uint8_t *psrc = (const uint8_t *)src; | ||
|
||
if (src > dest) { | ||
for (size_t i = 0; i < n; i++) { | ||
pdest[i] = psrc[i]; | ||
} | ||
} else if (src < dest) { | ||
for (size_t i = n; i > 0; i--) { | ||
pdest[i-1] = psrc[i-1]; | ||
} | ||
} | ||
|
||
return dest; | ||
} | ||
|
||
int memcmp(const void *s1, const void *s2, size_t n) { | ||
const uint8_t *p1 = (const uint8_t *)s1; | ||
const uint8_t *p2 = (const uint8_t *)s2; | ||
|
||
for (size_t i = 0; i < n; i++) { | ||
if (p1[i] != p2[i]) { | ||
return p1[i] < p2[i] ? -1 : 1; | ||
} | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
// Halt and catch fire function. | ||
static void hcf(void) { | ||
asm ("cli"); | ||
for (;;) { | ||
asm ("hlt"); | ||
} | ||
} | ||
uint8_t font8x8_basic[128][8] = { | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0000 (nul) | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0001 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0002 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0003 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0004 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0005 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0006 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0007 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0008 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0009 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+000A | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+000B | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+000C | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+000D | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+000E | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+000F | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0010 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0011 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0012 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0013 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0014 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0015 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0016 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0017 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0018 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0019 | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+001A | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+001B | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+001C | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+001D | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+001E | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+001F | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0020 (space) | ||
{ 0x00, 0x00, 0x06, 0x5F, 0x5F, 0x06, 0x00, 0x00 }, // U+0021 (!) | ||
{ 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00 }, // U+0022 (") | ||
{ 0x14, 0x7F, 0x7F, 0x14, 0x7F, 0x7F, 0x14, 0x00 }, // U+0023 (#) | ||
{ 0x24, 0x2E, 0x6B, 0x6B, 0x3A, 0x12, 0x00, 0x00 }, // U+0024 ($) | ||
{ 0x46, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x62, 0x00 }, // U+0025 (%) | ||
{ 0x30, 0x7A, 0x4F, 0x5D, 0x37, 0x7A, 0x48, 0x00 }, // U+0026 (&) | ||
{ 0x04, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 }, // U+0027 (') | ||
{ 0x00, 0x1C, 0x3E, 0x63, 0x41, 0x00, 0x00, 0x00 }, // U+0028 (() | ||
{ 0x00, 0x41, 0x63, 0x3E, 0x1C, 0x00, 0x00, 0x00 }, // U+0029 ()) | ||
{ 0x08, 0x2A, 0x3E, 0x1C, 0x1C, 0x3E, 0x2A, 0x08 }, // U+002A (*) | ||
{ 0x08, 0x08, 0x3E, 0x3E, 0x08, 0x08, 0x00, 0x00 }, // U+002B (+) | ||
{ 0x00, 0x80, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00 }, // U+002C (,) | ||
{ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00 }, // U+002D (-) | ||
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00 }, // U+002E (.) | ||
{ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00 }, // U+002F (/) | ||
{ 0x3E, 0x7F, 0x71, 0x59, 0x4D, 0x7F, 0x3E, 0x00 }, // U+0030 (0) | ||
{ 0x40, 0x42, 0x7F, 0x7F, 0x40, 0x40, 0x00, 0x00 }, // U+0031 (1) | ||
{ 0x62, 0x73, 0x59, 0x49, 0x6F, 0x66, 0x00, 0x00 }, // U+0032 (2) | ||
{ 0x22, 0x63, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00 }, // U+0033 (3) | ||
{ 0x18, 0x1C, 0x16, 0x53, 0x7F, 0x7F, 0x50, 0x00 }, // U+0034 (4) | ||
{ 0x27, 0x67, 0x45, 0x45, 0x7D, 0x39, 0x00, 0x00 }, // U+0035 (5) | ||
{ 0x3C, 0x7E, 0x4B, 0x49, 0x79, 0x30, 0x00, 0x00 }, // U+0036 (6) | ||
{ 0x03, 0x03, 0x71, 0x79, 0x0F, 0x07, 0x00, 0x00 }, // U+0037 (7) | ||
{ 0x36, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00 }, // U+0038 (8) | ||
{ 0x06, 0x4F, 0x49, 0x69, 0x3F, 0x1E, 0x00, 0x00 }, // U+0039 (9) | ||
{ 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00 }, // U+003A (:) | ||
{ 0x00, 0x80, 0xE6, 0x66, 0x00, 0x00, 0x00, 0x00 }, // U+003B (;) | ||
{ 0x08, 0x1C, 0x36, 0x63, 0x41, 0x00, 0x00, 0x00 }, // U+003C (<) | ||
{ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00 }, // U+003D (=) | ||
{ 0x00, 0x41, 0x63, 0x36, 0x1C, 0x08, 0x00, 0x00 }, // U+003E (>) | ||
{ 0x02, 0x03, 0x51, 0x59, 0x0F, 0x06, 0x00, 0x00 }, // U+003F (?) | ||
{ 0x3E, 0x7F, 0x41, 0x5D, 0x5D, 0x1F, 0x1E, 0x00 }, // U+0040 (@) | ||
{ 0x7C, 0x7E, 0x13, 0x13, 0x7E, 0x7C, 0x00, 0x00 }, // U+0041 (A) | ||
{ 0x41, 0x7F, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00 }, // U+0042 (B) | ||
{ 0x1C, 0x3E, 0x63, 0x41, 0x41, 0x63, 0x22, 0x00 }, // U+0043 (C) | ||
{ 0x41, 0x7F, 0x7F, 0x41, 0x63, 0x3E, 0x1C, 0x00 }, // U+0044 (D) | ||
{ 0x41, 0x7F, 0x7F, 0x49, 0x5D, 0x41, 0x63, 0x00 }, // U+0045 (E) | ||
{ 0x41, 0x7F, 0x7F, 0x49, 0x1D, 0x01, 0x03, 0x00 }, // U+0046 (F) | ||
{ 0x1C, 0x3E, 0x63, 0x41, 0x51, 0x73, 0x72, 0x00 }, // U+0047 (G) | ||
{ 0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x00, 0x00 }, // U+0048 (H) | ||
{ 0x00, 0x41, 0x7F, 0x7F, 0x41, 0x00, 0x00, 0x00 }, // U+0049 (I) | ||
{ 0x30, 0x70, 0x40, 0x41, 0x7F, 0x3F, 0x01, 0x00 }, // U+004A (J) | ||
{ 0x41, 0x7F, 0x7F, 0x08, 0x1C, 0x77, 0x63, 0x00 }, // U+004B (K) | ||
{ 0x41, 0x7F, 0x7F, 0x41, 0x40, 0x60, 0x70, 0x00 }, // U+004C (L) | ||
{ 0x7F, 0x7F, 0x0E, 0x1C, 0x0E, 0x7F, 0x7F, 0x00 }, // U+004D (M) | ||
{ 0x7F, 0x7F, 0x06, 0x0C, 0x18, 0x7F, 0x7F, 0x00 }, // U+004E (N) | ||
{ 0x1C, 0x3E, 0x63, 0x41, 0x63, 0x3E, 0x1C, 0x00 }, // U+004F (O) | ||
{ 0x41, 0x7F, 0x7F, 0x49, 0x09, 0x0F, 0x06, 0x00 }, // U+0050 (P) | ||
{ 0x1E, 0x3F, 0x21, 0x71, 0x7F, 0x5E, 0x00, 0x00 }, // U+0051 (Q) | ||
{ 0x41, 0x7F, 0x7F, 0x09, 0x19, 0x7F, 0x66, 0x00 }, // U+0052 (R) | ||
{ 0x26, 0x6F, 0x4D, 0x59, 0x73, 0x32, 0x00, 0x00 }, // U+0053 (S) | ||
{ 0x03, 0x41, 0x7F, 0x7F, 0x41, 0x03, 0x00, 0x00 }, // U+0054 (T) | ||
{ 0x7F, 0x7F, 0x40, 0x40, 0x7F, 0x7F, 0x00, 0x00 }, // U+0055 (U) | ||
{ 0x1F, 0x3F, 0x60, 0x60, 0x3F, 0x1F, 0x00, 0x00 }, // U+0056 (V) | ||
{ 0x7F, 0x7F, 0x30, 0x18, 0x30, 0x7F, 0x7F, 0x00 }, // U+0057 (W) | ||
{ 0x43, 0x67, 0x3C, 0x18, 0x3C, 0x67, 0x43, 0x00 }, // U+0058 (X) | ||
{ 0x07, 0x4F, 0x78, 0x78, 0x4F, 0x07, 0x00, 0x00 }, // U+0059 (Y) | ||
{ 0x47, 0x63, 0x71, 0x59, 0x4D, 0x67, 0x73, 0x00 }, // U+005A (Z) | ||
{ 0x00, 0x7F, 0x7F, 0x41, 0x41, 0x00, 0x00, 0x00 }, // U+005B ([) | ||
{ 0x01, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00 }, // U+005C (\) | ||
{ 0x00, 0x41, 0x41, 0x7F, 0x7F, 0x00, 0x00, 0x00 }, // U+005D (]) | ||
{ 0x08, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x08, 0x00 }, // U+005E (^) | ||
{ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }, // U+005F (_) | ||
{ 0x00, 0x00, 0x03, 0x07, 0x04, 0x00, 0x00, 0x00 }, // U+0060 (`) | ||
{ 0x20, 0x74, 0x54, 0x54, 0x3C, 0x78, 0x40, 0x00 }, // U+0061 (a) | ||
{ 0x41, 0x7F, 0x3F, 0x48, 0x48, 0x78, 0x30, 0x00 }, // U+0062 (b) | ||
{ 0x38, 0x7C, 0x44, 0x44, 0x6C, 0x28, 0x00, 0x00 }, // U+0063 (c) | ||
{ 0x30, 0x78, 0x48, 0x49, 0x3F, 0x7F, 0x40, 0x00 }, // U+0064 (d) | ||
{ 0x38, 0x7C, 0x54, 0x54, 0x5C, 0x18, 0x00, 0x00 }, // U+0065 (e) | ||
{ 0x48, 0x7E, 0x7F, 0x49, 0x03, 0x02, 0x00, 0x00 }, // U+0066 (f) | ||
{ 0x98, 0xBC, 0xA4, 0xA4, 0xF8, 0x7C, 0x04, 0x00 }, // U+0067 (g) | ||
{ 0x41, 0x7F, 0x7F, 0x08, 0x04, 0x7C, 0x78, 0x00 }, // U+0068 (h) | ||
{ 0x00, 0x44, 0x7D, 0x7D, 0x40, 0x00, 0x00, 0x00 }, // U+0069 (i) | ||
{ 0x60, 0xE0, 0x80, 0x80, 0xFD, 0x7D, 0x00, 0x00 }, // U+006A (j) | ||
{ 0x41, 0x7F, 0x7F, 0x10, 0x38, 0x6C, 0x44, 0x00 }, // U+006B (k) | ||
{ 0x00, 0x41, 0x7F, 0x7F, 0x40, 0x00, 0x00, 0x00 }, // U+006C (l) | ||
{ 0x7C, 0x7C, 0x18, 0x38, 0x1C, 0x7C, 0x78, 0x00 }, // U+006D (m) | ||
{ 0x7C, 0x7C, 0x04, 0x04, 0x7C, 0x78, 0x00, 0x00 }, // U+006E (n) | ||
{ 0x38, 0x7C, 0x44, 0x44, 0x7C, 0x38, 0x00, 0x00 }, // U+006F (o) | ||
{ 0x84, 0xFC, 0xF8, 0xA4, 0x24, 0x3C, 0x18, 0x00 }, // U+0070 (p) | ||
{ 0x18, 0x3C, 0x24, 0xA4, 0xF8, 0xFC, 0x84, 0x00 }, // U+0071 (q) | ||
{ 0x44, 0x7C, 0x78, 0x4C, 0x04, 0x1C, 0x18, 0x00 }, // U+0072 (r) | ||
{ 0x48, 0x5C, 0x54, 0x54, 0x74, 0x24, 0x00, 0x00 }, // U+0073 (s) | ||
{ 0x00, 0x04, 0x3E, 0x7F, 0x44, 0x24, 0x00, 0x00 }, // U+0074 (t) | ||
{ 0x3C, 0x7C, 0x40, 0x40, 0x3C, 0x7C, 0x40, 0x00 }, // U+0075 (u) | ||
{ 0x1C, 0x3C, 0x60, 0x60, 0x3C, 0x1C, 0x00, 0x00 }, // U+0076 (v) | ||
{ 0x3C, 0x7C, 0x70, 0x38, 0x70, 0x7C, 0x3C, 0x00 }, // U+0077 (w) | ||
{ 0x44, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0x44, 0x00 }, // U+0078 (x) | ||
{ 0x9C, 0xBC, 0xA0, 0xA0, 0xFC, 0x7C, 0x00, 0x00 }, // U+0079 (y) | ||
{ 0x4C, 0x64, 0x74, 0x5C, 0x4C, 0x64, 0x00, 0x00 }, // U+007A (z) | ||
{ 0x08, 0x08, 0x3E, 0x77, 0x41, 0x41, 0x00, 0x00 }, // U+007B ({) | ||
{ 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x00 }, // U+007C (|) | ||
{ 0x41, 0x41, 0x77, 0x3E, 0x08, 0x08, 0x00, 0x00 }, // U+007D (}) | ||
{ 0x02, 0x03, 0x01, 0x03, 0x02, 0x03, 0x01, 0x00 }, // U+007E (~) | ||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // U+007F | ||
}; | ||
|
||
|
||
// The following will be our kernel's entry point. | ||
// If renaming _start() to something else, make sure to change the | ||
// linker script accordingly. | ||
|
||
void write_string(struct limine_framebuffer *framebuffer, int x, int y, uint8_t color, const char *string) { | ||
volatile uint32_t *fb = framebuffer->address; | ||
uint32_t pitch = framebuffer->pitch / 4; | ||
|
||
for (int i = 0; string[i] != '\0'; i++) { | ||
char c = string[i]; | ||
uint8_t *glyph = &font8x8_basic[c][0]; | ||
|
||
for (int j = 0; j < 8; j++) { | ||
for (int m = 0; m < 2; m++) { | ||
for (int k = 7; k >= 0; k--) { | ||
for (int n = 0; n < 2; n++) { | ||
if (*glyph & (1 << k)) { | ||
*(fb + (y + k*2 + n) * pitch + (x + j*2 + m)) = color; | ||
} | ||
} | ||
} | ||
} | ||
glyph++; | ||
} | ||
x += 16; | ||
} | ||
} | ||
|
||
|
||
void main_window(void) { | ||
// Define the parameters for the background square. | ||
struct limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0]; | ||
int x = 0; | ||
int y = 0; | ||
int size = 2000; | ||
uint32_t bg_color = 0x5881C3; // Blue color for the background. | ||
|
||
// Draw the background square. | ||
for (int i = 0; i < size; i++) { | ||
uint32_t *fb_ptr = framebuffer->address; | ||
int row = y + i; | ||
int col_start = x; | ||
int col_end = x + size - 1; | ||
int col_count = col_end - col_start + 1; | ||
int fb_pitch = framebuffer->pitch / 4; | ||
|
||
for (int j = 0; j < col_count; j++) { | ||
*(fb_ptr + row * fb_pitch + col_start + j) = bg_color; | ||
} | ||
} | ||
|
||
// Write some text on top of the square. | ||
} | ||
|
||
|
||
|
||
void menu_bar(int x, int y, int width, int height, uint32_t color) { | ||
struct limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0]; | ||
uint32_t *fb_ptr = framebuffer->address; | ||
int fb_pitch = framebuffer->pitch / 4; | ||
uint32_t border_color = 0x000000; // Black color for the border. | ||
int border_width = 2; // Width of the border. | ||
|
||
// Draw the menu bar. | ||
for (int i = y; i < y + height; i++) { | ||
for (int j = x; j < x + width; j++) { | ||
*(fb_ptr + i * fb_pitch + j) = color; | ||
} | ||
} | ||
|
||
// Draw the border. | ||
for (int i = 0; i < border_width; i++) { | ||
int top = y + i; | ||
int bottom = y + height - 1 - i; | ||
int left = x + i; | ||
int right = x + width - 1 - i; | ||
|
||
// Top and bottom borders. | ||
for (int j = left; j <= right; j++) { | ||
*(fb_ptr + top * fb_pitch + j) = border_color; | ||
*(fb_ptr + bottom * fb_pitch + j) = border_color; | ||
} | ||
|
||
// Left and right borders. | ||
for (int j = top; j <= bottom; j++) { | ||
*(fb_ptr + j * fb_pitch + left) = border_color; | ||
*(fb_ptr + j * fb_pitch + right) = border_color; | ||
} | ||
} | ||
} | ||
|
||
|
||
|
||
|
||
// Define a function to initialize the mouse driver | ||
|
||
void _start(void) { | ||
int x = 0; | ||
int y = 0; | ||
int width = 1500; | ||
int height = 40; | ||
uint32_t color = 0x808080; // Grey color. | ||
// Ensure we got a framebuffer. | ||
if (framebuffer_request.response == NULL | ||
|| framebuffer_request.response->framebuffer_count < 1) { | ||
hcf(); | ||
} | ||
|
||
// Fetch the first framebuffer. | ||
struct limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0]; | ||
|
||
// Note: we assume the framebuffer model is RGB with 32-bit pixels. | ||
|
||
main_window(); | ||
menu_bar(x, y, width, height, color); | ||
write_string(framebuffer, 48, 15, 0x000000, "Freeunix"); | ||
|
||
// We're done, just hang... | ||
hcf(); | ||
} |