Full Code of ahrm/sioyek for AI

development 13a37e0e0ab7 cached
212 files
11.9 MB
3.1M tokens
8898 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (12,503K chars total). Download the full file to get everything.
Repository: ahrm/sioyek
Branch: development
Commit: 13a37e0e0ab7
Files: 212
Total size: 11.9 MB

Directory structure:
gitextract_3qr03h25/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── build_and_release.yml
│       └── preview_release.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── LICENSE
├── README.md
├── android/
│   ├── AndroidManifest.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── res/
│   │   └── values/
│   │       └── libs.xml
│   └── src/
│       └── info/
│           └── sioyek/
│               └── sioyek/
│                   ├── SioyekActivity.java
│                   └── TextToSpeechService.java
├── 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
├── fzf/
│   ├── fzf.c
│   └── fzf.h
├── 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
│   ├── database.cpp
│   ├── database.h
│   ├── diff/
│   │   ├── keys.config
│   │   └── keys2.config
│   ├── document.cpp
│   ├── document.h
│   ├── document_view.cpp
│   ├── document_view.h
│   ├── fts_fuzzy_match.h
│   ├── 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/
│   │   ├── checked.h
│   │   ├── core.h
│   │   └── unchecked.h
│   ├── utf8.h
│   ├── utils.cpp
│   └── utils.h
├── pdf_viewer_build_config.pro
├── resources/
│   ├── Info.plist
│   ├── debian/
│   │   ├── changelog
│   │   ├── compat
│   │   ├── control
│   │   ├── copyright
│   │   ├── rules
│   │   ├── sioyek.dirs
│   │   ├── sioyek.install
│   │   └── source/
│   │       └── format
│   ├── fonts/
│   │   └── OFL.txt
│   ├── sioyek.1
│   └── sioyek.desktop
├── resources.qrc
├── 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/
    ├── bibs.bib
    ├── compile.sh
    └── tut.tex

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto

###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs     diff=csharp

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following 
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.csproj    merge=binary
#*.vbproj    merge=binary
#*.vcxproj   merge=binary
#*.vcproj    merge=binary
#*.dbproj    merge=binary
#*.fsproj    merge=binary
#*.lsproj    merge=binary
#*.wixproj   merge=binary
#*.modelproj merge=binary
#*.sqlproj   merge=binary
#*.wwaproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
# 
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the 
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain


================================================
FILE: .github/workflows/build_and_release.yml
================================================

name: Build Release

on:
  push:
    tags:
      - "v*"
  pull_request:
    branches:
      - "*"

  workflow_dispatch:

jobs:
  upload-release:
    if: ${{ (github.event_name == 'workflow_dispatch') || (github.event_name != 'pull_request') }}
    runs-on: ubuntu-20.04
    needs: [build-mac, build-mac-arm, build-linux, build-windows]

    steps:
    - uses: actions/checkout@v1
    - name: create release
      id: create_release
      uses: actions/create-release@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}
      with:
        tag_name: ${{ github.ref }}
        release_name: Release ${{ github.sha }}
        draft: false
        prerelease: false   
    - name: download artifacts
      uses: actions/download-artifact@v4
      # with:
      #   name: uploads     
    - name: upload mac
      id: upload-mac
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./mac-uploads/sioyek-release-mac.zip
        asset_name: sioyek-release-mac.zip
        asset_content_type: application/zip   

    - name: upload mac arm
      id: upload-mac-arm
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./mac-arm-uploads/sioyek-release-mac-arm.zip
        asset_name: sioyek-release-mac-arm.zip
        asset_content_type: application/zip   

    - name: upload linux
      id: upload-linux
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./linux-uploads/sioyek-release-linux.zip
        asset_name: sioyek-release-linux.zip
        asset_content_type: application/zip   
    - name: upload windows
      id: upload-windows
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./windows-uploads/sioyek-release-windows.zip
        asset_name: sioyek-release-windows.zip
        asset_content_type: application/zip

  build-linux:

    runs-on: ubuntu-20.04

    steps:
    - name: Cache apt-get packages
      uses: actions/cache@v4
      env:
        cache-name: cache-deb-packages
      with:
        path: /var/cache/apt/archives
        key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
        restore-keys: |
          ${{ runner.os }}-build-${{ env.cache-name }}-
          ${{ runner.os }}-build-
          ${{ runner.os }}-

    - name: Install LinuxDeploy
      uses: miurahr/install-linuxdeploy-action@v1
      with:
        plugins: qt appimage

    - name: Set up GCC
      uses: egor-tensin/setup-gcc@v1
      with:
        version: 9
        platform: x64

    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'

    - name: Install dependencies
      run: sudo apt install libharfbuzz-dev libxrandr-dev libxi-dev libglu1-mesa-dev fuse libxcb-cursor0 libspeechd2
      
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}

      run: MAKE_PARALLEL=$(nproc) ./linuxdeploy_build_and_release.sh
      env:
        CC:   gcc-9
        CXX:  g++-9
    - name: upload linux artifact
      uses: actions/upload-artifact@v4
      with:
        name: linux-uploads
        path: sioyek-release-linux.zip
    - name: Workaround apt-get cache permission (https://github.com/actions/cache/issues/324)
      run: |
        export USER_NAME=$(whoami)
        sudo chown -R $USER_NAME /var/cache/apt/archives

  build-windows:

    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'
    
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v1.0.2

    - name: Add msvc-dev-cmd
      uses: ilammy/msvc-dev-cmd@v1
      
      
    - name: Build Sioyek
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: .\build_windows.bat non_portable
      
    - name: upload windows artifact
      uses: actions/upload-artifact@v4
      with:
        name: windows-uploads
        path: sioyek-release-windows.zip
        
  build-mac:

    runs-on: macos-13

    steps:

    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'

    - name: Cache Homebrew packages
      uses: actions/cache@v4
      env:
        cache-name: homebrew
      with:
        path: ~/Library/Caches/Homebrew
        key: ${{ runner.os }}-intel-build-${{ env.cache-name }}-${{ github.sha }}
        restore-keys: |
          ${{ runner.os }}-intel-build-${{ env.cache-name }}-
          ${{ runner.os }}-intel-build-
          ${{ runner.os }}-intel-

    - name: Install dependencies
      run:  brew install freeglut mesa harfbuzz 
      
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: |
        chmod +x build_mac.sh
        MAKE_PARALLEL=$(sysctl -n hw.logicalcpu) ./build_mac.sh
        
    - name: upload mac artifact
      uses: actions/upload-artifact@v4
      with:
        name: mac-uploads
        path: sioyek-release-mac.zip

  build-mac-arm:

    runs-on: macos-14

    steps:

    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'

    - name: Cache Homebrew packages
      uses: actions/cache@v4
      env:
        cache-name: homebrew
      with:
        path: ~/Library/Caches/Homebrew
        key: ${{ runner.os }}-arm-build-${{ env.cache-name }}-${{ github.sha }}
        restore-keys: |
          ${{ runner.os }}-arm-build-${{ env.cache-name }}-
          ${{ runner.os }}-arm-build-
          ${{ runner.os }}-arm-

    - name: Install dependencies
      run:  brew install freeglut mesa harfbuzz 
      
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: |
        chmod +x build_mac.sh
        MAKE_PARALLEL=$(sysctl -n hw.logicalcpu) ./build_mac.sh
        mv sioyek-release-mac.zip sioyek-release-mac-arm.zip
        
    - name: upload mac artifact
      uses: actions/upload-artifact@v4
      with:
        name: mac-arm-uploads
        path: sioyek-release-mac-arm.zip


================================================
FILE: .github/workflows/preview_release.yml
================================================

name: Preview Release

on:
  push:
    tags:
      - "v*"
  pull_request:
    branches:
      - "*"

  workflow_dispatch:

jobs:
  upload-release:
    if: ${{ (github.event_name == 'workflow_dispatch') || (github.event_name != 'pull_request') }}
    runs-on: ubuntu-20.04
    needs: [build-mac, build-mac-arm, build-linux, build-windows]

    steps:
    - uses: actions/checkout@v1
    - name: create release
      id: create_release
      uses: actions/create-release@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}
      with:
        tag_name: ${{ github.ref }}
        release_name: Release ${{ github.sha }}
        draft: false
        prerelease: true
    - name: download artifacts
      uses: actions/download-artifact@v4
      # with:
      #   name: uploads     
    - name: upload mac
      id: upload-mac
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./mac-uploads/sioyek-release-mac.zip
        asset_name: sioyek-release-mac.zip
        asset_content_type: application/zip   

    - name: upload mac arm
      id: upload-mac-arm
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./mac-arm-uploads/sioyek-release-mac-arm.zip
        asset_name: sioyek-release-mac-arm.zip
        asset_content_type: application/zip   

    - name: upload linux
      id: upload-linux
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./linux-uploads/sioyek-release-linux.zip
        asset_name: sioyek-release-linux.zip
        asset_content_type: application/zip   
    - name: upload windows
      id: upload-windows
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./windows-uploads/sioyek-release-windows.zip
        asset_name: sioyek-release-windows.zip
        asset_content_type: application/zip

  build-linux:

    runs-on: ubuntu-20.04

    steps:
    - name: Cache apt-get packages
      uses: actions/cache@v4
      env:
        cache-name: cache-deb-packages
      with:
        path: /var/cache/apt/archives
        key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
        restore-keys: |
          ${{ runner.os }}-build-${{ env.cache-name }}-
          ${{ runner.os }}-build-
          ${{ runner.os }}-

    - name: Install LinuxDeploy
      uses: miurahr/install-linuxdeploy-action@v1
      with:
        plugins: qt appimage

    - name: Set up GCC
      uses: egor-tensin/setup-gcc@v1
      with:
        version: 9
        platform: x64

    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'
            ref: development

    - name: Install dependencies
      run: sudo apt install libharfbuzz-dev libxrandr-dev libxi-dev libglu1-mesa-dev fuse libxcb-cursor0 libspeechd2
      
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}

      run: MAKE_PARALLEL=$(nproc) ./linuxdeploy_build_and_release.sh
      env:
        CC:   gcc-9
        CXX:  g++-9
    - name: upload linux artifact
      uses: actions/upload-artifact@v4
      with:
        name: linux-uploads
        path: sioyek-release-linux.zip
    - name: Workaround apt-get cache permission (https://github.com/actions/cache/issues/324)
      run: |
        export USER_NAME=$(whoami)
        sudo chown -R $USER_NAME /var/cache/apt/archives

  build-windows:

    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'
            ref: development
    
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v1.0.2

    - name: Add msvc-dev-cmd
      uses: ilammy/msvc-dev-cmd@v1
      
      
    - name: Build Sioyek
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: .\build_windows.bat non_portable
      
    - name: upload windows artifact
      uses: actions/upload-artifact@v4
      with:
        name: windows-uploads
        path: sioyek-release-windows.zip
        
  build-mac:

    runs-on: macos-13

    steps:

    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'
            ref: development

    - name: Cache Homebrew packages
      uses: actions/cache@v4
      env:
        cache-name: homebrew
      with:
        path: ~/Library/Caches/Homebrew
        key: ${{ runner.os }}-intel-build-${{ env.cache-name }}-${{ github.sha }}
        restore-keys: |
          ${{ runner.os }}-intel-build-${{ env.cache-name }}-
          ${{ runner.os }}-intel-build-
          ${{ runner.os }}-intel-

    - name: Install dependencies
      run:  brew install freeglut mesa harfbuzz 
      
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: |
        chmod +x build_mac.sh
        MAKE_PARALLEL=$(sysctl -n hw.logicalcpu) ./build_mac.sh
        
    - name: upload mac artifact
      uses: actions/upload-artifact@v4
      with:
        name: mac-uploads
        path: sioyek-release-mac.zip

  build-mac-arm:

    runs-on: macos-14

    steps:

    - uses: actions/checkout@v4
      with:
            submodules: 'recursive'
            ref: development

    - name: Cache Homebrew packages
      uses: actions/cache@v4
      env:
        cache-name: homebrew
      with:
        path: ~/Library/Caches/Homebrew
        key: ${{ runner.os }}-arm-build-${{ env.cache-name }}-${{ github.sha }}
        restore-keys: |
          ${{ runner.os }}-arm-build-${{ env.cache-name }}-
          ${{ runner.os }}-arm-build-
          ${{ runner.os }}-arm-

    - name: Install dependencies
      run:  brew install freeglut mesa harfbuzz 
      
    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.7.2'
        modules: 'all'
        cache: true

    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: |
        chmod +x build_mac.sh
        MAKE_PARALLEL=$(sysctl -n hw.logicalcpu) ./build_mac.sh
        mv sioyek-release-mac.zip sioyek-release-mac-arm.zip
        
    - name: upload mac artifact
      uses: actions/upload-artifact@v4
      with:
        name: mac-arm-uploads
        path: sioyek-release-mac-arm.zip


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/
packages.config

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb
*.o
*.db
sioyek-release/*
linux-deploy-binaries/*
build/*
.build
*.zip
*.sln
*.vcxproj
*.vcxproj.filters
*.vcxproj.user
moc*

# Linux and Mac build files
Makefile
libs/*
lib_debug/*
lib_release/*
*.rc
pdf_viewer/fonts/*
*.stash
pdf_viewer/todo.txt
sioyek_log.txt
fast/*
debuglibs/*
tutorial/*.aux
tutorial/*.fdb_latexmk
tutorial/*.fls
tutorial/*.pdf
tutorial/*.synctex.gz
tutorial/*.bbl
tutorial/*.blg
*.o.d
compile_commands.json

sioyek_autogen/*
sioyek.app/*
qrc_resources.cpp
*.cmake
bak/*
CMakeFiles/*
CMakeCache.txt
.rcc/*
.qt_plugins/*
.qt/*
.DS_STORE
tutorial/*.blg

#Nix generated
result
flake*
*.nix

# ctags
tags
.vscode


================================================
FILE: .gitmodules
================================================
[submodule "mupdf"]
	path = mupdf
	url = https://github.com/ArtifexSoftware/mupdf
    ignore = dirty
[submodule "zlib"]
	path = zlib
	url = https://github.com/madler/zlib
	ignore = untracked


================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.16)
project(sioyek VERSION 2.0.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Qt Stuff
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
if(QT_VERSION_MAJOR GREATER_EQUAL 6)
  find_package(Qt6 REQUIRED COMPONENTS
        Core Gui Widgets Network OpenGL QuickWidgets
        Svg TextToSpeech OpenGLWidgets
  )
else()
  find_package(Qt5 REQUIRED COMPONENTS
        Core Gui Widgets Network OpenGL QuickWidgets
        Svg TextToSpeech OpenGLExtensions
  )
endif()

qt_standard_project_setup()

qt_add_executable(sioyek WIN32 MACOSX_BUNDLE
    resources.qrc
    pdf_viewer/OpenWithApplication.cpp pdf_viewer/OpenWithApplication.h
    pdf_viewer/RunGuard.cpp pdf_viewer/RunGuard.h
    pdf_viewer/book.cpp pdf_viewer/book.h
    pdf_viewer/checksum.cpp pdf_viewer/checksum.h
    pdf_viewer/config.cpp pdf_viewer/config.h
    pdf_viewer/coordinates.cpp pdf_viewer/coordinates.h
    pdf_viewer/database.cpp pdf_viewer/database.h
    pdf_viewer/document.cpp pdf_viewer/document.h
    pdf_viewer/document_view.cpp pdf_viewer/document_view.h
    pdf_viewer/fts_fuzzy_match.h
    pdf_viewer/input.cpp pdf_viewer/input.h
    pdf_viewer/main.cpp
    pdf_viewer/main_widget.cpp pdf_viewer/main_widget.h
    pdf_viewer/mysortfilterproxymodel.cpp pdf_viewer/mysortfilterproxymodel.h
    pdf_viewer/new_file_checker.cpp pdf_viewer/new_file_checker.h
    pdf_viewer/path.cpp pdf_viewer/path.h
    pdf_viewer/pdf_renderer.cpp pdf_viewer/pdf_renderer.h
    pdf_viewer/pdf_view_opengl_widget.cpp pdf_viewer/pdf_view_opengl_widget.h
    pdf_viewer/rapidfuzz_amalgamated.hpp
    pdf_viewer/touchui/TouchAudioButtons.cpp pdf_viewer/touchui/TouchAudioButtons.h
    pdf_viewer/touchui/TouchCheckbox.cpp pdf_viewer/touchui/TouchCheckbox.h
    pdf_viewer/touchui/TouchConfigMenu.cpp pdf_viewer/touchui/TouchConfigMenu.h
    pdf_viewer/touchui/TouchCopyOptions.cpp pdf_viewer/touchui/TouchCopyOptions.h
    pdf_viewer/touchui/TouchDeleteButton.cpp pdf_viewer/touchui/TouchDeleteButton.h
    pdf_viewer/touchui/TouchDrawControls.cpp pdf_viewer/touchui/TouchDrawControls.h
    pdf_viewer/touchui/TouchGenericButtons.cpp pdf_viewer/touchui/TouchGenericButtons.h
    pdf_viewer/touchui/TouchHighlightButtons.cpp pdf_viewer/touchui/TouchHighlightButtons.h
    pdf_viewer/touchui/TouchListView.cpp pdf_viewer/touchui/TouchListView.h
    pdf_viewer/touchui/TouchMacroEditor.cpp pdf_viewer/touchui/TouchMacroEditor.h
    pdf_viewer/touchui/TouchMainMenu.cpp pdf_viewer/touchui/TouchMainMenu.h
    pdf_viewer/touchui/TouchMarkSelector.cpp pdf_viewer/touchui/TouchMarkSelector.h
    pdf_viewer/touchui/TouchPageSelector.cpp pdf_viewer/touchui/TouchPageSelector.h
    pdf_viewer/touchui/TouchRangeSelectUI.cpp pdf_viewer/touchui/TouchRangeSelectUI.h
    pdf_viewer/touchui/TouchRectangleSelectUI.cpp pdf_viewer/touchui/TouchRectangleSelectUI.h
    pdf_viewer/touchui/TouchSearchButtons.cpp pdf_viewer/touchui/TouchSearchButtons.h
    pdf_viewer/touchui/TouchSettings.cpp pdf_viewer/touchui/TouchSettings.h
    pdf_viewer/touchui/TouchSlider.cpp pdf_viewer/touchui/TouchSlider.h
    pdf_viewer/touchui/TouchTextEdit.cpp pdf_viewer/touchui/TouchTextEdit.h
    pdf_viewer/ui.cpp pdf_viewer/ui.h
    pdf_viewer/utf8.h
    pdf_viewer/utf8/checked.h
    pdf_viewer/utf8/core.h
    pdf_viewer/utf8/unchecked.h
    pdf_viewer/utils.cpp pdf_viewer/utils.h
)

if(APPLE)
  target_sources(sioyek PRIVATE
        pdf_viewer/macos_specific.mm
  )
endif()

target_compile_options(sioyek PRIVATE -Wno-inconsistent-missing-override)

target_include_directories(sioyek PRIVATE 
    pdf_viewer 
    mupdf/include
    ${SQLite3_INCLUDE_DIRS}
)

target_compile_definitions(sioyek PRIVATE
    QT_OPENGLEXTENSIONS_LIB
    QT_OPENGL_LIB
    QT_WIDGETS_LIB
)

target_link_libraries(sioyek PRIVATE
    Qt::Core
    Qt::Gui
    Qt::Network
    Qt::OpenGL
    Qt::QuickWidgets
    Qt::Svg
    Qt::TextToSpeech
    Qt::Widgets
)

if(NOT ANDROID)
  target_sources(sioyek PUBLIC
        pdf_viewer/synctex/synctex_parser.c pdf_viewer/synctex/synctex_parser.h
        pdf_viewer/synctex/synctex_parser_utils.c pdf_viewer/synctex/synctex_parser_utils.h
  )
else()
  target_compile_definitions(sioyek PRIVATE
        SIOYEK_ANDROID
  )
endif()

if(WIN32)
  target_compile_definitions(sioyek PRIVATE
        _CRT_SECURE_NO_WARNINGS
        _CRT_NONSTDC_NO_DEPRECATE
        NOMINMAX
  )

  if(MSVC)
    target_compile_options(sioyek PRIVATE /bigobj /MP)
  endif()
endif()

if(UNIX AND NOT APPLE)
  target_compile_definitions(sioyek PRIVATE
        LINUX_STANDARD_PATHS
  )
endif()

find_package(ZLIB REQUIRED)
find_package(HarfBuzz REQUIRED)
find_package(SQLite3 REQUIRED)

if((QT_VERSION_MAJOR GREATER 5))
  target_compile_definitions(sioyek PRIVATE
        SIOYEK_QT6
  )

  target_link_libraries(sioyek PRIVATE
        Qt::OpenGLWidgets
  )
endif()

add_library(fzf STATIC
    fzf/fzf.c
    fzf/fzf.h
)

target_link_libraries(sioyek PRIVATE
    ${CMAKE_DL_LIBS}
    mupdf
    ${HARFBUZZ_LIBRARIES}
    ZLIB::ZLIB
    fzf
    SQLite::SQLite3
)

if(APPLE)
  # target_link_libraries(sioyek PRIVATE
  #       "-framework AppKit"
  #       mupdf-third
  #       mupdf-threads
  # )
  target_link_libraries(sioyek PRIVATE
      "-framework AppKit"
      -ldl
      -L${CMAKE_CURRENT_SOURCE_DIR}/mupdf/build/release
      -lmupdf
      -lmupdf-third
      -lmupdf-threads
      -lz
  )
else()
  string(REPLACE "-mno-direct-extern-access" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()

install(TARGETS sioyek
    BUNDLE DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

qt_generate_deploy_app_script(
    TARGET sioyek
    OUTPUT_SCRIPT deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program 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.

    This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
# Sioyek

Sioyek is a PDF viewer with a focus on textbooks and research papers.

# Development Branch FAQ

## Q: There are build errors with Qt 5.*.

A: If you are building the development branch you need to use Qt 6.7 or 6.8.

## Q: On MacOS I get "sioyek is damaged and cannot be opened. It is recommended to eject the image.".

A: This is related to macOS quarantine. See https://github.com/ahrm/sioyek/discussions/1156#discussioncomment-10822738 .


## Contents
* [Installation](#install)
* [Documentation](#documentation)
* [Video Demo](#feature-video-overview)
* [Features](#features)
* [Build Instructions](#build-instructions)
* [Buy Me a Coffee (or a Book!)](#donation)

## Install
### Official packages
There are installers for Windows, macOS and Linux. See [Releases page](https://github.com/ahrm/sioyek/releases).

### Homebew Cask
There is a homebrew cask available here: https://formulae.brew.sh/cask/sioyek. Install by running:
```
brew install --cask sioyek
```
### Third-party packages for Linux
If you prefer to install sioyek with a package manager, you can look at this list. Please note that they are provided by third party packagers. USE AT YOUR OWN RISK! If you're reporting a bug for a third-party package, please mention which package you're using.

Distro | Link | Maintainer
------- | ----- | -------------
Flathub | [sioyek](https://flathub.org/apps/details/com.github.ahrm.sioyek) | [@nbenitez](https://flathub.org/apps/details/com.github.ahrm.sioyek)
Alpine | [sioyek](https://pkgs.alpinelinux.org/packages?name=sioyek) | [@jirutka](https://github.com/jirutka)
Arch | [AUR sioyek](https://aur.archlinux.org/packages/sioyek) | [@goggle](https://github.com/goggle)
Arch | [AUR Sioyek-git](https://aur.archlinux.org/packages/sioyek-git/) | [@randomn4me](https://github.com/randomn4me)
Arch | [AUR sioyek-appimage](https://aur.archlinux.org/packages/sioyek-appimage/) | [@DhruvaSambrani](https://github.com/DhruvaSambrani)
Debian | [sioyek](https://packages.debian.org/sioyek) | [@viccie30](https://github.com/viccie30)
NixOS | [sioyek](https://search.nixos.org/packages?channel=unstable&show=sioyek&from=0&size=50&sort=relevance&type=packages&query=sioyek) | [@podocarp](https://github.com/podocarp)
openSUSE | [Publishing](https://build.opensuse.org/package/show/Publishing/sioyek) | [@uncomfyhalomacro](https://github.com/uncomfyhalomacro)
openSUSE | [Factory](https://build.opensuse.org/package/show/openSUSE:Factory/sioyek) | [@uncomfyhalomacro](https://github.com/uncomfyhalomacro)
Ubuntu | [sioyek](https://packages.ubuntu.com/sioyek) | [@viccie30](https://github.com/viccie30)


## Documentation
You can view the official documentation [here](https://sioyek-documentation.readthedocs.io/en/latest/).
## Feature Video Overview

[![Sioyek feature overview](https://img.youtube.com/vi/yTmCI0Xp5vI/0.jpg)](https://www.youtube.com/watch?v=yTmCI0Xp5vI)

For a more in-depth tutorial, see this video:

[![Sioyek Tutorial](https://img.youtube.com/vi/RaHRvnb0dY8/0.jpg)](https://www.youtube.com/watch?v=RaHRvnb0dY8)

## Features

### Quick Open

https://user-images.githubusercontent.com/6392321/125321111-9b29dc00-e351-11eb-873e-94ea30016a05.mp4

You can quickly search and open any file you have previously interacted with using sioyek.

### Table of Contents

https://user-images.githubusercontent.com/6392321/125321313-cf050180-e351-11eb-9275-c2759c684af5.mp4

You can search and jump to table of contents entries.

### Smart Jump

https://user-images.githubusercontent.com/6392321/125321419-e5ab5880-e351-11eb-9688-95374a22774f.mp4

You can jump to any referenced figure or bibliography item *even if the PDF file doesn't provide links*. You can also search the names of bibliography items in google scholar/libgen by middle clicking/shift+middle clicking on their name.

### Overview

https://user-images.githubusercontent.com/6392321/154683015-0bae4f92-78e2-4141-8446-49dd7c2bd7c9.mp4

You can open a quick overview of figures/references/tables/etc. by right clicking on them (Like Smart Jump, this feature works even if the document doesn't provide links).

### Mark

https://user-images.githubusercontent.com/6392321/125321811-505c9400-e352-11eb-85e0-ffc3ae5f8cb8.mp4

Sometimes when reading a document you need to go back a few pages (perhaps to view a definition or something) and quickly jump back to where you were. You can achieve this by using marks. Marks are named locations within a PDF file (each mark has a single character name for example 'a' or 'm') which you can quickly jump to using their name. In the aforementioned example, before going back to the definition you mark your location and later jump back to the mark by invoking its name. Lower case marks are local to the document and upper case marks are global (this should be very familiar to you if you have used vim).

### Bookmarks

https://user-images.githubusercontent.com/6392321/125322503-1a6bdf80-e353-11eb-8018-5e8fc43b8d05.mp4

Bookmarks are similar to marks except they are named by a text string and they are all global.

### Highlights


https://user-images.githubusercontent.com/6392321/130956728-7e0a87fa-4ada-4108-a8fc-9d9d04180f56.mp4


Highlight text using different kinds of highlights. You can search among all the highlights.

### Portals (this feature is most useful for users with multiple monitors)



https://user-images.githubusercontent.com/6392321/125322657-41c2ac80-e353-11eb-985e-8f3ce9808f67.mp4

Suppose you are reading a paragraph which references a figure which is not very close to the current location. Jumping back and forth between the current paragraph and the figure can be very annoying. Using portals, you can link the paragraph's location to the figure's location. Sioyek shows the closest portal destination in a separate window (which is usually placed on a second monitor). This window is automatically updated to show the closest portal destination as the user navigates the document.


### Configuration


https://user-images.githubusercontent.com/6392321/125337160-e4832700-e363-11eb-8801-0bee58121c2d.mp4

You can customize all key bindings and some UI elements by editing `keys_user.config` and `prefs_user.config`. The default configurations are in `keys.config` and `prefs.config`.



## Build Instructions

### Linux

#### Fedora

Run the following commands to install dependencies, clone the repository and compile sioyek on Fedora (tested on Fedora Workstation 36).

```
sudo dnf install qt5-qtbase-devel qt5-qtbase-static qt5-qt3d-devel harfbuzz-devel
git clone --recursive --branch development https://github.com/ahrm/sioyek
cd sioyek
./build_linux.sh
``` 

#### Generic distribution
1. Install Qt 5 and make sure `qmake` is in `PATH`.

    Run `qmake --version` to make sure the `qmake` in path is using Qt 5.x.
2. Install `libharfbuzz`:
```
sudo apt install libharfbuzz-dev
```
3. Clone the repository and build:
```
git clone --recursive --branch development https://github.com/ahrm/sioyek
cd sioyek
./build_linux.sh
```

### Windows
1. Install Visual Studio (tested on 2019, other relatively recent versions should work too)
2. Install Qt 5 and make sure qmake is in `PATH`.
3. Clone the repository and build using 64 bit Visual Studio Developer Command Prompt:
```
git clone --recursive --branch development https://github.com/ahrm/sioyek
cd sioyek
build_windows.bat
```

### Mac
1. Uninstall previous Qt6 installed by Homebrew
2. Install Xcode.
3. Install Qt6.
```
pip install aqtinstall
cd /path/to/qt
aqt install-qt mac desktop 6.8.2 clang_64 -m all
export Qt6_DIR=/path/to/qt/6.8.2/macos/
export QT_PLUGIN_PATH=/path/to/qt/6.8.2/macos/plugins
export PKG_CONFIG_PATH=/path/to/qt/6.8.2/macos/lib/pkgconfig
export QML2_IMPORT_PATH=/path/to/qt/6.8.2/macos/qml
export PATH="/path/to/qt/6.8.2/macos/bin:$PATH"
```
4. Clone the repository, build and install:
```
git clone --recursive --branch development https://github.com/ahrm/sioyek
cd sioyek
chmod +x build_mac.sh
setopt PIPE_FAIL PRINT_EXIT_VALUE ERR_RETURN SOURCE_TRACE XTRACE
MAKE_PARALLEL=8 ./build_mac.sh

mv build/sioyek.app /Applications/
sudo codesign --force --sign - --deep /Applications/sioyek.app
```

## Donation
If you enjoy sioyek, please consider donating to support its development.

<a href="https://www.buymeacoffee.com/ahrm" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>


================================================
FILE: android/AndroidManifest.xml
================================================
<?xml version="1.0"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.qtproject.example" android:installLocation="auto" android:versionCode="-- %%INSERT_VERSION_CODE%% --" android:versionName="-- %%INSERT_VERSION_NAME%% --">
    <!-- %%INSERT_PERMISSIONS -->
    <!-- %%INSERT_FEATURES -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true"/>
    <application android:name="org.qtproject.qt.android.bindings.QtApplication" android:hardwareAccelerated="true" android:label="-- %%INSERT_APP_NAME%% --" android:requestLegacyExternalStorage="true" android:allowNativeHeapPointerTagging="false" android:allowBackup="true" android:fullBackupOnly="false" android:icon="@drawable/icon">
        <service android:name="info.sioyek.sioyek.TextToSpeechService" android:foregroundServiceType="mediaPlayback" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="androidx.media3.session.MediaSessionService"/>
            </intent-filter>
        </service>

        <activity android:name="info.sioyek.sioyek.SioyekActivity" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:label="-- %%INSERT_APP_NAME%% --" android:launchMode="singleInstance" android:screenOrientation="unspecified" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
            <meta-data android:name="android.app.arguments" android:value="-- %%INSERT_APP_ARGUMENTS%% --"/>
            <meta-data android:name="android.app.extract_android_style" android:value="minimal"/>
            <!-- <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <data android:scheme="file" />
                <data android:host="*" />
                <data android:pathPattern=".*\\.pdf" />

            </intent-filter> -->
            <intent-filter>
                <action android:name="android.intent.action.OPEN_DOCUMENT"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="application/pdf"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="application/pdf"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.OPEN_DOCUMENT"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="application/epub+zip"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="application/epub+zip"/>
            </intent-filter>
        </activity>
    </application>
</manifest>


================================================
FILE: android/build.gradle
================================================
buildscript {
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.1'
    }
}

repositories {
    google()
    mavenCentral()
}

apply plugin: 'com.android.application'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.9.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.navigation:navigation-fragment:2.5.3'
    implementation 'androidx.navigation:navigation-ui:2.5.3'
    implementation 'androidx.media:media:1.6.0'
    implementation "androidx.media3:media3-exoplayer:1.0.1"
    implementation "androidx.media3:media3-ui:1.0.1"
    implementation "androidx.media3:media3-common:1.0.1"
    implementation 'androidx.media3:media3-session:1.0.1'

}

android {
    /*******************************************************
     * The following variables:
     * - androidBuildToolsVersion,
     * - androidCompileSdkVersion
     * - qtAndroidDir - holds the path to qt android files
     *                   needed to build any Qt application
     *                   on Android.
     *
     * are defined in gradle.properties file. This file is
     * updated by QtCreator and androiddeployqt tools.
     * Changing them manually might break the compilation!
     *******************************************************/

    compileSdkVersion androidCompileSdkVersion.toInteger()
    buildToolsVersion androidBuildToolsVersion
    ndkVersion androidNdkVersion

    // Extract native libraries from the APK
    packagingOptions.jniLibs.useLegacyPackaging true

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = [qtAndroidDir + '/src', 'src', 'java']
            aidl.srcDirs = [qtAndroidDir + '/src', 'src', 'aidl']
            res.srcDirs = [qtAndroidDir + '/res', 'res']
            resources.srcDirs = ['resources']
            renderscript.srcDirs = ['src']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
       }
    }

    tasks.withType(JavaCompile) {
        options.incremental = true
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }

    // Do not compress Qt binary resources file
    aaptOptions {
        noCompress 'rcc'
    }

    defaultConfig {
        resConfig "en"
        minSdkVersion qtMinSdkVersion
        targetSdkVersion qtTargetSdkVersion
        ndk.abiFilters = qtTargetAbiList.split(",")
    }
}


================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: android/gradle.properties
================================================
# Project-wide Gradle settings.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# Enable building projects in parallel
org.gradle.parallel=true

# Gradle caching allows reusing the build artifacts from a previous
# build with the same inputs. However, over time, the cache size will
# grow. Uncomment the following line to enable it.
#org.gradle.caching=true

android.useAndroidX=true
android.enableJetifier=true


================================================
FILE: android/gradlew
================================================
#!/bin/sh

#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
#
#   Gradle start up script for POSIX generated by Gradle.
#
#   Important for running:
#
#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
#       noncompliant, but you have some other compliant shell such as ksh or
#       bash, then to run this script, type that shell name before the whole
#       command line, like:
#
#           ksh Gradle
#
#       Busybox and similar reduced shells will NOT work, because this script
#       requires all of these POSIX shell features:
#         * functions;
#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
#         * compound commands having a testable exit status, especially «case»;
#         * various built-in commands including «command», «set», and «ulimit».
#
#   Important for patching:
#
#   (2) This script targets any POSIX shell, so it avoids extensions provided
#       by Bash, Ksh, etc; in particular arrays are avoided.
#
#       The "traditional" practice of packing multiple parameters into a
#       space-separated string is a well documented source of bugs and security
#       problems, so this is (mostly) avoided, by progressively accumulating
#       options in "$@", and eventually passing that to Java.
#
#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
#       see the in-line comments for details.
#
#       There are tweaks for specific operating systems such as AIX, CygWin,
#       Darwin, MinGW, and NonStop.
#
#   (3) This script is generated from the Groovy template
#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
#       within the Gradle project.
#
#       You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################

# Attempt to set APP_HOME

# Resolve links: $0 may be a link
app_path=$0

# Need this for daisy-chained symlinks.
while
    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
    [ -h "$app_path" ]
do
    ls=$( ls -ld "$app_path" )
    link=${ls#*' -> '}
    case $link in             #(
      /*)   app_path=$link ;; #(
      *)    app_path=$APP_HOME$link ;;
    esac
done

APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

warn () {
    echo "$*"
} >&2

die () {
    echo
    echo "$*"
    echo
    exit 1
} >&2

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in                #(
  CYGWIN* )         cygwin=true  ;; #(
  Darwin* )         darwin=true  ;; #(
  MSYS* | MINGW* )  msys=true    ;; #(
  NONSTOP* )        nonstop=true ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar


# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD=$JAVA_HOME/jre/sh/java
    else
        JAVACMD=$JAVA_HOME/bin/java
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD=java
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
    case $MAX_FD in #(
      max*)
        MAX_FD=$( ulimit -H -n ) ||
            warn "Could not query maximum file descriptor limit"
    esac
    case $MAX_FD in  #(
      '' | soft) :;; #(
      *)
        ulimit -n "$MAX_FD" ||
            warn "Could not set maximum file descriptor limit to $MAX_FD"
    esac
fi

# Collect all arguments for the java command, stacking in reverse order:
#   * args from the command line
#   * the main class name
#   * -classpath
#   * -D...appname settings
#   * --module-path (only if needed)
#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.

# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )

    JAVACMD=$( cygpath --unix "$JAVACMD" )

    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    for arg do
        if
            case $arg in                                #(
              -*)   false ;;                            # don't mess with options #(
              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
                    [ -e "$t" ] ;;                      #(
              *)    false ;;
            esac
        then
            arg=$( cygpath --path --ignore --mixed "$arg" )
        fi
        # Roll the args list around exactly as many times as the number of
        # args, so each arg winds up back in the position where it started, but
        # possibly modified.
        #
        # NB: a `for` loop captures its iteration list before it begins, so
        # changing the positional parameters here affects neither the number of
        # iterations, nor the values presented in `arg`.
        shift                   # remove old arg
        set -- "$@" "$arg"      # push replacement arg
    done
fi

# Collect all arguments for the java command;
#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
#     shell script including quotes and variable substitutions, so put them in
#     double quotes to make sure that they get re-expanded; and
#   * put everything else in single quotes, so that it's not re-expanded.

set -- \
        "-Dorg.gradle.appname=$APP_BASE_NAME" \
        -classpath "$CLASSPATH" \
        org.gradle.wrapper.GradleWrapperMain \
        "$@"

# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
#   set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#

eval "set -- $(
        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
        xargs -n1 |
        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
        tr '\n' ' '
    )" '"$@"'

exec "$JAVACMD" "$@"


================================================
FILE: android/gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem      https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto execute

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar


@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: android/res/values/libs.xml
================================================
<?xml version='1.0' encoding='utf-8'?>
<resources>
    <!-- DO NOT EDIT THIS: This file is populated automatically by the deployment tool. -->

    <array name="bundled_libs">
        <!-- %%INSERT_EXTRA_LIBS%% -->
    </array>

    <array name="qt_libs">
        <!-- %%INSERT_QT_LIBS%% -->
    </array>

    <array name="load_local_libs">
        <!-- %%INSERT_LOCAL_LIBS%% -->
    </array>

    <string name="static_init_classes"><!-- %%INSERT_INIT_CLASSES%% --></string>
    <string name="use_local_qt_libs"><!-- %%USE_LOCAL_QT_LIBS%% --></string>
    <string name="bundle_local_qt_libs"><!-- %%BUNDLE_LOCAL_QT_LIBS%% --></string>
    <string name="system_libs_prefix"><!-- %%SYSTEM_LIBS_PREFIX%% --></string>
</resources>


================================================
FILE: android/src/info/sioyek/sioyek/SioyekActivity.java
================================================

package info.sioyek.sioyek;

import org.qtproject.qt.android.QtNative;

import org.qtproject.qt.android.bindings.QtActivity;
import android.os.*;
import android.provider.Settings;
import android.os.Environment;
import android.database.Cursor;
import android.provider.MediaStore;
import android.provider.DocumentsContract;
import android.content.*;
import android.app.*;
import android.view.WindowManager;
import android.widget.Toast;
import android.net.Uri;
import android.provider.OpenableColumns;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.String;
import android.content.Intent;
import java.io.File;

import java.lang.String;
import android.content.Intent;
import java.io.File;
import android.net.Uri;
import android.util.Log;
import android.content.ContentResolver;
import android.webkit.MimeTypeMap;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;

import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.media3.session.MediaController;
import androidx.media3.session.SessionToken;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;

import android.view.Menu;
import android.view.MenuItem;



public class SioyekActivity extends QtActivity{
    public static native void setFileUrlReceived(String url);
    public static native void qDebug(String msg);
    public static native void onTts(int begin, int end);
    public static native void onTtsStateChange(String newState);
    public static native void onExternalTtsStateChange(String newState);
    public static native String getRestOnPause();
    public static native void onResumeState(boolean isPlaying, boolean readingRest, int offset);

    public static boolean isIntentPending;
    public static boolean isInitialized;
    public static boolean isPaused = true;

    private static SioyekActivity instance = null;

    private MediaController mediaController = null;
    private SessionToken ttsSessionToken = null;

    private BroadcastReceiver messageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int begin = intent.getIntExtra("begin", 0);
            int end = intent.getIntExtra("end", 0);
            onTts(begin, end);
        }
    };

    private BroadcastReceiver stateMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String state = intent.getStringExtra("state");
            onTtsStateChange(state);
        }
    };

    private BroadcastReceiver externalStateMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String state = intent.getStringExtra("state");
            onExternalTtsStateChange(state);
            //onTtsStateChange(state);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);


        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        Intent intent = getIntent();

        if (intent != null){
            String action = intent.getAction();
            if (action != null){
                Uri intentUri = intent.getData();
                if (intentUri != null){
                    if (intentUri.toString().startsWith("content://") && (!intentUri.toString().startsWith("content://com.android")) && (!intentUri.toString().startsWith("content://media")) && (intentUri.toString().indexOf("@media") == -1)){
                        //Toast.makeText(this, "Opening files from other apps is not supported. Download the file and open it from file manager.", Toast.LENGTH_LONG).show();

                        Intent viewIntent = new Intent(getApplicationContext(), SioyekActivity.class);
                        // viewIntent.setUri(intentUri);
                        viewIntent.setAction(Intent.ACTION_VIEW);
                        viewIntent.putExtra("sharedData", intentUri.toString());

                        startActivity(viewIntent);
                        if (instance != null){
                            finish();
                        }
                    }
                    isIntentPending = true;
                }
            }
        }

        instance = this;
        if(!Environment.isExternalStorageManager()){

            // Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
            Uri uri = Uri.parse("package:" + "org.qtproject.example");
            try {
                Intent newActivityIntent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri);

                startActivity(
                    newActivityIntent
                );
            }
            catch(Exception e){
            }
        }

    }

    @Override
    public void onStart(){
        super.onStart();
        ttsSessionToken = new SessionToken(getApplicationContext(), new ComponentName(getApplicationContext(), TextToSpeechService.class));
        ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(getApplicationContext(), ttsSessionToken).buildAsync();
        controllerFuture.addListener(() -> {
            try{
                mediaController = controllerFuture.get();
            }
            catch(Exception e){
                qDebug("sioyek: could not get media controller");
            }
        }, MoreExecutors.directExecutor());
        LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, new IntentFilter("sioyek_tts"));
        LocalBroadcastManager.getInstance(this).registerReceiver(stateMessageReceiver, new IntentFilter("sioyek_tts_state"));
        LocalBroadcastManager.getInstance(this).registerReceiver(externalStateMessageReceiver, new IntentFilter("sioyek_external_tts_state"));
    }

    @Override
    public void onStop(){

        super.onStop();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(messageReceiver);
        LocalBroadcastManager.getInstance(this).unregisterReceiver(stateMessageReceiver);
        LocalBroadcastManager.getInstance(this).unregisterReceiver(externalStateMessageReceiver);
    }

    @Override
    public void onResume(){

        isPaused = false;
        Intent intent = new Intent(getApplicationContext(), TextToSpeechService.class);
        intent.putExtra("resume", true);
        startService(intent);

        super.onResume();
    }

    @Override
    public void onPause(){
        isPaused = true;
        String rest = getRestOnPause();

        if (rest.length() > 0){
            setTtsRestOfDocument(rest);
        }

        super.onPause();
    }

    @Override
    public void onNewIntent(Intent intent){
        super.onNewIntent(intent);
        setIntent(intent);
        if (isInitialized){
            processIntent();
        }
        else{
            isIntentPending = true;
        }
    }

    public void checkPendingIntents(String workingDir){
        isInitialized = true;
        if (isIntentPending){
            isIntentPending = false;
            processIntent();
        }
    }

    public static File getFile(Context context, Uri uri) throws IOException {
        File destinationFilename = new File(context.getFilesDir().getPath() + File.separatorChar + queryName(context, uri));

        if (destinationFilename.exists()){
            return destinationFilename;
        }

        try (InputStream ins = context.getContentResolver().openInputStream(uri)) {
            createFileFromStream(ins, destinationFilename);
        } catch (Exception ex) {
            Log.e("Save File", ex.getMessage());
            ex.printStackTrace();
        }
        return destinationFilename;
    }

    public static void createFileFromStream(InputStream ins, File destination) {
        try (OutputStream os = new FileOutputStream(destination)) {
            byte[] buffer = new byte[4096];
            int length;
            while ((length = ins.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
            os.flush();
        } catch (Exception ex) {
            Log.e("Save File", ex.getMessage());
            ex.printStackTrace();
        }
    }

    private static String queryName(Context context, Uri uri) {
        Cursor returnCursor =
                context.getContentResolver().query(uri, null, null, null, null);
        assert returnCursor != null;
        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        returnCursor.moveToFirst();
        String name = returnCursor.getString(nameIndex);
        returnCursor.close();
        return name;
    }

    public static String getRealPathFromUri(Context context, Uri contentUri) throws IOException{
        Cursor cursor = null;
        try {
            String[] proj = { MediaStore.Images.Media.DATA };
            cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
        catch(Exception e){
            String newFileName=  getFile(context, contentUri).getPath();
            return getFile(context, contentUri).getPath();
        }
        finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }

    public static String getPathFromUri(Context context, Uri uri) {
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[] {
                        split[1]
                };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {

            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }

    private void processIntent(){

        Intent intent = getIntent();
        if (intent.getAction().equals("android.intent.action.VIEW")){
            Uri intentUri = intent.getData();
            if (intentUri == null){
                intentUri = Uri.parse(intent.getStringExtra("sharedData"));
            }
            //String realPath = getRealPathFromUri(getApplicationContext(), intentUri);
            //Uri newUri = Uri.fromFile(new File(realPath));

            //setFileUrlReceived(intentUri.toString());
            String realPath = "";
            try{
                realPath = getRealPathFromUri(this, intentUri);
                //Toast.makeText(this, "trying to open " + realPath, Toast.LENGTH_LONG).show();
                setFileUrlReceived(realPath);
            }
            catch(IOException e){
                qDebug("sioyek: could not open" + realPath);
            }
        }
        return;
    }

    public void ttsPause(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mediaController.pause();
            }
        });

    } 

    public void ttsStop(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mediaController.stop();
            }
        });
    } 

    public void ttsSetRate(float rate){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                setTtsRate(rate);
            }
        });
    } 

    public void ttsSetRestOfDocument(String text){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                setTtsRestOfDocument(text);
            }
        });
    } 


    public void ttsSay(String text){
        Intent intent = new Intent(getApplicationContext(), TextToSpeechService.class);
        intent.putExtra("text", text);
        startService(intent);

        Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mediaController.play();
            }
        }, 100);
    }

    public void setTtsRate(float rate){
        Intent intent = new Intent(getApplicationContext(), TextToSpeechService.class);
        intent.putExtra("rate", rate);
        startService(intent);
    }

    public void setTtsRestOfDocument(String rest){
        Intent intent = new Intent(getApplicationContext(), TextToSpeechService.class);
        intent.putExtra("rest", rest);
        startService(intent);
    }

}


================================================
FILE: android/src/info/sioyek/sioyek/TextToSpeechService.java
================================================
package info.sioyek.sioyek;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;

import android.app.NotificationManager;
import android.app.NotificationChannel;
import androidx.core.app.NotificationCompat;
import android.content.Context;

import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.media3.common.MediaMetadata;
import androidx.media3.common.Player;
import androidx.media3.common.SimpleBasePlayer;
import androidx.media3.exoplayer.source.SilenceMediaSource;
import androidx.media3.session.MediaSession;
import androidx.media3.session.MediaSessionService;
import androidx.media3.session.SessionCommand;
import androidx.media3.session.SessionCommands;

import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;

import java.util.Collections;
import java.util.ArrayList;


class CustomPlayer extends SimpleBasePlayer{


    private State state = new State.Builder()
            .setAvailableCommands(new Commands.Builder().addAll(
             COMMAND_PLAY_PAUSE,
             COMMAND_GET_CURRENT_MEDIA_ITEM,
             COMMAND_GET_MEDIA_ITEMS_METADATA).build())
            .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
            .setPlaylist(Collections.singletonList(new MediaItemData.Builder("test").build()))
            .setPlaylistMetadata(new MediaMetadata.Builder().setMediaType(MediaMetadata.MEDIA_TYPE_PLAYLIST).setTitle("tts test").build())
            .setCurrentMediaItemIndex(0)
            .setContentPositionMs(0)
            .build();
    public CustomPlayer(Looper looper){
        super(looper);
    }

    public void updatePlaybackState(int playbackState, Boolean playWhenReady){
        Handler mainHandler = new Handler(Looper.getMainLooper());
        mainHandler.post(() -> {
            state = state.buildUpon()
                    .setPlaybackState(playbackState)
                    .setPlayWhenReady(playWhenReady, Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
                    .build();
            invalidateState();
        });
    }

    @Override
    protected State getState() {
        return state;

    }

    @Override
    protected ListenableFuture<?> handleSetPlayWhenReady(boolean playWhenReady) {
        return Futures.immediateVoidFuture();

    }
}
public class TextToSpeechService extends MediaSessionService {

    private MediaSession mediaSession = null;
    private SilenceMediaSource mediaSource = null;

    private TextToSpeech tts;
    private boolean ttsInitialized = false;
    private int pauseLocation = 0;
    private int tempPauseLocation = 0;
    private String spokenText = "";
    // private String restOfDocument = "";
    private ArrayList<String> restOfDocument = new ArrayList<String>();
    private int restIndex = 0; 
    boolean shouldHideNotification = false;

    private int MAX_SPEECH_SIZE = 4000;

    private String getPlayerStateString(int state){
        if (state == Player.STATE_READY) return "Ready";
        if (state == Player.STATE_ENDED) return "Ended";
        if (state == Player.STATE_IDLE) return "Idle";
        if (state == Player.STATE_BUFFERING) return "Buffering";
        return "Unknown";
    }

    @Override
    public void onCreate() {
        super.onCreate();
        CustomPlayer player = new CustomPlayer(getMainLooper());

        player.prepare();

        mediaSession = new MediaSession.Builder(this, player)
                .setId("sioyek")
                .setCallback(new MediaSession.Callback() {

                    @Override
                    public int onPlayerCommandRequest(MediaSession session, MediaSession.ControllerInfo controller, int playerCommand) {

                        boolean isFromSioyek = controller.getPackageName().equals(getApplicationContext().getPackageName()); 

                        if (playerCommand == SimpleBasePlayer.COMMAND_PLAY_PAUSE){

                            if (tts.isSpeaking()){
                                pauseLocation = tempPauseLocation + pauseLocation;
                                tts.stop();
                                player.updatePlaybackState(Player.STATE_ENDED, true);
                                publishExternalTtsState(getPlayerStateString(Player.STATE_ENDED));
                            }
                            else{
                                String currentText = spokenText;
                                if (restIndex > 0){
                                    currentText = restOfDocument.get(restIndex - 1);
                                }

                                tts.speak(currentText.substring(pauseLocation), TextToSpeech.QUEUE_FLUSH, null, "hi");
                                player.updatePlaybackState(Player.STATE_READY, true);
                                publishExternalTtsState(getPlayerStateString(Player.STATE_READY));
                            }
                        }
                        return MediaSession.Callback.super.onPlayerCommandRequest(session, controller, playerCommand);
                    }
                })
                .build();

        tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.SUCCESS) {
                    MAX_SPEECH_SIZE = tts.getMaxSpeechInputLength();
                    ttsInitialized = true;
                    tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                        @Override
                        public void onStart(String s) {
                            publishTtsState("Speaking");
                        }

                        @Override
                        public void onDone(String s) {
                            publishTtsState("Ready");

                            if (restIndex < restOfDocument.size()){
                                tts.speak(restOfDocument.get(restIndex), TextToSpeech.QUEUE_FLUSH, null, "hi");
                                pauseLocation = 0;
                                tempPauseLocation = 0;
                                restIndex++;
                            }
                            // if (restOfDocument.length() > 0){
                            //     tts.speak(restOfDocument, TextToSpeech.QUEUE_FLUSH, null, "hi");
                            //     restOfDocument = "";
                            // }
                        }

                        @Override
                        public void onRangeStart(String utteranceId, int start, int end, int frame){
                            tempPauseLocation = start;
                            sendMessage(pauseLocation + start, pauseLocation + end);
                        }

                        @Override
                        public void onError(String s) {
                            publishTtsState("Error");
                        }
                    });
                }
            }
        });
    }


    @Override
    public int onStartCommand (Intent intent, int flags, int startId) {


        if (intent.getStringExtra("text") != null){
            spokenText = intent.getStringExtra("text");
            pauseLocation = 0;
            tempPauseLocation = 0;
        }
        if (intent.hasExtra("rate")){
            float rate = intent.getFloatExtra("rate", 1.0f);
            tts.setSpeechRate(rate);
        }
        if (intent.hasExtra("resume")){
            handleResumeState();
        }
        if (intent.hasExtra("stop")){
        }
        if (intent.hasExtra("rest")){
            String rest = intent.getStringExtra("rest");
            setRestText(rest);
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onTaskRemoved(@Nullable Intent rootIntent) {
        Player player = mediaSession.getPlayer();
        if (!player.getPlayWhenReady() || player.getMediaItemCount() == 0) {
            stopForeground(true);
            stopSelf();
        }
    }

    @Override
    public void onDestroy() {
        mediaSession.release();
        mediaSession = null;
        super.onDestroy();
    }

    @Override
    public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo){
        SessionCommands commands = new SessionCommands.Builder().add(new SessionCommand("set_text", new Bundle())).build();
        Player.Commands playerCommands = new Player.Commands.Builder().addAll(
            Player.COMMAND_PLAY_PAUSE,
             Player.COMMAND_GET_CURRENT_MEDIA_ITEM,
             Player.COMMAND_GET_MEDIA_ITEMS_METADATA).build();
        mediaSession.setAvailableCommands(controllerInfo, commands, playerCommands);
        return mediaSession;
    }

    private void sendMessage(int begin, int end){
        Intent intent = new Intent("sioyek_tts");
        intent.putExtra("begin", begin);
        intent.putExtra("end", end);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }

    private void publishTtsState(String state){
        Intent intent = new Intent("sioyek_tts_state");
        intent.putExtra("state", state);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }

    private void publishExternalTtsState(String state){
        Intent intent = new Intent("sioyek_external_tts_state");
        intent.putExtra("state", state);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }

    int findFirstSpaceBefore(String text, int index){
        for (int i = index; i > 0; i--){
            if (text.charAt(i) == ' '){
                return i;
            }
        }
        return 0;
    }

    void setRestText(String rest){
        while (rest.length() > MAX_SPEECH_SIZE){
            int index = findFirstSpaceBefore(rest, MAX_SPEECH_SIZE);
            restOfDocument.add(rest.substring(0, index));
            rest = rest.substring(index);
        }
        if (rest.length() > 0){
            restOfDocument.add(rest);
        }
        restIndex = 0;
    }

    void handleResumeState(){
        boolean isOnRest = restIndex > 0;
        boolean isPlaying = tts.isSpeaking();
        int offset = tempPauseLocation + pauseLocation;
        if (isOnRest){
            for (int i = 0; i < restIndex-1; i++){
                offset += restOfDocument.get(i).length();
            }
        }
        tts.stop();
        pauseLocation = 0;
        tempPauseLocation = 0;
        restOfDocument.clear();
        restIndex = 0;
        SioyekActivity.onResumeState(isPlaying, isOnRest, offset);
    }

}


================================================
FILE: build_and_release.sh
================================================
#!/usr/bin/env bash
set -e

if [ -z ${MAKE_PARALLEL+x} ]; then export MAKE_PARALLEL=$(nproc); else echo "MAKE_PARALLEL defined"; fi
echo "MAKE_PARALLEL set to $MAKE_PARALLEL"

# download linuxdeployqt if not exists
if [[ ! -f linuxdeployqt-continuous-x86_64.AppImage ]]; then
	wget -q https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
	chmod +x linuxdeployqt-continuous-x86_64.AppImage
fi

cd mupdf
make USE_SYSTEM_HARFBUZZ=yes -j$MAKE_PARALLEL
cd ..

if [ -z ${QMAKE+x} ]; then
    QMAKE=qmake
fi

if [[ $1 == console ]]; then
	$QMAKE "CONFIG+=linux_app_image console" pdf_viewer_build_config.pro
else
	$QMAKE "CONFIG+=linux_app_image" pdf_viewer_build_config.pro
fi

rm -rf sioyek-release 2> /dev/null
make install INSTALL_ROOT=sioyek-release -j$MAKE_PARALLEL

cp pdf_viewer/prefs.config sioyek-release/usr/bin/prefs.config
cp pdf_viewer/prefs_user.config sioyek-release/usr/share/prefs_user.config
cp pdf_viewer/keys.config sioyek-release/usr/bin/keys.config
cp pdf_viewer/keys_user.config sioyek-release/usr/share/keys_user.config
cp -r pdf_viewer/shaders sioyek-release/usr/bin/shaders
cp tutorial.pdf sioyek-release/usr/bin/tutorial.pdf

./linuxdeployqt-continuous-x86_64.AppImage ./sioyek-release/usr/share/applications/sioyek.desktop -qmldir=./pdf_viewer/touchui -appimage
# ./linuxdeployqt-continuous-x86_64.AppImage ./sioyek-release/usr/share/applications/sioyek.desktop -appimage


mv Sioyek-* Sioyek-x86_64.AppImage
zip sioyek-release-linux.zip Sioyek-x86_64.AppImage


================================================
FILE: build_linux.sh
================================================
#!/usr/bin/env bash
set -e

# Compile mupdf
cd mupdf
make USE_SYSTEM_HARFBUZZ=yes -j$(nproc)
cd ..

# set QMAKE if not already defined
if [ -z "$QMAKE" ]; 
then
    if [ -f "/usr/bin/qmake-qt6" ]; 
    then
        QMAKE="/usr/bin/qmake-qt6"
    elif [ -f "/usr/bin/qmake" ]; 
    then
        QMAKE="/usr/bin/qmake"
    else
        QMAKE="qmake"
    fi
fi

$QMAKE "CONFIG+=linux_app_image" pdf_viewer_build_config.pro
make -j$(nproc)

# Copy files in build/ subdirectory
rm -rf build 2> /dev/null
mkdir build
mv sioyek build/sioyek
cp pdf_viewer/prefs.config build/prefs.config
cp pdf_viewer/prefs_user.config build/prefs_user.config
cp pdf_viewer/keys.config build/keys.config
cp pdf_viewer/keys_user.config build/keys_user.config
cp -r pdf_viewer/shaders build/shaders
cp tutorial.pdf build/tutorial.pdf


================================================
FILE: build_mac.sh
================================================
#!/usr/bin/env bash
set -e
# prerequisite: brew install qt@5 freeglut mesa harfbuzz

#sys_glut_clfags=`pkg-config --cflags glut gl`
#sys_glut_libs=`pkg-config --libs glut gl`
#sys_harfbuzz_clfags=`pkg-config --cflags harfbuzz`
#sys_harfbuzz_libs=`pkg-config --libs harfbuzz`

if [ -z ${MAKE_PARALLEL+x} ]; then export MAKE_PARALLEL=1; else echo "MAKE_PARALLEL defined"; fi
echo "MAKE_PARALLEL set to $MAKE_PARALLEL"

cd mupdf
#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
make HAVE_GLUT=no -j$MAKE_PARALLEL
cd ..

sed -Ei '' "s/QMAKE_MACOSX_DEPLOYMENT_TARGET.=.[0-9]+/QMAKE_MACOSX_DEPLOYMENT_TARGET = $(sw_vers -productVersion | cut -d. -f1)/" pdf_viewer_build_config.pro

if [[ $1 == portable ]]; then
	qmake pdf_viewer_build_config.pro
else
	qmake "CONFIG+=non_portable" pdf_viewer_build_config.pro
fi

make -j$MAKE_PARALLEL

rm -rf build 2> /dev/null
mkdir build
mv sioyek.app build/
cp -r pdf_viewer/shaders build/sioyek.app/Contents/MacOS/shaders

cp pdf_viewer/prefs.config build/sioyek.app/Contents/MacOS/prefs.config
cp pdf_viewer/prefs_user.config build/sioyek.app/Contents/MacOS/prefs_user.config
cp pdf_viewer/keys.config build/sioyek.app/Contents/MacOS/keys.config
cp pdf_viewer/keys_user.config build/sioyek.app/Contents/MacOS/keys_user.config
cp tutorial.pdf build/sioyek.app/Contents/MacOS/tutorial.pdf

# Capture the current PATH
CURRENT_PATH=$(echo $PATH)

# Define the path to the Info.plist file inside the app bundle
INFO_PLIST="build/sioyek.app/Contents/Info.plist"

# Add LSEnvironment key with PATH to Info.plist
/usr/libexec/PlistBuddy -c "Add :LSEnvironment dict" "$INFO_PLIST" || echo "LSEnvironment already exists"
/usr/libexec/PlistBuddy -c "Add :LSEnvironment:PATH string $CURRENT_PATH" "$INFO_PLIST" || /usr/libexec/PlistBuddy -c "Set :LSEnvironment:PATH $CURRENT_PATH" "$INFO_PLIST"

# Hack is required to avoid race condition in macos in CI
# See https://github.com/actions/runner-images/issues/7522
if [[ -n "$GITHUB_ACTIONS" ]]; then
  echo killing...; sudo pkill -9 XProtect >/dev/null || true;
  echo waiting...; while pgrep XProtect; do sleep 3; done;
fi

sleep 5

# mac deploys with qml currently don't work due to a qt bug
# macdeployqt build/sioyek.app -qmldir=./pdf_viewer/touchui -dmg
macdeployqt build/sioyek.app -dmg

codesign --force --deep --sign - build/sioyek.app

zip -r sioyek-release-mac.zip build/sioyek.dmg


================================================
FILE: build_windows.bat
================================================
cd mupdf\platform\win32\
msbuild -maxcpucount mupdf.sln /m /property:Configuration=Debug /property:MultiProcessorCompilation=true
msbuild -maxcpucount mupdf.sln /m /property:Configuration=Release /property:MultiProcessorCompilation=true
cd ..\..\..

cd zlib
nmake -f win32/makefile.msc
cd ..

qmake -tp vc "DEFINES+=NON_PORTABLE" "CONFIG+=release" pdf_viewer_build_config.pro

msbuild -maxcpucount sioyek.vcxproj /m /property:Configuration=Release
rm -r sioyek-release-windows 2> NUL
mkdir sioyek-release-windows
cp release\sioyek.exe sioyek-release-windows\sioyek.exe
cp pdf_viewer\keys.config sioyek-release-windows\keys.config
cp pdf_viewer\prefs.config sioyek-release-windows\prefs.config
cp -r pdf_viewer\shaders sioyek-release-windows\shaders
cp tutorial.pdf sioyek-release-windows\tutorial.pdf
windeployqt --qmldir ./pdf_viewer/touchui --release sioyek-release-windows\sioyek.exe
REM windeployqt sioyek-release-windows\sioyek.exe
cp windows_runtime\vcruntime140_1.dll sioyek-release-windows\vcruntime140_1.dll
cp windows_runtime\libssl-1_1-x64.dll sioyek-release-windows\libssl-1_1-x64.dll
cp windows_runtime\libcrypto-1_1-x64.dll sioyek-release-windows\libcrypto-1_1-x64.dll

if %1 == portable (
    cp pdf_viewer\keys_user.config sioyek-release-windows\keys_user.config
    cp pdf_viewer\prefs_user.config sioyek-release-windows\prefs_user.config
    7z a sioyek-release-windows-portable.zip sioyek-release-windows

) else (
    7z a sioyek-release-windows.zip sioyek-release-windows
)


================================================
FILE: data/command_docs.json
================================================
{"goto_begining": "<div class=\"document\" id=\"goto-begining\">\n<h1 class=\"title\"><code>goto_begining</code></h1>\n<p>Go to the beginning of the document. If prefixed with a number, it will go to that page number.</p>\n</div>\n", "goto_end": "<div class=\"document\" id=\"goto-end\">\n<h1 class=\"title\"><code>goto_end</code></h1>\n<p>Go to the end of the document. If prefixed with a number, it will go to that page number.</p>\n</div>\n", "goto_definition": "<div class=\"document\" id=\"goto-definition\">\n<h1 class=\"title\"><code>goto_definition</code></h1>\n<p>While the visual ruler is highlighting a line, executing <code>goto_definition</code> will jump to the location of reference in that line. For example,\nexecuting this command while a line containing &quot;Figure 2.1&quot; is highlighted will jump to the location of the figure in the document.</p>\n</div>\n", "overview_definition": "<div class=\"document\" id=\"overview-definition\">\n<h1 class=\"title\"><code>overview_definition</code></h1>\n<p>Similar to <code>goto_definition</code>, but instead of jumping to the location of the reference, it will show a small overview of the reference in the\noverview window.</p>\n</div>\n", "portal_to_definition": "<div class=\"document\" id=\"portal-to-definition\">\n<h1 class=\"title\"><code>portal_to_definition</code></h1>\n<p>Similar to <code>goto_definition</code>, but instead of jumping to the location of the reference, it will create a portal from current location to the\nlocation of the definition.</p>\n</div>\n", "next_item": "<div class=\"document\" id=\"next-item\">\n<h1 class=\"title\"><code>next_item</code></h1>\n<p>While a search is in progress, this command will jump to the next search result.</p>\n</div>\n", "previous_item": "<div class=\"document\" id=\"previous-item\">\n<h1 class=\"title\"><code>previous_item</code></h1>\n<p>While a search is in progress, this command will jump to the previous search result.</p>\n</div>\n", "set_mark": "<div class=\"document\" id=\"set-mark\">\n<h1 class=\"title\"><code>set_mark</code></h1>\n<p>Mark the location with the symbol entered following the <code>set_mark</code> command.</p>\n</div>\n", "goto_mark": "<div class=\"document\" id=\"goto-mark\">\n<h1 class=\"title\"><code>goto_mark</code></h1>\n<p>Go to the mark previously set using <code>set_mark</code>.</p>\n</div>\n", "goto_page_with_page_number": "<div class=\"document\" id=\"goto-page-with-page-number\">\n<h1 class=\"title\"><code>goto_page_with_page_number</code></h1>\n<p>Go to the page number corresponding to entered text.</p>\n</div>\n", "search": "<div class=\"document\" id=\"search\">\n<h1 class=\"title\"><code>search</code></h1>\n<p>Search for a text in document.</p>\n</div>\n", "regex_search": "<div class=\"document\" id=\"regex-search\">\n<h1 class=\"title\"><code>regex_search</code></h1>\n<p>Search for a regular expression in the document.</p>\n</div>\n", "move_down": "<div class=\"document\" id=\"move-down-move-up-move-left-move-right\">\n<h1 class=\"title\"><code>move_down</code>, <code>move_up</code>, <code>move_left</code>, <code>move_right</code></h1>\n<p>Move the document.</p>\n</div>\n", "move_up": "<div class=\"document\" id=\"move-down-move-up-move-left-move-right\">\n<h1 class=\"title\"><code>move_down</code>, <code>move_up</code>, <code>move_left</code>, <code>move_right</code></h1>\n<p>Move the document.</p>\n</div>\n", "move_left": "<div class=\"document\" id=\"move-down-move-up-move-left-move-right\">\n<h1 class=\"title\"><code>move_down</code>, <code>move_up</code>, <code>move_left</code>, <code>move_right</code></h1>\n<p>Move the document.</p>\n</div>\n", "move_right": "<div class=\"document\" id=\"move-down-move-up-move-left-move-right\">\n<h1 class=\"title\"><code>move_down</code>, <code>move_up</code>, <code>move_left</code>, <code>move_right</code></h1>\n<p>Move the document.</p>\n</div>\n", "zoom_in": "<div class=\"document\" id=\"zoom-in-and-zoom-out\">\n<h1 class=\"title\"><code>zoom_in</code> and <code>zoom_out</code></h1>\n<p>Change the zoom level.</p>\n</div>\n", "zoom_out": "<div class=\"document\" id=\"zoom-in-and-zoom-out\">\n<h1 class=\"title\"><code>zoom_in</code> and <code>zoom_out</code></h1>\n<p>Change the zoom level.</p>\n</div>\n", "fit_to_page_width": "<div class=\"document\" id=\"fit-to-page-width-and-fit-to-page-height\">\n<h1 class=\"title\"><code>fit_to_page_width</code> and <code>fit_to_page_height</code></h1>\n<p>Fit the current page to window width/height.</p>\n</div>\n", "fit_to_page_height": "<div class=\"document\" id=\"fit-to-page-width-and-fit-to-page-height\">\n<h1 class=\"title\"><code>fit_to_page_width</code> and <code>fit_to_page_height</code></h1>\n<p>Fit the current page to window width/height.</p>\n</div>\n", "fit_to_page_width_smart": "<div class=\"document\" id=\"fit-to-page-width-smart-and-fit-to-page-height-smart\">\n<h1 class=\"title\"><code>fit_to_page_width_smart</code> and <code>fit_to_page_height_smart</code></h1>\n<p>Fit the current page (ignoring white margins) to window width/height.</p>\n</div>\n", "fit_to_page_height_smart": "<div class=\"document\" id=\"fit-to-page-width-smart-and-fit-to-page-height-smart\">\n<h1 class=\"title\"><code>fit_to_page_width_smart</code> and <code>fit_to_page_height_smart</code></h1>\n<p>Fit the current page (ignoring white margins) to window width/height.</p>\n</div>\n", "next_page": "<div class=\"document\" id=\"next-page-and-previous-page\">\n<h1 class=\"title\"><code>next_page</code> and <code>previous_page</code></h1>\n<p>Navigate to the next/previous page.</p>\n</div>\n", "previous_page": "<div class=\"document\" id=\"next-page-and-previous-page\">\n<h1 class=\"title\"><code>next_page</code> and <code>previous_page</code></h1>\n<p>Navigate to the next/previous page.</p>\n</div>\n", "open_document": "<div class=\"document\" id=\"open-document\">\n<h1 class=\"title\"><code>open_document</code></h1>\n<p>Open the file browser to open a document.</p>\n</div>\n", "add_bookmark": "<div class=\"document\" id=\"add-bookmark\">\n<h1 class=\"title\"><code>add_bookmark</code></h1>\n<p>Add a bookmark to the current location at the document with the entered text.</p>\n</div>\n", "add_highlight": "<div class=\"document\" id=\"add-highlight\">\n<h1 class=\"title\"><code>add_highlight</code></h1>\n<p>Add the selected text as a highlight with the type of following symbol.</p>\n</div>\n", "goto_toc": "<div class=\"document\" id=\"goto-toc\">\n<h1 class=\"title\"><code>goto_toc</code></h1>\n<p>Open the table of contents.</p>\n</div>\n", "goto_bookmark": "<div class=\"document\" id=\"goto-bookmark\">\n<h1 class=\"title\"><code>goto_bookmark</code></h1>\n<p>Open bookmark list of current document.</p>\n</div>\n", "goto_highlight": "<div class=\"document\" id=\"goto-highlight\">\n<h1 class=\"title\"><code>goto_highlight</code></h1>\n<p>Open highlight list of current document.</p>\n</div>\n", "goto_bookmark_g": "<div class=\"document\" id=\"goto-bookmark-g\">\n<h1 class=\"title\"><code>goto_bookmark_g</code></h1>\n<p>Open bookmark list of all documents.</p>\n</div>\n", "goto_highlight_g": "<div class=\"document\" id=\"goto-highlight-g\">\n<h1 class=\"title\"><code>goto_highlight_g</code></h1>\n<p>Open highlight list of all documents.</p>\n</div>\n", "portal": "<div class=\"document\" id=\"portal\">\n<h1 class=\"title\"><code>portal</code></h1>\n<p>Set the current location as the portal source. If a portal source is already set, then use the current\nlocation as the portal destination and create the portal.</p>\n</div>\n", "next_state": "<div class=\"document\" id=\"next-state-prev-state\">\n<h1 class=\"title\"><code>next_state</code>, <code>prev_state</code></h1>\n<p>Go forward/backward in history.</p>\n</div>\n", "prev_state": "<div class=\"document\" id=\"next-state-prev-state\">\n<h1 class=\"title\"><code>next_state</code>, <code>prev_state</code></h1>\n<p>Go forward/backward in history.</p>\n</div>\n", "delete_bookmark": "<div class=\"document\" id=\"delete-bookmark\">\n<h1 class=\"title\"><code>delete_bookmark</code></h1>\n<p>Delete the closest bookmark to the current location.</p>\n</div>\n", "delete_highlight": "<div class=\"document\" id=\"delete-highlight\">\n<h1 class=\"title\"><code>delete_highlight</code></h1>\n<p>Delete the last highlight clicked on.</p>\n</div>\n", "delete_portal": "<div class=\"document\" id=\"delete-portal\">\n<h1 class=\"title\"><code>delete_portal</code></h1>\n<p>Delete the closest portal to the current location.</p>\n</div>\n", "goto_portal": "<div class=\"document\" id=\"goto-portal\">\n<h1 class=\"title\"><code>goto_portal</code></h1>\n<p>Go to the destination of the closest portal source to the current document location.</p>\n</div>\n", "edit_portal": "<div class=\"document\" id=\"edit-portal\">\n<h1 class=\"title\"><code>edit_portal</code></h1>\n<p>Jump to the destination of the closest portal. All the edits you do to the location/zoom is applied to the portal\nwhen you go back by executing <code>prev_state</code>.</p>\n</div>\n", "open_prev_doc": "<div class=\"document\" id=\"open-prev-doc\">\n<h1 class=\"title\"><code>open_prev_doc</code></h1>\n<p>Open a list of all opened document using sioyek.</p>\n</div>\n", "open_document_embedded": "<div class=\"document\" id=\"open-document-embedded\">\n<h1 class=\"title\"><code>open_document_embedded</code></h1>\n<p>Open an embedded file browser in sioyek.</p>\n</div>\n", "open_document_embedded_from_current_path": "<div class=\"document\" id=\"open-document-embedded-from-current-path\">\n<h1 class=\"title\"><code>open_document_embedded_from_current_path</code></h1>\n<p>Open an embedded file browser in sioyek. Initially, we are in the directory of current document.</p>\n</div>\n", "copy": "<div class=\"document\" id=\"copy\">\n<h1 class=\"title\"><code>copy</code></h1>\n<p>Copy the selected text into clipboard.</p>\n</div>\n", "toggle_fullscreen": "<div class=\"document\" id=\"toggle-fullscreen\">\n<h1 class=\"title\"><code>toggle_fullscreen</code></h1>\n<p>Toggle fullscreen mode.</p>\n</div>\n", "toggle_one_window": "<div class=\"document\" id=\"toggle-one-window\">\n<h1 class=\"title\"><code>toggle_one_window</code></h1>\n<p>Open/close the helper window.</p>\n</div>\n", "toggle_highlight": "<div class=\"document\" id=\"toggle-highlight\">\n<h1 class=\"title\"><code>toggle_highlight</code></h1>\n<p>Toggle whether we highlight PDF links.</p>\n</div>\n", "toggle_synctex": "<div class=\"document\" id=\"toggle-synctex\">\n<h1 class=\"title\"><code>toggle_synctex</code></h1>\n<p>Toggle synctex mode. In synctex mode, right clicking on a PDF file opens the corresponding location in the latex file\nusing the configured text editor.</p>\n</div>\n", "command": "<div class=\"document\" id=\"command\">\n<h1 class=\"title\"><code>command</code></h1>\n<p>Open a list of all sioyek commands.</p>\n</div>\n", "external_search": "<div class=\"document\" id=\"external-search\">\n<h1 class=\"title\"><code>external_search</code></h1>\n<p>Search the selected text in the extenal search engine corresponding to the following symbol.</p>\n</div>\n", "open_selected_url": "<div class=\"document\" id=\"open-selected-url\">\n<h1 class=\"title\"><code>open_selected_url</code></h1>\n<p>Open the selected URL in a browser.</p>\n</div>\n", "screen_up": "<div class=\"document\" id=\"screen-up-and-screen-down\">\n<h1 class=\"title\"><code>screen_up</code> and <code>screen_down</code></h1>\n<p>Move the screen up/down.</p>\n</div>\n", "screen_down": "<div class=\"document\" id=\"screen-up-and-screen-down\">\n<h1 class=\"title\"><code>screen_up</code> and <code>screen_down</code></h1>\n<p>Move the screen up/down.</p>\n</div>\n", "next_chapter": "<div class=\"document\" id=\"next-chapter-and-prev-chapter\">\n<h1 class=\"title\"><code>next_chapter</code> and <code>prev_chapter</code></h1>\n<p>Go to the next/previous chapter in the current document.</p>\n</div>\n", "prev_chapter": "<div class=\"document\" id=\"next-chapter-and-prev-chapter\">\n<h1 class=\"title\"><code>next_chapter</code> and <code>prev_chapter</code></h1>\n<p>Go to the next/previous chapter in the current document.</p>\n</div>\n", "toggle_dark_mode": "<div class=\"document\" id=\"toggle-dark-mode\">\n<h1 class=\"title\"><code>toggle_dark_mode</code></h1>\n<p>Switch between light/dark colorschemes.</p>\n</div>\n", "toggle_presentation_mode": "<div class=\"document\" id=\"toggle-presentation-mode\">\n<h1 class=\"title\"><code>toggle_presentation_mode</code></h1>\n<p>Toggle presentation mode. In presentation mode we only show one page at a time and the current page\nfills the entire window.</p>\n</div>\n", "toggle_mouse_drag_mode": "<div class=\"document\" id=\"toggle-mouse-drag-mode\">\n<h1 class=\"title\"><code>toggle_mouse_drag_mode</code></h1>\n<p>Toggle mouse drag mode. In mouse drag mode, clicking and dragging using mouse moves the document (instead of selecting text).</p>\n</div>\n", "close_window": "<div class=\"document\" id=\"close-window\">\n<h1 class=\"title\"><code>close_window</code></h1>\n<p>Close the current window.</p>\n</div>\n", "quit": "<div class=\"document\" id=\"quit-and-q\">\n<h1 class=\"title\"><code>quit</code> and <code>q</code></h1>\n<p>Quit sioyek (closes all windows).</p>\n</div>\n", "q": "<div class=\"document\" id=\"quit-and-q\">\n<h1 class=\"title\"><code>quit</code> and <code>q</code></h1>\n<p>Quit sioyek (closes all windows).</p>\n</div>\n", "open_link": "<div class=\"document\" id=\"open-link\">\n<h1 class=\"title\"><code>open_link</code></h1>\n<p>Open the PDF links using keyboard. Each link will be shown with a label and the link corresponding to the entered label text will be opened.</p>\n</div>\n", "keyboard_select": "<div class=\"document\" id=\"keyboard-select\">\n<h1 class=\"title\"><code>keyboard_select</code></h1>\n<p>Select text using keyboard. Each word in the document will be shown with a label. You should enter the labels corresponding to the\nbeginning and end of the selection (separated by a space).</p>\n</div>\n", "keyboard_smart_jump": "<div class=\"document\" id=\"keyboard-smart-jump-and-keyboard-overview\">\n<h1 class=\"title\"><code>keyboard_smart_jump</code> and <code>keyboard_overview</code></h1>\n<p>Perform a smartjump (or open an overview) using keyboard. Each word in the document will be shown with a label and we will smart jump to the location of the\nreference corresponding to the entered label.</p>\n</div>\n", "keyboard_overview": "<div class=\"document\" id=\"keyboard-smart-jump-and-keyboard-overview\">\n<h1 class=\"title\"><code>keyboard_smart_jump</code> and <code>keyboard_overview</code></h1>\n<p>Perform a smartjump (or open an overview) using keyboard. Each word in the document will be shown with a label and we will smart jump to the location of the\nreference corresponding to the entered label.</p>\n</div>\n", "keys": "<div class=\"document\" id=\"keys-and-prefs\">\n<h1 class=\"title\"><code>keys</code> and <code>prefs</code></h1>\n<p>Open the <code>keys.config</code> / <code>prefs.config</code> file.</p>\n</div>\n", "prefs": "<div class=\"document\" id=\"keys-and-prefs\">\n<h1 class=\"title\"><code>keys</code> and <code>prefs</code></h1>\n<p>Open the <code>keys.config</code> / <code>prefs.config</code> file.</p>\n</div>\n", "keys_user": "<div class=\"document\" id=\"keys-user-and-prefs-user\">\n<h1 class=\"title\"><code>keys_user</code> and <code>prefs_user</code></h1>\n<p>Open the <code>keys_user.config</code> / <code>prefs_user.config</code> file.</p>\n</div>\n", "prefs_user": "<div class=\"document\" id=\"keys-user-and-prefs-user\">\n<h1 class=\"title\"><code>keys_user</code> and <code>prefs_user</code></h1>\n<p>Open the <code>keys_user.config</code> / <code>prefs_user.config</code> file.</p>\n</div>\n", "export": "<div class=\"document\" id=\"export-and-import\">\n<h1 class=\"title\"><code>export</code> and <code>import</code></h1>\n<p>Export/import sioyek data to/from a json file.</p>\n</div>\n", "import": "<div class=\"document\" id=\"export-and-import\">\n<h1 class=\"title\"><code>export</code> and <code>import</code></h1>\n<p>Export/import sioyek data to/from a json file.</p>\n</div>\n", "enter_visual_mark_mode": "<div class=\"document\" id=\"enter-visual-mark-mode\">\n<h1 class=\"title\"><code>enter_visual_mark_mode</code></h1>\n<p>Place a visual mark at the center of screen.</p>\n</div>\n", "move_visual_mark_down": "<div class=\"document\" id=\"move-visual-mark-down-and-move-visual-mark-up\">\n<h1 class=\"title\"><code>move_visual_mark_down</code> and <code>move_visual_mark_up</code></h1>\n<p>Move the visual mark up and down which highlights the previous/next line.</p>\n</div>\n", "move_visual_mark_up": "<div class=\"document\" id=\"move-visual-mark-down-and-move-visual-mark-up\">\n<h1 class=\"title\"><code>move_visual_mark_down</code> and <code>move_visual_mark_up</code></h1>\n<p>Move the visual mark up and down which highlights the previous/next line.</p>\n</div>\n", "toggle_visual_scroll": "<div class=\"document\" id=\"toggle-visual-scroll\">\n<h1 class=\"title\"><code>toggle_visual_scroll</code></h1>\n<p>Toggle visual scroll mode. In visual scroll mode, mouse wheel moves the ruler (the visual mark) instead of scrolling the document.</p>\n</div>\n", "toggle_horizontal_scroll_lock": "<div class=\"document\" id=\"toggle-horizontal-scroll-lock\">\n<h1 class=\"title\"><code>toggle_horizontal_scroll_lock</code></h1>\n<p>Toggles the horizontal scroll lock which prevents scrolling in horizontal direction (useful for touchpad users).</p>\n</div>\n", "toggle_custom_color": "<div class=\"document\" id=\"toggle-custom-color\">\n<h1 class=\"title\"><code>toggle_custom_color</code></h1>\n<p>Toggle custom color mode. In this mode, we change the text/background color of the document to the colors specified in <code>prefs_user.config</code>.</p>\n</div>\n", "execute": "<div class=\"document\" id=\"execute\">\n<h1 class=\"title\"><code>execute</code></h1>\n<p>Execute the entered text as a shell command.</p>\n</div>\n", "execute_predefined_command": "<div class=\"document\" id=\"execute-predefined-command\">\n<h1 class=\"title\"><code>execute_predefined_command</code></h1>\n<p>Execute the predefined command (in <code>prefs_user.config</code>) corresponding to the following symbol.</p>\n</div>\n", "embed_annotations": "<div class=\"document\" id=\"embed-annotations\">\n<h1 class=\"title\"><code>embed_annotations</code></h1>\n<p>Export a new version of the current document with all sioyek annotations embedded so that they are visible in other software.</p>\n</div>\n", "copy_window_size_config": "<div class=\"document\" id=\"copy-window-size-config\">\n<h1 class=\"title\"><code>copy_window_size_config</code></h1>\n<p>Copy the current window size configuration (useful when you want to set the configs in <code>prefs_user.config</code>).</p>\n</div>\n", "toggle_select_highlight": "<div class=\"document\" id=\"toggle-select-highlight\">\n<h1 class=\"title\"><code>toggle_select_highlight</code></h1>\n<p>Toggle select highlight mode. In this mode, just selecting the text automatically highlights it.</p>\n</div>\n", "set_select_highlight_type": "<div class=\"document\" id=\"set-select-highlight-type\">\n<h1 class=\"title\"><code>set_select_highlight_type</code></h1>\n<p>Set the highlight type used in select highlight mode.</p>\n</div>\n", "open_last_document": "<div class=\"document\" id=\"open-last-document\">\n<h1 class=\"title\"><code>open_last_document</code></h1>\n<p>Open the previous document.</p>\n</div>\n", "toggle_window_configuration": "<div class=\"document\" id=\"toggle-window-configuration\">\n<h1 class=\"title\"><code>toggle_window_configuration</code></h1>\n<p>Toggle between one window/two window configuration settings.</p>\n</div>\n", "prefs_user_all": "<div class=\"document\" id=\"prefs-user-all-and-keys-user-all\">\n<h1 class=\"title\"><code>prefs_user_all</code> and <code>keys_user_all</code></h1>\n<p>Show a list of all <code>prefs_user.config</code> / <code>keys_user.config</code> files discovered by sioyek.</p>\n</div>\n", "keys_user_all": "<div class=\"document\" id=\"prefs-user-all-and-keys-user-all\">\n<h1 class=\"title\"><code>prefs_user_all</code> and <code>keys_user_all</code></h1>\n<p>Show a list of all <code>prefs_user.config</code> / <code>keys_user.config</code> files discovered by sioyek.</p>\n</div>\n", "fit_to_page_width_ratio": "<div class=\"document\" id=\"fit-to-page-width-ratio\">\n<h1 class=\"title\"><code>fit_to_page_width_ratio</code></h1>\n<p>Similar to <code>fit_to_page_width</code>  but instead of fitting to the entire screen width, we fit to a ratio configured in\n<code>prefs_user.config</code>.</p>\n</div>\n", "smart_jump_under_cursor": "<div class=\"document\" id=\"smart-jump-under-cursor-and-overview-under-cursor\">\n<h1 class=\"title\"><code>smart_jump_under_cursor</code> and <code>overview_under_cursor</code></h1>\n<p>Perform a smart jump (or open an overview) to the reference under the mouse cursor.</p>\n</div>\n", "overview_under_cursor": "<div class=\"document\" id=\"smart-jump-under-cursor-and-overview-under-cursor\">\n<h1 class=\"title\"><code>smart_jump_under_cursor</code> and <code>overview_under_cursor</code></h1>\n<p>Perform a smart jump (or open an overview) to the reference under the mouse cursor.</p>\n</div>\n", "close_overview": "<div class=\"document\" id=\"close-overview\">\n<h1 class=\"title\"><code>close_overview</code></h1>\n<p>Close the overview window.</p>\n</div>\n", "visual_mark_under_cursor": "<div class=\"document\" id=\"visual-mark-under-cursor\">\n<h1 class=\"title\"><code>visual_mark_under_cursor</code></h1>\n<p>Place a visual mark (ruler) under the mouse cursor.</p>\n</div>\n", "close_visual_mark": "<div class=\"document\" id=\"close-visual-mark\">\n<h1 class=\"title\"><code>close_visual_mark</code></h1>\n<p>Exit the visual mark (ruler) mode.</p>\n</div>\n", "zoom_in_cursor": "<div class=\"document\" id=\"zoom-in-cursor-and-zoom-out-cursor\">\n<h1 class=\"title\"><code>zoom_in_cursor</code> and <code>zoom_out_cursor</code></h1>\n<p>Zoom in/out on the mouse cursor.</p>\n</div>\n", "zoom_out_cursor": "<div class=\"document\" id=\"zoom-in-cursor-and-zoom-out-cursor\">\n<h1 class=\"title\"><code>zoom_in_cursor</code> and <code>zoom_out_cursor</code></h1>\n<p>Zoom in/out on the mouse cursor.</p>\n</div>\n", "goto_left": "<div class=\"document\" id=\"goto-left-goto-right-goto-top-of-page-and-goto-bottom-of-page\">\n<h1 class=\"title\"><code>goto_left</code>, <code>goto_right</code>, <code>goto_top_of_page</code> and <code>goto_bottom_of_page</code></h1>\n<p>Go to the left/right/top/bottom of the current page.</p>\n</div>\n", "goto_right": "<div class=\"document\" id=\"goto-left-goto-right-goto-top-of-page-and-goto-bottom-of-page\">\n<h1 class=\"title\"><code>goto_left</code>, <code>goto_right</code>, <code>goto_top_of_page</code> and <code>goto_bottom_of_page</code></h1>\n<p>Go to the left/right/top/bottom of the current page.</p>\n</div>\n", "goto_top_of_page": "<div class=\"document\" id=\"goto-left-goto-right-goto-top-of-page-and-goto-bottom-of-page\">\n<h1 class=\"title\"><code>goto_left</code>, <code>goto_right</code>, <code>goto_top_of_page</code> and <code>goto_bottom_of_page</code></h1>\n<p>Go to the left/right/top/bottom of the current page.</p>\n</div>\n", "goto_bottom_of_page": "<div class=\"document\" id=\"goto-left-goto-right-goto-top-of-page-and-goto-bottom-of-page\">\n<h1 class=\"title\"><code>goto_left</code>, <code>goto_right</code>, <code>goto_top_of_page</code> and <code>goto_bottom_of_page</code></h1>\n<p>Go to the left/right/top/bottom of the current page.</p>\n</div>\n", "goto_left_smart": "<div class=\"document\" id=\"goto-left-smart-and-goto-right-smart\">\n<h1 class=\"title\"><code>goto_left_smart</code> and <code>goto_right_smart</code></h1>\n<p>Go to the left/right side of the current page ignoring white margins.</p>\n</div>\n", "goto_right_smart": "<div class=\"document\" id=\"goto-left-smart-and-goto-right-smart\">\n<h1 class=\"title\"><code>goto_left_smart</code> and <code>goto_right_smart</code></h1>\n<p>Go to the left/right side of the current page ignoring white margins.</p>\n</div>\n", "rotate_clockwise": "<div class=\"document\" id=\"rotate-clockwise-and-rotate-counterclockwise\">\n<h1 class=\"title\"><code>rotate_clockwise</code> and <code>rotate_counterclockwise</code></h1>\n<p>Rotate the document.</p>\n</div>\n", "rotate_counterclockwise": "<div class=\"document\" id=\"rotate-clockwise-and-rotate-counterclockwise\">\n<h1 class=\"title\"><code>rotate_clockwise</code> and <code>rotate_counterclockwise</code></h1>\n<p>Rotate the document.</p>\n</div>\n", "goto_next_highlight": "<div class=\"document\" id=\"goto-next-highlight-and-goto-prev-highlight\">\n<h1 class=\"title\"><code>goto_next_highlight</code> and <code>goto_prev_highlight</code></h1>\n<p>Go to the next/previous highlight in the current document.</p>\n</div>\n", "goto_prev_highlight": "<div class=\"document\" id=\"goto-next-highlight-and-goto-prev-highlight\">\n<h1 class=\"title\"><code>goto_next_highlight</code> and <code>goto_prev_highlight</code></h1>\n<p>Go to the next/previous highlight in the current document.</p>\n</div>\n", "goto_next_highlight_of_type": "<div class=\"document\" id=\"goto-next-highlight-of-type-and-goto-prev-highlight-of-type\">\n<h1 class=\"title\"><code>goto_next_highlight_of_type</code> and <code>goto_prev_highlight_of_type</code></h1>\n<p>Go to the next/previous highlight in the current document with following symbol's type.</p>\n</div>\n", "goto_prev_highlight_of_type": "<div class=\"document\" id=\"goto-next-highlight-of-type-and-goto-prev-highlight-of-type\">\n<h1 class=\"title\"><code>goto_next_highlight_of_type</code> and <code>goto_prev_highlight_of_type</code></h1>\n<p>Go to the next/previous highlight in the current document with following symbol's type.</p>\n</div>\n", "add_highlight_with_current_type": "<div class=\"document\" id=\"add-highlight-with-current-type\">\n<h1 class=\"title\"><code>add_highlight_with_current_type</code></h1>\n<p>Add a highlight with the type specified using <code>set_select_highlight_type</code>.</p>\n</div>\n", "enter_password": "<div class=\"document\" id=\"enter-password\">\n<h1 class=\"title\"><code>enter_password</code></h1>\n<p>Enter the password for password-protected documents.</p>\n</div>\n", "toggle_fastread": "<div class=\"document\" id=\"toggle-fastread\">\n<h1 class=\"title\"><code>toggle_fastread</code></h1>\n<p>Highlight the first few characters of each word. Supposedly it may increase reading speed (unconfirmed).</p>\n</div>\n", "new_window": "<div class=\"document\" id=\"new-window\">\n<h1 class=\"title\"><code>new_window</code></h1>\n<p>Open a new sioyek window.</p>\n</div>\n", "toggle_statusbar": "<div class=\"document\" id=\"toggle-statusbar\">\n<h1 class=\"title\"><code>toggle_statusbar</code></h1>\n<p>Toggle the statusbar at the bottom of the screen.</p>\n</div>\n", "reload": "<div class=\"document\" id=\"reload\">\n<h1 class=\"title\"><code>reload</code></h1>\n<p>Reload the current document.</p>\n</div>\n", "synctex_under_cursor": "<div class=\"document\" id=\"synctex-under-cursor\">\n<h1 class=\"title\"><code>synctex_under_cursor</code></h1>\n<p>Perform a synctex search for the location under mouse cursor.</p>\n</div>\n", "set_status_string": "<div class=\"document\" id=\"set-status-string\">\n<h1 class=\"title\"><code>set_status_string</code></h1>\n<p>Set a message to be displayed in sioyek's statusbar.</p>\n</div>\n", "clear_status_string": "<div class=\"document\" id=\"clear-status-string\">\n<h1 class=\"title\"><code>clear_status_string</code></h1>\n<p>Clear the message in sioyek's statusbar.</p>\n</div>\n", "toggle_titlebar": "<div class=\"document\" id=\"toggle-titlebar\">\n<h1 class=\"title\"><code>toggle_titlebar</code></h1>\n<p>Toggle the window titlebar.</p>\n</div>\n", "next_preview": "<div class=\"document\" id=\"next-preview-and-previous-preview\">\n<h1 class=\"title\"><code>next_preview</code> and <code>previous_preview</code></h1>\n<p>If there are multiple possible previews for the overview window, move to the next/previous preview.</p>\n</div>\n", "previous_preview": "<div class=\"document\" id=\"next-preview-and-previous-preview\">\n<h1 class=\"title\"><code>next_preview</code> and <code>previous_preview</code></h1>\n<p>If there are multiple possible previews for the overview window, move to the next/previous preview.</p>\n</div>\n", "goto_overview": "<div class=\"document\" id=\"goto-overview-and-portal-to-overview\">\n<h1 class=\"title\"><code>goto_overview</code> and <code>portal_to_overview</code></h1>\n<p>Go to / create a portal to the location displayed in the overview window.</p>\n</div>\n", "portal_to_overview": "<div class=\"document\" id=\"goto-overview-and-portal-to-overview\">\n<h1 class=\"title\"><code>goto_overview</code> and <code>portal_to_overview</code></h1>\n<p>Go to / create a portal to the location displayed in the overview window.</p>\n</div>\n", "goto_selected_text": "<div class=\"document\" id=\"goto-selected-text\">\n<h1 class=\"title\"><code>goto_selected_text</code></h1>\n<p>Jump to the location of current selected text.</p>\n</div>\n", "focus_text": "<div class=\"document\" id=\"focus-text\">\n<h1 class=\"title\"><code>focus_text</code></h1>\n<p>If in visual mark (ruler) mode, focus the ruler on the line corresponding to the entered text.</p>\n</div>\n", "goto_window": "<div class=\"document\" id=\"goto-window\">\n<h1 class=\"title\"><code>goto_window</code></h1>\n<p>Open a searchable list of sioyek windows.</p>\n</div>\n", "toggle_smooth_scroll_mode": "<div class=\"document\" id=\"toggle-smooth-scroll-mode\">\n<h1 class=\"title\"><code>toggle_smooth_scroll_mode</code></h1>\n<p>Toggle smooth scroll mode. In this mode, scrolling is done smoothly.</p>\n</div>\n", "toggle_scrollbar": "<div class=\"document\" id=\"toggle-scrollbar\">\n<h1 class=\"title\"><code>toggle_scrollbar</code></h1>\n<p>Toggle the scrollbar.</p>\n</div>\n", "overview_to_portal": "<div class=\"document\" id=\"overview-to-portal\">\n<h1 class=\"title\"><code>overview_to_portal</code></h1>\n<p>Open the overview window to the closest portal to current document location.</p>\n</div>\n", "select_rect": "<div class=\"document\" id=\"select-rect\">\n<h1 class=\"title\"><code>select_rect</code></h1>\n<p>Select a rectangle (can be used in extensions using <code>%{selected_rectangle}</code> variable).</p>\n</div>\n", "donate": "<div class=\"document\" id=\"donate\">\n<h1 class=\"title\"><code>donate</code></h1>\n<p>Open donation page.</p>\n</div>\n", "overview_next_item": "<div class=\"document\" id=\"overview-next-item-and-overview-prev-item\">\n<h1 class=\"title\"><code>overview_next_item</code> and <code>overview_prev_item</code></h1>\n</div>\n", "overview_prev_item": "<div class=\"document\" id=\"overview-next-item-and-overview-prev-item\">\n<h1 class=\"title\"><code>overview_next_item</code> and <code>overview_prev_item</code></h1>\n</div>\n"}

================================================
FILE: data/config_docs.json
================================================
{"background_color": "<div class=\"document\" id=\"background-color\">\n<h1 class=\"title\"><code>background_color</code></h1>\n<p>Specifies the background color of the app (this is different from the background color of PDF page which is configured using <a href=\"#system-message-1\"><span class=\"problematic\" id=\"problematic-1\">:ref:`customcolor`</span></a>, this color is only shown when the displayed page is smaller than the srceen). The syntax to set colors is:</p>\n<div class=\"system-message\" id=\"system-message-1\">\n<p class=\"system-message-title\">System Message: ERROR/3 (<tt class=\"docutils\">&lt;string&gt;</tt>, line 3); <em><a href=\"#problematic-1\">backlink</a></em></p>\nUnknown interpreted text role &quot;ref&quot;.</div>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">background_color  r  g  b</span>\n</pre>\n<p>where r,g and b red, green and blue values between 0 and 1. For example in order to set the background color to gray we can add the following to our <code>prefs_user.config</code>:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">background_color  0.5  0.5  0.5</span>\n</pre>\n</div>\n", "dark_mode_background_color": "<div class=\"document\" id=\"dark-mode-background-color\">\n<h1 class=\"title\"><code>dark_mode_background_color</code></h1>\n<p>Specifies the background color when dark mode is enabled.</p>\n</div>\n", "dark_mode_contrast": "<div class=\"document\" id=\"dark-mode-contrast\">\n<h1 class=\"title\"><code>dark_mode_contrast</code></h1>\n<p>White text in dark mode can be annoying for the eyes. This option allows us to dim the white colors when dark mode is enabled. Allowed values are between 0.0 and 1.0.</p>\n</div>\n", "text_highlight_color": "<div class=\"document\" id=\"text-highlight-color\">\n<h1 class=\"title\"><code>text_highlight_color</code></h1>\n<p>Highlight color when text is selected using mouse.</p>\n</div>\n", "visual_mark_color": "<div class=\"document\" id=\"visual-mark-color\">\n<h1 class=\"title\"><code>visual_mark_color</code></h1>\n<p>This is the color of the transparent visual mark explained in <a href=\"#system-message-1\"><span class=\"problematic\" id=\"problematic-1\">:ref:`usage:Visual Mark`</span></a> (this feature originally had an entirely different functionality which is why it is called vertical line even though there is nothing vertical about it!).\nAllowed values are RGBA colors between 0.0 and 1.0. For example, to set the color to a transparent red we add the following to our <code>prefs_user.config</code>:</p>\n<div class=\"system-message\" id=\"system-message-1\">\n<p class=\"system-message-title\">System Message: ERROR/3 (<tt class=\"docutils\">&lt;string&gt;</tt>, line 4); <em><a href=\"#problematic-1\">backlink</a></em></p>\nUnknown interpreted text role &quot;ref&quot;.</div>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">visual_mark_color  1.0  0.0  0.0  0.1</span>\n</pre>\n</div>\n", "ruler_mode": "<div class=\"document\" id=\"ruler-mode\">\n<h1 class=\"title\"><code>ruler_mode</code></h1>\n<p>If it is 1, we highlight a rectangle around the current line in visual mark mode. Otherwise, we highlight below the current line.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">ruler_mode  1</span>\n</pre>\n</div>\n", "ruler_padding": "<div class=\"document\" id=\"ruler-padding-and-ruler-x-padding\">\n<h1 class=\"title\"><code>ruler_padding</code> and <code>ruler_x_padding</code></h1>\n<p>Additional padding for ruler. Makes the ruler a little larger and more readable.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">ruler_padding 1.0\nruler_x_padding 5.0</span>\n</pre>\n</div>\n", "ruler_x_padding": "<div class=\"document\" id=\"ruler-padding-and-ruler-x-padding\">\n<h1 class=\"title\"><code>ruler_padding</code> and <code>ruler_x_padding</code></h1>\n<p>Additional padding for ruler. Makes the ruler a little larger and more readable.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">ruler_padding 1.0\nruler_x_padding 5.0</span>\n</pre>\n</div>\n", "visual_mark_next_page_fraction": "<div class=\"document\" id=\"visual-mark-next-page-fraction\">\n<h1 class=\"title\"><code>visual_mark_next_page_fraction</code></h1>\n<p>When we go to the next page while in visual mark mode, this setting determines which location of screen the new line should be located at. The values are between -1 and 1. With 0 being the middle of the screen and 1 and -1 being the top and bottom of the screen respectively.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">visual_mark_next_page_fraction  0.5</span>\n</pre>\n</div>\n", "visual_mark_next_page_threshold": "<div class=\"document\" id=\"visual-mark-next-page-threshold\">\n<h1 class=\"title\"><code>visual_mark_next_page_threshold</code></h1>\n<p>Determines at which point in screen we move to the next page. Acceptable range is between 0 and <code>visual_mark_next_page_fraction</code>.</p>\n</div>\n", "search_highlight_color": "<div class=\"document\" id=\"search-highlight-color\">\n<h1 class=\"title\"><code>search_highlight_color</code></h1>\n<p>The color used to highlight search results.</p>\n</div>\n", "link_highlight_color": "<div class=\"document\" id=\"link-highlight-color\">\n<h1 class=\"title\"><code>link_highlight_color</code></h1>\n<p>The color used to highlight links in PDF files.</p>\n</div>\n", "synctex_highlight_color": "<div class=\"document\" id=\"synctex-highlight-color\">\n<h1 class=\"title\"><code>synctex_highlight_color</code></h1>\n<p>Highlight color for synctex forward search highlights.</p>\n</div>\n", "search_url_*": "<div class=\"document\" id=\"search-url-a-to-search-url-z\">\n<h1 class=\"title\"><code>search_url_a</code> to <code>search_url_z</code></h1>\n<p>The web addresses used for performing <code>external_search</code> command. (see <a href=\"#system-message-1\"><span class=\"problematic\" id=\"problematic-1\">:ref:`usage:External Search`</span></a>). Example:</p>\n<div class=\"system-message\" id=\"system-message-1\">\n<p class=\"system-message-title\">System Message: ERROR/3 (<tt class=\"docutils\">&lt;string&gt;</tt>, line 4); <em><a href=\"#problematic-1\">backlink</a></em></p>\nUnknown interpreted text role &quot;ref&quot;.</div>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">search_url_g https://www.google.com/search?q=</span>\n</pre>\n</div>\n", "middle_click_search_engine": "<div class=\"document\" id=\"middle-click-search-engine-and-shift-middle-click-search-engine\">\n<h1 class=\"title\"><code>middle_click_search_engine</code> and <code>shift_middle_click_search_engine</code></h1>\n<p>The letter corresponding to <code>search_url_*</code> configs to use when middle clicking/shift-middle clicking on text.\nExample:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">middle_click_search_engine           g</span>\n</pre>\n<p>This causes the search engine configures using <code>search_url_g</code> to be used when middle clicking on text.</p>\n</div>\n", "shift_middle_click_search_engine": "<div class=\"document\" id=\"middle-click-search-engine-and-shift-middle-click-search-engine\">\n<h1 class=\"title\"><code>middle_click_search_engine</code> and <code>shift_middle_click_search_engine</code></h1>\n<p>The letter corresponding to <code>search_url_*</code> configs to use when middle clicking/shift-middle clicking on text.\nExample:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">middle_click_search_engine           g</span>\n</pre>\n<p>This causes the search engine configures using <code>search_url_g</code> to be used when middle clicking on text.</p>\n</div>\n", "zoom_inc_factor": "<div class=\"document\" id=\"zoom-inc-factor\">\n<h1 class=\"title\"><code>zoom_inc_factor</code></h1>\n<p>The fraction by which we enlarge the page when zooming in/out.</p>\n</div>\n", "wheel_zoom_on_cursor": "<div class=\"document\" id=\"wheel-zoom-on-cursor\">\n<h1 class=\"title\"><code>wheel_zoom_on_cursor</code></h1>\n<p>If set, when using mouse wheel to zoom we zoom in on mouse cursor instead of middle of screen.</p>\n</div>\n", "vertical_move_amount": "<div class=\"document\" id=\"vertical-move-amount-and-horizontal-move-amount\">\n<h1 class=\"title\"><code>vertical_move_amount</code> and <code>horizontal_move_amount</code></h1>\n<p>How many inches we move vertically/horizontally when performing move_* commands.</p>\n</div>\n", "horizontal_move_amount": "<div class=\"document\" id=\"vertical-move-amount-and-horizontal-move-amount\">\n<h1 class=\"title\"><code>vertical_move_amount</code> and <code>horizontal_move_amount</code></h1>\n<p>How many inches we move vertically/horizontally when performing move_* commands.</p>\n</div>\n", "move_screen_ratio": "<div class=\"document\" id=\"move-screen-ratio\">\n<h1 class=\"title\"><code>move_screen_ratio</code></h1>\n<p>The fraction of screen by which we move when executing <code>screen_down</code> and <code>screen_up</code> commands. (note that despite the name, the values are fractions between 0 and 1, not percentages)</p>\n</div>\n", "flat_toc": "<div class=\"document\" id=\"flat-toc\">\n<h1 class=\"title\"><code>flat_toc</code></h1>\n<p>Displays a simplified flat table of contents instead of a hierarchial one. This can improve performance for documents with very large number of table of contents entries (thousands).\nAcceptable values are 0 and 1.</p>\n</div>\n", "collapsed_toc": "<div class=\"document\" id=\"collapsed-toc\">\n<h1 class=\"title\"><code>collapsed_toc</code></h1>\n<p>If set, we initially collapse all table of content entries.</p>\n</div>\n", "should_use_multiple_monitors": "<div class=\"document\" id=\"should-use-multiple-monitors\">\n<h1 class=\"title\"><code>should_use_multiple_monitors</code></h1>\n<p>If it is 1, when launching the application if we detect multiple monitors, we automatically launch the helper window in second monitor.\nAcceptable values are 0 and 1.</p>\n</div>\n", "should_load_tutorial_when_no_other_file": "<div class=\"document\" id=\"should-load-tutorial-when-no-other-file\">\n<h1 class=\"title\"><code>should_load_tutorial_when_no_other_file</code></h1>\n<p>If the last opened document is empty, load the tutorial pdf instead.</p>\n</div>\n", "should_launch_new_instance": "<div class=\"document\" id=\"should-launch-new-instance\">\n<h1 class=\"title\"><code>should_launch_new_instance</code></h1>\n<div class=\"admonition warning\">\n<p class=\"first admonition-title\">Warning</p>\n<p class=\"last\">This is deprecated. Use <cite>should_launch_new_window</cite> instead.</p>\n</div>\n<p>If it is 0, then we use the previous instance of sioyek when launching a new file, otherwise a new instance is launched every time we open a new file.</p>\n</div>\n", "should_launch_new_window": "<div class=\"document\" id=\"should-launch-new-window\">\n<h1 class=\"title\"><code>should_launch_new_window</code></h1>\n<p>If it is 0, then we use the previous window of sioyek when opening a new file, otherwise a new window is opened every time we open a new file.</p>\n</div>\n", "inverse_search_command": "<div class=\"document\" id=\"inverse-search-command\">\n<h1 class=\"title\"><code>inverse_search_command</code></h1>\n<p>The command to use when trying to do inverse search into a LaTeX document. %1 expands to the name of the file and %2 expans to the line number. For example:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">inverse_search_command               &quot;C:\\path\\to\\vscode\\Code.exe&quot; -r -g %1:%2</span>\n</pre>\n</div>\n", "highlight_color_*": "<div class=\"document\" id=\"highlight-color-a-to-highlight-color-z\">\n<h1 class=\"title\"><code>highlight_color_a</code> to <code>highlight_color_z</code></h1>\n<p>The color to use for highlights of type <code>a</code> to <code>z</code>.</p>\n</div>\n", "should_draw_unrendered_pages": "<div class=\"document\" id=\"should-draw-unrendered-pages\">\n<h1 class=\"title\"><code>should_draw_unrendered_pages</code></h1>\n<p>If set, we display a checkerboard pattern for unrendered pages (by default we display nothing).</p>\n</div>\n", "rerender_overview": "<div class=\"document\" id=\"rerender-overview\">\n<h1 class=\"title\"><code>rerender_overview</code></h1>\n<p>Normally we reuse the rendered page for overview window. This may cause the overview page to be blurry or too sharp if there is a significant difference between the zoom levels of the main window and overview window.\nIf <code>rerender_overview</code> is set, we rerender overview which solves this issue at the cost of some additional computation.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">rerender_overview            1</span>\n</pre>\n</div>\n", "default_dark_mode": "<div class=\"document\" id=\"default-dark-mode\">\n<h1 class=\"title\"><code>default_dark_mode</code></h1>\n<p>Use dark mode by default.</p>\n</div>\n", "sort_bookmarks_by_location": "<div class=\"document\" id=\"sort-bookmarks-by-location\">\n<h1 class=\"title\"><code>sort_bookmarks_by_location</code></h1>\n<p>If set, we sort the bookmarks by their location instead of their creation time.</p>\n</div>\n", "shared_database_path": "<div class=\"document\" id=\"shared-database-path\">\n<h1 class=\"title\"><code>shared_database_path</code></h1>\n<p>The path of <code>shared.db</code> database file. You can set this path to be in a synchronized folder (for example a dropbox folder) and sioyek data will be automatically synchronized across your devices.</p>\n</div>\n", "font_size": "<div class=\"document\" id=\"font-size\">\n<h1 class=\"title\"><code>font_size</code></h1>\n<p>Size of the UI font.</p>\n</div>\n", "ui_font": "<div class=\"document\" id=\"ui-font\">\n<h1 class=\"title\"><code>ui_font</code></h1>\n<p>The font to use for UI text.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">ui_font              Segoe UI Emoji</span>\n</pre>\n</div>\n", "item_list_prefix": "<div class=\"document\" id=\"item-list-prefix\">\n<h1 class=\"title\"><code>item_list_prefix</code></h1>\n<p>A prefix character to use before list of items (for example can be used to display a checkmark before each of the bookmarks).</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">item_list_prefix     \u2714\ufe0f</span>\n</pre>\n</div>\n", "check_for_updates_on_startup": "<div class=\"document\" id=\"check-for-updates-on-startup\">\n<h1 class=\"title\"><code>check_for_updates_on_startup</code></h1>\n<p>If set, sioyek checkes for new versions on startup and notifies the user if a new version if available.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">check_for_updates_on_startup 1</span>\n</pre>\n<span class=\"target\" id=\"customcolor\"></span></div>\n", "custom_background_color": "<div class=\"document\" id=\"custom-background-color-and-custom-text-color\">\n<h1 class=\"title\"><code>custom_background_color</code> and <code>custom_text_color</code></h1>\n<p>Specify the background and text color when using custom color mode (by executing <code>toggle_custom_color</code> command).</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">custom_background_color              0.18 0.20 0.25\ncustom_text_color                    1.0 1.0 1.0</span>\n</pre>\n</div>\n", "custom_text_color": "<div class=\"document\" id=\"custom-background-color-and-custom-text-color\">\n<h1 class=\"title\"><code>custom_background_color</code> and <code>custom_text_color</code></h1>\n<p>Specify the background and text color when using custom color mode (by executing <code>toggle_custom_color</code> command).</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">custom_background_color              0.18 0.20 0.25\ncustom_text_color                    1.0 1.0 1.0</span>\n</pre>\n</div>\n", "startup_commands": "<div class=\"document\" id=\"startup-commands\">\n<h1 class=\"title\"><code>startup_commands</code></h1>\n<p>Semicolon-separated list of commands to execute on startup. For example, to start in custom color mode and in visual scroll mode, you can add the following (the command names are the same as the ones displayed when opening the command window using <code>:</code>):</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">startup_commands             toggle_custom_color;toggle_visual_scroll</span>\n</pre>\n</div>\n", "status_bar_color": "<div class=\"document\" id=\"status-bar-color-status-bar-text-color-and-status-bar-font-size\">\n<h1 class=\"title\"><code>status_bar_color</code>, <code>status_bar_text_color</code> and <code>status_bar_font_size</code></h1>\n<p>Allow you to customize the appearance of status bar.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">status_bar_color        0 0 0\nstatus_bar_text_color   1 1 1\nstatus_bar_font_size    10</span>\n</pre>\n</div>\n", "status_bar_text_color": "<div class=\"document\" id=\"status-bar-color-status-bar-text-color-and-status-bar-font-size\">\n<h1 class=\"title\"><code>status_bar_color</code>, <code>status_bar_text_color</code> and <code>status_bar_font_size</code></h1>\n<p>Allow you to customize the appearance of status bar.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">status_bar_color        0 0 0\nstatus_bar_text_color   1 1 1\nstatus_bar_font_size    10</span>\n</pre>\n</div>\n", "status_bar_font_size": "<div class=\"document\" id=\"status-bar-color-status-bar-text-color-and-status-bar-font-size\">\n<h1 class=\"title\"><code>status_bar_color</code>, <code>status_bar_text_color</code> and <code>status_bar_font_size</code></h1>\n<p>Allow you to customize the appearance of status bar.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">status_bar_color        0 0 0\nstatus_bar_text_color   1 1 1\nstatus_bar_font_size    10</span>\n</pre>\n</div>\n", "execute_command_*": "<div class=\"document\" id=\"execute-command-a-to-execute-command-z\">\n<h1 class=\"title\"><code>execute_command_a</code> to <code>execute_command_z</code></h1>\n<p>Predefined shell commands to be executed using <code>execute_predefined_command</code>. <code>%1</code> expands to the path of the current file, <code>%2</code> expands to name of the current file and <code>%3</code> expands to current selected text.\nFor example, suppose you have a command named <code>ocr</code> which takes a file path and produces an OCR'd version of the document. You can add the following to you <code>prefs_user.config</code>:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">execute_command_o    ocr &quot;%1&quot;</span>\n</pre>\n<p>You can later quickly invoke this command by executing <code>execute_predefined_command</code> and then pressing <code>o</code>.</p>\n<div class=\"admonition warning\">\n<p class=\"first admonition-title\">Warning</p>\n<p class=\"last\">The command parsing code in sioyek is not very good. For example it can not handle multiple commands like <code>command1 args;command2</code> or commands that include spaces. If you want to run a complex command, first put all commands in a script file and then run the script file using using sioyek like this: <code>/path/to/script.sh %1 %2 %3</code>.</p>\n</div>\n</div>\n", "papers_folder_path": "<div class=\"document\" id=\"papers-folder-path\">\n<h1 class=\"title\"><code>papers_folder_path</code></h1>\n<p>Path to a directory on your computer. Sioyek monitors the changes in this directory and if a new file is added to this directory while we have a pending portal, this file is automatically used as the destination of the portal. This is useful when creating a portal from a reference in a paper to the actual reference file.</p>\n</div>\n", "display_resolution_scale": "<div class=\"document\" id=\"display-resolution-scale\">\n<h1 class=\"title\"><code>display_resolution_scale</code></h1>\n<p>Manual resolution scaling. Can be useful for some very high resolution displays which report the wrong resolution.</p>\n</div>\n", "linear_filter": "<div class=\"document\" id=\"linear-filter\">\n<h1 class=\"title\"><code>linear_filter</code></h1>\n<p>If set, we use linear texture filtering instead of the normal nearest neighbour filtering. This is useful when using manual display resolution scale which causes the nearest neighbour filter to look bad.</p>\n</div>\n", "main_window_size": "<div class=\"document\" id=\"main-window-size-main-window-move-helper-window-size-helper-window-move-single-main-window-size-and-single-main-window-move\">\n<h1 class=\"title\"><code>main_window_size</code>, <code>main_window_move</code>, <code>helper_window_size</code>, <code>helper_window_move</code>, <code>single_main_window_size</code> and <code>single_main_window_move</code></h1>\n<p>Configures the size and position of the main window and the helper window. <code>single_main_window_*</code> is used when helper window is closed and the other configs are used when both windows are opened.\nThese values are automatically written to <code>auto.cong</code> file when sioyek exits but you can manually override them by setting them in your <code>prefs_user.config</code>.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">single_main_window_size    1824 988\nsingle_main_window_move     22 21\nmain_window_size    1824 988\nmain_window_move     18 44\nhelper_window_size    1891 1033\nhelper_window_move     1951 0</span>\n</pre>\n</div>\n", "main_window_move": "<div class=\"document\" id=\"main-window-size-main-window-move-helper-window-size-helper-window-move-single-main-window-size-and-single-main-window-move\">\n<h1 class=\"title\"><code>main_window_size</code>, <code>main_window_move</code>, <code>helper_window_size</code>, <code>helper_window_move</code>, <code>single_main_window_size</code> and <code>single_main_window_move</code></h1>\n<p>Configures the size and position of the main window and the helper window. <code>single_main_window_*</code> is used when helper window is closed and the other configs are used when both windows are opened.\nThese values are automatically written to <code>auto.cong</code> file when sioyek exits but you can manually override them by setting them in your <code>prefs_user.config</code>.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">single_main_window_size    1824 988\nsingle_main_window_move     22 21\nmain_window_size    1824 988\nmain_window_move     18 44\nhelper_window_size    1891 1033\nhelper_window_move     1951 0</span>\n</pre>\n</div>\n", "helper_window_size": "<div class=\"document\" id=\"main-window-size-main-window-move-helper-window-size-helper-window-move-single-main-window-size-and-single-main-window-move\">\n<h1 class=\"title\"><code>main_window_size</code>, <code>main_window_move</code>, <code>helper_window_size</code>, <code>helper_window_move</code>, <code>single_main_window_size</code> and <code>single_main_window_move</code></h1>\n<p>Configures the size and position of the main window and the helper window. <code>single_main_window_*</code> is used when helper window is closed and the other configs are used when both windows are opened.\nThese values are automatically written to <code>auto.cong</code> file when sioyek exits but you can manually override them by setting them in your <code>prefs_user.config</code>.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">single_main_window_size    1824 988\nsingle_main_window_move     22 21\nmain_window_size    1824 988\nmain_window_move     18 44\nhelper_window_size    1891 1033\nhelper_window_move     1951 0</span>\n</pre>\n</div>\n", "helper_window_move": "<div class=\"document\" id=\"main-window-size-main-window-move-helper-window-size-helper-window-move-single-main-window-size-and-single-main-window-move\">\n<h1 class=\"title\"><code>main_window_size</code>, <code>main_window_move</code>, <code>helper_window_size</code>, <code>helper_window_move</code>, <code>single_main_window_size</code> and <code>single_main_window_move</code></h1>\n<p>Configures the size and position of the main window and the helper window. <code>single_main_window_*</code> is used when helper window is closed and the other configs are used when both windows are opened.\nThese values are automatically written to <code>auto.cong</code> file when sioyek exits but you can manually override them by setting them in your <code>prefs_user.config</code>.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">single_main_window_size    1824 988\nsingle_main_window_move     22 21\nmain_window_size    1824 988\nmain_window_move     18 44\nhelper_window_size    1891 1033\nhelper_window_move     1951 0</span>\n</pre>\n</div>\n", "single_main_window_size": "<div class=\"document\" id=\"main-window-size-main-window-move-helper-window-size-helper-window-move-single-main-window-size-and-single-main-window-move\">\n<h1 class=\"title\"><code>main_window_size</code>, <code>main_window_move</code>, <code>helper_window_size</code>, <code>helper_window_move</code>, <code>single_main_window_size</code> and <code>single_main_window_move</code></h1>\n<p>Configures the size and position of the main window and the helper window. <code>single_main_window_*</code> is used when helper window is closed and the other configs are used when both windows are opened.\nThese values are automatically written to <code>auto.cong</code> file when sioyek exits but you can manually override them by setting them in your <code>prefs_user.config</code>.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">single_main_window_size    1824 988\nsingle_main_window_move     22 21\nmain_window_size    1824 988\nmain_window_move     18 44\nhelper_window_size    1891 1033\nhelper_window_move     1951 0</span>\n</pre>\n</div>\n", "single_main_window_move": "<div class=\"document\" id=\"main-window-size-main-window-move-helper-window-size-helper-window-move-single-main-window-size-and-single-main-window-move\">\n<h1 class=\"title\"><code>main_window_size</code>, <code>main_window_move</code>, <code>helper_window_size</code>, <code>helper_window_move</code>, <code>single_main_window_size</code> and <code>single_main_window_move</code></h1>\n<p>Configures the size and position of the main window and the helper window. <code>single_main_window_*</code> is used when helper window is closed and the other configs are used when both windows are opened.\nThese values are automatically written to <code>auto.cong</code> file when sioyek exits but you can manually override them by setting them in your <code>prefs_user.config</code>.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">single_main_window_size    1824 988\nsingle_main_window_move     22 21\nmain_window_size    1824 988\nmain_window_move     18 44\nhelper_window_size    1891 1033\nhelper_window_move     1951 0</span>\n</pre>\n</div>\n", "touchpad_sensitivity": "<div class=\"document\" id=\"touchpad-sensitivity\">\n<h1 class=\"title\"><code>touchpad_sensitivity</code></h1>\n<p>Can be used to adjust the sensitivity of the touchpad.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">touchpad_sensitivity    0.1</span>\n</pre>\n</div>\n", "page_separator_width": "<div class=\"document\" id=\"page-separator-width-and-page-separator-color\">\n<h1 class=\"title\"><code>page_separator_width</code> and <code>page_separator_color</code></h1>\n<p>Used to adjust the appearance of page separator.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">page_separator_width 2\npage_separator_color 0.5 0.5 0.5</span>\n</pre>\n</div>\n", "page_separator_color": "<div class=\"document\" id=\"page-separator-width-and-page-separator-color\">\n<h1 class=\"title\"><code>page_separator_width</code> and <code>page_separator_color</code></h1>\n<p>Used to adjust the appearance of page separator.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">page_separator_width 2\npage_separator_color 0.5 0.5 0.5</span>\n</pre>\n</div>\n", "fit_to_page_width_ratio": "<div class=\"document\" id=\"fit-to-page-width-ratio\">\n<h1 class=\"title\"><code>fit_to_page_width_ratio</code></h1>\n<p>Ratio of screen width to use when using <code>fit_to_screen_width_ratio</code> command. Can be useful for very wide screens.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">fit_to_page_width_ratio 0.75</span>\n</pre>\n</div>\n", "create_table_of_contents_if_not_exists": "<div class=\"document\" id=\"create-table-of-contents-if-not-exists\">\n<h1 class=\"title\"><code>create_table_of_contents_if_not_exists</code></h1>\n<p>If set and the file doesn't have a table of contents, we use heuristic methods to create a table of contents. You can use <code>max_created_toc_size</code> to prevent creating very large table of contents.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">create_table_of_contents_if_not_exists 1\nmax_created_toc_size 5000</span>\n</pre>\n</div>\n", "force_custom_line_algorithm": "<div class=\"document\" id=\"force-custom-line-algorithm\">\n<h1 class=\"title\"><code>force_custom_line_algorithm</code></h1>\n<p>Use legacy line detection algorithm instead of the mupdf one.</p>\n</div>\n", "overview_size": "<div class=\"document\" id=\"overview-size-and-overview-offset\">\n<h1 class=\"title\"><code>overview_size</code> and <code>overview_offset</code></h1>\n<p>Adjust the size of overview window. The values are in normalized window coordinates between -1 and 1.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">overview_size 0.852604 0.597729\noverview_offset -0.0119792 0.120151</span>\n</pre>\n</div>\n", "overview_offset": "<div class=\"document\" id=\"overview-size-and-overview-offset\">\n<h1 class=\"title\"><code>overview_size</code> and <code>overview_offset</code></h1>\n<p>Adjust the size of overview window. The values are in normalized window coordinates between -1 and 1.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">overview_size 0.852604 0.597729\noverview_offset -0.0119792 0.120151</span>\n</pre>\n</div>\n", "show_doc_path": "<div class=\"document\" id=\"show-doc-path\">\n<h1 class=\"title\"><code>show_doc_path</code></h1>\n<p>Show the full document path instead of just the file name in list of recently opened documents.</p>\n</div>\n", "should_warn_about_user_key_override": "<div class=\"document\" id=\"should-warn-about-user-key-override\">\n<h1 class=\"title\"><code>should_warn_about_user_key_override</code></h1>\n<p>If set, we warn the user in command line when overriding already degined keybinds.</p>\n</div>\n", "single_click_selects_words": "<div class=\"document\" id=\"single-click-selects-words\">\n<h1 class=\"title\"><code>single_click_selects_words</code></h1>\n<p>If set, single clicking and dragging mouse selects entire words rather than characters.</p>\n</div>\n", "shift_click_command": "<div class=\"document\" id=\"shift-click-command-control-click-command-alt-click-command-shift-right-click-command-control-right-click-command-and-alt-right-click-command\">\n<h1 class=\"title\"><code>shift_click_command</code>, <code>control_click_command</code>, <code>alt_click_command</code>, <code>shift_right_click_command</code>, <code>control_right_click_command</code>, and <code>alt_right_click_command</code></h1>\n<p>Custom commands to run when mouse click is pressed while modifier keys are held down. For example:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">control_click_command overview_under_cursor</span>\n</pre>\n<p>If set, single clicking and dragging mouse selects entire words rather than characters.</p>\n</div>\n", "control_click_command": "<div class=\"document\" id=\"shift-click-command-control-click-command-alt-click-command-shift-right-click-command-control-right-click-command-and-alt-right-click-command\">\n<h1 class=\"title\"><code>shift_click_command</code>, <code>control_click_command</code>, <code>alt_click_command</code>, <code>shift_right_click_command</code>, <code>control_right_click_command</code>, and <code>alt_right_click_command</code></h1>\n<p>Custom commands to run when mouse click is pressed while modifier keys are held down. For example:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">control_click_command overview_under_cursor</span>\n</pre>\n<p>If set, single clicking and dragging mouse selects entire words rather than characters.</p>\n</div>\n", "alt_click_command": "<div class=\"document\" id=\"shift-click-command-control-click-command-alt-click-command-shift-right-click-command-control-right-click-command-and-alt-right-click-command\">\n<h1 class=\"title\"><code>shift_click_command</code>, <code>control_click_command</code>, <code>alt_click_command</code>, <code>shift_right_click_command</code>, <code>control_right_click_command</code>, and <code>alt_right_click_command</code></h1>\n<p>Custom commands to run when mouse click is pressed while modifier keys are held down. For example:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">control_click_command overview_under_cursor</span>\n</pre>\n<p>If set, single clicking and dragging mouse selects entire words rather than characters.</p>\n</div>\n", "shift_right_click_command": "<div class=\"document\" id=\"shift-click-command-control-click-command-alt-click-command-shift-right-click-command-control-right-click-command-and-alt-right-click-command\">\n<h1 class=\"title\"><code>shift_click_command</code>, <code>control_click_command</code>, <code>alt_click_command</code>, <code>shift_right_click_command</code>, <code>control_right_click_command</code>, and <code>alt_right_click_command</code></h1>\n<p>Custom commands to run when mouse click is pressed while modifier keys are held down. For example:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">control_click_command overview_under_cursor</span>\n</pre>\n<p>If set, single clicking and dragging mouse selects entire words rather than characters.</p>\n</div>\n", "control_right_click_command": "<div class=\"document\" id=\"shift-click-command-control-click-command-alt-click-command-shift-right-click-command-control-right-click-command-and-alt-right-click-command\">\n<h1 class=\"title\"><code>shift_click_command</code>, <code>control_click_command</code>, <code>alt_click_command</code>, <code>shift_right_click_command</code>, <code>control_right_click_command</code>, and <code>alt_right_click_command</code></h1>\n<p>Custom commands to run when mouse click is pressed while modifier keys are held down. For example:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">control_click_command overview_under_cursor</span>\n</pre>\n<p>If set, single clicking and dragging mouse selects entire words rather than characters.</p>\n</div>\n", "alt_right_click_command": "<div class=\"document\" id=\"shift-click-command-control-click-command-alt-click-command-shift-right-click-command-control-right-click-command-and-alt-right-click-command\">\n<h1 class=\"title\"><code>shift_click_command</code>, <code>control_click_command</code>, <code>alt_click_command</code>, <code>shift_right_click_command</code>, <code>control_right_click_command</code>, and <code>alt_right_click_command</code></h1>\n<p>Custom commands to run when mouse click is pressed while modifier keys are held down. For example:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">control_click_command overview_under_cursor</span>\n</pre>\n<p>If set, single clicking and dragging mouse selects entire words rather than characters.</p>\n</div>\n", "use_legacy_keybinds": "<div class=\"document\" id=\"use-legacy-keybinds\">\n<h1 class=\"title\"><code>use_legacy_keybinds</code></h1>\n<p>By default we use legacy keybindings which have some problems. For example to bind the <code>%</code> key, you would have to enter something like this:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">command &lt;S-%&gt;</span>\n</pre>\n<p>which is a little weird. Also legacy keybinds don't work well with some keyboard layouts. If you set <code>use_legacy_keybinds</code> to 0, then we use a new method for keybind parsing which allows you to do something like this:</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">command %</span>\n</pre>\n<p>which also works with all keyboard layouts. Since this is a backwards incompatible change, <code>use_legacy_keybinds</code> is activated by default.</p>\n</div>\n", "multiline_menus": "<div class=\"document\" id=\"multiline-menus\">\n<h1 class=\"title\"><code>multiline_menus</code></h1>\n<p>If set, we show long menu items in multiple lines rather than truncating them.</p>\n</div>\n", "start_with_helper_window": "<div class=\"document\" id=\"start-with-helper-window\">\n<h1 class=\"title\"><code>start_with_helper_window</code></h1>\n<p>Open helper window when sioyek starts.</p>\n</div>\n", "prerender_next_page_presentation": "<div class=\"document\" id=\"prerender-next-page-presentation\">\n<h1 class=\"title\"><code>prerender_next_page_presentation</code></h1>\n<p>When in presentation mode, we pre-render the next page to remove flickering when moving between pages.</p>\n</div>\n", "highlight_middle_click": "<div class=\"document\" id=\"highlight-middle-click\">\n<h1 class=\"title\"><code>highlight_middle_click</code></h1>\n<p>If enabled, highlights the selected text by middle clicking on it.</p>\n</div>\n", "smooth_scroll_speed": "<div class=\"document\" id=\"smooth-scroll-speed-and-smooth-scroll-drag\">\n<h1 class=\"title\"><code>smooth_scroll_speed</code> and <code>smooth_scroll_drag</code></h1>\n<p>When smooth scrolling is enabled (using <code>toggle_smooth_scroll</code> command), these control the speed and slowdown of movement.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">smooth_scroll_speed 3\nsmooth_scroll_drag 3000</span>\n</pre>\n</div>\n", "smooth_scroll_drag": "<div class=\"document\" id=\"smooth-scroll-speed-and-smooth-scroll-drag\">\n<h1 class=\"title\"><code>smooth_scroll_speed</code> and <code>smooth_scroll_drag</code></h1>\n<p>When smooth scrolling is enabled (using <code>toggle_smooth_scroll</code> command), these control the speed and slowdown of movement.</p>\n<pre class=\"code console literal-block\">\n<span class=\"generic output\">smooth_scroll_speed 3\nsmooth_scroll_drag 3000</span>\n</pre>\n</div>\n", "super_fast_search": "<div class=\"document\" id=\"super-fast-search\">\n<h1 class=\"title\"><code>super_fast_search</code></h1>\n<p>If enabled, indexes the document text and considerably speeds of searching. It also enables <code>regex_search</code> command which uses the index to search for regular expressions.</p>\n</div>\n", "show_closest_bookmark_in_statusbar": "<div class=\"document\" id=\"show-closest-bookmark-in-statusbar\">\n<h1 class=\"title\"><code>show_closest_bookmark_in_statusbar</code></h1>\n<p>If enabled, displays the text for closest bookmark in the statusbar.</p>\n</div>\n", "show_close_portal_in_statusbar": "<div class=\"document\" id=\"show-close-portal-in-statusbar\">\n<h1 class=\"title\"><code>show_close_portal_in_statusbar</code></h1>\n<p>If enabled, it displays a statusb
Download .txt
gitextract_3qr03h25/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── build_and_release.yml
│       └── preview_release.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── LICENSE
├── README.md
├── android/
│   ├── AndroidManifest.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── res/
│   │   └── values/
│   │       └── libs.xml
│   └── src/
│       └── info/
│           └── sioyek/
│               └── sioyek/
│                   ├── SioyekActivity.java
│                   └── TextToSpeechService.java
├── 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
├── fzf/
│   ├── fzf.c
│   └── fzf.h
├── 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
│   ├── database.cpp
│   ├── database.h
│   ├── diff/
│   │   ├── keys.config
│   │   └── keys2.config
│   ├── document.cpp
│   ├── document.h
│   ├── document_view.cpp
│   ├── document_view.h
│   ├── fts_fuzzy_match.h
│   ├── 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/
│   │   ├── checked.h
│   │   ├── core.h
│   │   └── unchecked.h
│   ├── utf8.h
│   ├── utils.cpp
│   └── utils.h
├── pdf_viewer_build_config.pro
├── resources/
│   ├── Info.plist
│   ├── debian/
│   │   ├── changelog
│   │   ├── compat
│   │   ├── control
│   │   ├── copyright
│   │   ├── rules
│   │   ├── sioyek.dirs
│   │   ├── sioyek.install
│   │   └── source/
│   │       └── format
│   ├── fonts/
│   │   └── OFL.txt
│   ├── sioyek.1
│   └── sioyek.desktop
├── resources.qrc
├── 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/
    ├── bibs.bib
    ├── compile.sh
    └── tut.tex
Download .txt
Showing preview only (2,775K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (8898 symbols across 80 files)

FILE: android/src/info/sioyek/sioyek/SioyekActivity.java
  class SioyekActivity (line 68) | public class SioyekActivity extends QtActivity{
    method setFileUrlReceived (line 69) | public static native void setFileUrlReceived(String url);
    method qDebug (line 70) | public static native void qDebug(String msg);
    method onTts (line 71) | public static native void onTts(int begin, int end);
    method onTtsStateChange (line 72) | public static native void onTtsStateChange(String newState);
    method onExternalTtsStateChange (line 73) | public static native void onExternalTtsStateChange(String newState);
    method getRestOnPause (line 74) | public static native String getRestOnPause();
    method onResumeState (line 75) | public static native void onResumeState(boolean isPlaying, boolean rea...
    method onReceive (line 87) | @Override
    method onReceive (line 96) | @Override
    method onReceive (line 104) | @Override
    method onCreate (line 112) | @Override
    method onStart (line 162) | @Override
    method onStop (line 180) | @Override
    method onResume (line 189) | @Override
    method onPause (line 200) | @Override
    method onNewIntent (line 212) | @Override
    method checkPendingIntents (line 224) | public void checkPendingIntents(String workingDir){
    method getFile (line 232) | public static File getFile(Context context, Uri uri) throws IOException {
    method createFileFromStream (line 248) | public static void createFileFromStream(InputStream ins, File destinat...
    method queryName (line 262) | private static String queryName(Context context, Uri uri) {
    method getRealPathFromUri (line 273) | public static String getRealPathFromUri(Context context, Uri contentUr...
    method getPathFromUri (line 293) | public static String getPathFromUri(Context context, Uri uri) {
    method getDataColumn (line 359) | public static String getDataColumn(Context context, Uri uri, String se...
    method isExternalStorageDocument (line 387) | public static boolean isExternalStorageDocument(Uri uri) {
    method isDownloadsDocument (line 395) | public static boolean isDownloadsDocument(Uri uri) {
    method isMediaDocument (line 403) | public static boolean isMediaDocument(Uri uri) {
    method isGooglePhotosUri (line 411) | public static boolean isGooglePhotosUri(Uri uri) {
    method processIntent (line 415) | private void processIntent(){
    method ttsPause (line 440) | public void ttsPause(){
    method ttsStop (line 450) | public void ttsStop(){
    method ttsSetRate (line 459) | public void ttsSetRate(float rate){
    method ttsSetRestOfDocument (line 468) | public void ttsSetRestOfDocument(String text){
    method ttsSay (line 478) | public void ttsSay(String text){
    method setTtsRate (line 492) | public void setTtsRate(float rate){
    method setTtsRestOfDocument (line 498) | public void setTtsRestOfDocument(String rest){

FILE: android/src/info/sioyek/sioyek/TextToSpeechService.java
  class CustomPlayer (line 33) | class CustomPlayer extends SimpleBasePlayer{
    method CustomPlayer (line 47) | public CustomPlayer(Looper looper){
    method updatePlaybackState (line 51) | public void updatePlaybackState(int playbackState, Boolean playWhenRea...
    method getState (line 62) | @Override
    method handleSetPlayWhenReady (line 68) | @Override
  class TextToSpeechService (line 74) | public class TextToSpeechService extends MediaSessionService {
    method getPlayerStateString (line 91) | private String getPlayerStateString(int state){
    method onCreate (line 99) | @Override
    method onStartCommand (line 184) | @Override
    method onTaskRemoved (line 209) | @Override
    method onDestroy (line 218) | @Override
    method onGetSession (line 225) | @Override
    method sendMessage (line 236) | private void sendMessage(int begin, int end){
    method publishTtsState (line 243) | private void publishTtsState(String state){
    method publishExternalTtsState (line 249) | private void publishExternalTtsState(String state){
    method findFirstSpaceBefore (line 255) | int findFirstSpaceBefore(String text, int index){
    method setRestText (line 264) | void setRestText(String rest){
    method handleResumeState (line 276) | void handleResumeState(){

FILE: fzf/fzf.c
  type char_class (line 43) | typedef int32_t char_class;
  type byte (line 44) | typedef char byte;
  type score_t (line 46) | typedef enum {
  type char_types (line 57) | typedef enum {
  function index_byte (line 65) | static int32_t index_byte(fzf_string_t *string, char b) {
  function leading_whitespaces (line 74) | static size_t leading_whitespaces(fzf_string_t *str) {
  function trailing_whitespaces (line 85) | static size_t trailing_whitespaces(fzf_string_t *str) {
  function copy_runes (line 96) | static void copy_runes(fzf_string_t *src, fzf_i32_t *destination) {
  function copy_into_i16 (line 102) | static void copy_into_i16(i16_slice_t *src, fzf_i16_t *dest) {
  function has_prefix (line 121) | static bool has_prefix(const char *str, const char *prefix, size_t prefi...
  function has_suffix (line 125) | static bool has_suffix(const char *str, size_t len, const char *suffix,
  function max16 (line 193) | static int16_t max16(int16_t a, int16_t b) {
  function min64u (line 197) | static size_t min64u(size_t a, size_t b) {
  function fzf_position_t (line 201) | fzf_position_t *fzf_pos_array(size_t len) {
  function resize_pos (line 213) | static void resize_pos(fzf_position_t *pos, size_t add_len, size_t comp) {
  function unsafe_append_pos (line 223) | static void unsafe_append_pos(fzf_position_t *pos, size_t value) {
  function append_pos (line 229) | static void append_pos(fzf_position_t *pos, size_t value) {
  function insert_range (line 235) | static void insert_range(fzf_position_t *pos, size_t start, size_t end) {
  function fzf_i16_t (line 252) | static fzf_i16_t alloc16(size_t *offset, fzf_slab_t *slab, size_t size) {
  function fzf_i32_t (line 267) | static fzf_i32_t alloc32(size_t *offset, fzf_slab_t *slab, size_t size) {
  function char_class (line 282) | static char_class char_class_of_ascii(char ch) {
  function char_class (line 299) | static char_class char_class_of(char ch) {
  function bonus_for (line 307) | static int16_t bonus_for(char_class prev_class, char_class class) {
  function bonus_at (line 321) | static int16_t bonus_at(fzf_string_t *input, size_t idx) {
  function normalize_rune (line 330) | static char normalize_rune(char r) {
  function try_skip (line 342) | static int32_t try_skip(fzf_string_t *input, bool case_sensitive, byte b,
  function is_ascii (line 369) | static bool is_ascii(const char *runes, size_t size) {
  function ascii_fuzzy_index (line 379) | static int32_t ascii_fuzzy_index(fzf_string_t *input, const char *pattern,
  function calculate_score (line 401) | static int32_t calculate_score(bool case_sensitive, bool normalize,
  function fzf_result_t (line 462) | fzf_result_t fzf_fuzzy_match_v1(bool case_sensitive, bool normalize,
  function fzf_result_t (line 524) | fzf_result_t fzf_fuzzy_match_v2(bool case_sensitive, bool normalize,
  function fzf_result_t (line 770) | fzf_result_t fzf_exact_match_naive(bool case_sensitive, bool normalize,
  function fzf_result_t (line 834) | fzf_result_t fzf_prefix_match(bool case_sensitive, bool normalize,
  function fzf_result_t (line 869) | fzf_result_t fzf_suffix_match(bool case_sensitive, bool normalize,
  function fzf_result_t (line 906) | fzf_result_t fzf_equal_match(bool case_sensitive, bool normalize,
  function append_set (line 959) | static void append_set(fzf_term_set_t *set, fzf_term_t value) {
  function append_pattern (line 971) | static void append_pattern(fzf_pattern_t *pattern, fzf_term_set_t *value) {
  function fzf_pattern_t (line 993) | fzf_pattern_t *fzf_parse_pattern(fzf_case_types case_mode, bool normalize,
  function fzf_free_pattern (line 1127) | void fzf_free_pattern(fzf_pattern_t *pattern) {
  function fzf_get_score (line 1144) | int32_t fzf_get_score(const char *text, fzf_pattern_t *pattern,
  function fzf_position_t (line 1197) | fzf_position_t *fzf_get_positions(const char *text, fzf_pattern_t *pattern,
  function fzf_free_positions (line 1236) | void fzf_free_positions(fzf_position_t *pos) {
  function fzf_slab_t (line 1243) | fzf_slab_t *fzf_make_slab(fzf_slab_config_t config) {
  function fzf_slab_t (line 1262) | fzf_slab_t *fzf_make_default_slab(void) {
  function fzf_free_slab (line 1266) | void fzf_free_slab(fzf_slab_t *slab) {

FILE: fzf/fzf.h
  type fzf_i16_t (line 8) | typedef struct {
  type fzf_i32_t (line 15) | typedef struct {
  type fzf_position_t (line 22) | typedef struct {
  type fzf_result_t (line 28) | typedef struct {
  type fzf_slab_t (line 34) | typedef struct {
  type fzf_slab_config_t (line 39) | typedef struct {
  type fzf_string_t (line 44) | typedef struct {
  type fzf_result_t (line 49) | typedef fzf_result_t (*fzf_algo_t)(bool, bool, fzf_string_t *, fzf_strin...
  type fzf_case_types (line 52) | typedef enum { CaseSmart = 0, CaseIgnore, CaseRespect } fzf_case_types;
  type fzf_term_t (line 54) | typedef struct {
  type fzf_term_set_t (line 62) | typedef struct {
  type fzf_pattern_t (line 68) | typedef struct {

FILE: pdf_viewer/OpenWithApplication.h
  function class (line 7) | class OpenWithApplication : public QApplication

FILE: pdf_viewer/RunGuard.cpp
  function QString (line 11) | QString generateKeyHash(const QString& key, const QString& salt)

FILE: pdf_viewer/RunGuard.h
  function class (line 54) | class RunGuard : public QObject

FILE: pdf_viewer/book.cpp
  function Portal (line 22) | Portal Portal::with_src_offset(float src_offset)
  function QJsonObject (line 29) | QJsonObject Mark::to_json(std::string doc_checksum) const
  function QDateTime (line 71) | QDateTime Annotation::get_creation_datetime() const {
  function QDateTime (line 75) | QDateTime Annotation::get_modification_datetime() const {
  function QJsonObject (line 102) | QJsonObject BookMark::to_json(std::string doc_checksum) const
  function QJsonObject (line 184) | QJsonObject Highlight::to_json(std::string doc_checksum) const
  function QJsonObject (line 220) | QJsonObject Portal::to_json(std::string doc_checksum) const
  function are_same (line 291) | bool are_same(const BookMark& lhs, const BookMark& rhs) {
  function are_same (line 295) | bool are_same(const Highlight& lhs, const Highlight& rhs) {
  function AbsoluteRect (line 303) | AbsoluteRect BookMark::get_rectangle() const{
  function AbsoluteRect (line 319) | AbsoluteRect Portal::get_rectangle() const{
  function AbsoluteDocumentPos (line 332) | AbsoluteDocumentPos BookMark::begin_pos() {
  function AbsoluteDocumentPos (line 336) | AbsoluteDocumentPos BookMark::end_pos() {
  function AbsoluteRect (line 340) | AbsoluteRect BookMark::rect() {
  function AbsoluteRect (line 344) | AbsoluteRect FreehandDrawing::bbox(){
  function reference_type_string (line 367) | std::string reference_type_string(ReferenceType rt) {

FILE: pdf_viewer/book.h
  function SelectedObjectType (line 19) | enum class SelectedObjectType {
  type Annotation (line 54) | struct Annotation {
  function Annotation (line 79) | struct Mark : Annotation {
  type BookMark (line 93) | struct BookMark
  type PdfLink (line 137) | struct PdfLink {
  type OverviewSide (line 144) | enum OverviewSide {
  type ParsedUri (line 151) | struct ParsedUri {
  type FreehandDrawingPoint (line 157) | struct FreehandDrawingPoint {
  type class (line 162) | enum class
  type DocumentCharacter (line 168) | struct DocumentCharacter {
  type FreehandDrawing (line 177) | struct FreehandDrawing {
  type PixmapDrawing (line 185) | struct PixmapDrawing {
  type CharacterAddress (line 190) | struct CharacterAddress {
  type DocumentViewState (line 210) | struct DocumentViewState {
  type PortalViewState (line 215) | struct PortalViewState {
  type OverviewResizeData (line 220) | struct OverviewResizeData {
  type OverviewMoveData (line 226) | struct OverviewMoveData {
  type OverviewTouchMoveData (line 231) | struct OverviewTouchMoveData {
  type Portal (line 242) | struct Portal
  type SearchResult (line 261) | struct SearchResult {
  type TocNode (line 271) | struct TocNode {
  type CachedPageData (line 283) | struct CachedPageData {
  type class (line 289) | enum class
  type SmartViewCandidate (line 300) | struct SmartViewCandidate {
  type CachedPage (line 323) | struct CachedPage {
  type IndexedData (line 339) | struct IndexedData {

FILE: pdf_viewer/checksum.cpp
  function compute_checksum (line 5) | std::string compute_checksum(const QString& file_name, QCryptographicHas...

FILE: pdf_viewer/checksum.h
  function class (line 12) | class CachedChecksummer {

FILE: pdf_viewer/config.cpp
  function int_serializer (line 396) | void int_serializer(void* int_pointer, std::wstringstream& stream) {
  function bool_serializer (line 400) | void bool_serializer(void* bool_pointer, std::wstringstream& stream) {
  function string_serializer (line 404) | void string_serializer(void* string_pointer, std::wstringstream& stream) {
  function rect_serializer (line 408) | void rect_serializer(void* rect_pointer, std::wstringstream& stream) {
  function vec_n_serializer (line 440) | void vec_n_serializer(void* vec_n_pointer, std::wstringstream& stream) {
  function are_vecs_different (line 483) | bool are_vecs_different(T* vec1, T* vec2) {
  function float_serializer (line 556) | void float_serializer(void* float_pointer, std::wstringstream& stream) {
  function Config (line 565) | Config* ConfigManager::get_mut_config_with_name(std::wstring config_name) {
  function ensure_between_0_and_1 (line 572) | bool ensure_between_0_and_1(const QStringList& parts) {
  function colorn_validator (line 589) | bool colorn_validator(const std::wstring& str) {
  function bool_validator (line 635) | bool bool_validator(const std::wstring& str) {
  class ConfigBuilder (line 666) | class ConfigBuilder{
    method get_serializer (line 678) | std::function<void(void*, std::wstringstream&)> get_serializer(){
    method get_deserializer (line 698) | std::function<void*(std::wstringstream&, void* res, bool* changed)> ge...
    method get_validator (line 719) | std::function<bool(const std::wstring& value)> get_validator(){
    method ConfigBuilder (line 741) | ConfigBuilder(std::wstring config_name, ConfigType ctype, void* cvalue){
    method ConfigBuilder (line 747) | static ConfigBuilder color3(std::wstring config_name, float* val){
    method ConfigBuilder (line 751) | static ConfigBuilder color4(std::wstring config_name, float* val){
    method ConfigBuilder (line 755) | static ConfigBuilder boolean(std::wstring config_name, bool* val){
    method ConfigBuilder (line 759) | static ConfigBuilder floatc(std::wstring config_name, float* val, Floa...
    method ConfigBuilder (line 763) | static ConfigBuilder intc(std::wstring config_name, int* val, IntExtra...
    method ConfigBuilder (line 767) | static ConfigBuilder string(std::wstring config_name, std::wstring* val){
    method ConfigBuilder (line 771) | static ConfigBuilder macro(std::wstring config_name, std::wstring* val){
    method ConfigBuilder (line 775) | static ConfigBuilder ivec2(std::wstring config_name, int* val){
    method ConfigBuilder (line 779) | static ConfigBuilder fvec2(std::wstring config_name, float* val){
    method ConfigBuilder (line 783) | static ConfigBuilder rect(std::wstring config_name, UIRect* val){
    method ConfigBuilder (line 787) | ConfigBuilder serializer(std::function<void(void*, std::wstringstream&...
    method ConfigBuilder (line 792) | ConfigBuilder deserializer(std::function<void*(std::wstringstream&, vo...
    method ConfigBuilder (line 797) | ConfigBuilder valid(std::function<bool(const std::wstring& value)> val...
    method ConfigBuilder (line 802) | ConfigBuilder extra(std::variant<FloatExtras, IntExtras, EmptyExtras> ...
    method ConfigBuilder (line 807) | ConfigBuilder auto_(){
    method Config (line 812) | Config build(){
  function QVariant (line 1455) | QVariant ConfigModel::data(const QModelIndex& index, int role) const {
  function QRect (line 1563) | QRect UIRect::to_window(int window_width, int window_height) {

FILE: pdf_viewer/config.h
  type ConfigType (line 22) | enum ConfigType {
  type UIRange (line 38) | struct UIRange {
  type UIRect (line 43) | struct UIRect {
  type FloatExtras (line 55) | struct FloatExtras {
  type IntExtras (line 60) | struct IntExtras {
  type EmptyExtras (line 65) | struct EmptyExtras {
  type AdditionalKeymapData (line 68) | struct AdditionalKeymapData {
  type Config (line 79) | struct Config {
  function class (line 103) | class ConfigManager {
  function class (line 140) | class ConfigModel : public QAbstractTableModel {

FILE: pdf_viewer/coordinates.cpp
  function rects_intersect (line 6) | bool rects_intersect(fz_rect rect1, fz_rect rect2) {
  function rects_intersect (line 10) | bool rects_intersect(fz_irect rect1, fz_irect rect2) {
  function range_intersects (line 14) | bool range_intersects(float range1_start, float range1_end, float range2...
  function are_same (line 47) | bool are_same(const AbsoluteDocumentPos& lhs, const AbsoluteDocumentPos&...
  function AbsoluteDocumentPos (line 56) | AbsoluteDocumentPos DocumentPos::to_absolute(Document* doc) const{
  function NormalizedWindowPos (line 60) | NormalizedWindowPos DocumentPos::to_window_normalized(DocumentView* docu...
  function WindowPos (line 64) | WindowPos DocumentPos::to_window(DocumentView* document_view) const{
  function DocumentPos (line 68) | DocumentPos AbsoluteDocumentPos::to_document(Document* doc) const{
  function NormalizedWindowPos (line 72) | NormalizedWindowPos AbsoluteDocumentPos::to_window_normalized(DocumentVi...
  function WindowPos (line 76) | WindowPos AbsoluteDocumentPos::to_window(DocumentView* document_view) co...
  function DocumentPos (line 80) | DocumentPos NormalizedWindowPos::to_document(DocumentView* document_view) {
  function AbsoluteDocumentPos (line 85) | AbsoluteDocumentPos NormalizedWindowPos::to_absolute(DocumentView* docum...
  function WindowPos (line 90) | WindowPos NormalizedWindowPos::to_window(DocumentView* document_view) {
  function DocumentPos (line 94) | DocumentPos WindowPos::to_document(DocumentView* document_view) {
  function AbsoluteDocumentPos (line 98) | AbsoluteDocumentPos WindowPos::to_absolute(DocumentView* document_view) {
  function NormalizedWindowPos (line 102) | NormalizedWindowPos WindowPos::to_window_normalized(DocumentView* docume...
  function AbsoluteRect (line 108) | AbsoluteRect DocumentRect::to_absolute(Document* doc) {
  function DocumentRect (line 112) | DocumentRect AbsoluteRect::to_document(Document* doc) const {
  function NormalizedWindowRect (line 128) | NormalizedWindowRect AbsoluteRect::to_window_normalized(DocumentView* do...
  function NormalizedWindowRect (line 132) | NormalizedWindowRect DocumentRect::to_window_normalized(DocumentView* do...
  function DocumentPos (line 136) | DocumentPos DocumentRect::top_left() {
  function DocumentPos (line 140) | DocumentPos DocumentRect::bottom_right() {
  function fvec2 (line 181) | fvec2 operator-(const AbsoluteDocumentPos& lhs, const AbsoluteDocumentPo...
  function fvec2 (line 185) | fvec2 operator-(const VirtualPos& lhs, const VirtualPos& rhs) {
  function fvec2 (line 189) | fvec2 operator-(const DocumentPos& lhs, const DocumentPos& rhs) {
  function fvec2 (line 193) | fvec2 operator-(const NormalizedWindowPos& lhs, const NormalizedWindowPo...
  function ivec2 (line 197) | ivec2 operator-(const WindowPos& lhs, const WindowPos& rhs) {
  function AbsoluteDocumentPos (line 201) | AbsoluteDocumentPos operator+(const AbsoluteDocumentPos& lhs, const fvec...
  function AbsoluteDocumentPos (line 205) | AbsoluteDocumentPos operator-(const AbsoluteDocumentPos& lhs, const fvec...
  function DocumentPos (line 209) | DocumentPos operator+(const DocumentPos& lhs, const fvec2& rhs) {
  function NormalizedWindowPos (line 213) | NormalizedWindowPos operator+(const NormalizedWindowPos& lhs, const fvec...
  function WindowPos (line 217) | WindowPos operator+(const WindowPos& lhs, const ivec2& rhs) {
  function WindowRect (line 221) | WindowRect DocumentRect::to_window(DocumentView* document_view) {
  function PagelessDocumentPos (line 225) | PagelessDocumentPos DocumentPos::pageless() const {
  function PagelessDocumentRect (line 229) | PagelessDocumentRect rect_from_quad(fz_quad quad) {
  function WindowRect (line 237) | WindowRect AbsoluteRect::to_window(DocumentView* document_view) {
  function VirtualPos (line 241) | VirtualPos operator+(const VirtualPos& lhs, const fvec2& rhs) {
  function VirtualPos (line 245) | VirtualPos operator-(const VirtualPos& lhs, const fvec2& rhs) {
  function DocumentRect (line 249) | DocumentRect to_document(const WindowRect& window_rect, DocumentView* dv) {

FILE: pdf_viewer/coordinates.h
  type AbsoluteDocumentPos (line 12) | struct AbsoluteDocumentPos
  type NormalizedWindowPos (line 13) | struct NormalizedWindowPos
  type WindowPos (line 14) | struct WindowPos
  type CompiledDrawingData (line 21) | struct CompiledDrawingData {
  type PagelessDocumentPos (line 34) | struct PagelessDocumentPos {
  type DocumentPos (line 39) | struct DocumentPos {
  type AbsoluteDocumentPos (line 50) | struct AbsoluteDocumentPos {
  type NormalizedWindowPos (line 61) | struct NormalizedWindowPos {
  type WindowPos (line 71) | struct WindowPos {
  type DocumentRect (line 87) | struct DocumentRect
  type AbsoluteRect (line 88) | struct AbsoluteRect
  type NormalizedWindowRect (line 89) | struct NormalizedWindowRect
  function R (line 109) | EnhancedRect(R r) : R(r) {
  function S (line 120) | S width() const{
  function T (line 132) | T center() const {
  type AbsoluteRect (line 209) | struct AbsoluteRect
  function values (line 258) | Vec(T values_[]) : values(values_) {
  function T (line 272) | const T& operator[](int i) const {
  function T (line 276) | T x() {
  function T (line 280) | T y() {
  function T (line 284) | T width() {
  function T (line 288) | T height() {
  function norm (line 292) | float norm() {
  function NormalizedWindowPos (line 301) | NormalizedWindowPos to_normalized_window_pos() {
  type VirtualPos (line 345) | struct VirtualPos {

FILE: pdf_viewer/database.cpp
  function esc (line 26) | std::wstring esc(const std::wstring& inp) {
  function esc (line 33) | std::wstring esc(const std::string& inp) {
  function null_callback (line 37) | static int null_callback(void* notused, int argc, char** argv, char** co...
  function id_callback (line 41) | static int id_callback(void* res_vector, int argc, char** argv, char** c...
  function opened_book_callback (line 53) | static int opened_book_callback(void* res_vector, int argc, char** argv,...
  function prev_doc_callback (line 69) | static int prev_doc_callback(void* res_vector, int argc, char** argv, ch...
  function prev_doc_with_name_callback (line 80) | static int prev_doc_with_name_callback(void* res_vector, int argc, char*...
  function mark_select_callback (line 94) | static int mark_select_callback(void* res_vector, int argc, char** argv,...
  function mark_in_database_select_callback (line 122) | static int mark_in_database_select_callback(void* res_vector, int argc, ...
  function global_mark_select_callback (line 138) | static int global_mark_select_callback(void* res_vector, int argc, char*...
  function global_bookmark_select_callback (line 151) | static int global_bookmark_select_callback(void* res_vector, int argc, c...
  function global_highlight_select_callback (line 203) | static int global_highlight_select_callback(void* res_vector, int argc, ...
  function bookmark_select_callback (line 241) | static int bookmark_select_callback(void* res_vector, int argc, char** a...
  function wstring_select_callback (line 316) | static int wstring_select_callback(void* res_vector, int argc, char** ar...
  function string_select_callback (line 327) | static int string_select_callback(void* res_vector, int argc, char** arg...
  function wstring_pair_select_callback (line 338) | static int wstring_pair_select_callback(void* res_vector, int argc, char...
  function version_callback (line 350) | static int version_callback(void* res, int argc, char** argv, char** col...
  function highlight_select_callback (line 362) | static int highlight_select_callback(void* res_vector, int argc, char** ...
  function link_select_callback (line 397) | static int link_select_callback(void* res_vector, int argc, char** argv,...
  function handle_error (line 493) | bool handle_error(const QString& func_name, int error_code, char* error_...
  function update_string_value (line 1223) | bool update_string_value(sqlite3* db,
  function update_mark_path (line 1240) | bool update_mark_path(sqlite3* db, const std::wstring& path, const std::...
  function update_opened_book_path (line 1244) | bool update_opened_book_path(sqlite3* db, const std::wstring& path, cons...
  function update_bookmark_path (line 1248) | bool update_bookmark_path(sqlite3* db, const std::wstring& path, const s...
  function update_highlight_path (line 1252) | bool update_highlight_path(sqlite3* db, const std::wstring& path, const ...
  function update_portal_path (line 1256) | bool update_portal_path(sqlite3* db, const std::wstring& path, const std...
  function get_new_elements (line 1477) | std::vector<T> get_new_elements(const std::vector<T>& prev_elements, con...
  function create_select_query (line 1575) | std::string create_select_query(std::string table_name,
  function encode_variant (line 1923) | std::wstring encode_variant(QVariant var) {

FILE: pdf_viewer/database.h
  type MarkInDatabase (line 12) | struct MarkInDatabase {
  function class (line 21) | class DatabaseManager {

FILE: pdf_viewer/document.cpp
  function CharacterIterator (line 92) | CharacterIterator& CharacterIterator::operator++() {
  function CharacterIterator (line 123) | CharacterIterator CharacterIterator::operator++(int) {
  function CharacterIterator (line 146) | CharacterIterator PageIterator::begin() const {
  function CharacterIterator (line 150) | CharacterIterator PageIterator::end() const {
  function fz_outline (line 795) | fz_outline* Document::get_toc_outline() {
  function fz_try (line 807) | fz_try(context) {
  function fz_catch (line 817) | fz_catch(context) {
  function PdfLink (line 860) | PdfLink Document::merge_links(const std::vector<PdfLink>& links_to_merge) {
  function fz_link (line 936) | fz_link* Document::get_page_links(int page_number) {
  function QDateTime (line 956) | QDateTime Document::get_last_edit_time() {
  function fz_try (line 980) | fz_try(context) {
  function fz_catch (line 996) | fz_catch(context) {
  function fz_try (line 1016) | fz_try(context) {
  function fz_catch (line 1028) | fz_catch(context) {
  function fz_try (line 1082) | fz_try(context) {
  function fz_catch (line 1096) | fz_catch(context) {
  function fz_try (line 1111) | fz_try(context_) {
  function fz_catch (line 1154) | fz_catch(context_) {
  function AbsoluteRect (line 1178) | AbsoluteRect Document::get_page_absolute_rect(int page) {
  function fz_try (line 1201) | fz_try(context) {
  function fz_catch (line 1205) | fz_catch(context) {
  function Document (line 1220) | Document* DocumentManager::get_document(const std::wstring& path) {
  function fz_stext_page (line 1240) | fz_stext_page* Document::get_stext_with_page_number(int page_number) {
  function fz_stext_page (line 1244) | fz_stext_page* Document::get_stext_with_page_number(fz_context* ctx, int...
  function DocumentRect (line 1311) | DocumentRect Document::absolute_to_page_rect(AbsoluteRect abs_rect) {
  function DocumentPos (line 1317) | DocumentPos Document::absolute_to_page_pos(AbsoluteDocumentPos absp) {
  function DocumentPos (line 1341) | DocumentPos Document::absolute_to_page_pos_uncentered(AbsoluteDocumentPo...
  function QStandardItemModel (line 1345) | QStandardItemModel* Document::get_toc_model() {
  function fz_try (line 1395) | fz_try(context_) {
  function fz_catch (line 1436) | fz_catch(context_) {
  function get_matches (line 1715) | void get_matches(std::wstring haystack, const std::wregex& reg, std::vec...
  function clean_bib_string_quotations (line 1756) | std::wstring clean_bib_string_quotations(std::wstring bib_string){
  function fz_pixmap (line 1798) | fz_pixmap* Document::get_small_pixmap(int page) {
  type pdf_annot_type (line 2102) | enum pdf_annot_type
  function fz_try (line 2282) | fz_try(context) {
  function fz_catch (line 2285) | fz_catch(context) {
  function PagelessDocumentRect (line 2623) | PagelessDocumentRect Document::get_page_rect_no_cache(int page_number) {
  function PdfLink (line 2710) | PdfLink Document::pdf_link_from_fz_link(int page, fz_link* link) {
  function AbsoluteDocumentPos (line 2801) | AbsoluteDocumentPos Document::document_to_absolute_pos(DocumentPos doc_p...
  function AbsoluteRect (line 2810) | AbsoluteRect Document::document_to_absolute_rect(DocumentRect doc_rect){
  function AbsoluteRect (line 2817) | AbsoluteRect Document::get_ith_next_line_from_absolute_y(int page, int l...
  function Document (line 4008) | Document* DocumentManager::get_document_with_checksum(const std::string&...
  function QJsonArray (line 4210) | QJsonArray Document::get_bookmarks_json() {
  function QJsonArray (line 4214) | QJsonArray Document::get_highlights_json() {
  function QJsonArray (line 4218) | QJsonArray Document::get_portals_json() {
  function QJsonArray (line 4222) | QJsonArray Document::get_marks_json() {
  function PageIterator (line 4313) | PageIterator Document::page_iterator(int page_number) {
  function AbsoluteRect (line 4400) | AbsoluteRect Document::to_absolute(int page, fz_quad quad) {
  function AbsoluteRect (line 4404) | AbsoluteRect Document::to_absolute(int page, PagelessDocumentRect rect) {
  function fz_context (line 4408) | fz_context* Document::get_mupdf_context(){
  function CachedPageIndex (line 4412) | CachedPageIndex& Document::get_page_index(int page) {
  function QString (line 4458) | QString Document::get_rest_of_document_pages_text(int from) {
  function fz_stext_char (line 4527) | fz_stext_char* Document::get_next_char_after_selection(int page_number, ...

FILE: pdf_viewer/document.h
  function class (line 29) | class CharacterIterator {
  function class (line 50) | class PageIterator {
  type CachedPageIndex (line 58) | struct CachedPageIndex {
  function class (line 63) | class Document {

FILE: pdf_viewer/document_view.cpp
  function DocumentViewState (line 48) | DocumentViewState DocumentView::get_state() {
  function PortalViewState (line 65) | PortalViewState DocumentView::get_checksum_state() {
  function Document (line 160) | Document* DocumentView::get_document() {
  function Highlight (line 237) | Highlight DocumentView::get_highlight_with_index(int index) {
  function AbsoluteDocumentPos (line 265) | AbsoluteDocumentPos DocumentView::get_offsets() {
  function VirtualPos (line 269) | VirtualPos DocumentView::get_virtual_offset() {
  function NormalizedWindowPos (line 388) | NormalizedWindowPos DocumentView::absolute_to_window_pos(AbsoluteDocumen...
  function NormalizedWindowRect (line 402) | NormalizedWindowRect DocumentView::absolute_to_window_rect(AbsoluteRect ...
  function NormalizedWindowPos (line 409) | NormalizedWindowPos DocumentView::document_to_window_pos(DocumentPos doc...
  function WindowPos (line 423) | WindowPos DocumentView::absolute_to_window_pos_in_pixels(AbsoluteDocumen...
  function WindowPos (line 432) | WindowPos DocumentView::document_to_window_pos_in_pixels_uncentered(Docu...
  function WindowPos (line 439) | WindowPos DocumentView::document_to_window_pos_in_pixels_banded(Document...
  function WindowRect (line 454) | WindowRect DocumentView::document_to_window_irect(DocumentRect doc_rect) {
  function NormalizedWindowRect (line 460) | NormalizedWindowRect DocumentView::document_to_window_rect(DocumentRect ...
  function NormalizedWindowRect (line 467) | NormalizedWindowRect DocumentView::document_to_window_rect_pixel_perfect...
  function DocumentPos (line 507) | DocumentPos DocumentView::window_to_document_pos(WindowPos window_pos) {
  function AbsoluteDocumentPos (line 519) | AbsoluteDocumentPos DocumentView::window_to_absolute_document_pos(Window...
  function NormalizedWindowPos (line 527) | NormalizedWindowPos DocumentView::window_to_normalized_window_pos(Window...
  function WindowPos (line 1693) | WindowPos DocumentView::normalized_window_to_window_pos(NormalizedWindow...
  function WindowRect (line 1699) | WindowRect DocumentView::normalized_to_window_rect(NormalizedWindowRect ...
  function Document (line 1707) | Document* SmartViewCandidate::get_document(DocumentView* view) {
  function DocumentPos (line 1713) | DocumentPos SmartViewCandidate::get_docpos(DocumentView* view) {
  function AbsoluteDocumentPos (line 1722) | AbsoluteDocumentPos SmartViewCandidate::get_abspos(DocumentView* view) {
  function AbsoluteRect (line 1850) | AbsoluteRect ScratchPad::get_bounding_box() {
  function VirtualPos (line 1981) | VirtualPos DocumentView::absolute_to_virtual_pos(const AbsoluteDocumentP...
  function VirtualPos (line 1995) | VirtualPos DocumentView::document_to_virtual_pos(DocumentPos docpos) {
  function AbsoluteDocumentPos (line 2015) | AbsoluteDocumentPos DocumentView::virtual_to_absolute_pos(const VirtualP...
  function VirtualPos (line 2166) | VirtualPos DocumentView::window_to_virtual_pos(const WindowPos& window_p...
  function WindowPos (line 2173) | WindowPos DocumentView::virtual_to_window_pos(const VirtualPos& vpos) {
  function NormalizedWindowRect (line 2194) | NormalizedWindowRect DocumentView::virtual_to_normalized_window_rect(con...

FILE: pdf_viewer/document_view.h
  function class (line 29) | class DocumentView {
  function class (line 252) | class ScratchPad : public DocumentView {

FILE: pdf_viewer/fts_fuzzy_match.h
  function namespace (line 41) | namespace fts {
  function namespace (line 49) | namespace fts {

FILE: pdf_viewer/input.cpp
  function is_command_string_modal (line 62) | bool is_command_string_modal(const std::wstring& command_name) {
  function parse_command_name (line 66) | std::vector<std::string> parse_command_name(const QString& command_names) {
  type CommandInvocation (line 75) | struct CommandInvocation {
    method QString (line 79) | QString command_string() {
    method QString (line 88) | QString mode_string() {
  type ParseState (line 102) | struct ParseState {
    method skip_whitespace (line 106) | void skip_whitespace() {
    method skip_whitespace_and_commas (line 112) | void skip_whitespace_and_commas() {
    method next_arg (line 119) | std::optional<QString> next_arg() {
    method is_valid_command_name_char (line 171) | bool is_valid_command_name_char(QChar c) {
    method next_command (line 175) | std::optional<CommandInvocation>  next_command() {
    method eof (line 210) | bool eof() {
    method QChar (line 214) | QChar cc() {
    method parse_next_macro_command (line 218) | std::vector<CommandInvocation> parse_next_macro_command() {
  class NoopCommand (line 236) | class NoopCommand : public Command {
    method NoopCommand (line 241) | NoopCommand(MainWidget* widget_) : Command(cname, widget_) {}
    method perform (line 243) | void perform() {
    method requires_document (line 246) | bool requires_document() { return false; }
  class LazyCommand (line 249) | class LazyCommand : public Command {
    method get_result (line 269) | std::optional<std::wstring> get_result() override{
    method set_result_socket (line 276) | void set_result_socket(QLocalSocket* socket) {
    method set_result_mutex (line 283) | void set_result_mutex(bool* p_is_done, std::wstring* result_location) {
    method Command (line 291) | Command* get_command() {
    method LazyCommand (line 317) | LazyCommand(std::string name, MainWidget* widget_, CommandManager* man...
    method set_text_requirement (line 327) | void set_text_requirement(std::wstring value) { get_command()->set_tex...
    method set_symbol_requirement (line 328) | void set_symbol_requirement(char value) { get_command()->set_symbol_re...
    method set_file_requirement (line 329) | void set_file_requirement(std::wstring value) { get_command()->set_fil...
    method set_rect_requirement (line 330) | void set_rect_requirement(AbsoluteRect value) { get_command()->set_rec...
    method set_generic_requirement (line 331) | void set_generic_requirement(QVariant value) { get_command()->set_gene...
    method handle_generic_requirement (line 332) | void handle_generic_requirement() { get_command()->handle_generic_requ...
    method set_point_requirement (line 333) | void set_point_requirement(AbsoluteDocumentPos value) { get_command()-...
    method set_num_repeats (line 334) | void set_num_repeats(int nr) { get_command()->set_num_repeats(nr); }
    method special_symbols (line 335) | std::vector<char> special_symbols() { return get_command()->special_sy...
    method pre_perform (line 336) | void pre_perform() { get_command()->pre_perform(); }
    method pushes_state (line 337) | bool pushes_state() { return get_command()->pushes_state(); }
    method requires_document (line 338) | bool requires_document() { return get_command()->requires_document(); }
    method next_requirement (line 339) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method perform (line 343) | virtual void perform() {
    method get_name (line 350) | std::string get_name() {
  class MacroCommand (line 363) | class MacroCommand : public Command {
    method get_subcommand (line 376) | std::unique_ptr<Command> get_subcommand(CommandInvocation invocation) {
    method set_result_socket (line 390) | void set_result_socket(QLocalSocket* rsocket) {
    method set_result_mutex (line 397) | void set_result_mutex(bool* id, std::wstring* result_location) {
    method initialize_from_invocations (line 406) | void initialize_from_invocations(std::vector<CommandInvocation> comman...
    method MacroCommand (line 424) | MacroCommand(MainWidget* widget_, CommandManager* manager, std::string...
    method MacroCommand (line 431) | MacroCommand(MainWidget* widget_, CommandManager* manager, std::string...
    method get_result (line 448) | std::optional<std::wstring> get_result() override{
    method set_text_requirement (line 455) | void set_text_requirement(std::wstring value) {
    method is_menu_command (line 475) | bool is_menu_command() {
    method set_generic_requirement (line 488) | void set_generic_requirement(QVariant value) {
    method handle_generic_requirement (line 508) | void handle_generic_requirement() {
    method set_symbol_requirement (line 528) | void set_symbol_requirement(char value) {
    method requires_document (line 549) | bool requires_document() {
    method set_file_requirement (line 567) | void set_file_requirement(std::wstring value) {
    method get_command_index_for_requirement_type (line 588) | int get_command_index_for_requirement_type(RequirementType reqtype) {
    method set_rect_requirement (line 606) | void set_rect_requirement(AbsoluteRect value) {
    method set_point_requirement (line 613) | void set_point_requirement(AbsoluteDocumentPos value) {
    method pre_perform (line 621) | void pre_perform() {
    method get_file_path_requirement_root_dir (line 638) | std::optional<QString> get_file_path_requirement_root_dir() override{
    method next_requirement (line 657) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method perform_subcommand (line 685) | void perform_subcommand(int index) {
    method is_enabled (line 708) | bool is_enabled() {
    method is_holdable (line 724) | bool is_holdable() override {
    method perform_up (line 737) | void perform_up() override {
    method on_key_hold (line 746) | void on_key_hold() override {
    method perform (line 755) | void perform() override {
    method get_current_mode_index (line 783) | int get_current_mode_index() {
    method get_current_executing_command_index (line 798) | int get_current_executing_command_index() {
    method on_text_change (line 811) | void on_text_change(const QString& new_text) {
    method special_symbols (line 825) | std::vector<char> special_symbols() {
    method mode_matches (line 833) | bool mode_matches(std::string current_mode, std::string command_mode) {
    method get_name (line 842) | std::string get_name() {
    method get_pending_name (line 866) | std::string get_pending_name() {
    method get_human_readable_name (line 890) | std::string get_human_readable_name() override{
  function AbsoluteRect (line 970) | AbsoluteRect get_rect_from_string(std::wstring str, DocumentView* dv) {
  function AbsoluteDocumentPos (line 1001) | AbsoluteDocumentPos get_point_from_string(std::wstring str) {
  class GenericPathCommand (line 1035) | class GenericPathCommand : public Command {
    method GenericPathCommand (line 1038) | GenericPathCommand(std::string name, MainWidget* w) : Command(name, w) {}
    method next_requirement (line 1040) | std::optional<Requirement> next_requirement(MainWidget* widget) overri...
    method set_generic_requirement (line 1049) | void set_generic_requirement(QVariant value) {
  class GenericGotoLocationCommand (line 1055) | class GenericGotoLocationCommand : public Command {
    method GenericGotoLocationCommand (line 1057) | GenericGotoLocationCommand(std::string name, MainWidget* w) : Command(...
    method next_requirement (line 1061) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_generic_requirement (line 1070) | void set_generic_requirement(QVariant value) {
    method perform (line 1074) | void perform() {
    method pushes_state (line 1079) | bool pushes_state() { return true; }
  class GenericPathAndLocationCommand (line 1083) | class GenericPathAndLocationCommand : public Command {
    method GenericPathAndLocationCommand (line 1088) | GenericPathAndLocationCommand(std::string name, MainWidget* w, bool is...
    method next_requirement (line 1090) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_generic_requirement (line 1099) | void set_generic_requirement(QVariant value) {
    method perform (line 1103) | void perform() {
    method pushes_state (line 1131) | bool pushes_state() {
  class SymbolCommand (line 1136) | class SymbolCommand : public Command {
    method SymbolCommand (line 1139) | SymbolCommand(std::string name, MainWidget* w) : Command(name, w) {}
    method next_requirement (line 1140) | virtual std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_symbol_requirement (line 1149) | virtual void set_symbol_requirement(char value) {
    method get_human_readable_name (line 1153) | virtual std::string get_human_readable_name() {
  class TextCommand (line 1165) | class TextCommand : public Command {
    method TextCommand (line 1170) | TextCommand(std::string name, MainWidget* w) : Command(name, w) {}
    method text_requirement_name (line 1172) | virtual std::string text_requirement_name() {
    method next_requirement (line 1176) | virtual std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 1185) | virtual void set_text_requirement(std::wstring value) {
    method get_text_default_value (line 1189) | std::wstring get_text_default_value() {
  class GotoMark (line 1197) | class GotoMark : public SymbolCommand {
    method GotoMark (line 1202) | GotoMark(MainWidget* w) : SymbolCommand(cname, w) {}
    method pushes_state (line 1204) | bool pushes_state() {
    method get_name (line 1208) | std::string get_name() {
    method special_symbols (line 1212) | std::vector<char> special_symbols() {
    method perform (line 1217) | void perform() {
    method requires_document (line 1222) | bool requires_document() { return false; }
  class SetMark (line 1225) | class SetMark : public SymbolCommand {
    method SetMark (line 1230) | SetMark(MainWidget* w) : SymbolCommand(cname, w) {}
    method get_name (line 1232) | std::string get_name() {
    method perform (line 1237) | void perform() {
  class ToggleDrawingMask (line 1243) | class ToggleDrawingMask : public SymbolCommand {
    method ToggleDrawingMask (line 1248) | ToggleDrawingMask(MainWidget* w) : SymbolCommand(cname, w) {}
    method get_name (line 1250) | std::string get_name() {
    method perform (line 1254) | void perform() {
  class GotoLoadedDocumentCommand (line 1259) | class GotoLoadedDocumentCommand : public GenericPathCommand {
    method GotoLoadedDocumentCommand (line 1263) | GotoLoadedDocumentCommand(MainWidget* w) : GenericPathCommand(cname, w...
    method handle_generic_requirement (line 1265) | void handle_generic_requirement() {
    method perform (line 1269) | void perform() {
    method requires_document (line 1273) | bool requires_document() {
    method get_name (line 1277) | std::string get_name() {
  class GotoNextTabCommand (line 1283) | class GotoNextTabCommand : public Command {
    method GotoNextTabCommand (line 1287) | GotoNextTabCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1289) | void perform() {
    method get_name (line 1293) | std::string get_name() {
  class GotoPrevTabCommand (line 1299) | class GotoPrevTabCommand : public Command {
    method GotoPrevTabCommand (line 1303) | GotoPrevTabCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1305) | void perform() {
    method get_name (line 1309) | std::string get_name() {
  class NextItemCommand (line 1315) | class NextItemCommand : public Command {
    method NextItemCommand (line 1319) | NextItemCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1321) | void perform() {
    method get_name (line 1326) | std::string get_name() {
  class PrevItemCommand (line 1332) | class PrevItemCommand : public Command {
    method PrevItemCommand (line 1336) | PrevItemCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1338) | void perform() {
  class ToggleTextMarkCommand (line 1345) | class ToggleTextMarkCommand : public Command {
    method ToggleTextMarkCommand (line 1349) | ToggleTextMarkCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1351) | void perform() {
  class MoveTextMarkForwardCommand (line 1359) | class MoveTextMarkForwardCommand : public Command {
    method MoveTextMarkForwardCommand (line 1363) | MoveTextMarkForwardCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1365) | void perform() {
  class MoveTextMarkDownCommand (line 1372) | class MoveTextMarkDownCommand : public Command {
    method MoveTextMarkDownCommand (line 1376) | MoveTextMarkDownCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1378) | void perform() {
  class MoveTextMarkUpCommand (line 1383) | class MoveTextMarkUpCommand : public Command {
    method MoveTextMarkUpCommand (line 1387) | MoveTextMarkUpCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1389) | void perform() {
  class MoveTextMarkForwardWordCommand (line 1394) | class MoveTextMarkForwardWordCommand : public Command {
    method MoveTextMarkForwardWordCommand (line 1398) | MoveTextMarkForwardWordCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1400) | void perform() {
  class MoveTextMarkBackwardCommand (line 1405) | class MoveTextMarkBackwardCommand : public Command {
    method MoveTextMarkBackwardCommand (line 1409) | MoveTextMarkBackwardCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1411) | void perform() {
  class MoveTextMarkBackwardWordCommand (line 1416) | class MoveTextMarkBackwardWordCommand : public Command {
    method MoveTextMarkBackwardWordCommand (line 1420) | MoveTextMarkBackwardWordCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1422) | void perform() {
  class StartReadingCommand (line 1427) | class StartReadingCommand : public Command {
    method StartReadingCommand (line 1431) | StartReadingCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1433) | void perform() {
  class StopReadingCommand (line 1438) | class StopReadingCommand : public Command {
    method StopReadingCommand (line 1442) | StopReadingCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1444) | void perform() {
  class ToggleReadingCommand (line 1449) | class ToggleReadingCommand : public Command {
    method ToggleReadingCommand (line 1453) | ToggleReadingCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1455) | void perform() {
  class SearchCommand (line 1460) | class SearchCommand : public TextCommand {
    method SearchCommand (line 1464) | SearchCommand(MainWidget* w) : TextCommand(cname, w) {
    method on_text_change (line 1467) | void on_text_change(const QString& new_text) override {
    method pre_perform (line 1473) | void pre_perform() {
    method on_cancel (line 1479) | virtual void on_cancel() override{
    method perform (line 1485) | void perform() {
    method pushes_state (line 1494) | bool pushes_state() {
    method get_text_suggestion (line 1498) | std::optional<std::wstring> get_text_suggestion(int index) {
    method text_requirement_name (line 1503) | std::string text_requirement_name() {
  class DownloadClipboardUrlCommand (line 1509) | class DownloadClipboardUrlCommand : public Command {
    method DownloadClipboardUrlCommand (line 1514) | DownloadClipboardUrlCommand(MainWidget* w) : Command(cname, w) {
    method perform (line 1517) | void perform() {
    method text_requirement_name (line 1523) | std::string text_requirement_name() {
  class DownloadPaperWithUrlCommand (line 1528) | class DownloadPaperWithUrlCommand : public TextCommand {
    method DownloadPaperWithUrlCommand (line 1533) | DownloadPaperWithUrlCommand(MainWidget* w) : TextCommand(cname, w) {
    method perform (line 1536) | void perform() {
    method text_requirement_name (line 1540) | std::string text_requirement_name() {
  class ControlMenuCommand (line 1546) | class ControlMenuCommand : public TextCommand {
    method ControlMenuCommand (line 1550) | ControlMenuCommand(MainWidget* w) : TextCommand(cname, w) {
    method perform (line 1554) | void perform() {
    method text_requirement_name (line 1559) | std::string text_requirement_name() {
    method requires_document (line 1563) | bool requires_document(){
  class ExecuteMacroCommand (line 1569) | class ExecuteMacroCommand : public TextCommand {
    method ExecuteMacroCommand (line 1573) | ExecuteMacroCommand(MainWidget* w) : TextCommand(cname, w) {
    method perform (line 1576) | void perform() {
    method text_requirement_name (line 1580) | std::string text_requirement_name() {
  class SetViewStateCommand (line 1586) | class SetViewStateCommand : public TextCommand {
    method SetViewStateCommand (line 1590) | SetViewStateCommand(MainWidget* w) : TextCommand(cname, w) {
    method perform (line 1593) | void perform() {
    method text_requirement_name (line 1611) | std::string text_requirement_name() {
  class TestCommand (line 1617) | class TestCommand : public Command {
    method TestCommand (line 1624) | TestCommand(MainWidget* w) : Command(cname, w) {}
    method set_text_requirement (line 1626) | void set_text_requirement(std::wstring value) {
    method next_requirement (line 1635) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method perform (line 1645) | void perform() {
  class GetConfigNoDialogCommand (line 1653) | class GetConfigNoDialogCommand : public Command {
    method GetConfigNoDialogCommand (line 1658) | GetConfigNoDialogCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 1660) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 1667) | void set_text_requirement(std::wstring value) {
    method perform (line 1671) | void perform() {
  class ShowTextPromptCommand (line 1696) | class ShowTextPromptCommand : public Command {
    method ShowTextPromptCommand (line 1703) | ShowTextPromptCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 1705) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 1715) | void set_text_requirement(std::wstring value) {
    method pre_perform (line 1735) | void pre_perform() {
    method perform (line 1743) | void perform() {
  class GetStateJsonCommand (line 1748) | class GetStateJsonCommand : public Command {
    method GetStateJsonCommand (line 1753) | GetStateJsonCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1755) | void perform() {
  class SetStateJsonCommand (line 1762) | class SetStateJsonCommand : public TextCommand {
    method SetStateJsonCommand (line 1767) | SetStateJsonCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 1769) | void perform() {
  class GetPaperNameCommand (line 1776) | class GetPaperNameCommand : public Command {
    method GetPaperNameCommand (line 1781) | GetPaperNameCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1783) | void perform() {
  class GetOverviewPaperName (line 1788) | class GetOverviewPaperName : public Command {
    method GetOverviewPaperName (line 1793) | GetOverviewPaperName(MainWidget* w) : Command(cname, w) {}
    method perform (line 1795) | void perform() {
  class ToggleRectHintsCommand (line 1801) | class ToggleRectHintsCommand : public Command {
    method ToggleRectHintsCommand (line 1806) | ToggleRectHintsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1808) | void perform() {
  class GetAnnotationsJsonCommand (line 1814) | class GetAnnotationsJsonCommand : public Command {
    method GetAnnotationsJsonCommand (line 1819) | GetAnnotationsJsonCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 1821) | void perform() {
  class ShowOptionsCommand (line 1829) | class ShowOptionsCommand : public Command {
    method ShowOptionsCommand (line 1838) | ShowOptionsCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 1840) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_generic_requirement (line 1850) | void set_generic_requirement(QVariant value) {
    method handle_generic_requirement (line 1855) | void handle_generic_requirement() {
    method set_text_requirement (line 1859) | void set_text_requirement(std::wstring value) {
    method perform (line 1866) | void perform() {
  class GetConfigCommand (line 1896) | class GetConfigCommand : public TextCommand {
    method GetConfigCommand (line 1900) | GetConfigCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 1902) | void perform() {
    method text_requirement_name (line 1913) | std::string text_requirement_name() {
  class DownloadPaperWithNameCommand (line 1919) | class DownloadPaperWithNameCommand : public TextCommand {
    method DownloadPaperWithNameCommand (line 1923) | DownloadPaperWithNameCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 1925) | void perform() {
    method text_requirement_name (line 1929) | std::string text_requirement_name() {
  class AddAnnotationToSelectedHighlightCommand (line 1935) | class AddAnnotationToSelectedHighlightCommand : public TextCommand {
    method AddAnnotationToSelectedHighlightCommand (line 1939) | AddAnnotationToSelectedHighlightCommand(MainWidget* w) : TextCommand(c...
    method perform (line 1941) | void perform() {
    method pre_perform (line 1945) | void pre_perform() {
    method text_requirement_name (line 1954) | std::string text_requirement_name() {
  class RenameCommand (line 1959) | class RenameCommand : public TextCommand {
    method RenameCommand (line 1963) | RenameCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 1965) | void perform() {
    method pre_perform (line 1970) | void pre_perform() {
    method text_requirement_name (line 1981) | std::string text_requirement_name() {
  class SetFreehandThickness (line 1986) | class SetFreehandThickness : public TextCommand {
    method SetFreehandThickness (line 1990) | SetFreehandThickness(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 1992) | void perform() {
    method text_requirement_name (line 2002) | std::string text_requirement_name() {
  class GotoPageWithLabel (line 2007) | class GotoPageWithLabel : public TextCommand {
    method GotoPageWithLabel (line 2011) | GotoPageWithLabel(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 2013) | void perform() {
    method pushes_state (line 2017) | bool pushes_state() {
    method text_requirement_name (line 2021) | std::string text_requirement_name() {
  class ChapterSearchCommand (line 2026) | class ChapterSearchCommand : public TextCommand {
    method ChapterSearchCommand (line 2030) | ChapterSearchCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 2032) | void perform() {
    method pre_perform (line 2036) | void pre_perform() {
    method pushes_state (line 2046) | bool pushes_state() {
    method text_requirement_name (line 2050) | std::string text_requirement_name() {
  class RegexSearchCommand (line 2055) | class RegexSearchCommand : public TextCommand {
    method RegexSearchCommand (line 2059) | RegexSearchCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 2061) | void perform() {
    method pushes_state (line 2065) | bool pushes_state() {
    method text_requirement_name (line 2069) | std::string text_requirement_name() {
  class AddBookmarkCommand (line 2074) | class AddBookmarkCommand : public TextCommand {
    method AddBookmarkCommand (line 2078) | AddBookmarkCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 2080) | void perform() {
    method text_requirement_name (line 2086) | std::string text_requirement_name() {
  class AddBookmarkMarkedCommand (line 2091) | class AddBookmarkMarkedCommand : public Command {
    method AddBookmarkMarkedCommand (line 2101) | AddBookmarkMarkedCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2103) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 2116) | void set_text_requirement(std::wstring value) {
    method set_point_requirement (line 2121) | void set_point_requirement(AbsoluteDocumentPos value) {
    method on_cancel (line 2134) | void on_cancel() override {
    method perform (line 2140) | void perform() {
  class CreateVisiblePortalCommand (line 2154) | class CreateVisiblePortalCommand : public Command {
    method CreateVisiblePortalCommand (line 2162) | CreateVisiblePortalCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2164) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_point_requirement (line 2173) | void set_point_requirement(AbsoluteDocumentPos value) {
    method perform (line 2177) | void perform() {
  class CopyDrawingsFromScratchpadCommand (line 2183) | class CopyDrawingsFromScratchpadCommand : public Command {
    method CopyDrawingsFromScratchpadCommand (line 2191) | CopyDrawingsFromScratchpadCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2193) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_rect_requirement (line 2202) | void set_rect_requirement(AbsoluteRect value) {
    method perform (line 2206) | void perform() {
  class CopyScreenshotToClipboard (line 2238) | class CopyScreenshotToClipboard : public Command {
    method CopyScreenshotToClipboard (line 2246) | CopyScreenshotToClipboard(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2248) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_rect_requirement (line 2257) | void set_rect_requirement(AbsoluteRect value) {
    method perform (line 2261) | void perform() {
  class CopyScreenshotToScratchpad (line 2282) | class CopyScreenshotToScratchpad : public Command {
    method CopyScreenshotToScratchpad (line 2290) | CopyScreenshotToScratchpad(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2292) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_rect_requirement (line 2301) | void set_rect_requirement(AbsoluteRect value) {
    method perform (line 2305) | void perform() {
  class AddBookmarkFreetextCommand (line 2325) | class AddBookmarkFreetextCommand : public Command {
    method AddBookmarkFreetextCommand (line 2335) | AddBookmarkFreetextCommand(MainWidget* w) : Command(cname, w) {}
    method on_text_change (line 2337) | void on_text_change(const QString& new_text) override {
    method next_requirement (line 2341) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 2354) | void set_text_requirement(std::wstring value) {
    method set_rect_requirement (line 2358) | void set_rect_requirement(AbsoluteRect value) {
    method on_cancel (line 2378) | void on_cancel() {
    method perform (line 2385) | void perform() {
  class ShowMarks (line 2402) | class ShowMarks : public GenericGotoLocationCommand {
    method ShowMarks (line 2406) | ShowMarks(MainWidget* w) : GenericGotoLocationCommand(cname, w) {}
    method handle_generic_requirement (line 2408) | void handle_generic_requirement() {
  class GotoBookmarkCommand (line 2414) | class GotoBookmarkCommand : public GenericGotoLocationCommand {
    method GotoBookmarkCommand (line 2418) | GotoBookmarkCommand(MainWidget* w) : GenericGotoLocationCommand(cname,...
    method handle_generic_requirement (line 2420) | void handle_generic_requirement() {
  class GotoPortalListCommand (line 2425) | class GotoPortalListCommand : public GenericGotoLocationCommand {
    method GotoPortalListCommand (line 2429) | GotoPortalListCommand(MainWidget* w) : GenericGotoLocationCommand(cnam...
    method handle_generic_requirement (line 2431) | void handle_generic_requirement() {
  class GotoBookmarkGlobalCommand (line 2436) | class GotoBookmarkGlobalCommand : public GenericPathAndLocationCommand {
    method GotoBookmarkGlobalCommand (line 2441) | GotoBookmarkGlobalCommand(MainWidget* w) : GenericPathAndLocationComma...
    method handle_generic_requirement (line 2443) | void handle_generic_requirement() {
    method requires_document (line 2446) | bool requires_document() { return false; }
  class IncreaseFreetextBookmarkFontSizeCommand (line 2449) | class IncreaseFreetextBookmarkFontSizeCommand : public Command {
    method IncreaseFreetextBookmarkFontSizeCommand (line 2453) | IncreaseFreetextBookmarkFontSizeCommand(MainWidget* w) : Command(cname...
    method perform (line 2455) | void perform() {
  class DecreaseFreetextBookmarkFontSizeCommand (line 2465) | class DecreaseFreetextBookmarkFontSizeCommand : public Command {
    method DecreaseFreetextBookmarkFontSizeCommand (line 2469) | DecreaseFreetextBookmarkFontSizeCommand(MainWidget* w) : Command(cname...
    method perform (line 2471) | void perform() {
  class GotoHighlightCommand (line 2481) | class GotoHighlightCommand : public GenericGotoLocationCommand {
    method GotoHighlightCommand (line 2485) | GotoHighlightCommand(MainWidget* w) : GenericGotoLocationCommand(cname...
    method handle_generic_requirement (line 2487) | void handle_generic_requirement() {
  class GotoHighlightGlobalCommand (line 2493) | class GotoHighlightGlobalCommand : public GenericPathAndLocationCommand {
    method GotoHighlightGlobalCommand (line 2498) | GotoHighlightGlobalCommand(MainWidget* w) : GenericPathAndLocationComm...
    method handle_generic_requirement (line 2500) | void handle_generic_requirement() {
    method requires_document (line 2503) | bool requires_document() { return false; }
  class GotoTableOfContentsCommand (line 2506) | class GotoTableOfContentsCommand : public GenericPathCommand {
    method GotoTableOfContentsCommand (line 2510) | GotoTableOfContentsCommand(MainWidget* w) : GenericPathCommand(cname, ...
    method next_requirement (line 2514) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_generic_requirement (line 2523) | void set_generic_requirement(QVariant value) {
    method handle_generic_requirement (line 2528) | void handle_generic_requirement() {
    method perform (line 2534) | void perform() {
    method pushes_state (line 2565) | bool pushes_state() { return true; }
  class PortalCommand (line 2568) | class PortalCommand : public Command {
    method PortalCommand (line 2572) | PortalCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 2574) | void perform() {
  class ToggleWindowConfigurationCommand (line 2579) | class ToggleWindowConfigurationCommand : public Command {
    method ToggleWindowConfigurationCommand (line 2583) | ToggleWindowConfigurationCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 2584) | void perform() {
    method requires_document (line 2588) | bool requires_document() { return false; }
  class NextStateCommand (line 2591) | class NextStateCommand : public Command {
    method NextStateCommand (line 2595) | NextStateCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 2597) | void perform() {
    method requires_document (line 2601) | bool requires_document() { return false; }
  class PrevStateCommand (line 2604) | class PrevStateCommand : public Command {
    method PrevStateCommand (line 2608) | PrevStateCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 2610) | void perform() {
    method requires_document (line 2614) | bool requires_document() { return false; }
  class AddHighlightCommand (line 2617) | class AddHighlightCommand : public SymbolCommand {
    method AddHighlightCommand (line 2621) | AddHighlightCommand(MainWidget* w) : SymbolCommand(cname, w) {}
    method perform (line 2623) | void perform() {
    method special_symbols (line 2627) | std::vector<char> special_symbols() {
  class CommandPaletteCommand (line 2633) | class CommandPaletteCommand : public Command {
    method CommandPaletteCommand (line 2637) | CommandPaletteCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 2639) | void perform() {
    method requires_document (line 2643) | bool requires_document() { return false; }
  class CommandCommand (line 2646) | class CommandCommand : public Command {
    method CommandCommand (line 2650) | CommandCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 2652) | void perform() {
    method requires_document (line 2675) | bool requires_document() { return false; }
  class ScreenshotCommand (line 2678) | class ScreenshotCommand : public Command {
    method ScreenshotCommand (line 2682) | ScreenshotCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2686) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 2695) | void set_text_requirement(std::wstring value) {
    method perform (line 2699) | void perform() {
    method requires_document (line 2702) | bool requires_document() { return false; }
  class FramebufferScreenshotCommand (line 2705) | class FramebufferScreenshotCommand : public Command {
    method FramebufferScreenshotCommand (line 2709) | FramebufferScreenshotCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2713) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 2722) | void set_text_requirement(std::wstring value) {
    method perform (line 2726) | void perform() {
    method requires_document (line 2730) | bool requires_document() { return false; }
  class ExportDefaultConfigFile (line 2733) | class ExportDefaultConfigFile : public Command {
    method ExportDefaultConfigFile (line 2737) | ExportDefaultConfigFile(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2741) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_file_requirement (line 2750) | void set_file_requirement(std::wstring value) {
    method perform (line 2754) | void perform() {
    method requires_document (line 2758) | bool requires_document() { return false; }
  class ExportCommandNamesCommand (line 2761) | class ExportCommandNamesCommand : public Command {
    method ExportCommandNamesCommand (line 2765) | ExportCommandNamesCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2769) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_file_requirement (line 2778) | void set_file_requirement(std::wstring value) {
    method perform (line 2782) | void perform() {
    method requires_document (line 2787) | bool requires_document() { return false; }
  class ExportConfigNamesCommand (line 2792) | class ExportConfigNamesCommand : public Command {
    method ExportConfigNamesCommand (line 2796) | ExportConfigNamesCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 2800) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_file_requirement (line 2809) | void set_file_requirement(std::wstring value) {
    method perform (line 2813) | void perform() {
    method requires_document (line 2818) | bool requires_document() { return false; }
  class GenericWaitCommand (line 2821) | class GenericWaitCommand : public Command {
    method GenericWaitCommand (line 2823) | GenericWaitCommand(std::string name, MainWidget* w) : Command(name, w) {}
    method next_requirement (line 2828) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_generic_requirement (line 2845) | void set_generic_requirement(QVariant value)
    method handle_generic_requirement (line 2852) | void handle_generic_requirement() override{
    method perform (line 2866) | void perform() {
  class WaitCommand (line 2871) | class WaitCommand : public GenericWaitCommand {
    method WaitCommand (line 2877) | WaitCommand(MainWidget* w) : GenericWaitCommand(cname, w) {
    method next_requirement (line 2881) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 2891) | void set_text_requirement(std::wstring text) {
    method is_ready (line 2895) | bool is_ready() override {
  class WaitForIndexingToFinishCommand (line 2900) | class WaitForIndexingToFinishCommand : public GenericWaitCommand {
    method WaitForIndexingToFinishCommand (line 2904) | WaitForIndexingToFinishCommand(MainWidget* w) : GenericWaitCommand(cna...
    method set_generic_requirement (line 2906) | void set_generic_requirement(QVariant value)
    method is_ready (line 2911) | bool is_ready() override {
  class WaitForRendersToFinishCommand (line 2916) | class WaitForRendersToFinishCommand : public GenericWaitCommand {
    method WaitForRendersToFinishCommand (line 2920) | WaitForRendersToFinishCommand(MainWidget* w) : GenericWaitCommand(cnam...
    method is_ready (line 2922) | bool is_ready() override {
  class WaitForSearchToFinishCommand (line 2927) | class WaitForSearchToFinishCommand : public GenericWaitCommand {
    method WaitForSearchToFinishCommand (line 2931) | WaitForSearchToFinishCommand(MainWidget* w) : GenericWaitCommand(cname...
    method is_ready (line 2933) | bool is_ready() override {
  class OpenDocumentCommand (line 2938) | class OpenDocumentCommand : public Command {
    method OpenDocumentCommand (line 2942) | OpenDocumentCommand(MainWidget* w) : Command(cname, w) {}
    method pushes_state (line 2946) | bool pushes_state() {
    method next_requirement (line 2950) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_file_requirement (line 2959) | void set_file_requirement(std::wstring value) {
    method perform (line 2963) | void perform() {
    method requires_document (line 2967) | bool requires_document() { return false; }
  class OpenDocumentInDirectoryCommand (line 2970) | class OpenDocumentInDirectoryCommand : public Command {
    method OpenDocumentInDirectoryCommand (line 2974) | OpenDocumentInDirectoryCommand(MainWidget* w) : Command(cname, w) {}
    method pushes_state (line 2979) | bool pushes_state() {
    method next_requirement (line 2983) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method get_file_path_requirement_root_dir (line 2995) | std::optional<QString> get_file_path_requirement_root_dir() {
    method set_file_requirement (line 3000) | void set_file_requirement(std::wstring value) {
    method set_text_requirement (line 3004) | void set_text_requirement(std::wstring value) {
    method perform (line 3008) | void perform() {
    method requires_document (line 3012) | bool requires_document() { return false; }
  class MoveSmoothCommand (line 3016) | class MoveSmoothCommand : public Command {
    method MoveSmoothCommand (line 3021) | MoveSmoothCommand(std::string name, MainWidget* w, float velocity_mult...
    method is_down (line 3025) | virtual bool is_down(){
    method is_up (line 3029) | virtual bool is_up(){
    method is_left (line 3033) | virtual bool is_left(){
    method is_right (line 3037) | virtual bool is_right(){
    method perform (line 3041) | void perform() {
    method perform_up (line 3066) | void perform_up() {
    method is_holdable (line 3076) | bool is_holdable() {
    method requires_document (line 3086) | bool requires_document() {
    method on_key_hold (line 3090) | void on_key_hold() {
  class MoveUpSmoothCommand (line 3102) | class MoveUpSmoothCommand : public MoveSmoothCommand {
    method MoveUpSmoothCommand (line 3106) | MoveUpSmoothCommand(MainWidget* w) : MoveSmoothCommand(cname, w) {}
    method is_up (line 3108) | bool is_up() override {
  class MoveDownSmoothCommand (line 3113) | class MoveDownSmoothCommand : public MoveSmoothCommand {
    method MoveDownSmoothCommand (line 3117) | MoveDownSmoothCommand(MainWidget* w) : MoveSmoothCommand(cname, w) {}
    method is_down (line 3119) | bool is_down() {
  class MoveLeftSmooth (line 3124) | class MoveLeftSmooth : public MoveSmoothCommand {
    method MoveLeftSmooth (line 3128) | MoveLeftSmooth(MainWidget* w) : MoveSmoothCommand(cname, w) {}
    method is_left (line 3130) | bool is_left() {
  class MoveRightSmooth (line 3135) | class MoveRightSmooth : public MoveSmoothCommand {
    method MoveRightSmooth (line 3139) | MoveRightSmooth(MainWidget* w) : MoveSmoothCommand(cname, w) {}
    method is_right (line 3141) | bool is_right() {
  class SetFixedVelocityCommand (line 3146) | class  SetFixedVelocityCommand : public TextCommand {
    method SetFixedVelocityCommand (line 3150) | SetFixedVelocityCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 3152) | void perform() {
  class ScreenUpSmoothCommand (line 3175) | class ScreenUpSmoothCommand : public MoveSmoothCommand {
    method ScreenUpSmoothCommand (line 3179) | ScreenUpSmoothCommand(MainWidget* w) : MoveSmoothCommand(cname, w, 3.0...
    method is_up (line 3181) | bool is_up() {
  class ScreenDownSmoothCommand (line 3186) | class ScreenDownSmoothCommand : public MoveSmoothCommand {
    method ScreenDownSmoothCommand (line 3190) | ScreenDownSmoothCommand(MainWidget* w) : MoveSmoothCommand(cname, w, 3...
    method is_down (line 3192) | bool is_down() {
  class ToggleTwoPageModeCommand (line 3197) | class ToggleTwoPageModeCommand : public Command {
    method ToggleTwoPageModeCommand (line 3201) | ToggleTwoPageModeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3203) | void perform() {
  class FitEpubToWindowCommand (line 3208) | class FitEpubToWindowCommand : public Command {
    method FitEpubToWindowCommand (line 3212) | FitEpubToWindowCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3214) | void perform() {
  class MoveDownCommand (line 3222) | class MoveDownCommand : public Command {
    method MoveDownCommand (line 3226) | MoveDownCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3228) | void perform() {
  class MoveUpCommand (line 3234) | class MoveUpCommand : public Command {
    method MoveUpCommand (line 3238) | MoveUpCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3240) | void perform() {
  class MoveLeftInOverviewCommand (line 3246) | class MoveLeftInOverviewCommand : public Command {
    method MoveLeftInOverviewCommand (line 3250) | MoveLeftInOverviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3251) | void perform() {
  class MoveRightInOverviewCommand (line 3256) | class MoveRightInOverviewCommand : public Command {
    method MoveRightInOverviewCommand (line 3260) | MoveRightInOverviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3261) | void perform() {
  class MoveLeftCommand (line 3266) | class MoveLeftCommand : public Command {
    method MoveLeftCommand (line 3270) | MoveLeftCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3272) | void perform() {
  class MoveRightCommand (line 3278) | class MoveRightCommand : public Command {
    method MoveRightCommand (line 3282) | MoveRightCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3284) | void perform() {
  class JavascriptCommand (line 3290) | class JavascriptCommand : public Command {
    method JavascriptCommand (line 3297) | JavascriptCommand(std::string command_name, std::wstring code_, std::o...
    method perform (line 3303) | void perform() {
    method get_name (line 3307) | std::string get_name() {
  class SaveScratchpadCommand (line 3313) | class SaveScratchpadCommand : public Command {
    method SaveScratchpadCommand (line 3317) | SaveScratchpadCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3318) | void perform() {
  class LoadScratchpadCommand (line 3323) | class LoadScratchpadCommand : public Command {
    method LoadScratchpadCommand (line 3327) | LoadScratchpadCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3328) | void perform() {
  class ClearScratchpadCommand (line 3333) | class ClearScratchpadCommand : public Command {
    method ClearScratchpadCommand (line 3337) | ClearScratchpadCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3338) | void perform() {
  class ZoomInCommand (line 3343) | class ZoomInCommand : public Command {
    method ZoomInCommand (line 3347) | ZoomInCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3348) | void perform() {
  class ZoomOutOverviewCommand (line 3354) | class ZoomOutOverviewCommand : public Command {
    method ZoomOutOverviewCommand (line 3358) | ZoomOutOverviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3359) | void perform() {
  class ZoomInOverviewCommand (line 3364) | class ZoomInOverviewCommand : public Command {
    method ZoomInOverviewCommand (line 3368) | ZoomInOverviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3369) | void perform() {
  class FitToPageWidthCommand (line 3374) | class FitToPageWidthCommand : public Command {
    method FitToPageWidthCommand (line 3378) | FitToPageWidthCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3380) | void perform() {
  class FitToPageSmartCommand (line 3385) | class FitToPageSmartCommand : public Command {
    method FitToPageSmartCommand (line 3389) | FitToPageSmartCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3390) | void perform() {
  class FitToPageWidthSmartCommand (line 3396) | class FitToPageWidthSmartCommand : public Command {
    method FitToPageWidthSmartCommand (line 3400) | FitToPageWidthSmartCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3401) | void perform() {
  class FitToPageHeightCommand (line 3406) | class FitToPageHeightCommand : public Command {
    method FitToPageHeightCommand (line 3410) | FitToPageHeightCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3411) | void perform() {
  class FitToPageHeightSmartCommand (line 3417) | class FitToPageHeightSmartCommand : public Command {
    method FitToPageHeightSmartCommand (line 3421) | FitToPageHeightSmartCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3422) | void perform() {
  class NextPageCommand (line 3427) | class NextPageCommand : public Command {
    method NextPageCommand (line 3431) | NextPageCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3432) | void perform() {
  class PreviousPageCommand (line 3437) | class PreviousPageCommand : public Command {
    method PreviousPageCommand (line 3441) | PreviousPageCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3442) | void perform() {
  class ZoomOutCommand (line 3447) | class ZoomOutCommand : public Command {
    method ZoomOutCommand (line 3451) | ZoomOutCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3453) | void perform() {
  class GotoDefinitionCommand (line 3459) | class GotoDefinitionCommand : public Command {
    method GotoDefinitionCommand (line 3463) | GotoDefinitionCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3464) | void perform() {
    method pushes_state (line 3470) | bool pushes_state() {
  class RepeatLastCommandCommnad (line 3476) | class RepeatLastCommandCommnad : public Command {
    method RepeatLastCommandCommnad (line 3480) | RepeatLastCommandCommnad(MainWidget* w) : Command(cname, w) {}
    method perform (line 3481) | void perform() {
  class OverviewDefinitionCommand (line 3486) | class OverviewDefinitionCommand : public Command {
    method OverviewDefinitionCommand (line 3490) | OverviewDefinitionCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3491) | void perform() {
  class PortalToDefinitionCommand (line 3496) | class PortalToDefinitionCommand : public Command {
    method PortalToDefinitionCommand (line 3500) | PortalToDefinitionCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3501) | void perform() {
  class MoveVisualMarkDownCommand (line 3507) | class MoveVisualMarkDownCommand : public Command {
    method MoveVisualMarkDownCommand (line 3511) | MoveVisualMarkDownCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3512) | void perform() {
  class MoveVisualMarkUpCommand (line 3518) | class MoveVisualMarkUpCommand : public Command {
    method MoveVisualMarkUpCommand (line 3522) | MoveVisualMarkUpCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3523) | void perform() {
  class MoveVisualMarkNextCommand (line 3529) | class MoveVisualMarkNextCommand : public Command {
    method MoveVisualMarkNextCommand (line 3533) | MoveVisualMarkNextCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3534) | void perform() {
  class MoveVisualMarkPrevCommand (line 3539) | class MoveVisualMarkPrevCommand : public Command {
    method MoveVisualMarkPrevCommand (line 3543) | MoveVisualMarkPrevCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3544) | void perform() {
  class GotoPageWithPageNumberCommand (line 3551) | class GotoPageWithPageNumberCommand : public TextCommand {
    method GotoPageWithPageNumberCommand (line 3555) | GotoPageWithPageNumberCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 3557) | void perform() {
    method text_requirement_name (line 3565) | std::string text_requirement_name() {
    method pushes_state (line 3569) | bool pushes_state() {
  class MoveSelectedBookmarkCommand (line 3574) | class MoveSelectedBookmarkCommand : public Command {
    method MoveSelectedBookmarkCommand (line 3581) | MoveSelectedBookmarkCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3583) | void perform() {
  class EditSelectedBookmarkCommand (line 3595) | class EditSelectedBookmarkCommand : public TextCommand {
    method EditSelectedBookmarkCommand (line 3603) | EditSelectedBookmarkCommand(MainWidget* w) : TextCommand(cname, w) {}
    method on_text_change (line 3605) | void on_text_change(const QString& new_text) override {
    method pre_perform (line 3609) | void pre_perform() {
    method on_cancel (line 3632) | void on_cancel() {
    method next_requirement (line 3639) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method perform (line 3644) | void perform() {
    method text_requirement_name (line 3655) | std::string text_requirement_name() {
  class EditSelectedHighlightCommand (line 3661) | class EditSelectedHighlightCommand : public TextCommand {
    method EditSelectedHighlightCommand (line 3667) | EditSelectedHighlightCommand(MainWidget* w) : TextCommand(cname, w) {}
    method pre_perform (line 3669) | void pre_perform() {
    method perform (line 3681) | void perform() {
    method text_requirement_name (line 3688) | std::string text_requirement_name() {
  class DeletePortalCommand (line 3694) | class DeletePortalCommand : public Command {
    method DeletePortalCommand (line 3698) | DeletePortalCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3699) | void perform() {
  class DeleteBookmarkCommand (line 3705) | class DeleteBookmarkCommand : public Command {
    method DeleteBookmarkCommand (line 3709) | DeleteBookmarkCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3710) | void perform() {
  class GenericVisibleSelectCommand (line 3716) | class GenericVisibleSelectCommand : public Command {
    method GenericVisibleSelectCommand (line 3724) | GenericVisibleSelectCommand(std::string name, MainWidget* w) : Command...
    method pre_perform (line 3730) | void pre_perform() override {
    method next_requirement (line 3744) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_symbol_requirement (line 3757) | virtual void set_symbol_requirement(char value) {
    method perform (line 3763) | void perform() {
  class GenericHighlightCommand (line 3784) | class GenericHighlightCommand : public GenericVisibleSelectCommand {
    method GenericHighlightCommand (line 3787) | GenericHighlightCommand(std::string name, MainWidget* w) : GenericVisi...
    method get_selected_item_index (line 3789) | int get_selected_item_index() override{
    method get_visible_item_indices (line 3793) | std::vector<int> get_visible_item_indices() override {
    method handle_indices_pre_perform (line 3797) | void handle_indices_pre_perform() override {
    method perform_with_selected_index (line 3804) | void perform_with_selected_index(std::optional<int> index) override {
  class GenericVisibleBookmarkCommand (line 3816) | class GenericVisibleBookmarkCommand : public GenericVisibleSelectCommand {
    method GenericVisibleBookmarkCommand (line 3819) | GenericVisibleBookmarkCommand(std::string name, MainWidget* w) : Gener...
    method get_selected_item_index (line 3821) | int get_selected_item_index() override{
    method get_visible_item_indices (line 3825) | std::vector<int> get_visible_item_indices() override {
    method handle_indices_pre_perform (line 3830) | void handle_indices_pre_perform() override {
    method perform_with_selected_index (line 3836) | void perform_with_selected_index(std::optional<int> index) override {
  class DeleteVisibleBookmarkCommand (line 3848) | class DeleteVisibleBookmarkCommand : public GenericVisibleBookmarkCommand {
    method DeleteVisibleBookmarkCommand (line 3853) | DeleteVisibleBookmarkCommand(MainWidget* w) : GenericVisibleBookmarkCo...
    method perform_with_bookmark_selected (line 3855) | void perform_with_bookmark_selected() override {
  class EditVisibleBookmarkCommand (line 3860) | class EditVisibleBookmarkCommand : public GenericVisibleBookmarkCommand {
    method EditVisibleBookmarkCommand (line 3865) | EditVisibleBookmarkCommand(MainWidget* w) : GenericVisibleBookmarkComm...
    method perform_with_bookmark_selected (line 3867) | void perform_with_bookmark_selected() override {
  class DeleteHighlightCommand (line 3872) | class DeleteHighlightCommand : public GenericHighlightCommand {
    method DeleteHighlightCommand (line 3877) | DeleteHighlightCommand(MainWidget* w) : GenericHighlightCommand(cname,...
    method perform_with_highlight_selected (line 3879) | void perform_with_highlight_selected() override {
  class ChangeHighlightTypeCommand (line 3885) | class ChangeHighlightTypeCommand : public GenericHighlightCommand {
    method ChangeHighlightTypeCommand (line 3890) | ChangeHighlightTypeCommand(MainWidget* w) : GenericHighlightCommand(cn...
    method perform_with_highlight_selected (line 3892) | void perform_with_highlight_selected() {
  class AddAnnotationToHighlightCommand (line 3898) | class AddAnnotationToHighlightCommand : public GenericHighlightCommand {
    method AddAnnotationToHighlightCommand (line 3903) | AddAnnotationToHighlightCommand(MainWidget* w) : GenericHighlightComma...
    method perform_with_highlight_selected (line 3905) | void perform_with_highlight_selected() {
  class GotoPortalCommand (line 3911) | class GotoPortalCommand : public Command {
    method GotoPortalCommand (line 3915) | GotoPortalCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3916) | void perform() {
    method pushes_state (line 3923) | bool pushes_state() {
  class EditPortalCommand (line 3928) | class EditPortalCommand : public Command {
    method EditPortalCommand (line 3932) | EditPortalCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 3933) | void perform() {
    method pushes_state (line 3941) | bool pushes_state() {
  class OpenPrevDocCommand (line 3946) | class OpenPrevDocCommand : public GenericPathAndLocationCommand {
    method OpenPrevDocCommand (line 3950) | OpenPrevDocCommand(MainWidget* w) : GenericPathAndLocationCommand(cnam...
    method handle_generic_requirement (line 3952) | void handle_generic_requirement() {
    method requires_document (line 3956) | bool requires_document() { return false; }
  class OpenAllDocsCommand (line 3959) | class OpenAllDocsCommand : public GenericPathAndLocationCommand {
    method OpenAllDocsCommand (line 3963) | OpenAllDocsCommand(MainWidget* w) : GenericPathAndLocationCommand(cnam...
    method handle_generic_requirement (line 3965) | void handle_generic_requirement() {
    method requires_document (line 3969) | bool requires_document() { return false; }
  class OpenDocumentEmbeddedCommand (line 3973) | class OpenDocumentEmbeddedCommand : public GenericPathCommand {
    method OpenDocumentEmbeddedCommand (line 3977) | OpenDocumentEmbeddedCommand(MainWidget* w) : GenericPathCommand(cname,...
    method handle_generic_requirement (line 3979) | void handle_generic_requirement() {
    method perform (line 3992) | void perform() {
    method pushes_state (line 3997) | bool pushes_state() {
    method requires_document (line 4001) | bool requires_document() { return false; }
  class OpenDocumentEmbeddedFromCurrentPathCommand (line 4004) | class OpenDocumentEmbeddedFromCurrentPathCommand : public GenericPathCom...
    method OpenDocumentEmbeddedFromCurrentPathCommand (line 4008) | OpenDocumentEmbeddedFromCurrentPathCommand(MainWidget* w) : GenericPat...
    method handle_generic_requirement (line 4010) | void handle_generic_requirement() {
    method perform (line 4023) | void perform() {
    method pushes_state (line 4028) | bool pushes_state() {
    method requires_document (line 4032) | bool requires_document() { return false; }
  class CopyCommand (line 4035) | class CopyCommand : public Command {
    method CopyCommand (line 4039) | CopyCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4040) | void perform() {
  class MacosLookupCommand (line 4047) | class MacosLookupCommand : public Command {
    method MacosLookupCommand (line 4052) | MacosLookupCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4054) | void perform() {
  class CopyAllTextCommand (line 4085) | class CopyAllTextCommand : public Command {
    method CopyAllTextCommand (line 4089) | CopyAllTextCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4090) | void perform() {
  class CopyCurrentChapterTextCommand (line 4097) | class CopyCurrentChapterTextCommand : public Command {
    method CopyCurrentChapterTextCommand (line 4101) | CopyCurrentChapterTextCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4102) | void perform() {
  class GotoBeginningCommand (line 4122) | class GotoBeginningCommand : public Command {
    method GotoBeginningCommand (line 4126) | GotoBeginningCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4128) | void perform() {
    method pushes_state (line 4142) | bool pushes_state() {
  class GotoEndCommand (line 4148) | class GotoEndCommand : public Command {
    method GotoEndCommand (line 4152) | GotoEndCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4154) | void perform() {
    method pushes_state (line 4163) | bool pushes_state() {
  class OverviewRulerPortalCommand (line 4168) | class OverviewRulerPortalCommand : public Command {
    method OverviewRulerPortalCommand (line 4172) | OverviewRulerPortalCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4174) | void perform() {
  class GotoRulerPortalCommand (line 4179) | class GotoRulerPortalCommand : public Command {
    method GotoRulerPortalCommand (line 4183) | GotoRulerPortalCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4188) | void perform() {
    method on_cancel (line 4199) | void on_cancel() override {
    method pre_perform (line 4203) | void pre_perform() override {
    method set_symbol_requirement (line 4209) | void set_symbol_requirement(char value) override {
    method next_requirement (line 4213) | virtual std::optional<Requirement> next_requirement(MainWidget* widget) {
    method pushes_state (line 4223) | bool pushes_state() override {
  class PrintNonDefaultConfigs (line 4229) | class PrintNonDefaultConfigs : public Command {
    method PrintNonDefaultConfigs (line 4233) | PrintNonDefaultConfigs(MainWidget* w) : Command(cname, w) {}
    method perform (line 4234) | void perform() {
    method requires_document (line 4237) | bool requires_document() { return false; }
  class PrintUndocumentedCommandsCommand (line 4240) | class PrintUndocumentedCommandsCommand : public Command {
    method PrintUndocumentedCommandsCommand (line 4244) | PrintUndocumentedCommandsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4245) | void perform() {
    method requires_document (line 4249) | bool requires_document() { return false; }
  class PrintUndocumentedConfigsCommand (line 4252) | class PrintUndocumentedConfigsCommand : public Command {
    method PrintUndocumentedConfigsCommand (line 4256) | PrintUndocumentedConfigsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4257) | void perform() {
    method requires_document (line 4261) | bool requires_document() { return false; }
  class ToggleFullscreenCommand (line 4264) | class ToggleFullscreenCommand : public Command {
    method ToggleFullscreenCommand (line 4268) | ToggleFullscreenCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4269) | void perform() {
    method requires_document (line 4273) | bool requires_document() { return false; }
  class MaximizeCommand (line 4276) | class MaximizeCommand : public Command {
    method MaximizeCommand (line 4280) | MaximizeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4281) | void perform() {
    method requires_document (line 4285) | bool requires_document() { return false; }
  class ToggleOneWindowCommand (line 4288) | class ToggleOneWindowCommand : public Command {
    method ToggleOneWindowCommand (line 4292) | ToggleOneWindowCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4293) | void perform() {
    method requires_document (line 4297) | bool requires_document() { return false; }
  class ToggleHighlightCommand (line 4300) | class ToggleHighlightCommand : public Command {
    method ToggleHighlightCommand (line 4304) | ToggleHighlightCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4305) | void perform() {
    method requires_document (line 4309) | bool requires_document() { return false; }
  class ToggleSynctexCommand (line 4312) | class ToggleSynctexCommand : public Command {
    method ToggleSynctexCommand (line 4316) | ToggleSynctexCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4317) | void perform() {
    method requires_document (line 4321) | bool requires_document() { return false; }
  class TurnOnSynctexCommand (line 4324) | class TurnOnSynctexCommand : public Command {
    method TurnOnSynctexCommand (line 4328) | TurnOnSynctexCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4329) | void perform() {
    method requires_document (line 4333) | bool requires_document() { return false; }
  class ToggleShowLastCommand (line 4336) | class ToggleShowLastCommand : public Command {
    method ToggleShowLastCommand (line 4340) | ToggleShowLastCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4341) | void perform() {
  class ForwardSearchCommand (line 4347) | class ForwardSearchCommand : public Command {
    method ForwardSearchCommand (line 4351) | ForwardSearchCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 4357) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_file_requirement (line 4368) | void set_file_requirement(std::wstring value) {
    method set_text_requirement (line 4372) | void set_text_requirement(std::wstring text) {
    method perform (line 4384) | void perform() {
  class ExternalSearchCommand (line 4390) | class ExternalSearchCommand : public SymbolCommand {
    method ExternalSearchCommand (line 4394) | ExternalSearchCommand(MainWidget* w) : SymbolCommand(cname, w) {}
    method perform (line 4395) | void perform() {
  class OpenSelectedUrlCommand (line 4415) | class OpenSelectedUrlCommand : public Command {
    method OpenSelectedUrlCommand (line 4419) | OpenSelectedUrlCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4420) | void perform() {
  class ScreenDownCommand (line 4425) | class ScreenDownCommand : public Command {
    method ScreenDownCommand (line 4429) | ScreenDownCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4431) | void perform() {
  class ScreenUpCommand (line 4438) | class ScreenUpCommand : public Command {
    method ScreenUpCommand (line 4442) | ScreenUpCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4444) | void perform() {
  class NextChapterCommand (line 4451) | class NextChapterCommand : public Command {
    method NextChapterCommand (line 4455) | NextChapterCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4457) | void perform() {
    method pushes_state (line 4462) | bool pushes_state() {
  class PrevChapterCommand (line 4468) | class PrevChapterCommand : public Command {
    method PrevChapterCommand (line 4472) | PrevChapterCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4474) | void perform() {
    method pushes_state (line 4479) | bool pushes_state() {
  class ShowContextMenuCommand (line 4485) | class ShowContextMenuCommand : public Command {
    method ShowContextMenuCommand (line 4489) | ShowContextMenuCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4491) | void perform() {
    method requires_document (line 4495) | bool requires_document() { return false; }
  function parse_menu_string (line 4499) | std::unique_ptr<MenuItems> parse_menu_string(MainWidget* widget, QString...
  class ShowCustomContextMenuCommand (line 4526) | class ShowCustomContextMenuCommand : public Command {
    method ShowCustomContextMenuCommand (line 4530) | ShowCustomContextMenuCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 4535) | virtual std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_text_requirement (line 4545) | virtual void set_text_requirement(std::wstring value) {
    method perform (line 4557) | void perform() {
    method requires_document (line 4563) | bool requires_document() { return false; }
  class ToggleDarkModeCommand (line 4566) | class ToggleDarkModeCommand : public Command {
    method ToggleDarkModeCommand (line 4571) | ToggleDarkModeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4573) | void perform() {
    method requires_document (line 4578) | bool requires_document() { return false; }
  class ToggleCustomColorMode (line 4581) | class ToggleCustomColorMode : public Command {
    method ToggleCustomColorMode (line 4585) | ToggleCustomColorMode(MainWidget* w) : Command(cname, w) {}
    method perform (line 4587) | void perform() {
    method requires_document (line 4591) | bool requires_document() { return false; }
  class TogglePresentationModeCommand (line 4594) | class TogglePresentationModeCommand : public Command {
    method TogglePresentationModeCommand (line 4598) | TogglePresentationModeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4600) | void perform() {
    method requires_document (line 4604) | bool requires_document() { return false; }
  class TurnOnPresentationModeCommand (line 4607) | class TurnOnPresentationModeCommand : public Command {
    method TurnOnPresentationModeCommand (line 4611) | TurnOnPresentationModeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4613) | void perform() {
    method requires_document (line 4617) | bool requires_document() { return false; }
  class ToggleMouseDragMode (line 4620) | class ToggleMouseDragMode : public Command {
    method ToggleMouseDragMode (line 4624) | ToggleMouseDragMode(MainWidget* w) : Command(cname, w) {}
    method perform (line 4626) | void perform() {
    method requires_document (line 4630) | bool requires_document() { return false; }
  class ToggleFreehandDrawingMode (line 4633) | class ToggleFreehandDrawingMode : public Command {
    method ToggleFreehandDrawingMode (line 4637) | ToggleFreehandDrawingMode(MainWidget* w) : Command(cname, w) {}
    method perform (line 4639) | void perform() {
    method requires_document (line 4643) | bool requires_document() { return false; }
  class TogglePenDrawingMode (line 4646) | class TogglePenDrawingMode : public Command {
    method TogglePenDrawingMode (line 4650) | TogglePenDrawingMode(MainWidget* w) : Command(cname, w) {}
    method perform (line 4652) | void perform() {
    method requires_document (line 4656) | bool requires_document() { return false; }
  class ToggleScratchpadMode (line 4659) | class ToggleScratchpadMode : public Command {
    method ToggleScratchpadMode (line 4663) | ToggleScratchpadMode(MainWidget* w) : Command(cname, w) {}
    method perform (line 4665) | void perform() {
    method requires_document (line 4669) | bool requires_document() { return false; }
  class CloseWindowCommand (line 4672) | class CloseWindowCommand : public Command {
    method CloseWindowCommand (line 4676) | CloseWindowCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4678) | void perform() {
    method requires_document (line 4682) | bool requires_document() { return false; }
  class NewWindowCommand (line 4685) | class NewWindowCommand : public Command {
    method NewWindowCommand (line 4689) | NewWindowCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4691) | void perform() {
    method requires_document (line 4696) | bool requires_document() { return false; }
  class QuitCommand (line 4699) | class QuitCommand : public Command {
    method QuitCommand (line 4703) | QuitCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4705) | void perform() {
    method requires_document (line 4716) | bool requires_document() { return false; }
  class EscapeCommand (line 4719) | class EscapeCommand : public Command {
    method EscapeCommand (line 4723) | EscapeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4725) | void perform() {
    method requires_document (line 4729) | bool requires_document() { return false; }
  class TogglePDFAnnotationsCommand (line 4732) | class TogglePDFAnnotationsCommand : public Command {
    method TogglePDFAnnotationsCommand (line 4736) | TogglePDFAnnotationsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 4738) | void perform() {
    method requires_document (line 4742) | bool requires_document() { return true; }
  class OpenLinkCommand (line 4745) | class OpenLinkCommand : public Command {
    method OpenLinkCommand (line 4749) | OpenLinkCommand(MainWidget* w) : Command(cname, w) {}
    method text_requirement_name (line 4755) | virtual std::string text_requirement_name() {
    method is_done (line 4759) | bool is_done() {
    method next_requirement (line 4765) | virtual std::optional<Requirement> next_requirement(MainWidget* widget) {
    method perform (line 4784) | virtual void perform() {
    method pre_perform (line 4788) | void pre_perform() {
    method set_text_requirement (line 4797) | virtual void set_text_requirement(std::wstring value) {
    method set_symbol_requirement (line 4801) | virtual void set_symbol_requirement(char value) {
  class OverviewLinkCommand (line 4936) | class OverviewLinkCommand : public OpenLinkCommand {
    method OverviewLinkCommand (line 4940) | OverviewLinkCommand(MainWidget* w) : OpenLinkCommand(w) {}
    method perform (line 4942) | void perform() {
    method get_name (line 4946) | std::string get_name() {
  class PortalToLinkCommand (line 4951) | class PortalToLinkCommand : public OpenLinkCommand {
    method PortalToLinkCommand (line 4955) | PortalToLinkCommand(MainWidget* w) : OpenLinkCommand(w) {}
    method perform (line 4957) | void perform() {
    method get_name (line 4961) | std::string get_name() {
  class CopyLinkCommand (line 4966) | class CopyLinkCommand : public TextCommand {
    method CopyLinkCommand (line 4970) | CopyLinkCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 4972) | void perform() {
    method pre_perform (line 4976) | void pre_perform() {
    method text_requirement_name (line 4983) | std::string text_requirement_name() {
  class KeyboardSelectCommand (line 4988) | class KeyboardSelectCommand : public TextCommand {
    method KeyboardSelectCommand (line 4992) | KeyboardSelectCommand(MainWidget* w) : TextCommand(cname, w) {}
    method on_text_change (line 4994) | void on_text_change(const QString& new_text) override {
    method on_cancel (line 5003) | void on_cancel() override {
    method perform (line 5008) | void perform() {
    method pre_perform (line 5013) | void pre_perform() {
    method text_requirement_name (line 5018) | std::string text_requirement_name() {
  class KeyboardOverviewCommand (line 5023) | class KeyboardOverviewCommand : public TextCommand {
    method KeyboardOverviewCommand (line 5027) | KeyboardOverviewCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5029) | void perform() {
    method pre_perform (line 5038) | void pre_perform() {
    method text_requirement_name (line 5043) | std::string text_requirement_name() {
  class KeyboardSmartjumpCommand (line 5048) | class KeyboardSmartjumpCommand : public TextCommand {
    method KeyboardSmartjumpCommand (line 5052) | KeyboardSmartjumpCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5054) | void perform() {
    method pre_perform (line 5063) | void pre_perform() {
    method pushes_state (line 5067) | bool pushes_state() {
    method text_requirement_name (line 5071) | std::string text_requirement_name() {
  class KeysCommand (line 5076) | class KeysCommand : public Command {
    method KeysCommand (line 5080) | KeysCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5082) | void perform() {
    method requires_document (line 5086) | bool requires_document() { return false; }
  class KeysUserCommand (line 5089) | class KeysUserCommand : public Command {
    method KeysUserCommand (line 5093) | KeysUserCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5095) | void perform() {
    method requires_document (line 5102) | bool requires_document() { return false; }
  class KeysUserAllCommand (line 5105) | class KeysUserAllCommand : public Command {
    method KeysUserAllCommand (line 5109) | KeysUserAllCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5111) | void perform() {
    method requires_document (line 5115) | bool requires_document() { return false; }
  class PrefsCommand (line 5118) | class PrefsCommand : public Command {
    method PrefsCommand (line 5122) | PrefsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5124) | void perform() {
    method requires_document (line 5128) | bool requires_document() { return false; }
  class PrefsUserCommand (line 5131) | class PrefsUserCommand : public Command {
    method PrefsUserCommand (line 5135) | PrefsUserCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5137) | void perform() {
    method requires_document (line 5144) | bool requires_document() { return false; }
  class PrefsUserAllCommand (line 5147) | class PrefsUserAllCommand : public Command {
    method PrefsUserAllCommand (line 5151) | PrefsUserAllCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5153) | void perform() {
    method requires_document (line 5157) | bool requires_document() { return false; }
  class FitToPageWidthRatioCommand (line 5160) | class FitToPageWidthRatioCommand : public Command {
    method FitToPageWidthRatioCommand (line 5164) | FitToPageWidthRatioCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5166) | void perform() {
  class SmartJumpUnderCursorCommand (line 5173) | class SmartJumpUnderCursorCommand : public Command {
    method SmartJumpUnderCursorCommand (line 5177) | SmartJumpUnderCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5179) | void perform() {
  class DownloadPaperUnderCursorCommand (line 5185) | class DownloadPaperUnderCursorCommand : public Command {
    method DownloadPaperUnderCursorCommand (line 5189) | DownloadPaperUnderCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5191) | void perform() {
  class OverviewUnderCursorCommand (line 5198) | class OverviewUnderCursorCommand : public Command {
    method OverviewUnderCursorCommand (line 5202) | OverviewUnderCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5204) | void perform() {
  class SynctexUnderCursorCommand (line 5211) | class SynctexUnderCursorCommand : public Command {
    method SynctexUnderCursorCommand (line 5215) | SynctexUnderCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5217) | void perform() {
  class SynctexUnderRulerCommand (line 5224) | class SynctexUnderRulerCommand : public Command {
    method SynctexUnderRulerCommand (line 5228) | SynctexUnderRulerCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5230) | void perform() {
  class VisualMarkUnderCursorCommand (line 5236) | class VisualMarkUnderCursorCommand : public Command {
    method VisualMarkUnderCursorCommand (line 5240) | VisualMarkUnderCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5242) | void perform() {
  class CloseOverviewCommand (line 5249) | class CloseOverviewCommand : public Command {
    method CloseOverviewCommand (line 5253) | CloseOverviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5255) | void perform() {
  class CloseVisualMarkCommand (line 5261) | class CloseVisualMarkCommand : public Command {
    method CloseVisualMarkCommand (line 5265) | CloseVisualMarkCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5267) | void perform() {
  class ZoomInCursorCommand (line 5273) | class ZoomInCursorCommand : public Command {
    method ZoomInCursorCommand (line 5277) | ZoomInCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5279) | void perform() {
  class ZoomOutCursorCommand (line 5287) | class ZoomOutCursorCommand : public Command {
    method ZoomOutCursorCommand (line 5291) | ZoomOutCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5293) | void perform() {
  class GotoLeftCommand (line 5301) | class GotoLeftCommand : public Command {
    method GotoLeftCommand (line 5305) | GotoLeftCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5307) | void perform() {
  class GotoLeftSmartCommand (line 5313) | class GotoLeftSmartCommand : public Command {
    method GotoLeftSmartCommand (line 5317) | GotoLeftSmartCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5319) | void perform() {
  class GotoRightCommand (line 5325) | class GotoRightCommand : public Command {
    method GotoRightCommand (line 5329) | GotoRightCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5331) | void perform() {
  class GotoRightSmartCommand (line 5337) | class GotoRightSmartCommand : public Command {
    method GotoRightSmartCommand (line 5341) | GotoRightSmartCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5343) | void perform() {
  class RotateClockwiseCommand (line 5349) | class RotateClockwiseCommand : public Command {
    method RotateClockwiseCommand (line 5353) | RotateClockwiseCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5355) | void perform() {
  class RotateCounterClockwiseCommand (line 5362) | class RotateCounterClockwiseCommand : public Command {
    method RotateCounterClockwiseCommand (line 5366) | RotateCounterClockwiseCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5368) | void perform() {
  class GotoNextHighlightCommand (line 5375) | class GotoNextHighlightCommand : public Command {
    method GotoNextHighlightCommand (line 5379) | GotoNextHighlightCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5381) | void perform() {
  class GotoPrevHighlightCommand (line 5389) | class GotoPrevHighlightCommand : public Command {
    method GotoPrevHighlightCommand (line 5393) | GotoPrevHighlightCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5395) | void perform() {
  class GotoNextHighlightOfTypeCommand (line 5404) | class GotoNextHighlightOfTypeCommand : public Command {
    method GotoNextHighlightOfTypeCommand (line 5408) | GotoNextHighlightOfTypeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5410) | void perform() {
  class GotoPrevHighlightOfTypeCommand (line 5419) | class GotoPrevHighlightOfTypeCommand : public Command {
    method GotoPrevHighlightOfTypeCommand (line 5423) | GotoPrevHighlightOfTypeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5425) | void perform() {
  class SetSelectHighlightTypeCommand (line 5433) | class SetSelectHighlightTypeCommand : public SymbolCommand {
    method SetSelectHighlightTypeCommand (line 5437) | SetSelectHighlightTypeCommand(MainWidget* w) : SymbolCommand(cname, w) {}
    method perform (line 5438) | void perform() {
    method requires_document (line 5442) | bool requires_document() { return false; }
  class SetFreehandType (line 5446) | class SetFreehandType : public SymbolCommand {
    method SetFreehandType (line 5450) | SetFreehandType(MainWidget* w) : SymbolCommand(cname, w) {}
    method perform (line 5451) | void perform() {
    method requires_document (line 5455) | bool requires_document() { return false; }
  class SetFreehandAlphaCommand (line 5458) | class SetFreehandAlphaCommand : public TextCommand {
    method SetFreehandAlphaCommand (line 5462) | SetFreehandAlphaCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5463) | void perform() {
    method requires_document (line 5475) | bool requires_document() { return false; }
  class AddHighlightWithCurrentTypeCommand (line 5478) | class AddHighlightWithCurrentTypeCommand : public Command {
    method AddHighlightWithCurrentTypeCommand (line 5482) | AddHighlightWithCurrentTypeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5483) | void perform() {
  class UndoDrawingCommand (line 5492) | class UndoDrawingCommand : public Command {
    method UndoDrawingCommand (line 5496) | UndoDrawingCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5497) | void perform() {
    method requires_document (line 5501) | bool requires_document() { return true; }
  class EnterPasswordCommand (line 5505) | class EnterPasswordCommand : public TextCommand {
    method EnterPasswordCommand (line 5509) | EnterPasswordCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5510) | void perform() {
    method text_requirement_name (line 5515) | std::string text_requirement_name() {
  class ToggleFastreadCommand (line 5520) | class ToggleFastreadCommand : public Command {
    method ToggleFastreadCommand (line 5524) | ToggleFastreadCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5525) | void perform() {
  class GotoTopOfPageCommand (line 5530) | class GotoTopOfPageCommand : public Command {
    method GotoTopOfPageCommand (line 5534) | GotoTopOfPageCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5535) | void perform() {
  class GotoBottomOfPageCommand (line 5541) | class GotoBottomOfPageCommand : public Command {
    method GotoBottomOfPageCommand (line 5545) | GotoBottomOfPageCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5546) | void perform() {
  class ReloadCommand (line 5552) | class ReloadCommand : public Command {
    method ReloadCommand (line 5556) | ReloadCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5557) | void perform() {
  class ReloadNoFlickerCommand (line 5563) | class ReloadNoFlickerCommand : public Command {
    method ReloadNoFlickerCommand (line 5567) | ReloadNoFlickerCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5568) | void perform() {
  class ReloadConfigCommand (line 5574) | class ReloadConfigCommand : public Command {
    method ReloadConfigCommand (line 5578) | ReloadConfigCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5579) | void perform() {
    method requires_document (line 5583) | bool requires_document() { return false; }
  class TurnOnAllDrawings (line 5586) | class TurnOnAllDrawings : public Command {
    method TurnOnAllDrawings (line 5590) | TurnOnAllDrawings(MainWidget* w) : Command(cname, w) {}
    method perform (line 5591) | void perform() {
    method requires_document (line 5595) | bool requires_document() { return false; }
  class TurnOffAllDrawings (line 5598) | class TurnOffAllDrawings : public Command {
    method TurnOffAllDrawings (line 5602) | TurnOffAllDrawings(MainWidget* w) : Command(cname, w) {}
    method perform (line 5603) | void perform() {
    method requires_document (line 5607) | bool requires_document() { return false; }
  class SetStatusStringCommand (line 5610) | class SetStatusStringCommand : public TextCommand {
    method SetStatusStringCommand (line 5614) | SetStatusStringCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5616) | void perform() {
    method text_requirement_name (line 5620) | std::string text_requirement_name() {
    method requires_document (line 5625) | bool requires_document() { return false; }
  class ClearStatusStringCommand (line 5628) | class ClearStatusStringCommand : public Command {
    method ClearStatusStringCommand (line 5632) | ClearStatusStringCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5633) | void perform() {
    method requires_document (line 5637) | bool requires_document() { return false; }
  class ToggleTittlebarCommand (line 5640) | class ToggleTittlebarCommand : public Command {
    method ToggleTittlebarCommand (line 5644) | ToggleTittlebarCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5645) | void perform() {
    method requires_document (line 5649) | bool requires_document() { return false; }
  class NextPreviewCommand (line 5652) | class NextPreviewCommand : public Command {
    method NextPreviewCommand (line 5656) | NextPreviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5657) | void perform() {
  class PreviousPreviewCommand (line 5667) | class PreviousPreviewCommand : public Command {
    method PreviousPreviewCommand (line 5671) | PreviousPreviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5672) | void perform() {
  class GotoOverviewCommand (line 5681) | class GotoOverviewCommand : public Command {
    method GotoOverviewCommand (line 5685) | GotoOverviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5686) | void perform() {
  class PortalToOverviewCommand (line 5692) | class PortalToOverviewCommand : public Command {
    method PortalToOverviewCommand (line 5696) | PortalToOverviewCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5697) | void perform() {
  class GotoSelectedTextCommand (line 5703) | class GotoSelectedTextCommand : public Command {
    method GotoSelectedTextCommand (line 5707) | GotoSelectedTextCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5709) | void perform() {
  class SetWindowRectCommand (line 5715) | class SetWindowRectCommand : public TextCommand {
    method SetWindowRectCommand (line 5719) | SetWindowRectCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5721) | void perform() {
  class FocusTextCommand (line 5752) | class FocusTextCommand : public TextCommand {
    method FocusTextCommand (line 5756) | FocusTextCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5758) | void perform() {
    method text_requirement_name (line 5763) | std::string text_requirement_name() {
  class DownloadOverviewPaperCommand (line 5768) | class DownloadOverviewPaperCommand : public TextCommand {
    method DownloadOverviewPaperCommand (line 5775) | DownloadOverviewPaperCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 5777) | void perform() {
    method pre_perform (line 5790) | void pre_perform() {
    method text_requirement_name (line 5814) | std::string text_requirement_name() {
  class GotoWindowCommand (line 5819) | class GotoWindowCommand : public Command {
    method GotoWindowCommand (line 5823) | GotoWindowCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5825) | void perform() {
    method requires_document (line 5829) | bool requires_document() { return false; }
  class ToggleSmoothScrollModeCommand (line 5832) | class ToggleSmoothScrollModeCommand : public Command {
    method ToggleSmoothScrollModeCommand (line 5836) | ToggleSmoothScrollModeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5838) | void perform() {
    method requires_document (line 5842) | bool requires_document() { return false; }
  class ToggleScrollbarCommand (line 5845) | class ToggleScrollbarCommand : public Command {
    method ToggleScrollbarCommand (line 5849) | ToggleScrollbarCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5851) | void perform() {
    method requires_document (line 5855) | bool requires_document() { return false; }
  class OverviewToPortalCommand (line 5859) | class OverviewToPortalCommand : public Command {
    method OverviewToPortalCommand (line 5863) | OverviewToPortalCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5865) | void perform() {
  class ScanNewFilesFromScanDirCommand (line 5871) | class ScanNewFilesFromScanDirCommand : public Command {
    method ScanNewFilesFromScanDirCommand (line 5875) | ScanNewFilesFromScanDirCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5877) | void perform() {
  class DebugCommand (line 5883) | class DebugCommand : public Command {
    method DebugCommand (line 5889) | DebugCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5891) | void perform() {
  class SelectNextCharCommand (line 5897) | class SelectNextCharCommand : public Command {
    method SelectNextCharCommand (line 5902) | SelectNextCharCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5904) | void perform() {
  class UnselectLastCharCommand (line 5910) | class UnselectLastCharCommand : public Command {
    method UnselectLastCharCommand (line 5915) | UnselectLastCharCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5917) | void perform() {
  class CollapseMenuCommand (line 5923) | class CollapseMenuCommand : public Command {
    method CollapseMenuCommand (line 5928) | CollapseMenuCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5930) | void perform() {
  class ShowTouchMainMenu (line 5936) | class ShowTouchMainMenu : public Command {
    method ShowTouchMainMenu (line 5940) | ShowTouchMainMenu(MainWidget* w) : Command(cname, w) {}
    method perform (line 5942) | void perform() {
  class ShowTouchDrawingMenu (line 5948) | class ShowTouchDrawingMenu : public Command {
    method ShowTouchDrawingMenu (line 5952) | ShowTouchDrawingMenu(MainWidget* w) : Command(cname, w) {}
    method perform (line 5954) | void perform() {
  class ShowTouchSettingsMenu (line 5960) | class ShowTouchSettingsMenu : public Command {
    method ShowTouchSettingsMenu (line 5964) | ShowTouchSettingsMenu(MainWidget* w) : Command(cname, w) {}
    method perform (line 5966) | void perform() {
  class ExportPythonApiCommand (line 5973) | class ExportPythonApiCommand : public Command {
    method ExportPythonApiCommand (line 5977) | ExportPythonApiCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5979) | void perform() {
  class SelectCurrentSearchMatchCommand (line 5985) | class SelectCurrentSearchMatchCommand : public Command {
    method SelectCurrentSearchMatchCommand (line 5989) | SelectCurrentSearchMatchCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 5991) | void perform() {
  class SelectRulerTextCommand (line 5997) | class SelectRulerTextCommand : public Command {
    method SelectRulerTextCommand (line 6001) | SelectRulerTextCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6003) | void perform() {
  class SelectRectCommand (line 6009) | class SelectRectCommand : public Command {
    method SelectRectCommand (line 6013) | SelectRectCommand (MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 6016) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_rect_requirement (line 6025) | void set_rect_requirement(AbsoluteRect rect) {
    method perform (line 6029) | void perform() {
  class ToggleTypingModeCommand (line 6044) | class ToggleTypingModeCommand : public Command {
    method ToggleTypingModeCommand (line 6048) | ToggleTypingModeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6050) | void perform() {
  class DonateCommand (line 6056) | class DonateCommand : public Command {
    method DonateCommand (line 6060) | DonateCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6062) | void perform() {
    method requires_document (line 6066) | bool requires_document() { return false; }
  class OverviewNextItemCommand (line 6069) | class OverviewNextItemCommand : public Command {
    method OverviewNextItemCommand (line 6073) | OverviewNextItemCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6075) | void perform() {
  class OverviewPrevItemCommand (line 6082) | class OverviewPrevItemCommand : public Command {
    method OverviewPrevItemCommand (line 6086) | OverviewPrevItemCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6088) | void perform() {
  class DeleteHighlightUnderCursorCommand (line 6095) | class DeleteHighlightUnderCursorCommand : public Command {
    method DeleteHighlightUnderCursorCommand (line 6099) | DeleteHighlightUnderCursorCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6101) | void perform() {
  class ImportCommand (line 6108) | class ImportCommand : public Command {
    method ImportCommand (line 6112) | ImportCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6114) | void perform() {
    method requires_document (line 6119) | bool requires_document() { return false; }
  class ExportCommand (line 6122) | class ExportCommand : public Command {
    method ExportCommand (line 6127) | ExportCommand(MainWidget* w) : Command(cname, w) {}
    method next_requirement (line 6129) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_file_requirement (line 6134) | void set_file_requirement(std::wstring value) {
    method perform (line 6138) | void perform() {
    method requires_document (line 6142) | bool requires_document() { return false; }
  class WriteAnnotationsFileCommand (line 6145) | class WriteAnnotationsFileCommand : public Command {
    method WriteAnnotationsFileCommand (line 6149) | WriteAnnotationsFileCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6151) | void perform() {
  class LoadAnnotationsFileCommand (line 6157) | class LoadAnnotationsFileCommand : public Command {
    method LoadAnnotationsFileCommand (line 6161) | LoadAnnotationsFileCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6163) | void perform() {
  class LoadAnnotationsFileSyncDeletedCommand (line 6169) | class LoadAnnotationsFileSyncDeletedCommand : public Command {
    method LoadAnnotationsFileSyncDeletedCommand (line 6173) | LoadAnnotationsFileSyncDeletedCommand(MainWidget* w) : Command(cname, ...
    method perform (line 6175) | void perform() {
  class EnterVisualMarkModeCommand (line 6181) | class EnterVisualMarkModeCommand : public Command {
    method EnterVisualMarkModeCommand (line 6185) | EnterVisualMarkModeCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6187) | void perform() {
  class SetPageOffsetCommand (line 6193) | class SetPageOffsetCommand : public TextCommand {
    method SetPageOffsetCommand (line 6197) | SetPageOffsetCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 6199) | void perform() {
  class ToggleVisualScrollCommand (line 6206) | class ToggleVisualScrollCommand : public Command {
    method ToggleVisualScrollCommand (line 6210) | ToggleVisualScrollCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6212) | void perform() {
  class ToggleHorizontalLockCommand (line 6218) | class ToggleHorizontalLockCommand : public Command {
    method ToggleHorizontalLockCommand (line 6222) | ToggleHorizontalLockCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6224) | void perform() {
  class ExecuteCommand (line 6230) | class ExecuteCommand : public TextCommand {
    method ExecuteCommand (line 6234) | ExecuteCommand(MainWidget* w) : TextCommand(cname, w) {}
    method perform (line 6236) | void perform() {
    method requires_document (line 6240) | bool requires_document() { return false; }
  class ImportAnnotationsCommand (line 6243) | class ImportAnnotationsCommand : public Command {
    method ImportAnnotationsCommand (line 6247) | ImportAnnotationsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6249) | void perform() {
  class EmbedAnnotationsCommand (line 6255) | class EmbedAnnotationsCommand : public Command {
    method EmbedAnnotationsCommand (line 6259) | EmbedAnnotationsCommand(MainWidget* w) : Command(cname, w) {}
    method set_file_requirement (line 6263) | virtual void set_file_requirement(std::wstring value) {
    method get_file_path_requirement_root_dir (line 6267) | std::optional<QString> get_file_path_requirement_root_dir() {
    method next_requirement (line 6275) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method perform (line 6283) | void perform() {
  class CopyWindowSizeConfigCommand (line 6291) | class CopyWindowSizeConfigCommand : public Command {
    method CopyWindowSizeConfigCommand (line 6295) | CopyWindowSizeConfigCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6297) | void perform() {
    method requires_document (line 6301) | bool requires_document() { return false; }
  class ToggleSelectHighlightCommand (line 6304) | class ToggleSelectHighlightCommand : public Command {
    method ToggleSelectHighlightCommand (line 6308) | ToggleSelectHighlightCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6310) | void perform() {
  class OpenLastDocumentCommand (line 6316) | class OpenLastDocumentCommand : public Command {
    method OpenLastDocumentCommand (line 6320) | OpenLastDocumentCommand(MainWidget* w) : Command(cname, w) {}
    method pushes_state (line 6322) | bool pushes_state() {
    method perform (line 6326) | void perform() {
    method requires_document (line 6334) | bool requires_document() { return false; }
  class AddMarkedDataCommand (line 6337) | class AddMarkedDataCommand : public Command {
    method AddMarkedDataCommand (line 6341) | AddMarkedDataCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6343) | void perform() {
    method requires_document (line 6347) | bool requires_document() { return true; }
  class UndoMarkedDataCommand (line 6350) | class UndoMarkedDataCommand : public Command {
    method UndoMarkedDataCommand (line 6354) | UndoMarkedDataCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6356) | void perform() {
    method requires_document (line 6360) | bool requires_document() { return true; }
  class GotoRandomPageCommand (line 6363) | class GotoRandomPageCommand : public Command {
    method GotoRandomPageCommand (line 6367) | GotoRandomPageCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6369) | void perform() {
    method requires_document (line 6373) | bool requires_document() { return true; }
  class RemoveMarkedDataCommand (line 6376) | class RemoveMarkedDataCommand : public Command {
    method RemoveMarkedDataCommand (line 6380) | RemoveMarkedDataCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6382) | void perform() {
    method requires_document (line 6386) | bool requires_document() { return true; }
  class ExportMarkedDataCommand (line 6389) | class ExportMarkedDataCommand : public Command {
    method ExportMarkedDataCommand (line 6393) | ExportMarkedDataCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6395) | void perform() {
    method requires_document (line 6399) | bool requires_document() { return true; }
  class ToggleStatusbarCommand (line 6402) | class ToggleStatusbarCommand : public Command {
    method ToggleStatusbarCommand (line 6406) | ToggleStatusbarCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6408) | void perform() {
    method requires_document (line 6412) | bool requires_document() { return false; }
  class ClearCurrentPageDrawingsCommand (line 6417) | class ClearCurrentPageDrawingsCommand : public Command {
    method ClearCurrentPageDrawingsCommand (line 6421) | ClearCurrentPageDrawingsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6423) | void perform() {
    method requires_document (line 6428) | bool requires_document() { return false; }
  class ClearCurrentDocumentDrawingsCommand (line 6431) | class ClearCurrentDocumentDrawingsCommand : public Command {
    method ClearCurrentDocumentDrawingsCommand (line 6435) | ClearCurrentDocumentDrawingsCommand(MainWidget* w) : Command(cname, w) {}
    method perform (line 6437) | void perform() {
    method requires_document (line 6442) | bool requires_document() { return false; }
  class DeleteFreehandDrawingsCommand (line 6445) | class DeleteFreehandDrawingsCommand : public Command {
    method DeleteFreehandDrawingsCommand (line 6449) | DeleteFreehandDrawingsCommand(MainWidget* w) : Command(cname, w) {}
    method pre_perform (line 6455) | void pre_perform() {
    method next_requirement (line 6460) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_rect_requirement (line 6469) | void set_rect_requirement(AbsoluteRect rect) {
    method perform (line 6480) | void perform() {
  class SelectFreehandDrawingsCommand (line 6486) | class SelectFreehandDrawingsCommand : public Command {
    method SelectFreehandDrawingsCommand (line 6490) | SelectFreehandDrawingsCommand(MainWidget* w) : Command(cname, w) {}
    method pre_perform (line 6496) | void pre_perform() {
    method next_requirement (line 6501) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_rect_requirement (line 6510) | void set_rect_requirement(AbsoluteRect rect) {
    method perform (line 6521) | void perform() {
  class CustomCommand (line 6527) | class CustomCommand : public Command {
    method CustomCommand (line 6537) | CustomCommand(MainWidget* widget_, std::string name_, std::wstring com...
    method next_requirement (line 6542) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method set_rect_requirement (line 6554) | void set_rect_requirement(AbsoluteRect rect) {
    method set_point_requirement (line 6558) | void set_point_requirement(AbsoluteDocumentPos point) {
    method set_text_requirement (line 6562) | void set_text_requirement(std::wstring txt) {
    method perform (line 6566) | void perform() {
    method get_name (line 6570) | std::string get_name() {
  class ToggleConfigCommand (line 6578) | class ToggleConfigCommand : public Command {
    method ToggleConfigCommand (line 6581) | ToggleConfigCommand(MainWidget* widget, std::string config_name_) : Co...
    method perform (line 6585) | void perform() {
    method requires_document (line 6592) | bool requires_document() { return false; }
  class SaveConfigCommand (line 6595) | class SaveConfigCommand : public Command {
    method SaveConfigCommand (line 6598) | SaveConfigCommand(MainWidget* widget, std::string config_name_) : Comm...
    method perform (line 6602) | void perform() {
    method requires_document (line 6608) | bool requires_document() { return false; }
  class DeleteConfigCommand (line 6612) | class DeleteConfigCommand : public Command {
    method DeleteConfigCommand (line 6615) | DeleteConfigCommand(MainWidget* widget, std::string config_name_) : Co...
    method perform (line 6619) | void perform() {
    method requires_document (line 6625) | bool requires_document() { return false; }
  class ConfigCommand (line 6628) | class ConfigCommand : public Command {
    method ConfigCommand (line 6634) | ConfigCommand(
    method set_text_requirement (line 6645) | void set_text_requirement(std::wstring value) {
    method set_file_requirement (line 6649) | void set_file_requirement(std::wstring value) {
    method get_text_default_value (line 6653) | std::wstring get_text_default_value() {
    method next_requirement (line 6662) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method perform (line 6699) | void perform() {
    method requires_document (line 6781) | bool requires_document() { return false; }
  class HoldableCommand (line 6956) | class HoldableCommand : public Command {
    method HoldableCommand (line 6964) | HoldableCommand(MainWidget* widget_, CommandManager* manager, std::str...
    method next_requirement (line 6980) | std::optional<Requirement> next_requirement(MainWidget* widget) {
    method requires_document (line 6985) | bool requires_document() {
    method perform (line 6989) | void perform() {
    method perform_up (line 6993) | void perform_up() {
    method on_key_hold (line 6997) | void on_key_hold() {
    method is_holdable (line 7004) | bool is_holdable() {
  function QStringList (line 7413) | QStringList CommandManager::get_all_command_names() {
  function print_tree_node (line 7440) | void print_tree_node(InputParseTreeNode node) {
  function InputParseTreeNode (line 7468) | InputParseTreeNode parse_token(std::wstring token) {
  function get_tokens (line 7541) | void get_tokens(std::wstring line, std::vector<std::wstring>& tokens) {
  function is_command_incomplete_macro (line 7573) | bool is_command_incomplete_macro(const std::vector<std::string>& commands){
  function InputParseTreeNode (line 7586) | InputParseTreeNode* parse_lines(
  function InputParseTreeNode (line 7735) | InputParseTreeNode* parse_lines(
  function get_keys_file_lines (line 7754) | void get_keys_file_lines(const Path& file_path,
  function InputParseTreeNode (line 7792) | InputParseTreeNode* parse_key_config_files(CommandManager* command_manag...
  function is_digit (line 7837) | bool is_digit(int key) {
  function is_macro_command_enabled (line 8163) | bool is_macro_command_enabled(Command* command) {

FILE: pdf_viewer/input.h
  type RequirementType (line 19) | enum RequirementType {
  type Requirement (line 29) | struct Requirement {
  function class (line 34) | class Command {
  function class (line 89) | class CommandManager {
  type InputParseTreeNode (line 124) | struct InputParseTreeNode {
  function class (line 151) | class InputHandler {
  type MenuItems (line 208) | struct MenuItems
  type MenuItems (line 212) | struct MenuItems {

FILE: pdf_viewer/main.cpp
  function strip_uri (line 141) | std::wstring strip_uri(std::wstring pdf_file_name, std::optional<int>* o...
  function QStringList (line 167) | QStringList convert_arguments(QStringList input_args) {
  function configure_paths_android (line 197) | void configure_paths_android() {
  function configure_paths (line 220) | void configure_paths() {
  function verify_config_paths (line 339) | void verify_config_paths() {
  function verify_paths (line 355) | void verify_paths() {
  function lock_mutex (line 369) | void lock_mutex(void* user, int lock) {
  function unlock_mutex (line 374) | void unlock_mutex(void* user, int lock) {
  function add_paths_to_file_system_watcher (line 379) | void add_paths_to_file_system_watcher(QFileSystemWatcher& watcher, const...
  function MainWidget (line 392) | MainWidget* get_window_with_opened_file_path(const std::wstring& file_pa...
  function invalidate_render (line 422) | void invalidate_render() {
  function MainWidget (line 428) | MainWidget* handle_args(const QStringList& arguments, QLocalSocket* orig...
  function focus_on_widget (line 627) | void focus_on_widget(QWidget* widget) {
  function main (line 637) | int main(int argc, char* args[]) {

FILE: pdf_viewer/main_widget.cpp
  function MainWidget (line 292) | MainWidget* get_window_with_window_id(int window_id) {
  function set_filtered_select_menu (line 305) | void set_filtered_select_menu(MainWidget* main_widget, bool fuzzy, bool ...
  class SelectionIndicator (line 400) | class SelectionIndicator : public QWidget {
    method SelectionIndicator (line 414) | SelectionIndicator(QWidget* parent, bool begin, MainWidget* w, Absolut...
    method update_pos (line 423) | void update_pos() {
    method mousePressEvent (line 433) | void mousePressEvent(QMouseEvent* mevent) {
    method mouseMoveEvent (line 440) | void mouseMoveEvent(QMouseEvent* mouse_event) {
    method mouseReleaseEvent (line 451) | void mouseReleaseEvent(QMouseEvent* mevent) {
    method DocumentPos (line 455) | DocumentPos get_docpos() {
    method paintEvent (line 469) | void paintEvent(QPaintEvent* event) {
  function ReferenceType (line 2822) | ReferenceType MainWidget::find_location_of_selected_text(int* out_page, ...
  function TextUnderPointerInfo (line 2861) | TextUnderPointerInfo MainWidget::find_location_of_text_under_pointer(Doc...
  function fz_stext_char (line 3564) | fz_stext_char* MainWidget::get_closest_character_to_cusrsor(QPoint pos) {
  function DocumentPos (line 3584) | DocumentPos MainWidget::get_document_pos_under_window_pos(WindowPos wind...
  function AbsoluteDocumentPos (line 3594) | AbsoluteDocumentPos MainWidget::get_absolute_document_pos_under_window_p...
  function CommandManager (line 3976) | CommandManager* MainWidget::get_command_manager() {
  function QRect (line 4373) | QRect MainWidget::get_main_window_rect() {
  function QRect (line 4379) | QRect MainWidget::get_helper_window_rect() {
  function Document (line 4717) | Document* MainWidget::doc() {
  function AbsoluteRect (line 4875) | AbsoluteRect MainWidget::move_visual_mark(int offset) {
  function MainWidget (line 6279) | MainWidget* MainWidget::handle_new_window() {
  function QMenu (line 7315) | QMenu* MainWidget::get_menu_from_items(std::unique_ptr<MenuItems> items,...
  function QNetworkReply (line 7496) | QNetworkReply* MainWidget::download_paper_with_name(const std::wstring& ...
  function QNetworkReply (line 8038) | QNetworkReply* MainWidget::download_paper_with_url(std::wstring paper_ur...
  function TextToSpeechHandler (line 8629) | TextToSpeechHandler* MainWidget::get_tts() {
  function TouchTextSelectionButtons (line 8957) | TouchTextSelectionButtons* MainWidget::get_text_selection_buttons() {
  function DrawControlsUI (line 8966) | DrawControlsUI* MainWidget::get_draw_controls() {
  function SearchButtons (line 8977) | SearchButtons* MainWidget::get_search_buttons() {
  function HighlightButtons (line 8987) | HighlightButtons* MainWidget::get_highlight_buttons() {
  function AbsoluteDocumentPos (line 9121) | AbsoluteDocumentPos MainWidget::get_cursor_abspos() {
  function QJSEngine (line 9450) | QJSEngine* MainWidget::take_js_engine(bool async) {
  function QJSValue (line 9503) | QJSValue MainWidget::export_javascript_api(QJSEngine& engine, bool is_as...
  function QJsonObject (line 9630) | QJsonObject MainWidget::get_json_state() {
  function QJsonArray (line 9747) | QJsonArray MainWidget::get_all_json_states() {
  function QJsonObject (line 9859) | QJsonObject MainWidget::get_json_annotations() {
  function QString (line 9869) | QString MainWidget::handle_action_in_menu(std::wstring action) {
  function QStringListModel (line 10201) | QStringListModel* MainWidget::get_new_command_list_model() {
  function PdfViewOpenGLWidget (line 10317) | PdfViewOpenGLWidget* MainWidget::helper_opengl_widget(){
  function DocumentView (line 10327) | DocumentView* MainWidget::helper_document_view(){
  function QString (line 10358) | QString MainWidget::run_macro_on_main_thread(QString macro_string, bool ...
  function QString (line 10392) | QString MainWidget::read_file(QString path, bool encode_base_64) {
  function QString (line 10416) | QString MainWidget::perform_network_request(QString url) {
  function QString (line 10497) | QString MainWidget::get_command_documentation(QString command_name){
  function AbsoluteDocumentPos (line 10609) | AbsoluteDocumentPos MainWidget::get_window_abspos(WindowPos window_pos) {
  function DocumentView (line 10618) | DocumentView* MainWidget::dv() {
  function PaperDownloadFinishedAction (line 10824) | PaperDownloadFinishedAction MainWidget::get_default_paper_download_finis...
  function QString (line 10832) | QString MainWidget::get_paper_download_finish_action_string(PaperDownloa...
  function PaperDownloadFinishedAction (line 10840) | PaperDownloadFinishedAction MainWidget::get_paper_download_action_from_s...
  function QPoint (line 10857) | QPoint MainWidget::cursor_pos() {
  function QString (line 10926) | QString MainWidget::execute_macro_sync(QString macro) {
  function QVariant (line 10944) | QVariant MainWidget::get_variable(QString name) {
  function QString (line 11024) | QString MainWidget::get_rest_of_document_pages_text() {
  function DocumentPos (line 11133) | DocumentPos MainWidget::get_index_document_pos(int index){
  function AbsoluteDocumentPos (line 11163) | AbsoluteDocumentPos MainWidget::get_mouse_abspos() {
  function QMenuBar (line 11307) | QMenuBar* MainWidget::create_main_menu_bar(){
  function Q_INVOKABLE (line 11692) | Q_INVOKABLE QJsonObject MainWidget::absolute_to_window_rect_json(QJsonOb...
  function QString (line 11773) | QString MainWidget::perform_network_request_with_headers(QString method,...
  function QString (line 11856) | QString MainWidget::get_environment_variable(QString name) {

FILE: pdf_viewer/main_widget.h
  type fz_context (line 41) | struct fz_context
  type fz_stext_char (line 42) | struct fz_stext_char
  type class (line 58) | enum class
  type class (line 64) | enum class
  type MenuNode (line 70) | struct MenuNode {
  type TextUnderPointerInfo (line 76) | struct TextUnderPointerInfo{
  type BookmarkMoveData (line 84) | struct BookmarkMoveData {
  type FixedVelocityState (line 91) | struct FixedVelocityState {
  type PortalMoveData (line 97) | struct PortalMoveData {
  type SelectedDrawings (line 105) | struct SelectedDrawings {
  type PendingDownloadPortal (line 111) | struct PendingDownloadPortal {
  type FreehandDrawingMoveData (line 119) | struct FreehandDrawingMoveData {
  type ClickSpaceTime (line 125) | struct ClickSpaceTime {
  type class (line 130) | enum class
  function class (line 142) | class MainWidget : public QMainWindow {

FILE: pdf_viewer/mysortfilterproxymodel.h
  function class (line 11) | class MySortFilterProxyModel : public QSortFilterProxyModel {

FILE: pdf_viewer/new_file_checker.cpp
  function QString (line 40) | QString NewFileChecker::get_lastest_new_file_path() {

FILE: pdf_viewer/new_file_checker.h
  function class (line 10) | class NewFileChecker {

FILE: pdf_viewer/path.cpp
  function Path (line 16) | Path Path::slash(const std::wstring& suffix) const
  function Path (line 47) | Path Path::file_parent() const
  function copy_file (line 117) | void copy_file(Path src, Path dst)

FILE: pdf_viewer/path.h
  function class (line 6) | class Path {

FILE: pdf_viewer/pdf_renderer.cpp
  function fz_context (line 41) | fz_context* PdfRenderer::init_context() {
  function GLuint (line 140) | GLuint PdfRenderer::find_rendered_page(std::wstring path, int page, bool...
  function GLuint (line 236) | GLuint PdfRenderer::try_closest_rendered_page(std::wstring doc_path, int...
  function fz_document (line 454) | fz_document* PdfRenderer::get_document_with_path(int thread_index, fz_co...
  function fz_try (line 493) | fz_try(mupdf_context) {
  function fz_catch (line 496) | fz_catch(mupdf_context) {
  function fz_try (line 571) | fz_try(mupdf_context) {
  function fz_catch (line 641) | fz_catch(mupdf_context) {

FILE: pdf_viewer/pdf_renderer.h
  type RenderRequest (line 23) | struct RenderRequest {
  type SearchRequest (line 34) | struct SearchRequest {
  type RenderResponse (line 46) | struct RenderResponse {
  function class (line 60) | class PdfRenderer : public QObject {

FILE: pdf_viewer/pdf_view_opengl_widget.cpp
  function generate_bezier_with_endpoints_and_velocity (line 179) | void generate_bezier_with_endpoints_and_velocity(
  function num_slices_for_page_rect (line 204) | bool num_slices_for_page_rect(PagelessDocumentRect page_rect, int* h_sli...
  function read_file_contents (line 237) | std::string read_file_contents(const Path& path) {
  function GLuint (line 262) | GLuint PdfViewOpenGLWidget::LoadShaders(Path vertex_file_path, Path frag...
  function Document (line 993) | Document* PdfViewOpenGLWidget::doc(bool overview){
  function NormalizedWindowRect (line 2155) | NormalizedWindowRect PdfViewOpenGLWidget::get_overview_rect() {
  function NormalizedWindowRect (line 2164) | NormalizedWindowRect	PdfViewOpenGLWidget::get_overview_rect_pixel_perfec...
  function DocumentPos (line 2343) | DocumentPos PdfViewOpenGLWidget::window_pos_to_overview_pos(NormalizedWi...
  function Document (line 2568) | Document* PdfViewOpenGLWidget::get_current_overview_document() {
  function NormalizedWindowPos (line 2594) | NormalizedWindowPos PdfViewOpenGLWidget::document_to_overview_pos(Docume...
  function NormalizedWindowRect (line 2620) | NormalizedWindowRect PdfViewOpenGLWidget::document_to_overview_rect(Docu...
  function T (line 2837) | T lerp(T p1, T p2, float alpha) {
  function T (line 2844) | T bezier_lerp(T p1, T p2, T p3, T p4, float alpha) {
  function FreehandDrawing (line 2855) | FreehandDrawing smoothen_drawing(FreehandDrawing original) {
  function CompiledDrawingData (line 3056) | CompiledDrawingData PdfViewOpenGLWidget::compile_drawings_into_vertex_an...
  type UIRectDescriptor (line 3451) | struct UIRectDescriptor {
  function QColor (line 3575) | QColor PdfViewOpenGLWidget::qcc3(const float* input_color) {
  function QColor (line 3581) | QColor PdfViewOpenGLWidget::qcc4(const float* input_color) {
  function ScratchPad (line 3712) | ScratchPad* PdfViewOpenGLWidget::get_scratchpad() {

FILE: pdf_viewer/pdf_view_opengl_widget.h
  type MarkedDataRect (line 33) | struct MarkedDataRect {
  type HighlightRenderFlags (line 38) | enum HighlightRenderFlags
  type OpenGLSharedResources (line 49) | struct OpenGLSharedResources {
  type ColorPalette (line 101) | enum ColorPalette {

FILE: pdf_viewer/rapidfuzz_amalgamated.hpp
  type rapidfuzz::detail (line 27) | namespace rapidfuzz::detail {
    type GrowingHashmap (line 31) | struct GrowingHashmap {
      type MapElem (line 38) | struct MapElem {
      method GrowingHashmap (line 49) | GrowingHashmap() : used(0), fill(0), mask(-1), m_map(NULL)
      method GrowingHashmap (line 56) | GrowingHashmap(const GrowingHashmap& other) : used(other.used), fill...
      method GrowingHashmap (line 63) | GrowingHashmap(GrowingHashmap&& other) noexcept : GrowingHashmap()
      method GrowingHashmap (line 68) | GrowingHashmap& operator=(GrowingHashmap other)
      method swap (line 74) | void swap(GrowingHashmap& first, GrowingHashmap& second) noexcept
      method size_type (line 82) | size_type size() const
      method size_type (line 86) | size_type capacity() const
      method empty (line 90) | bool empty() const
      method value_type (line 95) | value_type get(key_type key) const noexcept
      method value_type (line 102) | value_type& operator[](key_type key) noexcept
      method allocate (line 123) | void allocate()
      method lookup (line 133) | size_t lookup(key_type key) const
      method grow (line 149) | void grow(int minUsed)
    type HybridGrowingHashmap (line 176) | struct HybridGrowingHashmap {
      method HybridGrowingHashmap (line 180) | HybridGrowingHashmap()
      method value_type (line 185) | value_type get(char key) const noexcept
      method value_type (line 192) | value_type get(CharT key) const noexcept
      method value_type (line 200) | value_type& operator[](char key) noexcept
      method value_type (line 207) | value_type& operator[](CharT key)
    type BitMatrixView (line 234) | struct BitMatrixView {
      method BitMatrixView (line 241) | BitMatrixView(pointer vector, size_type cols) noexcept : m_vector(ve...
      method reference (line 244) | reference operator[](size_type col) noexcept
      method size_type (line 250) | size_type size() const noexcept
    type BitMatrix (line 261) | struct BitMatrix {
      method BitMatrix (line 265) | BitMatrix() : m_rows(0), m_cols(0), m_matrix(nullptr)
      method BitMatrix (line 268) | BitMatrix(size_t rows, size_t cols, T val) : m_rows(rows), m_cols(co...
      method BitMatrix (line 274) | BitMatrix(const BitMatrix& other) : m_rows(other.m_rows), m_cols(oth...
      method BitMatrix (line 280) | BitMatrix(BitMatrix&& other) noexcept : m_rows(0), m_cols(0), m_matr...
      method BitMatrix (line 285) | BitMatrix& operator=(BitMatrix&& other) noexcept
      method BitMatrix (line 291) | BitMatrix& operator=(const BitMatrix& other)
      method swap (line 298) | void swap(BitMatrix& rhs) noexcept
      method rows (line 323) | size_t rows() const noexcept
      method cols (line 328) | size_t cols() const noexcept
    type ShiftedBitMatrix (line 340) | struct ShiftedBitMatrix {
      method ShiftedBitMatrix (line 343) | ShiftedBitMatrix()
      method ShiftedBitMatrix (line 346) | ShiftedBitMatrix(size_t rows, size_t cols, T val) : m_matrix(rows, c...
      method ShiftedBitMatrix (line 349) | ShiftedBitMatrix(const ShiftedBitMatrix& other) : m_matrix(other.m_m...
      method ShiftedBitMatrix (line 352) | ShiftedBitMatrix(ShiftedBitMatrix&& other) noexcept
      method ShiftedBitMatrix (line 357) | ShiftedBitMatrix& operator=(ShiftedBitMatrix&& other) noexcept
      method ShiftedBitMatrix (line 363) | ShiftedBitMatrix& operator=(const ShiftedBitMatrix& other)
      method swap (line 370) | void swap(ShiftedBitMatrix& rhs) noexcept
      method test_bit (line 377) | bool test_bit(size_t row, size_t col, bool default_ = false) const n...
      method set_offset (line 409) | void set_offset(size_t row, ptrdiff_t offset)
    function assume (line 429) | static inline void assume(bool b)
    function CharT (line 441) | CharT* to_begin(CharT* s)
    function to_begin (line 447) | auto to_begin(T& x)
    function CharT (line 454) | CharT* to_end(CharT* s)
    function to_end (line 464) | auto to_end(T& x)
    class Range (line 471) | class Range {
      method Range (line 480) | constexpr Range(Iter first, Iter last) : _first(first), _last(last)
      method Range (line 484) | constexpr Range(T& x) : _first(to_begin(x)), _last(to_end(x))
      method iterator (line 487) | constexpr iterator begin() const noexcept
      method iterator (line 491) | constexpr iterator end() const noexcept
      method reverse_iterator (line 496) | constexpr reverse_iterator rbegin() const noexcept
      method reverse_iterator (line 500) | constexpr reverse_iterator rend() const noexcept
      method size (line 505) | constexpr ptrdiff_t size() const
      method empty (line 509) | constexpr bool empty() const
      method remove_prefix (line 522) | constexpr void remove_prefix(ptrdiff_t n)
      method remove_suffix (line 526) | constexpr void remove_suffix(ptrdiff_t n)
      method Range (line 531) | constexpr Range subseq(ptrdiff_t pos = 0, ptrdiff_t count = std::num...
      method front (line 540) | constexpr decltype(auto) front() const
      method back (line 545) | constexpr decltype(auto) back() const
      method reversed (line 550) | constexpr Range<reverse_iterator> reversed() const
    class SplittedSentenceView (line 1265) | class SplittedSentenceView {
      method SplittedSentenceView (line 1269) | SplittedSentenceView(RangeVec<InputIt> sentence) noexcept(
      method length (line 1277) | size_t length() const
      method empty (line 1282) | bool empty() const
      method word_count (line 1287) | size_t word_count() const
    function T (line 1359) | T bit_mask_lsb(int n)
    function bittest (line 1369) | bool bittest(T a, int bit)
    function shr64 (line 1378) | constexpr uint64_t shr64(uint64_t a, U shift)
    function shl64 (line 1387) | constexpr uint64_t shl64(uint64_t a, U shift)
    function addc64 (line 1392) | constexpr uint64_t addc64(uint64_t a, uint64_t b, uint64_t carryin, ui...
    function T (line 1403) | constexpr T ceil_div(T a, U divisor)
    function popcount (line 1409) | static inline int popcount(uint64_t x)
    function popcount (line 1414) | static inline int popcount(uint32_t x)
    function popcount (line 1419) | static inline int popcount(uint16_t x)
    function popcount (line 1424) | static inline int popcount(uint8_t x)
    function T (line 1439) | constexpr T rotl(T x, unsigned int n)
    function T (line 1460) | constexpr T blsi(T a)
    function T (line 1477) | constexpr T blsr(T x)
    function T (line 1487) | constexpr T blsmsk(T a)
    function countr_zero (line 1493) | static inline int countr_zero(uint32_t x)
    function countr_zero (line 1501) | static inline int countr_zero(uint64_t x)
    function countr_zero (line 1508) | static inline int countr_zero(uint64_t x)
    function countr_zero (line 1518) | static inline int countr_zero(uint32_t x)
    function countr_zero (line 1523) | static inline int countr_zero(uint64_t x)
    function unroll_impl (line 1530) | constexpr void unroll_impl(std::integer_sequence<T, inds...>, F&& f)
    function unroll (line 1536) | constexpr void unroll(F&& f)
    type DecomposedSet (line 1548) | struct DecomposedSet {
      method DecomposedSet (line 1552) | DecomposedSet(SplittedSentenceView<InputIt1> diff_ab, SplittedSenten...
    function NormSim_to_NormDist (line 1566) | static inline double NormSim_to_NormDist(double score_cutoff, double i...
    function result_cutoff (line 1575) | constexpr double result_cutoff(double result, double score_cutoff)
    function norm_distance (line 1581) | constexpr double norm_distance(int64_t dist, int64_t lensum, double sc...
    function score_cutoff_to_distance (line 1590) | static inline int64_t score_cutoff_to_distance(double score_cutoff, in...
    function set_decomposition (line 1620) | DecomposedSet<InputIt1, InputIt2, InputIt1> set_decomposition(Splitted...
    function remove_common_prefix (line 1649) | size_t remove_common_prefix(Range<InputIt1>& s1, Range<InputIt2>& s2)
    function remove_common_suffix (line 1663) | size_t remove_common_suffix(Range<InputIt1>& s1, Range<InputIt2>& s2)
    function StringAffix (line 1677) | StringAffix remove_common_affix(Range<InputIt1>& s1, Range<InputIt2>& s2)
    type is_space_dispatch_tag (line 1683) | struct is_space_dispatch_tag : std::integral_constant<int, 0> {}
    type is_space_dispatch_tag<CharT, typename std::enable_if<sizeof(CharT) == 1>::type> (line 1686) | struct is_space_dispatch_tag<CharT, typename std::enable_if<sizeof(Cha...
    function is_space_impl (line 1693) | bool is_space_impl(const CharT ch, std::integral_constant<int, 0>)
    function is_space_impl (line 1733) | bool is_space_impl(const CharT ch, std::integral_constant<int, 1>)
    function is_space (line 1755) | bool is_space(const CharT ch)
    function sorted_split (line 1761) | SplittedSentenceView<InputIt> sorted_split(InputIt first, InputIt last)
    type NormalizedMetricBase (line 2739) | struct NormalizedMetricBase {
      method normalized_distance (line 2742) | static double normalized_distance(InputIt1 first1, InputIt1 last1, I...
      method normalized_distance (line 2750) | static double normalized_distance(const Sentence1& s1, const Sentenc...
      method normalized_similarity (line 2759) | static double normalized_similarity(InputIt1 first1, InputIt1 last1,...
      method normalized_similarity (line 2767) | static double normalized_similarity(const Sentence1& s1, const Sente...
      method _normalized_distance (line 2776) | static double _normalized_distance(Range<InputIt1> s1, Range<InputIt...
      method _normalized_similarity (line 2790) | static double _normalized_similarity(Range<InputIt1> s1, Range<Input...
      method NormalizedMetricBase (line 2801) | NormalizedMetricBase()
    type DistanceBase (line 2807) | struct DistanceBase : public NormalizedMetricBase<T, Args...> {
      method ResType (line 2810) | static ResType distance(InputIt1 first1, InputIt1 last1, InputIt2 fi...
      method ResType (line 2818) | static ResType distance(const Sentence1& s1, const Sentence2& s2, Ar...
      method ResType (line 2826) | static ResType similarity(InputIt1 first1, InputIt1 last1, InputIt2 ...
      method ResType (line 2834) | static ResType similarity(const Sentence1& s1, const Sentence2& s2, ...
      method ResType (line 2842) | static ResType _similarity(Range<InputIt1> s1, Range<InputIt2> s2, A...
      method DistanceBase (line 2856) | DistanceBase()
    type SimilarityBase (line 2862) | struct SimilarityBase : public NormalizedMetricBase<T, Args...> {
      method ResType (line 2865) | static ResType distance(InputIt1 first1, InputIt1 last1, InputIt2 fi...
      method ResType (line 2873) | static ResType distance(const Sentence1& s1, const Sentence2& s2, Ar...
      method ResType (line 2881) | static ResType similarity(InputIt1 first1, InputIt1 last1, InputIt2 ...
      method ResType (line 2889) | static ResType similarity(const Sentence1& s1, const Sentence2& s2, ...
      method ResType (line 2897) | static ResType _distance(Range<InputIt1> s1, Range<InputIt2> s2, Arg...
      method SimilarityBase (line 2914) | SimilarityBase()
    type CachedNormalizedMetricBase (line 2920) | struct CachedNormalizedMetricBase {
      method normalized_distance (line 2922) | double normalized_distance(InputIt2 first2, InputIt2 last2, double s...
      method normalized_distance (line 2929) | double normalized_distance(const Sentence2& s2, double score_cutoff ...
      method normalized_similarity (line 2935) | double normalized_similarity(InputIt2 first2, InputIt2 last2, double...
      method normalized_similarity (line 2942) | double normalized_similarity(const Sentence2& s2, double score_cutof...
      method _normalized_distance (line 2950) | double _normalized_distance(Range<InputIt2> s2, double score_cutoff,...
      method _normalized_similarity (line 2964) | double _normalized_similarity(Range<InputIt2> s2, double score_cutof...
      method CachedNormalizedMetricBase (line 2973) | CachedNormalizedMetricBase()
    type CachedDistanceBase (line 2979) | struct CachedDistanceBase : public CachedNormalizedMetricBase<T> {
      method ResType (line 2981) | ResType distance(InputIt2 first2, InputIt2 last2,
      method ResType (line 2990) | ResType distance(const Sentence2& s2, ResType score_cutoff = static_...
      method ResType (line 2998) | ResType similarity(InputIt2 first2, InputIt2 last2,
      method ResType (line 3006) | ResType similarity(const Sentence2& s2, ResType score_cutoff = stati...
      method ResType (line 3014) | ResType _similarity(Range<InputIt2> s2, ResType score_cutoff, ResTyp...
      method CachedDistanceBase (line 3028) | CachedDistanceBase()
    type CachedSimilarityBase (line 3034) | struct CachedSimilarityBase : public CachedNormalizedMetricBase<T> {
      method ResType (line 3036) | ResType distance(InputIt2 first2, InputIt2 last2,
      method ResType (line 3044) | ResType distance(const Sentence2& s2, ResType score_cutoff = static_...
      method ResType (line 3051) | ResType similarity(InputIt2 first2, InputIt2 last2,
      method ResType (line 3060) | ResType similarity(const Sentence2& s2, ResType score_cutoff = stati...
      method ResType (line 3069) | ResType _distance(Range<InputIt2> s2, ResType score_cutoff, ResType ...
      method CachedSimilarityBase (line 3084) | CachedSimilarityBase()
    type MultiNormalizedMetricBase (line 3090) | struct MultiNormalizedMetricBase {
      method normalized_distance (line 3092) | void normalized_distance(double* scores, size_t score_count, InputIt...
      method normalized_distance (line 3099) | void normalized_distance(double* scores, size_t score_count, const S...
      method normalized_similarity (line 3106) | void normalized_similarity(double* scores, size_t score_count, Input...
      method normalized_similarity (line 3113) | void normalized_similarity(double* scores, size_t score_count, const...
      method _normalized_distance (line 3121) | void _normalized_distance(double* scores, size_t score_count, Range<...
      method _normalized_similarity (line 3148) | void _normalized_similarity(double* scores, size_t score_count, Rang...
      method MultiNormalizedMetricBase (line 3160) | MultiNormalizedMetricBase()
    type MultiDistanceBase (line 3166) | struct MultiDistanceBase : public MultiNormalizedMetricBase<T> {
      method distance (line 3168) | void distance(ResType* scores, size_t score_count, InputIt2 first2, ...
      method distance (line 3176) | void distance(ResType* scores, size_t score_count, const Sentence2& s2,
      method similarity (line 3184) | void similarity(ResType* scores, size_t score_count, InputIt2 first2...
      method similarity (line 3191) | void similarity(ResType* scores, size_t score_count, const Sentence2...
      method _similarity (line 3199) | void _similarity(ResType* scores, size_t score_count, Range<InputIt2...
      method MultiDistanceBase (line 3211) | MultiDistanceBase()
    type MultiSimilarityBase (line 3217) | struct MultiSimilarityBase : public MultiNormalizedMetricBase<T> {
      method distance (line 3219) | void distance(ResType* scores, size_t score_count, InputIt2 first2, ...
      method distance (line 3226) | void distance(ResType* scores, size_t score_count, const Sentence2& s2,
      method similarity (line 3233) | void similarity(ResType* scores, size_t score_count, InputIt2 first2...
      method similarity (line 3241) | void similarity(ResType* scores, size_t score_count, const Sentence2...
      method _distance (line 3250) | void _distance(ResType* scores, size_t score_count, Range<InputIt2> ...
      method MultiSimilarityBase (line 3266) | MultiSimilarityBase()
    type RowId (line 3276) | struct RowId {
    function damerau_levenshtein_distance_zhao (line 3295) | int64_t damerau_levenshtein_distance_zhao(Range<InputIt1> s1, Range<In...
    function damerau_levenshtein_distance (line 3358) | int64_t damerau_levenshtein_distance(Range<InputIt1> s1, Range<InputIt...
    class DamerauLevenshtein (line 3375) | class DamerauLevenshtein
      method maximum (line 3381) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2)
      method _distance (line 3387) | static int64_t _distance(Range<InputIt1> s1, Range<InputIt2> s2, int...
    class Hamming (line 3550) | class Hamming : public DistanceBase<Hamming, int64_t, 0, std::numeric_...
      method maximum (line 3555) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2>)
      method _distance (line 3561) | static int64_t _distance(Range<InputIt1> s1, Range<InputIt2> s2, int...
    function Editops (line 3575) | Editops hamming_editops(Range<InputIt1> s1, Range<InputIt2> s2, int64_t)
    type BitvectorHashmap (line 3760) | struct BitvectorHashmap {
      method BitvectorHashmap (line 3761) | BitvectorHashmap() : m_map()
      method get (line 3765) | uint64_t get(CharT key) const noexcept
      method lookup (line 3783) | uint32_t lookup(uint64_t key) const noexcept
      type MapElem (line 3798) | struct MapElem {
    type PatternMatchVector (line 3805) | struct PatternMatchVector {
      method PatternMatchVector (line 3806) | PatternMatchVector() : m_extendedAscii()
      method PatternMatchVector (line 3810) | PatternMatchVector(Range<InputIt> s) : m_extendedAscii()
      method size (line 3815) | size_t size() const noexcept
      method insert (line 3821) | void insert(Range<InputIt> s) noexcept
      method insert (line 3831) | void insert(CharT key, int64_t pos) noexcept
      method get (line 3836) | uint64_t get(char key) const noexcept
      method get (line 3843) | uint64_t get(CharT key) const noexcept
      method get (line 3852) | uint64_t get(size_t block, CharT key) const noexcept
      method insert_mask (line 3859) | void insert_mask(char key, uint64_t mask) noexcept
      method insert_mask (line 3866) | void insert_mask(CharT key, uint64_t mask) noexcept
    type BlockPatternMatchVector (line 3879) | struct BlockPatternMatchVector {
      method BlockPatternMatchVector (line 3880) | BlockPatternMatchVector() = delete;
      method BlockPatternMatchVector (line 3882) | BlockPatternMatchVector(size_t str_len)
      method BlockPatternMatchVector (line 3887) | BlockPatternMatchVector(Range<InputIt> s) : BlockPatternMatchVector(...
      method size (line 3897) | size_t size() const noexcept
      method insert (line 3903) | void insert(size_t block, CharT ch, int pos) noexcept
      method insert (line 3916) | void insert(Range<InputIt> s) noexcept
      method insert_mask (line 3928) | void insert_mask(size_t block, CharT key, uint64_t mask) noexcept
      method insert_mask (line 3939) | void insert_mask(size_t block, char key, uint64_t mask) noexcept
      method get (line 3945) | uint64_t get(size_t block, CharT key) const noexcept
      method get (line 3955) | uint64_t get(size_t block, char ch) const noexcept
    type LCSseqResult (line 3976) | struct LCSseqResult
    type LCSseqResult<true> (line 3979) | struct LCSseqResult<true> {
    type LCSseqResult<false> (line 3986) | struct LCSseqResult<false> {
    function lcs_seq_mbleven2018 (line 4032) | int64_t lcs_seq_mbleven2018(Range<InputIt1> s1, Range<InputIt2> s2, in...
    type LCSseqResult (line 4080) | struct LCSseqResult
    function lcs_simd (line 4084) | void lcs_simd(Range<int64_t*> scores, const BlockPatternMatchVector& b...
    function lcs_unroll (line 4122) | auto lcs_unroll(const PMV& block, Range<InputIt1>, Range<InputIt2> s2,...
    function lcs_blockwise (line 4152) | auto lcs_blockwise(const PMV& block, Range<InputIt1>, Range<InputIt2> ...
    function longest_common_subsequence (line 4186) | int64_t longest_common_subsequence(const PMV& block, Range<InputIt1> s...
    function longest_common_subsequence (line 4205) | int64_t longest_common_subsequence(Range<InputIt1> s1, Range<InputIt2>...
    function lcs_seq_similarity (line 4214) | int64_t lcs_seq_similarity(const BlockPatternMatchVector& block, Range...
    function lcs_seq_similarity (line 4239) | int64_t lcs_seq_similarity(Range<InputIt1> s1, Range<InputIt2> s2, int...
    function Editops (line 4272) | Editops recover_alignment(Range<InputIt1> s1, Range<InputIt2> s2, cons...
    function lcs_matrix (line 4336) | LCSseqResult<true> lcs_matrix(Range<InputIt1> s1, Range<InputIt2> s2)
    function Editops (line 4359) | Editops lcs_seq_editops(Range<InputIt1> s1, Range<InputIt2> s2)
    class LCSseq (line 4367) | class LCSseq : public SimilarityBase<LCSseq, int64_t, 0, std::numeric_...
      method maximum (line 4372) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2)
      method _similarity (line 4378) | static int64_t _similarity(Range<InputIt1> s1, Range<InputIt2> s2, i...
    function indel_distance (line 4622) | int64_t indel_distance(const BlockPatternMatchVector& block, Range<Inp...
    function indel_normalized_distance (line 4633) | double indel_normalized_distance(const BlockPatternMatchVector& block,...
    function indel_normalized_similarity (line 4644) | double indel_normalized_similarity(const BlockPatternMatchVector& bloc...
    class Indel (line 4653) | class Indel : public DistanceBase<Indel, int64_t, 0, std::numeric_limi...
      method maximum (line 4658) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2)
      method _distance (line 4664) | static int64_t _distance(Range<InputIt1> s1, Range<InputIt2> s2, int...
    type FlaggedCharsWord (line 4869) | struct FlaggedCharsWord {
    type FlaggedCharsMultiword (line 4874) | struct FlaggedCharsMultiword {
    type SearchBoundMask (line 4879) | struct SearchBoundMask {
    type TextPosition (line 4886) | struct TextPosition {
      method TextPosition (line 4887) | TextPosition(int64_t Word_, int64_t WordPos_) : Word(Word_), WordPos...
    function jaro_calculate_similarity (line 4893) | static inline double jaro_calculate_similarity(int64_t P_len, int64_t ...
    function jaro_length_filter (line 4908) | static inline bool jaro_length_filter(int64_t P_len, int64_t T_len, do...
    function jaro_common_char_filter (line 4921) | static inline bool jaro_common_char_filter(int64_t P_len, int64_t T_le...
    function count_common_chars (line 4934) | static inline size_t count_common_chars(const FlaggedCharsWord& flagged)
    function count_common_chars (line 4939) | static inline size_t count_common_chars(const FlaggedCharsMultiword& f...
    function FlaggedCharsWord (line 4956) | FlaggedCharsWord flag_similar_characters_word(const PM_Vec& PM, [[mayb...
    function flag_similar_characters_step (line 4990) | void flag_similar_characters_step(const BlockPatternMatchVector& PM, C...
    function FlaggedCharsMultiword (line 5068) | static inline FlaggedCharsMultiword flag_similar_characters_block(cons...
    function count_transpositions_word (line 5112) | static inline size_t count_transpositions_word(const PM_Vec& PM, Range...
    function count_transpositions_block (line 5131) | static inline size_t count_transpositions_block(const BlockPatternMatc...
    function jaro_bounds (line 5173) | int64_t jaro_bounds(Range<InputIt1>& P, Range<InputIt2>& T)
    function jaro_similarity (line 5194) | double jaro_similarity(Range<InputIt1> P, Range<InputIt2> T, double sc...
    function jaro_similarity (line 5238) | double jaro_similarity(const BlockPatternMatchVector& PM, Range<InputI...
    class Jaro (line 5280) | class Jaro : public SimilarityBase<Jaro, double, 0, 1> {
      method maximum (line 5285) | static double maximum(Range<InputIt1>, Range<InputIt2>) noexcept
      method _similarity (line 5291) | static double _similarity(Range<InputIt1> s1, Range<InputIt2> s2, do...
    function jaro_winkler_similarity (line 5398) | double jaro_winkler_similarity(Range<InputIt1> P, Range<InputIt2> T, d...
    function jaro_winkler_similarity (line 5427) | double jaro_winkler_similarity(const BlockPatternMatchVector& PM, Rang...
    class JaroWinkler (line 5455) | class JaroWinkler : public SimilarityBase<JaroWinkler, double, 0, 1, d...
      method maximum (line 5460) | static double maximum(Range<InputIt1>, Range<InputIt2>, double) noex...
      method _similarity (line 5466) | static double _similarity(Range<InputIt1> s1, Range<InputIt2> s2, do...
    type LevenshteinRow (line 5595) | struct LevenshteinRow {
      method LevenshteinRow (line 5599) | LevenshteinRow() : VP(~UINT64_C(0)), VN(0)
      method LevenshteinRow (line 5602) | LevenshteinRow(uint64_t VP_, uint64_t VN_) : VP(VP_), VN(VN_)
    type LevenshteinResult (line 5607) | struct LevenshteinResult
    type LevenshteinResult<true, false> (line 5610) | struct LevenshteinResult<true, false> {
    type LevenshteinResult<false, true> (line 5618) | struct LevenshteinResult<false, true> {
    type LevenshteinResult<false, false> (line 5628) | struct LevenshteinResult<false, false> {
    function generalized_levenshtein_wagner_fischer (line 5633) | int64_t generalized_levenshtein_wagner_fischer(Range<InputIt1> s1, Ran...
    function levenshtein_maximum (line 5666) | static inline int64_t levenshtein_maximum(ptrdiff_t len1, ptrdiff_t le...
    function levenshtein_min_distance (line 5683) | int64_t levenshtein_min_distance(Range<InputIt1> s1, Range<InputIt2> s...
    function generalized_levenshtein_distance (line 5690) | int64_t generalized_levenshtein_distance(Range<InputIt1> s1, Range<Inp...
    function levenshtein_mbleven2018 (line 5733) | int64_t levenshtein_mbleven2018(Range<InputIt1> s1, Range<InputIt2> s2...
    function levenshtein_hyrroe2003 (line 5802) | auto levenshtein_hyrroe2003(const PM_Vec& PM, Range<InputIt1> s1, Rang...
    function levenshtein_hyrroe2003_simd (line 5864) | void levenshtein_hyrroe2003_simd(Range<int64_t*> scores, const detail:...
    function levenshtein_hyrroe2003_small_band (line 5956) | int64_t levenshtein_hyrroe2003_small_band(const BlockPatternMatchVecto...
    function levenshtein_hyrroe2003_small_band (line 6042) | auto levenshtein_hyrroe2003_small_band(Range<InputIt1> s1, Range<Input...
    function levenshtein_hyrroe2003_block (line 6169) | auto levenshtein_hyrroe2003_block(const BlockPatternMatchVector& PM, R...
    function uniform_levenshtein_distance (line 6363) | int64_t uniform_levenshtein_distance(const BlockPatternMatchVector& bl...
    function uniform_levenshtein_distance (line 6418) | int64_t uniform_levenshtein_distance(Range<InputIt1> s1, Range<InputIt...
    function recover_alignment (line 6468) | void recover_alignment(Editops& editops, Range<InputIt1> s1, Range<Inp...
    function levenshtein_align (line 6531) | void levenshtein_align(Editops& editops, Range<InputIt1> s1, Range<Inp...
    function levenshtein_row (line 6558) | LevenshteinResult<false, true> levenshtein_row(Range<InputIt1> s1, Ran...
    function levenshtein_distance (line 6565) | int64_t levenshtein_distance(Range<InputIt1> s1, Range<InputIt2> s2,
    type HirschbergPos (line 6598) | struct HirschbergPos {
    function HirschbergPos (line 6606) | HirschbergPos find_hirschberg_pos(Range<InputIt1> s1, Range<InputIt2> s2,
    function levenshtein_align_hirschberg (line 6681) | void levenshtein_align_hirschberg(Editops& editops, Range<InputIt1> s1...
    class Levenshtein (line 6712) | class Levenshtein : public DistanceBase<Levenshtein, int64_t, 0, std::...
      method maximum (line 6718) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2, Leven...
      method _distance (line 6724) | static int64_t _distance(Range<InputIt1> s1, Range<InputIt2> s2, Lev...
    function Editops (line 6732) | Editops levenshtein_editops(Range<InputIt1> s1, Range<InputIt2> s2, in...
    function osa_hyrroe2003 (line 7268) | int64_t osa_hyrroe2003(const PM_Vec& PM, Range<InputIt1> s1, Range<Inp...
    function osa_hyrroe2003_simd (line 7311) | void osa_hyrroe2003_simd(Range<int64_t*> scores, const detail::BlockPa...
    function osa_hyrroe2003_block (line 7408) | int64_t osa_hyrroe2003_block(const BlockPatternMatchVector& PM, Range<...
    class OSA (line 7481) | class OSA : public DistanceBase<OSA, int64_t, 0, std::numeric_limits<i...
      method maximum (line 7486) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2)
      method _distance (line 7492) | static int64_t _distance(Range<InputIt1> s1, Range<InputIt2> s2, int...
    class Postfix (line 7787) | class Postfix : public SimilarityBase<Postfix, int64_t, 0, std::numeri...
      method maximum (line 7792) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2)
      method _similarity (line 7798) | static int64_t _similarity(Range<InputIt1> s1, Range<InputIt2> s2, i...
    class Prefix (line 7911) | class Prefix : public SimilarityBase<Prefix, int64_t, 0, std::numeric_...
      method maximum (line 7916) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2)
      method _similarity (line 7922) | static int64_t _similarity(Range<InputIt1> s1, Range<InputIt2> s2, i...
    function CanTypeFitValue (line 8138) | bool CanTypeFitValue(const U value)
    type CharSet (line 8148) | struct CharSet
      method CharSet (line 8177) | CharSet() : m_val{}
      method insert (line 8180) | void insert(CharT1 ch)
      method find (line 8186) | bool find(CharT2 ch) const
    type CharSet<CharT1, 1> (line 8151) | struct CharSet<CharT1, 1> {
      method CharSet (line 8156) | CharSet() : m_val{}
      method insert (line 8159) | void insert(CharT1 ch)
      method find (line 8165) | bool find(CharT2 ch) const
    type CharSet (line 8174) | struct CharSet {
      method CharSet (line 8177) | CharSet() : m_val{}
      method insert (line 8180) | void insert(CharT1 ch)
      method find (line 8186) | bool find(CharT2 ch) const
  type rapidfuzz::detail (line 231) | namespace rapidfuzz::detail {
    type GrowingHashmap (line 31) | struct GrowingHashmap {
      type MapElem (line 38) | struct MapElem {
      method GrowingHashmap (line 49) | GrowingHashmap() : used(0), fill(0), mask(-1), m_map(NULL)
      method GrowingHashmap (line 56) | GrowingHashmap(const GrowingHashmap& other) : used(other.used), fill...
      method GrowingHashmap (line 63) | GrowingHashmap(GrowingHashmap&& other) noexcept : GrowingHashmap()
      method GrowingHashmap (line 68) | GrowingHashmap& operator=(GrowingHashmap other)
      method swap (line 74) | void swap(GrowingHashmap& first, GrowingHashmap& second) noexcept
      method size_type (line 82) | size_type size() const
      method size_type (line 86) | size_type capacity() const
      method empty (line 90) | bool empty() const
      method value_type (line 95) | value_type get(key_type key) const noexcept
      method value_type (line 102) | value_type& operator[](key_type key) noexcept
      method allocate (line 123) | void allocate()
      method lookup (line 133) | size_t lookup(key_type key) const
      method grow (line 149) | void grow(int minUsed)
    type HybridGrowingHashmap (line 176) | struct HybridGrowingHashmap {
      method HybridGrowingHashmap (line 180) | HybridGrowingHashmap()
      method value_type (line 185) | value_type get(char key) const noexcept
      method value_type (line 192) | value_type get(CharT key) const noexcept
      method value_type (line 200) | value_type& operator[](char key) noexcept
      method value_type (line 207) | value_type& operator[](CharT key)
    type BitMatrixView (line 234) | struct BitMatrixView {
      method BitMatrixView (line 241) | BitMatrixView(pointer vector, size_type cols) noexcept : m_vector(ve...
      method reference (line 244) | reference operator[](size_type col) noexcept
      method size_type (line 250) | size_type size() const noexcept
    type BitMatrix (line 261) | struct BitMatrix {
      method BitMatrix (line 265) | BitMatrix() : m_rows(0), m_cols(0), m_matrix(nullptr)
      method BitMatrix (line 268) | BitMatrix(size_t rows, size_t cols, T val) : m_rows(rows), m_cols(co...
      method BitMatrix (line 274) | BitMatrix(const BitMatrix& other) : m_rows(other.m_rows), m_cols(oth...
      method BitMatrix (line 280) | BitMatrix(BitMatrix&& other) noexcept : m_rows(0), m_cols(0), m_matr...
      method BitMatrix (line 285) | BitMatrix& operator=(BitMatrix&& other) noexcept
      method BitMatrix (line 291) | BitMatrix& operator=(const BitMatrix& other)
      method swap (line 298) | void swap(BitMatrix& rhs) noexcept
      method rows (line 323) | size_t rows() const noexcept
      method cols (line 328) | size_t cols() const noexcept
    type ShiftedBitMatrix (line 340) | struct ShiftedBitMatrix {
      method ShiftedBitMatrix (line 343) | ShiftedBitMatrix()
      method ShiftedBitMatrix (line 346) | ShiftedBitMatrix(size_t rows, size_t cols, T val) : m_matrix(rows, c...
      method ShiftedBitMatrix (line 349) | ShiftedBitMatrix(const ShiftedBitMatrix& other) : m_matrix(other.m_m...
      method ShiftedBitMatrix (line 352) | ShiftedBitMatrix(ShiftedBitMatrix&& other) noexcept
      method ShiftedBitMatrix (line 357) | ShiftedBitMatrix& operator=(ShiftedBitMatrix&& other) noexcept
      method ShiftedBitMatrix (line 363) | ShiftedBitMatrix& operator=(const ShiftedBitMatrix& other)
      method swap (line 370) | void swap(ShiftedBitMatrix& rhs) noexcept
      method test_bit (line 377) | bool test_bit(size_t row, size_t col, bool default_ = false) const n...
      method set_offset (line 409) | void set_offset(size_t row, ptrdiff_t offset)
    function assume (line 429) | static inline void assume(bool b)
    function CharT (line 441) | CharT* to_begin(CharT* s)
    function to_begin (line 447) | auto to_begin(T& x)
    function CharT (line 454) | CharT* to_end(CharT* s)
    function to_end (line 464) | auto to_end(T& x)
    class Range (line 471) | class Range {
      method Range (line 480) | constexpr Range(Iter first, Iter last) : _first(first), _last(last)
      method Range (line 484) | constexpr Range(T& x) : _first(to_begin(x)), _last(to_end(x))
      method iterator (line 487) | constexpr iterator begin() const noexcept
      method iterator (line 491) | constexpr iterator end() const noexcept
      method reverse_iterator (line 496) | constexpr reverse_iterator rbegin() const noexcept
      method reverse_iterator (line 500) | constexpr reverse_iterator rend() const noexcept
      method size (line 505) | constexpr ptrdiff_t size() const
      method empty (line 509) | constexpr bool empty() const
      method remove_prefix (line 522) | constexpr void remove_prefix(ptrdiff_t n)
      method remove_suffix (line 526) | constexpr void remove_suffix(ptrdiff_t n)
      method Range (line 531) | constexpr Range subseq(ptrdiff_t pos = 0, ptrdiff_t count = std::num...
      method front (line 540) | constexpr decltype(auto) front() const
      method back (line 545) | constexpr decltype(auto) back() const
      method reversed (line 550) | constexpr Range<reverse_iterator> reversed() const
    class SplittedSentenceView (line 1265) | class SplittedSentenceView {
      method SplittedSentenceView (line 1269) | SplittedSentenceView(RangeVec<InputIt> sentence) noexcept(
      method length (line 1277) | size_t length() const
      method empty (line 1282) | bool empty() const
      method word_count (line 1287) | size_t word_count() const
    function T (line 1359) | T bit_mask_lsb(int n)
    function bittest (line 1369) | bool bittest(T a, int bit)
    function shr64 (line 1378) | constexpr uint64_t shr64(uint64_t a, U shift)
    function shl64 (line 1387) | constexpr uint64_t shl64(uint64_t a, U shift)
    function addc64 (line 1392) | constexpr uint64_t addc64(uint64_t a, uint64_t b, uint64_t carryin, ui...
    function T (line 1403) | constexpr T ceil_div(T a, U divisor)
    function popcount (line 1409) | static inline int popcount(uint64_t x)
    function popcount (line 1414) | static inline int popcount(uint32_t x)
    function popcount (line 1419) | static inline int popcount(uint16_t x)
    function popcount (line 1424) | static inline int popcount(uint8_t x)
    function T (line 1439) | constexpr T rotl(T x, unsigned int n)
    function T (line 1460) | constexpr T blsi(T a)
    function T (line 1477) | constexpr T blsr(T x)
    function T (line 1487) | constexpr T blsmsk(T a)
    function countr_zero (line 1493) | static inline int countr_zero(uint32_t x)
    function countr_zero (line 1501) | static inline int countr_zero(uint64_t x)
    function countr_zero (line 1508) | static inline int countr_zero(uint64_t x)
    function countr_zero (line 1518) | static inline int countr_zero(uint32_t x)
    function countr_zero (line 1523) | static inline int countr_zero(uint64_t x)
    function unroll_impl (line 1530) | constexpr void unroll_impl(std::integer_sequence<T, inds...>, F&& f)
    function unroll (line 1536) | constexpr void unroll(F&& f)
    type DecomposedSet (line 1548) | struct DecomposedSet {
      method DecomposedSet (line 1552) | DecomposedSet(SplittedSentenceView<InputIt1> diff_ab, SplittedSenten...
    function NormSim_to_NormDist (line 1566) | static inline double NormSim_to_NormDist(double score_cutoff, double i...
    function result_cutoff (line 1575) | constexpr double result_cutoff(double result, double score_cutoff)
    function norm_distance (line 1581) | constexpr double norm_distance(int64_t dist, int64_t lensum, double sc...
    function score_cutoff_to_distance (line 1590) | static inline int64_t score_cutoff_to_distance(double score_cutoff, in...
    function set_decomposition (line 1620) | DecomposedSet<InputIt1, InputIt2, InputIt1> set_decomposition(Splitted...
    function remove_common_prefix (line 1649) | size_t remove_common_prefix(Range<InputIt1>& s1, Range<InputIt2>& s2)
    function remove_common_suffix (line 1663) | size_t remove_common_suffix(Range<InputIt1>& s1, Range<InputIt2>& s2)
    function StringAffix (line 1677) | StringAffix remove_common_affix(Range<InputIt1>& s1, Range<InputIt2>& s2)
    type is_space_dispatch_tag (line 1683) | struct is_space_dispatch_tag : std::integral_constant<int, 0> {}
    type is_space_dispatch_tag<CharT, typename std::enable_if<sizeof(CharT) == 1>::type> (line 1686) | struct is_space_dispatch_tag<CharT, typename std::enable_if<sizeof(Cha...
    function is_space_impl (line 1693) | bool is_space_impl(const CharT ch, std::integral_constant<int, 0>)
    function is_space_impl (line 1733) | bool is_space_impl(const CharT ch, std::integral_constant<int, 1>)
    function is_space (line 1755) | bool is_space(const CharT ch)
    function sorted_split (line 1761) | SplittedSentenceView<InputIt> sorted_split(InputIt first, InputIt last)
    type NormalizedMetricBase (line 2739) | struct NormalizedMetricBase {
      method normalized_distance (line 2742) | static double normalized_distance(InputIt1 first1, InputIt1 last1, I...
      method normalized_distance (line 2750) | static double normalized_distance(const Sentence1& s1, const Sentenc...
      method normalized_similarity (line 2759) | static double normalized_similarity(InputIt1 first1, InputIt1 last1,...
      method normalized_similarity (line 2767) | static double normalized_similarity(const Sentence1& s1, const Sente...
      method _normalized_distance (line 2776) | static double _normalized_distance(Range<InputIt1> s1, Range<InputIt...
      method _normalized_similarity (line 2790) | static double _normalized_similarity(Range<InputIt1> s1, Range<Input...
      method NormalizedMetricBase (line 2801) | NormalizedMetricBase()
    type DistanceBase (line 2807) | struct DistanceBase : public NormalizedMetricBase<T, Args...> {
      method ResType (line 2810) | static ResType distance(InputIt1 first1, InputIt1 last1, InputIt2 fi...
      method ResType (line 2818) | static ResType distance(const Sentence1& s1, const Sentence2& s2, Ar...
      method ResType (line 2826) | static ResType similarity(InputIt1 first1, InputIt1 last1, InputIt2 ...
      method ResType (line 2834) | static ResType similarity(const Sentence1& s1, const Sentence2& s2, ...
      method ResType (line 2842) | static ResType _similarity(Range<InputIt1> s1, Range<InputIt2> s2, A...
      method DistanceBase (line 2856) | DistanceBase()
    type SimilarityBase (line 2862) | struct SimilarityBase : public NormalizedMetricBase<T, Args...> {
      method ResType (line 2865) | static ResType distance(InputIt1 first1, InputIt1 last1, InputIt2 fi...
      method ResType (line 2873) | static ResType distance(const Sentence1& s1, const Sentence2& s2, Ar...
      method ResType (line 2881) | static ResType similarity(InputIt1 first1, InputIt1 last1, InputIt2 ...
      method ResType (line 2889) | static ResType similarity(const Sentence1& s1, const Sentence2& s2, ...
      method ResType (line 2897) | static ResType _distance(Range<InputIt1> s1, Range<InputIt2> s2, Arg...
      method SimilarityBase (line 2914) | SimilarityBase()
    type CachedNormalizedMetricBase (line 2920) | struct CachedNormalizedMetricBase {
      method normalized_distance (line 2922) | double normalized_distance(InputIt2 first2, InputIt2 last2, double s...
      method normalized_distance (line 2929) | double normalized_distance(const Sentence2& s2, double score_cutoff ...
      method normalized_similarity (line 2935) | double normalized_similarity(InputIt2 first2, InputIt2 last2, double...
      method normalized_similarity (line 2942) | double normalized_similarity(const Sentence2& s2, double score_cutof...
      method _normalized_distance (line 2950) | double _normalized_distance(Range<InputIt2> s2, double score_cutoff,...
      method _normalized_similarity (line 2964) | double _normalized_similarity(Range<InputIt2> s2, double score_cutof...
      method CachedNormalizedMetricBase (line 2973) | CachedNormalizedMetricBase()
    type CachedDistanceBase (line 2979) | struct CachedDistanceBase : public CachedNormalizedMetricBase<T> {
      method ResType (line 2981) | ResType distance(InputIt2 first2, InputIt2 last2,
      method ResType (line 2990) | ResType distance(const Sentence2& s2, ResType score_cutoff = static_...
      method ResType (line 2998) | ResType similarity(InputIt2 first2, InputIt2 last2,
      method ResType (line 3006) | ResType similarity(const Sentence2& s2, ResType score_cutoff = stati...
      method ResType (line 3014) | ResType _similarity(Range<InputIt2> s2, ResType score_cutoff, ResTyp...
      method CachedDistanceBase (line 3028) | CachedDistanceBase()
    type CachedSimilarityBase (line 3034) | struct CachedSimilarityBase : public CachedNormalizedMetricBase<T> {
      method ResType (line 3036) | ResType distance(InputIt2 first2, InputIt2 last2,
      method ResType (line 3044) | ResType distance(const Sentence2& s2, ResType score_cutoff = static_...
      method ResType (line 3051) | ResType similarity(InputIt2 first2, InputIt2 last2,
      method ResType (line 3060) | ResType similarity(const Sentence2& s2, ResType score_cutoff = stati...
      method ResType (line 3069) | ResType _distance(Range<InputIt2> s2, ResType score_cutoff, ResType ...
      method CachedSimilarityBase (line 3084) | CachedSimilarityBase()
    type MultiNormalizedMetricBase (line 3090) | struct MultiNormalizedMetricBase {
      method normalized_distance (line 3092) | void normalized_distance(double* scores, size_t score_count, InputIt...
      method normalized_distance (line 3099) | void normalized_distance(double* scores, size_t score_count, const S...
      method normalized_similarity (line 3106) | void normalized_similarity(double* scores, size_t score_count, Input...
      method normalized_similarity (line 3113) | void normalized_similarity(double* scores, size_t score_count, const...
      method _normalized_distance (line 3121) | void _normalized_distance(double* scores, size_t score_count, Range<...
      method _normalized_similarity (line 3148) | void _normalized_similarity(double* scores, size_t score_count, Rang...
      method MultiNormalizedMetricBase (line 3160) | MultiNormalizedMetricBase()
    type MultiDistanceBase (line 3166) | struct MultiDistanceBase : public MultiNormalizedMetricBase<T> {
      method distance (line 3168) | void distance(ResType* scores, size_t score_count, InputIt2 first2, ...
      method distance (line 3176) | void distance(ResType* scores, size_t score_count, const Sentence2& s2,
      method similarity (line 3184) | void similarity(ResType* scores, size_t score_count, InputIt2 first2...
      method similarity (line 3191) | void similarity(ResType* scores, size_t score_count, const Sentence2...
      method _similarity (line 3199) | void _similarity(ResType* scores, size_t score_count, Range<InputIt2...
      method MultiDistanceBase (line 3211) | MultiDistanceBase()
    type MultiSimilarityBase (line 3217) | struct MultiSimilarityBase : public MultiNormalizedMetricBase<T> {
      method distance (line 3219) | void distance(ResType* scores, size_t score_count, InputIt2 first2, ...
      method distance (line 3226) | void distance(ResType* scores, size_t score_count, const Sentence2& s2,
      method similarity (line 3233) | void similarity(ResType* scores, size_t score_count, InputIt2 first2...
      method similarity (line 3241) | void similarity(ResType* scores, size_t score_count, const Sentence2...
      method _distance (line 3250) | void _distance(ResType* scores, size_t score_count, Range<InputIt2> ...
      method MultiSimilarityBase (line 3266) | MultiSimilarityBase()
    type RowId (line 3276) | struct RowId {
    function damerau_levenshtein_distance_zhao (line 3295) | int64_t damerau_levenshtein_distance_zhao(Range<InputIt1> s1, Range<In...
    function damerau_levenshtein_distance (line 3358) | int64_t damerau_levenshtein_distance(Range<InputIt1> s1, Range<InputIt...
    class DamerauLevenshtein (line 3375) | class DamerauLevenshtein
      method maximum (line 3381) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2> s2)
      method _distance (line 3387) | static int64_t _distance(Range<InputIt1> s1, Range<InputIt2> s2, int...
    class Hamming (line 3550) | class Hamming : public DistanceBase<Hamming, int64_t, 0, std::numeric_...
      method maximum (line 3555) | static int64_t maximum(Range<InputIt1> s1, Range<InputIt2>)
      method _distance (line 3561) | static
Copy disabled (too large) Download .json
Condensed preview — 212 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (12,876K chars).
[
  {
    "path": ".gitattributes",
    "chars": 2518,
    "preview": "###############################################################################\n# Set default behavior to automatically "
  },
  {
    "path": ".github/workflows/build_and_release.yml",
    "chars": 6956,
    "preview": "\nname: Build Release\n\non:\n  push:\n    tags:\n      - \"v*\"\n  pull_request:\n    branches:\n      - \"*\"\n\n  workflow_dispatch:"
  },
  {
    "path": ".github/workflows/preview_release.yml",
    "chars": 7070,
    "preview": "\nname: Preview Release\n\non:\n  push:\n    tags:\n      - \"v*\"\n  pull_request:\n    branches:\n      - \"*\"\n\n  workflow_dispatc"
  },
  {
    "path": ".gitignore",
    "chars": 6393,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": ".gitmodules",
    "chars": 191,
    "preview": "[submodule \"mupdf\"]\n\tpath = mupdf\n\turl = https://github.com/ArtifexSoftware/mupdf\n    ignore = dirty\n[submodule \"zlib\"]\n"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 5874,
    "preview": "cmake_minimum_required(VERSION 3.16)\nproject(sioyek VERSION 2.0.0 LANGUAGES C CXX)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 8400,
    "preview": "# Sioyek\n\nSioyek is a PDF viewer with a focus on textbooks and research papers.\n\n# Development Branch FAQ\n\n## Q: There a"
  },
  {
    "path": "android/AndroidManifest.xml",
    "chars": 4096,
    "preview": "<?xml version=\"1.0\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"org.qtproject.exampl"
  },
  {
    "path": "android/build.gradle",
    "chars": 2748,
    "preview": "buildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath 'co"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 202,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "android/gradle.properties",
    "chars": 739,
    "preview": "# Project-wide Gradle settings.\n# For more details on how to configure your build environment visit\n# http://www.gradle."
  },
  {
    "path": "android/gradlew",
    "chars": 8069,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "android/gradlew.bat",
    "chars": 2696,
    "preview": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "android/res/values/libs.xml",
    "chars": 727,
    "preview": "<?xml version='1.0' encoding='utf-8'?>\n<resources>\n    <!-- DO NOT EDIT THIS: This file is populated automatically by th"
  },
  {
    "path": "android/src/info/sioyek/sioyek/SioyekActivity.java",
    "chars": 17122,
    "preview": "\npackage info.sioyek.sioyek;\n\nimport org.qtproject.qt.android.QtNative;\n\nimport org.qtproject.qt.android.bindings.QtActi"
  },
  {
    "path": "android/src/info/sioyek/sioyek/TextToSpeechService.java",
    "chars": 10801,
    "preview": "package info.sioyek.sioyek;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport "
  },
  {
    "path": "build_and_release.sh",
    "chars": 1543,
    "preview": "#!/usr/bin/env bash\nset -e\n\nif [ -z ${MAKE_PARALLEL+x} ]; then export MAKE_PARALLEL=$(nproc); else echo \"MAKE_PARALLEL d"
  },
  {
    "path": "build_linux.sh",
    "chars": 808,
    "preview": "#!/usr/bin/env bash\nset -e\n\n# Compile mupdf\ncd mupdf\nmake USE_SYSTEM_HARFBUZZ=yes -j$(nproc)\ncd ..\n\n# set QMAKE if not a"
  },
  {
    "path": "build_mac.sh",
    "chars": 2525,
    "preview": "#!/usr/bin/env bash\nset -e\n# prerequisite: brew install qt@5 freeglut mesa harfbuzz\n\n#sys_glut_clfags=`pkg-config --cfla"
  },
  {
    "path": "build_windows.bat",
    "chars": 1495,
    "preview": "cd mupdf\\platform\\win32\\\nmsbuild -maxcpucount mupdf.sln /m /property:Configuration=Debug /property:MultiProcessorCompila"
  },
  {
    "path": "data/command_docs.json",
    "chars": 31065,
    "preview": "{\"goto_begining\": \"<div class=\\\"document\\\" id=\\\"goto-begining\\\">\\n<h1 class=\\\"title\\\"><code>goto_begining</code></h1>\\n<"
  },
  {
    "path": "data/config_docs.json",
    "chars": 42541,
    "preview": "{\"background_color\": \"<div class=\\\"document\\\" id=\\\"background-color\\\">\\n<h1 class=\\\"title\\\"><code>background_color</code"
  },
  {
    "path": "delete_build.sh",
    "chars": 52,
    "preview": "rm -r Sioyek*\nrm sioyek\nrm *.o\nrm -r sioyek-release\n"
  },
  {
    "path": "deploy.py",
    "chars": 581,
    "preview": "import os\n\nif __name__ == '__main__':\n\twith open('E:\\\\labs\\hexomancer-sioyek\\\\sioyek\\\\last_version.txt', 'r') as infile:"
  },
  {
    "path": "fzf/fzf.c",
    "chars": 35422,
    "preview": "#include \"fzf.h\"\n\n#include <string.h>\n#include <ctype.h>\n#include <stdlib.h>\n\n// TODO(conni2461): UNICODE HEADER\n#define"
  },
  {
    "path": "fzf/fzf.h",
    "chars": 3140,
    "preview": "#ifndef FZF_H_\n#define FZF_H_\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <stddef.h>\n\ntypedef struct {\n  int16_t "
  },
  {
    "path": "last_version.txt",
    "chars": 3,
    "preview": "435"
  },
  {
    "path": "linuxdeploy_build_and_release.sh",
    "chars": 2128,
    "preview": "#!/usr/bin/env bash\nset -e\n\nif [ -z ${MAKE_PARALLEL+x} ]; then export MAKE_PARALLEL=$(nproc); else echo \"MAKE_PARALLEL d"
  },
  {
    "path": "pdf_viewer/.gitignore",
    "chars": 153,
    "preview": "data/*\nx64/*\nrelease/*\nDebug/*\n.vscode/*\nGenerated\n*.pdf\n*.pdb\n*.db\n*.aps\n.qmake.stash\nlast_document_path.txt\nimgui.ini\n"
  },
  {
    "path": "pdf_viewer/OpenWithApplication.cpp",
    "chars": 293,
    "preview": "#include <OpenWithApplication.h>\n\nbool OpenWithApplication::event(QEvent* event) {\n    if (event->type() == QEvent::File"
  },
  {
    "path": "pdf_viewer/OpenWithApplication.h",
    "chars": 403,
    "preview": "#ifndef OPEN_WITH_APP_H\n#define OPEN_WITH_APP_H\n\n#include <QApplication>\n#include <QFileOpenEvent>\n\nclass OpenWithApplic"
  },
  {
    "path": "pdf_viewer/RunGuard.cpp",
    "chars": 4334,
    "preview": "#ifndef SIOYEK_ANDROID\n\n#include \"RunGuard.h\"\n\n#include <QCryptographicHash>\n#include <QtCore>\n#include <QTimer>\n\nnamesp"
  },
  {
    "path": "pdf_viewer/RunGuard.h",
    "chars": 2176,
    "preview": "#ifndef SIOYEK_ANDROID\n#ifndef SINGLE_INSTANCE_GUARD_H\n#define SINGLE_INSTANCE_GUARD_H\n\n#include <QSharedMemory>\n\n#inclu"
  },
  {
    "path": "pdf_viewer/book.cpp",
    "chars": 12286,
    "preview": "#include \"book.h\"\n#include \"utils.h\"\n#include \"document.h\"\n\nextern float BOOKMARK_RECT_SIZE;\n\nbool operator==(const Docu"
  },
  {
    "path": "pdf_viewer/book.h",
    "chars": 9435,
    "preview": "#pragma once\n\n#include <vector>\n#include <string>\n#include <variant>\n#include <mupdf/fitz.h>\n//#include <gl/glew.h>\n#inc"
  },
  {
    "path": "pdf_viewer/checksum.cpp",
    "chars": 2463,
    "preview": "#include <qfile.h>\n\n#include \"checksum.h\"\n\nstd::string compute_checksum(const QString& file_name, QCryptographicHash::Al"
  },
  {
    "path": "pdf_viewer/checksum.h",
    "chars": 807,
    "preview": "#pragma once\n#include <string>\n#include <unordered_map>\n#include <qcryptographichash.h>\n#include <qstring.h>\n#include <q"
  },
  {
    "path": "pdf_viewer/config.cpp",
    "chars": 65907,
    "preview": "#include \"config.h\"\n#include \"utils.h\"\n#include <cassert>\n#include <map>\n#include <qdir.h>\n//#include <ui.h>\n\nint FONT_S"
  },
  {
    "path": "pdf_viewer/config.h",
    "chars": 3853,
    "preview": "#pragma once\n\n#include <vector>\n#include <string>\n#include <sstream>\n#include <fstream>\n#include <iostream>\n#include <op"
  },
  {
    "path": "pdf_viewer/coordinates.cpp",
    "chars": 7785,
    "preview": "#include \"coordinates.h\"\n#include \"utils.h\"\n#include \"document.h\"\n#include \"document_view.h\"\n\nbool rects_intersect(fz_re"
  },
  {
    "path": "pdf_viewer/coordinates.h",
    "chars": 8989,
    "preview": "#pragma once\n\n#include <qpoint.h>\n#include <mupdf/fitz.h>\n#include <qopengl.h>\n#include <algorithm>\n#include <cmath>\n\ncl"
  },
  {
    "path": "pdf_viewer/database.cpp",
    "chars": 75136,
    "preview": "#include \"database.h\"\n#include <sstream>\n#include <cassert>\n#include <utility>\n#include <set>\n#include <optional>\n#inclu"
  },
  {
    "path": "pdf_viewer/database.h",
    "chars": 7375,
    "preview": "#pragma once\n\n#include <iostream>\n#include <vector>\n#include <iostream>\n#include <string>\n#include \"sqlite3.h\"\n#include "
  },
  {
    "path": "pdf_viewer/diff/keys.config",
    "chars": 7309,
    "preview": "\n# you can edit this file to change keybindings lines that start with '#' are comments\n# the syntax is pretty simple. So"
  },
  {
    "path": "pdf_viewer/diff/keys2.config",
    "chars": 7589,
    "preview": "\n# you can edit this file to change keybindings lines that start with '#' are comments\n# the syntax is pretty simple. So"
  },
  {
    "path": "pdf_viewer/document.cpp",
    "chars": 152785,
    "preview": "#include \"document.h\"\n#include <algorithm>\n#include <thread>\n#include <cmath>\n#include \"coordinates.h\"\n#include \"utf8.h\""
  },
  {
    "path": "pdf_viewer/document.h",
    "chars": 23597,
    "preview": "#pragma once\n#include <vector>\n#include <string>\n#include <optional>\n#include <iostream>\n#include <thread>\n#include <mut"
  },
  {
    "path": "pdf_viewer/document_view.cpp",
    "chars": 76745,
    "preview": "#include <cmath>\n\n#include \"document_view.h\"\n#include \"checksum.h\"\n#include \"database.h\"\n#include \"document.h\"\n#include "
  },
  {
    "path": "pdf_viewer/document_view.h",
    "chars": 12634,
    "preview": "#pragma once\n\n#include <vector>\n#include <string>\n#include <assert.h>\n#include <utility>\n#include <algorithm>\n#include <"
  },
  {
    "path": "pdf_viewer/fts_fuzzy_match.h",
    "chars": 8496,
    "preview": "// LICENSE\n//\n//   This software is dual-licensed to the public domain and under the following\n//   license: you are gra"
  },
  {
    "path": "pdf_viewer/input.cpp",
    "chars": 261041,
    "preview": "#include <QtCore/qcontainerfwd.h>\n#include <cstdlib>\n#include <deque>\n#include <iostream>\n#include <vector>\n#include <st"
  },
  {
    "path": "pdf_viewer/input.h",
    "chars": 7463,
    "preview": "#pragma once\n\n#include <vector>\n#include <string>\n#include <memory>\n#include <optional>\n#include <unordered_map>\n#includ"
  },
  {
    "path": "pdf_viewer/keys.config",
    "chars": 13824,
    "preview": "\n# you can edit this file to change keybindings lines that start with '#' are comments\n# the syntax is pretty simple. So"
  },
  {
    "path": "pdf_viewer/keys_old.config",
    "chars": 14642,
    "preview": "\n# you can edit this file to change keybindings lines that start with '#' are comments\n# the syntax is pretty simple. So"
  },
  {
    "path": "pdf_viewer/keys_user.config",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pdf_viewer/macos_specific.mm",
    "chars": 3480,
    "preview": "#include <AppKit/AppKit.h>\n#include <QWidget>\n#import <Cocoa/Cocoa.h>\n\nextern \"C\" void showLookupForString(WId winId, co"
  },
  {
    "path": "pdf_viewer/main.cpp",
    "chars": 32561,
    "preview": "#include <iostream>\n#include <vector>\n#include <string>\n#include <fstream>\n#include <mutex>\n#include <optional>\n#include"
  },
  {
    "path": "pdf_viewer/main_widget.cpp",
    "chars": 428555,
    "preview": "// deduplicate database code\n// make sure jsons exported by previous sioyek versions can be imported\n// maybe: use a be"
  },
  {
    "path": "pdf_viewer/main_widget.h",
    "chars": 45848,
    "preview": "#pragma once\n\n#ifndef MAIN_WIDGET_DEFINE\n#define MAIN_WIDGET_DEFINE\n\n#include <string>\n#include <memory>\n#include <vecto"
  },
  {
    "path": "pdf_viewer/mysortfilterproxymodel.cpp",
    "chars": 5440,
    "preview": "#include \"mysortfilterproxymodel.h\"\n#include <string>\n\n#include \"rapidfuzz_amalgamated.hpp\"\n\nbool MySortFilterProxyModel"
  },
  {
    "path": "pdf_viewer/mysortfilterproxymodel.h",
    "chars": 1235,
    "preview": "#pragma once\n#include <QString>\n#include <qsortfilterproxymodel.h>\n#include <map>\n#include <qmap.h>\n\nextern \"C\" {\n    #i"
  },
  {
    "path": "pdf_viewer/new_file_checker.cpp",
    "chars": 2533,
    "preview": "#include \"new_file_checker.h\"\n#include \"main_widget.h\"\n\nextern std::wstring PAPERS_FOLDER_PATH;\n\nvoid NewFileChecker::ge"
  },
  {
    "path": "pdf_viewer/new_file_checker.h",
    "chars": 574,
    "preview": "#pragma once\n\n#include <vector>\n#include <qstring.h>\n#include <qfilesystemwatcher.h>\n#include <qdir.h>\n\nclass MainWidget"
  },
  {
    "path": "pdf_viewer/path.cpp",
    "chars": 3283,
    "preview": "#include <qdir.h>\n#include <qfileinfo.h>\n#include \"path.h\"\n#include \"utils.h\"\n\nPath::Path() : Path(L\"\")\n{\n}\n\nPath::Path("
  },
  {
    "path": "pdf_viewer/path.h",
    "chars": 722,
    "preview": "#pragma once\n#include <string>\n#include <optional> \n\n\nclass Path {\nprivate:\n    std::wstring canon_path;\n\npublic:\n    Pa"
  },
  {
    "path": "pdf_viewer/pdf_renderer.cpp",
    "chars": 28210,
    "preview": "#include \"pdf_renderer.h\"\n#include \"utils.h\"\n#include <qdatetime.h>\n\nextern bool LINEAR_TEXTURE_FILTERING;\nextern int NU"
  },
  {
    "path": "pdf_viewer/pdf_renderer.h",
    "chars": 4722,
    "preview": "#pragma once\n\n#include <vector>\n#include <string>\n#include <mupdf/fitz.h>\n#include <mutex>\n#include <variant>\n#include <"
  },
  {
    "path": "pdf_viewer/pdf_view_opengl_widget.cpp",
    "chars": 150389,
    "preview": "#include <cmath>\n\n#include <qcolor.h>\n#include <QMouseEvent>\n#include <qapplication.h>\n#include <qdatetime.h>\n#include <"
  },
  {
    "path": "pdf_viewer/pdf_view_opengl_widget.h",
    "chars": 14429,
    "preview": "#pragma once\n\n#include <vector>\n#include <string>\n#include <mutex>\n#include <optional>\n#include <utility>\n#include <arra"
  },
  {
    "path": "pdf_viewer/prefs.config",
    "chars": 10383,
    "preview": "# For more information see the documentation at https://sioyek-documentation.readthedocs.io/\n\n# (can be 0 or 1) if set, "
  },
  {
    "path": "pdf_viewer/prefs_user.config",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pdf_viewer/qml/MyColorPicker.qml",
    "chars": 1073,
    "preview": "import QtQuick 2.2\nimport QtQuick.Controls 2.15\n//import QtQuick.Dialogs 1.0\n//import QtQuick.Dialogs 1.3\nimport Qt.labs"
  },
  {
    "path": "pdf_viewer/rapidfuzz_amalgamated.hpp",
    "chars": 333733,
    "preview": "//  Licensed under the MIT License <http://opensource.org/licenses/MIT>.\n//  SPDX-License-Identifier: MIT\n//  RapidFuzz "
  },
  {
    "path": "pdf_viewer/shaders/compiled_drawing.vertex",
    "chars": 348,
    "preview": "layout (location=0) in vec2 vertex_pos;\nlayout (location=1) in int type_index;\n\nuniform vec2 offset;\nuniform vec2 scale;"
  },
  {
    "path": "pdf_viewer/shaders/compiled_line.fragment",
    "chars": 113,
    "preview": " precision mediump float;\n\n out vec4 color;\n in vec3 type_color;\n\nvoid main(){\n    color = vec4(type_color, 1);\n}"
  },
  {
    "path": "pdf_viewer/shaders/custom_colors.fragment",
    "chars": 389,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nuniform mat4 transform_matrix;\n\nuniform samp"
  },
  {
    "path": "pdf_viewer/shaders/dark_mode.fragment",
    "chars": 1317,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\nuniform sampler2D pdf_texture;\n\nuniform float"
  },
  {
    "path": "pdf_viewer/shaders/debug.fragment",
    "chars": 128,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nvoid main(){\n    color = vec4(1.0, 1.0, 0.0,"
  },
  {
    "path": "pdf_viewer/shaders/dot.fragment",
    "chars": 579,
    "preview": "#extension GL_OES_standard_derivatives : enable\n\nprecision mediump float;\n\nin vec2 uv;\nin vec4 type_color;\nout vec4 colo"
  },
  {
    "path": "pdf_viewer/shaders/dot.vertex",
    "chars": 436,
    "preview": "layout (location=0) in vec2 vertex_pos;\nlayout (location=1) in vec2 vertex_uv;\nlayout (location=2) in int type_index;\n\nu"
  },
  {
    "path": "pdf_viewer/shaders/highlight.fragment",
    "chars": 188,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nuniform vec3 highlight_color;\nuniform float "
  },
  {
    "path": "pdf_viewer/shaders/line.fragment",
    "chars": 109,
    "preview": " precision mediump float;\n\n out vec4 color;\n uniform vec4 line_color;\n\nvoid main(){\n    color = line_color;\n}"
  },
  {
    "path": "pdf_viewer/shaders/line.vertex",
    "chars": 101,
    "preview": "layout (location=0) in vec2 vertex_pos;\n\nvoid main(){\n    gl_Position = vec4(vertex_pos, 0.0, 1.0);\n}"
  },
  {
    "path": "pdf_viewer/shaders/separator.fragment",
    "chars": 163,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nuniform vec3 background_color;\n\nvoid main(){"
  },
  {
    "path": "pdf_viewer/shaders/simple.fragment",
    "chars": 175,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\nuniform sampler2D pdf_texture;\n\nvoid main(){\n"
  },
  {
    "path": "pdf_viewer/shaders/simple.vertex",
    "chars": 227,
    "preview": "out vec2 screen_pos;\nout vec2 uvs;\nlayout (location=0) in vec2 vertex_pos;\nlayout (location=1) in vec2 vertex_uvs;\n\nvoid"
  },
  {
    "path": "pdf_viewer/shaders/simple_transparent.fragment",
    "chars": 160,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\nuniform sampler2D pdf_texture;\n\nvoid main(){\n"
  },
  {
    "path": "pdf_viewer/shaders/stencil.fragment",
    "chars": 108,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\n\nvoid main(){\n    color = vec4(0, 0, 0, 0);\n}\n"
  },
  {
    "path": "pdf_viewer/shaders/stencil.vertex",
    "chars": 152,
    "preview": "out vec2 screen_pos;\nlayout (location=0) in vec2 vertex_pos;\n\nvoid main(){\n    screen_pos = vertex_pos;\n    gl_Position "
  },
  {
    "path": "pdf_viewer/shaders/undendered_page.fragment",
    "chars": 284,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nvoid main(){\n    int x = (int)(uvs.x / 0.1);"
  },
  {
    "path": "pdf_viewer/shaders/unrendered_page.fragment",
    "chars": 280,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nvoid main(){\n    int x = int(uvs.x / 0.1);\n "
  },
  {
    "path": "pdf_viewer/shaders/vertical_bar.fragment",
    "chars": 814,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nuniform vec4 line_color;\nuniform float time;"
  },
  {
    "path": "pdf_viewer/shaders/vertical_bar_dark.fragment",
    "chars": 188,
    "preview": "precision mediump float;\n\nout vec4 color;\nin vec2 screen_pos;\nin vec2 uvs;\n\nuniform vec4 line_color;\nuniform float time;"
  },
  {
    "path": "pdf_viewer/shell.c",
    "chars": 591565,
    "preview": "/* DO NOT EDIT!\n** This file is automatically generated by the script in the canonical\n** SQLite source tree at tool/mks"
  },
  {
    "path": "pdf_viewer/sqlite3.c",
    "chars": 8074669,
    "preview": "/******************************************************************************\n** This file is an amalgamation of many "
  },
  {
    "path": "pdf_viewer/sqlite3.h",
    "chars": 576161,
    "preview": "/*\n** 2001-09-15\n**\n** The author disclaims copyright to this source code.  In place of\n** a legal notice, here is a ble"
  },
  {
    "path": "pdf_viewer/sqlite3ext.h",
    "chars": 34802,
    "preview": "/*\n** 2006 June 7\n**\n** The author disclaims copyright to this source code.  In place of\n** a legal notice, here is a bl"
  },
  {
    "path": "pdf_viewer/synctex/synctex_parser.c",
    "chars": 340979,
    "preview": "/*\n Copyright (c) 2008-2017 jerome DOT laurens AT u-bourgogne DOT fr\n \n This file is part of the __SyncTeX__ package.\n \n"
  },
  {
    "path": "pdf_viewer/synctex/synctex_parser.h",
    "chars": 19251,
    "preview": "/*\n Copyright (c) 2008-2017 jerome DOT laurens AT u-bourgogne DOT fr\n \n This file is part of the __SyncTeX__ package.\n \n"
  },
  {
    "path": "pdf_viewer/synctex/synctex_parser_advanced.h",
    "chars": 20535,
    "preview": "/*\n Copyright (c) 2008-2017 jerome DOT laurens AT u-bourgogne DOT fr\n \n This file is part of the __SyncTeX__ package.\n \n"
  },
  {
    "path": "pdf_viewer/synctex/synctex_parser_local.h",
    "chars": 1771,
    "preview": "/* \n Copyright (c) 2008, 2009, 2010 , 2011 jerome DOT laurens AT u-bourgogne DOT fr\n \n This file is part of the SyncTeX "
  },
  {
    "path": "pdf_viewer/synctex/synctex_parser_utils.c",
    "chars": 19528,
    "preview": "/* \n Copyright (c) 2008-2017 jerome DOT laurens AT u-bourgogne DOT fr\n \n This file is part of the __SyncTeX__ package.\n "
  },
  {
    "path": "pdf_viewer/synctex/synctex_parser_utils.h",
    "chars": 6127,
    "preview": "/* \n Copyright (c) 2008-2017 jerome DOT laurens AT u-bourgogne DOT fr\n \n This file is part of the __SyncTeX__ package.\n "
  },
  {
    "path": "pdf_viewer/synctex/synctex_version.h",
    "chars": 2072,
    "preview": "/*\nCopyright (c) 2008-2017 jerome DOT laurens AT u-bourgogne DOT fr\n\nThis file is part of the __SyncTeX__ package.\n\n[//]"
  },
  {
    "path": "pdf_viewer/touchui/TouchAudioButtons.cpp",
    "chars": 2716,
    "preview": "#include \"touchui/TouchAudioButtons.h\"\n\n\nTouchAudioButtons::TouchAudioButtons(QWidget* parent) : QWidget(parent) {\n\n    "
  },
  {
    "path": "pdf_viewer/touchui/TouchAudioButtons.h",
    "chars": 844,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchAudio"
  },
  {
    "path": "pdf_viewer/touchui/TouchAudioButtons.qml",
    "chars": 6098,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n\nItem{\n\n    signal playButtonClicked"
  },
  {
    "path": "pdf_viewer/touchui/TouchButtonGroup.qml",
    "chars": 7448,
    "preview": "\n\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.1\n\n//import com.myself 1.0\n\nRowLayout{\n\n    c"
  },
  {
    "path": "pdf_viewer/touchui/TouchCheckbox.cpp",
    "chars": 1297,
    "preview": "#include \"touchui/TouchCheckbox.h\"\n\n\nTouchCheckbox::TouchCheckbox(QString name, bool initial_value, QWidget* parent) : Q"
  },
  {
    "path": "pdf_viewer/touchui/TouchCheckbox.h",
    "chars": 493,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchCheck"
  },
  {
    "path": "pdf_viewer/touchui/TouchCheckbox.qml",
    "chars": 1104,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\n\n\nRectangle {\n    color: \"#444\"\n    id: root\n    radius: 10\n\n    signa"
  },
  {
    "path": "pdf_viewer/touchui/TouchConfigMenu.cpp",
    "chars": 6272,
    "preview": "#include \"touchui/TouchConfigMenu.h\"\n#include <QVariant>\n#include \"ui.h\"\n#include \"main_widget.h\"\n\n\nTouchConfigMenu::Tou"
  },
  {
    "path": "pdf_viewer/touchui/TouchConfigMenu.h",
    "chars": 1643,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n#include <QStringL"
  },
  {
    "path": "pdf_viewer/touchui/TouchConfigMenu.qml",
    "chars": 13175,
    "preview": "import QtQuick 2.2\nimport QtQuick.Controls 2.15\nimport Qt.labs.platform 1.1\n\n// Row{\n\n//     TextEdit{\n//         id: fi"
  },
  {
    "path": "pdf_viewer/touchui/TouchCopyOptions.cpp",
    "chars": 2577,
    "preview": "#include \"touchui/TouchCopyOptions.h\"\n\n\nTouchCopyOptions::TouchCopyOptions(QWidget* parent) : QWidget(parent) {\n\n    set"
  },
  {
    "path": "pdf_viewer/touchui/TouchCopyOptions.h",
    "chars": 776,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchCopyO"
  },
  {
    "path": "pdf_viewer/touchui/TouchCopyOptions.qml",
    "chars": 1485,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.1\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n//import "
  },
  {
    "path": "pdf_viewer/touchui/TouchDeleteButton.cpp",
    "chars": 909,
    "preview": "#include \"touchui/TouchDeleteButton.h\"\n\n\nTouchDeleteButton::TouchDeleteButton(QWidget* parent) : QWidget(parent) {\n\n    "
  },
  {
    "path": "pdf_viewer/touchui/TouchDeleteButton.h",
    "chars": 409,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchDelet"
  },
  {
    "path": "pdf_viewer/touchui/TouchDeleteButton.qml",
    "chars": 324,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n\nTouchButtonGroup{\n\n    signal delet"
  },
  {
    "path": "pdf_viewer/touchui/TouchDrawControls.cpp",
    "chars": 4730,
    "preview": "#include \"touchui/TouchDrawControls.h\"\n#include \"utils.h\"\n\nextern float HIGHLIGHT_COLORS[26 * 3];\n\nTouchDrawControls::To"
  },
  {
    "path": "pdf_viewer/touchui/TouchDrawControls.h",
    "chars": 1261,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchDrawC"
  },
  {
    "path": "pdf_viewer/touchui/TouchDrawControls.qml",
    "chars": 6137,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n\nRectangle{\n    signal exitDrawMode"
  },
  {
    "path": "pdf_viewer/touchui/TouchGenericButtons.cpp",
    "chars": 2048,
    "preview": "#include \"touchui/TouchGenericButtons.h\"\n#include <qstringlistmodel.h>\n\n\nTouchGenericButtons::TouchGenericButtons(std::v"
  },
  {
    "path": "pdf_viewer/touchui/TouchGenericButtons.h",
    "chars": 607,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchGener"
  },
  {
    "path": "pdf_viewer/touchui/TouchGenericButtons.qml",
    "chars": 360,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n\nTouchButtonGroup{\n\n    signal gene"
  },
  {
    "path": "pdf_viewer/touchui/TouchHighlightButtons.cpp",
    "chars": 2648,
    "preview": "#include \"touchui/TouchHighlightButtons.h\"\n#include \"utils.h\"\n\nextern float HIGHLIGHT_COLORS[26 * 3];\n\nTouchHighlightBut"
  },
  {
    "path": "pdf_viewer/touchui/TouchHighlightButtons.h",
    "chars": 591,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchHighl"
  },
  {
    "path": "pdf_viewer/touchui/TouchHighlightButtons.qml",
    "chars": 1725,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n\nRectangle{\n    signal deleteButton"
  },
  {
    "path": "pdf_viewer/touchui/TouchListView.cpp",
    "chars": 3904,
    "preview": "#include \"touchui/TouchListView.h\"\n#include <QVariant>\n#include \"ui.h\"\n\n#include \"mysortfilterproxymodel.h\"\n\nvoid TouchL"
  },
  {
    "path": "pdf_viewer/touchui/TouchListView.h",
    "chars": 1263,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n#include <QStringL"
  },
  {
    "path": "pdf_viewer/touchui/TouchListView.qml",
    "chars": 8009,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\n\nRectangle {\n\n//    width: 250\n//    height: 400\n    id: rootitem\n    "
  },
  {
    "path": "pdf_viewer/touchui/TouchMacroEditor.cpp",
    "chars": 1871,
    "preview": "#include \"touchui/TouchMacroEditor.h\"\n#include \"utils.h\"\n#include <qstandarditemmodel.h>\n#include <qsortfilterproxymodel"
  },
  {
    "path": "pdf_viewer/touchui/TouchMacroEditor.h",
    "chars": 532,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass MainWidget"
  },
  {
    "path": "pdf_viewer/touchui/TouchMacroEditor.qml",
    "chars": 14197,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\nRectangle {\n    color: \"#444\"\n    ra"
  },
  {
    "path": "pdf_viewer/touchui/TouchMainMenu.cpp",
    "chars": 7794,
    "preview": "#include \"touchui/TouchMainMenu.h\"\n#include \"qqmlengine.h\"\n\n\nTouchMainMenu::TouchMainMenu(bool fit_mode, bool portaling,"
  },
  {
    "path": "pdf_viewer/touchui/TouchMainMenu.h",
    "chars": 2017,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchMainM"
  },
  {
    "path": "pdf_viewer/touchui/TouchMainMenu.qml",
    "chars": 11036,
    "preview": "import QtQuick 2.15\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.1\nimport QtQuick.Controls.Material\n\nimport \"qr"
  },
  {
    "path": "pdf_viewer/touchui/TouchMarkSelector.cpp",
    "chars": 1148,
    "preview": "#include \"touchui/TouchMarkSelector.h\"\n\n\nTouchMarkSelector::TouchMarkSelector(QWidget* parent) : QWidget(parent) {\n\n    "
  },
  {
    "path": "pdf_viewer/touchui/TouchMarkSelector.h",
    "chars": 440,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchMarkS"
  },
  {
    "path": "pdf_viewer/touchui/TouchMarkSelector.qml",
    "chars": 428,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n\n// Rectangle{\n//     color: \"black\""
  },
  {
    "path": "pdf_viewer/touchui/TouchPageSelector.cpp",
    "chars": 1238,
    "preview": "#include \"touchui/TouchPageSelector.h\"\n\n\nTouchPageSelector::TouchPageSelector(int from, int to, int initial_value, QWidg"
  },
  {
    "path": "pdf_viewer/touchui/TouchPageSelector.h",
    "chars": 456,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchPageS"
  },
  {
    "path": "pdf_viewer/touchui/TouchPageSelector.qml",
    "chars": 3238,
    "preview": "\nimport QtQuick 2.15\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.1\nimport QtQuick.Controls.Material\n\nItem{\n   "
  },
  {
    "path": "pdf_viewer/touchui/TouchRangeSelectUI.cpp",
    "chars": 1793,
    "preview": "#include \"touchui/TouchRangeSelectUI.h\"\n\n\nTouchRangeSelectUI::TouchRangeSelectUI(float initial_top,\n    float initial_bo"
  },
  {
    "path": "pdf_viewer/touchui/TouchRangeSelectUI.h",
    "chars": 541,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchRange"
  },
  {
    "path": "pdf_viewer/touchui/TouchRangeSelectUI.qml",
    "chars": 5358,
    "preview": "\nimport QtQuick 2.15\nimport QtQuick.Controls 2.0\n\nimport \"qrc:/pdf_viewer/touchui\"\n\nItem {\n    id: root\n\n    signal conf"
  },
  {
    "path": "pdf_viewer/touchui/TouchRectangleSelectUI.cpp",
    "chars": 1788,
    "preview": "#include \"touchui/TouchRectangleSelectUI.h\"\n\n\nTouchRectangleSelectUI::TouchRectangleSelectUI(bool initial_enabled,\n    f"
  },
  {
    "path": "pdf_viewer/touchui/TouchRectangleSelectUI.h",
    "chars": 598,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchRecta"
  },
  {
    "path": "pdf_viewer/touchui/TouchRectangleSelectUI.qml",
    "chars": 14588,
    "preview": "\nimport QtQuick 2.15\nimport QtQuick.Controls 2.0\n\nimport \"qrc:/pdf_viewer/touchui\"\n\nItem{\n//    color: \"white\"\n    id: r"
  },
  {
    "path": "pdf_viewer/touchui/TouchSearchButtons.cpp",
    "chars": 1581,
    "preview": "#include \"touchui/TouchSearchButtons.h\"\n\n\nTouchSearchButtons::TouchSearchButtons(QWidget* parent) : QWidget(parent) {\n\n "
  },
  {
    "path": "pdf_viewer/touchui/TouchSearchButtons.h",
    "chars": 515,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchSearc"
  },
  {
    "path": "pdf_viewer/touchui/TouchSearchButtons.qml",
    "chars": 615,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\n\nTouchButtonGroup{\n\n    signal prevB"
  },
  {
    "path": "pdf_viewer/touchui/TouchSettings.cpp",
    "chars": 8579,
    "preview": "#include \"touchui/TouchSettings.h\"\n#include \"touchui/TouchConfigMenu.h\"\n#include \"main_widget.h\"\n#include \"config.h\"\n#in"
  },
  {
    "path": "pdf_viewer/touchui/TouchSettings.h",
    "chars": 1125,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\nclass MainWidget;"
  },
  {
    "path": "pdf_viewer/touchui/TouchSettings.qml",
    "chars": 11931,
    "preview": "import QtQuick 2.15\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.1\nimport QtQuick.Controls.Material\nimport Qt.l"
  },
  {
    "path": "pdf_viewer/touchui/TouchSlider.cpp",
    "chars": 1348,
    "preview": "#include \"touchui/TouchSlider.h\"\n\n\nTouchSlider::TouchSlider(int from, int to, int initial_value, QWidget* parent) : QWid"
  },
  {
    "path": "pdf_viewer/touchui/TouchSlider.h",
    "chars": 490,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchSlide"
  },
  {
    "path": "pdf_viewer/touchui/TouchSlider.qml",
    "chars": 1876,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nRectangle {\n//    anchors.fill: parent\n//    height: 300\n//    width: "
  },
  {
    "path": "pdf_viewer/touchui/TouchSymbolColorSelector.qml",
    "chars": 2198,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.1\n\nItem{\n    id: root\n    property list<color>"
  },
  {
    "path": "pdf_viewer/touchui/TouchTextEdit.cpp",
    "chars": 2053,
    "preview": "#include \"touchui/TouchTextEdit.h\"\n#include \"utils.h\"\n\n\nTouchTextEdit::TouchTextEdit(QString name, QString initial_value"
  },
  {
    "path": "pdf_viewer/touchui/TouchTextEdit.h",
    "chars": 602,
    "preview": "#pragma once\n\n#include <QWidget>\n#include <QQuickWidget>\n#include <QQmlContext>\n#include <QQuickItem>\n\n\nclass TouchTextE"
  },
  {
    "path": "pdf_viewer/touchui/TouchTextEdit.qml",
    "chars": 987,
    "preview": "\nimport QtQuick 2.2\nimport QtQuick.Controls 2.15\n\nimport \"qrc:/pdf_viewer/touchui\"\n\nRectangle {\n\n    color: \"black\"\n\n   "
  },
  {
    "path": "pdf_viewer/touchui/TouchTreeView.qml",
    "chars": 10722,
    "preview": "\n//import QtQuick 2.15\nimport QtQuick\nimport QtQuick.Controls 2.15\nimport MySortFilterProxyModel 1.0\n\n\nRectangle {\n\n//  "
  },
  {
    "path": "pdf_viewer/ui.cpp",
    "chars": 69196,
    "preview": "#include \"ui.h\"\n#include <qfiledialog.h>\n\n#include <QItemSelectionModel>\n#include <QTapGesture>\n#include <main_widget.h>"
  },
  {
    "path": "pdf_viewer/ui.h",
    "chars": 31638,
    "preview": "#pragma once\n#include <string>\n#include <vector>\n#include <iostream>\n#include <functional>\n#include <optional>\n#include "
  },
  {
    "path": "pdf_viewer/utf8/checked.h",
    "chars": 12172,
    "preview": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobt"
  },
  {
    "path": "pdf_viewer/utf8/core.h",
    "chars": 10697,
    "preview": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobt"
  },
  {
    "path": "pdf_viewer/utf8/unchecked.h",
    "chars": 8907,
    "preview": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobt"
  },
  {
    "path": "pdf_viewer/utf8.h",
    "chars": 1521,
    "preview": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobt"
  },
  {
    "path": "pdf_viewer/utils.cpp",
    "chars": 139712,
    "preview": "//#include <Windows.h>\n#include <cwctype>\n\n#ifdef SIOYEK_ANDROID\n#include <unistd.h>\n#endif\n\n#include <cmath>\n#include <"
  },
  {
    "path": "pdf_viewer/utils.h",
    "chars": 23211,
    "preview": "#pragma once\n\n#include <fstream>\n#include <functional>\n#include <iostream>\n#include <sstream>\n#include <string>\n#include"
  },
  {
    "path": "pdf_viewer_build_config.pro",
    "chars": 7578,
    "preview": "TEMPLATE = app\nTARGET = sioyek\nVERSION = 2.0.0\n\nINCLUDEPATH += ./pdf_viewer \\\n               mupdf/include\n\n!android{\n  "
  },
  {
    "path": "resources/Info.plist",
    "chars": 1086,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "resources/debian/changelog",
    "chars": 128,
    "preview": "sioyek (2143354635-1) UNRELEASED; urgency=medium\n\n -- Ali Mostafavi <a.hr.mostafavi@gmail.com>  Sun, 10 Apr 2022 14:17:4"
  },
  {
    "path": "resources/debian/compat",
    "chars": 3,
    "preview": "10\n"
  },
  {
    "path": "resources/debian/control",
    "chars": 546,
    "preview": "Source: sioyek\nMaintainer: Ali Mostafavi <a.hr.mostafavi@gmail.com>\nSection: misc\nPriority: optional\nStandards-Version: "
  },
  {
    "path": "resources/debian/copyright",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "resources/debian/rules",
    "chars": 30,
    "preview": "#!/usr/bin/make -f\n%:\n\tdh $@\n\n"
  },
  {
    "path": "resources/debian/sioyek.dirs",
    "chars": 61,
    "preview": "usr/bin\netc/sioyek\nusr/share/sioyek\nusr/share/sioyek/shaders\n"
  },
  {
    "path": "resources/debian/sioyek.install",
    "chars": 751,
    "preview": "pdf_viewer/prefs.config etc/sioyek/\npdf_viewer/keys.config etc/sioyek/\ntutorial.pdf usr/share/sioyek/\npdf_viewer/shaders"
  },
  {
    "path": "resources/debian/source/format",
    "chars": 12,
    "preview": "3.0 (quilt)\n"
  },
  {
    "path": "resources/fonts/OFL.txt",
    "chars": 4399,
    "preview": "Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)\n\nThis Font Software is li"
  },
  {
    "path": "resources/sioyek.1",
    "chars": 53051,
    "preview": ".\\\"                     GNU GENERAL PUBLIC LICENSE\n.\\\"                        Version 3, 29 June 2007\n.\\\" \n.\\\"  Copyrigh"
  },
  {
    "path": "resources/sioyek.desktop",
    "chars": 315,
    "preview": "[Desktop Entry]\nName=Sioyek\nComment=PDF viewer for reading research papers and technical books\nKeywords=pdf;viewer;reade"
  },
  {
    "path": "resources.qrc",
    "chars": 5322,
    "preview": "<RCC>\n    <qresource prefix=\"/\">\n        <file>tutorial.pdf</file>\n        <file>pdf_viewer/keys.config</file>\n        <"
  },
  {
    "path": "scripts/dual_panelify.py",
    "chars": 4023,
    "preview": "'''\nCreates a dual panel version of current PDF file. Here is example configuration in `prefs_user.config`:\n\nnew_command"
  },
  {
    "path": "scripts/embed_annotations_in_file.py",
    "chars": 1412,
    "preview": "import sys\nfrom sioyek import Sioyek\n\ncolormap = {'a': (0.94, 0.64, 1.00),\n            'b': (0.00, 0.46, 0.86),\n        "
  },
  {
    "path": "scripts/embedded_annotations.py",
    "chars": 2111,
    "preview": "'''\nThis script was tested with PyMuPDF version 1.17.6. Other versions may require slight modification of the code.\n\nThi"
  },
  {
    "path": "scripts/paper_downloader.py",
    "chars": 6046,
    "preview": "'''\nAllows sioyek to automatically download papers from scihub by clicking on their names\nRequires the following python "
  },
  {
    "path": "scripts/sioyek-generator.py",
    "chars": 8091,
    "preview": "'''\nscript used to generate sioyek.py file\n'''\nsioyek_commands = {\n    \"goto_begining\": [False,\tFalse,\tFalse,\tTrue],\n   "
  },
  {
    "path": "scripts/sioyek.py",
    "chars": 31338,
    "preview": "import subprocess\nimport sqlite3\nfrom dataclasses import dataclass\nfrom functools import lru_cache\nimport fitz\nimport re"
  },
  {
    "path": "scripts/summary_highlight_server.py",
    "chars": 5952,
    "preview": "from flask import Flask, request, jsonify\nfrom tqdm import tqdm as q\nfrom transformers import ReformerModelWithLMHead\nim"
  },
  {
    "path": "scripts/tools/command_names.txt",
    "chars": 14576,
    "preview": "_debug\n_download_paper\n_embed_annotations\n_my_command\n_o\n_t\n_test\n_toggle_dark_mode_in_presentation_mode\n_touch_mode\n_tu"
  },
  {
    "path": "scripts/tools/config_names.txt",
    "chars": 5503,
    "preview": "text_highlight_color\nvertical_line_color\nvisual_mark_color\nsearch_highlight_color\nunselected_search_highlight_color\nfree"
  },
  {
    "path": "scripts/tools/extract_command_docs.py",
    "chars": 5790,
    "preview": "import os\nimport sys\nimport json\nimport rst_to_myst\nimport docutils\nimport docutils.core\n\ncommands_doc_path = os.getenv("
  },
  {
    "path": "scripts/tts/aligner.bat",
    "chars": 109,
    "preview": "python -m aeneas.tools.execute_task %1 %2 \"task_language=eng|os_task_file_format=json|is_text_type=plain\" %3\n"
  },
  {
    "path": "scripts/tts/aligner.ps1",
    "chars": 127,
    "preview": "python -m aeneas.tools.execute_task $args[0] $args[1] \"task_language=eng|os_task_file_format=json|is_text_type=plain\" $a"
  },
  {
    "path": "scripts/tts/generator.ps1",
    "chars": 257,
    "preview": "$text = Get-Content $args[0]\nif ($isMacOS) {\n    say $text -o $args[1]\n} else {\n    Add-Type -AssemblyName System.Speech"
  }
]

// ... and 12 more files (download for full content)

About this extraction

This page contains the full source code of the ahrm/sioyek GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 212 files (11.9 MB), approximately 3.1M tokens, and a symbol index with 8898 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!