Compare commits
	
		
			117 Commits
		
	
	
		
			clipboard_
			...
			voip_toxav
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 54a57896b6 | |||
| 51ec99a42f | |||
| b5d0d16d31 | |||
| 0039340fd5 | |||
| 45e6fe0033 | |||
| 84c48d7f5a | |||
| acbc1552eb | |||
| 9501292fc9 | |||
| a1d3e0a480 | |||
| 0886e9c8ef | |||
| 064106c6b2 | |||
| 06c7c1fa37 | |||
| 472615a31f | |||
| 0acabf70b7 | |||
| d8a58ee286 | |||
| 28be54ac97 | |||
| ce6febdc29 | |||
| 3d8deb310e | |||
| 248b00dafb | |||
| 59cdb2638f | |||
| 61b9044f94 | |||
| d89ab0bf42 | |||
| b899b8131e | |||
| 3bdf262068 | |||
| c9f34e4656 | |||
| fe6c5391a2 | |||
| 86ce199ac8 | |||
| 557a642ad3 | |||
| fd4c16d090 | |||
| 6af0ddc3ec | |||
| 407c7cfadd | |||
| 3b399fec5c | |||
| 4b9fd6db81 | |||
| 7e92e9808e | |||
| a3c9be2348 | |||
| 73afcfaaeb | |||
| 08c9ba3983 | |||
| ebbaaa93b1 | |||
| f9c9eefb40 | |||
| b133c5f79f | |||
| b48d7e3cfd | |||
| c7ba6d19ad | |||
| 78a2e0751b | |||
| 84b1bb45b9 | |||
| 60f2c07a6a | |||
| 
						 | 
					2abf09ac06 | ||
| f27d178b78 | |||
| b550810db5 | |||
| 09372b3865 | |||
| ca037b6bad | |||
| ac7437c89b | |||
| 99cb817353 | |||
| 3490704d64 | |||
| 43e233c233 | |||
| 468eac8e6b | |||
| d838933e0e | |||
| 66a9271f44 | |||
| 25b55b3530 | |||
| 9fd2440ec6 | |||
| d6d91e61f4 | |||
| 1dccce8097 | |||
| 5230770062 | |||
| 7f2df29304 | |||
| 732e08736f | |||
| d5709c421c | |||
| 18c37f9934 | |||
| 53ae3f8ce5 | |||
| b5e90528f0 | |||
| 22071b60e6 | |||
| 5283df7b98 | |||
| 21243ea979 | |||
| 1d212c5fab | |||
| 37239f1c25 | |||
| 780e1e06d4 | |||
| 7c227457cd | |||
| 5544adf345 | |||
| 6d3ef742b5 | |||
| cba3282dce | |||
| 5c5e830f0f | |||
| e08dbba940 | |||
| 752f2ebe2c | |||
| a47d607a8d | |||
| 5356e59088 | |||
| 2189c4c3cb | |||
| 4b99da5e4e | |||
| 16dc9e4071 | |||
| faad603d88 | |||
| 41c83619b5 | |||
| ea83589a82 | |||
| 727f33ae82 | |||
| 1111a11577 | |||
| 9b163e00d9 | |||
| 183277250f | |||
| 6b96be7a57 | |||
| a2001b34ea | |||
| 85b5c9200a | |||
| 8ab503840a | |||
| 5a2a30ada6 | |||
| 64959270a9 | |||
| 9d6404d130 | |||
| ef4e0d0857 | |||
| 56f1bf559c | |||
| b0e25627b3 | |||
| e7b1eec2cc | |||
| 7a2d7336fb | |||
| fc5023ec1c | |||
| 95eb0eb26d | |||
| d7e658eba6 | |||
| 04191858de | |||
| df449a475c | |||
| 9a95dba138 | |||
| ef79aa8b80 | |||
| ba7188cf66 | |||
| 2d4729a877 | |||
| 8cf1f97ac4 | |||
| 293f4fd0a0 | |||
| 0e8c752df8 | 
							
								
								
									
										133
									
								
								.github/workflows/cd.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -7,8 +7,7 @@ on:
 | 
			
		||||
    branches: [ master ]
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  #BUILD_TYPE: RelWithDebInfo
 | 
			
		||||
  BUILD_TYPE: Debug
 | 
			
		||||
  BUILD_TYPE: RelWithDebInfo
 | 
			
		||||
  BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
@@ -23,10 +22,10 @@ jobs:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies
 | 
			
		||||
      run: sudo apt update && sudo apt -y install libsodium-dev
 | 
			
		||||
      run: sudo apt update && sudo apt -y install libsodium-dev cmake libvpx-dev libopus-dev
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
 | 
			
		||||
      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DTOMATO_TOX_AV=ON
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato
 | 
			
		||||
@@ -51,12 +50,91 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@v4
 | 
			
		||||
      with:
 | 
			
		||||
        # TODO: simpler name?
 | 
			
		||||
        name: ${{ github.event.repository.name }}-${{ steps.tag.outputs.name }}-${{ runner.os }}-ubuntu20.04-x86_64
 | 
			
		||||
        # TODO: do propper packing
 | 
			
		||||
        path: |
 | 
			
		||||
          ${{github.workspace}}/${{ github.event.repository.name }}-${{ steps.tag.outputs.name }}-${{ runner.os }}-ubuntu20.04-x86_64.tar.gz
 | 
			
		||||
 | 
			
		||||
  android:
 | 
			
		||||
    timeout-minutes: 30
 | 
			
		||||
    # contains sections copied from sdl repo
 | 
			
		||||
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        platform:
 | 
			
		||||
          - vcpkg_toolkit: arm64-android
 | 
			
		||||
            ndk_abi: arm64-v8a
 | 
			
		||||
          - vcpkg_toolkit: x64-android
 | 
			
		||||
            ndk_abi: x86_64
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
    - uses: nttld/setup-ndk@v1
 | 
			
		||||
      id: setup_ndk
 | 
			
		||||
      with:
 | 
			
		||||
        local-cache: false # https://github.com/nttld/setup-ndk/issues/518
 | 
			
		||||
        ndk-version: r26d
 | 
			
		||||
 | 
			
		||||
    - uses: actions/setup-java@v4
 | 
			
		||||
      with:
 | 
			
		||||
        distribution: 'temurin'
 | 
			
		||||
        java-version: '17'
 | 
			
		||||
 | 
			
		||||
    - name: update vcpkg
 | 
			
		||||
      run: |
 | 
			
		||||
        git clone https://github.com/microsoft/vcpkg.git
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies (host)
 | 
			
		||||
      run: sudo apt update && sudo apt -y install cmake pkg-config nasm
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies (target)
 | 
			
		||||
      env:
 | 
			
		||||
        ANDROID_NDK_HOME: ${{steps.setup_ndk.outputs.ndk-path}}
 | 
			
		||||
      run: vcpkg install --triplet ${{matrix.platform.vcpkg_toolkit}} --overlay-ports=vcpkg/ports libsodium opus libvpx libpng libjpeg-turbo
 | 
			
		||||
 | 
			
		||||
    # vcpkg scripts root /usr/local/share/vcpkg/scripts
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      env:
 | 
			
		||||
        ANDROID_NDK_HOME: ${{steps.setup_ndk.outputs.ndk-path}}
 | 
			
		||||
      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=${{matrix.platform.vcpkg_toolkit}} -DANDROID=1 -DANDROID_PLATFORM=23 -DANDROID_ABI=${{matrix.platform.ndk_abi}} -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${{steps.setup_ndk.outputs.ndk-path}}/build/cmake/android.toolchain.cmake -DSDLIMAGE_JPG_SHARED=OFF -DSDLIMAGE_PNG_SHARED=OFF -DTOMATO_MAIN_SO=ON -DTOMATO_TOX_AV=ON
 | 
			
		||||
 | 
			
		||||
    - name: Build (tomato)
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato
 | 
			
		||||
 | 
			
		||||
    - name: Build (SDL3-jar) (workaround)
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t SDL3-jar
 | 
			
		||||
 | 
			
		||||
    - name: Build (apk)
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato-apk
 | 
			
		||||
 | 
			
		||||
    - name: Determine tag name
 | 
			
		||||
      id: tag
 | 
			
		||||
      shell: bash
 | 
			
		||||
      # taken from llama.cpp
 | 
			
		||||
      run: |
 | 
			
		||||
        SHORT_HASH="$(git rev-parse --short=7 HEAD)"
 | 
			
		||||
        if [[ "${{ env.BRANCH_NAME }}" == "master" ]]; then
 | 
			
		||||
          echo "name=dev-${SHORT_HASH}" >> $GITHUB_OUTPUT
 | 
			
		||||
        else
 | 
			
		||||
          SAFE_NAME=$(echo "${{ env.BRANCH_NAME }}" | tr '/' '-')
 | 
			
		||||
          echo "name=dev-${SAFE_NAME}-${SHORT_HASH}" >> $GITHUB_OUTPUT
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
    - name: rename apk
 | 
			
		||||
      id: rename_apk
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: mv "${{github.workspace}}/build/android/tomato.apk" "${{github.workspace}}/build/android/${{github.event.repository.name}}-${{steps.tag.outputs.name}}-Android-${{matrix.platform.ndk_abi}}.apk"
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@v4
 | 
			
		||||
      with:
 | 
			
		||||
        name: ${{github.event.repository.name}}-${{steps.tag.outputs.name}}-${{runner.os}}-Android-${{matrix.platform.ndk_abi}}
 | 
			
		||||
        path: |
 | 
			
		||||
          ${{github.workspace}}/build/android/${{github.event.repository.name}}-${{steps.tag.outputs.name}}-Android-${{matrix.platform.ndk_abi}}.apk
 | 
			
		||||
 | 
			
		||||
  windows:
 | 
			
		||||
    timeout-minutes: 15
 | 
			
		||||
@@ -68,14 +146,14 @@ jobs:
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
    - name: update vcpkg
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        cd C:/vcpkg
 | 
			
		||||
        git pull
 | 
			
		||||
    #- name: update vcpkg
 | 
			
		||||
    #  shell: bash
 | 
			
		||||
    #  run: |
 | 
			
		||||
    #    cd C:/vcpkg
 | 
			
		||||
    #    git pull
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies
 | 
			
		||||
      run: vcpkg install libsodium:x64-windows-static pthreads:x64-windows-static pkgconf:x64-windows
 | 
			
		||||
      run: vcpkg install pkgconf:x64-windows libsodium:x64-windows-static pthreads:x64-windows-static opus:x64-windows-static libvpx:x64-windows-static
 | 
			
		||||
 | 
			
		||||
    # setup vs env
 | 
			
		||||
    - uses: ilammy/msvc-dev-cmd@v1
 | 
			
		||||
@@ -86,7 +164,7 @@ jobs:
 | 
			
		||||
    #- uses: ilammy/setup-nasm@v1
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF -DPKG_CONFIG_EXECUTABLE=C:/vcpkg/installed/x64-windows/tools/pkgconf/pkgconf.exe
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDLIMAGE_VENDORED=ON -DSDLIMAGE_DEPS_SHARED=ON -DSDLIMAGE_JXL=OFF -DSDLIMAGE_AVIF=OFF -DPKG_CONFIG_EXECUTABLE=C:/vcpkg/installed/x64-windows/tools/pkgconf/pkgconf.exe -DTOMATO_TOX_AV=ON
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -t tomato
 | 
			
		||||
@@ -104,6 +182,12 @@ jobs:
 | 
			
		||||
          echo "name=dev-${SAFE_NAME}-${SHORT_HASH}" >> $GITHUB_OUTPUT
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
    - name: Clean temporary artifacts
 | 
			
		||||
      # msvc sometimes produces .ilk files, which are used for linking only
 | 
			
		||||
      shell: powershell
 | 
			
		||||
      run: |
 | 
			
		||||
        Remove-Item "${{github.workspace}}/build/bin/*.ilk"
 | 
			
		||||
 | 
			
		||||
    - name: Compress artifacts
 | 
			
		||||
      shell: powershell
 | 
			
		||||
      run: |
 | 
			
		||||
@@ -111,8 +195,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@v4
 | 
			
		||||
      with:
 | 
			
		||||
        # TODO: simpler name?
 | 
			
		||||
        name: ${{ github.event.repository.name }}-${{ steps.tag.outputs.name }}-${{ runner.os }}-msvc-x86_64
 | 
			
		||||
        name: ${{github.event.repository.name}}-${{steps.tag.outputs.name}}-${{runner.os}}-msvc-x86_64
 | 
			
		||||
        # TODO: do propper packing
 | 
			
		||||
        path: |
 | 
			
		||||
          ${{github.workspace}}/${{ github.event.repository.name }}-${{ steps.tag.outputs.name }}-${{ runner.os }}-msvc-x86_64.zip
 | 
			
		||||
@@ -128,14 +211,14 @@ jobs:
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
    - name: update vcpkg
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        cd C:/vcpkg
 | 
			
		||||
        git pull
 | 
			
		||||
    #- name: update vcpkg
 | 
			
		||||
    #  shell: bash
 | 
			
		||||
    #  run: |
 | 
			
		||||
    #    cd C:/vcpkg
 | 
			
		||||
    #    git pull
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies
 | 
			
		||||
      run: vcpkg install libsodium:x64-windows-static pthreads:x64-windows-static pkgconf:x64-windows
 | 
			
		||||
      run: vcpkg install pkgconf:x64-windows libsodium:x64-windows-static pthreads:x64-windows-static opus:x64-windows-static libvpx:x64-windows-static
 | 
			
		||||
 | 
			
		||||
    # setup vs env
 | 
			
		||||
    - uses: ilammy/msvc-dev-cmd@v1
 | 
			
		||||
@@ -146,7 +229,7 @@ jobs:
 | 
			
		||||
    #- uses: ilammy/setup-nasm@v1
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DTOMATO_ASAN=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF -DPKG_CONFIG_EXECUTABLE=C:/vcpkg/installed/x64-windows/tools/pkgconf/pkgconf.exe
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DTOMATO_ASAN=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DSDLIMAGE_VENDORED=ON -DSDLIMAGE_DEPS_SHARED=ON -DSDLIMAGE_JXL=OFF -DSDLIMAGE_AVIF=OFF -DPKG_CONFIG_EXECUTABLE=C:/vcpkg/installed/x64-windows/tools/pkgconf/pkgconf.exe -DTOMATO_TOX_AV=ON
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato
 | 
			
		||||
@@ -164,6 +247,12 @@ jobs:
 | 
			
		||||
          echo "name=dev-${SAFE_NAME}-${SHORT_HASH}" >> $GITHUB_OUTPUT
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
    - name: Clean temporary artifacts
 | 
			
		||||
      # msvc sometimes produces .ilk files, which are used for linking only
 | 
			
		||||
      shell: powershell
 | 
			
		||||
      run: |
 | 
			
		||||
        Remove-Item "${{github.workspace}}/build/bin/*.ilk"
 | 
			
		||||
 | 
			
		||||
    - name: Compress artifacts
 | 
			
		||||
      shell: powershell
 | 
			
		||||
      run: |
 | 
			
		||||
@@ -171,7 +260,6 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@v4
 | 
			
		||||
      with:
 | 
			
		||||
        # TODO: simpler name?
 | 
			
		||||
        name: ${{ github.event.repository.name }}-${{ steps.tag.outputs.name }}-${{ runner.os }}-msvc-asan-x86_64
 | 
			
		||||
        # TODO: do propper packing
 | 
			
		||||
        path: |
 | 
			
		||||
@@ -184,6 +272,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    needs:
 | 
			
		||||
      - linux-ubuntu
 | 
			
		||||
      - android
 | 
			
		||||
      - windows
 | 
			
		||||
      - windows-asan
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										80
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -21,7 +21,7 @@ jobs:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies
 | 
			
		||||
      run: sudo apt update && sudo apt -y install libsodium-dev
 | 
			
		||||
      run: sudo apt update && sudo apt -y install libsodium-dev cmake
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
 | 
			
		||||
@@ -29,6 +29,70 @@ jobs:
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato
 | 
			
		||||
 | 
			
		||||
  android:
 | 
			
		||||
    timeout-minutes: 30
 | 
			
		||||
    # contains sections copied from sdl repo
 | 
			
		||||
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        platform:
 | 
			
		||||
          - vcpkg_toolkit: arm64-android
 | 
			
		||||
            ndk_abi: arm64-v8a
 | 
			
		||||
          - vcpkg_toolkit: x64-android
 | 
			
		||||
            ndk_abi: x86_64
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
    - uses: nttld/setup-ndk@v1
 | 
			
		||||
      id: setup_ndk
 | 
			
		||||
      with:
 | 
			
		||||
        local-cache: false # https://github.com/nttld/setup-ndk/issues/518
 | 
			
		||||
        ndk-version: r26d
 | 
			
		||||
 | 
			
		||||
    - uses: actions/setup-java@v4
 | 
			
		||||
      with:
 | 
			
		||||
        distribution: 'temurin'
 | 
			
		||||
        java-version: '17'
 | 
			
		||||
 | 
			
		||||
    - name: update vcpkg
 | 
			
		||||
      run: |
 | 
			
		||||
        git clone https://github.com/microsoft/vcpkg.git
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies (host)
 | 
			
		||||
      run: sudo apt update && sudo apt -y install cmake pkg-config nasm
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies (target)
 | 
			
		||||
      env:
 | 
			
		||||
        ANDROID_NDK_HOME: ${{steps.setup_ndk.outputs.ndk-path}}
 | 
			
		||||
      run: vcpkg install --triplet ${{matrix.platform.vcpkg_toolkit}} --overlay-ports=vcpkg/ports libsodium opus libvpx libpng libjpeg-turbo
 | 
			
		||||
 | 
			
		||||
    # vcpkg scripts root /usr/local/share/vcpkg/scripts
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      env:
 | 
			
		||||
        ANDROID_NDK_HOME: ${{steps.setup_ndk.outputs.ndk-path}}
 | 
			
		||||
      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=${{matrix.platform.vcpkg_toolkit}} -DANDROID=1 -DANDROID_PLATFORM=23 -DANDROID_ABI=${{matrix.platform.ndk_abi}} -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${{steps.setup_ndk.outputs.ndk-path}}/build/cmake/android.toolchain.cmake -DSDLIMAGE_JPG_SHARED=OFF -DSDLIMAGE_PNG_SHARED=OFF -DTOMATO_MAIN_SO=ON
 | 
			
		||||
 | 
			
		||||
    - name: Build (tomato)
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato
 | 
			
		||||
 | 
			
		||||
    - name: Build (SDL3-jar) (workaround)
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t SDL3-jar
 | 
			
		||||
 | 
			
		||||
    - name: Build (apk)
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato-apk
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@v4
 | 
			
		||||
      with:
 | 
			
		||||
        name: ${{ github.event.repository.name }}-${{matrix.platform.vcpkg_toolkit}}
 | 
			
		||||
        # TODO: do propper packing
 | 
			
		||||
        path: |
 | 
			
		||||
          ${{github.workspace}}/build/android/tomato.apk
 | 
			
		||||
 | 
			
		||||
  macos:
 | 
			
		||||
    timeout-minutes: 10
 | 
			
		||||
 | 
			
		||||
@@ -58,14 +122,14 @@ jobs:
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
    - name: update vcpkg
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        cd C:/vcpkg
 | 
			
		||||
        git pull
 | 
			
		||||
    #- name: update vcpkg
 | 
			
		||||
    #  shell: bash
 | 
			
		||||
    #  run: |
 | 
			
		||||
    #    cd C:/vcpkg
 | 
			
		||||
    #    git pull
 | 
			
		||||
 | 
			
		||||
    - name: Install Dependencies
 | 
			
		||||
      run: vcpkg install libsodium:x64-windows-static pthreads:x64-windows-static pkgconf:x64-windows
 | 
			
		||||
      run: vcpkg install pkgconf:x64-windows libsodium:x64-windows-static pthreads:x64-windows-static opus:x64-windows-static libvpx:x64-windows-static
 | 
			
		||||
 | 
			
		||||
    # setup vs env
 | 
			
		||||
    - uses: ilammy/msvc-dev-cmd@v1
 | 
			
		||||
@@ -76,7 +140,7 @@ jobs:
 | 
			
		||||
    #- uses: ilammy/setup-nasm@v1
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF -DPKG_CONFIG_EXECUTABLE=C:/vcpkg/installed/x64-windows/tools/pkgconf/pkgconf.exe
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDLIMAGE_VENDORED=ON -DSDLIMAGE_DEPS_SHARED=ON -DSDLIMAGE_JXL=OFF -DSDLIMAGE_AVIF=OFF -DPKG_CONFIG_EXECUTABLE=C:/vcpkg/installed/x64-windows/tools/pkgconf/pkgconf.exe
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,11 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
 | 
			
		||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
 | 
			
		||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
 | 
			
		||||
 | 
			
		||||
option(TOMATO_MAIN_SO "Build tomato as a shared object (for eg android apps)" ANDROID)
 | 
			
		||||
option(TOMATO_ASAN "Build tomato with asan (gcc/clang/msvc)" OFF)
 | 
			
		||||
option(TOMATO_TOX_AV "Build tomato with ToxAV" OFF)
 | 
			
		||||
 | 
			
		||||
message("II TOMATO_TOX_AV: ${TOMATO_TOX_AV}")
 | 
			
		||||
 | 
			
		||||
if (TOMATO_ASAN)
 | 
			
		||||
	if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
 | 
			
		||||
@@ -26,6 +30,7 @@ if (TOMATO_ASAN)
 | 
			
		||||
			#link_libraries(-fsanitize=address)
 | 
			
		||||
			link_libraries(-fsanitize=address,undefined)
 | 
			
		||||
			#link_libraries(-fsanitize=undefined)
 | 
			
		||||
			link_libraries(-static-libasan) # make it "work" on nix
 | 
			
		||||
			message("II enabled ASAN")
 | 
			
		||||
		else()
 | 
			
		||||
			message("!! can not enable ASAN on this platform (gcc/clang + win)")
 | 
			
		||||
@@ -43,7 +48,7 @@ endif()
 | 
			
		||||
add_compile_definitions(ENTT_API_EXPORT)
 | 
			
		||||
 | 
			
		||||
# external libs
 | 
			
		||||
add_subdirectory(./external) # before increasing warn levels, sad :(
 | 
			
		||||
add_subdirectory(./external EXCLUDE_FROM_ALL) # before increasing warn levels, sad :(
 | 
			
		||||
 | 
			
		||||
set(CMAKE_CXX_EXTENSIONS OFF)
 | 
			
		||||
 | 
			
		||||
@@ -69,3 +74,10 @@ endif()
 | 
			
		||||
 | 
			
		||||
add_subdirectory(./src)
 | 
			
		||||
 | 
			
		||||
# TODO: move to src
 | 
			
		||||
if (ANDROID AND TARGET SDL3::Jar)
 | 
			
		||||
	message("II building for ANDROID!!!")
 | 
			
		||||
 | 
			
		||||
	add_subdirectory(android)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										100
									
								
								android/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,100 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.14...3.24 FATAL_ERROR)
 | 
			
		||||
 | 
			
		||||
project(tomato_android)
 | 
			
		||||
 | 
			
		||||
# here be dragons
 | 
			
		||||
 | 
			
		||||
list(APPEND CMAKE_MODULE_PATH "${SDL3_SOURCE_DIR}/cmake/android")
 | 
			
		||||
 | 
			
		||||
find_package(SdlAndroid MODULE)
 | 
			
		||||
find_package(Java)
 | 
			
		||||
find_package(SdlAndroidPlatform MODULE)
 | 
			
		||||
# the existence of SDL3::Jar usually implies platform
 | 
			
		||||
