1.50 BoredOS Rebrand

1.50 is a version with not that many "os-related" updates, but it does bring something new: BoredOS! Since BrewOS was already being used for a custom operating system for smart coffee machines, i decided to copy the naming of my github username: BoreddevNL and turned that into, well BoredOS.

Anyways this update brings some extra stability and graphical bug fixes, that's about it. Oh yeah also a mouse sensitivity slider in the control panel. Enjoy!
This commit is contained in:
Chris 2026-02-10 23:47:02 +01:00
parent 8dcc3ff40c
commit 1842ea3b67
59 changed files with 248 additions and 188 deletions

View file

@ -1,4 +1,4 @@
# BrewOS Makefile # BoredOS Makefile
# Target Architecture: x86_64 # Target Architecture: x86_64
# Host: macOS # Host: macOS
@ -11,8 +11,8 @@ SRC_DIR = src/kernel
BUILD_DIR = build BUILD_DIR = build
ISO_DIR = iso_root ISO_DIR = iso_root
KERNEL_ELF = $(BUILD_DIR)/brewos.elf KERNEL_ELF = $(BUILD_DIR)/boredos.elf
ISO_IMAGE = brewos.iso ISO_IMAGE = boredos.iso
C_SOURCES = $(wildcard $(SRC_DIR)/*.c) C_SOURCES = $(wildcard $(SRC_DIR)/*.c)
CLI_APP_SOURCES = $(wildcard $(SRC_DIR)/cli_apps/*.c) CLI_APP_SOURCES = $(wildcard $(SRC_DIR)/cli_apps/*.c)

View file

@ -1,18 +1,18 @@
# Brew OS 1.45 Beta # BoredOS 1.50 Beta
BrewOS is now in a Beta stage as i have brought over all apps from brewkernel and have made the DE a lot more usable and stable. BoredOS is now in a Beta stage as i have brought over all apps from brewkernel and have made the DE a lot more usable and stable.
<img src="asciiart.png" width="200" /> </br> <img src="bored.svg" width="200" /> </br>
Brew Kernel is a simple x86_64 hobbyist operating system. BoredOS is a simple x86_64 hobbyist operating system.
It features a DE (and WM), a FAT32 filesystem, customizable UI and much much more! It features a DE (and WM), a FAT32 filesystem, customizable UI and much much more!
![Screenshot 2026-02-10 at 18 59 10](https://github.com/user-attachments/assets/d8602e1a-dc76-4997-a91f-999b23ba3fc3) ![Screenshot](screenshot.jpg)
*this screenshot might be outdated* *this screenshot might be outdated*
## Features ## Features
- Drag and drop mouse centered UI - Drag and drop mouse centered UI
- Customizable UI - Customizable UI
- Basic Networking Stack - Basic Networking Stack
- Brew WM - Bored WM
- Fat 32 FS - Fat 32 FS
- 64-bit long mode support - 64-bit long mode support
- Multiboot2 compliant - Multiboot2 compliant
@ -29,7 +29,7 @@ It features a DE (and WM), a FAT32 filesystem, customizable UI and much much mor
## Prerequisites ## Prerequisites
To build BrewOS, you'll need the following tools installed: To build BoredOS, you'll need the following tools installed:
- **x86_64 ELF Toolchain**: `x86_64-elf-gcc`, `x86_64-elf-ld` - **x86_64 ELF Toolchain**: `x86_64-elf-gcc`, `x86_64-elf-ld`
- **NASM**: Netwide Assembler for compiling assembly code - **NASM**: Netwide Assembler for compiling assembly code
@ -52,12 +52,12 @@ make
This will: This will:
1. Compile all kernel C sources and assembly files 1. Compile all kernel C sources and assembly files
2. Link the kernel ELF binary 2. Link the kernel ELF binary
3. Generate a bootable ISO image (`brewos.iso`) 3. Generate a bootable ISO image (`boredos.iso`)
The build output is organized as follows: The build output is organized as follows:
- Compiled object files: `build/` - Compiled object files: `build/`
- ISO root filesystem: `iso_root/` - ISO root filesystem: `iso_root/`
- Final ISO image: `brewos.iso` - Final ISO image: `boredos.iso`
## Running ## Running
@ -71,14 +71,14 @@ make run
Or manually: Or manually:
```sh ```sh
qemu-system-x86_64 -m 2G -serial stdio -cdrom brewos.iso -boot d qemu-system-x86_64 -m 2G -serial stdio -cdrom boredos.iso -boot d
``` ```
### Running on Real Hardware ### Running on Real Hardware
*Warning: This is at YOUR OWN RISK. This software comes with ZERO warranty and may break your system.* *Warning: This is at YOUR OWN RISK. This software comes with ZERO warranty and may break your system.*
1. **Create bootable USB**: Use [Balena Etcher](https://www.balena.io/etcher/) to flash `brewos.iso` to a USB drive 1. **Create bootable USB**: Use [Balena Etcher](https://www.balena.io/etcher/) to flash `boredos.iso` to a USB drive
2. **Prepare the system**: 2. **Prepare the system**:
- Enable legacy (BIOS) boot in your system BIOS/UEFI settings - Enable legacy (BIOS) boot in your system BIOS/UEFI settings
@ -130,7 +130,7 @@ qemu-system-x86_64 -m 2G -serial stdio -cdrom brewos.iso -boot d
## This project was previously labeled as "BrewKernel" ## This project was previously labeled as "BrewKernel"
Brewkernel was a text only very simple (and messy) project i started 3 years ago. It was my first work in OSDev and i absolutely loved it. It sadly just got too messy and i myself couldn't understand my own code anymore. About a year ago i started work on BrewOS, and pushed a *"working"* version of it a few days ago as of writing this *(Feb. 10 2026)* Brewkernel was a text only very simple (and messy) project i started 3 years ago. It was my first work in OSDev and i absolutely loved it. It sadly just got too messy and i myself couldn't understand my own code anymore. About a year ago i started work on BoredOS, and pushed a *"working"* version of it a few days ago as of writing this *(Feb. 10 2026)*
Brewkernel has already been deprecated and will not be accepting any pull requests or fix any issues as it is now a public archive. Brewkernel has already been deprecated and will not be accepting any pull requests or fix any issues as it is now a public archive.
Thanks to everyone who helped me with Brewkernel, even if it were just ideas, and intend to keep working on this for the forseeable future! Thanks to everyone who helped me with Brewkernel, even if it were just ideas, and intend to keep working on this for the forseeable future!
@ -143,7 +143,7 @@ This program is free software: you can redistribute it and/or modify it under th
NOTICE NOTICE
------ ------
This product includes software developed by Chris ("boreddevnl") as part of the BrewKernel project. This product includes software developed by Chris ("boreddevnl") as part of the BoredOS (Previously Brewkernel/BrewOS) project.
Copyright (C) 20242026 Chris / boreddevnl (previously boreddevhq) Copyright (C) 20242026 Chris / boreddevnl (previously boreddevhq)

6
bored.svg Normal file
View file

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="364" height="323" viewBox="0 0 364 323">
<g>
<path d="M 214.21 252.46 C206.89,254.00 191.49,255.09 186.50,254.42 C174.91,252.87 168.37,251.35 160.60,248.37 C131.04,237.05 110.95,215.05 101.36,183.50 C98.88,175.35 98.62,173.03 98.62,159.00 C98.62,144.97 98.88,142.65 101.36,134.50 C102.86,129.55 105.39,122.71 106.97,119.29 L 109.85 113.09 L 107.81 110.48 C105.03,106.95 102.00,98.70 102.00,94.67 C102.00,83.87 109.64,72.78 119.64,69.03 C130.66,64.91 141.50,67.22 149.75,75.46 C155.89,81.59 156.51,84.69 152.25,87.96 C150.74,89.13 146.31,92.51 142.41,95.48 C120.32,112.27 107.85,145.44 113.38,172.69 C117.57,193.40 127.18,209.55 142.78,222.09 C182.22,253.83 239.30,243.11 264.90,199.16 C272.19,186.63 276.79,166.84 275.57,153.25 C273.24,127.38 261.78,107.28 240.25,91.30 C231.06,84.48 230.86,82.84 238.25,75.45 C244.57,69.13 252.04,66.41 260.67,67.31 C274.35,68.72 286.00,81.01 286.00,94.02 C286.00,98.35 283.36,105.84 280.53,109.55 L 277.90 113.00 L 280.83 119.25 C297.85,155.52 289.63,198.90 260.39,227.11 C247.18,239.85 230.45,249.04 214.21,252.46 ZM 248.58 185.10 C246.34,186.12 244.05,186.93 243.50,186.89 C240.22,186.68 236.44,184.60 230.84,179.94 C227.35,177.03 221.35,172.62 217.50,170.14 C209.66,165.10 207.76,163.26 206.01,159.02 C202.91,151.53 213.38,143.02 226.75,142.17 C244.76,141.02 257.91,150.18 258.82,164.52 C259.48,174.91 256.11,181.68 248.58,185.10 ZM 148.72 186.01 C148.05,186.02 146.60,186.24 145.50,186.50 C143.24,187.03 137.53,184.77 134.64,182.21 C131.66,179.56 128.02,170.93 128.02,166.50 C128.02,161.61 131.74,153.45 135.62,149.80 C141.20,144.58 147.51,142.52 158.00,142.51 C166.46,142.50 168.11,142.81 173.08,145.33 C181.97,149.83 184.53,156.84 179.47,162.85 C178.08,164.50 173.18,168.33 168.58,171.36 C163.97,174.40 157.89,178.93 155.07,181.44 C152.24,183.95 149.39,186.01 148.72,186.01 ZM 201.14 210.27 C198.36,212.87 195.15,215.00 194.00,215.00 C189.68,215.00 178.00,201.55 178.00,196.58 C178.00,193.75 182.20,192.69 193.47,192.68 C199.54,192.67 205.49,192.98 206.70,193.38 C211.98,195.11 209.59,202.37 201.14,210.27 Z" fill="rgb(255,255,255)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
boredos.iso Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
build/cli_apps/boredver.o Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,32 +1,35 @@
# Brew OS 1.45 Beta # Bored OS 1.50
BrewOS is now in a Beta stage as i have brought over all apps from brewkernel and have made the DE a lot more usable and stable. BoredOS is now in a Beta stage as i have brought over all apps from brewkernel and have made the DE a lot more usable and stable.
## Brewkernel is now BrewOS!
Brewkernel will from now on be deprecated as it's core became too messy. I have built a less bloated kernel and wrote a DE above it, which is why it is now an OS instead of a kernel (in my opinion).
<img src="asciiart.png" width="200" /> </br> <img src="asciiart.png" width="200" /> </br>
Brew Kernel is a simple x86_64 hobbyist operating system. BoredOS is a simple x86_64 hobbyist operating system.
It features a DE (and WM), a FAT32 filesystem, customizable UI and much much more! It features a DE (and WM), a FAT32 filesystem, customizable UI and much much more!
![Screenshot 2026-02-10 at 18 59 10](https://github.com/user-attachments/assets/d8602e1a-dc76-4997-a91f-999b23ba3fc3)
*this screenshot might be outdated*
## Features ## Features
- Drag and drop mouse centered UI - Drag and drop mouse centered UI
- Customizable UI - Customizable UI
- Basic Networking Stack - Basic Networking Stack
- Brew WM - Bored WM
- Fat 32 FS - Fat 32 FS
- 64-bit long mode support - 64-bit long mode support
- Multiboot2 compliant - Multiboot2 compliant
- Text editor - Text editor
- Markdown Viewer - Markdown Viewer
- Minesweeper - Minesweeper
- Markdown Viewer
- GUI Text editor
- Paint application
- IDT - IDT
- Ability to run on actual x86_64 hardware - Ability to run on actual x86_64 hardware
- CLI - CLI
- (Limited) C Compiler
## Prerequisites ## Prerequisites
To build BrewOS, you'll need the following tools installed: To build BoredOS, you'll need the following tools installed:
- **x86_64 ELF Toolchain**: `x86_64-elf-gcc`, `x86_64-elf-ld` - **x86_64 ELF Toolchain**: `x86_64-elf-gcc`, `x86_64-elf-ld`
- **NASM**: Netwide Assembler for compiling assembly code - **NASM**: Netwide Assembler for compiling assembly code
@ -49,12 +52,12 @@ make
This will: This will:
1. Compile all kernel C sources and assembly files 1. Compile all kernel C sources and assembly files
2. Link the kernel ELF binary 2. Link the kernel ELF binary
3. Generate a bootable ISO image (`brewos.iso`) 3. Generate a bootable ISO image (`boredos.iso`)
The build output is organized as follows: The build output is organized as follows:
- Compiled object files: `build/` - Compiled object files: `build/`
- ISO root filesystem: `iso_root/` - ISO root filesystem: `iso_root/`
- Final ISO image: `brewos.iso` - Final ISO image: `boredos.iso`
## Running ## Running
@ -68,14 +71,14 @@ make run
Or manually: Or manually:
```sh ```sh
qemu-system-x86_64 -m 2G -serial stdio -cdrom brewos.iso -boot d qemu-system-x86_64 -m 2G -serial stdio -cdrom boredos.iso -boot d
``` ```
### Running on Real Hardware ### Running on Real Hardware
*Warning: This is at YOUR OWN RISK. This software comes with ZERO warranty and may break your system.* *Warning: This is at YOUR OWN RISK. This software comes with ZERO warranty and may break your system.*
1. **Create bootable USB**: Use [Balena Etcher](https://www.balena.io/etcher/) to flash `brewos.iso` to a USB drive 1. **Create bootable USB**: Use [Balena Etcher](https://www.balena.io/etcher/) to flash `boredos.iso` to a USB drive
2. **Prepare the system**: 2. **Prepare the system**:
- Enable legacy (BIOS) boot in your system BIOS/UEFI settings - Enable legacy (BIOS) boot in your system BIOS/UEFI settings
@ -126,6 +129,11 @@ qemu-system-x86_64 -m 2G -serial stdio -cdrom brewos.iso -boot d
### ###
## This project was previously labeled as "BrewKernel"
Brewkernel was a text only very simple (and messy) project i started 3 years ago. It was my first work in OSDev and i absolutely loved it. It sadly just got too messy and i myself couldn't understand my own code anymore. About a year ago i started work on BoredOS, and pushed a *"working"* version of it a few days ago as of writing this *(Feb. 10 2026)*
Brewkernel has already been deprecated and will not be accepting any pull requests or fix any issues as it is now a public archive.
Thanks to everyone who helped me with Brewkernel, even if it were just ideas, and intend to keep working on this for the forseeable future!
## License ## License
Copyright (C) 2024-2026 boreddevnl Copyright (C) 2024-2026 boreddevnl
@ -135,7 +143,7 @@ This program is free software: you can redistribute it and/or modify it under th
NOTICE NOTICE
------ ------
This product includes software developed by Chris ("boreddevnl") as part of the BrewKernel project. This product includes software developed by Chris ("boreddevnl") as part of the BoredOS (Previously Brewkernel/BrewOS) project.
Copyright (C) 20242026 Chris / boreddevnl (previously boreddevhq) Copyright (C) 20242026 Chris / boreddevnl (previously boreddevhq)

View file

@ -1,9 +1,9 @@
TIMEOUT=3 TIMEOUT=3
:BrewOS :BoredOS
PROTOCOL=limine PROTOCOL=limine
KERNEL_PATH=boot:///brewos.elf KERNEL_PATH=boot:///boredos.elf
#FRAMEBUFFER_WIDTH=1280 #FRAMEBUFFER_WIDTH=1280
#FRAMEBUFFER_HEIGHT=720 #FRAMEBUFFER_HEIGHT=720

View file

@ -1,9 +1,9 @@
TIMEOUT=3 TIMEOUT=3
:BrewOS :BoredOS
PROTOCOL=limine PROTOCOL=limine
KERNEL_PATH=boot:///brewos.elf KERNEL_PATH=boot:///boredos.elf
#FRAMEBUFFER_WIDTH=1280 #FRAMEBUFFER_WIDTH=1280
#FRAMEBUFFER_HEIGHT=720 #FRAMEBUFFER_HEIGHT=720

BIN
screenshot.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 897 KiB

View file

@ -5,35 +5,17 @@
Window win_about; Window win_about;
// Color definitions
#define COLOR_BLUE_LOGO 0xFF1E8AF5
#define COLOR_GREEN_LOGO 0xFF6DD651
#define COLOR_YELLOW_LOGO 0xFFF5BE34
#define COLOR_RED_LOGO 0xFFF05456
#define COLOR_PURPLE_LOGO 0xFFA65DC2
#define COLOR_CYAN_LOGO 0xFF368DF7
static void about_paint(Window *win) { static void about_paint(Window *win) {
int offset_x = win->x + 15; int offset_x = win->x + 15;
int offset_y = win->y + 35; int offset_y = win->y + 35;
// Draw brewkernel ASCII logo
draw_string(offset_x, offset_y, "( (", COLOR_BLUE_LOGO);
draw_string(offset_x, offset_y + 15, " ) )", COLOR_GREEN_LOGO); draw_boredos_logo(win->x + 60, offset_y, 4);
draw_string(offset_x, offset_y + 30, " ........", COLOR_YELLOW_LOGO);
draw_string(offset_x, offset_y + 45, " | |]", COLOR_RED_LOGO);
draw_string(offset_x, offset_y + 60, " \\ /", COLOR_PURPLE_LOGO);
draw_string(offset_x, offset_y + 75, " `----'", COLOR_CYAN_LOGO);
// Version info // Version info
draw_string(offset_x, offset_y + 105, "BrewOS", COLOR_BLACK); draw_string(offset_x, offset_y + 105, "BoredOS", COLOR_BLACK);
draw_string(offset_x, offset_y + 120, "BrewOS Version 1.45", COLOR_BLACK); draw_string(offset_x, offset_y + 120, "BoredOS Version 1.50", COLOR_BLACK);
draw_string(offset_x, offset_y + 135, "Kernel Version 2.3.1", COLOR_BLACK); draw_string(offset_x, offset_y + 135, "Kernel Version 2.4.0", COLOR_BLACK);
// Copyright // Copyright
draw_string(offset_x, offset_y + 150, "(C) 2026 boreddevnl.", COLOR_BLACK); draw_string(offset_x, offset_y + 150, "(C) 2026 boreddevnl.", COLOR_BLACK);
@ -48,7 +30,7 @@ static void about_click(Window *win, int x, int y) {
} }
void about_init(void) { void about_init(void) {
win_about.title = "About BrewOS"; win_about.title = "About BoredOS";
win_about.x = 250; win_about.x = 250;
win_about.y = 180; win_about.y = 180;
win_about.w = 185; win_about.w = 185;

View file

@ -1,5 +1,4 @@
; brew-os/src/kernel/boot.asm ; 64-bit Entry Point for BoredOS
; 64-bit Entry Point for BrewOS
section .text section .text
global _start global _start

View file

@ -1,7 +0,0 @@
#include "cli_utils.h"
void cli_cmd_brewver(char *args) {
(void)args;
cli_write("BrewOS v1.45 Beta\n");
cli_write("BrewOS Kernel V2.3.1 Beta\n");
}

View file

@ -0,0 +1,7 @@
#include "cli_utils.h"
void cli_cmd_boredver(char *args) {
(void)args;
cli_write("BrewOS v1.50 Beta\n");
cli_write("BrewOS Kernel V2.4.0 Beta\n");
}

View file

@ -11,11 +11,10 @@ void cli_cmd_reboot(char *args);
void cli_cmd_shutdown(char *args); void cli_cmd_shutdown(char *args);
void cli_cmd_uptime(char *args); void cli_cmd_uptime(char *args);
void cli_cmd_man(char *args); void cli_cmd_man(char *args);
void cli_cmd_license(char *args);
void cli_cmd_txtedit(char *args); void cli_cmd_txtedit(char *args);
void cli_cmd_blind(char *args); void cli_cmd_blind(char *args);
void cli_cmd_readtheman(char *args); void cli_cmd_readtheman(char *args);
void cli_cmd_brewver(char *args); void cli_cmd_boredver(char *args);
void cli_cmd_clear(char *args); void cli_cmd_clear(char *args);
void cli_cmd_exit(char *args); void cli_cmd_exit(char *args);

View file

@ -1,7 +1,7 @@
#include "cli_utils.h" #include "cli_utils.h"
void cli_cmd_cowsay(char *args) { void cli_cmd_cowsay(char *args) {
if (!args || !*args) args = (char*)"Brew!"; if (!args || !*args) args = (char*)"Bored!";
size_t len = cli_strlen(args); size_t len = cli_strlen(args);
cli_write(" "); cli_write(" ");

View file

@ -6,7 +6,7 @@ void cli_cmd_help(char *args) {
cli_write(" HELP - Display this help message\n"); cli_write(" HELP - Display this help message\n");
cli_write(" DATE - Display current date and time\n"); cli_write(" DATE - Display current date and time\n");
cli_write(" CLEAR - Clear the screen\n"); cli_write(" CLEAR - Clear the screen\n");
cli_write(" BREWVER - Gives version info\n"); cli_write(" BOREDVER - Gives version info\n");
cli_write(" MATH - math <op> <a> <b> (e.g. math + 1 2)\n"); cli_write(" MATH - math <op> <a> <b> (e.g. math + 1 2)\n");
cli_write(" MAN - Show user manual (interactive)\n"); cli_write(" MAN - Show user manual (interactive)\n");
cli_write(" LICENSE - Show license (interactive)\n"); cli_write(" LICENSE - Show license (interactive)\n");
@ -16,4 +16,5 @@ void cli_cmd_help(char *args) {
cli_write(" REBOOT - Reboot system\n"); cli_write(" REBOOT - Reboot system\n");
cli_write(" SHUTDOWN - Shutdown system\n"); cli_write(" SHUTDOWN - Shutdown system\n");
cli_write(" MEMINFO - Gives memory info\n"); cli_write(" MEMINFO - Gives memory info\n");
cli_write(" CC - C compiler\n");
} }

View file

@ -1,21 +0,0 @@
#include "cli_utils.h"
// Forward declaration from cmd.c
extern void pager_wrap_content(const char **lines, int count);
extern void pager_set_mode(void);
const char* license_pages[] = {
" GNU GENERAL PUBLIC LICENSE",
" Version 3, 29 June 2007",
" Copyright (C) 2024-2026 boreddevnl",
"",
" (License text abbreviated for build size. See https://www.gnu.org/licenses/gpl-3.0.txt)",
"--- End of License ---"
};
const int license_num_lines = sizeof(license_pages) / sizeof(char*);
void cli_cmd_license(char *args) {
(void)args;
pager_wrap_content(license_pages, license_num_lines);
pager_set_mode();
}

View file

@ -5,37 +5,8 @@ extern void pager_wrap_content(const char **lines, int count);
extern void pager_set_mode(void); extern void pager_set_mode(void);
const char* manual_pages[] = { const char* manual_pages[] = {
"BrewKernel User Manual", "No manual round here pal",
"----------------------",
"",
"Welcome to the BrewKernel.",
"",
"== Features ==",
"* Ramdisk-based Filesystem: A simple in-memory filesystem.",
"* VGA Text Mode Driver: Full control over text/colors.",
"* PS/2 Keyboard Driver: Handles key presses.",
"* Simple CLI: A basic shell.",
"",
"== Available Commands ==",
"HELP: Displays a short list of available commands.",
"MAN: Shows this detailed user manual.",
"ABOUT: Displays information about the kernel.",
"MATH: A simple calculator.",
"DATE: Displays the current date and time.",
"TXTEDIT: A simple text editor with file path support.",
" USAGE: txtedit <filename>",
" EXAMPLES:",
" txtedit file.txt (relative path in current directory)",
" txtedit /file.txt (absolute path in root)",
" txtedit /docs/note.txt (absolute path with subdirectories)",
" FEATURES: Create/Edit files, Save (to RAM), Navigation.",
"CLEAR: Clears the entire screen.",
"EXIT: Exits the CLI mode.",
"LICENSE: Displays the full GNU GPL v3.",
"COWSAY: Moo!",
"UPTIME: Shows how long the system has been running.",
"BEEP: Makes a beep sound.",
"--- End of Manual ---"
}; };
const int manual_num_lines = sizeof(manual_pages) / sizeof(char*); const int manual_num_lines = sizeof(manual_pages) / sizeof(char*);

View file

@ -380,14 +380,12 @@ static const CommandEntry commands[] = {
{"date", cli_cmd_date}, {"date", cli_cmd_date},
{"CLEAR", cli_cmd_clear}, {"CLEAR", cli_cmd_clear},
{"clear", cli_cmd_clear}, {"clear", cli_cmd_clear},
{"BREWVER", cli_cmd_brewver}, {"BOREDVER", cli_cmd_boredver},
{"brewver", cli_cmd_brewver}, {"boredver", cli_cmd_boredver},
{"MATH", cli_cmd_math}, {"MATH", cli_cmd_math},
{"math", cli_cmd_math}, {"math", cli_cmd_math},
{"MAN", cli_cmd_man}, {"MAN", cli_cmd_man},
{"man", cli_cmd_man}, {"man", cli_cmd_man},
{"LICENSE", cli_cmd_license},
{"license", cli_cmd_license},
{"TXTEDIT", cli_cmd_txtedit}, {"TXTEDIT", cli_cmd_txtedit},
{"txtedit", cli_cmd_txtedit}, {"txtedit", cli_cmd_txtedit},
{"UPTIME", cli_cmd_uptime}, {"UPTIME", cli_cmd_uptime},
@ -924,7 +922,7 @@ static void cmd_key(Window *target, char c) {
void cmd_reset(void) { void cmd_reset(void) {
// Reset terminal to fresh state // Reset terminal to fresh state
cmd_screen_clear(); cmd_screen_clear();
cmd_write("BrewOS Command Prompt\n"); cmd_write("BoredOS Command Prompt\n");
if (msg_count > 0) { if (msg_count > 0) {
cmd_write("You have "); cmd_write("You have ");
cmd_write_int(msg_count); cmd_write_int(msg_count);
@ -957,14 +955,14 @@ static void create_test_files(void) {
fh = fat32_open("README.md", "w"); fh = fat32_open("README.md", "w");
if (fh) { if (fh) {
const char *content = const char *content =
"# Brew OS 1.44 Beta\n\n" "# Bored OS 1.50\n\n"
"BrewOS is now in a Beta stage as i have brought over all apps from brewkernel and have made the DE a lot more usable and stable.\n" "BoredOS is now in a Beta stage as i have brought over all apps from boredkernel and have made the DE a lot more usable and stable.\n"
"## Brewkernel is now BrewOS!\n" "## Boredkernel is now BoredOS!\n"
"Brewkernel will from now on be deprecated as it's core became too messy. I have built a less bloated kernel and wrote a DE above it, which is why it is now an OS instead of a kernel (in my opinion).\n\n" "Boredkernel will from now on be deprecated as it's core became too messy. I have built a less bloated kernel and wrote a DE above it, which is why it is now an OS instead of a kernel (in my opinion).\n\n"
"Brew Kernel is a simple x86_64 hobbyist operating system.\n" "Bored Kernel is a simple x86_64 hobbyist operating system.\n"
"It features a DE (and WM), a FAT32 filesystem, customizable UI and much much more!\n\n" "It features a DE (and WM), a FAT32 filesystem, customizable UI and much much more!\n\n"
"## Features\n" "## Features\n"
"- Brew WM\n" "- Bored WM\n"
"- Fat 32 FS\n" "- Fat 32 FS\n"
"- 64-bit long mode support\n" "- 64-bit long mode support\n"
"- Multiboot2 compliant\n" "- Multiboot2 compliant\n"
@ -973,7 +971,7 @@ static void create_test_files(void) {
"- Ability to run on actual x86_64 hardware\n" "- Ability to run on actual x86_64 hardware\n"
"- CLI\n\n" "- CLI\n\n"
"## Prerequisites\n\n" "## Prerequisites\n\n"
"To build BrewOS, you'll need the following tools installed:\n\n" "To build BoredOS, you'll need the following tools installed:\n\n"
"- **x86_64 ELF Toolchain**: `x86_64-elf-gcc`, `x86_64-elf-ld`\n" "- **x86_64 ELF Toolchain**: `x86_64-elf-gcc`, `x86_64-elf-ld`\n"
"- **NASM**: Netwide Assembler for compiling assembly code\n" "- **NASM**: Netwide Assembler for compiling assembly code\n"
"- **xorriso**: For creating bootable ISO images\n" "- **xorriso**: For creating bootable ISO images\n"
@ -990,11 +988,11 @@ static void create_test_files(void) {
"This will:\n" "This will:\n"
"1. Compile all kernel C sources and assembly files\n" "1. Compile all kernel C sources and assembly files\n"
"2. Link the kernel ELF binary\n" "2. Link the kernel ELF binary\n"
"3. Generate a bootable ISO image (`brewos.iso`)\n\n" "3. Generate a bootable ISO image (`boredos.iso`)\n\n"
"The build output is organized as follows:\n" "The build output is organized as follows:\n"
"- Compiled object files: `build/`\n" "- Compiled object files: `build/`\n"
"- ISO root filesystem: `iso_root/`\n" "- ISO root filesystem: `iso_root/`\n"
"- Final ISO image: `brewos.iso`\n\n" "- Final ISO image: `boredos.iso`\n\n"
"## Running\n\n" "## Running\n\n"
"### QEMU Emulation\n\n" "### QEMU Emulation\n\n"
"Run the kernel in QEMU:\n\n" "Run the kernel in QEMU:\n\n"
@ -1003,11 +1001,11 @@ static void create_test_files(void) {
"```\n\n" "```\n\n"
"Or manually:\n" "Or manually:\n"
"```sh\n" "```sh\n"
"qemu-system-x86_64 -m 2G -serial stdio -cdrom brewos.iso -boot d\n" "qemu-system-x86_64 -m 2G -serial stdio -cdrom boredos.iso -boot d\n"
"```\n\n" "```\n\n"
"### Running on Real Hardware\n\n" "### Running on Real Hardware\n\n"
"*Warning: This is at YOUR OWN RISK. This software comes with ZERO warranty and may break your system.*\n\n" "*Warning: This is at YOUR OWN RISK. This software comes with ZERO warranty and may break your system.*\n\n"
"1. **Create bootable USB**: Use [Balena Etcher](https://www.balena.io/etcher/) to flash `brewos.iso` to a USB drive\n\n" "1. **Create bootable USB**: Use [Balena Etcher](https://www.balena.io/etcher/) to flash `boredos.iso` to a USB drive\n\n"
"2. **Prepare the system**:\n" "2. **Prepare the system**:\n"
" - Enable legacy (BIOS) boot in your system BIOS/UEFI settings\n" " - Enable legacy (BIOS) boot in your system BIOS/UEFI settings\n"
" - Disable Secure Boot if needed\n\n" " - Disable Secure Boot if needed\n\n"
@ -1033,7 +1031,7 @@ static void create_test_files(void) {
"This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n" "This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n"
"NOTICE\n" "NOTICE\n"
"------\n\n" "------\n\n"
"This product includes software developed by Chris (\"boreddevnl\") as part of the BrewKernel project.\n\n" "This product includes software developed by Chris (\"boreddevnl\") as part of the BoredOS project.\n\n"
"Copyright (C) 20242026 Chris / boreddevnl (previously boreddevhq)\n\n" "Copyright (C) 20242026 Chris / boreddevnl (previously boreddevhq)\n\n"
"All source files in this repository contain copyright and license\n" "All source files in this repository contain copyright and license\n"
"headers that must be preserved in redistributions and derivative works.\n\n" "headers that must be preserved in redistributions and derivative works.\n\n"

View file

@ -3,6 +3,7 @@
#include <stddef.h> #include <stddef.h>
#include "wm.h" #include "wm.h"
#include "network.h" #include "network.h"
#include "cli_apps/cli_utils.h"
Window win_control_panel; Window win_control_panel;
@ -12,12 +13,14 @@ Window win_control_panel;
#define COLOR_BLUE_BG 0xFF000080 #define COLOR_BLUE_BG 0xFF000080
#define COLOR_PURPLE 0xFF800080 #define COLOR_PURPLE 0xFF800080
#define COLOR_GREY 0xFF454545 #define COLOR_GREY 0xFF454545
#define MOUSE_BEIGE 0xFFD6D2C4
// Control panel state // Control panel state
#define VIEW_MAIN 0 #define VIEW_MAIN 0
#define VIEW_WALLPAPER 1 #define VIEW_WALLPAPER 1
#define VIEW_NETWORK 2 #define VIEW_NETWORK 2
#define VIEW_DESKTOP 3 #define VIEW_DESKTOP 3
#define VIEW_MOUSE 4
static int current_view = VIEW_MAIN; static int current_view = VIEW_MAIN;
static char rgb_r[4] = ""; static char rgb_r[4] = "";
@ -208,6 +211,22 @@ static void control_panel_paint_main(Window *win) {
draw_rect(offset_x + 5, desk_offset_y + 6, 24, 1, COLOR_BLACK); draw_rect(offset_x + 5, desk_offset_y + 6, 24, 1, COLOR_BLACK);
draw_rect(offset_x + 5, desk_offset_y + 6, 1, 14, COLOR_BLACK); draw_rect(offset_x + 5, desk_offset_y + 6, 1, 14, COLOR_BLACK);
draw_string(offset_x + 40, desk_offset_y + 8, "Desktop", 0xFF000000); draw_string(offset_x + 40, desk_offset_y + 8, "Desktop", 0xFF000000);
// Draw Mouse Icon
int mouse_offset_y = desk_offset_y + 35;
// Mouse body
draw_rect(offset_x + 17, mouse_offset_y, 1, 2, COLOR_BLACK);
draw_rect(offset_x + 16, mouse_offset_y - 2, 1, 2, COLOR_BLACK);
draw_rect(offset_x + 10, mouse_offset_y + 2, 15, 20, MOUSE_BEIGE);
draw_rect(offset_x + 10, mouse_offset_y + 2, 15, 1, COLOR_BLACK);
draw_rect(offset_x + 10, mouse_offset_y + 2, 1, 20, COLOR_BLACK);
draw_rect(offset_x + 24, mouse_offset_y + 2, 1, 20, COLOR_BLACK);
draw_rect(offset_x + 10, mouse_offset_y + 21, 15, 1, COLOR_BLACK);
// Buttons separator
draw_rect(offset_x + 10, mouse_offset_y + 8, 15, 1, COLOR_BLACK);
draw_rect(offset_x + 17, mouse_offset_y + 2, 1, 6, COLOR_BLACK);
draw_string(offset_x + 40, mouse_offset_y + 8, "Mouse", 0xFF000000);
} }
static void control_panel_paint_wallpaper(Window *win) { static void control_panel_paint_wallpaper(Window *win) {
@ -468,6 +487,30 @@ static void control_panel_paint_desktop(Window *win) {
draw_button(offset_x + 180, section_y, 20, 20, "+", false); draw_button(offset_x + 180, section_y, 20, 20, "+", false);
} }
static void control_panel_paint_mouse(Window *win) {
int offset_x = win->x + 8;
int offset_y = win->y + 30;
// Back button
draw_string(offset_x, offset_y, "< Back", 0xFF000080);
draw_string(offset_x, offset_y + 25, "Mouse Settings:", 0xFF000000);
int section_y = offset_y + 60;
draw_string(offset_x, section_y, "Speed:", COLOR_BLACK);
// Slider track
draw_rect(offset_x + 60, section_y + 8, 200, 2, COLOR_DKGRAY);
// Slider knob (range 1-50, default 10)
int knob_x = offset_x + 60 + (mouse_speed - 1) * 190 / 49;
draw_button(knob_x, section_y, 10, 18, "", false);
draw_string(offset_x + 270, section_y + 4, "x", COLOR_BLACK);
char speed_str[4];
cli_itoa(mouse_speed, speed_str);
draw_string(offset_x + 280, section_y + 4, speed_str, COLOR_BLACK);
}
static void control_panel_paint(Window *win) { static void control_panel_paint(Window *win) {
if (current_view == VIEW_MAIN) { if (current_view == VIEW_MAIN) {
control_panel_paint_main(win); control_panel_paint_main(win);
@ -477,6 +520,8 @@ static void control_panel_paint(Window *win) {
control_panel_paint_network(win); control_panel_paint_network(win);
} else if (current_view == VIEW_DESKTOP) { } else if (current_view == VIEW_DESKTOP) {
control_panel_paint_desktop(win); control_panel_paint_desktop(win);
} else if (current_view == VIEW_MOUSE) {
control_panel_paint_mouse(win);
} }
} }
@ -508,6 +553,13 @@ static void control_panel_handle_click(Window *win, int x, int y) {
y >= desk_offset_y && y < desk_offset_y + 25) { y >= desk_offset_y && y < desk_offset_y + 25) {
current_view = VIEW_DESKTOP; current_view = VIEW_DESKTOP;
} }
// Check mouse button
int mouse_offset_y = desk_offset_y + 35;
if (x >= offset_x + 5 && x < offset_x + 120 &&
y >= mouse_offset_y && y < mouse_offset_y + 25) {
current_view = VIEW_MOUSE;
}
} else if (current_view == VIEW_WALLPAPER) { } else if (current_view == VIEW_WALLPAPER) {
int offset_x = 8; int offset_x = 8;
int offset_y = 30; int offset_y = 30;
@ -862,6 +914,25 @@ static void control_panel_handle_click(Window *win, int x, int y) {
desktop_max_cols++; desktop_max_cols++;
wm_refresh_desktop(); wm_refresh_desktop();
} }
} else if (current_view == VIEW_MOUSE) {
int offset_x = 8;
int offset_y = 30;
// Back button
if (x >= offset_x && x < offset_x + 40 && y >= offset_y && y < offset_y + 15) {
current_view = VIEW_MAIN;
return;
}
int section_y = offset_y + 60;
// Slider interaction
if (x >= offset_x + 60 && x <= offset_x + 260 && y >= section_y && y <= section_y + 20) {
int new_speed = 1 + (x - (offset_x + 60)) * 49 / 200;
if (new_speed < 1) new_speed = 1;
if (new_speed > 50) new_speed = 50;
mouse_speed = new_speed;
return;
}
} }
} }

View file

@ -626,7 +626,9 @@ static int explorer_build_context_menu(Window *win, ExplorerContextItem *items_o
if (is_dir) { if (is_dir) {
items_out[count++] = (ExplorerContextItem){"New File", 101, true, COLOR_BLACK}; items_out[count++] = (ExplorerContextItem){"New File", 101, true, COLOR_BLACK};
items_out[count++] = (ExplorerContextItem){"New Folder", 102, true, COLOR_BLACK}; items_out[count++] = (ExplorerContextItem){"New Folder", 102, true, COLOR_BLACK};
// Separator logic handled in paint
// Only show color options if it's NOT the Recycle Bin folder (i love hardcoding stuff cause it's lowk easier (cry about it))
if (explorer_strcmp(state->items[state->file_context_menu_item].name, "RecycleBin") != 0) {
items_out[count++] = (ExplorerContextItem){"---", 0, false, 0}; // Marker items_out[count++] = (ExplorerContextItem){"---", 0, false, 0}; // Marker
items_out[count++] = (ExplorerContextItem){"Blue", 200, true, COLOR_APPLE_BLUE}; items_out[count++] = (ExplorerContextItem){"Blue", 200, true, COLOR_APPLE_BLUE};
items_out[count++] = (ExplorerContextItem){"Red", 201, true, COLOR_RED}; items_out[count++] = (ExplorerContextItem){"Red", 201, true, COLOR_RED};
@ -635,6 +637,7 @@ static int explorer_build_context_menu(Window *win, ExplorerContextItem *items_o
items_out[count++] = (ExplorerContextItem){"Black", 204, true, COLOR_BLACK}; items_out[count++] = (ExplorerContextItem){"Black", 204, true, COLOR_BLACK};
} }
} }
}
return count; return count;
} }
@ -938,6 +941,7 @@ static void explorer_paint(Window *win) {
ExplorerState *state = (ExplorerState*)win->data; ExplorerState *state = (ExplorerState*)win->data;
int offset_x = win->x + 4; int offset_x = win->x + 4;
int offset_y = win->y + 24; int offset_y = win->y + 24;
DirtyRect dirty = graphics_get_dirty_rect();
// Fill background // Fill background
draw_rect(offset_x, offset_y, win->w - 8, win->h - 28, COLOR_LTGRAY); draw_rect(offset_x, offset_y, win->w - 8, win->h - 28, COLOR_LTGRAY);
@ -992,7 +996,13 @@ static void explorer_paint(Window *win) {
explorer_draw_icon_label(item_x, item_y, display_name, (i == state->selected_item) ? COLOR_WHITE : COLOR_BLACK); explorer_draw_icon_label(item_x, item_y, display_name, (i == state->selected_item) ? COLOR_WHITE : COLOR_BLACK);
} }
// Restore dirty-rect clipping instead of clearing it entirely.
// This ensures the context menu respects the dirty region.
if (dirty.active) {
graphics_set_clipping(dirty.x, dirty.y, dirty.w, dirty.h);
} else {
graphics_clear_clipping(); graphics_clear_clipping();
}
// Draw dropdown menu if visible // Draw dropdown menu if visible
if (state->dropdown_menu_visible) { if (state->dropdown_menu_visible) {

View file

@ -238,6 +238,39 @@ void graphics_set_bg_pattern(const uint32_t *pattern) {
g_use_pattern = true; g_use_pattern = true;
} }
void draw_boredos_logo(int x, int y, int scale) {
static const uint8_t brewos_bmp[] = {
0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0, // 0: Ears
0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0, // 1: Ears
1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1, // 2: Ears (Separated)
1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1, // 3: Forehead / Ears
1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1, // 4: Face
1,1,2,2,2,1,1,2,2,1,1,2,2,2,1,1, // 5: Eyes start
1,1,2,2,1,1,1,1,1,1,1,1,2,2,1,1, // 6: Eyes
1,1,2,2,1,1,1,1,1,1,1,1,2,2,1,1, // 7: Eyes
1,1,2,2,1,1,1,1,1,1,1,1,2,2,1,1, // 8: Eyes
1,1,2,2,2,1,1,2,2,1,1,2,2,2,1,1, // 9: Under eyes
1,1,2,2,2,2,2,1,1,2,2,2,2,2,1,1, // 10: Nose
1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1, // 11: Cheeks
1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1, // 12: Jaw
0,1,1,1,2,2,2,2,2,2,2,2,1,1,1,0, // 13: Chin
0,0,1,1,1,2,2,2,2,2,2,1,1,1,0,0, // 14: Chin outline
0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0 // 15: Bottom
};
for (int r = 0; r < 16; r++) {
for (int c = 0; c < 16; c++) {
uint8_t p = brewos_bmp[r * 16 + c];
if (p == 1) {
draw_rect(x + c * scale, y + r * scale, scale, scale, 0xFF1A1A1A); // rgb(26,26,26)
} else if (p == 2) {
draw_rect(x + c * scale, y + r * scale, scale, scale, 0xFFFEFEFE); // rgb(254,254,254)
}
}
}
}
// Double buffering functions // Double buffering functions
void graphics_clear_back_buffer(uint32_t color) { void graphics_clear_back_buffer(uint32_t color) {
if (!g_fb) return; if (!g_fb) return;

View file

@ -20,6 +20,9 @@ void draw_desktop_background(void);
void graphics_set_bg_color(uint32_t color); void graphics_set_bg_color(uint32_t color);
void graphics_set_bg_pattern(const uint32_t *pattern); // 128x128 pattern void graphics_set_bg_pattern(const uint32_t *pattern); // 128x128 pattern
void draw_boredos_logo(int x, int y, int scale);
// Get screen dimensions // Get screen dimensions
int get_screen_width(void); int get_screen_width(void);
int get_screen_height(void); int get_screen_height(void);

View file

@ -146,6 +146,7 @@ static void paint_click(Window *win, int x, int y) {
if (x >= 12 && x < 48) { if (x >= 12 && x < 48) {
if (y >= win->h - 65 && y < win->h - 45) { if (y >= win->h - 65 && y < win->h - 45) {
paint_reset(); paint_reset();
wm_mark_dirty(win->x, win->y, win->w, win->h);
return; return;
} }
if (y >= win->h - 40 && y < win->h - 20) { if (y >= win->h - 40 && y < win->h - 20) {
@ -161,6 +162,7 @@ static void paint_click(Window *win, int x, int y) {
if (y >= cy && y < cy + 20) { if (y >= cy && y < cy + 20) {
uint32_t colors[] = {COLOR_BLACK, COLOR_RED, COLOR_APPLE_GREEN, COLOR_APPLE_BLUE, COLOR_APPLE_YELLOW, COLOR_WHITE}; uint32_t colors[] = {COLOR_BLACK, COLOR_RED, COLOR_APPLE_GREEN, COLOR_APPLE_BLUE, COLOR_APPLE_YELLOW, COLOR_WHITE};
current_color = colors[i]; current_color = colors[i];
wm_mark_dirty(win->x, win->y, win->w, win->h);
return; return;
} }
} }
@ -168,6 +170,15 @@ static void paint_click(Window *win, int x, int y) {
paint_handle_mouse(x, y); paint_handle_mouse(x, y);
} }
static void paint_mouse_move(Window *win, int x, int y, uint8_t buttons) {
if (buttons & 0x01) { // Left button down
paint_handle_mouse(x, y);
wm_mark_dirty(win->x, win->y, win->w, win->h);
} else {
paint_reset_last_pos();
}
}
void paint_init(void) { void paint_init(void) {
win_paint.title = "Paint"; win_paint.title = "Paint";
win_paint.x = 150; win_paint.x = 150;

View file

@ -5,9 +5,9 @@
#include <stdbool.h> #include <stdbool.h>
// Simple Stack-Based VM // Simple Stack-Based VM
// Header: "BREWEXE" (7 bytes) + Version (1 byte) // Header: "BORDEXE" (7 bytes) + Version (1 byte)
#define VM_MAGIC "BREWEXE" #define VM_MAGIC "BORDEXE"
#define VM_STACK_SIZE 256 #define VM_STACK_SIZE 256
#define VM_MEMORY_SIZE (64 * 1024) // 64KB #define VM_MEMORY_SIZE (64 * 1024) // 64KB

View file

@ -91,6 +91,11 @@ bool desktop_auto_align = true;
int desktop_max_rows_per_col = 13; int desktop_max_rows_per_col = 13;
int desktop_max_cols = 23; int desktop_max_cols = 23;
// Mouse Settings
int mouse_speed = 10; // Default 1.0x (range 1-50)
static int mouse_accum_x = 0;
static int mouse_accum_y = 0;
// Helper to check if string ends with suffix // Helper to check if string ends with suffix
static bool str_ends_with(const char *str, const char *suffix) { static bool str_ends_with(const char *str, const char *suffix) {
int str_len = 0; while(str[str_len]) str_len++; int str_len = 0; while(str[str_len]) str_len++;
@ -368,36 +373,6 @@ void draw_button(int x, int y, int w, int h, const char *text, bool pressed) {
draw_string(tx, ty, text, COLOR_BLACK); draw_string(tx, ty, text, COLOR_BLACK);
} }
void draw_coffee_cup(int x, int y, int size) {
int cup_w = size;
int cup_h = size - 2;
draw_rect(x + 1, y + 2, cup_w - 2, cup_h - 3, COLOR_LTGRAY);
// Cup outline
draw_rect(x + 1, y + 2, cup_w - 2, 1, COLOR_BLACK); // Top
draw_rect(x + 1, y + 2, 1, cup_h - 3, COLOR_BLACK); // Left
draw_rect(x + cup_w - 2, y + 2, 1, cup_h - 3, COLOR_BLACK); // Right
draw_rect(x + 1, y + cup_h - 1, cup_w - 2, 1, COLOR_BLACK); // Bottom
draw_rect(x + 1, y + cup_h - 1, 1, 1, COLOR_LTGRAY);
draw_rect(x + cup_w - 2, y + cup_h - 1, 1, 1, COLOR_LTGRAY);
draw_rect(x + cup_w, y + 3, 2, 8, COLOR_BLACK);
draw_rect(x + cup_w - 2, y + 3, 2, 1, COLOR_BLACK);
draw_rect(x + cup_w - 2, y + 10, 2, 1, COLOR_BLACK);
int stripe_height = (cup_h - 5) / 6;
int coffee_y = y + 4;
draw_rect(x + 2, coffee_y, cup_w - 4, stripe_height, COLOR_APPLE_BLUE);
draw_rect(x + 2, coffee_y + stripe_height, cup_w - 4, stripe_height, COLOR_APPLE_GREEN);
draw_rect(x + 2, coffee_y + stripe_height * 2, cup_w - 4, stripe_height, COLOR_APPLE_YELLOW);
draw_rect(x + 2, coffee_y + stripe_height * 3, cup_w - 4, stripe_height, COLOR_APPLE_RED);
draw_rect(x + 2, coffee_y + stripe_height * 4, cup_w - 4, stripe_height, COLOR_APPLE_VIOLET);
draw_rect(x + 2, coffee_y + stripe_height * 5, cup_w - 4, stripe_height, COLOR_APPLE_BLUE);
}
void draw_icon(int x, int y, const char *label) { void draw_icon(int x, int y, const char *label) {
// Simple "File" Icon // Simple "File" Icon
draw_rect(x + 29, y, 20, 25, COLOR_WHITE); draw_rect(x + 29, y, 20, 25, COLOR_WHITE);
@ -773,7 +748,9 @@ void wm_paint(void) {
for (int i = 0; i < window_count; i++) { for (int i = 0; i < window_count; i++) {
Window *win = sorted_windows[i]; Window *win = sorted_windows[i];
if (!win->visible) continue; if (!win->visible) continue;
if (dirty.active) {
if (dirty.active && !win->focused) {
if (win->x + win->w <= dirty.x || win->x >= dirty.x + dirty.w || if (win->x + win->w <= dirty.x || win->x >= dirty.x + dirty.w ||
win->y + win->h <= dirty.y || win->y >= dirty.y + dirty.h) { win->y + win->h <= dirty.y || win->y >= dirty.y + dirty.h) {
continue; continue;
@ -788,10 +765,10 @@ void wm_paint(void) {
// 5. Start Button // 5. Start Button
draw_bevel_rect(2, sh - 26, 90, 24, start_menu_open); draw_bevel_rect(2, sh - 26, 90, 24, start_menu_open);
// Draw BrewOS logo // Draw Boredos logo
draw_coffee_cup(5, sh - 24, 20); draw_boredos_logo(6, sh - 22, 1);
// Draw BrewOS text // Draw BoredOS text
draw_string(35, sh - 18, "BrewOS", COLOR_BLACK); draw_string(35, sh - 18, "BoredOS", COLOR_BLACK);
// Clock // Clock
draw_clock(sw - 80, sh - 20); draw_clock(sw - 80, sh - 20);
@ -811,7 +788,7 @@ void wm_paint(void) {
draw_string(8, menu_y + 108, "Minesweeper", COLOR_BLACK); draw_string(8, menu_y + 108, "Minesweeper", COLOR_BLACK);
draw_string(8, menu_y + 128, "Control Panel", COLOR_BLACK); draw_string(8, menu_y + 128, "Control Panel", COLOR_BLACK);
draw_string(8, menu_y + 148, "Paint", COLOR_BLACK); draw_string(8, menu_y + 148, "Paint", COLOR_BLACK);
draw_string(8, menu_y + 168, "About BrewOS", COLOR_BLACK); draw_string(8, menu_y + 168, "About BoredOS", COLOR_BLACK);
// Separator line // Separator line
draw_rect(5, menu_y + 185, 110, 1, COLOR_BLACK); draw_rect(5, menu_y + 185, 110, 1, COLOR_BLACK);
@ -1220,8 +1197,17 @@ void wm_handle_right_click(int x, int y) {
prev_mx = mx; prev_mx = mx;
prev_my = my; prev_my = my;
mx += dx; mouse_accum_x += dx * mouse_speed;
my += dy; mouse_accum_y += dy * mouse_speed;
int move_x = mouse_accum_x / 10;
int move_y = mouse_accum_y / 10;
mouse_accum_x -= move_x * 10;
mouse_accum_y -= move_y * 10;
mx += move_x;
my += move_y;
if (mx < 0) mx = 0; if (mx < 0) mx = 0;
if (my < 0) my = 0; if (my < 0) my = 0;

View file

@ -85,4 +85,7 @@ extern bool desktop_auto_align;
extern int desktop_max_rows_per_col; extern int desktop_max_rows_per_col;
extern int desktop_max_cols; extern int desktop_max_cols;
// Mouse Settings
extern int mouse_speed;
#endif #endif