Files
MontaukOS/programs/src/devexplorer/devexplorer.h
T
2026-04-01 22:47:27 +02:00

177 lines
5.2 KiB
C++

/*
* devexplorer.h
* Shared header for the MontaukOS Device Explorer
* Copyright (c) 2026 Daniel Hammer
*/
#pragma once
#include <montauk/syscall.h>
#include <montauk/string.h>
#include <montauk/heap.h>
#include <gui/gui.hpp>
#include <gui/truetype.hpp>
extern "C" {
#include <string.h>
#include <stdio.h>
}
using namespace gui;
// ============================================================================
// Constants
// ============================================================================
static constexpr int INIT_W = 640;
static constexpr int INIT_H = 460;
static constexpr int TOOLBAR_H = 36;
static constexpr int CAT_H = 28;
static constexpr int ITEM_H = 24;
static constexpr int MAX_DEVS = 64;
static constexpr int MAX_VIRTUAL_DEVS = 4;
static constexpr int MAX_TOTAL_DEVS = MAX_DEVS + MAX_VIRTUAL_DEVS;
static constexpr int POLL_MS = 2000;
static constexpr int INDENT = 28;
static constexpr int FONT_SIZE = 18;
enum DeviceCategory {
CAT_CPU = 0,
CAT_INTERRUPT,
CAT_TIMER,
CAT_INPUT,
CAT_USB,
CAT_NETWORK,
CAT_DISPLAY,
CAT_STORAGE,
CAT_PCI,
CAT_AUDIO,
CAT_ACPI,
CAT_PRINTER,
NUM_CATEGORIES
};
static constexpr Color BG_COLOR = Color::from_rgb(0xFF, 0xFF, 0xFF);
static constexpr Color TOOLBAR_BG = Color::from_rgb(0xF5, 0xF5, 0xF5);
static constexpr Color BORDER_COLOR = Color::from_rgb(0xCC, 0xCC, 0xCC);
static constexpr Color TEXT_COLOR = Color::from_rgb(0x22, 0x22, 0x22);
static constexpr Color DIM_TEXT = Color::from_rgb(0x66, 0x66, 0x66);
static constexpr Color WHITE = Color::from_rgb(0xFF, 0xFF, 0xFF);
static constexpr Color ACCENT_COLOR = Color::from_rgb(0x33, 0x66, 0xCC);
// ============================================================================
// Category data
// ============================================================================
static const char* category_names[] = {
"CPU",
"Interrupt",
"Timer",
"Input",
"USB",
"Network",
"Display",
"Storage",
"PCI",
"Audio",
"ACPI",
"Printers",
};
static const Color category_colors[] = {
Color::from_rgb(0x33, 0x66, 0xCC),
Color::from_rgb(0x88, 0x44, 0xAA),
Color::from_rgb(0x22, 0x88, 0x22),
Color::from_rgb(0xCC, 0x88, 0x00),
Color::from_rgb(0x00, 0x88, 0x88),
Color::from_rgb(0xCC, 0x55, 0x22),
Color::from_rgb(0x44, 0x66, 0xCC),
Color::from_rgb(0x99, 0x55, 0x00),
Color::from_rgb(0x66, 0x66, 0x66),
Color::from_rgb(0x8A, 0x5A, 0xCC),
Color::from_rgb(0x55, 0x77, 0x88),
Color::from_rgb(0x2F, 0x8B, 0x57),
};
// ============================================================================
// Display row model
// ============================================================================
enum RowType { ROW_CATEGORY, ROW_DEVICE };
struct DisplayRow {
RowType type;
int category;
int dev_index;
};
static constexpr int MAX_DISPLAY_ROWS = MAX_TOTAL_DEVS + NUM_CATEGORIES;
// ============================================================================
// Disk detail window
// ============================================================================
static constexpr int DD_TAB_COUNT = 2;
static const char* dd_tab_labels[DD_TAB_COUNT] = { "General", "Features" };
static constexpr int DD_INIT_W = 440;
static constexpr int DD_INIT_H = 420;
static constexpr int DD_TAB_BAR_H = 32;
struct DiskDetailState {
Montauk::DiskInfo info;
int active_tab;
int win_id;
int win_w, win_h;
uint32_t* pixels;
bool open;
};
// ============================================================================
// Main state
// ============================================================================
struct DevExplorerState {
Montauk::DevInfo devs[MAX_TOTAL_DEVS];
int dev_count;
bool collapsed[NUM_CATEGORIES];
int selected_row;
int scroll_y;
uint64_t last_poll_ms;
int last_click_row;
uint64_t last_click_ms;
DiskDetailState detail;
};
// ============================================================================
// Global state (extern — defined in main.cpp)
// ============================================================================
extern int g_win_w, g_win_h;
extern DevExplorerState g_state;
extern TrueTypeFont* g_font;
// ============================================================================
// Function declarations — render.cpp
// ============================================================================
void render(uint32_t* pixels);
// ============================================================================
// Function declarations — main.cpp
// ============================================================================
int build_display_rows(DevExplorerState* de, DisplayRow* rows);
int append_printer_devices(Montauk::DevInfo* out, int max_count);
// ============================================================================
// Function declarations — diskdetail.cpp
// ============================================================================
void render_disk_detail();
void open_disk_detail(int port, const char* model);
void close_disk_detail();
bool handle_detail_mouse(int mx, int my, bool clicked);