if(SdlAndroid_FOUND)
 | 
			
		||||
	include(SdlAndroidFunctions)
 | 
			
		||||
	sdl_create_android_debug_keystore(tomato-debug-keystore)
 | 
			
		||||
	sdl_android_compile_resources(tomato-resources RESFOLDER app/res)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	set(ANDROID_MANIFEST_PACKAGE "org.libsdl.app.tomato")
 | 
			
		||||
	#set(generated_manifest_path "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-src/AndroidManifest.xml")
 | 
			
		||||
	string(REPLACE "." "/" JAVA_PACKAGE_DIR "${ANDROID_MANIFEST_PACKAGE}")
 | 
			
		||||
	#set(GENERATED_SRC_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-src")
 | 
			
		||||
	#set(GENERATED_RES_FOLDER "${GENERATED_SRC_FOLDER}/res")
 | 
			
		||||
	#set(JAVA_PACKAGE_DIR "${GENERATED_SRC_FOLDER}/${JAVA_PACKAGE_DIR}")
 | 
			
		||||
	set(JAVA_PACKAGE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/app/java/${JAVA_PACKAGE_DIR}")
 | 
			
		||||
 | 
			
		||||
	sdl_android_link_resources(tomato-apk-linked
 | 
			
		||||
		MANIFEST "app/AndroidManifest.xml"
 | 
			
		||||
		PACKAGE ${ANDROID_MANIFEST_PACKAGE}
 | 
			
		||||
		RES_TARGETS tomato-resources
 | 
			
		||||
		TARGET_SDK_VERSION 31
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	set(CMAKE_JAVA_COMPILE_FLAGS "-encoding;utf-8")
 | 
			
		||||
	set(classes_path "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/tomato-java.dir/classes")
 | 
			
		||||
	# Some CMake versions have a slow `cmake -E make_directory` implementation
 | 
			
		||||
	if(NOT IS_DIRECTORY "${classes_path}")
 | 
			
		||||
		execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${classes_path}")
 | 
			
		||||
	endif()
 | 
			
		||||
	set(OUT_JAR "${CMAKE_CURRENT_BINARY_DIR}/tomato.jar")
 | 
			
		||||
	# TODO: convert to cmake's add_jar
 | 
			
		||||
	add_custom_command(
 | 
			
		||||
		OUTPUT "${OUT_JAR}"
 | 
			
		||||
		COMMAND ${CMAKE_COMMAND} -E rm -rf "${classes_path}"
 | 
			
		||||
		COMMAND ${CMAKE_COMMAND} -E make_directory "${classes_path}"
 | 
			
		||||
		COMMAND ${Java_JAVAC_EXECUTABLE}
 | 
			
		||||
			-source 1.8 -target 1.8
 | 
			
		||||
			-bootclasspath "$<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>"
 | 
			
		||||
			"${JAVA_PACKAGE_DIR}/TomatoActivity.java"
 | 
			
		||||
			$<TARGET_PROPERTY:tomato-apk-linked,JAVA_R>
 | 
			
		||||
			-cp "$<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>:${SDL_ANDROID_PLATFORM_ANDROID_JAR}"
 | 
			
		||||
			-d "${classes_path}"
 | 
			
		||||
		COMMAND ${Java_JAR_EXECUTABLE} cf "${OUT_JAR}" -C "${classes_path}" .
 | 
			
		||||
		DEPENDS $<TARGET_PROPERTY:tomato-apk-linked,OUTPUTS> "$<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>"
 | 
			
		||||
	)
 | 
			
		||||
	add_custom_target(tomato-jar DEPENDS "${OUT_JAR}")
 | 
			
		||||
	add_dependencies(tomato-jar SDL3::Jar) # HACK: somehow their jar is not registered as an output
 | 
			
		||||
	set_property(TARGET tomato-jar PROPERTY OUTPUT "${OUT_JAR}")
 | 
			
		||||
 | 
			
		||||
	set(dexworkdir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/tomato-dex.dir")
 | 
			
		||||
	# Some CMake versions have a slow `cmake -E make_directory` implementation
 | 
			
		||||
	if(NOT IS_DIRECTORY "${dexworkdir}")
 | 
			
		||||
		execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${dexworkdir}")
 | 
			
		||||
	endif()
 | 
			
		||||
	set(classes_dex_base_name "classes.dex")
 | 
			
		||||
	set(classes_dex "${dexworkdir}/${classes_dex_base_name}")
 | 
			
		||||
	add_custom_command(
 | 
			
		||||
		OUTPUT "${classes_dex}"
 | 
			
		||||
		COMMAND SdlAndroid::d8
 | 
			
		||||
			$<TARGET_PROPERTY:tomato-jar,OUTPUT>
 | 
			
		||||
			$<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>
 | 
			
		||||
			--lib "${SDL_ANDROID_PLATFORM_ANDROID_JAR}"
 | 
			
		||||
			--output "${dexworkdir}"
 | 
			
		||||
		DEPENDS $<TARGET_PROPERTY:tomato-jar,OUTPUT> $<TARGET_PROPERTY:SDL3::Jar,JAR_FILE>
 | 
			
		||||
	)
 | 
			
		||||
	add_custom_target(tomato-dex DEPENDS "${classes_dex}")
 | 
			
		||||
	set_property(TARGET tomato-dex PROPERTY OUTPUT "${classes_dex}")
 | 
			
		||||
	set_property(TARGET tomato-dex PROPERTY OUTPUT_BASE_NAME "${classes_dex_base_name}")
 | 
			
		||||
 | 
			
		||||
	# file(GLOB RESOURCE_FILES *.bmp *.wav *.hex moose.dat utf8.txt)
 | 
			
		||||
 | 
			
		||||
	sdl_add_to_apk_unaligned(tomato-unaligned-apk
 | 
			
		||||
		APK_IN tomato-apk-linked
 | 
			
		||||
		OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/intermediates"
 | 
			
		||||
		#ASSETS ${RESOURCE_FILES}
 | 
			
		||||
		#NATIVE_LIBS SDL3::SDL3-shared tomato
 | 
			
		||||
		NATIVE_LIBS tomato
 | 
			
		||||
		DEX tomato-dex
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	sdl_apk_align(tomato-aligned-apk tomato-unaligned-apk
 | 
			
		||||
		OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/intermediates"
 | 
			
		||||
	)
 | 
			
		||||
	sdl_apk_sign(tomato-apk tomato-aligned-apk
 | 
			
		||||
		KEYSTORE tomato-debug-keystore
 | 
			
		||||
	)
 | 
			
		||||
else()
 | 
			
		||||
	message("EE SdlAndroid module not found")
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										106
									
								
								android/app/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,106 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<!-- Replace com.test.game with the identifier of your game below, e.g.
 | 
			
		||||
	com.gamemaker.game
 | 
			
		||||
-->
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
	package="org.libsdl.app.tomato"
 | 
			
		||||
	android:versionCode="1"
 | 
			
		||||
	android:versionName="1.0"
 | 
			
		||||
	android:installLocation="auto">
 | 
			
		||||
 | 
			
		||||
	<!-- OpenGL ES 2.0 -->
 | 
			
		||||
	<uses-feature android:glEsVersion="0x00020000" />
 | 
			
		||||
 | 
			
		||||
	<!-- Touchscreen support -->
 | 
			
		||||
	<uses-feature
 | 
			
		||||
		android:name="android.hardware.touchscreen"
 | 
			
		||||
		android:required="false" />
 | 
			
		||||
 | 
			
		||||
	<!-- Game controller support -->
 | 
			
		||||
	<uses-feature
 | 
			
		||||
		android:name="android.hardware.bluetooth"
 | 
			
		||||
		android:required="false" />
 | 
			
		||||
	<uses-feature
 | 
			
		||||
		android:name="android.hardware.gamepad"
 | 
			
		||||
		android:required="false" />
 | 
			
		||||
	<uses-feature
 | 
			
		||||
		android:name="android.hardware.usb.host"
 | 
			
		||||
		android:required="false" />
 | 
			
		||||
 | 
			
		||||
	<!-- External mouse input events -->
 | 
			
		||||
	<uses-feature
 | 
			
		||||
		android:name="android.hardware.type.pc"
 | 
			
		||||
		android:required="false" />
 | 
			
		||||
 | 
			
		||||
	<!-- Audio recording support -->
 | 
			
		||||
	<!-- if you want to capture audio, uncomment this. -->
 | 
			
		||||
	<!-- <uses-feature
 | 
			
		||||
		android:name="android.hardware.microphone"
 | 
			
		||||
		android:required="false" /> -->
 | 
			
		||||
 | 
			
		||||
	<!-- Camera support -->
 | 
			
		||||
	<!-- if you want to record video, uncomment this. -->
 | 
			
		||||
	<!--
 | 
			
		||||
	<uses-permission android:name="android.permission.CAMERA" />
 | 
			
		||||
	<uses-feature android:name="android.hardware.camera" />
 | 
			
		||||
	-->
 | 
			
		||||
 | 
			
		||||
	<uses-permission android:name="android.permission.INTERNET" />
 | 
			
		||||
 | 
			
		||||
	<!-- Allow downloading to the external storage on Android 5.1 and older -->
 | 
			
		||||
	<!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="22" /> -->
 | 
			
		||||
 | 
			
		||||
	<!-- Allow access to Bluetooth devices -->
 | 
			
		||||
	<!-- Currently this is just for Steam Controller support and requires setting SDL_HINT_JOYSTICK_HIDAPI_STEAM -->
 | 
			
		||||
	<!-- <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> -->
 | 
			
		||||
	<!-- <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> -->
 | 
			
		||||
 | 
			
		||||
	<!-- Allow access to the vibrator -->
 | 
			
		||||
	<uses-permission android:name="android.permission.VIBRATE" />
 | 
			
		||||
 | 
			
		||||
	<!-- if you want to capture audio, uncomment this. -->
 | 
			
		||||
	<!-- <uses-permission android:name="android.permission.RECORD_AUDIO" /> -->
 | 
			
		||||
 | 
			
		||||
	<!-- Create a Java class extending SDLActivity and place it in a
 | 
			
		||||
		directory under app/src/main/java matching the package, e.g. app/src/main/java/com/gamemaker/game/MyGame.java
 | 
			
		||||
 | 
			
		||||
		then replace "SDLActivity" with the name of your class (e.g. "MyGame")
 | 
			
		||||
		in the XML below.
 | 
			
		||||
 | 
			
		||||
		An example Java class can be found in README-android.md
 | 
			
		||||
	-->
 | 
			
		||||
	<application android:label="@string/app_name"
 | 
			
		||||
		android:icon="@mipmap/ic_launcher"
 | 
			
		||||
		android:appCategory="social"
 | 
			
		||||
		android:allowBackup="true"
 | 
			
		||||
		android:theme="@style/AppTheme"
 | 
			
		||||
		android:hardwareAccelerated="true" >
 | 
			
		||||
 | 
			
		||||
		<!-- setting sdl hints. uses the string value -->
 | 
			
		||||
		<meta-data android:name="SDL_ENV.SDL_ANDROID_BLOCK_ON_PAUSE" android:value="0"/>
 | 
			
		||||
 | 
			
		||||
		<activity android:name="TomatoActivity"
 | 
			
		||||
			android:label="@string/app_name"
 | 
			
		||||
			android:alwaysRetainTaskState="true"
 | 
			
		||||
			android:launchMode="singleInstance"
 | 
			
		||||
			android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
 | 
			
		||||
			android:preferMinimalPostProcessing="true"
 | 
			
		||||
			android:exported="true"
 | 
			
		||||
			>
 | 
			
		||||
			<intent-filter>
 | 
			
		||||
				<action android:name="android.intent.action.MAIN" />
 | 
			
		||||
				<category android:name="android.intent.category.LAUNCHER" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
			<!-- Let Android know that we can handle some USB devices and should receive this event -->
 | 
			
		||||
			<intent-filter>
 | 
			
		||||
				<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
			<!-- Drop file event -->
 | 
			
		||||
			<intent-filter>
 | 
			
		||||
				<action android:name="android.intent.action.VIEW" />
 | 
			
		||||
				<category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
				<data android:mimeType="*/*" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
		</activity>
 | 
			
		||||
	</application>
 | 
			
		||||
</manifest>
 | 
			
		||||
							
								
								
									
										18
									
								
								android/app/java/org/libsdl/app/tomato/TomatoActivity.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,18 @@
 | 
			
		||||
package org.libsdl.app.tomato;
 | 
			
		||||
 | 
			
		||||
import org.libsdl.app.SDLActivity;
 | 
			
		||||
 | 
			
		||||
public class TomatoActivity extends SDLActivity {
 | 
			
		||||
	protected String[] getLibraries() {
 | 
			
		||||
		return new String[] {
 | 
			
		||||
			// "SDL3", // we link statically
 | 
			
		||||
			// "SDL3_image",
 | 
			
		||||
			// "SDL3_mixer",
 | 
			
		||||
			// "SDL3_net",
 | 
			
		||||
			// "SDL3_ttf",
 | 
			
		||||
			// "main"
 | 
			
		||||
			"tomato"
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								android/app/play_store_512.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 94 KiB  | 
							
								
								
									
										6
									
								
								android/app/res/mipmap-anydpi-v26/ic_launcher.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
  <background android:drawable="@mipmap/ic_launcher_background"/>
 | 
			
		||||
  <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
 | 
			
		||||
  <monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
 | 
			
		||||
</adaptive-icon>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-hdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-hdpi/ic_launcher_background.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-hdpi/ic_launcher_foreground.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-hdpi/ic_launcher_monochrome.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-mdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-mdpi/ic_launcher_background.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-mdpi/ic_launcher_foreground.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-mdpi/ic_launcher_monochrome.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 9.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xhdpi/ic_launcher_background.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xhdpi/ic_launcher_foreground.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 9.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xhdpi/ic_launcher_monochrome.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxhdpi/ic_launcher_background.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxhdpi/ic_launcher_foreground.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 16 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxhdpi/ic_launcher_monochrome.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxxhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 28 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxxhdpi/ic_launcher_background.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 41 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxxhdpi/ic_launcher_foreground.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 24 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								android/app/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 15 KiB  | 
							
								
								
									
										6
									
								
								android/app/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <color name="colorPrimary">#3F51B5</color>
 | 
			
		||||
    <color name="colorPrimaryDark">#303F9F</color>
 | 
			
		||||
    <color name="colorAccent">#FF4081</color>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										3
									
								
								android/app/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
<resources>
 | 
			
		||||
    <string name="app_name">Tomato</string>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										10
									
								
								android/app/res/values/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,10 @@
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <!-- Base application theme. -->
 | 
			
		||||
	<!-- <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> -->
 | 
			
		||||
	<!--<style name="AppTheme" parent="android:Theme.AppCompat">-->
 | 
			
		||||
	<style name="AppTheme" parent="android:Theme.NoTitleBar">
 | 
			
		||||
        <!-- Customize your theme here. -->
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										5
									
								
								external/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -2,7 +2,10 @@ cmake_minimum_required(VERSION 3.14...3.24 FATAL_ERROR)
 | 
			
		||||
 | 
			
		||||
add_subdirectory(./entt)
 | 
			
		||||
 | 
			
		||||
add_subdirectory(./json)
 | 
			
		||||
 | 
			
		||||
add_subdirectory(./solanaceae_util)
 | 
			
		||||
add_subdirectory(./solanaceae_object_store)
 | 
			
		||||
add_subdirectory(./solanaceae_contact)
 | 
			
		||||
add_subdirectory(./solanaceae_message3)
 | 
			
		||||
add_subdirectory(./solanaceae_message_serializer)
 | 
			
		||||
@@ -13,8 +16,6 @@ add_subdirectory(./toxcore)
 | 
			
		||||
add_subdirectory(./solanaceae_toxcore)
 | 
			
		||||
add_subdirectory(./solanaceae_tox)
 | 
			
		||||
 | 
			
		||||
add_subdirectory(./solanaceae_object_store)
 | 
			
		||||
 | 
			
		||||
add_subdirectory(./sdl)
 | 
			
		||||
add_subdirectory(./imgui)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								external/imgui/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -18,6 +18,7 @@ add_library(imgui
 | 
			
		||||
	imgui/misc/cpp/imgui_stdlib.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
target_compile_definitions(imgui PUBLIC IMGUI_USE_WCHAR32)
 | 
			
		||||
target_compile_features(imgui PUBLIC cxx_std_11)
 | 
			
		||||
 | 
			
		||||
target_include_directories(imgui PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								external/imgui/imgui/.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1 +1 @@
 | 
			
		||||
custom: ['https://github.com/ocornut/imgui/wiki/Sponsors']
 | 
			
		||||
custom: ['https://github.com/ocornut/imgui/wiki/Funding']
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								external/imgui/imgui/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -3,6 +3,7 @@
 | 
			
		||||
 | 
			
		||||
## Dear ImGui artifacts
 | 
			
		||||
imgui.ini
 | 
			
		||||
imgui*.ini
 | 
			
		||||
 | 
			
		||||
## General build artifacts
 | 
			
		||||
*.o
 | 
			
		||||
 
 | 
			
		||||
@@ -62,8 +62,8 @@
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#include <allegro5/allegro_windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
#define ALLEGRO_HAS_CLIPBOARD           (ALLEGRO_VERSION_INT >= ((5 << 24) | (1 << 16) | (12 << 8))) // Clipboard only supported from Allegro 5.1.12
 | 
			
		||||
#define ALLEGRO_HAS_DRAW_INDEXED_PRIM   (ALLEGRO_VERSION_INT >= ((5 << 24) | (2 << 16) | ( 5 << 8))) // DX9 implementation of al_draw_indexed_prim() got fixed in Allegro 5.2.5
 | 
			
		||||
#define ALLEGRO_HAS_CLIPBOARD           ((ALLEGRO_VERSION_INT & ~ALLEGRO_UNSTABLE_BIT) >= ((5 << 24) | (1 << 16) | (12 << 8))) // Clipboard only supported from Allegro 5.1.12
 | 
			
		||||
#define ALLEGRO_HAS_DRAW_INDEXED_PRIM   ((ALLEGRO_VERSION_INT & ~ALLEGRO_UNSTABLE_BIT) >= ((5 << 24) | (2 << 16) | ( 5 << 8))) // DX9 implementation of al_draw_indexed_prim() got fixed in Allegro 5.2.5
 | 
			
		||||
 | 
			
		||||
// Visual Studio warnings
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
@@ -423,6 +423,7 @@ static ImGuiKey ImGui_ImplAllegro5_KeyCodeToImGuiKey(int key_code)
 | 
			
		||||
bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
struct ALLEGRO_DISPLAY;
 | 
			
		||||
union ALLEGRO_EVENT;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplAllegro5_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplAllegro5_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -263,6 +263,8 @@ int32_t ImGui_ImplAndroid_HandleInputEvent(const AInputEvent* input_event)
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplAndroid_Init(ANativeWindow* window)
 | 
			
		||||
{
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
 | 
			
		||||
    g_Window = window;
 | 
			
		||||
    g_Time = 0.0;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@
 | 
			
		||||
struct ANativeWindow;
 | 
			
		||||
struct AInputEvent;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplAndroid_Init(ANativeWindow* window);
 | 
			
		||||
IMGUI_IMPL_API int32_t  ImGui_ImplAndroid_HandleInputEvent(const AInputEvent* input_event);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplAndroid_Shutdown();
 | 
			
		||||
 
 | 
			
		||||
@@ -534,6 +534,7 @@ void    ImGui_ImplDX10_InvalidateDeviceObjects()
 | 
			
		||||
bool    ImGui_ImplDX10_Init(ID3D10Device* device)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
 | 
			
		||||
struct ID3D10Device;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplDX10_Init(ID3D10Device* device);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplDX10_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplDX10_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -546,6 +546,7 @@ void    ImGui_ImplDX11_InvalidateDeviceObjects()
 | 
			
		||||
bool    ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
struct ID3D11Device;
 | 
			
		||||
struct ID3D11DeviceContext;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplDX11_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplDX11_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -702,6 +702,7 @@ bool ImGui_ImplDX12_Init(ID3D12Device* device, int num_frames_in_flight, DXGI_FO
 | 
			
		||||
                         D3D12_CPU_DESCRIPTOR_HANDLE font_srv_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE font_srv_gpu_desc_handle)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,8 @@ struct ID3D12GraphicsCommandList;
 | 
			
		||||
struct D3D12_CPU_DESCRIPTOR_HANDLE;
 | 
			
		||||
struct D3D12_GPU_DESCRIPTOR_HANDLE;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
 | 
			
		||||
// cmd_list is the command list that the implementation will use to render imgui draw lists.
 | 
			
		||||
// Before calling the render function, caller must prepare cmd_list by resetting it and setting the appropriate
 | 
			
		||||
// render target and descriptor heap that contains font_srv_cpu_desc_handle/font_srv_gpu_desc_handle.
 | 
			
		||||
 
 | 
			
		||||
@@ -285,6 +285,7 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
bool ImGui_ImplDX9_Init(IDirect3DDevice9* device)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
 | 
			
		||||
struct IDirect3DDevice9;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplDX9_Init(IDirect3DDevice9* device);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplDX9_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplDX9_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,9 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2024-07-08: *BREAKING* Renamed ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback to ImGui_ImplGlfw_InstallEmscriptenCallbacks(), added GLFWWindow* parameter.
 | 
			
		||||
//  2024-07-08: Emscripten: Added support for GLFW3 contrib port (GLFW 3.4.0 features + bug fixes): to enable, replace -sUSE_GLFW=3 with --use-port=contrib.glfw3 (requires emscripten 3.1.59+) (https://github.com/pongasoft/emscripten-glfw)
 | 
			
		||||
//  2024-07-02: Emscripten: Added io.PlatformOpenInShellFn() handler for Emscripten versions.
 | 
			
		||||
//  2023-12-19: Emscripten: Added ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback() to register canvas selector and auto-resize GLFW window.
 | 
			
		||||
//  2023-10-05: Inputs: Added support for extra ImGuiKey values: F13 to F24 function keys.
 | 
			
		||||
//  2023-07-18: Inputs: Revert ignoring mouse data on GLFW_CURSOR_DISABLED as it can be used differently. User may set ImGuiConfigFLags_NoMouse if desired. (#5625, #6609)
 | 
			
		||||
@@ -100,6 +103,11 @@
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
#include <emscripten.h>
 | 
			
		||||
#include <emscripten/html5.h>
 | 
			
		||||
#ifdef EMSCRIPTEN_USE_PORT_CONTRIB_GLFW3
 | 
			
		||||
#include <GLFW/emscripten_glfw3.h>
 | 
			
		||||
#else
 | 
			
		||||
#define EMSCRIPTEN_USE_EMBEDDED_GLFW3
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// We gather version tests as define in order to easily see which features are version-dependent.
 | 
			
		||||
@@ -131,7 +139,7 @@ struct ImGui_ImplGlfw_Data
 | 
			
		||||
    ImVec2                  LastValidMousePos;
 | 
			
		||||
    bool                    InstalledCallbacks;
 | 
			
		||||
    bool                    CallbacksChainForAllWindows;
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
#ifdef EMSCRIPTEN_USE_EMBEDDED_GLFW3
 | 
			
		||||
    const char*             CanvasSelector;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -145,7 +153,7 @@ struct ImGui_ImplGlfw_Data
 | 
			
		||||
    GLFWcharfun             PrevUserCallbackChar;
 | 
			
		||||
    GLFWmonitorfun          PrevUserCallbackMonitor;
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
    WNDPROC                 GlfwWndProc;
 | 
			
		||||
    WNDPROC                 PrevWndProc;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ImGui_ImplGlfw_Data()   { memset((void*)this, 0, sizeof(*this)); }
 | 
			
		||||
@@ -335,7 +343,7 @@ void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yo
 | 
			
		||||
    if (bd->PrevUserCallbackScroll != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window))
 | 
			
		||||
        bd->PrevUserCallbackScroll(window, xoffset, yoffset);
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
#ifdef EMSCRIPTEN_USE_EMBEDDED_GLFW3
 | 
			
		||||
    // Ignore GLFW events: will be processed in ImGui_ImplEmscripten_WheelCallback().
 | 
			
		||||
    return;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -346,7 +354,7 @@ void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yo
 | 
			
		||||
 | 
			
		||||
static int ImGui_ImplGlfw_TranslateUntranslatedKey(int key, int scancode)
 | 
			
		||||
{
 | 
			
		||||
#if GLFW_HAS_GETKEYNAME && !defined(__EMSCRIPTEN__)
 | 
			
		||||
#if GLFW_HAS_GETKEYNAME && !defined(EMSCRIPTEN_USE_EMBEDDED_GLFW3)
 | 
			
		||||
    // GLFW 3.1+ attempts to "untranslate" keys, which goes the opposite of what every other framework does, making using lettered shortcuts difficult.
 | 
			
		||||
    // (It had reasons to do so: namely GLFW is/was more likely to be used for WASD-type game controls rather than lettered shortcuts, but IHMO the 3.1 change could have been done differently)
 | 
			
		||||
    // See https://github.com/glfw/glfw/issues/1502 for details.
 | 
			
		||||
@@ -357,7 +365,7 @@ static int ImGui_ImplGlfw_TranslateUntranslatedKey(int key, int scancode)
 | 
			
		||||
    GLFWerrorfun prev_error_callback = glfwSetErrorCallback(nullptr);
 | 
			
		||||
    const char* key_name = glfwGetKeyName(key, scancode);
 | 
			
		||||
    glfwSetErrorCallback(prev_error_callback);
 | 
			
		||||
#if GLFW_HAS_GETERROR && !defined(__EMSCRIPTEN__) // Eat errors (see #5908)
 | 
			
		||||
#if GLFW_HAS_GETERROR && !defined(EMSCRIPTEN_USE_EMBEDDED_GLFW3) // Eat errors (see #5908)
 | 
			
		||||
    (void)glfwGetError(nullptr);
 | 
			
		||||
#endif
 | 
			
		||||
    if (key_name && key_name[0] != 0 && key_name[1] == 0)
 | 
			
		||||
@@ -454,7 +462,7 @@ void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor*, int)
 | 
			
		||||
	// Unused in 'master' branch but 'docking' branch will use this, so we declare it ahead of it so if you have to install callbacks you can install this one too.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
#ifdef EMSCRIPTEN_USE_EMBEDDED_GLFW3
 | 
			
		||||
static EM_BOOL ImGui_ImplEmscripten_WheelCallback(int, const EmscriptenWheelEvent* ev, void*)
 | 
			
		||||
{
 | 
			
		||||
    // Mimic Emscripten_HandleWheel() in SDL.
 | 
			
		||||
@@ -497,7 +505,7 @@ static LRESULT CALLBACK ImGui_ImplGlfw_WndProc(HWND hWnd, UINT msg, WPARAM wPara
 | 
			
		||||
        ImGui::GetIO().AddMouseSourceEvent(GetMouseSourceFromMessageExtraInfo());
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    return ::CallWindowProcW(bd->GlfwWndProc, hWnd, msg, wParam, lParam);
 | 
			
		||||
    return ::CallWindowProcW(bd->PrevWndProc, hWnd, msg, wParam, lParam);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -553,9 +561,14 @@ void ImGui_ImplGlfw_SetCallbacksChainForAllWindows(bool chain_for_all_windows)
 | 
			
		||||
    bd->CallbacksChainForAllWindows = chain_for_all_windows;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
EM_JS(void, ImGui_ImplGlfw_EmscriptenOpenURL, (char const* url), { url = url ? UTF8ToString(url) : null; if (url) window.open(url, '_blank'); });
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, GlfwClientApi client_api)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
 | 
			
		||||
    //printf("GLFW_VERSION: %d.%d.%d (%d)", GLFW_VERSION_MAJOR, GLFW_VERSION_MINOR, GLFW_VERSION_REVISION, GLFW_VERSION_COMBINED);
 | 
			
		||||
 | 
			
		||||
@@ -572,6 +585,9 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw
 | 
			
		||||
    io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText;
 | 
			
		||||
    io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText;
 | 
			
		||||
    io.ClipboardUserData = bd->Window;
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
    io.PlatformOpenInShellFn = [](ImGuiContext*, const char* url) { ImGui_ImplGlfw_EmscriptenOpenURL(url); return true; };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Create mouse cursors
 | 
			
		||||
    // (By design, on X11 cursors are user configurable and some cursors may be missing. When a cursor doesn't exist,
 | 
			
		||||
@@ -602,15 +618,10 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw
 | 
			
		||||
    // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
 | 
			
		||||
    if (install_callbacks)
 | 
			
		||||
        ImGui_ImplGlfw_InstallCallbacks(window);
 | 
			
		||||
    // Register Emscripten Wheel callback to workaround issue in Emscripten GLFW Emulation (#6096)
 | 
			
		||||
    // We intentionally do not check 'if (install_callbacks)' here, as some users may set it to false and call GLFW callback themselves.
 | 
			
		||||
    // FIXME: May break chaining in case user registered their own Emscripten callback?
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
    emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, nullptr, false, ImGui_ImplEmscripten_WheelCallback);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Set platform dependent data in viewport
 | 
			
		||||
    ImGuiViewport* main_viewport = ImGui::GetMainViewport();
 | 
			
		||||
    main_viewport->PlatformHandle = (void*)bd->Window;
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
    main_viewport->PlatformHandleRaw = glfwGetWin32Window(bd->Window);
 | 
			
		||||
#elif defined(__APPLE__)
 | 
			
		||||
@@ -621,8 +632,8 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw
 | 
			
		||||
 | 
			
		||||
    // Windows: register a WndProc hook so we can intercept some messages.
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
    bd->GlfwWndProc = (WNDPROC)::GetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC);
 | 
			
		||||
    IM_ASSERT(bd->GlfwWndProc != nullptr);
 | 
			
		||||
    bd->PrevWndProc = (WNDPROC)::GetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC);
 | 
			
		||||
    IM_ASSERT(bd->PrevWndProc != nullptr);
 | 
			
		||||
    ::SetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)ImGui_ImplGlfw_WndProc);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -653,18 +664,19 @@ void ImGui_ImplGlfw_Shutdown()
 | 
			
		||||
 | 
			
		||||
    if (bd->InstalledCallbacks)
 | 
			
		||||
        ImGui_ImplGlfw_RestoreCallbacks(bd->Window);
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
    emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, nullptr, false, nullptr);
 | 
			
		||||
#ifdef EMSCRIPTEN_USE_EMBEDDED_GLFW3
 | 
			
		||||
    if (bd->CanvasSelector)
 | 
			
		||||
        emscripten_set_wheel_callback(bd->CanvasSelector, nullptr, false, nullptr);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++)
 | 
			
		||||
        glfwDestroyCursor(bd->MouseCursors[cursor_n]);
 | 
			
		||||
 | 
			
		||||
    // Windows: register a WndProc hook so we can intercept some messages.
 | 
			
		||||
    // Windows: restore our WndProc hook
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
    ImGuiViewport* main_viewport = ImGui::GetMainViewport();
 | 
			
		||||
    ::SetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)bd->GlfwWndProc);
 | 
			
		||||
    bd->GlfwWndProc = nullptr;
 | 
			
		||||
    ::SetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)bd->PrevWndProc);
 | 
			
		||||
    bd->PrevWndProc = nullptr;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    io.BackendPlatformName = nullptr;
 | 
			
		||||
@@ -681,7 +693,7 @@ static void ImGui_ImplGlfw_UpdateMouseData()
 | 
			
		||||
    // (those braces are here to reduce diff with multi-viewports support in 'docking' branch)
 | 
			
		||||
    {
 | 
			
		||||
        GLFWwindow* window = bd->Window;
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
#ifdef EMSCRIPTEN_USE_EMBEDDED_GLFW3
 | 
			
		||||
        const bool is_window_focused = true;
 | 
			
		||||
#else
 | 
			
		||||
        const bool is_window_focused = glfwGetWindowAttrib(window, GLFW_FOCUSED) != 0;
 | 
			
		||||
@@ -739,7 +751,7 @@ static void ImGui_ImplGlfw_UpdateGamepads()
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
 | 
			
		||||
#if GLFW_HAS_GAMEPAD_API && !defined(__EMSCRIPTEN__)
 | 
			
		||||
#if GLFW_HAS_GAMEPAD_API && !defined(EMSCRIPTEN_USE_EMBEDDED_GLFW3)
 | 
			
		||||
    GLFWgamepadstate gamepad;
 | 
			
		||||
    if (!glfwGetGamepadState(GLFW_JOYSTICK_1, &gamepad))
 | 
			
		||||
        return;
 | 
			
		||||
@@ -813,7 +825,7 @@ void ImGui_ImplGlfw_NewFrame()
 | 
			
		||||
    ImGui_ImplGlfw_UpdateGamepads();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
#ifdef EMSCRIPTEN_USE_EMBEDDED_GLFW3
 | 
			
		||||
static EM_BOOL ImGui_ImplGlfw_OnCanvasSizeChange(int event_type, const EmscriptenUiEvent* event, void* user_data)
 | 
			
		||||
{
 | 
			
		||||
    ImGui_ImplGlfw_Data* bd = (ImGui_ImplGlfw_Data*)user_data;
 | 
			
		||||
@@ -834,7 +846,7 @@ static EM_BOOL ImGui_ImplEmscripten_FullscreenChangeCallback(int event_type, con
 | 
			
		||||
 | 
			
		||||
// 'canvas_selector' is a CSS selector. The event listener is applied to the first element that matches the query.
 | 
			
		||||
// STRING MUST PERSIST FOR THE APPLICATION DURATION. PLEASE USE A STRING LITERAL OR ENSURE POINTER WILL STAY VALID.
 | 
			
		||||
void ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(const char* canvas_selector)
 | 
			
		||||
void ImGui_ImplGlfw_InstallEmscriptenCallbacks(GLFWwindow*, const char* canvas_selector)
 | 
			
		||||
{
 | 
			
		||||
    IM_ASSERT(canvas_selector != nullptr);
 | 
			
		||||
    ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
 | 
			
		||||
@@ -846,8 +858,24 @@ void ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(const char* canvas_sel
 | 
			
		||||
 | 
			
		||||
    // Change the size of the GLFW window according to the size of the canvas
 | 
			
		||||
    ImGui_ImplGlfw_OnCanvasSizeChange(EMSCRIPTEN_EVENT_RESIZE, {}, bd);
 | 
			
		||||
 | 
			
		||||
    // Register Emscripten Wheel callback to workaround issue in Emscripten GLFW Emulation (#6096)
 | 
			
		||||
    // We intentionally do not check 'if (install_callbacks)' here, as some users may set it to false and call GLFW callback themselves.
 | 
			
		||||
    // FIXME: May break chaining in case user registered their own Emscripten callback?
 | 
			
		||||
    emscripten_set_wheel_callback(bd->CanvasSelector, nullptr, false, ImGui_ImplEmscripten_WheelCallback);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#elif defined(EMSCRIPTEN_USE_PORT_CONTRIB_GLFW3)
 | 
			
		||||
// When using --use-port=contrib.glfw3 for the GLFW implementation, you can override the behavior of this call
 | 
			
		||||
// by invoking emscripten_glfw_make_canvas_resizable afterward.
 | 
			
		||||
// See https://github.com/pongasoft/emscripten-glfw/blob/master/docs/Usage.md#how-to-make-the-canvas-resizable-by-the-user for an explanation
 | 
			
		||||
void ImGui_ImplGlfw_InstallEmscriptenCallbacks(GLFWwindow* window, const char* canvas_selector)
 | 
			
		||||
{
 | 
			
		||||
  GLFWwindow* w = (GLFWwindow*)(EM_ASM_INT({ return Module.glfwGetWindow(UTF8ToString($0)); }, canvas_selector));
 | 
			
		||||
  IM_ASSERT(window == w); // Sanity check
 | 
			
		||||
  IM_UNUSED(w);
 | 
			
		||||
  emscripten_glfw_make_canvas_resizable(window, "window", nullptr);
 | 
			
		||||
}
 | 
			
		||||
#endif // #ifdef EMSCRIPTEN_USE_PORT_CONTRIB_GLFW3
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,15 +24,17 @@
 | 
			
		||||
struct GLFWwindow;
 | 
			
		||||
struct GLFWmonitor;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplGlfw_InitForOpenGL(GLFWwindow* window, bool install_callbacks);
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplGlfw_InitForVulkan(GLFWwindow* window, bool install_callbacks);
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool install_callbacks);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplGlfw_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplGlfw_NewFrame();
 | 
			
		||||
 | 
			
		||||
// Emscripten related initialization phase methods
 | 
			
		||||
// Emscripten related initialization phase methods (call after ImGui_ImplGlfw_InitForOpenGL)
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(const char* canvas_selector);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplGlfw_InstallEmscriptenCallbacks(GLFWwindow* window, const char* canvas_selector);
 | 
			
		||||
//static inline void    ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(const char* canvas_selector) { ImGui_ImplGlfw_InstallEmscriptenCallbacks(nullptr, canvas_selector); } } // Renamed in 1.91.0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// GLFW callbacks install
 | 
			
		||||
 
 | 
			
		||||
@@ -167,6 +167,7 @@ static ImGuiKey ImGui_ImplGLUT_KeyToImGuiKey(int key)
 | 
			
		||||
bool ImGui_ImplGLUT_Init()
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
 | 
			
		||||
#ifdef FREEGLUT
 | 
			
		||||
    io.BackendPlatformName = "imgui_impl_glut (freeglut)";
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@
 | 
			
		||||
#ifndef IMGUI_DISABLE
 | 
			
		||||
#include "imgui.h"      // IMGUI_IMPL_API
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplGLUT_Init();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplGLUT_InstallFuncs();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplGLUT_Shutdown();
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
@class MTLRenderPassDescriptor;
 | 
			
		||||
@protocol MTLDevice, MTLCommandBuffer, MTLRenderCommandEncoder;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id<MTLDevice> device);
 | 
			
		||||
IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor);
 | 
			
		||||
@@ -51,6 +52,7 @@ IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();
 | 
			
		||||
#include <Metal/Metal.hpp>
 | 
			
		||||
#ifndef __OBJC__
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool ImGui_ImplMetal_Init(MTL::Device* device);
 | 
			
		||||
IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor);
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,6 @@ struct ImGui_ImplMetal_Data
 | 
			
		||||
    ImGui_ImplMetal_Data()      { memset(this, 0, sizeof(*this)); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static ImGui_ImplMetal_Data*    ImGui_ImplMetal_CreateBackendData() { return IM_NEW(ImGui_ImplMetal_Data)(); }
 | 
			
		||||
static ImGui_ImplMetal_Data*    ImGui_ImplMetal_GetBackendData()    { return ImGui::GetCurrentContext() ? (ImGui_ImplMetal_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; }
 | 
			
		||||
static void                     ImGui_ImplMetal_DestroyBackendData(){ IM_DELETE(ImGui_ImplMetal_GetBackendData()); }
 | 
			
		||||
 | 
			
		||||
@@ -125,8 +124,11 @@ bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device)
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplMetal_Init(id<MTLDevice> device)
 | 
			
		||||
{
 | 
			
		||||
    ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_CreateBackendData();
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    ImGui_ImplMetal_Data* bd = IM_NEW(ImGui_ImplMetal_Data)();
 | 
			
		||||
    io.BackendRendererUserData = (void*)bd;
 | 
			
		||||
    io.BackendRendererName = "imgui_impl_metal";
 | 
			
		||||
    io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;  // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2024-06-28: OpenGL: ImGui_ImplOpenGL2_NewFrame() recreates font texture if it has been destroyed by ImGui_ImplOpenGL2_DestroyFontsTexture(). (#7748)
 | 
			
		||||
//  2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
 | 
			
		||||
//  2021-12-08: OpenGL: Fixed mishandling of the ImDrawCmd::IdxOffset field! This is an old bug but it never had an effect until some internal rendering changes in 1.86.
 | 
			
		||||
//  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
 | 
			
		||||
@@ -83,6 +84,7 @@ static ImGui_ImplOpenGL2_Data* ImGui_ImplOpenGL2_GetBackendData()
 | 
			
		||||
bool    ImGui_ImplOpenGL2_Init()
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
@@ -112,6 +114,8 @@ void    ImGui_ImplOpenGL2_NewFrame()
 | 
			
		||||
 | 
			
		||||
    if (!bd->FontTexture)
 | 
			
		||||
        ImGui_ImplOpenGL2_CreateDeviceObjects();
 | 
			
		||||
    if (!bd->FontTexture)
 | 
			
		||||
        ImGui_ImplOpenGL2_CreateFontsTexture();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplOpenGL2_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height)
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@
 | 
			
		||||
#include "imgui.h"      // IMGUI_IMPL_API
 | 
			
		||||
#ifndef IMGUI_DISABLE
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplOpenGL2_Init();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOpenGL2_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOpenGL2_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2024-06-28: OpenGL: ImGui_ImplOpenGL3_NewFrame() recreates font texture if it has been destroyed by ImGui_ImplOpenGL3_DestroyFontsTexture(). (#7748)
 | 
			
		||||
//  2024-05-07: OpenGL: Update loader for Linux to support EGL/GLVND. (#7562)
 | 
			
		||||
//  2024-04-16: OpenGL: Detect ES3 contexts on desktop based on version string, to e.g. avoid calling glPolygonMode() on them. (#7447)
 | 
			
		||||
//  2024-01-09: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" and variants, fixing regression on distros missing a symlink.
 | 
			
		||||
@@ -123,6 +124,7 @@
 | 
			
		||||
// Clang/GCC warnings with -Weverything
 | 
			
		||||
#if defined(__clang__)
 | 
			
		||||
#pragma clang diagnostic push
 | 
			
		||||
#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: ignore unknown flags
 | 
			
		||||
#pragma clang diagnostic ignored "-Wold-style-cast"         // warning: use of old-style cast
 | 
			
		||||
#pragma clang diagnostic ignored "-Wsign-conversion"        // warning: implicit conversion changes signedness
 | 
			
		||||
#pragma clang diagnostic ignored "-Wunused-macros"          // warning: macro is not used
 | 
			
		||||
@@ -275,6 +277,7 @@ struct ImGui_ImplOpenGL3_VtxAttribState
 | 
			
		||||
bool    ImGui_ImplOpenGL3_Init(const char* glsl_version)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Initialize our loader
 | 
			
		||||
@@ -401,6 +404,8 @@ void    ImGui_ImplOpenGL3_NewFrame()
 | 
			
		||||
 | 
			
		||||
    if (!bd->ShaderHandle)
 | 
			
		||||
        ImGui_ImplOpenGL3_CreateDeviceObjects();
 | 
			
		||||
    if (!bd->FontTexture)
 | 
			
		||||
        ImGui_ImplOpenGL3_CreateFontsTexture();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object)
 | 
			
		||||
@@ -749,7 +754,7 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects()
 | 
			
		||||
    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
 | 
			
		||||
    glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
 | 
			
		||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK
 | 
			
		||||
    GLint last_pixel_unpack_buffer;
 | 
			
		||||
    GLint last_pixel_unpack_buffer = 0;
 | 
			
		||||
    if (bd->GlVersion >= 210) { glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &last_pixel_unpack_buffer); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); }
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@
 | 
			
		||||
#include "imgui.h"      // IMGUI_IMPL_API
 | 
			
		||||
#ifndef IMGUI_DISABLE
 | 
			
		||||
 | 
			
		||||
// Backend API
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplOpenGL3_Init(const char* glsl_version = nullptr);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOpenGL3_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOpenGL3_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
// THE REST OF YOUR APP SHOULD USE A DIFFERENT GL LOADER: ANY GL LOADER OF YOUR CHOICE.
 | 
			
		||||
//
 | 
			
		||||
// IF YOU GET BUILD ERRORS IN THIS FILE (commonly macro redefinitions or function redefinitions):
 | 
			
		||||
// IT LIKELY MEANS THAT YOU ARE BUILDING 'imgui_impl_opengl3.cpp' OR INCUDING 'imgui_impl_opengl3_loader.h'
 | 
			
		||||
// IT LIKELY MEANS THAT YOU ARE BUILDING 'imgui_impl_opengl3.cpp' OR INCLUDING 'imgui_impl_opengl3_loader.h'
 | 
			
		||||
// IN THE SAME COMPILATION UNIT AS ONE OF YOUR FILE WHICH IS USING A THIRD-PARTY OPENGL LOADER.
 | 
			
		||||
// (e.g. COULD HAPPEN IF YOU ARE DOING A UNITY/JUMBO BUILD, OR INCLUDING .CPP FILES FROM OTHERS)
 | 
			
		||||
// YOU SHOULD NOT BUILD BOTH IN THE SAME COMPILATION UNIT.
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@
 | 
			
		||||
@class NSEvent;
 | 
			
		||||
@class NSView;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplOSX_Init(NSView* _Nonnull view);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOSX_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOSX_NewFrame(NSView* _Nullable view);
 | 
			
		||||
@@ -41,6 +42,7 @@ IMGUI_IMPL_API void     ImGui_ImplOSX_NewFrame(NSView* _Nullable view);
 | 
			
		||||
// #include <AppKit/AppKit.hpp>
 | 
			
		||||
#ifndef __OBJC__
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplOSX_Init(void* _Nonnull view);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOSX_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplOSX_NewFrame(void* _Nullable view);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								external/imgui/imgui/backends/imgui_impl_osx.mm
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -29,6 +29,7 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2024-07-02: Update for io.SetPlatformImeDataFn() -> io.PlatformSetImeDataFn() renaming in main library.
 | 
			
		||||
//  2023-10-05: Inputs: Added support for extra ImGuiKey values: F13 to F20 function keys. Stopped mapping F13 into PrintScreen.
 | 
			
		||||
//  2023-04-09: Inputs: Added support for io.AddMouseSourceEvent() to discriminate ImGuiMouseSource_Mouse/ImGuiMouseSource_Pen.
 | 
			
		||||
//  2023-02-01: Fixed scroll wheel scaling for devices emitting events with hasPreciseScrollingDeltas==false (e.g. non-Apple mices).
 | 
			
		||||
@@ -80,11 +81,11 @@ struct ImGui_ImplOSX_Data
 | 
			
		||||
    KeyEventResponder*          KeyEventResponder;
 | 
			
		||||
    NSTextInputContext*         InputContext;
 | 
			
		||||
    id                          Monitor;
 | 
			
		||||
    NSWindow*                   Window;
 | 
			
		||||
 | 
			
		||||
    ImGui_ImplOSX_Data()        { memset(this, 0, sizeof(*this)); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static ImGui_ImplOSX_Data*      ImGui_ImplOSX_CreateBackendData()   { return IM_NEW(ImGui_ImplOSX_Data)(); }
 | 
			
		||||
static ImGui_ImplOSX_Data*      ImGui_ImplOSX_GetBackendData()      { return (ImGui_ImplOSX_Data*)ImGui::GetIO().BackendPlatformUserData; }
 | 
			
		||||
static void                     ImGui_ImplOSX_DestroyBackendData()  { IM_DELETE(ImGui_ImplOSX_GetBackendData()); }
 | 
			
		||||
 | 
			
		||||
@@ -134,7 +135,7 @@ static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view);
 | 
			
		||||
 | 
			
		||||
- (void)updateImePosWithView:(NSView *)view
 | 
			
		||||
{
 | 
			
		||||
    NSWindow *window = view.window;
 | 
			
		||||
    NSWindow* window = view.window;
 | 
			
		||||
    if (!window)
 | 
			
		||||
        return;
 | 
			
		||||
    NSRect contentRect = [window contentRectForFrameRect:window.frame];
 | 
			
		||||
@@ -392,15 +393,20 @@ IMGUI_IMPL_API void ImGui_ImplOSX_NewFrame(void* _Nullable view) {
 | 
			
		||||
bool ImGui_ImplOSX_Init(NSView* view)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_CreateBackendData();
 | 
			
		||||
    io.BackendPlatformUserData = (void*)bd;
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
    ImGui_ImplOSX_Data* bd = IM_NEW(ImGui_ImplOSX_Data)();
 | 
			
		||||
    io.BackendPlatformUserData = (void*)bd;
 | 
			
		||||
    io.BackendPlatformName = "imgui_impl_osx";
 | 
			
		||||
    io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;           // We can honor GetMouseCursor() values (optional)
 | 
			
		||||
    //io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos;          // We can honor io.WantSetMousePos requests (optional, rarely used)
 | 
			
		||||
    io.BackendPlatformName = "imgui_impl_osx";
 | 
			
		||||
 | 
			
		||||
    bd->Observer = [ImGuiObserver new];
 | 
			
		||||
    bd->Window = view.window ?: NSApp.orderedWindows.firstObject;
 | 
			
		||||
    ImGuiViewport* main_viewport = ImGui::GetMainViewport();
 | 
			
		||||
    main_viewport->PlatformHandle = main_viewport->PlatformHandleRaw = (__bridge_retained void*)bd->Window;
 | 
			
		||||
 | 
			
		||||
    // Load cursors. Some of them are undocumented.
 | 
			
		||||
    bd->MouseCursorHidden = false;
 | 
			
		||||
@@ -459,7 +465,7 @@ bool ImGui_ImplOSX_Init(NSView* view)
 | 
			
		||||
    [view addSubview:bd->KeyEventResponder];
 | 
			
		||||
    ImGui_ImplOSX_AddTrackingArea(view);
 | 
			
		||||
 | 
			
		||||
    io.SetPlatformImeDataFn = [](ImGuiViewport* viewport, ImGuiPlatformImeData* data) -> void
 | 
			
		||||
    io.PlatformSetImeDataFn = [](ImGuiContext*, ImGuiViewport* viewport, ImGuiPlatformImeData* data) -> void
 | 
			
		||||
    {
 | 
			
		||||
        ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
 | 
			
		||||
        if (data->WantVisible)
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,8 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2024-07-02: Emscripten: Added io.PlatformOpenInShellFn() handler for Emscripten versions.
 | 
			
		||||
//  2024-07-02: Update for io.SetPlatformImeDataFn() -> io.PlatformSetImeDataFn() renaming in main library.
 | 
			
		||||
//  2024-02-14: Inputs: Handle gamepad disconnection. Added ImGui_ImplSDL2_SetGamepadMode().
 | 
			
		||||
//  2023-10-05: Inputs: Added support for extra ImGuiKey values: F13 to F24 function keys, app back/forward keys.
 | 
			
		||||
//  2023-04-06: Inputs: Avoid calling SDL_StartTextInput()/SDL_StopTextInput() as they don't only pertain to IME. It's unclear exactly what their relation is to IME. (#6306)
 | 
			
		||||
@@ -90,9 +92,12 @@
 | 
			
		||||
// SDL
 | 
			
		||||
#include <SDL.h>
 | 
			
		||||
#include <SDL_syswm.h>
 | 
			
		||||
#if defined(__APPLE__)
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
#include <TargetConditionals.h>
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
#include <emscripten/em_js.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if SDL_VERSION_ATLEAST(2,0,4) && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) && !defined(__amigaos4__)
 | 
			
		||||
#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE    1
 | 
			
		||||
@@ -150,7 +155,7 @@ static void ImGui_ImplSDL2_SetClipboardText(void*, const char* text)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Note: native IME will only display if user calls SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1") _before_ SDL_CreateWindow().
 | 
			
		||||
static void ImGui_ImplSDL2_SetPlatformImeData(ImGuiViewport*, ImGuiPlatformImeData* data)
 | 
			
		||||
static void ImGui_ImplSDL2_PlatformSetImeData(ImGuiContext*, ImGuiViewport*, ImGuiPlatformImeData* data)
 | 
			
		||||
{
 | 
			
		||||
    if (data->WantVisible)
 | 
			
		||||
    {
 | 
			
		||||
@@ -163,8 +168,9 @@ static void ImGui_ImplSDL2_SetPlatformImeData(ImGuiViewport*, ImGuiPlatformImeDa
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ImGuiKey ImGui_ImplSDL2_KeycodeToImGuiKey(int keycode)
 | 
			
		||||
static ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode)
 | 
			
		||||
{
 | 
			
		||||
    IM_UNUSED(scancode);
 | 
			
		||||
    switch (keycode)
 | 
			
		||||
    {
 | 
			
		||||
        case SDLK_TAB: return ImGuiKey_Tab;
 | 
			
		||||
@@ -286,6 +292,7 @@ static ImGuiKey ImGui_ImplSDL2_KeycodeToImGuiKey(int keycode)
 | 
			
		||||
        case SDLK_F24: return ImGuiKey_F24;
 | 
			
		||||
        case SDLK_AC_BACK: return ImGuiKey_AppBack;
 | 
			
		||||
        case SDLK_AC_FORWARD: return ImGuiKey_AppForward;
 | 
			
		||||
        default: break;
 | 
			
		||||
    }
 | 
			
		||||
    return ImGuiKey_None;
 | 
			
		||||
}
 | 
			
		||||
@@ -361,7 +368,7 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
 | 
			
		||||
        case SDL_KEYUP:
 | 
			
		||||
        {
 | 
			
		||||
            ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod);
 | 
			
		||||
            ImGuiKey key = ImGui_ImplSDL2_KeycodeToImGuiKey(event->key.keysym.sym);
 | 
			
		||||
            ImGuiKey key = ImGui_ImplSDL2_KeyEventToImGuiKey(event->key.keysym.sym, event->key.keysym.scancode);
 | 
			
		||||
            io.AddKeyEvent(key, (event->type == SDL_KEYDOWN));
 | 
			
		||||
            io.SetKeyEventNativeData(key, event->key.keysym.sym, event->key.keysym.scancode, event->key.keysym.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions.
 | 
			
		||||
            return true;
 | 
			
		||||
@@ -397,9 +404,14 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer)
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
EM_JS(void, ImGui_ImplSDL2_EmscriptenOpenURL, (char const* url), { url = url ? UTF8ToString(url) : null; if (url) window.open(url, '_blank'); });
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer, void* sdl_gl_context)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
 | 
			
		||||
 | 
			
		||||
    // Check and store if we are on a SDL backend that supports global mouse position
 | 
			
		||||
@@ -427,7 +439,10 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer)
 | 
			
		||||
    io.SetClipboardTextFn = ImGui_ImplSDL2_SetClipboardText;
 | 
			
		||||
    io.GetClipboardTextFn = ImGui_ImplSDL2_GetClipboardText;
 | 
			
		||||
    io.ClipboardUserData = nullptr;
 | 
			
		||||
    io.SetPlatformImeDataFn = ImGui_ImplSDL2_SetPlatformImeData;
 | 
			
		||||
    io.PlatformSetImeDataFn = ImGui_ImplSDL2_PlatformSetImeData;
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
    io.PlatformOpenInShellFn = [](ImGuiContext*, const char* url) { ImGui_ImplSDL2_EmscriptenOpenURL(url); return true; };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Gamepad handling
 | 
			
		||||
    bd->GamepadMode = ImGui_ImplSDL2_GamepadMode_AutoFirst;
 | 
			
		||||
@@ -447,6 +462,7 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer)
 | 
			
		||||
    // Set platform dependent data in viewport
 | 
			
		||||
    // Our mouse update function expect PlatformHandle to be filled for the main viewport
 | 
			
		||||
    ImGuiViewport* main_viewport = ImGui::GetMainViewport();
 | 
			
		||||
    main_viewport->PlatformHandle = (void*)window;
 | 
			
		||||
    main_viewport->PlatformHandleRaw = nullptr;
 | 
			
		||||
    SDL_SysWMinfo info;
 | 
			
		||||
    SDL_VERSION(&info.version);
 | 
			
		||||
@@ -480,13 +496,13 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer)
 | 
			
		||||
    SDL_SetHint(SDL_HINT_MOUSE_AUTO_CAPTURE, "0");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    (void)sdl_gl_context; // Unused in 'master' branch.
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context)
 | 
			
		||||
{
 | 
			
		||||
    IM_UNUSED(sdl_gl_context); // Viewport branch will need this.
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr);
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr, sdl_gl_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window)
 | 
			
		||||
@@ -494,7 +510,7 @@ bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window)
 | 
			
		||||
#if !SDL_HAS_VULKAN
 | 
			
		||||
    IM_ASSERT(0 && "Unsupported");
 | 
			
		||||
#endif
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr);
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window)
 | 
			
		||||
@@ -502,22 +518,22 @@ bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window)
 | 
			
		||||
#if !defined(_WIN32)
 | 
			
		||||
    IM_ASSERT(0 && "Unsupported");
 | 
			
		||||
#endif
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr);
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window)
 | 
			
		||||
{
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr);
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer)
 | 
			
		||||
{
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, renderer);
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, renderer, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ImGui_ImplSDL2_InitForOther(SDL_Window* window)
 | 
			
		||||
{
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr);
 | 
			
		||||
    return ImGui_ImplSDL2_Init(window, nullptr, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplSDL2_CloseGamepads();
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ struct SDL_Renderer;
 | 
			
		||||
struct _SDL_GameController;
 | 
			
		||||
typedef union SDL_Event SDL_Event;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context);
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDL2_InitForVulkan(SDL_Window* window);
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDL2_InitForD3D(SDL_Window* window);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										183
									
								
								external/imgui/imgui/backends/imgui_impl_sdl3.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,7 +1,8 @@
 | 
			
		||||
// dear imgui: Platform Backend for SDL3 (*EXPERIMENTAL*)
 | 
			
		||||
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
 | 
			
		||||
// (Info: SDL3 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.)
 | 
			
		||||
// (IMPORTANT: SDL 3.0.0 is NOT YET RELEASED. IT IS POSSIBLE THAT ITS SPECS/API WILL CHANGE BEFORE RELEASE)
 | 
			
		||||
 | 
			
		||||
// (**IMPORTANT: SDL 3.0.0 is NOT YET RELEASED AND CURRENTLY HAS A FAST CHANGING API. THIS CODE BREAKS OFTEN**)
 | 
			
		||||
 | 
			
		||||
// Implemented features:
 | 
			
		||||
//  [X] Platform: Clipboard support.
 | 
			
		||||
@@ -9,8 +10,6 @@
 | 
			
		||||
//  [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
 | 
			
		||||
//  [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
 | 
			
		||||
//  [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
 | 
			
		||||
// Missing features:
 | 
			
		||||
//  [ ] Platform: IME SUPPORT IS BROKEN IN SDL3 BECAUSE INPUTS GETS SENT TO BOTH APP AND IME + app needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!.
 | 
			
		||||
 | 
			
		||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
 | 
			
		||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
 | 
			
		||||
@@ -22,6 +21,15 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2024-07-22: Update for SDL3 api changes: SDL_GetGamepads() memory ownership change. (#7807)
 | 
			
		||||
//  2024-07-18: Update for SDL3 api changes: SDL_GetClipboardText() memory ownership change. (#7801)
 | 
			
		||||
//  2024-07-15: Update for SDL3 api changes: SDL_GetProperty() change to SDL_GetPointerProperty(). (#7794)
 | 
			
		||||
//  2024-07-02: Update for SDL3 api changes: SDLK_x renames and SDLK_KP_x removals (#7761, #7762).
 | 
			
		||||
//  2024-07-01: Update for SDL3 api changes: SDL_SetTextInputRect() changed to SDL_SetTextInputArea().
 | 
			
		||||
//  2024-06-26: Update for SDL3 api changes: SDL_StartTextInput()/SDL_StopTextInput()/SDL_SetTextInputRect() functions signatures.
 | 
			
		||||
//  2024-06-24: Update for SDL3 api changes: SDL_EVENT_KEY_DOWN/SDL_EVENT_KEY_UP contents.
 | 
			
		||||
//  2024-06-03; Update for SDL3 api changes: SDL_SYSTEM_CURSOR_ renames.
 | 
			
		||||
//  2024-05-15: Update for SDL3 api changes: SDLK_ renames.
 | 
			
		||||
//  2024-04-15: Inputs: Re-enable calling SDL_StartTextInput()/SDL_StopTextInput() as SDL3 no longer enables it by default and should play nicer with IME.
 | 
			
		||||
//  2024-02-13: Inputs: Fixed gamepad support. Handle gamepad disconnection. Added ImGui_ImplSDL3_SetGamepadMode().
 | 
			
		||||
//  2023-11-13: Updated for recent SDL3 API changes.
 | 
			
		||||
@@ -60,6 +68,14 @@
 | 
			
		||||
#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE    0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// FIXME-LEGACY: remove when SDL 3.1.3 preview is released.
 | 
			
		||||
#ifndef SDLK_APOSTROPHE
 | 
			
		||||
#define SDLK_APOSTROPHE SDLK_QUOTE
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef SDLK_GRAVE
 | 
			
		||||
#define SDLK_GRAVE SDLK_BACKQUOTE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// SDL Data
 | 
			
		||||
struct ImGui_ImplSDL3_Data
 | 
			
		||||
{
 | 
			
		||||
@@ -68,6 +84,9 @@ struct ImGui_ImplSDL3_Data
 | 
			
		||||
    Uint64                  Time;
 | 
			
		||||
    char*                   ClipboardTextData;
 | 
			
		||||
 | 
			
		||||
    // IME handling
 | 
			
		||||
    SDL_Window*             ImeWindow;
 | 
			
		||||
 | 
			
		||||
    // Mouse handling
 | 
			
		||||
    Uint32                  MouseWindowID;
 | 
			
		||||
    int                     MouseButtonsDown;
 | 
			
		||||
@@ -99,7 +118,8 @@ static const char* ImGui_ImplSDL3_GetClipboardText(void*)
 | 
			
		||||
    ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
 | 
			
		||||
    if (bd->ClipboardTextData)
 | 
			
		||||
        SDL_free(bd->ClipboardTextData);
 | 
			
		||||
    bd->ClipboardTextData = SDL_GetClipboardText();
 | 
			
		||||
    const char* sdl_clipboard_text = SDL_GetClipboardText();
 | 
			
		||||
    bd->ClipboardTextData = sdl_clipboard_text ? SDL_strdup(sdl_clipboard_text) : NULL;
 | 
			
		||||
    return bd->ClipboardTextData;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -108,8 +128,15 @@ static void ImGui_ImplSDL3_SetClipboardText(void*, const char* text)
 | 
			
		||||
    SDL_SetClipboardText(text);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplSDL3_SetPlatformImeData(ImGuiViewport*, ImGuiPlatformImeData* data)
 | 
			
		||||
static void ImGui_ImplSDL3_PlatformSetImeData(ImGuiContext*, ImGuiViewport* viewport, ImGuiPlatformImeData* data)
 | 
			
		||||
{
 | 
			
		||||
    ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
 | 
			
		||||
    SDL_Window* window = (SDL_Window*)viewport->PlatformHandle;
 | 
			
		||||
    if ((data->WantVisible == false || bd->ImeWindow != window) && bd->ImeWindow != NULL)
 | 
			
		||||
    {
 | 
			
		||||
        SDL_StopTextInput(bd->ImeWindow);
 | 
			
		||||
        bd->ImeWindow = nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    if (data->WantVisible)
 | 
			
		||||
    {
 | 
			
		||||
        SDL_Rect r;
 | 
			
		||||
@@ -117,17 +144,36 @@ static void ImGui_ImplSDL3_SetPlatformImeData(ImGuiViewport*, ImGuiPlatformImeDa
 | 
			
		||||
        r.y = (int)data->InputPos.y;
 | 
			
		||||
        r.w = 1;
 | 
			
		||||
        r.h = (int)data->InputLineHeight;
 | 
			
		||||
        SDL_SetTextInputRect(&r);
 | 
			
		||||
        SDL_StartTextInput();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        SDL_StopTextInput();
 | 
			
		||||
        SDL_SetTextInputArea(window, &r, 0);
 | 
			
		||||
        SDL_StartTextInput(window);
 | 
			
		||||
        bd->ImeWindow = window;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ImGuiKey ImGui_ImplSDL3_KeycodeToImGuiKey(int keycode)
 | 
			
		||||
static ImGuiKey ImGui_ImplSDL3_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode)
 | 
			
		||||
{
 | 
			
		||||
    // Keypad doesn't have individual key values in SDL3
 | 
			
		||||
    switch (scancode)
 | 
			
		||||
    {
 | 
			
		||||
        case SDL_SCANCODE_KP_0: return ImGuiKey_Keypad0;
 | 
			
		||||
        case SDL_SCANCODE_KP_1: return ImGuiKey_Keypad1;
 | 
			
		||||
        case SDL_SCANCODE_KP_2: return ImGuiKey_Keypad2;
 | 
			
		||||
        case SDL_SCANCODE_KP_3: return ImGuiKey_Keypad3;
 | 
			
		||||
        case SDL_SCANCODE_KP_4: return ImGuiKey_Keypad4;
 | 
			
		||||
        case SDL_SCANCODE_KP_5: return ImGuiKey_Keypad5;
 | 
			
		||||
        case SDL_SCANCODE_KP_6: return ImGuiKey_Keypad6;
 | 
			
		||||
        case SDL_SCANCODE_KP_7: return ImGuiKey_Keypad7;
 | 
			
		||||
        case SDL_SCANCODE_KP_8: return ImGuiKey_Keypad8;
 | 
			
		||||
        case SDL_SCANCODE_KP_9: return ImGuiKey_Keypad9;
 | 
			
		||||
        case SDL_SCANCODE_KP_PERIOD: return ImGuiKey_KeypadDecimal;
 | 
			
		||||
        case SDL_SCANCODE_KP_DIVIDE: return ImGuiKey_KeypadDivide;
 | 
			
		||||
        case SDL_SCANCODE_KP_MULTIPLY: return ImGuiKey_KeypadMultiply;
 | 
			
		||||
        case SDL_SCANCODE_KP_MINUS: return ImGuiKey_KeypadSubtract;
 | 
			
		||||
        case SDL_SCANCODE_KP_PLUS: return ImGuiKey_KeypadAdd;
 | 
			
		||||
        case SDL_SCANCODE_KP_ENTER: return ImGuiKey_KeypadEnter;
 | 
			
		||||
        case SDL_SCANCODE_KP_EQUALS: return ImGuiKey_KeypadEqual;
 | 
			
		||||
        default: break;
 | 
			
		||||
    }
 | 
			
		||||
    switch (keycode)
 | 
			
		||||
    {
 | 
			
		||||
        case SDLK_TAB: return ImGuiKey_Tab;
 | 
			
		||||
@@ -145,7 +191,7 @@ static ImGuiKey ImGui_ImplSDL3_KeycodeToImGuiKey(int keycode)
 | 
			
		||||
        case SDLK_SPACE: return ImGuiKey_Space;
 | 
			
		||||
        case SDLK_RETURN: return ImGuiKey_Enter;
 | 
			
		||||
        case SDLK_ESCAPE: return ImGuiKey_Escape;
 | 
			
		||||
        case SDLK_QUOTE: return ImGuiKey_Apostrophe;
 | 
			
		||||
        case SDLK_APOSTROPHE: return ImGuiKey_Apostrophe;
 | 
			
		||||
        case SDLK_COMMA: return ImGuiKey_Comma;
 | 
			
		||||
        case SDLK_MINUS: return ImGuiKey_Minus;
 | 
			
		||||
        case SDLK_PERIOD: return ImGuiKey_Period;
 | 
			
		||||
@@ -155,29 +201,12 @@ static ImGuiKey ImGui_ImplSDL3_KeycodeToImGuiKey(int keycode)
 | 
			
		||||
        case SDLK_LEFTBRACKET: return ImGuiKey_LeftBracket;
 | 
			
		||||
        case SDLK_BACKSLASH: return ImGuiKey_Backslash;
 | 
			
		||||
        case SDLK_RIGHTBRACKET: return ImGuiKey_RightBracket;
 | 
			
		||||
        case SDLK_BACKQUOTE: return ImGuiKey_GraveAccent;
 | 
			
		||||
        case SDLK_GRAVE: return ImGuiKey_GraveAccent;
 | 
			
		||||
        case SDLK_CAPSLOCK: return ImGuiKey_CapsLock;
 | 
			
		||||
        case SDLK_SCROLLLOCK: return ImGuiKey_ScrollLock;
 | 
			
		||||
        case SDLK_NUMLOCKCLEAR: return ImGuiKey_NumLock;
 | 
			
		||||
        case SDLK_PRINTSCREEN: return ImGuiKey_PrintScreen;
 | 
			
		||||
        case SDLK_PAUSE: return ImGuiKey_Pause;
 | 
			
		||||
        case SDLK_KP_0: return ImGuiKey_Keypad0;
 | 
			
		||||
        case SDLK_KP_1: return ImGuiKey_Keypad1;
 | 
			
		||||
        case SDLK_KP_2: return ImGuiKey_Keypad2;
 | 
			
		||||
        case SDLK_KP_3: return ImGuiKey_Keypad3;
 | 
			
		||||
        case SDLK_KP_4: return ImGuiKey_Keypad4;
 | 
			
		||||
        case SDLK_KP_5: return ImGuiKey_Keypad5;
 | 
			
		||||
        case SDLK_KP_6: return ImGuiKey_Keypad6;
 | 
			
		||||
        case SDLK_KP_7: return ImGuiKey_Keypad7;
 | 
			
		||||
        case SDLK_KP_8: return ImGuiKey_Keypad8;
 | 
			
		||||
        case SDLK_KP_9: return ImGuiKey_Keypad9;
 | 
			
		||||
        case SDLK_KP_PERIOD: return ImGuiKey_KeypadDecimal;
 | 
			
		||||
        case SDLK_KP_DIVIDE: return ImGuiKey_KeypadDivide;
 | 
			
		||||
        case SDLK_KP_MULTIPLY: return ImGuiKey_KeypadMultiply;
 | 
			
		||||
        case SDLK_KP_MINUS: return ImGuiKey_KeypadSubtract;
 | 
			
		||||
        case SDLK_KP_PLUS: return ImGuiKey_KeypadAdd;
 | 
			
		||||
        case SDLK_KP_ENTER: return ImGuiKey_KeypadEnter;
 | 
			
		||||
        case SDLK_KP_EQUALS: return ImGuiKey_KeypadEqual;
 | 
			
		||||
        case SDLK_LCTRL: return ImGuiKey_LeftCtrl;
 | 
			
		||||
        case SDLK_LSHIFT: return ImGuiKey_LeftShift;
 | 
			
		||||
        case SDLK_LALT: return ImGuiKey_LeftAlt;
 | 
			
		||||
@@ -197,32 +226,32 @@ static ImGuiKey ImGui_ImplSDL3_KeycodeToImGuiKey(int keycode)
 | 
			
		||||
        case SDLK_7: return ImGuiKey_7;
 | 
			
		||||
        case SDLK_8: return ImGuiKey_8;
 | 
			
		||||
        case SDLK_9: return ImGuiKey_9;
 | 
			
		||||
        case SDLK_a: return ImGuiKey_A;
 | 
			
		||||
        case SDLK_b: return ImGuiKey_B;
 | 
			
		||||
        case SDLK_c: return ImGuiKey_C;
 | 
			
		||||
        case SDLK_d: return ImGuiKey_D;
 | 
			
		||||
        case SDLK_e: return ImGuiKey_E;
 | 
			
		||||
        case SDLK_f: return ImGuiKey_F;
 | 
			
		||||
        case SDLK_g: return ImGuiKey_G;
 | 
			
		||||
        case SDLK_h: return ImGuiKey_H;
 | 
			
		||||
        case SDLK_i: return ImGuiKey_I;
 | 
			
		||||
        case SDLK_j: return ImGuiKey_J;
 | 
			
		||||
        case SDLK_k: return ImGuiKey_K;
 | 
			
		||||
        case SDLK_l: return ImGuiKey_L;
 | 
			
		||||
        case SDLK_m: return ImGuiKey_M;
 | 
			
		||||
        case SDLK_n: return ImGuiKey_N;
 | 
			
		||||
        case SDLK_o: return ImGuiKey_O;
 | 
			
		||||
        case SDLK_p: return ImGuiKey_P;
 | 
			
		||||
        case SDLK_q: return ImGuiKey_Q;
 | 
			
		||||
        case SDLK_r: return ImGuiKey_R;
 | 
			
		||||
        case SDLK_s: return ImGuiKey_S;
 | 
			
		||||
        case SDLK_t: return ImGuiKey_T;
 | 
			
		||||
        case SDLK_u: return ImGuiKey_U;
 | 
			
		||||
        case SDLK_v: return ImGuiKey_V;
 | 
			
		||||
        case SDLK_w: return ImGuiKey_W;
 | 
			
		||||
        case SDLK_x: return ImGuiKey_X;
 | 
			
		||||
        case SDLK_y: return ImGuiKey_Y;
 | 
			
		||||
        case SDLK_z: return ImGuiKey_Z;
 | 
			
		||||
        case SDLK_A: return ImGuiKey_A;
 | 
			
		||||
        case SDLK_B: return ImGuiKey_B;
 | 
			
		||||
        case SDLK_C: return ImGuiKey_C;
 | 
			
		||||
        case SDLK_D: return ImGuiKey_D;
 | 
			
		||||
        case SDLK_E: return ImGuiKey_E;
 | 
			
		||||
        case SDLK_F: return ImGuiKey_F;
 | 
			
		||||
        case SDLK_G: return ImGuiKey_G;
 | 
			
		||||
        case SDLK_H: return ImGuiKey_H;
 | 
			
		||||
        case SDLK_I: return ImGuiKey_I;
 | 
			
		||||
        case SDLK_J: return ImGuiKey_J;
 | 
			
		||||
        case SDLK_K: return ImGuiKey_K;
 | 
			
		||||
        case SDLK_L: return ImGuiKey_L;
 | 
			
		||||
        case SDLK_M: return ImGuiKey_M;
 | 
			
		||||
        case SDLK_N: return ImGuiKey_N;
 | 
			
		||||
        case SDLK_O: return ImGuiKey_O;
 | 
			
		||||
        case SDLK_P: return ImGuiKey_P;
 | 
			
		||||
        case SDLK_Q: return ImGuiKey_Q;
 | 
			
		||||
        case SDLK_R: return ImGuiKey_R;
 | 
			
		||||
        case SDLK_S: return ImGuiKey_S;
 | 
			
		||||
        case SDLK_T: return ImGuiKey_T;
 | 
			
		||||
        case SDLK_U: return ImGuiKey_U;
 | 
			
		||||
        case SDLK_V: return ImGuiKey_V;
 | 
			
		||||
        case SDLK_W: return ImGuiKey_W;
 | 
			
		||||
        case SDLK_X: return ImGuiKey_X;
 | 
			
		||||
        case SDLK_Y: return ImGuiKey_Y;
 | 
			
		||||
        case SDLK_Z: return ImGuiKey_Z;
 | 
			
		||||
        case SDLK_F1: return ImGuiKey_F1;
 | 
			
		||||
        case SDLK_F2: return ImGuiKey_F2;
 | 
			
		||||
        case SDLK_F3: return ImGuiKey_F3;
 | 
			
		||||
@@ -249,6 +278,7 @@ static ImGuiKey ImGui_ImplSDL3_KeycodeToImGuiKey(int keycode)
 | 
			
		||||
        case SDLK_F24: return ImGuiKey_F24;
 | 
			
		||||
        case SDLK_AC_BACK: return ImGuiKey_AppBack;
 | 
			
		||||
        case SDLK_AC_FORWARD: return ImGuiKey_AppForward;
 | 
			
		||||
        default: break;
 | 
			
		||||
    }
 | 
			
		||||
    return ImGuiKey_None;
 | 
			
		||||
}
 | 
			
		||||
@@ -318,10 +348,11 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
 | 
			
		||||
        case SDL_EVENT_KEY_DOWN:
 | 
			
		||||
        case SDL_EVENT_KEY_UP:
 | 
			
		||||
        {
 | 
			
		||||
            ImGui_ImplSDL3_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod);
 | 
			
		||||
            ImGuiKey key = ImGui_ImplSDL3_KeycodeToImGuiKey(event->key.keysym.sym);
 | 
			
		||||
            //IMGUI_DEBUG_LOG("SDL_EVENT_KEY_%d: key=%d, scancode=%d, mod=%X\n", (event->type == SDL_EVENT_KEY_DOWN) ? "DOWN" : "UP", event->key.key, event->key.scancode, event->key.mod);
 | 
			
		||||
            ImGui_ImplSDL3_UpdateKeyModifiers((SDL_Keymod)event->key.mod);
 | 
			
		||||
            ImGuiKey key = ImGui_ImplSDL3_KeyEventToImGuiKey(event->key.key, event->key.scancode);
 | 
			
		||||
            io.AddKeyEvent(key, (event->type == SDL_EVENT_KEY_DOWN));
 | 
			
		||||
            io.SetKeyEventNativeData(key, event->key.keysym.sym, event->key.keysym.scancode, event->key.keysym.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions.
 | 
			
		||||
            io.SetKeyEventNativeData(key, event->key.key, event->key.scancode, event->key.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions.
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        case SDL_EVENT_WINDOW_MOUSE_ENTER:
 | 
			
		||||
@@ -357,18 +388,19 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplSDL3_SetupPlatformHandles(ImGuiViewport* viewport, SDL_Window* window)
 | 
			
		||||
{
 | 
			
		||||
    IM_UNUSED(window);
 | 
			
		||||
    viewport->PlatformHandle = window;
 | 
			
		||||
    viewport->PlatformHandleRaw = nullptr;
 | 
			
		||||
#if defined(__WIN32__) && !defined(__WINRT__)
 | 
			
		||||
    viewport->PlatformHandleRaw = (HWND)SDL_GetProperty(SDL_GetWindowProperties(window), "SDL.window.win32.hwnd", nullptr);
 | 
			
		||||
#if defined(_WIN32) && !defined(__WINRT__)
 | 
			
		||||
    viewport->PlatformHandleRaw = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, nullptr);
 | 
			
		||||
#elif defined(__APPLE__) && defined(SDL_VIDEO_DRIVER_COCOA)
 | 
			
		||||
    viewport->PlatformHandleRaw = (void*)SDL_GetProperty(SDL_GetWindowProperties(window), "SDL.window.cocoa.window", nullptr);
 | 
			
		||||
    viewport->PlatformHandleRaw = SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, nullptr);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool ImGui_ImplSDL3_Init(SDL_Window* window, SDL_Renderer* renderer, void* sdl_gl_context)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
 | 
			
		||||
    IM_UNUSED(sdl_gl_context); // Unused in this branch
 | 
			
		||||
 | 
			
		||||
@@ -397,22 +429,22 @@ static bool ImGui_ImplSDL3_Init(SDL_Window* window, SDL_Renderer* renderer, void
 | 
			
		||||
    io.SetClipboardTextFn = ImGui_ImplSDL3_SetClipboardText;
 | 
			
		||||
    io.GetClipboardTextFn = ImGui_ImplSDL3_GetClipboardText;
 | 
			
		||||
    io.ClipboardUserData = nullptr;
 | 
			
		||||
    io.SetPlatformImeDataFn = ImGui_ImplSDL3_SetPlatformImeData;
 | 
			
		||||
    io.PlatformSetImeDataFn = ImGui_ImplSDL3_PlatformSetImeData;
 | 
			
		||||
 | 
			
		||||
    // Gamepad handling
 | 
			
		||||
    bd->GamepadMode = ImGui_ImplSDL3_GamepadMode_AutoFirst;
 | 
			
		||||
    bd->WantUpdateGamepadsList = true;
 | 
			
		||||
 | 
			
		||||
    // Load mouse cursors
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_DEFAULT);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_TEXT);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_MOVE);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NS_RESIZE);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_EW_RESIZE);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NESW_RESIZE);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NWSE_RESIZE);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_POINTER);
 | 
			
		||||
    bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NOT_ALLOWED);
 | 
			
		||||
 | 
			
		||||
    // Set platform dependent data in viewport
 | 
			
		||||
    // Our mouse update function expect PlatformHandle to be filled for the main viewport
 | 
			
		||||
