feat: Redesign GUI desktop in Windows/KDE style with Start menu, Terminal, Task Manager, hardware mouse cursor, and IRQ 12 support

This commit is contained in:
RarDog
2026-09-02 20:49:50 +03:00
parent 78d38f7620
commit d2e4938c69
7 changed files with 863 additions and 294 deletions
+1 -1
View File
@@ -108,7 +108,7 @@ servers: libc hal $(LVGL_LIB)
@# Desktop GUI Server (LVGL v8.3)
@$(CXX) $(CXXFLAGS) -Ilib/lvgl -c $(SERVERS_DIR)/gui_server/main.cpp -o $(BUILD_DIR)/gui_main.o
@$(LD) -T $(CONFIG_DIR)/user.ld -nostdlib -static -o $(GUI_SERVER) \
$(BUILD_DIR)/gui_main.o $(BUILD_DIR)/ipc.o $(LVGL_LIB) $(LIBC_OBJS)
$(BUILD_DIR)/gui_main.o $(BUILD_DIR)/ipc.o $(NET_OBJS) $(LVGL_LIB) $(LIBC_OBJS)
# Download and build the Limine bootloader host tool
limine-setup:
+41
View File
@@ -39,3 +39,44 @@ keyboard_isr_entry:
pop rax
iretq
.global mouse_isr_entry
.extern mouse_interrupt_handler
mouse_isr_entry:
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
call mouse_interrupt_handler
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
iretq
+5
View File
@@ -53,6 +53,7 @@ extern "C" {
fn default_isr_stub();
fn timer_isr_entry();
fn keyboard_isr_entry();
fn mouse_isr_entry();
}
// Global assembly ISR stub with vector ID pushed as separate stubs (0-31)
@@ -153,6 +154,10 @@ pub unsafe fn init() {
let kbd_addr = keyboard_isr_entry as *const () as usize as u64;
(*idt_ptr.add(33)).set_handler(kbd_addr, 0, 0);
// Set Mouse Interrupt (Vector 44 / 0x2C - Slave PIC IRQ 12)
let mouse_addr = mouse_isr_entry as *const () as usize as u64;
(*idt_ptr.add(44)).set_handler(mouse_addr, 0, 0);
let descriptor = IdtDescriptor {
limit: (size_of::<[IdtEntry; 256]>() - 1) as u16,
base: idt_ptr as u64,
+19
View File
@@ -145,8 +145,27 @@ pub fn init(screen_w: i32, screen_h: i32) {
}
}
#[no_mangle]
pub extern "C" fn mouse_interrupt_handler() {
unsafe {
let status = inb(PS2_COMMAND_PORT);
if (status & 0x01) != 0 {
let data = inb(PS2_DATA_PORT);
if (status & 0x20) != 0 {
MOUSE_STATE.handle_byte(data);
}
}
crate::drivers::timer::send_slave_eoi();
}
}
pub fn get_mouse_info() -> (i32, i32, u32) {
unsafe {
// Drain any pending bytes in 8042 buffer
while (inb(PS2_COMMAND_PORT) & 0x21) == 0x21 {
let data = inb(PS2_DATA_PORT);
MOUSE_STATE.handle_byte(data);
}
(MOUSE_STATE.x, MOUSE_STATE.y, MOUSE_STATE.buttons)
}
}
+16 -5
View File
@@ -22,11 +22,17 @@ unsafe fn io_wait() {
outb(0x80, 0);
}
/// Send End of Interrupt to PIC
/// Send End of Interrupt to Master PIC
pub unsafe fn send_eoi() {
outb(PIC1_COMMAND, PIC_EOI);
}
/// Send End of Interrupt to both Slave and Master PIC (for IRQs 8-15, including IRQ 12 mouse)
pub unsafe fn send_slave_eoi() {
outb(PIC2_COMMAND, PIC_EOI);
outb(PIC1_COMMAND, PIC_EOI);
}
/// Remap PIC offsets to 32 (0x20) and 40 (0x28)
unsafe fn remap_pic() {
// ICW1: Start initialization in cascade mode
@@ -41,7 +47,7 @@ unsafe fn remap_pic() {
outb(PIC2_DATA, 0x28);
io_wait();
// ICW3: Cascade wiring
// ICW3: Cascade wiring (Master: IRQ2 has slave; Slave: cascade identity 2)
outb(PIC1_DATA, 0x04);
io_wait();
outb(PIC2_DATA, 0x02);
@@ -53,9 +59,14 @@ unsafe fn remap_pic() {
outb(PIC2_DATA, 0x01);
io_wait();
// Mask all IRQs except IRQ 0 (Timer) and IRQ 1 (Keyboard)
outb(PIC1_DATA, 0xFC); // Enable IRQ0 and IRQ1
outb(PIC2_DATA, 0xFF); // Disable all on Slave
// Enable IRQ 0 (Timer), IRQ 1 (Keyboard), and IRQ 2 (Cascade to Slave PIC) on Master:
// 0xF8 = 11111000b (bits 0, 1, 2 unmasked)
outb(PIC1_DATA, 0xF8);
// Enable IRQ 12 (PS/2 Mouse) on Slave PIC:
// IRQ 12 is line 4 on Slave PIC (8 + 4 = 12):
// 0xEF = 11101111b (bit 4 unmasked)
outb(PIC2_DATA, 0xEF);
}
/// Initialize PIT to tick at target Hz (e.g. 100 Hz = 10 ms quantum)
+2 -2
View File
@@ -363,9 +363,9 @@
*https://fonts.google.com/specimen/Montserrat*/
#define LV_FONT_MONTSERRAT_8 0
#define LV_FONT_MONTSERRAT_10 0
#define LV_FONT_MONTSERRAT_12 0
#define LV_FONT_MONTSERRAT_12 1
#define LV_FONT_MONTSERRAT_14 1
#define LV_FONT_MONTSERRAT_16 0
#define LV_FONT_MONTSERRAT_16 1
#define LV_FONT_MONTSERRAT_18 0
#define LV_FONT_MONTSERRAT_20 0
#define LV_FONT_MONTSERRAT_22 0
File diff suppressed because it is too large Load Diff