├── .gitattributes
├── .github
└── workflows
│ ├── build_and_release.yml
│ └── preview_release.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── LICENSE
├── README.md
├── android
├── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── res
│ ├── drawable-hdpi
│ │ └── icon.png
│ ├── drawable-ldpi
│ │ └── icon.png
│ ├── drawable-mdpi
│ │ └── icon.png
│ ├── drawable-xhdpi
│ │ └── icon.png
│ ├── drawable-xxhdpi
│ │ └── icon.png
│ ├── drawable-xxxhdpi
│ │ └── icon.png
│ └── values
│ │ └── libs.xml
└── src
│ └── info
│ └── sioyek
│ └── sioyek
│ ├── SioyekActivity.java
│ └── TextToSpeechService.java
├── bak
├── build_mac.yml
└── rolling_release.yml
├── begin.png
├── build_and_release.sh
├── build_linux.sh
├── build_mac.sh
├── build_windows.bat
├── data
├── command_docs.json
├── config_docs.json
├── embedding.npy
└── linear.npy
├── delete_build.sh
├── deploy.py
├── end.png
├── fzf
├── fzf.c
└── fzf.h
├── icons
├── B.svg
├── B_white.svg
├── P.svg
├── P_white.svg
├── adjust.svg
├── arrow-begin.svg
├── arrow-end.svg
├── bookmark - Copy.svg
├── bookmark-add.svg
├── bookmark-g.svg
├── bookmark.svg
├── close.svg
├── copy.svg
├── document-page-number.svg
├── draw.svg
├── erase.svg
├── finger-index.svg
├── fit-horizontal-enabled.svg
├── fit-horizontal.svg
├── fullscreen-enabled.svg
├── fullscreen.svg
├── go-to-file.svg
├── google-scholar.svg
├── google.svg
├── highlight-g.svg
├── highlight.svg
├── home.svg
├── hourglass.svg
├── jump-right.svg
├── left.svg
├── link-enabled.svg
├── link.svg
├── load.svg
├── lock-enabled.svg
├── lock.svg
├── move.svg
├── next.svg
├── page.svg
├── paper-download.svg
├── pause.svg
├── pen.svg
├── play.svg
├── portal-enabled.svg
├── portal.svg
├── previous.svg
├── question.svg
├── right.svg
├── ruler-enabled.svg
├── ruler.svg
├── save.svg
├── screenshot.svg
├── search.svg
├── select_text.svg
├── selection-begin.svg
├── selection-end.svg
├── stop.svg
├── swap.svg
├── table-of-contents.svg
├── text-selection.svg
├── tts-enabled.svg
├── tts.svg
└── unlink.svg
├── last_version.txt
├── linuxdeploy_build_and_release.sh
├── pdf_viewer
├── .gitignore
├── OpenWithApplication.cpp
├── OpenWithApplication.h
├── RunGuard.cpp
├── RunGuard.h
├── book.cpp
├── book.h
├── checksum.cpp
├── checksum.h
├── config.cpp
├── config.h
├── coordinates.cpp
├── coordinates.h
├── data
│ └── last_document_path.txt
├── database.cpp
├── database.h
├── diff
│ ├── keys.config
│ └── keys2.config
├── document.cpp
├── document.h
├── document_view.cpp
├── document_view.h
├── fonts
│ ├── monaco.ttf
│ ├── msuighub.ttf
│ └── msuighur.ttf
├── fts_fuzzy_match.h
├── icon1.ico
├── icon2.ico
├── input.cpp
├── input.h
├── keys.config
├── keys_old.config
├── keys_user.config
├── macos_specific.mm
├── main.cpp
├── main_widget.cpp
├── main_widget.h
├── mysortfilterproxymodel.cpp
├── mysortfilterproxymodel.h
├── new_file_checker.cpp
├── new_file_checker.h
├── path.cpp
├── path.h
├── pdf_renderer.cpp
├── pdf_renderer.h
├── pdf_view_opengl_widget.cpp
├── pdf_view_opengl_widget.h
├── prefs.config
├── prefs_user.config
├── qml
│ └── MyColorPicker.qml
├── rapidfuzz_amalgamated.hpp
├── shaders
│ ├── compiled_drawing.vertex
│ ├── compiled_line.fragment
│ ├── custom_colors.fragment
│ ├── dark_mode.fragment
│ ├── debug.fragment
│ ├── dot.fragment
│ ├── dot.vertex
│ ├── highlight.fragment
│ ├── line.fragment
│ ├── line.vertex
│ ├── separator.fragment
│ ├── simple.fragment
│ ├── simple.vertex
│ ├── simple_transparent.fragment
│ ├── stencil.fragment
│ ├── stencil.vertex
│ ├── undendered_page.fragment
│ ├── unrendered_page.fragment
│ ├── vertical_bar.fragment
│ └── vertical_bar_dark.fragment
├── shell.c
├── sqlite3.c
├── sqlite3.h
├── sqlite3ext.h
├── synctex
│ ├── synctex_parser.c
│ ├── synctex_parser.h
│ ├── synctex_parser_advanced.h
│ ├── synctex_parser_local.h
│ ├── synctex_parser_utils.c
│ ├── synctex_parser_utils.h
│ └── synctex_version.h
├── touchui
│ ├── TouchAudioButtons.cpp
│ ├── TouchAudioButtons.h
│ ├── TouchAudioButtons.qml
│ ├── TouchButtonGroup.qml
│ ├── TouchCheckbox.cpp
│ ├── TouchCheckbox.h
│ ├── TouchCheckbox.qml
│ ├── TouchConfigMenu.cpp
│ ├── TouchConfigMenu.h
│ ├── TouchConfigMenu.qml
│ ├── TouchCopyOptions.cpp
│ ├── TouchCopyOptions.h
│ ├── TouchCopyOptions.qml
│ ├── TouchDeleteButton.cpp
│ ├── TouchDeleteButton.h
│ ├── TouchDeleteButton.qml
│ ├── TouchDrawControls.cpp
│ ├── TouchDrawControls.h
│ ├── TouchDrawControls.qml
│ ├── TouchGenericButtons.cpp
│ ├── TouchGenericButtons.h
│ ├── TouchGenericButtons.qml
│ ├── TouchHighlightButtons.cpp
│ ├── TouchHighlightButtons.h
│ ├── TouchHighlightButtons.qml
│ ├── TouchListView.cpp
│ ├── TouchListView.h
│ ├── TouchListView.qml
│ ├── TouchMacroEditor.cpp
│ ├── TouchMacroEditor.h
│ ├── TouchMacroEditor.qml
│ ├── TouchMainMenu.cpp
│ ├── TouchMainMenu.h
│ ├── TouchMainMenu.qml
│ ├── TouchMarkSelector.cpp
│ ├── TouchMarkSelector.h
│ ├── TouchMarkSelector.qml
│ ├── TouchPageSelector.cpp
│ ├── TouchPageSelector.h
│ ├── TouchPageSelector.qml
│ ├── TouchRangeSelectUI.cpp
│ ├── TouchRangeSelectUI.h
│ ├── TouchRangeSelectUI.qml
│ ├── TouchRectangleSelectUI.cpp
│ ├── TouchRectangleSelectUI.h
│ ├── TouchRectangleSelectUI.qml
│ ├── TouchSearchButtons.cpp
│ ├── TouchSearchButtons.h
│ ├── TouchSearchButtons.qml
│ ├── TouchSettings.cpp
│ ├── TouchSettings.h
│ ├── TouchSettings.qml
│ ├── TouchSlider.cpp
│ ├── TouchSlider.h
│ ├── TouchSlider.qml
│ ├── TouchSymbolColorSelector.qml
│ ├── TouchTextEdit.cpp
│ ├── TouchTextEdit.h
│ ├── TouchTextEdit.qml
│ └── TouchTreeView.qml
├── ui.cpp
├── ui.h
├── utf8.h
├── utf8
│ ├── checked.h
│ ├── core.h
│ └── unchecked.h
├── utils.cpp
└── utils.h
├── pdf_viewer_build_config.pro
├── resources.qrc
├── resources
├── Info.plist
├── debian
│ ├── changelog
│ ├── compat
│ ├── control
│ ├── copyright
│ ├── rules
│ ├── sioyek.dirs
│ ├── sioyek.install
│ └── source
│ │ └── format
├── fonts
│ ├── JetBrainsMono.ttf
│ └── OFL.txt
├── sioyek-icon-linux.png
├── sioyek.1
└── sioyek.desktop
├── scripts
├── dual_panelify.py
├── embed_annotations_in_file.py
├── embedded_annotations.py
├── paper_downloader.py
├── sioyek-generator.py
├── sioyek.py
├── summary_highlight_server.py
├── tools
│ ├── command_names.txt
│ ├── config_names.txt
│ └── extract_command_docs.py
└── tts
│ ├── aligner.bat
│ ├── aligner.ps1
│ ├── generator.ps1
│ ├── generator2.ps1
│ ├── manager_server.py
│ ├── server_follow.py
│ ├── server_read.py
│ ├── server_stop.py
│ └── server_unfollow.py
├── tutorial.pdf
├── tutorial
├── bibs.bib
├── compile.sh
├── mandlebrot_small.jpg
└── tut.tex
└── windows_runtime
├── libcrypto-1_1-x64.dll
├── libssl-1_1-x64.dll
└── vcruntime140_1.dll
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "mupdf"]
2 | path = mupdf
3 | url = https://github.com/ArtifexSoftware/mupdf
4 | ignore = dirty
5 | [submodule "zlib"]
6 | path = zlib
7 | url = https://github.com/madler/zlib
8 | ignore = untracked
9 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # For more details on how to configure your build environment visit
3 | # http://www.gradle.org/docs/current/userguide/build_environment.html
4 | # Specifies the JVM arguments used for the daemon process.
5 | # The setting is particularly useful for tweaking memory settings.
6 | org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
7 |
8 | # Enable building projects in parallel
9 | org.gradle.parallel=true
10 |
11 | # Gradle caching allows reusing the build artifacts from a previous
12 | # build with the same inputs. However, over time, the cache size will
13 | # grow. Uncomment the following line to enable it.
14 | #org.gradle.caching=true
15 |
16 | android.useAndroidX=true
17 | android.enableJetifier=true
18 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/android/res/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/android/res/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/android/res/drawable-ldpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/android/res/drawable-ldpi/icon.png
--------------------------------------------------------------------------------
/android/res/drawable-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/android/res/drawable-mdpi/icon.png
--------------------------------------------------------------------------------
/android/res/drawable-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/android/res/drawable-xhdpi/icon.png
--------------------------------------------------------------------------------
/android/res/drawable-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/android/res/drawable-xxhdpi/icon.png
--------------------------------------------------------------------------------
/android/res/drawable-xxxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/android/res/drawable-xxxhdpi/icon.png
--------------------------------------------------------------------------------
/android/res/values/libs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/bak/build_mac.yml:
--------------------------------------------------------------------------------
1 | name: Build Mac Release
2 |
3 | on:
4 | push:
5 | tags:
6 | - "mac*"
7 |
8 | jobs:
9 | upload-release:
10 |
11 | runs-on: ubuntu-18.04
12 | needs: [build-mac]
13 |
14 | steps:
15 | - uses: actions/checkout@v1
16 | - name: create release
17 | id: create_release
18 | uses: actions/create-release@master
19 | env:
20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
21 | with:
22 | tag_name: ${{ github.ref }}
23 | release_name: Release ${{ github.ref }}
24 | draft: false
25 | prerelease: false
26 | - name: download artifacts
27 | uses: actions/download-artifact@v1
28 | with:
29 | name: uploads
30 | - name: upload mac
31 | id: upload-mac
32 | uses: actions/upload-release-asset@v1.0.1
33 | env:
34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35 | with:
36 | upload_url: ${{ steps.create_release.outputs.upload_url }}
37 | asset_path: ./uploads/sioyek-release-mac.zip
38 | asset_name: sioyek-release-mac.zip
39 | asset_content_type: application/zip
40 |
41 | build-mac:
42 |
43 | runs-on: macos-latest
44 |
45 | steps:
46 |
47 | - uses: actions/checkout@v2
48 | with:
49 | submodules: 'recursive'
50 |
51 | - name: Install dependencies
52 | run: brew install freeglut mesa harfbuzz
53 |
54 | - name: Install Qt
55 | uses: jurplel/install-qt-action@v2
56 | with:
57 | version: '5.14.2'
58 |
59 | - name: Build
60 | working-directory: ${{env.GITHUB_WORKSPACE}}
61 | run: |
62 | chmod +x build_mac.sh
63 | ./build_mac.sh
64 |
65 | - name: upload mac artifact
66 | uses: actions/upload-artifact@v1
67 | with:
68 | name: uploads
69 | path: sioyek-release-mac.zip
70 |
--------------------------------------------------------------------------------
/begin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/begin.png
--------------------------------------------------------------------------------
/build_and_release.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 |
4 | if [ -z ${MAKE_PARALLEL+x} ]; then export MAKE_PARALLEL=$(nproc); else echo "MAKE_PARALLEL defined"; fi
5 | echo "MAKE_PARALLEL set to $MAKE_PARALLEL"
6 |
7 | # download linuxdeployqt if not exists
8 | if [[ ! -f linuxdeployqt-continuous-x86_64.AppImage ]]; then
9 | wget -q https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
10 | chmod +x linuxdeployqt-continuous-x86_64.AppImage
11 | fi
12 |
13 | cd mupdf
14 | make USE_SYSTEM_HARFBUZZ=yes -j$MAKE_PARALLEL
15 | cd ..
16 |
17 | if [ -z ${QMAKE+x} ]; then
18 | QMAKE=qmake
19 | fi
20 |
21 | if [[ $1 == console ]]; then
22 | $QMAKE "CONFIG+=linux_app_image console" pdf_viewer_build_config.pro
23 | else
24 | $QMAKE "CONFIG+=linux_app_image" pdf_viewer_build_config.pro
25 | fi
26 |
27 | rm -rf sioyek-release 2> /dev/null
28 | make install INSTALL_ROOT=sioyek-release -j$MAKE_PARALLEL
29 |
30 | cp pdf_viewer/prefs.config sioyek-release/usr/bin/prefs.config
31 | cp pdf_viewer/prefs_user.config sioyek-release/usr/share/prefs_user.config
32 | cp pdf_viewer/keys.config sioyek-release/usr/bin/keys.config
33 | cp pdf_viewer/keys_user.config sioyek-release/usr/share/keys_user.config
34 | cp -r pdf_viewer/shaders sioyek-release/usr/bin/shaders
35 | cp tutorial.pdf sioyek-release/usr/bin/tutorial.pdf
36 |
37 | ./linuxdeployqt-continuous-x86_64.AppImage ./sioyek-release/usr/share/applications/sioyek.desktop -qmldir=./pdf_viewer/touchui -appimage
38 | # ./linuxdeployqt-continuous-x86_64.AppImage ./sioyek-release/usr/share/applications/sioyek.desktop -appimage
39 |
40 |
41 | mv Sioyek-* Sioyek-x86_64.AppImage
42 | zip sioyek-release-linux.zip Sioyek-x86_64.AppImage
43 |
--------------------------------------------------------------------------------
/build_linux.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 |
4 | # Compile mupdf
5 | cd mupdf
6 | make USE_SYSTEM_HARFBUZZ=yes -j$(nproc)
7 | cd ..
8 |
9 | # set QMAKE if not already defined
10 | if [ -z "$QMAKE" ];
11 | then
12 | if [ -f "/usr/bin/qmake-qt6" ];
13 | then
14 | QMAKE="/usr/bin/qmake-qt6"
15 | elif [ -f "/usr/bin/qmake" ];
16 | then
17 | QMAKE="/usr/bin/qmake"
18 | else
19 | QMAKE="qmake"
20 | fi
21 | fi
22 |
23 | $QMAKE "CONFIG+=linux_app_image" pdf_viewer_build_config.pro
24 | make -j$(nproc)
25 |
26 | # Copy files in build/ subdirectory
27 | rm -rf build 2> /dev/null
28 | mkdir build
29 | mv sioyek build/sioyek
30 | cp pdf_viewer/prefs.config build/prefs.config
31 | cp pdf_viewer/prefs_user.config build/prefs_user.config
32 | cp pdf_viewer/keys.config build/keys.config
33 | cp pdf_viewer/keys_user.config build/keys_user.config
34 | cp -r pdf_viewer/shaders build/shaders
35 | cp tutorial.pdf build/tutorial.pdf
36 |
--------------------------------------------------------------------------------
/build_mac.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 | # prerequisite: brew install qt@5 freeglut mesa harfbuzz
4 |
5 | #sys_glut_clfags=`pkg-config --cflags glut gl`
6 | #sys_glut_libs=`pkg-config --libs glut gl`
7 | #sys_harfbuzz_clfags=`pkg-config --cflags harfbuzz`
8 | #sys_harfbuzz_libs=`pkg-config --libs harfbuzz`
9 |
10 | if [ -z ${MAKE_PARALLEL+x} ]; then export MAKE_PARALLEL=1; else echo "MAKE_PARALLEL defined"; fi
11 | echo "MAKE_PARALLEL set to $MAKE_PARALLEL"
12 |
13 | cd mupdf
14 | #make USE_SYSTEM_HARFBUZZ=yes USE_SYSTEM_GLUT=yes SYS_GLUT_CFLAGS="${sys_glut_clfags}" SYS_GLUT_LIBS="${sys_glut_libs}" SYS_HARFBUZZ_CFLAGS="${sys_harfbuzz_clfags}" SYS_HARFBUZZ_LIBS="${sys_harfbuzz_libs}" -j 4
15 | make -j$MAKE_PARALLEL
16 | cd ..
17 |
18 | sed -Ei '' "s/QMAKE_MACOSX_DEPLOYMENT_TARGET.=.[0-9]+/QMAKE_MACOSX_DEPLOYMENT_TARGET = $(sw_vers -productVersion | cut -d. -f1)/" pdf_viewer_build_config.pro
19 |
20 | if [[ $1 == portable ]]; then
21 | qmake pdf_viewer_build_config.pro
22 | else
23 | qmake "CONFIG+=non_portable" pdf_viewer_build_config.pro
24 | fi
25 |
26 | make -j$MAKE_PARALLEL
27 |
28 | rm -rf build 2> /dev/null
29 | mkdir build
30 | mv sioyek.app build/
31 | cp -r pdf_viewer/shaders build/sioyek.app/Contents/MacOS/shaders
32 |
33 | cp pdf_viewer/prefs.config build/sioyek.app/Contents/MacOS/prefs.config
34 | cp pdf_viewer/prefs_user.config build/sioyek.app/Contents/MacOS/prefs_user.config
35 | cp pdf_viewer/keys.config build/sioyek.app/Contents/MacOS/keys.config
36 | cp pdf_viewer/keys_user.config build/sioyek.app/Contents/MacOS/keys_user.config
37 | cp tutorial.pdf build/sioyek.app/Contents/MacOS/tutorial.pdf
38 |
39 | # Capture the current PATH
40 | CURRENT_PATH=$(echo $PATH)
41 |
42 | # Define the path to the Info.plist file inside the app bundle
43 | INFO_PLIST="build/sioyek.app/Contents/Info.plist"
44 |
45 | # Add LSEnvironment key with PATH to Info.plist
46 | /usr/libexec/PlistBuddy -c "Add :LSEnvironment dict" "$INFO_PLIST" || echo "LSEnvironment already exists"
47 | /usr/libexec/PlistBuddy -c "Add :LSEnvironment:PATH string $CURRENT_PATH" "$INFO_PLIST" || /usr/libexec/PlistBuddy -c "Set :LSEnvironment:PATH $CURRENT_PATH" "$INFO_PLIST"
48 |
49 | # Hack is required to avoid race condition in macos in CI
50 | # See https://github.com/actions/runner-images/issues/7522
51 | if [[ -n "$GITHUB_ACTIONS" ]]; then
52 | echo killing...; sudo pkill -9 XProtect >/dev/null || true;
53 | echo waiting...; while pgrep XProtect; do sleep 3; done;
54 | fi
55 |
56 | sleep 5
57 |
58 | # mac deploys with qml currently don't work due to a qt bug
59 | # macdeployqt build/sioyek.app -qmldir=./pdf_viewer/touchui -dmg
60 | macdeployqt build/sioyek.app -dmg
61 |
62 | zip -r sioyek-release-mac.zip build/sioyek.dmg
63 |
--------------------------------------------------------------------------------
/build_windows.bat:
--------------------------------------------------------------------------------
1 | cd mupdf\platform\win32\
2 | msbuild -maxcpucount mupdf.sln /m /property:Configuration=Debug /property:MultiProcessorCompilation=true
3 | msbuild -maxcpucount mupdf.sln /m /property:Configuration=Release /property:MultiProcessorCompilation=true
4 | cd ..\..\..
5 |
6 | cd zlib
7 | nmake -f win32/makefile.msc
8 | cd ..
9 |
10 | qmake -tp vc "DEFINES+=NON_PORTABLE" "CONFIG+=release" pdf_viewer_build_config.pro
11 |
12 | msbuild -maxcpucount sioyek.vcxproj /m /property:Configuration=Release
13 | rm -r sioyek-release-windows 2> NUL
14 | mkdir sioyek-release-windows
15 | cp release\sioyek.exe sioyek-release-windows\sioyek.exe
16 | cp pdf_viewer\keys.config sioyek-release-windows\keys.config
17 | cp pdf_viewer\prefs.config sioyek-release-windows\prefs.config
18 | cp -r pdf_viewer\shaders sioyek-release-windows\shaders
19 | cp tutorial.pdf sioyek-release-windows\tutorial.pdf
20 | windeployqt --qmldir ./pdf_viewer/touchui --release sioyek-release-windows\sioyek.exe
21 | REM windeployqt sioyek-release-windows\sioyek.exe
22 | cp windows_runtime\vcruntime140_1.dll sioyek-release-windows\vcruntime140_1.dll
23 | cp windows_runtime\libssl-1_1-x64.dll sioyek-release-windows\libssl-1_1-x64.dll
24 | cp windows_runtime\libcrypto-1_1-x64.dll sioyek-release-windows\libcrypto-1_1-x64.dll
25 |
26 | if %1 == portable (
27 | cp pdf_viewer\keys_user.config sioyek-release-windows\keys_user.config
28 | cp pdf_viewer\prefs_user.config sioyek-release-windows\prefs_user.config
29 | 7z a sioyek-release-windows-portable.zip sioyek-release-windows
30 |
31 | ) else (
32 | 7z a sioyek-release-windows.zip sioyek-release-windows
33 | )
34 |
--------------------------------------------------------------------------------
/data/embedding.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/data/embedding.npy
--------------------------------------------------------------------------------
/data/linear.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/data/linear.npy
--------------------------------------------------------------------------------
/delete_build.sh:
--------------------------------------------------------------------------------
1 | rm -r Sioyek*
2 | rm sioyek
3 | rm *.o
4 | rm -r sioyek-release
5 |
--------------------------------------------------------------------------------
/deploy.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | if __name__ == '__main__':
4 | with open('E:\\labs\hexomancer-sioyek\\sioyek\\last_version.txt', 'r') as infile:
5 | last_version = int(infile.read())
6 | new_version = last_version + 1
7 | with open('E:\\labs\hexomancer-sioyek\\sioyek\\last_version.txt', 'w') as outfile:
8 | outfile.write(str(new_version))
9 |
10 | os.chdir('E:\\labs\hexomancer-sioyek\\sioyek')
11 | os.system("git pull upstream main")
12 | os.system(f"git tag v0.31.{new_version}")
13 | os.system("git push origin main")
14 | os.system("git push origin --tags")
15 | # os.system(f"git push origin v0.31.{new_version}")
16 | os.system("pause")
--------------------------------------------------------------------------------
/end.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/end.png
--------------------------------------------------------------------------------
/icons/adjust.svg:
--------------------------------------------------------------------------------
1 |
2 |
68 |
--------------------------------------------------------------------------------
/icons/arrow-begin.svg:
--------------------------------------------------------------------------------
1 |
2 |
45 |
--------------------------------------------------------------------------------
/icons/arrow-end.svg:
--------------------------------------------------------------------------------
1 |
2 |
45 |
--------------------------------------------------------------------------------
/icons/bookmark - Copy.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/bookmark-add.svg:
--------------------------------------------------------------------------------
1 |
2 |
41 |
--------------------------------------------------------------------------------
/icons/bookmark-g.svg:
--------------------------------------------------------------------------------
1 |
2 |
61 |
--------------------------------------------------------------------------------
/icons/bookmark.svg:
--------------------------------------------------------------------------------
1 |
2 |
41 |
--------------------------------------------------------------------------------
/icons/close.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/copy.svg:
--------------------------------------------------------------------------------
1 |
2 |
53 |
--------------------------------------------------------------------------------
/icons/draw.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/erase.svg:
--------------------------------------------------------------------------------
1 |
2 |
44 |
--------------------------------------------------------------------------------
/icons/finger-index.svg:
--------------------------------------------------------------------------------
1 |
2 |
59 |
--------------------------------------------------------------------------------
/icons/fit-horizontal.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
91 |
--------------------------------------------------------------------------------
/icons/go-to-file.svg:
--------------------------------------------------------------------------------
1 |
2 |
43 |
--------------------------------------------------------------------------------
/icons/google-scholar.svg:
--------------------------------------------------------------------------------
1 |
2 |
40 |
--------------------------------------------------------------------------------
/icons/google.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/highlight-g.svg:
--------------------------------------------------------------------------------
1 |
2 |
54 |
--------------------------------------------------------------------------------
/icons/highlight.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/home.svg:
--------------------------------------------------------------------------------
1 |
2 |
48 |
--------------------------------------------------------------------------------
/icons/jump-right.svg:
--------------------------------------------------------------------------------
1 |
2 |
54 |
--------------------------------------------------------------------------------
/icons/left.svg:
--------------------------------------------------------------------------------
1 |
2 |
44 |
--------------------------------------------------------------------------------
/icons/link.svg:
--------------------------------------------------------------------------------
1 |
2 |
48 |
--------------------------------------------------------------------------------
/icons/load.svg:
--------------------------------------------------------------------------------
1 |
2 |
73 |
--------------------------------------------------------------------------------
/icons/lock-enabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
65 |
--------------------------------------------------------------------------------
/icons/lock.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/move.svg:
--------------------------------------------------------------------------------
1 |
2 |
45 |
--------------------------------------------------------------------------------
/icons/next.svg:
--------------------------------------------------------------------------------
1 |
2 |
73 |
--------------------------------------------------------------------------------
/icons/paper-download.svg:
--------------------------------------------------------------------------------
1 |
2 |
71 |
--------------------------------------------------------------------------------
/icons/pause.svg:
--------------------------------------------------------------------------------
1 |
2 |
59 |
--------------------------------------------------------------------------------
/icons/pen.svg:
--------------------------------------------------------------------------------
1 |
2 |
53 |
--------------------------------------------------------------------------------
/icons/play.svg:
--------------------------------------------------------------------------------
1 |
2 |
61 |
--------------------------------------------------------------------------------
/icons/portal-enabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
73 |
--------------------------------------------------------------------------------
/icons/portal.svg:
--------------------------------------------------------------------------------
1 |
2 |
46 |
--------------------------------------------------------------------------------
/icons/previous.svg:
--------------------------------------------------------------------------------
1 |
2 |
73 |
--------------------------------------------------------------------------------
/icons/question.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/right.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/ruler-enabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
61 |
--------------------------------------------------------------------------------
/icons/ruler.svg:
--------------------------------------------------------------------------------
1 |
2 |
38 |
--------------------------------------------------------------------------------
/icons/save.svg:
--------------------------------------------------------------------------------
1 |
2 |
40 |
--------------------------------------------------------------------------------
/icons/screenshot.svg:
--------------------------------------------------------------------------------
1 |
2 |
40 |
--------------------------------------------------------------------------------
/icons/search.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/selection-begin.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
55 |
--------------------------------------------------------------------------------
/icons/selection-end.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
55 |
--------------------------------------------------------------------------------
/icons/stop.svg:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/icons/swap.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
76 |
--------------------------------------------------------------------------------
/icons/table-of-contents.svg:
--------------------------------------------------------------------------------
1 |
2 |
95 |
--------------------------------------------------------------------------------
/icons/text-selection.svg:
--------------------------------------------------------------------------------
1 |
2 |
53 |
--------------------------------------------------------------------------------
/icons/unlink.svg:
--------------------------------------------------------------------------------
1 |
2 |
40 |
--------------------------------------------------------------------------------
/last_version.txt:
--------------------------------------------------------------------------------
1 | 435
--------------------------------------------------------------------------------
/linuxdeploy_build_and_release.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 |
4 | if [ -z ${MAKE_PARALLEL+x} ]; then export MAKE_PARALLEL=$(nproc); else echo "MAKE_PARALLEL defined"; fi
5 | echo "MAKE_PARALLEL set to $MAKE_PARALLEL"
6 |
7 | # download linuxdeployqt if not exists
8 | if [[ ! -f ./linuxdeploy-x86_64.AppImage ]]; then
9 | # the continuous version is not working for some reason
10 | # wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
11 | # wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
12 |
13 | wget https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20240109-1/linuxdeploy-x86_64.AppImage
14 | wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/1-alpha-20240109-1/linuxdeploy-plugin-qt-x86_64.AppImage
15 |
16 | chmod +x linuxdeploy-x86_64.AppImage
17 | chmod +x linuxdeploy-plugin-qt-x86_64.AppImage
18 | fi
19 |
20 | cd mupdf
21 | make USE_SYSTEM_HARFBUZZ=yes -j$MAKE_PARALLEL
22 | cd ..
23 |
24 | if [ -z ${QMAKE+x} ]; then
25 | QMAKE=qmake
26 | fi
27 |
28 | if [[ $1 == console ]]; then
29 | $QMAKE "CONFIG+=linux_app_image console" pdf_viewer_build_config.pro
30 | else
31 | $QMAKE "CONFIG+=linux_app_image" pdf_viewer_build_config.pro
32 | fi
33 |
34 | rm -rf sioyek-release 2> /dev/null
35 | make install INSTALL_ROOT=sioyek-release -j$MAKE_PARALLEL
36 |
37 | cp pdf_viewer/prefs.config sioyek-release/usr/bin/prefs.config
38 | cp pdf_viewer/prefs_user.config sioyek-release/usr/share/prefs_user.config
39 | cp pdf_viewer/keys.config sioyek-release/usr/bin/keys.config
40 | cp pdf_viewer/keys_user.config sioyek-release/usr/share/keys_user.config
41 | cp -r pdf_viewer/shaders sioyek-release/usr/bin/shaders
42 | cp tutorial.pdf sioyek-release/usr/bin/tutorial.pdf
43 |
44 | QML_SOURCES_PATHS=./pdf_viewer/touchui ./linuxdeploy-x86_64.AppImage --appdir sioyek-release --plugin qt --output appimage
45 |
46 | # ./linuxdeployqt-continuous-x86_64.AppImage ./sioyek-release/usr/share/applications/sioyek.desktop -qmldir=./pdf_viewer/touchui -appimage
47 | # ./linuxdeployqt-continuous-x86_64.AppImage ./sioyek-release/usr/share/applications/sioyek.desktop -appimage
48 |
49 |
50 | # mv Sioyek-* Sioyek-x86_64.AppImage
51 | zip sioyek-release-linux.zip Sioyek-x86_64.AppImage
52 |
--------------------------------------------------------------------------------
/pdf_viewer/.gitignore:
--------------------------------------------------------------------------------
1 | data/*
2 | x64/*
3 | release/*
4 | Debug/*
5 | .vscode/*
6 | Generated
7 | *.pdf
8 | *.pdb
9 | *.db
10 | *.aps
11 | .qmake.stash
12 | last_document_path.txt
13 | imgui.ini
14 | *.jar
15 | last_document_path.txt
16 | *.o
17 |
--------------------------------------------------------------------------------
/pdf_viewer/OpenWithApplication.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | bool OpenWithApplication::event(QEvent* event) {
4 | if (event->type() == QEvent::FileOpen) {
5 | QFileOpenEvent* openEvent = static_cast(event);
6 | emit file_ready(openEvent->file());
7 | }
8 |
9 | return QApplication::event(event);
10 | }
11 |
--------------------------------------------------------------------------------
/pdf_viewer/OpenWithApplication.h:
--------------------------------------------------------------------------------
1 | #ifndef OPEN_WITH_APP_H
2 | #define OPEN_WITH_APP_H
3 |
4 | #include
5 | #include
6 |
7 | class OpenWithApplication : public QApplication
8 | {
9 | Q_OBJECT
10 | public:
11 | OpenWithApplication(int& argc, char** argv)
12 | : QApplication(argc, argv)
13 | {
14 | }
15 | signals:
16 | void file_ready(const QString& file_name);
17 |
18 | protected:
19 | bool event(QEvent* event) override;
20 | };
21 |
22 | #endif // OPEN_WITH_APP_H
--------------------------------------------------------------------------------
/pdf_viewer/RunGuard.h:
--------------------------------------------------------------------------------
1 | #ifndef SIOYEK_ANDROID
2 | #ifndef SINGLE_INSTANCE_GUARD_H
3 | #define SINGLE_INSTANCE_GUARD_H
4 |
5 | #include
6 |
7 | #include
8 | #include
9 |
10 | #include
11 | /**
12 | * This is an control to guarantee that only one application instance exists at
13 | * any time.
14 | * It uses shared memory to check that no more than one instance is running at
15 | * the same time and also it uses Inter Process Communication (IPC) for a
16 | * secondary application instance to send parameters to the primary application
17 | * instance before quitting.
18 | * An Application must be contructed before the control for signals-slot
19 | * communication to work.
20 | *
21 | * Usage example:
22 | *
23 | * int main(int argc, char *argv[])
24 | * {
25 | * QApplication app{argc, argv};
26 | *
27 | * ...
28 | *
29 | * RunGuard guard{"Lentigram"};
30 | * if (guard.isPrimary()) {
31 | * QObject::connect(
32 | * &guard,
33 | * &RunGuard::messageReceived, [this](const QByteArray &message) {
34 | *
35 | * ...process message coming from secondary application...
36 | *
37 | * qDebug() << message;
38 | * }
39 | * );
40 | * } else {
41 | * guard.sendMessage(app.arguments().join(' ').toUtf8());
42 | * return 0;
43 | * }
44 | *
45 | * ...
46 | *
47 | * app.exec();
48 | * }
49 | *
50 | * This code is inspired by the following:
51 | * https://stackoverflow.com/questions/5006547/qt-best-practice-for-a-single-instance-app-protection
52 | * https://github.com/itay-grudev/SingleApplication
53 | */
54 | class RunGuard : public QObject
55 | {
56 | Q_OBJECT
57 |
58 | public:
59 | std::function on_delete;
60 | explicit RunGuard(const QString& key);
61 | ~RunGuard();
62 |
63 | bool isPrimary();
64 | bool isSecondary();
65 | std::string sendMessage(const QByteArray& message, bool wait=false);
66 |
67 | signals:
68 | void messageReceived(const QByteArray& message, QLocalSocket* socket);
69 |
70 | private slots:
71 | void onNewConnection();
72 |
73 | private:
74 |
75 | const QString key;
76 | const QString sharedMemLockKey;
77 | const QString memoryKey;
78 |
79 | QSharedMemory* memory;
80 | QLocalServer* server = nullptr;
81 |
82 | void readMessage(QLocalSocket* socket);
83 | };
84 |
85 | #endif // SINGLE_INSTANCE_GUARD_H
86 |
87 | #endif // SIOYEK_ANDROID
88 |
--------------------------------------------------------------------------------
/pdf_viewer/checksum.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "checksum.h"
4 |
5 | std::string compute_checksum(const QString& file_name, QCryptographicHash::Algorithm hash_algorithm)
6 | {
7 | QFile infile(file_name);
8 | qint64 file_size = infile.size();
9 | const qint64 buffer_size = 10240;
10 |
11 | if (infile.open(QIODevice::ReadOnly))
12 | {
13 | char buffer[buffer_size];
14 | int bytes_read;
15 | int read_size = qMin(file_size, buffer_size);
16 |
17 | QCryptographicHash hash(hash_algorithm);
18 | while (read_size > 0 && (bytes_read = infile.read(buffer, read_size)) > 0)
19 | {
20 | file_size -= bytes_read;
21 | hash.addData(buffer, bytes_read);
22 | read_size = qMin(file_size, buffer_size);
23 | }
24 |
25 | infile.close();
26 | return QString(hash.result().toHex()).toStdString();
27 | }
28 | return "";
29 | }
30 |
31 | CachedChecksummer::CachedChecksummer(const std::vector>* loaded_checksums) {
32 | if (loaded_checksums) {
33 | for (const auto& [path, checksum_] : *loaded_checksums) {
34 | std::string checksum = QString::fromStdWString(checksum_).toStdString();
35 | cached_checksums[path] = checksum;
36 | cached_paths[checksum].push_back(path);
37 | }
38 | }
39 | }
40 |
41 | std::optional CachedChecksummer::get_checksum_fast(std::wstring file_path) {
42 | // return the checksum only if it is alreay precomputed in cache
43 | if (cached_checksums.find(file_path) != cached_checksums.end()) {
44 | return cached_checksums[file_path];
45 | }
46 | return {};
47 | }
48 |
49 | std::string CachedChecksummer::get_checksum(std::wstring file_path) {
50 |
51 | auto cached_checksum = get_checksum_fast(file_path);
52 |
53 | if (!cached_checksum) {
54 | std::string checksum = compute_checksum(QString::fromStdWString(file_path), QCryptographicHash::Md5);
55 | cached_checksums[file_path] = checksum;
56 | cached_paths[checksum].push_back(file_path);
57 | }
58 | return cached_checksums[file_path];
59 |
60 | }
61 |
62 | std::optional CachedChecksummer::get_path(std::string checksum) {
63 | const std::vector paths = cached_paths[checksum];
64 |
65 | for (const auto& path_string : paths) {
66 | if (QFile::exists(QString::fromStdWString(path_string))) {
67 | return path_string;
68 | }
69 | }
70 | return {};
71 | }
72 |
73 | int CachedChecksummer::num_docs_with_checksum(std::string checksum) {
74 | if (cached_paths.find(checksum) != cached_paths.end()) {
75 | return cached_paths[checksum].size();
76 | }
77 | return 0;
78 | }
--------------------------------------------------------------------------------
/pdf_viewer/checksum.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 |
10 | std::string compute_checksum(const QString& file_name, QCryptographicHash::Algorithm hash_algorithm);
11 |
12 | class CachedChecksummer {
13 | private:
14 | std::unordered_map cached_checksums;
15 | std::unordered_map> cached_paths;
16 |
17 | public:
18 | CachedChecksummer(const std::vector>* loaded_checksums);
19 | std::string get_checksum(std::wstring file_path);
20 | std::optional get_checksum_fast(std::wstring file_path);
21 | std::optional get_path(std::string checksum);
22 | int num_docs_with_checksum(std::string checksum);
23 | };
--------------------------------------------------------------------------------
/pdf_viewer/data/last_document_path.txt:
--------------------------------------------------------------------------------
1 | C:\Users\Lion\source\repos\pdf_viewer\pdf_viewer\data\test.pdf
2 |
--------------------------------------------------------------------------------
/pdf_viewer/fonts/monaco.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/pdf_viewer/fonts/monaco.ttf
--------------------------------------------------------------------------------
/pdf_viewer/fonts/msuighub.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/pdf_viewer/fonts/msuighub.ttf
--------------------------------------------------------------------------------
/pdf_viewer/fonts/msuighur.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/pdf_viewer/fonts/msuighur.ttf
--------------------------------------------------------------------------------
/pdf_viewer/icon1.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/pdf_viewer/icon1.ico
--------------------------------------------------------------------------------
/pdf_viewer/icon2.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/pdf_viewer/icon2.ico
--------------------------------------------------------------------------------
/pdf_viewer/keys_user.config:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hexomancer/sioyek/fa863dd803be106c5cfa3a821a65616290c302a5/pdf_viewer/keys_user.config
--------------------------------------------------------------------------------
/pdf_viewer/mysortfilterproxymodel.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 | #include
3 | #include
4 | #include