diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 79dc016..0af105e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -3,6 +3,28 @@ // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ + { + // Run OpenSuperClone (build it, if necessary). + "label": "▶️ Run OpenSuperClone", + "type": "shell", + "linux": { + "command": "[ -f ./Release/bin/opensuperclone ] || ./build.sh && sudo ./Release/bin/opensuperclone", + }, + "presentation": { + "clear": true + } + }, + { + // Run OSCViewer (build it, if necessary). + "label": "▶️ Run OSCViewer", + "type": "shell", + "linux": { + "command": "[ -f ./Release/bin/oscviewer ] || ./build.sh && ./Release/bin/oscviewer", + }, + "presentation": { + "clear": true + } + }, { // Build Release. "label": "🔧 Build Release", @@ -16,7 +38,7 @@ }, { // Update PO files. - "label": "🔧 Update POs", + "label": "🌐 Update POs", "type": "shell", "linux": { "command": "./update-pos.sh", @@ -25,28 +47,6 @@ "clear": true } }, - { - // Run OpenSuperClone. - "label": "▶️ Run OpenSuperClone", - "type": "shell", - "linux": { - "command": "sudo ./Release/bin/opensuperclone", - }, - "presentation": { - "clear": true - } - }, - { - // Run OSCViewer. - "label": "▶️ Run OSCViewer", - "type": "shell", - "linux": { - "command": "./Release/bin/oscviewer", - }, - "presentation": { - "clear": true - } - }, { // Package Release. "label": "✉️ Package Release", diff --git a/README.md b/README.md index 4479967..d3e5f3f 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ $ ./Release/bin/oscviewer * Switched from GTK2 to GTK3 * Replaced localization system with gettext * Updated kernel driver to work on 5.15 +* Minor improvements to OSCViewer (color picker, minor graphical changes) ## 💵 Credits diff --git a/build.sh b/build.sh index 19a095f..43822e1 100755 --- a/build.sh +++ b/build.sh @@ -1,3 +1,5 @@ +#!/bin/sh + [ ! -d build ] && mkdir build echo "Configuring..." diff --git a/clean.sh b/clean.sh index 42749a1..039d9dd 100755 --- a/clean.sh +++ b/clean.sh @@ -1,3 +1,7 @@ +#!/bin/sh + +echo "Cleaning up..." + if [ -d build ]; then rm -rf build fi diff --git a/install.sh b/install.sh index 1c05180..881e02d 100755 --- a/install.sh +++ b/install.sh @@ -1,3 +1,5 @@ +#!/bin/sh + [ ! -d build ] && mkdir build echo "Configuring..." @@ -25,7 +27,7 @@ else echo "Build succeeded." fi -echo "Installing..." +echo "Installing OpenSuperClone to /usr/local/..." sudo make install if [ $? -ne 0 ]; then diff --git a/package.sh b/package.sh index 398c8d6..fa37caa 100755 --- a/package.sh +++ b/package.sh @@ -1,3 +1,5 @@ +#!/bin/sh + [ ! -d build ] && mkdir build echo "Configuring..." diff --git a/src/opensuperclone/clone_gui.c b/src/opensuperclone/clone_gui.c index 0ac8f72..141bc1c 100644 --- a/src/opensuperclone/clone_gui.c +++ b/src/opensuperclone/clone_gui.c @@ -305,6 +305,24 @@ int start_gtk_ccc(int argc, char **argv, char *title, char *version) gtk_button_set_label(GTK_BUTTON(soft_reset_button_ccc), _("Soft\nReset")); gtk_button_set_label(GTK_BUTTON(hard_reset_button_ccc), _("Hard\nReset")); + // set button tooltips + gtk_widget_set_tooltip_text(connect_button_ccc, _("Connect to the drive")); + gtk_widget_set_tooltip_text(disconnect_button_ccc, _("Disconnect from the drive")); + gtk_widget_set_tooltip_text(start_button_ccc, _("Start the clone/virtual driver")); + gtk_widget_set_tooltip_text(stop_button_ccc, _("Stop the clone/virtual driver")); + gtk_widget_set_tooltip_text(analyze_button_ccc, _("Analyze the drive")); + gtk_widget_set_tooltip_text(analyze_long_button_ccc, _("Analyze the drive (extended)")); + gtk_widget_set_tooltip_text(smart_button_ccc, _("Retrieve SMART information")); + gtk_widget_set_tooltip_text(clone_mode_button_ccc, _("Switch to clone mode")); + gtk_widget_set_tooltip_text(agressive_driver_checkbutton_ccc, _("Activate slow driver")); + gtk_widget_set_tooltip_text(driver_mode1_button_ccc, _("Switch to virtual mode 1: This mode will use all available Phases (starting with Phase 4) when reading from the source")); + gtk_widget_set_tooltip_text(driver_mode2_button_ccc, _("Switch to virtual mode 2: This mode will only use Phase 4 and will not perform any further processing of a chunk")); + gtk_widget_set_tooltip_text(driver_mode3_button_ccc, _("Switch to virtual mode 3: This mode is the same as mode 3, but it will increase the read size (up to the cluster size) when it detects sequential reads")); + gtk_widget_set_tooltip_text(driver_mode4_button_ccc, _("Switch to virtual mode 4: This mode only reads from the destination, and will not read any data from the source")); + gtk_widget_set_tooltip_text(driver_mode5_button_ccc, _("Switch to virtual mode 5: This mode does not read any data and will instead return zeroed data")); + gtk_widget_set_tooltip_text(soft_reset_button_ccc, _("Soft reset the drive")); + gtk_widget_set_tooltip_text(hard_reset_button_ccc, _("Hard reset the drive")); + gtk_label_set_text(GTK_LABEL(label_project_ccc), _("Project")); gtk_label_set_text(GTK_LABEL(label_domain_ccc), _("Domain")); gtk_label_set_text(GTK_LABEL(label_source_ccc), _("Source")); @@ -339,6 +357,40 @@ int start_gtk_ccc(int argc, char **argv, char *title, char *version) gtk_label_set_text(GTK_LABEL(label_drivermode_ccc), _("Clone/Driver Mode")); gtk_label_set_text(GTK_LABEL(data_drivermode_ccc), _("Clone")); + // add label tooltips + gtk_widget_set_tooltip_text(label_project_ccc, _("The project log file for the current recovery")); + gtk_widget_set_tooltip_text(label_domain_ccc, _("The domain file for the current recovery")); + gtk_widget_set_tooltip_text(label_source_ccc, _("The source drive to be recovered")); + gtk_widget_set_tooltip_text(label_destination_ccc, _("The destination drive or image file to be recovered to")); + gtk_widget_set_tooltip_text(label_totallba_ccc, _("The total number of LBAs in the source drive")); + gtk_widget_set_tooltip_text(label_lbatoread_ccc, _("The number of LBAs to be read from the source drive")); + gtk_widget_set_tooltip_text(label_domainsize_ccc, _("The size of the domain file in LBAs")); + gtk_widget_set_tooltip_text(label_runtime_ccc, _("The total time taken to recover the drive")); + gtk_widget_set_tooltip_text(label_remainingtime_ccc, _("The estimated time remaining to complete the recovery")); + gtk_widget_set_tooltip_text(label_currentposition_ccc, _("The current position in the source drive in LBAs")); + gtk_widget_set_tooltip_text(label_currentstatus_ccc, _("The current status of the recovery")); + gtk_widget_set_tooltip_text(label_currentrate_ccc, _("The current rate of the recovery")); + gtk_widget_set_tooltip_text(label_recentrate_ccc, _("The average rate of the last 5 minutes of the recovery")); + gtk_widget_set_tooltip_text(label_totalrate_ccc, _("The average rate of the entire recovery")); + gtk_widget_set_tooltip_text(label_skipsize_ccc, _("The base skip size")); + gtk_widget_set_tooltip_text(label_skips_ccc, _("The total number of skips so far")); + gtk_widget_set_tooltip_text(label_slowskips_ccc, _("The total number of skips due to slow reads so far")); + gtk_widget_set_tooltip_text(label_skipruns_ccc, _("The total number of skip runs so far")); + gtk_widget_set_tooltip_text(label_skipresets_ccc, _("The total number of times the skipping was reset due to exceeding the limit of 64 skips in a run")); + gtk_widget_set_tooltip_text(label_runsize_ccc, _("The size of the last skip run")); + gtk_widget_set_tooltip_text(label_finished_ccc, _("The total number of LBAs recovered so far")); + gtk_widget_set_tooltip_text(label_nontried_ccc, _("The total number of LBAs that have not been tried to be recovered")); + gtk_widget_set_tooltip_text(label_nontrimmed_ccc, _("The total number of LBAs that have not been trimmed")); + gtk_widget_set_tooltip_text(label_nondivided_ccc, _("The total number of LBAs that have not been divided")); + gtk_widget_set_tooltip_text(label_nonscraped_ccc, _("The total number of LBAs that have not been scraped")); + gtk_widget_set_tooltip_text(label_bad_ccc, _("The total number of LBAs that have been marked as bad")); + gtk_widget_set_tooltip_text(label_datapreview_ccc, _("A sample of data from the last good read since the last display update (will be all zeroes if no good reads have occurred since the last display update)")); + gtk_widget_set_tooltip_text(label_longestreadtime_ccc, _("The longest read time since the last display update / within the last 256 display updates / since the start of the recovery")); + gtk_widget_set_tooltip_text(label_filled_ccc, _("The total number of LBAs that have been filled either in Fill mode or Erase mode")); + gtk_widget_set_tooltip_text(label_retried_ccc, _("The total number of LBAs that have been retried")); + gtk_widget_set_tooltip_text(label_retrypasses_ccc, _("The total number of retry passes remaining")); + gtk_widget_set_tooltip_text(label_drivermode_ccc, _("The current mode of the recovery")); + // set status buttons button_bbk_ccc = gtk_button_new_with_label("BBK"); button_unc_ccc = gtk_button_new_with_label("UNC"); @@ -376,6 +428,24 @@ int start_gtk_ccc(int argc, char **argv, char *title, char *version) gtk_box_pack_start(GTK_BOX(bottom_status_bar_ccc), button_tk0nf_ccc, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(bottom_status_bar_ccc), button_amnf_ccc, TRUE, TRUE, 0); + // set status buttons tooltips + gtk_widget_set_tooltip_text(button_bsy_ccc, _("Busy (The device is busy)")); + gtk_widget_set_tooltip_text(button_drdy_ccc, _("Device Ready (The device is ready to accept commands))")); + gtk_widget_set_tooltip_text(button_df_ccc, _("Device Fault (The device has detected a fault)")); + gtk_widget_set_tooltip_text(button_dsc_ccc, _("Device Seek Complete (Head is settled on the track)")); + gtk_widget_set_tooltip_text(button_drq_ccc, _("Data Request (The device is ready to transfer data)")); + gtk_widget_set_tooltip_text(button_corr_ccc, _("Corrected Data (The device has corrected data)")); + gtk_widget_set_tooltip_text(button_idx_ccc, _("Index (The device has reached the index mark)")); + gtk_widget_set_tooltip_text(button_err_ccc, _("Error (The device has detected an error)")); + gtk_widget_set_tooltip_text(button_bbk_ccc, _("Bad Block (The device has detected a bad block)")); + gtk_widget_set_tooltip_text(button_unc_ccc, _("Uncorrectable Data (The device has detected uncorrectable data)")); + gtk_widget_set_tooltip_text(button_mc_ccc, _("Media Change (The media has changed)")); + gtk_widget_set_tooltip_text(button_idnf_ccc, _("ID Not Found (The device could not find the sector's ID field)")); + gtk_widget_set_tooltip_text(button_mcr_ccc, _("Media Change Request (The device has requested a media change)")); + gtk_widget_set_tooltip_text(button_abrt_ccc, _("Command Aborted (The device has aborted the command)")); + gtk_widget_set_tooltip_text(button_tk0nf_ccc, _("Track 0 Not Found (The device could not find track 0)")); + gtk_widget_set_tooltip_text(button_amnf_ccc, _("Address Mark Not Found (The device could not find the address mark)")); + // set intial button states set_disconnected_ccc(); diff --git a/uninstall.sh b/uninstall.sh index 8b31b8e..a7885cc 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -1,3 +1,7 @@ +#!/bin/sh + +echo "Uninstalling OpenSuperClone from /usr/local/..." + if [ -f /usr/local/bin/opensuperclone ]; then sudo rm -f /usr/local/bin/opensuperclone fi diff --git a/update-pos.sh b/update-pos.sh index f9f34a4..dc563b8 100755 --- a/update-pos.sh +++ b/update-pos.sh @@ -1,8 +1,10 @@ -echo "Updating po template files..." +#!/bin/sh + +echo "Updating PO template files..." xgettext -d opensuperclone -s -k_ -kN_ -o ./src/opensuperclone/locale/opensuperclone.pot ./src/opensuperclone/*.c xgettext -d oscviewer -s -k_ -kN_ -o ./src/oscviewer/locale/oscviewer.pot ./src/oscviewer/*.c -echo "Updating po files..." +echo "Updating PO files..." for i in `find ./src/opensuperclone/locale/ -name opensuperclone.po`; do msgmerge -U $i ./src/opensuperclone/locale/opensuperclone.pot --backup=none done