├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ └── bug_report.md └── workflows │ ├── deb-build.yml │ ├── macos-apple-sillicon-build.yml │ └── windows-build.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── assets ├── banner.svg └── hero.png ├── delete_tags.sh ├── dockerfiles └── Dockerfile.deb ├── packaging ├── linux │ └── build-deb.sh ├── macos │ └── screenvivid.spec └── windows │ ├── screenvivid.iss │ └── screenvivid.spec ├── requirements.txt ├── screenvivid ├── __init__.py ├── compile_resources.py ├── config.py ├── image_provider.py ├── main.py ├── models │ ├── .DS_Store │ ├── __init__.py │ ├── click_track.py │ ├── export.py │ ├── logger.py │ ├── screen_capture.py │ ├── screen_recorder.py │ ├── utils │ │ ├── .DS_Store │ │ ├── cursor │ │ │ ├── .DS_Store │ │ │ ├── __init__.py │ │ │ ├── cursor.py │ │ │ └── loader.py │ │ ├── manager │ │ │ ├── .DS_Store │ │ │ └── undo_redo.py │ │ └── transforms.py │ ├── video_controller.py │ └── window_controller.py ├── qml │ ├── components │ │ ├── AnchorButton.qml │ │ ├── CustomButton.qml │ │ ├── ModeButton.qml │ │ └── RecordButton.qml │ ├── countdown │ │ └── Countdown.qml │ ├── entry │ │ ├── ControlPanel.qml │ │ ├── CustomSelector.qml │ │ ├── ScreenVivid.qml │ │ └── main.qml │ └── studio │ │ ├── ClipTrack.qml │ │ ├── ControlButtons.qml │ │ ├── ExportDialog.qml │ │ ├── MainContent.qml │ │ ├── Studio.qml │ │ ├── TimeSlider.qml │ │ ├── Timeline.qml │ │ ├── TopBar.qml │ │ ├── VideoEdit.qml │ │ ├── VideoPreview.qml │ │ └── sidebar │ │ ├── SideBar.qml │ │ ├── background_settings │ │ ├── BackgroundSettings.qml │ │ ├── ColorPage.qml │ │ ├── GradientPage.qml │ │ ├── ImagePage.qml │ │ └── WallpaperPage.qml │ │ ├── cursor_settings │ │ └── CursorSettings.qml │ │ └── shape_settings │ │ └── ShapeSettings.qml ├── rc_icons.py ├── rc_images.py ├── rc_main.py ├── resources │ ├── icons.qrc │ ├── icons │ │ ├── add.svg │ │ ├── back.svg │ │ ├── background.svg │ │ ├── border.svg │ │ ├── clip.svg │ │ ├── clock.svg │ │ ├── close.svg │ │ ├── cursor.svg │ │ ├── custom.svg │ │ ├── cut.svg │ │ ├── drag_indicator.svg │ │ ├── exit_full_screen.svg │ │ ├── export.svg │ │ ├── folder.svg │ │ ├── full_screen.svg │ │ ├── inset.svg │ │ ├── monitor.svg │ │ ├── mouse.svg │ │ ├── next.svg │ │ ├── padding.svg │ │ ├── pause.svg │ │ ├── play.svg │ │ ├── prev.svg │ │ ├── record.svg │ │ ├── safe_area.svg │ │ ├── scale.svg │ │ ├── screen.svg │ │ ├── screenvivid.icns │ │ ├── screenvivid.ico │ │ ├── screenvivid.png │ │ ├── screenvivid.svg │ │ ├── shape.svg │ │ ├── stop.svg │ │ ├── trash.svg │ │ ├── upload.svg │ │ └── zoom.svg │ ├── images.qrc │ ├── images │ │ ├── cursor │ │ │ ├── default │ │ │ │ ├── linux │ │ │ │ │ ├── 1.5x │ │ │ │ │ │ └── arrow.png │ │ │ │ │ ├── 1x │ │ │ │ │ │ └── arrow.png │ │ │ │ │ ├── 2x │ │ │ │ │ │ └── arrow.png │ │ │ │ │ └── 3x │ │ │ │ │ │ └── arrow.png │ │ │ │ ├── macos │ │ │ │ │ ├── 1.5x │ │ │ │ │ │ └── arrow.png │ │ │ │ │ ├── 1x │ │ │ │ │ │ └── arrow.png │ │ │ │ │ ├── 2x │ │ │ │ │ │ └── arrow.png │ │ │ │ │ └── 3x │ │ │ │ │ │ └── arrow.png │ │ │ │ └── windows │ │ │ │ │ ├── 1.5x │ │ │ │ │ └── arrow.png │ │ │ │ │ ├── 1x │ │ │ │ │ └── arrow.png │ │ │ │ │ ├── 2x │ │ │ │ │ └── arrow.png │ │ │ │ │ └── 3x │ │ │ │ │ └── arrow.png │ │ │ ├── macos │ │ │ │ ├── 1.5x │ │ │ │ │ ├── IBeam.png │ │ │ │ │ ├── arrow.png │ │ │ │ │ ├── closedHand.png │ │ │ │ │ ├── crosshair.png │ │ │ │ │ ├── openHand.png │ │ │ │ │ └── pointingHand.png │ │ │ │ ├── 1x │ │ │ │ │ ├── IBeam.png │ │ │ │ │ ├── arrow.png │ │ │ │ │ ├── closedHand.png │ │ │ │ │ ├── crosshair.png │ │ │ │ │ ├── openHand.png │ │ │ │ │ └── pointingHand.png │ │ │ │ ├── 2x │ │ │ │ │ ├── IBeam.png │ │ │ │ │ ├── arrow.png │ │ │ │ │ ├── closedHand.png │ │ │ │ │ ├── crosshair.png │ │ │ │ │ ├── openHand.png │ │ │ │ │ └── pointingHand.png │ │ │ │ ├── 3x │ │ │ │ │ ├── IBeam.png │ │ │ │ │ ├── arrow.png │ │ │ │ │ ├── closedHand.png │ │ │ │ │ ├── crosshair.png │ │ │ │ │ ├── openHand.png │ │ │ │ │ └── pointingHand.png │ │ │ │ └── offsets.json │ │ │ └── windows │ │ │ │ ├── 1.5x │ │ │ │ ├── appstarting_1.png │ │ │ │ ├── appstarting_10.png │ │ │ │ ├── appstarting_11.png │ │ │ │ ├── appstarting_12.png │ │ │ │ ├── appstarting_13.png │ │ │ │ ├── appstarting_14.png │ │ │ │ ├── appstarting_15.png │ │ │ │ ├── appstarting_16.png │ │ │ │ ├── appstarting_17.png │ │ │ │ ├── appstarting_18.png │ │ │ │ ├── appstarting_2.png │ │ │ │ ├── appstarting_3.png │ │ │ │ ├── appstarting_4.png │ │ │ │ ├── appstarting_5.png │ │ │ │ ├── appstarting_6.png │ │ │ │ ├── appstarting_7.png │ │ │ │ ├── appstarting_8.png │ │ │ │ ├── appstarting_9.png │ │ │ │ ├── arrow.png │ │ │ │ ├── cross.png │ │ │ │ ├── hand.png │ │ │ │ ├── help.png │ │ │ │ ├── ibeam.png │ │ │ │ ├── no.png │ │ │ │ ├── person.png │ │ │ │ ├── pin.png │ │ │ │ ├── sizeall.png │ │ │ │ ├── sizenesw.png │ │ │ │ ├── sizens.png │ │ │ │ ├── sizenwse.png │ │ │ │ ├── sizewe.png │ │ │ │ ├── uparrow.png │ │ │ │ ├── wait_1.png │ │ │ │ ├── wait_10.png │ │ │ │ ├── wait_11.png │ │ │ │ ├── wait_12.png │ │ │ │ ├── wait_13.png │ │ │ │ ├── wait_14.png │ │ │ │ ├── wait_15.png │ │ │ │ ├── wait_16.png │ │ │ │ ├── wait_17.png │ │ │ │ ├── wait_18.png │ │ │ │ ├── wait_2.png │ │ │ │ ├── wait_3.png │ │ │ │ ├── wait_4.png │ │ │ │ ├── wait_5.png │ │ │ │ ├── wait_6.png │ │ │ │ ├── wait_7.png │ │ │ │ ├── wait_8.png │ │ │ │ └── wait_9.png │ │ │ │ ├── 1x │ │ │ │ ├── appstarting_1.png │ │ │ │ ├── appstarting_10.png │ │ │ │ ├── appstarting_11.png │ │ │ │ ├── appstarting_12.png │ │ │ │ ├── appstarting_13.png │ │ │ │ ├── appstarting_14.png │ │ │ │ ├── appstarting_15.png │ │ │ │ ├── appstarting_16.png │ │ │ │ ├── appstarting_17.png │ │ │ │ ├── appstarting_18.png │ │ │ │ ├── appstarting_2.png │ │ │ │ ├── appstarting_3.png │ │ │ │ ├── appstarting_4.png │ │ │ │ ├── appstarting_5.png │ │ │ │ ├── appstarting_6.png │ │ │ │ ├── appstarting_7.png │ │ │ │ ├── appstarting_8.png │ │ │ │ ├── appstarting_9.png │ │ │ │ ├── arrow.png │ │ │ │ ├── cross.png │ │ │ │ ├── hand.png │ │ │ │ ├── help.png │ │ │ │ ├── ibeam.png │ │ │ │ ├── no.png │ │ │ │ ├── person.png │ │ │ │ ├── pin.png │ │ │ │ ├── sizeall.png │ │ │ │ ├── sizenesw.png │ │ │ │ ├── sizens.png │ │ │ │ ├── sizenwse.png │ │ │ │ ├── sizewe.png │ │ │ │ ├── uparrow.png │ │ │ │ ├── wait_1.png │ │ │ │ ├── wait_10.png │ │ │ │ ├── wait_11.png │ │ │ │ ├── wait_12.png │ │ │ │ ├── wait_13.png │ │ │ │ ├── wait_14.png │ │ │ │ ├── wait_15.png │ │ │ │ ├── wait_16.png │ │ │ │ ├── wait_17.png │ │ │ │ ├── wait_18.png │ │ │ │ ├── wait_2.png │ │ │ │ ├── wait_3.png │ │ │ │ ├── wait_4.png │ │ │ │ ├── wait_5.png │ │ │ │ ├── wait_6.png │ │ │ │ ├── wait_7.png │ │ │ │ ├── wait_8.png │ │ │ │ └── wait_9.png │ │ │ │ ├── 2x │ │ │ │ ├── appstarting_1.png │ │ │ │ ├── appstarting_10.png │ │ │ │ ├── appstarting_11.png │ │ │ │ ├── appstarting_12.png │ │ │ │ ├── appstarting_13.png │ │ │ │ ├── appstarting_14.png │ │ │ │ ├── appstarting_15.png │ │ │ │ ├── appstarting_16.png │ │ │ │ ├── appstarting_17.png │ │ │ │ ├── appstarting_18.png │ │ │ │ ├── appstarting_2.png │ │ │ │ ├── appstarting_3.png │ │ │ │ ├── appstarting_4.png │ │ │ │ ├── appstarting_5.png │ │ │ │ ├── appstarting_6.png │ │ │ │ ├── appstarting_7.png │ │ │ │ ├── appstarting_8.png │ │ │ │ ├── appstarting_9.png │ │ │ │ ├── arrow.png │ │ │ │ ├── cross.png │ │ │ │ ├── hand.png │ │ │ │ ├── help.png │ │ │ │ ├── ibeam.png │ │ │ │ ├── no.png │ │ │ │ ├── person.png │ │ │ │ ├── pin.png │ │ │ │ ├── sizeall.png │ │ │ │ ├── sizenesw.png │ │ │ │ ├── sizens.png │ │ │ │ ├── sizenwse.png │ │ │ │ ├── sizewe.png │ │ │ │ ├── uparrow.png │ │ │ │ ├── wait_1.png │ │ │ │ ├── wait_10.png │ │ │ │ ├── wait_11.png │ │ │ │ ├── wait_12.png │ │ │ │ ├── wait_13.png │ │ │ │ ├── wait_14.png │ │ │ │ ├── wait_15.png │ │ │ │ ├── wait_16.png │ │ │ │ ├── wait_17.png │ │ │ │ ├── wait_18.png │ │ │ │ ├── wait_2.png │ │ │ │ ├── wait_3.png │ │ │ │ ├── wait_4.png │ │ │ │ ├── wait_5.png │ │ │ │ ├── wait_6.png │ │ │ │ ├── wait_7.png │ │ │ │ ├── wait_8.png │ │ │ │ └── wait_9.png │ │ │ │ ├── 3x │ │ │ │ ├── appstarting_1.png │ │ │ │ ├── appstarting_10.png │ │ │ │ ├── appstarting_11.png │ │ │ │ ├── appstarting_12.png │ │ │ │ ├── appstarting_13.png │ │ │ │ ├── appstarting_14.png │ │ │ │ ├── appstarting_15.png │ │ │ │ ├── appstarting_16.png │ │ │ │ ├── appstarting_17.png │ │ │ │ ├── appstarting_18.png │ │ │ │ ├── appstarting_2.png │ │ │ │ ├── appstarting_3.png │ │ │ │ ├── appstarting_4.png │ │ │ │ ├── appstarting_5.png │ │ │ │ ├── appstarting_6.png │ │ │ │ ├── appstarting_7.png │ │ │ │ ├── appstarting_8.png │ │ │ │ ├── appstarting_9.png │ │ │ │ ├── arrow.png │ │ │ │ ├── cross.png │ │ │ │ ├── hand.png │ │ │ │ ├── help.png │ │ │ │ ├── ibeam.png │ │ │ │ ├── no.png │ │ │ │ ├── person.png │ │ │ │ ├── pin.png │ │ │ │ ├── sizeall.png │ │ │ │ ├── sizenesw.png │ │ │ │ ├── sizens.png │ │ │ │ ├── sizenwse.png │ │ │ │ ├── sizewe.png │ │ │ │ ├── uparrow.png │ │ │ │ ├── wait_1.png │ │ │ │ ├── wait_10.png │ │ │ │ ├── wait_11.png │ │ │ │ ├── wait_12.png │ │ │ │ ├── wait_13.png │ │ │ │ ├── wait_14.png │ │ │ │ ├── wait_15.png │ │ │ │ ├── wait_16.png │ │ │ │ ├── wait_17.png │ │ │ │ ├── wait_18.png │ │ │ │ ├── wait_2.png │ │ │ │ ├── wait_3.png │ │ │ │ ├── wait_4.png │ │ │ │ ├── wait_5.png │ │ │ │ ├── wait_6.png │ │ │ │ ├── wait_7.png │ │ │ │ ├── wait_8.png │ │ │ │ └── wait_9.png │ │ │ │ └── offsets.json │ │ └── wallpapers │ │ │ ├── hires │ │ │ ├── .gitattributes │ │ │ ├── .gitkeep │ │ │ ├── gradient-wallpaper-0001.jpg │ │ │ ├── gradient-wallpaper-0002.jpg │ │ │ ├── gradient-wallpaper-0003.jpg │ │ │ ├── gradient-wallpaper-0004.jpg │ │ │ ├── gradient-wallpaper-0005.jpg │ │ │ ├── gradient-wallpaper-0006.jpg │ │ │ ├── gradient-wallpaper-0007.jpg │ │ │ ├── gradient-wallpaper-0008.jpg │ │ │ ├── gradient-wallpaper-0009.jpg │ │ │ ├── gradient-wallpaper-0010.jpg │ │ │ ├── gradient-wallpaper-0011.jpg │ │ │ ├── gradient-wallpaper-0012.jpg │ │ │ ├── gradient-wallpaper-0013.jpg │ │ │ ├── gradient-wallpaper-0014.jpg │ │ │ ├── gradient-wallpaper-0015.jpg │ │ │ ├── gradient-wallpaper-0016.jpg │ │ │ └── gradient-wallpaper-0017.jpg │ │ │ └── thumbnails │ │ │ ├── gradient-wallpaper-0001.jpg │ │ │ ├── gradient-wallpaper-0002.jpg │ │ │ ├── gradient-wallpaper-0003.jpg │ │ │ ├── gradient-wallpaper-0004.jpg │ │ │ ├── gradient-wallpaper-0005.jpg │ │ │ ├── gradient-wallpaper-0006.jpg │ │ │ ├── gradient-wallpaper-0007.jpg │ │ │ ├── gradient-wallpaper-0008.jpg │ │ │ ├── gradient-wallpaper-0009.jpg │ │ │ ├── gradient-wallpaper-0010.jpg │ │ │ ├── gradient-wallpaper-0011.jpg │ │ │ ├── gradient-wallpaper-0012.jpg │ │ │ ├── gradient-wallpaper-0013.jpg │ │ │ ├── gradient-wallpaper-0014.jpg │ │ │ ├── gradient-wallpaper-0015.jpg │ │ │ ├── gradient-wallpaper-0016.jpg │ │ │ └── gradient-wallpaper-0017.jpg │ └── main.qrc └── utils │ ├── general.py │ └── logging.py ├── scripts ├── install-linux.sh ├── install-macos.sh ├── run ├── uninstall-linux.sh └── uninstall-macos.sh └── tests └── .gitkeep /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: tamnvvn # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: tamnv 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: screenvivid # Replace with a single Polar username 13 | buy_me_a_coffee: tamnv # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve ScreenVivid 4 | title: '[BUG] ' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## General information: 11 | 12 | * OS name: _(e.g., Windows 10, macOS Monterey, Ubuntu)_ 13 | * OS version: _(e.g., 21H2, 12.3, 22.04 LTS)_ 14 | * OS architecture: _(e.g., 64-bit, ARM)_ 15 | * Resolutions: 16 | * Monitor 1: _(e.g., 1920x1080)_ 17 | * Monitor 2: _(if applicable)_ 18 | * Python version: _(e.g., 3.9.19)_ 19 | * ScreenVivid version: _(e.g., 1.2.3)_ 20 | 21 | ## For GNU/Linux users: 22 | 23 | * Display server protocol and version, if known: _(e.g., X11, Wayland)_ 24 | * Desktop Environment: _(e.g., GNOME, KDE, XFCE)_ 25 | * Composite Window Manager name and version: _(if applicable)_ 26 | 27 | ## Description of the issue 28 | 29 | A clear and concise description of the issue, including steps to reproduce if applicable. 30 | 31 | ## Expected behavior 32 | 33 | A clear and concise description of what you expected to happen. 34 | 35 | ## Actual behavior 36 | 37 | A clear and concise description of what actually happened. 38 | 39 | ## Full error message 40 | 41 | ``` 42 | Copy and paste the entire error message here, if applicable. 43 | ``` 44 | 45 | ## Screenshots 46 | 47 | If applicable, add screenshots to help explain your problem. 48 | 49 | ## Additional context 50 | 51 | Add any other context about the problem here, such as specific settings in ScreenVivid, any recent changes to your system, or any other information you think might be relevant. 52 | 53 | ## Logs 54 | 55 | Please attach any relevant log files if available. -------------------------------------------------------------------------------- /.github/workflows/deb-build.yml: -------------------------------------------------------------------------------- 1 | name: Build and Package for Debian 2 | on: 3 | push: 4 | tags: 5 | - '*.*.*' 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout code 11 | uses: actions/checkout@v3 12 | with: 13 | fetch-depth: 0 # Fetch all history and tags 14 | - name: Read Changelog 15 | id: changelog 16 | run: | 17 | CHANGELOG=$(cat CHANGELOG.md) 18 | echo "changelog<> $GITHUB_ENV 19 | echo "$CHANGELOG" >> $GITHUB_ENV 20 | echo "EOF" >> $GITHUB_ENV 21 | - name: Get Previous Tag 22 | id: get_previous_tag 23 | run: | 24 | # Get the current tag 25 | CURRENT_TAG="${{ github.ref_name }}" 26 | # Get all tags sorted by version number 27 | PREVIOUS_TAG=$(git tag --sort=-version:refname | grep -A 1 "^${CURRENT_TAG}$" | tail -n 1 || echo "none") 28 | echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_ENV 29 | - name: Get Commit Messages 30 | id: commits 31 | run: | 32 | if [[ "${{ env.previous_tag }}" == "none" ]]; then 33 | echo "commits=No previous tags found." >> $GITHUB_ENV 34 | else 35 | COMMIT_MESSAGES=$(git log --pretty=format:"- %s (#%b)" "${{ env.previous_tag }}"..HEAD) 36 | echo "commits<> $GITHUB_ENV 37 | echo "$COMMIT_MESSAGES" >> $GITHUB_ENV 38 | echo "EOF" >> $GITHUB_ENV 39 | fi 40 | - name: Set up Docker Buildx 41 | uses: docker/setup-buildx-action@v1 42 | - name: Build Docker image 43 | run: docker build -t screenvivid-deb-build -f dockerfiles/Dockerfile.deb . 44 | - name: Package as .deb 45 | run: | 46 | docker run --rm -v ${PWD}:/app screenvivid-deb-build bash -c " 47 | cd screenvivid && python3 compile_resources.py && cd .. && 48 | cd packaging/linux && 49 | chmod +x build-deb.sh && 50 | ./build-deb.sh '${GITHUB_REF_NAME}' && 51 | mv screenvivid*.deb /app/ 52 | " 53 | - name: Upload Debian package as artifact 54 | uses: actions/upload-artifact@v4 55 | with: 56 | name: screenvivid-${{ github.ref_name }}.deb 57 | path: ./screenvivid*.deb 58 | - name: Create GitHub Release 59 | uses: softprops/action-gh-release@v1 60 | with: 61 | body: | 62 | # ScreenVivid ${{ github.ref_name }} is out! 🎉 63 | ${{ env.changelog }} 64 | # What's Changed 65 | ${{ env.commits }} 66 | 67 | Full Changelog: [${{ env.previous_tag }}...${{ github.ref_name }}](https://github.com/tamnguyenvan/screenvivid/compare/${{ env.previous_tag }}...${{ github.ref_name }}) 68 | files: screenvivid*.deb 69 | env: 70 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/macos-apple-sillicon-build.yml: -------------------------------------------------------------------------------- 1 | name: Build and Package for MacOS Apple Silicon 2 | on: 3 | push: 4 | tags: 5 | - '*.*.*' 6 | jobs: 7 | build: 8 | runs-on: macos-latest 9 | steps: 10 | - name: Checkout code 11 | uses: actions/checkout@v2 12 | 13 | - name: Set up Python 14 | uses: actions/setup-python@v2 15 | with: 16 | python-version: '3.9' 17 | 18 | - name: Download FFmpeg 19 | run: | 20 | curl -L https://evermeet.cx/ffmpeg/ffmpeg-7.1.zip -o ffmpeg.zip 21 | unzip ffmpeg.zip 22 | mv ffmpeg packaging/macos/ 23 | rm ffmpeg.zip 24 | 25 | - name: Install dependencies 26 | run: | 27 | python -m venv venv 28 | source venv/bin/activate 29 | python -m pip install --upgrade pip 30 | pip install pyinstaller 31 | pip install "pyobjc-framework-Quartz>=10.3.1,<10.4" 32 | pip install "pyobjc-framework-UniformTypeIdentifiers>=10.3.1,<10.4" 33 | pip install "pyobjc-framework-AVFoundation>=10.3.1,<10.4" 34 | pip install -r requirements.txt 35 | 36 | - name: Compile resources 37 | run: | 38 | source venv/bin/activate 39 | cd screenvivid 40 | python compile_resources.py 41 | 42 | - name: Build with PyInstaller 43 | run: | 44 | source venv/bin/activate 45 | cd packaging/macos 46 | pyinstaller --clean --noconfirm screenvivid.spec 47 | 48 | - name: Install create-dmg 49 | run: | 50 | brew install create-dmg 51 | 52 | - name: Create DMG 53 | run: | 54 | cd packaging/macos 55 | create-dmg \ 56 | --volname "ScreenVivid" \ 57 | --volicon "../../screenvivid/resources/icons/screenvivid.icns" \ 58 | --window-pos 0 0 \ 59 | --icon-size 100 \ 60 | --icon "ScreenVivid.app" 175 120 \ 61 | --hide-extension "ScreenVivid.app" \ 62 | --app-drop-link 425 120 \ 63 | "ScreenVivid-${{ github.ref_name }}-apple-silicon.dmg" \ 64 | "dist/ScreenVivid.app" 65 | mv ScreenVivid-${{ github.ref_name }}-apple-silicon.dmg ../.. 66 | 67 | - name: Upload DMG 68 | uses: actions/upload-artifact@v4 69 | with: 70 | name: ScreenVivid-${{ github.ref_name }}-apple-silicon.dmg 71 | path: ./ScreenVivid-${{ github.ref_name }}-apple-silicon.dmg 72 | 73 | - name: Create GitHub Release 74 | uses: softprops/action-gh-release@v1 75 | with: 76 | files: ScreenVivid-${{ github.ref_name }}-apple-silicon.dmg 77 | env: 78 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/windows-build.yml: -------------------------------------------------------------------------------- 1 | name: Build and Package for Windows 2 | on: 3 | push: 4 | tags: 5 | - '*.*.*' 6 | jobs: 7 | build: 8 | runs-on: windows-latest 9 | steps: 10 | - name: Checkout code 11 | uses: actions/checkout@v2 12 | 13 | - name: Set up Python 14 | uses: actions/setup-python@v4 15 | with: 16 | python-version: '3.9' 17 | 18 | - name: Download FFmpeg 19 | run: | 20 | $ProgressPreference = 'SilentlyContinue' 21 | Invoke-WebRequest -Uri "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n7.1-latest-win64-gpl-7.1.zip" -OutFile "ffmpeg.zip" 22 | Expand-Archive -Path "ffmpeg.zip" -DestinationPath "ffmpeg_temp" 23 | Copy-Item "ffmpeg_temp\ffmpeg-n7.1-latest-win64-gpl-7.1\bin\ffmpeg.exe" -Destination "packaging\windows\" 24 | Remove-Item -Path "ffmpeg_temp" -Recurse -Force 25 | Remove-Item -Path "ffmpeg.zip" 26 | shell: pwsh 27 | 28 | - name: Install dependencies 29 | run: | 30 | python -m venv venv 31 | venv\Scripts\activate 32 | python -m pip install --upgrade pip 33 | pip install pyinstaller 34 | pip install "pywin32>=306,<308" 35 | pip install -r requirements.txt 36 | shell: pwsh 37 | 38 | - name: Compile resources 39 | run: | 40 | venv\Scripts\activate 41 | cd screenvivid 42 | python compile_resources.py 43 | 44 | - name: Build with PyInstaller 45 | run: | 46 | venv\Scripts\activate 47 | cd packaging/windows 48 | pyinstaller --clean --noconfirm screenvivid.spec 49 | shell: pwsh 50 | 51 | - name: Update version in Inno Setup script 52 | run: | 53 | $version = "${{ github.ref_name }}" 54 | $content = Get-Content -Path packaging/windows/screenvivid.iss -Raw 55 | $newContent = $content -replace '#define MyAppVersion ".*"', "#define MyAppVersion `"$version`"" 56 | $newContent | Set-Content -Path packaging/windows/screenvivid.iss 57 | shell: pwsh 58 | 59 | - name: Build installer with Inno Setup 60 | uses: Minionguyjpro/Inno-Setup-Action@v1.2.2 61 | with: 62 | path: packaging/windows/screenvivid.iss 63 | options: /O+ /F"ScreenVivid-${{ github.ref_name }}-Setup" 64 | 65 | - name: Upload artifact 66 | uses: actions/upload-artifact@v4 67 | with: 68 | name: ScreenVivid-${{ github.ref_name }}-Setup.exe 69 | path: D:\a\screenvivid\screenvivid\packaging\windows\Output\ScreenVivid-${{ github.ref_name }}-Setup.exe 70 | env: 71 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 72 | 73 | - name: Create GitHub Release 74 | id: create_release 75 | uses: softprops/action-gh-release@v1 76 | with: 77 | files: "**/Output/ScreenVivid-${{ github.ref_name }}-Setup.exe" 78 | env: 79 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .qtcreator/ 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | *$py.class 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Distribution / packaging 12 | .Python 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | wheels/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | *.exe 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | # *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .nox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | *.py,cover 53 | .hypothesis/ 54 | .pytest_cache/ 55 | cover/ 56 | 57 | # Translations 58 | *.mo 59 | *.pot 60 | 61 | # Django stuff: 62 | *.log 63 | local_settings.py 64 | db.sqlite3 65 | db.sqlite3-journal 66 | 67 | # Flask stuff: 68 | instance/ 69 | .webassets-cache 70 | 71 | # Scrapy stuff: 72 | .scrapy 73 | 74 | # Sphinx documentation 75 | docs/_build/ 76 | 77 | # PyBuilder 78 | .pybuilder/ 79 | target/ 80 | 81 | # Jupyter Notebook 82 | .ipynb_checkpoints 83 | 84 | # IPython 85 | profile_default/ 86 | ipython_config.py 87 | 88 | # pyenv 89 | # For a library or package, you might want to ignore these files since the code is 90 | # intended to run in multiple environments; otherwise, check them in: 91 | # .python-version 92 | 93 | # pipenv 94 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 95 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 96 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 97 | # install all needed dependencies. 98 | #Pipfile.lock 99 | 100 | # poetry 101 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 102 | # This is especially recommended for binary packages to ensure reproducibility, and is more 103 | # commonly ignored for libraries. 104 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 105 | #poetry.lock 106 | 107 | # pdm 108 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 109 | #pdm.lock 110 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 111 | # in version control. 112 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 113 | .pdm.toml 114 | .pdm-python 115 | .pdm-build/ 116 | 117 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 118 | __pypackages__/ 119 | 120 | # Celery stuff 121 | celerybeat-schedule 122 | celerybeat.pid 123 | 124 | # SageMath parsed files 125 | *.sage.py 126 | 127 | # Environments 128 | .env 129 | .venv 130 | env/ 131 | venv/ 132 | ENV/ 133 | env.bak/ 134 | venv.bak/ 135 | 136 | # Spyder project settings 137 | .spyderproject 138 | .spyproject 139 | 140 | # Rope project settings 141 | .ropeproject 142 | 143 | # mkdocs documentation 144 | /site 145 | 146 | # mypy 147 | .mypy_cache/ 148 | .dmypy.json 149 | dmypy.json 150 | 151 | # Pyre type checker 152 | .pyre/ 153 | 154 | # pytype static type analyzer 155 | .pytype/ 156 | 157 | # Cython debug symbols 158 | cython_debug/ 159 | 160 | # PyCharm 161 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 162 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 163 | # and can be added to the global gitignore or merged into this file. For a more nuclear 164 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 165 | #.idea/ 166 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | - **Screen Recording Feature**: Allows users to capture high-quality recordings of their screen. 📹 2 | - **Basic Video Editing Tools**: Provides basic tools for editing recorded videos. 🎞️ 3 | - **Video Export Functionality**: Supports exporting videos in popular formats such as MP4. 💾 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Tam Nguyen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /assets/banner.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | creenVivid 12 | -------------------------------------------------------------------------------- /assets/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/assets/hero.png -------------------------------------------------------------------------------- /delete_tags.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | REMOTE=origin 4 | 5 | for i in $(seq 101 102); do 6 | TAG="1.0.$i" 7 | # Delete local tag if exists (ignore errors) 8 | git tag -d "$TAG" 2>/dev/null 9 | # Delete remote tag (ignore errors) 10 | git push "$REMOTE" --delete "$TAG" 2>/dev/null || true 11 | done 12 | 13 | -------------------------------------------------------------------------------- /dockerfiles/Dockerfile.deb: -------------------------------------------------------------------------------- 1 | FROM ubuntu:22.04 2 | 3 | ENV DEBIAN_FRONTEND=noninteractive 4 | 5 | RUN apt-get update && apt-get install -y \ 6 | build-essential \ 7 | python3.10 \ 8 | python3.10-venv \ 9 | python3.10-dev \ 10 | pkg-config \ 11 | && rm -rf /var/lib/apt/lists/* 12 | 13 | WORKDIR /app 14 | COPY .. . 15 | 16 | CMD ["/bin/bash"] -------------------------------------------------------------------------------- /packaging/linux/build-deb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Application name (lowercase for package name, mixed case for display name) 4 | PKG_NAME="screenvivid" 5 | DISPLAY_NAME="ScreenVivid" 6 | 7 | # Version number 8 | VERSION=${1:-"1.0.0"} 9 | 10 | # Architecture 11 | ARCH="amd64" 12 | 13 | # Create directory structure for the .deb package 14 | mkdir -p ${PKG_NAME}-${VERSION}-${ARCH}/DEBIAN 15 | mkdir -p ${PKG_NAME}-${VERSION}-${ARCH}/opt/${PKG_NAME}/${PKG_NAME} 16 | mkdir -p ${PKG_NAME}-${VERSION}-${ARCH}/usr/share/applications 17 | mkdir -p ${PKG_NAME}-${VERSION}-${ARCH}/usr/share/icons/hicolor/256x256/apps 18 | mkdir -p ${PKG_NAME}-${VERSION}-${ARCH}/usr/share/doc/${PKG_NAME} 19 | mkdir -p ${PKG_NAME}-${VERSION}-${ARCH}/usr/bin 20 | 21 | # Create the control file 22 | cat << EOF > ${PKG_NAME}-${VERSION}-${ARCH}/DEBIAN/control 23 | Package: ${PKG_NAME} 24 | Version: $VERSION 25 | Section: utils 26 | Priority: optional 27 | Architecture: $ARCH 28 | Depends: libxcb-cursor0, python3-venv, python3-tk, ffmpeg 29 | Maintainer: DarkPhoton 30 | Homepage: https://www.screenvivid.com 31 | License: MIT 32 | Description: Screen recording and editing application 33 | ${DISPLAY_NAME} is a cross-platform desktop application for screen recording 34 | and video editing, featuring options like background replacement and padding. 35 | EOF 36 | 37 | # Copy the entire application directory 38 | cp -R ../../${PKG_NAME}/* ${PKG_NAME}-${VERSION}-${ARCH}/opt/${PKG_NAME}/${PKG_NAME} 39 | cp -R ../../requirements.txt ${PKG_NAME}-${VERSION}-${ARCH}/opt/${PKG_NAME} 40 | cp -R ../../scripts/run ${PKG_NAME}-${VERSION}-${ARCH}/opt/${PKG_NAME}/run 41 | 42 | # Copy the LICENSE file and rename it to 'copyright' 43 | cp ../../LICENSE ${PKG_NAME}-${VERSION}-${ARCH}/usr/share/doc/${PKG_NAME}/copyright 44 | 45 | # Create postinst file 46 | cat << EOF > ${PKG_NAME}-${VERSION}-${ARCH}/DEBIAN/postinst 47 | #!/bin/sh 48 | 49 | # Check Python version 50 | PYTHON_VERSION=\$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') 51 | 52 | REQUIRED_VERSION="3.9" 53 | 54 | # Compare versions 55 | if [ "\$(printf '%s\n' "\$REQUIRED_VERSION" "\$PYTHON_VERSION" | sort -V | head -n1)" != "\$REQUIRED_VERSION" ]; then 56 | echo "Python version must be 3.9 or higher. Current version: \$PYTHON_VERSION" 57 | exit 1 58 | fi 59 | 60 | python3 -m venv /opt/screenvivid/venv 61 | . /opt/screenvivid/venv/bin/activate 62 | 63 | pip install -q -r /opt/screenvivid/requirements.txt 64 | 65 | ln -sf /opt/screenvivid/run /usr/bin/screenvivid 66 | 67 | chmod +x /opt/screenvivid/run 68 | 69 | exit 0 70 | EOF 71 | 72 | # Make postinst executable 73 | chmod 755 ${PKG_NAME}-${VERSION}-${ARCH}/DEBIAN/postinst 74 | 75 | 76 | # Create the .desktop file 77 | cat << EOF > ${PKG_NAME}-${VERSION}-${ARCH}/usr/share/applications/${PKG_NAME}.desktop 78 | [Desktop Entry] 79 | Name=${DISPLAY_NAME} 80 | Exec=/usr/bin/${PKG_NAME} 81 | Icon=${PKG_NAME} 82 | Type=Application 83 | Categories=Utility; 84 | Comment=Screen recording and editing application 85 | EOF 86 | 87 | # Copy the icon 88 | cp ../../screenvivid/resources/icons/screenvivid.png ${PKG_NAME}-${VERSION}-${ARCH}/usr/share/icons/hicolor/256x256/apps/${PKG_NAME}.png 89 | 90 | # Build the .deb package 91 | dpkg-deb --build ${PKG_NAME}-${VERSION}-${ARCH} 92 | 93 | # Clean up 94 | rm -rf ${PKG_NAME}-${VERSION}-${ARCH} 95 | 96 | echo "Debian package created: ${PKG_NAME}-${VERSION}-${ARCH}.deb" -------------------------------------------------------------------------------- /packaging/macos/screenvivid.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | import os 3 | from PyInstaller.utils.hooks import collect_data_files 4 | 5 | 6 | tcl_tk_data = collect_data_files('tkinter') 7 | 8 | a = Analysis( 9 | ['../../screenvivid/main.py'], 10 | pathex=[], 11 | binaries=[('ffmpeg', '.')], 12 | datas=[ 13 | ('../../screenvivid/resources/images/wallpapers/hires', 'resources/images/wallpapers/hires'), 14 | ('../../screenvivid/resources/images/cursor/macos', 'resources/images/cursor/macos'), 15 | ('../../screenvivid/resources/images/cursor/default', 'resources/images/cursor/default'), 16 | ('../../screenvivid/resources/icons/screenvivid.ico', 'resources/icons/'), 17 | *tcl_tk_data, 18 | ], 19 | hiddenimports=[], 20 | hookspath=[], 21 | hooksconfig={}, 22 | runtime_hooks=[], 23 | excludes=[], 24 | noarchive=False, 25 | optimize=0, 26 | ) 27 | pyz = PYZ(a.pure) 28 | 29 | exe = EXE( 30 | pyz, 31 | a.scripts, 32 | [], 33 | exclude_binaries=True, 34 | name='ScreenVivid', 35 | debug=False, 36 | bootloader_ignore_signals=False, 37 | strip=True, 38 | upx=True, 39 | console=False, 40 | disable_windowed_traceback=False, 41 | argv_emulation=False, 42 | target_arch=None, 43 | codesign_identity=None, 44 | entitlements_file=None, 45 | icon="../../resources/icons/screenvivid.ico" 46 | ) 47 | coll = COLLECT( 48 | exe, 49 | a.binaries, 50 | a.datas, 51 | strip=False, 52 | upx=True, 53 | upx_exclude=[], 54 | name='ScreenVivid', 55 | ) 56 | 57 | app = BUNDLE( 58 | coll, 59 | name="ScreenVivid.app", 60 | icon="../../screenvivid/resources/icons/screenvivid.icns", 61 | bundle_identifier="com.darkphoton.ScreenVivid", 62 | bundle_description="ScreenVivid is a cross-platform desktop application for screen recording and video editing, featuring options like background replacement and padding.", 63 | ) -------------------------------------------------------------------------------- /packaging/windows/screenvivid.iss: -------------------------------------------------------------------------------- 1 | ; Script generated by the Inno Setup Script Wizard. 2 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3 | 4 | #define MyAppName "ScreenVivid" 5 | #define MyAppVersion "X.X.X" 6 | #define MyAppPublisher "DarkPhoton" 7 | #define MyAppURL "https://www.screenvivid.com/" 8 | #define MyAppExeName "screenvivid.exe" 9 | #define MyAppAssocName MyAppName + " File" 10 | #define MyAppAssocExt ".mp4" 11 | #define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt 12 | 13 | [Setup] 14 | ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. 15 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 16 | AppId={{1AC91C66-70E2-4C12-A13F-2CF92D26B997} 17 | AppName={#MyAppName} 18 | AppVersion={#MyAppVersion} 19 | ;AppVerName={#MyAppName} {#MyAppVersion} 20 | AppPublisher={#MyAppPublisher} 21 | AppPublisherURL={#MyAppURL} 22 | AppSupportURL={#MyAppURL} 23 | AppUpdatesURL={#MyAppURL} 24 | DefaultDirName={autopf}\{#MyAppName} 25 | ; "ArchitecturesAllowed=x64compatible" specifies that Setup cannot run 26 | ; on anything but x64 and Windows 11 on Arm. 27 | ArchitecturesAllowed=x64compatible 28 | ; "ArchitecturesInstallIn64BitMode=x64compatible" requests that the 29 | ; install be done in "64-bit mode" on x64 or Windows 11 on Arm, 30 | ; meaning it should use the native 64-bit Program Files directory and 31 | ; the 64-bit view of the registry. 32 | ArchitecturesInstallIn64BitMode=x64compatible 33 | ChangesAssociations=yes 34 | DisableProgramGroupPage=yes 35 | ; Uncomment the following line to run in non administrative install mode (install for current user only.) 36 | ;PrivilegesRequired=lowest 37 | OutputBaseFilename=ScreenVivid-Setup 38 | Compression=lzma 39 | SolidCompression=yes 40 | WizardStyle=modern 41 | 42 | [Languages] 43 | Name: "english"; MessagesFile: "compiler:Default.isl" 44 | 45 | [Tasks] 46 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; 47 | 48 | [Files] 49 | Source: "dist\ScreenVivid\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion 50 | Source: "dist\ScreenVivid\_internal\*"; DestDir: "{app}\_internal"; Flags: ignoreversion recursesubdirs createallsubdirs 51 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 52 | 53 | [Registry] 54 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue 55 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey 56 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0" 57 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1""" 58 | Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".mp4"; ValueData: "" 59 | 60 | [Icons] 61 | Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 62 | Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 63 | 64 | [Run] 65 | Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent -------------------------------------------------------------------------------- /packaging/windows/screenvivid.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | import os 3 | from PyInstaller.utils.hooks import collect_data_files 4 | 5 | 6 | tcl_tk_data = collect_data_files('tkinter') 7 | 8 | a = Analysis( 9 | ['../../screenvivid/main.py'], 10 | pathex=[], 11 | binaries=[('ffmpeg.exe', '.')], 12 | datas=[ 13 | ('../../screenvivid/resources/images/wallpapers/hires', 'resources/images/wallpapers/hires'), 14 | ('../../screenvivid/resources/images/cursor/windows', 'resources/images/cursor/windows'), 15 | ('../../screenvivid/resources/images/cursor/default', 'resources/images/cursor/default'), 16 | ('../../screenvivid/resources/icons/screenvivid.ico', 'resources/icons/'), 17 | *tcl_tk_data, 18 | ], 19 | hiddenimports=[], 20 | hookspath=[], 21 | hooksconfig={}, 22 | runtime_hooks=[], 23 | excludes=[], 24 | noarchive=False, 25 | optimize=0, 26 | ) 27 | pyz = PYZ(a.pure) 28 | 29 | exe = EXE( 30 | pyz, 31 | a.scripts, 32 | [], 33 | exclude_binaries=True, 34 | name='screenvivid', 35 | debug=False, 36 | bootloader_ignore_signals=False, 37 | strip=True, 38 | upx=True, 39 | console=False, 40 | disable_windowed_traceback=False, 41 | argv_emulation=False, 42 | target_arch=None, 43 | codesign_identity=None, 44 | entitlements_file=None, 45 | icon="../../screenvivid/resources/icons/screenvivid.ico" 46 | ) 47 | coll = COLLECT( 48 | exe, 49 | a.binaries, 50 | a.datas, 51 | strip=False, 52 | upx=True, 53 | upx_exclude=[], 54 | name='ScreenVivid', 55 | ) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | PySide6>=6.7.2,<7.0 2 | opencv-python>=4.6.0,<=4.10.0.84 3 | Pillow>=7.0,<=10.4.0 4 | mss>=9.0.1,<10 5 | pyautogui>=0.9.54,<1.0 6 | python-xlib>=0.33,<1.0 7 | loguru>=0.7.2,<1.0 8 | numpy>=1.26.4,<2.0 -------------------------------------------------------------------------------- /screenvivid/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/__init__.py -------------------------------------------------------------------------------- /screenvivid/compile_resources.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | 3 | def run_command(command): 4 | try: 5 | subprocess.run(command, check=True, shell=True) 6 | print(f"Command executed successfully: {command}") 7 | except subprocess.CalledProcessError as e: 8 | print(f"Error executing command: {command}") 9 | print(f"Error details: {e}") 10 | 11 | def main(): 12 | # Commands to run 13 | commands = [ 14 | "pyside6-rcc -o rc_main.py resources/main.qrc", 15 | "pyside6-rcc -o rc_icons.py resources/icons.qrc", 16 | "pyside6-rcc -o rc_images.py resources/images.qrc" 17 | ] 18 | 19 | # Execute each command 20 | for command in commands: 21 | run_command(command) 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /screenvivid/config.py: -------------------------------------------------------------------------------- 1 | DEFAULT_PIXELS_PER_FRAME = 6 2 | DEFAULT_FPS = 24 -------------------------------------------------------------------------------- /screenvivid/image_provider.py: -------------------------------------------------------------------------------- 1 | from PySide6.QtQuick import QQuickImageProvider 2 | from PySide6.QtGui import QImage 3 | 4 | class FrameImageProvider(QQuickImageProvider): 5 | def __init__(self): 6 | super().__init__(QQuickImageProvider.Image) 7 | self.frame = QImage() 8 | 9 | def requestImage(self, id, size, requestedSize): 10 | return self.frame 11 | 12 | def updateFrame(self, frame): 13 | self.frame = frame 14 | -------------------------------------------------------------------------------- /screenvivid/main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from pathlib import Path 3 | 4 | from PySide6.QtGui import QGuiApplication, QIcon 5 | from PySide6.QtQml import QQmlApplicationEngine 6 | 7 | from screenvivid import rc_main 8 | from screenvivid import rc_icons 9 | from screenvivid import rc_images 10 | from screenvivid.models import ( 11 | ClipTrackModel, WindowControllerModel, VideoControllerModel, ScreenRecorderModel, LoggerModel 12 | ) 13 | from screenvivid.image_provider import FrameImageProvider 14 | from screenvivid.models.logger import logger 15 | 16 | def main(): 17 | logger.info("Starting ScreenVivid") 18 | app = QGuiApplication(sys.argv) 19 | 20 | # Determine the path to the icon 21 | if getattr(sys, 'frozen', False): 22 | # If running in a PyInstaller bundle 23 | base_path = Path(sys._MEIPASS) 24 | else: 25 | # If running in a regular Python environment 26 | base_path = Path(__file__).resolve().parent 27 | 28 | icon_path = base_path / "resources/icons/screenvivid.ico" 29 | logger.debug(f"Setting icon to {icon_path}") 30 | app.setWindowIcon(QIcon(str(icon_path))) 31 | engine = QQmlApplicationEngine() 32 | logger.debug("Created QQmlApplicationEngine") 33 | 34 | # Image provider 35 | frame_provider = FrameImageProvider() 36 | engine.addImageProvider("frames", frame_provider) 37 | logger.debug("Added image provider") 38 | 39 | # Models 40 | clip_track_model = ClipTrackModel() 41 | window_controller = WindowControllerModel() 42 | 43 | video_controller = VideoControllerModel(frame_provider=frame_provider) 44 | screen_recorder = ScreenRecorderModel() 45 | logger_model = LoggerModel() 46 | 47 | engine.rootContext().setContextProperty("clipTrackModel", clip_track_model) 48 | engine.rootContext().setContextProperty("windowController", window_controller) 49 | engine.rootContext().setContextProperty("videoController", video_controller) 50 | engine.rootContext().setContextProperty("screenRecorder", screen_recorder) 51 | engine.rootContext().setContextProperty("logger", logger_model) 52 | logger.debug("Set context properties") 53 | 54 | qml_file = "qrc:/qml/entry/main.qml" 55 | engine.load(qml_file) 56 | if not engine.rootObjects(): 57 | logger.error("Failed to load QML file") 58 | sys.exit(-1) 59 | logger.debug("Loaded QML file") 60 | sys.exit(app.exec()) 61 | 62 | if __name__ == "__main__": 63 | main() -------------------------------------------------------------------------------- /screenvivid/models/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/models/.DS_Store -------------------------------------------------------------------------------- /screenvivid/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .logger import LoggerModel 2 | from .screen_recorder import ScreenRecorderModel 3 | from .video_controller import VideoControllerModel 4 | from .window_controller import WindowControllerModel 5 | from .click_track import ClipTrackModel -------------------------------------------------------------------------------- /screenvivid/models/logger.py: -------------------------------------------------------------------------------- 1 | from PySide6.QtCore import QObject, Slot 2 | from screenvivid.utils.logging import logger 3 | 4 | class LoggerModel(QObject): 5 | def __init__(self): 6 | super().__init__() 7 | 8 | @Slot(str) 9 | def info(self, message): 10 | logger.info(message) 11 | 12 | @Slot(str) 13 | def debug(self, message): 14 | logger.debug(message) 15 | 16 | @Slot(str) 17 | def warning(self, message): 18 | logger.warning(message) 19 | 20 | @Slot(str) 21 | def error(self, message): 22 | logger.error(message) 23 | -------------------------------------------------------------------------------- /screenvivid/models/screen_capture.py: -------------------------------------------------------------------------------- 1 | from screenvivid.utils.general import get_os_name 2 | 3 | class BaseScreenCapture: 4 | def __init__(self, region=None): 5 | self._region = region 6 | 7 | def __enter__(self): 8 | """ 9 | Called when entering the context. 10 | Prepares resources if necessary. 11 | """ 12 | return self 13 | 14 | def __exit__(self, exc_type, exc_value, traceback): 15 | """ 16 | Called when exiting the context. 17 | Cleans up resources if necessary. 18 | """ 19 | self.cleanup() 20 | 21 | def capture(self): 22 | """ 23 | Capture the screen or region. Must be implemented by subclasses. 24 | """ 25 | raise NotImplementedError("Subclasses must implement the 'capture' method.") 26 | 27 | def cleanup(self): 28 | """ 29 | Clean up resources. Subclasses can override this method. 30 | """ 31 | pass 32 | 33 | class MSSScreenCapture(BaseScreenCapture): 34 | def __init__(self, region=None): 35 | super().__init__(region) 36 | import mss 37 | self._sct = mss.mss() 38 | self._region = self._get_mss_region(region) 39 | 40 | def _get_mss_region(self, region): 41 | """ 42 | Get the monitor (screen) details based on the region. 43 | If region is None, capture the entire screen. Otherwise, capture the specified region. 44 | """ 45 | if region: 46 | region = list(map(int, region)) 47 | return {"top": region[1], "left": region[0], "width": region[2], "height": region[3]} 48 | else: 49 | return self._sct.monitors[0] 50 | 51 | def capture(self): 52 | """ 53 | Capture the screen or a specified region using mss. 54 | :return: Raw image bytes in RGB format. 55 | """ 56 | screenshot = self._sct.grab(self._region) 57 | bgra = screenshot.bgra 58 | 59 | return bgra, "bgra" 60 | 61 | def cleanup(self): 62 | """ 63 | Cleanup resources specific to mss. 64 | """ 65 | if hasattr(self, '_sct'): 66 | self._sct.close() 67 | 68 | class QuartzScreenCapture(BaseScreenCapture): 69 | def capture(self): 70 | """ 71 | Capture the screen or region using Quartz on macOS. 72 | :return: Image bytes of the captured screen. 73 | """ 74 | import objc 75 | import Foundation 76 | import Quartz 77 | import UniformTypeIdentifiers 78 | 79 | with objc.autorelease_pool(): 80 | if self._region: 81 | region = list(map(int, self._region)) 82 | rect = Quartz.CGRectMake(region[0], region[1], region[2], region[3]) 83 | screenshot = Quartz.CGDisplayCreateImage(Quartz.CGMainDisplayID()) 84 | screenshot_region = Quartz.CGImageCreateWithImageInRect(screenshot, rect) 85 | else: 86 | screenshot_region = Quartz.CGDisplayCreateImage(Quartz.CGMainDisplayID()) 87 | 88 | data = Foundation.NSMutableData.data() 89 | dest = Quartz.CGImageDestinationCreateWithData( 90 | data, 91 | UniformTypeIdentifiers.UTTypeJPEG.identifier(), 92 | 1, 93 | None 94 | ) 95 | Quartz.CGImageDestinationAddImage(dest, screenshot_region, None) 96 | Quartz.CGImageDestinationFinalize(dest) 97 | return bytes(data), "jpeg" 98 | 99 | 100 | def get_screen_capture_class(region=None): 101 | """ 102 | Factory method to return the appropriate ScreenCapture class based on OS. 103 | """ 104 | if get_os_name() == "macos": # macOS 105 | return QuartzScreenCapture 106 | else: # Linux, Windows 107 | return MSSScreenCapture -------------------------------------------------------------------------------- /screenvivid/models/utils/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/models/utils/.DS_Store -------------------------------------------------------------------------------- /screenvivid/models/utils/cursor/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/models/utils/cursor/.DS_Store -------------------------------------------------------------------------------- /screenvivid/models/utils/cursor/__init__.py: -------------------------------------------------------------------------------- 1 | from .cursor import CursorLoaderThread 2 | from .cursor import get_cursor_state -------------------------------------------------------------------------------- /screenvivid/models/utils/manager/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/models/utils/manager/.DS_Store -------------------------------------------------------------------------------- /screenvivid/models/utils/manager/undo_redo.py: -------------------------------------------------------------------------------- 1 | 2 | class UndoRedoManager: 3 | def __init__(self): 4 | self.undo_stack = [] 5 | self.redo_stack = [] 6 | 7 | def do_action(self, action, undo_action): 8 | self.undo_stack.append(undo_action) 9 | self.redo_stack.clear() 10 | action() 11 | 12 | def undo(self): 13 | if self.undo_stack: 14 | action = self.undo_stack.pop() 15 | self.redo_stack.append(action[0]) 16 | action[1]() 17 | 18 | def redo(self): 19 | if self.redo_stack: 20 | action = self.redo_stack.pop() 21 | self.undo_stack.append(action) 22 | action[0]() 23 | 24 | def can_undo(self): 25 | return len(self.undo_stack) > 0 26 | 27 | def can_redo(self): 28 | return len(self.redo_stack) > 0 29 | -------------------------------------------------------------------------------- /screenvivid/models/window_controller.py: -------------------------------------------------------------------------------- 1 | from PySide6.QtCore import ( 2 | QObject, Property, Slot, Signal, QPoint 3 | ) 4 | from PySide6.QtGui import QGuiApplication 5 | 6 | class WindowControllerModel(QObject): 7 | 8 | topChanged = Signal(int) 9 | leftChanged = Signal(int) 10 | widthChanged = Signal() 11 | heightChanged = Signal() 12 | 13 | def __init__(self) -> None: 14 | super().__init__() 15 | self._window_geometry = None 16 | 17 | @Property(int, notify=topChanged) 18 | def top(self): 19 | return self._window_geometry.top() 20 | 21 | @Property(int, notify=leftChanged) 22 | def left(self): 23 | return self._window_geometry.left() 24 | 25 | @Property(int, notify=widthChanged) 26 | def width(self): 27 | return self._window_geometry.width() 28 | 29 | @Property(int, notify=heightChanged) 30 | def height(self): 31 | return self._window_geometry.height() 32 | 33 | @Slot(result="QPoint") 34 | def get_window_position(self): 35 | screen = QGuiApplication.primaryScreen() 36 | available_geometry = screen.availableGeometry() 37 | 38 | self._window_geometry = available_geometry 39 | return QPoint(available_geometry.x(), available_geometry.y()) 40 | -------------------------------------------------------------------------------- /screenvivid/qml/components/AnchorButton.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | import QtQuick.Controls 3 | import QtQuick.Layouts 4 | 5 | Button { 6 | id: anchorButton 7 | 8 | property int startX 9 | property int startY 10 | required property string name 11 | 12 | background: Rectangle { 13 | width: anchorButton.width 14 | height: anchorButton.height 15 | color: "white" 16 | radius: parent.width / 2 17 | } 18 | 19 | contentItem: Item { 20 | width: anchorButton.width 21 | height: anchorButton.height 22 | } 23 | 24 | MouseArea { 25 | id: anchorButtonMouseArea 26 | anchors.fill: parent 27 | hoverEnabled: true 28 | cursorShape: Qt.SizeBDiagCursor 29 | 30 | onPressed: { 31 | var pos = anchorButton.mapToItem(customSelector, mouseX, mouseY) 32 | startX = pos.x 33 | startY = pos.y 34 | } 35 | 36 | onPositionChanged: { 37 | var pos = anchorButtonMouseArea.mapToItem(customSelector, mouseX, mouseY) 38 | customSelector.resizeSelector(anchorButton, pressed, pos.x, pos.y) 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /screenvivid/qml/components/CustomButton.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | import QtQuick.Controls 3 | import QtQuick.Layouts 4 | import QtQuick.Controls.Material 5 | 6 | Button { 7 | id: customButton 8 | property color primaryColor: Material.primaryColor 9 | property color pressedColor: Material.accentColor 10 | property color hoverColor: Qt.lighter(primaryColor, 1.1) 11 | property int buttonRadius: 10 12 | property string iconSource: "" 13 | property int iconSize: 24 14 | 15 | background: Rectangle { 16 | color: customButton.down ? pressedColor : primaryColor 17 | Behavior on color { 18 | ColorAnimation { 19 | duration: 200 20 | } 21 | } 22 | radius: buttonRadius 23 | } 24 | 25 | contentItem: RowLayout { 26 | spacing: 8 27 | 28 | Image { 29 | source: customButton.iconSource 30 | sourceSize.width: customButton.iconSize 31 | sourceSize.height: customButton.iconSize 32 | Layout.alignment: Qt.AlignVCenter 33 | visible: source !== "" 34 | } 35 | 36 | Text { 37 | text: customButton.text 38 | font: customButton.font 39 | color: "white" 40 | horizontalAlignment: Text.AlignHCenter 41 | verticalAlignment: Text.AlignVCenter 42 | elide: Text.ElideRight 43 | Layout.fillWidth: true 44 | Layout.alignment: Qt.AlignVCenter 45 | } 46 | } 47 | 48 | HoverHandler { 49 | onHoveredChanged: { 50 | if (hovered) { 51 | customButton.background.color = hoverColor 52 | } else { 53 | customButton.background.color = primaryColor 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /screenvivid/qml/components/ModeButton.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | import QtQuick.Controls 3 | 4 | Button { 5 | id: modeButton 6 | 7 | required property string iconPath 8 | property string toolTipText: "" 9 | property bool activated: false 10 | 11 | background: Rectangle { 12 | anchors.fill: parent 13 | color: "transparent" 14 | } 15 | 16 | contentItem: Rectangle { 17 | id: content 18 | anchors.fill: parent 19 | color: modeButton.hovered ? (modeButton.activated ? "#101010" : "#242424") : (modeButton.activated ? "#151515" : "transparent") 20 | radius: 8 21 | 22 | Image { 23 | anchors.top: parent.top 24 | anchors.topMargin: 10 25 | anchors.horizontalCenter: parent.horizontalCenter 26 | width: 28 27 | height: 28 28 | source: iconPath 29 | fillMode: Image.PreserveAspectFit 30 | } 31 | 32 | Text { 33 | anchors.bottom: parent.bottom 34 | anchors.horizontalCenter: parent.horizontalCenter 35 | anchors.bottomMargin: 4 36 | text: modeButton.text 37 | color: "#A9A9A9" // Darker text color 38 | font.pixelSize: 11 39 | } 40 | } 41 | 42 | 43 | ToolTip { 44 | visible: hovered 45 | delay: 800 46 | timeout: 5000 47 | text: qsTr(toolTipText) 48 | 49 | background: Rectangle { 50 | color: "#1d1d1d" 51 | radius: 10 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /screenvivid/qml/components/RecordButton.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | import QtQuick.Controls 3 | import QtQuick.Layouts 4 | 5 | ToolButton { 6 | id: root 7 | icon.source: "qrc:/resources/icons/record.svg" 8 | icon.width: 26 9 | icon.height: 26 10 | 11 | Behavior on icon.color { 12 | ColorAnimation { 13 | duration: 200 14 | } 15 | } 16 | 17 | background: Rectangle { 18 | radius: width / 2 19 | color: root.hovered ? "#242424" : "#212121" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /screenvivid/qml/entry/ScreenVivid.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | import QtQuick.Window 3 | import QtQuick.Layouts 4 | import QtQuick.Controls.Material 5 | import QtQuick.Dialogs 6 | import "../components" 7 | 8 | Window { 9 | id: startupWindow 10 | visible: true 11 | width: Screen.width 12 | height: Screen.height 13 | visibility: Qt.platform.os === "osx" ? Window.Windowed : Window.FullScreen 14 | flags: Qt.FramelessWindowHint 15 | color: "transparent" 16 | title: qsTr("ScreenVivid") 17 | 18 | property string selectedMode: "screen" 19 | property bool showCountdownFlag: false 20 | property bool showStudioFlag: false 21 | readonly property string selectionColor: "#e85c0d" 22 | 23 | Item { 24 | id: homeItem 25 | anchors.fill: parent 26 | focus: true 27 | 28 | Rectangle { 29 | id: background 30 | anchors.fill: parent 31 | color: "transparent" 32 | } 33 | 34 | // Visualize selected region in screen mode mode 35 | Rectangle { 36 | id: screenModeSelector 37 | anchors.fill: parent 38 | color: Qt.rgba(0.91, 0.36, 0.05, 0.3) 39 | border.width: 2 40 | border.color: startupWindow.selectionColor 41 | visible: startupWindow.selectedMode == "screen" 42 | } 43 | 44 | // Visualize selected region in window mode 45 | Item { 46 | id: safeAreaModeSelector 47 | anchors.fill: parent 48 | visible: startupWindow.selectedMode == "safeArea" 49 | Rectangle { 50 | x: windowController.left 51 | y: windowController.top 52 | width: Screen.desktopAvailableWidth 53 | height: Screen.desktopAvailableHeight 54 | color: Qt.rgba(0.91, 0.36, 0.05, 0.3) 55 | border.width: 2 56 | border.color: startupWindow.selectionColor 57 | } 58 | } 59 | 60 | CustomSelector { 61 | id: customSelector 62 | visible: startupWindow.selectedMode == "custom" 63 | } 64 | 65 | // Control panel 66 | ControlPanel { 67 | id: controlPanel 68 | Component.onCompleted: { 69 | // Set the position of the control panel to the bottom of the screen 70 | controlPanel.x = (Screen.width - controlPanel.width) / 2 71 | controlPanel.y = Screen.height - controlPanel.height - controlPanel.bottomMargin 72 | } 73 | } 74 | 75 | FileDialog { 76 | id: videoFileDialog 77 | nameFilters: ["Video files (*.mp4 *.avi *.webm)"] 78 | onAccepted: { 79 | startupWindow.visible = true 80 | if (selectedFile) { 81 | const metadata = { 82 | 'mouse_events': {'click': [], 'move': {}}, 83 | 'region': [], 84 | 'recording': false 85 | } 86 | var success = videoController.load_video(selectedFile, 87 | metadata) 88 | 89 | if (success) { 90 | if (videoController.fps <= 0 || videoController.fps > 200 || videoController.total_frames <= 0) { 91 | errorDialog.open() 92 | } else { 93 | clipTrackModel.set_fps(videoController.fps) 94 | clipTrackModel.set_video_len(0, videoController.video_len) 95 | 96 | studioLoader.source = "" 97 | studioLoader.source = "qrc:/qml/studio/Studio.qml" 98 | studioLoader.item.showMaximized() 99 | startupWindow.hide() 100 | } 101 | } else { 102 | errorDialog.open() 103 | } 104 | } 105 | } 106 | 107 | onRejected: { 108 | startupWindow.showFullScreen() 109 | } 110 | } 111 | 112 | Keys.onPressed: event => { 113 | if (event.key === Qt.Key_Escape) { 114 | Qt.quit() 115 | } 116 | } 117 | } 118 | 119 | Loader { 120 | id: countdownLoader 121 | } 122 | 123 | Loader { 124 | id: studioLoader 125 | } 126 | 127 | Component.onCompleted: { 128 | // Set device pixel ratio 129 | screenRecorder.device_pixel_ratio = Screen.devicePixelRatio 130 | videoController.device_pixel_ratio = Screen.devicePixelRatio 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /screenvivid/qml/entry/main.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2 | import QtQuick.Window 3 | import QtQuick.Controls.Material 4 | 5 | Window { 6 | id: mainWindow 7 | width: Screen.desktopAvailableWidth 8 | height: Screen.desktopAvailableHeight 9 | visible: true 10 | color: "transparent" 11 | title: qsTr("ScreenVivid") 12 | 13 | Component.onCompleted: { 14 | logger.debug("Getting window position") 15 | windowController.get_window_position() 16 | screenvivid.source = "" 17 | screenvivid.source = "qrc:/qml/entry/ScreenVivid.qml" 18 | mainWindow.hide() 19 | logger.debug("Hide initial window and open control window") 20 | } 21 | 22 | Loader { id: screenvivid } 23 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/MainContent.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Layouts 6.7 3 | import QtQuick.Controls 6.7 4 | 5 | ColumnLayout { 6 | Layout.fillWidth: true 7 | Layout.fillHeight: true 8 | Layout.minimumHeight: 400 9 | Layout.minimumWidth: 400 10 | 11 | VideoPreview { 12 | Layout.fillWidth: true 13 | Layout.fillHeight: true 14 | } 15 | 16 | ControlButtons { 17 | Layout.fillWidth: true 18 | Layout.preferredHeight: 50 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /screenvivid/qml/studio/TimeSlider.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Controls 6.7 3 | 4 | Item { 5 | id: timeSlider 6 | width: 20 7 | height: 220 8 | 9 | property string color: "#484554" 10 | property bool animationEnabled: true // Property to enable/disable animation 11 | 12 | Rectangle { 13 | id: timeSliderHead 14 | width: parent.width 15 | height: parent.width 16 | radius: parent.width / 2 17 | 18 | color: parent.color 19 | 20 | MouseArea { 21 | anchors.fill: parent 22 | 23 | drag { 24 | target: timeSlider 25 | axis: Drag.XAxis 26 | smoothed: true 27 | minimumX: 0 28 | } 29 | 30 | onReleased: { 31 | var currentFrame = Math.round( 32 | timeSlider.x / studioWindow.pixelsPerFrame) 33 | videoController.jump_to_frame(currentFrame) 34 | } 35 | } 36 | } 37 | 38 | Rectangle { 39 | id: timeSliderBody 40 | width: 3 41 | height: parent.height 42 | anchors.horizontalCenter: parent.horizontalCenter 43 | color: parent.color 44 | } 45 | 46 | Behavior on x { 47 | enabled: animationEnabled 48 | NumberAnimation { 49 | duration: 50 50 | easing.type: Easing.Linear 51 | } 52 | } 53 | 54 | Connections { 55 | target: videoController 56 | function onCurrentFrameChanged(currentFrame) { 57 | timeSlider.x = currentFrame * studioWindow.pixelsPerFrame 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /screenvivid/qml/studio/Timeline.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Controls.Material 6.7 3 | import QtQuick.Layouts 6.7 4 | 5 | // Timeline 6 | Repeater { 7 | model: Math.ceil(studioWindow.videoLen) + 1 8 | 9 | Item { 10 | width: studioWindow.fps * studioWindow.pixelsPerFrame 11 | height: 60 12 | x: studioWindow.fps * studioWindow.pixelsPerFrame * index 13 | // y: 10 14 | 15 | readonly property int timeLabelWidth: 20 16 | 17 | Item { 18 | width: parent.timeLabelWidth 19 | height: parent.height 20 | 21 | ColumnLayout { 22 | anchors.fill: parent 23 | spacing: 10 24 | 25 | Item { 26 | Layout.fillHeight: true 27 | Layout.fillWidth: true 28 | } 29 | 30 | Label { 31 | Layout.alignment: Qt.AlignCenter 32 | text: qsTr("" + index) 33 | } 34 | 35 | Item { 36 | Layout.alignment: Qt.AlignCenter 37 | 38 | Rectangle { 39 | width: 4 40 | height: 4 41 | radius: 2 42 | color: "white" 43 | anchors.centerIn: parent 44 | } 45 | } 46 | 47 | Item { 48 | Layout.fillHeight: true 49 | Layout.fillWidth: true 50 | } 51 | } 52 | } 53 | MouseArea { 54 | anchors.fill: parent 55 | onClicked: { 56 | var xPos = Math.max( 57 | 0, 58 | studioWindow.fps * studioWindow.pixelsPerFrame * index + mouseX 59 | - parent.timeLabelWidth / 2) 60 | var currentFrame = Math.round( 61 | xPos / studioWindow.pixelsPerFrame) 62 | videoController.jump_to_frame( 63 | currentFrame) 64 | } 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/TopBar.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Controls 6.7 3 | import QtQuick.Layouts 6.7 4 | 5 | Item { 6 | id: root 7 | Layout.fillWidth: true 8 | Layout.preferredHeight: 60 9 | 10 | readonly property color accentColor: "#545EEE" 11 | readonly property color accentColorLight: "#7778FF" 12 | signal exportClicked() 13 | 14 | RowLayout { 15 | anchors.fill: parent 16 | anchors.leftMargin: 20 17 | anchors.rightMargin: 20 18 | 19 | Item { 20 | Layout.fillWidth: true 21 | } 22 | 23 | Button { 24 | id: exportButton 25 | text: qsTr("Export") 26 | Layout.preferredWidth: 120 27 | Layout.preferredHeight: 50 28 | background: Rectangle { 29 | radius: 8 30 | gradient: Gradient { 31 | GradientStop { position: 0.0; color: exportButton.pressed ? Qt.darker(root.accentColor, 1.4) : 32 | exportButton.hovered ? Qt.darker(root.accentColor, 1.2) : root.accentColor } 33 | GradientStop { position: 1.0; color: exportButton.pressed ? Qt.darker(root.accentColorLight, 1.2) : 34 | exportButton.hovered ? Qt.darker(root.accentColorLight, 1.1) : root.accentColorLight } 35 | } 36 | Behavior on gradient { 37 | ColorAnimation { duration: 150 } 38 | } 39 | } 40 | 41 | contentItem: RowLayout { 42 | spacing: 4 43 | Image { 44 | source: "qrc:/resources/icons/export.svg" 45 | sourceSize: Qt.size(20, 20) 46 | Layout.alignment: Qt.AlignVCenter 47 | } 48 | Text { 49 | text: exportButton.text 50 | color: "#FFFFFF" 51 | Layout.alignment: Qt.AlignVCenter 52 | } 53 | } 54 | 55 | MouseArea { 56 | anchors.fill: parent 57 | hoverEnabled: true 58 | cursorShape: Qt.PointingHandCursor 59 | 60 | onPressed: { 61 | videoController.pause() 62 | exportDialog.open() 63 | } 64 | } 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/VideoEdit.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Controls 6.7 3 | 4 | Rectangle { 5 | id: videoEdit 6 | color: "#131519" 7 | radius: 4 8 | 9 | property bool animationEnabled: true 10 | 11 | Flickable { 12 | id: scrollView 13 | anchors.fill: parent 14 | contentWidth: studioWindow.fps * studioWindow.videoLen * studioWindow.pixelsPerFrame + 200 15 | contentHeight: parent.height 16 | property real currentScrollX: 0 17 | 18 | ScrollBar.horizontal: ScrollBar { 19 | id: hScrollBar 20 | background: Rectangle { 21 | color: "transparent" 22 | } 23 | contentItem: Rectangle { 24 | implicitWidth: 100 25 | implicitHeight: 10 26 | radius: height / 2 27 | color: { 28 | if (hScrollBar.pressed) return "#81848c" // Pressed state 29 | if (hScrollBar.hovered) return "#6e7177" // Hover state 30 | return "#5d6067" // Normal state 31 | } 32 | } 33 | } 34 | 35 | Behavior on contentX { 36 | enabled: !isPlaying 37 | NumberAnimation { 38 | duration: 400 39 | easing.type: Easing.InOutQuad 40 | } 41 | } 42 | 43 | Item { 44 | width: parent.contentWidth 45 | height: videoEdit.height 46 | anchors.left: parent.left 47 | anchors.leftMargin: 20 48 | 49 | Timeline {} 50 | 51 | Item { 52 | id: tracks 53 | width: parent.width 54 | height: 60 55 | y: 75 56 | anchors.left: parent.left 57 | anchors.leftMargin: 10 58 | 59 | Repeater { 60 | model: clipTrackModel 61 | ClipTrack { 62 | x: modelData.x 63 | height: 60 64 | width: modelData.width 65 | clipLen: modelData.clip_len 66 | onLeftMouseClicked: function (mouseX) { 67 | timeSlider.animationEnabled = false 68 | var targetFrame = Math.round( 69 | (x + mouseX) / studioWindow.pixelsPerFrame) 70 | videoController.jump_to_frame(targetFrame) 71 | clipTrackModel.set_cut_clip_data(index, mouseX) 72 | timeSlider.animationEnabled = true 73 | } 74 | } 75 | } 76 | } 77 | 78 | TimeSlider { 79 | id: timeSlider 80 | onXChanged: { 81 | var timeSliderGlobalX = timeSlider.mapToItem(scrollView, timeSlider.x, 0).x 82 | var viewportWidth = scrollView.width 83 | var threshold = viewportWidth * 0.85 84 | 85 | // Kiểm tra xem timeSlider có vượt quá ngưỡng bên phải không 86 | if (timeSliderGlobalX > threshold) { 87 | // Tính toán vị trí mới cho contentX để giữ timeSlider trong tầm nhìn 88 | var newContentX = timeSlider.x - (viewportWidth * 0.5) 89 | // Đảm bảo contentX không vượt quá giới hạn 90 | newContentX = Math.min(newContentX, scrollView.contentWidth - viewportWidth) 91 | newContentX = Math.max(0, newContentX) 92 | scrollView.contentX = newContentX 93 | } 94 | 95 | // Kiểm tra xem timeSlider có vượt quá ngưỡng bên trái không 96 | var leftThreshold = viewportWidth * 0.15 97 | if (timeSliderGlobalX < leftThreshold) { 98 | var newContentX = timeSlider.x - (viewportWidth * 0.5) 99 | newContentX = Math.max(0, newContentX) 100 | scrollView.contentX = newContentX 101 | } 102 | } 103 | } 104 | } 105 | } 106 | 107 | Connections { 108 | target: videoController 109 | function onPlayingChanged(playing) { 110 | if (!playing) { 111 | animationEnabled = true 112 | } 113 | } 114 | } 115 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/sidebar/SideBar.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Layouts 6.7 3 | import QtQuick.Controls 6.7 4 | import "./background_settings" 5 | import "./shape_settings" 6 | import "./cursor_settings" 7 | 8 | Rectangle { 9 | id: sidebarRoot 10 | Layout.fillHeight: true 11 | implicitWidth: 400 12 | color: "#131519" 13 | radius: 4 14 | 15 | Flickable { 16 | id: flickable 17 | anchors.fill: parent 18 | contentWidth: parent.width 19 | contentHeight: contentColumn.height 20 | clip: true 21 | 22 | ScrollBar.vertical: ScrollBar { 23 | id: hScrollBar 24 | background: Rectangle { 25 | color: "transparent" 26 | } 27 | contentItem: Rectangle { 28 | implicitHeight: 100 29 | implicitWidth: 10 30 | radius: height / 2 31 | color: { 32 | if (hScrollBar.pressed) return "#81848c" // Pressed state 33 | if (hScrollBar.hovered) return "#6e7177" // Hover state 34 | return "#5d6067" // Normal state 35 | } 36 | } 37 | } 38 | 39 | ColumnLayout { 40 | id: contentColumn 41 | width: parent.width 42 | spacing: 30 43 | 44 | anchors { 45 | left: parent.left 46 | right: parent.right 47 | top: parent.top 48 | margins: 20 49 | } 50 | 51 | BackgroundSettings { 52 | Layout.fillWidth: true 53 | Layout.preferredHeight: 300 54 | } 55 | 56 | ShapeSettings { 57 | Layout.fillWidth: true 58 | Layout.preferredHeight: 200 59 | } 60 | 61 | CursorSettings { 62 | Layout.fillWidth: true 63 | Layout.preferredHeight: 120 64 | } 65 | 66 | // Add some extra space at the bottom to ensure all content is accessible 67 | Item { 68 | Layout.fillWidth: true 69 | Layout.preferredHeight: 20 70 | } 71 | } 72 | } 73 | 74 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/sidebar/background_settings/BackgroundSettings.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Controls.Material 6.7 3 | import QtQuick.Layouts 6.7 4 | 5 | Item { 6 | id: root 7 | Layout.fillWidth: true 8 | Layout.preferredHeight: 500 9 | 10 | ColumnLayout { 11 | anchors.fill: parent 12 | spacing: 10 13 | 14 | RowLayout { 15 | Layout.fillWidth: true 16 | Layout.preferredHeight: 40 17 | spacing: 12 18 | Image { 19 | source: "qrc:/resources/icons/background.svg" 20 | sourceSize: Qt.size(24, 24) 21 | Layout.alignment: Qt.AlignVCenter 22 | } 23 | Label { 24 | text: qsTr("Background") 25 | font.pixelSize: 18 26 | font.weight: Font.Medium 27 | color: "#FFFFFF" 28 | } 29 | } 30 | 31 | TabBar { 32 | id: backgroundSettingsBar 33 | Layout.fillWidth: true 34 | Layout.preferredHeight: 40 35 | background: Rectangle { 36 | color: "#2A2E32" 37 | radius: 8 38 | } 39 | Repeater { 40 | model: ["Wallpaper", "Gradient", "Color", "Image"] 41 | TabButton { 42 | text: modelData 43 | Layout.fillWidth: true 44 | height: 40 45 | contentItem: Text { 46 | text: parent.text 47 | font: parent.font 48 | color: parent.checked ? "#FFFFFF" : "#AAAAAA" 49 | horizontalAlignment: Text.AlignHCenter 50 | verticalAlignment: Text.AlignVCenter 51 | } 52 | background: Rectangle { 53 | color: parent.checked ? Material.primary : "transparent" 54 | radius: 8 55 | } 56 | } 57 | } 58 | } 59 | 60 | ScrollView { 61 | Layout.fillWidth: true 62 | Layout.fillHeight: true 63 | clip: true 64 | ScrollBar.vertical.policy: ScrollBar.AsNeeded 65 | 66 | StackLayout { 67 | width: root.width 68 | currentIndex: backgroundSettingsBar.currentIndex 69 | 70 | WallpaperPage {} 71 | GradientPage {} 72 | ColorPage {} 73 | ImagePage {} 74 | } 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/sidebar/background_settings/ColorPage.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Layouts 6.7 3 | import QtQuick.Controls 6.7 4 | import QtQuick.Dialogs 6.7 5 | 6 | Item { 7 | id: root 8 | Layout.fillWidth: true 9 | Layout.fillHeight: true 10 | 11 | property int gridColumns: 7 12 | property int coloCount: 20 13 | 14 | GridView { 15 | id: gridView 16 | anchors.fill: parent 17 | cellWidth: width / root.gridColumns 18 | cellHeight: cellWidth 19 | model: ['#FF3131', '#FF5757', '#FF66C4', '#CB6CE6', '#8C52FF', '#5E17EB', '#0097B2', '#0CC0DF', '#5CE1E6', '#38B6FF', '#5271FF', '#004AAD', '#00BF63', '#7ED957', '#C1FF72', '#FA7420', '+'] 20 | 21 | delegate: Item { 22 | width: gridView.cellWidth 23 | height: gridView.cellHeight 24 | 25 | Item { 26 | anchors.fill: parent 27 | 28 | Rectangle { 29 | anchors.centerIn: parent 30 | width: Math.min(parent.width, parent.height) * 0.9 31 | height: width 32 | color: modelData 33 | radius: 8 34 | border.color: "#303030" 35 | border.width: 2 36 | visible: modelData.startsWith("#") 37 | 38 | MouseArea { 39 | anchors.fill: parent 40 | onClicked: { 41 | videoController.background = { 42 | "type": "color", 43 | "value": modelData 44 | } 45 | if (!isPlaying) { 46 | videoController.get_current_frame() 47 | } 48 | } 49 | } 50 | } 51 | 52 | Rectangle { 53 | anchors.centerIn: parent 54 | width: Math.min(parent.width, parent.height) * 0.9 55 | height: width 56 | 57 | color: "white" 58 | radius: 8 59 | border.color: "#303030" 60 | border.width: 2 61 | visible: modelData === "+" 62 | 63 | Text { 64 | anchors.centerIn: parent 65 | text: "+" 66 | font.pixelSize: 24 67 | } 68 | 69 | MouseArea { 70 | anchors.fill: parent 71 | onClicked: colorDialog.open() 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | ColorDialog { 79 | id: colorDialog 80 | title: "Choose a color" 81 | onAccepted: { 82 | var hexColor = "#" + colorDialog.selectedColor.toString().substr(1) 83 | videoController.background = { 84 | "type": "color", 85 | "value": hexColor 86 | } 87 | if (!isPlaying) { 88 | videoController.get_current_frame() 89 | } 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /screenvivid/qml/studio/sidebar/background_settings/ImagePage.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Controls 6.7 3 | import QtQuick.Layouts 6.7 4 | import QtQuick.Controls.Material 6.7 5 | import QtQuick.Dialogs 6.7 6 | 7 | Item { 8 | id: imagePage 9 | width: parent.width 10 | height: parent.height 11 | 12 | ColumnLayout { 13 | anchors.fill: parent 14 | spacing: 10 15 | 16 | Rectangle { 17 | Layout.fillWidth: true 18 | Layout.preferredHeight: Math.min(parent.height * 0.7, 300) 19 | color: "transparent" 20 | border.width: 2 21 | border.color: dropArea.containsDrag ? Material.accent : "lightgray" 22 | radius: 8 23 | 24 | DropArea { 25 | id: dropArea 26 | anchors.fill: parent 27 | onEntered: (drag) => { drag.accept(Qt.LinkAction); } 28 | onDropped: (drop) => { handleDrop(drop) } 29 | 30 | Image { 31 | id: imagePreview 32 | anchors.fill: parent 33 | anchors.margins: 4 34 | fillMode: Image.PreserveAspectFit 35 | visible: source.toString() !== "" 36 | opacity: dropArea.containsDrag ? 0.7 : 1 37 | 38 | Behavior on opacity { NumberAnimation { duration: 150 } } 39 | } 40 | 41 | ColumnLayout { 42 | anchors.centerIn: parent 43 | spacing: 10 44 | visible: imagePreview.source.toString() === "" 45 | 46 | Image { 47 | Layout.alignment: Qt.AlignHCenter 48 | source: "qrc:/resources/icons/upload.svg" 49 | width: 48 50 | height: 48 51 | } 52 | 53 | Text { 54 | Layout.alignment: Qt.AlignHCenter 55 | color: "white" 56 | text: "Drag and drop an image here\nor click to select" 57 | horizontalAlignment: Text.AlignHCenter 58 | } 59 | } 60 | 61 | MouseArea { 62 | anchors.fill: parent 63 | onClicked: fileDialog.open() 64 | cursorShape: Qt.PointingHandCursor 65 | } 66 | } 67 | } 68 | 69 | RowLayout { 70 | Layout.fillWidth: true 71 | visible: imagePreview.source.toString() !== "" 72 | spacing: 2 73 | 74 | ToolButton { 75 | icon.source: "qrc:/resources/icons/upload.svg" 76 | onClicked: fileDialog.open() 77 | } 78 | 79 | ToolButton { 80 | icon.source: "qrc:/resources/icons/trash.svg" 81 | 82 | onClicked: { 83 | imagePreview.source = "" 84 | videoController.background = { "type": "color", "value": "#000000" } 85 | if (!isPlaying) { 86 | videoController.get_current_frame() 87 | } 88 | } 89 | } 90 | } 91 | 92 | Text { 93 | Layout.fillWidth: true 94 | color: "white" 95 | text: imagePreview.source.toString() !== "" 96 | ? "Current image: " + imagePreview.source.toString().split('/').pop() 97 | : "No image selected" 98 | elide: Text.ElideMiddle 99 | font.italic: true 100 | } 101 | 102 | Item { 103 | Layout.fillWidth: true 104 | Layout.fillHeight: true 105 | } 106 | } 107 | 108 | FileDialog { 109 | id: fileDialog 110 | title: "Select an image" 111 | nameFilters: ["Image files (*.png *.jpg *.jpeg *.bmp)"] 112 | onAccepted: { 113 | handleFileSelection(selectedFile) 114 | } 115 | } 116 | 117 | function handleDrop(drop) { 118 | if (drop.hasUrls) { 119 | imagePreview.source = drop.urls[0] 120 | updateBackgroundImage(drop.urls[0]) 121 | } 122 | } 123 | 124 | function handleFileSelection(file) { 125 | imagePreview.source = file 126 | updateBackgroundImage(file) 127 | } 128 | 129 | function updateBackgroundImage(file) { 130 | videoController.background = { 131 | "type": "image", 132 | "value": file 133 | } 134 | if (!isPlaying) { 135 | videoController.get_current_frame() 136 | } 137 | } 138 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/sidebar/background_settings/WallpaperPage.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Layouts 6.7 3 | import QtQuick.Effects 4 | 5 | Item { 6 | id: root 7 | Layout.fillWidth: true 8 | Layout.fillHeight: true 9 | 10 | property int gridColumns: 7 11 | property int thumbnailCount: 17 12 | 13 | GridView { 14 | id: gridView 15 | anchors.fill: parent 16 | cellWidth: width / root.gridColumns 17 | cellHeight: cellWidth 18 | model: root.thumbnailCount 19 | 20 | delegate: Item { 21 | width: gridView.cellWidth 22 | height: gridView.cellHeight 23 | 24 | Item { 25 | width: gridView.cellWidth 26 | height: gridView.cellHeight 27 | 28 | Rectangle { 29 | anchors.centerIn: parent 30 | width: Math.min(parent.width, parent.height) * 0.9 31 | height: width 32 | color: "transparent" 33 | 34 | Image { 35 | id: thumbnail 36 | anchors.fill: parent 37 | anchors.margins: 1 38 | source: "qrc:/resources/images/wallpapers/thumbnails/gradient-wallpaper-" 39 | + (index + 1).toString().padStart(4, '0') + ".jpg" 40 | fillMode: Image.PreserveAspectCrop 41 | visible: false 42 | } 43 | 44 | MultiEffect { 45 | source: thumbnail 46 | anchors.fill: thumbnail 47 | maskEnabled: true 48 | maskSource: mask 49 | } 50 | 51 | Item { 52 | id: mask 53 | width: thumbnail.width 54 | height: thumbnail.height 55 | layer.enabled: true 56 | visible: false 57 | 58 | Rectangle { 59 | id: maskRect 60 | width: parent.width 61 | height: parent.height 62 | radius: 8 63 | color: "black" 64 | } 65 | } 66 | 67 | Rectangle { 68 | anchors.fill: parent 69 | color: "transparent" 70 | border.color: "#303030" 71 | border.width: 2 72 | radius: 8 73 | } 74 | } 75 | 76 | MouseArea { 77 | anchors.fill: parent 78 | onClicked: { 79 | videoController.background = { 80 | "type": "wallpaper", 81 | "value": index + 1 82 | } 83 | if (!isPlaying) { 84 | videoController.get_current_frame() 85 | } 86 | } 87 | } 88 | } 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /screenvivid/qml/studio/sidebar/cursor_settings/CursorSettings.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 6.7 2 | import QtQuick.Controls 6.7 3 | import QtQuick.Layouts 6.7 4 | 5 | Item { 6 | id: root 7 | Layout.fillWidth: true 8 | Layout.preferredHeight: 120 9 | 10 | property int selectedSize: 0 11 | 12 | ColumnLayout { 13 | anchors.fill: parent 14 | spacing: 16 15 | 16 | RowLayout { 17 | Layout.fillWidth: true 18 | spacing: 12 19 | 20 | Image { 21 | source: "qrc:/resources/icons/cursor.svg" 22 | sourceSize: Qt.size(24, 24) 23 | Layout.alignment: Qt.AlignVCenter 24 | } 25 | 26 | Label { 27 | text: qsTr("Cursor") 28 | font.pixelSize: 18 29 | font.weight: Font.Medium 30 | color: "#FFFFFF" 31 | } 32 | } 33 | 34 | Label { 35 | text: qsTr("Size") 36 | font.pixelSize: 14 37 | color: "#AAAAAA" 38 | } 39 | 40 | RowLayout { 41 | Layout.fillWidth: true 42 | spacing: 12 43 | 44 | Repeater { 45 | model: ["1x", "1.5x", "2x", "3x"] 46 | 47 | delegate: Button { 48 | text: modelData 49 | Layout.fillWidth: true 50 | Layout.preferredHeight: 40 51 | 52 | background: Rectangle { 53 | color: root.selectedSize === index ? "#3A3F4B" : "#222529" 54 | radius: 8 55 | } 56 | 57 | contentItem: Text { 58 | text: modelData 59 | color: root.selectedSize === index ? "#FFFFFF" : "#AAAAAA" 60 | font.pixelSize: 14 61 | horizontalAlignment: Text.AlignHCenter 62 | verticalAlignment: Text.AlignVCenter 63 | } 64 | 65 | onClicked: { 66 | root.selectedSize = index 67 | videoController.cursor_scale = parseFloat(modelData.replace("x", "")) 68 | if (!isPlaying) { 69 | videoController.get_current_frame() 70 | } 71 | } 72 | } 73 | } 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /screenvivid/resources/icons.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | ../resources/icons/add.svg 4 | ../resources/icons/back.svg 5 | ../resources/icons/background.svg 6 | ../resources/icons/border.svg 7 | ../resources/icons/clip.svg 8 | ../resources/icons/clock.svg 9 | ../resources/icons/close.svg 10 | ../resources/icons/cursor.svg 11 | ../resources/icons/custom.svg 12 | ../resources/icons/cut.svg 13 | ../resources/icons/export.svg 14 | ../resources/icons/folder.svg 15 | ../resources/icons/mouse.svg 16 | ../resources/icons/next.svg 17 | ../resources/icons/shape.svg 18 | ../resources/icons/padding.svg 19 | ../resources/icons/inset.svg 20 | ../resources/icons/pause.svg 21 | ../resources/icons/stop.svg 22 | ../resources/icons/play.svg 23 | ../resources/icons/prev.svg 24 | ../resources/icons/record.svg 25 | ../resources/icons/scale.svg 26 | ../resources/icons/screen.svg 27 | ../resources/icons/drag_indicator.svg 28 | ../resources/icons/monitor.svg 29 | ../resources/icons/trash.svg 30 | ../resources/icons/upload.svg 31 | ../resources/icons/safe_area.svg 32 | ../resources/icons/zoom.svg 33 | ../resources/icons/full_screen.svg 34 | ../resources/icons/exit_full_screen.svg 35 | ../resources/icons/screenvivid.svg 36 | 37 | 38 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/add.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/back.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/background.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/border.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/clip.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/clock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/cursor.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/custom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/cut.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/drag_indicator.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/exit_full_screen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/export.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/folder.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/full_screen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/inset.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/monitor.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/mouse.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/padding.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/pause.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/play.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/prev.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/record.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/safe_area.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/scale.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/screen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/screenvivid.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/icons/screenvivid.icns -------------------------------------------------------------------------------- /screenvivid/resources/icons/screenvivid.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/icons/screenvivid.ico -------------------------------------------------------------------------------- /screenvivid/resources/icons/screenvivid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/icons/screenvivid.png -------------------------------------------------------------------------------- /screenvivid/resources/icons/screenvivid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/shape.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/stop.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/trash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/upload.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/icons/zoom.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenvivid/resources/images.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0001.jpg 4 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0002.jpg 5 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0003.jpg 6 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0004.jpg 7 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0005.jpg 8 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0006.jpg 9 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0007.jpg 10 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0008.jpg 11 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0009.jpg 12 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0010.jpg 13 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0011.jpg 14 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0012.jpg 15 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0013.jpg 16 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0014.jpg 17 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0015.jpg 18 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0016.jpg 19 | ../resources/images/wallpapers/thumbnails/gradient-wallpaper-0017.jpg 20 | 21 | 22 | -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/linux/1.5x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/linux/1.5x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/linux/1x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/linux/1x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/linux/2x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/linux/2x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/linux/3x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/linux/3x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/macos/1.5x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/macos/1.5x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/macos/1x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/macos/1x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/macos/2x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/macos/2x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/macos/3x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/macos/3x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/windows/1.5x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/windows/1.5x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/windows/1x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/windows/1x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/windows/2x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/windows/2x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/default/windows/3x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/default/windows/3x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1.5x/IBeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1.5x/IBeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1.5x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1.5x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1.5x/closedHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1.5x/closedHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1.5x/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1.5x/crosshair.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1.5x/openHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1.5x/openHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1.5x/pointingHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1.5x/pointingHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1x/IBeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1x/IBeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1x/closedHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1x/closedHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1x/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1x/crosshair.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1x/openHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1x/openHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/1x/pointingHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/1x/pointingHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/2x/IBeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/2x/IBeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/2x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/2x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/2x/closedHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/2x/closedHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/2x/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/2x/crosshair.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/2x/openHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/2x/openHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/2x/pointingHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/2x/pointingHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/3x/IBeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/3x/IBeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/3x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/3x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/3x/closedHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/3x/closedHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/3x/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/3x/crosshair.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/3x/openHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/3x/openHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/3x/pointingHand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/macos/3x/pointingHand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/macos/offsets.json: -------------------------------------------------------------------------------- 1 | { 2 | "arrow": { 3 | "3x": [ 4 | 15, 5 | 12 6 | ], 7 | "2x": [ 8 | 10, 9 | 8 10 | ], 11 | "1.5x": [ 12 | 8, 13 | 6 14 | ], 15 | "1x": [ 16 | 5, 17 | 4 18 | ] 19 | }, 20 | "IBeam": { 21 | "3x": [ 22 | 48, 23 | 48 24 | ], 25 | "2x": [ 26 | 32, 27 | 32 28 | ], 29 | "1.5x": [ 30 | 24, 31 | 24 32 | ], 33 | "1x": [ 34 | 16, 35 | 16 36 | ] 37 | }, 38 | "crosshair": { 39 | "3x": [ 40 | 48, 41 | 48 42 | ], 43 | "2x": [ 44 | 32, 45 | 32 46 | ], 47 | "1.5x": [ 48 | 24, 49 | 24 50 | ], 51 | "1x": [ 52 | 16, 53 | 16 54 | ] 55 | }, 56 | "closedHand": { 57 | "3x": [ 58 | 48, 59 | 48 60 | ], 61 | "2x": [ 62 | 32, 63 | 32 64 | ], 65 | "1.5x": [ 66 | 24, 67 | 24 68 | ], 69 | "1x": [ 70 | 16, 71 | 16 72 | ] 73 | }, 74 | "openHand": { 75 | "3x": [ 76 | 48, 77 | 48 78 | ], 79 | "2x": [ 80 | 32, 81 | 32 82 | ], 83 | "1.5x": [ 84 | 24, 85 | 24 86 | ], 87 | "1x": [ 88 | 16, 89 | 16 90 | ] 91 | }, 92 | "pointingHand": { 93 | "3x": [ 94 | 34, 95 | 12 96 | ], 97 | "2x": [ 98 | 23, 99 | 8 100 | ], 101 | "1.5x": [ 102 | 17, 103 | 6 104 | ], 105 | "1x": [ 106 | 12, 107 | 4 108 | ] 109 | } 110 | } -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/appstarting_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/appstarting_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/cross.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/hand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/help.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/ibeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/ibeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/no.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/person.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/pin.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/sizeall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/sizeall.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/sizenesw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/sizenesw.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/sizens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/sizens.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/sizenwse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/sizenwse.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/sizewe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/sizewe.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/uparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/uparrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1.5x/wait_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1.5x/wait_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/appstarting_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/appstarting_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/cross.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/hand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/help.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/ibeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/ibeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/no.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/person.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/pin.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/sizeall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/sizeall.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/sizenesw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/sizenesw.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/sizens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/sizens.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/sizenwse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/sizenwse.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/sizewe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/sizewe.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/uparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/uparrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/1x/wait_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/1x/wait_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/appstarting_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/appstarting_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/cross.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/hand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/help.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/ibeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/ibeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/no.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/person.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/pin.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/sizeall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/sizeall.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/sizenesw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/sizenesw.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/sizens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/sizens.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/sizenwse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/sizenwse.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/sizewe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/sizewe.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/uparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/uparrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/2x/wait_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/2x/wait_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/appstarting_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/appstarting_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/arrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/cross.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/hand.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/help.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/ibeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/ibeam.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/no.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/person.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/pin.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/sizeall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/sizeall.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/sizenesw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/sizenesw.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/sizens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/sizens.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/sizenwse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/sizenwse.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/sizewe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/sizewe.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/uparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/uparrow.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_1.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_10.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_11.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_12.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_13.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_14.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_15.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_16.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_17.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_18.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_2.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_3.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_4.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_5.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_6.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_7.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_8.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/3x/wait_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/cursor/windows/3x/wait_9.png -------------------------------------------------------------------------------- /screenvivid/resources/images/cursor/windows/offsets.json: -------------------------------------------------------------------------------- 1 | { 2 | "arrow": { 3 | "3x": [ 4 | 0, 5 | 0 6 | ], 7 | "2x": [ 8 | 0, 9 | 0 10 | ], 11 | "1.5x": [ 12 | 0, 13 | 0 14 | ], 15 | "1x": [ 16 | 0, 17 | 0 18 | ] 19 | }, 20 | "ibeam": { 21 | "3x": [ 22 | 47, 23 | 45 24 | ], 25 | "2x": [ 26 | 30, 27 | 30 28 | ], 29 | "1.5x": [ 30 | 23, 31 | 23 32 | ], 33 | "1x": [ 34 | 15, 35 | 15 36 | ] 37 | }, 38 | "wait": { 39 | "3x": [ 40 | 0, 41 | 24 42 | ], 43 | "2x": [ 44 | 0, 45 | 16 46 | ], 47 | "1.5x": [ 48 | 0, 49 | 12 50 | ], 51 | "1x": [ 52 | 0, 53 | 8 54 | ] 55 | }, 56 | "cross": { 57 | "3x": [ 58 | 45, 59 | 47 60 | ], 61 | "2x": [ 62 | 30, 63 | 31 64 | ], 65 | "1.5x": [ 66 | 23, 67 | 23 68 | ], 69 | "1x": [ 70 | 16, 71 | 16 72 | ] 73 | }, 74 | "uparrow": { 75 | "3x": [ 76 | 16, 77 | 0 78 | ], 79 | "2x": [ 80 | 9, 81 | 0 82 | ], 83 | "1.5x": [ 84 | 7, 85 | 0 86 | ], 87 | "1x": [ 88 | 5, 89 | 0 90 | ] 91 | }, 92 | "sizenwse": { 93 | "3x": [ 94 | 27, 95 | 27 96 | ], 97 | "2x": [ 98 | 18, 99 | 18 100 | ], 101 | "1.5x": [ 102 | 13, 103 | 13 104 | ], 105 | "1x": [ 106 | 9, 107 | 9 108 | ] 109 | }, 110 | "sizenesw": { 111 | "3x": [ 112 | 29, 113 | 27 114 | ], 115 | "2x": [ 116 | 18, 117 | 18 118 | ], 119 | "1.5x": [ 120 | 13, 121 | 13 122 | ], 123 | "1x": [ 124 | 9, 125 | 9 126 | ] 127 | }, 128 | "sizewe": { 129 | "3x": [ 130 | 36, 131 | 16 132 | ], 133 | "2x": [ 134 | 22, 135 | 9 136 | ], 137 | "1.5x": [ 138 | 17, 139 | 7 140 | ], 141 | "1x": [ 142 | 11, 143 | 4 144 | ] 145 | }, 146 | "sizens": { 147 | "3x": [ 148 | 16, 149 | 34 150 | ], 151 | "2x": [ 152 | 9, 153 | 23 154 | ], 155 | "1.5x": [ 156 | 6, 157 | 16 158 | ], 159 | "1x": [ 160 | 4, 161 | 11 162 | ] 163 | }, 164 | "sizeall": { 165 | "3x": [ 166 | 37, 167 | 38 168 | ], 169 | "2x": [ 170 | 24, 171 | 24 172 | ], 173 | "1.5x": [ 174 | 17, 175 | 18 176 | ], 177 | "1x": [ 178 | 11, 179 | 11 180 | ] 181 | }, 182 | "no": { 183 | "3x": [ 184 | 30, 185 | 30 186 | ], 187 | "2x": [ 188 | 20, 189 | 20 190 | ], 191 | "1.5x": [ 192 | 15, 193 | 15 194 | ], 195 | "1x": [ 196 | 10, 197 | 10 198 | ] 199 | }, 200 | "hand": { 201 | "3x": [ 202 | 27, 203 | 0 204 | ], 205 | "2x": [ 206 | 17, 207 | 0 208 | ], 209 | "1.5x": [ 210 | 11, 211 | 0 212 | ], 213 | "1x": [ 214 | 7, 215 | 0 216 | ] 217 | }, 218 | "appstarting": { 219 | "3x": [ 220 | 48, 221 | 48 222 | ], 223 | "2x": [ 224 | 32, 225 | 32 226 | ], 227 | "1.5x": [ 228 | 24, 229 | 24 230 | ], 231 | "1x": [ 232 | 16, 233 | 16 234 | ] 235 | }, 236 | "help": { 237 | "3x": [ 238 | 0, 239 | 0 240 | ], 241 | "2x": [ 242 | 0, 243 | 0 244 | ], 245 | "1.5x": [ 246 | 0, 247 | 0 248 | ], 249 | "1x": [ 250 | 0, 251 | 0 252 | ] 253 | } 254 | } -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/.gitattributes: -------------------------------------------------------------------------------- 1 | *.psd filter=lfs diff=lfs merge=lfs -text 2 | *.png filter=lfs diff=lfs merge=lfs -text 3 | -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/.gitkeep -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0001.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0002.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0003.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0004.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0005.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0006.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0007.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0008.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0009.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0010.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0011.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0011.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0012.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0013.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0014.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0015.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0016.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/hires/gradient-wallpaper-0017.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0001.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0002.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0003.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0004.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0005.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0006.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0007.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0008.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0009.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0010.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0011.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0011.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0012.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0013.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0014.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0015.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0016.jpg -------------------------------------------------------------------------------- /screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/screenvivid/resources/images/wallpapers/thumbnails/gradient-wallpaper-0017.jpg -------------------------------------------------------------------------------- /screenvivid/resources/main.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | ../qml/entry/main.qml 4 | ../qml/entry/ScreenVivid.qml 5 | ../qml/entry/ControlPanel.qml 6 | ../qml/entry/CustomSelector.qml 7 | 8 | ../qml/components/ModeButton.qml 9 | ../qml/components/CustomButton.qml 10 | ../qml/components/RecordButton.qml 11 | ../qml/components/AnchorButton.qml 12 | 13 | ../qml/countdown/Countdown.qml 14 | 15 | ../qml/studio/ExportDialog.qml 16 | ../qml/studio/MainContent.qml 17 | 18 | ../qml/studio/sidebar/SideBar.qml 19 | ../qml/studio/sidebar/background_settings/BackgroundSettings.qml 20 | ../qml/studio/sidebar/background_settings/WallpaperPage.qml 21 | ../qml/studio/sidebar/background_settings/GradientPage.qml 22 | ../qml/studio/sidebar/background_settings/ColorPage.qml 23 | ../qml/studio/sidebar/background_settings/ImagePage.qml 24 | ../qml/studio/sidebar/shape_settings/ShapeSettings.qml 25 | ../qml/studio/sidebar/cursor_settings/CursorSettings.qml 26 | 27 | ../qml/studio/Studio.qml 28 | ../qml/studio/TopBar.qml 29 | ../qml/studio/ControlButtons.qml 30 | ../qml/studio/VideoPreview.qml 31 | ../qml/studio/VideoEdit.qml 32 | ../qml/studio/ClipTrack.qml 33 | ../qml/studio/Timeline.qml 34 | ../qml/studio/TimeSlider.qml 35 | 36 | 37 | -------------------------------------------------------------------------------- /screenvivid/utils/general.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import platform 4 | import tempfile 5 | from pathlib import Path 6 | from datetime import datetime 7 | 8 | import numpy as np 9 | from screenvivid.utils.logging import logger 10 | 11 | def str2bool(x: str) -> bool: 12 | x = x.lower() 13 | return x == "true" or x == "1" 14 | 15 | def generate_video_path(prefix: str = "ScreenVivid", extension: str = ".mp4"): 16 | # Use the system"s temporary directory 17 | root = Path(tempfile.gettempdir()) 18 | 19 | # Create a unique file name using current datetime 20 | time_str = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") 21 | file_name = f"{prefix}_{time_str}{extension}" 22 | 23 | # Generate the full path 24 | return str(root / file_name) 25 | 26 | 27 | def hex_to_rgb(hex_color): 28 | hex_color = hex_color.lstrip("#") 29 | r = int(hex_color[0:2], 16) 30 | g = int(hex_color[2:4], 16) 31 | b = int(hex_color[4:6], 16) 32 | return r, g, b 33 | 34 | 35 | def create_gradient_image(width, height, first_color, second_color, angle): 36 | first_color = hex_to_rgb(first_color) 37 | second_color = hex_to_rgb(second_color) 38 | 39 | angle_rad = np.radians(angle) 40 | 41 | x, y = np.meshgrid(np.arange(width), np.arange(height)) 42 | 43 | gradient = (x * np.cos(angle_rad) + y * np.sin(angle_rad)) / np.sqrt(width**2 + height**2) 44 | 45 | gradient = (gradient - gradient.min()) / (gradient.max() - gradient.min()) 46 | 47 | r = (second_color[0] - first_color[0]) * gradient + first_color[0] 48 | g = (second_color[1] - first_color[1]) * gradient + first_color[1] 49 | b = (second_color[2] - first_color[2]) * gradient + first_color[2] 50 | 51 | gradient_image = np.dstack((b, g, r)).astype(np.uint8) 52 | 53 | return gradient_image 54 | 55 | def get_os_name(): 56 | system_code = platform.system().lower() 57 | os_name = "unknown" 58 | if system_code == "windows": 59 | os_name = "windows" 60 | elif system_code == "linux": 61 | os_name = "linux" 62 | elif system_code == "darwin": 63 | os_name = "macos" 64 | return os_name 65 | 66 | def get_ffmpeg_path(): 67 | """ 68 | Get the FFmpeg executable path based on the operating system and environment. 69 | Returns the path wrapped in appropriate quotes if needed. 70 | 71 | Returns: 72 | str: The quoted path to the FFmpeg executable 73 | """ 74 | if os.getenv("FFMPEG_PATH"): 75 | ffmpeg_path = os.environ["FFMPEG_PATH"] 76 | else: 77 | os_name = get_os_name() 78 | 79 | # Set base path based on environment 80 | if os_name == "linux": 81 | base_path = Path("") 82 | else: 83 | if getattr(sys, 'frozen', False): 84 | # If running in a PyInstaller bundle 85 | base_path = Path(sys._MEIPASS) 86 | else: 87 | # If running in a regular Python environment 88 | base_path = Path(__file__).parents[2] 89 | 90 | # Set binary name based on OS 91 | ffmpeg_binary_name = "ffmpeg.exe" if os_name == "windows" else "ffmpeg" 92 | 93 | # Construct full path 94 | ffmpeg_path = str(base_path / ffmpeg_binary_name) 95 | 96 | return ffmpeg_path 97 | 98 | def generate_temp_file(extension): 99 | return tempfile.mktemp(suffix=extension) 100 | 101 | def safe_delete(file_path): 102 | if file_path and os.path.exists(file_path): 103 | try: 104 | os.remove(file_path) 105 | except: 106 | logger.warning(f"Failed to remove {file_path}") 107 | -------------------------------------------------------------------------------- /screenvivid/utils/logging.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import tempfile 4 | from loguru import logger 5 | 6 | logger.remove() 7 | 8 | log_level = os.getenv("SCREENVIVID_LOG_LEVEL", "INFO") 9 | if log_level not in ["DEBUG", "INFO", "WARNING", "ERROR"]: 10 | log_level = "INFO" 11 | 12 | # Check if sys.stderr is not None before adding it as a handler 13 | if sys.stderr is not None: 14 | logger.add(sys.stderr, level=log_level) 15 | 16 | logger.add( 17 | os.path.join(tempfile.gettempdir(), "screenvivid.log"), 18 | rotation="5 MB", 19 | level=log_level 20 | ) -------------------------------------------------------------------------------- /scripts/install-linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # ANSI color codes 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[1;33m' 7 | BLUE='\033[0;34m' 8 | NC='\033[0m' # No Color 9 | 10 | # Unicode characters 11 | CHECK_MARK='\u2714' 12 | CROSS_MARK='\u2718' 13 | ARROW='\u2192' 14 | 15 | total_steps=6 16 | 17 | log_step() { 18 | step=$1 19 | step_title=$2 20 | printf "${BLUE}[%s/%s]${NC} ${ARROW} ${YELLOW}%s${NC}\n" "$step" "$total_steps" "$step_title" 21 | } 22 | 23 | handle_error() { 24 | error_message=$1 25 | printf "${RED}${CROSS_MARK} Error: %s${NC}\n" "$error_message" 26 | exit 1 27 | } 28 | 29 | log_success() { 30 | message=$1 31 | printf "${GREEN}${CHECK_MARK} %s${NC}\n" "$message" 32 | } 33 | 34 | check_python_version() { 35 | log_step 1 "Checking Python version" 36 | if command -v python3 &>/dev/null; then 37 | python_version=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:3])))') 38 | if [ "$(printf '%s\n' "3.9" "$python_version" | sort -V | head -n1)" = "3.9" ]; then 39 | log_success "Python version $python_version detected" 40 | return 0 41 | else 42 | handle_error "Python version 3.9 or higher is required. Your version: $python_version" 43 | fi 44 | else 45 | handle_error "Python 3 is not installed. Please install Python 3.9 or higher." 46 | fi 47 | } 48 | 49 | create_virtual_environment() { 50 | log_step 2 "Creating virtual environment" 51 | python3 -m venv "$HOME/.local/screenvivid_env" || handle_error "Failed to create virtual environment." 52 | source "$HOME/.local/screenvivid_env/bin/activate" || handle_error "Failed to activate virtual environment." 53 | log_success "Virtual environment created and activated" 54 | } 55 | 56 | install_app() { 57 | log_step 3 "Installing ScreenVivid" 58 | if [ ! -d $HOME/.local/screenvivid_env/screenvivid ]; then 59 | git clone --quiet https://github.com/tamnguyenvan/screenvivid.git $HOME/.local/screenvivid_env/screenvivid || handle_error "Failed to clone the repository." 60 | fi 61 | cd $HOME/.local/screenvivid_env/screenvivid || handle_error "Failed to navigate to the ScreenVivid directory." 62 | pip install "python-xlib>=0.33,<1.0" -q -q -q --exists-action i || handle_error "Failed to install required packages." 63 | pip install -r requirements.txt -q -q -q --exists-action i || handle_error "Failed to install required packages." 64 | log_success "ScreenVivid installed successfully" 65 | } 66 | 67 | create_startup_script() { 68 | log_step 4 "Creating startup script" 69 | mkdir -p $HOME/.local/bin 70 | cat > "$HOME/.local/bin/screenvivid" << EOL 71 | #!/bin/bash 72 | source "$HOME/.local/screenvivid_env/bin/activate" 73 | cd $HOME/.local/screenvivid_env/screenvivid 74 | python -m screenvivid.main 75 | EOL 76 | chmod +x "$HOME/.local/bin/screenvivid" || handle_error "Failed to make the startup script executable." 77 | log_success "Startup script created" 78 | } 79 | 80 | add_local_bin_to_path() { 81 | log_step 5 "Adding ~/.local/bin to PATH" 82 | if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then 83 | echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc" 84 | source "$HOME/.bashrc" || handle_error "Failed to reload .bashrc" 85 | fi 86 | log_success "~/.local/bin added to PATH" 87 | } 88 | 89 | create_desktop_file() { 90 | log_step 6 "Creating desktop entry" 91 | mkdir -p $HOME/.local/share/applications 92 | cat > "$HOME/.local/share/applications/screenvivid.desktop" << EOL 93 | [Desktop Entry] 94 | Name=ScreenVivid 95 | Exec=$HOME/.local/bin/screenvivid 96 | Icon=$HOME/.local/share/icons/screenvivid.png 97 | Type=Application 98 | Categories=Utility; 99 | Comment=ScreenVivid Application 100 | EOL 101 | log_success "Desktop entry created" 102 | } 103 | 104 | download_icon() { 105 | icon_url="https://raw.githubusercontent.com/tamnguyenvan/screenvivid/main/screenvivid/resources/icons/screenvivid.png" 106 | icon_path="$HOME/.local/share/icons/screenvivid.png" 107 | mkdir -p "$(dirname "$icon_path")" || handle_error "Failed to create directory for the icon." 108 | curl -sS -o "$icon_path" "$icon_url" || handle_error "Failed to download the application icon." 109 | log_success "Application icon downloaded" 110 | } 111 | 112 | # Main installation process 113 | printf "${YELLOW}=== ScreenVivid Installation ===${NC}\n\n" 114 | 115 | check_python_version 116 | create_virtual_environment 117 | install_app 118 | create_startup_script 119 | add_local_bin_to_path 120 | create_desktop_file 121 | download_icon 122 | 123 | printf "\n${GREEN}${CHECK_MARK} Installation completed successfully.${NC}\n" 124 | printf "${BLUE}${ARROW} You can now find and run ScreenVivid from your application menu.${NC}\n" -------------------------------------------------------------------------------- /scripts/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | . /opt/screenvivid/venv/bin/activate 4 | 5 | cd /opt/screenvivid && python -m screenvivid.main -------------------------------------------------------------------------------- /scripts/uninstall-linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Remove the startup script 4 | rm -f $HOME/.local/bin/screenvivid 5 | 6 | # Remove the virtual environment 7 | rm -rf $HOME/.local/screenvivid_env 8 | 9 | # Remove the desktop entry 10 | rm -f $HOME/.local/share/applications/screenvivid.desktop 11 | 12 | # Remove the icon 13 | rm -f $HOME/.local/share/icons/screenvivid.png 14 | 15 | echo "ScreenVivid has been uninstalled." -------------------------------------------------------------------------------- /scripts/uninstall-macos.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Remove the application link 4 | rm -rf $HOME/Applications/ScreenVivid.app 5 | 6 | # Remove the application icon 7 | rm -f $HOME/Applications/ScreenVivid.app/Contents/Resources/screenvivid.png 8 | 9 | echo "ScreenVivid has been uninstalled." -------------------------------------------------------------------------------- /tests/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tamnguyenvan/screenvivid/1cd016c4d65a3e63ec95938e0763ed4be1f02240/tests/.gitkeep --------------------------------------------------------------------------------