fix(wx/gui): do not support atv4k

libtvcontrol is not implemented
This commit is contained in:
CLARATION committed 2026-07-25 03:22:24 -07:00
1 parent d1d4ee8e16
commit a41e43438d
7 files changed
+55 -25

No files matched your search

+1
View File
@@ -259,6 +259,7 @@
"sequence":"appletv4" "sequence":"appletv4"
}, },
"appletv4k":{ "appletv4k":{
"is_supported": false,
"image_name":"atv_std_brd", "image_name":"atv_std_brd",
"image_width":300, "image_width":300,
"image_height":240, "image_height":240,
+11 -5
View File
@@ -241,11 +241,14 @@ bool build_normal_state(const IdeviceFFI::UsbmuxdDevice& device, DeviceState& ou
} }
} }
out.isSupported = SequenceIsSupported(out.productType); DfuSequence seq = ParseSequence(out.productType);
out.isSupported = SequenceIsSupported(&seq);
out.requiresCLI = SequenceRequiresCLI(&seq);
return true; return true;
} }
static void handle_other_add(hotplug_handle_t handle, DeviceMode mode, bool supported) { static void handle_other_add(hotplug_handle_t handle, DeviceMode mode) {
char serial[256] = {}; char serial[256] = {};
if (!get_usb_device_serial(handle, serial, sizeof(serial))) return; if (!get_usb_device_serial(handle, serial, sizeof(serial))) return;
@@ -269,7 +272,10 @@ static void handle_other_add(hotplug_handle_t handle, DeviceMode mode, bool supp
m.state.productType = product_model ? product_model : ""; m.state.productType = product_model ? product_model : "";
m.state.productVersion.clear(); m.state.productVersion.clear();
m.state.displayName = product_name ? product_name : ""; m.state.displayName = product_name ? product_name : "";
m.state.isSupported = supported;
DfuSequence seq = ParseSequence(m.state.productType);
m.state.isSupported = SequenceIsSupported(&seq);
m.state.requiresCLI = SequenceRequiresCLI(&seq);
m.recoveryPresent = (mode == DeviceMode::Recovery); m.recoveryPresent = (mode == DeviceMode::Recovery);
m.dfuPresent = (mode == DeviceMode::DFU); m.dfuPresent = (mode == DeviceMode::DFU);
@@ -409,9 +415,9 @@ static void hotplug_callback(hotplug_event_t event, hotplug_handle_t handle) {
#endif #endif
switch (event) { switch (event) {
case HOTPLUG_EVENT_DFU_ADD: handle_other_add(handle, DeviceMode::DFU, false); break; case HOTPLUG_EVENT_DFU_ADD: handle_other_add(handle, DeviceMode::DFU); break;
case HOTPLUG_EVENT_DFU_REMOVE: remove_device(srv, DeviceMode::DFU); break; case HOTPLUG_EVENT_DFU_REMOVE: remove_device(srv, DeviceMode::DFU); break;
case HOTPLUG_EVENT_RECOVERY_ADD: handle_other_add(handle, DeviceMode::Recovery, true); break; case HOTPLUG_EVENT_RECOVERY_ADD: handle_other_add(handle, DeviceMode::Recovery); break;
case HOTPLUG_EVENT_RECOVERY_REMOVE: remove_device(srv, DeviceMode::Recovery); break; case HOTPLUG_EVENT_RECOVERY_REMOVE: remove_device(srv, DeviceMode::Recovery); break;
} }
} }
+1
View File
@@ -50,6 +50,7 @@ struct DeviceState
{ {
bool connected = false; bool connected = false;
bool isSupported = false; bool isSupported = false;
bool requiresCLI = false;
bool multipleDevices = false; bool multipleDevices = false;
DeviceMode mode = DeviceMode::None; DeviceMode mode = DeviceMode::None;
std::string productVersion; std::string productVersion;
+9 -3
View File
@@ -53,6 +53,8 @@ DfuSequence ParseSequence(const std::string& deviceKey)
const auto& layout = itLayout.value(); const auto& layout = itLayout.value();
// assume supported if not specified
seq.isSupported = layout.value("is_supported", true);
seq.imageName = layout.value("image_name", ""); seq.imageName = layout.value("image_name", "");
seq.imageWidth = layout.value("image_width", 0); seq.imageWidth = layout.value("image_width", 0);
seq.imageHeight = layout.value("image_height", 0); seq.imageHeight = layout.value("image_height", 0);
@@ -106,10 +108,14 @@ DfuSequence ParseSequence(const std::string& deviceKey)
return seq; return seq;
} }
bool SequenceIsSupported(const std::string& deviceKey) bool SequenceIsSupported(const DfuSequence* seq)
{ {
DfuSequence seq = ParseSequence(deviceKey); return seq && !seq->steps.empty();
return !seq.steps.empty(); }
bool SequenceRequiresCLI(const DfuSequence* seq)
{
return seq && !seq->isSupported;
} }
#endif // WITH_GUI || WITH_TUI #endif // WITH_GUI || WITH_TUI
+3 -1
View File
@@ -51,6 +51,7 @@ struct DfuStep
struct DfuSequence struct DfuSequence
{ {
bool isSupported = true;
std::string imageName; std::string imageName;
int imageWidth = 0; int imageWidth = 0;
int imageHeight = 0; int imageHeight = 0;
@@ -60,7 +61,8 @@ struct DfuSequence
}; };
DfuSequence ParseSequence(const std::string& deviceKey); DfuSequence ParseSequence(const std::string& deviceKey);
bool SequenceIsSupported(const std::string& deviceKey); bool SequenceIsSupported(const DfuSequence* seq);
bool SequenceRequiresCLI(const DfuSequence* seq);
#endif // SEQUENCE_H #endif // SEQUENCE_H
+14 -8
View File
@@ -73,17 +73,23 @@ static std::string get_device_subtitle(const DeviceState& state) {
switch (state.mode) { switch (state.mode) {
case DeviceMode::Normal: case DeviceMode::Normal:
if (state.isSupported) { if (state.requiresCLI) {
return "Sorry, jailbreaking is only available via CLI mode * iOS " + version + "\n" + ecid;
} else if (state.isSupported) {
return "Connected in normal mode * iOS " + version + "\n" + ecid; return "Connected in normal mode * iOS " + version + "\n" + ecid;
} else {
return "Sorry, this normal device is not supported * iOS " + version + "\n" + ecid;
} }
return "Not supported * iOS " + version + "\n" + ecid;
case DeviceMode::Recovery: case DeviceMode::Recovery:
if (state.isSupported) { if (state.requiresCLI) {
return "Connected in recovery mode\n" + ecid; return "Sorry, jailbreaking is only available via CLI mode.\n" + ecid;
} else if (state.isSupported) {
return "Connected in recovery mode.\n" + ecid;
} else {
return "Sorry, this recovery device is not supported.\n" + ecid;
} }
return "Not supported\n" + ecid;
case DeviceMode::DFU: case DeviceMode::DFU:
return "Sorry, jailbreaking in DFU mode is not supported.\n"; return "Sorry, jailbreaking in DFU is not supported.\n";
case DeviceMode::None: case DeviceMode::None:
return "Please connect a device to get started. Ensure version range is 15.0+"; return "Please connect a device to get started. Ensure version range is 15.0+";
} }
@@ -221,7 +227,7 @@ void TuiMainPanel::handle_enter(int selected, int sy, int sx) {
case 2: { case 2: {
if (block_start) break; if (block_start) break;
bool can_start = (state.connected && state.isSupported && state.mode != DeviceMode::DFU); bool can_start = (state.connected && state.isSupported && !state.requiresCLI && state.mode != DeviceMode::DFU);
if (can_start) { if (can_start) {
if (state.mode == DeviceMode::Recovery) { if (state.mode == DeviceMode::Recovery) {
GetFrame()->ShowDfu(1); GetFrame()->ShowDfu(1);
@@ -255,7 +261,7 @@ bool TuiMainPanel::is_button_enabled(int btn_idx) const {
switch(btn_idx) { switch(btn_idx) {
case 0: return true; case 0: return true;
case 1: return true; case 1: return true;
case 2: return (state.connected && state.isSupported && state.mode != DeviceMode::DFU); case 2: return (state.connected && state.isSupported && !state.requiresCLI && state.mode != DeviceMode::DFU);
case 3: return true; case 3: return true;
} }
+16 -8
View File
@@ -216,7 +216,7 @@ void MainPanel::SetDeviceState(const DeviceState& state)
m_deviceTitle->SetLabel("Multiple devices detected"); m_deviceTitle->SetLabel("Multiple devices detected");
m_deviceSubtitle->SetLabel( m_deviceSubtitle->SetLabel(
wxString::Format( wxString::Format(
"%u devices connected. Please only connect one device.\n", "%u USB devices connected. Disconnect extras and keep only one device attached.\n",
state.connectedDeviceCount state.connectedDeviceCount
) )
); );
@@ -239,30 +239,38 @@ void MainPanel::SetDeviceState(const DeviceState& state)
switch (state.mode) switch (state.mode)
{ {
case DeviceMode::Normal: case DeviceMode::Normal:
if (state.isSupported) { if (state.requiresCLI) {
m_deviceTitle->SetLabel(productString); m_deviceTitle->SetLabel(productString);
m_deviceSubtitle->SetLabel("Connected in normal mode - iOS " + versionString + "\n" + ecidString); m_deviceSubtitle->SetLabel("Sorry, jailbreaking is only available via CLI mode - OS " + versionString + "\n" + ecidString);
m_startButton->Enable(false);
} else if (state.isSupported) {
m_deviceTitle->SetLabel(productString);
m_deviceSubtitle->SetLabel("Connected in normal mode - OS " + versionString + "\n" + ecidString);
m_startButton->Enable(); m_startButton->Enable();
} else { } else {
m_deviceTitle->SetLabel(productString); m_deviceTitle->SetLabel(productString);
m_deviceSubtitle->SetLabel("Not supported - iOS " + versionString + "\n" + ecidString); m_deviceSubtitle->SetLabel("Sorry, this normal device is not supported - OS " + versionString + "\n" + ecidString);
m_startButton->Enable(false); m_startButton->Enable(false);
} }
break; break;
case DeviceMode::Recovery: case DeviceMode::Recovery:
if (state.isSupported) { if (state.requiresCLI) {
m_deviceTitle->SetLabel(productString); m_deviceTitle->SetLabel(productString);
m_deviceSubtitle->SetLabel("Connected in recovery mode\n" + ecidString); m_deviceSubtitle->SetLabel("Sorry, jailbreaking is only available via CLI mode.\n" + ecidString);
m_startButton->Enable(false);
} else if (state.isSupported) {
m_deviceTitle->SetLabel(productString);
m_deviceSubtitle->SetLabel("Connected in recovery mode.\n" + ecidString);
m_startButton->Enable(); m_startButton->Enable();
} else { } else {
m_deviceTitle->SetLabel(productString); m_deviceTitle->SetLabel(productString);
m_deviceSubtitle->SetLabel("Not supported\n" + ecidString); m_deviceSubtitle->SetLabel("Sorry, this recovery device is not supported.\n" + ecidString);
m_startButton->Enable(false); m_startButton->Enable(false);
} }
break; break;
case DeviceMode::DFU: case DeviceMode::DFU:
m_deviceTitle->SetLabel("DFU Mode device"); m_deviceTitle->SetLabel("DFU Mode device");
m_deviceSubtitle->SetLabel("Sorry, jailbreaking in DFU mode is not supported.\n"); m_deviceSubtitle->SetLabel("Sorry, jailbreaking in DFU is not supported.\n");
m_startButton->Enable(false); m_startButton->Enable(false);
break; break;
case DeviceMode::None: case DeviceMode::None: