Compare commits

...

116 Commits

Author SHA1 Message Date
Stéphane Lesimple
4a7d375475 chore: update release date in CHANGELOG 2025-05-04 14:10:13 +02:00
Stéphane Lesimple
fb4e70bfca chore: windows: add glib2 schemas when packaging 2025-05-04 14:02:43 +02:00
Stéphane Lesimple
8a354dbb4f chore: update locales 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
3ed8d281c4 bump to patchlevel 4 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
9e6b43d2cf chore: configure: remove a few now-useless -Wno-* 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
b89b7d0e50 chore: remove the TODO menu for our version 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
4456b67a24 adjust adaptive reading message for RS03 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
49cf87bb31 update changelogs in-app 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
117fcb1ee9 chore: makefile: hide glib-compile-resources call 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
7c72e749ca chore: add macos suffix to macos dist 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
f03dc63571 update changelog and credits for release 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
f1debb4002 update README 2025-05-03 12:13:39 +02:00
Stéphane Lesimple
935aa50038 Adjust workflows to build a proper Windows zip with gtk3 2025-05-01 17:10:27 +02:00
Paul Dicker
235a6243d2 Smooth curve (don't round double to int) 2025-05-01 11:41:09 +02:00
Paul Dicker
aa00ac9e3e Fix path with arc parsing bug in old rsvg 2025-05-01 11:40:51 +02:00
Paul Dicker
76f79adeed Explicitly use -symbolic in icon reference names (for old gtk3 versions) 2025-05-01 11:40:51 +02:00
Paul Dicker
903228e4b0 Rename help icon to manual to avoid confusion with stock help icon 2025-05-01 11:40:51 +02:00
Paul Dicker
02e1d35db8 Simplify svg of create icon 2025-05-01 11:40:51 +02:00
Paul Dicker
bbf60ee3e6 Make fix, scan and verify icons symbolic 2025-05-01 11:40:51 +02:00
Paul Dicker
dc0e03073d Adjust configure and makefile for inlined-icons.c 2025-05-01 11:40:51 +02:00
Paul Dicker
da612c8a3a Enable warnings for deprecated items 2025-05-01 11:40:51 +02:00
Paul Dicker
e4753752d3 Don't use deprecated kIOMasterPortDefault
`kIOMasterPortDefault` is deprecated since macOS 12.0.
One alternative is to use named constant `kIOMainPortDefault` which is
not available before macOS 12.0.

Both named constants are just an alias for `NULL`, so it is simpler to
use it directly instead.
2025-05-01 11:40:51 +02:00
Paul Dicker
e5f1eb1bd0 Don't use stock buttons 2025-05-01 11:40:51 +02:00
Paul Dicker
4f8a5479ac Rework icon handling and convert to svg 2025-05-01 11:40:51 +02:00
Paul Dicker
4c57e2ab2b Don't query medium size on undo 2025-05-01 11:40:51 +02:00
Paul Dicker
30ff03d053 Convert GtkTable to GtkGrid in encoding window 2025-05-01 11:40:51 +02:00
Paul Dicker
d826d01de2 Convert GtkTable to GtkGrid in rs03-verify 2025-05-01 11:40:51 +02:00
Paul Dicker
0d0180167e Convert GtkTable to GtkGrid in rs02-verify 2025-05-01 11:40:51 +02:00
Paul Dicker
dc23ed54b1 Convert GtkTable to GtkGrid in rs01-verify 2025-05-01 11:40:51 +02:00
Paul Dicker
51089b2902 Convert GtkTable to GtkGrid in media info 2025-05-01 11:40:51 +02:00
Paul Dicker
63ff359b03 Convert GtkTable to GtkGrid in RS02 preference tab 2025-05-01 11:40:51 +02:00
Paul Dicker
3538a6bc7b Convert GtkTable to GtkGrid in preferences 2025-05-01 11:40:51 +02:00
Paul Dicker
697b116374 Replace GtkAlignment widget 2025-05-01 11:40:51 +02:00
Paul Dicker
3757f9c9a8 The shadow type property on GtkMenuBar is ignored since gtk 3.20 2025-05-01 11:40:51 +02:00
Paul Dicker
b7840d13c1 Convert gtk_hscale_new_with_range to gtk_scale_new_with_range 2025-05-01 11:40:51 +02:00
Paul Dicker
fdc09176d9 Convert gtk_misc_set_padding to gtk_widget_set_margin_start 2025-05-01 11:40:51 +02:00
Paul Dicker
0392e443f5 Remove label alignments that don't effect layout 2025-05-01 11:40:51 +02:00
Paul Dicker
7e416990cd Vertically center status bar label 2025-05-01 11:40:51 +02:00
Paul Dicker
93be13b0ee Convert gtk_misc_set_alignment to gtk_label_set_(x|y)align 2025-05-01 11:40:51 +02:00
Paul Dicker
222429df10 Convert gtk_(h|v)separator_new to gtk_separator_new 2025-05-01 11:40:51 +02:00
Paul Dicker
5ea0011dce Convert gtk_(h|v)box_new to gtk_box_new 2025-05-01 11:40:51 +02:00
Stéphane Lesimple
cc9f4dd817 add some info about RS03 in readme 2025-04-17 17:35:29 +02:00
Stéphane Lesimple
7732231bb5 fix: RS03RecognizeImage exhaustive search when --no-bdr-defect-management is used (fix #99) 2025-04-16 22:45:16 +02:00
Stéphane Lesimple
e5bc7faa73 Build AppImage with gtk3
This also fixes #92, fixes the opening of the PDF manual under AppImage,
the default path of images and ecc files under AppImage, and a couple
other minor fixes.

We also now get Continuous Build binaries for all supported OSes when
a PR is merged to the main branch, and a Dev series of binaries in a
draft release when the dev branch is updated.
2025-04-15 20:47:11 +02:00
Stéphane Lesimple
3a37673b3f Fix error message display if xdg-open fails 2025-04-15 20:47:11 +02:00
Stéphane Lesimple
0d7a8cc22b Add a notice about ignored command-line options in GUI mode 2025-04-15 20:47:11 +02:00
Stéphane Lesimple
0b5b9c9f9e Re-enable verbose mode, add VERBOSE envvar support 2025-04-15 20:47:11 +02:00
Stéphane Lesimple
061026af8a Remove 'unstable' from the titlebar 2025-04-15 20:47:11 +02:00
Paul Dicker
2b5fca0e4f Simplify welcome window creation 2025-04-14 21:29:34 +02:00
Paul Dicker
24570f86d1 Set window width for help dialogs 2025-04-14 21:29:34 +02:00
Paul Dicker
9f583b1ffb Get foreground color while drawing, don't bother with background 2025-04-14 21:29:34 +02:00
Paul Dicker
d66ee15738 Convert colors to GdkRGBA 2025-04-14 21:29:34 +02:00
Paul Dicker
6c88a55600 Connect to draw instead of expose events 2025-04-14 21:29:34 +02:00
Paul Dicker
e75d73c74a Build with gtk3 2025-04-14 21:29:34 +02:00
Stéphane Lesimple
a7e1a5591e chore: configure: add --with-debug and --with-efence 2025-04-14 19:06:12 +02:00
Stéphane Lesimple
64f31a8e5d Fix issues detected by static analysis 2025-04-14 19:06:12 +02:00
Paul Dicker
d01aae080e Use finer curve grid for fast media (with a small x factor) 2025-04-14 19:05:27 +02:00
Paul Dicker
967d8e0b4c Draw left axis on top of grid (like the other axis) 2025-04-14 19:05:27 +02:00
Paul Dicker
ce64c57c49 Remove Closure->drawGC 2025-04-14 19:05:27 +02:00
Paul Dicker
5da5fa54dc Create cairo context in expose callback 2025-04-14 19:05:27 +02:00
Paul Dicker
6dc80bb542 Draw with cairo in raw editor 2025-04-14 19:05:27 +02:00
Paul Dicker
8c0765a1b6 Draw ecc capacity threshold line with cairo 2025-04-14 19:05:27 +02:00
Paul Dicker
640d72098d Draw adaptive read labels with cairo 2025-04-14 19:05:27 +02:00
Paul Dicker
57b55b2527 Draw curves with separate loops 2025-04-14 19:05:27 +02:00
Paul Dicker
a00dee7240 Draw curve with cairo 2025-04-14 19:05:27 +02:00
Paul Dicker
f3226aaf68 Draw spiral and spiral labels with cairo 2025-04-14 19:05:27 +02:00
Paul Dicker
d9f9094a56 Only draw inside expose callback in raw editor 2025-04-14 19:05:27 +02:00
Paul Dicker
923fe44e4a Only draw in expose callback in RS01/RS02/RS03 windows 2025-04-14 19:05:27 +02:00
Paul Dicker
fb7198c1e9 Only draw in expose callback in read linear window 2025-04-14 19:05:27 +02:00
Paul Dicker
58a35bc565 Only draw in expose callback in adaptive window 2025-04-14 19:05:27 +02:00
Paul Dicker
c4c0fcec81 Always redraw entire curve 2025-04-14 19:05:27 +02:00
Paul Dicker
bb6c9222fb Rename GuiDrawSpiralSegment to GuiSetSpiralSegmentColor 2025-04-14 19:05:27 +02:00
Paul Dicker
956131c3f3 Always redraw entire spiral 2025-04-14 19:05:27 +02:00
Paul Dicker
ed8d9cfd66 Set outline color per spiral segment 2025-04-14 19:05:27 +02:00
Paul Dicker
73218aebd2 Split curve and spiral widgets 2025-04-14 19:05:27 +02:00
Paul Dicker
9effa298cd Store widget instead of drawable in _Spiral 2025-04-14 19:05:27 +02:00
Paul Dicker
2cd769a958 Corect file name in ecc file picker 2025-04-14 19:05:27 +02:00
Paul Dicker
b227732274 Use GtkColorButton 2025-04-14 12:31:57 +02:00
Paul Dicker
e68a8e79d0 Don't set line wrap of message dialog label 2025-04-14 12:31:57 +02:00
Paul Dicker
e9b44a04f0 Use more accessors 2025-04-14 12:31:57 +02:00
Paul Dicker
eadbf54aae Don't directly access widget->allocation 2025-04-14 12:31:57 +02:00
Paul Dicker
3967ff3cae Switch raw sector buffer loading/saving to GtkFileChooserDialog 2025-04-14 12:31:57 +02:00
Paul Dicker
f8678eb3be Switch raw sector file picker to GtkFileChooserDialog 2025-04-14 12:31:57 +02:00
Paul Dicker
ea92170fd1 Switch raw sector dir picker to GtkFileChooserDialog 2025-04-14 12:31:57 +02:00
Paul Dicker
8504386fb1 Switch log file picker to GtkFileChooserDialog 2025-04-14 12:31:57 +02:00
Paul Dicker
8469a933e4 Switch image and ecc file picker to GtkFileChooserDialog 2025-04-14 12:31:57 +02:00
Paul Dicker
ad3285507b Don't right-justify Help 2025-04-14 12:31:57 +02:00
Paul Dicker
2bb0774538 Remove reversing Ok/Cancel button order functionality 2025-04-14 12:31:57 +02:00
Paul Dicker
2cee2215af Use gtk_menu_shell_append instead of gtk_menu_bar_append 2025-04-14 12:31:57 +02:00
Paul Dicker
8c567549c1 Switch from ComboBox to ComboBoxText 2025-04-14 12:31:57 +02:00
Paul Dicker
9bbd268aa4 Port to new GtkTooltip 2025-04-14 12:31:57 +02:00
Paul Dicker
3be61f4b7b Call FreeCrcBuf earlier (it may do logging) 2025-04-05 07:49:32 +00:00
Paul Dicker
c7b0f5b592 Free gui first (it may do logging) 2025-04-05 07:49:32 +00:00
Paul Dicker
c0bde64a54 Support HD-DVD 2025-04-01 22:27:01 +02:00
Stéphane Lesimple
c19e7ea100 fix: tests under mingw 2025-04-01 21:14:37 +02:00
Stéphane Lesimple
063ad92460 enh: speedup RS03 repair (fixes #100) 2024-08-03 10:24:33 +02:00
Stéphane Lesimple
aa9065f0c0 GUI: when working, disable strip button 2024-07-08 14:48:55 +02:00
Stéphane Lesimple
0bfca9a9fc more detailed help in commandline version 2024-07-08 14:47:42 +02:00
Stéphane Lesimple
71668f3296 fix: prevent AppImage from reading hosts' immodules.cache file (#94) 2024-07-08 13:35:11 +02:00
Stéphane Lesimple
3d1bf4677e remove misplaced src file, add draft (#93) 2024-07-06 16:04:11 +02:00
Stéphane Lesimple
c32080d7d6 fix: AppImage: add libgail, fixes #90 (#91)
* fix: AppImage: add libgail, fixes #90

* chore: push action-gh-release from v1 to v2
2024-05-08 18:20:04 +02:00
Stéphane Lesimple
42bb0a120b release v0.79.10-pl3 2024-02-18 18:29:12 +01:00
Stéphane Lesimple
8d24545c88 fix: corrupt data under Windows with mmap (fixes #82) (#87) 2024-02-18 12:26:41 +01:00
Stéphane Lesimple
16ea27d791 fix: re-enable buttons after Split is used (#86) 2024-02-18 12:21:57 +01:00
Stéphane Lesimple
a7c5268f37 fix: suboptimal layout for RS03 w/o defect management (#79) (#80)
* fix: suboptimal layout for RS03 w/o defect management (#79)

Co-authored-by: jpovixwm <53523617+jpovixwm@users.noreply.github.com>
2024-01-18 11:13:55 +01:00
Stéphane Lesimple
45ff2c5fda chore: update github actions 2023-10-01 15:02:53 +02:00
Stéphane Lesimple
1338598abb chore: fix github actions for release (macOS and AppImage) 2023-09-17 22:39:37 +02:00
Stéphane Lesimple
1577a7c18d chore: fix github actions for release, again 2023-09-17 19:47:49 +02:00
Stéphane Lesimple
36ef8517fd chore: fix github actions for release 2023-09-17 19:37:42 +02:00
Stéphane Lesimple
64c0361179 release v0.79.10-pl2 2023-09-17 19:22:32 +02:00
Stéphane Lesimple
eeb9f0705d feat: re-introduced MacOS support (#71)
* preparatory changes to make dvdisaster compilable under MacOS
* Implemented workaround to macOS Test Unit Ready bug
* fixed manual.pdf not opening on macOS
* Added case for binary being in app bundle
* updated locale files due to change in closure.c
* added back mac app bundle specific files
* reverted make-dist.sh to windows/linux only version and created separate mac script which uses dylibbundler
* altered release.yml accordingly
* chore: fix build under MacOS

---------

Co-authored-by: Stéphane Lesimple <speed47_github@speed47.net>
Co-authored-by: jlnbxn <julianboxan@gmail.com>
Co-authored-by: wojas <github@m.wojas.nl>
2023-09-17 19:13:47 +02:00
Stéphane Lesimple
f38969c7c8 chore: update github actions to use windows-latest 2023-06-01 10:00:29 +02:00
Stéphane Lesimple
be6970f5df chore: add codeql 2023-06-01 10:00:29 +02:00
Stéphane Lesimple
cb3d628f12 chore: fix regtests under github actions 2022-07-23 15:48:06 +02:00
Stéphane Lesimple
62ec64d18f fix: appimage: issue with glib #60 2022-07-23 15:48:06 +02:00
Stéphane Lesimple
981226eec2 chore: fix bad utf8 encoding 2021-10-10 00:58:30 +02:00
118 changed files with 11162 additions and 10616 deletions

64
.github/workflows/codeql.yml vendored Normal file
View File

@@ -0,0 +1,64 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on: [push,pull_request]
jobs:
analyze:
name: Analyze
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Use only 'java' to analyze code written in Java, Kotlin or both
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
persist-credentials: false
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
- name: Build app
run: |
sudo apt-get update && sudo apt-get install -y libglib2.0-dev ghostscript man jq libgtk-3-dev
./configure --with-werror
nproc && make -j$(nproc)
env:
DEBIAN_FRONTEND: noninteractive
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"

View File

@@ -1,6 +1,5 @@
#!/bin/bash
set -e
set -x
github_ref="$1"
@@ -21,31 +20,84 @@ else
fi
archive=dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$')-$suffix.zip
echo "Archive name is $archive"
echo "::set-output name=archive::$archive"
[ -n "$GITHUB_OUTPUT" ] && echo "archive=$archive" >> "$GITHUB_OUTPUT"
echo "!> Appimage is <$archive>"
echo "!> Copying locales"
mkdir -p dist/locale
cp -vr locale/*/ dist/locale/
cp -va locale/*/ dist/locale/
# WINDOWS 32/64
if [ "$os" != "linux64" ]; then
lookup_dependencies="dvdisaster"
if [ "$GUI" = 1 ]; then
mkdir -p dist/share/themes dist/lib/gtk-2.0
cp -vr $MINGW_PREFIX/share/themes/MS-Windows dist/share/themes/
cp -vr $MINGW_PREFIX/lib/gtk-2.0/* dist/lib/gtk-2.0/
rm -rf dist/lib/gtk-2.0/include
echo "!> Copying glib2 schemas..."
mkdir -p dist/share/glib-2.0
cp -va "$MINGW_PREFIX/share/glib-2.0/schemas" dist/share/glib-2.0/
echo "!> Copying default icons..."
mkdir -p dist/share/
cp -va "$MINGW_PREFIX/share/icons" dist/share/
loaders_cache="$(find "$MINGW_PREFIX/lib/gdk-pixbuf-2.0/" -name loaders.cache | head -n1)"
pixbuf_dir="$(dirname "$loaders_cache")"
echo "!> Absolute pixbuf directory is $pixbuf_dir"
pixbuf_dir_relative=$(echo "$pixbuf_dir" | sed -re "s=$MINGW_PREFIX/==")
echo "!> Relative pixbuf directory is $pixbuf_dir_relative"
mkdir -p "dist/$pixbuf_dir_relative/loaders"
cp -va "$loaders_cache" "dist/$pixbuf_dir_relative/"
lookup_dependencies="$lookup_dependencies $(\ls -1 "$pixbuf_dir"/loaders/*.dll)"
fi
mkdir -p dist/lib
ntldd -R dvdisaster
for i in $(ntldd -R dvdisaster | awk '/mingw/ {print $3}' | tr \\\\ / | grep -Eo '[^/]+$')
echo "!> Will look for dependencies of $lookup_dependencies"
for binary in $lookup_dependencies
do
test -e $MINGW_PREFIX/bin/$i && cp -va $MINGW_PREFIX/bin/$i dist/
if [ "$binary" != "dvdisaster" ]; then
echo "!> Copying pixbuf loader lib $binary to dist/$pixbuf_dir_relative/loaders..."
cp -va "$binary" "dist/$pixbuf_dir_relative/loaders/"
fi
echo "!> Looking for dependencies of $binary..."
# ntldd -R $binary
for i in $(ntldd -R "$binary" | awk '/mingw/ {print $3}' | tr \\\\ / | grep -Eo '[^/]+$')
do
src="$MINGW_PREFIX/bin/$i"
echo -n "!>> Inspecting $src... "
if [ -e "$src" ]; then
echo "found, copying"
cp -va "$src" dist/
else
echo "not found, skipping"
fi
done
done
find dist -type f -name "*.a" -delete
echo "!> Remove .a files if any"
find dist -type f -name "*.a" -print -delete
echo "!> Copy and rename text files"
for file in CHANGELOG TODO COPYING CREDITS.* TODO
do
cp -va "$file" "dist/$file.txt"
done
echo "!> Copy other files"
for file in dvdisaster.exe documentation/user-manual/manual.pdf
do
cp -va "$file" dist/
done
# /WINDOWS
else
# Linux
echo "!> Copying text, man and pdf files"
cp -va CHANGELOG TODO COPYING CREDITS.* dvdisaster documentation/dvdisaster.*.1 documentation/user-manual/manual.pdf dist/
fi
echo "!> Building pdf from man"
man -t documentation/dvdisaster.en.1 | ps2pdf - dist/dvdisaster.pdf
cp CHANGELOG TODO COPYING CREDITS.* dvdisaster documentation/dvdisaster.*.1 documentation/user-manual/manual.pdf dist/
echo "!> Building dist zip"
if command -v zip >/dev/null; then
mv dist ${archive/.zip/}
zip -9r $archive ${archive/.zip/}
mv ${archive/.zip/} dist
mv -v dist "${archive/.zip/}"
zip -9r "$archive" "${archive/.zip/}"
mv -v "${archive/.zip/}" dist
fi
echo "dist done ($archive)"
echo "!> Dist done ($archive)"

51
.github/workflows/make-mac-app.sh vendored Executable file
View File

@@ -0,0 +1,51 @@
#!/bin/bash
set -e
set -x
github_ref="$1"
if ./dvdisaster --version | grep -q NOGUI; then
suffix="-cli-only"
else
suffix=""
fi
archive="dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$')-macos$suffix.dmg"
[ -n "$GITHUB_OUTPUT" ] && echo "archive=$archive" >> "$GITHUB_OUTPUT"
echo "mac dmg is <$archive>"
mkdir -p dist
# Create directory structure for the macOS application bundle
mkdir -p dvdisaster.app/Contents/{MacOS,Resources}
# Copy the main executable to the appropriate location
cp dvdisaster dvdisaster.app/Contents/MacOS
# Use dylibbundler to bundle dynamic libraries into the application bundle
dylibbundler -od -cd -b -x dvdisaster.app/Contents/MacOS/dvdisaster -d 'dvdisaster.app/Contents/libs/'
# Copy the Info.plist file to define application metadata
cp macinst/Info.plist dvdisaster.app/Contents/
# Create a directory for documentation resources
mkdir dvdisaster.app/Contents/Resources/documentation
# Copy documentation files to the documentation directory
cp CHANGELOG TODO COPYING CREDITS.* documentation/dvdisaster.*.1 documentation/user-manual/manual.pdf dvdisaster.app/Contents/Resources/documentation
# Copy localization files to the locale directory
find locale/* -maxdepth 0 -type d -exec cp -r {} dvdisaster.app/Contents/Resources/locale/ \;
# Copy the application icon to the resources directory
cp macinst/dvdisaster.icns dvdisaster.app/Contents/Resources/
# Make the main executable executable
chmod +x dvdisaster.app/Contents/MacOS/dvdisaster
# Move the application bundle to the 'dist' directory
mv dvdisaster.app dist
create-dmg "$archive" dist
echo "dist done ($archive)"

View File

@@ -1,12 +1,97 @@
name: autobuild
on:
release:
types: [published]
push:
branches:
- 'master'
- 'dev'
tags:
- 'v*'
jobs:
mac:
runs-on: macos-13
strategy:
matrix:
ui: [cli, gui]
include:
- ui: cli
clionly: --with-gui=no
steps:
- uses: actions/checkout@v4
- name: install prerequisites
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: brew install ghostscript glib gdk-pixbuf dylibbundler create-dmg
- name: install prerequisites (GUI)
if: matrix.ui == 'gui'
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: brew install gtk+3
- name: configure
run: |
set +x
./configure ${{ matrix.clionly }} --with-werror
- name: make
run: |
cat Makefile.config
make -j$(sysctl -n hw.ncpu || 2)
- name: check executability
run: ./dvdisaster --version
- name: check executable (GUI)
if: matrix.ui == 'gui'
run: |
./dvdisaster --version
if ./dvdisaster --version | grep NOGUI; then exit 1; fi
- name: check executable (CLI)
if: matrix.ui == 'cli'
run: |
./dvdisaster --version
./dvdisaster --version | grep NOGUI
- name: build dist
run: ./.github/workflows/make-mac-app.sh ${{ github.ref }}
id: dist
- name: Tag for Continuous Build
if: github.ref_name == 'master'
run: |
git tag -f latest
git push -f origin latest
- name: Upload to Continuous Build
if: github.ref_name == 'master'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
name: "Continuous Build"
tag_name: latest
files: ${{ steps.dist.outputs.archive }}
- name: Tag for Dev Build
if: github.ref_name == 'dev'
run: |
git tag -f devel
git push -f origin devel
- name: Upload to Dev Build
if: github.ref_name == 'dev'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
draft: true
name: "Dev Build"
tag_name: devel
files: ${{ steps.dist.outputs.archive }}
- name: Upload to Draft Release
if: github.ref_type == 'tag'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
draft: true
name: ${{ github.ref_name }}
tag_name: ${{ github.ref_name }}
files: ${{ steps.dist.outputs.archive }}
win:
runs-on: windows-2016
runs-on: windows-latest
strategy:
matrix:
arch: [x86_64, i686]
@@ -24,119 +109,232 @@ jobs:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.msystem }}
update: false
install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip
- name: install GUI prereqs
if: matrix.ui == 'gui'
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk2
- name: git config
run: git config --global core.autocrlf input
shell: bash
- uses: actions/checkout@v2
- name: configure
run: ./configure ${{ matrix.clionly }}
- name: make
run: nproc && make -j$(nproc)
- name: check executable
run: |
- uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.msystem }}
update: false
install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip
- name: install GUI prereqs
if: matrix.ui == 'gui'
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk3 mingw-w64-${{ matrix.arch }}-librsvg
- name: git config
run: git config --global core.autocrlf input
shell: bash
- uses: actions/checkout@v4
- name: configure
run: ./configure ${{ matrix.clionly }}
- name: make
run: nproc && make -j$(nproc)
- name: check executable
run: |
./dvdisaster.exe --version
file dvdisaster.exe
if ./dvdisaster.exe --version | grep dirty; then exit 1; fi
file dvdisaster.exe | grep -q '${{ matrix.grep }}, for MS Windows'
- name: check executable (GUI)
if: matrix.ui == 'gui'
run: if ./dvdisaster.exe --version | grep NOGUI; then exit 1; fi
- name: check executable (CLI)
if: matrix.ui == 'cli'
run: ./dvdisaster.exe --version | grep NOGUI
- name: prepare dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
id: dist
- name: check executability of dist from cmd.exe
shell: cmd
run: |
file dvdisaster.exe | grep -q '${{ matrix.grep }}'
file dvdisaster.exe | grep -q 'for MS Windows'
- name: check executable (GUI)
if: matrix.ui == 'gui'
run: if ./dvdisaster.exe --version | grep NOGUI; then exit 1; fi
- name: check executable (CLI)
if: matrix.ui == 'cli'
run: ./dvdisaster.exe --version | grep NOGUI
- name: prepare dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
id: dist
- name: check executability of dist from cmd.exe
shell: cmd
run: |
cd dist
dvdisaster.exe --version
- name: Upload Release Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./${{ steps.dist.outputs.archive }}
asset_name: ${{ steps.dist.outputs.archive }}
asset_content_type: application/zip
- name: Tag for Continuous Build
if: github.ref_name == 'master'
run: |
git tag -f latest
git push -f origin latest
- name: Upload to Continuous Build
if: github.ref_name == 'master'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
name: "Continuous Build"
tag_name: latest
files: ${{ steps.dist.outputs.archive }}
- name: Tag for Dev Build
if: github.ref_name == 'dev'
run: |
git tag -f devel
git push -f origin devel
- name: Upload to Dev Build
if: github.ref_name == 'dev'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
draft: true
name: "Dev Build"
tag_name: devel
files: ${{ steps.dist.outputs.archive }}
- name: Upload to Draft Release
if: github.ref_type == 'tag'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
draft: true
name: ${{ github.ref_name }}
tag_name: ${{ github.ref_name }}
files: ${{ steps.dist.outputs.archive }}
linux64-cli:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: install prerequisites
run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man
- name: configure
run: ./configure --with-gui=no
- name: make
run: nproc && make -j$(nproc) && make static && mv -f dvdisaster-static dvdisaster
- name: check executable
run: |
./dvdisaster --version && ./dvdisaster --version | grep -q dirty || true
file dvdisaster && file dvdisaster | grep -q 'ELF 64' && file dvdisaster | grep -q 'statically linked'
- uses: actions/checkout@v4
- name: install prerequisites
run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man
- name: configure
run: ./configure --with-gui=no
- name: make
run: nproc && make -j$(nproc) && make static && mv -f dvdisaster-static dvdisaster
- name: check executable
run: |
./dvdisaster --version && ./dvdisaster --version | grep -q dirty || true
file dvdisaster && file dvdisaster | grep -q 'ELF 64' && file dvdisaster | grep -q 'statically linked'
- name: build dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
id: dist
- name: Upload Release Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./${{ steps.dist.outputs.archive }}
asset_name: ${{ steps.dist.outputs.archive }}
asset_content_type: application/zip
- name: build dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
id: dist
- name: Tag for Continuous Build
if: github.ref_name == 'master'
run: |
git tag -f latest
git push -f origin latest
- name: Upload to Continuous Build
if: github.ref_name == 'master'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
name: "Continuous Build"
tag_name: latest
files: ${{ steps.dist.outputs.archive }}
- name: Tag for Dev Build
if: github.ref_name == 'dev'
run: |
git tag -f devel
git push -f origin devel
- name: Upload to Dev Build
if: github.ref_name == 'dev'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
draft: true
name: "Dev Build"
tag_name: devel
files: ${{ steps.dist.outputs.archive }}
- name: Upload to Draft Release
if: github.ref_type == 'tag'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
draft: true
name: ${{ github.ref_name }}
tag_name: ${{ github.ref_name }}
files: ${{ steps.dist.outputs.archive }}
linux64-appimage:
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: install prerequisites
run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man wget libgtk2.0-dev gtk2-engines-pixbuf gtk2-engines pkg-config gnome-themes-standard
- name: configure
run: ./configure --prefix=/usr
- name: make
run: nproc && make -j$(nproc) && make
- name: make install
run: touch documentation/user-manual/manual.pdf && mkdir /tmp/dist && make install DESTDIR=/tmp/dist
- name: copy things to dist
run: |
install -d /tmp/dist/usr/lib/gtk-2.0
cp -va $(pkg-config --variable=libdir gtk+-2.0)/gtk-2.0/$(pkg-config --variable=gtk_binary_version gtk+-2.0)/* /tmp/dist/usr/lib/gtk-2.0
- name: get linuxdeploy
run: wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod 755 linuxdeploy-x86_64.AppImage
- name: build appimage
run: |
export VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$')
./linuxdeploy-x86_64.AppImage -d contrib/dvdisaster.desktop -i contrib/dvdisaster64.png -i contrib/dvdisaster48.png -i contrib/dvdisaster32.png -i contrib/dvdisaster16.png --icon-filename dvdisaster --custom-apprun=contrib/AppRun.sh --appdir /tmp/dist/ --output appimage
- name: test appimage
id: dist
run: |
chmod 755 dvdisaster*.AppImage && ./dvdisaster*.AppImage --version
archive=$(ls -1 dvdisaster*.AppImage)
echo "::set-output name=archive::$archive"
echo "appimage is <$archive>"
- name: Upload Release Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./${{ steps.dist.outputs.archive }}
asset_name: ${{ steps.dist.outputs.archive }}
asset_content_type: application/zip
- uses: actions/checkout@v4
- name: install prerequisites on host
run: sudo apt-get update && sudo apt-get install -y fuse
- name: docker
run: |
mkdir -p /tmp/dist
docker run --device /dev/fuse --privileged --name uu -d -v $PWD:/dvdisaster -v /tmp/dist:/dist ubuntu:18.04 sleep 1800
- name: install prerequisites in docker
run: docker exec uu sh -c 'apt update && apt install -y ghostscript man fuse file make gcc pkg-config libglib2.0-dev libgtk-3-dev glib-networking libgdk-pixbuf2.0-dev'
- name: configure in docker
run: docker exec uu sh -c 'cd /dvdisaster && ./configure --prefix=/usr'
- name: make in docker
run: docker exec uu sh -c 'make -C /dvdisaster -j$(nproc) && make -C /dvdisaster'
- name: make install in docker
run: docker exec uu sh -c 'cd /dvdisaster && touch documentation/user-manual/manual.pdf && make install DESTDIR=/dist'
- name: copy gtk3 and gio stuff to dist in docker
run: |
set -euo pipefail
docker exec uu sh -c 'install -d /dist/usr/lib/gtk-3.0 && cp -va $(pkg-config --variable=libdir gtk+-3.0)/gtk-3.0/* /dist/usr/lib/gtk-3.0'
docker exec uu sh -c 'install -d /dist/usr/lib/gio/modules && cp -va $(dirname $(dpkg -L glib-networking | grep -F /libgiolibproxy.so | head -n1))/* /dist/usr/lib/gio/modules/'
docker exec uu sh -c 'gio-querymodules /dist/usr/lib/gio/modules'
docker exec uu sh -c 'install -d /dist/usr/lib/gdk-pixbuf2 && timeout 10 cp -va $(dirname $(find /usr/lib -name "libpixbufloader-*.so" | head -n1))/../* /dist/usr/lib/gdk-pixbuf2/'
docker exec uu sh -c 'gdk-pixbuf-query-loaders > /dist/usr/lib/gdk-pixbuf2/loaders.cache'
IM_BASEPATH=$(dirname $(cd /tmp/dist; find . -name immodules.cache))/immodules
sudo sed -i -re 's=^"/.+/immodules/(.+)="'$IM_BASEPATH'/\1=' $(find /tmp/dist/ -name immodules.cache)
PIX_BASEPATH=$(dirname $(cd /tmp/dist; find . -name loaders.cache))/
sudo sed -i -re 's=^"/.+/loaders/(.+)="'$PIX_BASEPATH'/loaders/\1=' $(find /tmp/dist/ -name loaders.cache)
- name: build appimage in docker with linuxdeploy
run: |
wget -q https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
chmod 755 linuxdeploy-x86_64.AppImage
docker exec -e LINUXDEPLOY_OUTPUT_VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$') -e ARCH=x86_64 uu sh -c 'cd /dvdisaster && ./linuxdeploy-x86_64.AppImage -d contrib/dvdisaster.desktop -i contrib/dvdisaster64.png -i contrib/dvdisaster48.png -i contrib/dvdisaster32.png -i contrib/dvdisaster16.png --icon-filename dvdisaster --custom-apprun=contrib/AppRun.sh --appdir /dist/ --output appimage'
- name: fix perms
run: docker exec uu sh -c "chown -R $UID /dist /dvdisaster/*.AppImage"
- name: patch libgio and apply glib workaround by repackaging with appimagetool
env:
ARCH: x86_64
run: |
wget -q https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
chmod 755 appimagetool-x86_64.AppImage
exe=$(ls -1 dvdisaster*.AppImage)
chmod 755 $exe
./$exe --appimage-extract
rm -vf $exe
sed -i -re "s=gio/modules=:::::::::::=g" squashfs-root/usr/lib/libgio*.so*
env LINUXDEPLOY_OUTPUT_VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$') ./appimagetool-x86_64.AppImage -v squashfs-root
mv -v dvdisaster*AppImage $exe
chmod 755 $exe
- name: test appimage
id: dist
run: |
chmod 755 dvdisaster*.AppImage && ./dvdisaster*.AppImage --version
archive=$(ls -1 dvdisaster*.AppImage)
echo "archive=$archive" >> "$GITHUB_OUTPUT"
echo "appimage is <$archive>"
- name: Tag for Continuous Build
if: github.ref_name == 'master'
run: |
git tag -f latest
git push -f origin latest
- name: Upload to Continuous Build
if: github.ref_name == 'master'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
name: "Continuous Build"
tag_name: latest
files: ${{ steps.dist.outputs.archive }}
- name: Tag for Dev Build
if: github.ref_name == 'dev'
run: |
git tag -f devel
git push -f origin devel
- name: Upload to Dev Build
if: github.ref_name == 'dev'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: true
draft: true
name: "Dev Build"
tag_name: devel
files: ${{ steps.dist.outputs.archive }}
- name: Upload to Draft Release
if: github.ref_type == 'tag'
uses: softprops/action-gh-release@v2
with:
token: "${{ secrets.GITHUB_TOKEN }}"
draft: true
name: ${{ github.ref_name }}
tag_name: ${{ github.ref_name }}
files: ${{ steps.dist.outputs.archive }}

View File

@@ -3,8 +3,61 @@ name: non-regression tests
on: [pull_request]
jobs:
mac:
runs-on: macos-latest
strategy:
matrix:
ui: [cli, gui]
printf: [fmtdbg, normal]
include:
- ui: cli
clionly: --with-gui=no
- printf: fmtdbg
debugprintf: --with-debug-printf-format
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: install prerequisites
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: brew install ghostscript
- name: install prerequisites (GUI)
if: matrix.ui == 'gui'
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: brew install gtk+3
- name: configure
run: |
set +x
./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror
- name: make
run: |
cat Makefile.config
echo xxxxxxxxxxxxxxxxxxxxxxx
grep -i icon GNUmakefile
make -j$(sysctl -n hw.ncpu || 2)
- name: check executability
run: ./dvdisaster --version
- name: check executable (GUI)
if: matrix.ui == 'gui'
run: |
./dvdisaster --version
if ./dvdisaster --version | grep NOGUI; then exit 1; fi
- name: check executable (CLI)
if: matrix.ui == 'cli'
run: |
./dvdisaster --version
./dvdisaster --version | grep NOGUI
- name: prepare dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
- name: regression tests
if: matrix.printf == 'normal'
env:
REGTEST_NO_UTF8: 1
run: mkdir /var/tmp/regtest && ./regtest/runtests.sh
win:
runs-on: windows-2016
runs-on: windows-latest
strategy:
matrix:
arch: [x86_64, i686]
@@ -32,11 +85,13 @@ jobs:
install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip
- name: install GUI prereqs
if: matrix.ui == 'gui'
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk2
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk3
- name: git config
run: git config --global core.autocrlf input
shell: bash
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: configure
run: |
echo running ./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror
@@ -48,7 +103,8 @@ jobs:
./dvdisaster.exe --version
file dvdisaster.exe
if ./dvdisaster.exe --version | grep dirty; then exit 1; fi
file dvdisaster.exe | grep -q '${{ matrix.grep }}, for MS Windows'
file dvdisaster.exe | grep -q '${{ matrix.grep }}'
file dvdisaster.exe | grep -q 'for MS Windows'
- name: check executable (GUI)
if: matrix.ui == 'gui'
run: |
@@ -79,7 +135,9 @@ jobs:
- printf: fmtdbg
debugprintf: --with-debug-printf-format
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: install prerequisites
env:
DEBIAN_FRONTEND: noninteractive
@@ -88,7 +146,7 @@ jobs:
if: matrix.ui == 'gui'
env:
DEBIAN_FRONTEND: noninteractive
run: sudo apt-get install -y libgtk2.0-dev
run: sudo apt-get install -y libgtk-3-dev
- name: configure
run: |
echo ./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror

2
.gitignore vendored
View File

@@ -10,7 +10,7 @@ locale/Makefile
GNUmakefile
.gitignore
simple-md5sum
inlined-icons.h
inlined-icons.c
help-dialogs.h
dvdisaster
build.h

View File

@@ -20,6 +20,21 @@
# You should have received a copy of the GNU General Public License
# along with dvdisaster. If not, see <http://www.gnu.org/licenses/>.
0.79.10.patchlevel-4 04-05-2025 *UNOFFICIAL*
- enh: port the GUI to gtk3
- enh: speedup RS03 repair
- enh: add support for HD-DVD(-R(W))
- fix: RS03 exhaustive search on BD-R when --no-bd-defect-management is used
- fix: a few coding errors found by static analysis (no major impact)
- fix: disable strip button on GUI when working
0.79.10.patchlevel-3 17-02-2024 *UNOFFICIAL*
- fix: corrupt data under Windows with mmap
- fix: re-enable buttons after Split is used
0.79.10.patchlevel-2 17-09-2023 *UNOFFICIAL*
- re-introduced MacOS build. No other functional change since v0.79.10-pl1.
0.79.10.patchlevel-1 09-10-2021 *UNOFFICIAL*
- sync: integrated changes from latest upstream,
please refer to the entries below for details.

View File

@@ -14,6 +14,9 @@ Jesus Cea <jcea@jcea.es>
hat das Projekt am Leben erhalten und ermöglicht momentan das
Datenhosting.
Paul Dicker (@pitdicker on GitHub)
migrierte die Anwendung von GTK2 nach GTK3.
Julian Einwag (julian@einwag.de)
erstellt und pflegt die Mac OS X / Darwin - spezifischen Anpassungen.
@@ -56,4 +59,4 @@ Sergey Svishchev (svs@ropnet.ru)
Viele andere Personen haben weitere Anregungen und Fehlerberichte
geliefert; schauen Sie auch in den Änderungsbericht für weitere
Einzelheiten darüber.
Einzelheiten darüber.

View File

@@ -13,6 +13,9 @@ Harald Bögeholz (hwb@heise.de)
Jesus Cea <jcea@jcea.es>
for keeping the project alive and providing hosting for the project
Paul Dicker (@pitdicker on GitHub)
for porting the codebase from GTK2 to GTK3.
Julian Einwag (julian@einwag.de).
provides and maintains the Mac OS X / Darwin port.

View File

@@ -68,9 +68,9 @@ GLIB_CFLAGS = $(CFG_GLIB2_CFLAGS)
GLIB_LIBS = $(CFG_GLIB2_LIBS)
GLIB_BINDIR = $(CFG_GLIB2_BINDIR)
GTK_CFLAGS = $(CFG_GTK2_CFLAGS) $(CFG_GLIB2_CFLAGS)
GTK_LIBS = $(CFG_GTK2_LIBS) $(CFG_GLIB2_LIBS)
GTK_BINDIR = $(CFG_GTK2_BINDIR) $(CFG_GLIB2_BINDIR)
GTK_CFLAGS = $(CFG_GTK3_CFLAGS) $(CFG_GLIB2_CFLAGS)
GTK_LIBS = $(CFG_GTK3_LIBS) $(CFG_GLIB2_LIBS)
GTK_BINDIR = $(CFG_GTK3_BINDIR) $(CFG_GLIB2_BINDIR)
EFENCE_LFLAGS = $(CFG_EFENCE_LFLAGS)
EFENCE_LIBS = $(CFG_EFENCE_LIBS)
@@ -118,17 +118,13 @@ ${BUILDTMP}/build.o : src/build.c src/build.h
@echo "Compiling:" src/build.o
@$(CC) $(COPTS) -c src/build.c -o $@
${BUILDTMP}/closure.o : src/closure.c src/inlined-icons.h
${BUILDTMP}/closure.o : src/closure.c $(ICONS)
@echo "Compiling:" src/closure.c
@$(CC) $(COPTS) -c src/closure.c -o $@
${BUILDTMP}/icon-factory.o : src/icon-factory.c src/inlined-icons.h
@echo "Compiling:" src/icon-factory.c
@$(CC) $(COPTS) -c src/icon-factory.c -o $@
# Building the dvdisaster binary
dvdisaster: $(ICONS) $(OFILES)
dvdisaster: $(OFILES)
@echo "Linking : dvdisaster"
@if test $(CFG_SYS_OPTIONS) == -DSYS_MINGW; \
then windres -v src/winres.rc -O coff -o ${BUILDTMP}/winres.o >/dev/null ; \
@@ -141,28 +137,9 @@ dvdisaster: $(ICONS) $(OFILES)
else $(MAKE) --no-print-directory -C locale; \
fi
# gdk-pixbuf-csource sometimes produces truncated output, so we have to ensure the output
# is valid before appending it to inlined-icons.h:
src/inlined-icons.h: icons/read.png icons/create.png icons/scan.png icons/fix.png icons/verify.png icons/strip.png icons/open-ecc.png icons/open-img.png icons/cd.png icons/gtk-help.png icons/gtk-index.png icons/gtk-preferences.png icons/gtk-quit.png icons/gtk-stop.png icons/tooltip.png icons/nothing.png
@echo "Building:" src/inlined-icons.h
@rm -f src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_read icons/read.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_create icons/create.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_scan icons/scan.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_fix icons/fix.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_verify icons/verify.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_strip icons/strip.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_open_ecc icons/open-ecc.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_open_img icons/open-img.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_cd icons/cd.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_gtk_help icons/gtk-help.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_gtk_index icons/gtk-index.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_gtk_preferences icons/gtk-preferences.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_gtk_quit icons/gtk-quit.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_gtk_stop icons/gtk-stop.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_tooltip icons/tooltip.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@while gdk-pixbuf-csource --raw --name=dvdisaster_nothing icons/nothing.png >src/.icons.tmp; do grep -q '"};' src/.icons.tmp && break; done; cat src/.icons.tmp >>src/inlined-icons.h
@rm -f src/.icons.tmp
$(BUILDTMP)/inlined-icons.c: icons/icons.gresource.xml icons/cd.svg icons/close.svg icons/create.svg icons/fix-symbolic.svg icons/log.svg icons/manual.svg icons/open-ecc.svg icons/open-img.svg icons/preferences.svg icons/quit.svg icons/read-symbolic.svg icons/scan-symbolic.svg icons/stop.svg icons/strip.svg icons/verify-symbolic.svg
@echo "Generating:" $(ICONS)
@glib-compile-resources --generate-source --target=$(ICONS) --sourcedir=icons icons/icons.gresource.xml
$(BUILDTMP)/rs-encoder-sse2.o: src/rs-encoder-sse2.c
@echo "Compiling:" src/rs-encoder-sse2.c
@@ -358,7 +335,7 @@ distclean: clean
clean:
@echo "Removing rebuildable files"
@rm -f *.o "$(BUILDTMP)"/*.o medium.* abbild.* dvdisaster .dvdisaster core core.* *.core
@rm -f src/inlined-icons.h src/help-dialogs.h
@rm -f "$(BUILDTMP)"/inlined-icons.c src/help-dialogs.h
@find . -name \*\~ -print | xargs rm -f;
@find . -name \*.mo -print | xargs rm -f;
@find . -name \#\*\# -print | xargs rm -f;

View File

@@ -10,74 +10,90 @@ Please refer to the [PDF manual](documentation/user-manual/manual.pdf) for more
# :wrench: Unofficial version
The last upstream version by Carsten Gnörlich is dated 2017, and could be found on the
[official](https://web.archive.org/web/20180428070843/http://dvdisaster.net/en/index.html)
[website](https://web.archive.org/web/20180509154525/http://dvdisaster.org/en/index.html)
which is [now](http://www.dvdisaster.net) [down](http://www.dvdisaster.org).
The original source code [repository](https://sourceforge.net/projects/dvdisaster/files/dvdisaster) doesn't have it,
but [Debian sources](https://sources.debian.org/src/dvdisaster/) does, thanks to the maintainer there.
The original [README](README) has been left untouched in this repository.
The last upstream version dates back to 2021, and can be found on the [official website](https://dvdisaster.jcea.es).
This version is built on top of the latest upstream version, with the following notable enhancements:
- Added pre-defined sizes for BD-R Triple Layer (100GB), BD-R Quadruple Layer (128GB)
- Added an option to use more space for ECC on BD-R
- Windows build supported again (it was dropped upstream a few versions back)
- Added an option to use more space for ECC on BD-R when using RS03 (`--no-bdr-defect-management`)
- Re-enabled adaptive reading for RS01 and RS02, and optionally for RS03 on user request (more on that below)
- Ability to strip an augmented image from its additional ECC-data
- A new CLI-only version, not depending on gtk (`./configure --with-gui=no && make clean && make -j4`)
- Non-regression tests on each code change, for Linux64 and Windows32/64, CLI and GUI versions
- Prebuilt binaries for Windows32, Windows64, Linux64 (static builds and AppImage builds), CLI and GUI versions
- Fixed a bunch of (minor) quirks, a few (minor) bugs, added a couple (minor) features
- GUI codebase ported from gtk2 to gtk3 to ensure future-proofness
- Windows and macOS builds are supported again, those were dropped upstream a few versions back
- Non-regression tests on each code change, along with prebuilt binaries for Linux64, Windows32/64 and macOS, for both CLI and GUI versions
- Fixed a bunch of other (minor) quirks, a few (minor) bugs, added a couple other (minor) features
Please refer to the [CHANGELOG](CHANGELOG) for all the details.
:loudspeaker: As of 2021, upstream development resumed [on a new website](https://dvdisaster.jcea.es/).
We're working with the new team to upstream as much code as possible from this unofficial version.
Even if at some point we succeed in upstreaming all our patches, and both codebases are exactly the same,
this repository will stay up as it provides automated tests and prebuilt binaries.
This version will never break compatibility with upstream versions,
the goal is to ensure an optical media protected by upstream dvdisaster will still be able to be repaired
with this version 10+ years from now. Regression tests are here to ensure this is the case.
with this version, decades from now. Regression tests are here to ensure this is the case.
## :twisted_rightwards_arrows: 3 available protection modes ("codecs")
# :twisted_rightwards_arrows: 3 available protection modes ("codecs")
For a more detailed explanation of the algorithms, please refer to the [codecs specification PDF](documentation/codecs.pdf).
:one: **RS01** creates error correction files which are stored separately from the image they belong to.
:arrow_forward: **RS01** creates error correction files which are stored separately from the image they belong to.
The artefact is an **ecc** file, which must be stored on another media than the one we're protecting.
:two: **RS02** creates error correction data which is added to the medium to protect, we call this *augmenting* the image we're protecting.
:arrow_forward: **RS02** creates error correction data which is added to the medium to protect, we call this *augmenting* the image we're protecting.
Damaged sectors in the error correction information reduce the data recovering capacity,
but do not make recovery impossible - a second medium for keeping or protecting the error correction information is not required.
Intelligent adaptive reading is also available when reading a damaged RS02-protected disc: dvdisaster will only attempt
to read the minimum amount of required sectors to be able to rebuild the image, using a so-called "divide and conquer"
seeking mechanism, cutting off up to 90% of the time required to read and recover a damaged media.
:three: **RS03** is a further development of RS01 and RS02. It can create both error correction files and
:arrow_forward: **RS03** is a further development of RS01 and RS02. It can create both error correction files and
augmented images, with the following added features:
- RS03 can use multiple CPU cores and is therefore **much** faster than RS01/RS02 on modern hardware.
- RS03 error correction files are - contrary to RS01, and to a lesser extent RS02 - robust against damage.
- RS03 is more robust, but also more restrictive: The augmented image must completely fill the medium now while the size of augmented images can be freely chosen in RS02.
The changes for parallel computation and higher robustness make RS03 a bit less space efficient,
e.g. RS03 error correction data has slighly less (around -3%) error correction capacity than its RS01/RS02 counterparts on images with equal size.
- It can use multiple CPU cores and is therefore **WAY** faster than RS01/RS02 on modern hardware.
- RS03 augmented images and error correction files are - contrary to RS01, and to a lesser extent RS02 - robust against
damage of the dvdisaster-added recovery data itself
Rough comparison table:
There are, however, a few cons that must be noted for RS03:
| Codecs | RS01 | RS02 | RS03 |
|------------------|--------------------------------|--------------------------------|--------------------------------|
| Robustness\* | :star: | :star::star::star: | :star::star::star::star::star: |
| Speed | :star::star: | :star: | :star::star::star::star::star: |
| Space efficiency | :star::star::star::star::star: | :star::star::star::star::star: | :star::star::star::star: |
| Augmented images | :x: | :heavy_check_mark: | :heavy_check_mark: |
| Separate files | :heavy_check_mark: | :x: | :heavy_check_mark: |
- In image mode, the RS03 augmented image file size will be picked up from a predefined list of well-known medium sizes,
while the size of augmented images can be freely chosen in RS02. This is the "price to pay" for the added robustness
of the correction data.
- In image mode, intelligent adaptive reading is not available for RS03-protected images. The "divide and conquer"
algorithm will still be used, but dvdisaster will not stop as soon as enough sectors have been recovered to rebuild
the image: it'll attempt to read them all until you stop it, or until it tried to read all the sectors. You can still
stop it manually and attempt a "verify" of the resulting image file, to see if enough data has been read for recovery,
otherwise resuming the adaptive reading until this is the case.
- The changes for parallel computation and higher robustness make RS03 a tiny bit less space efficient, e.g. RS03 error
correction data has slighly less (around -3%) error correction capacity than RS02 on images with equal size. This is
usually considered a cheap price to pay for the added robustness against corruption.
\*Robustness against corruption of the dvdisaster-added ECC parts themselves
# :mag: Comparison table
This attempts to summarize the differences, pros and cons of each codec:
| Codecs | RS01 (separate file, obsolete) | RS02 (augmented image) | RS03 (in separate file mode) | RS03 (in augmented image mode) |
|--------------------------------------|--------------------------------|--------------------------------|--------------------------------|--------------------------------|
| Robustness :one: | :star: | :star::star::star: | :star::star::star::star::star: | :star::star::star::star::star: |
| Space efficiency | :star::star: | :star::star::star::star::star: | :star::star::star::star: | :star::star::star::star: |
| Computational generation speed :two: | :star::star: | :star::star: | :star::star::star::star::star: | :star::star::star::star::star: |
| Computational repair speed :two: | :star::star::star: | :star::star::star: | :star::star::star: | :star::star::star: |
| Damaged media recovery speed :three: | :star: | :star::star::star: | :star: | :star: |
| Supports customizing redundancy size | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: :four: |
:one: Here we're talking about the robustness against corruption of the dvdisaster-added ECC parts _themselves_. The higher the ranking, the less it is likely than a few badly located damaged sectors render the whole correction impossible because they affect dvdisaster metadata on-disc. For example, corruption of the first dozens of sectors of an image can make RS02 entirely unusable regardless of the redundancy data originally stored on it.
:two: When algorithm is CPU-bound, i.e. generating or repairing an image stored on a SSD/NVMe drive where the storage i/o speed is not an issue.
:three: Using adaptive reading when supported (RS02), limiting the number of damaged sectors that need to be read to what is strictly necessary for repair. Using linear reading otherwise (RS03 and separate file codecs), assuming a badly damaged media, taking into account the time the drive takes to try to read damaged sectors.
:four: The robustness of RS03 comes at the cost of having to augment images strictly to well-known media sizes, as explained in the previous section above. This usually doesn't make much difference as long as you intend to burn the augmented image to a classic medium (CD-R, DVD-R, BD-R, ...).
# :bulb: Rationale
Even if the optical media era is sunsetting now, and has been for a few years, it's still of some value for off-site backups.
Even if the peak of the optical media era is well behind us, optical media is still of some value for specific use cases such as off-site backups.
In any case, we still have media in our hands that we want to be able to repair, should it be damaged, during the next years/decades.
Repairing is actually pretty much the very reason of dvdisaster existence (as long as parity data has been added, of course).
The idea of this unofficial version is to ensure dvdisaster doesn't get hard to find, use or compile, ~~should upstream development never resume (we hope it does!)~~
This is also why precompiled Windows binaries and a precompiled static CLI-only Linux version are available here.
The main purpose of this unofficial version is to ensure dvdisaster doesn't get hard to find, use or compile on recent systems.
To this effect, prebuilt binaries are available for the 3 main categories of operating systems, and on top of that we've also fixed a few
bugs and added a few tiny features.
# :hammer: Compiling

2
TODO
View File

@@ -8,7 +8,7 @@ Versions 0.79.x: development releases
work in progress (this release):
- split GUI code from core source to allow for command-line only build (done)
- merge patches from St<EFBFBD>phane Lesimple (done) and Debian (done)
- merge patches from Stéphane Lesimple (done) and Debian (done)
upcoming (next stable release):

46
configure vendored
View File

@@ -26,8 +26,9 @@
BASH_BASED_CONFIGURE=./scripts/bash-based-configure
BASH_BASED_CONFIGURE_OPTS="--buildtmp=$(pwd)/build $@"
REQUIRED_CFLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -I. -pipe"
RECOMMENDED_CFLAGS="-O2 -fomit-frame-pointer -Wall -Wno-unknown-warning-option -Wno-deprecated-declarations -Wno-stringop-truncation -Wno-format-zero-length"
DEBUG_CFLAGS="-ggdb -Wall"
RECOMMENDED_CFLAGS="-Wall -Wno-format-zero-length -Wno-unused-but-set-variable"
NODEBUG_CFLAGS="-O2 -fomit-frame-pointer"
DEBUG_CFLAGS="-ggdb"
if test -e $BASH_BASED_CONFIGURE; then
source $BASH_BASED_CONFIGURE $BASH_BASED_CONFIGURE_OPTS
@@ -40,14 +41,19 @@ fi
# Set the package name and version
PACKAGE dvdisaster 0.79.10
DEFINE_INT PATCHLEVEL 1
DEFINE_INT PATCHLEVEL 4
DEFINE_STRING HAVE_UNSTABLE_RELEASE 1
DEFINE_STRING HOMEPAGE "https://dvdisaster.jcea.es"
# Check for some essential tools.
REQUIRE_GMAKE
REQUIRE_GCC
if [[ $(uname) =~ Darwin ]]; then
REQUIRE_CLANG
else
REQUIRE_GCC
fi
# Find out and verify the basedir of the source installation,
# and where to install the binary.
@@ -81,7 +87,7 @@ REQUIRE_GLIB2 2 32 0
echo
if test "$cfg_with_gui" == "yes"; then
REQUIRE_GTK2 2 6 0 WITH_THREADS
REQUIRE_GTK3 3 4 0 WITH_THREADS
fi
if ! CHECK_INCLUDE locale.h locale || ! CHECK_INCLUDE libintl.h intl ; then
@@ -122,6 +128,11 @@ CFG_CFLAGS="$CFG_CFLAGS -D_LARGEFILE64_SOURCE"
CHECK_SYMBOL fcntl.h O_LARGEFILE
CFG_CFLAGS=$SAVE_CFLAGS
if [[ $(uname) =~ Darwin ]]; then
CFG_CFLAGS="$CFG_CFLAGS -Wno-void-pointer-to-int-cast"
CFG_LDFLAGS="$CFG_LDFLAGS -framework CoreFoundation -framework IOKit"
fi
# Machine specific
echo
@@ -144,9 +155,9 @@ if ! EXECUTE_PROGRAM "xgettext --help" xgettext \
fi
if test "$cfg_with_gui" == "yes"; then
if ! EXECUTE_PROGRAM "gdk-pixbuf-csource --help" gdk_pixbuf_csource ; then
echo "* gdk-pixbuf not installed"
echo "* or path to gdk-pixbuf-csource is missing."
if ! EXECUTE_PROGRAM "glib-compile-resources --help" gdk_pixbuf_csource ; then
echo "* glib-compile-resources not installed"
echo "* or path to glib-compile-resources is missing."
exit 1
fi
fi
@@ -163,6 +174,8 @@ PRINT_MESSAGE "\nDebugging options (do not use in production system):"
WITH_OPTION memdebug no "[no | yes]"
WITH_OPTION debug-printf-format no "[no | yes]"
WITH_OPTION werror no "[no | yes]"
WITH_OPTION debug no "[no | yes]"
WITH_OPTION efence no "[no | yes]"
if test "$cfg_with_debug_printf_format" == "yes"; then
# don't use the binary compiled with this,
@@ -180,6 +193,12 @@ if test "$cfg_with_werror" == "yes"; then
CFG_CFLAGS="$CFG_CFLAGS -Werror"
fi
if test "$cfg_with_debug" == "yes"; then
CFG_CFLAGS="$CFG_CFLAGS $DEBUG_CFLAGS"
else
CFG_CFLAGS="$CFG_CFLAGS $NODEBUG_CFLAGS"
fi
if test "$cfg_with_efence" == "yes"; then
if ! CHECK_LIBRARY efence malloc efence; then
exit 1;
@@ -203,7 +222,14 @@ rm -f src/conftest.c src/method-link.c
cfiles="src/method-link.c"
ofiles="$BUILDTMP/method-link.o"
for cfile in src/*.c; do
# Only include icons in GUI builds
if test "$cfg_with_gui" == "yes"; then
icons="$BUILDTMP/inlined-icons.c"
else
icons=""
fi
for cfile in $icons src/*.c; do
cfile_prefix=`echo $cfile | sed -e 's/\.c//'`
cfiles="$cfiles $cfile"
ofiles="$ofiles $BUILDTMP/$(basename $cfile_prefix.o)"
@@ -214,7 +240,7 @@ echo
echo -e "\nCFG_CFILES = $cfiles" >> Makefile.config
echo "CFG_OFILES = $ofiles" >> Makefile.config
if test "$cfg_with_gui" == "yes"; then
echo "ICONS = src/inlined-icons.h" >> Makefile.config
echo "ICONS = $icons" >> Makefile.config
fi
# Create the method wrapper

View File

@@ -1,5 +1,79 @@
#!/bin/sh
DIR="$(readlink -f "$(dirname "$0")")"
export GTK_PATH="$DIR/usr/lib/gtk-2.0"
export DVDISASTER_DOCDIR="$DIR/usr/share/doc/dvdisaster"
# When adding environment variables in this script, don't forget to sync with the src/show-manual.c
# list, as they need to be cleaned up before calling xdg-open to ensure xdg-open works with all the
# libs from the host and none from the AppImage (which most of the time just doesn't work).
# Also save the original value into an _ORIGINAL variable, which will be restored by dvdisaster
# into the xdg-open's environment before calling execve()
# Point to our own gtk libs
[ "_$GTK_PATH" != _ ] && export GTK_PATH_ORIGINAL="$GTK_PATH"
export GTK_PATH="$DIR/usr/lib/gtk-3.0"
# Load our own modules instead of the host ones,
# an absolute path pointing to the host is unfortunately hardcoded in ./usr/lib/libgio-2.0.so.0,
# but we edited the lib to neutralize said path (replaced gio/modules by :'s):
#
# $ strings ./usr/lib/libgio-2.0.so.0 | grep :::
# /usr/lib/:::::::::::
# /usr/lib/x86_64-linux-gnu/:::::::::::
#
# So the path below should be the only one used in the end:
[ "_$GIO_EXTRA_MODULES" != _ ] && export GIO_EXTRA_MODULES_ORIGINAL="$GIO_EXTRA_MODULES"
export GIO_EXTRA_MODULES="$DIR/usr/lib/gio/modules"
# To avoid getting:
# '''
# (dvdisaster:16170): Gtk-WARNING **: 14:31:41.224: Loading IM context type 'ibus' failed
# (dvdisaster:16170): Gtk-WARNING **: 14:31:41.224: /lib/x86_64-linux-gnu/libibus-1.0.so.5: undefined symbol: g_get_language_names_with_category
# '''
# We use xim instead, which is included in our build, along with the proper immodules cache file referencing our modules
[ "_$GTK_IM_MODULE_FILE" != _ ] && export GTK_IM_MODULE_FILE_ORIGINAL="$GTK_IM_MODULE_FILE"
export GTK_IM_MODULE_FILE="$(find "$DIR/" -name immodules.cache)"
[ "_$GTK_IM_MODULE" != _ ] && export GTK_IM_MODULE_ORIGINAL="$GTK_IM_MODULE"
export GTK_IM_MODULE=xim
# if host has GTK_MODULES set, empty it to prevent it from loading modules from the host
[ "_$GTK_MODULES" != _ ] && export GTK_MODULES_ORIGINAL="$GTK_MODULES"
export GTK_MODULES=''
# To avoid getting:
# '''
# (dvdisaster:16133): GLib-GIO-ERROR **: 14:25:53.270: Settings schema 'org.gnome.settings-daemon.plugins.xsettings' does not contain a key named 'antialiasing'
# Trace/breakpoint trap (core dumped)
# '''
# Under Ubuntu 22.04 and possibly later versions using Wayland
# https://github.com/Ultimaker/Cura/issues/12776
[ "_$GDK_BACKEND" != _ ] && export GDK_BACKEND_ORIGINAL="$GDK_BACKEND_ORIGINAL"
export GDK_BACKEND=x11
# To avoid getting:
# '''
# (evince:172616): dbind-WARNING **: 18:02:34.901: Couldn't connect to accessibility bus: Failed to connect to socket /run/user/1000/at-spi/bus: Permission denied
# '''
[ "_$NO_AT_BRIDGE" != _ ] && export NO_AT_BRIDGE_ORIGINAL="$NO_AT_BRIDGE"
export NO_AT_BRIDGE=1
# To avoid getting:
# '''
# (dvdisaster:20080): Gtk-WARNING **: 15:43:20.719: Could not load a pixbuf from icon theme.
# This may indicate that pixbuf loaders or the mime database could not be found.
# '''
# Point to our own patched cache file for gdk-pixbuf2
[ "_$GDK_PIXBUF_MODULE_FILE" != _ ] && export GDK_PIXBUF_MODULE_FILE_ORIGINAL="$GDK_PIXBUF_MODULE_FILE"
export GDK_PIXBUF_MODULE_FILE="$DIR/usr/lib/gdk-pixbuf2/loaders.cache"
# As the pixbuf loaders depends themselves on other libs, also adjust LD_LIBRARY_PATH so they load properly
[ "_$LD_LIBRARY_PATH" != _ ] && export LD_LIBRARY_PATH_ORIGINAL="$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="$DIR/usr/lib:$LD_LIBRARY_PATH"
# Change to the proper directory because some .cache files have relative paths starting with "."
# we save the current PWD so that dvdisaster can use it as a default to store image and ecc files
export ORIGINAL_PWD="$PWD"
cd "$DIR" || exit 1
# Now run the program, with 3 vars it uses at runtime
export DVDISASTER_APPIMAGE=1
export DOCDIR="$DIR/usr/share/doc/dvdisaster"
export BINDIR="$DIR/usr/bin"
exec "$DIR/usr/bin/dvdisaster" "$@"

Binary file not shown.

View File

@@ -1,4 +0,0 @@
Files starting with "gtk-" have been taken from
the GTK+ 2.18 distribution in order to override
theming and keep the GUI consistent with the
online documentation.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 757 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

87
icons/cd.svg Normal file
View File

@@ -0,0 +1,87 @@
<svg version="1.1" viewBox="0 0 684.52 684.52" width="24" height="24" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="linearGradient5641" x1="193.55" x2="282.26" y1="407.2" y2="287.85" gradientUnits="userSpaceOnUse">
<stop stop-color="#f5f5f5" offset="0"/>
<stop stop-color="#ffaaaa" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5661" x1="358.06" x2="230.65" y1="273.33" y2="328.17" gradientUnits="userSpaceOnUse">
<stop stop-color="#f5f5f5" offset="0"/>
<stop stop-color="#ffaaaa" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5669" x1="424.19" x2="575.81" y1="250.75" y2="347.52" gradientUnits="userSpaceOnUse">
<stop stop-color="#f5f5f5" offset="0"/>
<stop stop-color="#aaeeff" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5677" x1="580.65" x2="511.29" y1="362.04" y2="292.68" gradientUnits="userSpaceOnUse">
<stop stop-color="#f5f5f5" offset="0"/>
<stop stop-color="#aaeeff" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5685" x1="590.32" x2="643.55" y1="353.98" y2="460.43" gradientUnits="userSpaceOnUse">
<stop stop-color="#f5f5f5" offset="0"/>
<stop stop-color="#b3ff80" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5699" x1="638.71" x2="620.97" y1="515.27" y2="410.43" gradientUnits="userSpaceOnUse">
<stop stop-color="#f5f5f5" offset="0"/>
<stop stop-color="#ccffaa" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5767" x1="630.65" x2="666.13" y1="624.94" y2="471.72" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffeeaa" offset="0"/>
<stop stop-color="#ffe9aa" offset=".052155"/>
<stop stop-color="#ffe5aa" offset=".10431"/>
<stop stop-color="#ffddaa" offset=".20862"/>
<stop stop-color="#ffccaa" offset=".41724"/>
<stop stop-color="#ffeeaa" offset=".65517"/>
<stop stop-color="#f5f5f5" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5779" x1="627.42" x2="596.77" y1="574.94" y2="633.01" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffccaa" offset="0"/>
<stop stop-color="#e9afaf" offset=".5"/>
<stop stop-color="#f4d7d7" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5797" x1="433.87" x2="609.68" y1="760.43" y2="612.04" gradientUnits="userSpaceOnUse">
<stop stop-color="#ff8080" offset="0"/>
<stop stop-color="#f4d7d7" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5805" x1="448.39" x2="512.9" y1="712.04" y2="670.1" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffeeaa" offset="0"/>
<stop stop-color="#ffaaaa" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5813" x1="462.9" x2="408.06" y1="737.85" y2="749.14" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffeeaa" offset="0"/>
<stop stop-color="#e3f4d7" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5821" x1="285.48" x2="424.19" y1="726.56" y2="745.91" gradientUnits="userSpaceOnUse">
<stop stop-color="#c6e9af" offset="0"/>
<stop stop-color="#e3f4d7" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5829" x1="340.32" x2="214.52" y1="671.72" y2="586.23" gradientUnits="userSpaceOnUse">
<stop stop-color="#c6e9af" offset="0"/>
<stop stop-color="#dee3db" stop-opacity="0" offset="1"/>
</linearGradient>
<clipPath id="center">
<path d="m0,0 h684.52 v684.52 h-684.52 z m342.26,242.26 a100,100 0 0 0 0,200 a100,100 0 0 0 0,-200 z"/>
</clipPath>
</defs>
<g clip-path="url(#center)">
<g transform="translate(-22.258,-173.01)">
<circle transform="translate(-35.484,16.129)" cx="400" cy="499.14" r="332.26" fill="#f5f5f5" stroke="#000000" stroke-width="1px"/>
<g stroke-width="0">
<path transform="translate(-35.484,16.129)" d="m107.67 341.22a332.26 332.26 0 0 1 94.996-109.39l197.34 267.31z" fill="url(#linearGradient5641)"/>
<path transform="translate(-35.484,16.129)" d="m200.73 233.27a332.26 332.26 0 0 1 115.82-55.739l83.457 321.61z" fill="url(#linearGradient5661)"/>
<path transform="translate(-35.484,16.129)" d="m470.72 174.49a332.26 332.26 0 0 1 125.85 56.767l-196.56 267.88z" fill="url(#linearGradient5669)"/>
<path transform="translate(-35.484,16.129)" d="m674.13 311.39a332.26 332.26 0 0 1 40.843 81.975l-314.97 105.77z" fill="url(#linearGradient5685)"/>
<path transform="translate(-35.484,16.129)" d="m594.34 229.64a332.26 332.26 0 0 1 51.612 46.104l-245.95 223.39z" fill="url(#linearGradient5677)"/>
<path transform="translate(-35.484,16.129)" d="m714.73 392.66a332.26 332.26 0 0 1 17.524 107.08l-332.26-.60169z" fill="url(#linearGradient5699)"/>
<path transform="translate(-35.484,16.129)" d="m717.49 597.08a332.26 332.26 0 0 1 -42.528 88.574l-274.97-186.52z" fill="url(#linearGradient5779)"/>
<path transform="translate(-35.484,16.129)" d="m678.99 679.58a332.26 332.26 0 0 1 -86.271 90.211l-192.72-270.66z" fill="url(#linearGradient5797)"/>
<path transform="translate(-35.484,16.129)" d="m592.8 769.74a332.26 332.26 0 0 1 -110.01 51.18l-82.788-321.78z" fill="url(#linearGradient5805)"/>
<path transform="translate(-35.484,16.129)" d="m484.51 820.47a332.26 332.26 0 0 1 -64.896 10.348l-19.612-331.68z" fill="url(#linearGradient5813)"/>
<path transform="translate(-35.484,16.129)" d="m419.22 830.84a332.26 332.26 0 0 1 -158.36-29.983l139.14-301.72z" fill="url(#linearGradient5821)"/>
<path transform="translate(-35.484,16.129)" d="m262.06 801.41a332.26 332.26 0 0 1 -122.64-96.135l260.58-206.14z" fill="url(#linearGradient5829)"/>
<path transform="translate(-35.484,16.129)" d="m732.26 500.25a332.26 332.26 0 0 1 -14.855 97.129l-317.4-98.245z" fill="url(#linearGradient5767)"/>
</g>
</g>
</g>
<circle cx="342.26" cy="342.26" r="332.26" fill="none" stroke="#000000" stroke-width="20"/>
<circle cx="342.26" cy="342.26" r="100" fill="none" stroke="#000000" stroke-width="20"/>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

249
icons/close.svg Normal file
View File

@@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
inkscape:label="Pozadí"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docbase="/home/cornelius/GFX/ikony/GTK/my-stuff/24x24"
sodipodi:docname="gtk-close.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:export-filename="/home/cornelius/GFX/ikony/GTK/my-stuff/24x24/gtk-close.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs3">
<linearGradient
inkscape:collect="always"
id="linearGradient5148">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop5150" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop5152" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5911">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5913" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop5915" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5954">
<stop
style="stop-color:#888a85;stop-opacity:1"
offset="0"
id="stop5956" />
<stop
style="stop-color:#555753;stop-opacity:1"
offset="1"
id="stop5958" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5946">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5948" />
<stop
style="stop-color:#ffffff;stop-opacity:0.08108108"
offset="1"
id="stop5950" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5946"
id="linearGradient5952"
x1="-5.3511"
y1="5.0481853"
x2="15.384415"
y2="27.678883"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7639512,-0.7639512,0.7634549,0.7634549,-29.789061,11.470298)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5954"
id="linearGradient5960"
x1="-4.8494349"
y1="5.7728133"
x2="4.0133257"
y2="25.449255"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7639512,-0.7639512,0.7634549,0.7634549,-29.784139,11.470299)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5954"
id="linearGradient4919"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5807401,-0.8473808,0.5803628,0.8468302,-20.42943,12.693351)"
x1="-4.8494349"
y1="5.7728133"
x2="4.0133257"
y2="25.449255" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5954"
id="linearGradient4923"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5807401,-0.8473808,0.5803628,0.8468302,-20.429431,-11.306649)"
x1="-4.8494349"
y1="5.7728133"
x2="4.0133257"
y2="25.449255" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5954"
id="linearGradient5906"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5807401,-0.8473808,0.5803628,0.8468302,-20.42943,12.693351)"
x1="-4.8494349"
y1="5.7728133"
x2="4.0133257"
y2="25.449255" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5911"
id="linearGradient5917"
x1="15.593442"
y1="0.31719938"
x2="15.645549"
y2="34.768784"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5989436,0,0,0.599606,0.7998062,0.7995311)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5954"
id="radialGradient5142"
cx="12.376248"
cy="6.7325096"
fx="12.376248"
fy="6.7325096"
r="9.999999"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0812595,0,0,1.0824549,-5.1368659,-2.8938122)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5148"
id="radialGradient5154"
cx="12.25"
cy="19.1875"
fx="12.25"
fy="19.1875"
r="9"
gradientTransform="matrix(1,0,0,0.4236111,0,11.059462)"
gradientUnits="userSpaceOnUse" />
<filter
inkscape:collect="always"
x="-0.22090517"
width="1.4418103"
y="-0.52148104"
height="2.0429621"
id="filter5280">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.6567888"
id="feGaussianBlur5282" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#e3e3e3"
borderopacity="1"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="17.985112"
inkscape:cy="10.773953"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="16px"
height="16px"
inkscape:showpageshadow="false"
showgrid="false"
inkscape:window-width="872"
inkscape:window-height="670"
inkscape:window-x="455"
inkscape:window-y="57" />
<metadata
id="metadata6">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>gtk close</dc:title>
<dc:date>30.3.2007</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Josef Vybíral</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/LGPL/2.1/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/LGPL/2.1/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
<cc:requires
rdf:resource="http://web.resource.org/cc/SourceCode" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="opacity:1;color:#000000;fill:url(#radialGradient5142);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 13.179286,1.8084745 C 12.768441,1.3971757 12.106937,1.3971757 11.696093,1.8084745 L 7.9881076,5.5205585 L 4.2801232,1.8084745 C 3.8692785,1.3971757 3.207774,1.3971757 2.7969294,1.8084745 L 1.8081334,2.7983636 C 1.3972888,3.2096624 1.3972888,3.8718983 1.8081334,4.2831971 L 5.5161181,7.9952811 L 1.8081334,11.707366 C 1.3972888,12.118665 1.3972888,12.780899 1.8081334,13.192198 L 2.7969294,14.182088 C 3.207774,14.593386 3.8692785,14.593386 4.2801232,14.182088 L 7.9881076,10.470004 L 11.696093,14.182088 C 12.106937,14.593386 12.768441,14.593386 13.179286,14.182088 L 14.168083,13.192198 C 14.578927,12.780899 14.578927,12.118665 14.168083,11.707366 L 10.460098,7.9952811 L 14.168083,4.2831971 C 14.578927,3.8718983 14.578927,3.2096624 14.168083,2.7983636 L 13.179286,1.8084745 z"
id="rect4917" />
<path
style="opacity:0.41954023;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5917);stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 12.584404,2.5750795 C 12.426421,2.4169241 12.261699,2.6378948 12.103719,2.7960503 L 7.9836392,6.9715741 L 3.690164,2.6191625 C 3.484578,2.4133493 3.4292506,2.6681775 3.2236647,2.8739906 L 2.7429806,3.3553037 C 2.5373944,3.561117 2.4384535,3.5550022 2.7464713,3.8633605 L 6.9178366,7.9948013 L 2.7465821,12.126131 C 2.5886017,12.284286 2.5444075,12.394758 2.7023879,12.552913 L 3.4340524,13.285386 C 3.5920331,13.443542 3.878866,13.130739 4.0368469,12.972582 L 7.9871304,8.9772795 L 12.110811,13.112165 C 12.316397,13.31798 12.415919,13.450563 12.621504,13.244748 L 13.102189,12.763433 C 13.307775,12.557621 13.307775,12.236776 13.102189,12.030961 L 9.0971278,7.9506071 L 13.179994,3.8738086 C 13.337976,3.7156533 13.429856,3.5540965 13.271871,3.3959409 L 12.584404,2.5750795 z"
id="rect4927"
sodipodi:nodetypes="ccccccccccccccccccccc" />
<path
sodipodi:type="arc"
style="opacity:0.41954023;color:#000000;fill:url(#radialGradient5154);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5280);enable-background:accumulate"
id="path5146"
sodipodi:cx="12.25"
sodipodi:cy="19.1875"
sodipodi:rx="9"
sodipodi:ry="3.8125"
d="M 21.25,19.1875 A 9,3.8125 0 1 1 3.25,19.1875 A 9,3.8125 0 1 1 21.25,19.1875 z"
transform="matrix(0.6829588,0,0,0.4595453,-0.207397,4.9465899)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,20 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
5 1 0 20 0 7 50 0 -1 0.000 0 1 0 0 6300.000 8775.000 6300 6525 4050 8775 6300 11025
5 1 0 20 0 7 50 0 -1 0.000 0 0 0 0 6300.000 4275.000 6300 2025 8550 4275 6300 6525
5 1 0 1 0 7 50 0 10 0.000 0 1 0 0 11474.998 10456.000 11475 10119 11138 10457 11475 10793
5 1 0 1 0 7 55 0 20 0.000 0 0 0 0 11475.002 9782.000 11475 9445 11812 9781 11475 10119
5 1 0 1 0 7 59 0 10 0.000 0 0 0 0 11475.000 10125.000 11475 9450 12150 10125 11475 10800
1 3 0 20 0 7 50 0 -1 0.000 1 0.0000 6300 4275 569 569 6300 4275 6869 4275
1 3 0 20 0 7 50 0 -1 0.000 1 0.0000 6300 8775 544 544 6300 8775 6844 8775
1 3 0 20 0 7 50 0 -1 0.000 1 0.0000 6300 6525 4494 4494 6300 6525 10794 6525
1 3 0 1 0 7 50 0 10 0.000 1 0.0000 11475 9781 85 85 11475 9781 11560 9781
1 3 0 1 0 7 45 0 20 0.000 1 0.0000 11475 10457 81 81 11475 10457 11557 10457
1 1 0 1 0 7 60 0 20 0.000 1 0.0000 11475 10125 675 673 11475 10125 12149 10125

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

5
icons/create.svg Normal file
View File

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="m407.84 27.68c244.16-58.56 512.8 101.28 578.88 343.04 77.6 240-62.56 521.12-300 604.64-225.12 90.88-504.16-16-612.8-232.32-114.08-206.56-51.36-488 139.84-626.4 57.12-43.52 124-73.6 194.08-88.96"/>
<path d="m113.76 275.84c83.04-143.36 248.32-234.56 414.08-226.24 112.96 4.16 212 108.8 208.32 222.24 2.56 83.36-48.32 162.56-121.44 200.48-60.48 34.24-134.72 13.76-196.96 42.88-119.36 43.84-190.72 187.52-150.72 308.8 12.16 45.44 40.64 83.52 68.8 120.16-96.16-47.36-183.68-118.08-232.96-215.04-75.36-139.36-71.36-317.6 10.88-453.28m368.32-99.52c-75.84 19.36-95.04 131.52-30.72 175.52 56 46.4 152.32 8.32 159.52-64.48 14.08-70.4-61.28-134.88-128.8-111.04M483.2 689.92c48.8-24.16 110.24 24.32 94.72 77.44-8.16 50.56-79.84 70.4-113.76 32.8-33.6-30.56-22.56-92.32 19.04-110.24" fill="#ffffff"/>
<path d="m688.96 80.32c96.64 47.84 184.48 119.04 233.28 217.12 74.72 139.68 69.44 317.6-13.28 452.8-85.92 146.56-258.24 237.44-427.84 223.2-68-6.08-127.84-51.84-162.4-109.12-56.8-91.2-31.2-219.52 53.12-284.96 46.72-42.88 111.2-50.72 171.84-53.92 120-8.8 219.2-116.96 224.32-236.16 7.2-78.08-29.76-151.04-79.04-208.96m-219.84 580.8c-70.08 29.28-76.48 138.4-10.56 175.84 62.4 43.04 158.72-8.96 153.28-85.6 3.68-71.04-80.32-122.24-142.72-90.24M483.36 210.08c48.48-24 109.76 24 94.56 76.8-7.68 50.56-78.72 70.72-113.12 33.92-34.24-30.4-23.52-92.96 18.56-110.72" fill="#4658f5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

7
icons/fix-symbolic.svg Normal file
View File

@@ -0,0 +1,7 @@
<svg width="24" height="24" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<style>
.blue { fill: #4658f5 !important; }
</style>
<path d="m130,117 h94.5 c-30,-40 -6.5,-87.3 40.5,-87.3 c47,0 70.5,47.3 40.5,87.3 h94.5 v94.5 c-40,-30 -87.3,-6.5 -87.3,40.5 c0,47 47.3,70.5 87.3,40.5 v121.5 h-94.5 c30,-40 6.5,-87.3 -40.5,-87.3 c-47,0 -70.5,47.3 -40.5,87.3 h-94.5 v-121.5 c-40,30 -87.3,6.5 -87.3,-40.5 c0,-47 47.3,-70.5 87.3,-40.5z" class="blue"/>
<path d="m121 9v99h-99v18h99v69.8c-18.4-8.52-37.7-8.56-53.5-1.05-20 9.5-33.8 30.7-33.8 57.3s13.8 47.8 33.8 57.3c15.8 7.51 35.1 7.47 53.5-1.05v96.8h-99v18h99v72h18v-72h85.5l7.2-14.4c-13.3-17.7-14.2-35.7-7.7-49.4 6.5-13.7 20.5-23.5 41-23.5s34.5 9.84 41 23.5c6.5 13.7 5.61 31.6-7.7 49.4l7.2 14.4h85.5v72h18v-72h99v-18h-99v-112l-14.4-7.2c-17.7 13.3-35.7 14.2-49.4 7.7-13.7-6.5-23.5-20.5-23.5-41s9.84-34.5 23.5-41c13.7-6.5 31.6-5.61 49.4 7.7l14.4-7.2v-85.5h99v-18h-99v-99h-18v99h-69.8c8.52-18.4 8.56-37.7 1.05-53.5-9.5-20-30.7-33.8-57.3-33.8s-47.8 13.8-57.3 33.8c-7.51 15.8-7.47 35.1 1.05 53.5h-69.8v-99zm144 29.7c20.5 0 34.5 9.84 41 23.5s5.61 31.6-7.7 49.4l7.2 14.4h85.5v69.8c-18.4-8.52-37.7-8.56-53.5-1.05-20 9.5-33.8 30.7-33.8 57.3s13.8 47.8 33.8 57.3c15.8 7.51 35.1 7.47 53.5-1.05v96.8h-69.8c8.52-18.4 8.56-37.7 1.05-53.5-9.5-20-30.7-33.8-57.3-33.8s-47.8 13.8-57.3 33.8c-7.51 15.8-7.47 35.1 1.05 53.5h-69.8v-112l-14.4-7.2c-17.7 13.3-35.7 14.2-49.4 7.7s-23.5-20.5-23.5-41 9.84-34.5 23.5-41 31.6-5.61 49.4 7.7l14.4-7.2v-85.5h85.5l7.2-14.4c-13.3-17.7-14.2-35.7-7.7-49.4s20.5-23.5 41-23.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 801 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 753 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 967 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

21
icons/icons.gresource.xml Normal file
View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/dvdisaster">
<file compressed="true" preprocess="xml-stripblanks">cd.svg</file>
<file compressed="true" preprocess="xml-stripblanks">close.svg</file>
<file compressed="true" preprocess="xml-stripblanks">create.svg</file>
<file compressed="true" preprocess="xml-stripblanks">fix-symbolic.svg</file>
<file compressed="true" preprocess="xml-stripblanks">log.svg</file>
<file compressed="true" preprocess="xml-stripblanks">manual.svg</file>
<file compressed="true" preprocess="xml-stripblanks">open-ecc.svg</file>
<file compressed="true" preprocess="xml-stripblanks">open-img.svg</file>
<file compressed="true" preprocess="xml-stripblanks">preferences.svg</file>
<file compressed="true" preprocess="xml-stripblanks">quit.svg</file>
<file compressed="true" preprocess="xml-stripblanks">read-symbolic.svg</file>
<file compressed="true" preprocess="xml-stripblanks">scan-symbolic.svg</file>
<file compressed="true" preprocess="xml-stripblanks">stop.svg</file>
<file compressed="true" preprocess="xml-stripblanks">strip.svg</file>
<file compressed="true" preprocess="xml-stripblanks">verify-symbolic.svg</file>
</gresource>
</gresources>

View File

@@ -1,12 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
4 0 0 50 -1 18 160 0.0000 4 1695 6750 1980 8235 00111\001
4 0 0 50 -1 18 160 0.0000 4 1695 6750 1935 3240 01110\001
4 0 0 50 -1 18 160 0.0000 4 1695 6750 1935 5670 10011\001

64
icons/log.svg Normal file
View File

@@ -0,0 +1,64 @@
<svg version="1.0" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient4392">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#d3d7cf" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient3208">
<stop stop-color="#c17d11" offset="0"/>
<stop stop-color="#c17d11" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient4462" cx="42.938" cy="13" r="5.5" gradientTransform="matrix(1 0 0 .87501 0 1.6249)" gradientUnits="userSpaceOnUse">
<stop stop-color="#f4dbb3" offset="0"/>
<stop stop-color="#e9b96e" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient4464" x1="42.656" x2="42.656" y1="12.818" y2="15.543" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient3208"/>
<linearGradient id="linearGradient4466" x1="42.656" x2="42.656" y1="12.531" y2="14.543" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient3208"/>
<linearGradient id="linearGradient4470" x1="42.656" x2="42.656" y1="13.499" y2="15.57" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient3208"/>
<linearGradient id="linearGradient4472" x1="41.406" x2="41.406" y1="10.062" y2="13.72" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#ffffff" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient4474" x1="43.406" x2="43.406" y1="12.154" y2="13.879" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#ffffff" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient4476" x1="45.469" x2="45.469" y1="12.094" y2="13.782" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#ffffff" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient2262" x1="-48.438" x2="-48.438" y1="2.6537" y2="4.1125" gradientTransform="translate(57,-1)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient4392"/>
<linearGradient id="linearGradient2267" x1="-48.438" x2="-48.438" y1="2.6537" y2="4.1125" gradientTransform="translate(57,2)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient4392"/>
<linearGradient id="linearGradient2271" x1="-48.438" x2="-48.438" y1="2.6537" y2="4.1125" gradientTransform="translate(57,5)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient4392"/>
<linearGradient id="linearGradient2275" x1="-48.438" x2="-48.438" y1="2.6537" y2="4.1125" gradientTransform="translate(57,8)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient4392"/>
</defs>
<g>
<rect x=".5" y=".5" width="13" height="14" rx="2.1224" ry="2.1224" fill="#d3d7cf" stroke="#888a85" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m2.5 1h9c.831 0 1.5.669 1.5 1.5s-.669 1.5-1.5 1.5h-9c-.831 0-1.5-.669-1.5-1.5s.669-1.5 1.5-1.5z" fill="url(#linearGradient2262)" opacity=".99"/>
<path d="m2.5 4h9c.831 0 1.5.669 1.5 1.5s-.669 1.5-1.5 1.5h-9c-.831 0-1.5-.669-1.5-1.5s.669-1.5 1.5-1.5z" fill="url(#linearGradient2267)" opacity=".99"/>
<path d="m2.5 7h9c.831 0 1.5.669 1.5 1.5s-.669 1.5-1.5 1.5h-9c-.831 0-1.5-.669-1.5-1.5s.669-1.5 1.5-1.5z" fill="url(#linearGradient2271)" opacity=".99"/>
<path d="m2.5 10h9c.831 0 1.5.669 1.5 1.5s-.669 1.5-1.5 1.5h-9c-.831 0-1.5-.669-1.5-1.5s.669-1.5 1.5-1.5z" fill="url(#linearGradient2275)" opacity=".99"/>
</g>
<path d="m2.625 1.5312c-.62876 0-1.0938.46499-1.0938 1.0938v9.75c0 .62876.46499 1.0938 1.0938 1.0938h8.75c.62876 0 1.0938-.46499 1.0938-1.0938v-9.75c0-.62876-.46499-1.0938-1.0938-1.0938h-8.75z" fill="none" stroke="#ffffff" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m8.5 3.5c-1.0882 0-2 .91179-2 2v2c-1.0882 0-2 .91179-2 2v2c0 .68616.15312 1.3067.40625 1.875.22197.078366.46929.125.71875.125h4.7812c1.1758 0 2.125-.9492 2.125-2.125v-4.875c-.010805-.000208-.020361 0-.03125 0-.38904 0-.69042.2388-1 .4375-.30958-.1987-.61096-.4375-1-.4375v-1c0-1.0882-.91179-2-2-2z" fill="#ffffff" opacity=".7" stroke="#ffffff" stroke-linecap="round" stroke-linejoin="round"/>
<g transform="translate(-33,-3)">
<path d="m41.5 7.5c-.554 0-1 .446-1 1v4c0-.554-.446-1-1-1s-1 .446-1 1v2c0 2.4687 2.3552 4.0153 4.0647 4h3.0915c1.5203 0 2.8438-1.9444 2.8438-3v-3c0-.554-.446-1-1-1s-1 .446-1 1v-1c0-.554-.446-1-1-1s-1 .446-1 1c0-.554-.446-1-1-1s-1 .446-1 1v-3c0-.554-.446-1-1-1z" fill="url(#radialGradient4462)" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m39.531 12.5-.0625 2c0 .92346.43497 1.645 1.0625 2.1875s1.4756.84872 2.0312.84375h3.0938c.34295 0 .84891-.30535 1.25-.78125s.625-1.1312.625-1.25v-3" fill="none" opacity=".54406" stroke="#ffffff" stroke-linecap="round" stroke-linejoin="round"/>
<g fill="#c17d11" fill-rule="evenodd" stroke-linecap="round" stroke-width="1px">
<path d="m46.5 11.992v3.5026" stroke="url(#linearGradient4464)"/>
<path d="m44.5 10.903v3.5966" stroke="url(#linearGradient4466)"/>
<path d="m42.5 10.5v4" stroke="url(#linearGradient4466)"/>
<path d="m40.5 11.5v4" stroke="url(#linearGradient4470)"/>
</g>
<g fill="none" stroke-linecap="round" stroke-width="1px">
<path d="m41.5 8.5v6" opacity=".51724" stroke="url(#linearGradient4472)"/>
<path d="m43.5 11.5v3" opacity=".57088" stroke="url(#linearGradient4474)"/>
<path d="m45.5 11.5v3" opacity=".57088" stroke="url(#linearGradient4476)"/>
</g>
<g fill="#ffffff">
<path transform="matrix(1.1852 0 0 1.0667 -7.6666 -.96667)" d="m41.906 14.5a.42188.46875 0 11-.84375 0 .42188.46875 0 11.84375 0z"/>
<path transform="matrix(1.1852 0 0 1.0667 -5.6666 -.96667)" d="m41.906 14.5a.42188.46875 0 11-.84375 0 .42188.46875 0 11.84375 0z"/>
<path transform="matrix(1.1852 0 0 1.0667 -3.6666 -.96667)" d="m41.906 14.5a.42188.46875 0 11-.84375 0 .42188.46875 0 11.84375 0z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

75
icons/manual.svg Normal file
View File

@@ -0,0 +1,75 @@
<svg version="1.0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<radialGradient id="radialGradient5881" cx="11.78" cy="20.024" r="10.739" gradientTransform="matrix(1 0 0 .28028 0 14.412)" gradientUnits="userSpaceOnUse">
<stop stop-color="#000000" offset="0"/>
<stop stop-color="#000000" stop-opacity="0" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient6262">
<stop stop-color="#000000" offset="0"/>
<stop stop-color="#000000" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5525" x1="18" x2="10" y1="16.562" y2="10" gradientTransform="matrix(1.191 0 0 1.191 2.9446 3.2085)" gradientUnits="userSpaceOnUse">
<stop stop-color="#000000" offset="0"/>
<stop stop-color="#000000" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5529" x1="18" x2="10" y1="16.562" y2="10" gradientTransform="matrix(-1.3964 0 0 -1.3964 23.376 23.277)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#ffffff" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient4923" x1="10.441" x2="12.805" y1="10.306" y2="15.184" gradientTransform="matrix(1.3964 0 0 1.3964 .80181 .80181)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#d8d8d4" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient5992" cx="9.1462" cy="10.09" r="5.1972" gradientTransform="matrix(1.3623 0 0 1.3548 -2.2464 -2.4115)" gradientUnits="userSpaceOnUse">
<stop stop-color="#2e3436" offset="0"/>
<stop stop-color="#2e3436" stop-opacity="0" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient6010" x1="3.8151" x2="17.837" y1="17.888" y2="4.3612" gradientTransform="translate(1,1)" gradientUnits="userSpaceOnUse">
<stop stop-color="#fd0000" offset="0"/>
<stop stop-color="#fd0000" offset=".14655"/>
<stop stop-color="#bc0000" offset=".5"/>
<stop stop-color="#fd0000" offset=".88793"/>
<stop stop-color="#fd0000" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient6446" x1="21.305" x2="26.458" y1="10.744" y2="6.0747" gradientTransform="matrix(0 .66345 -.66345 0 20.264 -.98633)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6262"/>
<linearGradient id="linearGradient6448" x1="21.305" x2="26.458" y1="10.744" y2="6.0747" gradientTransform="matrix(0 .66345 .66345 0 3.7467 -.85421)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6262"/>
<linearGradient id="linearGradient6450" x1="21.305" x2="26.458" y1="10.744" y2="6.0747" gradientTransform="matrix(0 -.66345 .66345 0 3.7467 24.865)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6262"/>
<linearGradient id="linearGradient6452" x1="21.305" x2="26.458" y1="10.744" y2="6.0747" gradientTransform="matrix(.66345 0 0 .66345 -.90937 3.7467)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6262"/>
<linearGradient id="linearGradient6458" x1="32.899" x2="27.251" y1="4.9968" y2="9.8403" gradientTransform="matrix(0 .67045 .67397 0 1.2947 1.3625)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6262"/>
<linearGradient id="linearGradient6460" x1="32.899" x2="27.251" y1="4.9968" y2="9.8403" gradientTransform="matrix(.67045 0 0 .67397 1.2231 1.368)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6262"/>
</defs>
<path transform="matrix(1.0243 0 0 1.1628 -.065744 -2.7836)" d="m22.519 20.024a10.739 3.01 0 1 1 -21.479 0 10.739 3.01 0 1121.479 0z" color="#000000" fill="url(#radialGradient5881)" fill-rule="evenodd" opacity=".59825"/>
<g fill="none" stroke="#8f5902" stroke-width=".64071">
<path transform="matrix(1.3337 -1.3337 -.91322 -.91322 3.6669 24.791)" d="m3.7812 2.4406a1.4856 2.4673 0 1 1 -2.9711 0 1.4856 2.4673 0 112.9711 0z" color="#000000"/>
<path transform="matrix(1.3337 1.3337 -.91322 .91322 3.6669 -.79064)" d="m3.7812 2.4406a1.4856 2.4673 0 1 1 -2.9711 0 1.4856 2.4673 0 112.9711 0z" color="#000000"/>
<path transform="matrix(-1.3337 1.3337 .91322 .91322 20.333 -.79064)" d="m3.7812 2.4406a1.4856 2.4673 0 1 1 -2.9711 0 1.4856 2.4673 0 112.9711 0z" color="#000000"/>
<path transform="matrix(-1.3337 -1.3337 .91322 -.91322 20.333 24.791)" d="m3.7812 2.4406a1.4856 2.4673 0 1 1 -2.9711 0 1.4856 2.4673 0 112.9711 0z" color="#000000"/>
</g>
<g fill-rule="evenodd">
<g>
<path d="m11.973 1.5c-5.781 0-10.473 4.6918-10.473 10.473 0 5.781 4.6918 10.473 10.473 10.473 5.781 0 10.473-4.6918 10.473-10.473 0-5.781-4.6918-10.473-10.473-10.473zm-.043637 5.5855c2.7169 0 4.931 2.214 4.931 4.931 0 2.7169-2.214 4.931-4.931 4.931-2.7169 0-4.931-2.214-4.931-4.931-3e-7-2.7169 2.214-4.931 4.931-4.931z" color="#000000" fill="url(#linearGradient4923)" stroke="#555753"/>
<path d="m6.5619 3.5946c-1.1926.83651-2.2638 1.764-2.9673 2.9673l3.7528 3.7091c.51643-1.3585 1.5896-2.4474 2.9673-2.9237l-3.7528-3.7528zm10.036 10.036c-.4763 1.3777-1.5652 2.4509-2.9237 2.9673l3.7528 3.7528c1.3412-.80576 2.3204-1.7926 2.9237-2.9673l-3.7528-3.7528z" color="#000000" fill="#fd0000"/>
<path d="m20.357 6.5555c-.83651-1.1926-1.764-2.2638-2.9673-2.9673l-3.7091 3.7528c1.3585.51643 2.4474 1.5896 2.9237 2.9673l3.7528-3.7528zm-10.036 10.036c-1.3777-.4763-2.4509-1.5652-2.9673-2.9237l-3.7528 3.7528c.80576 1.3412 1.7926 2.3204 2.9673 2.9237l3.7528-3.7528z" color="#000000" fill="url(#linearGradient6010)"/>
</g>
<path d="m4.1759 20.004.018967-.21839c-3.8644-4.4735-1.2377-11.097 1.6168-13.942 2.8546-2.8455 9.6144-5.4915 14.119-1.7016l.17227-.065092c-5.4673-4.5995-12.069-3.585-15.84.17455-3.7716 3.7596-4.7722 10.33-.087274 15.753z" fill="url(#linearGradient5529)"/>
</g>
<path transform="matrix(1.263 0 0 1.263 2.5 2.5543)" d="m15 7.5a7.5 7.5 0 11-15 0 7.5 7.5 0 1115 0z" color="#000000" fill="none" stroke="#ffffff" stroke-opacity=".54505" stroke-width=".79174"/>
<g fill-rule="evenodd">
<path d="m19.321 6-.016177.18627c3.2961 3.8156 1.0557 9.465-1.3791 11.892-2.4348 2.427-8.2005 4.6839-12.043 1.4514l-.14693.05552c4.6633 3.9231 10.294 3.0578 13.511-.14888 3.217-3.2067 4.0704-8.8105.074438-13.436z" fill="url(#linearGradient5525)" opacity=".45415"/>
<g>
<path d="m16 8.4073c-.99467-.79317-1.7822-1.2434-3.1446-1.3888-3.3668-.35933-6.0007 2.1582-5.8118 5.8118.061186 1.1833.6696 2.0332 1.2784 2.953-1.3122-1.0675-2.6234-2.4334-2.7094-4.2535-.16944-3.5829 2.7502-6.5477 6.0235-6.0235 1.9827.3175 3.3176 1.3528 4.3639 2.9011z" color="#000000" fill="url(#radialGradient5992)" opacity=".69432"/>
<path d="m20.332 6.6511c-.83966-1.2033-1.7706-2.2842-2.9785-2.9941l-1.3645 1.3489c1.3636.52109 2.4566 1.6039 2.9347 2.9941l1.4083-1.3489z" color="#000000" fill="url(#linearGradient6460)"/>
<path d="m6.5778 20.472c-1.2033-.83966-2.2842-1.7706-2.9941-2.9785l1.3489-1.3645c.52109 1.3636 1.6039 2.4566 2.9941 2.9347l-1.3489 1.4083z" color="#000000" fill="url(#linearGradient6458)"/>
<path d="m18 8.9473c-.83088-1.1845-1.7521-2.2486-2.9473-2.9473l-1.3503 1.3279c1.3494.51296 2.4309 1.5789 2.904 2.9473l1.3936-1.3279z" color="#000000" fill="url(#linearGradient6452)" opacity=".62882"/>
<path d="m8.9473 5.9558c-1.1845.83088-2.2486 1.7521-2.9473 2.9473l1.3279 1.3503c.51296-1.3494 1.5789-2.4309 2.9473-2.904l-1.3279-1.3936z" color="#000000" fill="url(#linearGradient6450)" opacity=".62882"/>
<path d="m8.9473 18.055c-1.1845-.83088-2.2486-1.7521-2.9473-2.9473l1.3279-1.3503c.51296 1.3494 1.5789 2.4309 2.9473 2.904l-1.3279 1.3936z" color="#000000" fill="url(#linearGradient6448)" opacity=".62882"/>
<path d="m15.064 17.923c1.1845-.83088 2.2486-1.7521 2.9473-2.9473l-1.3279-1.3503c-.51296 1.3494-1.5789 2.4309-2.9473 2.904l1.3279 1.3936z" color="#000000" fill="url(#linearGradient6446)" opacity=".62882"/>
</g>
</g>
<g fill="#ffffff" fill-opacity=".4009" fill-rule="evenodd">
<path d="m18.992 7.7806c-.71866-1.2163-1.5088-2.3288-2.855-2.855l-1.3079 1.2862c1.3071.49688 2.3547 1.5294 2.813 2.855l1.3499-1.2862z" color="#000000"/>
<path d="m5.1892 15.852c.71866 1.2163 1.5088 2.3288 2.855 2.855l1.3079-1.2862c-1.3071-.49688-2.3547-1.5294-2.813-2.855l-1.3499 1.2862z" color="#000000"/>
<path d="m15.589 18.5c1.2163-.71866 2.3288-1.5088 2.855-2.855l-1.2862-1.3079c-.49688 1.3071-1.5294 2.3547-2.855 2.813l1.2862 1.3499z" color="#000000"/>
<path d="m7.7868 4.8514c-1.2163.71866-2.3288 1.5088-2.855 2.855l1.2862 1.3079c.49688-1.3071 1.5294-2.3547 2.855-2.813l-1.2862-1.3499z" color="#000000"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

42
icons/open-ecc.svg Normal file
View File

@@ -0,0 +1,42 @@
<svg version="1.0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter id="filter6052" x="-.14148" y="-.70742" width="1.283" height="2.4148">
<feGaussianBlur stdDeviation="1.1790392"/>
</filter>
<linearGradient id="linearGradient6062" x1="9.71" x2="24.286" y1="14.717" y2="-5.9536" gradientTransform="matrix(1.1176 0 0 1.1 -1.4118 -1.15)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#d3d7cf" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient6082" x1="17.688" x2="18.562" y1="4.5279" y2="3.7493" gradientTransform="matrix(1.3473 0 0 1.3356 -6.7303 -1.5077)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#cbcbcb" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient6114" x1="16.552" x2="16.552" y1="2.9627" y2="7.8356" gradientTransform="matrix(.98039 0 0 1.1 1.2941 -.8)" gradientUnits="userSpaceOnUse">
<stop stop-color="#000000" offset="0"/>
<stop stop-color="#000000" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient4922" x1="18.964" x2="14.047" y1="6.5045" y2="3.6734" gradientUnits="userSpaceOnUse">
<stop stop-color="#888a85" offset="0"/>
<stop stop-color="#5d5f5b" stop-opacity="0" offset="1"/>
</linearGradient>
</defs>
<g>
<rect x="2" y="19" width="20" height="4" rx="1.6351" ry="1.6351" color="#000000" fill="#000000" fill-rule="evenodd" filter="url(#filter6052)" opacity=".12664"/>
<path d="m4.3274.5h11.469l5.2822 5.3278c.28198.35946.43275.71893.42119 1.0784v13.795c0 .9964-.81503 1.7986-1.8274 1.7986h-15.345c-1.0124 0-1.8274-.80216-1.8274-1.7986v-18.403c0-.9964.81503-1.7986 1.8274-1.7986z" color="#000000" fill="url(#linearGradient6062)" fill-rule="evenodd" stroke="#888a85" stroke-width="1px"/>
<path d="m5.349 1.5h9.8721l5.2789 5.7474-.037354 12.436c0 1.0065-.82465 1.8167-1.849 1.8167h-13.265c-1.0243 0-1.849-.81026-1.849-1.8167v-16.367c0-1.0065.82465-1.8167 1.849-1.8167z" color="#000000" fill="none" stroke="#ffffff" stroke-width="1px"/>
</g>
<g transform="matrix(.016041 0 0 .016041 3.7357 5.04)" fill="#030305">
<path d="m407.84 27.68c244.16-58.56 512.8 101.28 578.88 343.04 77.6 240-62.56 521.12-300 604.64-225.12 90.88-504.16-16-612.8-232.32-114.08-206.56-51.36-488 139.84-626.4 57.12-43.52 124-73.6 194.08-88.96m-294.08 248.16c-82.24 135.68-86.24 313.92-10.88 453.28 49.28 96.96 136.8 167.68 232.96 215.04-28.16-36.64-56.64-74.72-68.8-120.16-40-121.28 31.36-264.96 150.72-308.8 62.24-29.12 136.48-8.64 196.96-42.88 73.12-37.92 124-117.12 121.44-200.48 3.68-113.44-95.36-218.08-208.32-222.24-165.76-8.32-331.04 82.88-414.08 226.24m575.2-195.52c49.28 57.92 86.24 130.88 79.04 208.96-5.12 119.2-104.32 227.36-224.32 236.16-60.64 3.2-125.12 11.04-171.84 53.92-84.32 65.44-109.92 193.76-53.12 284.96 34.56 57.28 94.4 103.04 162.4 109.12 169.6 14.24 341.92-76.64 427.84-223.2 82.72-135.2 88-313.12 13.28-452.8-48.8-98.08-136.64-169.28-233.28-217.12"/>
<path d="m482.08 176.32c67.52-23.84 142.88 40.64 128.8 111.04-7.2 72.8-103.52 110.88-159.52 64.48-64.32-44-45.12-156.16 30.72-175.52m1.28 33.76c-42.08 17.76-52.8 80.32-18.56 110.72 34.4 36.8 105.44 16.64 113.12-33.92 15.2-52.8-46.08-100.8-94.56-76.8m-14.24 451.04c62.4-32 146.4 19.2 142.72 90.24 5.44 76.64-90.88 128.64-153.28 85.6-65.92-37.44-59.52-146.56 10.56-175.84m14.08 28.8c-41.6 17.92-52.64 79.68-19.04 110.24 33.92 37.6 105.6 17.76 113.76-32.8 15.52-53.12-45.92-101.6-94.72-77.44"/>
</g>
<g transform="matrix(.016041 0 0 .016041 3.7357 5.04)" fill="#ffffff">
<path d="m113.76 275.84c83.04-143.36 248.32-234.56 414.08-226.24 112.96 4.16 212 108.8 208.32 222.24 2.56 83.36-48.32 162.56-121.44 200.48-60.48 34.24-134.72 13.76-196.96 42.88-119.36 43.84-190.72 187.52-150.72 308.8 12.16 45.44 40.64 83.52 68.8 120.16-96.16-47.36-183.68-118.08-232.96-215.04-75.36-139.36-71.36-317.6 10.88-453.28m368.32-99.52c-75.84 19.36-95.04 131.52-30.72 175.52 56 46.4 152.32 8.32 159.52-64.48 14.08-70.4-61.28-134.88-128.8-111.04"/>
<path d="m483.2 689.92c48.8-24.16 110.24 24.32 94.72 77.44-8.16 50.56-79.84 70.4-113.76 32.8-33.6-30.56-22.56-92.32 19.04-110.24"/>
</g>
<g transform="matrix(.016041 0 0 .016041 3.7357 5.04)" fill="#4658f5">
<path d="m688.96 80.32c96.64 47.84 184.48 119.04 233.28 217.12 74.72 139.68 69.44 317.6-13.28 452.8-85.92 146.56-258.24 237.44-427.84 223.2-68-6.08-127.84-51.84-162.4-109.12-56.8-91.2-31.2-219.52 53.12-284.96 46.72-42.88 111.2-50.72 171.84-53.92 120-8.8 219.2-116.96 224.32-236.16 7.2-78.08-29.76-151.04-79.04-208.96m-219.84 580.8c-70.08 29.28-76.48 138.4-10.56 175.84 62.4 43.04 158.72-8.96 153.28-85.6 3.68-71.04-80.32-122.24-142.72-90.24"/>
<path d="m483.36 210.08c48.48-24 109.76 24 94.56 76.8-7.68 50.56-78.72 70.72-113.12 33.92-34.24-30.4-23.52-92.96 18.56-110.72"/>
</g>
<path d="m16 2.0708 4.982 4.8486.018045 1.0806-4.9638-1e-7-.036229-5.9292z" fill="url(#linearGradient6114)" fill-rule="evenodd"/>
<path d="m21.005 6.5-5.4679-2e-7-.036601-5.6532" fill="url(#linearGradient6082)" fill-rule="evenodd" stroke="url(#linearGradient4922)" stroke-width="1px"/>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

34
icons/open-img.svg Normal file
View File

@@ -0,0 +1,34 @@
<svg version="1.0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter id="filter6052" x="-.14148" y="-.70742" width="1.283" height="2.4148">
<feGaussianBlur stdDeviation="1.1790392"/>
</filter>
<linearGradient id="linearGradient6062" x1="9.71" x2="24.286" y1="14.717" y2="-5.9536" gradientTransform="matrix(1.1176 0 0 1.1 -1.4118 -1.15)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#d3d7cf" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient6082" x1="17.688" x2="18.562" y1="4.5279" y2="3.7493" gradientTransform="matrix(1.3473 0 0 1.3356 -6.7303 -1.5077)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#cbcbcb" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient6114" x1="16.552" x2="16.552" y1="2.9627" y2="7.8356" gradientTransform="matrix(.98039 0 0 1.1 1.2941 -.8)" gradientUnits="userSpaceOnUse">
<stop stop-color="#000000" offset="0"/>
<stop stop-color="#000000" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient4922" x1="18.964" x2="14.047" y1="6.5045" y2="3.6734" gradientUnits="userSpaceOnUse">
<stop stop-color="#888a85" offset="0"/>
<stop stop-color="#5d5f5b" stop-opacity="0" offset="1"/>
</linearGradient>
</defs>
<g>
<rect x="2" y="19" width="20" height="4" rx="1.6351" ry="1.6351" color="#000000" fill="#000000" fill-rule="evenodd" filter="url(#filter6052)" opacity=".12664"/>
<path d="m4.3274.5h11.469l5.2822 5.3278c.28198.35946.43275.71893.42119 1.0784v13.795c0 .9964-.81503 1.7986-1.8274 1.7986h-15.345c-1.0124 0-1.8274-.80216-1.8274-1.7986v-18.403c0-.9964.81503-1.7986 1.8274-1.7986z" color="#000000" fill="url(#linearGradient6062)" fill-rule="evenodd" stroke="#888a85" stroke-width="1px"/>
<path d="m5.3211 1.4721h9.8721l5.2789 5.7474-.03735 12.436c0 1.0065-.82465 1.8167-1.849 1.8167h-13.265c-1.0243 0-1.849-.81026-1.849-1.8167v-16.367c0-1.0065.82465-1.8167 1.849-1.8167z" color="#000000" fill="none" stroke="#ffffff" stroke-width="1px"/>
</g>
<path d="m17.834 6.5c.051022.30182.13197.5406.24414.71875.25997.42091.68546.65039 1.1992.65039.47662 0 .86635-.1934 1.1387-.55859.14165-.19477.24361-.46305.30469-.81055h-.85938c-.014924.093317-.031412.1716-.050781.22266-.09903.25997-.2856.40234-.5332.40234-.22902 0-.40261-.11701-.50781-.33984-.029869-.064002-.053901-.16217-.074219-.28516h-.86133z" stroke-width=".3571"/>
<path d="m5.5117 3.2441c-.47041 0-.87253.19927-1.1387.56445-.25378.34043-.37109.89582-.37109 1.75 0 .7799.09814 1.3259.30859 1.6602.25997.42091.68741.65039 1.2012.65039.47662 0 .86635-.1934 1.1387-.55859.24759-.34043.37109-.90334.37109-1.7266 0-.80465-.098144-1.349-.30859-1.6895-.25997-.42091-.68741-.65039-1.2012-.65039zm3.5156.09375c-.13617.51994-.58667.78516-1.3418.78516v.57617h1.0508v3.0273h.86719v-4.3887h-.57617zm3.4414 0c-.13617.51994-.58668.78516-1.3418.78516v.57617h1.0508v3.0273h.86719v-4.3887h-.57617zm3.4414 0c-.13617.51994-.58667.78516-1.3418.78516v.57617h1.0508v3.0273h.86719v-4.3887h-.57617zm-10.398.60547c.22283 0 .40261.1245.50781.35352.086657.18569.13672.66296.13672 1.2695 0 .49519-.04324.97677-.11133 1.1562-.099034.25997-.2856.40234-.5332.40234-.22902 0-.40261-.11701-.50781-.33984-.086657-.18569-.13477-.64442-.13477-1.2324 0-.51994.04324-1.0139.11133-1.1934.092846-.26616.28365-.41602.53125-.41602z" stroke-width=".3571"/>
<path d="m16 2.0708 4.982 4.8486.018045 1.0806-4.9638-1e-7-.036229-5.9292z" fill="url(#linearGradient6114)" fill-rule="evenodd"/>
<path d="m21.005 6.5-5.4679-2e-7-.036601-5.6532" fill="url(#linearGradient6082)" fill-rule="evenodd" stroke="url(#linearGradient4922)" stroke-width="1px"/>
<path d="m5.2954 10.925v3.0268h.86657v-4.3884h-.57564c-.13617.51994-.58804.78608-1.3432.78608v.57564zm3.6581-1.4546c-.47041 0-.87275.19807-1.1389.56325-.25378.34043-.37138.8975-.37138 1.7517 0 .7799.099034 1.3246.30948 1.6588.25997.42091.68706.64992 1.2008.64992.47662 0 .86657-.19188 1.1389-.55708.24759-.34043.37138-.90371.37138-1.7269 0-.80465-.09903-1.3494-.30948-1.6898-.25997-.42091-.68706-.64992-1.2008-.64992zm0 .69945c.22283 0 .40234.1238.50755.35282.086657.18569.13617.66231.13617 1.2689 0 .49519-.043327.97799-.11142 1.1575-.099034.25997-.28473.40234-.53233.40234-.22902 0-.40234-.1176-.50755-.34044-.086657-.18569-.13617-.64374-.13617-1.2317 0-.51994.043327-1.0151.11142-1.1946.092846-.26616.28473-.4147.53233-.4147zm3.4415-.69945c-.47041 0-.87275.19807-1.1389.56325-.25378.34043-.37138.8975-.37138 1.7517 0 .7799.09903 1.3246.30948 1.6588.25997.42091.68706.64992 1.2008.64992.47662 0 .86657-.19188 1.1389-.55708.24759-.34043.37138-.90371.37138-1.7269 0-.80465-.09903-1.3494-.30948-1.6898-.25997-.42091-.68706-.64992-1.2008-.64992zm0 .69945c.22283 0 .40234.1238.50754.35282.08666.18569.13617.66231.13617 1.2689 0 .49519-.04333.97799-.11141 1.1575-.09904.25997-.28473.40234-.53233.40234-.22902 0-.40234-.1176-.50754-.34044-.08666-.18569-.13617-.64374-.13617-1.2317 0-.51994.04333-1.0151.11142-1.1946.09285-.26616.28473-.4147.53233-.4147zm3.2248.75516v3.0268h.86657v-4.3884h-.57564c-.13617.51994-.58804.78608-1.3432.78608v.57564zm3.4415 0v3.0268h.86657v-4.3884h-.57564c-.13617.51994-.58804.78608-1.3432.78608v.57564z" stroke-width=".3571"/>
<path d="m5.5121 15.697c-.47041 0-.87275.19807-1.1389.56325-.25378.34043-.37138.8975-.37138 1.7517 0 .7799.099034 1.3246.30949 1.6588.25997.42091.68706.64992 1.2008.64992.47662 0 .86657-.19188 1.1389-.55707.24759-.34043.37138-.90371.37138-1.7269 0-.80465-.099034-1.3494-.30948-1.6898-.25997-.42091-.68706-.64992-1.2008-.64992zm0 .69945c.22283 0 .40234.1238.50755.35282.086657.18569.13617.66231.13617 1.2689 0 .49519-.043327.97799-.11141 1.1575-.099034.25997-.28473.40234-.53233.40234-.22902 0-.40234-.1176-.50755-.34044-.086657-.18569-.13617-.64374-.13617-1.2317 0-.51994.043327-1.0151.11142-1.1946.092846-.26616.28473-.4147.53233-.4147zm3.4415-.69945c-.47041 0-.87275.19807-1.1389.56325-.25378.34043-.37138.8975-.37138 1.7517 0 .7799.099034 1.3246.30948 1.6588.25997.42091.68706.64992 1.2008.64992.47662 0 .86657-.19188 1.1389-.55707.24759-.34043.37138-.90371.37138-1.7269 0-.80465-.09903-1.3494-.30948-1.6898-.25997-.42091-.68706-.64992-1.2008-.64992zm0 .69945c.22283 0 .40234.1238.50755.35282.086657.18569.13617.66231.13617 1.2689 0 .49519-.043327.97799-.11142 1.1575-.099034.25997-.28473.40234-.53233.40234-.22902 0-.40234-.1176-.50755-.34044-.086657-.18569-.13617-.64374-.13617-1.2317 0-.51994.043327-1.0151.11142-1.1946.092846-.26616.28473-.4147.53233-.4147zm3.2248.75516v3.0268h.86657v-4.3884h-.57564c-.13617.51994-.58804.78608-1.3432.78608v.57564zm3.4415 0v3.0268h.86657v-4.3884h-.57564c-.13617.51994-.58804.78608-1.3432.78608v.57564zm3.4415 0v3.0268h.86657v-4.3884h-.57564c-.13617.51994-.58804.78608-1.3432.78608v.57564z" stroke-width=".3571"/>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

41
icons/preferences.svg Normal file
View File

@@ -0,0 +1,41 @@
<svg version="1.0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient5916">
<stop stop-color="#eeeeec" offset="0"/>
<stop stop-color="#eeeeec" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient5922" cx="17.563" cy="3.4949" r="2.2188" gradientTransform="matrix(-.76879 .72066 -.89296 -.95259 35.055 -5.9452)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient5916"/>
<radialGradient id="radialGradient5926" cx="17.654" cy="3.6021" r="2.2188" gradientTransform="matrix(-.3081 .48507 -.80332 -.51025 15.173 -4.5605)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient5916"/>
<linearGradient id="linearGradient5149" x1="4.3601" x2="5.8711" y1="17.388" y2="18.979" gradientUnits="userSpaceOnUse">
<stop stop-color="#84abd5" offset="0"/>
<stop stop-color="#d0dfef" offset=".5"/>
<stop stop-color="#84abd5" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5159" x1="1" x2="23" y1="12" y2="12" gradientUnits="userSpaceOnUse">
<stop stop-color="#888b85" offset="0"/>
<stop stop-color="#555753" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5245" x1="4.8768" x2="8.2158" y1="16.336" y2="20.755" gradientUnits="userSpaceOnUse">
<stop stop-color="#2c67bd" offset="0"/>
<stop stop-color="#173662" offset="1"/>
</linearGradient>
</defs>
<g fill-rule="evenodd">
<g>
<path d="m1.5 6.7723 1.3404 2.5915c.97227 2.0329 2.9802.90343 4.6915.40213l6.7245 6.7245c-.67527 1.8354-1.675 3.4541.40213 4.6915l2.5691 1.3181 1.5191-1.5191-1.4521-1.4074-.022341-1.4074.75958-.75958 1.3851-.089361 1.4968 1.4968 1.5862-1.5862-1.4074-2.4798c-1.1932-1.9887-2.9189-.95025-4.7138-.42447l-6.6798-6.6798c.85275-1.8004 1.1665-3.609-.42447-4.7138l-2.5021-1.4298-1.5862 1.5862 1.5191 1.5191-.089362 1.3851-.75957.75957-1.4074-.02234-1.4298-1.4745-1.5191 1.5191z" fill="#d3d7cf" stroke="url(#linearGradient5159)" stroke-width="1px"/>
<path d="m6.4195 2.6779 1.9283 1.204.62436.70093.0062081.73497-.9437 2.9239 2.9831 2.6296.53033-.61872-2.4514-2.363c.96944-2.4841 1.0846-3.6668-.10869-4.5065l-2.1207-1.2871-.44777.58193z" fill="#ffffff"/>
<path d="m3.5198 6.6646-1.0002 1.0158-.34773-.81694.88388-.88388.41984.50823.044194.17678z" fill="#ffffff"/>
</g>
<path d="m12.906 14.469 1.5-1.4062-.90625-.875-1.4375 1.5625.84375.71875z" fill="#2e3436" opacity=".27976"/>
<g>
<path d="m18.512 2.6768-2.6025 2.1981.20703 1.386-10.336 10.361 1.5379 1.4882 10.37-10.28 1.395.20527 2.2611-2.4756-2.8322-2.8831z" fill="#d3d7cf" stroke="#888a85" stroke-width="1px"/>
<path d="m8.4599 13.456-6.0147 4.2319s-.70335 1.0484.2475 2.0019l1.6329 1.6374c.69563.69755 2.054.17594 2.054.17594l4.2529-5.8459-2.1727-2.2012z" fill="#d4e2f1" stroke="url(#linearGradient5245)" stroke-width="1px"/>
<path d="m8.3511 14.533-4.8494 3.8395c-.45144 1.0464 1.407 2.4861 2.2202 1.8456l3.9057-4.4964-1.2764-1.1887z" fill="url(#linearGradient5149)"/>
<path d="m18.952 3.8475-1.7472 1.4767.1875 1.328-7.4407 7.3028-.40533-.429 7.116-7.1004-.17867-1.3563 1.9095-1.812.5589.59015z" fill="#ffffff"/>
<path d="m18.469 3.1953 2.1891 2.3699-1.8141 1.9973-2.3849-2.4954 2.0099-1.8718z" fill="url(#radialGradient5922)"/>
<path d="m6.8693 2.0937 2.0781 1.25-1.7031 1.1562-1.3068-1.386.93181-1.0202z" fill="url(#radialGradient5926)"/>
<path d="m13.75 12.438 2.5625 2.5s2.5-1.25 3.4375-.75 2.0625 2.9375 2.0625 2.9375-1.1875-2.0625-2.0625-2.3125-3.5625.9375-3.5625.9375l-2.875-2.8125.4375-.5z" color="#000000" fill="#ffffff"/>
<path d="m17.854 16.841-1.8562 1.149-.088388 1.9445 1.591 1.591.53033-.53033-1.3258-1.2374.088388-1.6794 1.0607-1.2374z" color="#000000" fill="#ffffff"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,35 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
4950 2700 9450 2700 9450 7650 4950 7650 4950 2700
2 1 0 20 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3150 2700 10845 2700
2 1 0 20 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3150 7650 10800 7650
2 1 0 20 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4950 900 4950 9000
2 1 0 20 0 7 5 -1 -1 0.000 0 0 -1 0 0 2
9450 900 9450 9045
3 0 0 20 0 7 50 -1 -1 0.000 0 0 0 7
6525 2700 6300 2250 6300 1575 7200 1080 8100 1575 8100 2250
7875 2700
0.000 1.000 1.000 1.000 1.000 1.000 0.000
3 0 0 20 0 7 50 -1 -1 0.000 0 0 0 7
4950 4275 4500 4050 3825 4050 3330 4950 3825 5850 4500 5850
4950 5625
0.000 1.000 1.000 1.000 1.000 1.000 0.000
3 0 0 20 0 7 50 -1 -1 0.000 0 0 0 7
9450 4320 9000 4095 8325 4095 7830 4995 8325 5895 9000 5895
9450 5670
0.000 1.000 1.000 1.000 1.000 1.000 0.000
3 0 0 20 0 7 50 -1 -1 0.000 0 0 0 7
6525 7650 6300 7200 6300 6525 7200 6030 8100 6525 8100 7200
7875 7650
0.000 1.000 1.000 1.000 1.000 1.000 0.000

31
icons/quit.svg Normal file
View File

@@ -0,0 +1,31 @@
<svg version="1.0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient5934" x1="-.19819" x2="-.19819" y1="-1.3415" y2="8.9255" gradientTransform="matrix(-.90643 0 0 .90643 15.831 1.1871)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffffff" offset="0"/>
<stop stop-color="#ffffff" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5946" x1="32.9" x2="32.9" y1="20.085" y2="9.2824" gradientTransform="translate(-17)" gradientUnits="userSpaceOnUse">
<stop stop-color="#346703" offset="0"/>
<stop stop-color="#ffffff" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5956" x1="8.4617" x2="15.305" y1="13.076" y2="13.076" gradientUnits="userSpaceOnUse">
<stop stop-color="#e0e1de" offset="0"/>
<stop stop-color="#777c70" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient5970" x1="12.191" x2="12.191" y1="1.7234" y2="6.2786" gradientUnits="userSpaceOnUse">
<stop stop-color="#000000" offset="0"/>
<stop stop-color="#000000" stop-opacity="0" offset="1"/>
</linearGradient>
</defs>
<rect x="7.5" y="1.5" width="15" height="21" rx="0" ry="0" fill="url(#linearGradient5946)" stroke="#2e3436" stroke-linecap="round"/>
<path d="m9 22 8-4v-16h-9v20h1z" fill="url(#linearGradient5956)" fill-rule="evenodd"/>
<rect x="8.4375" y="2.5" width="13.062" height="19" fill="none" opacity=".20109" stroke="#ffffff" stroke-linecap="round"/>
<g transform="translate(-3 3.9688)">
<path d="m8.4349 1.625 6.0312 6.0312-6.0312 5.875v-2.9375h-4.9349v-6h4.9349v-2.9688z" fill="#cc0000" fill-rule="evenodd" stroke="#820000" stroke-width="1px"/>
<path transform="matrix(-1,0,0,1,16,0)" d="m6.5312 3.9186-3.5853 3.6439 3.5853 3.5868v-1.5861h4.9349v-4h-4.9349v-1.6446z" fill="none" stroke="#ffffff" stroke-opacity=".36486" stroke-width="1px"/>
<path transform="matrix(-1,0,0,1,16,0)" d="m2.9705 6.8523c1.0727.42953 2.3242 1.1258 3.9963 1.1258 2.4392 0 4.3718.059238 4.8703-.94984l.17591-2.0148h-5.0179v-2.1398l-4.0246 3.9786z" color="#000000" fill="url(#linearGradient5934)"/>
</g>
<path transform="matrix(1.4846 0 0 1.0557 -7.4375 -.93773)" d="m15.787 10.834a1.0104 1.4208 0 1 1 -2.0207 0 1.0104 1.4208 0 112.0207 0z" fill="#2e3436"/>
<rect x="8" y="2" width="9" height="5" fill="url(#linearGradient5970)" opacity=".39674"/>
<path d="m7.875 22 9.625-4.7737v-15.726" fill="none" stroke="#2e3436" stroke-width="1px"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

5
icons/read-symbolic.svg Normal file
View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
<path d="m4.732.19079c-1.3173 0-2.444.55467-3.1893 1.5773-.71067.95333-1.04 2.5133-1.04 4.9053 0 2.184.27733 3.7093.86667 4.6453.728 1.1787 1.924 1.82 3.3627 1.82 1.3347 0 2.4267-.53733 3.1893-1.56.69333-.95333 1.04-2.5307 1.04-4.836 0-2.2533-.27733-3.7787-.86666-4.732-.728-1.1787-1.924-1.82-3.3627-1.82zm0 1.9587c.624 0 1.1267.34667 1.4213.988.24267.52.38133 1.8547.38133 3.5533 0 1.3867-.12133 2.7387-.312 3.2413-.27733.728-.79733 1.1267-1.4907 1.1267-.64133 0-1.1267-.32933-1.4213-.95333-.24267-.52-.38133-1.8027-.38133-3.4493 0-1.456.12133-2.8427.312-3.3453.26-.74533.79733-1.1613 1.4907-1.1613zm9.0306 2.1147v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612zm9.6373 0v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612zm9.6373 0v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612zm10.244-4.0733c-1.3173 0-2.444.55467-3.1893 1.5773-.71067.95333-1.04 2.5133-1.04 4.9053 0 2.184.27733 3.7093.86666 4.6453.728 1.1787 1.924 1.82 3.3627 1.82 1.3347 0 2.4267-.53733 3.1893-1.56.69333-.95333 1.04-2.5307 1.04-4.836 0-2.2533-.27733-3.7787-.86666-4.732-.728-1.1787-1.924-1.82-3.3627-1.82zm0 1.9587c.624 0 1.1267.34667 1.4213.988.24267.52.38133 1.8547.38133 3.5533 0 1.3867-.12133 2.7387-.312 3.2413-.27733.728-.79733 1.1267-1.4907 1.1267-.64133 0-1.1267-.32933-1.4213-.95333-.24267-.52-.38133-1.8027-.38133-3.4493 0-1.456.12133-2.8427.312-3.3453.26-.74533.79733-1.1613 1.4907-1.1613z" opacity=".5"/>
<path d="m4.1253 21.699v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612zm10.244-4.0733c-1.3173 0-2.444.55466-3.1893 1.5773-.71067.95333-1.04 2.5133-1.04 4.9053 0 2.184.27733 3.7093.86666 4.6453.728 1.1787 1.924 1.82 3.3627 1.82 1.3347 0 2.4267-.53733 3.1893-1.56.69333-.95333 1.04-2.5307 1.04-4.836 0-2.2533-.27733-3.7787-.86666-4.732-.728-1.1787-1.924-1.82-3.3627-1.82zm0 1.9587c.624 0 1.1267.34667 1.4213.988.24267.52.38133 1.8547.38133 3.5533 0 1.3867-.12133 2.7387-.312 3.2413-.27733.728-.79733 1.1267-1.4907 1.1267-.64133 0-1.1267-.32933-1.4213-.95333-.24267-.52-.38133-1.8027-.38133-3.4493 0-1.456.12133-2.8427.312-3.3453.26-.74533.79733-1.1613 1.4907-1.1613zm9.6373-1.9587c-1.3173 0-2.444.55466-3.1893 1.5773-.71067.95333-1.04 2.5133-1.04 4.9053 0 2.184.27733 3.7093.86666 4.6453.728 1.1787 1.924 1.82 3.3627 1.82 1.3347 0 2.4267-.53733 3.1893-1.56.69333-.95333 1.04-2.5307 1.04-4.836 0-2.2533-.27733-3.7787-.86666-4.732-.728-1.1787-1.924-1.82-3.3627-1.82zm0 1.9587c.624 0 1.1267.34667 1.4213.988.24267.52.38133 1.8547.38133 3.5533 0 1.3867-.12133 2.7387-.312 3.2413-.27733.728-.79733 1.1267-1.4907 1.1267-.64133 0-1.1267-.32933-1.4213-.95333-.24267-.52-.38133-1.8027-.38133-3.4493 0-1.456.12133-2.8427.312-3.3453.26-.74533.79733-1.1613 1.4907-1.1613zm9.0306 2.1147v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612zm9.6373 0v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612z"/>
<path d="m4.732 35.061c-1.3173 0-2.444.55467-3.1893 1.5773-.71067.95333-1.04 2.5133-1.04 4.9053 0 2.184.27733 3.7093.86667 4.6453.728 1.1787 1.924 1.82 3.3627 1.82 1.3347 0 2.4267-.53733 3.1893-1.56.69333-.95333 1.04-2.5307 1.04-4.836 0-2.2533-.27733-3.7787-.86666-4.732-.728-1.1787-1.924-1.82-3.3627-1.82zm0 1.9587c.624 0 1.1267.34667 1.4213.988.24267.52.38133 1.8547.38133 3.5533 0 1.3867-.12133 2.7387-.312 3.2413-.27733.728-.79733 1.1267-1.4907 1.1267-.64133 0-1.1267-.32933-1.4213-.95333-.24267-.52-.38133-1.8027-.38133-3.4493 0-1.456.12133-2.8427.312-3.3453.26-.74533.79733-1.1613 1.4907-1.1613zm9.6373-1.9587c-1.3173 0-2.444.55467-3.1893 1.5773-.71067.95333-1.04 2.5133-1.04 4.9053 0 2.184.27733 3.7093.86666 4.6453.728 1.1787 1.924 1.82 3.3627 1.82 1.3347 0 2.4267-.53733 3.1893-1.56.69333-.95333 1.04-2.5307 1.04-4.836 0-2.2533-.27733-3.7787-.86666-4.732-.728-1.1787-1.924-1.82-3.3627-1.82zm0 1.9587c.624 0 1.1267.34667 1.4213.988.24267.52.38133 1.8547.38133 3.5533 0 1.3867-.12133 2.7387-.312 3.2413-.27733.728-.79733 1.1267-1.4907 1.1267-.64133 0-1.1267-.32933-1.4213-.95333-.24267-.52-.38133-1.8027-.38133-3.4493 0-1.456.12133-2.8427.312-3.3453.26-.74533.79733-1.1613 1.4907-1.1613zm9.0306 2.1147v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612zm9.6373 0v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612zm9.6373 0v8.476h2.4267v-12.289h-1.612c-.38133 1.456-1.6467 2.2013-3.7613 2.2013v1.612z" opacity=".5"/>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 781 B

9
icons/scan-symbolic.svg Normal file
View File

@@ -0,0 +1,9 @@
<svg version="1.1" viewBox="0 0 576 576" xmlns="http://www.w3.org/2000/svg">
<style>
.no-fill {
fill: none !important;
}
</style>
<path d="m49.2 329.6c49.768-155.03 234.28-230.88 504-235.2" class="no-fill" stroke="#4658f5" stroke-width="24"/>
<path d="m38 56v8h-26v16h26v80h-26v16h26v80h-26v16h26v80h-26v16h26v80h-26v16h26v21h16v-21h104v18h16v-18h104v15h16v-15h104v15h16v-15h104v15h16v-15h16v-16h-496v-392z"/>
</svg>

After

Width:  |  Height:  |  Size: 439 B

View File

@@ -1,35 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1710 7965 1080 7965
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1710 6165 1080 6165
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1710 4365 1080 4365
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
3960 7965 3960 8460
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1710 2565 1125 2565
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
6210 7965 6210 8415
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
8460 7965 8460 8415
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
10710 7965 10710 8415
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1710 765 1125 765
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1710 8010 1710 8505
2 1 0 20 0 7 50 0 -1 0.000 0 0 -1 0 0 3
1710 450 1710 7965 11160 7965
3 0 0 30 1 7 51 0 -1 0.000 0 0 0 8
1755 5580 2160 4545 2700 3870 3420 3195 4590 2385 6435 1710
8865 1260 11205 1170
0.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

View File

@@ -1,626 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
id="svg2"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="medium.svg">
<defs
id="defs4">
<linearGradient
inkscape:collect="always"
id="linearGradient5823">
<stop
style="stop-color:#c6e9af;stop-opacity:1"
offset="0"
id="stop5825" />
<stop
style="stop-color:#dee3db;stop-opacity:0"
offset="1"
id="stop5827" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5815">
<stop
style="stop-color:#c6e9af;stop-opacity:1"
offset="0"
id="stop5817" />
<stop
style="stop-color:#e3f4d7;stop-opacity:1"
offset="1"
id="stop5819" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5807">
<stop
style="stop-color:#ffeeaa;stop-opacity:1"
offset="0"
id="stop5809" />
<stop
style="stop-color:#e3f4d7;stop-opacity:1"
offset="1"
id="stop5811" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5799">
<stop
style="stop-color:#ffeeaa;stop-opacity:1"
offset="0"
id="stop5801" />
<stop
style="stop-color:#ffaaaa;stop-opacity:1"
offset="1"
id="stop5803" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5791">
<stop
style="stop-color:#ff8080;stop-opacity:1"
offset="0"
id="stop5793" />
<stop
style="stop-color:#f4d7d7;stop-opacity:1"
offset="1"
id="stop5795" />
</linearGradient>
<linearGradient
id="linearGradient5773">
<stop
style="stop-color:#ffccaa;stop-opacity:1"
offset="0"
id="stop5775" />
<stop
id="stop5787"
offset="0.5"
style="stop-color:#e9afaf;stop-opacity:1" />
<stop
style="stop-color:#f4d7d7;stop-opacity:1"
offset="1"
id="stop5777" />
</linearGradient>
<linearGradient
id="linearGradient5761">
<stop
style="stop-color:#ffeeaa;stop-opacity:1"
offset="0"
id="stop5763" />
<stop
id="stop5785"
offset="0.05215516"
style="stop-color:#ffe9aa;stop-opacity:1;" />
<stop
id="stop5783"
offset="0.10431032"
style="stop-color:#ffe5aa;stop-opacity:1;" />
<stop
id="stop5781"
offset="0.20862064"
style="stop-color:#ffddaa;stop-opacity:1;" />
<stop
id="stop5771"
offset="0.41724128"
style="stop-color:#ffccaa;stop-opacity:1" />
<stop
id="stop5769"
offset="0.65517235"
style="stop-color:#ffeeaa;stop-opacity:1" />
<stop
style="stop-color:#f5f5f5;stop-opacity:0;"
offset="1"
id="stop5765" />
</linearGradient>
<linearGradient
id="linearGradient5745">
<stop
id="stop5747"
offset="0"
style="stop-color:#f5f5f5;stop-opacity:1;" />
<stop
style="stop-color:#faf1cf;stop-opacity:1;"
offset="0.5"
id="stop5751" />
<stop
id="stop5749"
offset="1"
style="stop-color:#ffeeaa;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient5737"
inkscape:collect="always">
<stop
id="stop5739"
offset="0"
style="stop-color:#f5f5f5;stop-opacity:1;" />
<stop
id="stop5741"
offset="1"
style="stop-color:#ccffaa;stop-opacity:0" />
</linearGradient>
<linearGradient
id="linearGradient5729">
<stop
id="stop5731"
offset="0"
style="stop-color:#f5f5f5;stop-opacity:1;" />
<stop
id="stop5733"
offset="1"
style="stop-color:#ff9955;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient5703"
inkscape:collect="always">
<stop
id="stop5705"
offset="0"
style="stop-color:#f5f5f5;stop-opacity:1;" />
<stop
id="stop5707"
offset="1"
style="stop-color:#ccffaa;stop-opacity:0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5693">
<stop
style="stop-color:#f5f5f5;stop-opacity:1;"
offset="0"
id="stop5695" />
<stop
style="stop-color:#ccffaa;stop-opacity:1"
offset="1"
id="stop5697" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5679">
<stop
style="stop-color:#f5f5f5;stop-opacity:1;"
offset="0"
id="stop5681" />
<stop
style="stop-color:#b3ff80;stop-opacity:1"
offset="1"
id="stop5683" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5671">
<stop
style="stop-color:#f5f5f5;stop-opacity:1;"
offset="0"
id="stop5673" />
<stop
style="stop-color:#aaeeff;stop-opacity:1"
offset="1"
id="stop5675" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5663">
<stop
style="stop-color:#f5f5f5;stop-opacity:1;"
offset="0"
id="stop5665" />
<stop
style="stop-color:#aaeeff;stop-opacity:1"
offset="1"
id="stop5667" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5655">
<stop
style="stop-color:#f5f5f5;stop-opacity:1;"
offset="0"
id="stop5657" />
<stop
style="stop-color:#ffaaaa;stop-opacity:1"
offset="1"
id="stop5659" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5643">
<stop
style="stop-color:#f5f5f5;stop-opacity:1;"
offset="0"
id="stop5645" />
<stop
style="stop-color:#ffaaaa;stop-opacity:1"
offset="1"
id="stop5647" />
</linearGradient>
<linearGradient
id="linearGradient5361"
osb:paint="solid">
<stop
style="stop-color:#f5f5f5;stop-opacity:1;"
offset="0"
id="stop5363" />
</linearGradient>
<linearGradient
id="linearGradient3897">
<stop
id="stop3923"
offset="0"
style="stop-color:#f5f5f5;stop-opacity:1" />
<stop
style="stop-color:#ff5555;stop-opacity:0;"
offset="1"
id="stop3901" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5643"
id="linearGradient5641"
x1="193.54839"
y1="407.20087"
x2="282.25806"
y2="287.84604"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5655"
id="linearGradient5661"
x1="358.06451"
y1="273.32993"
x2="230.64516"
y2="328.16864"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5663"
id="linearGradient5669"
x1="424.19354"
y1="250.74927"
x2="575.80646"
y2="347.52347"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5671"
id="linearGradient5677"
x1="580.64514"
y1="362.03961"
x2="511.29031"
y2="292.68475"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5679"
id="linearGradient5685"
x1="590.32257"
y1="353.9751"
x2="643.5484"
y2="460.4267"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5693"
id="linearGradient5699"
x1="638.70966"
y1="515.26538"
x2="620.96771"
y2="410.4267"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5703"
id="linearGradient5701"
x1="661.29034"
y1="471.71701"
x2="601.61292"
y2="603.9751"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5737"
id="linearGradient5735"
x1="662.9032"
y1="476.55573"
x2="622.58063"
y2="592.68475"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5761"
id="linearGradient5767"
x1="630.64514"
y1="624.94287"
x2="666.12903"
y2="471.71701"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5773"
id="linearGradient5779"
x1="627.41943"
y1="574.94281"
x2="596.77417"
y2="633.00732"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5791"
id="linearGradient5797"
x1="433.87097"
y1="760.4267"
x2="609.67743"
y2="612.03955"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5799"
id="linearGradient5805"
x1="448.38708"
y1="712.03961"
x2="512.90326"
y2="670.10413"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5807"
id="linearGradient5813"
x1="462.90326"
y1="737.84607"
x2="408.06451"
y2="749.13641"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5815"
id="linearGradient5821"
x1="285.48386"
y1="726.55573"
x2="424.19354"
y2="745.91058"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5823"
id="linearGradient5829"
x1="340.32257"
y1="671.71704"
x2="214.51613"
y2="586.23315"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.62"
inkscape:cx="372.04724"
inkscape:cy="514.28571"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1037"
inkscape:window-height="877"
inkscape:window-x="716"
inkscape:window-y="229"
inkscape:window-maximized="0" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="arc"
style="fill:#f5f5f5;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
id="path2991"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 732.25806,499.13638 a 332.25806,332.25806 0 1 1 -664.516117,0 332.25806,332.25806 0 1 1 664.516117,0 z"
transform="translate(-35.483871,16.129032)" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5641);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="M 107.66738,341.22168 A 332.25806,332.25806 0 0 1 202.66289,231.82855 L 400,499.13638 z"
transform="translate(-35.483871,16.129036)"
sodipodi:start="3.6368718"
sodipodi:end="4.0764574" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5661);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="M 200.72631,233.2691 A 332.25806,332.25806 0 0 1 316.54347,177.53037 L 400,499.13638 z"
transform="translate(-35.483871,16.129038)"
sodipodi:start="4.0691931"
sodipodi:end="4.45849" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5669);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 470.71562,174.49086 a 332.25806,332.25806 0 0 1 125.84556,56.7666 L 400,499.13638 z"
transform="translate(-35.483867,16.129038)"
sodipodi:start="4.9268629"
sodipodi:end="5.3454209" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5685);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 674.1297,311.39102 a 332.25806,332.25806 0 0 1 40.84343,81.97511 L 400,499.13638 z"
transform="translate(-35.48387,16.129035)"
sodipodi:start="5.6826807"
sodipodi:end="5.9592099" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5677);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-6"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 594.3381,229.64034 a 332.25806,332.25806 0 0 1 51.61224,46.10435 L 400,499.13638 z"
transform="translate(-35.48387,16.129035)"
sodipodi:start="5.3371471"
sodipodi:end="5.5458146" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5699);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 714.73363,392.6556 a 332.25806,332.25806 0 0 1 17.52388,107.08247 L 400,499.13638 z"
transform="translate(-35.48387,16.129032)"
sodipodi:start="5.9569532"
sodipodi:end="6.2849962" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5779);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7-8-2"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="M 717.49385,597.08062 A 332.25806,332.25806 0 0 1 674.966,685.65479 L 400,499.13638 z"
transform="translate(-35.48387,16.12903)"
sodipodi:start="0.29922907"
sodipodi:end="0.59603562" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5797);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7-8-2-6"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 678.98875,679.5822 a 332.25806,332.25806 0 0 1 -86.27104,90.21135 L 400,499.13638 z"
transform="translate(-35.48387,16.12903)"
sodipodi:start="0.57411199"
sodipodi:end="0.95203795" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5805);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7-8-2-6-2"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="M 592.79974,769.73512 A 332.25806,332.25806 0 0 1 482.78848,820.91501 L 400,499.13638 z"
transform="translate(-35.48387,16.12903)"
sodipodi:start="0.95173485"
sodipodi:end="1.318974" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5813);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7-8-2-6-2-0"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="M 484.50864,820.46753 A 332.25806,332.25806 0 0 1 419.61229,830.8151 L 400,499.13638 z"
transform="translate(-35.48387,16.12903)"
sodipodi:start="1.3136245"
sodipodi:end="1.5117347" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5821);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7-8-2-6-2-0-9"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="M 419.21619,830.83829 A 332.25806,332.25806 0 0 1 260.85593,800.85536 L 400,499.13638 z"
transform="translate(-35.48387,16.12903)"
sodipodi:start="1.5129289"
sodipodi:end="2.0029012" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5829);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7-8-2-6-2-0-9-5"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="M 262.0576,801.40664 A 332.25806,332.25806 0 0 1 139.41706,705.27213 L 400,499.13638 z"
transform="translate(-35.483869,16.12903)"
sodipodi:start="1.9989221"
sodipodi:end="2.4723291" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient5767);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2991-7-7-7-4-7-8-2-8"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 732.25618,500.25304 a 332.25806,332.25806 0 0 1 -14.8554,97.12876 L 400,499.13638 z"
transform="translate(-35.48387,16.12903)"
sodipodi:start="0.0033608276"
sodipodi:end="0.30017785" />
<path
sodipodi:type="arc"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
id="path2991-0"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="332.25806"
sodipodi:ry="332.25806"
d="m 732.25806,499.13638 a 332.25806,332.25806 0 1 1 -664.516117,0 332.25806,332.25806 0 1 1 664.516117,0 z"
transform="translate(-35.483871,16.129036)" />
<path
sodipodi:type="arc"
style="fill:#ffffff;stroke:#000000;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;fill-opacity:1"
id="path2991-0-9"
sodipodi:cx="400"
sodipodi:cy="499.13638"
sodipodi:rx="99.999992"
sodipodi:ry="99.999992"
d="m 499.99999,499.13638 a 99.999992,99.999992 0 1 1 -199.99998,0 99.999992,99.999992 0 1 1 199.99998,0 z"
transform="translate(-35.483871,16.129036)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 21 KiB

169
icons/stop.svg Normal file
View File

@@ -0,0 +1,169 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.44.1"
version="1.0"
sodipodi:docbase="/home/hbons/Desktop"
sodipodi:docname="gtk-stop.svg"
inkscape:export-filename="/home/hbons/Desktop/process-stop.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<linearGradient
inkscape:collect="always"
id="linearGradient7810">
<stop
style="stop-color:#eeeeec;stop-opacity:1;"
offset="0"
id="stop7812" />
<stop
style="stop-color:#eeeeec;stop-opacity:0;"
offset="1"
id="stop7814" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5111">
<stop
style="stop-color:#eeeeec;stop-opacity:1;"
offset="0"
id="stop5113" />
<stop
style="stop-color:#eeeeec;stop-opacity:0;"
offset="1"
id="stop5115" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient30505">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop30507" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop30509" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient30505"
id="radialGradient30511"
cx="25.375"
cy="47.350433"
fx="25.375"
fy="47.350433"
r="17.125000"
gradientTransform="matrix(1,0,0,0.343066,0,28.49453)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5111"
id="linearGradient5117"
x1="11.018858"
y1="5.1061416"
x2="11.018858"
y2="14.598754"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7810"
id="linearGradient7816"
x1="12.272322"
y1="0.43931913"
x2="12.272322"
y2="17.85289"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7810"
id="linearGradient8777"
gradientUnits="userSpaceOnUse"
x1="12.272322"
y1="0.43931913"
x2="12.272322"
y2="17.85289" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.4"
inkscape:cx="28.151628"
inkscape:cy="8.2497073"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="24px"
height="24px"
showgrid="true"
inkscape:window-width="1274"
inkscape:window-height="972"
inkscape:window-x="289"
inkscape:window-y="132" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="arc"
style="opacity:0.4;color:black;fill:url(#radialGradient30511);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
id="path30503"
sodipodi:cx="25.375"
sodipodi:cy="43.375"
sodipodi:rx="17.125"
sodipodi:ry="5.875"
d="M 42.5 43.375 A 17.125 5.875 0 1 1 8.25,43.375 A 17.125 5.875 0 1 1 42.5 43.375 z"
transform="matrix(-0.583942,0,0,0.425533,26.81752,2.042521)"
inkscape:export-xdpi="108.67924"
inkscape:export-ydpi="108.67924" />
<path
style="fill:#ef4e29;fill-opacity:1;stroke:#a02b00;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 7.5,2.5 L 2.5,7.5 L 2.5,16.5 L 7.5,21.5 L 16.5,21.5 L 21.5,16.5 L 21.5,7.5 L 16.5,2.5 L 7.5,2.5 z "
id="rect6915"
sodipodi:nodetypes="ccccccccc"
transform="translate(-7e-6,0)" />
<path
sodipodi:type="inkscape:offset"
inkscape:radius="-1.0267857"
inkscape:original="M 7.5 2.5 L 2.5 7.5 L 2.5 16.5 L 7.5 21.5 L 16.5 21.5 L 21.5 16.5 L 21.5 7.5 L 16.5 2.5 L 7.5 2.5 z "
style="opacity:0.4;fill:url(#linearGradient7816);fill-opacity:1;stroke:#eeeeec;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path7808"
d="M 7.90625,3.53125 L 3.53125,7.90625 L 3.53125,16.09375 L 7.90625,20.46875 L 16.09375,20.46875 L 20.46875,16.09375 L 20.46875,7.90625 L 16.09375,3.53125 L 7.90625,3.53125 z "
transform="translate(-7e-6,0)" />
<path
style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:#c00;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 10.5,5.5 L 10.5,10.5 L 5.5,10.5 L 5.5,13.5 L 10.5,13.5 L 10.5,18.5 L 13.5,18.5 L 13.5,13.5 L 18.5,13.5 L 18.5,10.5 L 13.5,10.5 L 13.5,5.5 L 10.5,5.5 z "
id="rect5279"
transform="matrix(0.707107,0.707107,-0.707107,0.707107,11.99998,-4.970563)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

17
icons/strip.svg Normal file
View File

@@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 25.708 25.708" fill="#4658f5">
<path d="M23.354,7.23c0,0-1.439-1.239-2.652-0.548c-0.934,0.537-6.867,3.514-9.514,4.84L7.44,9.379
C7.847,8.658,7.915,7.824,7.696,7.02c-0.277-1.016-1.01-1.979-2.092-2.598C3.659,3.307,1.321,3.731,0.388,5.369
c-0.416,0.723-0.484,1.563-0.266,2.373c0.277,1.016,1.01,1.98,2.092,2.602c0.478,0.27,0.976,0.449,1.471,0.541v0.001
c0.004,0.001,0.008,0.001,0.012,0.003c0.039,0.006,0.084,0.015,0.127,0.02c3.086,0.459,4.664,1.33,5.43,1.944
c-0.766,0.616-2.344,1.485-5.43,1.945c-0.043,0.005-0.088,0.013-0.127,0.019c-0.004,0.002-0.008,0.002-0.012,0.004l0,0
c-0.494,0.092-0.992,0.271-1.471,0.542c-1.082,0.622-1.814,1.585-2.092,2.602c-0.219,0.808-0.15,1.648,0.266,2.375
c0.934,1.635,3.271,2.061,5.217,0.946c1.082-0.621,1.814-1.584,2.092-2.602c0.219-0.803,0.15-1.635-0.256-2.357l3.748-2.142
c2.646,1.325,8.58,4.305,9.514,4.839c1.213,0.691,2.652-0.547,2.652-0.547l-9.838-5.624L23.354,7.23z M5.843,8.487
C5.417,9.229,4.173,9.35,3.126,8.751C2.511,8.401,2.048,7.843,1.89,7.263C1.821,7.004,1.776,6.625,1.978,6.278
c0.424-0.741,1.668-0.862,2.715-0.264c0.625,0.355,1.074,0.898,1.234,1.488C5.999,7.758,6.04,8.139,5.843,8.487z M5.927,18.203
c-0.16,0.591-0.609,1.133-1.234,1.489c-1.047,0.6-2.291,0.478-2.715-0.265c-0.201-0.348-0.156-0.726-0.088-0.982
c0.158-0.582,0.621-1.14,1.236-1.492c1.047-0.598,2.291-0.477,2.717,0.266C6.04,17.569,5.999,17.947,5.927,18.203z"/>
<rect x="15.864" y="12.367" width="2.41" height="0.992"/>
<rect x="19.478" y="12.367" width="2.408" height="0.992"/>
<rect x="23.302" y="12.357" width="2.406" height="0.991"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 B

16
icons/verify-symbolic.svg Normal file
View File

@@ -0,0 +1,16 @@
<svg cursor="default" version="1.0" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<style>
.blue { fill: #4658f5 !important; }
.white { fill: #ffffff !important; }
.black { fill: #000000 !important; }
</style>
<path d="m2.6909.19079c-.68159 0-1.2645.28699-1.6502.81612-.3677.49326-.5381 1.3004-.5381 2.538 0 1.13.14349 1.9192.44842 2.4035.37667.60985.99548.94167 1.7399.94167.69056 0 1.2556-.27802 1.6502-.80715.35873-.49326.5381-1.3094.5381-2.5022 0-1.1659-.14349-1.9551-.44842-2.4483-.37667-.60984-.99548-.94167-1.7399-.94167zm0 1.0134c.32286 0 .58294.17937.7354.51119.12556.26905.1973.95961.1973 1.8385 0 .71746-.062778 1.417-.16143 1.6771-.14349.37667-.41254.58294-.77127.58294-.33183 0-.58294-.1704-.7354-.49326-.12556-.26905-.1973-.9327-.1973-1.7847 0-.75334.062778-1.4708.16143-1.7309.13452-.38564.41254-.60088.77127-.60088zm4.6725 1.0941v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405zm4.9864 0v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405zm4.9864 0v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405zm5.3003-2.1076c-.68159 0-1.2645.28699-1.6502.81612-.3677.49326-.5381 1.3004-.5381 2.538 0 1.13.14349 1.9192.44842 2.4035.37667.60985.99548.94167 1.7399.94167.69056 0 1.2556-.27802 1.6502-.80715.35873-.49326.5381-1.3094.5381-2.5022 0-1.1659-.14349-1.9551-.44842-2.4483-.37667-.60984-.99548-.94167-1.7399-.94167zm0 1.0134c.32286 0 .58294.17937.7354.51119.12556.26905.1973.95961.1973 1.8385 0 .71746-.06278 1.417-.16143 1.6771-.14349.37667-.41254.58294-.77127.58294-.33183 0-.58294-.1704-.7354-.49326-.12556-.26905-.1973-.9327-.1973-1.7847 0-.75334.06278-1.4708.16143-1.7309.13452-.38564.41254-.60088.77128-.60088z" opacity=".5"/>
<path d="m2.377 11.319v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405zm5.3003-2.1076c-.68159 0-1.2645.28699-1.6502.81612-.3677.49326-.5381 1.3004-.5381 2.538 0 1.13.14349 1.9192.44842 2.4035.37667.60984.99548.94167 1.7399.94167.69056 0 1.2556-.27802 1.6502-.80715.35873-.49326.5381-1.3094.5381-2.5022 0-1.1659-.14349-1.9551-.44842-2.4483-.37667-.60984-.99548-.94167-1.7399-.94167zm0 1.0134c.32286 0 .58294.17937.7354.51119.12556.26905.1973.95961.1973 1.8385 0 .71746-.062778 1.417-.16143 1.6771-.14349.37667-.41254.58294-.77127.58294-.33183 0-.58294-.1704-.7354-.49326-.12556-.26905-.1973-.9327-.1973-1.7847 0-.75334.062778-1.4708.16143-1.7309.13452-.38564.41254-.60088.77127-.60088zm4.9864-1.0134c-.68159 0-1.2645.28699-1.6502.81612-.3677.49326-.5381 1.3004-.5381 2.538 0 1.13.14349 1.9192.44842 2.4035.37667.60984.99548.94167 1.7399.94167.69056 0 1.2556-.27802 1.6502-.80715.35873-.49326.5381-1.3094.5381-2.5022 0-1.1659-.14349-1.9551-.44842-2.4483-.37667-.60984-.99548-.94167-1.7399-.94167zm0 1.0134c.32286 0 .58294.17937.7354.51119.12556.26905.1973.95961.1973 1.8385 0 .71746-.06278 1.417-.16143 1.6771-.14349.37667-.41254.58294-.77128.58294-.33183 0-.58294-.1704-.7354-.49326-.12556-.26905-.1973-.9327-.1973-1.7847 0-.75334.06278-1.4708.16143-1.7309.13452-.38564.41254-.60088.77128-.60088zm4.6725 1.0941v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405zm4.9864 0v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405z"/>
<path d="m2.6909 18.233c-.68159 0-1.2645.28699-1.6502.81612-.3677.49326-.5381 1.3004-.5381 2.538 0 1.13.14349 1.9192.44842 2.4035.37667.60984.99548.94167 1.7399.94167.69056 0 1.2556-.27802 1.6502-.80715.35873-.49326.5381-1.3094.5381-2.5022 0-1.1659-.14349-1.9551-.44842-2.4483-.37667-.60984-.99548-.94167-1.7399-.94167zm0 1.0134c.32286 0 .58294.17937.7354.51119.12556.26905.1973.95961.1973 1.8385 0 .71746-.062778 1.417-.16143 1.6771-.14349.37667-.41254.58294-.77127.58294-.33183 0-.58294-.1704-.7354-.49326-.12556-.26905-.1973-.9327-.1973-1.7847 0-.75334.062778-1.4708.16143-1.7309.13452-.38564.41254-.60088.77127-.60088zm4.9864-1.0134c-.68159 0-1.2645.28699-1.6502.81612-.3677.49326-.5381 1.3004-.5381 2.538 0 1.13.14349 1.9192.44842 2.4035.37667.60984.99548.94167 1.7399.94167.69056 0 1.2556-.27802 1.6502-.80715.35873-.49326.5381-1.3094.5381-2.5022 0-1.1659-.14349-1.9551-.44842-2.4483-.37667-.60984-.99548-.94167-1.7399-.94167zm0 1.0134c.32286 0 .58294.17937.7354.51119.12556.26905.1973.95961.1973 1.8385 0 .71746-.062778 1.417-.16143 1.6771-.14349.37667-.41254.58294-.77127.58294-.33183 0-.58294-.1704-.7354-.49326-.12556-.26905-.1973-.9327-.1973-1.7847 0-.75334.062778-1.4708.16143-1.7309.13452-.38564.41254-.60088.77127-.60088zm4.6725 1.0941v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405zm4.9864 0v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405zm4.9864 0v4.3855h1.2556v-6.3585h-.83405c-.1973.75334-.85199 1.139-1.9461 1.139v.83405z" opacity=".5"/>
<path d="m36 12-24 26c-.27.29-.26.74.026 1 .29.27.74.26 1-.026l24-26c.27-.29.26-.74-.026-1-.28-.26-.73-.27-1 .026z"/>
<g transform="matrix(.023438 0 0 .023438 23.333 22.866)">
<path d="m407.84 27.68c244.16-58.56 512.8 101.28 578.88 343.04 77.6 240-62.56 521.12-300 604.64-225.12 90.88-504.16-16-612.8-232.32-114.08-206.56-51.36-488 139.84-626.4 57.12-43.52 124-73.6 194.08-88.96" class="black"/>
<path d="m113.76 275.84c83.04-143.36 248.32-234.56 414.08-226.24 112.96 4.16 212 108.8 208.32 222.24 2.56 83.36-48.32 162.56-121.44 200.48-60.48 34.24-134.72 13.76-196.96 42.88-119.36 43.84-190.72 187.52-150.72 308.8 12.16 45.44 40.64 83.52 68.8 120.16-96.16-47.36-183.68-118.08-232.96-215.04-75.36-139.36-71.36-317.6 10.88-453.28m368.32-99.52c-75.84 19.36-95.04 131.52-30.72 175.52 56 46.4 152.32 8.32 159.52-64.48 14.08-70.4-61.28-134.88-128.8-111.04M483.2 689.92c48.8-24.16 110.24 24.32 94.72 77.44-8.16 50.56-79.84 70.4-113.76 32.8-33.6-30.56-22.56-92.32 19.04-110.24" class="white"/>
<path d="m688.96 80.32c96.64 47.84 184.48 119.04 233.28 217.12 74.72 139.68 69.44 317.6-13.28 452.8-85.92 146.56-258.24 237.44-427.84 223.2-68-6.08-127.84-51.84-162.4-109.12-56.8-91.2-31.2-219.52 53.12-284.96 46.72-42.88 111.2-50.72 171.84-53.92 120-8.8 219.2-116.96 224.32-236.16 7.2-78.08-29.76-151.04-79.04-208.96m-219.84 580.8c-70.08 29.28-76.48 138.4-10.56 175.84 62.4 43.04 158.72-8.96 153.28-85.6 3.68-71.04-80.32-122.24-142.72-90.24M483.36 210.08c48.48-24 109.76 24 94.56 76.8-7.68 50.56-78.72 70.72-113.12 33.92-34.24-30.4-23.52-92.96 18.56-110.72" class="blue"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -1,27 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
6 8595 9495 15885 16785
5 1 0 20 0 7 50 0 -1 0.000 0 1 0 0 12240.000 14871.000 12240 13140 10509 14871 12240 16602
5 1 0 20 0 7 50 0 -1 0.000 0 0 0 0 12240.000 11409.000 12240 9678 13971 11409 12240 13140
1 3 0 20 0 7 50 0 -1 0.000 1 0.0000 12240 14871 500 500 12240 14871 12740 14871
1 3 0 20 0 7 50 0 -1 0.000 1 0.0000 12240 13140 3457 3457 12240 13140 15697 13140
1 3 0 20 0 7 50 0 -1 0.000 1 0.0000 12240 11409 500 500 12240 11409 12740 11409
-6
6 1665 2520 7200 9270
6 1665 2520 7200 9270
4 0 0 50 -1 18 160 0.0000 4 1695 6750 1710 9270 00111\001
4 0 0 50 -1 18 160 0.0000 4 1695 6750 1665 4275 01110\001
4 0 0 50 -1 18 160 0.0000 4 1695 6750 1665 6705 10011\001
-6
-6
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1350 2250 16200 2250 16200 17100 1350 17100 1350 2250
2 1 0 30 0 7 50 -1 -1 0.000 0 1 -1 0 0 2
12600 5805 4905 13905

Binary file not shown.

Before

Width:  |  Height:  |  Size: 969 B

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

26
macinst/Info.plist Normal file
View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key></key>
<string></string>
<key>CFBundleExecutable</key>
<string>dvdisaster</string>
<key>CFBundleIconFile</key>
<string>dvdisaster</string>
<key>CFBundleIdentifier</key>
<string>com.dvdisaster.dvdisaster</string>
<key>CFBundleName</key>
<string>dvdisaster</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.79.10</string>
<key>CFBundleSignature</key>
<string>CGCG</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>© 2004-2009 Carsten Gnörlich et al</string>
</dict>
</plist>

BIN
macinst/dvdisaster.icns Normal file

Binary file not shown.

View File

@@ -1,667 +0,0 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2017 Carsten Gnoerlich.
* Copyright (C) 2019-2021 The dvdisaster development team.
*
* Email: support@dvdisaster.org
*
* This file is part of dvdisaster.
*
* dvdisaster is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* dvdisaster is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with dvdisaster. If not, see <http://www.gnu.org/licenses/>.
*/
/*** src type: some GUI code ***/
#include "dvdisaster.h"
/***
*** GUI functions which are cli-only safe for convenience.
***/
/*
* Label convenience functions.
* Sets the label text from another thread.
*/
#ifdef WITH_GUI_YES
typedef struct
{ GtkLabel *label;
char *text;
} label_info;
static gboolean label_idle_func(gpointer data)
{ label_info *li = (label_info*)data;
gtk_label_set_markup(li->label, li->text);
g_free(li->text);
g_free(li);
return FALSE;
}
void GuiSetLabelText(GtkWidget *widget, char *format, ...)
{ label_info *li;
va_list argp;
if(!Closure->guiMode)
return;
li = g_malloc(sizeof(label_info));
li->label = GTK_LABEL(widget);
va_start(argp, format);
if(format)
{ char *tmp = g_strdup_vprintf(format, argp);
if(!tmp) tmp=g_strdup_printf("GuiSetLabelText(%s) failed",format);
li->text = g_locale_to_utf8(tmp, -1, NULL, NULL, NULL);
g_free(tmp);
}
else li->text = g_locale_to_utf8("(null)", -1, NULL, NULL, NULL);
va_end(argp);
g_idle_add(label_idle_func, li);
}
#endif
/*
* Progress bar convenience function.
* Percentage is given as a multiple of 0.1 percent.
*/
#ifdef WITH_GUI_YES
typedef struct
{ GtkWidget *pbar;
int percent;
int max;
} progress_info;
static gboolean progress_idle_func(gpointer data)
{ progress_info *pi = (progress_info*)data;
gdouble val = (gdouble)pi->percent / (gdouble)pi->max;
char text[20];
switch(pi->max)
{ case 100: g_sprintf(text, "%3d%%",pi->percent); break;
case 1000: g_sprintf(text, "%3d.%1d%%",pi->percent/10,pi->percent%10); break;
}
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pi->pbar), val);
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pi->pbar), text);
g_free(pi);
return FALSE;
}
void GuiSetProgress(GtkWidget *pbar, int percent, int max)
{ progress_info *pi;
if(!Closure->guiMode) return;
pi = g_malloc(sizeof(progress_info));
pi->pbar = pbar;
pi->percent = percent;
pi->max = max;
g_idle_add(progress_idle_func, pi);
}
#endif
/*
* Switch a notebook to another page and set the text in a label.
* Used in some footlines in the GUI.
* Does nothing in CLI mode to save us from lots of #ifdef WITH_GUI
*/
#ifdef WITH_GUI_YES
typedef struct
{ GtkWidget *notebook;
int newPage;
GtkWidget *label;
char *newText;
} footline_info;
static gboolean footline_idle_func(gpointer data)
{ footline_info *fi = (footline_info*)data;
if(fi->label)
gtk_label_set_markup(GTK_LABEL(fi->label), fi->newText);
gtk_notebook_set_current_page(GTK_NOTEBOOK(fi->notebook), fi->newPage);
if(fi->newText)
g_free(fi->newText);
g_free(fi);
return FALSE;
}
void GuiSwitchAndSetFootline(GtkWidget *notebook, int page, GtkWidget *label, char *format, ...)
{ va_list argp;
char *tmp;
footline_info *fi;
int len;
if(!Closure->guiMode) return;
fi = g_malloc0(sizeof(footline_info));
fi->notebook = notebook;
fi->newPage = page;
fi->label = label;
if(label)
{ va_start(argp, format);
tmp = g_strdup_vprintf(format, argp);
len = strlen(tmp);
if(tmp[len-1] == '\n') tmp[len-1]=0;
fi->newText = g_locale_to_utf8(tmp, -1, NULL, NULL, NULL);
g_free(tmp);
va_end(argp);
}
g_idle_add(footline_idle_func, fi);
}
/*
* CLI mode and GUI mode behave differently wrt. to the worker thread.
* In CLI mode, the worker thread is the main thread and must not be terminated
* when the worker task is finished. However in GUI mode the worker is a separate
* thread which must exit after the assigned work is done.
*/
void GuiExitWorkerThread()
{
if(Closure->guiMode)
g_thread_exit(0);
}
#endif
/*
* A wrapper around GuiModalDialog() to create a logged warning.
* Note that in CLI mode the answer is always "yes",
* so warnings will be printed but never abort CLI mode.
*/
#ifdef WITH_GUI_YES
static int vmodal_dialog(GtkMessageType, GtkButtonsType,
void(*)(GtkDialog*), char*, va_list);
#endif
int ModalWarning(GtkMessageType mt, GtkButtonsType bt,
void(*button_fn)(GtkDialog*), char *msg, ...)
{ va_list argp;
int result = 1;
va_start(argp, msg);
vLogWarning(msg, argp);
va_end(argp);
#ifdef WITH_GUI_YES
if(Closure->guiMode)
{ va_start(argp, msg);
result = vmodal_dialog(mt, bt, button_fn, msg, argp);
va_end(argp);
}
#endif
return result;
}
/*
* Safety requesters before deleting something.
*/
#ifdef WITH_GUI_YES
static void insert_button(GtkDialog*);
int GuiConfirmEccDeletion(char *file)
{ int answer;
if(!Closure->guiMode) /* Always delete it in command line mode */
return TRUE;
if(!Closure->confirmDeletion) /* I told you so... */
return TRUE;
answer = GuiModalDialog(GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
insert_button,
_("The error correction file is already present:\n\n"
"%s\n\n"
"Overwrite it?"),
file);
return answer == GTK_RESPONSE_OK;
}
#endif
/*** remaining GUI functions */
#ifdef WITH_GUI_YES
/*
* Spawning of idle functions.
* Idle functions are required to perform actions (like opening
* a dialogue) from a sub thread.
* However idle functions must not be spawned from the main thread
* as it would block infinitely; in that case we must run the idle
* function directly.
*/
static void call_idle_func(gboolean (*idle_func)(gpointer), gpointer data)
{
if(Closure->mainThread == g_thread_self())
{ idle_func(data);
}
else
{ g_idle_add(idle_func, data);
}
}
/***
*** Graphical user interface convenience
***/
/*
* Show the given widget
*/
static gboolean show_idle_func(gpointer data)
{
gtk_widget_show(GTK_WIDGET(data));
return FALSE;
}
void GuiShowWidget(GtkWidget *widget)
{
if(Closure->guiMode)
g_idle_add(show_idle_func, (gpointer)widget);
}
/*
* Activation / Deactivation of the action buttons
*/
static gboolean allow_actions_idle_func(gpointer data)
{ gboolean s = (data != NULL);
/* Disable/Enable parts of the menu */
gtk_widget_set_sensitive(Closure->fileMenuImage, s);
gtk_widget_set_sensitive(Closure->fileMenuEcc, s);
gtk_widget_set_sensitive(Closure->toolMenuAnchor, s);
/* Disable/Enable toolbar and sidebar buttons */
if(Closure->deviceNodes->len)
{ gtk_widget_set_sensitive(Closure->readButton, s);
gtk_widget_set_sensitive(Closure->scanButton, s);
}
gtk_widget_set_sensitive(Closure->createButton, s);
gtk_widget_set_sensitive(Closure->fixButton, s);
gtk_widget_set_sensitive(Closure->testButton, s);
gtk_widget_set_sensitive(Closure->prefsButton, s);
if(!s && Closure->prefsWindow)
{ GuiHidePreferences();
}
Closure->stopActions = FALSE;
return FALSE;
}
void GuiAllowActions(gboolean s)
{
g_idle_add(allow_actions_idle_func, GINT_TO_POINTER(s));
}
/*
* Dispatch a non-modal message dialog
*/
typedef struct
{ char *msg;
GtkMessageType type;
GtkWindow *window;
} message_info;
static gboolean message_idle_func(gpointer data)
{ message_info *mi = (message_info*)data;
GtkWidget *dialog;
dialog = gtk_message_dialog_new_with_markup(mi->window,
GTK_DIALOG_DESTROY_WITH_PARENT,
mi->type,
GTK_BUTTONS_CLOSE,
mi->msg, NULL);
gtk_label_set_line_wrap(GTK_LABEL(((struct _GtkMessageDialog*)dialog)->label), FALSE);
g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
gtk_widget_show(dialog);
g_free(mi->msg);
g_free(mi);
return FALSE;
}
void GuiShowMessage(GtkWindow *parent, char *msg, GtkMessageType type)
{ message_info *mi;
if(!Closure->guiMode) return;
mi = g_malloc(sizeof(message_info));
mi->msg = g_strdup(msg);
mi->type = type;
mi->window = parent;
if(Closure->mainThread == g_thread_self())
message_idle_func(mi);
else g_idle_add(message_idle_func, mi);
}
/*
* Creates a message from the main thread
*/
GtkWidget* GuiCreateMessage(char *format, GtkMessageType type, ...)
{ GtkWidget *dialog;
va_list argp;
char *text,*utf8;
if(!Closure->guiMode)
return NULL;
va_start(argp, type);
text = g_strdup_vprintf(format, argp);
va_end(argp);
utf8 = g_locale_to_utf8(text, -1, NULL, NULL, NULL);
dialog = gtk_message_dialog_new(Closure->window,
GTK_DIALOG_DESTROY_WITH_PARENT,
type,
GTK_BUTTONS_CLOSE,
utf8, NULL);
gtk_label_set_line_wrap(GTK_LABEL(((struct _GtkMessageDialog*)dialog)->label), FALSE);
g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
gtk_widget_show(dialog);
g_free(text);
g_free(utf8);
return dialog;
}
/*
* Perform a modal dialog.
* Note that the thread running the dialog is different
* from the one blocking/waiting for the response!
*/
typedef struct
{ GMutex *mutex;
GCond *cond;
char *msg;
int ret;
GtkMessageType message_type;
GtkButtonsType button_type;
void (*button_fn)(GtkDialog*);
} modal_info;
static gboolean modal_idle_func(gpointer data)
{ modal_info *mi = (modal_info*)data;
GtkWidget *dialog;
int response;
dialog = gtk_message_dialog_new(Closure->window,
GTK_DIALOG_DESTROY_WITH_PARENT,
mi->message_type,
mi->button_type,
"%s", mi->msg);
gtk_label_set_line_wrap(GTK_LABEL(((struct _GtkMessageDialog*)dialog)->label), FALSE);
if(mi->button_fn)
mi->button_fn(GTK_DIALOG(dialog));
else GuiReverseCancelOK(GTK_DIALOG(dialog));
response = gtk_dialog_run(GTK_DIALOG(dialog));
g_mutex_lock(mi->mutex);
if(mi->button_fn)
mi->ret = response;
else switch(response)
{ case GTK_RESPONSE_OK:
mi->ret = 1;
break;
default:
mi->ret = 0;
break;
}
g_cond_signal(mi->cond);
g_mutex_unlock(mi->mutex);
gtk_widget_destroy(dialog);
return FALSE;
}
static int vmodal_dialog(GtkMessageType mt, GtkButtonsType bt,
void(*button_fn)(GtkDialog*), char *msg, va_list argp)
{ modal_info *mi = g_malloc(sizeof(modal_info));
char *tmp;
int idx,ret;
mi->message_type = mt;
mi->button_type = bt;
mi->button_fn = button_fn;
mi->mutex = g_malloc(sizeof(GMutex)); g_mutex_init(mi->mutex);
mi->cond = g_malloc(sizeof(GCond)); g_cond_init(mi->cond);
tmp = g_strdup_vprintf(msg, argp);
idx = strlen(tmp); /* Remove trailing newline */
if(tmp[idx-1] == '\n')
tmp[idx-1] = 0;
mi->msg = g_locale_to_utf8(tmp, -1, NULL, NULL, NULL);
g_free(tmp);
mi->ret = -1;
call_idle_func(modal_idle_func, mi);
g_mutex_lock(mi->mutex);
while(mi->ret == -1)
g_cond_wait(mi->cond, mi->mutex);
ret = mi->ret;
g_mutex_unlock(mi->mutex);
g_free(mi->msg);
g_mutex_clear(mi->mutex);
g_free(mi->mutex);
g_cond_clear(mi->cond);
g_free(mi->cond);
g_free(mi);
return ret;
}
int GuiModalDialog(GtkMessageType mt, GtkButtonsType bt,
void(*button_fn)(GtkDialog*), char *msg, ...)
{ va_list argp;
int result;
if(!Closure->guiMode)
Stop("GuiModalDialog() called with Closure->guiMode == False");
va_start(argp, msg);
result = vmodal_dialog(mt, bt, button_fn, msg, argp);
va_end(argp);
return result;
}
/*
* Set the text in the pango layout and retrieve its extents.
*/
void GuiSetText(PangoLayout *layout, char *text, int *w, int *h)
{ PangoRectangle rect;
char *t;
if(!Closure->guiMode)
return;
t = g_locale_to_utf8(text, -1, NULL, NULL, NULL);
pango_layout_set_text(layout, t, -1);
pango_layout_get_pixel_extents(layout, NULL, &rect);
g_free(t);
*w = rect.width;
*h = rect.height;
}
/*
* Rearrange buttons to OK Cancel order
* in file dialogs
*
* gtk_dialog_set_alternative_button_order()
* has been introduced since gtk+2.6,
* but does not seem to work correctly.
*/
void GuiReverseCancelOK(GtkDialog *dialog)
{ GtkWidget *box, *button ;
if(!Closure->guiMode || !Closure->reverseCancelOK)
return;
box = dialog->action_area;
button = ((GtkBoxChild*)(g_list_first(GTK_BOX(box)->children)->data))->widget;
gtk_box_reorder_child(GTK_BOX(box), button, 1);
#if 0
gtk_dialog_set_alternative_button_order(GTK_DIALOG(dialog),
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
#endif
}
/*
* Get the width of a label text
*/
int GuiGetLabelWidth(GtkLabel *label, char *format, ...)
{ PangoLayout *layout;
PangoRectangle rect;
va_list argp;
char *text;
if(!Closure->guiMode)
return 0;
va_start(argp, format);
text = g_strdup_vprintf(format, argp);
va_end(argp);
layout = gtk_label_get_layout(label);
pango_layout_set_text(layout, text, -1);
pango_layout_get_pixel_extents(layout, NULL, &rect);
g_free(text);
return rect.width;
}
/*
* Lock the size of a label to that of the given sample text.
*/
void GuiLockLabelSize(GtkWidget *wid, char *format, ...)
{ PangoLayout *layout;
PangoRectangle rect;
va_list argp;
char *text;
if(!Closure->guiMode)
return;
va_start(argp, format);
text = g_strdup_vprintf(format, argp);
va_end(argp);
layout = gtk_label_get_layout(GTK_LABEL(wid));
pango_layout_set_text(layout, text, -1);
pango_layout_get_pixel_extents(layout, NULL, &rect);
gtk_widget_set_size_request(wid, rect.width, rect.height);
gtk_misc_set_alignment(GTK_MISC(wid), 0.0, 0.0);
g_free(text);
}
/***
*** Safety requesters before overwriting stuff
***/
static void dont_ask_again_cb(GtkWidget *widget, gpointer data)
{ int state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
Closure->confirmDeletion = !state;
GuiUpdatePrefsConfirmDeletion();
}
static void insert_button(GtkDialog *dialog)
{ GtkWidget *check,*align;
align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), align, FALSE, FALSE, 0);
check = gtk_check_button_new_with_label(_utf("Do not ask again"));
gtk_container_add(GTK_CONTAINER(align), check);
gtk_container_set_border_width(GTK_CONTAINER(align), 10);
g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(dont_ask_again_cb), NULL);
gtk_widget_show(align);
gtk_widget_show(check);
GuiReverseCancelOK(GTK_DIALOG(dialog));
}
int GuiConfirmImageDeletion(char *file)
{ int answer;
if(!Closure->guiMode) /* Always delete it in command line mode */
return TRUE;
if(!Closure->confirmDeletion) /* I told you so... */
return TRUE;
answer = GuiModalDialog(GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
insert_button,
_("Image file already exists and does not match the medium:\n\n"
"%s\n\n"
"The existing image file will be deleted."),
file);
return answer == GTK_RESPONSE_OK;
}
#endif

View File

@@ -19,9 +19,7 @@ fi
# directory for temporary files; e.g. to keep them away from SSDs
TMPDIR=/dev/shm
if ! test -d $TMPDIR; then
echo "$TMPDIR does not exist."
echo "Please create it manually, or edit common.bash"
exit 0
TMPDIR=/var/tmp
fi
LOGDIR="/dev/shm"
@@ -33,7 +31,14 @@ DIFFLOG="$LOGDIR/difflog.txt"
NEWLOG="$LOGDIR/newlog.txt"
TMPLOG="$LOGDIR/tmplog.txt"
MD5SUM=md5sum
UNAME="$(uname -s)"
if [ "$UNAME" = Darwin ]; then
MD5SUM="md5 -r"
else
MD5SUM=md5sum
fi
if ! $MD5SUM $RNDSEQ >/dev/null 2>&1; then
MD5SUM=../simple-md5sum
fi
@@ -115,7 +120,7 @@ function file_exists()
function try()
{ local doit=$(grep "${CODEC_PREFIX}_$2 " $CONFIGFILE)
if echo "$OS" | grep -q Windows && test -e "$CONFIGFILE_WIN" && grep -q "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN"; then
if [[ $OS =~ Windows ]] && test -e "$CONFIGFILE_WIN" && grep -q "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN"; then
doit=$(grep "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN")
fi
@@ -221,7 +226,12 @@ function run_regtest()
testeccopt="-e ${testecc}"
fi
REFLOG=${DATABASE}/${CODEC_PREFIX}_${testsymbol}
REFLOG="${DATABASE}/${CODEC_PREFIX}_${testsymbol}"
if [ "$UNAME" = "Darwin" ] && [ -f "$REFLOG.darwin" ]; then
REFLOG="$REFLOG.darwin"
elif [[ $OS =~ Windows ]] && [ -f "$REFLOG.win" ]; then
REFLOG="$REFLOG.win"
fi
if test "$gui_mode" == "false"; then
rm -f $NEWLOG
@@ -253,16 +263,14 @@ function run_regtest()
filter=cat
echo "$options" | grep -qw SORTED && filter=sort
# for Windows
if [[ $testsymbol =~ _no_device$ ]]; then
sed -i -re "s=device $NON_EXISTENT_DEVICE\.=/dev/sdz: No such file or directory=" $NEWLOG
fi
# for Windows, just remove any path we find:
sed -i -re "s=[A-Z]:/[A-Za-z0-9_/-]+/==g" $NEWLOG
# remove all paths to get reproducible output:
sed -i -re "s=$TMPDIR/*==g;s=$ISODIR/*==g" $NEWLOG
sed -i -re "s=$TMPDIR/*==g;s=$ISODIR/*==g;s=regtest/==g" $NEWLOG
# remote tmp path of github actions
sed -i -re "s=[-A-Za-z0-9_~]+/AppData/Local/Temp/==g" $NEWLOG
if ! diff <(tail -n +3 $REFLOG | $filter) <(cat $NEWLOG | $filter) >${DIFFLOG}; then
if [ "$REGTEST_NO_UTF8" = 1 ]; then

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open /dev/sdz ().

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open device V:.

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open sdz ().

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open /dev/sdz ().

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open device V:.

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open sdz ().

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open /dev/sdz ().

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open device V:.

View File

@@ -0,0 +1,12 @@
ignore
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
*
* dvdisaster - can not continue:
*
Could not open sdz ().

View File

@@ -1,522 +0,0 @@
ca01afa400e2244fc4797cae542888d1
ignore
This software comes with ABSOLUTELY NO WARRANTY. This
is free software and you are welcome to redistribute it
under the conditions of the GNU GENERAL PUBLIC LICENSE.
See the file "COPYING" for further information.
# *** OpenImageFromDevice(sim-cd) ***
# InquireDevice returned: Simulated CD drive 1.00
Device: sim-cd, Simulated CD drive 1.00
# *** query_type(Simulated CD drive 1.00, 0) ***
# *** get_configuration(Simulated CD drive 1.00) ***
# 8 data len, 9 current
-> profile 9: CD-R
# trying READ DISC INFORMATION for size
# size returned is 32
# trying READ DISC INFORMATION for real info
0000: 00 20 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 . ...... ........
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
# status is 1e, disc type 0
#CD: starting media probe
#CD: querying size of READ TOC/PMA/ATIP (for TOC)
#CD: size returned is 12
#CD: querying real READ TOC/PMA/ATIP (for TOC)
0000: 00 0a 00 00 00 14 00 00 00 00 00 00 ........ ....
#CD: control is 0x14
#CD: querying size of READ TOC/PMA/ATIP (for full TOC)
# Warning: Realigning length from 26 to 24
#CD: size returned is 24
#CD: querying real READ TOC/PMA/ATIP (for full TOC)
0000: 00 18 00 01 00 00 00 a0 00 00 00 00 00 00 00 00 ........ ........
0010: 00 00 00 00 00 00 00 00 ........
#CD: 1 sessions
#CD: CD medium detected, type: CD-R mode 1
# query_type() returned.
# deciding reading strategy...
Using READ CD.
GetImageFingerprint(16): read & cached
ExamineUDF(Device: Simulated CD drive 1.00)
Examining the ISO file system...
Sector 16:
Volume descriptor type = 1
Volume descriptor version = 1
Standard identifier = CD001
-> primary volume descriptor:
System identifier : | |
Volume identifier : |RANDOM IMAGE |
Volume space size : 21000 sectors
Volume set size : 1
Volume sequence size : 1
Logical block size : 2048
Path table size : 10 bytes
L-Path table location : 19
Opt L-Path table location : 0
M-Path table location : 20
Opt M-Path table location : 0
Volume creation date/time : 16-07-2006 10:35:46.23
Volume modification d/t : 16-07-2006 10:35:46.23
Volume expiration d/t : 16-07-2106 10:35:46.23
Volume effective d/t : 16-07-2006 10:35:46.23
File structure version : 1
Sector 17:
Volume descriptor type = 2
Volume descriptor version = 1
Standard identifier = CD001
-> supplementary volume descriptor: *skipped*
Sector 18:
Volume descriptor type = 255
Volume descriptor version = 1
Standard identifier = CD001
-> volume descriptor set terminator;
end of ISO file system parsing.
Examining the UDF file system...
not yet implemented.
# *** read_capacity(Simulated CD drive 1.00) ***
-> 24989
ExamineECC() started
...trying RS01
...trying RS02
RS02Recognize: medium sim-cd
try_sector: trying sector 21000
try_sector: no cookie, skipping current modulo
try_sector: trying sector 20850
try_sector: no cookie, skipping current modulo
RS02Recognize: quick RS02 search, attempting up to 3 sector reads max
Medium rewriteable: FALSE
FindHeaderInMedium: Trying modulo 4611686018427387904
FindHeaderInMedium: Trying modulo 2305843009213693952
FindHeaderInMedium: Trying modulo 1152921504606846976
FindHeaderInMedium: Trying modulo 576460752303423488
FindHeaderInMedium: Trying modulo 288230376151711744
FindHeaderInMedium: Trying modulo 144115188075855872
FindHeaderInMedium: Trying modulo 72057594037927936
FindHeaderInMedium: Trying modulo 36028797018963968
FindHeaderInMedium: Trying modulo 18014398509481984
FindHeaderInMedium: Trying modulo 9007199254740992
FindHeaderInMedium: Trying modulo 4503599627370496
FindHeaderInMedium: Trying modulo 2251799813685248
FindHeaderInMedium: Trying modulo 1125899906842624
FindHeaderInMedium: Trying modulo 562949953421312
FindHeaderInMedium: Trying modulo 281474976710656
FindHeaderInMedium: Trying modulo 140737488355328
FindHeaderInMedium: Trying modulo 70368744177664
FindHeaderInMedium: Trying modulo 35184372088832
FindHeaderInMedium: Trying modulo 17592186044416
FindHeaderInMedium: Trying modulo 8796093022208
FindHeaderInMedium: Trying modulo 4398046511104
FindHeaderInMedium: Trying modulo 2199023255552
FindHeaderInMedium: Trying modulo 1099511627776
FindHeaderInMedium: Trying modulo 549755813888
FindHeaderInMedium: Trying modulo 274877906944
FindHeaderInMedium: Trying modulo 137438953472
FindHeaderInMedium: Trying modulo 68719476736
FindHeaderInMedium: Trying modulo 34359738368
FindHeaderInMedium: Trying modulo 17179869184
FindHeaderInMedium: Trying modulo 8589934592
FindHeaderInMedium: Trying modulo 4294967296
FindHeaderInMedium: Trying modulo 2147483648
FindHeaderInMedium: Trying modulo 1073741824
FindHeaderInMedium: Trying modulo 536870912
FindHeaderInMedium: Trying modulo 268435456
FindHeaderInMedium: Trying modulo 134217728
FindHeaderInMedium: Trying modulo 67108864
FindHeaderInMedium: Trying modulo 33554432
FindHeaderInMedium: Trying modulo 16777216
FindHeaderInMedium: Trying modulo 8388608
FindHeaderInMedium: Trying modulo 4194304
FindHeaderInMedium: Trying modulo 2097152
FindHeaderInMedium: Trying modulo 1048576
FindHeaderInMedium: Trying modulo 524288
FindHeaderInMedium: Trying modulo 262144
FindHeaderInMedium: Trying modulo 131072
FindHeaderInMedium: Trying modulo 65536
FindHeaderInMedium: Trying modulo 32768
FindHeaderInMedium: Trying modulo 16384
try_sector: trying sector 16384
try_sector: no cookie, skipping current modulo
FindHeaderInMedium: Trying modulo 8192
try_sector: trying sector 24576
try_sector: no cookie, skipping current modulo
FindHeaderInMedium: Trying modulo 4096
Sector 24576 cached; skipping modulo
FindHeaderInMedium: Trying modulo 2048
Sector 24576 cached; skipping modulo
FindHeaderInMedium: Trying modulo 1024
Sector 24576 cached; skipping modulo
FindHeaderInMedium: Trying modulo 512
Sector 24576 cached; skipping modulo
FindHeaderInMedium: Trying modulo 256
try_sector: trying sector 24832
try_sector: no cookie, skipping current modulo
...trying RS03
RS03RecognizeImage: medium sim-cd
FindRS03HeaderInImage: medium sim-cd
RS03RecognizeImage: No EH, entering exhaustive search
Warning: image size set to 25000 for debugging!
.. trying layer size 98
Scanning layers for signatures.
- layer slice 0
RS03: try number = 1, reading sector 8232
RS03: try number = 2, reading sector 8330
RS03: try number = 3, reading sector 8428
RS03: try number = 4, reading sector 8526
RS03: try number = 5, reading sector 8624
RS03: try number = 6, reading sector 8722
RS03: try number = 7, reading sector 8820
RS03: try number = 8, reading sector 8918
RS03: try number = 9, reading sector 9016
RS03: try number = 10, reading sector 9114
RS03: try number = 11, reading sector 9212
RS03: try number = 12, reading sector 9310
RS03: try number = 13, reading sector 9408
RS03: try number = 14, reading sector 9506
RS03: try number = 15, reading sector 9604
RS03: try number = 16, reading sector 9702
RS03: try number = 17, reading sector 9800
RS03: try number = 18, reading sector 9898
RS03: try number = 19, reading sector 9996
RS03: try number = 20, reading sector 10094
RS03: try number = 21, reading sector 10192
RS03: try number = 22, reading sector 10290
RS03: try number = 23, reading sector 10388
RS03: try number = 24, reading sector 10486
RS03: try number = 25, reading sector 10584
RS03: try number = 26, reading sector 10682
RS03: try number = 27, reading sector 10780
RS03: try number = 28, reading sector 10878
RS03: try number = 29, reading sector 10976
RS03: try number = 30, reading sector 11074
RS03: try number = 31, reading sector 11172
RS03: try number = 32, reading sector 11270
RS03: try number = 33, reading sector 11368
RS03: try number = 34, reading sector 11466
RS03: try number = 35, reading sector 11564
RS03: try number = 36, reading sector 11662
RS03: try number = 37, reading sector 11760
RS03: try number = 38, reading sector 11858
RS03: try number = 39, reading sector 11956
RS03: try number = 40, reading sector 12054
RS03: try number = 41, reading sector 12152
RS03: try number = 42, reading sector 12250
RS03: try number = 43, reading sector 12348
RS03: try number = 44, reading sector 12446
RS03: try number = 45, reading sector 12544
RS03: try number = 46, reading sector 12642
RS03: try number = 47, reading sector 12740
RS03: try number = 48, reading sector 12838
RS03: try number = 49, reading sector 12936
RS03: try number = 50, reading sector 13034
RS03: try number = 51, reading sector 13132
RS03: try number = 52, reading sector 13230
RS03: try number = 53, reading sector 13328
RS03: try number = 54, reading sector 13426
RS03: try number = 55, reading sector 13524
RS03: try number = 56, reading sector 13622
RS03: try number = 57, reading sector 13720
RS03: try number = 58, reading sector 13818
RS03: try number = 59, reading sector 13916
RS03: try number = 60, reading sector 14014
RS03: try number = 61, reading sector 14112
RS03: try number = 62, reading sector 14210
RS03: try number = 63, reading sector 14308
RS03: try number = 64, reading sector 14406
RS03: try number = 65, reading sector 14504
RS03: try number = 66, reading sector 14602
RS03: try number = 67, reading sector 14700
RS03: try number = 68, reading sector 14798
RS03: try number = 69, reading sector 14896
RS03: try number = 70, reading sector 14994
RS03: try number = 71, reading sector 15092
RS03: try number = 72, reading sector 15190
RS03: try number = 73, reading sector 15288
RS03: try number = 74, reading sector 15386
RS03: try number = 75, reading sector 15484
RS03: try number = 76, reading sector 15582
RS03: try number = 77, reading sector 15680
RS03: try number = 78, reading sector 15778
RS03: try number = 79, reading sector 15876
RS03: try number = 80, reading sector 15974
RS03: try number = 81, reading sector 16072
RS03: try number = 82, reading sector 16170
RS03: try number = 83, reading sector 16268
RS03: try number = 84, reading sector 16366
RS03: try number = 85, reading sector 16464
RS03: try number = 86, reading sector 16562
RS03: try number = 87, reading sector 16660
RS03: try number = 88, reading sector 16758
RS03: try number = 89, reading sector 16856
RS03: try number = 90, reading sector 16954
RS03: try number = 91, reading sector 17052
RS03: try number = 92, reading sector 17150
RS03: try number = 93, reading sector 17248
RS03: try number = 94, reading sector 17346
RS03: try number = 95, reading sector 17444
RS03: try number = 96, reading sector 17542
RS03: try number = 97, reading sector 17640
RS03: try number = 98, reading sector 17738
RS03: try number = 99, reading sector 17836
RS03: try number = 100, reading sector 17934
RS03: try number = 101, reading sector 18032
RS03: try number = 102, reading sector 18130
RS03: try number = 103, reading sector 18228
RS03: try number = 104, reading sector 18326
RS03: try number = 105, reading sector 18424
RS03: try number = 106, reading sector 18522
RS03: try number = 107, reading sector 18620
RS03: try number = 108, reading sector 18718
RS03: try number = 109, reading sector 18816
RS03: try number = 110, reading sector 18914
RS03: try number = 111, reading sector 19012
RS03: try number = 112, reading sector 19110
RS03: try number = 113, reading sector 19208
RS03: try number = 114, reading sector 19306
RS03: try number = 115, reading sector 19404
RS03: try number = 116, reading sector 19502
RS03: try number = 117, reading sector 19600
RS03: try number = 118, reading sector 19698
RS03: try number = 119, reading sector 19796
RS03: try number = 120, reading sector 19894
RS03: try number = 121, reading sector 19992
RS03: try number = 122, reading sector 20090
RS03: try number = 123, reading sector 20188
RS03: try number = 124, reading sector 20286
RS03: try number = 125, reading sector 20384
RS03: try number = 126, reading sector 20482
RS03: try number = 127, reading sector 20580
RS03: try number = 128, reading sector 20678
RS03: try number = 129, reading sector 20776
RS03: try number = 130, reading sector 20874
RS03: try number = 131, reading sector 20972
RS03: try number = 132, reading sector 21070
** Success: sector 21070, rediscovered format with 39 roots
...augmented image found
# Calling query_size()
# *** query_size(Simulated CD drive 1.00) ***
Medium size obtained from ECC header: 24990 sectors
# returned: 24990 sectors
Medium "Random Image": CD-R mode 1, 24990 sectors, Ecc, created 16-07-2006.
Creating new rs03i-tmp.iso image.
Reading CRC information from ecc data (RS03) ... Calculated layout for RS03 image:
data sectors = 21000
data padding = 68
layer size = 98
total sectors = 24990
medium capacity = 0
header position = 21000
first CRC sector = 21070
first ECC sector = 21168
ndata = 216
nroots = 39 (18.1%)
done.
* CRC error, sector: 21000
Current sector: 22032. This session: NewSectorsReadOK=22032, ReadErrors=0, CRCErrors=1
Current sector: 22048. This session: NewSectorsReadOK=22048, ReadErrors=0, CRCErrors=1
Current sector: 22064. This session: NewSectorsReadOK=22064, ReadErrors=0, CRCErrors=1
Current sector: 22080. This session: NewSectorsReadOK=22080, ReadErrors=0, CRCErrors=1
Current sector: 22096. This session: NewSectorsReadOK=22096, ReadErrors=0, CRCErrors=1
Current sector: 22112. This session: NewSectorsReadOK=22112, ReadErrors=0, CRCErrors=1
Current sector: 22128. This session: NewSectorsReadOK=22128, ReadErrors=0, CRCErrors=1
Current sector: 22144. This session: NewSectorsReadOK=22144, ReadErrors=0, CRCErrors=1
Current sector: 22160. This session: NewSectorsReadOK=22160, ReadErrors=0, CRCErrors=1
Current sector: 22176. This session: NewSectorsReadOK=22176, ReadErrors=0, CRCErrors=1
Current sector: 22192. This session: NewSectorsReadOK=22192, ReadErrors=0, CRCErrors=1
Current sector: 22208. This session: NewSectorsReadOK=22208, ReadErrors=0, CRCErrors=1
Current sector: 22224. This session: NewSectorsReadOK=22224, ReadErrors=0, CRCErrors=1
Current sector: 22240. This session: NewSectorsReadOK=22240, ReadErrors=0, CRCErrors=1
Current sector: 22256. This session: NewSectorsReadOK=22256, ReadErrors=0, CRCErrors=1
Current sector: 22272. This session: NewSectorsReadOK=22272, ReadErrors=0, CRCErrors=1
Current sector: 22288. This session: NewSectorsReadOK=22288, ReadErrors=0, CRCErrors=1
Current sector: 22304. This session: NewSectorsReadOK=22304, ReadErrors=0, CRCErrors=1
Current sector: 22320. This session: NewSectorsReadOK=22320, ReadErrors=0, CRCErrors=1
Current sector: 22336. This session: NewSectorsReadOK=22336, ReadErrors=0, CRCErrors=1
Current sector: 22352. This session: NewSectorsReadOK=22352, ReadErrors=0, CRCErrors=1
Current sector: 22368. This session: NewSectorsReadOK=22368, ReadErrors=0, CRCErrors=1
Current sector: 22384. This session: NewSectorsReadOK=22384, ReadErrors=0, CRCErrors=1
Current sector: 22400. This session: NewSectorsReadOK=22400, ReadErrors=0, CRCErrors=1
Current sector: 22416. This session: NewSectorsReadOK=22416, ReadErrors=0, CRCErrors=1
Current sector: 22432. This session: NewSectorsReadOK=22432, ReadErrors=0, CRCErrors=1
Current sector: 22448. This session: NewSectorsReadOK=22448, ReadErrors=0, CRCErrors=1
Current sector: 22464. This session: NewSectorsReadOK=22464, ReadErrors=0, CRCErrors=1
Current sector: 22480. This session: NewSectorsReadOK=22480, ReadErrors=0, CRCErrors=1
Current sector: 22496. This session: NewSectorsReadOK=22496, ReadErrors=0, CRCErrors=1
Current sector: 22512. This session: NewSectorsReadOK=22512, ReadErrors=0, CRCErrors=1
Current sector: 22528. This session: NewSectorsReadOK=22528, ReadErrors=0, CRCErrors=1
Current sector: 22544. This session: NewSectorsReadOK=22544, ReadErrors=0, CRCErrors=1
Current sector: 22560. This session: NewSectorsReadOK=22560, ReadErrors=0, CRCErrors=1
Current sector: 22576. This session: NewSectorsReadOK=22576, ReadErrors=0, CRCErrors=1
Current sector: 22592. This session: NewSectorsReadOK=22592, ReadErrors=0, CRCErrors=1
Current sector: 22608. This session: NewSectorsReadOK=22608, ReadErrors=0, CRCErrors=1
Current sector: 22624. This session: NewSectorsReadOK=22624, ReadErrors=0, CRCErrors=1
Current sector: 22640. This session: NewSectorsReadOK=22640, ReadErrors=0, CRCErrors=1
Current sector: 22656. This session: NewSectorsReadOK=22656, ReadErrors=0, CRCErrors=1
Current sector: 22672. This session: NewSectorsReadOK=22672, ReadErrors=0, CRCErrors=1
Current sector: 22688. This session: NewSectorsReadOK=22688, ReadErrors=0, CRCErrors=1
Current sector: 22704. This session: NewSectorsReadOK=22704, ReadErrors=0, CRCErrors=1
Current sector: 22720. This session: NewSectorsReadOK=22720, ReadErrors=0, CRCErrors=1
Current sector: 22736. This session: NewSectorsReadOK=22736, ReadErrors=0, CRCErrors=1
Current sector: 22752. This session: NewSectorsReadOK=22752, ReadErrors=0, CRCErrors=1
Current sector: 22768. This session: NewSectorsReadOK=22768, ReadErrors=0, CRCErrors=1
Current sector: 22784. This session: NewSectorsReadOK=22784, ReadErrors=0, CRCErrors=1
Current sector: 22800. This session: NewSectorsReadOK=22800, ReadErrors=0, CRCErrors=1
Current sector: 22816. This session: NewSectorsReadOK=22816, ReadErrors=0, CRCErrors=1
Current sector: 22832. This session: NewSectorsReadOK=22832, ReadErrors=0, CRCErrors=1
Current sector: 22848. This session: NewSectorsReadOK=22848, ReadErrors=0, CRCErrors=1
Current sector: 22864. This session: NewSectorsReadOK=22864, ReadErrors=0, CRCErrors=1
Current sector: 22880. This session: NewSectorsReadOK=22880, ReadErrors=0, CRCErrors=1
Current sector: 22896. This session: NewSectorsReadOK=22896, ReadErrors=0, CRCErrors=1
Current sector: 22912. This session: NewSectorsReadOK=22912, ReadErrors=0, CRCErrors=1
Current sector: 22928. This session: NewSectorsReadOK=22928, ReadErrors=0, CRCErrors=1
Current sector: 22944. This session: NewSectorsReadOK=22944, ReadErrors=0, CRCErrors=1
Current sector: 22960. This session: NewSectorsReadOK=22960, ReadErrors=0, CRCErrors=1
Current sector: 22976. This session: NewSectorsReadOK=22976, ReadErrors=0, CRCErrors=1
Current sector: 22992. This session: NewSectorsReadOK=22992, ReadErrors=0, CRCErrors=1
Current sector: 23008. This session: NewSectorsReadOK=23008, ReadErrors=0, CRCErrors=1
Current sector: 23024. This session: NewSectorsReadOK=23024, ReadErrors=0, CRCErrors=1
Current sector: 23040. This session: NewSectorsReadOK=23040, ReadErrors=0, CRCErrors=1
Current sector: 23056. This session: NewSectorsReadOK=23056, ReadErrors=0, CRCErrors=1
Current sector: 23072. This session: NewSectorsReadOK=23072, ReadErrors=0, CRCErrors=1
Current sector: 23088. This session: NewSectorsReadOK=23088, ReadErrors=0, CRCErrors=1
Current sector: 23104. This session: NewSectorsReadOK=23104, ReadErrors=0, CRCErrors=1
Current sector: 23120. This session: NewSectorsReadOK=23120, ReadErrors=0, CRCErrors=1
Current sector: 23136. This session: NewSectorsReadOK=23136, ReadErrors=0, CRCErrors=1
Current sector: 23152. This session: NewSectorsReadOK=23152, ReadErrors=0, CRCErrors=1
Current sector: 23168. This session: NewSectorsReadOK=23168, ReadErrors=0, CRCErrors=1
Current sector: 23184. This session: NewSectorsReadOK=23184, ReadErrors=0, CRCErrors=1
Current sector: 23200. This session: NewSectorsReadOK=23200, ReadErrors=0, CRCErrors=1
Current sector: 23216. This session: NewSectorsReadOK=23216, ReadErrors=0, CRCErrors=1
Current sector: 23232. This session: NewSectorsReadOK=23232, ReadErrors=0, CRCErrors=1
Current sector: 23248. This session: NewSectorsReadOK=23248, ReadErrors=0, CRCErrors=1
Current sector: 23264. This session: NewSectorsReadOK=23264, ReadErrors=0, CRCErrors=1
Current sector: 23280. This session: NewSectorsReadOK=23280, ReadErrors=0, CRCErrors=1
Current sector: 23296. This session: NewSectorsReadOK=23296, ReadErrors=0, CRCErrors=1
Current sector: 23312. This session: NewSectorsReadOK=23312, ReadErrors=0, CRCErrors=1
Current sector: 23328. This session: NewSectorsReadOK=23328, ReadErrors=0, CRCErrors=1
Current sector: 23344. This session: NewSectorsReadOK=23344, ReadErrors=0, CRCErrors=1
Current sector: 23360. This session: NewSectorsReadOK=23360, ReadErrors=0, CRCErrors=1
Current sector: 23376. This session: NewSectorsReadOK=23376, ReadErrors=0, CRCErrors=1
Current sector: 23392. This session: NewSectorsReadOK=23392, ReadErrors=0, CRCErrors=1
Current sector: 23408. This session: NewSectorsReadOK=23408, ReadErrors=0, CRCErrors=1
Current sector: 23424. This session: NewSectorsReadOK=23424, ReadErrors=0, CRCErrors=1
Current sector: 23440. This session: NewSectorsReadOK=23440, ReadErrors=0, CRCErrors=1
Current sector: 23456. This session: NewSectorsReadOK=23456, ReadErrors=0, CRCErrors=1
Current sector: 23472. This session: NewSectorsReadOK=23472, ReadErrors=0, CRCErrors=1
Current sector: 23488. This session: NewSectorsReadOK=23488, ReadErrors=0, CRCErrors=1
Current sector: 23504. This session: NewSectorsReadOK=23504, ReadErrors=0, CRCErrors=1
Current sector: 23520. This session: NewSectorsReadOK=23520, ReadErrors=0, CRCErrors=1
Current sector: 23536. This session: NewSectorsReadOK=23536, ReadErrors=0, CRCErrors=1
Current sector: 23552. This session: NewSectorsReadOK=23552, ReadErrors=0, CRCErrors=1
Current sector: 23568. This session: NewSectorsReadOK=23568, ReadErrors=0, CRCErrors=1
Current sector: 23584. This session: NewSectorsReadOK=23584, ReadErrors=0, CRCErrors=1
Current sector: 23600. This session: NewSectorsReadOK=23600, ReadErrors=0, CRCErrors=1
Current sector: 23616. This session: NewSectorsReadOK=23616, ReadErrors=0, CRCErrors=1
Current sector: 23632. This session: NewSectorsReadOK=23632, ReadErrors=0, CRCErrors=1
Current sector: 23648. This session: NewSectorsReadOK=23648, ReadErrors=0, CRCErrors=1
Current sector: 23664. This session: NewSectorsReadOK=23664, ReadErrors=0, CRCErrors=1
Current sector: 23680. This session: NewSectorsReadOK=23680, ReadErrors=0, CRCErrors=1
Current sector: 23696. This session: NewSectorsReadOK=23696, ReadErrors=0, CRCErrors=1
Current sector: 23712. This session: NewSectorsReadOK=23712, ReadErrors=0, CRCErrors=1
Current sector: 23728. This session: NewSectorsReadOK=23728, ReadErrors=0, CRCErrors=1
Current sector: 23744. This session: NewSectorsReadOK=23744, ReadErrors=0, CRCErrors=1
Current sector: 23760. This session: NewSectorsReadOK=23760, ReadErrors=0, CRCErrors=1
Current sector: 23776. This session: NewSectorsReadOK=23776, ReadErrors=0, CRCErrors=1
Current sector: 23792. This session: NewSectorsReadOK=23792, ReadErrors=0, CRCErrors=1
Current sector: 23808. This session: NewSectorsReadOK=23808, ReadErrors=0, CRCErrors=1
Current sector: 23824. This session: NewSectorsReadOK=23824, ReadErrors=0, CRCErrors=1
Current sector: 23840. This session: NewSectorsReadOK=23840, ReadErrors=0, CRCErrors=1
Current sector: 23856. This session: NewSectorsReadOK=23856, ReadErrors=0, CRCErrors=1
Current sector: 23872. This session: NewSectorsReadOK=23872, ReadErrors=0, CRCErrors=1
Current sector: 23888. This session: NewSectorsReadOK=23888, ReadErrors=0, CRCErrors=1
Current sector: 23904. This session: NewSectorsReadOK=23904, ReadErrors=0, CRCErrors=1
Current sector: 23920. This session: NewSectorsReadOK=23920, ReadErrors=0, CRCErrors=1
Current sector: 23936. This session: NewSectorsReadOK=23936, ReadErrors=0, CRCErrors=1
Current sector: 23952. This session: NewSectorsReadOK=23952, ReadErrors=0, CRCErrors=1
Current sector: 23968. This session: NewSectorsReadOK=23968, ReadErrors=0, CRCErrors=1
Current sector: 23984. This session: NewSectorsReadOK=23984, ReadErrors=0, CRCErrors=1
Current sector: 24000. This session: NewSectorsReadOK=24000, ReadErrors=0, CRCErrors=1
Current sector: 24016. This session: NewSectorsReadOK=24016, ReadErrors=0, CRCErrors=1
Current sector: 24032. This session: NewSectorsReadOK=24032, ReadErrors=0, CRCErrors=1
Current sector: 24048. This session: NewSectorsReadOK=24048, ReadErrors=0, CRCErrors=1
Current sector: 24064. This session: NewSectorsReadOK=24064, ReadErrors=0, CRCErrors=1
Current sector: 24080. This session: NewSectorsReadOK=24080, ReadErrors=0, CRCErrors=1
Current sector: 24096. This session: NewSectorsReadOK=24096, ReadErrors=0, CRCErrors=1
Current sector: 24112. This session: NewSectorsReadOK=24112, ReadErrors=0, CRCErrors=1
Current sector: 24128. This session: NewSectorsReadOK=24128, ReadErrors=0, CRCErrors=1
Current sector: 24144. This session: NewSectorsReadOK=24144, ReadErrors=0, CRCErrors=1
Current sector: 24160. This session: NewSectorsReadOK=24160, ReadErrors=0, CRCErrors=1
Current sector: 24176. This session: NewSectorsReadOK=24176, ReadErrors=0, CRCErrors=1
Current sector: 24192. This session: NewSectorsReadOK=24192, ReadErrors=0, CRCErrors=1
Current sector: 24208. This session: NewSectorsReadOK=24208, ReadErrors=0, CRCErrors=1
Current sector: 24224. This session: NewSectorsReadOK=24224, ReadErrors=0, CRCErrors=1
Current sector: 24240. This session: NewSectorsReadOK=24240, ReadErrors=0, CRCErrors=1
Current sector: 24256. This session: NewSectorsReadOK=24256, ReadErrors=0, CRCErrors=1
Current sector: 24272. This session: NewSectorsReadOK=24272, ReadErrors=0, CRCErrors=1
Current sector: 24288. This session: NewSectorsReadOK=24288, ReadErrors=0, CRCErrors=1
Current sector: 24304. This session: NewSectorsReadOK=24304, ReadErrors=0, CRCErrors=1
Current sector: 24320. This session: NewSectorsReadOK=24320, ReadErrors=0, CRCErrors=1
Current sector: 24336. This session: NewSectorsReadOK=24336, ReadErrors=0, CRCErrors=1
Current sector: 24352. This session: NewSectorsReadOK=24352, ReadErrors=0, CRCErrors=1
Current sector: 24368. This session: NewSectorsReadOK=24368, ReadErrors=0, CRCErrors=1
Current sector: 24384. This session: NewSectorsReadOK=24384, ReadErrors=0, CRCErrors=1
Current sector: 24400. This session: NewSectorsReadOK=24400, ReadErrors=0, CRCErrors=1
Current sector: 24416. This session: NewSectorsReadOK=24416, ReadErrors=0, CRCErrors=1
Current sector: 24432. This session: NewSectorsReadOK=24432, ReadErrors=0, CRCErrors=1
Current sector: 24448. This session: NewSectorsReadOK=24448, ReadErrors=0, CRCErrors=1
Current sector: 24464. This session: NewSectorsReadOK=24464, ReadErrors=0, CRCErrors=1
Current sector: 24480. This session: NewSectorsReadOK=24480, ReadErrors=0, CRCErrors=1
Current sector: 24496. This session: NewSectorsReadOK=24496, ReadErrors=0, CRCErrors=1
Current sector: 24512. This session: NewSectorsReadOK=24512, ReadErrors=0, CRCErrors=1
Current sector: 24528. This session: NewSectorsReadOK=24528, ReadErrors=0, CRCErrors=1
Current sector: 24544. This session: NewSectorsReadOK=24544, ReadErrors=0, CRCErrors=1
Current sector: 24560. This session: NewSectorsReadOK=24560, ReadErrors=0, CRCErrors=1
Current sector: 24576. This session: NewSectorsReadOK=24576, ReadErrors=0, CRCErrors=1
Current sector: 24592. This session: NewSectorsReadOK=24592, ReadErrors=0, CRCErrors=1
Current sector: 24608. This session: NewSectorsReadOK=24608, ReadErrors=0, CRCErrors=1
Current sector: 24624. This session: NewSectorsReadOK=24624, ReadErrors=0, CRCErrors=1
Current sector: 24640. This session: NewSectorsReadOK=24640, ReadErrors=0, CRCErrors=1
Current sector: 24656. This session: NewSectorsReadOK=24656, ReadErrors=0, CRCErrors=1
Current sector: 24672. This session: NewSectorsReadOK=24672, ReadErrors=0, CRCErrors=1
Current sector: 24688. This session: NewSectorsReadOK=24688, ReadErrors=0, CRCErrors=1
Current sector: 24704. This session: NewSectorsReadOK=24704, ReadErrors=0, CRCErrors=1
Current sector: 24720. This session: NewSectorsReadOK=24720, ReadErrors=0, CRCErrors=1
Current sector: 24736. This session: NewSectorsReadOK=24736, ReadErrors=0, CRCErrors=1
Current sector: 24752. This session: NewSectorsReadOK=24752, ReadErrors=0, CRCErrors=1
Current sector: 24768. This session: NewSectorsReadOK=24768, ReadErrors=0, CRCErrors=1
Current sector: 24784. This session: NewSectorsReadOK=24784, ReadErrors=0, CRCErrors=1
Current sector: 24800. This session: NewSectorsReadOK=24800, ReadErrors=0, CRCErrors=1
Current sector: 24816. This session: NewSectorsReadOK=24816, ReadErrors=0, CRCErrors=1
Current sector: 24832. This session: NewSectorsReadOK=24832, ReadErrors=0, CRCErrors=1
Current sector: 24848. This session: NewSectorsReadOK=24848, ReadErrors=0, CRCErrors=1
Current sector: 24864. This session: NewSectorsReadOK=24864, ReadErrors=0, CRCErrors=1
Current sector: 24880. This session: NewSectorsReadOK=24880, ReadErrors=0, CRCErrors=1
Current sector: 24896. This session: NewSectorsReadOK=24896, ReadErrors=0, CRCErrors=1
Current sector: 24912. This session: NewSectorsReadOK=24912, ReadErrors=0, CRCErrors=1
Current sector: 24928. This session: NewSectorsReadOK=24928, ReadErrors=0, CRCErrors=1
Current sector: 24944. This session: NewSectorsReadOK=24944, ReadErrors=0, CRCErrors=1
Current sector: 24960. This session: NewSectorsReadOK=24960, ReadErrors=0, CRCErrors=1
Current sector: 24976. This session: NewSectorsReadOK=24976, ReadErrors=0, CRCErrors=1
Current sector: 24977. This session: NewSectorsReadOK=24977, ReadErrors=0, CRCErrors=1
Current sector: 24978. This session: NewSectorsReadOK=24978, ReadErrors=0, CRCErrors=1
Current sector: 24979. This session: NewSectorsReadOK=24979, ReadErrors=0, CRCErrors=1
Current sector: 24980. This session: NewSectorsReadOK=24980, ReadErrors=0, CRCErrors=1
Current sector: 24981. This session: NewSectorsReadOK=24981, ReadErrors=0, CRCErrors=1
Current sector: 24982. This session: NewSectorsReadOK=24982, ReadErrors=0, CRCErrors=1
Current sector: 24983. This session: NewSectorsReadOK=24983, ReadErrors=0, CRCErrors=1
Current sector: 24984. This session: NewSectorsReadOK=24984, ReadErrors=0, CRCErrors=1
Current sector: 24985. This session: NewSectorsReadOK=24985, ReadErrors=0, CRCErrors=1
Current sector: 24986. This session: NewSectorsReadOK=24986, ReadErrors=0, CRCErrors=1
Current sector: 24987. This session: NewSectorsReadOK=24987, ReadErrors=0, CRCErrors=1
Current sector: 24988. This session: NewSectorsReadOK=24988, ReadErrors=0, CRCErrors=1
Current sector: 24989. This session: NewSectorsReadOK=24989, ReadErrors=0, CRCErrors=1
Current sector: 24990. This session: NewSectorsReadOK=24990, ReadErrors=0, CRCErrors=1
1 CRC errors.
CrcBuf contents, image path none (medium):
crcSize: 24990, dataSectors: 21000, coveredSectors: 21070, allSectors: 24990
md5State: invalid
fp sector: 16; 15c0fd35a0cfa0f83b9ccbd8604c2592
missing crcs: 0

View File

@@ -1,5 +1,5 @@
# Bash based configure - library of test functions
# Copyright (C) 2004-2016 Carsten Gn<47>rlich
# Copyright (C) 2004-2016 Carsten Gn<47>rlich
# Copyright (C) 2019-2021 The dvdisaster development team.
#
# Email: support@dvdisaster.org
@@ -127,6 +127,15 @@ case "$cfg_uname" in
}
;;
Darwin*) cfg_system=darwin
CFG_SYS_OPTIONS="-DSYS_DARWIN"
CFG_SYS_NAME="-DSYS_NAME=\\\"Darwin\\\""
CFG_EXE_SUFFIX=""
function add_linker_flags()
{ lflags_return="-L$1 -Wl,-rpath,$1 $2"
}
;;
FreeBSD*) cfg_system=freebsd-std
CFG_SYS_OPTIONS="-DSYS_FREEBSD"
CFG_SYS_NAME="-DSYS_NAME=\\\"FreeBSD\\\""
@@ -348,6 +357,42 @@ function REQUIRE_GMAKE()
exit 1;
}
function REQUIRE_CLANG()
{
if test -n "$cfg_help_mode"; then
return 0
fi
echo -n "Checking for clang: "
# Try $CC first
if test -n "$CC" && $CC -v >/dev/null 2>&1; then
if ($CC -v 2>&1 | grep "clang") > /dev/null 2>&1 ; then
CC=`type -P $CC`
echo "yes ($CC)"
echo "CC = $CC" >>Makefile.config
return 0
fi
fi
# Try clang binary
CC=clang
if test -n "$CC" && $CC -v >/dev/null 2>&1; then
if ($CC -v 2>&1 | grep "clang") > /dev/null 2>&1 ; then
CC=`type -P $CC`
echo "yes ($CC)"
echo "CC = $CC" >>Makefile.config
return 0
fi
fi
echo "no"
echo "This package requires the Clang C compiler (clang)."
exit 1;
}
function REQUIRE_GCC()
{
if test -n "$cfg_help_mode"; then
@@ -1432,13 +1477,13 @@ EOF
}
#
# Require the GTK2 includes and libraries.
# Require the GTK3 includes and libraries.
# Unlike with the other packages, we don't have to fid out about the includes
# and libraries by ourselves, but just query pkg-config about them.
# It seems that people have more trouble with getting GTK+ to work
# than with other toolkits, so we try a bit harder to diagnose them here.
function REQUIRE_GTK2()
function REQUIRE_GTK3()
{ local want_major="$1"
local want_minor="$2"
local want_micro="$3"
@@ -1451,33 +1496,33 @@ function REQUIRE_GTK2()
if test "$want_threads" == "WITH_THREADS"; then threads="--libs gthread-2.0"; fi
echo -e "\n/* *** REQUIRE_GTK2 */\n" >>$LOGFILE
echo -e "\n/* *** REQUIRE_GTK3 */\n" >>$LOGFILE
echo "Gtk+ ${want_major}.${want_minor}.${want_micro} is required..."
# See if pkgconfig returns something
echo -n " pkg-config... "
if pkg-config --cflags gtk+-2.0 >>config.tmp 2>&1 && pkg-config $threads --libs gtk+-2.0 >>config.tmp 2>&1 ; then
if pkg-config --cflags gtk+-3.0 >>config.tmp 2>&1 && pkg-config $threads --libs gtk+-3.0 >>config.tmp 2>&1 ; then
echo "works"
rm config.tmp
else
else
echo "failed"
echo -e "\nError message(s) from pkg-config were:"
cat config.tmp
rm config.tmp
cat <<EOF
cat <<EOF
Make sure you have the following packages installed:
- pkg-config (sometimes, the obvious is overlooked ;-)
- glib2
- pango
- atk
- gtk2
- gtk3
Some GNU/Linux distributions (e.g. SuSE) distinguish between
end-user packages of the libraries (e.g. 'gtk2') and
versions suitable for building programs (e.g. 'gtk2-devel').
end-user packages of the libraries (e.g. 'gtk3') and
versions suitable for building programs (e.g. 'gtk3-devel').
You might have to install the development versions explicitly
even if you have already GTK+ or Gnome applications running
on your system.
@@ -1488,17 +1533,17 @@ EOF
# Do a test compile to make sure they did not return some junk
CFG_GTK2_CFLAGS=`pkg-config --cflags gtk+-2.0`
CFG_GTK2_LIBS=`pkg-config $threads --libs gtk+-2.0`
CFG_GTK3_CFLAGS=`pkg-config --cflags gtk+-3.0`
CFG_GTK3_LIBS=`pkg-config $threads --libs gtk+-3.0`
CFG_GTK2_BINDIR=`type -P pkg-config`
CFG_GTK2_BINDIR=`echo $CFG_GTK2_BINDIR | sed -e 's/.exe//' | sed -e 's/\/pkg-config//'`
CFG_GTK3_BINDIR=`which pkg-config`
CFG_GTK3_BINDIR=`echo $CFG_GTK3_BINDIR | sed -e 's/.exe//' | sed -e 's/\/pkg-config//'`
CFG_CFLAGS="$CFG_CFLAGS $CFG_GTK2_CFLAGS"
CFG_LIBS="$CFG_LIBS $CFG_GTK2_LIBS"
CFG_CFLAGS="$CFG_CFLAGS $CFG_GTK3_CFLAGS"
CFG_LIBS="$CFG_LIBS $CFG_GTK3_LIBS"
cat >conftest.c <<EOF
#include <gtk/gtkversion.h>
#include <gtk/gtk.h>
CPPABUSE GTK_MAJOR_VERSION.GTK_MINOR_VERSION.GTK_MICRO_VERSION
EOF
@@ -1523,9 +1568,9 @@ EOF
# Successfully finished
echo "CFG_GTK2_CFLAGS = $CFG_GTK2_CFLAGS" >> Makefile.config
echo "CFG_GTK2_LIBS = $CFG_GTK2_LIBS" >> Makefile.config
echo "CFG_GTK2_BINDIR = $CFG_GTK2_BINDIR" >> Makefile.config
echo "CFG_GTK3_CFLAGS = $CFG_GTK3_CFLAGS" >> Makefile.config
echo "CFG_GTK3_LIBS = $CFG_GTK3_LIBS" >> Makefile.config
echo "CFG_GTK3_BINDIR = $CFG_GTK3_BINDIR" >> Makefile.config
return 1
}

View File

@@ -23,14 +23,6 @@
/*** src type: some GUI code ***/
#include "dvdisaster.h"
#include "inlined-icons.h"
#if 0
#define Verbose g_printf
#else
#define Verbose(format, ...)
#endif
#ifdef SYS_MINGW
#include <windows.h>
@@ -58,6 +50,35 @@ static char* get_exe_path()
}
#endif
#ifdef SYS_DARWIN
#include <mach-o/dyld.h>
// Get the path of the current executable
static char* get_bin_path() {
char path[PATH_MAX];
uint32_t size = sizeof(path);
if (_NSGetExecutablePath(path, &size) == 0) {
char *lastSlash = strrchr(path, '/');
if (lastSlash) {
*lastSlash = '\0';
return strdup(path);
}
}
return strdup(".");
}
// Check if the given path is within an app bundle
int isWithinAppBundle(const char *filePath) {
// Check if "Contents/MacOS" exists in the path
if (strstr(filePath, ".app/Contents/MacOS") != NULL) {
return 1; // The binary is within an app bundle
}
return 0; // The binary is not within an app bundle
}
#endif
#ifdef WITH_GUI_YES
/***
@@ -68,12 +89,12 @@ static char* get_exe_path()
* Update color string for the <span color="#f00baa">...</span> string
*/
void GuiUpdateMarkup(char **string, GdkColor *color)
void GuiUpdateMarkup(char **string, GdkRGBA *color)
{ int hexval;
hexval = (color->red << 8) & 0xff0000;
hexval |= color->green & 0xff00;
hexval |= (color->blue >> 8) & 0xff;
hexval = (int)(color->red * 255.0 + 0.5) << 16;
hexval |= (int)(color->green * 255.0 + 0.5) << 8;
hexval |= (int)(color->blue * 255.0 + 0.5);
if(*string) g_free(*string);
*string = g_strdup_printf("color=\"#%06x\"", hexval);
@@ -85,55 +106,23 @@ void GuiUpdateMarkup(char **string, GdkColor *color)
void GuiDefaultColors()
{
Closure->redText->red = 0xffff;
Closure->redText->green = 0;
Closure->redText->blue = 0;
Closure->greenText->red = 0;
Closure->greenText->green = 0x8000;
Closure->greenText->blue = 0;
Closure->barColor->red = 0xffff;
Closure->barColor->green = 0;
Closure->barColor->blue = 0;
Closure->logColor->red = 0xffff;
Closure->logColor->green = 0;
Closure->logColor->blue = 0xffff;
Closure->curveColor->red = 0;
Closure->curveColor->green = 0;
Closure->curveColor->blue = 0xffff;
Closure->redSector->red = 0xffff;
Closure->redSector->green = 0;
Closure->redSector->blue = 0;
Closure->yellowSector->red = 0xffff;
Closure->yellowSector->green = 0xc000;
Closure->yellowSector->blue = 0;
Closure->greenSector->red = 0;
Closure->greenSector->green = 0xdb00;
Closure->greenSector->blue = 0;
Closure->darkSector->red = 0;
Closure->darkSector->green = 0x8000;
Closure->darkSector->blue = 0;
Closure->blueSector->red = 0;
Closure->blueSector->green = 0;
Closure->blueSector->blue = 0xffff;
Closure->whiteSector->red = 0xffff;
Closure->whiteSector->green = 0xffff;
Closure->whiteSector->blue = 0xffff;
*Closure->redText = (GdkRGBA){1.0, 0.0, 0.0, 1.0};
*Closure->greenText = (GdkRGBA){0.0, 0.5, 0.0, 1.0};
*Closure->barColor = (GdkRGBA){1.0, 0.0, 0.0, 1.0};
*Closure->logColor = (GdkRGBA){1.0, 0.0, 1.0, 1.0};
*Closure->curveColor = (GdkRGBA){0.0, 0.0, 1.0, 1.0};
*Closure->redSector = (GdkRGBA){1.0, 0.0, 0.0, 1.0};
*Closure->yellowSector = (GdkRGBA){1.0, 0.75, 0.0, 1.0};
*Closure->greenSector = (GdkRGBA){0.0, 0.86, 0.0, 1.0};
*Closure->darkSector = (GdkRGBA){0.0, 0.5, 0.0, 1.0};
*Closure->curveColor = (GdkRGBA){0.0, 0.0, 1.0, 1.0};
*Closure->whiteSector = (GdkRGBA){1.0, 1.0, 1.0, 1.0};
GuiUpdateMarkup(&Closure->redMarkup, Closure->redText);
GuiUpdateMarkup(&Closure->greenMarkup, Closure->greenText);
}
static void save_colors(FILE *dotfile, char *symbol, GdkColor *color)
static void save_colors(FILE *dotfile, char *symbol, GdkRGBA *color)
{ char *blanks=" ";
char *pad;
int len=strlen(symbol);
@@ -142,15 +131,17 @@ static void save_colors(FILE *dotfile, char *symbol, GdkColor *color)
else pad=blanks+len;
fprintf(dotfile, "%s:%s%02x%02x%02x\n", symbol, pad,
color->red>>8, color->green>>8, color->blue>>8);
(int)(color->red * 255.0 + 0.5),
(int)(color->green * 255.0 + 0.5),
(int)(color->blue * 255.0 + 0.5));
}
static void get_color(GdkColor *color, char *value)
static void get_color(GdkRGBA *color, char *value)
{ unsigned int hex = strtol(value, NULL, 16);
color->red = (hex>>8)&0xff00;
color->green = hex&0xff00;
color->blue = (hex<<8)&0xff00;
color->red = (double)(hex >> 16) / 255.0;
color->green = (double)((hex >> 8) & 0xff) / 255.0;
color->blue = (double)(hex & 0xff) / 255.0;
color->alpha = 1.0;
}
/***
@@ -184,7 +175,8 @@ void GuiReadDotfile()
if(feof(dotfile)) break;
if(*line == '#') continue;
if(!sscanf(line, "%40[0-9a-zA-Z-]%n", symbol, &n)) continue;
int result = sscanf(line, "%40[0-9a-zA-Z-]%n", symbol, &n);
if(result == EOF || !result) continue;
if(line[n] != ':') continue;
/* Separate line contents into symbol: value pair */
@@ -259,7 +251,6 @@ void GuiReadDotfile()
if(!strcmp(symbol, "read-raw")) { Closure->readRaw = atoi(value); continue; }
if(!strcmp(symbol, "redundancy")) { if(Closure->redundancy) g_free(Closure->redundancy);
Closure->redundancy = g_strdup(value); continue; }
if(!strcmp(symbol, "reverse-cancel-ok")) { Closure->reverseCancelOK = atoi(value); continue; }
if(!strcmp(symbol, "spinup-delay")) { Closure->spinupDelay = atoi(value); continue; }
if(!strcmp(symbol, "unlink")) { Closure->unlinkImage = atoi(value); continue; }
if(!strcmp(symbol, "verbose")) { Closure->verbose = atoi(value); continue; }
@@ -362,7 +353,6 @@ static void update_dotfile()
g_fprintf(dotfile, "read-raw: %d\n", Closure->readRaw);
if(Closure->redundancy)
g_fprintf(dotfile, "redundancy: %s\n", Closure->redundancy);
g_fprintf(dotfile, "reverse-cancel-ok: %d\n", Closure->reverseCancelOK);
g_fprintf(dotfile, "spinup-delay: %d\n", Closure->spinupDelay);
g_fprintf(dotfile, "unlink: %d\n", Closure->unlinkImage);
g_fprintf(dotfile, "verbose: %d\n", Closure->verbose);
@@ -392,11 +382,20 @@ static void update_dotfile()
static void get_base_dirs()
{
/* If specified in environment (for example in AppImage), use it */
if (g_getenv("DVDISASTER_APPIMAGE") && atoi(g_getenv("DVDISASTER_APPIMAGE")) && g_getenv("DOCDIR") && g_getenv("BINDIR"))
{ Closure->binDir = g_strdup(g_getenv("BINDIR"));
Closure->docDir = g_strdup(g_getenv("DOCDIR"));
Verbose("Using paths from environment\n");
goto find_dotfile;
}
/*** Unless completely disabled through a configure option, the
source directory is supposed to hold the most recent files,
so try this first. */
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW)
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW) && !defined(SYS_DARWIN)
if(DirStat(SRCDIR))
{ Closure->binDir = g_strdup(SRCDIR);
Closure->docDir = g_strdup_printf("%s/documentation",SRCDIR);
@@ -405,6 +404,29 @@ static void get_base_dirs()
}
#endif /* WITH_EMBEDDED_SRC_PATH_YES */
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && defined(SYS_DARWIN)
char *binPath = get_bin_path();
Closure->binDir = g_strdup_printf("%s/../Resources",binPath);
Closure->docDir = g_strdup_printf("%s/../Resources/documentation",binPath);
free(binPath);
goto find_dotfile;
#endif
// We may also be in an app bundle
#if defined(SYS_DARWIN)
// Obtain the path to the executable
const char *pathToExecutable = get_bin_path();
// Check if the executable is within an app bundle
if (isWithinAppBundle(pathToExecutable)) {
// Inside an app bundle, set directory paths accordingly
Closure->binDir = g_strdup_printf("%s/../Resources", pathToExecutable);
Closure->docDir = g_strdup_printf("%s/../Resources/documentation", pathToExecutable);
goto find_dotfile;
}
#endif /* SYS_DARWIN */
/*** Otherwise try the installation directory.
On Unices this is a hardcoded directory. */
@@ -425,9 +447,7 @@ static void get_base_dirs()
/*** The location of the dotfile depends on the operating system.
Under Unix the users home directory is used. */
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW)
find_dotfile:
#endif /* WITH_EMBEDDED_SRC_PATH_YES */
#ifndef SYS_MINGW
Closure->homeDir = g_strdup(g_getenv("HOME"));
@@ -469,7 +489,7 @@ void InitClosure()
/* Extract the version string */
#if defined(HAVE_UNSTABLE_RELEASE) && defined(PATCHLEVEL)
Closure->cookedVersion = g_strdup_printf("%s (unstable-unofficial patchlevel %d)", VERSION, PATCHLEVEL);
Closure->cookedVersion = g_strdup_printf("%s (unofficial patchlevel %d)", VERSION, PATCHLEVEL);
Closure->releaseFlags = MFLAG_DEVEL;
#elif defined(HAVE_UNSTABLE_RELEASE)
Closure->cookedVersion = g_strdup_printf("%s (unstable)", VERSION);
@@ -558,21 +578,17 @@ void InitClosure()
g_mutex_init(Closure->logLock);
#ifdef WITH_GUI_YES
Closure->background = g_malloc0(sizeof(GdkColor));
Closure->foreground = g_malloc0(sizeof(GdkColor));
Closure->grid = g_malloc0(sizeof(GdkColor));
Closure->redText = g_malloc0(sizeof(GdkColor));
Closure->greenText = g_malloc0(sizeof(GdkColor));
Closure->barColor = g_malloc0(sizeof(GdkColor));
Closure->logColor = g_malloc0(sizeof(GdkColor));
Closure->curveColor = g_malloc0(sizeof(GdkColor));
Closure->redSector = g_malloc0(sizeof(GdkColor));
Closure->yellowSector= g_malloc0(sizeof(GdkColor));
Closure->greenSector = g_malloc0(sizeof(GdkColor));
Closure->blueSector = g_malloc0(sizeof(GdkColor));
Closure->whiteSector = g_malloc0(sizeof(GdkColor));
Closure->darkSector = g_malloc0(sizeof(GdkColor));
Closure->redText = g_malloc0(sizeof(GdkRGBA));
Closure->greenText = g_malloc0(sizeof(GdkRGBA));
Closure->barColor = g_malloc0(sizeof(GdkRGBA));
Closure->logColor = g_malloc0(sizeof(GdkRGBA));
Closure->curveColor = g_malloc0(sizeof(GdkRGBA));
Closure->redSector = g_malloc0(sizeof(GdkRGBA));
Closure->yellowSector= g_malloc0(sizeof(GdkRGBA));
Closure->greenSector = g_malloc0(sizeof(GdkRGBA));
Closure->blueSector = g_malloc0(sizeof(GdkRGBA));
Closure->whiteSector = g_malloc0(sizeof(GdkRGBA));
Closure->darkSector = g_malloc0(sizeof(GdkRGBA));
GuiDefaultColors();
#endif /* WITH_GUI_YES */
@@ -583,6 +599,10 @@ void InitClosure()
DefaultLogFile();
}
#ifdef WITH_GUI_YES
GdkRGBA transparent = {0};
#endif /* WITH_GUI_YES */
/*
* Add some localized file name defaults.
* Can't do this in InitClosure() as the locale has not been
@@ -591,10 +611,16 @@ void InitClosure()
void LocalizedFileDefaults()
{
/* Storing the files in the cwd appears to be a sane default. */
Closure->imageName = g_strdup(_("medium.iso"));
Closure->eccName = g_strdup(_("medium.ecc"));
if (g_getenv("DVDISASTER_APPIMAGE") && atoi(g_getenv("DVDISASTER_APPIMAGE")) && g_getenv("ORIGINAL_PWD"))
{ /* Under AppImage mode, use the ORIGINAL_PWD as the cwd is non-writable. */
Closure->imageName = g_strdup_printf("%s/%s", g_getenv("ORIGINAL_PWD"), _("medium.iso"));
Closure->eccName = g_strdup_printf("%s/%s", g_getenv("ORIGINAL_PWD"), _("medium.ecc"));
}
else
{ /* Storing the files in the cwd appears to be a sane default. */
Closure->imageName = g_strdup(_("medium.iso"));
Closure->eccName = g_strdup(_("medium.ecc"));
}
Closure->dDumpPrefix = g_strdup(_("sector-"));
}
@@ -623,8 +649,42 @@ void FreeClosure()
#ifdef WITH_GUI_YES
if(Closure->guiMode)
update_dotfile();
#endif
if(Closure->prefsContext)
GuiFreePreferences(Closure->prefsContext);
if(Closure->rawEditorContext)
GuiFreeRawEditorContext(Closure->rawEditorContext);
cond_free(Closure->redText);
cond_free(Closure->greenText);
cond_free(Closure->barColor);
cond_free(Closure->logColor);
cond_free(Closure->curveColor);
cond_free(Closure->redSector);
cond_free(Closure->yellowSector);
cond_free(Closure->greenSector);
cond_free(Closure->blueSector);
cond_free(Closure->whiteSector);
cond_free(Closure->darkSector);
cond_free(Closure->redMarkup);
cond_free(Closure->greenMarkup);
GuiFreeCurve(Closure->readLinearCurve);
GuiFreeSpiral(Closure->readLinearSpiral);
GuiFreeSpiral(Closure->readAdaptiveSpiral);
if(Closure->readAdaptiveSubtitle)
g_free(Closure->readAdaptiveSubtitle);
if(Closure->readAdaptiveErrorMsg)
g_free(Closure->readAdaptiveErrorMsg);
#endif /* WITH_GUI_YES */
if(Closure->crcBuf)
FreeCrcBuf(Closure->crcBuf);
cond_free(Closure->cookedVersion);
cond_free(Closure->versionString);
cond_free(Closure->device);
@@ -648,9 +708,6 @@ void FreeClosure()
cond_free(Closure->dDumpDir);
cond_free(Closure->dDumpPrefix);
if(Closure->crcBuf)
FreeCrcBuf(Closure->crcBuf);
if(Closure->logString)
g_string_free(Closure->logString, TRUE);
@@ -658,46 +715,6 @@ void FreeClosure()
{ g_mutex_clear(Closure->logLock);
g_free(Closure->logLock);
}
#ifdef WITH_GUI_YES
if(Closure->prefsContext)
GuiFreePreferences(Closure->prefsContext);
if(Closure->rawEditorContext)
GuiFreeRawEditorContext(Closure->rawEditorContext);
if(Closure->drawGC)
g_object_unref(Closure->drawGC);
cond_free(Closure->background);
cond_free(Closure->foreground);
cond_free(Closure->grid);
cond_free(Closure->redText);
cond_free(Closure->greenText);
cond_free(Closure->barColor);
cond_free(Closure->logColor);
cond_free(Closure->curveColor);
cond_free(Closure->redSector);
cond_free(Closure->yellowSector);
cond_free(Closure->greenSector);
cond_free(Closure->blueSector);
cond_free(Closure->whiteSector);
cond_free(Closure->darkSector);
cond_free(Closure->redMarkup);
cond_free(Closure->greenMarkup);
cond_free(Closure->invisibleDash);
GuiFreeCurve(Closure->readLinearCurve);
GuiFreeSpiral(Closure->readLinearSpiral);
GuiFreeSpiral(Closure->readAdaptiveSpiral);
if(Closure->readAdaptiveSubtitle)
g_free(Closure->readAdaptiveSubtitle);
if(Closure->readAdaptiveErrorMsg)
g_free(Closure->readAdaptiveErrorMsg);
#endif /* WITH_GUI_YES */
g_free(Closure);
}

View File

@@ -110,7 +110,7 @@ int GuiCurveLX(Curve *curve, gdouble x)
return 1 + curve->leftX + (x * width) / (gdouble)curve->maxX;
}
int GuiCurveY(Curve *curve, gdouble y)
gdouble GuiCurveY(Curve *curve, gdouble y)
{ gdouble hfact;
hfact = (gdouble)(curve->bottomY - curve->topY)
@@ -135,22 +135,24 @@ int GuiCurveLogY(Curve *curve, gdouble y) /* not really a log */
***/
void GuiUpdateCurveGeometry(Curve *curve, char *largest_left_label, int right_padding)
{ GtkAllocation *a = &curve->widget->allocation;
{ GtkAllocation a = {0};
int w,h;
gtk_widget_get_allocation(curve->widget, &a);
/* Top and bottom margins */
GuiSetText(curve->layout, curve->leftLabel, &w, &h);
curve->topY = h + 10;
GuiSetText(curve->layout, "0123456789", &w, &h);
curve->bottomY = a->height - h - 10;
curve->bottomY = a.height - h - 10;
/* Left and right margins */
GuiSetText(curve->layout, largest_left_label, &w, &h);
curve->leftX = 5 + 6 + 3 + w;
curve->rightX = a->width - right_padding;
curve->rightX = a.width - right_padding;
/* Add space for the lograithmic curve */
@@ -167,32 +169,23 @@ void GuiUpdateCurveGeometry(Curve *curve, char *largest_left_label, int right_pa
*** Redraw the coordinate axes
***/
void GuiRedrawAxes(Curve *curve)
{ GdkDrawable *d = curve->widget->window;
int i,w,h,x,y;
void GuiRedrawAxes(cairo_t *cr, Curve *curve)
{ int i,w,h,x,y;
int yg=0;
int step;
int bottom_y;
/* Draw and label the left coordinate axis */
cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
cairo_set_line_width(cr, 1);
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_draw_line(d, Closure->drawGC,
curve->leftX, curve->topY, curve->leftX, curve->bottomY);
if(curve->enable & DRAW_LCURVE)
{ gdk_draw_line(d, Closure->drawGC,
curve->leftX, curve->topLY, curve->leftX, curve->bottomLY);
}
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->curveColor);
GuiSetText(curve->layout, curve->leftLabel, &w, &h);
x = curve->leftX - w/2;
if(x < 5) x = 5;
gdk_draw_layout(d, Closure->drawGC,
x, curve->topY - h - 5, curve->layout);
/* Get foreground and grid colors */
GdkRGBA fg = {0};
GtkStyleContext *context = gtk_widget_get_style_context(curve->widget);
gtk_style_context_get_color(context, gtk_widget_get_state_flags(curve->widget), &fg);
GdkRGBA grid = fg;
grid.alpha = 0.25;
/* Draw and label the grid lines for the log curve */
@@ -200,44 +193,54 @@ void GuiRedrawAxes(Curve *curve)
{ int val;
char buf[16];
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->logColor);
gdk_cairo_set_source_rgba(cr, Closure->logColor);
GuiSetText(curve->layout, curve->leftLogLabel, &w, &h);
x = curve->leftX - w/2;
if(x < 5) x = 5;
gdk_draw_layout(d, Closure->drawGC,
x, curve->topLY - h - 5, curve->layout);
cairo_move_to(cr, x, curve->topLY - h - 5);
pango_cairo_show_layout(cr, curve->layout);
for(val=400; val>3; val/=2)
{ y = GuiCurveLogY(curve, val);
sprintf(buf,"%d",val);
GuiSetText(curve->layout, buf, &w, &h);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->logColor);
gdk_draw_layout(d, Closure->drawGC, curve->leftX-9-w, y-h/2, curve->layout);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_draw_line(d, Closure->drawGC, curve->leftX-6, y, curve->leftX, y);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->grid);
gdk_draw_line(d, Closure->drawGC, curve->leftX, y, curve->rightX, y);
sprintf(buf,"%d",val);
GuiSetText(curve->layout, buf, &w, &h);
gdk_cairo_set_source_rgba(cr, Closure->logColor);
cairo_move_to(cr, curve->leftX-9-w, y-h/2);
pango_cairo_show_layout(cr, curve->layout);
gdk_cairo_set_source_rgba(cr, &fg);
cairo_move_to(cr, curve->leftX-6 + 0.5, y + 0.5);
cairo_line_to(cr, curve->leftX + 0.5, y + 0.5);
cairo_stroke(cr);
gdk_cairo_set_source_rgba(cr, &grid);
cairo_move_to(cr, curve->leftX + 0.5, y + 0.5);
cairo_line_to(cr, curve->rightX + 0.5, y + 0.5);
cairo_stroke(cr);
val /=2;
y = GuiCurveLogY(curve, val);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_draw_line(d, Closure->drawGC, curve->leftX-3, y, curve->leftX, y);
val /=2;
y = GuiCurveLogY(curve, val);
gdk_cairo_set_source_rgba(cr, &fg);
cairo_move_to(cr, curve->leftX-3 + 0.5, y + 0.5);
cairo_line_to(cr, curve->leftX + 0.5, y + 0.5);
cairo_stroke(cr);
if(curve->bottomLY-curve->topLY > 8*h)
{ sprintf(buf,"%d",val);
GuiSetText(curve->layout, buf, &w, &h);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->logColor);
gdk_draw_layout(d, Closure->drawGC, curve->leftX-9-w, y-h/2, curve->layout);
}
if(curve->bottomLY-curve->topLY > 8*h)
{ sprintf(buf,"%d",val);
GuiSetText(curve->layout, buf, &w, &h);
gdk_cairo_set_source_rgba(cr, Closure->logColor);
cairo_move_to(cr, curve->leftX-9-w, y-h/2);
pango_cairo_show_layout(cr, curve->layout);
}
}
}
/* Draw and label the grid lines for the normal curve */
if(curve->maxY < 20) step = 4;
else step = 10;
if(curve->maxY > 20) step = 10;
else if(curve->maxY > 10) step = 4;
else if(curve->maxY > 4) step = 2;
else step = 1;
for(i=0; i<=curve->maxY; i+=step)
{ char buf[4];
@@ -246,42 +249,75 @@ void GuiRedrawAxes(Curve *curve)
GuiSetText(curve->layout, buf, &w, &h);
y = yg = GuiCurveY(curve, i);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->curveColor);
gdk_draw_layout(d, Closure->drawGC, curve->leftX-9-w, y-h/2, curve->layout);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_draw_line(d, Closure->drawGC, curve->leftX-6, y, curve->leftX, y);
gdk_cairo_set_source_rgba(cr, Closure->curveColor);
cairo_move_to(cr, curve->leftX-9-w, y-h/2);
pango_cairo_show_layout(cr, curve->layout);
gdk_cairo_set_source_rgba(cr, &fg);
cairo_move_to(cr, curve->leftX-6 + 0.5, y + 0.5);
cairo_line_to(cr, curve->leftX + 0.5, y + 0.5);
cairo_stroke(cr);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->grid);
gdk_draw_line(d, Closure->drawGC, curve->leftX, y, curve->rightX, y);
gdk_cairo_set_source_rgba(cr, &grid);
cairo_move_to(cr, curve->leftX + 0.5, y + 0.5);
cairo_line_to(cr, curve->rightX + 0.5, y + 0.5);
cairo_stroke(cr);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_cairo_set_source_rgba(cr, &fg);
y = GuiCurveY(curve, i+step/2);
if(y >= curve->topY)
gdk_draw_line(d, Closure->drawGC, curve->leftX-3, y, curve->leftX, y);
if(y >= curve->topY) {
cairo_move_to(cr, curve->leftX-3 + 0.5, y + 0.5);
cairo_line_to(cr, curve->leftX + 0.5, y + 0.5);
cairo_stroke(cr);
}
}
/* Draw the right coordinate axis */
/* Draw and label the left coordinate axis */
gdk_cairo_set_source_rgba(cr, &fg);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_draw_line(d, Closure->drawGC,
curve->rightX, curve->topY, curve->rightX, curve->bottomY);
cairo_move_to(cr, curve->leftX + 0.5, curve->topY + 0.5);
cairo_line_to(cr, curve->leftX + 0.5, curve->bottomY + 0.5);
cairo_stroke(cr);
if(curve->enable & DRAW_LCURVE)
gdk_draw_line(d, Closure->drawGC,
curve->rightX, curve->topLY, curve->rightX, curve->bottomLY);
{ cairo_move_to(cr, curve->leftX + 0.5, curve->topLY + 0.5);
cairo_line_to(cr, curve->leftX + 0.5, curve->bottomLY + 0.5);
cairo_stroke(cr);
}
gdk_cairo_set_source_rgba(cr, Closure->curveColor);
GuiSetText(curve->layout, curve->leftLabel, &w, &h);
x = curve->leftX - w/2;
if(x < 5) x = 5;
cairo_move_to(cr, x, curve->topY - h - 5);
pango_cairo_show_layout(cr, curve->layout);
/* Draw the right coordinate axis */
gdk_cairo_set_source_rgba(cr, &fg);
cairo_move_to(cr, curve->rightX + 0.5, curve->topY + 0.5);
cairo_line_to(cr, curve->rightX + 0.5, curve->bottomY + 0.5);
cairo_stroke(cr);
if(curve->enable & DRAW_LCURVE) {
cairo_move_to(cr, curve->rightX + 0.5, curve->topLY + 0.5);
cairo_line_to(cr, curve->rightX + 0.5, curve->bottomLY + 0.5);
cairo_stroke(cr);
}
/* Draw and label the bottom coordinate axis */
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_cairo_set_source_rgba(cr, &fg);
gdk_draw_line(d, Closure->drawGC,
curve->leftX, curve->bottomY, curve->rightX, curve->bottomY);
cairo_move_to(cr, curve->leftX + 0.5, curve->bottomY + 0.5);
cairo_line_to(cr, curve->rightX + 0.5, curve->bottomY + 0.5);
cairo_stroke(cr);
if(curve->enable & DRAW_LCURVE)
{ gdk_draw_line(d, Closure->drawGC,
curve->leftX, curve->bottomLY, curve->rightX, curve->bottomLY);
{ cairo_move_to(cr, curve->leftX + 0.5, curve->bottomLY + 0.5);
cairo_line_to(cr, curve->rightX + 0.5, curve->bottomLY + 0.5);
cairo_stroke(cr);
bottom_y = curve->bottomLY;
}
else bottom_y = curve->bottomY;
@@ -310,21 +346,32 @@ void GuiRedrawAxes(Curve *curve)
GuiSetText(curve->layout, buf, &w, &h);
x = GuiCurveLX(curve,i)-1;
gdk_draw_line(d, Closure->drawGC, x, bottom_y+6, x, bottom_y);
gdk_draw_layout(d, Closure->drawGC, x-w/2, bottom_y+8, curve->layout);
cairo_move_to(cr, x + 0.5, bottom_y+6 + 0.5);
cairo_line_to(cr, x + 0.5, bottom_y + 0.5);
cairo_stroke(cr);
cairo_move_to(cr, x-w/2, bottom_y+8);
pango_cairo_show_layout(cr, curve->layout);
if(i && x < curve->rightX)
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->grid);
gdk_draw_line(d, Closure->drawGC, x, curve->bottomY-1, x, yg);
{ gdk_cairo_set_source_rgba(cr, &grid);
cairo_move_to(cr, x + 0.5, curve->bottomY-1 + 0.5);
cairo_line_to(cr, x + 0.5, yg + 0.5);
cairo_stroke(cr);
if(curve->enable & DRAW_LCURVE)
gdk_draw_line(d, Closure->drawGC, x, curve->bottomLY-1, x, curve->topLY);
if(curve->enable & DRAW_LCURVE) {
cairo_move_to(cr, x + 0.5, curve->bottomLY-1 + 0.5);
cairo_line_to(cr, x + 0.5, curve->topLY + 0.5);
cairo_stroke(cr);
}
}
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_cairo_set_source_rgba(cr, &fg);
x = GuiCurveLX(curve,i+step/2)-1;
if(x < curve->rightX)
gdk_draw_line(d, Closure->drawGC, x, bottom_y+3, x, bottom_y);
if(x < curve->rightX) {
cairo_move_to(cr, x + 0.5, bottom_y+3 + 0.5);
cairo_line_to(cr, x + 0.5, bottom_y + 0.5);
cairo_stroke(cr);
}
}
}
@@ -332,52 +379,62 @@ void GuiRedrawAxes(Curve *curve)
* Redraw the curve
*/
void GuiRedrawCurve(Curve *curve, int last)
{ int i,x0,x1,fy0,fy1;
void GuiRedrawCurve(cairo_t *cr, Curve *curve, int last)
{ int i,x0,x1;
gdouble fy0;
x0 = GuiCurveX(curve, 0);
fy0 = GuiCurveY(curve, curve->fvalue[0]);
gdk_cairo_set_source_rgba(cr, Closure->curveColor);
cairo_set_line_width(cr, 1.0);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->curveColor);
/* Draw integer bar curve */
/* Draw the curve */
for(i=1; i<=last; i++)
{ x1 = GuiCurveX(curve, i);
if(curve->enable & DRAW_ICURVE)
{ int iy = GuiCurveY(curve, curve->ivalue[i]);
if(curve->ivalue[i] > 0)
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->barColor);
gdk_draw_rectangle(curve->widget->window,
Closure->drawGC, TRUE,
x0, iy, x0==x1 ? 1 : x1-x0, curve->bottomY-iy);
}
if(curve->enable & DRAW_ICURVE)
{ gdk_cairo_set_source_rgba(cr, Closure->barColor);
x0 = GuiCurveX(curve, 0);
for(i=1; i<=last; i++)
{ x1 = GuiCurveX(curve, i);
int iy = GuiCurveY(curve, curve->ivalue[i]);
if(curve->ivalue[i] > 0)
{ cairo_rectangle(cr, x0, iy, x0==x1 ? 1 : x1-x0, curve->bottomY-iy);
cairo_fill(cr);
}
x0 = x1;
}
}
if(curve->enable & DRAW_LCURVE)
{ int iy = GuiCurveLogY(curve, curve->lvalue[i]);
/* Draw logarithmic integer curve */
if(curve->lvalue[i] > 0)
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->logColor);
gdk_draw_rectangle(curve->widget->window,
Closure->drawGC, TRUE,
x0, iy, x0==x1 ? 1 : x1-x0, curve->bottomLY-iy);
}
if(curve->enable & DRAW_LCURVE)
{ x0 = GuiCurveX(curve, 0);
for(i=1; i<=last; i++)
{ gdk_cairo_set_source_rgba(cr, Closure->logColor);
x1 = GuiCurveX(curve, i);
int iy = GuiCurveLogY(curve, curve->lvalue[i]);
if(curve->lvalue[i] > 0)
{ cairo_rectangle(cr, x0, iy, x0==x1 ? 1 : x1-x0, curve->bottomLY-iy);
cairo_fill(cr);
}
x0 = x1;
}
}
if(curve->enable & DRAW_FCURVE && curve->fvalue[i] >= 0)
{ fy1 = GuiCurveY(curve, curve->fvalue[i]);
/* Draw regular (floating point) curve */
if(x0 < x1)
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->curveColor);
gdk_draw_line(curve->widget->window, Closure->drawGC, x0, fy0, x1, fy1);
fy0 = fy1;
}
if(curve->enable & DRAW_FCURVE)
{ x0 = GuiCurveX(curve, 0);
fy0 = GuiCurveY(curve, curve->fvalue[0]);
gdk_cairo_set_source_rgba(cr, Closure->curveColor);
cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
cairo_move_to(cr, x0, fy0);
for(i=1; i<=last; i++)
{ x1 = GuiCurveX(curve, i);
if(x0 < x1 && curve->fvalue[i] >= 0)
{ cairo_line_to(cr, x1, GuiCurveY(curve, curve->fvalue[i]));
x0 = x1;
}
}
x0 = x1;
cairo_stroke(cr);
}
}
#endif /* WITH_GUI_YES */

View File

@@ -367,9 +367,9 @@ int main(int argc, char *argv[])
}
break;
}
case 'o': if(!strcmp(optarg, "file"))
case 'o': if(optarg && !strcmp(optarg, "file"))
Closure->eccTarget = ECC_FILE;
else if(!strcmp(optarg, "image"))
else if(optarg && !strcmp(optarg, "image"))
Closure->eccTarget = ECC_IMAGE;
else Stop(_("-o/--ecc-target expects 'file' or 'image'"));
break;
@@ -950,94 +950,97 @@ int main(int argc, char *argv[])
/* TRANSLATORS: Program options like -r and --read are not to be translated
to avoid confusion when discussing the program in international forums. */
PrintCLI(_("\nCommon usage examples:\n"
" dvdisaster -r,--read # Read the medium image to hard disk.\n"
" # Use -rn-m to read a certain sector range, e.g. -r100-200\n"
" dvdisaster -c,--create # Create .ecc information for the medium image.\n"
" dvdisaster -f,--fix # Try to fix medium image using .ecc information.\n"
" dvdisaster -s,--scan # Scan the medium for read errors.\n"
" dvdisaster -t,--test # Test integrity of the .iso and .ecc files.\n"
" dvdisaster -z,--strip # Strip ECC data from an augmented .iso.\n"
" dvdisaster -u,--unlink # Delete .iso files (when other actions complete)\n\n"));
" dvdisaster -r, --read # Read the medium image to hard disk.\n"
" # Use -rn-m to read a certain sector range, e.g. -r100-200\n"
" dvdisaster -c, --create # Create .ecc information for the medium image.\n"
" dvdisaster -f, --fix # Try to fix medium image using .ecc information.\n"
" dvdisaster -s, --scan # Scan the medium for read errors.\n"
" dvdisaster -t, --test # Test integrity of the .iso and .ecc files.\n"
" dvdisaster -z, --strip # Strip ECC data from an augmented .iso.\n"
" dvdisaster -u, --unlink # Delete .iso files (when other actions complete)\n\n"));
PrintCLI(_("Drive and file specification:\n"
" -d,--device device - read from given device (default: %s)\n"
" -p,--prefix prefix - prefix of .iso/.ecc file (default: medium.* )\n"
" -i,--image imagefile - name of image file (default: medium.iso)\n"
" -e,--ecc eccfile - name of parity file (default: medium.ecc)\n"
" -o,--ecc-target [file image] - where to put ecc data in RS03\n"),
" -d, --device device - read from given device (default: %s)\n"
" -p, --prefix prefix - prefix of .iso/.ecc file (default: medium.* )\n"
" -i, --image imagefile - name of image file (default: medium.iso)\n"
" -e, --ecc eccfile - name of parity file (default: medium.ecc)\n"
" -o, --ecc-target imagefile - where to put ecc data in RS03\n"),
Closure->device);
PrintCLI("\n");
PrintCLI(_("Tweaking options (see manual before using!)\n"));
PrintCLI(_(" -a,--assume x,y,... - assume image is augmented with codec(s) x,y,...\n"));
PrintCLI(_(" -j,--jump n - jump n sectors forward after a read error (default: 16)\n"));
PrintCLI(_(" -m n - list/select error correction methods (default: RS01)\n"));
PrintCLI(_(" -n,--redundancy n%% - error correction data redundancy\n"
" allowed values depend on codec (see manual)\n"));
PrintCLI(_(" -v,--verbose - more diagnostic messages\n"));
PrintCLI(_(" -x,--threads n - use n threads for en-/decoding (if supported by codec)\n"));
PrintCLI(_(" --adaptive-read - use optimized strategy for reading damaged media\n"));
PrintCLI(_(" --auto-suffix - automatically add .iso and .ecc file suffixes\n"));
PrintCLI(_(" --cache-size n - image cache size in MiB during -c mode (default: 32MiB)\n"));
PrintCLI(_(" --dao - assume DAO disc; do not trim image end\n"));
PrintCLI(_(" --defective-dump d - directory for saving incomplete raw sectors\n"));
PrintCLI(_(" -a, --assume x - assume image is augmented with given codec (RS02 or RS03)\n"));
PrintCLI(_(" -j, --jump n - jump n sectors forward after a read error (default: 16)\n"));
PrintCLI(_(" -m, --method x - list/select error correction methods (default: RS01)\n"));
PrintCLI(_(" -n, --redundancy n%% - error correction data redundancy\n"
" allowed values depend on codec (see manual)\n"));
PrintCLI(_(" -v, --verbose - more logs, set env VERBOSE=1 for pre-options parsing logs\n"));
PrintCLI(_(" -x, --threads n - use n threads for en-/decoding (if supported by codec)\n"));
PrintCLI(_(" --adaptive-read - use optimized strategy for reading damaged media\n"));
PrintCLI(_(" --auto-suffix - automatically add .iso and .ecc file suffixes\n"));
PrintCLI(_(" --cache-size n - image cache size in MiB during -c mode (default: 32MiB)\n"));
PrintCLI(_(" --dao - assume DAO disc; do not trim image end\n"));
PrintCLI(_(" --defective-dump d - directory for saving incomplete raw sectors\n"));
#ifdef SYS_LINUX
PrintCLI(_(" --driver=sg/cdrom - use sg(default) or alternative cdrom driver (see man page!)\n"));
PrintCLI(_(" --driver=sg/cdrom - use sg(default) or alternative cdrom driver (see man page!)\n"));
#endif
PrintCLI(_(" --eject - eject medium after successful read\n"));
PrintCLI(_(" --encoding-algorithm n - possible values: 32bit,64bit,SSE2,AltiVec\n"));
PrintCLI(_(" --encoding-io-strategy n - possible values: readwrite, mmap\n"));
PrintCLI(_(" --fill-unreadable n - fill unreadable sectors with byte n\n"));
PrintCLI(_(" --ignore-fatal-sense - continue reading after potentially fatal error conditon\n"));
PrintCLI(_(" --ignore-iso-size - ignore image size from ISO/UDF data (dangerous - see man page!)\n"));
PrintCLI(_(" --internal-rereads n - drive may attempt n rereads before reporting an error\n"));
PrintCLI(_(" --medium-info - print info about medium in drive\n"));
PrintCLI(_(" --eject - eject medium after successful read\n"));
PrintCLI(_(" --encoding-algorithm x - possible values: 32bit, 64bit, SSE2, AltiVec\n"));
PrintCLI(_(" --encoding-io-strategy x - possible values: readwrite, mmap\n"));
PrintCLI(_(" --fill-unreadable n - fill unreadable sectors with byte n\n"));
PrintCLI(_(" --ignore-fatal-sense - continue reading after potentially fatal error conditon\n"));
PrintCLI(_(" --ignore-iso-size - ignore image size from ISO/UDF data (dangerous - see man page!)\n"));
PrintCLI(_(" --internal-rereads n - drive may attempt n rereads before reporting an error\n"));
PrintCLI(_(" --medium-info - print info about medium in drive\n"));
PrintCLI(_(" --no-bdr-defect-management - use bigger RS03 images for BD-R (see man page!)\n"));
PrintCLI(_(" --no-progress - do not print progress information\n"));
PrintCLI(_(" --old-ds-marker - mark missing sectors compatible with dvdisaster <= 0.70\n"));
PrintCLI(_(" --prefetch-sectors n - prefetch n sectors for RS03 encoding (uses ~nMiB)\n"));
PrintCLI(_(" --raw-mode n - mode for raw reading CD media (20 or 21)\n"));
PrintCLI(_(" --read-attempts n-m - attempts n up to m reads of a defective sector\n"));
PrintCLI(_(" --read-medium n - read the whole medium up to n times\n"));
PrintCLI(_(" --read-raw - performs read in raw mode if possible\n"));
PrintCLI(_(" --regtest - tweaks output for compatibility with regtests\n"));
PrintCLI(_(" --resource-file p - get resource file from given path\n"));
PrintCLI(_(" --speed-warning n - print warning if speed changes by more than n percent\n"));
PrintCLI(_(" --spinup-delay n - wait n seconds for drive to spin up\n"));
PrintCLI(_(" --version - print version and some configuration info\n"));
PrintCLI(_(" --no-progress - do not print progress information\n"));
PrintCLI(_(" --old-ds-marker - mark missing sectors compatible with dvdisaster <= 0.70\n"));
PrintCLI(_(" --prefetch-sectors n - prefetch n sectors for RS03 encoding (uses ~nMiB)\n"));
PrintCLI(_(" --raw-mode n - mode for raw reading CD media (20 or 21)\n"));
PrintCLI(_(" --read-attempts n-m - attempts n up to m reads of a defective sector\n"));
PrintCLI(_(" --read-medium n - read the whole medium up to n times\n"));
PrintCLI(_(" --read-raw - performs read in raw mode if possible\n"));
PrintCLI(_(" --regtest - tweaks output for compatibility with regtests\n"));
PrintCLI(_(" --resource-file p - get resource file from given path\n"));
PrintCLI(_(" --speed-warning n - print warning if speed changes by more than n percent\n"));
PrintCLI(_(" --spinup-delay n - wait n seconds for drive to spin up\n"));
PrintCLI(_(" --version - print version and some configuration info\n"));
PrintCLI(_(" --debug - allow advanced dangerous options (use with --help for a list)\n"));
if(Closure->debugMode)
{ PrintCLI("\n");
PrintCLI(_("Debugging options (purposefully undocumented and possibly harmful)\n"));
PrintCLI(_(" --debug - enables the following options\n"));
PrintCLI(_(" --permissive-medium-type - allow more media types, even theoretically unsupported ones\n"));
PrintCLI(_(" --byteset s,i,b - set byte i in sector s to b\n"));
PrintCLI(_(" --cdump - creates C #include file dumps instead of hexdumps\n"));
PrintCLI(_(" --compare-images a,b - compare sectors in images a and b\n"));
PrintCLI(_(" --copy-sector a,n,b,m - copy sector n from image a to sector m in image b\n"));
PrintCLI(_(" --erase sector - erase the given sector\n"));
PrintCLI(_(" --erase n-m - erase sectors n - m, inclusively\n"));
PrintCLI(_(" --examine-rs02 - force RS02 exhaustive search\n"));
PrintCLI(_(" --examine-rs03 - force RS03 exhaustive search\n"));
PrintCLI(_(" --fixed-speed-values - output fixed speed values for better output diffing\n"));
PrintCLI(_(" --ignore-rs03-header - ignore RS03 header when repairing (forcing a full search)\n"));
PrintCLI(_(" --marked-image n - create image with n marked random sectors\n"));
PrintCLI(_(" --merge-images a,b merge image a with b (a receives sectors from b)\n"));
PrintCLI(_(" --random-errors e - seed image with (correctable) random errors\n"));
PrintCLI(_(" --random-image n - create image with n sectors of random numbers\n"));
PrintCLI(_(" --random-seed n - random seed for built-in random number generator\n"));
PrintCLI(_(" --raw-sector n - shows hexdump of the given raw sector from medium in drive\n"));
PrintCLI(_(" --read-sector n - shows hexdump of the given sector from medium in drive\n"));
PrintCLI(_(" --screen-shot - useful for generating screen shots\n"));
PrintCLI(_(" --send-cdb arg - executes given cdb at drive; kills system if used wrong\n"));
PrintCLI(_(" --set-version - set program version for debugging purposes (dangerous!)\n"));
PrintCLI(_(" --show-header n - assumes given sector is a ecc header and prints it\n"));
PrintCLI(_(" --show-sector n - shows hexdump of the given sector in an image file\n"));
PrintCLI(_(" --sim-cd image - simulate a SCSI-Level CD with contents supplied by the ISO image\n"));
PrintCLI(_(" --sim-defects n - simulate n%% defective sectors on medium\n"));
PrintCLI(_(" --truncate n - truncates image to n sectors\n"));
PrintCLI(_(" --zero-unreadable - replace the \"unreadable sector\" markers with zeros\n\n"));
PrintCLI(_(" --byteset s,i,b - set byte i in sector s to b\n"));
PrintCLI(_(" --cdump - creates C #include file dumps instead of hexdumps\n"));
PrintCLI(_(" --compare-images a,b - compare sectors in images a and b\n"));
PrintCLI(_(" --copy-sector a,n,b,m - copy sector n from image a to sector m in image b\n"));
PrintCLI(_(" --erase sector - erase the given sector\n"));
PrintCLI(_(" --erase n-m - erase sectors n - m, inclusively\n"));
PrintCLI(_(" --examine-rs02 - force RS02 exhaustive search\n"));
PrintCLI(_(" --examine-rs03 - force RS03 exhaustive search\n"));
PrintCLI(_(" --fixed-speed-values - output fixed speed values for better output diffing\n"));
PrintCLI(_(" --ignore-rs03-header - ignore RS03 header when repairing (forcing a full search)\n"));
PrintCLI(_(" --marked-image n - create image with n marked random sectors\n"));
PrintCLI(_(" --merge-images a,b - merge image a with b (a receives sectors from b)\n"));
PrintCLI(_(" --random-errors e - seed image with (correctable) random errors\n"));
PrintCLI(_(" --random-image n - create image with n sectors of random numbers\n"));
PrintCLI(_(" --random-seed n - random seed for built-in random number generator\n"));
PrintCLI(_(" --raw-sector n - shows hexdump of the given raw sector from medium in drive\n"));
PrintCLI(_(" --read-sector n - shows hexdump of the given sector from medium in drive\n"));
PrintCLI(_(" --redundancy n - for RS03, specify the target augmented image size manually,\n"
" note that you'll also need to specify it to verify or repair\n"
" the image, so ensure you write this value down!\n"));
PrintCLI(_(" --screen-shot - useful for generating screen shots\n"));
PrintCLI(_(" --send-cdb arg - executes given cdb at drive; kills system if used wrong\n"));
PrintCLI(_(" --set-version - set program version for debugging purposes (dangerous!)\n"));
PrintCLI(_(" --show-header n - assumes given sector is a ecc header and prints it\n"));
PrintCLI(_(" --show-sector n - shows hexdump of the given sector in an image file\n"));
PrintCLI(_(" --sim-cd image - simulate a SCSI-Level CD with contents supplied by the ISO image\n"));
PrintCLI(_(" --sim-defects n - simulate n%% defective sectors on medium\n"));
PrintCLI(_(" --truncate n - truncates image to n sectors\n"));
PrintCLI(_(" --zero-unreadable - replace the \"unreadable sector\" markers with zeros\n\n"));
}
FreeClosure();
@@ -1071,6 +1074,9 @@ int main(int argc, char *argv[])
}
}
/* Going to use the GUI, tell the user most command-line options are ignored as we're restoring the GUI prefs */
PrintCLI(_("Using GUI mode: most command-line options are ignored. Look at the preferences in the GUI instead.\n"));
Closure->guiMode = TRUE;
GuiReadDotfile();
GuiCreateMainWindow(&argc, &argv);

View File

@@ -87,11 +87,11 @@ typedef void GtkNotebook;
typedef int GtkMessageType;
typedef void GtkScrolledWindow;
typedef void GtkTextBuffer;
typedef void GtkTooltips;
typedef void GtkTooltip;
typedef void GtkWidget;
typedef void GtkWindow;
typedef void GdkColor;
typedef void GdkRGBA;
typedef void GdkDrawable;
typedef void GdkGC;
typedef void GdkPixbuf;
@@ -296,7 +296,6 @@ typedef struct _GlobalClosure
int defectiveDump; /* dump non-recoverable sectors into given path */
char *dDumpDir; /* directory for above */
char *dDumpPrefix; /* file name prefix for above */
int reverseCancelOK; /* if TRUE the button order is reversed */
int eject; /* eject medium on success */
int readingPasses; /* try to read medium n times */
int pauseAfter; /* pause after given amount of minutes */
@@ -348,7 +347,7 @@ typedef struct _GlobalClosure
/*** Widgets of the main window */
GtkWindow *window; /* main window */
GtkTooltips *tooltips; /* our global tooltips structure */
GtkTooltip *tooltips; /* our global tooltips structure */
GdkPixbuf *windowIcon; /* main window icon */
GdkPixbuf *tooltipOn; /* pixbuf of the tooltip icon */
GdkPixbuf *tooltipOff; /* pixbuf of a fully transparent icon */
@@ -394,27 +393,24 @@ typedef struct _GlobalClosure
/*** Common stuff for drawing curves and spirals */
GdkGC *drawGC;
GdkColor *background,*foreground,*grid;
GdkColor *redText;
GdkRGBA *redText;
char *redMarkup;
GdkColor *greenText;
GdkRGBA *greenText;
char *greenMarkup;
GdkColor *barColor;
GdkColor *logColor;
GdkColor *curveColor;
GdkColor *redSector;
GdkColor *yellowSector;
GdkColor *greenSector;
GdkColor *blueSector;
GdkColor *whiteSector;
GdkColor *darkSector;
char *invisibleDash;
GdkRGBA *barColor;
GdkRGBA *logColor;
GdkRGBA *curveColor;
GdkRGBA *redSector;
GdkRGBA *yellowSector;
GdkRGBA *greenSector;
GdkRGBA *blueSector;
GdkRGBA *whiteSector;
GdkRGBA *darkSector;
/*** Widgets for the linear reading/scanning action */
GtkWidget *readLinearHeadline;
GtkWidget *readLinearDrawingArea;
GtkWidget *readLinearCurveArea;
struct _Curve *readLinearCurve;
struct _Spiral *readLinearSpiral;
GtkWidget *readLinearNotebook;
@@ -438,6 +434,10 @@ typedef struct _GlobalClosure
extern GlobalClosure *Closure; /* these should be the only global variables! */
extern int exitCode; /* value to use on exit() */
#ifdef WITH_GUI_YES
extern GdkRGBA transparent;
#endif /* WITH_GUI_YES */
/***
***
***/
@@ -576,7 +576,7 @@ int VerifySignature(void);
#ifdef WITH_GUI_YES
void GuiDefaultColors(void);
void GuiReadDotfile(void);
void GuiUpdateMarkup(char**, GdkColor*);
void GuiUpdateMarkup(char**, GdkRGBA*);
#endif
/***
@@ -690,11 +690,11 @@ void GuiFreeCurve(Curve*);
void GuiUpdateCurveGeometry(Curve*, char*, int);
int GuiCurveX(Curve*, gdouble);
int GuiCurveY(Curve*, gdouble);
gdouble GuiCurveY(Curve*, gdouble);
int GuiCurveLogY(Curve*, gdouble);
void GuiRedrawAxes(Curve*);
void GuiRedrawCurve(Curve*, int);
void GuiRedrawAxes(cairo_t *cr, Curve*);
void GuiRedrawCurve(cairo_t *cr, Curve*, int);
#endif
/***
@@ -877,14 +877,6 @@ int SearchPlausibleSector(struct _RawBuffer*, int);
int BruteForceSearchPlausibleSector(struct _RawBuffer*);
int AckHeuristic(struct _RawBuffer*);
/***
*** icon-factory.c
***/
#ifdef WITH_GUI_YES
void GuiCreateIconFactory();
#endif
/***
*** image.c
***/
@@ -1190,7 +1182,7 @@ int GetLongestTranslation(char*, ...);
void vLogWarning(char*, va_list);
void LogWarning(char*, ...) PRINTF_FORMAT(1);
void Stop(char*, ...) PRINTF_FORMAT(1);
void Stop(char*, ...) __attribute__((noreturn)) PRINTF_FORMAT(1);
void RegisterCleanup(char*, void (*)(gpointer), gpointer);
void UnregisterCleanup(void);
@@ -1209,7 +1201,6 @@ void GuiExitWorkerThread();
int GuiGetLabelWidth(GtkLabel*, char*, ...) PRINTF_FORMAT(2);
void GuiLockLabelSize(GtkWidget*, char*, ...) PRINTF_FORMAT(2);
int GuiModalDialog(GtkMessageType, GtkButtonsType, void (*)(GtkDialog*), char*, ...) PRINTF_FORMAT(4);
void GuiReverseCancelOK(GtkDialog*);
void GuiSetLabelText(GtkWidget*, char*, ...) PRINTF_FORMAT(2);
void GuiShowMessage(GtkWindow*, char*, GtkMessageType);
void GuiSetProgress(GtkWidget*, int, int);
@@ -1225,7 +1216,6 @@ void GuiSwitchAndSetFootline(GtkWidget*, int, GtkWidget*, char*, ...) PRINTF_FOR
#define GuiGetLabelWidth(l, c, args...) (0)
#define GuiLockLabelSize(w, c, args...)
#define GuiModalDialog(a, b, c, d, args...) (0)
#define GuiReverseCancelOK(d)
#define GuiSetLabelText(w, c, args...)
#define GuiShowMessage(w, a, b)
#define GuiSetProgress(w, a, b)
@@ -1341,11 +1331,11 @@ void ReadMediumAdaptive(gpointer);
#ifdef WITH_GUI_YES
void GuiClipReadAdaptiveSpiral(int);
void GuiChangeSegmentColor(GdkColor*, int);
void GuiChangeSegmentColor(GdkRGBA*, int);
void GuiRemoveFillMarkers();
void GuiSetAdaptiveReadSubtitle(char*);
void GuiSetAdaptiveReadFootline(char*, GdkColor*);
void GuiSetAdaptiveReadFootline(char*, GdkRGBA*);
void GuiSetAdaptiveReadMinimumPercentage(int);
void GuiUpdateAdaptiveResults(gint64, gint64, gint64, int);
@@ -1525,31 +1515,31 @@ void EndIterativeSmartLEC(void*);
***/
typedef struct _Spiral
{ GdkDrawable *drawable;
{ GtkWidget *widget;
int mx, my;
int startRadius;
int segmentSize;
int segmentCount;
double *segmentPos;
GdkColor **segmentColor;
GdkColor *outline;
GdkRGBA **segmentColor;
GdkRGBA **segmentOutline;
int diameter;
int segmentClipping;
int cursorPos;
GdkColor *colorUnderCursor;
gint lastRenderedCursorPos; /* use with atomic operations */
} Spiral;
#ifdef WITH_GUI_YES
Spiral* GuiCreateSpiral(GdkColor*, GdkColor*, int, int, int);
Spiral* GuiCreateSpiral(GdkRGBA*, int, int, int);
void GuiSetSpiralWidget(Spiral*, GtkWidget*);
void GuiFreeSpiral(Spiral*);
void GuiFillSpiral(Spiral*, GdkColor*);
void GuiDrawSpiral(Spiral*);
void GuiDrawSpiralSegment(Spiral*, GdkColor*, int);
void GuiDrawSpiralLabel(Spiral*, PangoLayout*, char*, GdkColor*, int, int);
void GuiFillSpiral(Spiral*, GdkRGBA*);
void GuiDrawSpiral(cairo_t *cr, Spiral*);
void GuiDrawSpiralLabel(cairo_t *cr, Spiral*, PangoLayout*, char*, GdkRGBA*, int, int);
void GuiChangeSpiralCursor(Spiral*, int);
void GuiMoveSpiralCursor(Spiral*, int);
void GuiSetSpiralSegmentColor(Spiral*, GdkRGBA*, GdkRGBA*, int);
#else
#define GuiChangeSpiralCursor(a, b)
#define GuiFreeSpiral(s)

View File

@@ -150,7 +150,7 @@ ReedSolomonTables *CreateReedSolomonTables(GaloisTables *gt,
* respectively (ndata+sp) mod nroots = 0 after working in all ndata layers.
*/
rt->shiftInit = rt->nroots - rt->ndata % rt->nroots;
rt->shiftInit = (rt->nroots == 0 ? 0 : rt->nroots - rt->ndata % rt->nroots);
if(rt->shiftInit == rt->nroots)
rt->shiftInit = 0;

View File

@@ -72,7 +72,7 @@ static int* get_new_int(LabelWithOnlineHelp* lwoh)
*/
static gint help_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
{ GtkWidget *lab = GTK_BIN(widget)->child;
{ GtkWidget *lab = gtk_bin_get_child(GTK_BIN(widget));
LabelWithOnlineHelp *lwoh = (LabelWithOnlineHelp*)data;
switch(event->type)
@@ -130,6 +130,7 @@ LabelWithOnlineHelp* GuiCreateLabelWithOnlineHelp(char *title, char *ascii_text)
gtk_window_set_title(GTK_WINDOW(window), lwoh->windowTitle);
gtk_window_set_icon(GTK_WINDOW(window), Closure->windowIcon);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 420, 0);
lwoh->outerPadding = 12;
gtk_container_set_border_width(GTK_CONTAINER(window), lwoh->outerPadding);
@@ -141,17 +142,25 @@ LabelWithOnlineHelp* GuiCreateLabelWithOnlineHelp(char *title, char *ascii_text)
/* Create the main layout of the window */
lwoh->vbox = vbox = gtk_vbox_new(FALSE, 0);
lwoh->vbox = vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
hbox = gtk_hbox_new(FALSE, 0);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
button = gtk_button_new();
GtkWidget *button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add(GTK_CONTAINER(button), button_box);
GtkWidget *icon = gtk_image_new_from_icon_name("close", GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_box_pack_start(GTK_BOX(button_box), icon, FALSE, FALSE, 2);
GtkWidget *lab = gtk_label_new(_("Close"));
gtk_box_pack_start(GTK_BOX(button_box), lab, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(close_cb), lwoh);
gtk_box_pack_end(GTK_BOX(vbox), gtk_hseparator_new(), FALSE, FALSE, 6);
gtk_box_pack_end(GTK_BOX(vbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 6);
/*** Put link label into an event box */
@@ -233,9 +242,11 @@ void GuiFreeLabelWithOnlineHelp(LabelWithOnlineHelp *lwoh)
* Add a paragraph of text to the help window
*/
static gboolean wrapper_fix_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
static gboolean wrapper_fix_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ int *last_width = (int*)data;
int label_width = widget->allocation.width;
GtkAllocation a = {0};
gtk_widget_get_allocation(widget, &a);
int label_width = a.width;
if(*last_width == label_width) /* short circuit expose events */
return FALSE; /* without size changes */
@@ -265,7 +276,8 @@ void GuiAddHelpParagraph(LabelWithOnlineHelp *lwoh, char *format, ...)
g_free(utf);
g_free(text);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(label), 0.0);
gtk_label_set_yalign(GTK_LABEL(label), 0.0);
gtk_box_pack_start(GTK_BOX(lwoh->vbox), label, FALSE, FALSE, 0);
/* Work around some bugs in the gtk line wrapper code.
@@ -274,7 +286,7 @@ void GuiAddHelpParagraph(LabelWithOnlineHelp *lwoh, char *format, ...)
which is, well, stupid. */
gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
g_signal_connect(label, "expose_event", G_CALLBACK(wrapper_fix_cb), get_new_int(lwoh));
g_signal_connect(label, "draw", G_CALLBACK(wrapper_fix_cb), get_new_int(lwoh));
}
/*
@@ -285,13 +297,14 @@ void GuiAddHelpParagraph(LabelWithOnlineHelp *lwoh, char *format, ...)
void GuiAddHelpListItem(LabelWithOnlineHelp *lwoh, char *format, ...)
{ GtkWidget *label = gtk_label_new(NULL);
GtkWidget *bullet = gtk_label_new(" - ");
GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
va_list argp;
char *text,*utf;
gtk_box_pack_start(GTK_BOX(lwoh->vbox), hbox, FALSE, FALSE, 0);
gtk_misc_set_alignment(GTK_MISC(bullet), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(bullet), 0.0);
gtk_label_set_yalign(GTK_LABEL(bullet), 0.0);
gtk_box_pack_start(GTK_BOX(hbox), bullet, FALSE, FALSE, 0);
va_start(argp, format);
@@ -303,7 +316,8 @@ void GuiAddHelpListItem(LabelWithOnlineHelp *lwoh, char *format, ...)
g_free(utf);
g_free(text);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(label), 0.0);
gtk_label_set_yalign(GTK_LABEL(label), 0.0);
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
/* Work around some bugs in the gtk line wrapper code.
@@ -312,7 +326,7 @@ void GuiAddHelpListItem(LabelWithOnlineHelp *lwoh, char *format, ...)
which is, well, stupid. */
gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
g_signal_connect(label, "expose_event", G_CALLBACK(wrapper_fix_cb), get_new_int(lwoh));
g_signal_connect(label, "draw", G_CALLBACK(wrapper_fix_cb), get_new_int(lwoh));
}
/*
@@ -322,7 +336,7 @@ void GuiAddHelpListItem(LabelWithOnlineHelp *lwoh, char *format, ...)
void GuiAddHelpWidget(LabelWithOnlineHelp *lwoh, GtkWidget *widget)
{
gtk_box_pack_start(GTK_BOX(lwoh->vbox), widget, FALSE, FALSE, 10);
gtk_box_pack_start(GTK_BOX(lwoh->vbox), gtk_hseparator_new(), FALSE, FALSE, 10);
gtk_box_pack_start(GTK_BOX(lwoh->vbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 10);
}
/***
@@ -356,7 +370,7 @@ static gboolean log_jump_func(gpointer data)
gtk_text_buffer_place_cursor(Closure->logBuffer, &end);
a = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(Closure->logScroll));
gtk_adjustment_set_value(a, a->upper - a->page_size);
gtk_adjustment_set_value(a, gtk_adjustment_get_upper(a) - gtk_adjustment_get_page_size(a));
gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(Closure->logScroll), a);
g_mutex_unlock(Closure->logLock);
@@ -542,23 +556,24 @@ GtkWidget* GuiShowTextfile(char *title, char *explanation, char *file,
utf = g_locale_to_utf8(title, -1, NULL, NULL, NULL);
dialog = gtk_dialog_new_with_buttons(utf, Closure->window, GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
_("Close"), GTK_RESPONSE_ACCEPT, NULL);
g_free(utf);
gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 600);
g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, TRUE, TRUE, 0);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), vbox, TRUE, TRUE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
lab = gtk_label_new(NULL);
utf = g_locale_to_utf8(explanation, -1, NULL, NULL, NULL);
gtk_label_set_markup(GTK_LABEL(lab), utf);
g_free(utf);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_label_set_yalign(GTK_LABEL(lab), 0.0);
gtk_box_pack_start(GTK_BOX(vbox), lab, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0);
scroll_win = gtk_scrolled_window_new(NULL, NULL);
@@ -591,7 +606,7 @@ GtkWidget* GuiShowTextfile(char *title, char *explanation, char *file,
*/
static gint about_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
{ GtkWidget *lab = GTK_BIN(widget)->child;
{ GtkWidget *lab = gtk_bin_get_child(GTK_BIN(widget));
char *label = (char*)data;
char text[strlen(label)+80];
char *utf;
@@ -634,7 +649,8 @@ void GuiAboutText(GtkWidget *parent, char *format, ...)
tmp = g_strdup_vprintf(format, argp);
utf_text = g_locale_to_utf8(tmp, -1, NULL, NULL, NULL);
gtk_label_set_markup(GTK_LABEL(lab), utf_text);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_label_set_yalign(GTK_LABEL(lab), 0.0);
gtk_box_pack_start(GTK_BOX(parent), lab, FALSE, FALSE, 0);
g_free(tmp);
@@ -681,7 +697,7 @@ void GuiAboutTextWithLink(GtkWidget *parent, char *text, char *action)
link_end = strchr(head, ']');
if(link_start && link_end)
{ GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
{ GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(parent), hbox, FALSE, FALSE, 0);
*link_start++ = *link_end++ = 0;
@@ -723,12 +739,12 @@ void GuiAboutDialog()
about = gtk_dialog_new_with_buttons(_utf("windowtitle|About dvdisaster"),
Closure->window, GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
_("Close"), GTK_RESPONSE_ACCEPT, NULL);
g_signal_connect_swapped(about, "response", G_CALLBACK(gtk_widget_destroy), about);
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), vbox, FALSE, FALSE, 0);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(about))), vbox, FALSE, FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
/* Insert the labels */
@@ -744,7 +760,7 @@ void GuiAboutDialog()
"Copyright 2019-2021 The dvdisaster development team."
));
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 10);
@@ -764,11 +780,13 @@ void GuiAboutDialog()
GuiAboutTextWithLink(vbox, text, HOMEPAGE);
g_free(text);
GuiAboutTextWithLink(vbox, _("\nThis version is <b>not the original</b>. It has been patched\n"
"for Debian to support DVD-ROMs (with and without encryption),\n"
"and subsequently patched again to support a CLI-only build, among other things.\n\n"
"Please do not bother the original authors of dvdisaster\n"
"but submit bugreports against [GitHub] instead.\n"),
GuiAboutTextWithLink(vbox, _("\nThis version is <b>not the original</b>. It has been enhanced mainly to\n"
"add support for BD-R TL/QL and HD-DVD, add support for stripping ECC from ISOs,\n"
"add an option to generate BD-R RS03 images with more redundancy,\n"
"re-enable adaptive reading support,\n"
"port the GUI to GTK3, and a lot of other things.\n\n"
"Please do not bother the original authors of dvdisaster,\n"
"submit bugreports against [GitHub] instead.\n"),
"https://github.com/speed47/dvdisaster");
#ifdef SYS_NETBSD

View File

@@ -1,91 +0,0 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2017 Carsten Gnoerlich.
* Copyright (C) 2019-2021 The dvdisaster development team.
*
* Email: support@dvdisaster.org
*
* This file is part of dvdisaster.
*
* dvdisaster is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* dvdisaster is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with dvdisaster. If not, see <http://www.gnu.org/licenses/>.
*/
/*** src type: only GUI code ***/
#ifdef WITH_GUI_YES
#include "dvdisaster.h"
#include "inlined-icons.h"
/***
*** Create our icon factory
***/
static GdkPixbuf* create_icon(GtkIconFactory *ifact, char *name, const guint8 *inline_data)
{ GdkPixbuf *pb;
GtkIconSet *iset;
int width, height, rowstride;
/* gdk_pixbuf_new_from_inline() deprecated; recommended to replace with GResource XML crap.
One day I'll get rid of GTK+. I swear.
pb = gdk_pixbuf_new_from_inline(-1, inline_data, FALSE, NULL);
*/
rowstride = (inline_data[12] << 24) + (inline_data[13] << 16) + (inline_data[14] << 8) + inline_data[15];
width = (inline_data[16] << 24) + (inline_data[17] << 16) + (inline_data[18] << 8) + inline_data[19];
height = (inline_data[20] << 24) + (inline_data[21] << 16) + (inline_data[22] << 8) + inline_data[23];
pb = gdk_pixbuf_new_from_data(inline_data+24, GDK_COLORSPACE_RGB, TRUE, 8,
width, height, rowstride, NULL, NULL);
iset = gtk_icon_set_new_from_pixbuf(pb);
gtk_icon_factory_add(ifact, name, iset);
return pb;
}
void GuiCreateIconFactory()
{ GtkIconFactory *ifact;
/*** Create and register our icon factory */
ifact = gtk_icon_factory_new();
gtk_icon_factory_add_default(ifact);
/*** Our action icons */
create_icon(ifact, "dvdisaster-open-ecc", dvdisaster_open_ecc);
create_icon(ifact, "dvdisaster-open-img", dvdisaster_open_img);
create_icon(ifact, "dvdisaster-cd", dvdisaster_cd);
create_icon(ifact, "dvdisaster-read", dvdisaster_read);
Closure->windowIcon = create_icon(ifact, "dvdisaster-create", dvdisaster_create);
create_icon(ifact, "dvdisaster-scan", dvdisaster_scan);
create_icon(ifact, "dvdisaster-fix", dvdisaster_fix);
create_icon(ifact, "dvdisaster-verify", dvdisaster_verify);
create_icon(ifact, "dvdisaster-strip", dvdisaster_strip);
/*** Tooltip icon in preferences */
create_icon(ifact, "dvdisaster-tooltip", dvdisaster_tooltip);
create_icon(ifact, "dvdisaster-nothing", dvdisaster_nothing);
/*** Stock GTK icons to defeat theming */
create_icon(ifact, "dvdisaster-gtk-help", dvdisaster_gtk_help);
create_icon(ifact, "dvdisaster-gtk-index", dvdisaster_gtk_index);
create_icon(ifact, "dvdisaster-gtk-preferences", dvdisaster_gtk_preferences);
create_icon(ifact, "dvdisaster-gtk-quit", dvdisaster_gtk_quit);
create_icon(ifact, "dvdisaster-gtk-stop", dvdisaster_gtk_stop);
}
#endif /* WITH_GUI_YES */

View File

@@ -217,8 +217,8 @@ ssize_t LargeRead(LargeFile *lf, void *buf, size_t count)
static void insert_buttons(GtkDialog *dialog)
{
gtk_dialog_add_buttons(dialog,
GTK_STOCK_REDO , 1,
GTK_STOCK_CANCEL, 0, NULL);
_("Redo") , 1,
_("Cancel"), 0, NULL);
}
#endif

View File

@@ -250,14 +250,13 @@ void GuiContinueWithAction(int action)
* Create the action buttons and the associated notebook pages
*/
static GtkWidget *create_button(char *label, char *icon)
static GtkWidget *create_button(char *label, char *icon, gint scale)
{ GtkWidget *button,*box,*image,*lab;
char *utf_label = g_locale_to_utf8(label, -1, NULL, NULL, NULL);
button = gtk_button_new();
box = gtk_vbox_new(FALSE, 0);
image = gtk_image_new_from_stock(icon, GTK_ICON_SIZE_LARGE_TOOLBAR);
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
image = gtk_image_new_from_icon_name(icon, GTK_ICON_SIZE_LARGE_TOOLBAR);
lab = gtk_label_new(utf_label);
g_free(utf_label);
@@ -275,31 +274,34 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
int window_number = FIRST_CREATE_WINDOW;
unsigned int i;
outer_vbox = gtk_vbox_new(TRUE, 0);
vbox = gtk_vbox_new(FALSE, 0); /* needed for vertical spacing */
gint scale = gtk_widget_get_scale_factor(GTK_WIDGET(notebook));
outer_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_set_homogeneous(GTK_BOX(outer_vbox), TRUE);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); /* needed for vertical spacing */
gtk_box_pack_start(GTK_BOX(outer_vbox), vbox, TRUE, TRUE, 3);
/*** Read */
Closure->readButton = wid = create_button(_("button|Read"), "dvdisaster-read");
Closure->readButton = wid = create_button(_("button|Read"), "read-symbolic", scale);
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_READ);
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
GuiAttachTooltip(wid, _("tooltip|Read Image"),
_("Reads an optical disc image into a file (or tries to complete an existing image file)."));
content = gtk_vbox_new(FALSE, 0); /* read linear window */
content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); /* read linear window */
ignore = gtk_label_new("read_tab_l");
gtk_notebook_append_page(notebook, content, ignore);
GuiCreateLinearReadWindow(content);
content = gtk_vbox_new(FALSE, 0); /* read adaptive window */
content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); /* read adaptive window */
ignore = gtk_label_new("read_tab_a");
gtk_notebook_append_page(notebook, content, ignore);
GuiCreateAdaptiveReadWindow(content);
/*** Create */
Closure->createButton = wid = create_button(_("button|Create"), "dvdisaster-create");
Closure->createButton = wid = create_button(_("button|Create"), "create", scale);
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_CREATE);
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
GuiAttachTooltip(wid, _("tooltip|Create error correction data"),
@@ -307,7 +309,7 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
/*** Scan */
Closure->scanButton = wid = create_button(_("button|Scan"), "dvdisaster-scan");
Closure->scanButton = wid = create_button(_("button|Scan"), "scan-symbolic", scale);
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_SCAN);
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
GuiAttachTooltip(wid, _("tooltip|Scan medium"),
@@ -315,7 +317,7 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
/*** Fix */
Closure->fixButton = wid = create_button(_("button|Fix"), "dvdisaster-fix");
Closure->fixButton = wid = create_button(_("button|Fix"), "fix-symbolic", scale);
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_FIX);
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
GuiAttachTooltip(wid, _("tooltip|Repair image"),
@@ -323,7 +325,7 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
/*** Verify */
Closure->testButton = wid = create_button(_("button|Verify"), "dvdisaster-verify");
Closure->testButton = wid = create_button(_("button|Verify"), "verify-symbolic", scale);
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_VERIFY);
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
GuiAttachTooltip(wid, _("tooltip|Consistency check"),
@@ -331,7 +333,7 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
/*** Strip */
Closure->stripButton = wid = create_button(_("button|Strip"), "dvdisaster-strip");
Closure->stripButton = wid = create_button(_("button|Strip"), "strip", scale);
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_STRIP);
gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
GuiAttachTooltip(wid, _("tooltip|Strip ECC"),
@@ -339,7 +341,7 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
/*** Stop */
wid = create_button(_("button|Stop"), "dvdisaster-gtk-stop");
wid = create_button(_("button|Stop"), "stop", scale);
g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(action_cb), (gpointer)ACTION_STOP);
gtk_box_pack_end(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
GuiAttachTooltip(wid, _("tooltip|Abort action"),
@@ -362,21 +364,21 @@ static GtkWidget* create_action_bar(GtkNotebook *notebook)
/* Create window */
content = gtk_vbox_new(FALSE, 0);
content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
ignore = gtk_label_new("create_tab");
gtk_notebook_append_page(notebook, content, ignore);
method->createCreateWindow(method, content);
/* Fix window */
content = gtk_vbox_new(FALSE, 0);
content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
ignore = gtk_label_new("fix_tab");
gtk_notebook_append_page(notebook, content, ignore);
method->createFixWindow(method, content);
/* Verify window */
content = gtk_vbox_new(FALSE, 0);
content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
ignore = gtk_label_new("verify_tab");
gtk_notebook_append_page(notebook, content, ignore);
method->createVerifyWindow(method, content);
@@ -408,17 +410,9 @@ void GuiCreateMainWindow(int *argc, char ***argv)
gtk_init(argc, argv);
/*** Some style tinkering */
/*** Set path to our icons */
gtk_rc_parse_string("style \"dvdisaster-style\"\n"
"{ GtkMenuBar::shadow_type = none\n"
"}\n"
"class \"GtkMenuBar\" style \"dvdisaster-style\"\n");
/*** Create our icons */
GuiCreateIconFactory();
gtk_icon_theme_add_resource_path(gtk_icon_theme_get_default(), "/dvdisaster/");
/*** Open the main window */
@@ -439,13 +433,9 @@ void GuiCreateMainWindow(int *argc, char ***argv)
g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL);
/*** Initialize the tooltips struct */
Closure->tooltips = gtk_tooltips_new();
/*** Create the sub parts of the GUI */
outer_box = gtk_vbox_new(FALSE, 0);
outer_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(window), outer_box);
/* Menu and tool bar */
@@ -453,7 +443,7 @@ void GuiCreateMainWindow(int *argc, char ***argv)
wid = GuiCreateMenuBar(outer_box);
gtk_box_pack_start(GTK_BOX(outer_box), wid, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(outer_box), sep, FALSE, FALSE, 0);
wid = GuiCreateToolBar(outer_box);
@@ -461,10 +451,10 @@ void GuiCreateMainWindow(int *argc, char ***argv)
/* Middle part */
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(outer_box), sep, FALSE, FALSE, 0);
middle_box = gtk_hbox_new(FALSE, 0);
middle_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(outer_box), middle_box, TRUE, TRUE, 0);
wid = Closure->notebook = gtk_notebook_new();
@@ -477,23 +467,23 @@ void GuiCreateMainWindow(int *argc, char ***argv)
wid = create_action_bar((GTK_NOTEBOOK(Closure->notebook)));
gtk_box_pack_end(GTK_BOX(middle_box), wid, FALSE, FALSE, 3);
sep = gtk_vseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
gtk_box_pack_end(GTK_BOX(middle_box), sep, FALSE, FALSE, 0);
/* Status bar enclosure */
status_box = gtk_hbox_new(FALSE, 0);
status_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_end(GTK_BOX(outer_box), status_box, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_end(GTK_BOX(outer_box), sep, FALSE, FALSE, 0);
/* Status bar contents. */
Closure->status = gtk_label_new(NULL);
gtk_label_set_ellipsize(GTK_LABEL(Closure->status), PANGO_ELLIPSIZE_END);
gtk_misc_set_alignment(GTK_MISC(Closure->status), 0.0, 0.5);
gtk_box_pack_start(GTK_BOX(status_box), GTK_WIDGET(Closure->status), TRUE, TRUE, 5);
gtk_label_set_xalign(GTK_LABEL(Closure->status), 0.0);
gtk_box_pack_start(GTK_BOX(status_box), GTK_WIDGET(Closure->status), TRUE, TRUE, 5);
button = gtk_button_new();
gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
@@ -503,11 +493,10 @@ void GuiCreateMainWindow(int *argc, char ***argv)
_("tooltip|Protocol for current action"),
_("Displays additional information created during the current or last action."));
box = gtk_hbox_new(FALSE, 0);
box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add(GTK_CONTAINER(button), box);
icon = gtk_image_new_from_stock("dvdisaster-gtk-index", GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("log", GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_box_pack_start(GTK_BOX(box), icon, FALSE, FALSE, 2);
wid = gtk_label_new(_utf("View log"));

View File

@@ -316,7 +316,7 @@ static void mi_destroy_cb(GtkWidget *widget, gpointer data)
***/
void GuiCreateMediumInfoWindow()
{ GtkWidget *dialog,*vbox,*hbox,*table,*button,*lab,*sep,*frame,*combo_box;
{ GtkWidget *dialog,*vbox,*hbox,*grid,*button,*lab,*sep,*frame,*combo_box;
medium_info *mi;
int i;
int dev_idx = 0;
@@ -330,25 +330,25 @@ void GuiCreateMediumInfoWindow()
dialog = gtk_dialog_new_with_buttons(_utf("windowtitle|Medium info"),
Closure->window, GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
_("Close"), GTK_RESPONSE_ACCEPT, NULL);
g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
Closure->mediumInfoContext = mi = g_malloc0(sizeof(medium_info));
/*** Inner vbox and title */
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, TRUE, TRUE, 0);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), vbox, TRUE, TRUE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
lab = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(lab),
_utf("<big>Medium info</big>\n"
"<i>Properties of the currently inserted medium</i>"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_box_pack_start(GTK_BOX(vbox), lab, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), gtk_label_new(" "), FALSE, FALSE, 0);
@@ -358,7 +358,7 @@ void GuiCreateMediumInfoWindow()
frame = gtk_frame_new(_utf("Drive selection"));
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
hbox = gtk_hbox_new(FALSE, 0);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
gtk_container_add(GTK_CONTAINER(frame), hbox);
@@ -368,22 +368,22 @@ void GuiCreateMediumInfoWindow()
lab = gtk_label_new(" ");
gtk_box_pack_start(GTK_BOX(hbox), lab, FALSE, FALSE, 0);
combo_box = gtk_combo_box_new_text();
combo_box = gtk_combo_box_text_new();
gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(drive_select_cb), NULL);
for(i=0; i<Closure->deviceNames->len; i++)
{
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box),
g_ptr_array_index(Closure->deviceNames,i));
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box),
g_ptr_array_index(Closure->deviceNames,i));
if(!strcmp(Closure->device, g_ptr_array_index(Closure->deviceNodes,i)))
dev_idx = i;
}
if(!Closure->deviceNodes->len)
{ gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), _utf("No drives found"));
{ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), _utf("No drives found"));
}
gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), dev_idx);
@@ -400,150 +400,164 @@ void GuiCreateMediumInfoWindow()
frame = gtk_frame_new(_utf("Physical medium info"));
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
table = gtk_table_new(2, 8, FALSE);
gtk_container_set_border_width(GTK_CONTAINER(table), 5);
gtk_container_add(GTK_CONTAINER(frame), table);
grid = gtk_grid_new();
gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
gtk_widget_set_margin_start(grid, 5);
gtk_widget_set_margin_top(grid, 2);
gtk_widget_set_margin_bottom(grid, 2);
gtk_container_add(GTK_CONTAINER(frame), grid);
lab = gtk_label_new(_utf("Medium type:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 1, 1, 1);
lab = gtk_label_new(" ");
mi->physicalType = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 1, 1, 1);
lab = gtk_label_new(_utf("Book type:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 2, 1, 1);
lab = gtk_label_new(" ");
mi->bookType = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 2, 1, 1);
lab = gtk_label_new(_utf("Manuf.-ID:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 3, 1, 1);
lab = gtk_label_new(" ");
mi->manufID = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 3, 1, 1);
lab = gtk_label_new(_utf("Drive profile:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 4, 1, 1);
lab = gtk_label_new(" ");
mi->profileDescr = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 4, 1, 1);
lab = gtk_label_new(_utf("Disc status:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 5, 1, 1);
lab = gtk_label_new(" ");
mi->discStatus = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 5, 1, 1);
lab = gtk_label_new(_utf("Used sectors:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 6, 1, 1);
lab = gtk_label_new(" ");
mi->usedCapacity1 = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 5, 6, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 6, 1, 1);
lab = gtk_label_new(" ");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 6, 7, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
lab = gtk_label_new(" ");
mi->usedCapacity2 = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 6, 7, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 7, 1, 1);
lab = gtk_label_new(_utf("Blank capacity:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 8, 1, 1);
lab = gtk_label_new(" ");
mi->blankCapacity = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 7, 8, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 8, 1, 1);
/*** Filesystem info */
frame = gtk_frame_new(_utf("Filesystem info"));
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
table = gtk_table_new(2, 3, FALSE);
gtk_container_set_border_width(GTK_CONTAINER(table), 5);
gtk_container_add(GTK_CONTAINER(frame), table);
grid = gtk_grid_new();
gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
gtk_widget_set_margin_start(grid, 5);
gtk_widget_set_margin_top(grid, 2);
gtk_widget_set_margin_bottom(grid, 2);
gtk_container_add(GTK_CONTAINER(frame), grid);
lab = gtk_label_new(_utf("Medium label:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 1, 1, 1);
lab = gtk_label_new(" ");
mi->isoLabel = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 1, 1, 1);
lab = gtk_label_new(_utf("File system size:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 2, 1, 1);
lab = gtk_label_new(" ");
mi->isoSize = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 2, 1, 1);
lab = gtk_label_new(_utf("Creation time:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 3, 1, 1);
lab = gtk_label_new(" ");
mi->isoTime = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 3, 1, 1);
/*** Error correction info */
frame = gtk_frame_new(_utf("Augmented image info"));
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
table = gtk_table_new(3, 4, FALSE);
gtk_container_set_border_width(GTK_CONTAINER(table), 5);
gtk_container_add(GTK_CONTAINER(frame), table);
grid = gtk_grid_new();
gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
gtk_widget_set_margin_start(grid, 5);
gtk_widget_set_margin_top(grid, 2);
gtk_widget_set_margin_bottom(grid, 2);
gtk_container_add(GTK_CONTAINER(frame), grid);
lab = gtk_label_new(_utf("Error correction data:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 1, 1, 1);
lab = gtk_label_new(" ");
mi->eccState = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 3, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 1, 2, 1);
lab = gtk_label_new(_utf("Augmented image size:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 2, 1, 1);
lab = gtk_label_new(" ");
mi->eccSize = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 2, 2, 1);
lab = gtk_label_new(_utf("dvdisaster version:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 3, 1, 1);
lab = gtk_label_new(" ");
mi->eccVersion = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 3, 2, 1);
lab = gtk_label_new(_utf("Exhaustive search:"));
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 0, 1, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid), lab, 1, 4, 1, 1);
lab = gtk_label_new(" ");
mi->exhaustiveSearch = lab;
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), lab, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_widget_set_hexpand(lab, TRUE);
gtk_grid_attach(GTK_GRID(grid), lab, 2, 4, 1, 1);
mi->exhaustiveSearchButton = gtk_button_new_with_label(_utf("Run exhaustive search"));
gtk_widget_set_valign(mi->exhaustiveSearchButton, GTK_ALIGN_END);
g_signal_connect(G_OBJECT(mi->exhaustiveSearchButton), "clicked", G_CALLBACK(es_cb), mi);
gtk_table_attach(GTK_TABLE(table), mi->exhaustiveSearchButton, 2, 3, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_grid_attach(GTK_GRID(grid), mi->exhaustiveSearchButton, 3, 3, 1, 2);
/*** Show it */

View File

@@ -218,7 +218,7 @@ GtkWidget *GuiCreateMenuBar(GtkWidget *parent)
menu_anchor = gtk_menu_item_new_with_label(_utf("menu|File"));
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_anchor), menu_strip);
gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), menu_anchor);
gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_anchor);
/* The tools menu */
@@ -232,7 +232,7 @@ GtkWidget *GuiCreateMenuBar(GtkWidget *parent)
Closure->toolMenuAnchor = menu_anchor = gtk_menu_item_new_with_label(_utf("menu|Tools"));
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_anchor), menu_strip);
gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), menu_anchor);
gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_anchor);
/* The help menu */
@@ -249,10 +249,12 @@ GtkWidget *GuiCreateMenuBar(GtkWidget *parent)
add_menu_separator(menu_strip);
add_menu_button(menu_strip, _("menu|Change log"), MENU_HELP_CHANGELOG);
add_menu_button(menu_strip, _("menu|To do list"), MENU_HELP_TODO);
/* Hide the todo list menu in the patchlevel series, as we're not upstream
* add_menu_button(menu_strip, _("menu|To do list"), MENU_HELP_TODO);
*/
menu_anchor = gtk_menu_item_new_with_label(_utf("menu|Help"));
gtk_menu_item_right_justify(GTK_MENU_ITEM(menu_anchor));
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_anchor), menu_strip);
gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_anchor);
@@ -291,7 +293,7 @@ void GuiAttachTooltip(GtkWidget *widget, char *short_descr, char *long_descr)
g_signal_connect(G_OBJECT(widget), "enter_notify_event", G_CALLBACK(tooltip_cb), (gpointer)long_copy);
g_signal_connect(G_OBJECT(widget), "leave_notify_event", G_CALLBACK(tooltip_cb), (gpointer)long_copy);
gtk_tooltips_set_tip(Closure->tooltips, widget, short_copy, long_copy);
gtk_widget_set_tooltip_text(widget, short_copy);
g_free(short_copy);
FORGET(long_copy); /* long_copy must be kept during programs life */
@@ -329,81 +331,52 @@ static void drive_select_cb(GtkWidget *widget, gpointer data)
static void file_select_cb(GtkWidget *widget, gpointer data)
{ int action = GPOINTER_TO_INT(data);
GtkWidget *dialog;
switch(action)
{ /*** Image file selection */
case MENU_FILE_IMAGE:
if(!Closure->imageFileSel)
{ Closure->imageFileSel = gtk_file_selection_new(_utf("windowtitle|Image file selection"));
GuiReverseCancelOK(GTK_DIALOG(Closure->imageFileSel));
g_signal_connect(G_OBJECT(Closure->imageFileSel), "destroy",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(MENU_FILE_IMAGE_DESTROY));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(Closure->imageFileSel)->ok_button),"clicked",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(MENU_FILE_IMAGE_OK));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(Closure->imageFileSel)->cancel_button),"clicked",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(MENU_FILE_IMAGE_CANCEL));
dialog = gtk_file_chooser_dialog_new("Image file selection",
Closure->window,
GTK_FILE_CHOOSER_ACTION_SAVE,
_("_Cancel"), GTK_RESPONSE_CANCEL,
_("_Open"), GTK_RESPONSE_ACCEPT,
NULL);
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
gtk_entry_get_text(GTK_ENTRY(Closure->imageEntry)));
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{ g_free(Closure->imageName);
Closure->imageName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
if(Closure->autoSuffix)
Closure->imageName = ApplyAutoSuffix(Closure->imageName, "iso");
gtk_entry_set_text(GTK_ENTRY(Closure->imageEntry), Closure->imageName);
gtk_editable_set_position(GTK_EDITABLE(Closure->imageEntry), -1);
}
gtk_file_selection_set_filename(GTK_FILE_SELECTION(Closure->imageFileSel),
gtk_entry_get_text(GTK_ENTRY(Closure->imageEntry)));
gtk_widget_show(Closure->imageFileSel);
break;
case MENU_FILE_IMAGE_DESTROY:
Closure->imageFileSel = NULL;
break;
case MENU_FILE_IMAGE_OK:
g_free(Closure->imageName);
Closure->imageName = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(Closure->imageFileSel)));
if(Closure->autoSuffix)
Closure->imageName = ApplyAutoSuffix(Closure->imageName, "iso");
gtk_entry_set_text(GTK_ENTRY(Closure->imageEntry), Closure->imageName);
gtk_editable_set_position(GTK_EDITABLE(Closure->imageEntry), -1);
gtk_widget_hide(Closure->imageFileSel);
break;
case MENU_FILE_IMAGE_CANCEL:
gtk_widget_hide(Closure->imageFileSel);
break;
gtk_widget_destroy (dialog);
break;
/*** Same stuff again for ecc file selection */
case MENU_FILE_ECC:
if(!Closure->eccFileSel)
{ Closure->eccFileSel = gtk_file_selection_new(_utf("windowtitle|Error correction file selection"));
GuiReverseCancelOK(GTK_DIALOG(Closure->eccFileSel));
g_signal_connect(G_OBJECT(Closure->eccFileSel), "destroy",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(MENU_FILE_ECC_DESTROY));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(Closure->eccFileSel)->ok_button),"clicked",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(MENU_FILE_ECC_OK));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(Closure->eccFileSel)->cancel_button),"clicked",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(MENU_FILE_ECC_CANCEL));
dialog = gtk_file_chooser_dialog_new("Error correction file selection",
Closure->window,
GTK_FILE_CHOOSER_ACTION_SAVE,
_("_Cancel"), GTK_RESPONSE_CANCEL,
_("_Open"), GTK_RESPONSE_ACCEPT,
NULL);
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
gtk_entry_get_text(GTK_ENTRY(Closure->eccEntry)));
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{ g_free(Closure->imageName);
Closure->eccName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
if(Closure->autoSuffix)
Closure->eccName = ApplyAutoSuffix(Closure->eccName, "ecc");
gtk_entry_set_text(GTK_ENTRY(Closure->eccName), Closure->eccName);
gtk_editable_set_position(GTK_EDITABLE(Closure->eccName), -1);
}
gtk_file_selection_set_filename(GTK_FILE_SELECTION(Closure->eccFileSel),
gtk_entry_get_text(GTK_ENTRY(Closure->eccEntry)));
gtk_widget_show(Closure->eccFileSel);
break;
case MENU_FILE_ECC_DESTROY:
Closure->eccFileSel = NULL;
break;
case MENU_FILE_ECC_OK:
g_free(Closure->eccName);
Closure->eccName = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(Closure->eccFileSel)));
if(Closure->autoSuffix)
Closure->eccName = ApplyAutoSuffix(Closure->eccName, "ecc");
gtk_entry_set_text(GTK_ENTRY(Closure->eccEntry), Closure->eccName);
gtk_editable_set_position(GTK_EDITABLE(Closure->eccEntry), -1);
gtk_widget_hide(Closure->eccFileSel);
break;
case MENU_FILE_ECC_CANCEL:
gtk_widget_hide(Closure->eccFileSel);
break;
gtk_widget_destroy (dialog);
break;
}
}
@@ -464,7 +437,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
/*** Create the toolbar */
box = gtk_hbox_new(FALSE, 0);
box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
/*** Drive selection */
@@ -476,16 +449,16 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
gtk_box_pack_start(GTK_BOX(box), ebox, FALSE, FALSE, 0);
GuiAttachTooltip(ebox, _("tooltip|Drive selection"),
_("Use the nearby drop-down list to select the input drive."));
icon = gtk_image_new_from_stock("dvdisaster-cd", GTK_ICON_SIZE_LARGE_TOOLBAR);
icon = gtk_image_new_from_icon_name("cd", GTK_ICON_SIZE_LARGE_TOOLBAR);
gtk_container_add(GTK_CONTAINER(ebox), icon);
Closure->driveCombo = combo_box = gtk_combo_box_new_text();
Closure->driveCombo = combo_box = gtk_combo_box_text_new();
g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(drive_select_cb), NULL);
for(i=0; i<Closure->deviceNames->len; i++)
{
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box),
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box),
g_ptr_array_index(Closure->deviceNames,i));
if(!strcmp(Closure->device, g_ptr_array_index(Closure->deviceNodes,i)))
@@ -493,7 +466,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
}
if(!Closure->deviceNodes->len)
{ gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), _utf("No drives found"));
{ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), _utf("No drives found"));
}
gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), dev_idx);
@@ -505,12 +478,12 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
space = gtk_label_new(NULL);
gtk_box_pack_start(GTK_BOX(box), space, FALSE, FALSE, 1);
sep = gtk_vseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 3);
/*** Image file selection */
icon = gtk_image_new_from_stock("dvdisaster-open-img", GTK_ICON_SIZE_LARGE_TOOLBAR);
icon = gtk_image_new_from_icon_name("open-img", GTK_ICON_SIZE_LARGE_TOOLBAR);
button = gtk_button_new();
gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
gtk_container_add(GTK_CONTAINER(button), icon);
@@ -528,7 +501,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
space = gtk_label_new(NULL);
gtk_box_pack_start(GTK_BOX(box), space, FALSE, FALSE, 5);
sep = gtk_vseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 3);
GuiAttachTooltip(button, _("tooltip|Image file selection"),
_("Selects a new image file."));
@@ -538,7 +511,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
/*** Ecc file selection */
icon = gtk_image_new_from_stock("dvdisaster-open-ecc", GTK_ICON_SIZE_LARGE_TOOLBAR);
icon = gtk_image_new_from_icon_name("open-ecc", GTK_ICON_SIZE_LARGE_TOOLBAR);
button = gtk_button_new();
gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
gtk_container_add(GTK_CONTAINER(button), icon);
@@ -556,7 +529,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
space = gtk_label_new(NULL);
gtk_box_pack_start(GTK_BOX(box), space, FALSE, FALSE, 5);
sep = gtk_vseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 3);
GuiAttachTooltip(button,
_("tooltip|Error correction file selection"),
@@ -567,7 +540,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
/*** Preferences button */
icon = gtk_image_new_from_stock("dvdisaster-gtk-preferences", GTK_ICON_SIZE_LARGE_TOOLBAR);
icon = gtk_image_new_from_icon_name("preferences", GTK_ICON_SIZE_LARGE_TOOLBAR);
Closure->prefsButton = prefs = gtk_button_new();
gtk_button_set_relief(GTK_BUTTON(prefs), GTK_RELIEF_NONE);
gtk_container_add(GTK_CONTAINER(prefs), icon);
@@ -579,7 +552,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
/*** Help button */
icon = gtk_image_new_from_stock("dvdisaster-gtk-help", GTK_ICON_SIZE_LARGE_TOOLBAR);
icon = gtk_image_new_from_icon_name("manual", GTK_ICON_SIZE_LARGE_TOOLBAR);
Closure->helpButton = help = gtk_button_new();
gtk_button_set_relief(GTK_BUTTON(help), GTK_RELIEF_NONE);
gtk_container_add(GTK_CONTAINER(help), icon);
@@ -590,7 +563,7 @@ GtkWidget *GuiCreateToolBar(GtkWidget *parent)
/*** Quit button */
icon = gtk_image_new_from_stock("dvdisaster-gtk-quit", GTK_ICON_SIZE_LARGE_TOOLBAR);
icon = gtk_image_new_from_icon_name("quit", GTK_ICON_SIZE_LARGE_TOOLBAR);
quit = gtk_button_new();
gtk_button_set_relief(GTK_BUTTON(quit), GTK_RELIEF_NONE);
gtk_container_add(GTK_CONTAINER(quit), icon);

View File

@@ -312,6 +312,7 @@ static gboolean allow_actions_idle_func(gpointer data)
gtk_widget_set_sensitive(Closure->createButton, s);
gtk_widget_set_sensitive(Closure->fixButton, s);
gtk_widget_set_sensitive(Closure->testButton, s);
gtk_widget_set_sensitive(Closure->stripButton, s);
gtk_widget_set_sensitive(Closure->prefsButton, s);
if(!s && Closure->prefsWindow)
@@ -348,7 +349,6 @@ static gboolean message_idle_func(gpointer data)
GTK_BUTTONS_CLOSE,
mi->msg, NULL);
gtk_label_set_line_wrap(GTK_LABEL(((struct _GtkMessageDialog*)dialog)->label), FALSE);
g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
gtk_widget_show(dialog);
@@ -396,7 +396,6 @@ GtkWidget* GuiCreateMessage(char *format, GtkMessageType type, ...)
GTK_BUTTONS_CLOSE,
utf8, NULL);
gtk_label_set_line_wrap(GTK_LABEL(((struct _GtkMessageDialog*)dialog)->label), FALSE);
g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
gtk_widget_show(dialog);
g_free(text);
@@ -431,11 +430,9 @@ static gboolean modal_idle_func(gpointer data)
mi->message_type,
mi->button_type,
"%s", mi->msg);
gtk_label_set_line_wrap(GTK_LABEL(((struct _GtkMessageDialog*)dialog)->label), FALSE);
if(mi->button_fn)
mi->button_fn(GTK_DIALOG(dialog));
else GuiReverseCancelOK(GTK_DIALOG(dialog));
response = gtk_dialog_run(GTK_DIALOG(dialog));
@@ -536,34 +533,6 @@ void GuiSetText(PangoLayout *layout, char *text, int *w, int *h)
*h = rect.height;
}
/*
* Rearrange buttons to OK Cancel order
* in file dialogs
*
* gtk_dialog_set_alternative_button_order()
* has been introduced since gtk+2.6,
* but does not seem to work correctly.
*/
void GuiReverseCancelOK(GtkDialog *dialog)
{ GtkWidget *box, *button ;
if(!Closure->guiMode || !Closure->reverseCancelOK)
return;
box = dialog->action_area;
button = ((GtkBoxChild*)(g_list_first(GTK_BOX(box)->children)->data))->widget;
gtk_box_reorder_child(GTK_BOX(box), button, 1);
#if 0
gtk_dialog_set_alternative_button_order(GTK_DIALOG(dialog),
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
#endif
}
/*
* Get the width of a label text
*/
@@ -613,7 +582,8 @@ void GuiLockLabelSize(GtkWidget *wid, char *format, ...)
pango_layout_get_pixel_extents(layout, NULL, &rect);
gtk_widget_set_size_request(wid, rect.width, rect.height);
gtk_misc_set_alignment(GTK_MISC(wid), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_label_set_yalign(GTK_LABEL(wid), 0.0);
g_free(text);
}
@@ -631,19 +601,18 @@ static void dont_ask_again_cb(GtkWidget *widget, gpointer data)
}
static void insert_button(GtkDialog *dialog)
{ GtkWidget *check,*align;
{ GtkWidget *check,*hbox;
align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), align, FALSE, FALSE, 0);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox, FALSE, FALSE, 0);
check = gtk_check_button_new_with_label(_utf("Do not ask again"));
gtk_container_add(GTK_CONTAINER(align), check);
gtk_container_set_border_width(GTK_CONTAINER(align), 10);
gtk_box_set_center_widget(GTK_BOX(hbox), check);
gtk_container_set_border_width(GTK_CONTAINER(check), 10);
g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(dont_ask_again_cb), NULL);
gtk_widget_show(align);
gtk_widget_show(hbox);
gtk_widget_show(check);
GuiReverseCancelOK(GTK_DIALOG(dialog));
}
int GuiConfirmImageDeletion(char *file)

View File

@@ -411,7 +411,7 @@ void Verbose(char *format, ...)
va_end(argp);
}
if(!Closure->verbose)
if(!Closure->verbose && !g_getenv("VERBOSE"))
return;
va_start(argp, format);
@@ -689,6 +689,10 @@ void Stop(char *format, ...)
{ FreeClosure();
exit(EXIT_FAILURE);
}
/* code below should never be reachable, exit to make static analysis happy,
and make the ((noreturn)) attribute right in all cases */
exit(EXIT_FAILURE);
}
/*
@@ -747,6 +751,9 @@ static void stripecc_cleanup(gpointer data)
if (image)
CloseImage(image);
if(Closure->guiMode)
GuiAllowActions(TRUE);
GuiExitWorkerThread();
}

File diff suppressed because it is too large Load Diff

View File

@@ -106,7 +106,7 @@ typedef struct _raw_editor_context
} raw_editor_context;
static void evaluate_vectors(raw_editor_context*);
static void render_sector(raw_editor_context*);
static void render_sector(cairo_t *cr, raw_editor_context*);
static raw_editor_context* create_raw_editor_context()
{ raw_editor_context *rec = Closure->rawEditorContext;
@@ -288,52 +288,36 @@ static void calculate_failures(raw_editor_context *rec)
static void file_select_cb(GtkWidget *widget, gpointer data)
{ raw_editor_context *rec = Closure->rawEditorContext;
int action = GPOINTER_TO_INT(data);
GtkWidget *dialog;
switch(action)
{
case ACTION_BROWSE_LOAD: /* open the dialog */
if(!rec->fileSel)
{ char filename[strlen(Closure->dDumpDir)+10];
if(!rec->fileSel)
{ char filename[strlen(Closure->dDumpDir)+10];
rec->fileSel = gtk_file_selection_new(_utf("windowtitle|Raw sector dump selection"));
GuiReverseCancelOK(GTK_DIALOG(rec->fileSel));
g_signal_connect(G_OBJECT(rec->fileSel), "destroy",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(ACTION_FILESEL_DESTROY));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(rec->fileSel)->ok_button),"clicked",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(ACTION_FILESEL_OK));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(rec->fileSel)->cancel_button),"clicked",
G_CALLBACK(file_select_cb), GINT_TO_POINTER(ACTION_FILESEL_CANCEL));
sprintf(filename, "%s/", Closure->dDumpDir);
gtk_file_selection_set_filename(GTK_FILE_SELECTION(rec->fileSel), filename);
}
gtk_widget_show(rec->fileSel);
break;
dialog = gtk_file_chooser_dialog_new("Raw sector dump selection",
Closure->window,
GTK_FILE_CHOOSER_ACTION_OPEN,
_("_Cancel"), GTK_RESPONSE_CANCEL,
_("_Open"), GTK_RESPONSE_ACCEPT,
NULL);
sprintf(filename, "%s/", Closure->dDumpDir);
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), filename);
case ACTION_FILESEL_DESTROY:
rec->fileSel = NULL;
break;
case ACTION_FILESEL_OK:
if(rec->filepath)
g_free(rec->filepath);
rec->filepath = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(rec->fileSel)));
gtk_widget_hide(rec->fileSel);
ResetRawBuffer(rec->rb);
ReadDefectiveSectorFile(rec->dsh, rec->rb, rec->filepath);
PrintPQStats(rec->rb);
memcpy(rec->rb->recovered, rec->rb->rawBuf[0], rec->rb->sampleSize);
memcpy(rec->undoRing[0], rec->rb->rawBuf[0], rec->rb->sampleSize);
calculate_failures(rec);
evaluate_vectors(rec);
render_sector(rec);
GuiSetLabelText(rec->rightLabel, _("%s loaded, LBA %" PRId64 ", %d samples."),
rec->filepath, rec->rb->lba, rec->rb->samplesRead);
break;
case ACTION_FILESEL_CANCEL:
gtk_widget_hide(rec->fileSel);
break;
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{ if(rec->filepath)
g_free(rec->filepath);
rec->filepath = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
ResetRawBuffer(rec->rb);
ReadDefectiveSectorFile(rec->dsh, rec->rb, rec->filepath);
PrintPQStats(rec->rb);
memcpy(rec->rb->recovered, rec->rb->rawBuf[0], rec->rb->sampleSize);
memcpy(rec->undoRing[0], rec->rb->rawBuf[0], rec->rb->sampleSize);
calculate_failures(rec);
evaluate_vectors(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
GuiSetLabelText(rec->rightLabel, _("%s loaded, LBA %" PRId64 ", %d samples."),
rec->filepath, rec->rb->lba, rec->rb->samplesRead);
}
gtk_widget_destroy (dialog);
}
}
@@ -404,101 +388,72 @@ static void save_sector(raw_editor_context *rec)
}
/***
*** Raw sector buffer loading/savinf
*** Raw sector buffer loading/saving
***/
static void buffer_io_cb(GtkWidget *widget, gpointer data)
{ raw_editor_context *rec = Closure->rawEditorContext;
int action = GPOINTER_TO_INT(data);
LargeFile *file;
char *path;
GtkWidget *dialog;
switch(action)
{
{
case ACTION_LOAD_BUFFER: /* open the dialog */
if(!rec->loadBufSel)
{ char filename[strlen(Closure->dDumpDir)+10];
if(!rec->loadBufSel)
{ char filename[strlen(Closure->dDumpDir)+10];
rec->loadBufSel = gtk_file_selection_new(_utf("windowtitle|Load buffer from file"));
GuiReverseCancelOK(GTK_DIALOG(rec->loadBufSel));
g_signal_connect(G_OBJECT(rec->loadBufSel), "destroy",
G_CALLBACK(buffer_io_cb), GINT_TO_POINTER(ACTION_FILESEL_LOAD_DESTROY));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(rec->loadBufSel)->ok_button),"clicked",
G_CALLBACK(buffer_io_cb), GINT_TO_POINTER(ACTION_FILESEL_LOAD_OK));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(rec->loadBufSel)->cancel_button),"clicked",
G_CALLBACK(buffer_io_cb), GINT_TO_POINTER(ACTION_FILESEL_LOAD_CANCEL));
sprintf(filename, "%s/", Closure->dDumpDir);
gtk_file_selection_set_filename(GTK_FILE_SELECTION(rec->loadBufSel), filename);
dialog = gtk_file_chooser_dialog_new("Load buffer from file",
Closure->window,
GTK_FILE_CHOOSER_ACTION_OPEN,
_("_Cancel"), GTK_RESPONSE_CANCEL,
_("_Open"), GTK_RESPONSE_ACCEPT,
NULL);
sprintf(filename, "%s/", Closure->dDumpDir);
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), filename);
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{ path = (char*)gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
file = LargeOpen(path, O_RDONLY, IMG_PERMS);
LargeRead(file, rec->rb->recovered, rec->rb->sampleSize);
LargeClose(file);
calculate_failures(rec);
evaluate_vectors(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
GuiSetLabelText(rec->rightLabel, _("Buffer loaded from %s."), path);
}
gtk_widget_destroy (dialog);
}
gtk_widget_show(rec->loadBufSel);
break;
break;
case ACTION_SAVE_BUFFER: /* open the dialog */
if(!rec->saveBufSel)
{ char filename[strlen(Closure->dDumpDir)+10];
if(!rec->saveBufSel)
{ char filename[strlen(Closure->dDumpDir)+10];
rec->saveBufSel = gtk_file_selection_new(_utf("windowtitle|Save buffer to file"));
GuiReverseCancelOK(GTK_DIALOG(rec->saveBufSel));
g_signal_connect(G_OBJECT(rec->saveBufSel), "destroy",
G_CALLBACK(buffer_io_cb), GINT_TO_POINTER(ACTION_FILESEL_SAVE_DESTROY));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(rec->saveBufSel)->ok_button),"clicked",
G_CALLBACK(buffer_io_cb), GINT_TO_POINTER(ACTION_FILESEL_SAVE_OK));
g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(rec->saveBufSel)->cancel_button),"clicked",
G_CALLBACK(buffer_io_cb), GINT_TO_POINTER(ACTION_FILESEL_SAVE_CANCEL));
sprintf(filename, "%s/", Closure->dDumpDir);
gtk_file_selection_set_filename(GTK_FILE_SELECTION(rec->saveBufSel), filename);
dialog = gtk_file_chooser_dialog_new("Save buffer to file",
Closure->window,
GTK_FILE_CHOOSER_ACTION_SAVE,
_("_Cancel"), GTK_RESPONSE_CANCEL,
_("_Open"), GTK_RESPONSE_ACCEPT,
NULL);
sprintf(filename, "%s/", Closure->dDumpDir);
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), filename);
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{ path = (char*)gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
file = LargeOpen(path, O_RDWR | O_CREAT, IMG_PERMS);
LargeWrite(file, rec->rb->recovered, rec->rb->sampleSize);
LargeClose(file);
GuiSetLabelText(rec->rightLabel, _("Buffer saved to %s."), path);
}
gtk_widget_destroy (dialog);
}
gtk_widget_show(rec->saveBufSel);
break;
case ACTION_FILESEL_LOAD_DESTROY:
rec->loadBufSel = NULL;
break;
case ACTION_FILESEL_SAVE_DESTROY:
rec->saveBufSel = NULL;
break;
case ACTION_FILESEL_LOAD_OK:
{ LargeFile *file;
char *path;
path = (char*)gtk_file_selection_get_filename(GTK_FILE_SELECTION(rec->loadBufSel));
gtk_widget_hide(rec->loadBufSel);
file = LargeOpen(path, O_RDONLY, IMG_PERMS);
LargeRead(file, rec->rb->recovered, rec->rb->sampleSize);
LargeClose(file);
calculate_failures(rec);
evaluate_vectors(rec);
render_sector(rec);
undo_remember(rec);
GuiSetLabelText(rec->rightLabel, _("Buffer loaded from %s."), path);
break;
}
case ACTION_FILESEL_SAVE_OK:
{ LargeFile *file;
char *path;
path = (char*)gtk_file_selection_get_filename(GTK_FILE_SELECTION(rec->saveBufSel));
gtk_widget_hide(rec->saveBufSel);
file = LargeOpen(path, O_RDWR | O_CREAT, IMG_PERMS);
LargeWrite(file, rec->rb->recovered, rec->rb->sampleSize);
LargeClose(file);
GuiSetLabelText(rec->rightLabel, _("Buffer saved to %s."), path);
break;
}
case ACTION_FILESEL_LOAD_CANCEL:
gtk_widget_hide(rec->loadBufSel);
break;
case ACTION_FILESEL_SAVE_CANCEL:
gtk_widget_hide(rec->saveBufSel);
break;
break;
}
}
@@ -585,58 +540,62 @@ static void evaluate_vectors(raw_editor_context *rec)
/* Render the sector */
static void render_sector(raw_editor_context *rec)
{ GdkDrawable *d = rec->drawingArea->window;
static void render_sector(cairo_t *cr, raw_editor_context *rec)
{ GdkWindow *d = gtk_widget_get_window(rec->drawingArea);
unsigned char *buf = rec->rb->recovered;
int idx=0;
int i,j,w,h,x,y;
if(!d) return;
gdk_gc_set_rgb_fg_color(Closure->drawGC,Closure->background);
gdk_draw_rectangle(d, Closure->drawGC, TRUE, 0, 0, rec->daWidth, rec->daHeight);
/* Get foreground color */
GdkRGBA fg = {0};
GtkStyleContext *context = gtk_widget_get_style_context(rec->drawingArea);
gtk_style_context_get_color(context, gtk_widget_get_state_flags(rec->drawingArea), &fg);
idx = 12;
for(j=0,y=0; j<P_VECTOR_SIZE; j++, y+=rec->charHeight)
{ for(i=0,x=0; i<N_P_VECTORS; i++, x+=rec->charWidth)
{ char byte[3];
if(rec->tags[idx])
{ gdk_gc_set_rgb_fg_color(Closure->drawGC,Closure->curveColor);
gdk_draw_rectangle(d, Closure->drawGC, TRUE, x, y,
rec->charWidth, rec->charHeight);
}
else if(rec->rb->byteState[idx])
{ if(rec->rb->byteState[idx] & (P1_CPOS | Q1_CPOS))
{ gdk_gc_set_rgb_fg_color(Closure->drawGC,Closure->yellowSector);
gdk_draw_rectangle(d, Closure->drawGC, TRUE, x, y,
rec->charWidth, rec->charHeight);
}
else if(rec->rb->byteState[idx] & (P1_ERROR | Q1_ERROR))
{ gdk_gc_set_rgb_fg_color(Closure->drawGC,Closure->greenText);
gdk_draw_rectangle(d, Closure->drawGC, TRUE, x, y,
rec->charWidth, rec->charHeight);
}
else
{ gdk_gc_set_rgb_fg_color(Closure->drawGC,Closure->redText);
gdk_draw_rectangle(d, Closure->drawGC, TRUE, x, y,
rec->charWidth, rec->charHeight);
}
}
if(rec->tags[idx])
{ gdk_cairo_set_source_rgba(cr, Closure->curveColor);
cairo_rectangle(cr, x, y, rec->charWidth, rec->charHeight);
cairo_fill(cr);
}
else if(rec->rb->byteState[idx])
{ if(rec->rb->byteState[idx] & (P1_CPOS | Q1_CPOS))
{ gdk_cairo_set_source_rgba(cr, Closure->yellowSector);
cairo_rectangle(cr, x, y, rec->charWidth, rec->charHeight);
cairo_fill(cr);
}
else if(rec->rb->byteState[idx] & (P1_ERROR | Q1_ERROR))
{ gdk_cairo_set_source_rgba(cr, Closure->greenText);
cairo_rectangle(cr, x, y, rec->charWidth, rec->charHeight);
cairo_fill(cr);
}
else
{ gdk_cairo_set_source_rgba(cr, Closure->redText);
cairo_rectangle(cr, x, y, rec->charWidth, rec->charHeight);
cairo_fill(cr);
}
}
gdk_gc_set_rgb_fg_color(Closure->drawGC,Closure->foreground);
gdk_cairo_set_source_rgba(cr, &fg);
sprintf(byte, "%c", canprint(buf[idx]) ? buf[idx] : '.');
idx++;
GuiSetText(rec->layout, byte, &w, &h);
gdk_draw_layout(d, Closure->drawGC, x, y, rec->layout);
sprintf(byte, "%c", canprint(buf[idx]) ? buf[idx] : '.');
idx++;
GuiSetText(rec->layout, byte, &w, &h);
cairo_move_to(cr, x, y);
pango_cairo_show_layout(cr, rec->layout);
}
}
}
/* Expose event handler */
/* Draw event handler */
static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ raw_editor_context *rec = Closure->rawEditorContext;
if(!rec->layout)
@@ -644,11 +603,8 @@ static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer dat
calculate_geometry(rec);
}
if(event->count) /* Exposure compression */
return TRUE;
evaluate_vectors(rec);
render_sector(rec);
render_sector(cr, rec);
return TRUE;
}
@@ -725,7 +681,7 @@ static gboolean button_cb(GtkWidget *widget, GdkEventButton *event, gpointer dat
{ if(type=='P') SetPVector(rb->recovered, vector, v);
else SetQVector(rb->recovered, vector, v);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
GuiSetLabelText(rec->rightLabel,
_("%c Vector %d corrected (%d erasures)."), type, v, e_scratch);
@@ -760,7 +716,7 @@ static gboolean button_cb(GtkWidget *widget, GdkEventButton *event, gpointer dat
i = (last+1)%rb->pn[v];
SetPVector(rb->recovered, rb->pList[v][i], v);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
GuiSetLabelText(rec->rightLabel,
_("Exchanged P vector %d with version %d (of %d)."),
v, i+1, rb->pn[v]);
@@ -796,7 +752,7 @@ static gboolean button_cb(GtkWidget *widget, GdkEventButton *event, gpointer dat
i = (last+1)%rb->qn[v];
SetQVector(rb->recovered, rb->qList[v][i], v);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
GuiSetLabelText(rec->rightLabel,
_("Exchanged Q vector %d with version %d (of %d)."),
v, i+1, rb->qn[v]);
@@ -811,7 +767,7 @@ static gboolean button_cb(GtkWidget *widget, GdkEventButton *event, gpointer dat
{ int bytepos = 12 + mouse_x/rec->charWidth + N_P_VECTORS*(mouse_y/rec->charHeight);
rec->tags[bytepos] ^= 1;
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
}
break;
@@ -843,8 +799,8 @@ static void action_cb(GtkWidget *widget, gpointer data)
switch(action)
{ case ACTION_BROWSE_LOAD:
file_select_cb(NULL, GINT_TO_POINTER(ACTION_BROWSE_LOAD));
break;
file_select_cb(NULL, GINT_TO_POINTER(ACTION_BROWSE_LOAD));
break;
case ACTION_BROWSE_SAVE:
save_sector(rec);
@@ -857,7 +813,7 @@ static void action_cb(GtkWidget *widget, gpointer data)
rec->sectorChanged = FALSE;
memcpy(rec->rb->recovered, rec->rbInfo[rec->currentSample].rawSector, rec->rb->sampleSize);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
GuiSetLabelText(rec->rightLabel, _("Showing sample %d (of %d)."),
rec->currentSample, rec->rb->samplesRead);
@@ -870,7 +826,7 @@ static void action_cb(GtkWidget *widget, gpointer data)
rec->sectorChanged = FALSE;
memcpy(rec->rb->recovered, rec->rbInfo[rec->currentSample].rawSector, rec->rb->sampleSize);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
GuiSetLabelText(rec->rightLabel, _("Showing sample %d (of %d)."),
rec->currentSample, rec->rb->samplesRead);
@@ -878,7 +834,7 @@ static void action_cb(GtkWidget *widget, gpointer data)
case ACTION_UNTAG:
memset(rec->tags, 0, 2352);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
break;
@@ -893,7 +849,7 @@ static void action_cb(GtkWidget *widget, gpointer data)
if(byte != rec->rb->rawBuf[j][i])
rec->tags[i] = 1;
}
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
break;
}
@@ -901,13 +857,13 @@ static void action_cb(GtkWidget *widget, gpointer data)
case ACTION_UNDO:
undo(rec);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
break;
case ACTION_REDO:
redo(rec);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
break;
case ACTION_SORT_BY_P:
@@ -916,7 +872,7 @@ static void action_cb(GtkWidget *widget, gpointer data)
rec->currentSample = 0;
memcpy(rec->rb->recovered, rec->rbInfo[rec->currentSample].rawSector, rec->rb->sampleSize);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
GuiSetLabelText(rec->rightLabel, _("Sector with lowest P failures selected."));
break;
@@ -926,7 +882,7 @@ static void action_cb(GtkWidget *widget, gpointer data)
rec->currentSample = 0;
memcpy(rec->rb->recovered, rec->rbInfo[rec->currentSample].rawSector, rec->rb->sampleSize);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
GuiSetLabelText(rec->rightLabel, _("Sector with lowest Q failures selected."));
break;
@@ -937,7 +893,7 @@ static void action_cb(GtkWidget *widget, gpointer data)
rec->smartLECHandle = PrepareIterativeSmartLEC(rec->rb);
SmartLECIteration(rec->smartLECHandle, message);
evaluate_vectors(rec);
render_sector(rec);
gtk_widget_queue_draw(GTK_WIDGET(rec->window));
undo_remember(rec);
GuiSetLabelText(rec->rightLabel, _("Smart L-EC: %s"), message);
break;
@@ -972,24 +928,24 @@ void GuiCreateRawEditor(void)
/* Create the main layout of the window */
outer_box = gtk_vbox_new(FALSE, 0);
outer_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(window), outer_box);
hbox = gtk_hbox_new(FALSE, 0);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(outer_box), hbox, FALSE, FALSE, 0);
rec->leftLabel = label = gtk_label_new("Reed-Solomon Sudoku");
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(label), 0.0);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
rec->rightLabel = label = gtk_label_new(_("Please load a raw sector file!"));
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(label), 0.0);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
hbox = gtk_hbox_new(FALSE, 0);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(outer_box), hbox, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 0);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
/* Actions for browsing the raw samples */
@@ -997,13 +953,13 @@ void GuiCreateRawEditor(void)
label = gtk_label_new(_utf("Browsing"));
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 10);
hbox2 = gtk_hbox_new(FALSE, 0);
hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
vbox1 = gtk_vbox_new(FALSE, 0);
vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(hbox2), vbox1, FALSE, FALSE, 0);
vbox2 = gtk_vbox_new(FALSE, 0);
vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(hbox2), vbox2, FALSE, FALSE, 0);
button = gtk_button_new_with_label(_utf("button|Load"));
@@ -1042,13 +998,16 @@ void GuiCreateRawEditor(void)
label = gtk_label_new(_utf("Editing"));
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 10);
hbox2 = gtk_hbox_new(TRUE, 0);
hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_set_homogeneous(GTK_BOX(hbox2), TRUE);
gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
vbox1 = gtk_vbox_new(TRUE, 0);
vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_set_homogeneous(GTK_BOX(vbox1), TRUE);
gtk_box_pack_start(GTK_BOX(hbox2), vbox1, TRUE, TRUE, 0);
vbox2 = gtk_vbox_new(TRUE, 0);
vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_set_homogeneous(GTK_BOX(vbox2), TRUE);
gtk_box_pack_start(GTK_BOX(hbox2), vbox2, TRUE, TRUE, 0);
button = gtk_button_new_with_label(_utf("button|Load Buf"));
@@ -1127,7 +1086,7 @@ void GuiCreateRawEditor(void)
rec->drawingArea = gtk_drawing_area_new();
gtk_widget_add_events(rec->drawingArea, GDK_BUTTON_PRESS_MASK);
gtk_box_pack_start(GTK_BOX(hbox), rec->drawingArea, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(rec->drawingArea), "expose_event", G_CALLBACK(expose_cb), NULL);
g_signal_connect(G_OBJECT(rec->drawingArea), "draw", G_CALLBACK(draw_cb), NULL);
g_signal_connect(G_OBJECT(rec->drawingArea), "button_press_event", G_CALLBACK(button_cb), NULL);
}

View File

@@ -86,7 +86,7 @@ static void open_defective_sector_file(RawBuffer *rb, char *path, LargeFile **fi
#endif
dsh->nSectors = (length-sizeof(DefectiveSectorHeader))/dsh->sectorSize;
if(dsh->nSectors*dsh->sectorSize+sizeof(DefectiveSectorHeader) != length)
if((guint64)dsh->nSectors*dsh->sectorSize+sizeof(DefectiveSectorHeader) != length)
Stop(_("Defective sector file is truncated"));
/* Expand the old non-C2 raw dumps to new size */
@@ -99,7 +99,7 @@ static void open_defective_sector_file(RawBuffer *rb, char *path, LargeFile **fi
PrintCLI(" * Expanding raw dump for sector %lld from 2352 to %d bytes *\n",
(long long)dsh->lba, MAX_RAW_TRANSFER_SIZE);
buf = g_malloc(dsh->sectorSize*dsh->nSectors);
buf = g_malloc((gsize)dsh->sectorSize*dsh->nSectors);
for(i=0, ptr=buf; i<dsh->nSectors; i++, ptr+=2352)
{ int n=LargeRead(*file, ptr, dsh->sectorSize);
@@ -210,7 +210,7 @@ int SaveDefectiveSector(RawBuffer *rb, int can_c2_scan)
{ if(!LargeSeek(file, sizeof(DefectiveSectorHeader)))
Stop(_("Failed seeking in defective sector file: %s"), strerror(errno));
cache_sectors = g_malloc(dsh->sectorSize*dsh->nSectors);
cache_sectors = g_malloc((gsize)dsh->sectorSize*dsh->nSectors);
for(i=0, idx=0; i<dsh->nSectors; i++, idx+=dsh->sectorSize)
{ int n=LargeRead(file, cache_sectors+idx, dsh->sectorSize);
@@ -221,7 +221,7 @@ int SaveDefectiveSector(RawBuffer *rb, int can_c2_scan)
/* Store sectors which are not already cached */
offset = sizeof(DefectiveSectorHeader) + dsh->sectorSize*dsh->nSectors;
offset = sizeof(DefectiveSectorHeader) + (guint64)dsh->sectorSize*dsh->nSectors;
if(!LargeSeek(file, offset))
Stop(_("Failed seeking in defective sector file: %s"), strerror(errno));

View File

@@ -32,56 +32,49 @@
static long long int readable, correctable, missing;
static int percent,min_required;
static GdkColor *footer_color;
static GdkRGBA *footer_color;
#define REDRAW_TITLE 1<<0
#define REDRAW_SUBTITLE 1<<1
#define REDRAW_PROGRESS 1<<2
#define REDRAW_ERRORMSG 1<<3
static int draw_text(GdkDrawable *d, PangoLayout *l, char *text, int x, int y, GdkColor *color, int redraw)
{ static GdkPixmap *pixmap;
static int pixmap_width, pixmap_height;
int w,h,pw;
int erase_to = Closure->readAdaptiveSpiral->mx - Closure->readAdaptiveSpiral->diameter/2;
static int draw_text(cairo_t *cr, PangoLayout *l, char *text, int x, int y, GdkRGBA *color, int redraw)
{ int w,h,pw;
int erase_to;
GuiSetText(l, text, &w, &h);
pw = erase_to-x;
if(pw > pixmap_width || h > pixmap_height)
{ if(pixmap) g_object_unref(pixmap);
pixmap = gdk_pixmap_new(d, pw, h, -1);
pixmap_width = pw;
pixmap_height = h;
}
if(redraw)
{ erase_to = Closure->readAdaptiveSpiral->mx - Closure->readAdaptiveSpiral->diameter/2;
pw = erase_to-x;
if(redraw) /* redraw using double buffering to prevent flicker */
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->background);
gdk_draw_rectangle(pixmap, Closure->drawGC, TRUE, 0, 0, pw, h);
gdk_gc_set_rgb_fg_color(Closure->drawGC, color);
gdk_draw_layout(pixmap, Closure->drawGC, 0, 0, l);
gdk_draw_drawable(d, Closure->drawGC, pixmap, 0, 0, x, y, pw, h);
gdk_cairo_set_source_rgba(cr, color);
cairo_move_to(cr, x, y);
pango_cairo_show_layout(cr, l);
}
return h;
}
static void redraw_labels(GtkWidget *widget, int erase_mask)
{ GdkDrawable *d = Closure->readAdaptiveDrawingArea->window;
char buf[256];
static void redraw_labels(cairo_t *cr, GtkWidget *widget, int erase_mask)
{ char buf[256];
int x,y,w,h;
/* Get foreground color */
GdkRGBA fg = {0};
GtkStyleContext *context = gtk_widget_get_style_context(widget);
gtk_style_context_get_color(context, gtk_widget_get_state_flags(widget), &fg);
/* Draw the labels */
x = 10;
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->foreground);
gdk_cairo_set_source_rgba(cr, &fg);
y = Closure->readAdaptiveSpiral->my - Closure->readAdaptiveSpiral->diameter/2;
h = draw_text(d, Closure->readLinearCurve->layout,
_("Adaptive reading:"), x, y, Closure->foreground, erase_mask & REDRAW_TITLE);
h = draw_text(cr, Closure->readLinearCurve->layout,
_("Adaptive reading:"), x, y, &fg, erase_mask & REDRAW_TITLE);
y += h+h/2;
if(Closure->readAdaptiveSubtitle)
@@ -90,38 +83,41 @@ static void redraw_labels(GtkWidget *widget, int erase_mask)
while(*c && *c != ' ') /* find point to split text in middle */
c++;
if(c) /* split text into two lines */
if(*c) /* split text into two lines */
{ *c = 0;
h = draw_text(d, Closure->readLinearCurve->layout,
Closure->readAdaptiveSubtitle, x, y, Closure->foreground,
h = draw_text(cr, Closure->readLinearCurve->layout,
Closure->readAdaptiveSubtitle, x, y, &fg,
erase_mask & REDRAW_SUBTITLE);
h = draw_text(d, Closure->readLinearCurve->layout,
c+1, x, y+h, Closure->foreground,
h = draw_text(cr, Closure->readLinearCurve->layout,
c+1, x, y+h, &fg,
erase_mask & REDRAW_SUBTITLE);
*c = ' ';
}
else /* draw text in one line */
{ h = draw_text(d, Closure->readLinearCurve->layout,
Closure->readAdaptiveSubtitle, x, y, Closure->foreground,
{ h = draw_text(cr, Closure->readLinearCurve->layout,
Closure->readAdaptiveSubtitle, x, y, &fg,
erase_mask & REDRAW_SUBTITLE);
}
}
y += 4*h;
h = draw_text(d, Closure->readLinearCurve->layout,
_("Sectors processed"), x, y, Closure->foreground, erase_mask & REDRAW_TITLE);
h = draw_text(cr, Closure->readLinearCurve->layout,
_("Sectors processed"), x, y, &fg, erase_mask & REDRAW_TITLE);
y += h;
snprintf(buf, 255, " %s: %lld", _("readable"), readable);
h = draw_text(d, Closure->readLinearCurve->layout, buf, x, y, Closure->foreground, erase_mask & REDRAW_PROGRESS);
h = draw_text(cr, Closure->readLinearCurve->layout, buf, x, y, &fg,
erase_mask & REDRAW_PROGRESS);
y += h;
snprintf(buf, 255, " %s: %lld", _("correctable"), correctable);
h = draw_text(d, Closure->readLinearCurve->layout, buf, x, y, Closure->foreground, erase_mask & REDRAW_PROGRESS);
h = draw_text(cr, Closure->readLinearCurve->layout, buf, x, y, &fg,
erase_mask & REDRAW_PROGRESS);
y += h;
snprintf(buf, 255, " %s: %lld", _("missing"), missing);
h = draw_text(d, Closure->readLinearCurve->layout, buf, x, y, Closure->foreground, erase_mask & REDRAW_PROGRESS);
h = draw_text(cr, Closure->readLinearCurve->layout, buf, x, y, &fg,
erase_mask & REDRAW_PROGRESS);
if(min_required > 0 && readable > 0)
{ int percent = round(((1000*readable)/(readable+correctable+missing)));
@@ -133,55 +129,51 @@ static void redraw_labels(GtkWidget *widget, int erase_mask)
snprintf(buf, 255, _("Readable: %d.%d%% / %d.%d%% required"),
percent/10, percent%10,
min_required/10, min_required%10);
h = draw_text(d, Closure->readLinearCurve->layout, buf, x, y, Closure->foreground, erase_mask & REDRAW_PROGRESS);
h = draw_text(cr, Closure->readLinearCurve->layout, buf, x, y, &fg,
erase_mask & REDRAW_PROGRESS);
}
y += h;
snprintf(buf, 255, _("Total recoverable: %d.%d%%"), percent/10, percent%10);
h = draw_text(d, Closure->readLinearCurve->layout, buf, x, y, Closure->foreground, erase_mask & REDRAW_PROGRESS);
h = draw_text(cr, Closure->readLinearCurve->layout, buf, x, y, &fg,
erase_mask & REDRAW_PROGRESS);
if(Closure->readAdaptiveErrorMsg && erase_mask & REDRAW_ERRORMSG)
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, footer_color);
{ gdk_cairo_set_source_rgba(cr, footer_color ? footer_color : &fg);
GuiSetText(Closure->readLinearCurve->layout, Closure->readAdaptiveErrorMsg, &w, &h);
y = Closure->readAdaptiveSpiral->my + Closure->readAdaptiveSpiral->diameter/2 - h;
gdk_draw_layout(d, Closure->drawGC, x, y, Closure->readLinearCurve->layout);
cairo_move_to(cr, x, y);
pango_cairo_show_layout(cr, Closure->readLinearCurve->layout);
}
}
static void redraw_spiral(GtkWidget *widget)
{
GuiDrawSpiral(Closure->readAdaptiveSpiral);
}
/* Calculate the geometry of the spiral */
static void update_geometry(GtkWidget *widget)
{ GtkAllocation *a = &widget->allocation;
{ GtkAllocation a = {0};
gtk_widget_get_allocation(widget, &a);
Closure->readAdaptiveSpiral->mx = a->width - 15 - Closure->readAdaptiveSpiral->diameter / 2;
Closure->readAdaptiveSpiral->my = a->height / 2;
Closure->readAdaptiveSpiral->mx = a.width - 15 - Closure->readAdaptiveSpiral->diameter / 2;
Closure->readAdaptiveSpiral->my = a.height / 2;
}
/* Expose event handler */
/* Draw event handler */
static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{
GuiSetSpiralWidget(Closure->readAdaptiveSpiral, widget);
if(event->count) /* Exposure compression */
return TRUE;
update_geometry(widget);
redraw_labels(widget, ~0);
redraw_spiral(widget);
redraw_labels(cr, widget, ~0);
GuiDrawSpiral(cr, Closure->readAdaptiveSpiral);
return TRUE;
}
/*
* Clip the spiral. Simply remove the clipping elements to avoid flicker.
* Clip the spiral.
*/
static gboolean clip_idle_func(gpointer data)
@@ -189,22 +181,19 @@ static gboolean clip_idle_func(gpointer data)
int i;
if(spiral->segmentClipping < spiral->segmentCount)
{ GdkColor *outline = spiral->outline;
int clipping = spiral->segmentClipping;
{ int clipping = spiral->segmentClipping;
spiral->outline = Closure->background;
spiral->segmentClipping = spiral->segmentCount;
for(i=clipping; i < spiral->segmentCount; i++)
GuiDrawSpiralSegment(spiral, Closure->background, i);
GuiSetSpiralSegmentColor(spiral, &transparent, &transparent, i);
spiral->outline = outline;
spiral->segmentClipping = clipping;
/* Now redraw the last turn */
for(i=ADAPTIVE_READ_SPIRAL_SIZE-300; i<=clipping; i++)
GuiDrawSpiralSegment(spiral, Closure->background, i);
GuiSetSpiralSegmentColor(spiral, &transparent, 0, i);
}
return FALSE;
@@ -219,30 +208,20 @@ void GuiClipReadAdaptiveSpiral(int segments)
/*
* Change the segment color.
* Segment numbers are passed with an offset of 100,
* since another routine is occasionally doing an
* g_idle_remove_by_data(GINT_TO_POINTER(REDRAW_PROGRESS)),
* with REDRAW_PROGRESS being 4 which would make segment 4 fail to redraw.
* One of the many places where the Gtk+ API is not well thought out.
* We can't ask for a redraw when not an the main thread, but can set an idle
* function to do so.
*/
static gboolean segment_idle_func(gpointer data)
{ int segment = GPOINTER_TO_INT(data);
segment-=100;
GuiDrawSpiralSegment(Closure->readAdaptiveSpiral,
Closure->readAdaptiveSpiral->segmentColor[segment],
segment);
{
gtk_widget_queue_draw(Closure->readAdaptiveDrawingArea);
return FALSE;
}
void GuiChangeSegmentColor(GdkColor *color, int segment)
void GuiChangeSegmentColor(GdkRGBA *color, int segment)
{
Closure->readAdaptiveSpiral->segmentColor[segment] = color;
if(Closure->readAdaptiveSpiral->cursorPos == segment)
Closure->readAdaptiveSpiral->colorUnderCursor = color;
else g_idle_add(segment_idle_func, GINT_TO_POINTER(100+segment));
g_idle_add(segment_idle_func, 0);
}
/*
@@ -254,8 +233,8 @@ static gboolean remove_fill_idle_func(gpointer data)
int i;
for(i=0; i<spiral->segmentCount; i++)
if(spiral->segmentColor[i] == Closure->whiteSector)
GuiDrawSpiralSegment(spiral, Closure->background, i);
if(spiral->segmentColor[i] == Closure->whiteSector)
GuiSetSpiralSegmentColor(spiral, &transparent, 0, i);
return FALSE;
}
@@ -270,9 +249,8 @@ void GuiRemoveFillMarkers()
***/
static gboolean label_redraw_idle_func(gpointer data)
{ int erase_mask = GPOINTER_TO_INT(data);
redraw_labels(Closure->readAdaptiveDrawingArea, erase_mask);
{
gtk_widget_queue_draw(Closure->readAdaptiveDrawingArea);
return FALSE;
}
@@ -290,7 +268,7 @@ void GuiSetAdaptiveReadSubtitle(char *title)
g_idle_add(label_redraw_idle_func, GINT_TO_POINTER(REDRAW_SUBTITLE));
}
void GuiSetAdaptiveReadFootline(char *msg, GdkColor *color)
void GuiSetAdaptiveReadFootline(char *msg, GdkRGBA *color)
{
if(!Closure->guiMode)
return;
@@ -322,7 +300,7 @@ void GuiUpdateAdaptiveResults(gint64 r, gint64 c, gint64 m, int p)
***/
void GuiResetAdaptiveReadWindow()
{ GuiFillSpiral(Closure->readAdaptiveSpiral, Closure->background);
{ GuiFillSpiral(Closure->readAdaptiveSpiral, &transparent);
// DrawSpiral(Closure->readAdaptiveSpiral);
if(Closure->readAdaptiveSubtitle)
@@ -337,16 +315,16 @@ void GuiResetAdaptiveReadWindow()
readable = correctable = missing = 0;
percent = min_required = 0;
if(Closure->readAdaptiveDrawingArea->window)
if(gtk_widget_get_window(Closure->readAdaptiveDrawingArea))
{ static GdkRectangle rect;
GtkAllocation *a = &Closure->readAdaptiveDrawingArea->allocation;
GtkAllocation a = {0};
gtk_widget_get_allocation(Closure->readAdaptiveDrawingArea, &a);
rect.x = rect.y = 0;
rect.width = a->width;
rect.height = a->height;
rect.width = a.width;
rect.height = a.height;
gdk_window_clear(Closure->readAdaptiveDrawingArea->window);
gdk_window_invalidate_rect(Closure->readAdaptiveDrawingArea->window, &rect, FALSE);
gtk_widget_queue_draw(Closure->readAdaptiveDrawingArea);
}
}
@@ -366,24 +344,23 @@ void GuiCreateAdaptiveReadWindow(GtkWidget *parent)
{ GtkWidget *sep,*d_area;
Closure->readAdaptiveHeadline = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(Closure->readAdaptiveHeadline), 0.0, 0.0);
gtk_misc_set_padding(GTK_MISC(Closure->readAdaptiveHeadline), 5, 0);
gtk_label_set_xalign(GTK_LABEL(Closure->readAdaptiveHeadline), 0.0);
gtk_widget_set_margin_start(Closure->readAdaptiveHeadline, 5);
gtk_label_set_ellipsize(GTK_LABEL(Closure->readAdaptiveHeadline), PANGO_ELLIPSIZE_END);
gtk_box_pack_start(GTK_BOX(parent), Closure->readAdaptiveHeadline, FALSE, FALSE, 3);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
d_area = Closure->readAdaptiveDrawingArea = gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(parent), d_area, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(d_area), "expose_event", G_CALLBACK(expose_cb), NULL);
g_signal_connect(G_OBJECT(d_area), "draw", G_CALLBACK(draw_cb), NULL);
Closure->readAdaptiveSpiral
= GuiCreateSpiral(Closure->grid, Closure->background, 10, 5,
ADAPTIVE_READ_SPIRAL_SIZE);
= GuiCreateSpiral(&transparent, 10, 5, ADAPTIVE_READ_SPIRAL_SIZE);
gtk_widget_set_size_request(d_area, -1, Closure->readAdaptiveSpiral->diameter);
}

View File

@@ -560,7 +560,7 @@ static void clear_progress(read_closure *rc)
#ifdef WITH_GUI_NO
#define mark_sector(r, s, c)
#else
static void mark_sector(read_closure *rc, gint64 sector, GdkColor *color)
static void mark_sector(read_closure *rc, gint64 sector, GdkRGBA *color)
{ int segment;
int changed = FALSE;
@@ -569,8 +569,8 @@ static void mark_sector(read_closure *rc, gint64 sector, GdkColor *color)
segment = sector / rc->sectorsPerSegment;
if(color)
{ GdkColor *old = Closure->readAdaptiveSpiral->segmentColor[segment];
GdkColor *new = old;
{ GdkRGBA *old = Closure->readAdaptiveSpiral->segmentColor[segment];
GdkRGBA *new = old;
if(color == Closure->redSector && old != Closure->redSector)
new = color;
@@ -691,9 +691,11 @@ static void open_and_determine_mode(read_closure *rc)
{ int answer;
PrintLog(_("%s-type ECC found\n"), "RS03");
answer = ModalWarning(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, NULL,
_("Adaptive reading has not been adapted yet to handle RS03-augmented images properly.\n"
"To quote the original author: \"behaviour with RS03 is unpredictable and undefined\".\n"
"You should cancel and use the linear reading strategy instead. Continue at your own risk.\n"));
_("Adaptive reading has not been adapted yet to handle RS03-augmented images in an optimal way.\n"
"The 'divide and conquer' reading method will still be applied, by attempting to detect and skip\n"
"badly damaged zones and give priority to good zones first. However we won't stop reading automatically\n"
"once enough data and ECC data have been recovered to be able to rebuild the image, as we do for RS02.\n"
"You should stop the reading and launch a 'verify' yourself from time to time to see if this is the case.\n"));
if(!answer)
{ GuiSetAdaptiveReadFootline(_("Aborted by user request!"), Closure->redText);
@@ -1316,14 +1318,16 @@ void fill_gap(read_closure *rc)
/* Show progress in the spiral */
#ifdef WITH_GUI_YES
if(Closure->guiMode)
{ int segment = i / rc->sectorsPerSegment;
if(Closure->readAdaptiveSpiral->segmentColor[segment] == Closure->background)
if(Closure->readAdaptiveSpiral->segmentColor[segment] == &transparent)
{ GuiChangeSegmentColor(Closure->whiteSector, segment);
}
}
}
#endif /* WITH_GUI_YES */
}
PrintCLI(" \n");
rc->highestWrittenSector = rc->intervalStart-1;
@@ -1845,7 +1849,7 @@ reread:
if(rc->readMode != IMAGE_ONLY)
{ PrintLog("%s", t);
if(rc->ei)
{ GuiSetAdaptiveReadFootline(t, Closure->foreground);
{ GuiSetAdaptiveReadFootline(t, 0);
}
}
if(Closure->eject)
@@ -1995,7 +1999,7 @@ finished:
PrintLog(_("\n%s\n"
"(%" PRId64 " readable, %" PRId64 " correctable, %" PRId64 " still missing).\n"),
t, rc->readable, rc->correctable, rc->expectedSectors-total);
GuiSetAdaptiveReadFootline(t, Closure->foreground);
GuiSetAdaptiveReadFootline(t, 0);
g_free(t);
exitCode = EXIT_FAILURE;
@@ -2007,7 +2011,7 @@ finished:
{ if(rc->readable == rc->expectedSectors)
{ char *t = _("\nGood! All sectors have been read.\n");
PrintLog("%s", t);
GuiSetAdaptiveReadFootline(t, Closure->foreground);
GuiSetAdaptiveReadFootline(t, 0);
if(Closure->eject)
LoadMedium(rc->dh, FALSE);
}
@@ -2020,7 +2024,7 @@ finished:
"%2d.%1d%% of the image have been read (%" PRId64 " sectors).\n"),
t, percent/10, percent%10, rc->readable);
GuiSetAdaptiveReadFootline(t, Closure->foreground);
GuiSetAdaptiveReadFootline(t, 0);
g_free(t);
exitCode = EXIT_FAILURE;
}

View File

@@ -34,7 +34,7 @@
*** Forward declarations
***/
static void redraw_curve(void);
static void redraw_curve(cairo_t *cr);
static void update_geometry(void);
/***
@@ -47,9 +47,7 @@ static void update_geometry(void);
static gboolean max_speed_idle_func(gpointer data)
{
gdk_window_clear(Closure->readLinearDrawingArea->window);
update_geometry();
redraw_curve();
gtk_widget_queue_draw(Closure->readLinearCurveArea);
return FALSE;
}
@@ -70,7 +68,6 @@ void GuiInitializeCurve(void *rc_ptr, int max_rate, int can_c2)
rc->lastCopied = (1000*rc->firstSector)/rc->image->dh->sectors;
rc->lastPlotted = rc->lastSegment = rc->lastCopied;
rc->lastPlottedY = 0;
if(Closure->readLinearSpiral)
for(i=rc->lastCopied-1; i>=0; i--)
@@ -92,10 +89,8 @@ typedef struct
static gboolean curve_idle_func(gpointer data)
{ curve_info *ci = (curve_info*)data;
read_closure *rc=ci->rc;
gint x0,y0;
char *utf,buf[80];
gint i;
gint resize_curve = FALSE;
/*** Update the textual output */
@@ -112,20 +107,22 @@ static gboolean curve_idle_func(gpointer data)
gtk_label_set_text(GTK_LABEL(Closure->readLinearErrors), utf);
g_free(utf);
/*** Draw the changed spiral segments */
/*** Update color of the changed spiral segments */
for(i=rc->lastSegment; i<ci->percent; i++)
switch(Closure->readLinearCurve->ivalue[i])
{ case 0: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->blueSector, i); break;
case 1: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->greenSector, i); break;
case 2: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->redSector, i); break;
case 3: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->darkSector, i); break;
case 4: GuiDrawSpiralSegment(Closure->readLinearSpiral, Closure->yellowSector, i); break;
{ case 0: GuiSetSpiralSegmentColor(Closure->readLinearSpiral, Closure->blueSector, 0, i); break;
case 1: GuiSetSpiralSegmentColor(Closure->readLinearSpiral, Closure->greenSector, 0, i); break;
case 2: GuiSetSpiralSegmentColor(Closure->readLinearSpiral, Closure->redSector, 0, i); break;
case 3: GuiSetSpiralSegmentColor(Closure->readLinearSpiral, Closure->darkSector, 0, i); break;
case 4: GuiSetSpiralSegmentColor(Closure->readLinearSpiral, Closure->yellowSector, 0, i); break;
}
rc->lastSegment = ci->percent;
if(rc->pass) /* 2nd or higher reading pass, don't touch the curve */
/* Don't touch the curve if 2nd or higher reading pass, of if there is no new data */
if(rc->pass || rc->lastPlotted >= ci->percent)
{ g_free(ci);
g_mutex_lock(rc->rendererMutex);
rc->activeRenderers--;
@@ -137,53 +134,12 @@ static gboolean curve_idle_func(gpointer data)
for(i=rc->lastPlotted+1; i<=ci->percent; i++)
if(Closure->readLinearCurve->fvalue[i] > Closure->readLinearCurve->maxY)
resize_curve = TRUE;
Closure->readLinearCurve->maxY = Closure->readLinearCurve->fvalue[i];
if(resize_curve)
{ Closure->readLinearCurve->maxY = Closure->readLinearCurve->fvalue[ci->percent] + 1;
/*** Schedule the curve for redrawing */
update_geometry();
gdk_window_clear(Closure->readLinearDrawingArea->window);
redraw_curve();
rc->lastPlotted = ci->percent;
rc->lastPlottedY = GuiCurveY(Closure->readLinearCurve, Closure->readLinearCurve->fvalue[ci->percent]);
g_free(ci);
g_mutex_lock(rc->rendererMutex);
rc->activeRenderers--;
g_mutex_unlock(rc->rendererMutex);
return FALSE;
}
/*** Draw the changed curve part */
x0 = GuiCurveX(Closure->readLinearCurve, rc->lastPlotted);
y0 = GuiCurveY(Closure->readLinearCurve, Closure->readLinearCurve->fvalue[rc->lastPlotted]);
if(rc->lastPlottedY) y0 = rc->lastPlottedY;
for(i=rc->lastPlotted+1; i<=ci->percent; i++)
{ gint x1 = GuiCurveX(Closure->readLinearCurve, i);
gint y1 = GuiCurveY(Closure->readLinearCurve, Closure->readLinearCurve->fvalue[i]);
gint l1 = GuiCurveLogY(Closure->readLinearCurve, Closure->readLinearCurve->lvalue[i]);
if(Closure->readLinearCurve->lvalue[i])
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->logColor);
gdk_draw_rectangle(Closure->readLinearDrawingArea->window,
Closure->drawGC, TRUE,
x0, l1,
x0==x1 ? 1 : x1-x0, Closure->readLinearCurve->bottomLY-l1);
}
if(x0<x1)
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->curveColor);
gdk_draw_line(Closure->readLinearDrawingArea->window,
Closure->drawGC,
x0, y0, x1, y1);
rc->lastPlotted = ci->percent;
x0 = x1;
rc->lastPlottedY = y0 = y1;
}
}
rc->lastPlotted = ci->percent;
gtk_widget_queue_draw(Closure->readLinearCurveArea);
g_free(ci);
g_mutex_lock(rc->rendererMutex);
@@ -245,7 +201,7 @@ void GuiAddCurveValues(void *rc_ptr, int percent, int color, int c2)
static gboolean curve_mark_idle_func(gpointer data)
{
GuiDrawSpiral(Closure->readLinearSpiral);
gtk_widget_queue_draw(Closure->readLinearSpiral->widget);
return FALSE;
}
@@ -260,8 +216,6 @@ void GuiMarkExistingSectors(void)
x = Closure->readLinearCurve->rightX + 20;
Closure->additionalSpiralColor = 3;
GuiDrawSpiralLabel(Closure->readLinearSpiral, Closure->readLinearCurve->layout,
_("Already present"), Closure->darkSector, x, -1);
for(i=0; i<1000; i++)
if(Closure->readLinearSpiral->segmentColor[i] == Closure->greenSector)
@@ -276,29 +230,17 @@ void GuiMarkExistingSectors(void)
* Redraw the whole curve
*/
/* Calculate the geometry of the curve and spiral */
static void redraw_curve(cairo_t *cr)
{
GuiRedrawAxes(cr, Closure->readLinearCurve);
GuiRedrawCurve(cr, Closure->readLinearCurve, 1000);
}
/* Calculate the geometry of the curve */
static void update_geometry(void)
{ GtkWidget *widget = Closure->readLinearDrawingArea;
GtkAllocation *a = &widget->allocation;
/* Curve geometry */
GuiUpdateCurveGeometry(Closure->readLinearCurve, "99x",
Closure->readLinearSpiral->diameter + 30);
/* Spiral center */
Closure->readLinearSpiral->mx = a->width - 15 - Closure->readLinearSpiral->diameter / 2;
Closure->readLinearSpiral->my = a->height / 2;
if(Closure->crcBuf && Closure->crcBuf->crcCached)
{ int w,h;
GuiSetText(Closure->readLinearCurve->layout, _("Sectors with CRC errors"), &w, &h);
Closure->readLinearSpiral->my -= h;
}
{
GuiUpdateCurveGeometry(Closure->readLinearCurve, "99x", 10);
/* Label positions in the foot line */
@@ -309,56 +251,64 @@ static void update_geometry(void)
}
static void redraw_curve(void)
{ GdkDrawable *d = Closure->readLinearDrawingArea->window;
int x,w,h;
static void redraw_spiral_labels(cairo_t *cr)
{ int x,w,h;
int pos = 1;
/* Draw and label the spiral */
x = Closure->readLinearCurve->rightX + 20;
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->curveColor);
x = 10;
GuiSetText(Closure->readLinearCurve->layout, _("Medium state"), &w, &h);
gdk_draw_layout(d, Closure->drawGC,
x,
Closure->readLinearCurve->topY - h - 5,
Closure->readLinearCurve->layout);
gdk_cairo_set_source_rgba(cr, Closure->curveColor);
cairo_move_to(cr, x, Closure->readLinearCurve->topY - h - 5);
pango_cairo_show_layout(cr, Closure->readLinearCurve->layout);
if(Closure->additionalSpiralColor == 0)
GuiDrawSpiralLabel(Closure->readLinearSpiral, Closure->readLinearCurve->layout,
GuiDrawSpiralLabel(cr, Closure->readLinearSpiral, Closure->readLinearCurve->layout,
_("Not touched this time"), Closure->curveColor, x, -1);
if(Closure->additionalSpiralColor == 3)
GuiDrawSpiralLabel(Closure->readLinearSpiral, Closure->readLinearCurve->layout,
GuiDrawSpiralLabel(cr, Closure->readLinearSpiral, Closure->readLinearCurve->layout,
_("Already present"), Closure->darkSector, x, -1);
GuiDrawSpiralLabel(Closure->readLinearSpiral, Closure->readLinearCurve->layout,
GuiDrawSpiralLabel(cr, Closure->readLinearSpiral, Closure->readLinearCurve->layout,
_("Successfully read"), Closure->greenSector, x, pos++);
if(Closure->crcBuf && Closure->crcBuf->crcCached)
GuiDrawSpiralLabel(Closure->readLinearSpiral, Closure->readLinearCurve->layout,
GuiDrawSpiralLabel(cr, Closure->readLinearSpiral, Closure->readLinearCurve->layout,
_("Sectors with CRC errors"), Closure->yellowSector, x, pos++);
GuiDrawSpiralLabel(Closure->readLinearSpiral, Closure->readLinearCurve->layout,
GuiDrawSpiralLabel(cr, Closure->readLinearSpiral, Closure->readLinearCurve->layout,
_("Unreadable / skipped"), Closure->redSector, x, pos++);
GuiDrawSpiral(Closure->readLinearSpiral);
/* Redraw the curve */
GuiRedrawAxes(Closure->readLinearCurve);
GuiRedrawCurve(Closure->readLinearCurve, 1000);
GuiDrawSpiral(cr, Closure->readLinearSpiral);
}
static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
GuiSetSpiralWidget(Closure->readLinearSpiral, widget);
if(event->count) /* Exposure compression */
return TRUE;
static gboolean draw_curve_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{
update_geometry();
redraw_curve();
redraw_curve(cr);
return TRUE;
}
static gboolean draw_spiral_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ GtkAllocation a = {0};
gtk_widget_get_allocation(widget, &a);
GuiSetSpiralWidget(Closure->readLinearSpiral, widget);
/* Override spiral center */
Closure->readLinearSpiral->mx = a.width - 15 - Closure->readLinearSpiral->diameter / 2;
if(Closure->crcBuf && Closure->crcBuf->crcCached)
{ int w,h;
GuiSetText(Closure->readLinearCurve->layout, _("Sectors with CRC errors"), &w, &h);
Closure->readLinearSpiral->my = a.height/2 - h;
}
redraw_spiral_labels(cr);
return TRUE;
}
@@ -372,30 +322,21 @@ void GuiResetLinearReadWindow()
gtk_notebook_set_current_page(GTK_NOTEBOOK(Closure->readLinearNotebook), 0);
GuiZeroCurve(Closure->readLinearCurve);
GuiFillSpiral(Closure->readLinearSpiral, Closure->background);
GuiDrawSpiral(Closure->readLinearSpiral);
GuiFillSpiral(Closure->readLinearSpiral, &transparent);
if (Closure->readLinearSpiral->widget)
gtk_widget_queue_draw(Closure->readLinearSpiral->widget);
}
/*
* Re-layout and redraw the read window while it is in use.
* Re-layout and redraw the curve drawing area while it is in use.
* Required to add the information that CRC data is available,
* since this happens when the the initial rendering of the window
* contents have already been carried out.
*/
static gboolean redraw_idle_func(gpointer data)
{ GdkRectangle rect;
GdkWindow *window;
gint ignore;
/* Trigger an expose event for the drawing area. */
window = gtk_widget_get_parent_window(Closure->readLinearDrawingArea);
if(window)
{ gdk_window_get_geometry(window, &rect.x, &rect.y, &rect.width, &rect.height, &ignore);
gdk_window_invalidate_rect(window, &rect, TRUE);
}
{
gtk_widget_queue_draw(Closure->readLinearCurveArea);
return FALSE;
}
@@ -410,49 +351,57 @@ void GuiRedrawReadLinearWindow(void)
***/
void GuiCreateLinearReadWindow(GtkWidget *parent)
{ GtkWidget *sep,*ignore,*d_area,*notebook,*hbox;
{ GtkWidget *sep,*ignore,*curve,*spiral,*notebook,*hbox;
Closure->readLinearHeadline = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(Closure->readLinearHeadline), 0.0, 0.0);
gtk_misc_set_padding(GTK_MISC(Closure->readLinearHeadline), 5, 0);
gtk_label_set_xalign(GTK_LABEL(Closure->readLinearHeadline), 0.0);
gtk_widget_set_margin_start(Closure->readLinearHeadline, 5);
gtk_label_set_ellipsize(GTK_LABEL(Closure->readLinearHeadline), PANGO_ELLIPSIZE_END);
gtk_box_pack_start(GTK_BOX(parent), Closure->readLinearHeadline, FALSE, FALSE, 3);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
d_area = Closure->readLinearDrawingArea = gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(parent), d_area, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(d_area), "expose_event", G_CALLBACK(expose_cb), NULL);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(parent), hbox, TRUE, TRUE, 0);
curve = Closure->readLinearCurveArea = gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(hbox), curve, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(curve), "draw", G_CALLBACK(draw_curve_cb), NULL);
Closure->readLinearSpiral = GuiCreateSpiral(&transparent, 10, 5, 1000);
spiral = gtk_drawing_area_new();
gtk_widget_set_size_request(spiral, Closure->readLinearSpiral->diameter + 20, -1);
gtk_box_pack_start(GTK_BOX(hbox), spiral, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(spiral), "draw", G_CALLBACK(draw_spiral_cb), NULL);
notebook = Closure->readLinearNotebook = gtk_notebook_new();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
gtk_box_pack_end(GTK_BOX(parent), notebook, FALSE, FALSE, 0);
hbox = Closure->readLinearFootlineBox = gtk_hbox_new(FALSE, 0);
hbox = Closure->readLinearFootlineBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
Closure->readLinearSpeed = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(Closure->readLinearSpeed), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(Closure->readLinearSpeed), 0.0);
gtk_box_pack_start(GTK_BOX(hbox), Closure->readLinearSpeed, FALSE, FALSE, 0);
Closure->readLinearErrors = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(Closure->readLinearErrors), 1.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(Closure->readLinearErrors), 1.0);
gtk_box_pack_start(GTK_BOX(hbox), Closure->readLinearErrors, TRUE, TRUE, 0);
ignore = gtk_label_new("progress_tab");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox, ignore);
Closure->readLinearFootline = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(Closure->readLinearFootline), 0.0, 0.5);
gtk_misc_set_padding(GTK_MISC(Closure->readLinearFootline), 5, 0);
gtk_label_set_xalign(GTK_LABEL(Closure->readLinearFootline), 0.0);
gtk_widget_set_margin_start(Closure->readLinearFootline, 5);
ignore = gtk_label_new("footer_tab");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), Closure->readLinearFootline, ignore);
Closure->readLinearCurve = GuiCreateCurve(d_area, _("Speed"), "%dx", 1000, CURVE_MEGABYTES);
Closure->readLinearCurve = GuiCreateCurve(curve, _("Speed"), "%dx", 1000, CURVE_MEGABYTES);
Closure->readLinearCurve->leftLogLabel = g_strdup(_("C2 errors"));
Closure->readLinearSpiral = GuiCreateSpiral(Closure->grid, Closure->background, 10, 5, 1000);
}
#endif /* WITH_GUI_YES */

View File

@@ -88,7 +88,6 @@ typedef struct
gint lastCopied;
gint lastSegment;
gint lastPlotted;
gint lastPlottedY;
gint activeRenderers;
GMutex *rendererMutex;

View File

@@ -367,7 +367,7 @@ void RS01ScanImage(Method *method, Image* image, struct MD5Context *ecc_ctxt, in
{ PrintProgress(msg,percent);
#ifdef WITH_GUI_YES
if(Closure->guiMode && mode & CREATE_CRC)
if(Closure->guiMode && mode & CREATE_CRC && wl)
{ GuiSetProgress(wl->encPBar1, percent, 100);
}

View File

@@ -55,8 +55,9 @@ void ResetRS01VerifyWindow(Method *self)
wl->lastPercent = 0;
GuiFillSpiral(wl->cmpSpiral, Closure->background);
GuiDrawSpiral(wl->cmpSpiral);
GuiFillSpiral(wl->cmpSpiral, &transparent);
if (wl->cmpSpiral->widget)
gtk_widget_queue_draw(wl->cmpSpiral->widget);
}
/***
@@ -69,7 +70,7 @@ void ResetRS01VerifyWindow(Method *self)
typedef struct _spiral_idle_info
{ Spiral *cmpSpiral;
GdkColor *segColor;
GdkRGBA *segColor;
int from, to;
} spiral_idle_info;
@@ -78,7 +79,7 @@ static gboolean spiral_idle_func(gpointer data)
int i;
for(i=sii->from; i<=sii->to; i++)
GuiDrawSpiralSegment(sii->cmpSpiral, sii->segColor, i-1);
GuiSetSpiralSegmentColor(sii->cmpSpiral, sii->segColor, 0, i-1);
g_free(sii);
return FALSE;
@@ -87,12 +88,13 @@ static gboolean spiral_idle_func(gpointer data)
void RS01AddVerifyValues(Method *method, int percent,
gint64 totalMissing, gint64 totalCrcErrors,
gint64 newMissing, gint64 newCrcErrors)
{ RS01Widgets *wl = (RS01Widgets*)method->widgetList;
spiral_idle_info *sii = g_malloc(sizeof(spiral_idle_info));
{
if(percent < 0 || percent > VERIFY_IMAGE_SEGMENTS)
return;
RS01Widgets *wl = (RS01Widgets*)method->widgetList;
spiral_idle_info *sii = g_malloc(sizeof(spiral_idle_info));
if(newMissing)
{ GuiSetLabelText(wl->cmpMissingSectors, "<span %s>%" PRId64 "</span>",
Closure->redMarkup, totalMissing);
@@ -120,28 +122,29 @@ void RS01AddVerifyValues(Method *method, int percent,
* Redraw whole spiral
*/
static void redraw_spiral(RS01Widgets *wl)
static void redraw_spiral(cairo_t *cr, RS01Widgets *wl)
{ int x = wl->cmpSpiral->mx - wl->cmpSpiral->diameter/2 + 10;
GuiDrawSpiralLabel(wl->cmpSpiral, wl->cmpLayout,
GuiDrawSpiralLabel(cr, wl->cmpSpiral, wl->cmpLayout,
_("Good sectors"), Closure->greenSector, x, 1);
GuiDrawSpiralLabel(wl->cmpSpiral, wl->cmpLayout,
GuiDrawSpiralLabel(cr, wl->cmpSpiral, wl->cmpLayout,
_("Sectors with CRC errors"), Closure->yellowSector, x, 2);
GuiDrawSpiralLabel(wl->cmpSpiral, wl->cmpLayout,
GuiDrawSpiralLabel(cr, wl->cmpSpiral, wl->cmpLayout,
_("Missing sectors"), Closure->redSector, x, 3);
GuiDrawSpiral(wl->cmpSpiral);
GuiDrawSpiral(cr, wl->cmpSpiral);
}
/*
* expose event handler for the spiral
* Draw event handler for the spiral
*/
static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ RS01Widgets *wl = (RS01Widgets*)data;
GtkAllocation *a = &widget->allocation;
GtkAllocation a = {0};
gtk_widget_get_allocation(widget, &a);
int w,h,size;
/* Finish spiral initialization */
@@ -154,16 +157,12 @@ static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer dat
GuiSetText(wl->cmpLayout, _("Missing sectors"), &w, &h);
size = wl->cmpSpiral->diameter + 20 + 3*(10+h); /* approx. size of spiral + labels */
wl->cmpSpiral->mx = a->width / 2;
wl->cmpSpiral->my = (wl->cmpSpiral->diameter + a->height - size)/2;
if(event->count) /* Exposure compression */
{ return TRUE;
}
wl->cmpSpiral->mx = a.width / 2;
wl->cmpSpiral->my = (wl->cmpSpiral->diameter + a.height - size)/2;
/* Redraw the spiral */
redraw_spiral(wl);
redraw_spiral(cr, wl);
return TRUE;
}
@@ -175,27 +174,34 @@ static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer dat
void CreateRS01VerifyWindow(Method *self, GtkWidget *parent)
{ RS01Widgets *wl = (RS01Widgets*)self->widgetList;
GtkWidget *sep,*notebook,*table,*table2,*ignore,*lab,*frame,*d_area;
GtkWidget *sep,*notebook,*grid,*grid2,*ignore,*lab,*frame,*d_area;
wl->cmpHeadline = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->cmpHeadline), 0.0, 0.0);
gtk_misc_set_padding(GTK_MISC(wl->cmpHeadline), 5, 0);
gtk_label_set_xalign(GTK_LABEL(wl->cmpHeadline), 0.0);
gtk_widget_set_margin_start(wl->cmpHeadline, 5);
gtk_box_pack_start(GTK_BOX(parent), wl->cmpHeadline, FALSE, FALSE, 3);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
table = gtk_table_new(2, 2, FALSE);
gtk_container_set_border_width(GTK_CONTAINER(table), 5);
gtk_box_pack_start(GTK_BOX(parent), table, TRUE, TRUE, 0);
grid = gtk_grid_new();
gtk_widget_set_margin_start(grid, 5);
gtk_widget_set_margin_end(grid, 5);
gtk_widget_set_margin_top(grid, 5);
gtk_widget_set_margin_bottom(grid, 5);
gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
gtk_grid_set_row_spacing(GTK_GRID(grid), 10);
gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
gtk_box_pack_start(GTK_BOX(parent), grid, TRUE, TRUE, 0);
/*** Image info */
frame = gtk_frame_new(_utf("Image file summary"));
gtk_table_attach(GTK_TABLE(table), frame, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_widget_set_hexpand(frame, TRUE);
gtk_grid_attach(GTK_GRID(grid), frame, 1, 1, 1, 1);
notebook = wl->cmpImageNotebook = gtk_notebook_new();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
@@ -206,62 +212,72 @@ void CreateRS01VerifyWindow(Method *self, GtkWidget *parent)
lab = gtk_label_new(_utf("No image present."));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), lab, ignore);
table2 = gtk_table_new(2, 5, FALSE);
grid2 = gtk_grid_new();
gtk_widget_set_margin_start(grid2, 5);
gtk_widget_set_margin_end(grid2, 5);
gtk_widget_set_margin_top(grid2, 2);
gtk_widget_set_margin_bottom(grid2, 2);
gtk_grid_set_column_spacing(GTK_GRID(grid2), 5);
gtk_grid_set_row_spacing(GTK_GRID(grid2), 4);
ignore = gtk_label_new("image info");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table2, ignore);
gtk_container_set_border_width(GTK_CONTAINER(table2), 5);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), grid2, ignore);
gtk_container_set_border_width(GTK_CONTAINER(grid2), 5);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Medium sectors:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 1, 1, 1);
lab = wl->cmpImageSectors = gtk_label_new("0");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 1, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Checksum errors:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 2, 1, 1);
lab = wl->cmpChkSumErrors = gtk_label_new("0");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 2, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Missing Sectors:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 3, 1, 1);
lab = wl->cmpMissingSectors = gtk_label_new("0");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 3, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Image checksum:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 4, 1, 1);
lab = wl->cmpImageMd5Sum = gtk_label_new("0");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 4, 1, 1);
lab = wl->cmpImageResult = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 0, 2, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 4);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_widget_set_margin_top(lab, 2);
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 5, 2, 1);
/*** Image spiral */
frame = gtk_frame_new(_utf("Image state"));
gtk_table_attach(GTK_TABLE(table), frame, 1, 2, 0, 2, GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);
gtk_widget_set_vexpand(frame, TRUE);
gtk_grid_attach(GTK_GRID(grid), frame, 2, 1, 1, 2);
wl->cmpSpiral = GuiCreateSpiral(Closure->grid, Closure->background, 10, 5, VERIFY_IMAGE_SEGMENTS);
wl->cmpSpiral = GuiCreateSpiral(&transparent, 10, 5, VERIFY_IMAGE_SEGMENTS);
d_area = wl->cmpDrawingArea = gtk_drawing_area_new();
gtk_widget_set_size_request(d_area, wl->cmpSpiral->diameter+20, -1);
gtk_container_add(GTK_CONTAINER(frame), d_area);
g_signal_connect(G_OBJECT(d_area), "expose_event", G_CALLBACK(expose_cb), (gpointer)wl);
g_signal_connect(G_OBJECT(d_area), "draw", G_CALLBACK(draw_cb), (gpointer)wl);
/*** Ecc info */
frame = gtk_frame_new(_utf("Error correction file summary"));
gtk_table_attach(GTK_TABLE(table), frame, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);
gtk_widget_set_hexpand(frame, TRUE);
gtk_widget_set_vexpand(frame, TRUE);
gtk_grid_attach(GTK_GRID(grid), frame, 1, 2, 1, 1);
notebook = wl->cmpEccNotebook = gtk_notebook_new();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
@@ -272,78 +288,85 @@ void CreateRS01VerifyWindow(Method *self, GtkWidget *parent)
lab = wl->cmpEccEmptyMsg = gtk_label_new("");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), lab, ignore);
table2 = gtk_table_new(2, 9, FALSE);
grid2 = gtk_grid_new();
gtk_widget_set_margin_start(grid2, 5);
gtk_widget_set_margin_end(grid2, 5);
gtk_widget_set_margin_top(grid2, 2);
gtk_widget_set_margin_bottom(grid2, 2);
gtk_grid_set_column_spacing(GTK_GRID(grid2), 5);
gtk_grid_set_row_spacing(GTK_GRID(grid2), 4);
ignore = gtk_label_new("ecc info");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table2, ignore);
gtk_container_set_border_width(GTK_CONTAINER(table2), 5);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), grid2, ignore);
gtk_container_set_border_width(GTK_CONTAINER(grid2), 5);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Created by:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 1, 1, 1);
lab = wl->cmpEccCreatedBy = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 1, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Method:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 2, 1, 1);
lab = wl->cmpEccMethod = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 2, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Requires:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 3, 1, 1);
lab = wl->cmpEccRequires = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 3, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Medium sectors:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 4, 1, 1);
lab = wl->cmpEccMediumSectors = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 4, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Image checksum:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 5, 1, 1);
lab = wl->cmpEccImgMd5Sum = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 5, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Fingerprint:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 6, 1, 1);
lab = wl->cmpEccFingerprint = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 5, 6, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 6, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Ecc blocks:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 6, 7, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 7, 1, 1);
lab = wl->cmpEccBlocks = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 6, 7, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 7, 1, 1);
lab = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
GuiSetLabelText(lab, _("Ecc checksum:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 8, 1, 1);
lab = wl->cmpEccMd5Sum = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, 7, 8, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 2, 8, 1, 1);
lab = wl->cmpEccResult = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 0, 2, 8, 9, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 4);
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_widget_set_margin_top(lab, 2);
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 9, 2, 1);
}
#endif /* WITH_GUI_YES */

View File

@@ -32,7 +32,7 @@
*** Forward declarations
***/
static void redraw_curve(RS01Widgets*);
static void redraw_curve(cairo_t *cr, RS01Widgets*);
static void update_geometry(RS01Widgets*);
/* Protected widget access */
@@ -107,55 +107,65 @@ static gboolean curve_button_cb(GtkWidget *wid, gpointer action)
void CreateRS01EWindow(Method *method, GtkWidget *parent)
{ RS01Widgets *wl = method->widgetList;
GtkWidget *sep,*wid,*pbar,*table,*hbox;
GtkWidget *sep,*wid,*pbar,*grid,*hbox;
wl->encHeadline = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->encHeadline), 0.0, 0.0);
gtk_misc_set_padding(GTK_MISC(wl->encHeadline), 5, 0);
gtk_label_set_xalign(GTK_LABEL(wl->encHeadline), 0.0);
gtk_widget_set_margin_start(wl->encHeadline, 5);
gtk_box_pack_start(GTK_BOX(parent), wl->encHeadline, FALSE, FALSE, 3);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
table = gtk_table_new(2, 2, FALSE);
gtk_box_pack_start(GTK_BOX(parent), table, FALSE, FALSE, 30);
grid = gtk_grid_new();
gtk_widget_set_margin_start(grid, 20);
gtk_widget_set_margin_end(grid, 20);
gtk_widget_set_margin_top(grid, 20);
gtk_widget_set_margin_bottom(grid, 20);
gtk_grid_set_column_spacing(GTK_GRID(grid), 40);
gtk_grid_set_row_spacing(GTK_GRID(grid), 40);
gtk_box_pack_start(GTK_BOX(parent), grid, FALSE, FALSE, 30);
wl->encLabel1 = wid = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(wid),
_utf("<b>1. Calculating image sector checksums:</b>"));
gtk_misc_set_alignment(GTK_MISC(wid), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), wid, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 20, 20);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_grid_attach(GTK_GRID(grid), wid, 1, 1, 1, 1);
pbar = wl->encPBar1 = gtk_progress_bar_new();
gtk_table_attach(GTK_TABLE(table), pbar, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 20, 20);
gtk_widget_set_valign(pbar, GTK_ALIGN_CENTER);
gtk_widget_set_hexpand(pbar, TRUE);
gtk_grid_attach(GTK_GRID(grid), pbar, 2, 1, 1, 1);
wl->encLabel2 = wid = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(wid),
_utf("<b>2. Creating error correction data:</b>"));
gtk_misc_set_alignment(GTK_MISC(wid), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), wid, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 20, 20);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_grid_attach(GTK_GRID(grid), wid, 1, 2, 1, 1);
pbar = wl->encPBar2 = gtk_progress_bar_new();
gtk_table_attach(GTK_TABLE(table), pbar, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 20, 20);
gtk_widget_set_valign(pbar, GTK_ALIGN_CENTER);
gtk_widget_set_hexpand(pbar, TRUE);
gtk_grid_attach(GTK_GRID(grid), pbar, 2, 2, 1, 1);
wl->encFootline = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->encFootline), 0.0, 0.5);
gtk_misc_set_padding(GTK_MISC(wl->encFootline), 20, 0);
gtk_label_set_xalign(GTK_LABEL(wl->encFootline), 0.0);
gtk_widget_set_margin_start(wl->encFootline, 20);
gtk_box_pack_start(GTK_BOX(parent), wl->encFootline, FALSE, FALSE, 3);
wl->encFootline2 = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->encFootline2), 0.0, 0.5);
gtk_misc_set_padding(GTK_MISC(wl->encFootline2), 20, 0);
gtk_label_set_xalign(GTK_LABEL(wl->encFootline2), 0.0);
gtk_widget_set_margin_start(wl->encFootline2, 20);
gtk_box_pack_start(GTK_BOX(parent), wl->encFootline2, FALSE, FALSE, 3);
hbox = gtk_hbox_new(FALSE, 0);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(parent), hbox, FALSE, FALSE, 0);
wid = gtk_label_new(NULL);
gtk_misc_set_padding(GTK_MISC(wid), 10, 0);
gtk_widget_set_margin_start(wid, 10);
gtk_box_pack_start(GTK_BOX(hbox), wid, FALSE, FALSE, 0);
wl->curveButton = gtk_button_new_with_label(_utf("Show reading speed curve"));
@@ -174,7 +184,7 @@ void CreateRS01EWindow(Method *method, GtkWidget *parent)
static gboolean set_max_idle_func(gpointer data)
{ RS01Widgets *wl = (RS01Widgets*)data;
redraw_curve(wl);
gtk_widget_queue_draw(wl->fixCurve->widget);
return FALSE;
}
@@ -218,47 +228,8 @@ void RS01UpdateFixResults(RS01Widgets *wl, gint64 corrected, gint64 uncorrected)
static gboolean curve_idle_func(gpointer data)
{ RS01Widgets *wl = (RS01Widgets*)data;
gint x0 = GuiCurveX(wl->fixCurve, (double)wl->lastPercent);
gint x1 = GuiCurveX(wl->fixCurve, (double)wl->percent);
gint y = GuiCurveY(wl->fixCurve, wl->fixCurve->ivalue[wl->percent]);
gint i;
gtk_widget_queue_draw(wl->fixCurve->widget);
/*** Mark unused ecc values */
for(i=wl->lastPercent+1; i<wl->percent; i++)
wl->fixCurve->ivalue[i] = wl->fixCurve->ivalue[wl->percent];
/*** Resize the Y axes if error values exceeds current maximum */
if(wl->fixCurve->ivalue[wl->percent] > wl->fixCurve->maxY)
{ wl->fixCurve->maxY = wl->fixCurve->ivalue[wl->percent];
wl->fixCurve->maxY = wl->fixCurve->maxY - (wl->fixCurve->maxY % 5) + 5;
update_geometry(wl);
gdk_window_clear(wl->fixCurve->widget->window);
redraw_curve(wl);
wl->lastPercent = wl->percent;
return FALSE;
}
/*** Draw the error value */
if(wl->fixCurve->ivalue[wl->percent] > 0)
{ gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->barColor);
gdk_draw_rectangle(wl->fixCurve->widget->window,
Closure->drawGC, TRUE,
x0, y, x0==x1 ? 1 : x1-x0, wl->fixCurve->bottomY-y);
}
wl->lastPercent = wl->percent;
/* Redraw the ecc capacity threshold line */
y = GuiCurveY(wl->fixCurve, wl->eccBytes);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->greenSector);
gdk_draw_line(wl->fixCurve->widget->window,
Closure->drawGC,
wl->fixCurve->leftX-6, y, wl->fixCurve->rightX+6, y);
return FALSE;
}
@@ -296,36 +267,34 @@ static void update_geometry(RS01Widgets *wl)
TRUE, TRUE, wl->fixCurve->leftX, GTK_PACK_START);
}
static void redraw_curve(RS01Widgets *wl)
static void redraw_curve(cairo_t *cr, RS01Widgets *wl)
{ int y;
/* Redraw the curve */
GuiRedrawAxes(wl->fixCurve);
GuiRedrawCurve(wl->fixCurve, wl->percent);
GuiRedrawAxes(cr, wl->fixCurve);
GuiRedrawCurve(cr, wl->fixCurve, wl->percent);
/* Ecc capacity threshold line */
y = GuiCurveY(wl->fixCurve, wl->eccBytes);
gdk_gc_set_rgb_fg_color(Closure->drawGC, Closure->greenSector);
gdk_draw_line(wl->fixCurve->widget->window,
Closure->drawGC,
wl->fixCurve->leftX-6, y, wl->fixCurve->rightX+6, y);
gdk_cairo_set_source_rgba(cr, Closure->greenSector);
cairo_set_line_width(cr, 1.0);
cairo_move_to(cr, wl->fixCurve->leftX-5.5, y+0.5);
cairo_line_to(cr, wl->fixCurve->rightX+5.5, y+0.5);
cairo_stroke(cr);
}
/*
* Expose callback
* Draw callback
*/
static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{ RS01Widgets *wl = (RS01Widgets*)data;
if(event->count) /* Exposure compression */
{ return TRUE;
}
static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ RS01Widgets *wl = (RS01Widgets*)data;
update_geometry(wl);
redraw_curve(wl);
redraw_curve(cr, wl);
return TRUE;
}
@@ -343,9 +312,7 @@ void ResetRS01FixWindow(Method *method)
RS01UpdateFixResults(wl, 0, 0);
if(wl->fixCurve && wl->fixCurve->widget)
{ gdk_window_clear(wl->fixCurve->widget->window);
redraw_curve(wl);
}
gtk_widget_queue_draw(wl->fixCurve->widget);
wl->percent = 0;
wl->lastPercent = 0;
@@ -360,45 +327,45 @@ void CreateRS01FWindow(Method *method, GtkWidget *parent)
GtkWidget *sep,*ignore,*d_area,*notebook,*hbox;
wl->fixHeadline = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->fixHeadline), 0.0, 0.0);
gtk_misc_set_padding(GTK_MISC(wl->fixHeadline), 5, 0);
gtk_label_set_xalign(GTK_LABEL(wl->fixHeadline), 0.0);
gtk_widget_set_margin_start(wl->fixHeadline, 5);
gtk_box_pack_start(GTK_BOX(parent), wl->fixHeadline, FALSE, FALSE, 3);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
sep = gtk_hseparator_new();
sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(parent), sep, FALSE, FALSE, 0);
d_area = wl->fixDrawingArea = gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(parent), d_area, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT (d_area), "expose_event", G_CALLBACK(expose_cb), (gpointer)wl);
g_signal_connect(G_OBJECT (d_area), "draw", G_CALLBACK(draw_cb), (gpointer)wl);
notebook = wl->fixNotebook = gtk_notebook_new();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
gtk_box_pack_end(GTK_BOX(parent), notebook, FALSE, FALSE, 0);
hbox = wl->fixFootlineBox = gtk_hbox_new(TRUE, 0);
hbox = wl->fixFootlineBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
wl->fixCorrected = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->fixCorrected), 0.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(wl->fixCorrected), 0.0);
gtk_box_pack_start(GTK_BOX(hbox), wl->fixCorrected, TRUE, TRUE, 0);
wl->fixProgress = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->fixProgress), 0.5, 0.0);
gtk_box_pack_start(GTK_BOX(hbox), wl->fixProgress, TRUE, TRUE, 0);
wl->fixUncorrected = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wl->fixUncorrected), 1.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(wl->fixUncorrected), 1.0);
gtk_box_pack_start(GTK_BOX(hbox), wl->fixUncorrected, TRUE, TRUE, 0);
ignore = gtk_label_new("progress_tab");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox, ignore);
wl->fixFootline = gtk_label_new("Footline");
gtk_misc_set_alignment(GTK_MISC(wl->fixFootline), 0.0, 0.5);
gtk_misc_set_padding(GTK_MISC(wl->fixFootline), 5, 0);
gtk_label_set_xalign(GTK_LABEL(wl->fixFootline), 0.0);
gtk_widget_set_margin_start(wl->fixFootline, 5);
ignore = gtk_label_new("footer_tab");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), wl->fixFootline, ignore);
@@ -660,7 +627,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
frame = gtk_frame_new(_utf("Redundancy for new error correction files"));
gtk_box_pack_start(GTK_BOX(parent), frame, FALSE, FALSE, 0);
vbox = gtk_vbox_new(FALSE, 10);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
@@ -670,7 +637,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
GuiRegisterPreferencesHelpWindow(lwoh);
for(i=0; i<2; i++)
{ GtkWidget *hbox = gtk_hbox_new(FALSE, 4);
{ GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
radio = gtk_radio_button_new(NULL);
g_signal_connect(G_OBJECT(radio), "toggled", G_CALLBACK(toggle_cb), method);
@@ -700,7 +667,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
GuiRegisterPreferencesHelpWindow(lwoh);
for(i=0; i<2; i++)
{ GtkWidget *hbox = gtk_hbox_new(FALSE, 4);
{ GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
radio = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(i?wl->radio1B:wl->radio1A));
g_signal_connect(G_OBJECT(radio), "toggled", G_CALLBACK(toggle_cb), method);
@@ -731,7 +698,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
GuiRegisterPreferencesHelpWindow(lwoh);
for(i=0; i<2; i++)
{ hbox = gtk_hbox_new(FALSE, 4);
{ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
radio = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(i?wl->radio1B:wl->radio1A));
g_signal_connect(G_OBJECT(radio), "toggled", G_CALLBACK(toggle_cb), method);
@@ -747,7 +714,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
}
scale = gtk_hscale_new_with_range(8,100,1);
scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 8, 100, 1);
gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_RIGHT);
gtk_range_set_increments(GTK_RANGE(scale), 1, 1);
gtk_range_set_value(GTK_RANGE(scale), 32);
@@ -779,7 +746,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
GuiRegisterPreferencesHelpWindow(lwoh);
for(i=0; i<2; i++)
{ hbox = gtk_hbox_new(FALSE, 4);
{ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
radio = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(i?wl->radio1B:wl->radio1A));
g_signal_connect(G_OBJECT(radio), "toggled", G_CALLBACK(toggle_cb), method);
@@ -873,7 +840,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
GuiLockLabelSize(lwoh->linkLabel, _utf("%d MiB of file cache"), 2222);
for(i=0; i<2; i++)
{ GtkWidget *hbox = gtk_hbox_new(FALSE, 4);
{ GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
int n_entries = sizeof(cache_size)/sizeof(int);
lab = gtk_label_new(_utf("Use"));
@@ -883,7 +850,7 @@ void CreateRS01PrefsPage(Method *method, GtkWidget *parent)
if(cache_size[index] > Closure->cacheMiB)
break;
scale = gtk_hscale_new_with_range(0,n_entries-1,1);
scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, n_entries-1, 1);
gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_RIGHT);
gtk_range_set_increments(GTK_RANGE(scale), 1, 1);
gtk_range_set_value(GTK_RANGE(scale), index > 0 ? index-1 : index);

Some files were not shown because too many files have changed in this diff Show More