Compare commits

...

105 Commits

Author SHA1 Message Date
Yujiang Wang
ec679e3762 Fix compilation on Arch Linux 2025-10-06 21:54:38 +02:00
Stéphane Lesimple
b20421e639 release v0.79.10-pl5 2025-05-11 22:54:26 +02:00
Stéphane Lesimple
627dcd111e chore: update locales 2025-05-11 22:54:26 +02:00
Stéphane Lesimple
4e9949bd38 fix: file open dialog crash (#126) 2025-05-11 13:26:03 +02:00
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
103 changed files with 10076 additions and 9961 deletions

View File

@@ -52,7 +52,7 @@ jobs:
- name: Build app
run: |
sudo apt-get update && sudo apt-get install -y libglib2.0-dev ghostscript man jq libgtk2.0-dev
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:

View File

@@ -1,6 +1,5 @@
#!/bin/bash
set -e
set -x
github_ref="$1"
@@ -22,30 +21,83 @@ fi
archive=dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$')-$suffix.zip
[ -n "$GITHUB_OUTPUT" ] && echo "archive=$archive" >> "$GITHUB_OUTPUT"
echo "appimage is <$archive>"
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)"

View File

@@ -10,7 +10,7 @@ else
suffix=""
fi
archive="dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$')$suffix.dmg"
archive="dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$')-macos$suffix.dmg"
[ -n "$GITHUB_OUTPUT" ] && echo "archive=$archive" >> "$GITHUB_OUTPUT"
echo "mac dmg is <$archive>"

View File

@@ -2,12 +2,15 @@ name: autobuild
on:
push:
branches:
- 'master'
- 'dev'
tags:
- "v*"
- 'v*'
jobs:
mac:
runs-on: macos-11
runs-on: macos-13
strategy:
matrix:
ui: [cli, gui]
@@ -16,8 +19,6 @@ jobs:
clionly: --with-gui=no
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: install prerequisites
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
@@ -26,13 +27,15 @@ jobs:
if: matrix.ui == 'gui'
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: brew install gtk+
run: brew install gtk+3
- name: configure
run: |
set +x
./configure ${{ matrix.clionly }} --with-werror
- name: make
run: make -j$(sysctl -n hw.ncpu || 2)
run: |
cat Makefile.config
make -j$(sysctl -n hw.ncpu || 2)
- name: check executability
run: ./dvdisaster --version
- name: check executable (GUI)
@@ -48,11 +51,44 @@ jobs:
- name: build dist
run: ./.github/workflows/make-mac-app.sh ${{ github.ref }}
id: dist
- name: Release
uses: softprops/action-gh-release@v1
- 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-latest
@@ -80,13 +116,11 @@ 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 mingw-w64-${{ matrix.arch }}-librsvg
- name: git config
run: git config --global core.autocrlf input
shell: bash
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: configure
run: ./configure ${{ matrix.clionly }}
- name: make
@@ -96,7 +130,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: if ./dvdisaster.exe --version | grep NOGUI; then exit 1; fi
@@ -111,18 +146,49 @@ jobs:
run: |
cd dist
dvdisaster.exe --version
- name: Release
uses: softprops/action-gh-release@v1
- 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@v4
with:
persist-credentials: false
- name: install prerequisites
run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man
- name: configure
@@ -137,51 +203,93 @@ jobs:
- name: build dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
id: dist
- name: Release
uses: softprops/action-gh-release@v1
- 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-latest
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- 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:/code -v /tmp/dist:/dist ubuntu:14.04 sleep 1800
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 'sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man libgtk2.0-dev gtk2-engines-pixbuf gtk2-engines pkg-config gnome-themes-standard fuse'
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 /code && ./configure --prefix=/usr'
run: docker exec uu sh -c 'cd /dvdisaster && ./configure --prefix=/usr'
- name: make in docker
run: docker exec uu sh -c 'make -C /code -j$(nproc) && make -C /code'
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 /code && touch documentation/user-manual/manual.pdf && make install DESTDIR=/dist'
- name: copy things to dist in docker
run: docker exec uu sh -c 'install -d /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)/* /dist/usr/lib/gtk-2.0'
- name: build appimage 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 /code && ./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'
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 /code/*.AppImage"
- name: apply glib workaround
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/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
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
@@ -192,8 +300,41 @@ jobs:
archive=$(ls -1 dvdisaster*.AppImage)
echo "archive=$archive" >> "$GITHUB_OUTPUT"
echo "appimage is <$archive>"
- name: Release
uses: softprops/action-gh-release@v1
- 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

@@ -26,13 +26,17 @@ jobs:
if: matrix.ui == 'gui'
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: brew install gtk+
run: brew install gtk+3
- name: configure
run: |
set +x
./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror
- name: make
run: make -j$(sysctl -n hw.ncpu || 2)
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)
@@ -81,7 +85,7 @@ 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
@@ -99,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: |
@@ -141,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,17 @@
# 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-5 11-05-2025 *UNOFFICIAL*
- fix: GUI fileopen dialog crash
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

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.

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)
@@ -114,21 +114,21 @@ ${BUILDTMP}/%.o : src/%.c
@echo "Compiling:" $?
@$(CC) $(COPTS) -c $? -o $@
${BUILDTMP}/inlined-icons.c.o : ${BUILDTMP}/inlined-icons.c
@echo "Compiling:" $?
@$(CC) $(COPTS) -c $? -o $@
${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 +141,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 +339,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,75 +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.
In 2021, upstream development briefly resumed [on a new website](https://dvdisaster.jcea.es/).
The new team successfully picked up some of the improvements of this unofficial version.
If/when upstream resumes development again, their changes will be merged back here when possible.
In any case, 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

34
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,7 +41,7 @@ fi
# Set the package name and version
PACKAGE dvdisaster 0.79.10
DEFINE_INT PATCHLEVEL 3
DEFINE_INT PATCHLEVEL 5
DEFINE_STRING HAVE_UNSTABLE_RELEASE 1
DEFINE_STRING HOMEPAGE "https://dvdisaster.jcea.es"
@@ -86,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
@@ -154,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
@@ -173,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,
@@ -190,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;
@@ -213,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)"
@@ -224,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" "$@"

View File

@@ -1,7 +1,7 @@
\documentclass[12pt,a4paper,twoside]{article}
\usepackage[utf8x]{inputenc} % Aktiviert Eingabe von unicode-Zeichensätzen
\usepackage{times} % Skalierbarer und lesbarer Zeichensatz
\usepackage{ucs} % Benötigt für Eingabe von unicode-Zeichensätzen
\usepackage[utf8x]{inputenc} % Aktiviert Eingabe von unicode-Zeichensätzen
\usepackage{epsfig} % Makros zum Einfügen von Grafiken
\usepackage{anysize} % Makros zum Einstellen der Seitenränder
%\usepackage{makeidx} % Makros zum Erstellen des Indexes

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

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

@@ -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
@@ -1477,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"
@@ -1496,14 +1496,14 @@ 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
@@ -1511,18 +1511,18 @@ function REQUIRE_GTK2()
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.
@@ -1533,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
@@ -1568,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>
@@ -97,12 +89,12 @@ int isWithinAppBundle(const char *filePath) {
* 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);
@@ -114,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);
@@ -171,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;
}
/***
@@ -213,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 */
@@ -288,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; }
@@ -391,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);
@@ -421,6 +382,15 @@ 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. */
@@ -477,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"));
@@ -521,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);
@@ -610,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 */
@@ -635,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
@@ -643,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-"));
}
@@ -675,7 +649,41 @@ 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);
@@ -700,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);
@@ -711,46 +716,6 @@ void FreeClosure()
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->eccName);
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->eccEntry), Closure->eccName);
gtk_editable_set_position(GTK_EDITABLE(Closure->eccEntry), -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);
}
/*

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);
if(redraw)
{ erase_to = Closure->readAdaptiveSpiral->mx - Closure->readAdaptiveSpiral->diameter/2;
pw = erase_to-x;
pixmap = gdk_pixmap_new(d, pw, h, -1);
pixmap_width = pw;
pixmap_height = h;
}
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)
static gboolean draw_curve_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{
update_geometry();
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);
if(event->count) /* Exposure compression */
return TRUE;
/* Override spiral center */
Closure->readLinearSpiral->mx = a.width - 15 - Closure->readLinearSpiral->diameter / 2;
if(Closure->crcBuf && Closure->crcBuf->crcCached)
{ int w,h;
update_geometry();
redraw_curve();
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)
static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ RS01Widgets *wl = (RS01Widgets*)data;
if(event->count) /* Exposure compression */
{ return TRUE;
}
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);

View File

@@ -678,10 +678,11 @@ RS02Layout *RS02LayoutFromImage(Image *image)
if(expected_size == lay2->dataSectors+lay2->eccSectors)
{ Verbose("--> confirmed layout variant 2\n");
memcpy(lay, lay2, sizeof(RS02Layout));
g_free(lay2);
}
else
Verbose("--> FAIL: did not map to expected variants!\n");
g_free(lay2);
}
goto finish;

View File

@@ -44,21 +44,21 @@ static void no_rs02_cb(GtkWidget *widget, gpointer data)
}
static void insert_buttons(GtkDialog *dialog)
{ GtkWidget *check,*align;
{ GtkWidget *check,*hbox;
gtk_dialog_add_buttons(dialog,
_utf("Skip RS02 test"), 1,
_utf("Continue searching"), 0, NULL);
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("Disable RS02 initialization in the preferences"));
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(no_rs02_cb), NULL);
gtk_widget_show(align);
gtk_widget_show(hbox);
gtk_widget_show(check);
}
#endif /* WITH_GUI_YES */

View File

@@ -58,8 +58,9 @@ void ResetRS02VerifyWindow(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);
}
/***
@@ -72,7 +73,7 @@ void ResetRS02VerifyWindow(Method *self)
typedef struct _spiral_idle_info
{ Spiral *cmpSpiral;
GdkColor *segColor;
GdkRGBA *segColor;
int from, to;
} spiral_idle_info;
@@ -81,7 +82,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;
@@ -89,12 +90,13 @@ static gboolean spiral_idle_func(gpointer data)
static void add_verify_values(Method *method, int percent,
gint64 newMissing, gint64 newCrcErrors)
{ RS02Widgets *wl = (RS02Widgets*)method->widgetList;
spiral_idle_info *sii = g_malloc(sizeof(spiral_idle_info));
{
if(percent < 0 || percent > VERIFY_IMAGE_SEGMENTS)
return;
RS02Widgets *wl = (RS02Widgets*)method->widgetList;
spiral_idle_info *sii = g_malloc(sizeof(spiral_idle_info));
sii->cmpSpiral = wl->cmpSpiral;
sii->segColor = Closure->greenSector;
@@ -113,28 +115,29 @@ static void add_verify_values(Method *method, int percent,
* Redraw whole spiral
*/
static void redraw_spiral(RS02Widgets *wl)
static void redraw_spiral(cairo_t *cr, RS02Widgets *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)
{ RS02Widgets *wl = (RS02Widgets*)data;
GtkAllocation *a = &widget->allocation;
GtkAllocation a = {0};
gtk_widget_get_allocation(widget, &a);
int w,h,size;
/* Finish spiral initialization */
@@ -147,11 +150,10 @@ 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;
wl->cmpSpiral->mx = a.width / 2;
wl->cmpSpiral->my = (wl->cmpSpiral->diameter + a.height - size)/2;
if(!event->count) /* Exposure compression */
redraw_spiral(wl); /* Redraw the spiral */
redraw_spiral(cr, wl); /* Redraw the spiral */
return TRUE;
}
@@ -162,100 +164,116 @@ static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer dat
void CreateRS02VerifyWindow(Method *self, GtkWidget *parent)
{ RS02Widgets *wl = (RS02Widgets*)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);
table2 = gtk_table_new(2, 7, FALSE);
ignore = gtk_label_new("image info");
gtk_container_set_border_width(GTK_CONTAINER(table2), 5);
gtk_container_add(GTK_CONTAINER(frame), table2);
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);
gtk_container_set_border_width(GTK_CONTAINER(grid2), 5);
gtk_container_add(GTK_CONTAINER(frame), grid2);
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, _("Data checksum:"));
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->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, 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, _("Ecc headers:"));
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->cmpEccHeaders = gtk_label_new(".");
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, _("Data section:"));
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->cmpDataSection = gtk_label_new(".");
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, _("Crc section:"));
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->cmpCrcSection = gtk_label_new(".");
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, 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 section:"));
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->cmpEccSection= gtk_label_new(".");
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 = 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, 6, 7, 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 data info */
frame = gtk_frame_new(_utf("Error correction data"));
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);
@@ -266,71 +284,77 @@ void CreateRS02VerifyWindow(Method *self, GtkWidget *parent)
lab = gtk_label_new("");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), lab, ignore);
table2 = gtk_table_new(2, 8, 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 = wl->cmpEcc1Name = 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, _("Data 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->cmpEcc1Msg = 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 = wl->cmpEcc2Name = 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, _("CRC checksum:"));
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->cmpEcc2Msg = 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 = wl->cmpEcc3Name = 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, 6, 7, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 7, 1, 1);
lab = wl->cmpEcc3Msg = 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 = 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, 7, 8, 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, 8, 2, 1);
}
#endif /* WITH_GUI_YES */

View File

@@ -34,7 +34,7 @@ extern gint64 CurrentMediumSize(int); /* from scsi-layer.h */
*** Forward declarations
***/
static void redraw_curve(RS02Widgets*);
static void redraw_curve(cairo_t *cr, RS02Widgets*);
static void update_geometry(RS02Widgets*);
/***
@@ -55,48 +55,58 @@ void ResetRS02EncWindow(Method *method)
}
void CreateRS02EncWindow(Method *method, GtkWidget *parent)
{ GtkWidget *wid,*table,*pbar,*sep;
{ GtkWidget *wid,*grid,*pbar,*sep;
RS02Widgets *wl = method->widgetList;
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. Preparing image:</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);
}
@@ -111,7 +121,7 @@ void CreateRS02EncWindow(Method *method, GtkWidget *parent)
static gboolean set_max_idle_func(gpointer data)
{ RS02Widgets *wl = (RS02Widgets*)data;
redraw_curve(wl);
gtk_widget_queue_draw(wl->fixCurve->widget);
return FALSE;
}
@@ -158,47 +168,8 @@ void RS02UpdateFixResults(RS02Widgets *wl, gint64 corrected, gint64 uncorrected)
static gboolean curve_idle_func(gpointer data)
{ RS02Widgets *wl = (RS02Widgets*)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;
}
@@ -236,35 +207,34 @@ static void update_geometry(RS02Widgets *wl)
TRUE, TRUE, wl->fixCurve->leftX, GTK_PACK_START);
}
static void redraw_curve(RS02Widgets *wl)
static void redraw_curve(cairo_t *cr, RS02Widgets *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)
static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ RS02Widgets *wl = (RS02Widgets*)data;
if(event->count) /* Exposure compression */
return TRUE;
update_geometry(wl);
redraw_curve(wl);
redraw_curve(cr, wl);
return TRUE;
}
@@ -278,9 +248,7 @@ void ResetRS02FixWindow(Method *method)
RS02UpdateFixResults(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;
@@ -301,45 +269,45 @@ void CreateRS02FixWindow(Method *method, GtkWidget *parent)
else wl = method->widgetList;
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);
@@ -536,8 +504,16 @@ static void query_cb(GtkWidget *widget, gpointer data)
char value[40];
gint64 size;
size = CurrentMediumSize(TRUE);
g_snprintf(value, 40, "%lld", (long long int)size);
if(widget == wl->cdButtonA || widget == wl->cdButtonB ||
widget == wl->dvdButton1A || widget == wl->dvdButton1B ||
widget == wl->dvdButton2A || widget == wl->dvdButton2B ||
widget == wl->bdButton1A || widget == wl->bdButton1B ||
widget == wl->bdButton2A || widget == wl->bdButton2B ||
widget == wl->bdButton3A || widget == wl->bdButton3B ||
widget == wl->bdButton4A || widget == wl->bdButton4B)
{ size = CurrentMediumSize(TRUE);
g_snprintf(value, 40, "%lld", (long long int)size);
}
if(widget == wl->cdButtonA || widget == wl->cdButtonB)
{ gtk_entry_set_text(GTK_ENTRY(wl->cdEntryA), value);
@@ -758,7 +734,7 @@ void ReadRS02Preferences(Method *method)
void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
{ RS02Widgets *wl = (RS02Widgets*)method->widgetList;
GtkWidget *frame, *hbox, *vbox, *vbox2, *tinybox, *lab, *scale, *table;
GtkWidget *frame, *hbox, *vbox, *vbox2, *tinybox, *lab, *scale, *grid;
GtkWidget *radio, *icon;
LabelWithOnlineHelp *lwoh;
unsigned int index;
@@ -770,11 +746,11 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
frame = gtk_frame_new(_utf("Maximum image size"));
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);
hbox = gtk_hbox_new(FALSE, 0);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
/* Drive capacity table header */
@@ -783,7 +759,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
_("Use smallest possible size from following table (in sectors):"));
GuiRegisterPreferencesHelpWindow(lwoh);
vbox2 = gtk_vbox_new(FALSE, 0);
vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0);
for(i=0; i<2; i++)
@@ -796,7 +772,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0);
}
else
{ GtkWidget *hbox = gtk_hbox_new(FALSE, 4);
{ GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
wl->radio1B = radio;
gtk_box_pack_start(GTK_BOX(hbox), radio, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -816,42 +792,46 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
"one/two layered DVD and BD are given in the table. You can edit "
"these sizes according to your needs."));
table = gtk_table_new(5, 6, FALSE);
gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 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_box_pack_start(GTK_BOX(hbox), grid, FALSE, FALSE, 0);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 5, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 1, 4, 1);
/* CD capacity table row */
lwoh = GuiCreateLabelWithOnlineHelp(_("CD-R / CD-RW:"), _("CD-R / CD-RW:"));
GuiRegisterPreferencesHelpWindow(lwoh);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 2, 1, 1);
wl->cdEntryA = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->cdEntryA), 9);
g_signal_connect(G_OBJECT(wl->cdEntryA), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->cdEntryA, 1, 2, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
wl->cdEntryA = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->cdEntryA), 9);
g_signal_connect(G_OBJECT(wl->cdEntryA), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_grid_attach(GTK_GRID(grid), wl->cdEntryA, 2, 2, 1, 1);
wl->cdButtonA = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->cdButtonA), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->cdButtonA, 2, 3, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
wl->cdButtonA = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->cdButtonA), "clicked", G_CALLBACK(query_cb), wl);
gtk_grid_attach(GTK_GRID(grid), wl->cdButtonA, 3, 2, 1, 1);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->cdUndoButtonA = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->cdUndoButtonA), icon);
g_signal_connect(G_OBJECT(wl->cdUndoButtonA), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->cdUndoButtonA, 3, 4, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->cdUndoButtonA = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->cdUndoButtonA), icon);
g_signal_connect(G_OBJECT(wl->cdUndoButtonA), "clicked", G_CALLBACK(query_cb), wl);
gtk_grid_attach(GTK_GRID(grid), wl->cdUndoButtonA, 4, 2, 1, 1);
hbox = gtk_hbox_new(FALSE, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -864,7 +844,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
g_signal_connect(G_OBJECT(wl->cdButtonB), "clicked", G_CALLBACK(query_cb), wl);
gtk_box_pack_start(GTK_BOX(hbox), wl->cdButtonB, FALSE, FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->cdUndoButtonB = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->cdUndoButtonB), icon);
g_signal_connect(G_OBJECT(wl->cdUndoButtonB), "clicked", G_CALLBACK(query_cb), wl);
@@ -894,28 +874,27 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
lwoh = GuiCreateLabelWithOnlineHelp(_("DVD 1 layer:"), _("DVD 1 layer:"));
GuiRegisterPreferencesHelpWindow(lwoh);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 1, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 3, 1, 1);
wl->dvdEntry1A = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->dvdEntry1A), 9);
g_signal_connect(G_OBJECT(wl->dvdEntry1A), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->dvdEntry1A, 1, 2, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->dvdEntry1A, 2, 3, 1, 1);
wl->dvdButton1A = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->dvdButton1A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->dvdButton1A, 2, 3, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->dvdButton1A, 3, 3, 1, 1);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->dvdUndoButton1A = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->dvdUndoButton1A), icon);
g_signal_connect(G_OBJECT(wl->dvdUndoButton1A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->dvdUndoButton1A, 3, 4, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->dvdUndoButton1A, 4, 3, 1, 1);
hbox = gtk_hbox_new(FALSE, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -928,7 +907,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
g_signal_connect(G_OBJECT(wl->dvdButton1B), "clicked", G_CALLBACK(query_cb), wl);
gtk_box_pack_start(GTK_BOX(hbox), wl->dvdButton1B, FALSE, FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->dvdUndoButton1B = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->dvdUndoButton1B), icon);
g_signal_connect(G_OBJECT(wl->dvdUndoButton1B), "clicked", G_CALLBACK(query_cb), wl);
@@ -958,28 +937,27 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
lwoh = GuiCreateLabelWithOnlineHelp(_("DVD 2 layers:"), _("DVD 2 layers:"));
GuiRegisterPreferencesHelpWindow(lwoh);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 1, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 4, 1, 1);
wl->dvdEntry2A = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->dvdEntry2A), 9);
g_signal_connect(G_OBJECT(wl->dvdEntry2A), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->dvdEntry2A, 1, 2, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->dvdEntry2A, 2, 4, 1, 1);
wl->dvdButton2A = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->dvdButton2A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->dvdButton2A, 2, 3, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->dvdButton2A, 3, 4, 1, 1);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->dvdUndoButton2A = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->dvdUndoButton2A), icon);
g_signal_connect(G_OBJECT(wl->dvdUndoButton2A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->dvdUndoButton2A, 3, 4, 3, 4, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->dvdUndoButton2A, 4, 4, 1, 1);
hbox = gtk_hbox_new(FALSE, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -992,7 +970,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
g_signal_connect(G_OBJECT(wl->dvdButton2B), "clicked", G_CALLBACK(query_cb), wl);
gtk_box_pack_start(GTK_BOX(hbox), wl->dvdButton2B, FALSE, FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->dvdUndoButton2B = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->dvdUndoButton2B), icon);
g_signal_connect(G_OBJECT(wl->dvdUndoButton2B), "clicked", G_CALLBACK(query_cb), wl);
@@ -1022,28 +1000,27 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
lwoh = GuiCreateLabelWithOnlineHelp(_("BD 1 layer:"), _("BD 1 layer:"));
GuiRegisterPreferencesHelpWindow(lwoh);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 1, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 5, 1, 1);
wl->bdEntry1A = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->bdEntry1A), 9);
g_signal_connect(G_OBJECT(wl->bdEntry1A), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdEntry1A, 1, 2, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdEntry1A, 2, 5, 1, 1);
wl->bdButton1A = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->bdButton1A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdButton1A, 2, 3, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdButton1A, 3, 5, 1, 1);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton1A = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton1A), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton1A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdUndoButton1A, 3, 4, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdUndoButton1A, 4, 5, 1, 1);
hbox = gtk_hbox_new(FALSE, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -1056,7 +1033,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
g_signal_connect(G_OBJECT(wl->bdButton1B), "clicked", G_CALLBACK(query_cb), wl);
gtk_box_pack_start(GTK_BOX(hbox), wl->bdButton1B, FALSE, FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton1B = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton1B), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton1B), "clicked", G_CALLBACK(query_cb), wl);
@@ -1085,28 +1062,27 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
lwoh = GuiCreateLabelWithOnlineHelp(_("BD 2 layers:"), _("BD 2 layers:"));
GuiRegisterPreferencesHelpWindow(lwoh);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 1, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 6, 1, 1);
wl->bdEntry2A = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->bdEntry2A), 9);
g_signal_connect(G_OBJECT(wl->bdEntry2A), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdEntry2A, 1, 2, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdEntry2A, 2, 6, 1, 1);
wl->bdButton2A = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->bdButton2A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdButton2A, 2, 3, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdButton2A, 3, 6, 1, 1);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton2A = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton2A), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton2A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdUndoButton2A, 3, 4, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdUndoButton2A, 4, 6, 1, 1);
hbox = gtk_hbox_new(FALSE, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -1119,7 +1095,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
g_signal_connect(G_OBJECT(wl->bdButton2B), "clicked", G_CALLBACK(query_cb), wl);
gtk_box_pack_start(GTK_BOX(hbox), wl->bdButton2B, FALSE, FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton2B = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton2B), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton2B), "clicked", G_CALLBACK(query_cb), wl);
@@ -1148,28 +1124,27 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
lwoh = GuiCreateLabelWithOnlineHelp(_("BDXL 3 layers:"), _("BDXL 3 layers:"));
GuiRegisterPreferencesHelpWindow(lwoh);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 1, 6, 7, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 7, 1, 1);
wl->bdEntry3A = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->bdEntry3A), 9);
g_signal_connect(G_OBJECT(wl->bdEntry3A), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdEntry3A, 1, 2, 6, 7, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdEntry3A, 2, 7, 1, 1);
wl->bdButton3A = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->bdButton3A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdButton3A, 2, 3, 6, 7, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdButton3A, 3, 7, 1, 1);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton3A = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton3A), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton3A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdUndoButton3A, 3, 4, 6, 7, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdUndoButton3A, 4, 7, 1, 1);
hbox = gtk_hbox_new(FALSE, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -1182,7 +1157,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
g_signal_connect(G_OBJECT(wl->bdButton3B), "clicked", G_CALLBACK(query_cb), wl);
gtk_box_pack_start(GTK_BOX(hbox), wl->bdButton3B, FALSE, FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton3B = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton3B), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton3B), "clicked", G_CALLBACK(query_cb), wl);
@@ -1213,28 +1188,27 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
lwoh = GuiCreateLabelWithOnlineHelp(_("BDXL 4 layers:"), _("BDXL 4 layers:"));
GuiRegisterPreferencesHelpWindow(lwoh);
gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0);
tinybox = gtk_hbox_new(FALSE, 0);
tinybox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->linkBox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tinybox), lwoh->tooltip, FALSE, FALSE, 0);
gtk_table_attach(GTK_TABLE(table), tinybox, 0, 1, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), tinybox, 1, 8, 1, 1);
wl->bdEntry4A = gtk_entry_new();
gtk_entry_set_width_chars(GTK_ENTRY(wl->bdEntry4A), 9);
g_signal_connect(G_OBJECT(wl->bdEntry4A), "activate", G_CALLBACK(entry_tracker_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdEntry4A, 1, 2, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdEntry4A, 2, 8, 1, 1);
wl->bdButton4A = gtk_button_new_with_label(_utf("query medium"));
g_signal_connect(G_OBJECT(wl->bdButton4A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdButton4A, 2, 3, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdButton4A, 3, 8, 1, 1);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton4A = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton4A), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton4A), "clicked", G_CALLBACK(query_cb), wl);
gtk_table_attach(GTK_TABLE(table), wl->bdUndoButton4A, 3, 4, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5);
gtk_grid_attach(GTK_GRID(grid), wl->bdUndoButton4A, 4, 8, 1, 1);
hbox = gtk_hbox_new(FALSE, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
@@ -1247,7 +1221,7 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent)
g_signal_connect(G_OBJECT(wl->bdButton4B), "clicked", G_CALLBACK(query_cb), wl);
gtk_box_pack_start(GTK_BOX(hbox), wl->bdButton4B, FALSE, FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR);
icon = gtk_image_new_from_icon_name("edit-undo", GTK_ICON_SIZE_SMALL_TOOLBAR);
wl->bdUndoButton4B = gtk_button_new();
gtk_container_add(GTK_CONTAINER(wl->bdUndoButton4B), icon);
g_signal_connect(G_OBJECT(wl->bdUndoButton4B), "clicked", G_CALLBACK(query_cb), wl);
@@ -1300,7 +1274,7 @@ void CreateRS02PrefsPage(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);
GtkWidget *entry;
if(!i) wl->radio2A = radio = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(wl->radio1A));
@@ -1376,7 +1350,7 @@ void CreateRS02PrefsPage(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"));
@@ -1386,7 +1360,7 @@ void CreateRS02PrefsPage(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);

View File

@@ -409,6 +409,7 @@ RS03Layout *CalcRS03Layout(Image *image, int target)
{ Verbose("CalcRS03Layout(): removed cached layout from RS03, wrong target\n");
g_free(image->cachedLayout);
}
else
{ Verbose("CalcRS03Layout(): returning cached layout (%s)\n",
((RS03Layout*)image->cachedLayout)->target == ECC_FILE ? "file" : "augmented");
memcpy(lay, image->cachedLayout, sizeof(RS03Layout));

View File

@@ -734,33 +734,42 @@ void RS03Fix(Image *image)
if(num1 != 0)
{ int location = loc[j];
if(erasure_map[location] != 1) /* erasure came from CRC error */
{ int old = fc->imgBlock[location][offset];
int new = old ^ gf_alpha_to[mod_fieldmax(gf_index_of[num1] + gf_index_of[num2] + GF_FIELDMAX - gf_index_of[den])];
char *msg, *type;
gint64 sector;
if((Closure->debugMode && Closure->verbose) || Closure->regtestMode)
{ if (erasure_map[location] != 1) /* erasure came from CRC error */
{ int old = fc->imgBlock[location][offset];
int new = old ^ gf_alpha_to[mod_fieldmax(gf_index_of[num1] + gf_index_of[num2] + GF_FIELDMAX - gf_index_of[den])];
char *msg, *type;
gint64 sector;
if(erasure_map[location] == 3) /* erasure came from CRC error */
{ msg = _("-> CRC-predicted error in sector %lld%s at byte %4d (value %02x '%c', expected %02x '%c')\n");
}
else
{ msg = _("-> Non-predicted error in sector %lld%s at byte %4d (value %02x '%c', expected %02x '%c')\n");
if(erasure_map[location] == 0) /* remember error location */
{ erasure_map[location] = 7;
error_count++;
if(erasure_map[location] == 3) /* erasure came from CRC error */
{ msg = _("-> CRC-predicted error in sector %lld%s at byte %4d (value %02x '%c', expected %02x '%c')\n");
}
else
{ msg = _("-> Non-predicted error in sector %lld%s at byte %4d (value %02x '%c', expected %02x '%c')\n");
if(erasure_map[location] == 0) /* remember error location */
{ erasure_map[location] = 7;
error_count++;
}
}
}
sector = RS03SectorIndex(lay, location, s);
if(eh->methodFlags[0] & MFLAG_ECC_FILE && location >= ndata-1)
type="(ecc)";
else
type="";
sector = RS03SectorIndex(lay, location, s);
if(eh->methodFlags[0] & MFLAG_ECC_FILE && location >= ndata-1)
type="(ecc)";
else
type="";
PrintCLI(msg,
sector, type, bi,
old, canprint(old) ? old : '.',
new, canprint(new) ? new : '.');
PrintCLI(msg,
sector, type, bi,
old, canprint(old) ? old : '.',
new, canprint(new) ? new : '.');
}
}
else /* in non-debug mode, apply the only non-printf-preparing code of the above block */
{
if (erasure_map[location] == 0)
{ erasure_map[location] = 7;
error_count++;
}
}
fc->imgBlock[location][offset] ^= gf_alpha_to[mod_fieldmax(gf_index_of[num1] + gf_index_of[num2] + GF_FIELDMAX - gf_index_of[den])];

View File

@@ -489,7 +489,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
frame = gtk_frame_new(_utf("Error correction data storage"));
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);
@@ -498,7 +498,7 @@ void CreateRS03PrefsPage(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);
GtkWidget *radio1, *radio2;
gtk_box_pack_start(GTK_BOX(hbox), i ? lwoh->normalLabel : lwoh->linkBox, FALSE, FALSE, 0);
@@ -577,7 +577,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
/* real entry for error correction files */
vbox = gtk_vbox_new(FALSE, 10);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
gtk_notebook_append_page(GTK_NOTEBOOK(wl->redundancyNotebook), vbox,
gtk_label_new(""));
@@ -588,7 +588,7 @@ void CreateRS03PrefsPage(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);
@@ -619,7 +619,7 @@ void CreateRS03PrefsPage(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);
@@ -649,7 +649,7 @@ void CreateRS03PrefsPage(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);
@@ -665,7 +665,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0);
}
scale = gtk_hscale_new_with_range(8,170,1);
scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 8, 170, 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);
@@ -697,7 +697,7 @@ void CreateRS03PrefsPage(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);
@@ -783,7 +783,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
frame = gtk_frame_new(_utf("I/O parameters"));
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);
@@ -797,7 +797,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
GuiLockLabelSize(lwoh->linkLabel, _utf("%d sectors"), 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(prefetch_size)/sizeof(int);
lab = gtk_label_new(_utf("Preload"));
@@ -807,7 +807,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
if(prefetch_size[index] > Closure->prefetchSectors)
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);
@@ -845,7 +845,7 @@ void CreateRS03PrefsPage(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);
GtkWidget *radio1, *radio2;
gtk_box_pack_start(GTK_BOX(hbox), i ? lwoh->normalLabel : lwoh->linkBox, FALSE, FALSE, 0);
@@ -913,7 +913,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
GuiLockLabelSize(lwoh->linkLabel, _utf("%d threads"), 22);
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(threads_count)/sizeof(int);
lab = gtk_label_new(_utf("Use"));
@@ -923,7 +923,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
if(threads_count[index] > Closure->codecThreads)
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);
@@ -963,7 +963,7 @@ void CreateRS03PrefsPage(Method *method, GtkWidget *parent)
frame = gtk_frame_new(_utf("Encoding algorithm"));
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);
@@ -972,7 +972,7 @@ void CreateRS03PrefsPage(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);
GtkWidget *radio1, *radio2, *radio3=NULL, *radio4;
gtk_box_pack_start(GTK_BOX(hbox), i ? lwoh->normalLabel : lwoh->linkBox, FALSE, FALSE, 0);

View File

@@ -444,16 +444,21 @@ int RS03RecognizeImage(Image *image)
Verbose("Warning: image size set to %" PRId64 " for debugging!\n", Closure->mediumSize);
}
else
{ if(image_sectors < CDR_SIZE) layer_size = CDR_SIZE/GF_FIELDMAX;
{
const guint64 bd_sl_sz = (Closure->noBdrDefectManagement ? BD_SL_SIZE_NODM : BD_SL_SIZE);
const guint64 bd_dl_sz = (Closure->noBdrDefectManagement ? BD_DL_SIZE_NODM : BD_DL_SIZE);
const guint64 bd_tl_sz = (Closure->noBdrDefectManagement ? BDXL_TL_SIZE_NODM : BDXL_TL_SIZE);
const guint64 bd_ql_sz = (Closure->noBdrDefectManagement ? BDXL_QL_SIZE_NODM : BDXL_QL_SIZE);
if(image_sectors < CDR_SIZE) layer_size = CDR_SIZE/GF_FIELDMAX;
else if(image_sectors < DVD_SL_SIZE) layer_size = DVD_SL_SIZE/GF_FIELDMAX;
else if(image_sectors < DVD_DL_SIZE) layer_size = DVD_DL_SIZE/GF_FIELDMAX;
else if(image_sectors < BD_SL_SIZE)
layer_size = (Closure->noBdrDefectManagement ? BD_SL_SIZE_NODM : BD_SL_SIZE)/GF_FIELDMAX;
else if(image_sectors < BD_DL_SIZE)
layer_size = (Closure->noBdrDefectManagement ? BD_DL_SIZE_NODM : BD_DL_SIZE)/GF_FIELDMAX;
else if(image_sectors < BDXL_TL_SIZE)
layer_size = (Closure->noBdrDefectManagement ? BDXL_TL_SIZE_NODM : BDXL_TL_SIZE)/GF_FIELDMAX;
else layer_size = (Closure->noBdrDefectManagement ? BDXL_QL_SIZE_NODM : BDXL_QL_SIZE)/GF_FIELDMAX;
else if(image_sectors < bd_sl_sz)
layer_size = bd_sl_sz/GF_FIELDMAX;
else if(image_sectors < bd_dl_sz)
layer_size = bd_dl_sz/GF_FIELDMAX;
else if(image_sectors < bd_tl_sz)
layer_size = bd_tl_sz/GF_FIELDMAX;
else layer_size = bd_ql_sz/GF_FIELDMAX;
}
Verbose(".. trying layer size %" PRId64 "\n", layer_size);

View File

@@ -68,8 +68,9 @@ void ResetRS03VerifyWindow(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);
}
/***
@@ -82,7 +83,7 @@ void ResetRS03VerifyWindow(Method *self)
typedef struct _spiral_idle_info
{ Spiral *cmpSpiral;
GdkColor *segColor;
GdkRGBA *segColor;
int from, to;
} spiral_idle_info;
@@ -91,7 +92,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;
@@ -99,12 +100,13 @@ static gboolean spiral_idle_func(gpointer data)
static void add_verify_values(Method *method, int percent,
gint64 newMissing, gint64 newCrcErrors)
{ RS03Widgets *wl = (RS03Widgets*)method->widgetList;
spiral_idle_info *sii = g_malloc(sizeof(spiral_idle_info));
{
if(percent < 0 || percent > VERIFY_IMAGE_SEGMENTS)
return;
RS03Widgets *wl = (RS03Widgets*)method->widgetList;
spiral_idle_info *sii = g_malloc(sizeof(spiral_idle_info));
sii->cmpSpiral = wl->cmpSpiral;
sii->segColor = Closure->greenSector;
@@ -123,28 +125,29 @@ static void add_verify_values(Method *method, int percent,
* Redraw whole spiral
*/
static void redraw_spiral(RS03Widgets *wl)
static void redraw_spiral(cairo_t *cr, RS03Widgets *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)
{ RS03Widgets *wl = (RS03Widgets*)data;
GtkAllocation *a = &widget->allocation;
GtkAllocation a = {0};
gtk_widget_get_allocation(widget, &a);
int w,h,size;
/* Finish spiral initialization */
@@ -157,11 +160,10 @@ 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;
wl->cmpSpiral->mx = a.width / 2;
wl->cmpSpiral->my = (wl->cmpSpiral->diameter + a.height - size)/2;
if(!event->count) /* Exposure compression */
redraw_spiral(wl); /* Redraw the spiral */
redraw_spiral(cr, wl); /* Redraw the spiral */
return TRUE;
}
@@ -172,109 +174,125 @@ static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer dat
void CreateRS03VerifyWindow(Method *self, GtkWidget *parent)
{ RS03Widgets *wl = (RS03Widgets*)self->widgetList;
GtkWidget *sep,*notebook,*ignore,*table,*table2,*lab,*frame,*d_area;
GtkWidget *sep,*notebook,*grid,*grid2,*ignore,*lab,*frame,*d_area;
int y1,y2;
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);
/*** Ecc data info */
frame = gtk_frame_new(_utf("Error correction properties"));
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);
table2 = gtk_table_new(2, 7, FALSE);
ignore = gtk_label_new("ecc info");
gtk_container_set_border_width(GTK_CONTAINER(table2), 5);
gtk_container_add(GTK_CONTAINER(frame), table2);
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);
gtk_container_set_border_width(GTK_CONTAINER(grid2), 5);
gtk_container_add(GTK_CONTAINER(frame), grid2);
y1=0; y2=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, _("Type:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 1, 1, 1);
lab = wl->cmpEccType = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
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, y1, y2, 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, y1, y2, 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);
y1++; y2++;
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, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 3, 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, y1, y2, 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);
y1++; y2++;
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, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 4, 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, y1, y2, 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);
y1++; y2++;
lab = wl->cmpEccDataCrc = 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, _("Data checksum:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 5, 1, 1);
lab = wl->cmpEccDataCrcVal = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
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, y1, y2, 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, y1, y2, 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);
y1++; y2++;
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, y1, y2, 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, 7, 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);
/*** Image info */
frame = gtk_frame_new(_utf("Data integrity"));
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->cmpImageNotebook = gtk_notebook_new();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
@@ -285,85 +303,92 @@ void CreateRS03VerifyWindow(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, 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("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);
y1=0; y2=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, y1, y2, 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, y1, y2, 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);
y1++; y2++;
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, _("Data checksum:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 2, 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, y1, y2, 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);
y1++; y2++;
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, _("Data section:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 3, 1, 1);
lab = wl->cmpDataSection = gtk_label_new(".");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
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, _("Crc section:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 4, 1, 1);
lab = wl->cmpCrcSection = gtk_label_new(".");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
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 section:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 5, 1, 1);
lab = wl->cmpEccSection= gtk_label_new(".");
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
lab = wl->cmpEccSynLabel = 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 block test:"));
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 6, 1, 1);
lab = wl->cmpEccSyndromes = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
lab = wl->cmpImageErasure = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 7, 1, 1);
lab = wl->cmpImageErasureCnt = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
lab = wl->cmpImagePrognosis = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 0, 1, y1, y2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 2 );
gtk_label_set_xalign(GTK_LABEL(lab), 0.0);
gtk_grid_attach(GTK_GRID(grid2), lab, 1, 8, 1, 1);
lab = wl->cmpImagePrognosisMsg = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(lab), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table2), lab, 1, 2, y1, y2, 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);
y1++; y2++;
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, y1, y2, 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

@@ -31,7 +31,7 @@
*** Forward declarations
***/
static void redraw_curve(RS03Widgets*);
static void redraw_curve(cairo_t *cr, RS03Widgets*);
static void update_geometry(RS03Widgets*);
/***
@@ -59,77 +59,91 @@ void ResetRS03EncWindow(Method *method)
}
void CreateRS03EncWindow(Method *method, GtkWidget *parent)
{ GtkWidget *wid,*table,*pbar,*sep;
{ GtkWidget *wid,*grid,*pbar,*sep;
RS03Widgets *wl=method->widgetList;
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, 5, 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, 5);
gtk_widget_set_margin_bottom(grid, 5);
gtk_grid_set_column_spacing(GTK_GRID(grid), 20);
gtk_grid_set_row_spacing(GTK_GRID(grid), 10);
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. Reserving space:</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, 10, 20);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_widget_set_margin_top(wid, 15);
gtk_widget_set_margin_bottom(wid, 15);
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, 10, 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, 10, 20);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_widget_set_margin_top(wid, 15);
gtk_widget_set_margin_bottom(wid, 15);
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, 10, 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->encLabel3 = wid = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(wid), 1.0);
gtk_label_set_markup(GTK_LABEL(wid),_utf("<b>Encoder info:</b>"));
gtk_table_attach(GTK_TABLE(table), wid, 0, 1, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 10, 5);
gtk_grid_attach(GTK_GRID(grid), wid, 1, 3, 1, 1);
wl->encThreads = wid = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wid), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), wid, 1, 2, 2, 3, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 10,5);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_grid_attach(GTK_GRID(grid), wid, 2, 3, 1, 1);
wl->encLabel4 = wid = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(wid), 1.0);
gtk_label_set_markup(GTK_LABEL(wid),_utf("<b>Performance:</b>"));
gtk_table_attach(GTK_TABLE(table), wid, 0, 1, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 10, 5);
gtk_grid_attach(GTK_GRID(grid), wid, 1, 4, 1, 1);
wl->encPerformance = wid = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wid), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), wid, 1, 2, 4, 5, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 10, 5);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_grid_attach(GTK_GRID(grid), wid, 2, 4, 1, 1);
wl->encLabel5 = wid = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.0);
gtk_label_set_xalign(GTK_LABEL(wid), 1.0);
gtk_label_set_markup(GTK_LABEL(wid),_utf("<b>State:</b>"));
gtk_table_attach(GTK_TABLE(table), wid, 0, 1, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 10, 5);
gtk_grid_attach(GTK_GRID(grid), wid, 1, 5, 1, 1);
wl->encBottleneck = wid = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(wid), 0.0, 0.0);
gtk_table_attach(GTK_TABLE(table), wid, 1, 2, 5, 6, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 10, 5);
gtk_label_set_xalign(GTK_LABEL(wid), 0.0);
gtk_grid_attach(GTK_GRID(grid), wid, 2, 5, 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);
}
@@ -144,7 +158,7 @@ void CreateRS03EncWindow(Method *method, GtkWidget *parent)
static gboolean set_max_idle_func(gpointer data)
{ RS03Widgets *wl = (RS03Widgets*)data;
redraw_curve(wl);
gtk_widget_queue_draw(wl->fixCurve->widget);
return FALSE;
}
@@ -188,47 +202,8 @@ void RS03UpdateFixResults(RS03Widgets *wl, gint64 corrected, gint64 uncorrected)
static gboolean curve_idle_func(gpointer data)
{ RS03Widgets *wl = (RS03Widgets*)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;
}
@@ -266,35 +241,34 @@ static void update_geometry(RS03Widgets *wl)
TRUE, TRUE, wl->fixCurve->leftX, GTK_PACK_START);
}
static void redraw_curve(RS03Widgets *wl)
static void redraw_curve(cairo_t *cr, RS03Widgets *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)
static gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
{ RS03Widgets *wl = (RS03Widgets*)data;
if(event->count) /* Exposure compression */
return TRUE;
update_geometry(wl);
redraw_curve(wl);
redraw_curve(cr, wl);
return TRUE;
}
@@ -308,9 +282,7 @@ void ResetRS03FixWindow(Method *method)
RS03UpdateFixResults(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;
@@ -332,45 +304,45 @@ void CreateRS03FixWindow(Method *method, GtkWidget *parent)
else wl = method->widgetList;
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_VERTICAL, 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);

View File

@@ -101,7 +101,7 @@ io_iterator_t getDVDIterator(char* ioClass)
if (matchingDict == (CFMutableDictionaryRef) NULL) {
return (io_iterator_t) NULL;
}
ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &scsiObjectIterator);
ioReturnValue = IOServiceGetMatchingServices(0, matchingDict, &scsiObjectIterator);
if (scsiObjectIterator == (io_iterator_t) NULL || (ioReturnValue != kIOReturnSuccess)) {
return (io_iterator_t) NULL;
}

View File

@@ -399,6 +399,24 @@ static int get_configuration(DeviceHandle *dh)
dh->subType = BD_RE;
break;
case 0x50: dh->profileDescr = "HD-DVD";
dh->shortProfile = "HD-DVD";
dh->mainType = HD_DVD;
dh->subType = HD_DVD;
break;
case 0x51: dh->profileDescr = "HD-DVD-R";
dh->shortProfile = "HD-DVD-R";
dh->mainType = HD_DVD;
dh->subType = HD_DVD_R;
break;
case 0x52: dh->profileDescr = "HD-DVD-RW";
dh->shortProfile = "HD-DVD-RW";
dh->mainType = HD_DVD;
dh->subType = HD_DVD_RW;
break;
default: dh->profileDescr = "Unknown profile";
dh->mainType = UNSUPPORTED;
dh->subType = UNSUPPORTED;
@@ -875,13 +893,16 @@ static int query_dvd(DeviceHandle *dh, int probe_only)
dh->rewriteable = TRUE;
break;
case 4: dh->bookDescr = "HD DVD-ROM";
dh->subType = UNSUPPORTED;
dh->subType = HD_DVD;
break;
case 5: dh->bookDescr = "HD DVD-RAM";
dh->subType = UNSUPPORTED;
break;
case 6: dh->bookDescr = "HD DVD-R";
dh->subType = UNSUPPORTED;
dh->subType = HD_DVD_R;
break;
case 7: dh->bookDescr = "HD DVD-RW";
dh->subType = HD_DVD_RW;
break;
case 9: dh->bookDescr = "DVD+RW";
dh->rewriteable = TRUE;
@@ -1185,6 +1206,22 @@ static int query_type(DeviceHandle *dh, int probe_only)
}
break; /* unreachable */
case HD_DVD:
dh->read = read_dvd_sector;
dh->singleRate = 36000.0/8.0; /* 1x = 36 kbit */
dh->maxRate = 3;
dh->clusterSize = 32;
if(!dh->incomplete)
{ ret = query_dvd(dh, probe_only);
return (probe_only == 2 ? TRUE : ret);
}
else
{ if(query_dvd(dh, TRUE)) return TRUE;
ret = query_incomplete(dh, probe_only);
return (probe_only == 2 ? TRUE : ret);
}
break; /* unreachable */
default: /* maybe HD DVD or sth else we do not support */
return FALSE;
}
@@ -1749,12 +1786,13 @@ static int query_copyright(DeviceHandle *dh)
*/
static int check_sector(DeviceHandle *dh, GString *msg_out, guint64 sector, int n_sectors)
{ AlignedBuffer *scratch = CreateAlignedBuffer(MAX_CLUSTER_SIZE);
{
int status,result;
char *msg;
if(sector<2) return 4;
AlignedBuffer *scratch = CreateAlignedBuffer(MAX_CLUSTER_SIZE);
status = read_dvd_sector(dh, scratch->buf, sector, n_sectors);
FreeAlignedBuffer(scratch);
@@ -1914,6 +1952,13 @@ static gint64 query_size(Image *image)
return dh->readCapacity+1; /* size is the number of the last sector, starting with 0 */
}
/* HD-DVD: no clue. Stick with READ CAPACITY. */
if(dh->mainType == HD_DVD)
{ Verbose("HD-DVD medium - using size from READ CAPACITY: %" PRId64 " sectors\n", dh->readCapacity+1);
return dh->readCapacity+1; /* size is the number of the last sector, starting with 0 */
}
/* For DVD media, READ CAPACITY should give the real image size.
READ DVD STRUCTURE may be same value or the unformatted size.
But some drives appear to have both functions reversed,
@@ -2117,10 +2162,10 @@ void SpinupDevice(DeviceHandle *dh)
double elapsed;
gulong ignore;
if(s>=dh->sectors) return;
if(s>=dh->sectors) break;
status = ReadSectorsFast(dh, ab->buf, s, dh->clusterSize);
if(status) return;
if(status) break;
elapsed = g_timer_elapsed(timer, &ignore);
if(elapsed > Closure->spinupDelay)
@@ -2723,6 +2768,7 @@ Image* OpenImageFromDevice(char *device, int query_only)
switch(subTypeMasked)
{ case BD:
case HD_DVD:
case DVD:
case CD:
{ char *tmp;

View File

@@ -235,6 +235,10 @@ typedef struct _DeviceHandle
#define BD_R 0x41
#define BD_RE 0x42
#define HD_DVD 0x50
#define HD_DVD_R 0x51
#define HD_DVD_RW 0x52
#define UNSUPPORTED 0x00
/* transport io modes */

View File

@@ -45,16 +45,11 @@ static void send_errormsg(int fd, char *format, ...)
free(msg);
}
static int recv_errormsg(int fd, char **msg)
{ char buf[256];
int n;
n = read(fd, buf, 256);
if(!n) return n;
*msg = g_strdup(buf);
return n;
static const char *recv_errormsg(int fd)
{ static char buf[256];
if (read(fd, buf, 256))
return buf;
return NULL;
}
#endif
@@ -65,7 +60,7 @@ void GuiShowURL(char *target)
#if !defined(SYS_MINGW) && !defined(SYS_DARWIN)
pid_t pid;
char *msg;
const char *msg;
int err_pipe[2]; /* child may send down err msgs to us here */
int result;
#endif
@@ -146,6 +141,35 @@ void GuiShowURL(char *target)
/* close reading end of error pipe */
close(err_pipe[0]);
/* cleanup env if we're called from AppImage */
if (g_getenv("DVDISASTER_APPIMAGE") && atoi(g_getenv("DVDISASTER_APPIMAGE")))
{
const char *namelist[] = {
"GDK_BACKEND",
"GDK_PIXBUF_MODULE_FILE",
"GIO_EXTRA_MODULES",
"GTK_IM_MODULE",
"GTK_IM_MODULE_FILE",
"GTK_MODULES",
"GTK_PATH",
"LD_LIBRARY_PATH",
"NO_AT_BRIDGE",
NULL,
};
for (int i = 0; namelist[i]; i++) {
gchar *original_name = g_strdup_printf("%s_ORIGINAL", namelist[i]);
if (g_getenv(original_name)) {
g_setenv(namelist[i], g_getenv(original_name), 1);
g_unsetenv(original_name);
}
else {
g_unsetenv(namelist[i]);
}
g_free(original_name);
}
g_unsetenv("DVDISASTER_APPIMAGE");
}
/* prepare args and try to exec xdg-open */
argv[argc++] = "xdg-open";
@@ -165,10 +189,10 @@ void GuiShowURL(char *target)
/* Parent process. See if some error condition came down the pipe. */
close(err_pipe[1]);
result = recv_errormsg(err_pipe[0], &msg);
msg = recv_errormsg(err_pipe[0]);
close(err_pipe[0]);
if(result)
if(msg)
{ GuiCreateMessage("%s", GTK_MESSAGE_ERROR, msg);
}
#endif

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