Compare commits
120 Commits
v0.79.10-p
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec679e3762 | ||
|
|
b20421e639 | ||
|
|
627dcd111e | ||
|
|
4e9949bd38 | ||
|
|
4a7d375475 | ||
|
|
fb4e70bfca | ||
|
|
8a354dbb4f | ||
|
|
3ed8d281c4 | ||
|
|
9e6b43d2cf | ||
|
|
b89b7d0e50 | ||
|
|
4456b67a24 | ||
|
|
49cf87bb31 | ||
|
|
117fcb1ee9 | ||
|
|
7c72e749ca | ||
|
|
f03dc63571 | ||
|
|
f1debb4002 | ||
|
|
935aa50038 | ||
|
|
235a6243d2 | ||
|
|
aa00ac9e3e | ||
|
|
76f79adeed | ||
|
|
903228e4b0 | ||
|
|
02e1d35db8 | ||
|
|
bbf60ee3e6 | ||
|
|
dc0e03073d | ||
|
|
da612c8a3a | ||
|
|
e4753752d3 | ||
|
|
e5f1eb1bd0 | ||
|
|
4f8a5479ac | ||
|
|
4c57e2ab2b | ||
|
|
30ff03d053 | ||
|
|
d826d01de2 | ||
|
|
0d0180167e | ||
|
|
dc23ed54b1 | ||
|
|
51089b2902 | ||
|
|
63ff359b03 | ||
|
|
3538a6bc7b | ||
|
|
697b116374 | ||
|
|
3757f9c9a8 | ||
|
|
b7840d13c1 | ||
|
|
fdc09176d9 | ||
|
|
0392e443f5 | ||
|
|
7e416990cd | ||
|
|
93be13b0ee | ||
|
|
222429df10 | ||
|
|
5ea0011dce | ||
|
|
cc9f4dd817 | ||
|
|
7732231bb5 | ||
|
|
e5bc7faa73 | ||
|
|
3a37673b3f | ||
|
|
0d7a8cc22b | ||
|
|
0b5b9c9f9e | ||
|
|
061026af8a | ||
|
|
2b5fca0e4f | ||
|
|
24570f86d1 | ||
|
|
9f583b1ffb | ||
|
|
d66ee15738 | ||
|
|
6c88a55600 | ||
|
|
e75d73c74a | ||
|
|
a7e1a5591e | ||
|
|
64f31a8e5d | ||
|
|
d01aae080e | ||
|
|
967d8e0b4c | ||
|
|
ce64c57c49 | ||
|
|
5da5fa54dc | ||
|
|
6dc80bb542 | ||
|
|
8c0765a1b6 | ||
|
|
640d72098d | ||
|
|
57b55b2527 | ||
|
|
a00dee7240 | ||
|
|
f3226aaf68 | ||
|
|
d9f9094a56 | ||
|
|
923fe44e4a | ||
|
|
fb7198c1e9 | ||
|
|
58a35bc565 | ||
|
|
c4c0fcec81 | ||
|
|
bb6c9222fb | ||
|
|
956131c3f3 | ||
|
|
ed8d9cfd66 | ||
|
|
73218aebd2 | ||
|
|
9effa298cd | ||
|
|
2cd769a958 | ||
|
|
b227732274 | ||
|
|
e68a8e79d0 | ||
|
|
e9b44a04f0 | ||
|
|
eadbf54aae | ||
|
|
3967ff3cae | ||
|
|
f8678eb3be | ||
|
|
ea92170fd1 | ||
|
|
8504386fb1 | ||
|
|
8469a933e4 | ||
|
|
ad3285507b | ||
|
|
2bb0774538 | ||
|
|
2cee2215af | ||
|
|
8c567549c1 | ||
|
|
9bbd268aa4 | ||
|
|
3be61f4b7b | ||
|
|
c7b0f5b592 | ||
|
|
c0bde64a54 | ||
|
|
c19e7ea100 | ||
|
|
063ad92460 | ||
|
|
aa9065f0c0 | ||
|
|
0bfca9a9fc | ||
|
|
71668f3296 | ||
|
|
3d1bf4677e | ||
|
|
c32080d7d6 | ||
|
|
42bb0a120b | ||
|
|
8d24545c88 | ||
|
|
16ea27d791 | ||
|
|
a7c5268f37 | ||
|
|
45ff2c5fda | ||
|
|
1338598abb | ||
|
|
1577a7c18d | ||
|
|
36ef8517fd | ||
|
|
64c0361179 | ||
|
|
eeb9f0705d | ||
|
|
f38969c7c8 | ||
|
|
be6970f5df | ||
|
|
cb3d628f12 | ||
|
|
62ec64d18f | ||
|
|
981226eec2 |
64
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on: [push,pull_request]
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'cpp' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Use only 'java' to analyze code written in Java, Kotlin or both
|
||||
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
|
||||
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
|
||||
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||
# queries: security-extended,security-and-quality
|
||||
|
||||
|
||||
- name: Build app
|
||||
run: |
|
||||
sudo apt-get update && sudo apt-get install -y libglib2.0-dev ghostscript man jq libgtk-3-dev
|
||||
./configure --with-werror
|
||||
nproc && make -j$(nproc)
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
with:
|
||||
category: "/language:${{matrix.language}}"
|
||||
88
.github/workflows/make-dist.sh
vendored
@@ -1,6 +1,5 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -x
|
||||
|
||||
github_ref="$1"
|
||||
|
||||
@@ -21,31 +20,84 @@ else
|
||||
fi
|
||||
|
||||
archive=dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$')-$suffix.zip
|
||||
echo "Archive name is $archive"
|
||||
echo "::set-output name=archive::$archive"
|
||||
[ -n "$GITHUB_OUTPUT" ] && echo "archive=$archive" >> "$GITHUB_OUTPUT"
|
||||
echo "!> Appimage is <$archive>"
|
||||
|
||||
echo "!> Copying locales"
|
||||
mkdir -p dist/locale
|
||||
cp -vr locale/*/ dist/locale/
|
||||
cp -va locale/*/ dist/locale/
|
||||
|
||||
# WINDOWS 32/64
|
||||
if [ "$os" != "linux64" ]; then
|
||||
lookup_dependencies="dvdisaster"
|
||||
if [ "$GUI" = 1 ]; then
|
||||
mkdir -p dist/share/themes dist/lib/gtk-2.0
|
||||
cp -vr $MINGW_PREFIX/share/themes/MS-Windows dist/share/themes/
|
||||
cp -vr $MINGW_PREFIX/lib/gtk-2.0/* dist/lib/gtk-2.0/
|
||||
rm -rf dist/lib/gtk-2.0/include
|
||||
echo "!> Copying glib2 schemas..."
|
||||
mkdir -p dist/share/glib-2.0
|
||||
cp -va "$MINGW_PREFIX/share/glib-2.0/schemas" dist/share/glib-2.0/
|
||||
echo "!> Copying default icons..."
|
||||
mkdir -p dist/share/
|
||||
cp -va "$MINGW_PREFIX/share/icons" dist/share/
|
||||
loaders_cache="$(find "$MINGW_PREFIX/lib/gdk-pixbuf-2.0/" -name loaders.cache | head -n1)"
|
||||
pixbuf_dir="$(dirname "$loaders_cache")"
|
||||
echo "!> Absolute pixbuf directory is $pixbuf_dir"
|
||||
pixbuf_dir_relative=$(echo "$pixbuf_dir" | sed -re "s=$MINGW_PREFIX/==")
|
||||
echo "!> Relative pixbuf directory is $pixbuf_dir_relative"
|
||||
mkdir -p "dist/$pixbuf_dir_relative/loaders"
|
||||
cp -va "$loaders_cache" "dist/$pixbuf_dir_relative/"
|
||||
lookup_dependencies="$lookup_dependencies $(\ls -1 "$pixbuf_dir"/loaders/*.dll)"
|
||||
fi
|
||||
mkdir -p dist/lib
|
||||
ntldd -R dvdisaster
|
||||
for i in $(ntldd -R dvdisaster | awk '/mingw/ {print $3}' | tr \\\\ / | grep -Eo '[^/]+$')
|
||||
echo "!> Will look for dependencies of $lookup_dependencies"
|
||||
|
||||
for binary in $lookup_dependencies
|
||||
do
|
||||
test -e $MINGW_PREFIX/bin/$i && cp -va $MINGW_PREFIX/bin/$i dist/
|
||||
if [ "$binary" != "dvdisaster" ]; then
|
||||
echo "!> Copying pixbuf loader lib $binary to dist/$pixbuf_dir_relative/loaders..."
|
||||
cp -va "$binary" "dist/$pixbuf_dir_relative/loaders/"
|
||||
fi
|
||||
echo "!> Looking for dependencies of $binary..."
|
||||
# ntldd -R $binary
|
||||
for i in $(ntldd -R "$binary" | awk '/mingw/ {print $3}' | tr \\\\ / | grep -Eo '[^/]+$')
|
||||
do
|
||||
src="$MINGW_PREFIX/bin/$i"
|
||||
echo -n "!>> Inspecting $src... "
|
||||
if [ -e "$src" ]; then
|
||||
echo "found, copying"
|
||||
cp -va "$src" dist/
|
||||
else
|
||||
echo "not found, skipping"
|
||||
fi
|
||||
done
|
||||
done
|
||||
find dist -type f -name "*.a" -delete
|
||||
|
||||
echo "!> Remove .a files if any"
|
||||
find dist -type f -name "*.a" -print -delete
|
||||
|
||||
echo "!> Copy and rename text files"
|
||||
for file in CHANGELOG TODO COPYING CREDITS.* TODO
|
||||
do
|
||||
cp -va "$file" "dist/$file.txt"
|
||||
done
|
||||
|
||||
echo "!> Copy other files"
|
||||
for file in dvdisaster.exe documentation/user-manual/manual.pdf
|
||||
do
|
||||
cp -va "$file" dist/
|
||||
done
|
||||
# /WINDOWS
|
||||
else
|
||||
# Linux
|
||||
echo "!> Copying text, man and pdf files"
|
||||
cp -va CHANGELOG TODO COPYING CREDITS.* dvdisaster documentation/dvdisaster.*.1 documentation/user-manual/manual.pdf dist/
|
||||
fi
|
||||
|
||||
echo "!> Building pdf from man"
|
||||
man -t documentation/dvdisaster.en.1 | ps2pdf - dist/dvdisaster.pdf
|
||||
cp CHANGELOG TODO COPYING CREDITS.* dvdisaster documentation/dvdisaster.*.1 documentation/user-manual/manual.pdf dist/
|
||||
|
||||
echo "!> Building dist zip"
|
||||
if command -v zip >/dev/null; then
|
||||
mv dist ${archive/.zip/}
|
||||
zip -9r $archive ${archive/.zip/}
|
||||
mv ${archive/.zip/} dist
|
||||
mv -v dist "${archive/.zip/}"
|
||||
zip -9r "$archive" "${archive/.zip/}"
|
||||
mv -v "${archive/.zip/}" dist
|
||||
fi
|
||||
echo "dist done ($archive)"
|
||||
|
||||
echo "!> Dist done ($archive)"
|
||||
|
||||
51
.github/workflows/make-mac-app.sh
vendored
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -x
|
||||
|
||||
github_ref="$1"
|
||||
|
||||
if ./dvdisaster --version | grep -q NOGUI; then
|
||||
suffix="-cli-only"
|
||||
else
|
||||
suffix=""
|
||||
fi
|
||||
|
||||
archive="dvdisaster-$(echo "$github_ref" | grep -Eo '[^/]+$')-macos$suffix.dmg"
|
||||
[ -n "$GITHUB_OUTPUT" ] && echo "archive=$archive" >> "$GITHUB_OUTPUT"
|
||||
echo "mac dmg is <$archive>"
|
||||
|
||||
mkdir -p dist
|
||||
|
||||
# Create directory structure for the macOS application bundle
|
||||
mkdir -p dvdisaster.app/Contents/{MacOS,Resources}
|
||||
|
||||
# Copy the main executable to the appropriate location
|
||||
cp dvdisaster dvdisaster.app/Contents/MacOS
|
||||
|
||||
# Use dylibbundler to bundle dynamic libraries into the application bundle
|
||||
dylibbundler -od -cd -b -x dvdisaster.app/Contents/MacOS/dvdisaster -d 'dvdisaster.app/Contents/libs/'
|
||||
|
||||
# Copy the Info.plist file to define application metadata
|
||||
cp macinst/Info.plist dvdisaster.app/Contents/
|
||||
|
||||
# Create a directory for documentation resources
|
||||
mkdir dvdisaster.app/Contents/Resources/documentation
|
||||
|
||||
# Copy documentation files to the documentation directory
|
||||
cp CHANGELOG TODO COPYING CREDITS.* documentation/dvdisaster.*.1 documentation/user-manual/manual.pdf dvdisaster.app/Contents/Resources/documentation
|
||||
|
||||
# Copy localization files to the locale directory
|
||||
find locale/* -maxdepth 0 -type d -exec cp -r {} dvdisaster.app/Contents/Resources/locale/ \;
|
||||
|
||||
# Copy the application icon to the resources directory
|
||||
cp macinst/dvdisaster.icns dvdisaster.app/Contents/Resources/
|
||||
|
||||
# Make the main executable executable
|
||||
chmod +x dvdisaster.app/Contents/MacOS/dvdisaster
|
||||
|
||||
# Move the application bundle to the 'dist' directory
|
||||
mv dvdisaster.app dist
|
||||
|
||||
create-dmg "$archive" dist
|
||||
|
||||
echo "dist done ($archive)"
|
||||
410
.github/workflows/release.yml
vendored
@@ -1,12 +1,97 @@
|
||||
name: autobuild
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'dev'
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
jobs:
|
||||
mac:
|
||||
runs-on: macos-13
|
||||
strategy:
|
||||
matrix:
|
||||
ui: [cli, gui]
|
||||
include:
|
||||
- ui: cli
|
||||
clionly: --with-gui=no
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: install prerequisites
|
||||
env:
|
||||
HOMEBREW_NO_INSTALL_CLEANUP: 1
|
||||
run: brew install ghostscript glib gdk-pixbuf dylibbundler create-dmg
|
||||
- name: install prerequisites (GUI)
|
||||
if: matrix.ui == 'gui'
|
||||
env:
|
||||
HOMEBREW_NO_INSTALL_CLEANUP: 1
|
||||
run: brew install gtk+3
|
||||
- name: configure
|
||||
run: |
|
||||
set +x
|
||||
./configure ${{ matrix.clionly }} --with-werror
|
||||
- name: make
|
||||
run: |
|
||||
cat Makefile.config
|
||||
make -j$(sysctl -n hw.ncpu || 2)
|
||||
- name: check executability
|
||||
run: ./dvdisaster --version
|
||||
- name: check executable (GUI)
|
||||
if: matrix.ui == 'gui'
|
||||
run: |
|
||||
./dvdisaster --version
|
||||
if ./dvdisaster --version | grep NOGUI; then exit 1; fi
|
||||
- name: check executable (CLI)
|
||||
if: matrix.ui == 'cli'
|
||||
run: |
|
||||
./dvdisaster --version
|
||||
./dvdisaster --version | grep NOGUI
|
||||
- name: build dist
|
||||
run: ./.github/workflows/make-mac-app.sh ${{ github.ref }}
|
||||
id: dist
|
||||
- name: Tag for Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
run: |
|
||||
git tag -f latest
|
||||
git push -f origin latest
|
||||
- name: Upload to Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
name: "Continuous Build"
|
||||
tag_name: latest
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Tag for Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
run: |
|
||||
git tag -f devel
|
||||
git push -f origin devel
|
||||
- name: Upload to Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
draft: true
|
||||
name: "Dev Build"
|
||||
tag_name: devel
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Upload to Draft Release
|
||||
if: github.ref_type == 'tag'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
draft: true
|
||||
name: ${{ github.ref_name }}
|
||||
tag_name: ${{ github.ref_name }}
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
|
||||
win:
|
||||
runs-on: windows-2016
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x86_64, i686]
|
||||
@@ -24,119 +109,232 @@ jobs:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
steps:
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: ${{ matrix.msystem }}
|
||||
update: false
|
||||
install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip
|
||||
- name: install GUI prereqs
|
||||
if: matrix.ui == 'gui'
|
||||
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk2
|
||||
- name: git config
|
||||
run: git config --global core.autocrlf input
|
||||
shell: bash
|
||||
- uses: actions/checkout@v2
|
||||
- name: configure
|
||||
run: ./configure ${{ matrix.clionly }}
|
||||
- name: make
|
||||
run: nproc && make -j$(nproc)
|
||||
- name: check executable
|
||||
run: |
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: ${{ matrix.msystem }}
|
||||
update: false
|
||||
install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip
|
||||
- name: install GUI prereqs
|
||||
if: matrix.ui == 'gui'
|
||||
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk3 mingw-w64-${{ matrix.arch }}-librsvg
|
||||
- name: git config
|
||||
run: git config --global core.autocrlf input
|
||||
shell: bash
|
||||
- uses: actions/checkout@v4
|
||||
- name: configure
|
||||
run: ./configure ${{ matrix.clionly }}
|
||||
- name: make
|
||||
run: nproc && make -j$(nproc)
|
||||
- name: check executable
|
||||
run: |
|
||||
./dvdisaster.exe --version
|
||||
file dvdisaster.exe
|
||||
if ./dvdisaster.exe --version | grep dirty; then exit 1; fi
|
||||
file dvdisaster.exe | grep -q '${{ matrix.grep }}, for MS Windows'
|
||||
- name: check executable (GUI)
|
||||
if: matrix.ui == 'gui'
|
||||
run: if ./dvdisaster.exe --version | grep NOGUI; then exit 1; fi
|
||||
- name: check executable (CLI)
|
||||
if: matrix.ui == 'cli'
|
||||
run: ./dvdisaster.exe --version | grep NOGUI
|
||||
- name: prepare dist
|
||||
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
|
||||
id: dist
|
||||
- name: check executability of dist from cmd.exe
|
||||
shell: cmd
|
||||
run: |
|
||||
file dvdisaster.exe | grep -q '${{ matrix.grep }}'
|
||||
file dvdisaster.exe | grep -q 'for MS Windows'
|
||||
- name: check executable (GUI)
|
||||
if: matrix.ui == 'gui'
|
||||
run: if ./dvdisaster.exe --version | grep NOGUI; then exit 1; fi
|
||||
- name: check executable (CLI)
|
||||
if: matrix.ui == 'cli'
|
||||
run: ./dvdisaster.exe --version | grep NOGUI
|
||||
- name: prepare dist
|
||||
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
|
||||
id: dist
|
||||
- name: check executability of dist from cmd.exe
|
||||
shell: cmd
|
||||
run: |
|
||||
cd dist
|
||||
dvdisaster.exe --version
|
||||
- name: Upload Release Asset
|
||||
id: upload-release-asset
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./${{ steps.dist.outputs.archive }}
|
||||
asset_name: ${{ steps.dist.outputs.archive }}
|
||||
asset_content_type: application/zip
|
||||
- name: Tag for Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
run: |
|
||||
git tag -f latest
|
||||
git push -f origin latest
|
||||
- name: Upload to Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
name: "Continuous Build"
|
||||
tag_name: latest
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Tag for Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
run: |
|
||||
git tag -f devel
|
||||
git push -f origin devel
|
||||
- name: Upload to Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
draft: true
|
||||
name: "Dev Build"
|
||||
tag_name: devel
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Upload to Draft Release
|
||||
if: github.ref_type == 'tag'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
draft: true
|
||||
name: ${{ github.ref_name }}
|
||||
tag_name: ${{ github.ref_name }}
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
|
||||
linux64-cli:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: install prerequisites
|
||||
run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man
|
||||
- name: configure
|
||||
run: ./configure --with-gui=no
|
||||
- name: make
|
||||
run: nproc && make -j$(nproc) && make static && mv -f dvdisaster-static dvdisaster
|
||||
- name: check executable
|
||||
run: |
|
||||
./dvdisaster --version && ./dvdisaster --version | grep -q dirty || true
|
||||
file dvdisaster && file dvdisaster | grep -q 'ELF 64' && file dvdisaster | grep -q 'statically linked'
|
||||
- uses: actions/checkout@v4
|
||||
- name: install prerequisites
|
||||
run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man
|
||||
- name: configure
|
||||
run: ./configure --with-gui=no
|
||||
- name: make
|
||||
run: nproc && make -j$(nproc) && make static && mv -f dvdisaster-static dvdisaster
|
||||
- name: check executable
|
||||
run: |
|
||||
./dvdisaster --version && ./dvdisaster --version | grep -q dirty || true
|
||||
file dvdisaster && file dvdisaster | grep -q 'ELF 64' && file dvdisaster | grep -q 'statically linked'
|
||||
|
||||
- name: build dist
|
||||
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
|
||||
id: dist
|
||||
- name: Upload Release Asset
|
||||
id: upload-release-asset
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./${{ steps.dist.outputs.archive }}
|
||||
asset_name: ${{ steps.dist.outputs.archive }}
|
||||
asset_content_type: application/zip
|
||||
- name: build dist
|
||||
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
|
||||
id: dist
|
||||
- name: Tag for Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
run: |
|
||||
git tag -f latest
|
||||
git push -f origin latest
|
||||
- name: Upload to Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
name: "Continuous Build"
|
||||
tag_name: latest
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Tag for Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
run: |
|
||||
git tag -f devel
|
||||
git push -f origin devel
|
||||
- name: Upload to Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
draft: true
|
||||
name: "Dev Build"
|
||||
tag_name: devel
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Upload to Draft Release
|
||||
if: github.ref_type == 'tag'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
draft: true
|
||||
name: ${{ github.ref_name }}
|
||||
tag_name: ${{ github.ref_name }}
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
|
||||
linux64-appimage:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: install prerequisites
|
||||
run: sudo apt update && sudo apt install -y libglib2.0-dev ghostscript man wget libgtk2.0-dev gtk2-engines-pixbuf gtk2-engines pkg-config gnome-themes-standard
|
||||
- name: configure
|
||||
run: ./configure --prefix=/usr
|
||||
- name: make
|
||||
run: nproc && make -j$(nproc) && make
|
||||
- name: make install
|
||||
run: touch documentation/user-manual/manual.pdf && mkdir /tmp/dist && make install DESTDIR=/tmp/dist
|
||||
- name: copy things to dist
|
||||
run: |
|
||||
install -d /tmp/dist/usr/lib/gtk-2.0
|
||||
cp -va $(pkg-config --variable=libdir gtk+-2.0)/gtk-2.0/$(pkg-config --variable=gtk_binary_version gtk+-2.0)/* /tmp/dist/usr/lib/gtk-2.0
|
||||
- name: get linuxdeploy
|
||||
run: wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod 755 linuxdeploy-x86_64.AppImage
|
||||
- name: build appimage
|
||||
run: |
|
||||
export VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$')
|
||||
./linuxdeploy-x86_64.AppImage -d contrib/dvdisaster.desktop -i contrib/dvdisaster64.png -i contrib/dvdisaster48.png -i contrib/dvdisaster32.png -i contrib/dvdisaster16.png --icon-filename dvdisaster --custom-apprun=contrib/AppRun.sh --appdir /tmp/dist/ --output appimage
|
||||
- name: test appimage
|
||||
id: dist
|
||||
run: |
|
||||
chmod 755 dvdisaster*.AppImage && ./dvdisaster*.AppImage --version
|
||||
archive=$(ls -1 dvdisaster*.AppImage)
|
||||
echo "::set-output name=archive::$archive"
|
||||
echo "appimage is <$archive>"
|
||||
- name: Upload Release Asset
|
||||
id: upload-release-asset
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./${{ steps.dist.outputs.archive }}
|
||||
asset_name: ${{ steps.dist.outputs.archive }}
|
||||
asset_content_type: application/zip
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- name: install prerequisites on host
|
||||
run: sudo apt-get update && sudo apt-get install -y fuse
|
||||
- name: docker
|
||||
run: |
|
||||
mkdir -p /tmp/dist
|
||||
docker run --device /dev/fuse --privileged --name uu -d -v $PWD:/dvdisaster -v /tmp/dist:/dist ubuntu:18.04 sleep 1800
|
||||
- name: install prerequisites in docker
|
||||
run: docker exec uu sh -c 'apt update && apt install -y ghostscript man fuse file make gcc pkg-config libglib2.0-dev libgtk-3-dev glib-networking libgdk-pixbuf2.0-dev'
|
||||
- name: configure in docker
|
||||
run: docker exec uu sh -c 'cd /dvdisaster && ./configure --prefix=/usr'
|
||||
- name: make in docker
|
||||
run: docker exec uu sh -c 'make -C /dvdisaster -j$(nproc) && make -C /dvdisaster'
|
||||
- name: make install in docker
|
||||
run: docker exec uu sh -c 'cd /dvdisaster && touch documentation/user-manual/manual.pdf && make install DESTDIR=/dist'
|
||||
- name: copy gtk3 and gio stuff to dist in docker
|
||||
run: |
|
||||
set -euo pipefail
|
||||
docker exec uu sh -c 'install -d /dist/usr/lib/gtk-3.0 && cp -va $(pkg-config --variable=libdir gtk+-3.0)/gtk-3.0/* /dist/usr/lib/gtk-3.0'
|
||||
docker exec uu sh -c 'install -d /dist/usr/lib/gio/modules && cp -va $(dirname $(dpkg -L glib-networking | grep -F /libgiolibproxy.so | head -n1))/* /dist/usr/lib/gio/modules/'
|
||||
docker exec uu sh -c 'gio-querymodules /dist/usr/lib/gio/modules'
|
||||
docker exec uu sh -c 'install -d /dist/usr/lib/gdk-pixbuf2 && timeout 10 cp -va $(dirname $(find /usr/lib -name "libpixbufloader-*.so" | head -n1))/../* /dist/usr/lib/gdk-pixbuf2/'
|
||||
docker exec uu sh -c 'gdk-pixbuf-query-loaders > /dist/usr/lib/gdk-pixbuf2/loaders.cache'
|
||||
IM_BASEPATH=$(dirname $(cd /tmp/dist; find . -name immodules.cache))/immodules
|
||||
sudo sed -i -re 's=^"/.+/immodules/(.+)="'$IM_BASEPATH'/\1=' $(find /tmp/dist/ -name immodules.cache)
|
||||
PIX_BASEPATH=$(dirname $(cd /tmp/dist; find . -name loaders.cache))/
|
||||
sudo sed -i -re 's=^"/.+/loaders/(.+)="'$PIX_BASEPATH'/loaders/\1=' $(find /tmp/dist/ -name loaders.cache)
|
||||
- name: build appimage in docker with linuxdeploy
|
||||
run: |
|
||||
wget -q https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
|
||||
chmod 755 linuxdeploy-x86_64.AppImage
|
||||
docker exec -e LINUXDEPLOY_OUTPUT_VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$') -e ARCH=x86_64 uu sh -c 'cd /dvdisaster && ./linuxdeploy-x86_64.AppImage -d contrib/dvdisaster.desktop -i contrib/dvdisaster64.png -i contrib/dvdisaster48.png -i contrib/dvdisaster32.png -i contrib/dvdisaster16.png --icon-filename dvdisaster --custom-apprun=contrib/AppRun.sh --appdir /dist/ --output appimage'
|
||||
- name: fix perms
|
||||
run: docker exec uu sh -c "chown -R $UID /dist /dvdisaster/*.AppImage"
|
||||
- name: patch libgio and apply glib workaround by repackaging with appimagetool
|
||||
env:
|
||||
ARCH: x86_64
|
||||
run: |
|
||||
wget -q https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
|
||||
chmod 755 appimagetool-x86_64.AppImage
|
||||
exe=$(ls -1 dvdisaster*.AppImage)
|
||||
chmod 755 $exe
|
||||
./$exe --appimage-extract
|
||||
rm -vf $exe
|
||||
sed -i -re "s=gio/modules=:::::::::::=g" squashfs-root/usr/lib/libgio*.so*
|
||||
env LINUXDEPLOY_OUTPUT_VERSION=$(echo "${{ github.ref }}" | grep -Eo '[^/]+$') ./appimagetool-x86_64.AppImage -v squashfs-root
|
||||
mv -v dvdisaster*AppImage $exe
|
||||
chmod 755 $exe
|
||||
- name: test appimage
|
||||
id: dist
|
||||
run: |
|
||||
chmod 755 dvdisaster*.AppImage && ./dvdisaster*.AppImage --version
|
||||
archive=$(ls -1 dvdisaster*.AppImage)
|
||||
echo "archive=$archive" >> "$GITHUB_OUTPUT"
|
||||
echo "appimage is <$archive>"
|
||||
- name: Tag for Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
run: |
|
||||
git tag -f latest
|
||||
git push -f origin latest
|
||||
- name: Upload to Continuous Build
|
||||
if: github.ref_name == 'master'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
name: "Continuous Build"
|
||||
tag_name: latest
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Tag for Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
run: |
|
||||
git tag -f devel
|
||||
git push -f origin devel
|
||||
- name: Upload to Dev Build
|
||||
if: github.ref_name == 'dev'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: true
|
||||
draft: true
|
||||
name: "Dev Build"
|
||||
tag_name: devel
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
- name: Upload to Draft Release
|
||||
if: github.ref_type == 'tag'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
draft: true
|
||||
name: ${{ github.ref_name }}
|
||||
tag_name: ${{ github.ref_name }}
|
||||
files: ${{ steps.dist.outputs.archive }}
|
||||
|
||||
70
.github/workflows/tests.yml
vendored
@@ -3,8 +3,61 @@ name: non-regression tests
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
mac:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
ui: [cli, gui]
|
||||
printf: [fmtdbg, normal]
|
||||
include:
|
||||
- ui: cli
|
||||
clionly: --with-gui=no
|
||||
- printf: fmtdbg
|
||||
debugprintf: --with-debug-printf-format
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: install prerequisites
|
||||
env:
|
||||
HOMEBREW_NO_INSTALL_CLEANUP: 1
|
||||
run: brew install ghostscript
|
||||
- name: install prerequisites (GUI)
|
||||
if: matrix.ui == 'gui'
|
||||
env:
|
||||
HOMEBREW_NO_INSTALL_CLEANUP: 1
|
||||
run: brew install gtk+3
|
||||
- name: configure
|
||||
run: |
|
||||
set +x
|
||||
./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror
|
||||
- name: make
|
||||
run: |
|
||||
cat Makefile.config
|
||||
echo xxxxxxxxxxxxxxxxxxxxxxx
|
||||
grep -i icon GNUmakefile
|
||||
make -j$(sysctl -n hw.ncpu || 2)
|
||||
- name: check executability
|
||||
run: ./dvdisaster --version
|
||||
- name: check executable (GUI)
|
||||
if: matrix.ui == 'gui'
|
||||
run: |
|
||||
./dvdisaster --version
|
||||
if ./dvdisaster --version | grep NOGUI; then exit 1; fi
|
||||
- name: check executable (CLI)
|
||||
if: matrix.ui == 'cli'
|
||||
run: |
|
||||
./dvdisaster --version
|
||||
./dvdisaster --version | grep NOGUI
|
||||
- name: prepare dist
|
||||
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
|
||||
- name: regression tests
|
||||
if: matrix.printf == 'normal'
|
||||
env:
|
||||
REGTEST_NO_UTF8: 1
|
||||
run: mkdir /var/tmp/regtest && ./regtest/runtests.sh
|
||||
win:
|
||||
runs-on: windows-2016
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x86_64, i686]
|
||||
@@ -32,11 +85,13 @@ jobs:
|
||||
install: git diffutils make pkg-config mingw-w64-${{ matrix.arch }}-glib2 mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-ghostscript mingw-w64-${{ matrix.arch }}-ntldd-git man zip
|
||||
- name: install GUI prereqs
|
||||
if: matrix.ui == 'gui'
|
||||
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk2
|
||||
run: pacman -S --noconfirm mingw-w64-${{ matrix.arch }}-gtk3
|
||||
- name: git config
|
||||
run: git config --global core.autocrlf input
|
||||
shell: bash
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: configure
|
||||
run: |
|
||||
echo running ./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror
|
||||
@@ -48,7 +103,8 @@ jobs:
|
||||
./dvdisaster.exe --version
|
||||
file dvdisaster.exe
|
||||
if ./dvdisaster.exe --version | grep dirty; then exit 1; fi
|
||||
file dvdisaster.exe | grep -q '${{ matrix.grep }}, for MS Windows'
|
||||
file dvdisaster.exe | grep -q '${{ matrix.grep }}'
|
||||
file dvdisaster.exe | grep -q 'for MS Windows'
|
||||
- name: check executable (GUI)
|
||||
if: matrix.ui == 'gui'
|
||||
run: |
|
||||
@@ -79,7 +135,9 @@ jobs:
|
||||
- printf: fmtdbg
|
||||
debugprintf: --with-debug-printf-format
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: install prerequisites
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
@@ -88,7 +146,7 @@ jobs:
|
||||
if: matrix.ui == 'gui'
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
run: sudo apt-get install -y libgtk2.0-dev
|
||||
run: sudo apt-get install -y libgtk-3-dev
|
||||
- name: configure
|
||||
run: |
|
||||
echo ./configure ${{ matrix.clionly }} ${{ matrix.debugprintf }} --with-werror
|
||||
|
||||
2
.gitignore
vendored
@@ -10,7 +10,7 @@ locale/Makefile
|
||||
GNUmakefile
|
||||
.gitignore
|
||||
simple-md5sum
|
||||
inlined-icons.h
|
||||
inlined-icons.c
|
||||
help-dialogs.h
|
||||
dvdisaster
|
||||
build.h
|
||||
|
||||
18
CHANGELOG
@@ -20,6 +20,24 @@
|
||||
# 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
|
||||
|
||||
0.79.10.patchlevel-2 17-09-2023 *UNOFFICIAL*
|
||||
- re-introduced MacOS build. No other functional change since v0.79.10-pl1.
|
||||
|
||||
0.79.10.patchlevel-1 09-10-2021 *UNOFFICIAL*
|
||||
- sync: integrated changes from latest upstream,
|
||||
please refer to the entries below for details.
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
94
README.md
@@ -10,74 +10,90 @@ Please refer to the [PDF manual](documentation/user-manual/manual.pdf) for more
|
||||
|
||||
# :wrench: Unofficial version
|
||||
|
||||
The last upstream version by Carsten Gnörlich is dated 2017, and could be found on the
|
||||
[official](https://web.archive.org/web/20180428070843/http://dvdisaster.net/en/index.html)
|
||||
[website](https://web.archive.org/web/20180509154525/http://dvdisaster.org/en/index.html)
|
||||
which is [now](http://www.dvdisaster.net) [down](http://www.dvdisaster.org).
|
||||
The original source code [repository](https://sourceforge.net/projects/dvdisaster/files/dvdisaster) doesn't have it,
|
||||
but [Debian sources](https://sources.debian.org/src/dvdisaster/) does, thanks to the maintainer there.
|
||||
The original [README](README) has been left untouched in this repository.
|
||||
The last upstream version dates back to 2021, and can be found on the [official website](https://dvdisaster.jcea.es).
|
||||
|
||||
This version is built on top of the latest upstream version, with the following notable enhancements:
|
||||
|
||||
- Added pre-defined sizes for BD-R Triple Layer (100GB), BD-R Quadruple Layer (128GB)
|
||||
- Added an option to use more space for ECC on BD-R
|
||||
- Windows build supported again (it was dropped upstream a few versions back)
|
||||
- Added an option to use more space for ECC on BD-R when using RS03 (`--no-bdr-defect-management`)
|
||||
- Re-enabled adaptive reading for RS01 and RS02, and optionally for RS03 on user request (more on that below)
|
||||
- Ability to strip an augmented image from its additional ECC-data
|
||||
- A new CLI-only version, not depending on gtk (`./configure --with-gui=no && make clean && make -j4`)
|
||||
- Non-regression tests on each code change, for Linux64 and Windows32/64, CLI and GUI versions
|
||||
- Prebuilt binaries for Windows32, Windows64, Linux64 (static builds and AppImage builds), CLI and GUI versions
|
||||
- Fixed a bunch of (minor) quirks, a few (minor) bugs, added a couple (minor) features
|
||||
- GUI codebase ported from gtk2 to gtk3 to ensure future-proofness
|
||||
- Windows and macOS builds are supported again, those were dropped upstream a few versions back
|
||||
- Non-regression tests on each code change, along with prebuilt binaries for Linux64, Windows32/64 and macOS, for both CLI and GUI versions
|
||||
- Fixed a bunch of other (minor) quirks, a few (minor) bugs, added a couple other (minor) features
|
||||
|
||||
Please refer to the [CHANGELOG](CHANGELOG) for all the details.
|
||||
|
||||
:loudspeaker: As of 2021, upstream development resumed [on a new website](https://dvdisaster.jcea.es/).
|
||||
We're working with the new team to upstream as much code as possible from this unofficial version.
|
||||
Even if at some point we succeed in upstreaming all our patches, and both codebases are exactly the same,
|
||||
this repository will stay up as it provides automated tests and prebuilt binaries.
|
||||
|
||||
This version will never break compatibility with upstream versions,
|
||||
the goal is to ensure an optical media protected by upstream dvdisaster will still be able to be repaired
|
||||
with this version 10+ years from now. Regression tests are here to ensure this is the case.
|
||||
with this version, decades from now. Regression tests are here to ensure this is the case.
|
||||
|
||||
## :twisted_rightwards_arrows: 3 available protection modes ("codecs")
|
||||
# :twisted_rightwards_arrows: 3 available protection modes ("codecs")
|
||||
|
||||
For a more detailed explanation of the algorithms, please refer to the [codecs specification PDF](documentation/codecs.pdf).
|
||||
|
||||
:one: **RS01** creates error correction files which are stored separately from the image they belong to.
|
||||
:arrow_forward: **RS01** creates error correction files which are stored separately from the image they belong to.
|
||||
The artefact is an **ecc** file, which must be stored on another media than the one we're protecting.
|
||||
|
||||
:two: **RS02** creates error correction data which is added to the medium to protect, we call this *augmenting* the image we're protecting.
|
||||
:arrow_forward: **RS02** creates error correction data which is added to the medium to protect, we call this *augmenting* the image we're protecting.
|
||||
Damaged sectors in the error correction information reduce the data recovering capacity,
|
||||
but do not make recovery impossible - a second medium for keeping or protecting the error correction information is not required.
|
||||
Intelligent adaptive reading is also available when reading a damaged RS02-protected disc: dvdisaster will only attempt
|
||||
to read the minimum amount of required sectors to be able to rebuild the image, using a so-called "divide and conquer"
|
||||
seeking mechanism, cutting off up to 90% of the time required to read and recover a damaged media.
|
||||
|
||||
:three: **RS03** is a further development of RS01 and RS02. It can create both error correction files and
|
||||
:arrow_forward: **RS03** is a further development of RS01 and RS02. It can create both error correction files and
|
||||
augmented images, with the following added features:
|
||||
|
||||
- RS03 can use multiple CPU cores and is therefore **much** faster than RS01/RS02 on modern hardware.
|
||||
- RS03 error correction files are - contrary to RS01, and to a lesser extent RS02 - robust against damage.
|
||||
- RS03 is more robust, but also more restrictive: The augmented image must completely fill the medium now while the size of augmented images can be freely chosen in RS02.
|
||||
The changes for parallel computation and higher robustness make RS03 a bit less space efficient,
|
||||
e.g. RS03 error correction data has slighly less (around -3%) error correction capacity than its RS01/RS02 counterparts on images with equal size.
|
||||
- It can use multiple CPU cores and is therefore **WAY** faster than RS01/RS02 on modern hardware.
|
||||
- RS03 augmented images and error correction files are - contrary to RS01, and to a lesser extent RS02 - robust against
|
||||
damage of the dvdisaster-added recovery data itself
|
||||
|
||||
Rough comparison table:
|
||||
There are, however, a few cons that must be noted for RS03:
|
||||
|
||||
| Codecs | RS01 | RS02 | RS03 |
|
||||
|------------------|--------------------------------|--------------------------------|--------------------------------|
|
||||
| Robustness\* | :star: | :star::star::star: | :star::star::star::star::star: |
|
||||
| Speed | :star::star: | :star: | :star::star::star::star::star: |
|
||||
| Space efficiency | :star::star::star::star::star: | :star::star::star::star::star: | :star::star::star::star: |
|
||||
| Augmented images | :x: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| Separate files | :heavy_check_mark: | :x: | :heavy_check_mark: |
|
||||
- In image mode, the RS03 augmented image file size will be picked up from a predefined list of well-known medium sizes,
|
||||
while the size of augmented images can be freely chosen in RS02. This is the "price to pay" for the added robustness
|
||||
of the correction data.
|
||||
- In image mode, intelligent adaptive reading is not available for RS03-protected images. The "divide and conquer"
|
||||
algorithm will still be used, but dvdisaster will not stop as soon as enough sectors have been recovered to rebuild
|
||||
the image: it'll attempt to read them all until you stop it, or until it tried to read all the sectors. You can still
|
||||
stop it manually and attempt a "verify" of the resulting image file, to see if enough data has been read for recovery,
|
||||
otherwise resuming the adaptive reading until this is the case.
|
||||
- The changes for parallel computation and higher robustness make RS03 a tiny bit less space efficient, e.g. RS03 error
|
||||
correction data has slighly less (around -3%) error correction capacity than RS02 on images with equal size. This is
|
||||
usually considered a cheap price to pay for the added robustness against corruption.
|
||||
|
||||
\*Robustness against corruption of the dvdisaster-added ECC parts themselves
|
||||
# :mag: Comparison table
|
||||
|
||||
This attempts to summarize the differences, pros and cons of each codec:
|
||||
|
||||
| Codecs | RS01 (separate file, obsolete) | RS02 (augmented image) | RS03 (in separate file mode) | RS03 (in augmented image mode) |
|
||||
|--------------------------------------|--------------------------------|--------------------------------|--------------------------------|--------------------------------|
|
||||
| Robustness :one: | :star: | :star::star::star: | :star::star::star::star::star: | :star::star::star::star::star: |
|
||||
| Space efficiency | :star::star: | :star::star::star::star::star: | :star::star::star::star: | :star::star::star::star: |
|
||||
| Computational generation speed :two: | :star::star: | :star::star: | :star::star::star::star::star: | :star::star::star::star::star: |
|
||||
| Computational repair speed :two: | :star::star::star: | :star::star::star: | :star::star::star: | :star::star::star: |
|
||||
| Damaged media recovery speed :three: | :star: | :star::star::star: | :star: | :star: |
|
||||
| Supports customizing redundancy size | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: :four: |
|
||||
|
||||
:one: Here we're talking about the robustness against corruption of the dvdisaster-added ECC parts _themselves_. The higher the ranking, the less it is likely than a few badly located damaged sectors render the whole correction impossible because they affect dvdisaster metadata on-disc. For example, corruption of the first dozens of sectors of an image can make RS02 entirely unusable regardless of the redundancy data originally stored on it.
|
||||
|
||||
:two: When algorithm is CPU-bound, i.e. generating or repairing an image stored on a SSD/NVMe drive where the storage i/o speed is not an issue.
|
||||
|
||||
:three: Using adaptive reading when supported (RS02), limiting the number of damaged sectors that need to be read to what is strictly necessary for repair. Using linear reading otherwise (RS03 and separate file codecs), assuming a badly damaged media, taking into account the time the drive takes to try to read damaged sectors.
|
||||
|
||||
:four: The robustness of RS03 comes at the cost of having to augment images strictly to well-known media sizes, as explained in the previous section above. This usually doesn't make much difference as long as you intend to burn the augmented image to a classic medium (CD-R, DVD-R, BD-R, ...).
|
||||
|
||||
# :bulb: Rationale
|
||||
|
||||
Even if the optical media era is sunsetting now, and has been for a few years, it's still of some value for off-site backups.
|
||||
Even if the peak of the optical media era is well behind us, optical media is still of some value for specific use cases such as off-site backups.
|
||||
In any case, we still have media in our hands that we want to be able to repair, should it be damaged, during the next years/decades.
|
||||
Repairing is actually pretty much the very reason of dvdisaster existence (as long as parity data has been added, of course).
|
||||
The idea of this unofficial version is to ensure dvdisaster doesn't get hard to find, use or compile, ~~should upstream development never resume (we hope it does!)~~
|
||||
This is also why precompiled Windows binaries and a precompiled static CLI-only Linux version are available here.
|
||||
The main purpose of this unofficial version is to ensure dvdisaster doesn't get hard to find, use or compile on recent systems.
|
||||
To this effect, prebuilt binaries are available for the 3 main categories of operating systems, and on top of that we've also fixed a few
|
||||
bugs and added a few tiny features.
|
||||
|
||||
# :hammer: Compiling
|
||||
|
||||
|
||||
2
TODO
@@ -8,7 +8,7 @@ Versions 0.79.x: development releases
|
||||
work in progress (this release):
|
||||
|
||||
- split GUI code from core source to allow for command-line only build (done)
|
||||
- merge patches from St<EFBFBD>phane Lesimple (done) and Debian (done)
|
||||
- merge patches from Stéphane Lesimple (done) and Debian (done)
|
||||
|
||||
upcoming (next stable release):
|
||||
|
||||
|
||||
46
configure
vendored
@@ -26,8 +26,9 @@
|
||||
BASH_BASED_CONFIGURE=./scripts/bash-based-configure
|
||||
BASH_BASED_CONFIGURE_OPTS="--buildtmp=$(pwd)/build $@"
|
||||
REQUIRED_CFLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -I. -pipe"
|
||||
RECOMMENDED_CFLAGS="-O2 -fomit-frame-pointer -Wall -Wno-unknown-warning-option -Wno-deprecated-declarations -Wno-stringop-truncation -Wno-format-zero-length"
|
||||
DEBUG_CFLAGS="-ggdb -Wall"
|
||||
RECOMMENDED_CFLAGS="-Wall -Wno-format-zero-length -Wno-unused-but-set-variable"
|
||||
NODEBUG_CFLAGS="-O2 -fomit-frame-pointer"
|
||||
DEBUG_CFLAGS="-ggdb"
|
||||
|
||||
if test -e $BASH_BASED_CONFIGURE; then
|
||||
source $BASH_BASED_CONFIGURE $BASH_BASED_CONFIGURE_OPTS
|
||||
@@ -40,14 +41,19 @@ fi
|
||||
# Set the package name and version
|
||||
|
||||
PACKAGE dvdisaster 0.79.10
|
||||
DEFINE_INT PATCHLEVEL 1
|
||||
DEFINE_INT PATCHLEVEL 5
|
||||
DEFINE_STRING HAVE_UNSTABLE_RELEASE 1
|
||||
DEFINE_STRING HOMEPAGE "https://dvdisaster.jcea.es"
|
||||
|
||||
# Check for some essential tools.
|
||||
|
||||
REQUIRE_GMAKE
|
||||
REQUIRE_GCC
|
||||
|
||||
if [[ $(uname) =~ Darwin ]]; then
|
||||
REQUIRE_CLANG
|
||||
else
|
||||
REQUIRE_GCC
|
||||
fi
|
||||
|
||||
# Find out and verify the basedir of the source installation,
|
||||
# and where to install the binary.
|
||||
@@ -81,7 +87,7 @@ REQUIRE_GLIB2 2 32 0
|
||||
echo
|
||||
|
||||
if test "$cfg_with_gui" == "yes"; then
|
||||
REQUIRE_GTK2 2 6 0 WITH_THREADS
|
||||
REQUIRE_GTK3 3 4 0 WITH_THREADS
|
||||
fi
|
||||
|
||||
if ! CHECK_INCLUDE locale.h locale || ! CHECK_INCLUDE libintl.h intl ; then
|
||||
@@ -122,6 +128,11 @@ CFG_CFLAGS="$CFG_CFLAGS -D_LARGEFILE64_SOURCE"
|
||||
CHECK_SYMBOL fcntl.h O_LARGEFILE
|
||||
CFG_CFLAGS=$SAVE_CFLAGS
|
||||
|
||||
if [[ $(uname) =~ Darwin ]]; then
|
||||
CFG_CFLAGS="$CFG_CFLAGS -Wno-void-pointer-to-int-cast"
|
||||
CFG_LDFLAGS="$CFG_LDFLAGS -framework CoreFoundation -framework IOKit"
|
||||
fi
|
||||
|
||||
# Machine specific
|
||||
|
||||
echo
|
||||
@@ -144,9 +155,9 @@ if ! EXECUTE_PROGRAM "xgettext --help" xgettext \
|
||||
fi
|
||||
|
||||
if test "$cfg_with_gui" == "yes"; then
|
||||
if ! EXECUTE_PROGRAM "gdk-pixbuf-csource --help" gdk_pixbuf_csource ; then
|
||||
echo "* gdk-pixbuf not installed"
|
||||
echo "* or path to gdk-pixbuf-csource is missing."
|
||||
if ! EXECUTE_PROGRAM "glib-compile-resources --help" gdk_pixbuf_csource ; then
|
||||
echo "* glib-compile-resources not installed"
|
||||
echo "* or path to glib-compile-resources is missing."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
@@ -163,6 +174,8 @@ PRINT_MESSAGE "\nDebugging options (do not use in production system):"
|
||||
WITH_OPTION memdebug no "[no | yes]"
|
||||
WITH_OPTION debug-printf-format no "[no | yes]"
|
||||
WITH_OPTION werror no "[no | yes]"
|
||||
WITH_OPTION debug no "[no | yes]"
|
||||
WITH_OPTION efence no "[no | yes]"
|
||||
|
||||
if test "$cfg_with_debug_printf_format" == "yes"; then
|
||||
# don't use the binary compiled with this,
|
||||
@@ -180,6 +193,12 @@ if test "$cfg_with_werror" == "yes"; then
|
||||
CFG_CFLAGS="$CFG_CFLAGS -Werror"
|
||||
fi
|
||||
|
||||
if test "$cfg_with_debug" == "yes"; then
|
||||
CFG_CFLAGS="$CFG_CFLAGS $DEBUG_CFLAGS"
|
||||
else
|
||||
CFG_CFLAGS="$CFG_CFLAGS $NODEBUG_CFLAGS"
|
||||
fi
|
||||
|
||||
if test "$cfg_with_efence" == "yes"; then
|
||||
if ! CHECK_LIBRARY efence malloc efence; then
|
||||
exit 1;
|
||||
@@ -203,7 +222,14 @@ rm -f src/conftest.c src/method-link.c
|
||||
cfiles="src/method-link.c"
|
||||
ofiles="$BUILDTMP/method-link.o"
|
||||
|
||||
for cfile in src/*.c; do
|
||||
# Only include icons in GUI builds
|
||||
if test "$cfg_with_gui" == "yes"; then
|
||||
icons="$BUILDTMP/inlined-icons.c"
|
||||
else
|
||||
icons=""
|
||||
fi
|
||||
|
||||
for cfile in $icons src/*.c; do
|
||||
cfile_prefix=`echo $cfile | sed -e 's/\.c//'`
|
||||
cfiles="$cfiles $cfile"
|
||||
ofiles="$ofiles $BUILDTMP/$(basename $cfile_prefix.o)"
|
||||
@@ -214,7 +240,7 @@ echo
|
||||
echo -e "\nCFG_CFILES = $cfiles" >> Makefile.config
|
||||
echo "CFG_OFILES = $ofiles" >> Makefile.config
|
||||
if test "$cfg_with_gui" == "yes"; then
|
||||
echo "ICONS = src/inlined-icons.h" >> Makefile.config
|
||||
echo "ICONS = $icons" >> Makefile.config
|
||||
fi
|
||||
|
||||
# Create the method wrapper
|
||||
|
||||
@@ -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" "$@"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
BIN
icons/blank.png
|
Before Width: | Height: | Size: 757 B |
BIN
icons/cd.png
|
Before Width: | Height: | Size: 1.5 KiB |
87
icons/cd.svg
Normal 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
@@ -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 |
@@ -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
|
||||
BIN
icons/create.png
|
Before Width: | Height: | Size: 1.1 KiB |
5
icons/create.svg
Normal 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
@@ -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 |
BIN
icons/fix.png
|
Before Width: | Height: | Size: 801 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 753 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 967 B |
|
Before Width: | Height: | Size: 1.0 KiB |
21
icons/icons.gresource.xml
Normal 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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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 |
|
Before Width: | Height: | Size: 193 B |
|
Before Width: | Height: | Size: 1.1 KiB |
42
icons/open-ecc.svg
Normal 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 |
|
Before Width: | Height: | Size: 1.2 KiB |
34
icons/open-img.svg
Normal 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
@@ -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 |
@@ -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
@@ -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
@@ -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 |
BIN
icons/read.png
|
Before Width: | Height: | Size: 781 B |
9
icons/scan-symbolic.svg
Normal 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 |
@@ -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
|
||||
BIN
icons/scan.png
|
Before Width: | Height: | Size: 406 B |
@@ -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
@@ -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 |
BIN
icons/strip.png
|
Before Width: | Height: | Size: 8.1 KiB |
17
icons/strip.svg
Normal 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 |
|
Before Width: | Height: | Size: 421 B |
16
icons/verify-symbolic.svg
Normal 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 |
@@ -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
|
||||
BIN
icons/verify.png
|
Before Width: | Height: | Size: 969 B |
2159
locale/cs.po
2212
locale/de.po
1972
locale/it.po
2079
locale/pt_BR.po
2097
locale/ru.po
1922
locale/sv.po
26
macinst/Info.plist
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key></key>
|
||||
<string></string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>dvdisaster</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>dvdisaster</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.dvdisaster.dvdisaster</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>dvdisaster</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.79.10</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>CGCG</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>© 2004-2009 Carsten Gnörlich et al</string>
|
||||
</dict>
|
||||
</plist>
|
||||
BIN
macinst/dvdisaster.icns
Normal file
667
misc-gui.c
@@ -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
|
||||
@@ -19,9 +19,7 @@ fi
|
||||
# directory for temporary files; e.g. to keep them away from SSDs
|
||||
TMPDIR=/dev/shm
|
||||
if ! test -d $TMPDIR; then
|
||||
echo "$TMPDIR does not exist."
|
||||
echo "Please create it manually, or edit common.bash"
|
||||
exit 0
|
||||
TMPDIR=/var/tmp
|
||||
fi
|
||||
|
||||
LOGDIR="/dev/shm"
|
||||
@@ -33,7 +31,14 @@ DIFFLOG="$LOGDIR/difflog.txt"
|
||||
NEWLOG="$LOGDIR/newlog.txt"
|
||||
TMPLOG="$LOGDIR/tmplog.txt"
|
||||
|
||||
MD5SUM=md5sum
|
||||
UNAME="$(uname -s)"
|
||||
|
||||
if [ "$UNAME" = Darwin ]; then
|
||||
MD5SUM="md5 -r"
|
||||
else
|
||||
MD5SUM=md5sum
|
||||
fi
|
||||
|
||||
if ! $MD5SUM $RNDSEQ >/dev/null 2>&1; then
|
||||
MD5SUM=../simple-md5sum
|
||||
fi
|
||||
@@ -115,7 +120,7 @@ function file_exists()
|
||||
|
||||
function try()
|
||||
{ local doit=$(grep "${CODEC_PREFIX}_$2 " $CONFIGFILE)
|
||||
if echo "$OS" | grep -q Windows && test -e "$CONFIGFILE_WIN" && grep -q "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN"; then
|
||||
if [[ $OS =~ Windows ]] && test -e "$CONFIGFILE_WIN" && grep -q "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN"; then
|
||||
doit=$(grep "${CODEC_PREFIX}_$2 " "$CONFIGFILE_WIN")
|
||||
fi
|
||||
|
||||
@@ -221,7 +226,12 @@ function run_regtest()
|
||||
testeccopt="-e ${testecc}"
|
||||
fi
|
||||
|
||||
REFLOG=${DATABASE}/${CODEC_PREFIX}_${testsymbol}
|
||||
REFLOG="${DATABASE}/${CODEC_PREFIX}_${testsymbol}"
|
||||
if [ "$UNAME" = "Darwin" ] && [ -f "$REFLOG.darwin" ]; then
|
||||
REFLOG="$REFLOG.darwin"
|
||||
elif [[ $OS =~ Windows ]] && [ -f "$REFLOG.win" ]; then
|
||||
REFLOG="$REFLOG.win"
|
||||
fi
|
||||
|
||||
if test "$gui_mode" == "false"; then
|
||||
rm -f $NEWLOG
|
||||
@@ -253,16 +263,14 @@ function run_regtest()
|
||||
filter=cat
|
||||
echo "$options" | grep -qw SORTED && filter=sort
|
||||
|
||||
# for Windows
|
||||
if [[ $testsymbol =~ _no_device$ ]]; then
|
||||
sed -i -re "s=device $NON_EXISTENT_DEVICE\.=/dev/sdz: No such file or directory=" $NEWLOG
|
||||
fi
|
||||
|
||||
# for Windows, just remove any path we find:
|
||||
sed -i -re "s=[A-Z]:/[A-Za-z0-9_/-]+/==g" $NEWLOG
|
||||
|
||||
# remove all paths to get reproducible output:
|
||||
sed -i -re "s=$TMPDIR/*==g;s=$ISODIR/*==g" $NEWLOG
|
||||
sed -i -re "s=$TMPDIR/*==g;s=$ISODIR/*==g;s=regtest/==g" $NEWLOG
|
||||
|
||||
# remote tmp path of github actions
|
||||
sed -i -re "s=[-A-Za-z0-9_~]+/AppData/Local/Temp/==g" $NEWLOG
|
||||
|
||||
if ! diff <(tail -n +3 $REFLOG | $filter) <(cat $NEWLOG | $filter) >${DIFFLOG}; then
|
||||
if [ "$REGTEST_NO_UTF8" = 1 ]; then
|
||||
|
||||
12
regtest/database/RS01_adaptive_no_device.darwin
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open /dev/sdz ().
|
||||
|
||||
12
regtest/database/RS01_adaptive_no_device.win
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open device V:.
|
||||
|
||||
12
regtest/database/RS01_adaptive_no_device_access.darwin
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open sdz ().
|
||||
|
||||
12
regtest/database/RS01_read_no_device.darwin
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open /dev/sdz ().
|
||||
|
||||
12
regtest/database/RS01_read_no_device.win
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open device V:.
|
||||
|
||||
12
regtest/database/RS01_read_no_device_access.darwin
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open sdz ().
|
||||
|
||||
12
regtest/database/RS01_scan_no_device.darwin
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open /dev/sdz ().
|
||||
|
||||
12
regtest/database/RS01_scan_no_device.win
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open device V:.
|
||||
|
||||
12
regtest/database/RS01_scan_no_device_access.darwin
Normal file
@@ -0,0 +1,12 @@
|
||||
ignore
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
|
||||
*
|
||||
* dvdisaster - can not continue:
|
||||
*
|
||||
Could not open sdz ().
|
||||
|
||||
@@ -1,522 +0,0 @@
|
||||
ca01afa400e2244fc4797cae542888d1
|
||||
ignore
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This
|
||||
is free software and you are welcome to redistribute it
|
||||
under the conditions of the GNU GENERAL PUBLIC LICENSE.
|
||||
See the file "COPYING" for further information.
|
||||
# *** OpenImageFromDevice(sim-cd) ***
|
||||
# InquireDevice returned: Simulated CD drive 1.00
|
||||
|
||||
Device: sim-cd, Simulated CD drive 1.00
|
||||
# *** query_type(Simulated CD drive 1.00, 0) ***
|
||||
# *** get_configuration(Simulated CD drive 1.00) ***
|
||||
# 8 data len, 9 current
|
||||
-> profile 9: CD-R
|
||||
# trying READ DISC INFORMATION for size
|
||||
# size returned is 32
|
||||
# trying READ DISC INFORMATION for real info
|
||||
0000: 00 20 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 . ...... ........
|
||||
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
|
||||
# status is 1e, disc type 0
|
||||
#CD: starting media probe
|
||||
#CD: querying size of READ TOC/PMA/ATIP (for TOC)
|
||||
#CD: size returned is 12
|
||||
#CD: querying real READ TOC/PMA/ATIP (for TOC)
|
||||
0000: 00 0a 00 00 00 14 00 00 00 00 00 00 ........ ....
|
||||
#CD: control is 0x14
|
||||
#CD: querying size of READ TOC/PMA/ATIP (for full TOC)
|
||||
# Warning: Realigning length from 26 to 24
|
||||
#CD: size returned is 24
|
||||
#CD: querying real READ TOC/PMA/ATIP (for full TOC)
|
||||
0000: 00 18 00 01 00 00 00 a0 00 00 00 00 00 00 00 00 ........ ........
|
||||
0010: 00 00 00 00 00 00 00 00 ........
|
||||
#CD: 1 sessions
|
||||
#CD: CD medium detected, type: CD-R mode 1
|
||||
# query_type() returned.
|
||||
# deciding reading strategy...
|
||||
Using READ CD.
|
||||
GetImageFingerprint(16): read & cached
|
||||
|
||||
ExamineUDF(Device: Simulated CD drive 1.00)
|
||||
Examining the ISO file system...
|
||||
Sector 16:
|
||||
Volume descriptor type = 1
|
||||
Volume descriptor version = 1
|
||||
Standard identifier = CD001
|
||||
-> primary volume descriptor:
|
||||
System identifier : | |
|
||||
Volume identifier : |RANDOM IMAGE |
|
||||
Volume space size : 21000 sectors
|
||||
Volume set size : 1
|
||||
Volume sequence size : 1
|
||||
Logical block size : 2048
|
||||
Path table size : 10 bytes
|
||||
L-Path table location : 19
|
||||
Opt L-Path table location : 0
|
||||
M-Path table location : 20
|
||||
Opt M-Path table location : 0
|
||||
Volume creation date/time : 16-07-2006 10:35:46.23
|
||||
Volume modification d/t : 16-07-2006 10:35:46.23
|
||||
Volume expiration d/t : 16-07-2106 10:35:46.23
|
||||
Volume effective d/t : 16-07-2006 10:35:46.23
|
||||
File structure version : 1
|
||||
Sector 17:
|
||||
Volume descriptor type = 2
|
||||
Volume descriptor version = 1
|
||||
Standard identifier = CD001
|
||||
-> supplementary volume descriptor: *skipped*
|
||||
Sector 18:
|
||||
Volume descriptor type = 255
|
||||
Volume descriptor version = 1
|
||||
Standard identifier = CD001
|
||||
-> volume descriptor set terminator;
|
||||
end of ISO file system parsing.
|
||||
Examining the UDF file system...
|
||||
not yet implemented.
|
||||
|
||||
# *** read_capacity(Simulated CD drive 1.00) ***
|
||||
-> 24989
|
||||
ExamineECC() started
|
||||
...trying RS01
|
||||
...trying RS02
|
||||
RS02Recognize: medium sim-cd
|
||||
try_sector: trying sector 21000
|
||||
try_sector: no cookie, skipping current modulo
|
||||
try_sector: trying sector 20850
|
||||
try_sector: no cookie, skipping current modulo
|
||||
RS02Recognize: quick RS02 search, attempting up to 3 sector reads max
|
||||
Medium rewriteable: FALSE
|
||||
FindHeaderInMedium: Trying modulo 4611686018427387904
|
||||
FindHeaderInMedium: Trying modulo 2305843009213693952
|
||||
FindHeaderInMedium: Trying modulo 1152921504606846976
|
||||
FindHeaderInMedium: Trying modulo 576460752303423488
|
||||
FindHeaderInMedium: Trying modulo 288230376151711744
|
||||
FindHeaderInMedium: Trying modulo 144115188075855872
|
||||
FindHeaderInMedium: Trying modulo 72057594037927936
|
||||
FindHeaderInMedium: Trying modulo 36028797018963968
|
||||
FindHeaderInMedium: Trying modulo 18014398509481984
|
||||
FindHeaderInMedium: Trying modulo 9007199254740992
|
||||
FindHeaderInMedium: Trying modulo 4503599627370496
|
||||
FindHeaderInMedium: Trying modulo 2251799813685248
|
||||
FindHeaderInMedium: Trying modulo 1125899906842624
|
||||
FindHeaderInMedium: Trying modulo 562949953421312
|
||||
FindHeaderInMedium: Trying modulo 281474976710656
|
||||
FindHeaderInMedium: Trying modulo 140737488355328
|
||||
FindHeaderInMedium: Trying modulo 70368744177664
|
||||
FindHeaderInMedium: Trying modulo 35184372088832
|
||||
FindHeaderInMedium: Trying modulo 17592186044416
|
||||
FindHeaderInMedium: Trying modulo 8796093022208
|
||||
FindHeaderInMedium: Trying modulo 4398046511104
|
||||
FindHeaderInMedium: Trying modulo 2199023255552
|
||||
FindHeaderInMedium: Trying modulo 1099511627776
|
||||
FindHeaderInMedium: Trying modulo 549755813888
|
||||
FindHeaderInMedium: Trying modulo 274877906944
|
||||
FindHeaderInMedium: Trying modulo 137438953472
|
||||
FindHeaderInMedium: Trying modulo 68719476736
|
||||
FindHeaderInMedium: Trying modulo 34359738368
|
||||
FindHeaderInMedium: Trying modulo 17179869184
|
||||
FindHeaderInMedium: Trying modulo 8589934592
|
||||
FindHeaderInMedium: Trying modulo 4294967296
|
||||
FindHeaderInMedium: Trying modulo 2147483648
|
||||
FindHeaderInMedium: Trying modulo 1073741824
|
||||
FindHeaderInMedium: Trying modulo 536870912
|
||||
FindHeaderInMedium: Trying modulo 268435456
|
||||
FindHeaderInMedium: Trying modulo 134217728
|
||||
FindHeaderInMedium: Trying modulo 67108864
|
||||
FindHeaderInMedium: Trying modulo 33554432
|
||||
FindHeaderInMedium: Trying modulo 16777216
|
||||
FindHeaderInMedium: Trying modulo 8388608
|
||||
FindHeaderInMedium: Trying modulo 4194304
|
||||
FindHeaderInMedium: Trying modulo 2097152
|
||||
FindHeaderInMedium: Trying modulo 1048576
|
||||
FindHeaderInMedium: Trying modulo 524288
|
||||
FindHeaderInMedium: Trying modulo 262144
|
||||
FindHeaderInMedium: Trying modulo 131072
|
||||
FindHeaderInMedium: Trying modulo 65536
|
||||
FindHeaderInMedium: Trying modulo 32768
|
||||
FindHeaderInMedium: Trying modulo 16384
|
||||
try_sector: trying sector 16384
|
||||
try_sector: no cookie, skipping current modulo
|
||||
FindHeaderInMedium: Trying modulo 8192
|
||||
try_sector: trying sector 24576
|
||||
try_sector: no cookie, skipping current modulo
|
||||
FindHeaderInMedium: Trying modulo 4096
|
||||
Sector 24576 cached; skipping modulo
|
||||
FindHeaderInMedium: Trying modulo 2048
|
||||
Sector 24576 cached; skipping modulo
|
||||
FindHeaderInMedium: Trying modulo 1024
|
||||
Sector 24576 cached; skipping modulo
|
||||
FindHeaderInMedium: Trying modulo 512
|
||||
Sector 24576 cached; skipping modulo
|
||||
FindHeaderInMedium: Trying modulo 256
|
||||
try_sector: trying sector 24832
|
||||
try_sector: no cookie, skipping current modulo
|
||||
...trying RS03
|
||||
RS03RecognizeImage: medium sim-cd
|
||||
FindRS03HeaderInImage: medium sim-cd
|
||||
RS03RecognizeImage: No EH, entering exhaustive search
|
||||
Warning: image size set to 25000 for debugging!
|
||||
.. trying layer size 98
|
||||
Scanning layers for signatures.
|
||||
- layer slice 0
|
||||
RS03: try number = 1, reading sector 8232
|
||||
RS03: try number = 2, reading sector 8330
|
||||
RS03: try number = 3, reading sector 8428
|
||||
RS03: try number = 4, reading sector 8526
|
||||
RS03: try number = 5, reading sector 8624
|
||||
RS03: try number = 6, reading sector 8722
|
||||
RS03: try number = 7, reading sector 8820
|
||||
RS03: try number = 8, reading sector 8918
|
||||
RS03: try number = 9, reading sector 9016
|
||||
RS03: try number = 10, reading sector 9114
|
||||
RS03: try number = 11, reading sector 9212
|
||||
RS03: try number = 12, reading sector 9310
|
||||
RS03: try number = 13, reading sector 9408
|
||||
RS03: try number = 14, reading sector 9506
|
||||
RS03: try number = 15, reading sector 9604
|
||||
RS03: try number = 16, reading sector 9702
|
||||
RS03: try number = 17, reading sector 9800
|
||||
RS03: try number = 18, reading sector 9898
|
||||
RS03: try number = 19, reading sector 9996
|
||||
RS03: try number = 20, reading sector 10094
|
||||
RS03: try number = 21, reading sector 10192
|
||||
RS03: try number = 22, reading sector 10290
|
||||
RS03: try number = 23, reading sector 10388
|
||||
RS03: try number = 24, reading sector 10486
|
||||
RS03: try number = 25, reading sector 10584
|
||||
RS03: try number = 26, reading sector 10682
|
||||
RS03: try number = 27, reading sector 10780
|
||||
RS03: try number = 28, reading sector 10878
|
||||
RS03: try number = 29, reading sector 10976
|
||||
RS03: try number = 30, reading sector 11074
|
||||
RS03: try number = 31, reading sector 11172
|
||||
RS03: try number = 32, reading sector 11270
|
||||
RS03: try number = 33, reading sector 11368
|
||||
RS03: try number = 34, reading sector 11466
|
||||
RS03: try number = 35, reading sector 11564
|
||||
RS03: try number = 36, reading sector 11662
|
||||
RS03: try number = 37, reading sector 11760
|
||||
RS03: try number = 38, reading sector 11858
|
||||
RS03: try number = 39, reading sector 11956
|
||||
RS03: try number = 40, reading sector 12054
|
||||
RS03: try number = 41, reading sector 12152
|
||||
RS03: try number = 42, reading sector 12250
|
||||
RS03: try number = 43, reading sector 12348
|
||||
RS03: try number = 44, reading sector 12446
|
||||
RS03: try number = 45, reading sector 12544
|
||||
RS03: try number = 46, reading sector 12642
|
||||
RS03: try number = 47, reading sector 12740
|
||||
RS03: try number = 48, reading sector 12838
|
||||
RS03: try number = 49, reading sector 12936
|
||||
RS03: try number = 50, reading sector 13034
|
||||
RS03: try number = 51, reading sector 13132
|
||||
RS03: try number = 52, reading sector 13230
|
||||
RS03: try number = 53, reading sector 13328
|
||||
RS03: try number = 54, reading sector 13426
|
||||
RS03: try number = 55, reading sector 13524
|
||||
RS03: try number = 56, reading sector 13622
|
||||
RS03: try number = 57, reading sector 13720
|
||||
RS03: try number = 58, reading sector 13818
|
||||
RS03: try number = 59, reading sector 13916
|
||||
RS03: try number = 60, reading sector 14014
|
||||
RS03: try number = 61, reading sector 14112
|
||||
RS03: try number = 62, reading sector 14210
|
||||
RS03: try number = 63, reading sector 14308
|
||||
RS03: try number = 64, reading sector 14406
|
||||
RS03: try number = 65, reading sector 14504
|
||||
RS03: try number = 66, reading sector 14602
|
||||
RS03: try number = 67, reading sector 14700
|
||||
RS03: try number = 68, reading sector 14798
|
||||
RS03: try number = 69, reading sector 14896
|
||||
RS03: try number = 70, reading sector 14994
|
||||
RS03: try number = 71, reading sector 15092
|
||||
RS03: try number = 72, reading sector 15190
|
||||
RS03: try number = 73, reading sector 15288
|
||||
RS03: try number = 74, reading sector 15386
|
||||
RS03: try number = 75, reading sector 15484
|
||||
RS03: try number = 76, reading sector 15582
|
||||
RS03: try number = 77, reading sector 15680
|
||||
RS03: try number = 78, reading sector 15778
|
||||
RS03: try number = 79, reading sector 15876
|
||||
RS03: try number = 80, reading sector 15974
|
||||
RS03: try number = 81, reading sector 16072
|
||||
RS03: try number = 82, reading sector 16170
|
||||
RS03: try number = 83, reading sector 16268
|
||||
RS03: try number = 84, reading sector 16366
|
||||
RS03: try number = 85, reading sector 16464
|
||||
RS03: try number = 86, reading sector 16562
|
||||
RS03: try number = 87, reading sector 16660
|
||||
RS03: try number = 88, reading sector 16758
|
||||
RS03: try number = 89, reading sector 16856
|
||||
RS03: try number = 90, reading sector 16954
|
||||
RS03: try number = 91, reading sector 17052
|
||||
RS03: try number = 92, reading sector 17150
|
||||
RS03: try number = 93, reading sector 17248
|
||||
RS03: try number = 94, reading sector 17346
|
||||
RS03: try number = 95, reading sector 17444
|
||||
RS03: try number = 96, reading sector 17542
|
||||
RS03: try number = 97, reading sector 17640
|
||||
RS03: try number = 98, reading sector 17738
|
||||
RS03: try number = 99, reading sector 17836
|
||||
RS03: try number = 100, reading sector 17934
|
||||
RS03: try number = 101, reading sector 18032
|
||||
RS03: try number = 102, reading sector 18130
|
||||
RS03: try number = 103, reading sector 18228
|
||||
RS03: try number = 104, reading sector 18326
|
||||
RS03: try number = 105, reading sector 18424
|
||||
RS03: try number = 106, reading sector 18522
|
||||
RS03: try number = 107, reading sector 18620
|
||||
RS03: try number = 108, reading sector 18718
|
||||
RS03: try number = 109, reading sector 18816
|
||||
RS03: try number = 110, reading sector 18914
|
||||
RS03: try number = 111, reading sector 19012
|
||||
RS03: try number = 112, reading sector 19110
|
||||
RS03: try number = 113, reading sector 19208
|
||||
RS03: try number = 114, reading sector 19306
|
||||
RS03: try number = 115, reading sector 19404
|
||||
RS03: try number = 116, reading sector 19502
|
||||
RS03: try number = 117, reading sector 19600
|
||||
RS03: try number = 118, reading sector 19698
|
||||
RS03: try number = 119, reading sector 19796
|
||||
RS03: try number = 120, reading sector 19894
|
||||
RS03: try number = 121, reading sector 19992
|
||||
RS03: try number = 122, reading sector 20090
|
||||
RS03: try number = 123, reading sector 20188
|
||||
RS03: try number = 124, reading sector 20286
|
||||
RS03: try number = 125, reading sector 20384
|
||||
RS03: try number = 126, reading sector 20482
|
||||
RS03: try number = 127, reading sector 20580
|
||||
RS03: try number = 128, reading sector 20678
|
||||
RS03: try number = 129, reading sector 20776
|
||||
RS03: try number = 130, reading sector 20874
|
||||
RS03: try number = 131, reading sector 20972
|
||||
RS03: try number = 132, reading sector 21070
|
||||
** Success: sector 21070, rediscovered format with 39 roots
|
||||
...augmented image found
|
||||
# Calling query_size()
|
||||
# *** query_size(Simulated CD drive 1.00) ***
|
||||
Medium size obtained from ECC header: 24990 sectors
|
||||
# returned: 24990 sectors
|
||||
Medium "Random Image": CD-R mode 1, 24990 sectors, Ecc, created 16-07-2006.
|
||||
|
||||
Creating new rs03i-tmp.iso image.
|
||||
Reading CRC information from ecc data (RS03) ... Calculated layout for RS03 image:
|
||||
data sectors = 21000
|
||||
data padding = 68
|
||||
layer size = 98
|
||||
total sectors = 24990
|
||||
medium capacity = 0
|
||||
header position = 21000
|
||||
first CRC sector = 21070
|
||||
first ECC sector = 21168
|
||||
ndata = 216
|
||||
nroots = 39 (18.1%)
|
||||
|
||||
done.
|
||||
* CRC error, sector: 21000
|
||||
Current sector: 22032. This session: NewSectorsReadOK=22032, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22048. This session: NewSectorsReadOK=22048, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22064. This session: NewSectorsReadOK=22064, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22080. This session: NewSectorsReadOK=22080, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22096. This session: NewSectorsReadOK=22096, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22112. This session: NewSectorsReadOK=22112, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22128. This session: NewSectorsReadOK=22128, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22144. This session: NewSectorsReadOK=22144, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22160. This session: NewSectorsReadOK=22160, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22176. This session: NewSectorsReadOK=22176, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22192. This session: NewSectorsReadOK=22192, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22208. This session: NewSectorsReadOK=22208, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22224. This session: NewSectorsReadOK=22224, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22240. This session: NewSectorsReadOK=22240, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22256. This session: NewSectorsReadOK=22256, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22272. This session: NewSectorsReadOK=22272, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22288. This session: NewSectorsReadOK=22288, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22304. This session: NewSectorsReadOK=22304, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22320. This session: NewSectorsReadOK=22320, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22336. This session: NewSectorsReadOK=22336, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22352. This session: NewSectorsReadOK=22352, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22368. This session: NewSectorsReadOK=22368, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22384. This session: NewSectorsReadOK=22384, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22400. This session: NewSectorsReadOK=22400, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22416. This session: NewSectorsReadOK=22416, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22432. This session: NewSectorsReadOK=22432, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22448. This session: NewSectorsReadOK=22448, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22464. This session: NewSectorsReadOK=22464, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22480. This session: NewSectorsReadOK=22480, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22496. This session: NewSectorsReadOK=22496, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22512. This session: NewSectorsReadOK=22512, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22528. This session: NewSectorsReadOK=22528, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22544. This session: NewSectorsReadOK=22544, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22560. This session: NewSectorsReadOK=22560, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22576. This session: NewSectorsReadOK=22576, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22592. This session: NewSectorsReadOK=22592, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22608. This session: NewSectorsReadOK=22608, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22624. This session: NewSectorsReadOK=22624, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22640. This session: NewSectorsReadOK=22640, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22656. This session: NewSectorsReadOK=22656, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22672. This session: NewSectorsReadOK=22672, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22688. This session: NewSectorsReadOK=22688, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22704. This session: NewSectorsReadOK=22704, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22720. This session: NewSectorsReadOK=22720, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22736. This session: NewSectorsReadOK=22736, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22752. This session: NewSectorsReadOK=22752, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22768. This session: NewSectorsReadOK=22768, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22784. This session: NewSectorsReadOK=22784, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22800. This session: NewSectorsReadOK=22800, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22816. This session: NewSectorsReadOK=22816, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22832. This session: NewSectorsReadOK=22832, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22848. This session: NewSectorsReadOK=22848, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22864. This session: NewSectorsReadOK=22864, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22880. This session: NewSectorsReadOK=22880, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22896. This session: NewSectorsReadOK=22896, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22912. This session: NewSectorsReadOK=22912, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22928. This session: NewSectorsReadOK=22928, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22944. This session: NewSectorsReadOK=22944, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22960. This session: NewSectorsReadOK=22960, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22976. This session: NewSectorsReadOK=22976, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 22992. This session: NewSectorsReadOK=22992, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23008. This session: NewSectorsReadOK=23008, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23024. This session: NewSectorsReadOK=23024, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23040. This session: NewSectorsReadOK=23040, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23056. This session: NewSectorsReadOK=23056, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23072. This session: NewSectorsReadOK=23072, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23088. This session: NewSectorsReadOK=23088, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23104. This session: NewSectorsReadOK=23104, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23120. This session: NewSectorsReadOK=23120, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23136. This session: NewSectorsReadOK=23136, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23152. This session: NewSectorsReadOK=23152, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23168. This session: NewSectorsReadOK=23168, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23184. This session: NewSectorsReadOK=23184, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23200. This session: NewSectorsReadOK=23200, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23216. This session: NewSectorsReadOK=23216, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23232. This session: NewSectorsReadOK=23232, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23248. This session: NewSectorsReadOK=23248, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23264. This session: NewSectorsReadOK=23264, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23280. This session: NewSectorsReadOK=23280, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23296. This session: NewSectorsReadOK=23296, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23312. This session: NewSectorsReadOK=23312, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23328. This session: NewSectorsReadOK=23328, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23344. This session: NewSectorsReadOK=23344, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23360. This session: NewSectorsReadOK=23360, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23376. This session: NewSectorsReadOK=23376, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23392. This session: NewSectorsReadOK=23392, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23408. This session: NewSectorsReadOK=23408, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23424. This session: NewSectorsReadOK=23424, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23440. This session: NewSectorsReadOK=23440, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23456. This session: NewSectorsReadOK=23456, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23472. This session: NewSectorsReadOK=23472, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23488. This session: NewSectorsReadOK=23488, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23504. This session: NewSectorsReadOK=23504, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23520. This session: NewSectorsReadOK=23520, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23536. This session: NewSectorsReadOK=23536, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23552. This session: NewSectorsReadOK=23552, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23568. This session: NewSectorsReadOK=23568, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23584. This session: NewSectorsReadOK=23584, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23600. This session: NewSectorsReadOK=23600, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23616. This session: NewSectorsReadOK=23616, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23632. This session: NewSectorsReadOK=23632, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23648. This session: NewSectorsReadOK=23648, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23664. This session: NewSectorsReadOK=23664, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23680. This session: NewSectorsReadOK=23680, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23696. This session: NewSectorsReadOK=23696, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23712. This session: NewSectorsReadOK=23712, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23728. This session: NewSectorsReadOK=23728, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23744. This session: NewSectorsReadOK=23744, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23760. This session: NewSectorsReadOK=23760, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23776. This session: NewSectorsReadOK=23776, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23792. This session: NewSectorsReadOK=23792, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23808. This session: NewSectorsReadOK=23808, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23824. This session: NewSectorsReadOK=23824, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23840. This session: NewSectorsReadOK=23840, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23856. This session: NewSectorsReadOK=23856, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23872. This session: NewSectorsReadOK=23872, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23888. This session: NewSectorsReadOK=23888, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23904. This session: NewSectorsReadOK=23904, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23920. This session: NewSectorsReadOK=23920, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23936. This session: NewSectorsReadOK=23936, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23952. This session: NewSectorsReadOK=23952, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23968. This session: NewSectorsReadOK=23968, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 23984. This session: NewSectorsReadOK=23984, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24000. This session: NewSectorsReadOK=24000, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24016. This session: NewSectorsReadOK=24016, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24032. This session: NewSectorsReadOK=24032, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24048. This session: NewSectorsReadOK=24048, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24064. This session: NewSectorsReadOK=24064, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24080. This session: NewSectorsReadOK=24080, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24096. This session: NewSectorsReadOK=24096, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24112. This session: NewSectorsReadOK=24112, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24128. This session: NewSectorsReadOK=24128, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24144. This session: NewSectorsReadOK=24144, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24160. This session: NewSectorsReadOK=24160, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24176. This session: NewSectorsReadOK=24176, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24192. This session: NewSectorsReadOK=24192, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24208. This session: NewSectorsReadOK=24208, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24224. This session: NewSectorsReadOK=24224, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24240. This session: NewSectorsReadOK=24240, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24256. This session: NewSectorsReadOK=24256, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24272. This session: NewSectorsReadOK=24272, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24288. This session: NewSectorsReadOK=24288, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24304. This session: NewSectorsReadOK=24304, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24320. This session: NewSectorsReadOK=24320, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24336. This session: NewSectorsReadOK=24336, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24352. This session: NewSectorsReadOK=24352, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24368. This session: NewSectorsReadOK=24368, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24384. This session: NewSectorsReadOK=24384, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24400. This session: NewSectorsReadOK=24400, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24416. This session: NewSectorsReadOK=24416, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24432. This session: NewSectorsReadOK=24432, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24448. This session: NewSectorsReadOK=24448, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24464. This session: NewSectorsReadOK=24464, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24480. This session: NewSectorsReadOK=24480, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24496. This session: NewSectorsReadOK=24496, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24512. This session: NewSectorsReadOK=24512, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24528. This session: NewSectorsReadOK=24528, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24544. This session: NewSectorsReadOK=24544, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24560. This session: NewSectorsReadOK=24560, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24576. This session: NewSectorsReadOK=24576, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24592. This session: NewSectorsReadOK=24592, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24608. This session: NewSectorsReadOK=24608, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24624. This session: NewSectorsReadOK=24624, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24640. This session: NewSectorsReadOK=24640, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24656. This session: NewSectorsReadOK=24656, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24672. This session: NewSectorsReadOK=24672, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24688. This session: NewSectorsReadOK=24688, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24704. This session: NewSectorsReadOK=24704, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24720. This session: NewSectorsReadOK=24720, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24736. This session: NewSectorsReadOK=24736, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24752. This session: NewSectorsReadOK=24752, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24768. This session: NewSectorsReadOK=24768, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24784. This session: NewSectorsReadOK=24784, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24800. This session: NewSectorsReadOK=24800, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24816. This session: NewSectorsReadOK=24816, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24832. This session: NewSectorsReadOK=24832, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24848. This session: NewSectorsReadOK=24848, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24864. This session: NewSectorsReadOK=24864, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24880. This session: NewSectorsReadOK=24880, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24896. This session: NewSectorsReadOK=24896, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24912. This session: NewSectorsReadOK=24912, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24928. This session: NewSectorsReadOK=24928, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24944. This session: NewSectorsReadOK=24944, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24960. This session: NewSectorsReadOK=24960, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24976. This session: NewSectorsReadOK=24976, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24977. This session: NewSectorsReadOK=24977, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24978. This session: NewSectorsReadOK=24978, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24979. This session: NewSectorsReadOK=24979, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24980. This session: NewSectorsReadOK=24980, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24981. This session: NewSectorsReadOK=24981, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24982. This session: NewSectorsReadOK=24982, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24983. This session: NewSectorsReadOK=24983, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24984. This session: NewSectorsReadOK=24984, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24985. This session: NewSectorsReadOK=24985, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24986. This session: NewSectorsReadOK=24986, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24987. This session: NewSectorsReadOK=24987, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24988. This session: NewSectorsReadOK=24988, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24989. This session: NewSectorsReadOK=24989, ReadErrors=0, CRCErrors=1
|
||||
Current sector: 24990. This session: NewSectorsReadOK=24990, ReadErrors=0, CRCErrors=1
|
||||
|
||||
1 CRC errors.
|
||||
CrcBuf contents, image path none (medium):
|
||||
crcSize: 24990, dataSectors: 21000, coveredSectors: 21070, allSectors: 24990
|
||||
md5State: invalid
|
||||
fp sector: 16; 15c0fd35a0cfa0f83b9ccbd8604c2592
|
||||
missing crcs: 0
|
||||
@@ -1,5 +1,5 @@
|
||||
# Bash based configure - library of test functions
|
||||
# Copyright (C) 2004-2016 Carsten Gn<47>rlich
|
||||
# Copyright (C) 2004-2016 Carsten Gn<47>rlich
|
||||
# Copyright (C) 2019-2021 The dvdisaster development team.
|
||||
#
|
||||
# Email: support@dvdisaster.org
|
||||
@@ -127,6 +127,15 @@ case "$cfg_uname" in
|
||||
}
|
||||
;;
|
||||
|
||||
Darwin*) cfg_system=darwin
|
||||
CFG_SYS_OPTIONS="-DSYS_DARWIN"
|
||||
CFG_SYS_NAME="-DSYS_NAME=\\\"Darwin\\\""
|
||||
CFG_EXE_SUFFIX=""
|
||||
function add_linker_flags()
|
||||
{ lflags_return="-L$1 -Wl,-rpath,$1 $2"
|
||||
}
|
||||
;;
|
||||
|
||||
FreeBSD*) cfg_system=freebsd-std
|
||||
CFG_SYS_OPTIONS="-DSYS_FREEBSD"
|
||||
CFG_SYS_NAME="-DSYS_NAME=\\\"FreeBSD\\\""
|
||||
@@ -348,6 +357,42 @@ function REQUIRE_GMAKE()
|
||||
exit 1;
|
||||
}
|
||||
|
||||
function REQUIRE_CLANG()
|
||||
{
|
||||
if test -n "$cfg_help_mode"; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo -n "Checking for clang: "
|
||||
|
||||
# Try $CC first
|
||||
|
||||
if test -n "$CC" && $CC -v >/dev/null 2>&1; then
|
||||
if ($CC -v 2>&1 | grep "clang") > /dev/null 2>&1 ; then
|
||||
CC=`type -P $CC`
|
||||
echo "yes ($CC)"
|
||||
echo "CC = $CC" >>Makefile.config
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Try clang binary
|
||||
|
||||
CC=clang
|
||||
if test -n "$CC" && $CC -v >/dev/null 2>&1; then
|
||||
if ($CC -v 2>&1 | grep "clang") > /dev/null 2>&1 ; then
|
||||
CC=`type -P $CC`
|
||||
echo "yes ($CC)"
|
||||
echo "CC = $CC" >>Makefile.config
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "no"
|
||||
echo "This package requires the Clang C compiler (clang)."
|
||||
exit 1;
|
||||
}
|
||||
|
||||
function REQUIRE_GCC()
|
||||
{
|
||||
if test -n "$cfg_help_mode"; then
|
||||
@@ -1432,13 +1477,13 @@ EOF
|
||||
}
|
||||
|
||||
#
|
||||
# Require the GTK2 includes and libraries.
|
||||
# Require the GTK3 includes and libraries.
|
||||
# Unlike with the other packages, we don't have to fid out about the includes
|
||||
# and libraries by ourselves, but just query pkg-config about them.
|
||||
# It seems that people have more trouble with getting GTK+ to work
|
||||
# than with other toolkits, so we try a bit harder to diagnose them here.
|
||||
|
||||
function REQUIRE_GTK2()
|
||||
function REQUIRE_GTK3()
|
||||
{ local want_major="$1"
|
||||
local want_minor="$2"
|
||||
local want_micro="$3"
|
||||
@@ -1451,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
|
||||
@@ -1466,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.
|
||||
@@ -1488,17 +1533,17 @@ EOF
|
||||
|
||||
# Do a test compile to make sure they did not return some junk
|
||||
|
||||
CFG_GTK2_CFLAGS=`pkg-config --cflags gtk+-2.0`
|
||||
CFG_GTK2_LIBS=`pkg-config $threads --libs gtk+-2.0`
|
||||
CFG_GTK3_CFLAGS=`pkg-config --cflags gtk+-3.0`
|
||||
CFG_GTK3_LIBS=`pkg-config $threads --libs gtk+-3.0`
|
||||
|
||||
CFG_GTK2_BINDIR=`type -P pkg-config`
|
||||
CFG_GTK2_BINDIR=`echo $CFG_GTK2_BINDIR | sed -e 's/.exe//' | sed -e 's/\/pkg-config//'`
|
||||
CFG_GTK3_BINDIR=`which pkg-config`
|
||||
CFG_GTK3_BINDIR=`echo $CFG_GTK3_BINDIR | sed -e 's/.exe//' | sed -e 's/\/pkg-config//'`
|
||||
|
||||
CFG_CFLAGS="$CFG_CFLAGS $CFG_GTK2_CFLAGS"
|
||||
CFG_LIBS="$CFG_LIBS $CFG_GTK2_LIBS"
|
||||
CFG_CFLAGS="$CFG_CFLAGS $CFG_GTK3_CFLAGS"
|
||||
CFG_LIBS="$CFG_LIBS $CFG_GTK3_LIBS"
|
||||
|
||||
cat >conftest.c <<EOF
|
||||
#include <gtk/gtkversion.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
CPPABUSE GTK_MAJOR_VERSION.GTK_MINOR_VERSION.GTK_MICRO_VERSION
|
||||
EOF
|
||||
@@ -1523,9 +1568,9 @@ EOF
|
||||
|
||||
# Successfully finished
|
||||
|
||||
echo "CFG_GTK2_CFLAGS = $CFG_GTK2_CFLAGS" >> Makefile.config
|
||||
echo "CFG_GTK2_LIBS = $CFG_GTK2_LIBS" >> Makefile.config
|
||||
echo "CFG_GTK2_BINDIR = $CFG_GTK2_BINDIR" >> Makefile.config
|
||||
echo "CFG_GTK3_CFLAGS = $CFG_GTK3_CFLAGS" >> Makefile.config
|
||||
echo "CFG_GTK3_LIBS = $CFG_GTK3_LIBS" >> Makefile.config
|
||||
echo "CFG_GTK3_BINDIR = $CFG_GTK3_BINDIR" >> Makefile.config
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
281
src/closure.c
@@ -23,14 +23,6 @@
|
||||
/*** src type: some GUI code ***/
|
||||
|
||||
#include "dvdisaster.h"
|
||||
#include "inlined-icons.h"
|
||||
|
||||
#if 0
|
||||
#define Verbose g_printf
|
||||
#else
|
||||
#define Verbose(format, ...)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef SYS_MINGW
|
||||
#include <windows.h>
|
||||
@@ -58,6 +50,35 @@ static char* get_exe_path()
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SYS_DARWIN
|
||||
#include <mach-o/dyld.h>
|
||||
|
||||
// Get the path of the current executable
|
||||
static char* get_bin_path() {
|
||||
char path[PATH_MAX];
|
||||
uint32_t size = sizeof(path);
|
||||
|
||||
if (_NSGetExecutablePath(path, &size) == 0) {
|
||||
char *lastSlash = strrchr(path, '/');
|
||||
if (lastSlash) {
|
||||
*lastSlash = '\0';
|
||||
return strdup(path);
|
||||
}
|
||||
}
|
||||
|
||||
return strdup(".");
|
||||
}
|
||||
|
||||
// Check if the given path is within an app bundle
|
||||
int isWithinAppBundle(const char *filePath) {
|
||||
// Check if "Contents/MacOS" exists in the path
|
||||
if (strstr(filePath, ".app/Contents/MacOS") != NULL) {
|
||||
return 1; // The binary is within an app bundle
|
||||
}
|
||||
return 0; // The binary is not within an app bundle
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WITH_GUI_YES
|
||||
|
||||
/***
|
||||
@@ -68,12 +89,12 @@ static char* get_exe_path()
|
||||
* Update color string for the <span color="#f00baa">...</span> string
|
||||
*/
|
||||
|
||||
void GuiUpdateMarkup(char **string, GdkColor *color)
|
||||
void GuiUpdateMarkup(char **string, GdkRGBA *color)
|
||||
{ int hexval;
|
||||
|
||||
hexval = (color->red << 8) & 0xff0000;
|
||||
hexval |= color->green & 0xff00;
|
||||
hexval |= (color->blue >> 8) & 0xff;
|
||||
hexval = (int)(color->red * 255.0 + 0.5) << 16;
|
||||
hexval |= (int)(color->green * 255.0 + 0.5) << 8;
|
||||
hexval |= (int)(color->blue * 255.0 + 0.5);
|
||||
|
||||
if(*string) g_free(*string);
|
||||
*string = g_strdup_printf("color=\"#%06x\"", hexval);
|
||||
@@ -85,55 +106,23 @@ void GuiUpdateMarkup(char **string, GdkColor *color)
|
||||
|
||||
void GuiDefaultColors()
|
||||
{
|
||||
Closure->redText->red = 0xffff;
|
||||
Closure->redText->green = 0;
|
||||
Closure->redText->blue = 0;
|
||||
|
||||
Closure->greenText->red = 0;
|
||||
Closure->greenText->green = 0x8000;
|
||||
Closure->greenText->blue = 0;
|
||||
|
||||
Closure->barColor->red = 0xffff;
|
||||
Closure->barColor->green = 0;
|
||||
Closure->barColor->blue = 0;
|
||||
|
||||
Closure->logColor->red = 0xffff;
|
||||
Closure->logColor->green = 0;
|
||||
Closure->logColor->blue = 0xffff;
|
||||
|
||||
Closure->curveColor->red = 0;
|
||||
Closure->curveColor->green = 0;
|
||||
Closure->curveColor->blue = 0xffff;
|
||||
|
||||
Closure->redSector->red = 0xffff;
|
||||
Closure->redSector->green = 0;
|
||||
Closure->redSector->blue = 0;
|
||||
|
||||
Closure->yellowSector->red = 0xffff;
|
||||
Closure->yellowSector->green = 0xc000;
|
||||
Closure->yellowSector->blue = 0;
|
||||
|
||||
Closure->greenSector->red = 0;
|
||||
Closure->greenSector->green = 0xdb00;
|
||||
Closure->greenSector->blue = 0;
|
||||
|
||||
Closure->darkSector->red = 0;
|
||||
Closure->darkSector->green = 0x8000;
|
||||
Closure->darkSector->blue = 0;
|
||||
|
||||
Closure->blueSector->red = 0;
|
||||
Closure->blueSector->green = 0;
|
||||
Closure->blueSector->blue = 0xffff;
|
||||
|
||||
Closure->whiteSector->red = 0xffff;
|
||||
Closure->whiteSector->green = 0xffff;
|
||||
Closure->whiteSector->blue = 0xffff;
|
||||
*Closure->redText = (GdkRGBA){1.0, 0.0, 0.0, 1.0};
|
||||
*Closure->greenText = (GdkRGBA){0.0, 0.5, 0.0, 1.0};
|
||||
*Closure->barColor = (GdkRGBA){1.0, 0.0, 0.0, 1.0};
|
||||
*Closure->logColor = (GdkRGBA){1.0, 0.0, 1.0, 1.0};
|
||||
*Closure->curveColor = (GdkRGBA){0.0, 0.0, 1.0, 1.0};
|
||||
*Closure->redSector = (GdkRGBA){1.0, 0.0, 0.0, 1.0};
|
||||
*Closure->yellowSector = (GdkRGBA){1.0, 0.75, 0.0, 1.0};
|
||||
*Closure->greenSector = (GdkRGBA){0.0, 0.86, 0.0, 1.0};
|
||||
*Closure->darkSector = (GdkRGBA){0.0, 0.5, 0.0, 1.0};
|
||||
*Closure->curveColor = (GdkRGBA){0.0, 0.0, 1.0, 1.0};
|
||||
*Closure->whiteSector = (GdkRGBA){1.0, 1.0, 1.0, 1.0};
|
||||
|
||||
GuiUpdateMarkup(&Closure->redMarkup, Closure->redText);
|
||||
GuiUpdateMarkup(&Closure->greenMarkup, Closure->greenText);
|
||||
}
|
||||
|
||||
static void save_colors(FILE *dotfile, char *symbol, GdkColor *color)
|
||||
static void save_colors(FILE *dotfile, char *symbol, GdkRGBA *color)
|
||||
{ char *blanks=" ";
|
||||
char *pad;
|
||||
int len=strlen(symbol);
|
||||
@@ -142,15 +131,17 @@ static void save_colors(FILE *dotfile, char *symbol, GdkColor *color)
|
||||
else pad=blanks+len;
|
||||
|
||||
fprintf(dotfile, "%s:%s%02x%02x%02x\n", symbol, pad,
|
||||
color->red>>8, color->green>>8, color->blue>>8);
|
||||
(int)(color->red * 255.0 + 0.5),
|
||||
(int)(color->green * 255.0 + 0.5),
|
||||
(int)(color->blue * 255.0 + 0.5));
|
||||
}
|
||||
|
||||
static void get_color(GdkColor *color, char *value)
|
||||
static void get_color(GdkRGBA *color, char *value)
|
||||
{ unsigned int hex = strtol(value, NULL, 16);
|
||||
|
||||
color->red = (hex>>8)&0xff00;
|
||||
color->green = hex&0xff00;
|
||||
color->blue = (hex<<8)&0xff00;
|
||||
color->red = (double)(hex >> 16) / 255.0;
|
||||
color->green = (double)((hex >> 8) & 0xff) / 255.0;
|
||||
color->blue = (double)(hex & 0xff) / 255.0;
|
||||
color->alpha = 1.0;
|
||||
}
|
||||
|
||||
/***
|
||||
@@ -184,7 +175,8 @@ void GuiReadDotfile()
|
||||
|
||||
if(feof(dotfile)) break;
|
||||
if(*line == '#') continue;
|
||||
if(!sscanf(line, "%40[0-9a-zA-Z-]%n", symbol, &n)) continue;
|
||||
int result = sscanf(line, "%40[0-9a-zA-Z-]%n", symbol, &n);
|
||||
if(result == EOF || !result) continue;
|
||||
if(line[n] != ':') continue;
|
||||
|
||||
/* Separate line contents into symbol: value pair */
|
||||
@@ -259,7 +251,6 @@ void GuiReadDotfile()
|
||||
if(!strcmp(symbol, "read-raw")) { Closure->readRaw = atoi(value); continue; }
|
||||
if(!strcmp(symbol, "redundancy")) { if(Closure->redundancy) g_free(Closure->redundancy);
|
||||
Closure->redundancy = g_strdup(value); continue; }
|
||||
if(!strcmp(symbol, "reverse-cancel-ok")) { Closure->reverseCancelOK = atoi(value); continue; }
|
||||
if(!strcmp(symbol, "spinup-delay")) { Closure->spinupDelay = atoi(value); continue; }
|
||||
if(!strcmp(symbol, "unlink")) { Closure->unlinkImage = atoi(value); continue; }
|
||||
if(!strcmp(symbol, "verbose")) { Closure->verbose = atoi(value); continue; }
|
||||
@@ -362,7 +353,6 @@ static void update_dotfile()
|
||||
g_fprintf(dotfile, "read-raw: %d\n", Closure->readRaw);
|
||||
if(Closure->redundancy)
|
||||
g_fprintf(dotfile, "redundancy: %s\n", Closure->redundancy);
|
||||
g_fprintf(dotfile, "reverse-cancel-ok: %d\n", Closure->reverseCancelOK);
|
||||
g_fprintf(dotfile, "spinup-delay: %d\n", Closure->spinupDelay);
|
||||
g_fprintf(dotfile, "unlink: %d\n", Closure->unlinkImage);
|
||||
g_fprintf(dotfile, "verbose: %d\n", Closure->verbose);
|
||||
@@ -392,11 +382,20 @@ static void update_dotfile()
|
||||
|
||||
static void get_base_dirs()
|
||||
{
|
||||
|
||||
/* If specified in environment (for example in AppImage), use it */
|
||||
if (g_getenv("DVDISASTER_APPIMAGE") && atoi(g_getenv("DVDISASTER_APPIMAGE")) && g_getenv("DOCDIR") && g_getenv("BINDIR"))
|
||||
{ Closure->binDir = g_strdup(g_getenv("BINDIR"));
|
||||
Closure->docDir = g_strdup(g_getenv("DOCDIR"));
|
||||
Verbose("Using paths from environment\n");
|
||||
goto find_dotfile;
|
||||
}
|
||||
|
||||
/*** Unless completely disabled through a configure option, the
|
||||
source directory is supposed to hold the most recent files,
|
||||
so try this first. */
|
||||
|
||||
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW)
|
||||
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW) && !defined(SYS_DARWIN)
|
||||
if(DirStat(SRCDIR))
|
||||
{ Closure->binDir = g_strdup(SRCDIR);
|
||||
Closure->docDir = g_strdup_printf("%s/documentation",SRCDIR);
|
||||
@@ -405,6 +404,29 @@ static void get_base_dirs()
|
||||
}
|
||||
#endif /* WITH_EMBEDDED_SRC_PATH_YES */
|
||||
|
||||
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && defined(SYS_DARWIN)
|
||||
char *binPath = get_bin_path();
|
||||
Closure->binDir = g_strdup_printf("%s/../Resources",binPath);
|
||||
Closure->docDir = g_strdup_printf("%s/../Resources/documentation",binPath);
|
||||
free(binPath);
|
||||
goto find_dotfile;
|
||||
#endif
|
||||
|
||||
// We may also be in an app bundle
|
||||
#if defined(SYS_DARWIN)
|
||||
// Obtain the path to the executable
|
||||
const char *pathToExecutable = get_bin_path();
|
||||
|
||||
// Check if the executable is within an app bundle
|
||||
if (isWithinAppBundle(pathToExecutable)) {
|
||||
// Inside an app bundle, set directory paths accordingly
|
||||
Closure->binDir = g_strdup_printf("%s/../Resources", pathToExecutable);
|
||||
Closure->docDir = g_strdup_printf("%s/../Resources/documentation", pathToExecutable);
|
||||
goto find_dotfile;
|
||||
}
|
||||
|
||||
#endif /* SYS_DARWIN */
|
||||
|
||||
/*** Otherwise try the installation directory.
|
||||
On Unices this is a hardcoded directory. */
|
||||
|
||||
@@ -425,9 +447,7 @@ static void get_base_dirs()
|
||||
/*** The location of the dotfile depends on the operating system.
|
||||
Under Unix the users home directory is used. */
|
||||
|
||||
#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW)
|
||||
find_dotfile:
|
||||
#endif /* WITH_EMBEDDED_SRC_PATH_YES */
|
||||
|
||||
#ifndef SYS_MINGW
|
||||
Closure->homeDir = g_strdup(g_getenv("HOME"));
|
||||
@@ -469,7 +489,7 @@ void InitClosure()
|
||||
/* Extract the version string */
|
||||
|
||||
#if defined(HAVE_UNSTABLE_RELEASE) && defined(PATCHLEVEL)
|
||||
Closure->cookedVersion = g_strdup_printf("%s (unstable-unofficial patchlevel %d)", VERSION, PATCHLEVEL);
|
||||
Closure->cookedVersion = g_strdup_printf("%s (unofficial patchlevel %d)", VERSION, PATCHLEVEL);
|
||||
Closure->releaseFlags = MFLAG_DEVEL;
|
||||
#elif defined(HAVE_UNSTABLE_RELEASE)
|
||||
Closure->cookedVersion = g_strdup_printf("%s (unstable)", VERSION);
|
||||
@@ -558,21 +578,17 @@ void InitClosure()
|
||||
g_mutex_init(Closure->logLock);
|
||||
|
||||
#ifdef WITH_GUI_YES
|
||||
Closure->background = g_malloc0(sizeof(GdkColor));
|
||||
Closure->foreground = g_malloc0(sizeof(GdkColor));
|
||||
Closure->grid = g_malloc0(sizeof(GdkColor));
|
||||
|
||||
Closure->redText = g_malloc0(sizeof(GdkColor));
|
||||
Closure->greenText = g_malloc0(sizeof(GdkColor));
|
||||
Closure->barColor = g_malloc0(sizeof(GdkColor));
|
||||
Closure->logColor = g_malloc0(sizeof(GdkColor));
|
||||
Closure->curveColor = g_malloc0(sizeof(GdkColor));
|
||||
Closure->redSector = g_malloc0(sizeof(GdkColor));
|
||||
Closure->yellowSector= g_malloc0(sizeof(GdkColor));
|
||||
Closure->greenSector = g_malloc0(sizeof(GdkColor));
|
||||
Closure->blueSector = g_malloc0(sizeof(GdkColor));
|
||||
Closure->whiteSector = g_malloc0(sizeof(GdkColor));
|
||||
Closure->darkSector = g_malloc0(sizeof(GdkColor));
|
||||
Closure->redText = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->greenText = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->barColor = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->logColor = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->curveColor = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->redSector = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->yellowSector= g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->greenSector = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->blueSector = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->whiteSector = g_malloc0(sizeof(GdkRGBA));
|
||||
Closure->darkSector = g_malloc0(sizeof(GdkRGBA));
|
||||
|
||||
GuiDefaultColors();
|
||||
#endif /* WITH_GUI_YES */
|
||||
@@ -583,6 +599,10 @@ void InitClosure()
|
||||
DefaultLogFile();
|
||||
}
|
||||
|
||||
#ifdef WITH_GUI_YES
|
||||
GdkRGBA transparent = {0};
|
||||
#endif /* WITH_GUI_YES */
|
||||
|
||||
/*
|
||||
* Add some localized file name defaults.
|
||||
* Can't do this in InitClosure() as the locale has not been
|
||||
@@ -591,10 +611,16 @@ void InitClosure()
|
||||
|
||||
void LocalizedFileDefaults()
|
||||
{
|
||||
/* Storing the files in the cwd appears to be a sane default. */
|
||||
|
||||
Closure->imageName = g_strdup(_("medium.iso"));
|
||||
Closure->eccName = g_strdup(_("medium.ecc"));
|
||||
if (g_getenv("DVDISASTER_APPIMAGE") && atoi(g_getenv("DVDISASTER_APPIMAGE")) && g_getenv("ORIGINAL_PWD"))
|
||||
{ /* Under AppImage mode, use the ORIGINAL_PWD as the cwd is non-writable. */
|
||||
Closure->imageName = g_strdup_printf("%s/%s", g_getenv("ORIGINAL_PWD"), _("medium.iso"));
|
||||
Closure->eccName = g_strdup_printf("%s/%s", g_getenv("ORIGINAL_PWD"), _("medium.ecc"));
|
||||
}
|
||||
else
|
||||
{ /* Storing the files in the cwd appears to be a sane default. */
|
||||
Closure->imageName = g_strdup(_("medium.iso"));
|
||||
Closure->eccName = g_strdup(_("medium.ecc"));
|
||||
}
|
||||
Closure->dDumpPrefix = g_strdup(_("sector-"));
|
||||
}
|
||||
|
||||
@@ -623,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);
|
||||
@@ -648,9 +708,6 @@ void FreeClosure()
|
||||
cond_free(Closure->dDumpDir);
|
||||
cond_free(Closure->dDumpPrefix);
|
||||
|
||||
if(Closure->crcBuf)
|
||||
FreeCrcBuf(Closure->crcBuf);
|
||||
|
||||
if(Closure->logString)
|
||||
g_string_free(Closure->logString, TRUE);
|
||||
|
||||
@@ -659,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);
|
||||
}
|
||||
|
||||
|
||||
283
src/curve.c
@@ -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 */
|
||||
|
||||
156
src/dvdisaster.c
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
137
src/menubar.c
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -411,7 +411,7 @@ void Verbose(char *format, ...)
|
||||
va_end(argp);
|
||||
}
|
||||
|
||||
if(!Closure->verbose)
|
||||
if(!Closure->verbose && !g_getenv("VERBOSE"))
|
||||
return;
|
||||
|
||||
va_start(argp, format);
|
||||
@@ -689,6 +689,10 @@ void Stop(char *format, ...)
|
||||
{ FreeClosure();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* code below should never be reachable, exit to make static analysis happy,
|
||||
and make the ((noreturn)) attribute right in all cases */
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -747,6 +751,9 @@ static void stripecc_cleanup(gpointer data)
|
||||
if (image)
|
||||
CloseImage(image);
|
||||
|
||||
if(Closure->guiMode)
|
||||
GuiAllowActions(TRUE);
|
||||
|
||||
GuiExitWorkerThread();
|
||||
}
|
||||
|
||||
|
||||
337
src/raw-editor.c
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -88,7 +88,6 @@ typedef struct
|
||||
gint lastCopied;
|
||||
gint lastSegment;
|
||||
gint lastPlotted;
|
||||
gint lastPlottedY;
|
||||
gint activeRenderers;
|
||||
GMutex *rendererMutex;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||