feat(wx/tui): add --force-enable-ssv to options

This commit is contained in:
CLARATION committed 2026-08-01 21:10:38 -07:00
1 parent 9c3a591db8
commit 8f517976ba
2 files changed
+207 -97

No files matched your search

+26 -18
View File
@@ -69,14 +69,16 @@ void TuiSettingsPanel::draw(int sy, int sx, int selected) {
!!(palerain_flags & palerain_option_safemode), !!(palerain_flags & palerain_option_safemode),
!!(palerain_flags & palerain_option_verbose_boot), !!(palerain_flags & palerain_option_verbose_boot),
!!(palerain_flags & palerain_option_force_revert), !!(palerain_flags & palerain_option_force_revert),
!!(palerain_flags & palerain_option_flower_chain) !!(palerain_flags & palerain_option_flower_chain),
!!(palerain_flags & palerain_option_ssv)
}; };
const char *labels[] = { const char *labels[] = {
"Safe Mode", "Safe Mode",
"Verbose Boot", "Verbose Boot",
"Restore System", "Restore System",
"Dark Blockchain" "Dark Blockchain",
"Force Enable SSV Flag"
}; };
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
@@ -98,20 +100,25 @@ void TuiSettingsPanel::draw(int sy, int sx, int selected) {
if (selected == i + 1) attroff(A_REVERSE); if (selected == i + 1) attroff(A_REVERSE);
} }
mvprintw(sy + 13, content_x, "Jailbreak Type:"); mvprintw(sy + 13, content_x, "[%c] ", states[4] ? 'x' : ' ');
if (selected == 5) attron(A_REVERSE); if (selected == 5) attron(A_REVERSE);
mvprintw(sy + 14, content_x + 2, "(%c) Rootless", is_rootful ? ' ' : 'x'); printw("%s", labels[4]);
if (selected == 5) attroff(A_REVERSE); if (selected == 5) attroff(A_REVERSE);
mvprintw(sy + 15, content_x, "Jailbreak Type:");
if (selected == 6) attron(A_REVERSE); if (selected == 6) attron(A_REVERSE);
mvprintw(sy + 15, content_x + 2, "(%c) Rootful", is_rootful ? 'x' : ' '); mvprintw(sy + 16, content_x + 2, "(%c) Rootless", is_rootful ? ' ' : 'x');
if (selected == 6) attroff(A_REVERSE); if (selected == 6) attroff(A_REVERSE);
mvprintw(sy + 17, content_x, "Rootful Options:"); if (selected == 7) attron(A_REVERSE);
mvprintw(sy + 17, content_x + 2, "(%c) Rootful", is_rootful ? 'x' : ' ');
if (selected == 7) attroff(A_REVERSE);
mvprintw(sy + 19, content_x, "Rootful Options:");
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
const int item_idx = 7 + i; const int item_idx = 8 + i;
const int row = sy + 18 + i; const int row = sy + 20 + i;
const bool active = is_rootful; const bool active = is_rootful;
const bool is_selected = selected == item_idx; const bool is_selected = selected == item_idx;
const bool checked = setup_selection == i; const bool checked = setup_selection == i;
@@ -171,34 +178,35 @@ void TuiSettingsPanel::handle_enter(int selected, int sy, int sx) {
case 2: edit_boot_args(sy, sx); break; case 2: edit_boot_args(sy, sx); break;
case 3: palerain_flags ^= palerain_option_force_revert; break; case 3: palerain_flags ^= palerain_option_force_revert; break;
case 4: palerain_flags ^= palerain_option_flower_chain; break; case 4: palerain_flags ^= palerain_option_flower_chain; break;
case 5: case 5: palerain_flags ^= palerain_option_ssv; break;
case 6:
palerain_flags &= ~(palerain_option_rootless | palerain_option_rootful); palerain_flags &= ~(palerain_option_rootless | palerain_option_rootful);
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root); palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root);
palerain_flags |= palerain_option_rootless; palerain_flags |= palerain_option_rootless;
break; break;
case 6: case 7:
palerain_flags &= ~(palerain_option_rootless | palerain_option_rootful); palerain_flags &= ~(palerain_option_rootless | palerain_option_rootful);
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root); palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root);
palerain_flags |= palerain_option_rootful; palerain_flags |= palerain_option_rootful;
break; break;
case 7:
if (palerain_flags & palerain_option_rootful) {
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root);
}
break;
case 8: case 8:
if (palerain_flags & palerain_option_rootful) { if (palerain_flags & palerain_option_rootful) {
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root); palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root);
palerain_flags |= palerain_option_setup_rootful;
} }
break; break;
case 9: case 9:
if (palerain_flags & palerain_option_rootful) {
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root);
palerain_flags |= palerain_option_setup_rootful;
}
break;
case 10:
if (palerain_flags & palerain_option_rootful) { if (palerain_flags & palerain_option_rootful) {
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root); palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root);
palerain_flags |= palerain_option_setup_partial_root; palerain_flags |= palerain_option_setup_partial_root;
} }
break; break;
case 10: GetFrame()->ShowMain(0); break; case 11: GetFrame()->ShowMain(0); break;
} }
} }
@@ -207,7 +215,7 @@ void TuiSettingsPanel::handle_device_update(const DeviceState& state) {
} }
bool TuiSettingsPanel::is_button_enabled(int btn_idx) const { bool TuiSettingsPanel::is_button_enabled(int btn_idx) const {
if (btn_idx >= 7 && btn_idx <= 9) { if (btn_idx >= 8 && btn_idx <= 10) {
return (palerain_flags & palerain_option_rootful) != 0; return (palerain_flags & palerain_option_rootful) != 0;
} }
+181 -79
View File
@@ -30,6 +30,7 @@
#include "SettingsPanel.hpp" #include "SettingsPanel.hpp"
#include <wx/wx.h> #include <wx/wx.h>
#include <wx/notebook.h>
#include <wx/mstream.h> #include <wx/mstream.h>
#include <wx/image.h> #include <wx/image.h>
#include <wx/bitmap.h> #include <wx/bitmap.h>
@@ -41,78 +42,100 @@
#include "../paleinfo.h" #include "../paleinfo.h"
#include "../gen/embedded/logo.h" #include "../gen/embedded/logo.h"
auto createTitle = [](wxWindow* parent, const wxString& text)
{
auto* title = new wxStaticText(parent, wxID_ANY, text);
wxFont font = title->GetFont();
font.SetPointSize(font.GetPointSize() - 1);
font.SetWeight(wxFONTWEIGHT_BOLD);
title->SetFont(font);
return title;
};
auto createDescription = [](wxWindow* parent, const wxString& text)
{
auto* description = new wxStaticText(parent, wxID_ANY, text, wxDefaultPosition, wxDefaultSize, wxST_WRAP);
wxFont font = description->GetFont();
font.SetPointSize(font.GetPointSize() - 2);
description->SetFont(font);
return description;
};
SettingsPanel::SettingsPanel(MainFrame* frame, wxWindow* parent) SettingsPanel::SettingsPanel(MainFrame* frame, wxWindow* parent)
: DevicePanel(frame, parent) : DevicePanel(frame, parent)
{ {
auto* root = new wxBoxSizer(wxHORIZONTAL); auto* root = new wxBoxSizer(wxHORIZONTAL);
auto* left = new wxBoxSizer(wxVERTICAL); auto* left = new wxBoxSizer(wxVERTICAL);
auto* right = new wxBoxSizer(wxVERTICAL);
wxMemoryInputStream stream(embedded_logo_png, embedded_logo_png_len); wxMemoryInputStream stream(embedded_logo_png, embedded_logo_png_len);
wxImage img(stream, wxBITMAP_TYPE_PNG); wxImage img(stream, wxBITMAP_TYPE_PNG);
wxBitmap bmp(img); wxBitmap bmp(img);
auto* logo = new wxStaticBitmap(this, wxID_ANY, bmp); auto* logo = new wxStaticBitmap(this, wxID_ANY, bmp);
auto* logoText = new wxStaticText(this, wxID_ANY, "Options"); auto* logoText = new wxStaticText(this, wxID_ANY, "Options");
auto* right = new wxBoxSizer(wxVERTICAL);
left->Add(new wxStaticText(this, wxID_ANY, left->Add(new wxStaticText(this, wxID_ANY,
"You may set the following options. If you don't know what they mean you'll probably have no reason to set them.", "You may set the following options. If you don't know what they mean you'll probably have no reason to set them.",
wxDefaultPosition, wxDefaultPosition,
wxDefaultSize, wxDefaultSize,
wxST_WRAP wxST_WRAP
), 0, wxALL, 10); ), 0, wxTOP | wxLEFT | wxRIGHT, 10);
auto* optionSafemode = new wxCheckBox(this, wxID_ANY, "Safe Mode"); auto* notebook = new wxNotebook(this, wxID_ANY);
auto* optionVerbose = new wxCheckBox(this, wxID_ANY, "Verbose Boot"); auto* generalPage = new wxPanel(notebook);
auto* optionRevert = new wxCheckBox(this, wxID_ANY, "Restore System"); auto* advancedPage = new wxPanel(notebook);
auto* optionDarkBlockchain = new wxCheckBox(this, wxID_ANY, "Dark Blockchain");
auto* bootArgs = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize);
auto* rootType = new wxRadioBox(
this,
wxID_ANY,
"Jailbreak Type",
wxDefaultPosition,
wxDefaultSize,
2,
(const wxString[]){
"Rootless",
"Rootful"
},
1,
wxRA_SPECIFY_COLS
);
auto* setupMode = new wxRadioBox( //
this, // Controls
wxID_ANY, //
"Rootful Options", auto* optionSafemode = new wxCheckBox(generalPage, wxID_ANY, "Safe Mode");
wxDefaultPosition, auto* optionVerbose = new wxCheckBox(generalPage, wxID_ANY, "Verbose Boot");
wxDefaultSize, auto* optionRevert = new wxCheckBox(generalPage, wxID_ANY, "Restore System");
3, auto* optionDarkBlockchain = new wxCheckBox(generalPage, wxID_ANY, "Dark Blockchain");
(const wxString[]){
"Boot",
"Create FakeFS",
"Create BindFS"
},
1,
wxRA_SPECIFY_COLS
);
auto* rootless = new wxRadioButton(generalPage, wxID_ANY, "Rootless", wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
auto* rootful = new wxRadioButton(generalPage, wxID_ANY, "Rootful");
auto* setupBoot = new wxRadioButton(generalPage, wxID_ANY, "Boot", wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
auto* setupFakeFS = new wxRadioButton(generalPage, wxID_ANY, "Create fakeFS");
auto* setupBindFS = new wxRadioButton(generalPage, wxID_ANY, "Create Partial fakeFS");
auto* bootArgs = new wxTextCtrl(advancedPage, wxID_ANY);
auto* optionForceEnableSSV = new wxCheckBox(advancedPage, wxID_ANY, "Force Enable SSV Flag");
//
// Load
//
optionSafemode->SetValue(palerain_flags & palerain_option_safemode); optionSafemode->SetValue(palerain_flags & palerain_option_safemode);
optionVerbose->SetValue(palerain_flags & palerain_option_verbose_boot); optionVerbose->SetValue(palerain_flags & palerain_option_verbose_boot);
optionRevert->SetValue(palerain_flags & palerain_option_force_revert); optionRevert->SetValue(palerain_flags & palerain_option_force_revert);
optionDarkBlockchain->SetValue(palerain_flags & palerain_option_flower_chain); optionDarkBlockchain->SetValue(palerain_flags & palerain_option_flower_chain);
bootArgs->SetValue(wxString(boot_args, wxConvUTF8)); bootArgs->SetValue(wxString(boot_args, wxConvUTF8));
if (palerain_flags & palerain_option_rootful) optionForceEnableSSV->SetValue(palerain_flags & palerain_option_ssv);
rootType->SetSelection(1);
else rootless->SetValue(!(palerain_flags & palerain_option_rootful));
rootType->SetSelection(0); rootful->SetValue(palerain_flags & palerain_option_rootful);
if (palerain_flags & palerain_option_setup_rootful) if (palerain_flags & palerain_option_setup_rootful)
setupMode->SetSelection(1); setupFakeFS->SetValue(true);
else if (palerain_flags & palerain_option_setup_partial_root) else if (palerain_flags & palerain_option_setup_partial_root)
setupMode->SetSelection(2); setupBindFS->SetValue(true);
else else
setupMode->SetSelection(0); setupBoot->SetValue(true);
setupMode->Enable(rootType->GetSelection() == 1);
bool isRootful = rootful->GetValue();
setupBoot->Enable(true);
setupFakeFS->Enable(isRootful);
setupBindFS->Enable(isRootful);
optionSafemode->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e) optionSafemode->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e)
{ {
@@ -121,6 +144,7 @@ SettingsPanel::SettingsPanel(MainFrame* frame, wxWindow* parent)
else else
palerain_flags &= ~palerain_option_safemode; palerain_flags &= ~palerain_option_safemode;
}); });
optionVerbose->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e) optionVerbose->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e)
{ {
if (e.IsChecked()) if (e.IsChecked())
@@ -128,6 +152,7 @@ SettingsPanel::SettingsPanel(MainFrame* frame, wxWindow* parent)
else else
palerain_flags &= ~palerain_option_verbose_boot; palerain_flags &= ~palerain_option_verbose_boot;
}); });
optionRevert->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e) optionRevert->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e)
{ {
if (e.IsChecked()) if (e.IsChecked())
@@ -135,6 +160,7 @@ SettingsPanel::SettingsPanel(MainFrame* frame, wxWindow* parent)
else else
palerain_flags &= ~palerain_option_force_revert; palerain_flags &= ~palerain_option_force_revert;
}); });
optionDarkBlockchain->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e) optionDarkBlockchain->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e)
{ {
if (e.IsChecked()) if (e.IsChecked())
@@ -142,60 +168,136 @@ SettingsPanel::SettingsPanel(MainFrame* frame, wxWindow* parent)
else else
palerain_flags &= ~palerain_option_flower_chain; palerain_flags &= ~palerain_option_flower_chain;
}); });
bootArgs->Bind(wxEVT_TEXT, [&](wxCommandEvent& e) bootArgs->Bind(wxEVT_TEXT, [&](wxCommandEvent& e)
{ {
wxString value = e.GetString(); wxString value = e.GetString();
if (value.length() > (sizeof(boot_args) - 0x20)) {
if (value.length() > (sizeof(boot_args) - 0x20))
return; return;
}
snprintf(boot_args, sizeof(boot_args), "%s", value.ToStdString().c_str()); snprintf(boot_args, sizeof(boot_args),
"%s",
value.ToStdString().c_str());
}); });
rootType->Bind(wxEVT_RADIOBOX, [setupMode](wxCommandEvent& e)
optionForceEnableSSV->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e)
{ {
palerain_flags &= ~(palerain_option_rootless | palerain_option_rootful); if (e.IsChecked())
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root); palerain_flags |= palerain_option_ssv;
setupMode->Enable(e.GetSelection() == 1);
setupMode->SetSelection(0);
if (e.GetSelection() == 0)
palerain_flags |= palerain_option_rootless;
else else
palerain_flags |= palerain_option_rootful; palerain_flags &= ~palerain_option_ssv;
}); });
setupMode->Bind(wxEVT_RADIOBOX, [&](wxCommandEvent& e) rootless->Bind(wxEVT_RADIOBUTTON,
[setupBoot, setupFakeFS, setupBindFS](wxCommandEvent&)
{ {
palerain_flags &= ~(palerain_option_setup_rootful | palerain_option_setup_partial_root); palerain_flags &= ~(palerain_option_rootless |
palerain_option_rootful |
palerain_option_setup_rootful |
palerain_option_setup_partial_root);
if (e.GetSelection() == 1) palerain_flags |= palerain_option_rootless;
palerain_flags |= palerain_option_setup_rootful;
else if (e.GetSelection() == 2) setupBoot->SetValue(true);
palerain_flags |= palerain_option_setup_partial_root; setupFakeFS->Enable(false);
setupBindFS->Enable(false);
}); });
auto* contentRow = new wxBoxSizer(wxHORIZONTAL); rootful->Bind(wxEVT_RADIOBUTTON,
auto* leftColumn = new wxBoxSizer(wxVERTICAL); [setupFakeFS, setupBindFS](wxCommandEvent&)
auto* rightColumn = new wxBoxSizer(wxVERTICAL); {
palerain_flags &= ~(palerain_option_rootless |
palerain_option_rootful);
leftColumn->Add(rootType, 0, wxALL | wxEXPAND, 5); palerain_flags |= palerain_option_rootful;
leftColumn->Add(setupMode, 0, wxALL | wxEXPAND, 5);
rightColumn->Add(optionSafemode, 0, wxALL, 5); setupFakeFS->Enable(true);
rightColumn->Add(optionVerbose, 0, wxALL, 5); setupBindFS->Enable(true);
rightColumn->Add(optionRevert, 0, wxALL, 5); });
rightColumn->Add(optionDarkBlockchain, 0, wxALL, 5);
rightColumn->AddStretchSpacer();
contentRow->Add(leftColumn, 1, wxEXPAND | wxRIGHT, 10); setupBoot->Bind(wxEVT_RADIOBUTTON, [](wxCommandEvent&)
contentRow->Add(rightColumn, 1, wxEXPAND | wxLEFT, 10); {
palerain_flags &= ~(palerain_option_setup_rootful |
palerain_option_setup_partial_root);
});
left->Add(contentRow, 1, wxEXPAND | wxLEFT | wxRIGHT, 10); setupFakeFS->Bind(wxEVT_RADIOBUTTON, [&](wxCommandEvent&)
left->Add(new wxStaticText(this, wxID_ANY, "Boot Arguments:"), 0, wxALL, 15); {
left->Add(bootArgs, 0, wxLEFT | wxRIGHT | wxEXPAND, 30); palerain_flags &= ~palerain_option_setup_partial_root;
left->AddStretchSpacer(); palerain_flags |= palerain_option_setup_rootful;
});
setupBindFS->Bind(wxEVT_RADIOBUTTON, [&](wxCommandEvent&)
{
palerain_flags &= ~palerain_option_setup_rootful;
palerain_flags |= palerain_option_setup_partial_root;
});
//
// General
//
auto* generalSizer = new wxBoxSizer(wxHORIZONTAL);
auto* generalLeft = new wxBoxSizer(wxVERTICAL);
auto* generalRight = new wxBoxSizer(wxVERTICAL);
generalLeft->Add(createTitle(generalPage, "Startup"), 0, wxBOTTOM, 3);
generalLeft->Add(optionSafemode, 0, wxTOP, 7);
generalLeft->Add(optionVerbose, 0, wxTOP , 7);
generalLeft->Add(optionRevert, 0, wxTOP, 7);
generalLeft->Add(optionDarkBlockchain, 0, wxTOP, 7);
generalLeft->AddStretchSpacer();
generalRight->Add(createTitle(generalPage, "Jailbreak Type"), 0, wxBOTTOM, 3);
generalRight->Add(rootless, 0, wxTOP, 7);
generalRight->Add(rootful, 0, wxTOP | wxBOTTOM, 5);
generalRight->Add(createTitle(generalPage, "Startup (Rootful)"), 0, wxTOP | wxBOTTOM, 3);
generalRight->Add(setupBoot, 0, wxTOP, 7);
generalRight->Add(setupFakeFS, 0, wxTOP, 5);
generalRight->Add(setupBindFS, 0, wxTOP, 5);
generalRight->AddStretchSpacer();
generalSizer->Add(generalLeft, 1, wxEXPAND | wxRIGHT | wxLEFT, 10);
generalSizer->Add(generalRight, 1, wxEXPAND | wxLEFT, 10);
generalPage->SetSizer(generalSizer);
//
// Advanced
//
auto* advancedOuterSizer = new wxBoxSizer(wxVERTICAL);
auto* advancedSizer = new wxBoxSizer(wxVERTICAL);
advancedSizer->Add(createTitle(advancedPage, "Boot Arguments"), 0, wxBOTTOM, 3);
advancedSizer->Add(bootArgs, 0, wxTOP | wxBOTTOM | wxEXPAND, 7);
advancedSizer->Add(createTitle(advancedPage, "Advanced"), 0, wxTOP | wxBOTTOM, 3);
advancedSizer->Add(optionForceEnableSSV, 0, wxTOP | wxBOTTOM, 7);
advancedSizer->Add(createDescription(advancedPage, "Forces the jailbreak to detect SSV as being required."), 0, wxLEFT | wxRIGHT, 20);
advancedOuterSizer->Add(advancedSizer, 1, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, 10);
advancedPage->SetSizer(advancedOuterSizer);
notebook->AddPage(generalPage, "General", true);
notebook->AddPage(advancedPage, "Advanced");
left->Add(notebook, 1, wxEXPAND | wxALL, 10);
//
// Right side
//
auto* back = new wxButton(this, wxID_ANY, "Back"); auto* back = new wxButton(this, wxID_ANY, "Back");
right->Add(logo, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP | wxLEFT | wxRIGHT, 10); right->Add(logo, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP | wxLEFT | wxRIGHT, 10);
right->Add(logoText, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, 5); right->Add(logoText, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, 5);
right->AddStretchSpacer(); right->AddStretchSpacer();