From 19e068945e3e682aeb00e6ee4b39464a354a62b6 Mon Sep 17 00:00:00 2001 From: Twaik Yont Date: Sun, 30 Jun 2019 05:01:25 +0300 Subject: [PATCH] Basic and buggy Android activity backend --- WTermux.iml | 19 + .../armeabi-v7a/android_gradle_build.json | 40 + ...gradle_build_lorie_armeabi-v7a.command.txt | 13 + ..._gradle_build_lorie_armeabi-v7a.stderr.txt | 0 ..._gradle_build_lorie_armeabi-v7a.stdout.txt | 1 + .../android_gradle_build_mini.json | 16 + .../armeabi-v7a/ndkBuild_build_command.txt | 16 + .../armeabi-v7a/ndkBuild_build_output.txt | 40 + .../armeabi-v7a/android_gradle_build.json | 40 + .../android_gradle_build_mini.json | 16 + .../armeabi-v7a/ndkBuild_build_command.txt | 16 + .../armeabi-v7a/ndkBuild_build_output.txt | 35 + app/.gitignore | 1 + app/app.iml | 179 + app/build.gradle | 33 + app/proguard-rules.pro | 21 + app/src/main/AndroidManifest.xml | 28 + .../java/com/termux/wtermux/LorieService.java | 99 + .../java/com/termux/wtermux/MainActivity.java | 22 + app/src/main/jni/Android.mk | 3 + app/src/main/jni/lorie/Android.mk | 11 + app/src/main/jni/lorie/LICENSE | 21 + app/src/main/jni/lorie/backend-android.c | 355 ++ .../src/main/jni/lorie/backend-x11.c | 51 +- backend.h => app/src/main/jni/lorie/backend.h | 4 +- app/src/main/jni/lorie/interfaces.h | 56 + log.h => app/src/main/jni/lorie/log.h | 22 + main.c => app/src/main/jni/lorie/main.c | 134 +- .../src/main/jni/lorie/meson.build | 0 .../src/main/jni/lorie/renderer.c | 2 +- .../src/main/jni/lorie/renderer.h | 0 .../src/main/jni/lorie/test_xwayland | 0 app/src/main/jni/prebuilt/Android.mk | 18 + .../armeabi-v7a/libandroid-support.so | Bin 0 -> 20820 bytes .../main/jni/prebuilt/armeabi-v7a/libffi.so | Bin 0 -> 104004 bytes .../prebuilt/armeabi-v7a/libwayland-server.so | Bin 0 -> 204852 bytes .../prebuilt/include/wayland-server-core.h | 665 +++ .../include/wayland-server-protocol.h | 4357 +++++++++++++++++ .../jni/prebuilt/include/wayland-server.h | 106 + .../main/jni/prebuilt/include/wayland-util.h | 751 +++ .../jni/prebuilt/include/wayland-version.h | 34 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 + app/src/main/res/layout/activity_main.xml | 21 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/styles.xml | 16 + build.gradle | 27 + gradle.properties | 15 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 + gradlew.bat | 84 + local.properties | 9 + settings.gradle | 1 + 67 files changed, 7673 insertions(+), 126 deletions(-) create mode 100644 WTermux.iml create mode 100644 app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build.json create mode 100644 app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.command.txt create mode 100644 app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stderr.txt create mode 100644 app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt create mode 100644 app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_mini.json create mode 100644 app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_command.txt create mode 100644 app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_output.txt create mode 100644 app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build.json create mode 100644 app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build_mini.json create mode 100644 app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_command.txt create mode 100644 app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_output.txt create mode 100644 app/.gitignore create mode 100644 app/app.iml create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/termux/wtermux/LorieService.java create mode 100644 app/src/main/java/com/termux/wtermux/MainActivity.java create mode 100644 app/src/main/jni/Android.mk create mode 100644 app/src/main/jni/lorie/Android.mk create mode 100644 app/src/main/jni/lorie/LICENSE create mode 100644 app/src/main/jni/lorie/backend-android.c rename backend-x11.c => app/src/main/jni/lorie/backend-x11.c (84%) rename backend.h => app/src/main/jni/lorie/backend.h (86%) create mode 100644 app/src/main/jni/lorie/interfaces.h rename log.h => app/src/main/jni/lorie/log.h (54%) rename main.c => app/src/main/jni/lorie/main.c (65%) rename meson.build => app/src/main/jni/lorie/meson.build (100%) rename renderer.c => app/src/main/jni/lorie/renderer.c (99%) rename renderer.h => app/src/main/jni/lorie/renderer.h (100%) rename test_xwayland => app/src/main/jni/lorie/test_xwayland (100%) create mode 100644 app/src/main/jni/prebuilt/Android.mk create mode 100755 app/src/main/jni/prebuilt/armeabi-v7a/libandroid-support.so create mode 100755 app/src/main/jni/prebuilt/armeabi-v7a/libffi.so create mode 100755 app/src/main/jni/prebuilt/armeabi-v7a/libwayland-server.so create mode 100644 app/src/main/jni/prebuilt/include/wayland-server-core.h create mode 100644 app/src/main/jni/prebuilt/include/wayland-server-protocol.h create mode 100644 app/src/main/jni/prebuilt/include/wayland-server.h create mode 100644 app/src/main/jni/prebuilt/include/wayland-util.h create mode 100644 app/src/main/jni/prebuilt/include/wayland-version.h create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 local.properties create mode 100644 settings.gradle diff --git a/WTermux.iml b/WTermux.iml new file mode 100644 index 0000000..078f058 --- /dev/null +++ b/WTermux.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build.json b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build.json new file mode 100644 index 0000000..a188210 --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build.json @@ -0,0 +1,40 @@ +{ + "buildFiles": [ + "/home/twaik/WTermux/app/src/main/jni/Android.mk" + ], + "cleanCommands": [ + "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d1 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib clean" + ], + "libraries": { + "lorie-debug-armeabi-v7a": { + "buildCommand": "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d1 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so", + "toolchain": "toolchain-armeabi-v7a", + "abi": "armeabi-v7a", + "artifactName": "lorie", + "files": [ + { + "src": "/home/twaik/WTermux/app/src/main/jni/lorie/backend-android.c", + "flags": "-target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march\u003darmv7-a -mthumb -O0 -UNDEBUG -fno-limit-debug-info -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror\u003dformat-security" + }, + { + "src": "/home/twaik/WTermux/app/src/main/jni/lorie/main.c", + "flags": "-target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march\u003darmv7-a -mthumb -O0 -UNDEBUG -fno-limit-debug-info -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror\u003dformat-security" + }, + { + "src": "/home/twaik/WTermux/app/src/main/jni/lorie/renderer.c", + "flags": "-target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march\u003darmv7-a -mthumb -O0 -UNDEBUG -fno-limit-debug-info -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror\u003dformat-security" + } + ], + "output": "/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so" + } + }, + "toolchains": { + "toolchain-armeabi-v7a": { + "cCompilerExecutable": "/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" + } + }, + "cFileExtensions": [ + "c" + ], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.command.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.command.txt new file mode 100644 index 0000000..3c71c54 --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.command.txt @@ -0,0 +1,13 @@ +Executable : /opt/AndroidSdk/ndk-bundle/ndk-build +arguments : +NDK_PROJECT_PATH=null +APP_BUILD_SCRIPT=/home/twaik/WTermux/app/src/main/jni/Android.mk +APP_ABI=armeabi-v7a +NDK_ALL_ABIS=armeabi-v7a +NDK_DEBUG=1 +APP_PLATFORM=android-19 +NDK_OUT=/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj +NDK_LIBS_OUT=/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib +/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so +jvmArgs : + diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stderr.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stderr.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt new file mode 100644 index 0000000..3d15895 --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt @@ -0,0 +1 @@ +make: `/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so' is up to date. diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_mini.json b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_mini.json new file mode 100644 index 0000000..7fc41a0 --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_mini.json @@ -0,0 +1,16 @@ +{ + "buildFiles": [ + "/home/twaik/WTermux/app/src/main/jni/Android.mk" + ], + "cleanCommands": [ + "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d1 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib clean" + ], + "libraries": { + "lorie-debug-armeabi-v7a": { + "artifactName": "lorie", + "buildCommand": "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d1 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so", + "abi": "armeabi-v7a", + "output": "/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so" + } + } +} \ No newline at end of file diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_command.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_command.txt new file mode 100644 index 0000000..37ce4f6 --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_command.txt @@ -0,0 +1,16 @@ +Executable : /opt/AndroidSdk/ndk-bundle/ndk-build +arguments : +NDK_PROJECT_PATH=null +APP_BUILD_SCRIPT=/home/twaik/WTermux/app/src/main/jni/Android.mk +APP_ABI=armeabi-v7a +NDK_ALL_ABIS=armeabi-v7a +NDK_DEBUG=1 +APP_PLATFORM=android-19 +NDK_OUT=/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj +NDK_LIBS_OUT=/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib +APP_SHORT_COMMANDS=false +LOCAL_SHORT_COMMANDS=false +-B +-n +jvmArgs : + diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_output.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_output.txt new file mode 100644 index 0000000..994ec2a --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/ndkBuild_build_output.txt @@ -0,0 +1,40 @@ +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/* +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/gdbserver +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/gdb.setup +mkdir -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a +echo [armeabi-v7a] "Gdbserver ": "[arm-linux-androideabi] /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/gdbserver" +install -p /opt/AndroidSdk/ndk-bundle/prebuilt/android-arm/gdbserver/gdbserver /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/gdbserver +echo [armeabi-v7a] "Gdbsetup ": "/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/gdb.setup" +echo "set solib-search-path /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a" > /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/gdb.setup +echo "directory /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot /home/twaik/WTermux/app/src/main/jni/prebuilt /home/twaik/WTermux/app/src/main/jni/prebuilt/include /home/twaik/WTermux/app/src/main/jni/lorie /opt/AndroidSdk/ndk-bundle/sources/cxx-stl/system" >> /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/gdb.setup +mkdir -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a +echo [armeabi-v7a] "Prebuilt ": "libandroid-support.so <= /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/" +cp -f /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/libandroid-support.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libandroid-support.so +echo [armeabi-v7a] "Install ": "libandroid-support.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libandroid-support.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libandroid-support.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libandroid-support.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libandroid-support.so +echo [armeabi-v7a] "Prebuilt ": "libffi.so <= /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/" +cp -f /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/libffi.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libffi.so +echo [armeabi-v7a] "Install ": "libffi.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libffi.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libffi.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libffi.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libffi.so +mkdir -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie +echo [armeabi-v7a] "Compile thumb ": "lorie <= main.c" +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/main.o +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -MMD -MP -MF /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/main.o.d -target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march=armv7-a -mthumb -O0 -UNDEBUG -fno-limit-debug-info -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -c /home/twaik/WTermux/app/src/main/jni/lorie/main.c -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/main.o +echo [armeabi-v7a] "Compile thumb ": "lorie <= backend-android.c" +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/backend-android.o +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -MMD -MP -MF /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/backend-android.o.d -target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march=armv7-a -mthumb -O0 -UNDEBUG -fno-limit-debug-info -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -c /home/twaik/WTermux/app/src/main/jni/lorie/backend-android.c -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/backend-android.o +echo [armeabi-v7a] "Compile thumb ": "lorie <= renderer.c" +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/renderer.o +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -MMD -MP -MF /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/renderer.o.d -target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march=armv7-a -mthumb -O0 -UNDEBUG -fno-limit-debug-info -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -c /home/twaik/WTermux/app/src/main/jni/lorie/renderer.c -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/renderer.o +echo [armeabi-v7a] "Prebuilt ": "libwayland-server.so <= /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/" +cp -f /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/libwayland-server.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libwayland-server.so +echo [armeabi-v7a] "SharedLibrary ": "liblorie.so" +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -Wl,-soname,liblorie.so -shared /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/main.o /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/backend-android.o /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/lorie/renderer.o -lgcc -Wl,--exclude-libs,libgcc.a -latomic -Wl,--exclude-libs,libatomic.a /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libwayland-server.so -target armv7-none-linux-androideabi19 -no-canonical-prefixes -Wl,--build-id -stdlib=libstdc++ -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--warn-shared-textrel -Wl,--fatal-warnings -lEGL -lGLESv2 -llog -lc -lm -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so +echo [armeabi-v7a] "Install ": "liblorie.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/liblorie.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/liblorie.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/liblorie.so +echo [armeabi-v7a] "Install ": "libwayland-server.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libwayland-server.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libwayland-server.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libwayland-server.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/lib/armeabi-v7a/libwayland-server.so diff --git a/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build.json b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build.json new file mode 100644 index 0000000..0d7d111 --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build.json @@ -0,0 +1,40 @@ +{ + "buildFiles": [ + "/home/twaik/WTermux/app/src/main/jni/Android.mk" + ], + "cleanCommands": [ + "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d0 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib clean" + ], + "libraries": { + "lorie-release-armeabi-v7a": { + "buildCommand": "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d0 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/liblorie.so", + "toolchain": "toolchain-armeabi-v7a", + "abi": "armeabi-v7a", + "artifactName": "lorie", + "files": [ + { + "src": "/home/twaik/WTermux/app/src/main/jni/lorie/backend-android.c", + "flags": "-target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march\u003darmv7-a -mthumb -Oz -DNDEBUG -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror\u003dformat-security" + }, + { + "src": "/home/twaik/WTermux/app/src/main/jni/lorie/main.c", + "flags": "-target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march\u003darmv7-a -mthumb -Oz -DNDEBUG -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror\u003dformat-security" + }, + { + "src": "/home/twaik/WTermux/app/src/main/jni/lorie/renderer.c", + "flags": "-target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march\u003darmv7-a -mthumb -Oz -DNDEBUG -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror\u003dformat-security" + } + ], + "output": "/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/liblorie.so" + } + }, + "toolchains": { + "toolchain-armeabi-v7a": { + "cCompilerExecutable": "/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" + } + }, + "cFileExtensions": [ + "c" + ], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build_mini.json b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build_mini.json new file mode 100644 index 0000000..6b592a0 --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/android_gradle_build_mini.json @@ -0,0 +1,16 @@ +{ + "buildFiles": [ + "/home/twaik/WTermux/app/src/main/jni/Android.mk" + ], + "cleanCommands": [ + "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d0 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib clean" + ], + "libraries": { + "lorie-release-armeabi-v7a": { + "artifactName": "lorie", + "buildCommand": "/opt/AndroidSdk/ndk-bundle/ndk-build NDK_PROJECT_PATH\u003dnull APP_BUILD_SCRIPT\u003d/home/twaik/WTermux/app/src/main/jni/Android.mk APP_ABI\u003darmeabi-v7a NDK_ALL_ABIS\u003darmeabi-v7a NDK_DEBUG\u003d0 APP_PLATFORM\u003dandroid-19 NDK_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj NDK_LIBS_OUT\u003d/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/liblorie.so", + "abi": "armeabi-v7a", + "output": "/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/liblorie.so" + } + } +} \ No newline at end of file diff --git a/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_command.txt b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_command.txt new file mode 100644 index 0000000..0a8608a --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_command.txt @@ -0,0 +1,16 @@ +Executable : /opt/AndroidSdk/ndk-bundle/ndk-build +arguments : +NDK_PROJECT_PATH=null +APP_BUILD_SCRIPT=/home/twaik/WTermux/app/src/main/jni/Android.mk +APP_ABI=armeabi-v7a +NDK_ALL_ABIS=armeabi-v7a +NDK_DEBUG=0 +APP_PLATFORM=android-19 +NDK_OUT=/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj +NDK_LIBS_OUT=/home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib +APP_SHORT_COMMANDS=false +LOCAL_SHORT_COMMANDS=false +-B +-n +jvmArgs : + diff --git a/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_output.txt b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_output.txt new file mode 100644 index 0000000..9a8fb2e --- /dev/null +++ b/app/.externalNativeBuild/ndkBuild/release/armeabi-v7a/ndkBuild_build_output.txt @@ -0,0 +1,35 @@ +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/* +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/gdbserver +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/gdb.setup +mkdir -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a +echo [armeabi-v7a] "Prebuilt ": "libandroid-support.so <= /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/" +cp -f /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/libandroid-support.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/libandroid-support.so +mkdir -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a +echo [armeabi-v7a] "Install ": "libandroid-support.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libandroid-support.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/libandroid-support.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libandroid-support.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libandroid-support.so +echo [armeabi-v7a] "Prebuilt ": "libffi.so <= /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/" +cp -f /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/libffi.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/libffi.so +echo [armeabi-v7a] "Install ": "libffi.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libffi.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/libffi.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libffi.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libffi.so +mkdir -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie +echo [armeabi-v7a] "Compile thumb ": "lorie <= main.c" +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/main.o +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -MMD -MP -MF /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/main.o.d -target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march=armv7-a -mthumb -Oz -DNDEBUG -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -c /home/twaik/WTermux/app/src/main/jni/lorie/main.c -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/main.o +echo [armeabi-v7a] "Compile thumb ": "lorie <= backend-android.c" +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/backend-android.o +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -MMD -MP -MF /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/backend-android.o.d -target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march=armv7-a -mthumb -Oz -DNDEBUG -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -c /home/twaik/WTermux/app/src/main/jni/lorie/backend-android.c -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/backend-android.o +echo [armeabi-v7a] "Compile thumb ": "lorie <= renderer.c" +rm -f /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/renderer.o +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -MMD -MP -MF /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/renderer.o.d -target armv7-none-linux-androideabi19 -fdata-sections -ffunction-sections -fstack-protector-strong -funwind-tables -no-canonical-prefixes --sysroot /opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -fno-addrsig -fpic -march=armv7-a -mthumb -Oz -DNDEBUG -I/home/twaik/WTermux/app/src/main/jni/prebuilt/include -I/home/twaik/WTermux/app/src/main/jni/lorie -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -c /home/twaik/WTermux/app/src/main/jni/lorie/renderer.c -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/renderer.o +echo [armeabi-v7a] "Prebuilt ": "libwayland-server.so <= /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/" +cp -f /home/twaik/WTermux/app/src/main/jni/prebuilt/armeabi-v7a/libwayland-server.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/libwayland-server.so +echo [armeabi-v7a] "SharedLibrary ": "liblorie.so" +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -Wl,-soname,liblorie.so -shared /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/main.o /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/backend-android.o /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/lorie/renderer.o -lgcc -Wl,--exclude-libs,libgcc.a -latomic -Wl,--exclude-libs,libatomic.a /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/libwayland-server.so -target armv7-none-linux-androideabi19 -no-canonical-prefixes -Wl,--build-id -stdlib=libstdc++ -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--warn-shared-textrel -Wl,--fatal-warnings -lEGL -lGLESv2 -llog -lc -lm -o /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/liblorie.so +echo [armeabi-v7a] "Install ": "liblorie.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/liblorie.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/liblorie.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/liblorie.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/liblorie.so +echo [armeabi-v7a] "Install ": "libwayland-server.so => /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libwayland-server.so" +install -p /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/libwayland-server.so /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libwayland-server.so +/opt/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded /home/twaik/WTermux/app/build/intermediates/ndkBuild/release/lib/armeabi-v7a/libwayland-server.so diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/app.iml b/app/app.iml new file mode 100644 index 0000000..e944511 --- /dev/null +++ b/app/app.iml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..ea22853 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,33 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.termux.wtermux" + minSdkVersion 19 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + ndkBuild { + path "src/main/jni/Android.mk" + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d567a89 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/termux/wtermux/LorieService.java b/app/src/main/java/com/termux/wtermux/LorieService.java new file mode 100644 index 0000000..4dc0597 --- /dev/null +++ b/app/src/main/java/com/termux/wtermux/LorieService.java @@ -0,0 +1,99 @@ +package com.termux.wtermux; + +import android.annotation.SuppressLint; +import android.util.Log; +import android.view.MotionEvent; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; + +public class LorieService implements SurfaceHolder.Callback, View.OnTouchListener { + private static final int BTN_LEFT = 0x110; + private static final int BTN_MIDDLE = 0x110; + private static final int BTN_RIGHT = 0x110; + + private static final int WL_STATE_PRESSED = 1; + private static final int WL_STATE_RELEASED = 0; + + private static final int WL_POINTER_MOTION = 2; + private static final int WL_POINTER_BUTTON = 3; + private long compositor = 0; + LorieService() { + compositor = createLorieThread(); + if (compositor == 0) { + Log.e("WestonService", "compositor thread was not created"); + } + } + + @SuppressLint("ClickableViewAccessibility") + void connectSurfaceView(SurfaceView surface) { + surface.getHolder().addCallback(this); + surface.setOnTouchListener(this); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + windowChanged(compositor, holder.getSurface(), width, height); + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouch(View v, MotionEvent e) { + int type = 0; + int button = 0; + switch (e.getAction()) { + case MotionEvent.ACTION_POINTER_DOWN: + case MotionEvent.ACTION_BUTTON_PRESS: + case MotionEvent.ACTION_DOWN: + type = WL_STATE_PRESSED; // STATE_PRESSED + break; + case MotionEvent.ACTION_HOVER_MOVE: + case MotionEvent.ACTION_MOVE: + type = WL_POINTER_MOTION; + break; + case MotionEvent.ACTION_POINTER_UP: + case MotionEvent.ACTION_BUTTON_RELEASE: + case MotionEvent.ACTION_UP: + type = WL_STATE_RELEASED; // STATE_RELEASED + break; + } + + if (type == WL_STATE_PRESSED || type == WL_STATE_RELEASED) + switch (e.getButtonState()) { + case MotionEvent.BUTTON_PRIMARY: + button = BTN_LEFT; + break; + case MotionEvent.BUTTON_TERTIARY: + button = BTN_MIDDLE; + break; + case MotionEvent.BUTTON_SECONDARY: + button = BTN_RIGHT; + break; + default: + Log.d("LorieService","Unknown button: " + e.getButtonState()); + button = BTN_LEFT; + } + onTouch(compositor, type, button, (int)e.getX(), (int)e.getY()); + return true; + } + + private native long createLorieThread(); + private native void windowChanged(long compositor, Surface surface, int width, int height); + private native void onTouch(long compositor, int type, int button, int x, int y); + private native void onKey(long compositor, int type, int key); + + static { + System.loadLibrary("lorie"); + } +} diff --git a/app/src/main/java/com/termux/wtermux/MainActivity.java b/app/src/main/java/com/termux/wtermux/MainActivity.java new file mode 100644 index 0000000..eb8154c --- /dev/null +++ b/app/src/main/java/com/termux/wtermux/MainActivity.java @@ -0,0 +1,22 @@ +package com.termux.wtermux; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.SurfaceView; +import android.view.WindowManager; + + +public class MainActivity extends AppCompatActivity { + + LorieService weston; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + + SurfaceView surface = findViewById(R.id.WestonView); + weston = new LorieService(); + weston.connectSurfaceView(surface); + } +} diff --git a/app/src/main/jni/Android.mk b/app/src/main/jni/Android.mk new file mode 100644 index 0000000..cef17d6 --- /dev/null +++ b/app/src/main/jni/Android.mk @@ -0,0 +1,3 @@ +ROOT_PATH := $(call my-dir) +include $(ROOT_PATH)/prebuilt/Android.mk +include $(ROOT_PATH)/lorie/Android.mk diff --git a/app/src/main/jni/lorie/Android.mk b/app/src/main/jni/lorie/Android.mk new file mode 100644 index 0000000..d5b0606 --- /dev/null +++ b/app/src/main/jni/lorie/Android.mk @@ -0,0 +1,11 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := lorie +LOCAL_SRC_FILES := \ + main.c \ + backend-android.c \ + renderer.c +LOCAL_SHARED_LIBRARIES := wayland-server +LOCAL_LDLIBS := -lEGL -lGLESv2 -llog -landroid +include $(BUILD_SHARED_LIBRARY) diff --git a/app/src/main/jni/lorie/LICENSE b/app/src/main/jni/lorie/LICENSE new file mode 100644 index 0000000..d2fc6c3 --- /dev/null +++ b/app/src/main/jni/lorie/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Twaik Yont + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/src/main/jni/lorie/backend-android.c b/app/src/main/jni/lorie/backend-android.c new file mode 100644 index 0000000..87ede0e --- /dev/null +++ b/app/src/main/jni/lorie/backend-android.c @@ -0,0 +1,355 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "readability-isolate-declaration" +#pragma ide diagnostic ignored "cppcoreguidelines-avoid-magic-numbers" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "backend.h" +#include "log.h" + +static void checkEGLError(int line) { + char* error = NULL; + switch(eglGetError()) { +#define E(code, desc) case code: error = desc; break; + case EGL_SUCCESS: return; // "No error" + E(EGL_NOT_INITIALIZED, "EGL not initialized or failed to initialize"); + E(EGL_BAD_ACCESS, "Resource inaccessible"); + E(EGL_BAD_ALLOC, "Cannot allocate resources"); + E(EGL_BAD_ATTRIBUTE, "Unrecognized attribute or attribute value"); + E(EGL_BAD_CONTEXT, "Invalid EGL context"); + E(EGL_BAD_CONFIG, "Invalid EGL frame buffer configuration"); + E(EGL_BAD_CURRENT_SURFACE, "Current surface is no longer valid"); + E(EGL_BAD_DISPLAY, "Invalid EGL display"); + E(EGL_BAD_SURFACE, "Invalid surface"); + E(EGL_BAD_MATCH, "Inconsistent arguments"); + E(EGL_BAD_PARAMETER, "Invalid argument"); + E(EGL_BAD_NATIVE_PIXMAP, "Invalid native pixmap"); + E(EGL_BAD_NATIVE_WINDOW, "Invalid native window"); + E(EGL_CONTEXT_LOST, "Context lost"); +#undef E + default: error = "Unknown error"; + } + LOGE("EGL: %s after %d", error, line); +} +#define checkEGLError() checkEGLError(__LINE__) + +enum { + ACTION_KEY = 1, + ACTION_POINTER = 2, + ACTION_WIN_CHANGE = 3, + #ifdef __ANDROID__ + ACTION_JNI_WIN_CHANGE = 4, + #endif +}; +static const EGLint ctxattr[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, // Request opengl ES2.0 + EGL_NONE +}; + +static const EGLint sfcattr[] = { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_BLUE_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_RED_SIZE, 8, + EGL_NONE +}; + +typedef struct { + uint8_t type; + union { + struct { + uint8_t state; + uint16_t key; + } key; + struct { + uint16_t state, button; + uint32_t x, y; + } pointer; + struct { + EGLDisplay dpy; + EGLNativeWindowType win; + uint32_t width, height; + } window_change; + #ifdef __ANDROID__ + struct { + JavaVM* jvm; + jobject surface; + uint32_t width, height; + } jni_window_change; + #endif + }; +} lorie_event; + +struct backend_android { + EGLDisplay dpy; + EGLContext ctx; + EGLNativeDisplayType win; + EGLConfig config; + EGLSurface sfc; + + struct callbacks callbacks; + + int fds[2]; +}; + +struct backend_android *backend = NULL; + +void lorie_key_event(void __unused *b, uint8_t state, uint16_t key) { + if (!backend) return; + + lorie_event e; + memset(&e, 0, sizeof(lorie_event)); + + e.type = ACTION_KEY; + e.key.state = state; + e.key.key = key; + + write(backend->fds[0], &e, sizeof(lorie_event)); +} + +void lorie_pointer_event(void __unused *b, uint8_t state, uint16_t button, uint32_t x, uint32_t y) { + if (!backend) return; + + lorie_event e; + memset(&e, 0, sizeof(lorie_event)); + + e.type = ACTION_POINTER; + e.pointer.state = state; + e.pointer.button = button; + e.pointer.x = x; + e.pointer.y = y; + + write(backend->fds[0], &e, sizeof(lorie_event)); +} + +void lorie_window_change_event(void __unused *b, EGLDisplay dpy, EGLNativeWindowType win, uint32_t width, uint32_t height) { + if (!backend) return; + + lorie_event e; + memset(&e, 0, sizeof(lorie_event)); + + e.type = ACTION_WIN_CHANGE; + e.window_change.dpy = dpy; + e.window_change.win = win; + e.window_change.width = width; + e.window_change.height = height; + + write(backend->fds[0], &e, sizeof(lorie_event)); +} + +void lorie_jni_window_change_event(void __unused *b, JavaVM* jvm, jobject surface, uint32_t width, uint32_t height) { + if (!backend) return; + + lorie_event e; + memset(&e, 0, sizeof(lorie_event)); + + e.type = ACTION_JNI_WIN_CHANGE; + e.jni_window_change.jvm = jvm; + e.jni_window_change.surface = surface; + e.jni_window_change.width = width; + e.jni_window_change.height = height; + + write(backend->fds[0], &e, sizeof(lorie_event)); +} + +static int has_data(int socket) { + int count = 0; + ioctl(socket, FIONREAD, &count); + return count; +} + +JNIEXPORT jlong JNICALL +Java_com_termux_wtermux_LorieService_createLorieThread(JNIEnv __unused *env, jobject __unused instance) { + pthread_t thread; + //void *server = NULL; + + setenv("XDG_RUNTIME_DIR", "/data/data/com.termux/files/usr/tmp", 1); + pthread_create(&thread, NULL, (void *(*)(void *))lorie_start, NULL); + while(backend == NULL) { usleep(10); } + + //return (jlong) compositor; + return 1; +} + +JNIEXPORT void JNICALL +Java_com_termux_wtermux_LorieService_windowChanged(JNIEnv *env, jobject __unused instance, jlong __unused jcompositor, jobject jsurface, jint width, jint height) { + if (backend == NULL) return; +#if 1 + EGLNativeWindowType win = ANativeWindow_fromSurface(env, jsurface); + if (win == NULL) { + LOGE("Surface is invalid"); + lorie_window_change_event(backend, NULL, NULL, (uint32_t) width, (uint32_t) height); + return; + } + + lorie_window_change_event(backend, NULL, win, (uint32_t) width, + (uint32_t) height); +#else + JavaVM* jvm; + (*env)->GetJavaVM(env, &jvm); + if (jvm == NULL) { + LOGE("Error getting jvm instance"); + return; + } + + jobject surface = (*env)->NewGlobalRef(env, jsurface); + if (surface == NULL) { + LOGE("Error creating global reference of Surface object"); + return; + } + + lorie_jni_window_change_event(backend, jvm, surface, width, height); +#endif +} + +JNIEXPORT void JNICALL +Java_com_termux_wtermux_LorieService_onTouch(JNIEnv __unused *env, jobject __unused instance, jlong __unused jcompositor, jint type, jint button, jint x, jint y) { + if (backend == NULL) return; + lorie_pointer_event(backend, (uint8_t) type, (uint16_t) button, (uint32_t) x, (uint32_t) y); +} + +JNIEXPORT void JNICALL +Java_com_termux_wtermux_LorieService_onKey(JNIEnv __unused *env, jobject __unused instance, jlong __unused compositor, + jint type, jint key) { + + lorie_key_event(backend, (uint8_t) type, (uint16_t) key); + +} + +//////////////////////////////////////////////////////////////////////// + +void backend_init (struct callbacks *callbacks) { + backend = calloc (1, sizeof(struct backend_android)); + if (backend == NULL) { + LOGE("Can not allocate backend_android"); + return; + } + + backend->callbacks = *callbacks; + + if (socketpair(PF_LOCAL, SOCK_STREAM, 0, backend->fds)) { + + } + + // Setup EGL + EGLint num_configs_returned; + backend->dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); checkEGLError(); + eglInitialize (backend->dpy, NULL, NULL); checkEGLError(); + eglBindAPI (EGL_OPENGL_ES_API); + + eglChooseConfig (backend->dpy, sfcattr, &backend->config, 1, &num_configs_returned); checkEGLError(); + backend->ctx = eglCreateContext (backend->dpy, backend->config, EGL_NO_CONTEXT, ctxattr); checkEGLError(); + eglMakeCurrent(backend->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, backend->ctx); checkEGLError(); +} + +EGLDisplay __unused backend_get_egl_display (void) { + return backend->dpy; +} + +void backend_swap_buffers (void) { + eglSwapBuffers(backend->dpy, backend->sfc); checkEGLError(); +} + +void backend_dispatch_nonblocking (void) +{ + lorie_event ev; + + while (has_data(backend->fds[1]) >= (int) sizeof(lorie_event)) { + read(backend->fds[1], &ev, sizeof(lorie_event)); + switch (ev.type) { + case ACTION_KEY: + if (backend->callbacks.key) + backend->callbacks.key(ev.key.key, ev.key.state); + break; + case ACTION_POINTER: + if (backend->callbacks.mouse_motion) + backend->callbacks.mouse_motion(ev.pointer.x, ev.pointer.y); + + if (ev.pointer.state != WL_POINTER_MOTION) { + if (backend->callbacks.mouse_button) + backend->callbacks.mouse_button(ev.pointer.button, ev.pointer.state); + } + break; + case ACTION_WIN_CHANGE: + if (ev.window_change.win != backend->win) { + if (backend->sfc) + eglDestroySurface(backend->dpy, backend->sfc); + backend->sfc = eglCreateWindowSurface(backend->dpy, backend->config, ev.window_change.win, NULL); checkEGLError(); + backend->win = ev.window_change.win; + } + checkEGLError(); + eglMakeCurrent(backend->dpy, backend->sfc, backend->sfc, backend->ctx); checkEGLError(); + + if (backend->callbacks.resize) + backend->callbacks.resize(ev.window_change.width, ev.window_change.height); + break; + #if 0 + #ifdef __ANDROID__ + case ACTION_JNI_WIN_CHANGE: + { + JavaVM* jvm = ev.jni_window_change.jvm; + JNIEnv* env; + (*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL); + if (!jvm || !env) { + weston_log("Failed getting JNIEnv\n"); + return -1; + } + + b->edpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); + b->ewin = ANativeWindow_fromSurface(env, ev.jni_window_change.surface); + if (b->ewin == NULL) { + weston_log("Error getting EGLNativeWindowType from Java Surface object\n"); + return -1; + } + + struct weston_mode mode = b->output->mode; + + if (mode.width == ev.jni_window_change.width && + mode.height == ev.jni_window_change.height) + break; + + mode.width = ev.jni_window_change.width; + mode.height = ev.jni_window_change.height; + + if (weston_output_mode_set_native(&b->output->base, + &mode, b->output->scale) < 0) + weston_log("Mode switch failed\n"); + + break; + } + #endif + #endif + default:break; + } + } +} + +void backend_wait_for_events (int wayland_fd) { + if (!backend) return; + struct pollfd fds[2] = {{backend->fds[1], POLLIN}, {wayland_fd, POLLIN}}; + poll (fds, 2, -1); +} + +void __unused backend_get_keymap (int __unused *fd, int __unused *size) { + +} + +long backend_get_timestamp (void) { + struct timespec t; + clock_gettime (CLOCK_MONOTONIC, &t); + return t.tv_sec * 1000 + t.tv_nsec / 1000000; +} + +void backend_get_dimensions(uint32_t *width, uint32_t *height) { + if (width) *width = 480; + if (height) *height = 800; +} +#pragma clang diagnostic pop \ No newline at end of file diff --git a/backend-x11.c b/app/src/main/jni/lorie/backend-x11.c similarity index 84% rename from backend-x11.c rename to app/src/main/jni/lorie/backend-x11.c index b78b7c5..a7b9269 100644 --- a/backend-x11.c +++ b/app/src/main/jni/lorie/backend-x11.c @@ -1,5 +1,4 @@ #define _GNU_SOURCE -#include "backend.h" #include #include #include @@ -14,6 +13,10 @@ #include #include #include +#include +#include +#include "backend.h" +#include "log.h" #define WINDOW_WIDTH 1024 #define WINDOW_HEIGHT 600 @@ -91,7 +94,21 @@ static void create_window (void) { XMapWindow (x_display, window.window); } +void handler(int sig) { + void *array[10]; + size_t size; + + // get void*'s for all entries on the stack + size = backtrace(array, 10); + + // print out all the frames to stderr + fprintf(stderr, "Error: signal %d:\n", sig); + backtrace_symbols_fd(array, size, STDERR_FILENO); + exit(1); +} + void backend_init (struct callbacks *_callbacks) { + signal(SIGSEGV, handler); callbacks = *_callbacks; x_display = XOpenDisplay (NULL); @@ -116,6 +133,7 @@ void backend_swap_buffers (void) { } static void update_modifiers (void) { + if (!callbacks.modifiers) return; struct modifier_state modifier_state; modifier_state.depressed = xkb_state_serialize_mods (state, XKB_STATE_MODS_DEPRESSED); modifier_state.latched = xkb_state_serialize_mods (state, XKB_STATE_MODS_LATCHED); @@ -128,16 +146,16 @@ void backend_dispatch_nonblocking (void) { XEvent event; while (XPending(x_display)) { XNextEvent (x_display, &event); - if (event.type == ConfigureNotify) { + if (event.type == ConfigureNotify && callbacks.resize) { callbacks.resize (event.xconfigure.width, event.xconfigure.height); } - else if (event.type == Expose) { + else if (event.type == Expose && callbacks.draw) { callbacks.draw (); } - else if (event.type == MotionNotify) { + else if (event.type == MotionNotify && callbacks.mouse_motion) { callbacks.mouse_motion (event.xbutton.x, event.xbutton.y); } - else if (event.type == ButtonPress) { + else if (event.type == ButtonPress && callbacks.mouse_button) { if (event.xbutton.button == Button1) callbacks.mouse_button (BTN_LEFT, WL_POINTER_BUTTON_STATE_PRESSED); else if (event.xbutton.button == Button2) @@ -145,7 +163,7 @@ void backend_dispatch_nonblocking (void) { else if (event.xbutton.button == Button3) callbacks.mouse_button (BTN_RIGHT, WL_POINTER_BUTTON_STATE_PRESSED); } - else if (event.type == ButtonRelease) { + else if (event.type == ButtonRelease && callbacks.mouse_button) { if (event.xbutton.button == Button1) callbacks.mouse_button (BTN_LEFT, WL_POINTER_BUTTON_STATE_RELEASED); else if (event.xbutton.button == Button2) @@ -153,12 +171,12 @@ void backend_dispatch_nonblocking (void) { else if (event.xbutton.button == Button3) callbacks.mouse_button (BTN_RIGHT, WL_POINTER_BUTTON_STATE_RELEASED); } - else if (event.type == KeyPress) { + else if (event.type == KeyPress && callbacks.key) { callbacks.key (event.xkey.keycode - 8, WL_KEYBOARD_KEY_STATE_PRESSED); xkb_state_update_key (state, event.xkey.keycode, XKB_KEY_DOWN); update_modifiers (); } - else if (event.type == KeyRelease) { + else if (event.type == KeyRelease && callbacks.key) { callbacks.key (event.xkey.keycode - 8, WL_KEYBOARD_KEY_STATE_RELEASED); xkb_state_update_key (state, event.xkey.keycode, XKB_KEY_UP); update_modifiers (); @@ -168,7 +186,7 @@ void backend_dispatch_nonblocking (void) { state = xkb_x11_state_new_from_device (keymap, xcb_connection, keyboard_device_id); update_modifiers (); } - else if (event.type == ClientMessage) { + else if (event.type == ClientMessage && callbacks.terminate) { if(event.xclient.message_type == atom1 && event.xclient.data.l[0] == atom2) { //XDestroyWindow(x_display, event.xclient.window); @@ -176,7 +194,7 @@ void backend_dispatch_nonblocking (void) { } break; } - else if (event.type == DestroyNotify) { + else if (event.type == DestroyNotify && callbacks.terminate) { callbacks.terminate(); break; } @@ -205,3 +223,16 @@ long backend_get_timestamp (void) { clock_gettime (CLOCK_MONOTONIC, &t); return t.tv_sec * 1000 + t.tv_nsec / 1000000; } + +void backend_get_dimensions(uint32_t *width, uint32_t *height) { + if (width != NULL) *width = WINDOW_WIDTH; + if (height != NULL) *height = WINDOW_HEIGHT; +} + +int main(int argc, char *argv[]) { +#ifndef __ANDROID__ + if (argc == 2 && !strcmp("-f", argv[1])) trace_funcs = 1; +#endif + lorie_start(); + return 0; +} diff --git a/backend.h b/app/src/main/jni/lorie/backend.h similarity index 86% rename from backend.h rename to app/src/main/jni/lorie/backend.h index 024004d..3828ee4 100644 --- a/backend.h +++ b/app/src/main/jni/lorie/backend.h @@ -1,5 +1,6 @@ #include #include +#include struct modifier_state { uint32_t depressed, latched, locked, group; @@ -22,5 +23,6 @@ void backend_dispatch_nonblocking (void); void backend_wait_for_events (int wayland_fd); void backend_get_keymap (int *fd, int *size); long backend_get_timestamp (void); +void backend_get_dimensions(uint32_t *width, uint32_t *height); -void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * data); +void lorie_start(void); diff --git a/app/src/main/jni/lorie/interfaces.h b/app/src/main/jni/lorie/interfaces.h new file mode 100644 index 0000000..ff79477 --- /dev/null +++ b/app/src/main/jni/lorie/interfaces.h @@ -0,0 +1,56 @@ +#include + +static void no_op_func(void) {} +#define NO_OP(type) ((type) &no_op_func) + +// wl_region +typedef void (*wl_region_destroy_t)(struct wl_client *client, struct wl_resource *resource); +typedef void (*wl_region_add_t)(struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height); +typedef void (*wl_region_subtract_t) (struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height); + +// wl_shell_surface +typedef void (*wl_shell_surface_pong_t)(struct wl_client *client, struct wl_resource *resource, uint32_t serial); +typedef void (*wl_shell_surface_move_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat, uint32_t serial); +typedef void (*wl_shell_surface_resize_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat, uint32_t serial, uint32_t edges); +typedef void (*wl_shell_surface_set_toplevel_t)(struct wl_client *client, struct wl_resource *resource); +typedef void (*wl_shell_surface_set_transient_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *parent, int32_t x, int32_t y, uint32_t flags); +typedef void (*wl_shell_surface_set_fullscreen_t)(struct wl_client *client, struct wl_resource *resource, uint32_t method, uint32_t framerate, struct wl_resource *output); +typedef void (*wl_shell_surface_set_popup_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat, uint32_t serial, struct wl_resource *parent, int32_t x, int32_t y, uint32_t flags); +typedef void (*wl_shell_surface_set_maximized_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *output); +typedef void (*wl_shell_surface_set_title_t)(struct wl_client *client, struct wl_resource *resource, const char *title); +typedef void (*wl_shell_surface_set_class_t)(struct wl_client *client, struct wl_resource *resource, const char *class_); + +// wl_surface +typedef void (*wl_surface_destroy_t)(struct wl_client *client, struct wl_resource *resource); +typedef void (*wl_surface_attach_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *buffer, int32_t x, int32_t y); +typedef void (*wl_surface_damage_t)(struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height); +typedef void (*wl_surface_frame_t)(struct wl_client *client, struct wl_resource *resource, uint32_t callback); +typedef void (*wl_surface_set_opaque_region_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *region); +typedef void (*wl_surface_set_input_region_t)(struct wl_client *client, struct wl_resource *resource, struct wl_resource *region); +typedef void (*wl_surface_commit_t)(struct wl_client *client, struct wl_resource *resource); +typedef void (*wl_surface_set_buffer_transform_t)(struct wl_client *client, struct wl_resource *resource, int32_t transform); +typedef void (*wl_surface_set_buffer_scale_t)(struct wl_client *client, struct wl_resource *resource, int32_t scale); + +// wl_seat, wl_keyboard, wl_pointer +typedef void (*wl_seat_get_pointer_t)(struct wl_client *client, struct wl_resource *resource, uint32_t id); +typedef void (*wl_seat_get_keyboard_t)(struct wl_client *client, struct wl_resource *resource, uint32_t id); +typedef void (*wl_seat_get_touch_t)(struct wl_client *client, struct wl_resource *resource, uint32_t id); +typedef void (*wl_pointer_set_cursor_t)(struct wl_client *client, struct wl_resource *resource, uint32_t serial, struct wl_resource *_surface, int32_t hotspot_x, int32_t hotspot_y); +typedef void (*wl_pointer_release_t)(struct wl_client *client, struct wl_resource *resource); +typedef void (*wl_keyboard_release_t)(struct wl_client *client, struct wl_resource *resource); + +// No op interfaces +static struct wl_region_interface lorie_region_interface = {NO_OP(wl_region_destroy_t), NO_OP(wl_region_add_t), NO_OP(wl_region_subtract_t)}; +static struct wl_pointer_interface lorie_pointer_interface = {NO_OP(wl_pointer_set_cursor_t), NO_OP(wl_pointer_release_t)}; +static struct wl_keyboard_interface lorie_keyboard_interface = {NO_OP(wl_keyboard_release_t)}; + +#define BINDFUNC(interface, version, implementation) \ + static void interface##_bind (struct wl_client *client, void *data, uint32_t _version, uint32_t id) { \ + LOGD("bind: " #interface); \ + struct wl_resource *resource = wl_resource_create (client, &interface##_interface, version, id); \ + if (resource == NULL) { \ + wl_client_post_no_memory(client); \ + return; \ + } \ + wl_resource_set_implementation (resource, &implementation, NULL, NULL); \ + } diff --git a/log.h b/app/src/main/jni/lorie/log.h similarity index 54% rename from log.h rename to app/src/main/jni/lorie/log.h index 7014c38..ae7a4b5 100644 --- a/log.h +++ b/app/src/main/jni/lorie/log.h @@ -32,3 +32,25 @@ #endif #define DBG LOGD("Here! %s %d", __FILE__, __LINE__) + +extern int trace_funcs; +#if defined(TRACE_FUNCS) && !defined(__ANDROID__) +#include +#include +void __attribute__((no_instrument_function)) +__cyg_profile_func_enter (void *func, void *caller) { + if (!trace_funcs) return; + Dl_info info; + if (dladdr(func, &info)) + LOGD ("enter %p [%s] %s\n", func, (info.dli_fname) ? info.dli_fname : "?", info.dli_sname ? info.dli_sname : "?"); +} +void __attribute__((no_instrument_function)) +__cyg_profile_func_exit (void *func, void *caller) { + if (!trace_funcs) return; + Dl_info info; + if (dladdr(func, &info)) + LOGD ("leave %p [%s] %s\n", func, (info.dli_fname) ? info.dli_fname : "?", info.dli_sname ? info.dli_sname : "?"); +} + +#define static // backtrace do not report static function names +#endif diff --git a/main.c b/app/src/main/jni/lorie/main.c similarity index 65% rename from main.c rename to app/src/main/jni/lorie/main.c index 44cd04a..21fe64f 100644 --- a/main.c +++ b/app/src/main/jni/lorie/main.c @@ -1,67 +1,14 @@ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#ifndef __USE_GNU -#define __USE_GNU -#endif - -#include -#include -#include -#include #include #include #include #include -#include #include -#include #include "backend.h" #include "renderer.h" +#include "interfaces.h" #include "log.h" -bool trace_funcs = false; - -void __attribute__((no_instrument_function)) -__cyg_profile_func_enter (void *func, void *caller) { - if (!trace_funcs) return; - Dl_info info; - if (dladdr(func, &info)) - LOGD ("enter %p [%s] %s\n", func, (info.dli_fname) ? info.dli_fname : "?", info.dli_sname ? info.dli_sname : "?"); -} -void __attribute__((no_instrument_function)) -__cyg_profile_func_exit (void *func, void *caller) { - if (!trace_funcs) return; - Dl_info info; - if (dladdr(func, &info)) - LOGD ("leave %p [%s] %s\n", func, (info.dli_fname) ? info.dli_fname : "?", info.dli_sname ? info.dli_sname : "?"); -} - -#define static // backtrace do not report static function names - -void handler(int sig) { - void *array[10]; - size_t size; - - // get void*'s for all entries on the stack - size = backtrace(array, 10); - - // print out all the frames to stderr - fprintf(stderr, "Error: signal %d:\n", sig); - backtrace_symbols_fd(array, size, STDERR_FILENO); - exit(1); -} - -#define BINDFUNC(interface, version, implementation) \ - static void interface##_bind (struct wl_client *client, void *data, uint32_t _version, uint32_t id) { \ - LOGD("bind: " #interface); \ - struct wl_resource *resource = wl_resource_create (client, &interface##_interface, version, id); \ - if (resource == NULL) { \ - wl_client_post_no_memory(client); \ - return; \ - } \ - wl_resource_set_implementation (resource, &implementation, NULL, NULL); \ - } +int trace_funcs = 0; struct lorie_composiror { struct wl_display *display; @@ -102,10 +49,8 @@ static struct client *get_client (struct wl_client *_client) { struct surface { struct wl_resource *surface; - //struct wl_resource *xdg_surface; struct wl_resource *buffer; struct wl_resource *frame_callback; - //int x, y; struct texture *texture; struct client *client; struct shell_surface *shell_surface; @@ -129,14 +74,7 @@ struct lorie_client { void *null = NULL; -// region -/*No op*/ static void region_destroy (struct wl_client *client, struct wl_resource *resource) {} -/*No op*/ static void region_add (struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) {} -/*No op*/ static void region_subtract (struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) {} -/*No op*/ static struct wl_region_interface region_interface = {®ion_destroy, ®ion_add, ®ion_subtract}; - // surface -/*No op*/ static void surface_destroy (struct wl_client *client, struct wl_resource *resource) {} static void surface_attach (struct wl_client *client, struct wl_resource *resource, struct wl_resource *buffer, int32_t x, int32_t y) { struct surface *surface = wl_resource_get_user_data (resource); surface->buffer = buffer; @@ -146,9 +84,10 @@ static void surface_attach (struct wl_client *client, struct wl_resource *resour surface->width = surface->height = 0; return; } + surface->width = wl_shm_buffer_get_width (shm_buffer); surface->height = wl_shm_buffer_get_height (shm_buffer); - + if (!surface->texture || surface->texture->width != surface->width || surface->texture->height != surface->height) { @@ -173,8 +112,6 @@ static void surface_frame (struct wl_client *client, struct wl_resource *resourc struct surface *surface = wl_resource_get_user_data (resource); surface->frame_callback = wl_resource_create (client, &wl_callback_interface, 1, callback); } -/*No op*/ static void surface_set_opaque_region (struct wl_client *client, struct wl_resource *resource, struct wl_resource *region) {} -/*No op*/ static void surface_set_input_region (struct wl_client *client, struct wl_resource *resource, struct wl_resource *region) {} static void surface_commit (struct wl_client *client, struct wl_resource *resource) { struct surface *surface = wl_resource_get_user_data (resource); if (!surface || !surface->buffer) return; @@ -193,8 +130,6 @@ static void surface_commit (struct wl_client *client, struct wl_resource *resour surface->frame_callback = NULL; } } -/*No op*/ static void surface_set_buffer_transform (struct wl_client *client, struct wl_resource *resource, int32_t transform) {} -/*No op*/ static void surface_set_buffer_scale (struct wl_client *client, struct wl_resource *resource, int32_t scale) {} static void surface_delete (struct wl_resource *resource) { struct surface *surface = wl_resource_get_user_data (resource); if (c.toplevel == surface) c.toplevel = NULL; @@ -202,7 +137,7 @@ static void surface_delete (struct wl_resource *resource) { texture_destroy(&surface->texture); free (surface); } -static struct wl_surface_interface surface_interface = {&surface_destroy, &surface_attach, &surface_damage, &surface_frame, &surface_set_opaque_region, &surface_set_input_region, &surface_commit, &surface_set_buffer_transform, &surface_set_buffer_scale}; +static struct wl_surface_interface surface_interface = {NO_OP(wl_surface_destroy_t), surface_attach, surface_damage, surface_frame, NO_OP(wl_surface_set_opaque_region_t), NO_OP(wl_surface_set_input_region_t), surface_commit, NO_OP(wl_surface_set_buffer_transform_t), NO_OP(wl_surface_set_buffer_scale_t)}; // compositor static void compositor_create_surface (struct wl_client *client, struct wl_resource *resource, uint32_t id) { @@ -214,32 +149,23 @@ static void compositor_create_surface (struct wl_client *client, struct wl_resou } static void compositor_create_region (struct wl_client *client, struct wl_resource *resource, uint32_t id) { struct wl_resource *region = wl_resource_create (client, &wl_region_interface, 1, id); - wl_resource_set_implementation (region, ®ion_interface, NULL, NULL); + wl_resource_set_implementation (region, &lorie_region_interface, NULL, NULL); } static struct wl_compositor_interface compositor_interface = {&compositor_create_surface, &compositor_create_region}; BINDFUNC(wl_compositor, 4, compositor_interface); // shell surface -/*No op*/ static void shell_surface_pong (struct wl_client *client, struct wl_resource *resource, uint32_t serial) {} -/*No op*/ static void shell_surface_move (struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat, uint32_t serial) {} -/*No op*/ static void shell_surface_resize (struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat, uint32_t serial, uint32_t edges) {} static void shell_surface_set_toplevel (struct wl_client *client, struct wl_resource *resource) { struct shell_surface *shell_surface = wl_resource_get_user_data (resource); c.toplevel = shell_surface->surface; wl_shell_surface_send_configure(shell_surface->shell_surface, 0, c.width, c.height); } -/*No op*/ static void shell_surface_set_transient (struct wl_client *client, struct wl_resource *resource, struct wl_resource *parent, int32_t x, int32_t y, uint32_t flags) {} -/*No op*/ static void shell_surface_set_fullscreen (struct wl_client *client, struct wl_resource *resource, uint32_t method, uint32_t framerate, struct wl_resource *output) {} -/*No op*/ static void shell_surface_set_popup (struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat, uint32_t serial, struct wl_resource *parent, int32_t x, int32_t y, uint32_t flags) {} -/*No op*/ static void shell_surface_set_maximized (struct wl_client *client, struct wl_resource *resource, struct wl_resource *output) {} -/*No op*/ static void shell_surface_set_title (struct wl_client *client, struct wl_resource *resource, const char *title) {} -/*No op*/ static void shell_surface_set_class (struct wl_client *client, struct wl_resource *resource, const char *class_) {} -static struct wl_shell_surface_interface shell_surface_interface = {&shell_surface_pong, &shell_surface_move, &shell_surface_resize, &shell_surface_set_toplevel, &shell_surface_set_transient, &shell_surface_set_fullscreen, &shell_surface_set_popup, &shell_surface_set_maximized, &shell_surface_set_title, &shell_surface_set_class}; +static struct wl_shell_surface_interface shell_surface_interface = {NO_OP(wl_shell_surface_pong_t), NO_OP(wl_shell_surface_move_t), NO_OP(wl_shell_surface_resize_t), shell_surface_set_toplevel, NO_OP(wl_shell_surface_set_transient_t), NO_OP(wl_shell_surface_set_fullscreen_t), NO_OP(wl_shell_surface_set_popup_t), NO_OP(wl_shell_surface_set_maximized_t), NO_OP(wl_shell_surface_set_title_t), NO_OP(wl_shell_surface_set_class_t)}; // wl shell static void shell_get_shell_surface (struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *res_surface) { - struct shell_surface *shell_surface = calloc (1, sizeof(struct surface)); + struct shell_surface *shell_surface = calloc (1, sizeof(struct shell_surface)); struct surface *surface = wl_resource_get_user_data (res_surface); shell_surface->shell_surface = wl_resource_create (client, &wl_shell_surface_interface, 1, id); wl_resource_set_implementation (shell_surface->shell_surface, &shell_surface_interface, shell_surface, NULL); @@ -249,35 +175,22 @@ static void shell_get_shell_surface (struct wl_client *client, struct wl_resourc static struct wl_shell_interface shell_interface = {&shell_get_shell_surface}; BINDFUNC(wl_shell, 1, shell_interface); -// pointer -static void pointer_set_cursor (struct wl_client *client, struct wl_resource *resource, uint32_t serial, struct wl_resource *_surface, int32_t hotspot_x, int32_t hotspot_y) { - //struct surface *surface = wl_resource_get_user_data (_surface); - //cursor = surface; -} -/*No op*/ static void pointer_release (struct wl_client *client, struct wl_resource *resource) {} -/*No op*/ static struct wl_pointer_interface pointer_interface = {&pointer_set_cursor, &pointer_release}; - -// keyboard -/*No op*/ static void keyboard_release (struct wl_client *client, struct wl_resource *resource) {} -/*No op*/ static struct wl_keyboard_interface keyboard_interface = {&keyboard_release}; - // seat static void seat_get_pointer (struct wl_client *client, struct wl_resource *resource, uint32_t id) { struct wl_resource *pointer = wl_resource_create (client, &wl_pointer_interface, 7, id); - wl_resource_set_implementation (pointer, &pointer_interface, NULL, NULL); + wl_resource_set_implementation (pointer, &lorie_pointer_interface, NULL, NULL); get_client(client)->pointer = pointer; } static void seat_get_keyboard (struct wl_client *client, struct wl_resource *resource, uint32_t id) { struct wl_resource *keyboard = wl_resource_create (client, &wl_keyboard_interface, 7, id); - wl_resource_set_implementation (keyboard, &keyboard_interface, NULL, NULL); + wl_resource_set_implementation (keyboard, &lorie_keyboard_interface, NULL, NULL); //get_client(client)->keyboard = keyboard; //int fd, size; //backend_get_keymap (&fd, &size); //wl_keyboard_send_keymap (keyboard, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, fd, size); //close (fd); } -/*No op*/ static void seat_get_touch (struct wl_client *client, struct wl_resource *resource, uint32_t id) {} -static struct wl_seat_interface seat_interface = {&seat_get_pointer, &seat_get_keyboard, &seat_get_touch}; +static struct wl_seat_interface seat_interface = {&seat_get_pointer, &seat_get_keyboard, NO_OP(wl_seat_get_touch_t)}; static void wl_seat_bind (struct wl_client *client, void *data, uint32_t version, uint32_t id) { LOGD("bind: wl_seat"); struct wl_resource *seat = wl_resource_create (client, &wl_seat_interface, 7, id); @@ -327,16 +240,13 @@ wl_output_bind(struct wl_client *client, void *data, uint32_t version, uint32_t // backend callbacks static void handle_resize_event (int width, int height) { - //glViewport(0, 0, width, height); + if (width == c.width && height == c.height) return; + glViewport(0, 0, width, height); c.width = width; c.height = height; if (c.wl_output) { wl_output_send_mode(c.wl_output, 3, width, height, 60000); wl_output_send_done(c.wl_output); - if (c.toplevel && c.toplevel->client->pointer) { - wl_pointer_send_leave(c.toplevel->client->pointer, 0, c.toplevel->surface); - wl_pointer_send_enter (c.toplevel->client->pointer, 0, c.toplevel->surface, 0, 0); - } if (c.toplevel && c.toplevel->shell_surface) { wl_shell_surface_send_configure(c.toplevel->shell_surface->shell_surface, 0, width, height); @@ -363,6 +273,7 @@ static void handle_mouse_motion_event (int x, int y) { } } static void handle_mouse_button_event (int button, int state) { + LOGD("Surface button: button %d, state %d", button, state); if (!c.toplevel || !c.toplevel->client->pointer) return; wl_pointer_send_button (c.toplevel->client->pointer, 0, backend_get_timestamp(), button, state); if (wl_resource_get_version(c.toplevel->client->pointer) >= @@ -397,18 +308,15 @@ static void draw (void) { c.redraw_needed = false; } -int main(int argc, char *argv[]) { - if (argc == 2 && !strcmp("-f", argv[1])) trace_funcs = true; +void lorie_start(void) { LOGV("Starting lorie server"); - signal(SIGSEGV, handler); + backend_init (&callbacks); - //setenv("WAYLAND_DEBUG", "1", 1); memset(&c, 0, sizeof(c)); wl_list_init (&c.clients); wl_list_init (&c.surfaces); wl_list_init (&c.shell_surfaces); - c.width = 1024; - c.height = 600; + backend_get_dimensions(&c.width, &c.height); c.running = true; c.display = wl_display_create (); wl_display_add_socket_auto (c.display); @@ -418,9 +326,9 @@ int main(int argc, char *argv[]) { wl_global_create (c.display, &wl_seat_interface, 4, NULL, &wl_seat_bind); wl_global_create (c.display, &wl_output_interface, 3, NULL, &wl_output_bind); wl_display_init_shm (c.display); - + c.renderer = renderer_create(); - + struct wl_event_loop *event_loop = wl_display_get_event_loop (c.display); int wayland_fd = wl_event_loop_get_fd (event_loop); while (c.running) { @@ -430,11 +338,9 @@ int main(int argc, char *argv[]) { if (c.redraw_needed) { draw (); } - // usleep(50000); backend_wait_for_events (wayland_fd); } - + wl_display_destroy (c.display); - return 0; } diff --git a/meson.build b/app/src/main/jni/lorie/meson.build similarity index 100% rename from meson.build rename to app/src/main/jni/lorie/meson.build diff --git a/renderer.c b/app/src/main/jni/lorie/renderer.c similarity index 99% rename from renderer.c rename to app/src/main/jni/lorie/renderer.c index 7305119..a73a0fa 100644 --- a/renderer.c +++ b/app/src/main/jni/lorie/renderer.c @@ -139,7 +139,7 @@ struct texture *texture_create(int width, int height) { return NULL; } - //LOGD("Creating %dx%d texture", width, height); + LOGD("Creating %dx%d texture", width, height); glActiveTexture(GL_TEXTURE0); glGenTextures(1, &texture->id); diff --git a/renderer.h b/app/src/main/jni/lorie/renderer.h similarity index 100% rename from renderer.h rename to app/src/main/jni/lorie/renderer.h diff --git a/test_xwayland b/app/src/main/jni/lorie/test_xwayland similarity index 100% rename from test_xwayland rename to app/src/main/jni/lorie/test_xwayland diff --git a/app/src/main/jni/prebuilt/Android.mk b/app/src/main/jni/prebuilt/Android.mk new file mode 100644 index 0000000..16b6f9c --- /dev/null +++ b/app/src/main/jni/prebuilt/Android.mk @@ -0,0 +1,18 @@ +LOCAL_PATH := $(call my-dir) + +# libs are prebuilt with termux +include $(CLEAR_VARS) +LOCAL_MODULE := android-support +LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := ffi +LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := wayland-server +LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include +include $(PREBUILT_SHARED_LIBRARY) diff --git a/app/src/main/jni/prebuilt/armeabi-v7a/libandroid-support.so b/app/src/main/jni/prebuilt/armeabi-v7a/libandroid-support.so new file mode 100755 index 0000000000000000000000000000000000000000..16494f55725df717d9773c6ab8c4b43015bd3da8 GIT binary patch literal 20820 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 Lo{o=U8CEdER^>r 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

>Ctd?~D>>bmWV31f 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 literal 0 HcmV?d00001 diff --git a/app/src/main/jni/prebuilt/include/wayland-server-core.h b/app/src/main/jni/prebuilt/include/wayland-server-core.h new file mode 100644 index 0000000..2e725d9 --- /dev/null +++ b/app/src/main/jni/prebuilt/include/wayland-server-core.h @@ -0,0 +1,665 @@ +/* + * Copyright © 2008 Kristian Høgsberg + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WAYLAND_SERVER_CORE_H +#define WAYLAND_SERVER_CORE_H + +#include +#include +#include +#include "wayland-util.h" +#include "wayland-version.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + WL_EVENT_READABLE = 0x01, + WL_EVENT_WRITABLE = 0x02, + WL_EVENT_HANGUP = 0x04, + WL_EVENT_ERROR = 0x08 +}; + +/** File descriptor dispatch function type + * + * Functions of this type are used as callbacks for file descriptor events. + * + * \param fd The file descriptor delivering the event. + * \param mask Describes the kind of the event as a bitwise-or of: + * \c WL_EVENT_READABLE, \c WL_EVENT_WRITABLE, \c WL_EVENT_HANGUP, + * \c WL_EVENT_ERROR. + * \param data The user data argument of the related wl_event_loop_add_fd() + * call. + * \return If the event source is registered for re-check with + * wl_event_source_check(): 0 for all done, 1 for needing a re-check. + * If not registered, the return value is ignored and should be zero. + * + * \sa wl_event_loop_add_fd() + * \memberof wl_event_source + */ +typedef int (*wl_event_loop_fd_func_t)(int fd, uint32_t mask, void *data); + +/** Timer dispatch function type + * + * Functions of this type are used as callbacks for timer expiry. + * + * \param data The user data argument of the related wl_event_loop_add_timer() + * call. + * \return If the event source is registered for re-check with + * wl_event_source_check(): 0 for all done, 1 for needing a re-check. + * If not registered, the return value is ignored and should be zero. + * + * \sa wl_event_loop_add_timer() + * \memberof wl_event_source + */ +typedef int (*wl_event_loop_timer_func_t)(void *data); + +/** Signal dispatch function type + * + * Functions of this type are used as callbacks for (POSIX) signals. + * + * \param signal_number + * \param data The user data argument of the related wl_event_loop_add_signal() + * call. + * \return If the event source is registered for re-check with + * wl_event_source_check(): 0 for all done, 1 for needing a re-check. + * If not registered, the return value is ignored and should be zero. + * + * \sa wl_event_loop_add_signal() + * \memberof wl_event_source + */ +typedef int (*wl_event_loop_signal_func_t)(int signal_number, void *data); + +/** Idle task function type + * + * Functions of this type are used as callbacks before blocking in + * wl_event_loop_dispatch(). + * + * \param data The user data argument of the related wl_event_loop_add_idle() + * call. + * + * \sa wl_event_loop_add_idle() wl_event_loop_dispatch() + * \memberof wl_event_source + */ +typedef void (*wl_event_loop_idle_func_t)(void *data); + +/** \struct wl_event_loop + * + * \brief An event loop context + * + * Usually you create an event loop context, add sources to it, and call + * wl_event_loop_dispatch() in a loop to process events. + * + * \sa wl_event_source + */ + +/** \struct wl_event_source + * + * \brief An abstract event source + * + * This is the generic type for fd, timer, signal, and idle sources. + * Functions that operate on specific source types must not be used with + * a different type, even if the function signature allows it. + */ + +struct wl_event_loop * +wl_event_loop_create(void); + +void +wl_event_loop_destroy(struct wl_event_loop *loop); + +struct wl_event_source * +wl_event_loop_add_fd(struct wl_event_loop *loop, + int fd, uint32_t mask, + wl_event_loop_fd_func_t func, + void *data); + +int +wl_event_source_fd_update(struct wl_event_source *source, uint32_t mask); + +struct wl_event_source * +wl_event_loop_add_timer(struct wl_event_loop *loop, + wl_event_loop_timer_func_t func, + void *data); + +struct wl_event_source * +wl_event_loop_add_signal(struct wl_event_loop *loop, + int signal_number, + wl_event_loop_signal_func_t func, + void *data); + +int +wl_event_source_timer_update(struct wl_event_source *source, + int ms_delay); + +int +wl_event_source_remove(struct wl_event_source *source); + +void +wl_event_source_check(struct wl_event_source *source); + +int +wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout); + +void +wl_event_loop_dispatch_idle(struct wl_event_loop *loop); + +struct wl_event_source * +wl_event_loop_add_idle(struct wl_event_loop *loop, + wl_event_loop_idle_func_t func, + void *data); + +int +wl_event_loop_get_fd(struct wl_event_loop *loop); + +struct wl_listener; + +typedef void (*wl_notify_func_t)(struct wl_listener *listener, void *data); + +void +wl_event_loop_add_destroy_listener(struct wl_event_loop *loop, + struct wl_listener *listener); + +struct wl_listener * +wl_event_loop_get_destroy_listener(struct wl_event_loop *loop, + wl_notify_func_t notify); + +struct wl_display * +wl_display_create(void); + +void +wl_display_destroy(struct wl_display *display); + +struct wl_event_loop * +wl_display_get_event_loop(struct wl_display *display); + +int +wl_display_add_socket(struct wl_display *display, const char *name); + +const char * +wl_display_add_socket_auto(struct wl_display *display); + +int +wl_display_add_socket_fd(struct wl_display *display, int sock_fd); + +void +wl_display_terminate(struct wl_display *display); + +void +wl_display_run(struct wl_display *display); + +void +wl_display_flush_clients(struct wl_display *display); + +void +wl_display_destroy_clients(struct wl_display *display); + +struct wl_client; + +typedef void (*wl_global_bind_func_t)(struct wl_client *client, void *data, + uint32_t version, uint32_t id); + +uint32_t +wl_display_get_serial(struct wl_display *display); + +uint32_t +wl_display_next_serial(struct wl_display *display); + +void +wl_display_add_destroy_listener(struct wl_display *display, + struct wl_listener *listener); + +void +wl_display_add_client_created_listener(struct wl_display *display, + struct wl_listener *listener); + +struct wl_listener * +wl_display_get_destroy_listener(struct wl_display *display, + wl_notify_func_t notify); + +struct wl_global * +wl_global_create(struct wl_display *display, + const struct wl_interface *interface, + int version, + void *data, wl_global_bind_func_t bind); + +void +wl_global_destroy(struct wl_global *global); + +/** A filter function for wl_global objects + * + * \param client The client object + * \param global The global object to show or hide + * \param data The user data pointer + * + * A filter function enables the server to decide which globals to + * advertise to each client. + * + * When a wl_global filter is set, the given callback funtion will be + * called during wl_global advertisment and binding. + * + * This function should return true if the global object should be made + * visible to the client or false otherwise. + */ +typedef bool (*wl_display_global_filter_func_t)(const struct wl_client *client, + const struct wl_global *global, + void *data); + +void +wl_display_set_global_filter(struct wl_display *display, + wl_display_global_filter_func_t filter, + void *data); + +const struct wl_interface * +wl_global_get_interface(const struct wl_global *global); + +void * +wl_global_get_user_data(const struct wl_global *global); + +struct wl_client * +wl_client_create(struct wl_display *display, int fd); + +struct wl_list * +wl_display_get_client_list(struct wl_display *display); + +struct wl_list * +wl_client_get_link(struct wl_client *client); + +struct wl_client * +wl_client_from_link(struct wl_list *link); + +/** Iterate over a list of clients. */ +#define wl_client_for_each(client, list) \ + for (client = wl_client_from_link((list)->next); \ + wl_client_get_link(client) != (list); \ + client = wl_client_from_link(wl_client_get_link(client)->next)) + +void +wl_client_destroy(struct wl_client *client); + +void +wl_client_flush(struct wl_client *client); + +void +wl_client_get_credentials(struct wl_client *client, + pid_t *pid, uid_t *uid, gid_t *gid); + +int +wl_client_get_fd(struct wl_client *client); + +void +wl_client_add_destroy_listener(struct wl_client *client, + struct wl_listener *listener); + +struct wl_listener * +wl_client_get_destroy_listener(struct wl_client *client, + wl_notify_func_t notify); + +struct wl_resource * +wl_client_get_object(struct wl_client *client, uint32_t id); + +void +wl_client_post_no_memory(struct wl_client *client); + +void +wl_client_add_resource_created_listener(struct wl_client *client, + struct wl_listener *listener); + +typedef enum wl_iterator_result (*wl_client_for_each_resource_iterator_func_t)( + struct wl_resource *resource, + void *user_data); + +void +wl_client_for_each_resource(struct wl_client *client, + wl_client_for_each_resource_iterator_func_t iterator, + void *user_data); + +/** \class wl_listener + * + * \brief A single listener for Wayland signals + * + * wl_listener provides the means to listen for wl_signal notifications. Many + * Wayland objects use wl_listener for notification of significant events like + * object destruction. + * + * Clients should create wl_listener objects manually and can register them as + * listeners to signals using #wl_signal_add, assuming the signal is + * directly accessible. For opaque structs like wl_event_loop, adding a + * listener should be done through provided accessor methods. A listener can + * only listen to one signal at a time. + * + * \code + * struct wl_listener your_listener; + * + * your_listener.notify = your_callback_method; + * + * // Direct access + * wl_signal_add(&some_object->destroy_signal, &your_listener); + * + * // Accessor access + * wl_event_loop *loop = ...; + * wl_event_loop_add_destroy_listener(loop, &your_listener); + * \endcode + * + * If the listener is part of a larger struct, #wl_container_of can be used + * to retrieve a pointer to it: + * + * \code + * void your_listener(struct wl_listener *listener, void *data) + * { + * struct your_data *data; + * + * your_data = wl_container_of(listener, data, your_member_name); + * } + * \endcode + * + * If you need to remove a listener from a signal, use wl_list_remove(). + * + * \code + * wl_list_remove(&your_listener.link); + * \endcode + * + * \sa wl_signal + */ +struct wl_listener { + struct wl_list link; + wl_notify_func_t notify; +}; + +/** \class wl_signal + * + * \brief A source of a type of observable event + * + * Signals are recognized points where significant events can be observed. + * Compositors as well as the server can provide signals. Observers are + * wl_listener's that are added through #wl_signal_add. Signals are emitted + * using #wl_signal_emit, which will invoke all listeners until that + * listener is removed by wl_list_remove() (or whenever the signal is + * destroyed). + * + * \sa wl_listener for more information on using wl_signal + */ +struct wl_signal { + struct wl_list listener_list; +}; + +/** Initialize a new \ref wl_signal for use. + * + * \param signal The signal that will be initialized + * + * \memberof wl_signal + */ +static inline void +wl_signal_init(struct wl_signal *signal) +{ + wl_list_init(&signal->listener_list); +} + +/** Add the specified listener to this signal. + * + * \param signal The signal that will emit events to the listener + * \param listener The listener to add + * + * \memberof wl_signal + */ +static inline void +wl_signal_add(struct wl_signal *signal, struct wl_listener *listener) +{ + wl_list_insert(signal->listener_list.prev, &listener->link); +} + +/** Gets the listener struct for the specified callback. + * + * \param signal The signal that contains the specified listener + * \param notify The listener that is the target of this search + * \return the list item that corresponds to the specified listener, or NULL + * if none was found + * + * \memberof wl_signal + */ +static inline struct wl_listener * +wl_signal_get(struct wl_signal *signal, wl_notify_func_t notify) +{ + struct wl_listener *l; + + wl_list_for_each(l, &signal->listener_list, link) + if (l->notify == notify) + return l; + + return NULL; +} + +/** Emits this signal, notifying all registered listeners. + * + * \param signal The signal object that will emit the signal + * \param data The data that will be emitted with the signal + * + * \memberof wl_signal + */ +static inline void +wl_signal_emit(struct wl_signal *signal, void *data) +{ + struct wl_listener *l, *next; + + wl_list_for_each_safe(l, next, &signal->listener_list, link) + l->notify(l, data); +} + +typedef void (*wl_resource_destroy_func_t)(struct wl_resource *resource); + +/* + * Post an event to the client's object referred to by 'resource'. + * 'opcode' is the event number generated from the protocol XML + * description (the event name). The variable arguments are the event + * parameters, in the order they appear in the protocol XML specification. + * + * The variable arguments' types are: + * - type=uint: uint32_t + * - type=int: int32_t + * - type=fixed: wl_fixed_t + * - type=string: (const char *) to a nil-terminated string + * - type=array: (struct wl_array *) + * - type=fd: int, that is an open file descriptor + * - type=new_id: (struct wl_object *) or (struct wl_resource *) + * - type=object: (struct wl_object *) or (struct wl_resource *) + */ +void +wl_resource_post_event(struct wl_resource *resource, + uint32_t opcode, ...); + +void +wl_resource_post_event_array(struct wl_resource *resource, + uint32_t opcode, union wl_argument *args); + +void +wl_resource_queue_event(struct wl_resource *resource, + uint32_t opcode, ...); + +void +wl_resource_queue_event_array(struct wl_resource *resource, + uint32_t opcode, union wl_argument *args); + +/* msg is a printf format string, variable args are its args. */ +void +wl_resource_post_error(struct wl_resource *resource, + uint32_t code, const char *msg, ...) WL_PRINTF(3, 4); + +void +wl_resource_post_no_memory(struct wl_resource *resource); + +struct wl_display * +wl_client_get_display(struct wl_client *client); + +struct wl_resource * +wl_resource_create(struct wl_client *client, + const struct wl_interface *interface, + int version, uint32_t id); + +void +wl_resource_set_implementation(struct wl_resource *resource, + const void *implementation, + void *data, + wl_resource_destroy_func_t destroy); + +void +wl_resource_set_dispatcher(struct wl_resource *resource, + wl_dispatcher_func_t dispatcher, + const void *implementation, + void *data, + wl_resource_destroy_func_t destroy); + +void +wl_resource_destroy(struct wl_resource *resource); + +uint32_t +wl_resource_get_id(struct wl_resource *resource); + +struct wl_list * +wl_resource_get_link(struct wl_resource *resource); + +struct wl_resource * +wl_resource_from_link(struct wl_list *resource); + +struct wl_resource * +wl_resource_find_for_client(struct wl_list *list, struct wl_client *client); + +struct wl_client * +wl_resource_get_client(struct wl_resource *resource); + +void +wl_resource_set_user_data(struct wl_resource *resource, void *data); + +void * +wl_resource_get_user_data(struct wl_resource *resource); + +int +wl_resource_get_version(struct wl_resource *resource); + +void +wl_resource_set_destructor(struct wl_resource *resource, + wl_resource_destroy_func_t destroy); + +int +wl_resource_instance_of(struct wl_resource *resource, + const struct wl_interface *interface, + const void *implementation); +const char * +wl_resource_get_class(struct wl_resource *resource); + +void +wl_resource_add_destroy_listener(struct wl_resource *resource, + struct wl_listener *listener); + +struct wl_listener * +wl_resource_get_destroy_listener(struct wl_resource *resource, + wl_notify_func_t notify); + +#define wl_resource_for_each(resource, list) \ + for (resource = 0, resource = wl_resource_from_link((list)->next); \ + wl_resource_get_link(resource) != (list); \ + resource = wl_resource_from_link(wl_resource_get_link(resource)->next)) + +#define wl_resource_for_each_safe(resource, tmp, list) \ + for (resource = 0, tmp = 0, \ + resource = wl_resource_from_link((list)->next), \ + tmp = wl_resource_from_link((list)->next->next); \ + wl_resource_get_link(resource) != (list); \ + resource = tmp, \ + tmp = wl_resource_from_link(wl_resource_get_link(resource)->next)) + +struct wl_shm_buffer * +wl_shm_buffer_get(struct wl_resource *resource); + +void +wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer); + +void +wl_shm_buffer_end_access(struct wl_shm_buffer *buffer); + +void * +wl_shm_buffer_get_data(struct wl_shm_buffer *buffer); + +int32_t +wl_shm_buffer_get_stride(struct wl_shm_buffer *buffer); + +uint32_t +wl_shm_buffer_get_format(struct wl_shm_buffer *buffer); + +int32_t +wl_shm_buffer_get_width(struct wl_shm_buffer *buffer); + +int32_t +wl_shm_buffer_get_height(struct wl_shm_buffer *buffer); + +struct wl_shm_pool * +wl_shm_buffer_ref_pool(struct wl_shm_buffer *buffer); + +void +wl_shm_pool_unref(struct wl_shm_pool *pool); + +int +wl_display_init_shm(struct wl_display *display); + +uint32_t * +wl_display_add_shm_format(struct wl_display *display, uint32_t format); + +struct wl_shm_buffer * +wl_shm_buffer_create(struct wl_client *client, + uint32_t id, int32_t width, int32_t height, + int32_t stride, uint32_t format) WL_DEPRECATED; + +void +wl_log_set_handler_server(wl_log_func_t handler); + +enum wl_protocol_logger_type { + WL_PROTOCOL_LOGGER_REQUEST, + WL_PROTOCOL_LOGGER_EVENT, +}; + +struct wl_protocol_logger_message { + struct wl_resource *resource; + int message_opcode; + const struct wl_message *message; + int arguments_count; + const union wl_argument *arguments; +}; + +typedef void (*wl_protocol_logger_func_t)(void *user_data, + enum wl_protocol_logger_type direction, + const struct wl_protocol_logger_message *message); + +struct wl_protocol_logger * +wl_display_add_protocol_logger(struct wl_display *display, + wl_protocol_logger_func_t, void *user_data); + +void +wl_protocol_logger_destroy(struct wl_protocol_logger *logger); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/app/src/main/jni/prebuilt/include/wayland-server-protocol.h b/app/src/main/jni/prebuilt/include/wayland-server-protocol.h new file mode 100644 index 0000000..36e00db --- /dev/null +++ b/app/src/main/jni/prebuilt/include/wayland-server-protocol.h @@ -0,0 +1,4357 @@ +/* Generated by wayland-scanner 1.16.0 */ + +#ifndef WAYLAND_SERVER_PROTOCOL_H +#define WAYLAND_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_wayland The wayland protocol + * @section page_ifaces_wayland Interfaces + * - @subpage page_iface_wl_display - core global object + * - @subpage page_iface_wl_registry - global registry object + * - @subpage page_iface_wl_callback - callback object + * - @subpage page_iface_wl_compositor - the compositor singleton + * - @subpage page_iface_wl_shm_pool - a shared memory pool + * - @subpage page_iface_wl_shm - shared memory support + * - @subpage page_iface_wl_buffer - content for a wl_surface + * - @subpage page_iface_wl_data_offer - offer to transfer data + * - @subpage page_iface_wl_data_source - offer to transfer data + * - @subpage page_iface_wl_data_device - data transfer device + * - @subpage page_iface_wl_data_device_manager - data transfer interface + * - @subpage page_iface_wl_shell - create desktop-style surfaces + * - @subpage page_iface_wl_shell_surface - desktop-style metadata interface + * - @subpage page_iface_wl_surface - an onscreen surface + * - @subpage page_iface_wl_seat - group of input devices + * - @subpage page_iface_wl_pointer - pointer input device + * - @subpage page_iface_wl_keyboard - keyboard input device + * - @subpage page_iface_wl_touch - touchscreen input device + * - @subpage page_iface_wl_output - compositor output region + * - @subpage page_iface_wl_region - region interface + * - @subpage page_iface_wl_subcompositor - sub-surface compositing + * - @subpage page_iface_wl_subsurface - sub-surface interface to a wl_surface + * @section page_copyright_wayland Copyright + *

+ *
+ * Copyright © 2008-2011 Kristian Høgsberg
+ * Copyright © 2010-2011 Intel Corporation
+ * Copyright © 2012-2013 Collabora, Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ * 
+ */ +struct wl_buffer; +struct wl_callback; +struct wl_compositor; +struct wl_data_device; +struct wl_data_device_manager; +struct wl_data_offer; +struct wl_data_source; +struct wl_display; +struct wl_keyboard; +struct wl_output; +struct wl_pointer; +struct wl_region; +struct wl_registry; +struct wl_seat; +struct wl_shell; +struct wl_shell_surface; +struct wl_shm; +struct wl_shm_pool; +struct wl_subcompositor; +struct wl_subsurface; +struct wl_surface; +struct wl_touch; + +/** + * @page page_iface_wl_display wl_display + * @section page_iface_wl_display_desc Description + * + * The core global object. This is a special singleton object. It + * is used for internal Wayland protocol features. + * @section page_iface_wl_display_api API + * See @ref iface_wl_display. + */ +/** + * @defgroup iface_wl_display The wl_display interface + * + * The core global object. This is a special singleton object. It + * is used for internal Wayland protocol features. + */ +extern const struct wl_interface wl_display_interface; +/** + * @page page_iface_wl_registry wl_registry + * @section page_iface_wl_registry_desc Description + * + * The singleton global registry object. The server has a number of + * global objects that are available to all clients. These objects + * typically represent an actual object in the server (for example, + * an input device) or they are singleton objects that provide + * extension functionality. + * + * When a client creates a registry object, the registry object + * will emit a global event for each global currently in the + * registry. Globals come and go as a result of device or + * monitor hotplugs, reconfiguration or other events, and the + * registry will send out global and global_remove events to + * keep the client up to date with the changes. To mark the end + * of the initial burst of events, the client can use the + * wl_display.sync request immediately after calling + * wl_display.get_registry. + * + * A client can bind to a global object by using the bind + * request. This creates a client-side handle that lets the object + * emit events to the client and lets the client invoke requests on + * the object. + * @section page_iface_wl_registry_api API + * See @ref iface_wl_registry. + */ +/** + * @defgroup iface_wl_registry The wl_registry interface + * + * The singleton global registry object. The server has a number of + * global objects that are available to all clients. These objects + * typically represent an actual object in the server (for example, + * an input device) or they are singleton objects that provide + * extension functionality. + * + * When a client creates a registry object, the registry object + * will emit a global event for each global currently in the + * registry. Globals come and go as a result of device or + * monitor hotplugs, reconfiguration or other events, and the + * registry will send out global and global_remove events to + * keep the client up to date with the changes. To mark the end + * of the initial burst of events, the client can use the + * wl_display.sync request immediately after calling + * wl_display.get_registry. + * + * A client can bind to a global object by using the bind + * request. This creates a client-side handle that lets the object + * emit events to the client and lets the client invoke requests on + * the object. + */ +extern const struct wl_interface wl_registry_interface; +/** + * @page page_iface_wl_callback wl_callback + * @section page_iface_wl_callback_desc Description + * + * Clients can handle the 'done' event to get notified when + * the related request is done. + * @section page_iface_wl_callback_api API + * See @ref iface_wl_callback. + */ +/** + * @defgroup iface_wl_callback The wl_callback interface + * + * Clients can handle the 'done' event to get notified when + * the related request is done. + */ +extern const struct wl_interface wl_callback_interface; +/** + * @page page_iface_wl_compositor wl_compositor + * @section page_iface_wl_compositor_desc Description + * + * A compositor. This object is a singleton global. The + * compositor is in charge of combining the contents of multiple + * surfaces into one displayable output. + * @section page_iface_wl_compositor_api API + * See @ref iface_wl_compositor. + */ +/** + * @defgroup iface_wl_compositor The wl_compositor interface + * + * A compositor. This object is a singleton global. The + * compositor is in charge of combining the contents of multiple + * surfaces into one displayable output. + */ +extern const struct wl_interface wl_compositor_interface; +/** + * @page page_iface_wl_shm_pool wl_shm_pool + * @section page_iface_wl_shm_pool_desc Description + * + * The wl_shm_pool object encapsulates a piece of memory shared + * between the compositor and client. Through the wl_shm_pool + * object, the client can allocate shared memory wl_buffer objects. + * All objects created through the same pool share the same + * underlying mapped memory. Reusing the mapped memory avoids the + * setup/teardown overhead and is useful when interactively resizing + * a surface or for many small buffers. + * @section page_iface_wl_shm_pool_api API + * See @ref iface_wl_shm_pool. + */ +/** + * @defgroup iface_wl_shm_pool The wl_shm_pool interface + * + * The wl_shm_pool object encapsulates a piece of memory shared + * between the compositor and client. Through the wl_shm_pool + * object, the client can allocate shared memory wl_buffer objects. + * All objects created through the same pool share the same + * underlying mapped memory. Reusing the mapped memory avoids the + * setup/teardown overhead and is useful when interactively resizing + * a surface or for many small buffers. + */ +extern const struct wl_interface wl_shm_pool_interface; +/** + * @page page_iface_wl_shm wl_shm + * @section page_iface_wl_shm_desc Description + * + * A singleton global object that provides support for shared + * memory. + * + * Clients can create wl_shm_pool objects using the create_pool + * request. + * + * At connection setup time, the wl_shm object emits one or more + * format events to inform clients about the valid pixel formats + * that can be used for buffers. + * @section page_iface_wl_shm_api API + * See @ref iface_wl_shm. + */ +/** + * @defgroup iface_wl_shm The wl_shm interface + * + * A singleton global object that provides support for shared + * memory. + * + * Clients can create wl_shm_pool objects using the create_pool + * request. + * + * At connection setup time, the wl_shm object emits one or more + * format events to inform clients about the valid pixel formats + * that can be used for buffers. + */ +extern const struct wl_interface wl_shm_interface; +/** + * @page page_iface_wl_buffer wl_buffer + * @section page_iface_wl_buffer_desc Description + * + * A buffer provides the content for a wl_surface. Buffers are + * created through factory interfaces such as wl_drm, wl_shm or + * similar. It has a width and a height and can be attached to a + * wl_surface, but the mechanism by which a client provides and + * updates the contents is defined by the buffer factory interface. + * @section page_iface_wl_buffer_api API + * See @ref iface_wl_buffer. + */ +/** + * @defgroup iface_wl_buffer The wl_buffer interface + * + * A buffer provides the content for a wl_surface. Buffers are + * created through factory interfaces such as wl_drm, wl_shm or + * similar. It has a width and a height and can be attached to a + * wl_surface, but the mechanism by which a client provides and + * updates the contents is defined by the buffer factory interface. + */ +extern const struct wl_interface wl_buffer_interface; +/** + * @page page_iface_wl_data_offer wl_data_offer + * @section page_iface_wl_data_offer_desc Description + * + * A wl_data_offer represents a piece of data offered for transfer + * by another client (the source client). It is used by the + * copy-and-paste and drag-and-drop mechanisms. The offer + * describes the different mime types that the data can be + * converted to and provides the mechanism for transferring the + * data directly from the source client. + * @section page_iface_wl_data_offer_api API + * See @ref iface_wl_data_offer. + */ +/** + * @defgroup iface_wl_data_offer The wl_data_offer interface + * + * A wl_data_offer represents a piece of data offered for transfer + * by another client (the source client). It is used by the + * copy-and-paste and drag-and-drop mechanisms. The offer + * describes the different mime types that the data can be + * converted to and provides the mechanism for transferring the + * data directly from the source client. + */ +extern const struct wl_interface wl_data_offer_interface; +/** + * @page page_iface_wl_data_source wl_data_source + * @section page_iface_wl_data_source_desc Description + * + * The wl_data_source object is the source side of a wl_data_offer. + * It is created by the source client in a data transfer and + * provides a way to describe the offered data and a way to respond + * to requests to transfer the data. + * @section page_iface_wl_data_source_api API + * See @ref iface_wl_data_source. + */ +/** + * @defgroup iface_wl_data_source The wl_data_source interface + * + * The wl_data_source object is the source side of a wl_data_offer. + * It is created by the source client in a data transfer and + * provides a way to describe the offered data and a way to respond + * to requests to transfer the data. + */ +extern const struct wl_interface wl_data_source_interface; +/** + * @page page_iface_wl_data_device wl_data_device + * @section page_iface_wl_data_device_desc Description + * + * There is one wl_data_device per seat which can be obtained + * from the global wl_data_device_manager singleton. + * + * A wl_data_device provides access to inter-client data transfer + * mechanisms such as copy-and-paste and drag-and-drop. + * @section page_iface_wl_data_device_api API + * See @ref iface_wl_data_device. + */ +/** + * @defgroup iface_wl_data_device The wl_data_device interface + * + * There is one wl_data_device per seat which can be obtained + * from the global wl_data_device_manager singleton. + * + * A wl_data_device provides access to inter-client data transfer + * mechanisms such as copy-and-paste and drag-and-drop. + */ +extern const struct wl_interface wl_data_device_interface; +/** + * @page page_iface_wl_data_device_manager wl_data_device_manager + * @section page_iface_wl_data_device_manager_desc Description + * + * The wl_data_device_manager is a singleton global object that + * provides access to inter-client data transfer mechanisms such as + * copy-and-paste and drag-and-drop. These mechanisms are tied to + * a wl_seat and this interface lets a client get a wl_data_device + * corresponding to a wl_seat. + * + * Depending on the version bound, the objects created from the bound + * wl_data_device_manager object will have different requirements for + * functioning properly. See wl_data_source.set_actions, + * wl_data_offer.accept and wl_data_offer.finish for details. + * @section page_iface_wl_data_device_manager_api API + * See @ref iface_wl_data_device_manager. + */ +/** + * @defgroup iface_wl_data_device_manager The wl_data_device_manager interface + * + * The wl_data_device_manager is a singleton global object that + * provides access to inter-client data transfer mechanisms such as + * copy-and-paste and drag-and-drop. These mechanisms are tied to + * a wl_seat and this interface lets a client get a wl_data_device + * corresponding to a wl_seat. + * + * Depending on the version bound, the objects created from the bound + * wl_data_device_manager object will have different requirements for + * functioning properly. See wl_data_source.set_actions, + * wl_data_offer.accept and wl_data_offer.finish for details. + */ +extern const struct wl_interface wl_data_device_manager_interface; +/** + * @page page_iface_wl_shell wl_shell + * @section page_iface_wl_shell_desc Description + * + * This interface is implemented by servers that provide + * desktop-style user interfaces. + * + * It allows clients to associate a wl_shell_surface with + * a basic surface. + * + * Note! This protocol is deprecated and not intended for production use. + * For desktop-style user interfaces, use xdg_shell. + * @section page_iface_wl_shell_api API + * See @ref iface_wl_shell. + */ +/** + * @defgroup iface_wl_shell The wl_shell interface + * + * This interface is implemented by servers that provide + * desktop-style user interfaces. + * + * It allows clients to associate a wl_shell_surface with + * a basic surface. + * + * Note! This protocol is deprecated and not intended for production use. + * For desktop-style user interfaces, use xdg_shell. + */ +extern const struct wl_interface wl_shell_interface; +/** + * @page page_iface_wl_shell_surface wl_shell_surface + * @section page_iface_wl_shell_surface_desc Description + * + * An interface that may be implemented by a wl_surface, for + * implementations that provide a desktop-style user interface. + * + * It provides requests to treat surfaces like toplevel, fullscreen + * or popup windows, move, resize or maximize them, associate + * metadata like title and class, etc. + * + * On the server side the object is automatically destroyed when + * the related wl_surface is destroyed. On the client side, + * wl_shell_surface_destroy() must be called before destroying + * the wl_surface object. + * @section page_iface_wl_shell_surface_api API + * See @ref iface_wl_shell_surface. + */ +/** + * @defgroup iface_wl_shell_surface The wl_shell_surface interface + * + * An interface that may be implemented by a wl_surface, for + * implementations that provide a desktop-style user interface. + * + * It provides requests to treat surfaces like toplevel, fullscreen + * or popup windows, move, resize or maximize them, associate + * metadata like title and class, etc. + * + * On the server side the object is automatically destroyed when + * the related wl_surface is destroyed. On the client side, + * wl_shell_surface_destroy() must be called before destroying + * the wl_surface object. + */ +extern const struct wl_interface wl_shell_surface_interface; +/** + * @page page_iface_wl_surface wl_surface + * @section page_iface_wl_surface_desc Description + * + * A surface is a rectangular area that is displayed on the screen. + * It has a location, size and pixel contents. + * + * The size of a surface (and relative positions on it) is described + * in surface-local coordinates, which may differ from the buffer + * coordinates of the pixel content, in case a buffer_transform + * or a buffer_scale is used. + * + * A surface without a "role" is fairly useless: a compositor does + * not know where, when or how to present it. The role is the + * purpose of a wl_surface. Examples of roles are a cursor for a + * pointer (as set by wl_pointer.set_cursor), a drag icon + * (wl_data_device.start_drag), a sub-surface + * (wl_subcompositor.get_subsurface), and a window as defined by a + * shell protocol (e.g. wl_shell.get_shell_surface). + * + * A surface can have only one role at a time. Initially a + * wl_surface does not have a role. Once a wl_surface is given a + * role, it is set permanently for the whole lifetime of the + * wl_surface object. Giving the current role again is allowed, + * unless explicitly forbidden by the relevant interface + * specification. + * + * Surface roles are given by requests in other interfaces such as + * wl_pointer.set_cursor. The request should explicitly mention + * that this request gives a role to a wl_surface. Often, this + * request also creates a new protocol object that represents the + * role and adds additional functionality to wl_surface. When a + * client wants to destroy a wl_surface, they must destroy this 'role + * object' before the wl_surface. + * + * Destroying the role object does not remove the role from the + * wl_surface, but it may stop the wl_surface from "playing the role". + * For instance, if a wl_subsurface object is destroyed, the wl_surface + * it was created for will be unmapped and forget its position and + * z-order. It is allowed to create a wl_subsurface for the same + * wl_surface again, but it is not allowed to use the wl_surface as + * a cursor (cursor is a different role than sub-surface, and role + * switching is not allowed). + * @section page_iface_wl_surface_api API + * See @ref iface_wl_surface. + */ +/** + * @defgroup iface_wl_surface The wl_surface interface + * + * A surface is a rectangular area that is displayed on the screen. + * It has a location, size and pixel contents. + * + * The size of a surface (and relative positions on it) is described + * in surface-local coordinates, which may differ from the buffer + * coordinates of the pixel content, in case a buffer_transform + * or a buffer_scale is used. + * + * A surface without a "role" is fairly useless: a compositor does + * not know where, when or how to present it. The role is the + * purpose of a wl_surface. Examples of roles are a cursor for a + * pointer (as set by wl_pointer.set_cursor), a drag icon + * (wl_data_device.start_drag), a sub-surface + * (wl_subcompositor.get_subsurface), and a window as defined by a + * shell protocol (e.g. wl_shell.get_shell_surface). + * + * A surface can have only one role at a time. Initially a + * wl_surface does not have a role. Once a wl_surface is given a + * role, it is set permanently for the whole lifetime of the + * wl_surface object. Giving the current role again is allowed, + * unless explicitly forbidden by the relevant interface + * specification. + * + * Surface roles are given by requests in other interfaces such as + * wl_pointer.set_cursor. The request should explicitly mention + * that this request gives a role to a wl_surface. Often, this + * request also creates a new protocol object that represents the + * role and adds additional functionality to wl_surface. When a + * client wants to destroy a wl_surface, they must destroy this 'role + * object' before the wl_surface. + * + * Destroying the role object does not remove the role from the + * wl_surface, but it may stop the wl_surface from "playing the role". + * For instance, if a wl_subsurface object is destroyed, the wl_surface + * it was created for will be unmapped and forget its position and + * z-order. It is allowed to create a wl_subsurface for the same + * wl_surface again, but it is not allowed to use the wl_surface as + * a cursor (cursor is a different role than sub-surface, and role + * switching is not allowed). + */ +extern const struct wl_interface wl_surface_interface; +/** + * @page page_iface_wl_seat wl_seat + * @section page_iface_wl_seat_desc Description + * + * A seat is a group of keyboards, pointer and touch devices. This + * object is published as a global during start up, or when such a + * device is hot plugged. A seat typically has a pointer and + * maintains a keyboard focus and a pointer focus. + * @section page_iface_wl_seat_api API + * See @ref iface_wl_seat. + */ +/** + * @defgroup iface_wl_seat The wl_seat interface + * + * A seat is a group of keyboards, pointer and touch devices. This + * object is published as a global during start up, or when such a + * device is hot plugged. A seat typically has a pointer and + * maintains a keyboard focus and a pointer focus. + */ +extern const struct wl_interface wl_seat_interface; +/** + * @page page_iface_wl_pointer wl_pointer + * @section page_iface_wl_pointer_desc Description + * + * The wl_pointer interface represents one or more input devices, + * such as mice, which control the pointer location and pointer_focus + * of a seat. + * + * The wl_pointer interface generates motion, enter and leave + * events for the surfaces that the pointer is located over, + * and button and axis events for button presses, button releases + * and scrolling. + * @section page_iface_wl_pointer_api API + * See @ref iface_wl_pointer. + */ +/** + * @defgroup iface_wl_pointer The wl_pointer interface + * + * The wl_pointer interface represents one or more input devices, + * such as mice, which control the pointer location and pointer_focus + * of a seat. + * + * The wl_pointer interface generates motion, enter and leave + * events for the surfaces that the pointer is located over, + * and button and axis events for button presses, button releases + * and scrolling. + */ +extern const struct wl_interface wl_pointer_interface; +/** + * @page page_iface_wl_keyboard wl_keyboard + * @section page_iface_wl_keyboard_desc Description + * + * The wl_keyboard interface represents one or more keyboards + * associated with a seat. + * @section page_iface_wl_keyboard_api API + * See @ref iface_wl_keyboard. + */ +/** + * @defgroup iface_wl_keyboard The wl_keyboard interface + * + * The wl_keyboard interface represents one or more keyboards + * associated with a seat. + */ +extern const struct wl_interface wl_keyboard_interface; +/** + * @page page_iface_wl_touch wl_touch + * @section page_iface_wl_touch_desc Description + * + * The wl_touch interface represents a touchscreen + * associated with a seat. + * + * Touch interactions can consist of one or more contacts. + * For each contact, a series of events is generated, starting + * with a down event, followed by zero or more motion events, + * and ending with an up event. Events relating to the same + * contact point can be identified by the ID of the sequence. + * @section page_iface_wl_touch_api API + * See @ref iface_wl_touch. + */ +/** + * @defgroup iface_wl_touch The wl_touch interface + * + * The wl_touch interface represents a touchscreen + * associated with a seat. + * + * Touch interactions can consist of one or more contacts. + * For each contact, a series of events is generated, starting + * with a down event, followed by zero or more motion events, + * and ending with an up event. Events relating to the same + * contact point can be identified by the ID of the sequence. + */ +extern const struct wl_interface wl_touch_interface; +/** + * @page page_iface_wl_output wl_output + * @section page_iface_wl_output_desc Description + * + * An output describes part of the compositor geometry. The + * compositor works in the 'compositor coordinate system' and an + * output corresponds to a rectangular area in that space that is + * actually visible. This typically corresponds to a monitor that + * displays part of the compositor space. This object is published + * as global during start up, or when a monitor is hotplugged. + * @section page_iface_wl_output_api API + * See @ref iface_wl_output. + */ +/** + * @defgroup iface_wl_output The wl_output interface + * + * An output describes part of the compositor geometry. The + * compositor works in the 'compositor coordinate system' and an + * output corresponds to a rectangular area in that space that is + * actually visible. This typically corresponds to a monitor that + * displays part of the compositor space. This object is published + * as global during start up, or when a monitor is hotplugged. + */ +extern const struct wl_interface wl_output_interface; +/** + * @page page_iface_wl_region wl_region + * @section page_iface_wl_region_desc Description + * + * A region object describes an area. + * + * Region objects are used to describe the opaque and input + * regions of a surface. + * @section page_iface_wl_region_api API + * See @ref iface_wl_region. + */ +/** + * @defgroup iface_wl_region The wl_region interface + * + * A region object describes an area. + * + * Region objects are used to describe the opaque and input + * regions of a surface. + */ +extern const struct wl_interface wl_region_interface; +/** + * @page page_iface_wl_subcompositor wl_subcompositor + * @section page_iface_wl_subcompositor_desc Description + * + * The global interface exposing sub-surface compositing capabilities. + * A wl_surface, that has sub-surfaces associated, is called the + * parent surface. Sub-surfaces can be arbitrarily nested and create + * a tree of sub-surfaces. + * + * The root surface in a tree of sub-surfaces is the main + * surface. The main surface cannot be a sub-surface, because + * sub-surfaces must always have a parent. + * + * A main surface with its sub-surfaces forms a (compound) window. + * For window management purposes, this set of wl_surface objects is + * to be considered as a single window, and it should also behave as + * such. + * + * The aim of sub-surfaces is to offload some of the compositing work + * within a window from clients to the compositor. A prime example is + * a video player with decorations and video in separate wl_surface + * objects. This should allow the compositor to pass YUV video buffer + * processing to dedicated overlay hardware when possible. + * @section page_iface_wl_subcompositor_api API + * See @ref iface_wl_subcompositor. + */ +/** + * @defgroup iface_wl_subcompositor The wl_subcompositor interface + * + * The global interface exposing sub-surface compositing capabilities. + * A wl_surface, that has sub-surfaces associated, is called the + * parent surface. Sub-surfaces can be arbitrarily nested and create + * a tree of sub-surfaces. + * + * The root surface in a tree of sub-surfaces is the main + * surface. The main surface cannot be a sub-surface, because + * sub-surfaces must always have a parent. + * + * A main surface with its sub-surfaces forms a (compound) window. + * For window management purposes, this set of wl_surface objects is + * to be considered as a single window, and it should also behave as + * such. + * + * The aim of sub-surfaces is to offload some of the compositing work + * within a window from clients to the compositor. A prime example is + * a video player with decorations and video in separate wl_surface + * objects. This should allow the compositor to pass YUV video buffer + * processing to dedicated overlay hardware when possible. + */ +extern const struct wl_interface wl_subcompositor_interface; +/** + * @page page_iface_wl_subsurface wl_subsurface + * @section page_iface_wl_subsurface_desc Description + * + * An additional interface to a wl_surface object, which has been + * made a sub-surface. A sub-surface has one parent surface. A + * sub-surface's size and position are not limited to that of the parent. + * Particularly, a sub-surface is not automatically clipped to its + * parent's area. + * + * A sub-surface becomes mapped, when a non-NULL wl_buffer is applied + * and the parent surface is mapped. The order of which one happens + * first is irrelevant. A sub-surface is hidden if the parent becomes + * hidden, or if a NULL wl_buffer is applied. These rules apply + * recursively through the tree of surfaces. + * + * The behaviour of a wl_surface.commit request on a sub-surface + * depends on the sub-surface's mode. The possible modes are + * synchronized and desynchronized, see methods + * wl_subsurface.set_sync and wl_subsurface.set_desync. Synchronized + * mode caches the wl_surface state to be applied when the parent's + * state gets applied, and desynchronized mode applies the pending + * wl_surface state directly. A sub-surface is initially in the + * synchronized mode. + * + * Sub-surfaces have also other kind of state, which is managed by + * wl_subsurface requests, as opposed to wl_surface requests. This + * state includes the sub-surface position relative to the parent + * surface (wl_subsurface.set_position), and the stacking order of + * the parent and its sub-surfaces (wl_subsurface.place_above and + * .place_below). This state is applied when the parent surface's + * wl_surface state is applied, regardless of the sub-surface's mode. + * As the exception, set_sync and set_desync are effective immediately. + * + * The main surface can be thought to be always in desynchronized mode, + * since it does not have a parent in the sub-surfaces sense. + * + * Even if a sub-surface is in desynchronized mode, it will behave as + * in synchronized mode, if its parent surface behaves as in + * synchronized mode. This rule is applied recursively throughout the + * tree of surfaces. This means, that one can set a sub-surface into + * synchronized mode, and then assume that all its child and grand-child + * sub-surfaces are synchronized, too, without explicitly setting them. + * + * If the wl_surface associated with the wl_subsurface is destroyed, the + * wl_subsurface object becomes inert. Note, that destroying either object + * takes effect immediately. If you need to synchronize the removal + * of a sub-surface to the parent surface update, unmap the sub-surface + * first by attaching a NULL wl_buffer, update parent, and then destroy + * the sub-surface. + * + * If the parent wl_surface object is destroyed, the sub-surface is + * unmapped. + * @section page_iface_wl_subsurface_api API + * See @ref iface_wl_subsurface. + */ +/** + * @defgroup iface_wl_subsurface The wl_subsurface interface + * + * An additional interface to a wl_surface object, which has been + * made a sub-surface. A sub-surface has one parent surface. A + * sub-surface's size and position are not limited to that of the parent. + * Particularly, a sub-surface is not automatically clipped to its + * parent's area. + * + * A sub-surface becomes mapped, when a non-NULL wl_buffer is applied + * and the parent surface is mapped. The order of which one happens + * first is irrelevant. A sub-surface is hidden if the parent becomes + * hidden, or if a NULL wl_buffer is applied. These rules apply + * recursively through the tree of surfaces. + * + * The behaviour of a wl_surface.commit request on a sub-surface + * depends on the sub-surface's mode. The possible modes are + * synchronized and desynchronized, see methods + * wl_subsurface.set_sync and wl_subsurface.set_desync. Synchronized + * mode caches the wl_surface state to be applied when the parent's + * state gets applied, and desynchronized mode applies the pending + * wl_surface state directly. A sub-surface is initially in the + * synchronized mode. + * + * Sub-surfaces have also other kind of state, which is managed by + * wl_subsurface requests, as opposed to wl_surface requests. This + * state includes the sub-surface position relative to the parent + * surface (wl_subsurface.set_position), and the stacking order of + * the parent and its sub-surfaces (wl_subsurface.place_above and + * .place_below). This state is applied when the parent surface's + * wl_surface state is applied, regardless of the sub-surface's mode. + * As the exception, set_sync and set_desync are effective immediately. + * + * The main surface can be thought to be always in desynchronized mode, + * since it does not have a parent in the sub-surfaces sense. + * + * Even if a sub-surface is in desynchronized mode, it will behave as + * in synchronized mode, if its parent surface behaves as in + * synchronized mode. This rule is applied recursively throughout the + * tree of surfaces. This means, that one can set a sub-surface into + * synchronized mode, and then assume that all its child and grand-child + * sub-surfaces are synchronized, too, without explicitly setting them. + * + * If the wl_surface associated with the wl_subsurface is destroyed, the + * wl_subsurface object becomes inert. Note, that destroying either object + * takes effect immediately. If you need to synchronize the removal + * of a sub-surface to the parent surface update, unmap the sub-surface + * first by attaching a NULL wl_buffer, update parent, and then destroy + * the sub-surface. + * + * If the parent wl_surface object is destroyed, the sub-surface is + * unmapped. + */ +extern const struct wl_interface wl_subsurface_interface; + +#ifndef WL_DISPLAY_ERROR_ENUM +#define WL_DISPLAY_ERROR_ENUM +/** + * @ingroup iface_wl_display + * global error values + * + * These errors are global and can be emitted in response to any + * server request. + */ +enum wl_display_error { + /** + * server couldn't find object + */ + WL_DISPLAY_ERROR_INVALID_OBJECT = 0, + /** + * method doesn't exist on the specified interface + */ + WL_DISPLAY_ERROR_INVALID_METHOD = 1, + /** + * server is out of memory + */ + WL_DISPLAY_ERROR_NO_MEMORY = 2, +}; +#endif /* WL_DISPLAY_ERROR_ENUM */ + +/** + * @ingroup iface_wl_display + * @struct wl_display_interface + */ +struct wl_display_interface { + /** + * asynchronous roundtrip + * + * The sync request asks the server to emit the 'done' event on + * the returned wl_callback object. Since requests are handled + * in-order and events are delivered in-order, this can be used as + * a barrier to ensure all previous requests and the resulting + * events have been handled. + * + * The object returned by this request will be destroyed by the + * compositor after the callback is fired and as such the client + * must not attempt to use it after that point. + * + * The callback_data passed in the callback is the event serial. + * @param callback callback object for the sync request + */ + void (*sync)(struct wl_client *client, + struct wl_resource *resource, + uint32_t callback); + /** + * get global registry object + * + * This request creates a registry object that allows the client + * to list and bind the global objects available from the + * compositor. + * + * It should be noted that the server side resources consumed in + * response to a get_registry request can only be released when the + * client disconnects, not when the client side proxy is destroyed. + * Therefore, clients should invoke get_registry as infrequently as + * possible to avoid wasting memory. + * @param registry global registry object + */ + void (*get_registry)(struct wl_client *client, + struct wl_resource *resource, + uint32_t registry); +}; + +#define WL_DISPLAY_ERROR 0 +#define WL_DISPLAY_DELETE_ID 1 + +/** + * @ingroup iface_wl_display + */ +#define WL_DISPLAY_ERROR_SINCE_VERSION 1 +/** + * @ingroup iface_wl_display + */ +#define WL_DISPLAY_DELETE_ID_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_display + */ +#define WL_DISPLAY_SYNC_SINCE_VERSION 1 +/** + * @ingroup iface_wl_display + */ +#define WL_DISPLAY_GET_REGISTRY_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_registry + * @struct wl_registry_interface + */ +struct wl_registry_interface { + /** + * bind an object to the display + * + * Binds a new, client-created object to the server using the + * specified name as the identifier. + * @param name unique numeric name of the object + * @param interface name of the objects interface + * @param version version of the objects interface + * @param id bounded object + */ + void (*bind)(struct wl_client *client, + struct wl_resource *resource, + uint32_t name, + const char *interface, uint32_t version, uint32_t id); +}; + +#define WL_REGISTRY_GLOBAL 0 +#define WL_REGISTRY_GLOBAL_REMOVE 1 + +/** + * @ingroup iface_wl_registry + */ +#define WL_REGISTRY_GLOBAL_SINCE_VERSION 1 +/** + * @ingroup iface_wl_registry + */ +#define WL_REGISTRY_GLOBAL_REMOVE_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_registry + */ +#define WL_REGISTRY_BIND_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_registry + * Sends an global event to the client owning the resource. + * @param resource_ The client's resource + * @param name numeric name of the global object + * @param interface interface implemented by the object + * @param version interface version + */ +static inline void +wl_registry_send_global(struct wl_resource *resource_, uint32_t name, const char *interface, uint32_t version) +{ + wl_resource_post_event(resource_, WL_REGISTRY_GLOBAL, name, interface, version); +} + +/** + * @ingroup iface_wl_registry + * Sends an global_remove event to the client owning the resource. + * @param resource_ The client's resource + * @param name numeric name of the global object + */ +static inline void +wl_registry_send_global_remove(struct wl_resource *resource_, uint32_t name) +{ + wl_resource_post_event(resource_, WL_REGISTRY_GLOBAL_REMOVE, name); +} + +#define WL_CALLBACK_DONE 0 + +/** + * @ingroup iface_wl_callback + */ +#define WL_CALLBACK_DONE_SINCE_VERSION 1 + + +/** + * @ingroup iface_wl_callback + * Sends an done event to the client owning the resource. + * @param resource_ The client's resource + * @param callback_data request-specific data for the callback + */ +static inline void +wl_callback_send_done(struct wl_resource *resource_, uint32_t callback_data) +{ + wl_resource_post_event(resource_, WL_CALLBACK_DONE, callback_data); +} + +/** + * @ingroup iface_wl_compositor + * @struct wl_compositor_interface + */ +struct wl_compositor_interface { + /** + * create new surface + * + * Ask the compositor to create a new surface. + * @param id the new surface + */ + void (*create_surface)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * create new region + * + * Ask the compositor to create a new region. + * @param id the new region + */ + void (*create_region)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); +}; + + +/** + * @ingroup iface_wl_compositor + */ +#define WL_COMPOSITOR_CREATE_SURFACE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_compositor + */ +#define WL_COMPOSITOR_CREATE_REGION_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_shm_pool + * @struct wl_shm_pool_interface + */ +struct wl_shm_pool_interface { + /** + * create a buffer from the pool + * + * Create a wl_buffer object from the pool. + * + * The buffer is created offset bytes into the pool and has width + * and height as specified. The stride argument specifies the + * number of bytes from the beginning of one row to the beginning + * of the next. The format is the pixel format of the buffer and + * must be one of those advertised through the wl_shm.format event. + * + * A buffer will keep a reference to the pool it was created from + * so it is valid to destroy the pool immediately after creating a + * buffer from it. + * @param id buffer to create + * @param offset buffer byte offset within the pool + * @param width buffer width, in pixels + * @param height buffer height, in pixels + * @param stride number of bytes from the beginning of one row to the beginning of the next row + * @param format buffer pixel format + */ + void (*create_buffer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + int32_t offset, + int32_t width, + int32_t height, + int32_t stride, + uint32_t format); + /** + * destroy the pool + * + * Destroy the shared memory pool. + * + * The mmapped memory will be released when all buffers that have + * been created from this pool are gone. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * change the size of the pool mapping + * + * This request will cause the server to remap the backing memory + * for the pool from the file descriptor passed when the pool was + * created, but using the new size. This request can only be used + * to make the pool bigger. + * @param size new size of the pool, in bytes + */ + void (*resize)(struct wl_client *client, + struct wl_resource *resource, + int32_t size); +}; + + +/** + * @ingroup iface_wl_shm_pool + */ +#define WL_SHM_POOL_CREATE_BUFFER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shm_pool + */ +#define WL_SHM_POOL_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shm_pool + */ +#define WL_SHM_POOL_RESIZE_SINCE_VERSION 1 + +#ifndef WL_SHM_ERROR_ENUM +#define WL_SHM_ERROR_ENUM +/** + * @ingroup iface_wl_shm + * wl_shm error values + * + * These errors can be emitted in response to wl_shm requests. + */ +enum wl_shm_error { + /** + * buffer format is not known + */ + WL_SHM_ERROR_INVALID_FORMAT = 0, + /** + * invalid size or stride during pool or buffer creation + */ + WL_SHM_ERROR_INVALID_STRIDE = 1, + /** + * mmapping the file descriptor failed + */ + WL_SHM_ERROR_INVALID_FD = 2, +}; +#endif /* WL_SHM_ERROR_ENUM */ + +#ifndef WL_SHM_FORMAT_ENUM +#define WL_SHM_FORMAT_ENUM +/** + * @ingroup iface_wl_shm + * pixel formats + * + * This describes the memory layout of an individual pixel. + * + * All renderers should support argb8888 and xrgb8888 but any other + * formats are optional and may not be supported by the particular + * renderer in use. + * + * The drm format codes match the macros defined in drm_fourcc.h. + * The formats actually supported by the compositor will be + * reported by the format event. + */ +enum wl_shm_format { + /** + * 32-bit ARGB format, [31:0] A:R:G:B 8:8:8:8 little endian + */ + WL_SHM_FORMAT_ARGB8888 = 0, + /** + * 32-bit RGB format, [31:0] x:R:G:B 8:8:8:8 little endian + */ + WL_SHM_FORMAT_XRGB8888 = 1, + /** + * 8-bit color index format, [7:0] C + */ + WL_SHM_FORMAT_C8 = 0x20203843, + /** + * 8-bit RGB format, [7:0] R:G:B 3:3:2 + */ + WL_SHM_FORMAT_RGB332 = 0x38424752, + /** + * 8-bit BGR format, [7:0] B:G:R 2:3:3 + */ + WL_SHM_FORMAT_BGR233 = 0x38524742, + /** + * 16-bit xRGB format, [15:0] x:R:G:B 4:4:4:4 little endian + */ + WL_SHM_FORMAT_XRGB4444 = 0x32315258, + /** + * 16-bit xBGR format, [15:0] x:B:G:R 4:4:4:4 little endian + */ + WL_SHM_FORMAT_XBGR4444 = 0x32314258, + /** + * 16-bit RGBx format, [15:0] R:G:B:x 4:4:4:4 little endian + */ + WL_SHM_FORMAT_RGBX4444 = 0x32315852, + /** + * 16-bit BGRx format, [15:0] B:G:R:x 4:4:4:4 little endian + */ + WL_SHM_FORMAT_BGRX4444 = 0x32315842, + /** + * 16-bit ARGB format, [15:0] A:R:G:B 4:4:4:4 little endian + */ + WL_SHM_FORMAT_ARGB4444 = 0x32315241, + /** + * 16-bit ABGR format, [15:0] A:B:G:R 4:4:4:4 little endian + */ + WL_SHM_FORMAT_ABGR4444 = 0x32314241, + /** + * 16-bit RBGA format, [15:0] R:G:B:A 4:4:4:4 little endian + */ + WL_SHM_FORMAT_RGBA4444 = 0x32314152, + /** + * 16-bit BGRA format, [15:0] B:G:R:A 4:4:4:4 little endian + */ + WL_SHM_FORMAT_BGRA4444 = 0x32314142, + /** + * 16-bit xRGB format, [15:0] x:R:G:B 1:5:5:5 little endian + */ + WL_SHM_FORMAT_XRGB1555 = 0x35315258, + /** + * 16-bit xBGR 1555 format, [15:0] x:B:G:R 1:5:5:5 little endian + */ + WL_SHM_FORMAT_XBGR1555 = 0x35314258, + /** + * 16-bit RGBx 5551 format, [15:0] R:G:B:x 5:5:5:1 little endian + */ + WL_SHM_FORMAT_RGBX5551 = 0x35315852, + /** + * 16-bit BGRx 5551 format, [15:0] B:G:R:x 5:5:5:1 little endian + */ + WL_SHM_FORMAT_BGRX5551 = 0x35315842, + /** + * 16-bit ARGB 1555 format, [15:0] A:R:G:B 1:5:5:5 little endian + */ + WL_SHM_FORMAT_ARGB1555 = 0x35315241, + /** + * 16-bit ABGR 1555 format, [15:0] A:B:G:R 1:5:5:5 little endian + */ + WL_SHM_FORMAT_ABGR1555 = 0x35314241, + /** + * 16-bit RGBA 5551 format, [15:0] R:G:B:A 5:5:5:1 little endian + */ + WL_SHM_FORMAT_RGBA5551 = 0x35314152, + /** + * 16-bit BGRA 5551 format, [15:0] B:G:R:A 5:5:5:1 little endian + */ + WL_SHM_FORMAT_BGRA5551 = 0x35314142, + /** + * 16-bit RGB 565 format, [15:0] R:G:B 5:6:5 little endian + */ + WL_SHM_FORMAT_RGB565 = 0x36314752, + /** + * 16-bit BGR 565 format, [15:0] B:G:R 5:6:5 little endian + */ + WL_SHM_FORMAT_BGR565 = 0x36314742, + /** + * 24-bit RGB format, [23:0] R:G:B little endian + */ + WL_SHM_FORMAT_RGB888 = 0x34324752, + /** + * 24-bit BGR format, [23:0] B:G:R little endian + */ + WL_SHM_FORMAT_BGR888 = 0x34324742, + /** + * 32-bit xBGR format, [31:0] x:B:G:R 8:8:8:8 little endian + */ + WL_SHM_FORMAT_XBGR8888 = 0x34324258, + /** + * 32-bit RGBx format, [31:0] R:G:B:x 8:8:8:8 little endian + */ + WL_SHM_FORMAT_RGBX8888 = 0x34325852, + /** + * 32-bit BGRx format, [31:0] B:G:R:x 8:8:8:8 little endian + */ + WL_SHM_FORMAT_BGRX8888 = 0x34325842, + /** + * 32-bit ABGR format, [31:0] A:B:G:R 8:8:8:8 little endian + */ + WL_SHM_FORMAT_ABGR8888 = 0x34324241, + /** + * 32-bit RGBA format, [31:0] R:G:B:A 8:8:8:8 little endian + */ + WL_SHM_FORMAT_RGBA8888 = 0x34324152, + /** + * 32-bit BGRA format, [31:0] B:G:R:A 8:8:8:8 little endian + */ + WL_SHM_FORMAT_BGRA8888 = 0x34324142, + /** + * 32-bit xRGB format, [31:0] x:R:G:B 2:10:10:10 little endian + */ + WL_SHM_FORMAT_XRGB2101010 = 0x30335258, + /** + * 32-bit xBGR format, [31:0] x:B:G:R 2:10:10:10 little endian + */ + WL_SHM_FORMAT_XBGR2101010 = 0x30334258, + /** + * 32-bit RGBx format, [31:0] R:G:B:x 10:10:10:2 little endian + */ + WL_SHM_FORMAT_RGBX1010102 = 0x30335852, + /** + * 32-bit BGRx format, [31:0] B:G:R:x 10:10:10:2 little endian + */ + WL_SHM_FORMAT_BGRX1010102 = 0x30335842, + /** + * 32-bit ARGB format, [31:0] A:R:G:B 2:10:10:10 little endian + */ + WL_SHM_FORMAT_ARGB2101010 = 0x30335241, + /** + * 32-bit ABGR format, [31:0] A:B:G:R 2:10:10:10 little endian + */ + WL_SHM_FORMAT_ABGR2101010 = 0x30334241, + /** + * 32-bit RGBA format, [31:0] R:G:B:A 10:10:10:2 little endian + */ + WL_SHM_FORMAT_RGBA1010102 = 0x30334152, + /** + * 32-bit BGRA format, [31:0] B:G:R:A 10:10:10:2 little endian + */ + WL_SHM_FORMAT_BGRA1010102 = 0x30334142, + /** + * packed YCbCr format, [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian + */ + WL_SHM_FORMAT_YUYV = 0x56595559, + /** + * packed YCbCr format, [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian + */ + WL_SHM_FORMAT_YVYU = 0x55595659, + /** + * packed YCbCr format, [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian + */ + WL_SHM_FORMAT_UYVY = 0x59565955, + /** + * packed YCbCr format, [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian + */ + WL_SHM_FORMAT_VYUY = 0x59555956, + /** + * packed AYCbCr format, [31:0] A:Y:Cb:Cr 8:8:8:8 little endian + */ + WL_SHM_FORMAT_AYUV = 0x56555941, + /** + * 2 plane YCbCr Cr:Cb format, 2x2 subsampled Cr:Cb plane + */ + WL_SHM_FORMAT_NV12 = 0x3231564e, + /** + * 2 plane YCbCr Cb:Cr format, 2x2 subsampled Cb:Cr plane + */ + WL_SHM_FORMAT_NV21 = 0x3132564e, + /** + * 2 plane YCbCr Cr:Cb format, 2x1 subsampled Cr:Cb plane + */ + WL_SHM_FORMAT_NV16 = 0x3631564e, + /** + * 2 plane YCbCr Cb:Cr format, 2x1 subsampled Cb:Cr plane + */ + WL_SHM_FORMAT_NV61 = 0x3136564e, + /** + * 3 plane YCbCr format, 4x4 subsampled Cb (1) and Cr (2) planes + */ + WL_SHM_FORMAT_YUV410 = 0x39565559, + /** + * 3 plane YCbCr format, 4x4 subsampled Cr (1) and Cb (2) planes + */ + WL_SHM_FORMAT_YVU410 = 0x39555659, + /** + * 3 plane YCbCr format, 4x1 subsampled Cb (1) and Cr (2) planes + */ + WL_SHM_FORMAT_YUV411 = 0x31315559, + /** + * 3 plane YCbCr format, 4x1 subsampled Cr (1) and Cb (2) planes + */ + WL_SHM_FORMAT_YVU411 = 0x31315659, + /** + * 3 plane YCbCr format, 2x2 subsampled Cb (1) and Cr (2) planes + */ + WL_SHM_FORMAT_YUV420 = 0x32315559, + /** + * 3 plane YCbCr format, 2x2 subsampled Cr (1) and Cb (2) planes + */ + WL_SHM_FORMAT_YVU420 = 0x32315659, + /** + * 3 plane YCbCr format, 2x1 subsampled Cb (1) and Cr (2) planes + */ + WL_SHM_FORMAT_YUV422 = 0x36315559, + /** + * 3 plane YCbCr format, 2x1 subsampled Cr (1) and Cb (2) planes + */ + WL_SHM_FORMAT_YVU422 = 0x36315659, + /** + * 3 plane YCbCr format, non-subsampled Cb (1) and Cr (2) planes + */ + WL_SHM_FORMAT_YUV444 = 0x34325559, + /** + * 3 plane YCbCr format, non-subsampled Cr (1) and Cb (2) planes + */ + WL_SHM_FORMAT_YVU444 = 0x34325659, +}; +#endif /* WL_SHM_FORMAT_ENUM */ + +/** + * @ingroup iface_wl_shm + * @struct wl_shm_interface + */ +struct wl_shm_interface { + /** + * create a shm pool + * + * Create a new wl_shm_pool object. + * + * The pool can be used to create shared memory based buffer + * objects. The server will mmap size bytes of the passed file + * descriptor, to use as backing memory for the pool. + * @param id pool to create + * @param fd file descriptor for the pool + * @param size pool size, in bytes + */ + void (*create_pool)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + int32_t fd, + int32_t size); +}; + +#define WL_SHM_FORMAT 0 + +/** + * @ingroup iface_wl_shm + */ +#define WL_SHM_FORMAT_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_shm + */ +#define WL_SHM_CREATE_POOL_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_shm + * Sends an format event to the client owning the resource. + * @param resource_ The client's resource + * @param format buffer pixel format + */ +static inline void +wl_shm_send_format(struct wl_resource *resource_, uint32_t format) +{ + wl_resource_post_event(resource_, WL_SHM_FORMAT, format); +} + +/** + * @ingroup iface_wl_buffer + * @struct wl_buffer_interface + */ +struct wl_buffer_interface { + /** + * destroy a buffer + * + * Destroy a buffer. If and how you need to release the backing + * storage is defined by the buffer factory interface. + * + * For possible side-effects to a surface, see wl_surface.attach. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define WL_BUFFER_RELEASE 0 + +/** + * @ingroup iface_wl_buffer + */ +#define WL_BUFFER_RELEASE_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_buffer + */ +#define WL_BUFFER_DESTROY_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_buffer + * Sends an release event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_buffer_send_release(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_BUFFER_RELEASE); +} + +#ifndef WL_DATA_OFFER_ERROR_ENUM +#define WL_DATA_OFFER_ERROR_ENUM +enum wl_data_offer_error { + /** + * finish request was called untimely + */ + WL_DATA_OFFER_ERROR_INVALID_FINISH = 0, + /** + * action mask contains invalid values + */ + WL_DATA_OFFER_ERROR_INVALID_ACTION_MASK = 1, + /** + * action argument has an invalid value + */ + WL_DATA_OFFER_ERROR_INVALID_ACTION = 2, + /** + * offer doesn't accept this request + */ + WL_DATA_OFFER_ERROR_INVALID_OFFER = 3, +}; +#endif /* WL_DATA_OFFER_ERROR_ENUM */ + +/** + * @ingroup iface_wl_data_offer + * @struct wl_data_offer_interface + */ +struct wl_data_offer_interface { + /** + * accept one of the offered mime types + * + * Indicate that the client can accept the given mime type, or + * NULL for not accepted. + * + * For objects of version 2 or older, this request is used by the + * client to give feedback whether the client can receive the given + * mime type, or NULL if none is accepted; the feedback does not + * determine whether the drag-and-drop operation succeeds or not. + * + * For objects of version 3 or newer, this request determines the + * final result of the drag-and-drop operation. If the end result + * is that no mime types were accepted, the drag-and-drop operation + * will be cancelled and the corresponding drag source will receive + * wl_data_source.cancelled. Clients may still use this event in + * conjunction with wl_data_source.action for feedback. + * @param serial serial number of the accept request + * @param mime_type mime type accepted by the client + */ + void (*accept)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial, + const char *mime_type); + /** + * request that the data is transferred + * + * To transfer the offered data, the client issues this request + * and indicates the mime type it wants to receive. The transfer + * happens through the passed file descriptor (typically created + * with the pipe system call). The source client writes the data in + * the mime type representation requested and then closes the file + * descriptor. + * + * The receiving client reads from the read end of the pipe until + * EOF and then closes its end, at which point the transfer is + * complete. + * + * This request may happen multiple times for different mime types, + * both before and after wl_data_device.drop. Drag-and-drop + * destination clients may preemptively fetch data or examine it + * more closely to determine acceptance. + * @param mime_type mime type desired by receiver + * @param fd file descriptor for data transfer + */ + void (*receive)(struct wl_client *client, + struct wl_resource *resource, + const char *mime_type, + int32_t fd); + /** + * destroy data offer + * + * Destroy the data offer. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * the offer will no longer be used + * + * Notifies the compositor that the drag destination successfully + * finished the drag-and-drop operation. + * + * Upon receiving this request, the compositor will emit + * wl_data_source.dnd_finished on the drag source client. + * + * It is a client error to perform other requests than + * wl_data_offer.destroy after this one. It is also an error to + * perform this request after a NULL mime type has been set in + * wl_data_offer.accept or no action was received through + * wl_data_offer.action. + * @since 3 + */ + void (*finish)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the available/preferred drag-and-drop actions + * + * Sets the actions that the destination side client supports for + * this operation. This request may trigger the emission of + * wl_data_source.action and wl_data_offer.action events if the + * compositor needs to change the selected action. + * + * This request can be called multiple times throughout the + * drag-and-drop operation, typically in response to + * wl_data_device.enter or wl_data_device.motion events. + * + * This request determines the final result of the drag-and-drop + * operation. If the end result is that no action is accepted, the + * drag source will receive wl_drag_source.cancelled. + * + * The dnd_actions argument must contain only values expressed in + * the wl_data_device_manager.dnd_actions enum, and the + * preferred_action argument must only contain one of those values + * set, otherwise it will result in a protocol error. + * + * While managing an "ask" action, the destination drag-and-drop + * client may perform further wl_data_offer.receive requests, and + * is expected to perform one last wl_data_offer.set_actions + * request with a preferred action other than "ask" (and optionally + * wl_data_offer.accept) before requesting wl_data_offer.finish, in + * order to convey the action selected by the user. If the + * preferred action is not in the wl_data_offer.source_actions + * mask, an error will be raised. + * + * If the "ask" action is dismissed (e.g. user cancellation), the + * client is expected to perform wl_data_offer.destroy right away. + * + * This request can only be made on drag-and-drop offers, a + * protocol error will be raised otherwise. + * @param dnd_actions actions supported by the destination client + * @param preferred_action action preferred by the destination client + * @since 3 + */ + void (*set_actions)(struct wl_client *client, + struct wl_resource *resource, + uint32_t dnd_actions, + uint32_t preferred_action); +}; + +#define WL_DATA_OFFER_OFFER 0 +#define WL_DATA_OFFER_SOURCE_ACTIONS 1 +#define WL_DATA_OFFER_ACTION 2 + +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_OFFER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_SOURCE_ACTIONS_SINCE_VERSION 3 +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_ACTION_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_ACCEPT_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_RECEIVE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_FINISH_SINCE_VERSION 3 +/** + * @ingroup iface_wl_data_offer + */ +#define WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_data_offer + * Sends an offer event to the client owning the resource. + * @param resource_ The client's resource + * @param mime_type offered mime type + */ +static inline void +wl_data_offer_send_offer(struct wl_resource *resource_, const char *mime_type) +{ + wl_resource_post_event(resource_, WL_DATA_OFFER_OFFER, mime_type); +} + +/** + * @ingroup iface_wl_data_offer + * Sends an source_actions event to the client owning the resource. + * @param resource_ The client's resource + * @param source_actions actions offered by the data source + */ +static inline void +wl_data_offer_send_source_actions(struct wl_resource *resource_, uint32_t source_actions) +{ + wl_resource_post_event(resource_, WL_DATA_OFFER_SOURCE_ACTIONS, source_actions); +} + +/** + * @ingroup iface_wl_data_offer + * Sends an action event to the client owning the resource. + * @param resource_ The client's resource + * @param dnd_action action selected by the compositor + */ +static inline void +wl_data_offer_send_action(struct wl_resource *resource_, uint32_t dnd_action) +{ + wl_resource_post_event(resource_, WL_DATA_OFFER_ACTION, dnd_action); +} + +#ifndef WL_DATA_SOURCE_ERROR_ENUM +#define WL_DATA_SOURCE_ERROR_ENUM +enum wl_data_source_error { + /** + * action mask contains invalid values + */ + WL_DATA_SOURCE_ERROR_INVALID_ACTION_MASK = 0, + /** + * source doesn't accept this request + */ + WL_DATA_SOURCE_ERROR_INVALID_SOURCE = 1, +}; +#endif /* WL_DATA_SOURCE_ERROR_ENUM */ + +/** + * @ingroup iface_wl_data_source + * @struct wl_data_source_interface + */ +struct wl_data_source_interface { + /** + * add an offered mime type + * + * This request adds a mime type to the set of mime types + * advertised to targets. Can be called several times to offer + * multiple types. + * @param mime_type mime type offered by the data source + */ + void (*offer)(struct wl_client *client, + struct wl_resource *resource, + const char *mime_type); + /** + * destroy the data source + * + * Destroy the data source. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the available drag-and-drop actions + * + * Sets the actions that the source side client supports for this + * operation. This request may trigger wl_data_source.action and + * wl_data_offer.action events if the compositor needs to change + * the selected action. + * + * The dnd_actions argument must contain only values expressed in + * the wl_data_device_manager.dnd_actions enum, otherwise it will + * result in a protocol error. + * + * This request must be made once only, and can only be made on + * sources used in drag-and-drop, so it must be performed before + * wl_data_device.start_drag. Attempting to use the source other + * than for drag-and-drop will raise a protocol error. + * @param dnd_actions actions supported by the data source + * @since 3 + */ + void (*set_actions)(struct wl_client *client, + struct wl_resource *resource, + uint32_t dnd_actions); +}; + +#define WL_DATA_SOURCE_TARGET 0 +#define WL_DATA_SOURCE_SEND 1 +#define WL_DATA_SOURCE_CANCELLED 2 +#define WL_DATA_SOURCE_DND_DROP_PERFORMED 3 +#define WL_DATA_SOURCE_DND_FINISHED 4 +#define WL_DATA_SOURCE_ACTION 5 + +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_TARGET_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_SEND_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_CANCELLED_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_DND_DROP_PERFORMED_SINCE_VERSION 3 +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_DND_FINISHED_SINCE_VERSION 3 +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_ACTION_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_OFFER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_source + */ +#define WL_DATA_SOURCE_SET_ACTIONS_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_data_source + * Sends an target event to the client owning the resource. + * @param resource_ The client's resource + * @param mime_type mime type accepted by the target + */ +static inline void +wl_data_source_send_target(struct wl_resource *resource_, const char *mime_type) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_TARGET, mime_type); +} + +/** + * @ingroup iface_wl_data_source + * Sends an send event to the client owning the resource. + * @param resource_ The client's resource + * @param mime_type mime type for the data + * @param fd file descriptor for the data + */ +static inline void +wl_data_source_send_send(struct wl_resource *resource_, const char *mime_type, int32_t fd) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_SEND, mime_type, fd); +} + +/** + * @ingroup iface_wl_data_source + * Sends an cancelled event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_data_source_send_cancelled(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_CANCELLED); +} + +/** + * @ingroup iface_wl_data_source + * Sends an dnd_drop_performed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_data_source_send_dnd_drop_performed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_DND_DROP_PERFORMED); +} + +/** + * @ingroup iface_wl_data_source + * Sends an dnd_finished event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_data_source_send_dnd_finished(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_DND_FINISHED); +} + +/** + * @ingroup iface_wl_data_source + * Sends an action event to the client owning the resource. + * @param resource_ The client's resource + * @param dnd_action action selected by the compositor + */ +static inline void +wl_data_source_send_action(struct wl_resource *resource_, uint32_t dnd_action) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_ACTION, dnd_action); +} + +#ifndef WL_DATA_DEVICE_ERROR_ENUM +#define WL_DATA_DEVICE_ERROR_ENUM +enum wl_data_device_error { + /** + * given wl_surface has another role + */ + WL_DATA_DEVICE_ERROR_ROLE = 0, +}; +#endif /* WL_DATA_DEVICE_ERROR_ENUM */ + +/** + * @ingroup iface_wl_data_device + * @struct wl_data_device_interface + */ +struct wl_data_device_interface { + /** + * start drag-and-drop operation + * + * This request asks the compositor to start a drag-and-drop + * operation on behalf of the client. + * + * The source argument is the data source that provides the data + * for the eventual data transfer. If source is NULL, enter, leave + * and motion events are sent only to the client that initiated the + * drag and the client is expected to handle the data passing + * internally. + * + * The origin surface is the surface where the drag originates and + * the client must have an active implicit grab that matches the + * serial. + * + * The icon surface is an optional (can be NULL) surface that + * provides an icon to be moved around with the cursor. Initially, + * the top-left corner of the icon surface is placed at the cursor + * hotspot, but subsequent wl_surface.attach request can move the + * relative position. Attach requests must be confirmed with + * wl_surface.commit as usual. The icon surface is given the role + * of a drag-and-drop icon. If the icon surface already has another + * role, it raises a protocol error. + * + * The current and pending input regions of the icon wl_surface are + * cleared, and wl_surface.set_input_region is ignored until the + * wl_surface is no longer used as the icon surface. When the use + * as an icon ends, the current and pending input regions become + * undefined, and the wl_surface is unmapped. + * @param source data source for the eventual transfer + * @param origin surface where the drag originates + * @param icon drag-and-drop icon surface + * @param serial serial number of the implicit grab on the origin + */ + void (*start_drag)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *source, + struct wl_resource *origin, + struct wl_resource *icon, + uint32_t serial); + /** + * copy data to the selection + * + * This request asks the compositor to set the selection to the + * data from the source on behalf of the client. + * + * To unset the selection, set the source to NULL. + * @param source data source for the selection + * @param serial serial number of the event that triggered this request + */ + void (*set_selection)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *source, + uint32_t serial); + /** + * destroy data device + * + * This request destroys the data device. + * @since 2 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define WL_DATA_DEVICE_DATA_OFFER 0 +#define WL_DATA_DEVICE_ENTER 1 +#define WL_DATA_DEVICE_LEAVE 2 +#define WL_DATA_DEVICE_MOTION 3 +#define WL_DATA_DEVICE_DROP 4 +#define WL_DATA_DEVICE_SELECTION 5 + +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_DATA_OFFER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_LEAVE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_MOTION_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_DROP_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_SELECTION_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_START_DRAG_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_SET_SELECTION_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device + */ +#define WL_DATA_DEVICE_RELEASE_SINCE_VERSION 2 + +/** + * @ingroup iface_wl_data_device + * Sends an data_offer event to the client owning the resource. + * @param resource_ The client's resource + * @param id the new data_offer object + */ +static inline void +wl_data_device_send_data_offer(struct wl_resource *resource_, struct wl_resource *id) +{ + wl_resource_post_event(resource_, WL_DATA_DEVICE_DATA_OFFER, id); +} + +/** + * @ingroup iface_wl_data_device + * Sends an enter event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the enter event + * @param surface client surface entered + * @param x surface-local x coordinate + * @param y surface-local y coordinate + * @param id source data_offer object + */ +static inline void +wl_data_device_send_enter(struct wl_resource *resource_, uint32_t serial, struct wl_resource *surface, wl_fixed_t x, wl_fixed_t y, struct wl_resource *id) +{ + wl_resource_post_event(resource_, WL_DATA_DEVICE_ENTER, serial, surface, x, y, id); +} + +/** + * @ingroup iface_wl_data_device + * Sends an leave event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_data_device_send_leave(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_DEVICE_LEAVE); +} + +/** + * @ingroup iface_wl_data_device + * Sends an motion event to the client owning the resource. + * @param resource_ The client's resource + * @param time timestamp with millisecond granularity + * @param x surface-local x coordinate + * @param y surface-local y coordinate + */ +static inline void +wl_data_device_send_motion(struct wl_resource *resource_, uint32_t time, wl_fixed_t x, wl_fixed_t y) +{ + wl_resource_post_event(resource_, WL_DATA_DEVICE_MOTION, time, x, y); +} + +/** + * @ingroup iface_wl_data_device + * Sends an drop event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_data_device_send_drop(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_DEVICE_DROP); +} + +/** + * @ingroup iface_wl_data_device + * Sends an selection event to the client owning the resource. + * @param resource_ The client's resource + * @param id selection data_offer object + */ +static inline void +wl_data_device_send_selection(struct wl_resource *resource_, struct wl_resource *id) +{ + wl_resource_post_event(resource_, WL_DATA_DEVICE_SELECTION, id); +} + +#ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +#define WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +/** + * @ingroup iface_wl_data_device_manager + * drag and drop actions + * + * This is a bitmask of the available/preferred actions in a + * drag-and-drop operation. + * + * In the compositor, the selected action is a result of matching the + * actions offered by the source and destination sides. "action" events + * with a "none" action will be sent to both source and destination if + * there is no match. All further checks will effectively happen on + * (source actions ∩ destination actions). + * + * In addition, compositors may also pick different actions in + * reaction to key modifiers being pressed. One common design that + * is used in major toolkits (and the behavior recommended for + * compositors) is: + * + * - If no modifiers are pressed, the first match (in bit order) + * will be used. + * - Pressing Shift selects "move", if enabled in the mask. + * - Pressing Control selects "copy", if enabled in the mask. + * + * Behavior beyond that is considered implementation-dependent. + * Compositors may for example bind other modifiers (like Alt/Meta) + * or drags initiated with other buttons than BTN_LEFT to specific + * actions (e.g. "ask"). + */ +enum wl_data_device_manager_dnd_action { + /** + * no action + */ + WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0, + /** + * copy action + */ + WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY = 1, + /** + * move action + */ + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE = 2, + /** + * ask action + */ + WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK = 4, +}; +#endif /* WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM */ + +/** + * @ingroup iface_wl_data_device_manager + * @struct wl_data_device_manager_interface + */ +struct wl_data_device_manager_interface { + /** + * create a new data source + * + * Create a new data source. + * @param id data source to create + */ + void (*create_data_source)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * create a new data device + * + * Create a new data device for a given seat. + * @param id data device to create + * @param seat seat associated with the data device + */ + void (*get_data_device)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *seat); +}; + + +/** + * @ingroup iface_wl_data_device_manager + */ +#define WL_DATA_DEVICE_MANAGER_CREATE_DATA_SOURCE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_data_device_manager + */ +#define WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE_SINCE_VERSION 1 + +#ifndef WL_SHELL_ERROR_ENUM +#define WL_SHELL_ERROR_ENUM +enum wl_shell_error { + /** + * given wl_surface has another role + */ + WL_SHELL_ERROR_ROLE = 0, +}; +#endif /* WL_SHELL_ERROR_ENUM */ + +/** + * @ingroup iface_wl_shell + * @struct wl_shell_interface + */ +struct wl_shell_interface { + /** + * create a shell surface from a surface + * + * Create a shell surface for an existing surface. This gives the + * wl_surface the role of a shell surface. If the wl_surface + * already has another role, it raises a protocol error. + * + * Only one shell surface can be associated with a given surface. + * @param id shell surface to create + * @param surface surface to be given the shell surface role + */ + void (*get_shell_surface)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface); +}; + + +/** + * @ingroup iface_wl_shell + */ +#define WL_SHELL_GET_SHELL_SURFACE_SINCE_VERSION 1 + +#ifndef WL_SHELL_SURFACE_RESIZE_ENUM +#define WL_SHELL_SURFACE_RESIZE_ENUM +/** + * @ingroup iface_wl_shell_surface + * edge values for resizing + * + * These values are used to indicate which edge of a surface + * is being dragged in a resize operation. The server may + * use this information to adapt its behavior, e.g. choose + * an appropriate cursor image. + */ +enum wl_shell_surface_resize { + /** + * no edge + */ + WL_SHELL_SURFACE_RESIZE_NONE = 0, + /** + * top edge + */ + WL_SHELL_SURFACE_RESIZE_TOP = 1, + /** + * bottom edge + */ + WL_SHELL_SURFACE_RESIZE_BOTTOM = 2, + /** + * left edge + */ + WL_SHELL_SURFACE_RESIZE_LEFT = 4, + /** + * top and left edges + */ + WL_SHELL_SURFACE_RESIZE_TOP_LEFT = 5, + /** + * bottom and left edges + */ + WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT = 6, + /** + * right edge + */ + WL_SHELL_SURFACE_RESIZE_RIGHT = 8, + /** + * top and right edges + */ + WL_SHELL_SURFACE_RESIZE_TOP_RIGHT = 9, + /** + * bottom and right edges + */ + WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT = 10, +}; +#endif /* WL_SHELL_SURFACE_RESIZE_ENUM */ + +#ifndef WL_SHELL_SURFACE_TRANSIENT_ENUM +#define WL_SHELL_SURFACE_TRANSIENT_ENUM +/** + * @ingroup iface_wl_shell_surface + * details of transient behaviour + * + * These flags specify details of the expected behaviour + * of transient surfaces. Used in the set_transient request. + */ +enum wl_shell_surface_transient { + /** + * do not set keyboard focus + */ + WL_SHELL_SURFACE_TRANSIENT_INACTIVE = 0x1, +}; +#endif /* WL_SHELL_SURFACE_TRANSIENT_ENUM */ + +#ifndef WL_SHELL_SURFACE_FULLSCREEN_METHOD_ENUM +#define WL_SHELL_SURFACE_FULLSCREEN_METHOD_ENUM +/** + * @ingroup iface_wl_shell_surface + * different method to set the surface fullscreen + * + * Hints to indicate to the compositor how to deal with a conflict + * between the dimensions of the surface and the dimensions of the + * output. The compositor is free to ignore this parameter. + */ +enum wl_shell_surface_fullscreen_method { + /** + * no preference, apply default policy + */ + WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT = 0, + /** + * scale, preserve the surface's aspect ratio and center on output + */ + WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE = 1, + /** + * switch output mode to the smallest mode that can fit the surface, add black borders to compensate size mismatch + */ + WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER = 2, + /** + * no upscaling, center on output and add black borders to compensate size mismatch + */ + WL_SHELL_SURFACE_FULLSCREEN_METHOD_FILL = 3, +}; +#endif /* WL_SHELL_SURFACE_FULLSCREEN_METHOD_ENUM */ + +/** + * @ingroup iface_wl_shell_surface + * @struct wl_shell_surface_interface + */ +struct wl_shell_surface_interface { + /** + * respond to a ping event + * + * A client must respond to a ping event with a pong request or + * the client may be deemed unresponsive. + * @param serial serial number of the ping event + */ + void (*pong)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); + /** + * start an interactive move + * + * Start a pointer-driven move of the surface. + * + * This request must be used in response to a button press event. + * The server may ignore move requests depending on the state of + * the surface (e.g. fullscreen or maximized). + * @param seat seat whose pointer is used + * @param serial serial number of the implicit grab on the pointer + */ + void (*move)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial); + /** + * start an interactive resize + * + * Start a pointer-driven resizing of the surface. + * + * This request must be used in response to a button press event. + * The server may ignore resize requests depending on the state of + * the surface (e.g. fullscreen or maximized). + * @param seat seat whose pointer is used + * @param serial serial number of the implicit grab on the pointer + * @param edges which edge or corner is being dragged + */ + void (*resize)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial, + uint32_t edges); + /** + * make the surface a toplevel surface + * + * Map the surface as a toplevel surface. + * + * A toplevel surface is not fullscreen, maximized or transient. + */ + void (*set_toplevel)(struct wl_client *client, + struct wl_resource *resource); + /** + * make the surface a transient surface + * + * Map the surface relative to an existing surface. + * + * The x and y arguments specify the location of the upper left + * corner of the surface relative to the upper left corner of the + * parent surface, in surface-local coordinates. + * + * The flags argument controls details of the transient behaviour. + * @param parent parent surface + * @param x surface-local x coordinate + * @param y surface-local y coordinate + * @param flags transient surface behavior + */ + void (*set_transient)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *parent, + int32_t x, + int32_t y, + uint32_t flags); + /** + * make the surface a fullscreen surface + * + * Map the surface as a fullscreen surface. + * + * If an output parameter is given then the surface will be made + * fullscreen on that output. If the client does not specify the + * output then the compositor will apply its policy - usually + * choosing the output on which the surface has the biggest surface + * area. + * + * The client may specify a method to resolve a size conflict + * between the output size and the surface size - this is provided + * through the method parameter. + * + * The framerate parameter is used only when the method is set to + * "driver", to indicate the preferred framerate. A value of 0 + * indicates that the client does not care about framerate. The + * framerate is specified in mHz, that is framerate of 60000 is + * 60Hz. + * + * A method of "scale" or "driver" implies a scaling operation of + * the surface, either via a direct scaling operation or a change + * of the output mode. This will override any kind of output + * scaling, so that mapping a surface with a buffer size equal to + * the mode can fill the screen independent of buffer_scale. + * + * A method of "fill" means we don't scale up the buffer, however + * any output scale is applied. This means that you may run into an + * edge case where the application maps a buffer with the same size + * of the output mode but buffer_scale 1 (thus making a surface + * larger than the output). In this case it is allowed to downscale + * the results to fit the screen. + * + * The compositor must reply to this request with a configure event + * with the dimensions for the output on which the surface will be + * made fullscreen. + * @param method method for resolving size conflict + * @param framerate framerate in mHz + * @param output output on which the surface is to be fullscreen + */ + void (*set_fullscreen)(struct wl_client *client, + struct wl_resource *resource, + uint32_t method, + uint32_t framerate, + struct wl_resource *output); + /** + * make the surface a popup surface + * + * Map the surface as a popup. + * + * A popup surface is a transient surface with an added pointer + * grab. + * + * An existing implicit grab will be changed to owner-events mode, + * and the popup grab will continue after the implicit grab ends + * (i.e. releasing the mouse button does not cause the popup to be + * unmapped). + * + * The popup grab continues until the window is destroyed or a + * mouse button is pressed in any other client's window. A click in + * any of the client's surfaces is reported as normal, however, + * clicks in other clients' surfaces will be discarded and trigger + * the callback. + * + * The x and y arguments specify the location of the upper left + * corner of the surface relative to the upper left corner of the + * parent surface, in surface-local coordinates. + * @param seat seat whose pointer is used + * @param serial serial number of the implicit grab on the pointer + * @param parent parent surface + * @param x surface-local x coordinate + * @param y surface-local y coordinate + * @param flags transient surface behavior + */ + void (*set_popup)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial, + struct wl_resource *parent, + int32_t x, + int32_t y, + uint32_t flags); + /** + * make the surface a maximized surface + * + * Map the surface as a maximized surface. + * + * If an output parameter is given then the surface will be + * maximized on that output. If the client does not specify the + * output then the compositor will apply its policy - usually + * choosing the output on which the surface has the biggest surface + * area. + * + * The compositor will reply with a configure event telling the + * expected new surface size. The operation is completed on the + * next buffer attach to this surface. + * + * A maximized surface typically fills the entire output it is + * bound to, except for desktop elements such as panels. This is + * the main difference between a maximized shell surface and a + * fullscreen shell surface. + * + * The details depend on the compositor implementation. + * @param output output on which the surface is to be maximized + */ + void (*set_maximized)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *output); + /** + * set surface title + * + * Set a short title for the surface. + * + * This string may be used to identify the surface in a task bar, + * window list, or other user interface elements provided by the + * compositor. + * + * The string must be encoded in UTF-8. + * @param title surface title + */ + void (*set_title)(struct wl_client *client, + struct wl_resource *resource, + const char *title); + /** + * set surface class + * + * Set a class for the surface. + * + * The surface class identifies the general class of applications + * to which the surface belongs. A common convention is to use the + * file name (or the full path if it is a non-standard location) of + * the application's .desktop file as the class. + * @param class_ surface class + */ + void (*set_class)(struct wl_client *client, + struct wl_resource *resource, + const char *class_); +}; + +#define WL_SHELL_SURFACE_PING 0 +#define WL_SHELL_SURFACE_CONFIGURE 1 +#define WL_SHELL_SURFACE_POPUP_DONE 2 + +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_PING_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_POPUP_DONE_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_PONG_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_MOVE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_RESIZE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_SET_TOPLEVEL_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_SET_TRANSIENT_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_SET_FULLSCREEN_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_SET_POPUP_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_SET_MAXIMIZED_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_SET_TITLE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_shell_surface + */ +#define WL_SHELL_SURFACE_SET_CLASS_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_shell_surface + * Sends an ping event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the ping + */ +static inline void +wl_shell_surface_send_ping(struct wl_resource *resource_, uint32_t serial) +{ + wl_resource_post_event(resource_, WL_SHELL_SURFACE_PING, serial); +} + +/** + * @ingroup iface_wl_shell_surface + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + * @param edges how the surface was resized + * @param width new width of the surface + * @param height new height of the surface + */ +static inline void +wl_shell_surface_send_configure(struct wl_resource *resource_, uint32_t edges, int32_t width, int32_t height) +{ + wl_resource_post_event(resource_, WL_SHELL_SURFACE_CONFIGURE, edges, width, height); +} + +/** + * @ingroup iface_wl_shell_surface + * Sends an popup_done event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_shell_surface_send_popup_done(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_SHELL_SURFACE_POPUP_DONE); +} + +#ifndef WL_SURFACE_ERROR_ENUM +#define WL_SURFACE_ERROR_ENUM +/** + * @ingroup iface_wl_surface + * wl_surface error values + * + * These errors can be emitted in response to wl_surface requests. + */ +enum wl_surface_error { + /** + * buffer scale value is invalid + */ + WL_SURFACE_ERROR_INVALID_SCALE = 0, + /** + * buffer transform value is invalid + */ + WL_SURFACE_ERROR_INVALID_TRANSFORM = 1, +}; +#endif /* WL_SURFACE_ERROR_ENUM */ + +/** + * @ingroup iface_wl_surface + * @struct wl_surface_interface + */ +struct wl_surface_interface { + /** + * delete surface + * + * Deletes the surface and invalidates its object ID. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the surface contents + * + * Set a buffer as the content of this surface. + * + * The new size of the surface is calculated based on the buffer + * size transformed by the inverse buffer_transform and the inverse + * buffer_scale. This means that the supplied buffer must be an + * integer multiple of the buffer_scale. + * + * The x and y arguments specify the location of the new pending + * buffer's upper left corner, relative to the current buffer's + * upper left corner, in surface-local coordinates. In other words, + * the x and y, combined with the new surface size define in which + * directions the surface's size changes. + * + * Surface contents are double-buffered state, see + * wl_surface.commit. + * + * The initial surface contents are void; there is no content. + * wl_surface.attach assigns the given wl_buffer as the pending + * wl_buffer. wl_surface.commit makes the pending wl_buffer the new + * surface contents, and the size of the surface becomes the size + * calculated from the wl_buffer, as described above. After commit, + * there is no pending buffer until the next attach. + * + * Committing a pending wl_buffer allows the compositor to read the + * pixels in the wl_buffer. The compositor may access the pixels at + * any time after the wl_surface.commit request. When the + * compositor will not access the pixels anymore, it will send the + * wl_buffer.release event. Only after receiving wl_buffer.release, + * the client may reuse the wl_buffer. A wl_buffer that has been + * attached and then replaced by another attach instead of + * committed will not receive a release event, and is not used by + * the compositor. + * + * Destroying the wl_buffer after wl_buffer.release does not change + * the surface contents. However, if the client destroys the + * wl_buffer before receiving the wl_buffer.release event, the + * surface contents become undefined immediately. + * + * If wl_surface.attach is sent with a NULL wl_buffer, the + * following wl_surface.commit will remove the surface content. + * @param buffer buffer of surface contents + * @param x surface-local x coordinate + * @param y surface-local y coordinate + */ + void (*attach)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *buffer, + int32_t x, + int32_t y); + /** + * mark part of the surface damaged + * + * This request is used to describe the regions where the pending + * buffer is different from the current surface contents, and where + * the surface therefore needs to be repainted. The compositor + * ignores the parts of the damage that fall outside of the + * surface. + * + * Damage is double-buffered state, see wl_surface.commit. + * + * The damage rectangle is specified in surface-local coordinates, + * where x and y specify the upper left corner of the damage + * rectangle. + * + * The initial value for pending damage is empty: no damage. + * wl_surface.damage adds pending damage: the new pending damage is + * the union of old pending damage and the given rectangle. + * + * wl_surface.commit assigns pending damage as the current damage, + * and clears pending damage. The server will clear the current + * damage as it repaints the surface. + * + * Alternatively, damage can be posted with + * wl_surface.damage_buffer which uses buffer coordinates instead + * of surface coordinates, and is probably the preferred and + * intuitive way of doing this. + * @param x surface-local x coordinate + * @param y surface-local y coordinate + * @param width width of damage rectangle + * @param height height of damage rectangle + */ + void (*damage)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); + /** + * request a frame throttling hint + * + * Request a notification when it is a good time to start drawing + * a new frame, by creating a frame callback. This is useful for + * throttling redrawing operations, and driving animations. + * + * When a client is animating on a wl_surface, it can use the + * 'frame' request to get notified when it is a good time to draw + * and commit the next frame of animation. If the client commits an + * update earlier than that, it is likely that some updates will + * not make it to the display, and the client is wasting resources + * by drawing too often. + * + * The frame request will take effect on the next + * wl_surface.commit. The notification will only be posted for one + * frame unless requested again. For a wl_surface, the + * notifications are posted in the order the frame requests were + * committed. + * + * The server must send the notifications so that a client will not + * send excessive updates, while still allowing the highest + * possible update rate for clients that wait for the reply before + * drawing again. The server should give some time for the client + * to draw and commit after sending the frame callback events to + * let it hit the next output refresh. + * + * A server should avoid signaling the frame callbacks if the + * surface is not visible in any way, e.g. the surface is + * off-screen, or completely obscured by other opaque surfaces. + * + * The object returned by this request will be destroyed by the + * compositor after the callback is fired and as such the client + * must not attempt to use it after that point. + * + * The callback_data passed in the callback is the current time, in + * milliseconds, with an undefined base. + * @param callback callback object for the frame request + */ + void (*frame)(struct wl_client *client, + struct wl_resource *resource, + uint32_t callback); + /** + * set opaque region + * + * This request sets the region of the surface that contains + * opaque content. + * + * The opaque region is an optimization hint for the compositor + * that lets it optimize the redrawing of content behind opaque + * regions. Setting an opaque region is not required for correct + * behaviour, but marking transparent content as opaque will result + * in repaint artifacts. + * + * The opaque region is specified in surface-local coordinates. + * + * The compositor ignores the parts of the opaque region that fall + * outside of the surface. + * + * Opaque region is double-buffered state, see wl_surface.commit. + * + * wl_surface.set_opaque_region changes the pending opaque region. + * wl_surface.commit copies the pending region to the current + * region. Otherwise, the pending and current regions are never + * changed. + * + * The initial value for an opaque region is empty. Setting the + * pending opaque region has copy semantics, and the wl_region + * object can be destroyed immediately. A NULL wl_region causes the + * pending opaque region to be set to empty. + * @param region opaque region of the surface + */ + void (*set_opaque_region)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region); + /** + * set input region + * + * This request sets the region of the surface that can receive + * pointer and touch events. + * + * Input events happening outside of this region will try the next + * surface in the server surface stack. The compositor ignores the + * parts of the input region that fall outside of the surface. + * + * The input region is specified in surface-local coordinates. + * + * Input region is double-buffered state, see wl_surface.commit. + * + * wl_surface.set_input_region changes the pending input region. + * wl_surface.commit copies the pending region to the current + * region. Otherwise the pending and current regions are never + * changed, except cursor and icon surfaces are special cases, see + * wl_pointer.set_cursor and wl_data_device.start_drag. + * + * The initial value for an input region is infinite. That means + * the whole surface will accept input. Setting the pending input + * region has copy semantics, and the wl_region object can be + * destroyed immediately. A NULL wl_region causes the input region + * to be set to infinite. + * @param region input region of the surface + */ + void (*set_input_region)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region); + /** + * commit pending surface state + * + * Surface state (input, opaque, and damage regions, attached + * buffers, etc.) is double-buffered. Protocol requests modify the + * pending state, as opposed to the current state in use by the + * compositor. A commit request atomically applies all pending + * state, replacing the current state. After commit, the new + * pending state is as documented for each related request. + * + * On commit, a pending wl_buffer is applied first, and all other + * state second. This means that all coordinates in double-buffered + * state are relative to the new wl_buffer coming into use, except + * for wl_surface.attach itself. If there is no pending wl_buffer, + * the coordinates are relative to the current surface contents. + * + * All requests that need a commit to become effective are + * documented to affect double-buffered state. + * + * Other interfaces may add further double-buffered surface state. + */ + void (*commit)(struct wl_client *client, + struct wl_resource *resource); + /** + * sets the buffer transformation + * + * This request sets an optional transformation on how the + * compositor interprets the contents of the buffer attached to the + * surface. The accepted values for the transform parameter are the + * values for wl_output.transform. + * + * Buffer transform is double-buffered state, see + * wl_surface.commit. + * + * A newly created surface has its buffer transformation set to + * normal. + * + * wl_surface.set_buffer_transform changes the pending buffer + * transformation. wl_surface.commit copies the pending buffer + * transformation to the current one. Otherwise, the pending and + * current values are never changed. + * + * The purpose of this request is to allow clients to render + * content according to the output transform, thus permitting the + * compositor to use certain optimizations even if the display is + * rotated. Using hardware overlays and scanning out a client + * buffer for fullscreen surfaces are examples of such + * optimizations. Those optimizations are highly dependent on the + * compositor implementation, so the use of this request should be + * considered on a case-by-case basis. + * + * Note that if the transform value includes 90 or 270 degree + * rotation, the width of the buffer will become the surface height + * and the height of the buffer will become the surface width. + * + * If transform is not one of the values from the + * wl_output.transform enum the invalid_transform protocol error is + * raised. + * @param transform transform for interpreting buffer contents + * @since 2 + */ + void (*set_buffer_transform)(struct wl_client *client, + struct wl_resource *resource, + int32_t transform); + /** + * sets the buffer scaling factor + * + * This request sets an optional scaling factor on how the + * compositor interprets the contents of the buffer attached to the + * window. + * + * Buffer scale is double-buffered state, see wl_surface.commit. + * + * A newly created surface has its buffer scale set to 1. + * + * wl_surface.set_buffer_scale changes the pending buffer scale. + * wl_surface.commit copies the pending buffer scale to the current + * one. Otherwise, the pending and current values are never + * changed. + * + * The purpose of this request is to allow clients to supply higher + * resolution buffer data for use on high resolution outputs. It is + * intended that you pick the same buffer scale as the scale of the + * output that the surface is displayed on. This means the + * compositor can avoid scaling when rendering the surface on that + * output. + * + * Note that if the scale is larger than 1, then you have to attach + * a buffer that is larger (by a factor of scale in each dimension) + * than the desired surface size. + * + * If scale is not positive the invalid_scale protocol error is + * raised. + * @param scale positive scale for interpreting buffer contents + * @since 3 + */ + void (*set_buffer_scale)(struct wl_client *client, + struct wl_resource *resource, + int32_t scale); + /** + * mark part of the surface damaged using buffer coordinates + * + * This request is used to describe the regions where the pending + * buffer is different from the current surface contents, and where + * the surface therefore needs to be repainted. The compositor + * ignores the parts of the damage that fall outside of the + * surface. + * + * Damage is double-buffered state, see wl_surface.commit. + * + * The damage rectangle is specified in buffer coordinates, where x + * and y specify the upper left corner of the damage rectangle. + * + * The initial value for pending damage is empty: no damage. + * wl_surface.damage_buffer adds pending damage: the new pending + * damage is the union of old pending damage and the given + * rectangle. + * + * wl_surface.commit assigns pending damage as the current damage, + * and clears pending damage. The server will clear the current + * damage as it repaints the surface. + * + * This request differs from wl_surface.damage in only one way - it + * takes damage in buffer coordinates instead of surface-local + * coordinates. While this generally is more intuitive than surface + * coordinates, it is especially desirable when using wp_viewport + * or when a drawing library (like EGL) is unaware of buffer scale + * and buffer transform. + * + * Note: Because buffer transformation changes and damage requests + * may be interleaved in the protocol stream, it is impossible to + * determine the actual mapping between surface and buffer damage + * until wl_surface.commit time. Therefore, compositors wishing to + * take both kinds of damage into account will have to accumulate + * damage from the two requests separately and only transform from + * one to the other after receiving the wl_surface.commit. + * @param x buffer-local x coordinate + * @param y buffer-local y coordinate + * @param width width of damage rectangle + * @param height height of damage rectangle + * @since 4 + */ + void (*damage_buffer)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); +}; + +#define WL_SURFACE_ENTER 0 +#define WL_SURFACE_LEAVE 1 + +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_LEAVE_SINCE_VERSION 1 + +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_ATTACH_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_DAMAGE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_FRAME_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_SET_OPAQUE_REGION_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_SET_INPUT_REGION_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_COMMIT_SINCE_VERSION 1 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_SET_BUFFER_TRANSFORM_SINCE_VERSION 2 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION 3 +/** + * @ingroup iface_wl_surface + */ +#define WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION 4 + +/** + * @ingroup iface_wl_surface + * Sends an enter event to the client owning the resource. + * @param resource_ The client's resource + * @param output output entered by the surface + */ +static inline void +wl_surface_send_enter(struct wl_resource *resource_, struct wl_resource *output) +{ + wl_resource_post_event(resource_, WL_SURFACE_ENTER, output); +} + +/** + * @ingroup iface_wl_surface + * Sends an leave event to the client owning the resource. + * @param resource_ The client's resource + * @param output output left by the surface + */ +static inline void +wl_surface_send_leave(struct wl_resource *resource_, struct wl_resource *output) +{ + wl_resource_post_event(resource_, WL_SURFACE_LEAVE, output); +} + +#ifndef WL_SEAT_CAPABILITY_ENUM +#define WL_SEAT_CAPABILITY_ENUM +/** + * @ingroup iface_wl_seat + * seat capability bitmask + * + * This is a bitmask of capabilities this seat has; if a member is + * set, then it is present on the seat. + */ +enum wl_seat_capability { + /** + * the seat has pointer devices + */ + WL_SEAT_CAPABILITY_POINTER = 1, + /** + * the seat has one or more keyboards + */ + WL_SEAT_CAPABILITY_KEYBOARD = 2, + /** + * the seat has touch devices + */ + WL_SEAT_CAPABILITY_TOUCH = 4, +}; +#endif /* WL_SEAT_CAPABILITY_ENUM */ + +/** + * @ingroup iface_wl_seat + * @struct wl_seat_interface + */ +struct wl_seat_interface { + /** + * return pointer object + * + * The ID provided will be initialized to the wl_pointer + * interface for this seat. + * + * This request only takes effect if the seat has the pointer + * capability, or has had the pointer capability in the past. It is + * a protocol violation to issue this request on a seat that has + * never had the pointer capability. + * @param id seat pointer + */ + void (*get_pointer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * return keyboard object + * + * The ID provided will be initialized to the wl_keyboard + * interface for this seat. + * + * This request only takes effect if the seat has the keyboard + * capability, or has had the keyboard capability in the past. It + * is a protocol violation to issue this request on a seat that has + * never had the keyboard capability. + * @param id seat keyboard + */ + void (*get_keyboard)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * return touch object + * + * The ID provided will be initialized to the wl_touch interface + * for this seat. + * + * This request only takes effect if the seat has the touch + * capability, or has had the touch capability in the past. It is a + * protocol violation to issue this request on a seat that has + * never had the touch capability. + * @param id seat touch interface + */ + void (*get_touch)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * release the seat object + * + * Using this request a client can tell the server that it is not + * going to use the seat object anymore. + * @since 5 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define WL_SEAT_CAPABILITIES 0 +#define WL_SEAT_NAME 1 + +/** + * @ingroup iface_wl_seat + */ +#define WL_SEAT_CAPABILITIES_SINCE_VERSION 1 +/** + * @ingroup iface_wl_seat + */ +#define WL_SEAT_NAME_SINCE_VERSION 2 + +/** + * @ingroup iface_wl_seat + */ +#define WL_SEAT_GET_POINTER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_seat + */ +#define WL_SEAT_GET_KEYBOARD_SINCE_VERSION 1 +/** + * @ingroup iface_wl_seat + */ +#define WL_SEAT_GET_TOUCH_SINCE_VERSION 1 +/** + * @ingroup iface_wl_seat + */ +#define WL_SEAT_RELEASE_SINCE_VERSION 5 + +/** + * @ingroup iface_wl_seat + * Sends an capabilities event to the client owning the resource. + * @param resource_ The client's resource + * @param capabilities capabilities of the seat + */ +static inline void +wl_seat_send_capabilities(struct wl_resource *resource_, uint32_t capabilities) +{ + wl_resource_post_event(resource_, WL_SEAT_CAPABILITIES, capabilities); +} + +/** + * @ingroup iface_wl_seat + * Sends an name event to the client owning the resource. + * @param resource_ The client's resource + * @param name seat identifier + */ +static inline void +wl_seat_send_name(struct wl_resource *resource_, const char *name) +{ + wl_resource_post_event(resource_, WL_SEAT_NAME, name); +} + +#ifndef WL_POINTER_ERROR_ENUM +#define WL_POINTER_ERROR_ENUM +enum wl_pointer_error { + /** + * given wl_surface has another role + */ + WL_POINTER_ERROR_ROLE = 0, +}; +#endif /* WL_POINTER_ERROR_ENUM */ + +#ifndef WL_POINTER_BUTTON_STATE_ENUM +#define WL_POINTER_BUTTON_STATE_ENUM +/** + * @ingroup iface_wl_pointer + * physical button state + * + * Describes the physical state of a button that produced the button + * event. + */ +enum wl_pointer_button_state { + /** + * the button is not pressed + */ + WL_POINTER_BUTTON_STATE_RELEASED = 0, + /** + * the button is pressed + */ + WL_POINTER_BUTTON_STATE_PRESSED = 1, +}; +#endif /* WL_POINTER_BUTTON_STATE_ENUM */ + +#ifndef WL_POINTER_AXIS_ENUM +#define WL_POINTER_AXIS_ENUM +/** + * @ingroup iface_wl_pointer + * axis types + * + * Describes the axis types of scroll events. + */ +enum wl_pointer_axis { + /** + * vertical axis + */ + WL_POINTER_AXIS_VERTICAL_SCROLL = 0, + /** + * horizontal axis + */ + WL_POINTER_AXIS_HORIZONTAL_SCROLL = 1, +}; +#endif /* WL_POINTER_AXIS_ENUM */ + +#ifndef WL_POINTER_AXIS_SOURCE_ENUM +#define WL_POINTER_AXIS_SOURCE_ENUM +/** + * @ingroup iface_wl_pointer + * axis source types + * + * Describes the source types for axis events. This indicates to the + * client how an axis event was physically generated; a client may + * adjust the user interface accordingly. For example, scroll events + * from a "finger" source may be in a smooth coordinate space with + * kinetic scrolling whereas a "wheel" source may be in discrete steps + * of a number of lines. + * + * The "continuous" axis source is a device generating events in a + * continuous coordinate space, but using something other than a + * finger. One example for this source is button-based scrolling where + * the vertical motion of a device is converted to scroll events while + * a button is held down. + * + * The "wheel tilt" axis source indicates that the actual device is a + * wheel but the scroll event is not caused by a rotation but a + * (usually sideways) tilt of the wheel. + */ +enum wl_pointer_axis_source { + /** + * a physical wheel rotation + */ + WL_POINTER_AXIS_SOURCE_WHEEL = 0, + /** + * finger on a touch surface + */ + WL_POINTER_AXIS_SOURCE_FINGER = 1, + /** + * continuous coordinate space + */ + WL_POINTER_AXIS_SOURCE_CONTINUOUS = 2, + /** + * a physical wheel tilt + * @since 6 + */ + WL_POINTER_AXIS_SOURCE_WHEEL_TILT = 3, +}; +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_AXIS_SOURCE_WHEEL_TILT_SINCE_VERSION 6 +#endif /* WL_POINTER_AXIS_SOURCE_ENUM */ + +/** + * @ingroup iface_wl_pointer + * @struct wl_pointer_interface + */ +struct wl_pointer_interface { + /** + * set the pointer surface + * + * Set the pointer surface, i.e., the surface that contains the + * pointer image (cursor). This request gives the surface the role + * of a cursor. If the surface already has another role, it raises + * a protocol error. + * + * The cursor actually changes only if the pointer focus for this + * device is one of the requesting client's surfaces or the surface + * parameter is the current pointer surface. If there was a + * previous surface set with this request it is replaced. If + * surface is NULL, the pointer image is hidden. + * + * The parameters hotspot_x and hotspot_y define the position of + * the pointer surface relative to the pointer location. Its + * top-left corner is always at (x, y) - (hotspot_x, hotspot_y), + * where (x, y) are the coordinates of the pointer location, in + * surface-local coordinates. + * + * On surface.attach requests to the pointer surface, hotspot_x and + * hotspot_y are decremented by the x and y parameters passed to + * the request. Attach must be confirmed by wl_surface.commit as + * usual. + * + * The hotspot can also be updated by passing the currently set + * pointer surface to this request with new values for hotspot_x + * and hotspot_y. + * + * The current and pending input regions of the wl_surface are + * cleared, and wl_surface.set_input_region is ignored until the + * wl_surface is no longer used as the cursor. When the use as a + * cursor ends, the current and pending input regions become + * undefined, and the wl_surface is unmapped. + * @param serial serial number of the enter event + * @param surface pointer surface + * @param hotspot_x surface-local x coordinate + * @param hotspot_y surface-local y coordinate + */ + void (*set_cursor)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial, + struct wl_resource *surface, + int32_t hotspot_x, + int32_t hotspot_y); + /** + * release the pointer object + * + * Using this request a client can tell the server that it is not + * going to use the pointer object anymore. + * + * This request destroys the pointer proxy object, so clients must + * not call wl_pointer_destroy() after using this request. + * @since 3 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define WL_POINTER_ENTER 0 +#define WL_POINTER_LEAVE 1 +#define WL_POINTER_MOTION 2 +#define WL_POINTER_BUTTON 3 +#define WL_POINTER_AXIS 4 +#define WL_POINTER_FRAME 5 +#define WL_POINTER_AXIS_SOURCE 6 +#define WL_POINTER_AXIS_STOP 7 +#define WL_POINTER_AXIS_DISCRETE 8 + +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_LEAVE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_MOTION_SINCE_VERSION 1 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_BUTTON_SINCE_VERSION 1 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_AXIS_SINCE_VERSION 1 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_FRAME_SINCE_VERSION 5 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_AXIS_SOURCE_SINCE_VERSION 5 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_AXIS_STOP_SINCE_VERSION 5 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_AXIS_DISCRETE_SINCE_VERSION 5 + +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_SET_CURSOR_SINCE_VERSION 1 +/** + * @ingroup iface_wl_pointer + */ +#define WL_POINTER_RELEASE_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_pointer + * Sends an enter event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the enter event + * @param surface surface entered by the pointer + * @param surface_x surface-local x coordinate + * @param surface_y surface-local y coordinate + */ +static inline void +wl_pointer_send_enter(struct wl_resource *resource_, uint32_t serial, struct wl_resource *surface, wl_fixed_t surface_x, wl_fixed_t surface_y) +{ + wl_resource_post_event(resource_, WL_POINTER_ENTER, serial, surface, surface_x, surface_y); +} + +/** + * @ingroup iface_wl_pointer + * Sends an leave event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the leave event + * @param surface surface left by the pointer + */ +static inline void +wl_pointer_send_leave(struct wl_resource *resource_, uint32_t serial, struct wl_resource *surface) +{ + wl_resource_post_event(resource_, WL_POINTER_LEAVE, serial, surface); +} + +/** + * @ingroup iface_wl_pointer + * Sends an motion event to the client owning the resource. + * @param resource_ The client's resource + * @param time timestamp with millisecond granularity + * @param surface_x surface-local x coordinate + * @param surface_y surface-local y coordinate + */ +static inline void +wl_pointer_send_motion(struct wl_resource *resource_, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) +{ + wl_resource_post_event(resource_, WL_POINTER_MOTION, time, surface_x, surface_y); +} + +/** + * @ingroup iface_wl_pointer + * Sends an button event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the button event + * @param time timestamp with millisecond granularity + * @param button button that produced the event + * @param state physical state of the button + */ +static inline void +wl_pointer_send_button(struct wl_resource *resource_, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) +{ + wl_resource_post_event(resource_, WL_POINTER_BUTTON, serial, time, button, state); +} + +/** + * @ingroup iface_wl_pointer + * Sends an axis event to the client owning the resource. + * @param resource_ The client's resource + * @param time timestamp with millisecond granularity + * @param axis axis type + * @param value length of vector in surface-local coordinate space + */ +static inline void +wl_pointer_send_axis(struct wl_resource *resource_, uint32_t time, uint32_t axis, wl_fixed_t value) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS, time, axis, value); +} + +/** + * @ingroup iface_wl_pointer + * Sends an frame event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_pointer_send_frame(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_POINTER_FRAME); +} + +/** + * @ingroup iface_wl_pointer + * Sends an axis_source event to the client owning the resource. + * @param resource_ The client's resource + * @param axis_source source of the axis event + */ +static inline void +wl_pointer_send_axis_source(struct wl_resource *resource_, uint32_t axis_source) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_SOURCE, axis_source); +} + +/** + * @ingroup iface_wl_pointer + * Sends an axis_stop event to the client owning the resource. + * @param resource_ The client's resource + * @param time timestamp with millisecond granularity + * @param axis the axis stopped with this event + */ +static inline void +wl_pointer_send_axis_stop(struct wl_resource *resource_, uint32_t time, uint32_t axis) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_STOP, time, axis); +} + +/** + * @ingroup iface_wl_pointer + * Sends an axis_discrete event to the client owning the resource. + * @param resource_ The client's resource + * @param axis axis type + * @param discrete number of steps + */ +static inline void +wl_pointer_send_axis_discrete(struct wl_resource *resource_, uint32_t axis, int32_t discrete) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_DISCRETE, axis, discrete); +} + +#ifndef WL_KEYBOARD_KEYMAP_FORMAT_ENUM +#define WL_KEYBOARD_KEYMAP_FORMAT_ENUM +/** + * @ingroup iface_wl_keyboard + * keyboard mapping format + * + * This specifies the format of the keymap provided to the + * client with the wl_keyboard.keymap event. + */ +enum wl_keyboard_keymap_format { + /** + * no keymap; client must understand how to interpret the raw keycode + */ + WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP = 0, + /** + * libxkbcommon compatible; to determine the xkb keycode, clients must add 8 to the key event keycode + */ + WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1 = 1, +}; +#endif /* WL_KEYBOARD_KEYMAP_FORMAT_ENUM */ + +#ifndef WL_KEYBOARD_KEY_STATE_ENUM +#define WL_KEYBOARD_KEY_STATE_ENUM +/** + * @ingroup iface_wl_keyboard + * physical key state + * + * Describes the physical state of a key that produced the key event. + */ +enum wl_keyboard_key_state { + /** + * key is not pressed + */ + WL_KEYBOARD_KEY_STATE_RELEASED = 0, + /** + * key is pressed + */ + WL_KEYBOARD_KEY_STATE_PRESSED = 1, +}; +#endif /* WL_KEYBOARD_KEY_STATE_ENUM */ + +/** + * @ingroup iface_wl_keyboard + * @struct wl_keyboard_interface + */ +struct wl_keyboard_interface { + /** + * release the keyboard object + * + * + * @since 3 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define WL_KEYBOARD_KEYMAP 0 +#define WL_KEYBOARD_ENTER 1 +#define WL_KEYBOARD_LEAVE 2 +#define WL_KEYBOARD_KEY 3 +#define WL_KEYBOARD_MODIFIERS 4 +#define WL_KEYBOARD_REPEAT_INFO 5 + +/** + * @ingroup iface_wl_keyboard + */ +#define WL_KEYBOARD_KEYMAP_SINCE_VERSION 1 +/** + * @ingroup iface_wl_keyboard + */ +#define WL_KEYBOARD_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_wl_keyboard + */ +#define WL_KEYBOARD_LEAVE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_keyboard + */ +#define WL_KEYBOARD_KEY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_keyboard + */ +#define WL_KEYBOARD_MODIFIERS_SINCE_VERSION 1 +/** + * @ingroup iface_wl_keyboard + */ +#define WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION 4 + +/** + * @ingroup iface_wl_keyboard + */ +#define WL_KEYBOARD_RELEASE_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_keyboard + * Sends an keymap event to the client owning the resource. + * @param resource_ The client's resource + * @param format keymap format + * @param fd keymap file descriptor + * @param size keymap size, in bytes + */ +static inline void +wl_keyboard_send_keymap(struct wl_resource *resource_, uint32_t format, int32_t fd, uint32_t size) +{ + wl_resource_post_event(resource_, WL_KEYBOARD_KEYMAP, format, fd, size); +} + +/** + * @ingroup iface_wl_keyboard + * Sends an enter event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the enter event + * @param surface surface gaining keyboard focus + * @param keys the currently pressed keys + */ +static inline void +wl_keyboard_send_enter(struct wl_resource *resource_, uint32_t serial, struct wl_resource *surface, struct wl_array *keys) +{ + wl_resource_post_event(resource_, WL_KEYBOARD_ENTER, serial, surface, keys); +} + +/** + * @ingroup iface_wl_keyboard + * Sends an leave event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the leave event + * @param surface surface that lost keyboard focus + */ +static inline void +wl_keyboard_send_leave(struct wl_resource *resource_, uint32_t serial, struct wl_resource *surface) +{ + wl_resource_post_event(resource_, WL_KEYBOARD_LEAVE, serial, surface); +} + +/** + * @ingroup iface_wl_keyboard + * Sends an key event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the key event + * @param time timestamp with millisecond granularity + * @param key key that produced the event + * @param state physical state of the key + */ +static inline void +wl_keyboard_send_key(struct wl_resource *resource_, uint32_t serial, uint32_t time, uint32_t key, uint32_t state) +{ + wl_resource_post_event(resource_, WL_KEYBOARD_KEY, serial, time, key, state); +} + +/** + * @ingroup iface_wl_keyboard + * Sends an modifiers event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the modifiers event + * @param mods_depressed depressed modifiers + * @param mods_latched latched modifiers + * @param mods_locked locked modifiers + * @param group keyboard layout + */ +static inline void +wl_keyboard_send_modifiers(struct wl_resource *resource_, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) +{ + wl_resource_post_event(resource_, WL_KEYBOARD_MODIFIERS, serial, mods_depressed, mods_latched, mods_locked, group); +} + +/** + * @ingroup iface_wl_keyboard + * Sends an repeat_info event to the client owning the resource. + * @param resource_ The client's resource + * @param rate the rate of repeating keys in characters per second + * @param delay delay in milliseconds since key down until repeating starts + */ +static inline void +wl_keyboard_send_repeat_info(struct wl_resource *resource_, int32_t rate, int32_t delay) +{ + wl_resource_post_event(resource_, WL_KEYBOARD_REPEAT_INFO, rate, delay); +} + +/** + * @ingroup iface_wl_touch + * @struct wl_touch_interface + */ +struct wl_touch_interface { + /** + * release the touch object + * + * + * @since 3 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define WL_TOUCH_DOWN 0 +#define WL_TOUCH_UP 1 +#define WL_TOUCH_MOTION 2 +#define WL_TOUCH_FRAME 3 +#define WL_TOUCH_CANCEL 4 +#define WL_TOUCH_SHAPE 5 +#define WL_TOUCH_ORIENTATION 6 + +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_DOWN_SINCE_VERSION 1 +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_UP_SINCE_VERSION 1 +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_MOTION_SINCE_VERSION 1 +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_FRAME_SINCE_VERSION 1 +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_CANCEL_SINCE_VERSION 1 +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_SHAPE_SINCE_VERSION 6 +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_ORIENTATION_SINCE_VERSION 6 + +/** + * @ingroup iface_wl_touch + */ +#define WL_TOUCH_RELEASE_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_touch + * Sends an down event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the touch down event + * @param time timestamp with millisecond granularity + * @param surface surface touched + * @param id the unique ID of this touch point + * @param x surface-local x coordinate + * @param y surface-local y coordinate + */ +static inline void +wl_touch_send_down(struct wl_resource *resource_, uint32_t serial, uint32_t time, struct wl_resource *surface, int32_t id, wl_fixed_t x, wl_fixed_t y) +{ + wl_resource_post_event(resource_, WL_TOUCH_DOWN, serial, time, surface, id, x, y); +} + +/** + * @ingroup iface_wl_touch + * Sends an up event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial number of the touch up event + * @param time timestamp with millisecond granularity + * @param id the unique ID of this touch point + */ +static inline void +wl_touch_send_up(struct wl_resource *resource_, uint32_t serial, uint32_t time, int32_t id) +{ + wl_resource_post_event(resource_, WL_TOUCH_UP, serial, time, id); +} + +/** + * @ingroup iface_wl_touch + * Sends an motion event to the client owning the resource. + * @param resource_ The client's resource + * @param time timestamp with millisecond granularity + * @param id the unique ID of this touch point + * @param x surface-local x coordinate + * @param y surface-local y coordinate + */ +static inline void +wl_touch_send_motion(struct wl_resource *resource_, uint32_t time, int32_t id, wl_fixed_t x, wl_fixed_t y) +{ + wl_resource_post_event(resource_, WL_TOUCH_MOTION, time, id, x, y); +} + +/** + * @ingroup iface_wl_touch + * Sends an frame event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_touch_send_frame(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_TOUCH_FRAME); +} + +/** + * @ingroup iface_wl_touch + * Sends an cancel event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_touch_send_cancel(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_TOUCH_CANCEL); +} + +/** + * @ingroup iface_wl_touch + * Sends an shape event to the client owning the resource. + * @param resource_ The client's resource + * @param id the unique ID of this touch point + * @param major length of the major axis in surface-local coordinates + * @param minor length of the minor axis in surface-local coordinates + */ +static inline void +wl_touch_send_shape(struct wl_resource *resource_, int32_t id, wl_fixed_t major, wl_fixed_t minor) +{ + wl_resource_post_event(resource_, WL_TOUCH_SHAPE, id, major, minor); +} + +/** + * @ingroup iface_wl_touch + * Sends an orientation event to the client owning the resource. + * @param resource_ The client's resource + * @param id the unique ID of this touch point + * @param orientation angle between major axis and positive surface y-axis in degrees + */ +static inline void +wl_touch_send_orientation(struct wl_resource *resource_, int32_t id, wl_fixed_t orientation) +{ + wl_resource_post_event(resource_, WL_TOUCH_ORIENTATION, id, orientation); +} + +#ifndef WL_OUTPUT_SUBPIXEL_ENUM +#define WL_OUTPUT_SUBPIXEL_ENUM +/** + * @ingroup iface_wl_output + * subpixel geometry information + * + * This enumeration describes how the physical + * pixels on an output are laid out. + */ +enum wl_output_subpixel { + /** + * unknown geometry + */ + WL_OUTPUT_SUBPIXEL_UNKNOWN = 0, + /** + * no geometry + */ + WL_OUTPUT_SUBPIXEL_NONE = 1, + /** + * horizontal RGB + */ + WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB = 2, + /** + * horizontal BGR + */ + WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR = 3, + /** + * vertical RGB + */ + WL_OUTPUT_SUBPIXEL_VERTICAL_RGB = 4, + /** + * vertical BGR + */ + WL_OUTPUT_SUBPIXEL_VERTICAL_BGR = 5, +}; +#endif /* WL_OUTPUT_SUBPIXEL_ENUM */ + +#ifndef WL_OUTPUT_TRANSFORM_ENUM +#define WL_OUTPUT_TRANSFORM_ENUM +/** + * @ingroup iface_wl_output + * transform from framebuffer to output + * + * This describes the transform that a compositor will apply to a + * surface to compensate for the rotation or mirroring of an + * output device. + * + * The flipped values correspond to an initial flip around a + * vertical axis followed by rotation. + * + * The purpose is mainly to allow clients to render accordingly and + * tell the compositor, so that for fullscreen surfaces, the + * compositor will still be able to scan out directly from client + * surfaces. + */ +enum wl_output_transform { + /** + * no transform + */ + WL_OUTPUT_TRANSFORM_NORMAL = 0, + /** + * 90 degrees counter-clockwise + */ + WL_OUTPUT_TRANSFORM_90 = 1, + /** + * 180 degrees counter-clockwise + */ + WL_OUTPUT_TRANSFORM_180 = 2, + /** + * 270 degrees counter-clockwise + */ + WL_OUTPUT_TRANSFORM_270 = 3, + /** + * 180 degree flip around a vertical axis + */ + WL_OUTPUT_TRANSFORM_FLIPPED = 4, + /** + * flip and rotate 90 degrees counter-clockwise + */ + WL_OUTPUT_TRANSFORM_FLIPPED_90 = 5, + /** + * flip and rotate 180 degrees counter-clockwise + */ + WL_OUTPUT_TRANSFORM_FLIPPED_180 = 6, + /** + * flip and rotate 270 degrees counter-clockwise + */ + WL_OUTPUT_TRANSFORM_FLIPPED_270 = 7, +}; +#endif /* WL_OUTPUT_TRANSFORM_ENUM */ + +#ifndef WL_OUTPUT_MODE_ENUM +#define WL_OUTPUT_MODE_ENUM +/** + * @ingroup iface_wl_output + * mode information + * + * These flags describe properties of an output mode. + * They are used in the flags bitfield of the mode event. + */ +enum wl_output_mode { + /** + * indicates this is the current mode + */ + WL_OUTPUT_MODE_CURRENT = 0x1, + /** + * indicates this is the preferred mode + */ + WL_OUTPUT_MODE_PREFERRED = 0x2, +}; +#endif /* WL_OUTPUT_MODE_ENUM */ + +/** + * @ingroup iface_wl_output + * @struct wl_output_interface + */ +struct wl_output_interface { + /** + * release the output object + * + * Using this request a client can tell the server that it is not + * going to use the output object anymore. + * @since 3 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define WL_OUTPUT_GEOMETRY 0 +#define WL_OUTPUT_MODE 1 +#define WL_OUTPUT_DONE 2 +#define WL_OUTPUT_SCALE 3 + +/** + * @ingroup iface_wl_output + */ +#define WL_OUTPUT_GEOMETRY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_output + */ +#define WL_OUTPUT_MODE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_output + */ +#define WL_OUTPUT_DONE_SINCE_VERSION 2 +/** + * @ingroup iface_wl_output + */ +#define WL_OUTPUT_SCALE_SINCE_VERSION 2 + +/** + * @ingroup iface_wl_output + */ +#define WL_OUTPUT_RELEASE_SINCE_VERSION 3 + +/** + * @ingroup iface_wl_output + * Sends an geometry event to the client owning the resource. + * @param resource_ The client's resource + * @param x x position within the global compositor space + * @param y y position within the global compositor space + * @param physical_width width in millimeters of the output + * @param physical_height height in millimeters of the output + * @param subpixel subpixel orientation of the output + * @param make textual description of the manufacturer + * @param model textual description of the model + * @param transform transform that maps framebuffer to output + */ +static inline void +wl_output_send_geometry(struct wl_resource *resource_, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char *make, const char *model, int32_t transform) +{ + wl_resource_post_event(resource_, WL_OUTPUT_GEOMETRY, x, y, physical_width, physical_height, subpixel, make, model, transform); +} + +/** + * @ingroup iface_wl_output + * Sends an mode event to the client owning the resource. + * @param resource_ The client's resource + * @param flags bitfield of mode flags + * @param width width of the mode in hardware units + * @param height height of the mode in hardware units + * @param refresh vertical refresh rate in mHz + */ +static inline void +wl_output_send_mode(struct wl_resource *resource_, uint32_t flags, int32_t width, int32_t height, int32_t refresh) +{ + wl_resource_post_event(resource_, WL_OUTPUT_MODE, flags, width, height, refresh); +} + +/** + * @ingroup iface_wl_output + * Sends an done event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +wl_output_send_done(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_OUTPUT_DONE); +} + +/** + * @ingroup iface_wl_output + * Sends an scale event to the client owning the resource. + * @param resource_ The client's resource + * @param factor scaling factor of output + */ +static inline void +wl_output_send_scale(struct wl_resource *resource_, int32_t factor) +{ + wl_resource_post_event(resource_, WL_OUTPUT_SCALE, factor); +} + +/** + * @ingroup iface_wl_region + * @struct wl_region_interface + */ +struct wl_region_interface { + /** + * destroy region + * + * Destroy the region. This will invalidate the object ID. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * add rectangle to region + * + * Add the specified rectangle to the region. + * @param x region-local x coordinate + * @param y region-local y coordinate + * @param width rectangle width + * @param height rectangle height + */ + void (*add)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); + /** + * subtract rectangle from region + * + * Subtract the specified rectangle from the region. + * @param x region-local x coordinate + * @param y region-local y coordinate + * @param width rectangle width + * @param height rectangle height + */ + void (*subtract)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); +}; + + +/** + * @ingroup iface_wl_region + */ +#define WL_REGION_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_region + */ +#define WL_REGION_ADD_SINCE_VERSION 1 +/** + * @ingroup iface_wl_region + */ +#define WL_REGION_SUBTRACT_SINCE_VERSION 1 + +#ifndef WL_SUBCOMPOSITOR_ERROR_ENUM +#define WL_SUBCOMPOSITOR_ERROR_ENUM +enum wl_subcompositor_error { + /** + * the to-be sub-surface is invalid + */ + WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE = 0, +}; +#endif /* WL_SUBCOMPOSITOR_ERROR_ENUM */ + +/** + * @ingroup iface_wl_subcompositor + * @struct wl_subcompositor_interface + */ +struct wl_subcompositor_interface { + /** + * unbind from the subcompositor interface + * + * Informs the server that the client will not be using this + * protocol object anymore. This does not affect any other objects, + * wl_subsurface objects included. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * give a surface the role sub-surface + * + * Create a sub-surface interface for the given surface, and + * associate it with the given parent surface. This turns a plain + * wl_surface into a sub-surface. + * + * The to-be sub-surface must not already have another role, and it + * must not have an existing wl_subsurface object. Otherwise a + * protocol error is raised. + * + * Adding sub-surfaces to a parent is a double-buffered operation + * on the parent (see wl_surface.commit). The effect of adding a + * sub-surface becomes visible on the next time the state of the + * parent surface is applied. + * + * This request modifies the behaviour of wl_surface.commit request + * on the sub-surface, see the documentation on wl_subsurface + * interface. + * @param id the new sub-surface object ID + * @param surface the surface to be turned into a sub-surface + * @param parent the parent surface + */ + void (*get_subsurface)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface, + struct wl_resource *parent); +}; + + +/** + * @ingroup iface_wl_subcompositor + */ +#define WL_SUBCOMPOSITOR_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_subcompositor + */ +#define WL_SUBCOMPOSITOR_GET_SUBSURFACE_SINCE_VERSION 1 + +#ifndef WL_SUBSURFACE_ERROR_ENUM +#define WL_SUBSURFACE_ERROR_ENUM +enum wl_subsurface_error { + /** + * wl_surface is not a sibling or the parent + */ + WL_SUBSURFACE_ERROR_BAD_SURFACE = 0, +}; +#endif /* WL_SUBSURFACE_ERROR_ENUM */ + +/** + * @ingroup iface_wl_subsurface + * @struct wl_subsurface_interface + */ +struct wl_subsurface_interface { + /** + * remove sub-surface interface + * + * The sub-surface interface is removed from the wl_surface + * object that was turned into a sub-surface with a + * wl_subcompositor.get_subsurface request. The wl_surface's + * association to the parent is deleted, and the wl_surface loses + * its role as a sub-surface. The wl_surface is unmapped + * immediately. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * reposition the sub-surface + * + * This schedules a sub-surface position change. The sub-surface + * will be moved so that its origin (top left corner pixel) will be + * at the location x, y of the parent surface coordinate system. + * The coordinates are not restricted to the parent surface area. + * Negative values are allowed. + * + * The scheduled coordinates will take effect whenever the state of + * the parent surface is applied. When this happens depends on + * whether the parent surface is in synchronized mode or not. See + * wl_subsurface.set_sync and wl_subsurface.set_desync for details. + * + * If more than one set_position request is invoked by the client + * before the commit of the parent surface, the position of a new + * request always replaces the scheduled position from any previous + * request. + * + * The initial position is 0, 0. + * @param x x coordinate in the parent surface + * @param y y coordinate in the parent surface + */ + void (*set_position)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y); + /** + * restack the sub-surface + * + * This sub-surface is taken from the stack, and put back just + * above the reference surface, changing the z-order of the + * sub-surfaces. The reference surface must be one of the sibling + * surfaces, or the parent surface. Using any other surface, + * including this sub-surface, will cause a protocol error. + * + * The z-order is double-buffered. Requests are handled in order + * and applied immediately to a pending state. The final pending + * state is copied to the active state the next time the state of + * the parent surface is applied. When this happens depends on + * whether the parent surface is in synchronized mode or not. See + * wl_subsurface.set_sync and wl_subsurface.set_desync for details. + * + * A new sub-surface is initially added as the top-most in the + * stack of its siblings and parent. + * @param sibling the reference surface + */ + void (*place_above)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *sibling); + /** + * restack the sub-surface + * + * The sub-surface is placed just below the reference surface. + * See wl_subsurface.place_above. + * @param sibling the reference surface + */ + void (*place_below)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *sibling); + /** + * set sub-surface to synchronized mode + * + * Change the commit behaviour of the sub-surface to synchronized + * mode, also described as the parent dependent mode. + * + * In synchronized mode, wl_surface.commit on a sub-surface will + * accumulate the committed state in a cache, but the state will + * not be applied and hence will not change the compositor output. + * The cached state is applied to the sub-surface immediately after + * the parent surface's state is applied. This ensures atomic + * updates of the parent and all its synchronized sub-surfaces. + * Applying the cached state will invalidate the cache, so further + * parent surface commits do not (re-)apply old state. + * + * See wl_subsurface for the recursive effect of this mode. + */ + void (*set_sync)(struct wl_client *client, + struct wl_resource *resource); + /** + * set sub-surface to desynchronized mode + * + * Change the commit behaviour of the sub-surface to + * desynchronized mode, also described as independent or freely + * running mode. + * + * In desynchronized mode, wl_surface.commit on a sub-surface will + * apply the pending state directly, without caching, as happens + * normally with a wl_surface. Calling wl_surface.commit on the + * parent surface has no effect on the sub-surface's wl_surface + * state. This mode allows a sub-surface to be updated on its own. + * + * If cached state exists when wl_surface.commit is called in + * desynchronized mode, the pending state is added to the cached + * state, and applied as a whole. This invalidates the cache. + * + * Note: even if a sub-surface is set to desynchronized, a parent + * sub-surface may override it to behave as synchronized. For + * details, see wl_subsurface. + * + * If a surface's parent surface behaves as desynchronized, then + * the cached state is applied on set_desync. + */ + void (*set_desync)(struct wl_client *client, + struct wl_resource *resource); +}; + + +/** + * @ingroup iface_wl_subsurface + */ +#define WL_SUBSURFACE_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wl_subsurface + */ +#define WL_SUBSURFACE_SET_POSITION_SINCE_VERSION 1 +/** + * @ingroup iface_wl_subsurface + */ +#define WL_SUBSURFACE_PLACE_ABOVE_SINCE_VERSION 1 +/** + * @ingroup iface_wl_subsurface + */ +#define WL_SUBSURFACE_PLACE_BELOW_SINCE_VERSION 1 +/** + * @ingroup iface_wl_subsurface + */ +#define WL_SUBSURFACE_SET_SYNC_SINCE_VERSION 1 +/** + * @ingroup iface_wl_subsurface + */ +#define WL_SUBSURFACE_SET_DESYNC_SINCE_VERSION 1 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/app/src/main/jni/prebuilt/include/wayland-server.h b/app/src/main/jni/prebuilt/include/wayland-server.h new file mode 100644 index 0000000..1be565f --- /dev/null +++ b/app/src/main/jni/prebuilt/include/wayland-server.h @@ -0,0 +1,106 @@ +/* + * Copyright © 2008 Kristian Høgsberg + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** \file + * + * \brief Include the server API, deprecations and protocol C API. + * + * \warning Use of this header file is discouraged. Prefer including + * wayland-server-core.h instead, which does not include the + * server protocol header and as such only defines the library + * API, excluding the deprecated API below. + */ + +#ifndef WAYLAND_SERVER_H +#define WAYLAND_SERVER_H + +#include +#include "wayland-server-core.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The user can set this macro to hide the wl_object, wl_resource and wl_buffer + * objects alongside the associated API. + * + * The structs were meant to be opaque, although we missed that in the early days. + * + * NOTE: the list of structs, functions, etc in this section MUST NEVER GROW. + * Otherwise we will break forward compatibility and applications that used to + * build fine will no longer be able to do so. + */ +#ifndef WL_HIDE_DEPRECATED + +struct wl_object { + const struct wl_interface *interface; + const void *implementation; + uint32_t id; +}; + +struct wl_resource { + struct wl_object object; + wl_resource_destroy_func_t destroy; + struct wl_list link; + struct wl_signal destroy_signal; + struct wl_client *client; + void *data; +}; + +uint32_t +wl_client_add_resource(struct wl_client *client, + struct wl_resource *resource) WL_DEPRECATED; + +struct wl_resource * +wl_client_add_object(struct wl_client *client, + const struct wl_interface *interface, + const void *implementation, + uint32_t id, void *data) WL_DEPRECATED; + +struct wl_resource * +wl_client_new_object(struct wl_client *client, + const struct wl_interface *interface, + const void *implementation, void *data) WL_DEPRECATED; + +struct wl_global * +wl_display_add_global(struct wl_display *display, + const struct wl_interface *interface, + void *data, + wl_global_bind_func_t bind) WL_DEPRECATED; + +void +wl_display_remove_global(struct wl_display *display, + struct wl_global *global) WL_DEPRECATED; + +#endif + +#ifdef __cplusplus +} +#endif + +#include "wayland-server-protocol.h" + +#endif diff --git a/app/src/main/jni/prebuilt/include/wayland-util.h b/app/src/main/jni/prebuilt/include/wayland-util.h new file mode 100644 index 0000000..b6cbe0e --- /dev/null +++ b/app/src/main/jni/prebuilt/include/wayland-util.h @@ -0,0 +1,751 @@ +/* + * Copyright © 2008 Kristian Høgsberg + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** \file wayland-util.h + * + * \brief Utility classes, functions, and macros. + */ + +#ifndef WAYLAND_UTIL_H +#define WAYLAND_UTIL_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Visibility attribute */ +#if defined(__GNUC__) && __GNUC__ >= 4 +#define WL_EXPORT __attribute__ ((visibility("default"))) +#else +#define WL_EXPORT +#endif + +/** Deprecated attribute */ +#if defined(__GNUC__) && __GNUC__ >= 4 +#define WL_DEPRECATED __attribute__ ((deprecated)) +#else +#define WL_DEPRECATED +#endif + +/** + * Printf-style argument attribute + * + * \param x Ordinality of the format string argument + * \param y Ordinality of the argument to check against the format string + * + * \sa https://gcc.gnu.org/onlinedocs/gcc-3.2.1/gcc/Function-Attributes.html + */ +#if defined(__GNUC__) && __GNUC__ >= 4 +#define WL_PRINTF(x, y) __attribute__((__format__(__printf__, x, y))) +#else +#define WL_PRINTF(x, y) +#endif + +/** + * Protocol message signature + * + * A wl_message describes the signature of an actual protocol message, such as a + * request or event, that adheres to the Wayland protocol wire format. The + * protocol implementation uses a wl_message within its demarshal machinery for + * decoding messages between a compositor and its clients. In a sense, a + * wl_message is to a protocol message like a class is to an object. + * + * The `name` of a wl_message is the name of the corresponding protocol message. + * + * The `signature` is an ordered list of symbols representing the data types + * of message arguments and, optionally, a protocol version and indicators for + * nullability. A leading integer in the `signature` indicates the _since_ + * version of the protocol message. A `?` preceding a data type symbol indicates + * that the following argument type is nullable. While it is a protocol violation + * to send messages with non-nullable arguments set to `NULL`, event handlers in + * clients might still get called with non-nullable object arguments set to + * `NULL`. This can happen when the client destroyed the object being used as + * argument on its side and an event referencing that object was sent before the + * server knew about its destruction. As this race cannot be prevented, clients + * should - as a general rule - program their event handlers such that they can + * handle object arguments declared non-nullable being `NULL` gracefully. + * + * When no arguments accompany a message, `signature` is an empty string. + * + * Symbols: + * + * * `i`: int + * * `u`: uint + * * `f`: fixed + * * `s`: string + * * `o`: object + * * `n`: new_id + * * `a`: array + * * `h`: fd + * * `?`: following argument is nullable + * + * While demarshaling primitive arguments is straightforward, when demarshaling + * messages containing `object` or `new_id` arguments, the protocol + * implementation often must determine the type of the object. The `types` of a + * wl_message is an array of wl_interface references that correspond to `o` and + * `n` arguments in `signature`, with `NULL` placeholders for arguments with + * non-object types. + * + * Consider the protocol event wl_display `delete_id` that has a single `uint` + * argument. The wl_message is: + * + * \code + * { "delete_id", "u", [NULL] } + * \endcode + * + * Here, the message `name` is `"delete_id"`, the `signature` is `"u"`, and the + * argument `types` is `[NULL]`, indicating that the `uint` argument has no + * corresponding wl_interface since it is a primitive argument. + * + * In contrast, consider a `wl_foo` interface supporting protocol request `bar` + * that has existed since version 2, and has two arguments: a `uint` and an + * object of type `wl_baz_interface` that may be `NULL`. Such a `wl_message` + * might be: + * + * \code + * { "bar", "2u?o", [NULL, &wl_baz_interface] } + * \endcode + * + * Here, the message `name` is `"bar"`, and the `signature` is `"2u?o"`. Notice + * how the `2` indicates the protocol version, the `u` indicates the first + * argument type is `uint`, and the `?o` indicates that the second argument + * is an object that may be `NULL`. Lastly, the argument `types` array indicates + * that no wl_interface corresponds to the first argument, while the type + * `wl_baz_interface` corresponds to the second argument. + * + * \sa wl_argument + * \sa wl_interface + * \sa Wire Format + */ +struct wl_message { + /** Message name */ + const char *name; + /** Message signature */ + const char *signature; + /** Object argument interfaces */ + const struct wl_interface **types; +}; + +/** + * Protocol object interface + * + * A wl_interface describes the API of a protocol object defined in the Wayland + * protocol specification. The protocol implementation uses a wl_interface + * within its marshalling machinery for encoding client requests. + * + * The `name` of a wl_interface is the name of the corresponding protocol + * interface, and `version` represents the version of the interface. The members + * `method_count` and `event_count` represent the number of `methods` (requests) + * and `events` in the respective wl_message members. + * + * For example, consider a protocol interface `foo`, marked as version `1`, with + * two requests and one event. + * + * \code + * + * + * + * + * + * \endcode + * + * Given two wl_message arrays `foo_requests` and `foo_events`, a wl_interface + * for `foo` might be: + * + * \code + * struct wl_interface foo_interface = { + * "foo", 1, + * 2, foo_requests, + * 1, foo_events + * }; + * \endcode + * + * \note The server side of the protocol may define interface implementation + * types that incorporate the term `interface` in their name. Take + * care to not confuse these server-side `struct`s with a wl_interface + * variable whose name also ends in `interface`. For example, while the + * server may define a type `struct wl_foo_interface`, the client may + * define a `struct wl_interface wl_foo_interface`. + * + * \sa wl_message + * \sa wl_proxy + * \sa Interfaces + * \sa Versioning + */ +struct wl_interface { + /** Interface name */ + const char *name; + /** Interface version */ + int version; + /** Number of methods (requests) */ + int method_count; + /** Method (request) signatures */ + const struct wl_message *methods; + /** Number of events */ + int event_count; + /** Event signatures */ + const struct wl_message *events; +}; + +/** \class wl_list + * + * \brief Doubly-linked list + * + * On its own, an instance of `struct wl_list` represents the sentinel head of + * a doubly-linked list, and must be initialized using wl_list_init(). + * When empty, the list head's `next` and `prev` members point to the list head + * itself, otherwise `next` references the first element in the list, and `prev` + * refers to the last element in the list. + * + * Use the `struct wl_list` type to represent both the list head and the links + * between elements within the list. Use wl_list_empty() to determine if the + * list is empty in O(1). + * + * All elements in the list must be of the same type. The element type must have + * a `struct wl_list` member, often named `link` by convention. Prior to + * insertion, there is no need to initialize an element's `link` - invoking + * wl_list_init() on an individual list element's `struct wl_list` member is + * unnecessary if the very next operation is wl_list_insert(). However, a + * common idiom is to initialize an element's `link` prior to removal - ensure + * safety by invoking wl_list_init() before wl_list_remove(). + * + * Consider a list reference `struct wl_list foo_list`, an element type as + * `struct element`, and an element's link member as `struct wl_list link`. + * + * The following code initializes a list and adds three elements to it. + * + * \code + * struct wl_list foo_list; + * + * struct element { + * int foo; + * struct wl_list link; + * }; + * struct element e1, e2, e3; + * + * wl_list_init(&foo_list); + * wl_list_insert(&foo_list, &e1.link); // e1 is the first element + * wl_list_insert(&foo_list, &e2.link); // e2 is now the first element + * wl_list_insert(&e2.link, &e3.link); // insert e3 after e2 + * \endcode + * + * The list now looks like [e2, e3, e1]. + * + * The `wl_list` API provides some iterator macros. For example, to iterate + * a list in ascending order: + * + * \code + * struct element *e; + * wl_list_for_each(e, foo_list, link) { + * do_something_with_element(e); + * } + * \endcode + * + * See the documentation of each iterator for details. + * \sa http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h + */ +struct wl_list { + /** Previous list element */ + struct wl_list *prev; + /** Next list element */ + struct wl_list *next; +}; + +/** + * Initializes the list. + * + * \param list List to initialize + * + * \memberof wl_list + */ +void +wl_list_init(struct wl_list *list); + +/** + * Inserts an element into the list, after the element represented by \p list. + * When \p list is a reference to the list itself (the head), set the containing + * struct of \p elm as the first element in the list. + * + * \note If \p elm is already part of a list, inserting it again will lead to + * list corruption. + * + * \param list List element after which the new element is inserted + * \param elm Link of the containing struct to insert into the list + * + * \memberof wl_list + */ +void +wl_list_insert(struct wl_list *list, struct wl_list *elm); + +/** + * Removes an element from the list. + * + * \note This operation leaves \p elm in an invalid state. + * + * \param elm Link of the containing struct to remove from the list + * + * \memberof wl_list + */ +void +wl_list_remove(struct wl_list *elm); + +/** + * Determines the length of the list. + * + * \note This is an O(n) operation. + * + * \param list List whose length is to be determined + * + * \return Number of elements in the list + * + * \memberof wl_list + */ +int +wl_list_length(const struct wl_list *list); + +/** + * Determines if the list is empty. + * + * \param list List whose emptiness is to be determined + * + * \return 1 if empty, or 0 if not empty + * + * \memberof wl_list + */ +int +wl_list_empty(const struct wl_list *list); + +/** + * Inserts all of the elements of one list into another, after the element + * represented by \p list. + * + * \note This leaves \p other in an invalid state. + * + * \param list List element after which the other list elements will be inserted + * \param other List of elements to insert + * + * \memberof wl_list + */ +void +wl_list_insert_list(struct wl_list *list, struct wl_list *other); + +/** + * Retrieves a pointer to a containing struct, given a member name. + * + * This macro allows "conversion" from a pointer to a member to its containing + * struct. This is useful if you have a contained item like a wl_list, + * wl_listener, or wl_signal, provided via a callback or other means, and would + * like to retrieve the struct that contains it. + * + * To demonstrate, the following example retrieves a pointer to + * `example_container` given only its `destroy_listener` member: + * + * \code + * struct example_container { + * struct wl_listener destroy_listener; + * // other members... + * }; + * + * void example_container_destroy(struct wl_listener *listener, void *data) + * { + * struct example_container *ctr; + * + * ctr = wl_container_of(listener, ctr, destroy_listener); + * // destroy ctr... + * } + * \endcode + * + * \note `sample` need not be a valid pointer. A null or uninitialised pointer + * is sufficient. + * + * \param ptr Valid pointer to the contained member + * \param sample Pointer to a struct whose type contains \p ptr + * \param member Named location of \p ptr within the \p sample type + * + * \return The container for the specified pointer + */ +#define wl_container_of(ptr, sample, member) \ + (__typeof__(sample))((char *)(ptr) - \ + offsetof(__typeof__(*sample), member)) + +/** + * Iterates over a list. + * + * This macro expresses a for-each iterator for wl_list. Given a list and + * wl_list link member name (often named `link` by convention), this macro + * assigns each element in the list to \p pos, which can then be referenced in + * a trailing code block. For example, given a wl_list of `struct message` + * elements: + * + * \code + * struct message { + * char *contents; + * wl_list link; + * }; + * + * struct wl_list *message_list; + * // Assume message_list now "contains" many messages + * + * struct message *m; + * wl_list_for_each(m, message_list, link) { + * do_something_with_message(m); + * } + * \endcode + * + * \param pos Cursor that each list element will be assigned to + * \param head Head of the list to iterate over + * \param member Name of the link member within the element struct + * + * \relates wl_list + */ +#define wl_list_for_each(pos, head, member) \ + for (pos = wl_container_of((head)->next, pos, member); \ + &pos->member != (head); \ + pos = wl_container_of(pos->member.next, pos, member)) + +/** + * Iterates over a list, safe against removal of the list element. + * + * \note Only removal of the current element, \p pos, is safe. Removing + * any other element during traversal may lead to a loop malfunction. + * + * \sa wl_list_for_each() + * + * \param pos Cursor that each list element will be assigned to + * \param tmp Temporary pointer of the same type as \p pos + * \param head Head of the list to iterate over + * \param member Name of the link member within the element struct + * + * \relates wl_list + */ +#define wl_list_for_each_safe(pos, tmp, head, member) \ + for (pos = wl_container_of((head)->next, pos, member), \ + tmp = wl_container_of((pos)->member.next, tmp, member); \ + &pos->member != (head); \ + pos = tmp, \ + tmp = wl_container_of(pos->member.next, tmp, member)) + +/** + * Iterates backwards over a list. + * + * \sa wl_list_for_each() + * + * \param pos Cursor that each list element will be assigned to + * \param head Head of the list to iterate over + * \param member Name of the link member within the element struct + * + * \relates wl_list + */ +#define wl_list_for_each_reverse(pos, head, member) \ + for (pos = wl_container_of((head)->prev, pos, member); \ + &pos->member != (head); \ + pos = wl_container_of(pos->member.prev, pos, member)) + +/** + * Iterates backwards over a list, safe against removal of the list element. + * + * \note Only removal of the current element, \p pos, is safe. Removing + * any other element during traversal may lead to a loop malfunction. + * + * \sa wl_list_for_each() + * + * \param pos Cursor that each list element will be assigned to + * \param tmp Temporary pointer of the same type as \p pos + * \param head Head of the list to iterate over + * \param member Name of the link member within the element struct + * + * \relates wl_list + */ +#define wl_list_for_each_reverse_safe(pos, tmp, head, member) \ + for (pos = wl_container_of((head)->prev, pos, member), \ + tmp = wl_container_of((pos)->member.prev, tmp, member); \ + &pos->member != (head); \ + pos = tmp, \ + tmp = wl_container_of(pos->member.prev, tmp, member)) + +/** + * \class wl_array + * + * Dynamic array + * + * A wl_array is a dynamic array that can only grow until released. It is + * intended for relatively small allocations whose size is variable or not known + * in advance. While construction of a wl_array does not require all elements to + * be of the same size, wl_array_for_each() does require all elements to have + * the same type and size. + * + */ +struct wl_array { + /** Array size */ + size_t size; + /** Allocated space */ + size_t alloc; + /** Array data */ + void *data; +}; + +/** + * Initializes the array. + * + * \param array Array to initialize + * + * \memberof wl_array + */ +void +wl_array_init(struct wl_array *array); + +/** + * Releases the array data. + * + * \note Leaves the array in an invalid state. + * + * \param array Array whose data is to be released + * + * \memberof wl_array + */ +void +wl_array_release(struct wl_array *array); + +/** + * Increases the size of the array by \p size bytes. + * + * \param array Array whose size is to be increased + * \param size Number of bytes to increase the size of the array by + * + * \return A pointer to the beginning of the newly appended space, or NULL when + * resizing fails. + * + * \memberof wl_array + */ +void * +wl_array_add(struct wl_array *array, size_t size); + +/** + * Copies the contents of \p source to \p array. + * + * \param array Destination array to copy to + * \param source Source array to copy from + * + * \return 0 on success, or -1 on failure + * + * \memberof wl_array + */ +int +wl_array_copy(struct wl_array *array, struct wl_array *source); + +/** + * Iterates over an array. + * + * This macro expresses a for-each iterator for wl_array. It assigns each + * element in the array to \p pos, which can then be referenced in a trailing + * code block. \p pos must be a pointer to the array element type, and all + * array elements must be of the same type and size. + * + * \param pos Cursor that each array element will be assigned to + * \param array Array to iterate over + * + * \relates wl_array + * \sa wl_list_for_each() + */ +#define wl_array_for_each(pos, array) \ + for (pos = (array)->data; \ + (const char *) pos < ((const char *) (array)->data + (array)->size); \ + (pos)++) + +/** + * Fixed-point number + * + * A `wl_fixed_t` is a 24.8 signed fixed-point number with a sign bit, 23 bits + * of integer precision and 8 bits of decimal precision. Consider `wl_fixed_t` + * as an opaque struct with methods that facilitate conversion to and from + * `double` and `int` types. + */ +typedef int32_t wl_fixed_t; + +/** + * Converts a fixed-point number to a floating-point number. + * + * \param f Fixed-point number to convert + * + * \return Floating-point representation of the fixed-point argument + */ +static inline double +wl_fixed_to_double(wl_fixed_t f) +{ + union { + double d; + int64_t i; + } u; + + u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f; + + return u.d - (3LL << 43); +} + +/** + * Converts a floating-point number to a fixed-point number. + * + * \param d Floating-point number to convert + * + * \return Fixed-point representation of the floating-point argument + */ +static inline wl_fixed_t +wl_fixed_from_double(double d) +{ + union { + double d; + int64_t i; + } u; + + u.d = d + (3LL << (51 - 8)); + + return u.i; +} + +/** + * Converts a fixed-point number to an integer. + * + * \param f Fixed-point number to convert + * + * \return Integer component of the fixed-point argument + */ +static inline int +wl_fixed_to_int(wl_fixed_t f) +{ + return f / 256; +} + +/** + * Converts an integer to a fixed-point number. + * + * \param i Integer to convert + * + * \return Fixed-point representation of the integer argument + */ +static inline wl_fixed_t +wl_fixed_from_int(int i) +{ + return i * 256; +} + +/** + * Protocol message argument data types + * + * This union represents all of the argument types in the Wayland protocol wire + * format. The protocol implementation uses wl_argument within its marshalling + * machinery for dispatching messages between a client and a compositor. + * + * \sa wl_message + * \sa wl_interface + * \sa Wire Format + */ +union wl_argument { + int32_t i; /**< `int` */ + uint32_t u; /**< `uint` */ + wl_fixed_t f; /**< `fixed` */ + const char *s; /**< `string` */ + struct wl_object *o; /**< `object` */ + uint32_t n; /**< `new_id` */ + struct wl_array *a; /**< `array` */ + int32_t h; /**< `fd` */ +}; + +/** + * Dispatcher function type alias + * + * A dispatcher is a function that handles the emitting of callbacks in client + * code. For programs directly using the C library, this is done by using + * libffi to call function pointers. When binding to languages other than C, + * dispatchers provide a way to abstract the function calling process to be + * friendlier to other function calling systems. + * + * A dispatcher takes five arguments: The first is the dispatcher-specific + * implementation associated with the target object. The second is the object + * upon which the callback is being invoked (either wl_proxy or wl_resource). + * The third and fourth arguments are the opcode and the wl_message + * corresponding to the callback. The final argument is an array of arguments + * received from the other process via the wire protocol. + * + * \param "const void *" Dispatcher-specific implementation data + * \param "void *" Callback invocation target (wl_proxy or `wl_resource`) + * \param uint32_t Callback opcode + * \param "const struct wl_message *" Callback message signature + * \param "union wl_argument *" Array of received arguments + * + * \return 0 on success, or -1 on failure + */ +typedef int (*wl_dispatcher_func_t)(const void *, void *, uint32_t, + const struct wl_message *, + union wl_argument *); + +/** + * Log function type alias + * + * The C implementation of the Wayland protocol abstracts the details of + * logging. Users may customize the logging behavior, with a function conforming + * to the `wl_log_func_t` type, via `wl_log_set_handler_client` and + * `wl_log_set_handler_server`. + * + * A `wl_log_func_t` must conform to the expectations of `vprintf`, and + * expects two arguments: a string to write and a corresponding variable + * argument list. While the string to write may contain format specifiers and + * use values in the variable argument list, the behavior of any `wl_log_func_t` + * depends on the implementation. + * + * \note Take care to not confuse this with `wl_protocol_logger_func_t`, which + * is a specific server-side logger for requests and events. + * + * \param "const char *" String to write to the log, containing optional format + * specifiers + * \param "va_list" Variable argument list + * + * \sa wl_log_set_handler_client + * \sa wl_log_set_handler_server + */ +typedef void (*wl_log_func_t)(const char *, va_list) WL_PRINTF(1, 0); + +/** + * Return value of an iterator function + * + * \sa wl_client_for_each_resource_iterator_func_t + * \sa wl_client_for_each_resource + */ +enum wl_iterator_result { + /** Stop the iteration */ + WL_ITERATOR_STOP, + /** Continue the iteration */ + WL_ITERATOR_CONTINUE +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/app/src/main/jni/prebuilt/include/wayland-version.h b/app/src/main/jni/prebuilt/include/wayland-version.h new file mode 100644 index 0000000..72b3e21 --- /dev/null +++ b/app/src/main/jni/prebuilt/include/wayland-version.h @@ -0,0 +1,34 @@ +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WAYLAND_VERSION_H +#define WAYLAND_VERSION_H + +#define WAYLAND_VERSION_MAJOR 1 +#define WAYLAND_VERSION_MINOR 16 +#define WAYLAND_VERSION_MICRO 0 +#define WAYLAND_VERSION "1.16.0" + +#endif diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..72d6aaf --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..898f3ed59ac9f3248734a00e5902736c9367d455 GIT binary patch literal 2963 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 JPDHLkV1g@XpTGbB literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..dffca3601eba7bf5f409bdd520820e2eb5122c75 GIT binary patch literal 4905 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 lV%Z2*hu);6rydA(}wUDXPCF_W1vnaRBK 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..14ed0af35023e4f1901cf03487b6c524257b8483 GIT binary patch literal 6895 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b0907cac3bfd8fbfdc46e1108247f0a1055387ec GIT binary patch literal 6387 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ae03154975f397f8ed1b84f2d4bf9783ecfa26 GIT binary patch literal 10413 zcmV;eC{ovnP){+^kJY@_qlWNt)byXXcl4&di)UgOL4U zf7l=Phy7uH*dML-fsqKMr;DlfM>yz|;&bpF`{OQzgo8jbktkySeg~64fbWuHz_H+% zO2F)JwJEE@HLSkR79_Z#oHbogc3dx%o7^AeCk{b5(&1F_9NvTf!DryJ`XFJT+JS0q z&?sCD-y=8K2W2PRhjJ3<`jzFS2UeBViE9@x1RKUQCZdv7kl1SX?3WZMS(_}*GPxT+MhW0P|fyhZ+Qq30&o zK&_A(Oze8$+U<`PdXPq;v4_f|Urm8qVAY042UnGp45})9cTiQyEh4N`WieG?WwHFJ zL%SQEJASBPNL8tfyeEVAm>Ttneh$6^dT@7TL)6K`4dZuI$Q8$@YC7*NxE8o3xHh;( z)oY%paC7#DbzBq#z7eX{hBSaAFX=&XZgM%%7vkI`tW*yCO_Yg=`yqnAa-v2eeE;?> zc{iKw z56$?22D^!CP)@={l~{!+p^?NV4J00s5s~K!m``K3Z^mK!w_^!uRBfLTqF!aWIQ-yF z+-+mFw$C)OYiVHDrh2UxX&Im_YA#t%&~JYj4^H@@?c?sN*|d{1z)fXCWK#h&a-j`x zMSwIVr!Zx+>*mUE)45>nPAFTm4uSn)0ywG_n3eP}spMCtk;WQXTc!Xa#?G<8~9?@D4_J^SH8;MHSdkm@M;{c4Zl4~|K=yFf32q2}KbIxDWFpb1y zO+OA&=Iq3=s^1(B1GFU0ED0TN)1GUEzJjf&cITr}~_843H9IFf?D zpy-;D=W+{Ha$5$7>!~TGM>3^{(aM!hTwS-Zu6}T3B@Ohtm!x|WXwD0DS$2Sg4MHki zT4wy)C@!)S)O94Q^ENX$IJLgcuiK`aOAMYnR<7i>43I*17(|~2Z^{a28-tFl06j}G z1E(L_b%g+AG(2{IghMo@X493&wrmJ$)etG%R?khj1IO;za&76!!+2C}`5mZmW7T)d zdc5TLAso7|4x4fu(6j?P@#13#aX@*#Nyh;YpF8maDO(w~k+R(hKe!7&`(pji{+WqG zRNJD}1i%xZuq*IN{U@la2#gbNVFCfAchs zIJDcO;{ZH`Z=Jz5RkkxH?-ZOri>KGuU75U|b7#sb@!GV{ltwd6tl0 z`-tj|)YKcR-o#ogdg%auyuQ|?Hi%I3R1^-|ZB z3w@dmquBHyVR{7VswXIVTX$?MPH4+9kb2qjlDK$t-RcV{VoZD69&BtHN{89>gQ~qP zJ3uX1wj2^zXGt+iUU`JHjaZ|tY;IN^;K@-L=fQS>Y@uwVEi&RUN?2Y*+sNids}(cC z+40kwrYD*P3GD#2c-goFwX_(F;ug=ctyz2p&FRs8BZP#KW)rz1wGkz3b++zpGX3NIKL+e&!v|_Kf@T~~axF4tuT$cD=XZI()UWvicEV_jFqjbw^Y;_9AkJsqs?mSQ_V zHd!_~?Uk)r`5Rg=yAOj%Y^~TwjIt7{g{Gt00kYMyk+w^ZgMfMuZBvVP>lJ}>TFiaQ z6}$vw71{x^*|Ko~^_rD(w0N!+0&330f%Q3TNHV+~AX_dQo92j#JW0ofEat`()+cpU zNK-<*Wh>c%oF}ld7(cPM7T>>P3+`N++2#S7TwjYH+FeDL-}5iew@%rhE!V8XXvx!0 zTFweF>(f3j`6XB-!?_??289+P$hL!oDad&d`knUqYw_}zU&NQL{fPhk`)_>p#vk~F zOaH-9ClAxr#e^P5nv&DV0je~`L#5{FGh$URTHx9AYn@Acj8H9 z-fn2Xa=Bbhm#_bhv)?!+_&C~>bovC&J9ipS=gMNVj42zRq^}*vKi$01ti15vyd!%p zUA9JO)5+CkcwA~i2(aSSaRpH~0l2>#}`U$mAt<;*`UUpCUF!4<_g zFf*C<$Rf;^y{H)XiCNlB=(vxmae|1Pqx`~~S}Rm0li_pUevNx<%Eh8q90Q566YDZZYFMh0VeMrAMOVe1 z|Lz;ye`{f@1!x?J0yCotz`^}fMr`Fm4fEt{bxGcZ@CDfQlmg-(RljEY}^PEkElrDm9b@vQz3{qdC=2bx32OI6ixaob7Peg<(shE$A37*Y0*ydf7hWB3l zfOPA%yE6dnF4t(NpuypoFMj$Fe(uB} zYGE`j2L$`WNWctZJGzc_^Y7cZ=&iGKe5Qp4N#!&iijDjXjTz(3xiMo>J=mmazv7G# zF};w)79FkiA@1zpCm-spe1PcGSD#bY2j6kZTSF>x2d*b>5aJ1Q0i#dXZr;STA6&qX z?AfNYN-*H~;g8?zcE?0p{`DpSKBZ+x+2NX#R$#Yh=T4y^j8P-g+?ON+%kpw5Ksi!b zOAq(oLt>AA{_iWD?hG2?wJ$%XV>2K8a2fw~=WnZlqj?=Lg8tUGU(+#}_pV&l`FXI2 z2R{CgjGSMfif5%=Dvs=1Gg5Q<1A2u%ogU0AeaR=a7WglGq9Gm z05rN_()Itp2xw&&&f%Gd_t?ff9{`jo#qQFme-Q@S8}7!~yjOSWsy>00CD&oc8BE zFMG|E_M?KjbKQ9%c|x42azM)$4)-h1zrz4(v;}}*K(PA#cWCU;R^U~Jl3;7>rw{Cu!{8QN zl(B*ZEn!VUSbEKv??13(3(hAM`|DqSwpn--f-*wJC6w9N`i?w)2q&I8VbU?i)Rp5$ zpRbmO?ySVUW0vO8F+m{!u@5;7*qFB&61$hYbWjGt9T07-U^P?#05ata{Vwd{2a}a; z(QWDK-j|R#Z<>+y4)Emu^ECb8n$m7_4%f@(9^8ck*T(DwCIkV5Cej$Fy(m5INbk)B z81_|%Sz$1T#tN3wg#Zy2eKhpDFrV~OEAFZrs~>OtfgjpaWmJ8GEc7e5$ z<-7`0<%3Bl$~A83zX=m=j13)K`E?&RU1#)%u;U-p*j;=g6-ytEUsw>Kreg^;rRu)?wAO})#2n1X6G=;eY zbpY#7JLDu;AE2T%dC;~}?3TFl3JMDHXKYCH0n`pX@o;Z)fS+3mpgvpH+sc<*x z1F}9*_-oA}DzIg@@Ei1s?3sQ04(rg@i;xN56+FJ0yx!{~|Zn%b_xqcb^P%5t(dMXW@Ug}*T&pN4~-o|+0Y3PH&pF}W=|bT0Q%e706_}svCls?Dd?;u zzf`BxSd7-LQcApTHC}%70KMPb((ph|^QvQq=sA_wK%P6L#o@{e=S=Dp9Q*VlcFK&` z3z4}2a!ZM6K#x2yjjU$pQYbW-n|+%|^QNhAEZ%^{+o;|Dp_Dctk{ReEnaG1N7!M zUvln?NB+f`^cqb${^jex;SpPlIV(gVl3I2ghz8NCZ=kUwM+yh%k@0;{mh_r60fM<7 zQyUMG(-U4kq8@)Rcpf7Gs5P<|e4I7+Y4)N_=QfSdz}A0i8M z<9|WJh7HjV5X(eFBM0>$=J8u=0pwnoia*!0$bca|pm_&(<4!rrxI=n8_RLDeAtY}2 z=*KHo>(0ZuLTbvfXLb_qK-^8I+%| zUdG%Cl=sFd>;Oyj@<24U&RhVc(aBVo=p`QzCVUthI@4N3$j=WxTE)7Iqpe%ok|sRnzE-FFFLy4v@Ojy zAh^N;M6&#AA&{i2o>0u#PM074u4E9~0hJ6dw^~A0!+7s~xzzXy*t&$}*`nH~ad24Swg^YQW%SiNd)(;TZ&v!xo_w?$uA?IrfP_|`m zEQFQk^)0w$mv+7L-8Z=N`c!^^cB=rCZUjVG+>M2OQ>B-YZ>N5giD0_7nBKcn9Z(nY zVT8K$EKGZqvp|-)wRvDgk=|8G?b5E#u3g0gVLJp(fT}bAG6o{JwYgv&4v1g=CLIIv zMIDs;tm=7)QDC4e`P->SW@4!&?~R8=%fD+wwQ%fNlz;`*m_7f4lZg zPs+CxK;6mf8GGySjQUzZnze5S&OQAymYz5)_&eH^bn*y2)>B%~UnfXQkL<$*XJ5rj zUfj!-MX2_vYu16CIG-E`Qa)zv+b&q$i!-$Vw2cR#ICW+4KtvPw2|#OCVb?j+tDrN5 z?)7#T8bCM2K|x)hC)UY#!K_emE(FoWtx~UdHXaJ8k-wu&kn8+J-4;A-Q@)_j>(YJY zg?Mu97A%3iAvFK5B_WJYJ=Uk;DLX5%Z$S!1DXUc!tzD^_ios5qQXIOg3I}f~YCb`# zRk6GpUA2J+pg4XtgGkD)Rv#BBbDlJQ4i`ZC2o9iC;vkyV;Ys8tPL2MM0+eN;g~p)} z0w6LgK%2DyWB@z>N{>Q5fDD62D?moT1F($VrU{S^crr8~0`~=JA&cjHO4_~;Wq@Nr zWEemQNj!S?^ny4@yn0cIMFA2Bk;MTr5FUPj42OpoAS2;v4v+wNsNimoCijJ&noYkkmt8oOdws$f#{!w*f?U)Jch8E3A=KN%$ z+~TWqXo1Kw0L2&$j}jo#@V*79M#G~7Xtyqagu%lBw2>bmUGSvS8y4j#ei=rgkL1%f z@7Ap&y`32$qxTGRKt41A?~MHXhN9HfKQK2YxA^)%Jnqcg06k8QB}t7j8Xmm>352H! zplw$Td3)1=B;S71raVS|C4XCE+i!)Y)YsxC zwr{1D2jEFPc?7RGyqCV#udVzd$BRCC0H?lu6o-;y!s{o=UxTz0REZZH+>J9|JAt3s zzmvYE+Eq#889~}zMJ*4&lX>bSjy`sXzE)_;9zIn!*Yltns(4batkeI%Q%T*?_v-l- zwzrm3eQo2^eRVjbFzZgQkn!Qr)?Qv-9>(^*n!7QC+Pie_+=cw@9hkfB2xJx-vh}yA zTVn@TmEvJ#1=R8YJWubbp>9m4%JS)VG&LMlUV!KB-HunhxDSsc$As6z%h&U3vo;k{ zO$HcWI*2C`VCj2X3Q12&RYlshwMk%k0G`!-Fx?$J^uSaSsW%wXr8mn$ z;~AVgF)0R8iD^b{(GvruXp?%J)1xrGDF!ki=FyCE)MFsSVjfM6Au&)Wu}Bi=^k|QH z6l$achszhr(CFcFXd8EPGdXzH1jvCdyxFM(++21qTCwm28srMxgw9+m)jJWN4erJ$ zfHVLZMJ&MMe#UxB{gzxExlj?R><7D^?>gd zIsvP#Th0rRf$)HO7NyhMYMKBt93Bp!1R5YW1IR#lv;!2+Z+#M@Fq;1OKH8?<-rZ>% zn<;qKH8R~3_2@bhB`p7*PXFr}owme&VS;Ayb&TsY1IP$?02pEJib{@y9PbYJ9-F0^9DWM#x0cd9E8d{Nhwu7<=K>8+N^$ZNE0c0dR zf&mgRx77?FBjITdP&~i&$sz#7EWzl}kQ~~U7Pda>u@Fr0w?{q5-~J?^euK+yOKh+@ zK-wS@FtV&4AYl`uO#r1C4No(GOn|2epc(>Df)>{$ZJ_HW%?-am+He4COHWJ0KH7U^ zJ}zBh%m57^@+5I(e{q>?{I1NR0BKHp2%Oha0+beGG(36%GGJC+2~b6`N$@BEs@DQg zX1pBgOSE*}Efmy$I&DJ>^}KXhp?36ES5Hqr^0%LO&a^z*cv>b}Ee=pNt0)6z*0lp< zSV{&gYQPJSfhidrK-D||#TlBCfycn$tyX}D>xy2C#ZNx60osnWp*w3+F|xu#VTHJL zgq)pW3H*WRxp}YA%HipiSp^_NAR?fQ+R6uz;rTqg02z_b!w-<*@IW1C1t<%~d{$u5 ztf~K`ZN{~oH)~6)SfAzrbq8wx0#N79V@ObTnO>*{L{8A*)}e#1H3DaS0kwz1l{q{-VIh)6$u;94s{*9U z5~XMZ$oNb`HGoXWBy0kx#3Xo{0hGz&9?~NdEngrPj~y9BU6+T4KW#fJ1kU3zQ!wON-a=10NQ87wwb%6LRQHnNzVok~O}hUVsF`(;T3r*TuC}N0kXv5o)1FlPiM+Bqt}hut8}4Q~S}Hl}cCEA^@pEl%fTo9TnOE z5;!qR0U`~r9Ux&7qZFX$wE$!QJWT-AasYwrihB-=rayj^whh-tom(<6q$B9d zZUq^P7R@|EduBNavK9kK0a0o+4?xA*0Wx4#9hQ{S4v_F!bx8Vx+?{3s83>O8AUKu; z7R5-2!lIdB=SZ6jp>5M1b)#+7g073t3W?bexF?D1dr=>Y&`=aP=RG=KRF>NSOQy95 zK)et|<53k_05UKoLpwl*rDX5|WCT1=*3s1jpuM#X5*RF;GwnaH88>Ycu5CP3rYl6q zMjop1khimkM{gLVb|XErK`9BJ!`9JjPoHdbLU(bm z;eEj(uqd?P&>oz1`XpVG5SEpLMGg41O+(c*@m(RvVTLqR$Rvb$EPmC{;Fw=5eU(@q zfM-E*{{K4m?)@;dfs>DWA9{;2*ESMcghxGlkqgj#6g@N7fPjz(bJITSk)MJkc}X&3 zx1n||Scj*RSZZ`#x$)as6IUTgi=&nY;DLm932`IpiqozPb@`WM;c2AddJtCz%c<}x zlTT7LK>|GFFhd$DOoH+&LAOZEBO#raL9xrfVDKn#VxV-BG6@wi5acWy8uM^nb<*3C zF2kbP(>^3_>j4H&AJ*e?wdPcXIU#bR%Y(SN^(B7;+qG*q9Lts!hUfDDKvSRB0+0c->J*@QZ2-mV0!U8Bd1526=;cl}bkQ8tzni+Ng#wO^Uu3(L_tPcUJ2^F{|sY8r}6)1CKU{y0Ag40i>Wq#8V$DMynRd zXk`mr#M7(*DR#7h*J;LQ680?4Yz~kS`8@mp>4Aq_pJ?eknRs%@Ca6=I+r!mym(~ss zA4IM+m~%${$kj2BJP&es;J(Eua`v~}s5PX5=yquq0SGoEfnRZ&amirK05UQetT{mO z+VYs?G@CFn3XA4Hby++zco~HU>eLzaW&yLSEe#Z!GbVCj-N~NF)fFHbEb;NWAI%Ow z1wNeH15|rvqs0JH3^oD)2Bu^v0V+y2DU+}Xpi&+1NE_($Rg19bsnD~MPM#C!sK1x% zAX=wf-MX~Km`A83YRASRU?Q&vfoLGi&p=!xesa=!(en8>x#^F@M!Hf~mK6a~LS$G< zhHij_&#Ef{sw!;`4kW-spbWV@OXl1ZKNeC#V@a6X;(mxdSet;y4)0u*1N9VQ6mnIhyQEZyBO%Gb%x{I6!oXH>p9h>Ks5dJOCM%k^un0ed6UHP%Pb8m@^LR*1I5nOkq_hdUc^+S%FHIjIFJs_SQx=R!_ z{|}V3f?1%o4b%2-m&4)?76nK(Cekx8+8iL`lEGk!m8tc$a$f-|$Uu0~PAo}G2sF?{mwdqxbK&cGQ$%gni}UaT%W z>{iFH*vN(TF1pf6baWg*dmhXpN!;AVi65PqEqZ491+;wOpOAS+8#RZ)#91aeU3opr zM1U0TES(RaEFAz5U^3zeEO9c{qvEDbq@;7OZ2q63IpG(?4?U1W%5uNL;yAjv45nq} z!0F2Bz~yd^b&Rz}5@xDhSt1nNKIG>}ewB_*u5Bn$utQM)S>h>^Dn$#P{*b_Qi}v2A zWlB&7DvMeu3e}jpavVlt4oQvyTVrcNloqGbjn8N#ujME$ULBYWcGoQFO`)jyw?y-1 zd?*fmxYA*8|JiWuY&?g$Do4)Z__4Bjv$8v>bkFVZm;oftBGK_9@@pl%lXjej!A!LC zh#}9ohCi{{ZQ-mp-B&KY>P}({57N+{xyjh8FctPfr+T!$Mn30oz09XHQwIB^dljb1 z$^SVOsXW(wZ+)uVGjE;TvtW(PvtX@k@RmZ^+(Uch12(V6o&_nG{11DO9u@4h`w=yp@yLR7+-F_P_1>{dzv%Vc z{4?EWO|R#D_cC>41Q@6rEpfZPY}Qsw(iu+VtM zk?VfLxt-`8D*o)6RH0G0sdlU^c5qq%Bu%TN3R6ec{q<$PcmS#o?ctDy1vk>p({m{8 zE>kOk6c$U>a;ZxBKlm)ODnpQ`%TPxJEO2ZmdS9GBJEt$ZhK?H0Xj&UPI5rAX2R88L z$%0cK7N~Y(7NHkw?B3M1K;whO01!A0WE#NW=*IvFVBhg)$LPV1*_EBco1N2*U4tE( zRtl2?YqWMOIBn0yR9sp7qyVcUb1gnBpzXq7P*oT9KOgqljw+zIvtzojb2zbcN;KS) z9hz1SlqysTupC)~JF~`b&#VTY6#sW--*Hp{MHLo1Fn0-5nsA9VKvNapXEcv<*FF9Z XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2c18de9e66108411737e910f5c1972476f03ddbf GIT binary patch literal 9128 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 I20H400LcNok^lez literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..beed3cdd2c32af5114a7dc70b9ef5b698eb8797e GIT binary patch literal 15132 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..69b2233 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #D81B60 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..61617d4 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + WTermux + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..c1533bb --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..02199bb --- /dev/null +++ b/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + google() + jcenter() + + } + dependencies { + classpath 'com.android.tools.build:gradle:3.4.1' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..82618ce --- /dev/null +++ b/gradle.properties @@ -0,0 +1,15 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

<5G2M1WZP5 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 F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..80e175d --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Jun 25 16:06:19 IDT 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..e95643d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/local.properties b/local.properties new file mode 100644 index 0000000..d660041 --- /dev/null +++ b/local.properties @@ -0,0 +1,9 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Tue Jun 25 16:06:37 IDT 2019 +ndk.dir=/opt/AndroidSdk/ndk-bundle +sdk.dir=/opt/AndroidSdk diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app'