@@ -608,7 +640,7 @@ static void ImGui_ImplSDL3_UpdateGamepads()
 | 
			
		||||
    {
 | 
			
		||||
        ImGui_ImplSDL3_CloseGamepads();
 | 
			
		||||
        int sdl_gamepads_count = 0;
 | 
			
		||||
        SDL_JoystickID* sdl_gamepads = SDL_GetGamepads(&sdl_gamepads_count);
 | 
			
		||||
        const SDL_JoystickID* sdl_gamepads = SDL_GetGamepads(&sdl_gamepads_count);
 | 
			
		||||
        for (int n = 0; n < sdl_gamepads_count; n++)
 | 
			
		||||
            if (SDL_Gamepad* gamepad = SDL_OpenGamepad(sdl_gamepads[n]))
 | 
			
		||||
            {
 | 
			
		||||
@@ -616,7 +648,6 @@ static void ImGui_ImplSDL3_UpdateGamepads()
 | 
			
		||||
                if (bd->GamepadMode == ImGui_ImplSDL3_GamepadMode_AutoFirst)
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        SDL_free(sdl_gamepads);
 | 
			
		||||
        bd->WantUpdateGamepadsList = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
// dear imgui: Platform Backend for SDL3 (*EXPERIMENTAL*)
 | 
			
		||||
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
 | 
			
		||||
// (Info: SDL3 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.)
 | 
			
		||||
// (IMPORTANT: SDL 3.0.0 is NOT YET RELEASED. IT IS POSSIBLE THAT ITS SPECS/API WILL CHANGE BEFORE RELEASE)
 | 
			
		||||
 | 
			
		||||
// (**IMPORTANT: SDL 3.0.0 is NOT YET RELEASED AND CURRENTLY HAS A FAST CHANGING API. THIS CODE BREAKS OFTEN**)
 | 
			
		||||
 | 
			
		||||
// Implemented features:
 | 
			
		||||
//  [X] Platform: Clipboard support.
 | 
			
		||||
@@ -9,8 +10,6 @@
 | 
			
		||||
//  [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
 | 
			
		||||
//  [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
 | 
			
		||||
//  [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
 | 
			
		||||
// Missing features:
 | 
			
		||||
//  [ ] Platform: IME SUPPORT IS BROKEN IN SDL3 BECAUSE INPUTS GETS SENT TO BOTH APP AND IME + app needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!.
 | 
			
		||||
 | 
			
		||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
 | 
			
		||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
 | 
			
		||||
@@ -29,6 +28,7 @@ struct SDL_Renderer;
 | 
			
		||||
struct SDL_Gamepad;
 | 
			
		||||
typedef union SDL_Event SDL_Event;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDL3_InitForOpenGL(SDL_Window* window, void* sdl_gl_context);
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDL3_InitForVulkan(SDL_Window* window);
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDL3_InitForD3D(SDL_Window* window);
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
// - Introduction, links and more at the top of imgui.cpp
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
//  2024-05-14: *BREAKING CHANGE* ImGui_ImplSDLRenderer3_RenderDrawData() requires SDL_Renderer* passed as parameter.
 | 
			
		||||
//  2023-05-30: Renamed imgui_impl_sdlrenderer.h/.cpp to imgui_impl_sdlrenderer2.h/.cpp to accommodate for upcoming SDL3.
 | 
			
		||||
//  2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
 | 
			
		||||
//  2021-12-21: Update SDL_RenderGeometryRaw() format to work with SDL 2.0.19.
 | 
			
		||||
@@ -47,9 +48,9 @@
 | 
			
		||||
// SDL_Renderer data
 | 
			
		||||
struct ImGui_ImplSDLRenderer2_Data
 | 
			
		||||
{
 | 
			
		||||
    SDL_Renderer*   SDLRenderer;
 | 
			
		||||
    SDL_Renderer*   Renderer;       // Main viewport's renderer
 | 
			
		||||
    SDL_Texture*    FontTexture;
 | 
			
		||||
    ImGui_ImplSDLRenderer2_Data() { memset((void*)this, 0, sizeof(*this)); }
 | 
			
		||||
    ImGui_ImplSDLRenderer2_Data()   { memset((void*)this, 0, sizeof(*this)); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
 | 
			
		||||
@@ -63,6 +64,7 @@ static ImGui_ImplSDLRenderer2_Data* ImGui_ImplSDLRenderer2_GetBackendData()
 | 
			
		||||
bool ImGui_ImplSDLRenderer2_Init(SDL_Renderer* renderer)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
    IM_ASSERT(renderer != nullptr && "SDL_Renderer not initialized!");
 | 
			
		||||
 | 
			
		||||
@@ -72,7 +74,7 @@ bool ImGui_ImplSDLRenderer2_Init(SDL_Renderer* renderer)
 | 
			
		||||
    io.BackendRendererName = "imgui_impl_sdlrenderer2";
 | 
			
		||||
    io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;  // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
 | 
			
		||||
 | 
			
		||||
    bd->SDLRenderer = renderer;
 | 
			
		||||
    bd->Renderer = renderer;
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
@@ -91,14 +93,12 @@ void ImGui_ImplSDLRenderer2_Shutdown()
 | 
			
		||||
    IM_DELETE(bd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplSDLRenderer2_SetupRenderState()
 | 
			
		||||
static void ImGui_ImplSDLRenderer2_SetupRenderState(SDL_Renderer* renderer)
 | 
			
		||||
{
 | 
			
		||||
	ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
 | 
			
		||||
 | 
			
		||||
	// Clear out any viewports and cliprect set by the user
 | 
			
		||||
    // FIXME: Technically speaking there are lots of other things we could backup/setup/restore during our render process.
 | 
			
		||||
	SDL_RenderSetViewport(bd->SDLRenderer, nullptr);
 | 
			
		||||
	SDL_RenderSetClipRect(bd->SDLRenderer, nullptr);
 | 
			
		||||
	SDL_RenderSetViewport(renderer, nullptr);
 | 
			
		||||
	SDL_RenderSetClipRect(renderer, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui_ImplSDLRenderer2_NewFrame()
 | 
			
		||||
@@ -110,16 +110,14 @@ void ImGui_ImplSDLRenderer2_NewFrame()
 | 
			
		||||
        ImGui_ImplSDLRenderer2_CreateDeviceObjects();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data, SDL_Renderer* renderer)
 | 
			
		||||
{
 | 
			
		||||
	ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
 | 
			
		||||
 | 
			
		||||
	// If there's a scale factor set by the user, use that instead
 | 
			
		||||
    // If the user has specified a scale factor to SDL_Renderer already via SDL_RenderSetScale(), SDL will scale whatever we pass
 | 
			
		||||
    // to SDL_RenderGeometryRaw() by that scale factor. In that case we don't want to be also scaling it ourselves here.
 | 
			
		||||
    float rsx = 1.0f;
 | 
			
		||||
	float rsy = 1.0f;
 | 
			
		||||
	SDL_RenderGetScale(bd->SDLRenderer, &rsx, &rsy);
 | 
			
		||||
	SDL_RenderGetScale(renderer, &rsx, &rsy);
 | 
			
		||||
    ImVec2 render_scale;
 | 
			
		||||
	render_scale.x = (rsx == 1.0f) ? draw_data->FramebufferScale.x : 1.0f;
 | 
			
		||||
	render_scale.y = (rsy == 1.0f) ? draw_data->FramebufferScale.y : 1.0f;
 | 
			
		||||
@@ -138,16 +136,16 @@ void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
        SDL_Rect    ClipRect;
 | 
			
		||||
    };
 | 
			
		||||
    BackupSDLRendererState old = {};
 | 
			
		||||
    old.ClipEnabled = SDL_RenderIsClipEnabled(bd->SDLRenderer) == SDL_TRUE;
 | 
			
		||||
    SDL_RenderGetViewport(bd->SDLRenderer, &old.Viewport);
 | 
			
		||||
    SDL_RenderGetClipRect(bd->SDLRenderer, &old.ClipRect);
 | 
			
		||||
    old.ClipEnabled = SDL_RenderIsClipEnabled(renderer) == SDL_TRUE;
 | 
			
		||||
    SDL_RenderGetViewport(renderer, &old.Viewport);
 | 
			
		||||
    SDL_RenderGetClipRect(renderer, &old.ClipRect);
 | 
			
		||||
 | 
			
		||||
	// Will project scissor/clipping rectangles into framebuffer space
 | 
			
		||||
	ImVec2 clip_off = draw_data->DisplayPos;         // (0,0) unless using multi-viewports
 | 
			
		||||
	ImVec2 clip_scale = render_scale;
 | 
			
		||||
 | 
			
		||||
    // Render command lists
 | 
			
		||||
    ImGui_ImplSDLRenderer2_SetupRenderState();
 | 
			
		||||
    ImGui_ImplSDLRenderer2_SetupRenderState(renderer);
 | 
			
		||||
    for (int n = 0; n < draw_data->CmdListsCount; n++)
 | 
			
		||||
    {
 | 
			
		||||
        const ImDrawList* cmd_list = draw_data->CmdLists[n];
 | 
			
		||||
@@ -162,7 +160,7 @@ void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
                // User callback, registered via ImDrawList::AddCallback()
 | 
			
		||||
                // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
 | 
			
		||||
                if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
 | 
			
		||||
                    ImGui_ImplSDLRenderer2_SetupRenderState();
 | 
			
		||||
                    ImGui_ImplSDLRenderer2_SetupRenderState(renderer);
 | 
			
		||||
                else
 | 
			
		||||
                    pcmd->UserCallback(cmd_list, pcmd);
 | 
			
		||||
            }
 | 
			
		||||
@@ -179,7 +177,7 @@ void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
                    continue;
 | 
			
		||||
 | 
			
		||||
                SDL_Rect r = { (int)(clip_min.x), (int)(clip_min.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y) };
 | 
			
		||||
                SDL_RenderSetClipRect(bd->SDLRenderer, &r);
 | 
			
		||||
                SDL_RenderSetClipRect(renderer, &r);
 | 
			
		||||
 | 
			
		||||
                const float* xy = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + offsetof(ImDrawVert, pos));
 | 
			
		||||
                const float* uv = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + offsetof(ImDrawVert, uv));
 | 
			
		||||
@@ -191,7 +189,7 @@ void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
 | 
			
		||||
                // Bind texture, Draw
 | 
			
		||||
				SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID();
 | 
			
		||||
                SDL_RenderGeometryRaw(bd->SDLRenderer, tex,
 | 
			
		||||
                SDL_RenderGeometryRaw(renderer, tex,
 | 
			
		||||
                    xy, (int)sizeof(ImDrawVert),
 | 
			
		||||
                    color, (int)sizeof(ImDrawVert),
 | 
			
		||||
                    uv, (int)sizeof(ImDrawVert),
 | 
			
		||||
@@ -202,8 +200,8 @@ void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Restore modified SDL_Renderer state
 | 
			
		||||
    SDL_RenderSetViewport(bd->SDLRenderer, &old.Viewport);
 | 
			
		||||
    SDL_RenderSetClipRect(bd->SDLRenderer, old.ClipEnabled ? &old.ClipRect : nullptr);
 | 
			
		||||
    SDL_RenderSetViewport(renderer, &old.Viewport);
 | 
			
		||||
    SDL_RenderSetClipRect(renderer, old.ClipEnabled ? &old.ClipRect : nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Called by Init/NewFrame/Shutdown
 | 
			
		||||
@@ -219,7 +217,7 @@ bool ImGui_ImplSDLRenderer2_CreateFontsTexture()
 | 
			
		||||
 | 
			
		||||
    // Upload texture to graphics system
 | 
			
		||||
    // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling)
 | 
			
		||||
    bd->FontTexture = SDL_CreateTexture(bd->SDLRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, width, height);
 | 
			
		||||
    bd->FontTexture = SDL_CreateTexture(bd->Renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, width, height);
 | 
			
		||||
    if (bd->FontTexture == nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        SDL_Log("error creating texture");
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,11 @@
 | 
			
		||||
 | 
			
		||||
struct SDL_Renderer;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDLRenderer2_Init(SDL_Renderer* renderer);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer2_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer2_NewFrame();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data, SDL_Renderer* renderer);
 | 
			
		||||
 | 
			
		||||
// Called by Init/NewFrame/Shutdown
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDLRenderer2_CreateFontsTexture();
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,8 @@
 | 
			
		||||
// - Introduction, links and more at the top of imgui.cpp
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
//  2024-07-01: Update for SDL3 api changes: SDL_RenderGeometryRaw() uint32 version was removed (SDL#9009).
 | 
			
		||||
//  2024-05-14: *BREAKING CHANGE* ImGui_ImplSDLRenderer3_RenderDrawData() requires SDL_Renderer* passed as parameter.
 | 
			
		||||
//  2024-02-12: Amend to query SDL_RenderViewportSet() and restore viewport accordingly.
 | 
			
		||||
//  2023-05-30: Initial version.
 | 
			
		||||
 | 
			
		||||
@@ -43,9 +45,11 @@
 | 
			
		||||
// SDL_Renderer data
 | 
			
		||||
struct ImGui_ImplSDLRenderer3_Data
 | 
			
		||||
{
 | 
			
		||||
    SDL_Renderer*   SDLRenderer;
 | 
			
		||||
    SDL_Texture*    FontTexture;
 | 
			
		||||
    ImGui_ImplSDLRenderer3_Data() { memset((void*)this, 0, sizeof(*this)); }
 | 
			
		||||
    SDL_Renderer*           Renderer;       // Main viewport's renderer
 | 
			
		||||
    SDL_Texture*            FontTexture;
 | 
			
		||||
    ImVector<SDL_FColor>    ColorBuffer;
 | 
			
		||||
 | 
			
		||||
    ImGui_ImplSDLRenderer3_Data()   { memset((void*)this, 0, sizeof(*this)); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
 | 
			
		||||
@@ -59,6 +63,7 @@ static ImGui_ImplSDLRenderer3_Data* ImGui_ImplSDLRenderer3_GetBackendData()
 | 
			
		||||
bool ImGui_ImplSDLRenderer3_Init(SDL_Renderer* renderer)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
    IM_ASSERT(renderer != nullptr && "SDL_Renderer not initialized!");
 | 
			
		||||
 | 
			
		||||
@@ -68,7 +73,7 @@ bool ImGui_ImplSDLRenderer3_Init(SDL_Renderer* renderer)
 | 
			
		||||
    io.BackendRendererName = "imgui_impl_sdlrenderer3";
 | 
			
		||||
    io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;  // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
 | 
			
		||||
 | 
			
		||||
    bd->SDLRenderer = renderer;
 | 
			
		||||
    bd->Renderer = renderer;
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
@@ -87,14 +92,12 @@ void ImGui_ImplSDLRenderer3_Shutdown()
 | 
			
		||||
    IM_DELETE(bd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplSDLRenderer3_SetupRenderState()
 | 
			
		||||
static void ImGui_ImplSDLRenderer3_SetupRenderState(SDL_Renderer* renderer)
 | 
			
		||||
{
 | 
			
		||||
	ImGui_ImplSDLRenderer3_Data* bd = ImGui_ImplSDLRenderer3_GetBackendData();
 | 
			
		||||
 | 
			
		||||
	// Clear out any viewports and cliprect set by the user
 | 
			
		||||
    // FIXME: Technically speaking there are lots of other things we could backup/setup/restore during our render process.
 | 
			
		||||
	SDL_SetRenderViewport(bd->SDLRenderer, nullptr);
 | 
			
		||||
	SDL_SetRenderClipRect(bd->SDLRenderer, nullptr);
 | 
			
		||||
	SDL_SetRenderViewport(renderer, nullptr);
 | 
			
		||||
	SDL_SetRenderClipRect(renderer, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui_ImplSDLRenderer3_NewFrame()
 | 
			
		||||
@@ -106,16 +109,34 @@ void ImGui_ImplSDLRenderer3_NewFrame()
 | 
			
		||||
        ImGui_ImplSDLRenderer3_CreateDeviceObjects();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
// https://github.com/libsdl-org/SDL/issues/9009
 | 
			
		||||
static int SDL_RenderGeometryRaw8BitColor(SDL_Renderer* renderer, ImVector<SDL_FColor>& colors_out, SDL_Texture* texture, const float* xy, int xy_stride, const SDL_Color* color, int color_stride, const float* uv, int uv_stride, int num_vertices, const void* indices, int num_indices, int size_indices)
 | 
			
		||||
{
 | 
			
		||||
	ImGui_ImplSDLRenderer3_Data* bd = ImGui_ImplSDLRenderer3_GetBackendData();
 | 
			
		||||
    const Uint8* color2 = (const Uint8*)color;
 | 
			
		||||
    colors_out.resize(num_vertices);
 | 
			
		||||
    SDL_FColor* color3 = colors_out.Data;
 | 
			
		||||
    for (int i = 0; i < num_vertices; i++)
 | 
			
		||||
    {
 | 
			
		||||
        color3[i].r = color->r / 255.0f;
 | 
			
		||||
        color3[i].g = color->g / 255.0f;
 | 
			
		||||
        color3[i].b = color->b / 255.0f;
 | 
			
		||||
        color3[i].a = color->a / 255.0f;
 | 
			
		||||
        color2 += color_stride;
 | 
			
		||||
        color = (const SDL_Color*)color2;
 | 
			
		||||
    }
 | 
			
		||||
    return SDL_RenderGeometryRaw(renderer, texture, xy, xy_stride, color3, sizeof(*color3), uv, uv_stride, num_vertices, indices, num_indices, size_indices);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data, SDL_Renderer* renderer)
 | 
			
		||||
{
 | 
			
		||||
    ImGui_ImplSDLRenderer3_Data* bd = ImGui_ImplSDLRenderer3_GetBackendData();
 | 
			
		||||
 | 
			
		||||
	// If there's a scale factor set by the user, use that instead
 | 
			
		||||
    // If the user has specified a scale factor to SDL_Renderer already via SDL_RenderSetScale(), SDL will scale whatever we pass
 | 
			
		||||
    // to SDL_RenderGeometryRaw() by that scale factor. In that case we don't want to be also scaling it ourselves here.
 | 
			
		||||
    float rsx = 1.0f;
 | 
			
		||||
	float rsy = 1.0f;
 | 
			
		||||
	SDL_GetRenderScale(bd->SDLRenderer, &rsx, &rsy);
 | 
			
		||||
	SDL_GetRenderScale(renderer, &rsx, &rsy);
 | 
			
		||||
    ImVec2 render_scale;
 | 
			
		||||
	render_scale.x = (rsx == 1.0f) ? draw_data->FramebufferScale.x : 1.0f;
 | 
			
		||||
	render_scale.y = (rsy == 1.0f) ? draw_data->FramebufferScale.y : 1.0f;
 | 
			
		||||
@@ -135,17 +156,17 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
        SDL_Rect    ClipRect;
 | 
			
		||||
    };
 | 
			
		||||
    BackupSDLRendererState old = {};
 | 
			
		||||
    old.ViewportEnabled = SDL_RenderViewportSet(bd->SDLRenderer) == SDL_TRUE;
 | 
			
		||||
    old.ClipEnabled = SDL_RenderClipEnabled(bd->SDLRenderer) == SDL_TRUE;
 | 
			
		||||
    SDL_GetRenderViewport(bd->SDLRenderer, &old.Viewport);
 | 
			
		||||
    SDL_GetRenderClipRect(bd->SDLRenderer, &old.ClipRect);
 | 
			
		||||
    old.ViewportEnabled = SDL_RenderViewportSet(renderer) == SDL_TRUE;
 | 
			
		||||
    old.ClipEnabled = SDL_RenderClipEnabled(renderer) == SDL_TRUE;
 | 
			
		||||
    SDL_GetRenderViewport(renderer, &old.Viewport);
 | 
			
		||||
    SDL_GetRenderClipRect(renderer, &old.ClipRect);
 | 
			
		||||
 | 
			
		||||
	// Will project scissor/clipping rectangles into framebuffer space
 | 
			
		||||
	ImVec2 clip_off = draw_data->DisplayPos;         // (0,0) unless using multi-viewports
 | 
			
		||||
	ImVec2 clip_scale = render_scale;
 | 
			
		||||
 | 
			
		||||
    // Render command lists
 | 
			
		||||
    ImGui_ImplSDLRenderer3_SetupRenderState();
 | 
			
		||||
    ImGui_ImplSDLRenderer3_SetupRenderState(renderer);
 | 
			
		||||
    for (int n = 0; n < draw_data->CmdListsCount; n++)
 | 
			
		||||
    {
 | 
			
		||||
        const ImDrawList* cmd_list = draw_data->CmdLists[n];
 | 
			
		||||
@@ -160,7 +181,7 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
                // User callback, registered via ImDrawList::AddCallback()
 | 
			
		||||
                // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
 | 
			
		||||
                if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
 | 
			
		||||
                    ImGui_ImplSDLRenderer3_SetupRenderState();
 | 
			
		||||
                    ImGui_ImplSDLRenderer3_SetupRenderState(renderer);
 | 
			
		||||
                else
 | 
			
		||||
                    pcmd->UserCallback(cmd_list, pcmd);
 | 
			
		||||
            }
 | 
			
		||||
@@ -177,7 +198,7 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
                    continue;
 | 
			
		||||
 | 
			
		||||
                SDL_Rect r = { (int)(clip_min.x), (int)(clip_min.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y) };
 | 
			
		||||
                SDL_SetRenderClipRect(bd->SDLRenderer, &r);
 | 
			
		||||
                SDL_SetRenderClipRect(renderer, &r);
 | 
			
		||||
 | 
			
		||||
                const float* xy = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + offsetof(ImDrawVert, pos));
 | 
			
		||||
                const float* uv = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + offsetof(ImDrawVert, uv));
 | 
			
		||||
@@ -185,7 +206,7 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
 | 
			
		||||
                // Bind texture, Draw
 | 
			
		||||
				SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID();
 | 
			
		||||
                SDL_RenderGeometryRaw(bd->SDLRenderer, tex,
 | 
			
		||||
                SDL_RenderGeometryRaw8BitColor(renderer, bd->ColorBuffer, tex,
 | 
			
		||||
                    xy, (int)sizeof(ImDrawVert),
 | 
			
		||||
                    color, (int)sizeof(ImDrawVert),
 | 
			
		||||
                    uv, (int)sizeof(ImDrawVert),
 | 
			
		||||
@@ -196,8 +217,8 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Restore modified SDL_Renderer state
 | 
			
		||||
    SDL_SetRenderViewport(bd->SDLRenderer, old.ViewportEnabled ? &old.Viewport : nullptr);
 | 
			
		||||
    SDL_SetRenderClipRect(bd->SDLRenderer, old.ClipEnabled ? &old.ClipRect : nullptr);
 | 
			
		||||
    SDL_SetRenderViewport(renderer, old.ViewportEnabled ? &old.Viewport : nullptr);
 | 
			
		||||
    SDL_SetRenderClipRect(renderer, old.ClipEnabled ? &old.ClipRect : nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Called by Init/NewFrame/Shutdown
 | 
			
		||||
@@ -213,7 +234,7 @@ bool ImGui_ImplSDLRenderer3_CreateFontsTexture()
 | 
			
		||||
 | 
			
		||||
    // Upload texture to graphics system
 | 
			
		||||
    // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling)
 | 
			
		||||
    bd->FontTexture = SDL_CreateTexture(bd->SDLRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, width, height);
 | 
			
		||||
    bd->FontTexture = SDL_CreateTexture(bd->Renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, width, height);
 | 
			
		||||
    if (bd->FontTexture == nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        SDL_Log("error creating texture");
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,11 @@
 | 
			
		||||
 | 
			
		||||
struct SDL_Renderer;
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDLRenderer3_Init(SDL_Renderer* renderer);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer3_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer3_NewFrame();
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data, SDL_Renderer* renderer);
 | 
			
		||||
 | 
			
		||||
// Called by Init/NewFrame/Shutdown
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplSDLRenderer3_CreateFontsTexture();
 | 
			
		||||
 
 | 
			
		||||
@@ -42,14 +42,14 @@
 | 
			
		||||
//  2024-01-03: Vulkan: Stopped creating command pools with VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT as we don't reset them.
 | 
			
		||||
//  2023-11-29: Vulkan: Fixed mismatching allocator passed to vkCreateCommandPool() vs vkDestroyCommandPool(). (#7075)
 | 
			
		||||
//  2023-11-10: *BREAKING CHANGE*: Removed parameter from ImGui_ImplVulkan_CreateFontsTexture(): backend now creates its own command-buffer to upload fonts.
 | 
			
		||||
//              *BREAKING CHANGE*: Removed ImGui_ImplVulkan_DestroyFontUploadObjects() which is now unecessary as we create and destroy those objects in the backend.
 | 
			
		||||
//              *BREAKING CHANGE*: Removed ImGui_ImplVulkan_DestroyFontUploadObjects() which is now unnecessary as we create and destroy those objects in the backend.
 | 
			
		||||
//              ImGui_ImplVulkan_CreateFontsTexture() is automatically called by NewFrame() the first time.
 | 
			
		||||
//              You can call ImGui_ImplVulkan_CreateFontsTexture() again to recreate the font atlas texture.
 | 
			
		||||
//              Added ImGui_ImplVulkan_DestroyFontsTexture() but you probably never need to call this.
 | 
			
		||||
//  2023-07-04: Vulkan: Added optional support for VK_KHR_dynamic_rendering. User needs to set init_info->UseDynamicRendering = true and init_info->ColorAttachmentFormat.
 | 
			
		||||
//  2023-01-02: Vulkan: Fixed sampler passed to ImGui_ImplVulkan_AddTexture() not being honored + removed a bunch of duplicate code.
 | 
			
		||||
//  2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
 | 
			
		||||
//  2022-10-04: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738).
 | 
			
		||||
//  2022-10-04: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symmetry. (#914, #5738).
 | 
			
		||||
//  2022-01-20: Vulkan: Added support for ImTextureID as VkDescriptorSet. User need to call ImGui_ImplVulkan_AddTexture(). Building for 32-bit targets requires '#define ImTextureID ImU64'. (#914).
 | 
			
		||||
//  2021-10-15: Vulkan: Call vkCmdSetScissor() at the end of render a full-viewport to reduce likehood of issues with people using VK_DYNAMIC_STATE_SCISSOR in their app without calling vkCmdSetScissor() explicitly every frame.
 | 
			
		||||
//  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
 | 
			
		||||
@@ -1092,6 +1092,7 @@ bool    ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@
 | 
			
		||||
 | 
			
		||||
// Vulkan includes
 | 
			
		||||
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
 | 
			
		||||
#include <Volk/volk.h>
 | 
			
		||||
#include <volk.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <vulkan/vulkan.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -98,7 +98,7 @@ struct ImGui_ImplVulkan_InitInfo
 | 
			
		||||
    VkDeviceSize                    MinAllocationSize;      // Minimum allocation size. Set to 1024*1024 to satisfy zealous best practices validation layer and waste a little memory.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Called by user code
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool         ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info);
 | 
			
		||||
IMGUI_IMPL_API void         ImGui_ImplVulkan_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void         ImGui_ImplVulkan_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -724,6 +724,7 @@ void ImGui_ImplWGPU_InvalidateDeviceObjects()
 | 
			
		||||
bool ImGui_ImplWGPU_Init(ImGui_ImplWGPU_InitInfo* init_info)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
 | 
			
		||||
 | 
			
		||||
    // Setup backend capabilities flags
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ struct ImGui_ImplWGPU_InitInfo
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool ImGui_ImplWGPU_Init(ImGui_ImplWGPU_InitInfo* init_info);
 | 
			
		||||
IMGUI_IMPL_API void ImGui_ImplWGPU_Shutdown();
 | 
			
		||||
IMGUI_IMPL_API void ImGui_ImplWGPU_NewFrame();
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2024-07-08: Inputs: Fixed ImGuiMod_Super being mapped to VK_APPS instead of VK_LWIN||VK_RWIN. (#7768)
 | 
			
		||||
//  2023-10-05: Inputs: Added support for extra ImGuiKey values: F13 to F24 function keys, app back/forward keys.
 | 
			
		||||
//  2023-09-25: Inputs: Synthesize key-down event on key-up for VK_SNAPSHOT / ImGuiKey_PrintScreen as Windows doesn't emit it (same behavior as GLFW/SDL).
 | 
			
		||||
//  2023-09-07: Inputs: Added support for keyboard codepage conversion for when application is compiled in MBCS mode and using a non-Unicode window.
 | 
			
		||||
@@ -98,6 +99,7 @@ typedef DWORD(WINAPI* PFN_XInputGetState)(DWORD, XINPUT_STATE*);
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(__GNUC__)
 | 
			
		||||
#pragma GCC diagnostic push
 | 
			
		||||
#pragma GCC diagnostic ignored "-Wpragmas"                  // warning: unknown option after '#pragma GCC diagnostic' kind
 | 
			
		||||
#pragma GCC diagnostic ignored "-Wcast-function-type"       // warning: cast between incompatible function types (for loader)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -146,6 +148,7 @@ static void ImGui_ImplWin32_UpdateKeyboardCodePage()
 | 
			
		||||
static bool ImGui_ImplWin32_InitEx(void* hwnd, bool platform_has_own_dc)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    IMGUI_CHECKVERSION();
 | 
			
		||||
    IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
 | 
			
		||||
 | 
			
		||||
    INT64 perf_frequency, perf_counter;
 | 
			
		||||
@@ -168,7 +171,8 @@ static bool ImGui_ImplWin32_InitEx(void* hwnd, bool platform_has_own_dc)
 | 
			
		||||
    ImGui_ImplWin32_UpdateKeyboardCodePage();
 | 
			
		||||
 | 
			
		||||
    // Set platform dependent data in viewport
 | 
			
		||||
    ImGui::GetMainViewport()->PlatformHandleRaw = (void*)hwnd;
 | 
			
		||||
    ImGuiViewport* main_viewport = ImGui::GetMainViewport();
 | 
			
		||||
    main_viewport->PlatformHandle = main_viewport->PlatformHandleRaw = (void*)bd->hWnd;
 | 
			
		||||
    IM_UNUSED(platform_has_own_dc); // Used in 'docking' branch
 | 
			
		||||
 | 
			
		||||
    // Dynamically load XInput library
 | 
			
		||||
@@ -291,7 +295,7 @@ static void ImGui_ImplWin32_UpdateKeyModifiers()
 | 
			
		||||
    io.AddKeyEvent(ImGuiMod_Ctrl, IsVkDown(VK_CONTROL));
 | 
			
		||||
    io.AddKeyEvent(ImGuiMod_Shift, IsVkDown(VK_SHIFT));
 | 
			
		||||
    io.AddKeyEvent(ImGuiMod_Alt, IsVkDown(VK_MENU));
 | 
			
		||||
    io.AddKeyEvent(ImGuiMod_Super, IsVkDown(VK_APPS));
 | 
			
		||||
    io.AddKeyEvent(ImGuiMod_Super, IsVkDown(VK_LWIN) || IsVkDown(VK_RWIN));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ImGui_ImplWin32_UpdateMouseData()
 | 
			
		||||
@@ -581,11 +585,10 @@ static ImGuiMouseSource GetMouseSourceFromMessageExtraInfo()
 | 
			
		||||
IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 | 
			
		||||
{
 | 
			
		||||
    // Most backends don't have silent checks like this one, but we need it because WndProc are called early in CreateWindow().
 | 
			
		||||
    if (ImGui::GetCurrentContext() == nullptr)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    // We silently allow both context or just only backend data to be nullptr.
 | 
			
		||||
    ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
 | 
			
		||||
    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplWin32_Init()?");
 | 
			
		||||
    if (bd == nullptr)
 | 
			
		||||
        return 0;
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
 | 
			
		||||
    switch (msg)
 | 
			
		||||
@@ -608,10 +611,10 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
 | 
			
		||||
        }
 | 
			
		||||
        POINT mouse_pos = { (LONG)GET_X_LPARAM(lParam), (LONG)GET_Y_LPARAM(lParam) };
 | 
			
		||||
        if (msg == WM_NCMOUSEMOVE && ::ScreenToClient(hwnd, &mouse_pos) == FALSE) // WM_NCMOUSEMOVE are provided in absolute coordinates.
 | 
			
		||||
            break;
 | 
			
		||||
            return 0;
 | 
			
		||||
        io.AddMouseSourceEvent(mouse_source);
 | 
			
		||||
        io.AddMousePosEvent((float)mouse_pos.x, (float)mouse_pos.y);
 | 
			
		||||
        break;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    case WM_MOUSELEAVE:
 | 
			
		||||
    case WM_NCMOUSELEAVE:
 | 
			
		||||
@@ -624,7 +627,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
 | 
			
		||||
            bd->MouseTrackedArea = 0;
 | 
			
		||||
            io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
 | 
			
		||||
    case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
#include "imgui.h"      // IMGUI_IMPL_API
 | 
			
		||||
#ifndef IMGUI_DISABLE
 | 
			
		||||
 | 
			
		||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplWin32_Init(void* hwnd);
 | 
			
		||||
IMGUI_IMPL_API bool     ImGui_ImplWin32_InitForOpenGL(void* hwnd);
 | 
			
		||||
IMGUI_IMPL_API void     ImGui_ImplWin32_Shutdown();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								external/imgui/imgui/docs/BACKENDS.md
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -2,23 +2,10 @@ _(You may browse this at https://github.com/ocornut/imgui/blob/master/docs/BACKE
 | 
			
		||||
 | 
			
		||||
## Dear ImGui: Backends
 | 
			
		||||
 | 
			
		||||
**The backends/ folder contains backends for popular platforms/graphics API, which you can use in
 | 
			
		||||
your application or engine to easily integrate Dear ImGui.** Each backend is typically self-contained in a pair of files: imgui_impl_XXXX.cpp + imgui_impl_XXXX.h.
 | 
			
		||||
 | 
			
		||||
- The 'Platform' backends are in charge of: mouse/keyboard/gamepad inputs, cursor shape, timing, and windowing.<BR>
 | 
			
		||||
  e.g. Windows ([imgui_impl_win32.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_win32.cpp)), GLFW ([imgui_impl_glfw.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_glfw.cpp)), SDL2 ([imgui_impl_sdl2.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_sdl2.cpp)), etc.
 | 
			
		||||
 | 
			
		||||
- The 'Renderer' backends are in charge of: creating atlas texture, and rendering imgui draw data.<BR>
 | 
			
		||||
  e.g. DirectX11 ([imgui_impl_dx11.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_dx11.cpp)), OpenGL/WebGL ([imgui_impl_opengl3.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_opengl3.cpp)), Vulkan ([imgui_impl_vulkan.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_vulkan.cpp)), etc.
 | 
			
		||||
 | 
			
		||||
- For some high-level frameworks, a single backend usually handles both 'Platform' and 'Renderer' parts.<BR>
 | 
			
		||||
  e.g. Allegro 5 ([imgui_impl_allegro5.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_allegro5.cpp)). If you end up creating a custom backend for your engine, you may want to do the same.
 | 
			
		||||
 | 
			
		||||
An application usually combines one Platform backend + one Renderer backend + main Dear ImGui sources.
 | 
			
		||||
For example, the [example_win32_directx11](https://github.com/ocornut/imgui/tree/master/examples/example_win32_directx11) application combines imgui_impl_win32.cpp + imgui_impl_dx11.cpp. There are 20+ examples in the [examples/](https://github.com/ocornut/imgui/blob/master/examples/) folder. See [EXAMPLES.MD](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md) for details.
 | 
			
		||||
 | 
			
		||||
**Once Dear ImGui is setup and running, run and refer to `ImGui::ShowDemoWindow()` in imgui_demo.cpp for usage of the end-user API.**
 | 
			
		||||
### Integrating backends
 | 
			
		||||
 | 
			
		||||
💡 The **[Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) wiki guide** has examples of how to integrate Dear ImGui into an existing application.
 | 
			
		||||
<BR> The [EXAMPLES.MD](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md) documentation may also be worth a read.
 | 
			
		||||
 | 
			
		||||
### What are backends?
 | 
			
		||||
 | 
			
		||||
@@ -38,7 +25,7 @@ Dear ImGui is highly portable and only requires a few things to run and render,
 | 
			
		||||
 - Optional: multi-viewports support.
 | 
			
		||||
 etc.
 | 
			
		||||
 | 
			
		||||
This is essentially what each backend is doing + obligatory portability cruft. Using default backends ensure you can get all those features including the ones that would be harder to implement on your side (e.g. multi-viewports support).
 | 
			
		||||
This is essentially what each backend is doing + obligatory portability cruft. Using standard backends ensure you can get all those features including the ones that would be harder to implement on your side (e.g. multi-viewports support).
 | 
			
		||||
 | 
			
		||||
It is important to understand the difference between the core Dear ImGui library (files in the root folder)
 | 
			
		||||
and the backends which we are describing here (backends/ folder).
 | 
			
		||||
@@ -47,11 +34,24 @@ and the backends which we are describing here (backends/ folder).
 | 
			
		||||
- You should be able to write backends for pretty much any platform and any 3D graphics API.
 | 
			
		||||
  e.g. you can get creative and use software rendering or render remotely on a different machine.
 | 
			
		||||
 | 
			
		||||
### Standard backends
 | 
			
		||||
 | 
			
		||||
### Integrating a backend
 | 
			
		||||
**The [backends/](https://github.com/ocornut/imgui/blob/master/backends) folder contains backends for popular platforms/graphics API, which you can use in
 | 
			
		||||
your application or engine to easily integrate Dear ImGui.** Each backend is typically self-contained in a pair of files: imgui_impl_XXXX.cpp + imgui_impl_XXXX.h.
 | 
			
		||||
 | 
			
		||||
See "Getting Started" section of [EXAMPLES.MD](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md) for more details.
 | 
			
		||||
- The 'Platform' backends are in charge of: mouse/keyboard/gamepad inputs, cursor shape, timing, and windowing.<BR>
 | 
			
		||||
  e.g. Windows ([imgui_impl_win32.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_win32.cpp)), GLFW ([imgui_impl_glfw.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_glfw.cpp)), SDL2 ([imgui_impl_sdl2.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_sdl2.cpp)), etc.
 | 
			
		||||
 | 
			
		||||
- The 'Renderer' backends are in charge of: creating atlas texture, and rendering imgui draw data.<BR>
 | 
			
		||||
  e.g. DirectX11 ([imgui_impl_dx11.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_dx11.cpp)), OpenGL/WebGL ([imgui_impl_opengl3.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_opengl3.cpp)), Vulkan ([imgui_impl_vulkan.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_vulkan.cpp)), etc.
 | 
			
		||||
 | 
			
		||||
- For some high-level frameworks, a single backend usually handles both 'Platform' and 'Renderer' parts.<BR>
 | 
			
		||||
  e.g. Allegro 5 ([imgui_impl_allegro5.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_allegro5.cpp)). If you end up creating a custom backend for your engine, you may want to do the same.
 | 
			
		||||
 | 
			
		||||
An application usually combines one Platform backend + one Renderer backend + main Dear ImGui sources.
 | 
			
		||||
For example, the [example_win32_directx11](https://github.com/ocornut/imgui/tree/master/examples/example_win32_directx11) application combines imgui_impl_win32.cpp + imgui_impl_dx11.cpp. There are 20+ examples in the [examples/](https://github.com/ocornut/imgui/blob/master/examples/) folder. See [EXAMPLES.MD](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md) for details.
 | 
			
		||||
 | 
			
		||||
**Once Dear ImGui is setup and running, run and refer to `ImGui::ShowDemoWindow()` in imgui_demo.cpp for usage of the end-user API.**
 | 
			
		||||
 | 
			
		||||
### List of backends
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										403
									
								
								external/imgui/imgui/docs/CHANGELOG.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -35,6 +35,395 @@ HOW TO UPDATE?
 | 
			
		||||
  and API updates have been a little more frequent lately. They are documented below and in imgui.cpp and should not affect all users.
 | 
			
		||||
- Please report any issue!
 | 
			
		||||
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 VERSION 1.91.0 (Released 2024-07-30)
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.91.0
 | 
			
		||||
 | 
			
		||||
Breaking changes:
 | 
			
		||||
 | 
			
		||||
- IO, IME: renamed platform IME hook and added explicit context for consistency and future-proofness.
 | 
			
		||||
    - old: io.SetPlatformImeDataFn(ImGuiViewport* viewport, ImGuiPlatformImeData* data);
 | 
			
		||||
    - new: io.PlatformSetImeDataFn(ImGuiContext* ctx, ImGuiViewport* viewport, ImGuiPlatformImeData* data);
 | 
			
		||||
  It is expected that for a vast majority of users this is automatically set by core
 | 
			
		||||
  library and/or platform backend so it won't have any effect.
 | 
			
		||||
- Obsoleted GetContentRegionMax(), GetWindowContentRegionMin() and GetWindowContentRegionMax(). (#7838)
 | 
			
		||||
  You should never need those functions! You can do everything in less a confusing manner by only
 | 
			
		||||
  using GetCursorScreenPos() and GetContentRegionAvail(). Also always consider that if you are using
 | 
			
		||||
  GetWindowPos() and GetCursorPos() you may also be making things unnecessarily complicated.
 | 
			
		||||
  I repeat: You can do everything with GetCursorScreenPos() and GetContentRegionAvail()!
 | 
			
		||||
   - GetWindowContentRegionMax().x - GetCursorPos().x              -->  GetContentRegionAvail().x
 | 
			
		||||
   - GetWindowContentRegionMax().x + GetWindowPos().x              -->  GetCursorScreenPos().x + GetContentRegionAvail().x              // when called from left edge of window
 | 
			
		||||
   - GetContentRegionMax()                                         -->  GetContentRegionAvail() + GetCursorScreenPos() - GetWindowPos() // right edge in local coordinates
 | 
			
		||||
   - GetWindowContentRegionMax().x - GetWindowContentRegionMin().x -->  GetContentRegionAvail()                                         // when called from left edge of window
 | 
			
		||||
- Item flag changes:
 | 
			
		||||
  - Obsoleted PushButtonRepeat()/PopButtonRepeat() in favor of using new PushItemFlag()/PopItemFlag()
 | 
			
		||||
    with ImGuiItemFlags_ButtonRepeat. Kept inline redirecting functions (will obsolete).
 | 
			
		||||
  - Obsoleted PushTabStop()/PopTabStop() in favor of using new PushItemFlag()/PopItemFlag()
 | 
			
		||||
    with ImGuiItemFlags_NoTabStop. Kept inline redirecting functions (will obsolete).
 | 
			
		||||
  - Renamed ImGuiSelectableFlags_DontClosePopups to ImGuiSelectableFlags_NoAutoClosePopups for
 | 
			
		||||
    consistency. Kept inline redirecting functions (will obsolete).
 | 
			
		||||
    + Internals: changed/inverted ImGuiItemFlags_SelectableDontClosePopup (default==false) to
 | 
			
		||||
      ImGuiItemFlags_AutoClosePopups (default==true), same logic, only inverted behavior.
 | 
			
		||||
    (#1379, #1468, #2200, #4936, #5216, #7302, #7573)
 | 
			
		||||
- Commented out obsolete ImGuiModFlags (renamed to ImGuiKeyChord in 1.89). (#4921, #456)
 | 
			
		||||
- Commented out obsolete ImGuiModFlags_XXX values (renamed to ImGuiMod_XXX in 1.89). (#4921, #456)
 | 
			
		||||
    - ImGuiModFlags_Ctrl -> ImGuiMod_Ctrl, ImGuiModFlags_Shift -> ImGuiMod_Shift etc.
 | 
			
		||||
- Backends: GLFW+Emscripten: Renamed ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback() to
 | 
			
		||||
  ImGui_ImplGlfw_InstallEmscriptenCallbacks(), with an additional GLFWWindow* parameter. (#7647) [@ypujante]
 | 
			
		||||
 | 
			
		||||
Other changes:
 | 
			
		||||
 | 
			
		||||
- Added TextLink(), TextLinkOpenURL() hyperlink widgets. (#7660)
 | 
			
		||||
- IO: added io.PlatformOpenInShellFn handler to open a link/folder/file in OS shell. (#7660)
 | 
			
		||||
  Added IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS to disable default Windows/Linux/Mac implementations.
 | 
			
		||||
- IO: added io.ConfigNavSwapGamepadButtons to swap Activate/Cancel (A<>B) buttons, to match the
 | 
			
		||||
  typical "Nintendo/Japanese consoles" button layout when using Gamepad navigation. (#787, #5723)
 | 
			
		||||
- Added PushItemFlag()/PopItemFlags(), ImGuiItemFlags to modify shared item flags:
 | 
			
		||||
   - Added ImGuiItemFlags_NoTabStop to disable tabbing through items.
 | 
			
		||||
   - Added ImGuiItemFlags_NoNav to disable any navigation and focus of items. (#787)
 | 
			
		||||
   - Added ImGuiItemFlags_NoNavDefaultFocus to disable item being default focus. (#787)
 | 
			
		||||
   - Added ImGuiItemFlags_ButtonRepeat to enable repeat on any button-like behavior.
 | 
			
		||||
   - Added ImGuiItemFlags_AutoClosePopups to disable menu items/selection auto closing parent popups.
 | 
			
		||||
     Disabling this was previously possible for Selectable() via a direct flag but not for MenuItem().
 | 
			
		||||
     (#1379, #1468, #2200, #4936, #5216, #7302, #7573)
 | 
			
		||||
   - This was mostly all previously in imgui_internal.h.
 | 
			
		||||
- Multi-Select: added multi-select API and demos. (#1861, #6518)
 | 
			
		||||
   - This system implements standard multi-selection idioms (CTRL+mouse click, CTRL+keyboard moves,
 | 
			
		||||
     SHIFT+mouse click, SHIFT+keyboard moves, etc.) with support for clipper (not submitting non-visible
 | 
			
		||||
     items), box-selection with scrolling, and many other details.
 | 
			
		||||
   - In the spirit of Dear ImGui design, your code owns both items and actual selection data.
 | 
			
		||||
     This is designed to allow all kinds of selection storage you may use in your application
 | 
			
		||||
     (e.g. set/map/hash, intrusive selection, interval trees, up to you).
 | 
			
		||||
   - The supported widgets are Selectable(), Checkbox(). TreeNode() is also technically supported but...
 | 
			
		||||
     using this correctly is more complicated. You need some sort of linear/random access to your tree,
 | 
			
		||||
     which is suited to advanced trees setups already implementing filters and clipper.
 | 
			
		||||
     We will work toward simplifying our existing demo for trees.
 | 
			
		||||
   - A helper ImGuiSelectionBasicStorage is provided to facilitate getting started in a typical app
 | 
			
		||||
     (likely to suit a majority of users).
 | 
			
		||||
   - Documentation:
 | 
			
		||||
     - Wiki page https://github.com/ocornut/imgui/wiki/Multi-Select for API overview.
 | 
			
		||||
     - Demo code + headers are well commented.
 | 
			
		||||
  - Added BeginMultiSelect(), EndMultiSelect(), SetNextItemSelectionUserData().
 | 
			
		||||
  - Added IsItemToggledSelection() for use if you need latest selection update during current iteration.
 | 
			
		||||
  - Added ImGuiMultiSelectIO and ImGuiSelectionRequest structures:
 | 
			
		||||
    - BeginMultiSelect() and EndMultiSelect() return a ImGuiMultiSelectIO structure, which
 | 
			
		||||
      is mostly an array of ImGuiSelectionRequest actions (clear, select all, set range, etc.)
 | 
			
		||||
    - Other fields are helpful when using a clipper, or wanting to handle deletion nicely.
 | 
			
		||||
  - Added ImGuiSelectionBasicStorage helper to store and maintain a selection (optional):
 | 
			
		||||
    - This is similar to if you used e.g. a std::set<ID> to store a selection, with all the right
 | 
			
		||||
      glue to honor ImGuiMultiSelectIO requests. Most applications can use that.
 | 
			
		||||
  - Added ImGuiSelectionExternalStorage helper to maintain an externally stored selection (optional):
 | 
			
		||||
    - Helpful to easily bind multi-selection to e.g. an array of checkboxes.
 | 
			
		||||
  - Added ImGuiMultiSelectFlags options:
 | 
			
		||||
    - ImGuiMultiSelectFlags_SingleSelect
 | 
			
		||||
    - ImGuiMultiSelectFlags_NoSelectAll
 | 
			
		||||
    - ImGuiMultiSelectFlags_NoRangeSelect
 | 
			
		||||
    - ImGuiMultiSelectFlags_NoAutoSelect
 | 
			
		||||
    - ImGuiMultiSelectFlags_NoAutoClear
 | 
			
		||||
    - ImGuiMultiSelectFlags_NoAutoClearOnReselect (#7424)
 | 
			
		||||
    - ImGuiMultiSelectFlags_BoxSelect1d
 | 
			
		||||
    - ImGuiMultiSelectFlags_BoxSelect2d
 | 
			
		||||
    - ImGuiMultiSelectFlags_BoxSelectNoScroll
 | 
			
		||||
    - ImGuiMultiSelectFlags_ClearOnEscape
 | 
			
		||||
    - ImGuiMultiSelectFlags_ClearOnClickVoid
 | 
			
		||||
    - ImGuiMultiSelectFlags_ScopeWindow (default), ImGuiMultiSelectFlags_ScopeRect
 | 
			
		||||
    - ImGuiMultiSelectFlags_SelectOnClick (default), ImGuiMultiSelectFlags_SelectOnClickRelease
 | 
			
		||||
    - ImGuiMultiSelectFlags_NavWrapX
 | 
			
		||||
  - Demo: Added "Examples->Assets Browser" demo.
 | 
			
		||||
  - Demo: Added "Widgets->Selection State & Multi-Select" section, with:
 | 
			
		||||
    - Multi-Select
 | 
			
		||||
    - Multi-Select (with clipper)
 | 
			
		||||
    - Multi-Select (with deletion)
 | 
			
		||||
    - Multi-Select (dual list box) (#6648)
 | 
			
		||||
    - Multi-Select (in a table)
 | 
			
		||||
    - Multi-Select (checkboxes)
 | 
			
		||||
    - Multi-Select (multiple scopes)
 | 
			
		||||
    - Multi-Select (tiled assert browser)
 | 
			
		||||
    - Multi-Select (trees) (#1861)
 | 
			
		||||
    - Multi-Select (advanced)
 | 
			
		||||
- Inputs: added SetItemKeyOwner(ImGuiKey key) in public API.
 | 
			
		||||
  This is a simplified version of a more complete set of function available in imgui_internal.h.
 | 
			
		||||
  One common use-case for this is to allow your widgets to disable standard inputs behaviors such
 | 
			
		||||
  as Tab or Alt handling, Mouse Wheel scrolling, etc.
 | 
			
		||||
  (#456, #2637, #2620, #2891, #3370, #3724, #4828, #5108, #5242, #5641)
 | 
			
		||||
     // Hovering or activating the button will disable mouse wheel default behavior to scroll
 | 
			
		||||
     InvisibleButton(...);
 | 
			
		||||
     SetItemKeyOwner(ImGuiKey_MouseWheelY);
 | 
			
		||||
- Nav: fixed clicking window decorations (e.g. resize borders) from losing focused item when
 | 
			
		||||
  within a child window using ImGuiChildFlags_NavFlattened.
 | 
			
		||||
- InputText: added '\' and '/' as word separator. (#7824, #7704) [@reduf]
 | 
			
		||||
- TreeNode: added SetNextItemStorageID() to specify/override the identifier used for persisting
 | 
			
		||||
  open/close storage. Useful if needing to often read/write from storage without manipulating
 | 
			
		||||
  the ID stack. (#7553, #6990, #3823, #1131)
 | 
			
		||||
- Selectable: added ImGuiSelectableFlags_Highlight flag to highlight items independently from
 | 
			
		||||
  the hovered state. (#7820) [@rerilier]
 | 
			
		||||
- Clipper: added SeekCursorForItem() function. When using ImGuiListClipper::Begin(INT_MAX) you can
 | 
			
		||||
  can use the clipper without knowing the amount of items beforehand. (#1311)
 | 
			
		||||
  In this situation, call ImGuiListClipper::SeekCursorForItem(items_count) at the end of your iteration
 | 
			
		||||
  loop to position the layout cursor correctly. This is done automatically if provided a count to Begin().
 | 
			
		||||
- Groups, Tables: fixed EndGroup() failing to correctly capture current table occupied size. (#7543)
 | 
			
		||||
- Style, TabBar: added style.TabBarOverlineSize / ImGuiStyleVar_TabBarOverlineSize to manipulate
 | 
			
		||||
  thickness of the horizontal line over selected tabs. [@DctrNoob]
 | 
			
		||||
- Style: close button and collapse/window-menu button hover highlight made rectangular instead of round.
 | 
			
		||||
- Misc: added GetID(int) variant for consistency. (#7111)
 | 
			
		||||
- Debug Tools:
 | 
			
		||||
  - Debug Log: Added IMGUI_DEBUG_LOG(), ImGui::DebugLog() in public API. (#5855)
 | 
			
		||||
    Printed entries include imgui frame counter prefix + are redirected to ShowDebugLogWindow() and
 | 
			
		||||
    other configurable locations. Always call IMGUI_DEBUG_LOG() for maximum stripping in caller code.
 | 
			
		||||
  - Debug Log: Added "Configure Outputs.." button. (#5855)
 | 
			
		||||
  - Debug Log: Fixed incorrect checkbox layout when partially clipped.
 | 
			
		||||
- Demo: Reworked "Property Editor" demo in a manner that more resemble the tree data and
 | 
			
		||||
  struct description data that a real application would want to use.
 | 
			
		||||
- Backends:
 | 
			
		||||
  - Backends: Win32: Fixed ImGuiMod_Super being mapped to VK_APPS instead of (VK_LWIN || VK_RWIN).
 | 
			
		||||
    (#7768, #4858, #2622) [@Aemony]
 | 
			
		||||
  - Backends: SDL3: Update for API changes: SDL_GetGamepads() memory ownership change. (#7807)
 | 
			
		||||
  - Backends: SDL3: Update for API changes: SDL_GetClipboardText() memory ownership change. (#7801)
 | 
			
		||||
  - Backends: SDL3: Update for API changes: SDLK_x renames and SDLK_KP_x removals (#7761, #7762)
 | 
			
		||||
  - Backends: SDL3: Update for API changes: SDL_GetProperty() change to SDL_GetPointerProperty(). (#7794) [@wermipls]
 | 
			
		||||
  - Backends: SDL2,SDL3,OSX: Update for io.SetPlatformImeDataFn() -> io.PlatformSetImeDataFn() rename.
 | 
			
		||||
  - Backends: GLFW,SDL2: Added io.PlatformOpenInShellFn handler for web/Emscripten versions. (#7660)
 | 
			
		||||
    [@ypujante, @ocornut]
 | 
			
		||||
  - Backends; GLFW+Emscripten: Added support for GLFW3 contrib port which fixes many of the things
 | 
			
		||||
    not supported by the embedded GLFW: gamepad support, mouse cursor shapes, copy to clipboard,
 | 
			
		||||
    workaround for Super/Meta key, different ways of resizing, multi-window (glfw/canvas) support.
 | 
			
		||||
    (#7647) [@ypujante]
 | 
			
		||||
  - Backends: GLFW+Emscripten: Fixed Emscripten warning when using mouse wheel on some setups
 | 
			
		||||
    "Unable to preventDefault inside passive event listener". (#7647, #7600) [@ypujante]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 VERSION 1.90.9 (Released 2024-07-01)
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.90.9
 | 
			
		||||
 | 
			
		||||
Breaking changes:
 | 
			
		||||
 | 
			
		||||
- Removed old nested structure: renaming ImGuiStorage::ImGuiStoragePair type to
 | 
			
		||||
  ImGuiStoragePair (simpler for many languages). No significant nested type left.
 | 
			
		||||
- BeginChild: added ImGuiChildFlags_NavFlattened as a replacement for the window
 | 
			
		||||
  flag ImGuiWindowFlags_NavFlattened: the feature only ever made sense for
 | 
			
		||||
  BeginChild() calls anyhow. (#7687) [@cfillion]
 | 
			
		||||
   - old: BeginChild("Name", size, 0, ImGuiWindowFlags_NavFlattened);
 | 
			
		||||
   - new: BeginChild("Name", size, ImGuiChildFlags_NavFlattened, 0)
 | 
			
		||||
  Kept inline redirection flag (will obsolete).
 | 
			
		||||
- Style: renamed tab colors for clarity and consistency with other changes: (#261, #351)
 | 
			
		||||
  - ImGuiCol_TabActive          -> ImGuiCol_TabSelected
 | 
			
		||||
  - ImGuiCol_TabUnfocused       -> ImGuiCol_TabDimmed
 | 
			
		||||
  - ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected
 | 
			
		||||
  Kept inline redirecting enums (will obsolete).
 | 
			
		||||
- IO: io.ClearInputKeys() (first exposed in 1.89.8) doesn't clear mouse data.
 | 
			
		||||
  Newly added io.ClearInputMouse() does. (#4921)
 | 
			
		||||
- Drag and Drop: renamed ImGuiDragDropFlags_SourceAutoExpirePayload to
 | 
			
		||||
  ImGuiDragDropFlags_PayloadAutoExpire. Kept inline redirecting enum (will obsolete). (#1725, #143)
 | 
			
		||||
 | 
			
		||||
Other changes:
 | 
			
		||||
 | 
			
		||||
- IO: do not disable io.ConfigWindowsResizeFromEdges (which allow resizing from borders
 | 
			
		||||
  and lower-left corner) when ImGuiBackendFlags_HasMouseCursors is not set by backend.
 | 
			
		||||
  The initial reasoning is that resizing from borders feels better when correct mouse cursor
 | 
			
		||||
  shape change as honored by backends. Keeping this enabling will hopefully increase pressure
 | 
			
		||||
  on third-party backends to set ImGuiBackendFlags_HasMouseCursors and honor changes of
 | 
			
		||||
  ImGui::GetMouseCursor() value. (#1495)
 | 
			
		||||
- IO: do not claim io.WantCaptureMouse=true on the mouse release frame of a button
 | 
			
		||||
  which was pressed over void/underlying app, which is consistent/needed to allow the
 | 
			
		||||
  mouse up event of a drag over void/underlying app to catch release. (#1392) [@Moka42]
 | 
			
		||||
- IO: Added io.ClearInputMouse() to clear mouse state. (#4921)
 | 
			
		||||
- Windows: BeginChild(): fixed a glitch when during a resize of a child window which is
 | 
			
		||||
  tightly close to the boundaries of its parent (e.g. with zero WindowPadding), the child
 | 
			
		||||
  position could have temporarily be moved around by erroneous padding application. (#7706)
 | 
			
		||||
- TabBar, Style: added ImGuiTabBarFlags_DrawSelectedOverline option to draw an horizontal
 | 
			
		||||
  line over selected tabs to increase visibility. This is used by docking.
 | 
			
		||||
  Added corresponding ImGuiCol_TabSelectedOverline and ImGuiCol_TabDimmedSelectedOverline colors.
 | 
			
		||||
- Tables: added TableGetHoveredColumn() to public API, as an alternative to testing for
 | 
			
		||||
  'TableGetColumnFlags(column) & ImGuiTableColumnFlags_IsHovered' on each column. (#3740)
 | 
			
		||||
- Disabled, Inputs: fixed using Shortcut() or SetNextItemShortcut() within a disabled block
 | 
			
		||||
  bypassing the disabled state. (#7726)
 | 
			
		||||
- Disabled: Reworked 1.90.8 behavior of Begin() not inheriting current BeginDisabled() state,
 | 
			
		||||
  to make it that only tooltip windows are temporarily clearing it. (#211, #7640)
 | 
			
		||||
- Drags: added ImGuiSliderFlags_WrapAround flag for DragInt(), DragFloat() etc. (#7749)
 | 
			
		||||
- Drag and Drop: BeginDragDropSource() with ImGuiDragDropFlags_SourceExtern sets
 | 
			
		||||
  active id so a multi-frame extern source doesn't interfere with hovered widgets. (#143)
 | 
			
		||||
- Drag and Drop: BeginDragDropSource() with ImGuiDragDropFlags_SourceExtern does not assume
 | 
			
		||||
  a mouse button being pressed. Facilitate implementing cross-context drag and drop. (#143)
 | 
			
		||||
- Drag and Drop: Added ImGuiDragDropFlags_PayloadNoCrossContext/_PayloadNoCrossProcess flags
 | 
			
		||||
  as metadata to specify that a payload may not be copied outside the context/process by
 | 
			
		||||
  some logic aiming to copy payloads around.
 | 
			
		||||
- Drag and Drop: Fixes an issue when elapsing payload would be based on last payload
 | 
			
		||||
  frame instead of last drag source frame, which makes a difference if not resubmitting
 | 
			
		||||
  payload every frame. (#143)
 | 
			
		||||
- Debug Tools: Metrics/Debugger: Browsing a Storage perform hover lookup on identifier.
 | 
			
		||||
- Viewports: Backported 'void* ImGuiViewport::PlatformHandle' from docking branch for
 | 
			
		||||
  use by backends.
 | 
			
		||||
- imgui_freetype: Fixed divide by zero while handling FT_PIXEL_MODE_BGRA glyphs. (#7267, #3369)
 | 
			
		||||
- Backends: OpenGL2, OpenGL3: ImGui_ImplOpenGL3_NewFrame() recreates font texture if it
 | 
			
		||||
  has been destroyed by ImGui_ImplOpenGL3_DestroyFontsTexture(). (#7748) [@mlauss2]
 | 
			
		||||
- Backends: SDL3: Update for API removal of keysym field in SDL_KeyboardEvent. (#7728)
 | 
			
		||||
- Backends: SDL3: Update for SDL_StartTextInput()/SDL_StopTextInput() API changes. (#7735)
 | 
			
		||||
- Backends: SDL3: Update for SDL_SetTextInputRect() API rename. (#7760, #7754) [@maxortner01]
 | 
			
		||||
- Backends: SDLRenderer3: Update for SDL_RenderGeometryRaw() API changes. (SDL#9009).
 | 
			
		||||
- Backends: Vulkan: Remove Volk/ from volk.h #include directives. (#7722, #6582, #4854)
 | 
			
		||||
  [@martin-ejdestig]
 | 
			
		||||
- Examples: SDL3: Remove use of SDL_HINT_IME_NATIVE_UI since new SDL_HINT_IME_IMPLEMENTED_UI
 | 
			
		||||
  values has a more suitable default for our case case.
 | 
			
		||||
- Examples: GLFW+Vulkan, SDL+Vulkan: handle swap chain resize even without Vulkan
 | 
			
		||||
  returning VK_SUBOPTIMAL_KHR, which doesn't seem to happen on Wayland. (#7671)
 | 
			
		||||
  [@AndreiNego, @ocornut]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 VERSION 1.90.8 (Released 2024-06-06)
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.90.8
 | 
			
		||||
 | 
			
		||||
Breaking changes:
 | 
			
		||||
 | 
			
		||||
- Reordered various ImGuiInputTextFlags values. This should NOT be breaking unless
 | 
			
		||||
  you are using generated headers that have values not matching the main library.
 | 
			
		||||
- Removed ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft
 | 
			
		||||
  from imgui.h, was mostly unused and misleading.
 | 
			
		||||
 | 
			
		||||
Other changes:
 | 
			
		||||
 | 
			
		||||
- Inputs: fixed IsMouseClicked(..., repeat=true); broken in 1.90.7 on 2024/05/22.
 | 
			
		||||
  (due to an internal api parameter swap, repeat wouldn't be honored and
 | 
			
		||||
  ownership would be accidentally checked even though this api is meant to not
 | 
			
		||||
  check ownership). (#7657) [@korenkonder]
 | 
			
		||||
- Windows: fixed altering FramePadding mid-frame not correctly affecting logic
 | 
			
		||||
  responsible for honoring io.ConfigWindowsMoveFromTitleBarOnly. (#7576, #899)
 | 
			
		||||
- Scrollbar: made scrolling logic more standard: clicking above or below the
 | 
			
		||||
  grab scrolls by one page, holding mouse button repeats scrolling. (#7328, #150)
 | 
			
		||||
- Scrollbar: fixed miscalculation of vertical scrollbar visibility when required
 | 
			
		||||
  solely by the presence of an horizontal scrollbar. (#1574)
 | 
			
		||||
- InputScalar, InputInt, InputFloat: added ImGuiInputTextFlags_ParseEmptyRefVal
 | 
			
		||||
  to parse an empty field as zero-value. (#7305) [@supermerill, @ocornut]
 | 
			
		||||
- InputScalar, InputInt, InputFloat: added ImGuiInputTextFlags_DisplayEmptyRefVal
 | 
			
		||||
  to display a zero-value as empty. (#7305) [@supermerill, @ocornut]
 | 
			
		||||
- Popups: fixed an issue preventing to close a popup opened over a modal by clicking
 | 
			
		||||
  over void (it required clicking over the visible part of the modal). (#7654)
 | 
			
		||||
- Tables: fixed an issue where ideal size reported to parent container wouldn't
 | 
			
		||||
  correctly take account of inner scrollbar, affecting potential auto-resize of
 | 
			
		||||
  parent container. (#7651)
 | 
			
		||||
- Tables: fixed a bug where after disabling the ScrollY flag for a table,
 | 
			
		||||
  previous scrollbar width would be accounted for. (#5920)
 | 
			
		||||
- Combo: simplified Combo() API uses a list clipper (due to its api it wasn't
 | 
			
		||||
  previously trivial before we added clipper.IncludeItemByIndex() function).
 | 
			
		||||
- Disabled: nested tooltips or other non-child window within a BeginDisabled()
 | 
			
		||||
  block disable the disabled state. (#211, #7640)
 | 
			
		||||
- Misc: made ImGuiDir and ImGuiSortDirection stronger-typed enums.
 | 
			
		||||
- Backends: SDL3: Update for SDL_SYSTEM_CURSOR_xxx api renames. (#7653)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 VERSION 1.90.7 (Released 2024-05-27)
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.90.7
 | 
			
		||||
 | 
			
		||||
Breaking changes:
 | 
			
		||||
 | 
			
		||||
- Inputs: on macOS X, Cmd and Ctrl keys are now automatically swapped by io.AddKeyEvent(),
 | 
			
		||||
  as this naturally align with how macOS X uses those keys. (#2343, #4084, #5923, #456)
 | 
			
		||||
  - Effectively it means that e.g. ImGuiMod_Ctrl | ImGuiKey_C is a valid idiomatic shortcut
 | 
			
		||||
    for both Windows and Mac style users.
 | 
			
		||||
  - It shouldn't really affect your code unless you had explicit/custom shortcut swapping in
 | 
			
		||||
    place for macOS X apps in your input logic.
 | 
			
		||||
  - Removed ImGuiMod_Shortcut which was previously dynamically remapping to Ctrl or Cmd/Super.
 | 
			
		||||
    It is now unnecessary to specific cross-platform idiomatic shortcuts.
 | 
			
		||||
    Kept symbols redirecting ImGuiMod_Shortcut to ImGuiMod_Ctrl (will obsolete).
 | 
			
		||||
- Commented out obsolete symbols renamed in 1.88 (May 2022):
 | 
			
		||||
    CaptureKeyboardFromApp() -> SetNextFrameWantCaptureKeyboard()
 | 
			
		||||
    CaptureMouseFromApp()    -> SetNextFrameWantCaptureMouse()
 | 
			
		||||
- Backends: SDL_Renderer2/SDL_Renderer3: ImGui_ImplSDLRenderer2_RenderDrawData() and
 | 
			
		||||
  ImGui_ImplSDLRenderer3_RenderDrawData() now takes a SDL_Renderer* parameter. This was previously
 | 
			
		||||
  overlooked from the API but it will allow eventual support for multi-viewports.
 | 
			
		||||
 | 
			
		||||
Other changes:
 | 
			
		||||
 | 
			
		||||
- Windows: BeginChild(): fixed visibility of fully clipped child windows and tables to Test Engine.
 | 
			
		||||
- Windows: BeginChild(): fixed auto-fit calculation when using either (not both) ResizeX/ResizeY
 | 
			
		||||
  and double-clicking on a border. Calculation incorrectly didn't always account for scrollbar as
 | 
			
		||||
  it assumed the other axis would also be auto-fit. (#1710)
 | 
			
		||||
- Inputs: added shortcut and routing system in public API. (#456, #2637) [BETA]
 | 
			
		||||
  - The general idea is that several callers may register interest in a shortcut, and only one owner gets it.
 | 
			
		||||
    - in Parent: call Shortcut(Ctrl+S)    // When Parent is focused, Parent gets the shortcut.
 | 
			
		||||
    - in Child1: call Shortcut(Ctrl+S)    // When Child1 is focused, Child1 gets the shortcut (Child1 overrides Parent shortcuts)
 | 
			
		||||
    - in Child2: no call                  // When Child2 is focused, Parent gets the shortcut.
 | 
			
		||||
    The whole system is order independent, so if Child1 makes its calls before Parent, results will be identical.
 | 
			
		||||
    This is an important property as it facilitate working with foreign code or larger codebase.
 | 
			
		||||
  - Added Shortcut() function:
 | 
			
		||||
    e.g. Using ImGui::Shortcut(ImGuiMod_Ctrl | ImGuiKey_C); with default policy:
 | 
			
		||||
    - checks that CTRL+C is pressed,
 | 
			
		||||
    - and that current window is in focus stack,
 | 
			
		||||
    - and that no other requests for CTRL+C have been made from higher priority locations
 | 
			
		||||
      (e.g. deeper in the window/item stack).
 | 
			
		||||
  - Added SetNextItemShortcut() to set a shortcut to locally or remotely press or activate
 | 
			
		||||
    an item (depending on specified routing policy: using ImGuiInputFlags_RouteGlobal the item
 | 
			
		||||
    shortcut may be executed even if its window is not in focus stack).
 | 
			
		||||
    Items like buttons are not fully activated, in the sense that they get pressed but another
 | 
			
		||||
    active item, e.g. InputText() won't be deactivated.
 | 
			
		||||
  - Added routing policies for Shortcut(), SetNextItemShortcut(): (#456, #2637)
 | 
			
		||||
    - ImGuiInputFlags_RouteFocused: focus stack route (default)
 | 
			
		||||
    - ImGuiInputFlags_RouteActive: only route to active item
 | 
			
		||||
    - ImGuiInputFlags_RouteGlobal: route globally, unless a focus route claim shame shortcut.
 | 
			
		||||
    - ImGuiInputFlags_RouteAlways: no routing submission, no routing check.
 | 
			
		||||
  - Added other shortcut/routing options: (#456, #2637)
 | 
			
		||||
    - ImGuiInputFlags_Repeat: for use by Shortcut() and by upcoming rework of various
 | 
			
		||||
      input functions (which are still internal for now).
 | 
			
		||||
    - ImGuiInputFlags_Tooltip: for SetNextItemShortcut() to show a tooltip when hovering item.
 | 
			
		||||
    - ImGuiInputFlags_RouteOverFocused: global route takes priority over focus route.
 | 
			
		||||
    - ImGuiInputFlags_RouteOverActive: global route takes priority over active item.
 | 
			
		||||
    - ImGuiInputFlags_RouteUnlessBgFocused: global route disabled if no imgui window focused.
 | 
			
		||||
    - ImGuiInputFlags_RouteFromRootWindow: route evaluated from the point of view of root window rather than current window.
 | 
			
		||||
- Inputs: (OSX) Fixes variety of code which inconsistently required using Ctrl instead of Cmd.
 | 
			
		||||
  - e.g. Drags/Sliders now use Cmd+Click to input a value. (#4084)
 | 
			
		||||
  - Some shortcuts still uses Ctrl on Mac: e.g. Ctrl+Tab to switch windows. (#4828)
 | 
			
		||||
- Inputs: (OSX) Ctrl+Left Click alias as a Right click. (#2343) [@haldean, @ocornut]
 | 
			
		||||
- Inputs: Fixed ImGui::GetKeyName(ImGuiKey_None) from returning "N/A" or "None" depending
 | 
			
		||||
  on value of IMGUI_DISABLE_OBSOLETE_KEYIO. It always returns "None".
 | 
			
		||||
- Nav: fixed holding Ctrl or gamepad L1 from not slowing down keyboard/gamepad tweak speed.
 | 
			
		||||
  Broken during a refactor refactor for 1.89. Holding Shift/R1 to speed up wasn't broken.
 | 
			
		||||
- Tables: fixed cell background of fully clipped row overlapping with header. (#7575, #7041) [@prabuinet]
 | 
			
		||||
- Demo: Added "Inputs & Focus -> Shortcuts" section. (#456, #2637)
 | 
			
		||||
- Demo: Documents: Added shortcuts and renaming tabs/documents. (#7233)
 | 
			
		||||
- Examples: Win32+DX9,DX10,DX11,DX12: rework main loop to handle minimization and screen
 | 
			
		||||
  locking without burning resources by running unthrottled code. (#2496, #3907, #6308, #7615)
 | 
			
		||||
- Backends: all backends + demo now call IMGUI_CHECKVERSION() to verify ABI compatibility between caller
 | 
			
		||||
  code and compiled version of Dear ImGui. If you get an assert it most likely mean you have a build issue,
 | 
			
		||||
  read comments near the assert. (#7568)
 | 
			
		||||
- Backends: Win32: undo an assert introduced in 1.90.6 which didn't allow WndProc
 | 
			
		||||
  handler to be called before backend initialization. Because of how ::CreateWindow()
 | 
			
		||||
  calls in WndProc this is facilitating. (#6275) [@MennoVink]
 | 
			
		||||
- Backends, Examples: SDL3: updates for latest SDL3 API changes. (#7580) [@kuvaus, @ocornut]
 | 
			
		||||
 | 
			
		||||
Breaking changes IF you were using imgui_internal.h versions of Shortcut() or owner-aware
 | 
			
		||||
versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked() prior to this version:
 | 
			
		||||
 | 
			
		||||
- Inputs (Internals): Renamed ImGuiKeyOwner_None to ImGuiKeyOwner_NoOwner, to make use more
 | 
			
		||||
  explicit and reduce confusion with the fact it is a non-zero value and cannot be a default.
 | 
			
		||||
- Inputs (Internals): Renamed symbols global routes:
 | 
			
		||||
      Renamed ImGuiInputFlags_RouteGlobalLow  -> ImGuiInputFlags_RouteGlobal (this is the suggested global route)
 | 
			
		||||
      Renamed ImGuiInputFlags_RouteGlobal     -> ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused
 | 
			
		||||
      Renamed ImGuiInputFlags_RouteGlobalHigh -> ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive
 | 
			
		||||
- Inputs (Internals): Shortcut(), SetShortcutRouting(): swapped last two parameters order
 | 
			
		||||
  in function signatures:
 | 
			
		||||
      Before: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
 | 
			
		||||
      After:  Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0);
 | 
			
		||||
- Inputs (Internals): owner-aware versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked():
 | 
			
		||||
  swapped last two parameters order in function signatures:
 | 
			
		||||
      Before: IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
 | 
			
		||||
      After:  IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0);
 | 
			
		||||
      Before: IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0);
 | 
			
		||||
      After:  IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0);
 | 
			
		||||
- For several reasons those changes makes sense. They were all made before making some of
 | 
			
		||||
  those API public. Only past users of imgui_internal.h with the extra parameters will be affected.
 | 
			
		||||
  Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 VERSION 1.90.6 (Released 2024-05-08)
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
@@ -650,7 +1039,7 @@ Breaking changes:
 | 
			
		||||
 | 
			
		||||
- IO: Obsoleted io.ClearInputCharacters() (added in 1.47) as it now ambiguous
 | 
			
		||||
  and often incorrect/misleading considering the existence of a higher-level
 | 
			
		||||
  input queue. This is automatically cleared by io.ClearInputsKeys(). (#4921)
 | 
			
		||||
  input queue. This is automatically cleared by io.ClearInputKeys(). (#4921)
 | 
			
		||||
- ImDrawData: CmdLists[] array is now owned, changed from 'ImDrawList**' to
 | 
			
		||||
  'ImVector<ImDrawList*>'. Majority of users shouldn't be affected, but you
 | 
			
		||||
  cannot compare to NULL nor reassign manually anymore.
 | 
			
		||||
@@ -688,10 +1077,10 @@ Other changes:
 | 
			
		||||
  will slightly reduce scrollbar size. Generally we tried to make it that window
 | 
			
		||||
  border size has no incidence on layout but this can't work with thick borders. (#2522)
 | 
			
		||||
- IO: Added io.ClearEventsQueue() to clear incoming inputs events. (#4921)
 | 
			
		||||
  May be useful in conjunction with io.ClearInputsKeys() if you need to clear
 | 
			
		||||
  May be useful in conjunction with io.ClearInputKeys() if you need to clear
 | 
			
		||||
  both current inputs state and queued events (e.g. when using blocking native
 | 
			
		||||
  dialogs such as Windows's ::MessageBox() or ::GetOpenFileName()).
 | 
			
		||||
- IO: Changed io.ClearInputsKeys() specs to also clear current frame character buffer
 | 
			
		||||
- IO: Changed io.ClearInputKeys() specs to also clear current frame character buffer
 | 
			
		||||
  (what now obsoleted io.ClearInputCharacters() did), as this is effectively the
 | 
			
		||||
  desirable behavior.
 | 
			
		||||
- Misc: Added IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION config macro to disable
 | 
			
		||||
@@ -820,7 +1209,7 @@ Breaking changes:
 | 
			
		||||
   - ListBoxFooter()  -> use EndListBox()
 | 
			
		||||
   - Note how two variants of ListBoxHeader() existed. Check commented versions in imgui.h for refeence.
 | 
			
		||||
- Backends: SDL_Renderer: Renamed 'imgui_impl_sdlrenderer.h/cpp' to 'imgui_impl_sdlrenderer2.h/cpp',
 | 
			
		||||
  in order to accomodate for upcoming SDL3 and change in its SDL_Renderer API. (#6286)
 | 
			
		||||
  in order to accommodate for upcoming SDL3 and change in its SDL_Renderer API. (#6286)
 | 
			
		||||
- Backends: GLUT: Removed call to ImGui::NewFrame() from ImGui_ImplGLUT_NewFrame().
 | 
			
		||||
  It needs to be called from the main app loop, like with every other backends. (#6337) [@GereonV]
 | 
			
		||||
 | 
			
		||||
@@ -1383,7 +1772,7 @@ Other Changes:
 | 
			
		||||
- Backends: Metal: Use __bridge for ARC based systems. (#5403) [@stack]
 | 
			
		||||
- Backends: Metal: Add dispatch synchronization. (#5447) [@luigifcruz]
 | 
			
		||||
- Backends: Metal: Update deprecated property 'sampleCount'->'rasterSampleCount'. (#5603) [@dcvz]
 | 
			
		||||
- Backends: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738).
 | 
			
		||||
- Backends: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symmetry. (#914, #5738).
 | 
			
		||||
- Backends: WebGPU: fixed rendering when a depth buffer is enabled. (#5869) [@brainlag]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -2156,7 +2545,7 @@ Other Changes:
 | 
			
		||||
  alpha compositing and transparent windows. (#2766, #3447 etc.).
 | 
			
		||||
- Backends: OpenGL, Vulkan, DX9, DX10, DX11, DX12, Metal, WebGPU, Allegro: Rework blending equation to
 | 
			
		||||
  preserve alpha in output buffer (using SrcBlendAlpha = ONE, DstBlendAlpha = ONE_MINUS_SRC_ALPHA consistently
 | 
			
		||||
  accross all backends), facilitating compositing of the output buffer with another buffer.
 | 
			
		||||
  across all backends), facilitating compositing of the output buffer with another buffer.
 | 
			
		||||
  (#2693, #2764, #2766, #2873, #3447, #3813, #3816) [@ocornut, @thedmd, @ShawnM427, @Ubpa, @aiekick]
 | 
			
		||||
- Backends: DX9: Fix to support IMGUI_USE_BGRA_PACKED_COLOR. (#3844) [@Xiliusha]
 | 
			
		||||
- Backends: DX9: Fix to support colored glyphs, using newly introduced 'TexPixelsUseColors' info. (#3844)
 | 
			
		||||
@@ -5565,7 +5954,7 @@ Other Changes:
 | 
			
		||||
 VERSION 1.08 (2014-08-25)
 | 
			
		||||
-----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.09
 | 
			
		||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.08
 | 
			
		||||
 | 
			
		||||
- Fixed ImGuiTextFilter trimming of leading/trailing blanks.
 | 
			
		||||
- Fixed file descriptor leak on LoadSettings() failure.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								external/imgui/imgui/docs/EXAMPLES.md
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -35,46 +35,13 @@ At shutdown:
 | 
			
		||||
  call ImGui::DestroyContext()
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Example (using [backends/imgui_impl_win32.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_win32.cpp) + [backends/imgui_impl_dx11.cpp](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_dx11.cpp)):
 | 
			
		||||
Main resource:
 | 
			
		||||
- Read **[Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) wiki guide** for detailed examples of how to integrate Dear ImGui in an existing application.
 | 
			
		||||
 | 
			
		||||
```cpp
 | 
			
		||||
// Create a Dear ImGui context, setup some options
 | 
			
		||||
ImGui::CreateContext();
 | 
			
		||||
ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable some options
 | 
			
		||||
 | 
			
		||||
// Initialize Platform + Renderer backends (here: using imgui_impl_win32.cpp + imgui_impl_dx11.cpp)
 | 
			
		||||
ImGui_ImplWin32_Init(my_hwnd);
 | 
			
		||||
ImGui_ImplDX11_Init(my_d3d_device, my_d3d_device_context);
 | 
			
		||||
 | 
			
		||||
// Application main loop
 | 
			
		||||
while (true)
 | 
			
		||||
{
 | 
			
		||||
    // Beginning of frame: update Renderer + Platform backend, start Dear ImGui frame
 | 
			
		||||
    ImGui_ImplDX11_NewFrame();
 | 
			
		||||
    ImGui_ImplWin32_NewFrame();
 | 
			
		||||
    ImGui::NewFrame();
 | 
			
		||||
 | 
			
		||||
    // Any application code here
 | 
			
		||||
    ImGui::Text("Hello, world!");
 | 
			
		||||
 | 
			
		||||
    // End of frame: render Dear ImGui
 | 
			
		||||
    ImGui::Render();
 | 
			
		||||
    ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
 | 
			
		||||
 | 
			
		||||
    // Swap
 | 
			
		||||
    g_pSwapChain->Present(1, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Shutdown
 | 
			
		||||
ImGui_ImplDX11_Shutdown();
 | 
			
		||||
ImGui_ImplWin32_Shutdown();
 | 
			
		||||
ImGui::DestroyContext();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Please read 'PROGRAMMER GUIDE' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
 | 
			
		||||
Please read the comments and instruction at the top of each file.
 | 
			
		||||
Please read FAQ at https://www.dearimgui.com/faq
 | 
			
		||||
Additional resources:
 | 
			
		||||
- Read FAQ at https://www.dearimgui.com/faq
 | 
			
		||||
- Read 'PROGRAMMER GUIDE' section in imgui.cpp.
 | 
			
		||||
- Read the comments and instruction at the top of each file.
 | 
			
		||||
 | 
			
		||||
If you are using any of the backends provided here, you can add the backends/imgui_impl_xxxx(.cpp,.h)
 | 
			
		||||
files to your project and use as-in. Each imgui_impl_xxxx.cpp file comes with its own individual
 | 
			
		||||
@@ -126,7 +93,7 @@ state, and might confuse your GPU driver. One star, not recommended.
 | 
			
		||||
GLFW (Win32, Mac, Linux) + OpenGL3+/ES2/ES3 example (modern, programmable pipeline). <BR>
 | 
			
		||||
= main.cpp + imgui_impl_glfw.cpp + imgui_impl_opengl3.cpp <BR>
 | 
			
		||||
This uses more modern GL calls and custom shaders.<BR>
 | 
			
		||||
This support building with Emscripten and targetting WebGL.<BR>
 | 
			
		||||
This support building with Emscripten and targeting WebGL.<BR>
 | 
			
		||||
Prefer using that if you are using modern GL or WebGL in your application.
 | 
			
		||||
 | 
			
		||||
[example_glfw_vulkan/](https://github.com/ocornut/imgui/blob/master/examples/example_glfw_vulkan/) <BR>
 | 
			
		||||
@@ -168,7 +135,7 @@ state, and might confuse your GPU driver. One star, not recommended.
 | 
			
		||||
SDL2 (Win32, Mac, Linux, etc.) + OpenGL3+/ES2/ES3 example. <BR>
 | 
			
		||||
= main.cpp + imgui_impl_sdl2.cpp + imgui_impl_opengl3.cpp <BR>
 | 
			
		||||
This uses more modern GL calls and custom shaders. <BR>
 | 
			
		||||
This support building with Emscripten and targetting WebGL.<BR>
 | 
			
		||||
This support building with Emscripten and targeting WebGL.<BR>
 | 
			
		||||
Prefer using that if you are using modern GL or WebGL in your application.
 | 
			
		||||
 | 
			
		||||
[example_sdl2_sdlrenderer2/](https://github.com/ocornut/imgui/blob/master/examples/example_sdl2_sdlrenderer2/) <BR>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								external/imgui/imgui/docs/FAQ.md
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -23,7 +23,7 @@ or view this file with any Markdown viewer.
 | 
			
		||||
| [I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around...](#q-i-integrated-dear-imgui-in-my-engine-and-some-elements-are-clipping-or-disappearing-when-i-move-windows-around) |
 | 
			
		||||
| [I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries...](#q-i-integrated-dear-imgui-in-my-engine-and-some-elements-are-displaying-outside-their-expected-windows-boundaries) |
 | 
			
		||||
| **Q&A: Usage** |
 | 
			
		||||
| **[About the ID Stack system..<br>Why is my widget not reacting when I click on it?<br>How can I have widgets with an empty label?<br>How can I have multiple widgets with the same label?<br>How can I have multiple windows with the same label?](#q-about-the-id-stack-system)** |
 | 
			
		||||
| **[About the ID Stack system..<br>Why is my widget not reacting when I click on it?<br>Why is the wrong widget reacting when I click on one?<br>How can I have widgets with an empty label?<br>How can I have multiple widgets with the same label?<br>How can I have multiple windows with the same label?](#q-about-the-id-stack-system)** |
 | 
			
		||||
| [How can I display an image? What is ImTextureID, how does it work?](#q-how-can-i-display-an-image-what-is-imtextureid-how-does-it-work)|
 | 
			
		||||
| [How can I use maths operators with ImVec2?](#q-how-can-i-use-maths-operators-with-imvec2) |
 | 
			
		||||
| [How can I use my own maths types instead of ImVec2/ImVec4?](#q-how-can-i-use-my-own-maths-types-instead-of-imvec2imvec4) |
 | 
			
		||||
@@ -199,10 +199,42 @@ ctx->RSSetScissorRects(1, &r);
 | 
			
		||||
 | 
			
		||||
### Q: About the ID Stack system...
 | 
			
		||||
### Q: Why is my widget not reacting when I click on it?
 | 
			
		||||
### Q: Why is the wrong widget reacting when I click on one?
 | 
			
		||||
### Q: How can I have widgets with an empty label?
 | 
			
		||||
### Q: How can I have multiple widgets with the same label?
 | 
			
		||||
### Q: How can I have multiple windows with the same label?
 | 
			
		||||
 | 
			
		||||
**USING THE SAME LABEL+ID IS THE MOST COMMON USER MISTAKE:**
 | 
			
		||||
<table>
 | 
			
		||||
<tr>
 | 
			
		||||
<td><img src="https://github.com/ocornut/imgui/assets/8225057/76eb9467-74d1-4e95-9f56-be81c6dd029d"></td>
 | 
			
		||||
<td>
 | 
			
		||||
<pre lang="cpp">
 | 
			
		||||
ImGui::Begin("Incorrect!");
 | 
			
		||||
ImGui::DragFloat2("My value", &objects[0]->pos.x);
 | 
			
		||||
ImGui::DragFloat2("My value", &objects[1]->pos.x);
 | 
			
		||||
ImGui::DragFloat2("My value", &objects[2]->pos.x);
 | 
			
		||||
ImGui::End();
 | 
			
		||||
 
 | 
			
		||||
ImGui::Begin("Correct!");
 | 
			
		||||
ImGui::DragFloat2("My value", &objects[0]->pos.x);
 | 
			
		||||
ImGui::DragFloat2("My value##2", &objects[1]->pos.x);
 | 
			
		||||
ImGui::DragFloat2("My value##3", &objects[2]->pos.x);
 | 
			
		||||
ImGui::End();
 | 
			
		||||
 
 | 
			
		||||
ImGui::Begin("Also Correct!");
 | 
			
		||||
for (int n = 0; n < 3; n++)
 | 
			
		||||
{
 | 
			
		||||
    ImGui::PushID(n);
 | 
			
		||||
    ImGui::DragFloat2("My value", &objects[n]->pos.x);
 | 
			
		||||
    ImGui::PopID();
 | 
			
		||||
}
 | 
			
		||||
ImGui::End();
 | 
			
		||||
</pre>
 | 
			
		||||
</td>
 | 
			
		||||
</tr>    
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
A primer on labels and the ID Stack...
 | 
			
		||||
 | 
			
		||||
Dear ImGui internally needs to uniquely identify UI elements.
 | 
			
		||||
@@ -607,7 +639,7 @@ The applications in examples/ are doing that.
 | 
			
		||||
Windows: you can use the WM_CHAR or WM_UNICHAR or WM_IME_CHAR message (depending if your app is built using Unicode or MultiByte mode).
 | 
			
		||||
You may also use `MultiByteToWideChar()` or `ToUnicode()` to retrieve Unicode codepoints from MultiByte characters or keyboard state.
 | 
			
		||||
Windows: if your language is relying on an Input Method Editor (IME), you can write your HWND to ImGui::GetMainViewport()->PlatformHandleRaw
 | 
			
		||||
for the default implementation of io.SetPlatformImeDataFn() to set your Microsoft IME position correctly.
 | 
			
		||||
for the default implementation of io.PlatformSetImeDataFn() to set your Microsoft IME position correctly.
 | 
			
		||||
 | 
			
		||||
##### [Return to Index](#index)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								external/imgui/imgui/docs/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -13,7 +13,7 @@ Businesses: support continued development and maintenance via invoiced sponsorin
 | 
			
		||||
<br>  _E-mail: contact @ dearimgui dot com_
 | 
			
		||||
<br>Individuals: support continued development and maintenance [here](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=WGHNC6MBFLZ2S). Also see [Funding](https://github.com/ocornut/imgui/wiki/Funding) page.
 | 
			
		||||
 | 
			
		||||
| [The Pitch](#the-pitch) - [Usage](#usage) - [How it works](#how-it-works) - [Releases & Changelogs](#releases--changelogs) - [Demo](#demo) - [Integration](#integration) |
 | 
			
		||||
| [The Pitch](#the-pitch) - [Usage](#usage) - [How it works](#how-it-works) - [Releases & Changelogs](#releases--changelogs) - [Demo](#demo) - [Getting Started & Integration](#getting-started--integration) |
 | 
			
		||||
:----------------------------------------------------------: |
 | 
			
		||||
| [Gallery](#gallery) - [Support, FAQ](#support-frequently-asked-questions-faq) -  [How to help](#how-to-help) - **[Funding & Sponsors](https://github.com/ocornut/imgui/wiki/Funding)** - [Credits](#credits) - [License](#license) |
 | 
			
		||||
| [Wiki](https://github.com/ocornut/imgui/wiki) - [Extensions](https://github.com/ocornut/imgui/wiki/Useful-Extensions) - [Languages bindings & frameworks backends](https://github.com/ocornut/imgui/wiki/Bindings) - [Software using Dear ImGui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) - [User quotes](https://github.com/ocornut/imgui/wiki/Quotes) |
 | 
			
		||||
@@ -43,7 +43,7 @@ Dear ImGui is particularly suited to integration in game engines (for tooling),
 | 
			
		||||
 | 
			
		||||
**Backends for a variety of graphics API and rendering platforms** are provided in the [backends/](https://github.com/ocornut/imgui/tree/master/backends) folder, along with example applications in the [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder. You may also create your own backend. Anywhere where you can render textured triangles, you can render Dear ImGui.
 | 
			
		||||
 | 
			
		||||
See the [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) guide and [Integration](#integration) section of this document for more details.
 | 
			
		||||
See the [Getting Started & Integration](#getting-started--integration) section of this document for more details.
 | 
			
		||||
 | 
			
		||||
After Dear ImGui is set up in your application, you can use it from \_anywhere\_ in your program loop:
 | 
			
		||||
```cpp
 | 
			
		||||
@@ -114,7 +114,7 @@ You should be able to build the examples from sources. If you don't, let us know
 | 
			
		||||
 | 
			
		||||
The demo applications are not DPI aware so expect some blurriness on a 4K screen. For DPI awareness in your application, you can load/reload your font at a different scale and scale your style with `style.ScaleAllSizes()` (see [FAQ](https://www.dearimgui.com/faq)).
 | 
			
		||||
 | 
			
		||||
### Integration
 | 
			
		||||
### Getting Started & Integration
 | 
			
		||||
 | 
			
		||||
See the [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) guide for details.
 | 
			
		||||
 | 
			
		||||
@@ -162,7 +162,7 @@ See: [Upcoming Changes](https://github.com/ocornut/imgui/wiki/Upcoming-Changes).
 | 
			
		||||
 | 
			
		||||
See: [Dear ImGui Test Engine + Test Suite](https://github.com/ocornut/imgui_test_engine) for Automation & Testing.
 | 
			
		||||
 | 
			
		||||
For the purposes of getting search engines to crawl the wiki, here's a link to the [Crawable Wiki](https://github-wiki-see.page/m/ocornut/imgui/wiki) (not for humans, [here's why](https://github-wiki-see.page/)).
 | 
			
		||||
For the purposes of getting search engines to crawl the wiki, here's a link to the [Crawlable Wiki](https://github-wiki-see.page/m/ocornut/imgui/wiki) (not for humans, [here's why](https://github-wiki-see.page/)).
 | 
			
		||||
 | 
			
		||||
Getting started? For first-time users having issues compiling/linking/running or issues loading fonts, please use [GitHub Discussions](https://github.com/ocornut/imgui/discussions). For ANY other questions, bug reports, requests, feedback, please post on [GitHub Issues](https://github.com/ocornut/imgui/issues). Please read and fill the New Issue template carefully.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								external/imgui/imgui/docs/TODO.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -39,7 +39,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - scrolling: forward mouse wheel scrolling to parent window when at the edge of scrolling limits? (useful for listbox,tables?)
 | 
			
		||||
 - scrolling/style: shadows on scrollable areas to denote that there is more contents (see e.g. DaVinci Resolve ui)
 | 
			
		||||
 | 
			
		||||
 - drawdata: make it easy to deep-copy (or swap?) a full ImDrawData so user can easily save that data if they use threaded rendering. (e.g. #2646)
 | 
			
		||||
 - drawdata: make it easy to deep-copy (or swap?) a full ImDrawData so user can easily save that data if they use threaded rendering. (#1860 see ImDrawDataSnapshot)
 | 
			
		||||
 ! drawlist: add CalcTextSize() func to facilitate consistent code from user pov (currently need to use ImGui or ImFont alternatives!)
 | 
			
		||||
 - drawlist: maintaining bounding box per command would allow to merge draw command when clipping isn't relied on (typical non-scrolling window or non-overflowing column would merge with previous command). (WIP branch)
 | 
			
		||||
 - drawlist: make it easier to toggle AA per primitive, so we can use e.g. non-AA fill + AA borders more naturally
 | 
			
		||||
@@ -117,7 +117,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
!- color: the color conversion helpers/types are a mess and needs sorting out.
 | 
			
		||||
 - color: (api breaking) ImGui::ColorConvertXXX functions should be loose ImColorConvertXX to match imgui_internals.h
 | 
			
		||||
 | 
			
		||||
 - plot: full featured plot/graph api w/ scrolling, zooming etc. --> ImPlot
 | 
			
		||||
 - plot: full featured plot/graph api w/ scrolling, zooming etc. --> promote using ImPlot
 | 
			
		||||
 - (plot: deleted all other todo lines on 2023-06-28)
 | 
			
		||||
 | 
			
		||||
 - clipper: ability to disable the clipping through a simple flag/bool.
 | 
			
		||||
@@ -150,7 +150,6 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - drag float: power != 0.0f with current value being outside the range keeps the value stuck.
 | 
			
		||||
 - drag float: added leeway on edge (e.g. a few invisible steps past the clamp limits)
 | 
			
		||||
 | 
			
		||||
 - combo: use clipper.
 | 
			
		||||
 - combo: a way/helper to customize the combo preview (#1658) -> experimental BeginComboPreview()
 | 
			
		||||
 - combo/listbox: keyboard control. need InputText-like non-active focus + key handling. considering keyboard for custom listbox (pr #203)
 | 
			
		||||
 - listbox: multiple selection (WIP range-select branch)
 | 
			
		||||
@@ -173,13 +172,14 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - tooltip: drag and drop with tooltip near monitor edges lose/changes its last direction instead of locking one. The drag and drop tooltip should always follow without changing direction.
 | 
			
		||||
 - tooltip: allow to set the width of a tooltip to allow TextWrapped() etc. while keeping the height automatic.
 | 
			
		||||
 - tooltip: drag tooltip hovering over source widget with IsItemHovered/SetTooltip flickers (WIP branch)
 | 
			
		||||
 - tooltip: tooltip priorities to override a stock tooltip (e.g. shortcut tooltip)
 | 
			
		||||
 | 
			
		||||
 - status-bar: add a per-window status bar helper similar to what menu-bar does. generalize concept of layer0 rect in window (can make _MenuBar window flag obsolete too).
 | 
			
		||||
 - shortcuts: store multiple keychords in ImGuiKeyChord
 | 
			
		||||
 - shortcuts: Hovered route (lower than Focused, higher than Global)
 | 
			
		||||
 - shortcuts: local-style shortcut api, e.g. parse "&Save"
 | 
			
		||||
 - shortcuts,menus: global-style shortcut api e.g. "Save (CTRL+S)" -> explicit flag for recursing into closed menu
 | 
			
		||||
 - shortcuts: programmatically access shortcuts "Focus("&Save"))
 | 
			
		||||
 - menus: menu-bar: main menu-bar could affect clamping of windows position (~ akin to modifying DisplayMin)
 | 
			
		||||
 - menus: hovering from menu to menu on a menu-bar has 1 frame without any menu, which is a little annoying. ideally either 0 either longer.
 | 
			
		||||
 - menus: hovering from menu to menu on a menu-bar has 1 frame without any menu, which is a little annoying. ideally zero.
 | 
			
		||||
 - menus: would be nice if the Selectable() supported horizontal alignment (must be given the equivalent of WorkRect.Max.x matching the position of the shortcut column)
 | 
			
		||||
 | 
			
		||||
 - tree node: add treenode/treepush int variants? not there because (void*) cast from int warns on some platforms/settings?
 | 
			
		||||
@@ -275,7 +275,6 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - font/opt: Considering storing standalone AdvanceX table as 16-bit fixed point integer?
 | 
			
		||||
 - font/opt: Glyph currently 40 bytes (2+9*4). Consider storing UV as 16-bits integer? (->32 bytes). X0/Y0/X1/Y1 as 16 fixed-point integers? Or X0/Y0 as float and X1/Y1 as fixed8_8?
 | 
			
		||||
 | 
			
		||||
 - nav: visual feedback on button press.
 | 
			
		||||
 - nav: some features such as PageUp/Down/Home/End should probably work without ImGuiConfigFlags_NavEnableKeyboard? (where do we draw the line? how about CTRL+Tab)
 | 
			
		||||
 ! nav: never clear NavId on some setup (e.g. gamepad centric)
 | 
			
		||||
 - nav: there's currently no way to completely clear focus with the keyboard. depending on patterns used by the application to dispatch inputs, it may be desirable.
 | 
			
		||||
@@ -315,8 +314,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - misc: make the ImGuiCond values linear (non-power-of-two). internal storage for ImGuiWindow can use integers to combine into flags (Why?)
 | 
			
		||||
 - misc: PushItemFlag(): add a flag to disable keyboard capture when used with mouse? (#1682)
 | 
			
		||||
 - misc: use more size_t in public api?
 | 
			
		||||
 - misc: possible compile-time support for string view/range instead of char* would e.g. facilitate usage with Rust (#683, #3038, WIP string_view branch)
 | 
			
		||||
 - misc: possible compile-time support for wchar_t instead of char*?
 | 
			
		||||
 - misc: support for string view/range instead of char* would e.g. facilitate usage with Rust (#683, #3038, WIP string_view branch)
 | 
			
		||||
 | 
			
		||||
 - demo: demonstrate using PushStyleVar() in more details.
 | 
			
		||||
 - demo: add vertical separator demo
 | 
			
		||||
@@ -336,7 +334,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - backends: bgfx: https://gist.github.com/RichardGale/6e2b74bc42b3005e08397236e4be0fd0
 | 
			
		||||
 - backends: emscriptem: with refactored examples, we could provide a direct imgui_impl_emscripten platform layer (see eg. https://github.com/floooh/sokol-samples/blob/master/html5/imgui-emsc.cc#L42)
 | 
			
		||||
 | 
			
		||||
 - bindings: ways to use clang ast dump to generate bindings or helpers for bindings? (e.g. clang++ -Xclang -ast-dump=json imgui.h) (WIP project "dear-bindings" still private)
 | 
			
		||||
 - bindings: ways to use clang ast dump to generate bindings or helpers for bindings? (e.g. clang++ -Xclang -ast-dump=json imgui.h) (--> use https://github.com/dearimgui/dear_bindings)
 | 
			
		||||
 | 
			
		||||
 - optimization: replace vsnprintf with stb_printf? using IMGUI_USE_STB_SPRINTF. (#1038 + needed for string_view)
 | 
			
		||||
 - optimization: add clipping for multi-component widgets (SliderFloatX, ColorEditX, etc.). one problem is that nav branch can't easily clip parent group when there is a move request.
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
            android:name="imgui.example.android.MainActivity"
 | 
			
		||||
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
 | 
			
		||||
            android:configChanges="orientation|keyboardHidden|screenSize"
 | 
			
		||||
            android:exported="false">
 | 
			
		||||
            android:exported="true">
 | 
			
		||||
            <meta-data android:name="android.app.lib_name"
 | 
			
		||||
                android:value="ImGuiExample" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -161,7 +161,7 @@ void Init(struct android_app* app)
 | 
			
		||||
 | 
			
		||||
    // We load the default font with increased size to improve readability on many devices with "high" DPI.
 | 
			
		||||
    // FIXME: Put some effort into DPI awareness.
 | 
			
		||||
    // Important: when calling AddFontFromMemoryTTF(), ownership of font_data is transfered by Dear ImGui by default (deleted is handled by Dear ImGui), unless we set FontDataOwnedByAtlas=false in ImFontConfig
 | 
			
		||||
    // Important: when calling AddFontFromMemoryTTF(), ownership of font_data is transferred by Dear ImGui by default (deleted is handled by Dear ImGui), unless we set FontDataOwnedByAtlas=false in ImFontConfig
 | 
			
		||||
    ImFontConfig font_cfg;
 | 
			
		||||
    font_cfg.SizePixels = 22.0f;
 | 
			
		||||
    io.Fonts->AddFontDefault(&font_cfg);
 | 
			
		||||
 
 | 
			
		||||
@@ -85,7 +85,7 @@ int main(int, char**)
 | 
			
		||||
    // Setup Platform/Renderer backends
 | 
			
		||||
    ImGui_ImplGlfw_InitForOpenGL(window, true);
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
    ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas");
 | 
			
		||||
    ImGui_ImplGlfw_InstallEmscriptenCallbacks(window, "#canvas");
 | 
			
		||||
#endif
 | 
			
		||||
    ImGui_ImplOpenGL3_Init(glsl_version);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
// Volk headers
 | 
			
		||||
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
 | 
			
		||||
#define VOLK_IMPLEMENTATION
 | 
			
		||||
#include <Volk/volk.h>
 | 
			
		||||
#include <volk.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers.
 | 
			
		||||
@@ -485,17 +485,14 @@ int main(int, char**)
 | 
			
		||||
        glfwPollEvents();
 | 
			
		||||
 | 
			
		||||
        // Resize swap chain?
 | 
			
		||||
        if (g_SwapChainRebuild)
 | 
			
		||||
        int fb_width, fb_height;
 | 
			
		||||
        glfwGetFramebufferSize(window, &fb_width, &fb_height);
 | 
			
		||||
        if (fb_width > 0 && fb_height > 0 && (g_SwapChainRebuild || g_MainWindowData.Width != fb_width || g_MainWindowData.Height != fb_height))
 | 
			
		||||
        {
 | 
			
		||||
            int width, height;
 | 
			
		||||
            glfwGetFramebufferSize(window, &width, &height);
 | 
			
		||||
            if (width > 0 && height > 0)
 | 
			
		||||
            {
 | 
			
		||||
                ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount);
 | 
			
		||||
                ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount);
 | 
			
		||||
                g_MainWindowData.FrameIndex = 0;
 | 
			
		||||
                g_SwapChainRebuild = false;
 | 
			
		||||
            }
 | 
			
		||||
            ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount);
 | 
			
		||||
            ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, fb_width, fb_height, g_MinImageCount);
 | 
			
		||||
            g_MainWindowData.FrameIndex = 0;
 | 
			
		||||
            g_SwapChainRebuild = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Start the Dear ImGui frame
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,12 @@ set(IMGUI_DIR ../../)
 | 
			
		||||
 | 
			
		||||
# Libraries
 | 
			
		||||
if(EMSCRIPTEN)
 | 
			
		||||
  if(EMSCRIPTEN_VERSION VERSION_GREATER_EQUAL "3.1.57")
 | 
			
		||||
    set(IMGUI_EMSCRIPTEN_GLFW3 "--use-port=contrib.glfw3" CACHE STRING "Choose between --use-port=contrib.glfw3 and -sUSE_GLFW=3 for GLFW implementation (default to --use-port=contrib.glfw3)")
 | 
			
		||||
  else()
 | 
			
		||||
    # cannot use contrib.glfw3 prior to 3.1.57
 | 
			
		||||
    set(IMGUI_EMSCRIPTEN_GLFW3 "-sUSE_GLFW=3" CACHE STRING "Use -sUSE_GLFW=3 for GLFW implementation" FORCE)
 | 
			
		||||
  endif()
 | 
			
		||||
  set(LIBRARIES glfw)
 | 
			
		||||
  add_compile_options(-sDISABLE_EXCEPTION_CATCHING=1 -DIMGUI_DISABLE_FILE_FUNCTIONS=1)
 | 
			
		||||
else()
 | 
			
		||||
@@ -82,9 +88,16 @@ target_link_libraries(example_glfw_wgpu PUBLIC ${LIBRARIES})
 | 
			
		||||
 | 
			
		||||
# Emscripten settings
 | 
			
		||||
if(EMSCRIPTEN)
 | 
			
		||||
  if("${IMGUI_EMSCRIPTEN_GLFW3}" STREQUAL "--use-port=contrib.glfw3")
 | 
			
		||||
    target_compile_options(example_glfw_wgpu PUBLIC
 | 
			
		||||
        "${IMGUI_EMSCRIPTEN_GLFW3}"
 | 
			
		||||
        "-DEMSCRIPTEN_USE_PORT_CONTRIB_GLFW3" # unnecessary beyond emscripten 3.1.59
 | 
			
		||||
    )
 | 
			
		||||
  endif()
 | 
			
		||||
  message(STATUS "Using ${IMGUI_EMSCRIPTEN_GLFW3} GLFW implementation")
 | 
			
		||||
  target_link_options(example_glfw_wgpu PRIVATE
 | 
			
		||||
    "-sUSE_WEBGPU=1"
 | 
			
		||||
    "-sUSE_GLFW=3"
 | 
			
		||||
    "${IMGUI_EMSCRIPTEN_GLFW3}"
 | 
			
		||||
    "-sWASM=1"
 | 
			
		||||
    "-sALLOW_MEMORY_GROWTH=1"
 | 
			
		||||
    "-sNO_EXIT_RUNTIME=0"
 | 
			
		||||
 
 | 
			
		||||
@@ -101,7 +101,7 @@ int main(int, char**)
 | 
			
		||||
    // Setup Platform/Renderer backends
 | 
			
		||||
    ImGui_ImplGlfw_InitForOther(window, true);
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
    ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas");
 | 
			
		||||
    ImGui_ImplGlfw_InstallEmscriptenCallbacks(window, "#canvas");
 | 
			
		||||
#endif
 | 
			
		||||
    ImGui_ImplWGPU_InitInfo init_info;
 | 
			
		||||
    init_info.Device = wgpu_device;
 | 
			
		||||
 
 | 
			
		||||
@@ -155,7 +155,7 @@ int main(int, char**)
 | 
			
		||||
        SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
 | 
			
		||||
        SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255));
 | 
			
		||||
        SDL_RenderClear(renderer);
 | 
			
		||||
        ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData());
 | 
			
		||||
        ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(), renderer);
 | 
			
		||||
        SDL_RenderPresent(renderer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
// Volk headers
 | 
			
		||||
#ifdef IMGUI_IMPL_VULKAN_USE_VOLK
 | 
			
		||||
#define VOLK_IMPLEMENTATION
 | 
			
		||||
#include <Volk/volk.h>
 | 
			
		||||
#include <volk.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//#define APP_USE_UNLIMITED_FRAME_RATE
 | 
			
		||||
@@ -494,17 +494,14 @@ int main(int, char**)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Resize swap chain?
 | 
			
		||||
        if (g_SwapChainRebuild)
 | 
			
		||||
        int fb_width, fb_height;
 | 
			
		||||
        SDL_GetWindowSize(window, &fb_width, &fb_height);
 | 
			
		||||
        if (fb_width > 0 && fb_height > 0 && (g_SwapChainRebuild || g_MainWindowData.Width != fb_width || g_MainWindowData.Height != fb_height))
 | 
			
		||||
        {
 | 
			
		||||
            int width, height;
 | 
			
		||||
            SDL_GetWindowSize(window, &width, &height);
 | 
			
		||||
            if (width > 0 && height > 0)
 | 
			
		||||
            {
 | 
			
		||||
                ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount);
 | 
			
		||||
                ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount);
 | 
			
		||||
                g_MainWindowData.FrameIndex = 0;
 | 
			
		||||
                g_SwapChainRebuild = false;
 | 
			
		||||
            }
 | 
			
		||||
            ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount);
 | 
			
		||||
            ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, fb_width, fb_height, g_MinImageCount);
 | 
			
		||||
            g_MainWindowData.FrameIndex = 0;
 | 
			
		||||
            g_SwapChainRebuild = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Start the Dear ImGui frame
 | 
			
		||||
 
 | 
			
		||||
@@ -37,9 +37,9 @@ LIBS =
 | 
			
		||||
 | 
			
		||||
ifeq ($(UNAME_S), Linux) #LINUX
 | 
			
		||||
	ECHO_MESSAGE = "Linux"
 | 
			
		||||
	LIBS += $(LINUX_GL_LIBS) -ldl `sdl3-config --libs`
 | 
			
		||||
	LIBS += $(LINUX_GL_LIBS) -ldl `pkg-config sdl3 --libs`
 | 
			
		||||
 | 
			
		||||
	CXXFLAGS += `sdl3-config --cflags`
 | 
			
		||||
	CXXFLAGS += `pkg-config sdl3 --cflags`
 | 
			
		||||
	CFLAGS = $(CXXFLAGS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
@@ -48,7 +48,7 @@ ifeq ($(UNAME_S), Darwin) #APPLE
 | 
			
		||||
	LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl3-config --libs`
 | 
			
		||||
	LIBS += -L/usr/local/lib -L/opt/local/lib
 | 
			
		||||
 | 
			
		||||
	CXXFLAGS += `sdl3-config --cflags`
 | 
			
		||||
	CXXFLAGS += `pkg-config sdl3 --cflags`
 | 
			
		||||
	CXXFLAGS += -I/usr/local/include -I/opt/local/include
 | 
			
		||||
	CFLAGS = $(CXXFLAGS)
 | 
			
		||||
endif
 | 
			
		||||
 
 | 
			
		||||
@@ -57,9 +57,6 @@ int main(int, char**)
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Enable native IME.
 | 
			
		||||
    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
 | 
			
		||||
 | 
			
		||||
    // Create window with graphics context
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
 | 
			
		||||
@@ -199,7 +196,7 @@ int main(int, char**)
 | 
			
		||||
    ImGui_ImplSDL3_Shutdown();
 | 
			
		||||
    ImGui::DestroyContext();
 | 
			
		||||
 | 
			
		||||
    SDL_GL_DeleteContext(gl_context);
 | 
			
		||||
    SDL_GL_DestroyContext(gl_context);
 | 
			
		||||
    SDL_DestroyWindow(window);
 | 
			
		||||
    SDL_Quit();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,9 +26,9 @@ LIBS =
 | 
			
		||||
 | 
			
		||||
ifeq ($(UNAME_S), Linux) #LINUX
 | 
			
		||||
	ECHO_MESSAGE = "Linux"
 | 
			
		||||
	LIBS += -ldl `sdl3-config --libs`
 | 
			
		||||
	LIBS += -ldl `pkg-config sdl3  --libs`
 | 
			
		||||
 | 
			
		||||
	CXXFLAGS += `sdl3-config --cflags`
 | 
			
		||||
	CXXFLAGS += `pkg-config sdl3 --cflags`
 | 
			
		||||
	CFLAGS = $(CXXFLAGS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
@@ -37,7 +37,7 @@ ifeq ($(UNAME_S), Darwin) #APPLE
 | 
			
		||||
	LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl3-config --libs`
 | 
			
		||||
	LIBS += -L/usr/local/lib -L/opt/local/lib
 | 
			
		||||
 | 
			
		||||
	CXXFLAGS += `sdl3-config --cflags`
 | 
			
		||||
	CXXFLAGS += `pkg-config sdl3 --cflags`
 | 
			
		||||
	CXXFLAGS += -I/usr/local/include -I/opt/local/include
 | 
			
		||||
	CFLAGS = $(CXXFLAGS)
 | 
			
		||||
endif
 | 
			
		||||
 
 | 
			
		||||
@@ -31,9 +31,6 @@ int main(int, char**)
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Enable native IME.
 | 
			
		||||
    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
 | 
			
		||||
 | 
			
		||||
    // Create window with SDL_Renderer graphics context
 | 
			
		||||
    Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN;
 | 
			
		||||
    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL3+SDL_Renderer example", 1280, 720, window_flags);
 | 
			
		||||
@@ -42,7 +39,8 @@ int main(int, char**)
 | 
			
		||||
        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError());
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr, SDL_RENDERER_PRESENTVSYNC);
 | 
			
		||||
    SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr);
 | 
			
		||||
    SDL_SetRenderVSync(renderer, 1);
 | 
			
		||||
    if (renderer == nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        SDL_Log("Error: SDL_CreateRenderer(): %s\n", SDL_GetError());
 | 
			
		||||
@@ -159,9 +157,9 @@ int main(int, char**)
 | 
			
		||||
        // Rendering
 | 
			
		||||
        ImGui::Render();
 | 
			
		||||
        //SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
 | 
			
		||||
        SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255));
 | 
			
		||||
        SDL_SetRenderDrawColorFloat(renderer, clear_color.x, clear_color.y, clear_color.z, clear_color.w);
 | 
			
		||||
        SDL_RenderClear(renderer);
 | 
			
		||||
        ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData());
 | 
			
		||||
        ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer);
 | 
			
		||||
        SDL_RenderPresent(renderer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
// Data
 | 
			
		||||
static ID3D10Device*            g_pd3dDevice = nullptr;
 | 
			
		||||
static IDXGISwapChain*          g_pSwapChain = nullptr;
 | 
			
		||||
static bool                     g_SwapChainOccluded = false;
 | 
			
		||||
static UINT                     g_ResizeWidth = 0, g_ResizeHeight = 0;
 | 
			
		||||
static ID3D10RenderTargetView*  g_mainRenderTargetView = nullptr;
 | 
			
		||||
 | 
			
		||||
@@ -100,6 +101,14 @@ int main(int, char**)
 | 
			
		||||
        if (done)
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        // Handle window being minimized or screen locked
 | 
			
		||||
        if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED)
 | 
			
		||||
        {
 | 
			
		||||
            ::Sleep(10);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        g_SwapChainOccluded = false;
 | 
			
		||||
 | 
			
		||||
        // Handle window resize (we don't resize directly in the WM_SIZE handler)
 | 
			
		||||
        if (g_ResizeWidth != 0 && g_ResizeHeight != 0)
 | 
			
		||||
        {
 | 
			
		||||
@@ -158,10 +167,13 @@ int main(int, char**)
 | 
			
		||||
        g_pd3dDevice->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha);
 | 
			
		||||
        ImGui_ImplDX10_RenderDrawData(ImGui::GetDrawData());
 | 
			
		||||
 | 
			
		||||
        g_pSwapChain->Present(1, 0); // Present with vsync
 | 
			
		||||
        //g_pSwapChain->Present(0, 0); // Present without vsync
 | 
			
		||||
        // Present
 | 
			
		||||
        HRESULT hr = g_pSwapChain->Present(1, 0);   // Present with vsync
 | 
			
		||||
        //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync
 | 
			
		||||
        g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Cleanup
 | 
			
		||||
    ImGui_ImplDX10_Shutdown();
 | 
			
		||||
    ImGui_ImplWin32_Shutdown();
 | 
			
		||||
    ImGui::DestroyContext();
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
static ID3D11Device*            g_pd3dDevice = nullptr;
 | 
			
		||||
static ID3D11DeviceContext*     g_pd3dDeviceContext = nullptr;
 | 
			
		||||
static IDXGISwapChain*          g_pSwapChain = nullptr;
 | 
			
		||||
static bool                     g_SwapChainOccluded = false;
 | 
			
		||||
static UINT                     g_ResizeWidth = 0, g_ResizeHeight = 0;
 | 
			
		||||
static ID3D11RenderTargetView*  g_mainRenderTargetView = nullptr;
 | 
			
		||||
 | 
			
		||||
@@ -100,6 +101,14 @@ int main(int, char**)
 | 
			
		||||
        if (done)
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        // Handle window being minimized or screen locked
 | 
			
		||||
        if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED)
 | 
			
		||||
        {
 | 
			
		||||
            ::Sleep(10);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        g_SwapChainOccluded = false;
 | 
			
		||||
 | 
			
		||||
        // Handle window resize (we don't resize directly in the WM_SIZE handler)
 | 
			
		||||
        if (g_ResizeWidth != 0 && g_ResizeHeight != 0)
 | 
			
		||||
        {
 | 
			
		||||
@@ -158,8 +167,10 @@ int main(int, char**)
 | 
			
		||||
        g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha);
 | 
			
		||||
        ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
 | 
			
		||||
 | 
			
		||||
        g_pSwapChain->Present(1, 0); // Present with vsync
 | 
			
		||||
        //g_pSwapChain->Present(0, 0); // Present without vsync
 | 
			
		||||
        // Present
 | 
			
		||||
        HRESULT hr = g_pSwapChain->Present(1, 0);   // Present with vsync
 | 
			
		||||
        //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync
 | 
			
		||||
        g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Cleanup
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,8 @@
 | 
			
		||||
#pragma comment(lib, "dxguid.lib")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "imgui_internal.h"
 | 
			
		||||
 | 
			
		||||
struct FrameContext
 | 
			
		||||
{
 | 
			
		||||
    ID3D12CommandAllocator* CommandAllocator;
 | 
			
		||||
@@ -47,6 +49,7 @@ static ID3D12Fence*                 g_fence = nullptr;
 | 
			
		||||
static HANDLE                       g_fenceEvent = nullptr;
 | 
			
		||||
static UINT64                       g_fenceLastSignaledValue = 0;
 | 
			
		||||
static IDXGISwapChain3*             g_pSwapChain = nullptr;
 | 
			
		||||
static bool                         g_SwapChainOccluded = false;
 | 
			
		||||
static HANDLE                       g_hSwapChainWaitableObject = nullptr;
 | 
			
		||||
static ID3D12Resource*              g_mainRenderTargetResource[NUM_BACK_BUFFERS] = {};
 | 
			
		||||
static D3D12_CPU_DESCRIPTOR_HANDLE  g_mainRenderTargetDescriptor[NUM_BACK_BUFFERS] = {};
 | 
			
		||||
@@ -137,6 +140,14 @@ int main(int, char**)
 | 
			
		||||
        if (done)
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        // Handle window screen locked
 | 
			
		||||
        if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED)
 | 
			
		||||
        {
 | 
			
		||||
            ::Sleep(10);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        g_SwapChainOccluded = false;
 | 
			
		||||
 | 
			
		||||
        // Start the Dear ImGui frame
 | 
			
		||||
        ImGui_ImplDX12_NewFrame();
 | 
			
		||||
        ImGui_ImplWin32_NewFrame();
 | 
			
		||||
@@ -209,8 +220,10 @@ int main(int, char**)
 | 
			
		||||
 | 
			
		||||
        g_pd3dCommandQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&g_pd3dCommandList);
 | 
			
		||||
 | 
			
		||||
        g_pSwapChain->Present(1, 0); // Present with vsync
 | 
			
		||||
        //g_pSwapChain->Present(0, 0); // Present without vsync
 | 
			
		||||
        // Present
 | 
			
		||||
        HRESULT hr = g_pSwapChain->Present(1, 0);   // Present with vsync
 | 
			
		||||
        //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync
 | 
			
		||||
        g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED);
 | 
			
		||||
 | 
			
		||||
        UINT64 fenceValue = g_fenceLastSignaledValue + 1;
 | 
			
		||||
        g_pd3dCommandQueue->Signal(g_fence, fenceValue);
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@
 | 
			
		||||
// Data
 | 
			
		||||
static LPDIRECT3D9              g_pD3D = nullptr;
 | 
			
		||||
static LPDIRECT3DDEVICE9        g_pd3dDevice = nullptr;
 | 
			
		||||
static bool                     g_DeviceLost = false;
 | 
			
		||||
static UINT                     g_ResizeWidth = 0, g_ResizeHeight = 0;
 | 
			
		||||
static D3DPRESENT_PARAMETERS    g_d3dpp = {};
 | 
			
		||||
 | 
			
		||||
@@ -98,6 +99,20 @@ int main(int, char**)
 | 
			
		||||
        if (done)
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        // Handle lost D3D9 device
 | 
			
		||||
        if (g_DeviceLost)
 | 
			
		||||
        {
 | 
			
		||||
            HRESULT hr = g_pd3dDevice->TestCooperativeLevel();
 | 
			
		||||
            if (hr == D3DERR_DEVICELOST)
 | 
			
		||||
            {
 | 
			
		||||
                ::Sleep(10);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (hr == D3DERR_DEVICENOTRESET)
 | 
			
		||||
                ResetDevice();
 | 
			
		||||
            g_DeviceLost = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Handle window resize (we don't resize directly in the WM_SIZE handler)
 | 
			
		||||
        if (g_ResizeWidth != 0 && g_ResizeHeight != 0)
 | 
			
		||||
        {
 | 
			
		||||
@@ -163,12 +178,11 @@ int main(int, char**)
 | 
			
		||||
            g_pd3dDevice->EndScene();
 | 
			
		||||
        }
 | 
			
		||||
        HRESULT result = g_pd3dDevice->Present(nullptr, nullptr, nullptr, nullptr);
 | 
			
		||||
 | 
			
		||||
        // Handle loss of D3D9 device
 | 
			
		||||
        if (result == D3DERR_DEVICELOST && g_pd3dDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET)
 | 
			
		||||
            ResetDevice();
 | 
			
		||||
        if (result == D3DERR_DEVICELOST)
 | 
			
		||||
            g_DeviceLost = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Cleanup
 | 
			
		||||
    ImGui_ImplDX9_Shutdown();
 | 
			
		||||
    ImGui_ImplWin32_Shutdown();
 | 
			
		||||
    ImGui::DestroyContext();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								external/imgui/imgui/examples/imgui_examples.sln
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -29,6 +29,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_opengl3", "ex
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_sdlrenderer2", "example_sdl2_sdlrenderer2\example_sdl2_sdlrenderer2.vcxproj", "{0C0B2BEA-311F-473C-9652-87923EF639E3}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl3_opengl3", "example_sdl3_opengl3\example_sdl3_opengl3.vcxproj", "{84AAA301-84FE-428B-9E3E-817BC8123C0C}"
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl3_sdlrenderer3", "example_sdl3_sdlrenderer3\example_sdl3_sdlrenderer3.vcxproj", "{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}"
 | 
			
		||||
EndProject
 | 
			
		||||
Global
 | 
			
		||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
			
		||||
		Debug|Win32 = Debug|Win32
 | 
			
		||||
@@ -141,6 +145,22 @@ Global
 | 
			
		||||
		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|Win32.Build.0 = Release|Win32
 | 
			
		||||
		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.ActiveCfg = Release|x64
 | 
			
		||||
		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.Build.0 = Release|x64
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Debug|Win32.Build.0 = Debug|Win32
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Debug|x64.ActiveCfg = Debug|x64
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Debug|x64.Build.0 = Debug|x64
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Release|Win32.ActiveCfg = Release|Win32
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Release|Win32.Build.0 = Release|Win32
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Release|x64.ActiveCfg = Release|x64
 | 
			
		||||
		{84AAA301-84FE-428B-9E3E-817BC8123C0C}.Release|x64.Build.0 = Release|x64
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Debug|Win32.Build.0 = Debug|Win32
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Debug|x64.ActiveCfg = Debug|x64
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Debug|x64.Build.0 = Debug|x64
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Release|Win32.ActiveCfg = Release|Win32
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Release|Win32.Build.0 = Release|Win32
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Release|x64.ActiveCfg = Release|x64
 | 
			
		||||
		{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}.Release|x64.Build.0 = Release|x64
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(SolutionProperties) = preSolution
 | 
			
		||||
		HideSolutionNode = FALSE
 | 
			
		||||
 
 | 
			
		||||
@@ -200,7 +200,7 @@ typedef void		(*uSynergySleepFunc)(uSynergyCookie cookie, int timeMs);
 | 
			
		||||
@brief Get time function
 | 
			
		||||
 | 
			
		||||
This function is called when uSynergy needs to know the current time. This is used to determine when timeouts
 | 
			
		||||
have occured. The time base should be a cyclic millisecond time value.
 | 
			
		||||
have occurred. The time base should be a cyclic millisecond time value.
 | 
			
		||||
 | 
			
		||||
@returns			Time value in milliseconds
 | 
			
		||||
**/
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								external/imgui/imgui/imconfig.h
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -21,10 +21,11 @@
 | 
			
		||||
 | 
			
		||||
//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows
 | 
			
		||||
// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
 | 
			
		||||
// DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions()
 | 
			
		||||
// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
 | 
			
		||||
//#define IMGUI_API __declspec( dllexport )
 | 
			
		||||
//#define IMGUI_API __declspec( dllimport )
 | 
			
		||||
// - Windows DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions()
 | 
			
		||||
//   for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
 | 
			
		||||
//#define IMGUI_API __declspec(dllexport)                   // MSVC Windows: DLL export
 | 
			
		||||
//#define IMGUI_API __declspec(dllimport)                   // MSVC Windows: DLL import
 | 
			
		||||
//#define IMGUI_API __attribute__((visibility("default")))  // GCC/Clang: override visibility when set is hidden
 | 
			
		||||
 | 
			
		||||
//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to clean your code of obsolete function/names.
 | 
			
		||||
//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
 | 
			
		||||
@@ -42,6 +43,7 @@
 | 
			
		||||
//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS         // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a)
 | 
			
		||||
//#define IMGUI_DISABLE_WIN32_FUNCTIONS                     // [Win32] Won't use and link with any Win32 function (clipboard, IME).
 | 
			
		||||
//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS      // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default).
 | 
			
		||||
//#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS             // Don't implement default io.PlatformOpenInShellFn() handler (Win32: ShellExecute(), require shell32.lib/.a, Mac/Linux: use system("")).
 | 
			
		||||
//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS            // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf)
 | 
			
		||||
//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS              // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself.
 | 
			
		||||
//#define IMGUI_DISABLE_FILE_FUNCTIONS                      // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies)
 | 
			
		||||
@@ -49,6 +51,9 @@
 | 
			
		||||
//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS                  // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
 | 
			
		||||
//#define IMGUI_DISABLE_SSE                                 // Disable use of SSE intrinsics even if available
 | 
			
		||||
 | 
			
		||||
//---- Enable Test Engine / Automation features.
 | 
			
		||||
//#define IMGUI_ENABLE_TEST_ENGINE                          // Enable imgui_test_engine hooks. Generally set automatically by include "imgui_te_config.h", see Test Engine for details.
 | 
			
		||||
 | 
			
		||||
//---- Include imgui_user.h at the end of imgui.h as a convenience
 | 
			
		||||
// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included.
 | 
			
		||||
//#define IMGUI_INCLUDE_IMGUI_USER_H
 | 
			
		||||
 
 | 
			
		||||