feat: support for USB mass storage devices, hotplugging
This commit is contained in:
@@ -46,10 +46,11 @@ void open_newpart_dialog() {
|
||||
dlg.hover_cancel = false;
|
||||
|
||||
Montauk::DiskInfo& disk = dt.disks[dt.selected_disk];
|
||||
int blockDev = selected_block_dev();
|
||||
char sz[24];
|
||||
format_disk_size(sz, sizeof(sz), disk.sectorCount, disk.sectorSizeLog);
|
||||
snprintf(dlg.disk_desc, sizeof(dlg.disk_desc), "Disk %d: %s (%s)",
|
||||
dt.selected_disk, disk.model, sz);
|
||||
blockDev, disk.model, sz);
|
||||
|
||||
if (dlg.will_init_gpt) {
|
||||
snprintf(dlg.warn_line1, sizeof(dlg.warn_line1),
|
||||
@@ -89,7 +90,8 @@ void newpart_dialog_confirm() {
|
||||
auto& dlg = dt.np_dlg;
|
||||
|
||||
if (dlg.will_init_gpt) {
|
||||
int r = montauk::gpt_init(dt.selected_disk);
|
||||
int blockDev = selected_block_dev();
|
||||
int r = montauk::gpt_init(blockDev);
|
||||
if (r < 0) {
|
||||
set_status("Failed to initialize GPT on disk");
|
||||
close_newpart_dialog();
|
||||
@@ -100,7 +102,7 @@ void newpart_dialog_confirm() {
|
||||
|
||||
Montauk::GptAddParams params;
|
||||
montauk::memset(¶ms, 0, sizeof(params));
|
||||
params.blockDev = dt.selected_disk;
|
||||
params.blockDev = selected_block_dev();
|
||||
params.startLba = 0;
|
||||
params.endLba = 0;
|
||||
params.typeGuid.Data1 = 0xEBD0A0A2;
|
||||
|
||||
@@ -31,7 +31,7 @@ static constexpr int ITEM_H = 32;
|
||||
static constexpr int MAP_H = 48;
|
||||
static constexpr int MAP_PAD = 16;
|
||||
static constexpr int MAX_PARTS = 32;
|
||||
static constexpr int MAX_DISKS = 8;
|
||||
static constexpr int MAX_DISKS = 32;
|
||||
static constexpr int STATUS_H = 44;
|
||||
|
||||
static constexpr int TB_BTN_Y = 7;
|
||||
@@ -120,8 +120,11 @@ extern const Color part_colors[NUM_PART_COLORS];
|
||||
// ============================================================================
|
||||
|
||||
inline int disk_button_width(int idx) {
|
||||
char label[8];
|
||||
snprintf(label, sizeof(label), "Disk %d", idx);
|
||||
char label[16];
|
||||
int blockDev = (idx >= 0 && idx < g_state.disk_count)
|
||||
? (int)g_state.disks[idx].port
|
||||
: idx;
|
||||
snprintf(label, sizeof(label), "Disk %d", blockDev);
|
||||
return text_width(label) + 20;
|
||||
}
|
||||
|
||||
@@ -192,6 +195,8 @@ inline Rect dialog_secondary_button_rect(int dialog_w, int dialog_h) {
|
||||
// ============================================================================
|
||||
|
||||
void set_status(const char* msg);
|
||||
int disk_block_dev(int diskIndex);
|
||||
int selected_block_dev();
|
||||
int get_disk_parts(int* indices, int max);
|
||||
void format_disk_size(char* buf, int bufsize, uint64_t sectors, uint16_t sectorSize);
|
||||
|
||||
|
||||
@@ -40,10 +40,22 @@ void set_status(const char* msg) {
|
||||
g_state.status_time = montauk::get_milliseconds();
|
||||
}
|
||||
|
||||
int disk_block_dev(int diskIndex) {
|
||||
if (diskIndex < 0 || diskIndex >= g_state.disk_count) return -1;
|
||||
return (int)g_state.disks[diskIndex].port;
|
||||
}
|
||||
|
||||
int selected_block_dev() {
|
||||
return disk_block_dev(g_state.selected_disk);
|
||||
}
|
||||
|
||||
int get_disk_parts(int* indices, int max) {
|
||||
int blockDev = selected_block_dev();
|
||||
if (blockDev < 0) return 0;
|
||||
|
||||
int count = 0;
|
||||
for (int i = 0; i < g_state.part_count && count < max; i++) {
|
||||
if (g_state.parts[i].blockDev == g_state.selected_disk) {
|
||||
if (g_state.parts[i].blockDev == blockDev) {
|
||||
indices[count++] = i;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,8 +93,8 @@ static void render_toolbar(Canvas& c, const mtk::Theme& theme) {
|
||||
|
||||
for (int i = 0; i < dt.disk_count; i++) {
|
||||
Rect button = toolbar_disk_button_rect(i);
|
||||
char label[8];
|
||||
snprintf(label, sizeof(label), "Disk %d", i);
|
||||
char label[16];
|
||||
snprintf(label, sizeof(label), "Disk %d", disk_block_dev(i));
|
||||
mtk::draw_button(c, button, label, mtk::BUTTON_SECONDARY,
|
||||
toolbar_button_state(button, true, i == dt.selected_disk), theme);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user