Initial commit

main
Jonas Dreßler 2023-12-20 11:44:46 +01:00
commit 6e0636c8cf
240 changed files with 71117 additions and 0 deletions

31
README.md 100644
View File

@ -0,0 +1,31 @@
# Running Jolla AppSupport/aliendalvik on regular linux distros
This is a small repo documenting the reverse enginieering of Jolla's Android AppSupport (aka Aliendalvik), including steps on how to run it on other linux distros than Sailfish OS.
## Note for everyone attempting this
Aliendalvik is a complex piece of software and requires lots of setup to run. This is a very rough set of steps, it *won't* work on the first try, be prepared to solve problems.
## Steps to run outside of Sailfish OS
1. Get a supported phone with Sailfish OS and Android AppSupport (see https://shop.jolla.com/) and grab the necessary binaries
- Start the phone, go through setup of Sailfish OS and setup Android AppSupport
- Get all the necessary files from the phone via SSH, see files.txt
2. Set up dependencies on the target device
- Install dependencies from the Arch ARM repos: lxc packagekit-qt5 mlite qt5-sensors qt5-location python-pywayland
- Build necessary libraries that aren't in the Arch ARM repos: libglibutil libgbinder
- Build custom libraries from forks: [libQtContacts](https://github.com/jonas2515/qtpim/tree/alien-everwhere), [libqtcontacts_folks](https://github.com/jonas2515/qtfolks), [libqtposition_geoclue2](https://github.com/jonas2515/qtpositioning/tree/alien-everwhere), [libqtsensors_iio-sensor-proxy](https://github.com/jonas2515/qtsensors/tree/alien-everywhere)
- Install shimming services on the target device, see shimming/
- Build and install patched mobile-mutter and libwayland, see patches/
- Get the vanilla (not GApps) android system.img and vendor.img from Waydroid
3. Copy all the aliendalvik config, binaries and libraries to the target device, see files.txt
4. Create necessary users, groups, and configure a few more things on the device, see setup-environment.txt
5. Edit the aliendalvik configuration on the device, see configure.txt
6. Do a manual test-run of aliendalvik to check if everything works, see running.txt
7. If you managed to run everything, there's some systemd services and scripts to automate startup of aliendalvik in the automation/ folder

View File

@ -0,0 +1,66 @@
#!/bin/sh
set -e
active_wayland_user=
for session in $(loginctl list-sessions --no-legend | awk '{ print $1 }'); do
if [ "$(loginctl show-session --value -p Type ${session})" != "wayland" ]; then
continue
fi
if [ "$(loginctl show-session --value -p Class ${session})" != "user" ]; then
continue
fi
if [ "$(loginctl show-session --value -p Remote ${session})" != "no" ]; then
continue
fi
if [ "$(loginctl show-session --value -p State ${session})" != "active" ]; then
continue
fi
active_wayland_user="$(loginctl show-session --value -p Name ${session})"
break
done
if [ "${active_wayland_user}" == "" ]; then
echo "No active wayland session found"
exit 1
fi
data_dir="/home/${active_wayland_user}/.local/share/appsupport/data/"
rm -f ${data_dir}/alien_boot_completed
(
while [ ! -f ${data_dir}/alien_boot_completed ]; do
sleep 1;
done
if [ "$(cat ${data_dir}/alien_boot_completed)" = "1" ]; then
echo "alien bootup finished, running post startup"
# use the commands from alien-post-startup.sh script here
lxc-attach --name=aliendalvik --lxcpath=/tmp/appsupport -- /system/bin/sh -c ""
lxc-attach --name=aliendalvik --lxcpath=/tmp/appsupport -- /system/bin/sh -c "source /etc/mkshrc;
# enable gesture navigation
cmd overlay disable com.android.internal.systemui.navbar.gestural
cmd overlay enable com.android.internal.systemui.navbar.gestural"
systemd-notify --ready
fi
) &
lxc-start --rcfile=/tmp/appsupport/aliendalvik/config --lxcpath=/tmp/appsupport -n aliendalvik -F
if [ "$(cat ${data_dir}/alien_boot_completed)" = "2" ]; then
echo "alien crashed"
exit 1
fi
echo "alien graceful shutdown"
exit 0

View File

@ -0,0 +1,62 @@
#!/bin/sh
set -e
active_wayland_user=
active_wayland_uid=
while true; do
for session in $(loginctl list-sessions --no-legend | awk '{ print $1 }'); do
if [ "$(loginctl show-session --value -p Type ${session})" != "wayland" ]; then
continue
fi
if [ "$(loginctl show-session --value -p Class ${session})" != "user" ]; then
continue
fi
if [ "$(loginctl show-session --value -p Remote ${session})" != "no" ]; then
continue
fi
if [ "$(loginctl show-session --value -p State ${session})" != "active" ]; then
continue
fi
active_wayland_user="$(loginctl show-session --value -p Name ${session})"
active_wayland_uid="$(loginctl show-session --value -p User ${session})"
break
done
if [ "${active_wayland_user}" == "" ]; then
echo "No active wayland session found, waiting for one"
sleep 5
continue
fi
if [ ! -S "/run/user/${active_wayland_uid}/wayland-0" ]; then
echo "No wayland socket for user ${active_wayland_user} found, waiting a bit longer"
sleep 2
continue
fi
break
done
chown ${active_wayland_user}:appsupport-wayland /run/user/${active_wayland_uid}/wayland-0
chmod 775 /run/user/${active_wayland_uid}/wayland-0
rm -f /tmp/appsupport/aliendalvik/*
mkdir -p /tmp/appsupport/aliendalvik/
cp -r /opt/alien/config/* /tmp/appsupport/aliendalvik/
sed -i "s/__UID__/${active_wayland_uid}/g" /tmp/appsupport/aliendalvik/10-bsp_config
sed -i "s/__UID__/${active_wayland_uid}/g" /tmp/appsupport/aliendalvik/20-privilege_config
mkdir -p /home/${active_wayland_user}/.local/share/appsupport/data/
chown ${active_wayland_user}:${active_wayland_user} /home/${active_wayland_user}/.local/share/appsupport/
data_dir="/home/${active_wayland_user}/.local/share/appsupport/data/"
chown appsupport-root:appsupport-root ${data_dir}
sed -i "s|__DATA_DIR__|${data_dir}|g" /tmp/appsupport/aliendalvik/10-bsp_config

View File

@ -0,0 +1,30 @@
#!/bin/sh
set -e
mkdir /tmp/from
mkdir /tmp/to
mkdir /tmp/work
mount /opt/alien/system.img /tmp/from
mount -t overlay -o lowerdir=/tmp/from,upperdir=/tmp/to,workdir=/tmp/work overlay /opt/alien/rootfs
sed -i 's/setprop sys.use_memfd false/#setprop sys.use_memfd false/g' /opt/alien/rootfs/system/etc/init/hw/init.rc
chmod 777 /dev/binder
chmod 777 /dev/hwbinder
chmod 777 /dev/vndbinder
chmod 777 /dev/dri/card0
mkdir /tmp/from2
mkdir /tmp/to2
mkdir /tmp/work2
mkdir /tmp/waydroid-vendor
mount /var/lib/waydroid/images/vendor.img /tmp/from2
mount -t overlay -o lowerdir=/tmp/from2,upperdir=/tmp/to2,workdir=/tmp/work2 overlay /tmp/waydroid-vendor
rm /tmp/waydroid-vendor/lib64/hw/android.hardware.gatekeeper@1.0-impl.so
rm /tmp/waydroid-vendor/lib/hw/android.hardware.gatekeeper@1.0-impl.so
mkdir /tmp/waydroid-system
mount /var/lib/waydroid/images/system.img /tmp/waydroid-system
cp /tmp/waydroid-system/system/product/app/webview/webview.apk /opt/alien/rootfs/system/app/webview/webview.apk
cp -r /tmp/waydroid-system/system/product/overlay /opt/alien/rootfs/product/

View File

@ -0,0 +1,57 @@
#!/bin/sh
set -e
USER_SERVICES="alienaudio.service alienkeyboard.service apkd-bridge.service apkd-bridge-user.service"
active_wayland_user=
for session in $(loginctl list-sessions --no-legend | awk '{ print $1 }'); do
if [ "$(loginctl show-session --value -p Type ${session})" != "wayland" ]; then
continue
fi
if [ "$(loginctl show-session --value -p Class ${session})" != "user" ]; then
continue
fi
if [ "$(loginctl show-session --value -p Remote ${session})" != "no" ]; then
continue
fi
if [ "$(loginctl show-session --value -p State ${session})" != "active" ]; then
continue
fi
active_wayland_user="$(loginctl show-session --value -p Name ${session})"
break
done
if [ "${active_wayland_user}" == "" ]; then
echo "No active wayland session found"
exit 1
fi
if [ "$1" == "start" ]; then
# User services behave buggy if they're kept running while container is down
# or started without hwservicemanager running in the container.
# So start the services right after hwservicemanager is started in the container.
#
# systemd should ensure that we're always started and stopped in sync with
# aliendalvik.service (because of BindsTo= dependency)
while [ "$(lxc-attach --name=aliendalvik --lxcpath=/tmp/appsupport -- /system/bin/getprop hwservicemanager.ready)" != "true" ]; do
echo "User services startup waiting for hwservicemanager in container"
sleep 1
done
for SERVICE in $USER_SERVICES; do
echo "Starting $SERVICE"
systemctl --user -M ${active_wayland_user}@ start ${SERVICE}
done
elif [ "$1" == "stop" ]; then
for SERVICE in $USER_SERVICES; do
echo "Stopping $SERVICE"
systemctl --user -M ${active_wayland_user}@ stop ${SERVICE}
done
fi

View File

@ -0,0 +1,8 @@
[Unit]
Description=Aliendalvik config generator
Requires=systemd-user-sessions.service aliendalvik-setup.service
After=systemd-user-sessions.service aliendalvik-setup.service
[Service]
Type=oneshot
ExecStart=/usr/bin/aliendalvik-config

View File

@ -0,0 +1,11 @@
[Unit]
Description=Aliendalvik setup
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/aliendalvik-setup
[Install]
WantedBy=graphical.target

View File

@ -0,0 +1,12 @@
[Unit]
Description=Aliendalvik user dependencies starter
Requires=systemd-user-sessions.service aliendalvik-config.service
BindsTo=aliendalvik.service
After=systemd-user-sessions.service aliendalvik-config.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/aliendalvik-user-dependencies start
# ExecStopPost because we also want to run on failure of aliendalvik.service
ExecStopPost=/usr/bin/aliendalvik-user-dependencies stop

View File

@ -0,0 +1,13 @@
[Unit]
Description=Aliendalvik container
Requires=systemd-user-sessions.service network.target lxc-net.service aliendalvik-config.service
BindsTo=aliendalvik-user-dependencies.service
After=systemd-user-sessions.service network.target lxc-net.service aliendalvik-config.service
[Service]
Type=notify
ExecStart=/usr/bin/aliendalvik
ExecStop=/usr/bin/lxc-attach --name=aliendalvik --lxcpath=/tmp/appsupport -- /system/bin/reboot -p
[Install]
WantedBy=graphical.target

View File

@ -0,0 +1,10 @@
[Unit]
Description=Aliendalvik main bridge connman DBus shim
After=dbus.socket
Requires=dbus.socket
[Service]
Type=dbus
BusName=net.connman
Restart=always
ExecStart=/usr/bin/apkd-bridge-user-connman-shim

View File

@ -0,0 +1,10 @@
[Unit]
Description=Aliendalvik audio bridge
After=dbus.socket graphical-session.target
Requires=dbus.socket graphical-session.target
[Service]
Restart=always
RestartSec=5
ExecStart=/usr/bin/alienaudioservice -d /dev/binder -n /dev/vndbinder -w /dev/hwbinder -p pulseaudio
#ExecStartPost=false

View File

@ -0,0 +1,10 @@
[Unit]
Description=Aliendalvik keyboard maliit DBus shim
After=dbus.socket graphical-session.target
Requires=dbus.socket graphical-session.target
[Service]
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/bin/alienkeyboard-maliit-shim/alienkeyboard-maliit-shim

View File

@ -0,0 +1,9 @@
[Unit]
Description=Aliendalvik keyboard bridge
After=dbus.socket graphical-session.target alienkeyboard-maliit-shim.service
Requires=dbus.socket graphical-session.target alienkeyboard-maliit-shim.service
[Service]
Restart=always
RestartSec=5
ExecStart=/usr/bin/alienkeyboardservice

View File

@ -0,0 +1,11 @@
[Unit]
Description=Aliendalvik main bridge
After=dbus.socket graphical-session.target
Requires=dbus.socket graphical-session.target
[Service]
Restart=always
ExecStart=/usr/bin/apkd-bridge-user
# looks like it doesn't clean up after itself
ExecStopPost=/usr/bin/rm -f /tmp/apkd/

View File

@ -0,0 +1,11 @@
[Unit]
Description=Aliendalvik control bridge
After=dbus.socket graphical-session.target
Requires=dbus.socket graphical-session.target
[Service]
Type=dbus
BusName=com.jolla.apkd
Restart=always
Environment="QTCONTACTS_MANAGER_OVERRIDE=folks"
ExecStart=/usr/bin/apkd-bridge

65
configure.txt 100644
View File

@ -0,0 +1,65 @@
- remove the android settings app from blocklisted apps so it shows up in your apps for testing
remove "com.android.settings" entry from /etc/apkd/app-blacklist
- edit central aliendalvik configuration in /etc/appsupport.conf.d/00-defaults.conf
comment out "RequiredDevNodes=ashmem"
comment out "DevNodes=ion"
- edit central aliendalvik configuration in /etc/appsupport.conf.d/10-hybris.conf
comment out the 3 "Proxies=" entries (we don't have any libhybris android HALs running underneath that we can proxy into the container)
comment out all the entries in "[Features]" block
- edit central aliendalvik configuration in /etc/appsupport.conf.d/80-aas-config.conf
set "DataRoot=/opt/alien/"
set "StoragePath=/opt/alien/data/media/0"
set "WaylandSocketPath=/run/user/100000/wayland-0"
set "BinderDev=binder"
set "HwBinderDev=hwbinder"
set "VndBinderDev=vndbinder"
set "PackageBlacklistFiles=/etc/apkd/app-blacklist"
set "NotifBlacklistFiles=/etc/apkd/notif-blacklist"
- edit LXC configuration in /tmp/appsupport/aliendalvik/10-bsp_config
replace "/dev/puddlejumper" with "/dev/binder"
replace "/dev/hwpuddlejumper" with "/dev/hwbinder"
replace "/dev/vndpuddlejumper" with "/dev/vndbinder"
comment out the /dev/ashmem, /dev/ion, /dev/uhid and /dev/kgsl-3d0 mounts
replace "/home/.android/data" with "__DATA_DIR__"
replace "/run/display" mount with "/run/user/__UID__/wayland-0 run/display/wayland-0 none bind,nodev,nosuid,create=file 0 0"
replace "/vendor" with "/tmp/waydroid-vendor"
comment out /odm/lib, /odm/lib64, /system/etc/apns-conf.xml, /dev/alien_video32, /dev/alien_video33 and /dev/video mounts
comment out /home/defaultuser, /home/defaultuser/android_storage and /run/media/defaultuser mounts
- edit LXC configuration in /tmp/appsupport/aliendalvik/20-privilege_config
# add a line to start properly on apparmor devices
lxc.apparmor.profile = unconfined
# replace "lxc.idmap = u 100000 100000 1" line with
lxc.idmap = u 100000 __UID__ 1
# replace "lxc.idmap = g 100000 100000 1" line with
lxc.idmap = g 100000 __UID__ 1
- edit LXC configuration in /tmp/appsupport/aliendalvik/30-net_config
comment out tmpfs mount to "sys/fs/selinux"
- edit android props in /tmp/appsupport/aliendalvik/generated_props
comment out these props: ro.vendor.extension_library, ro.hardware.vulkan, ro.board.platform
update these props "ro.alien.no_camera=1", "ro.alien.no_soundtrigger=1", "ro.com.android.mobiledata=false"
when you're on a pinephone pro, set "ro.opengles.version=196609"
add these props at the end:
ro.alien.qti.c2.service=0
ro.alien.qti.allocator.service=0
debug.stagefright.ccodec=0
ro.hardware.gralloc=gbm
ro.hardware.egl=mesa
sys.use_memfd=true
ro.alien.logcatdump=1
update DPI and display size values for your device
ro.sf.lcd_density=DPI
ro.alien.host.display_width=WIDTH
ro.alien.host.display_height=HEIGHT
ro.alien.host.dpi_x=DPI
ro.alien.host.dpi_y=DPI

111
files.txt 100644
View File

@ -0,0 +1,111 @@
note: a lot of these files are just symlinks, just copy the symlink in that case (in case of folders also copy the symlink, no need to copy what's inside)
binaries:
/usr/bin/alienaudioservice
/usr/bin/alienkeyboardservice
/usr/bin/apkd-bridge
/usr/bin/apkd-bridge-user
/usr/bin/apkd-harbour-rpm-post
/usr/bin/apkd-harbour-rpm-preun
/usr/bin/apkd-install
/usr/bin/apkd-install-preload
/usr/bin/apkd-launcher
/usr/bin/apkd-uninstall
libraries (some of those are open source, we can probably build them ourselves):
/usr/lib/libalienaudioservice.so.1
/usr/lib/libalienaudioservice.so.1.12
/usr/lib/libalienaudioservice.so.1.12.0
/usr/lib/libambermpris.so.1
/usr/lib/libambermpris.so.1.1
/usr/lib/libambermpris.so.1.1.10
/usr/lib/libapkd.so.1
/usr/lib/libapkd.so.1.0
/usr/lib/libapkd.so.1.0.0
/usr/lib/libconnman-qt5.so.1
/usr/lib/libconnman-qt5.so.1.3
/usr/lib/libconnman-qt5.so.1.3.0
/usr/lib/libdbusaccess.so.1
/usr/lib/libdbusaccess.so.1.0
/usr/lib/libdbusaccess.so.1.0.18
/usr/lib/libiphb.so.0
/usr/lib/libiphb.so.0.0.0
/usr/lib/libkeepalive.so.1
/usr/lib/libkeepalive.so.1.8
/usr/lib/libkeepalive.so.1.8.9
/usr/lib/libkeepalive-glib.so.1
/usr/lib/libkeepalive-glib.so.1.0.0
/usr/lib/libnemonotifications-qt5.so.1
/usr/lib/libnemonotifications-qt5.so.1.2
/usr/lib/libnemonotifications-qt5.so.1.2.18
/usr/lib/libngf0-0.24.so.0
/usr/lib/libngf0-0.24.so.0.1.1
/usr/lib/libprofile.so.0
/usr/lib/libresource.so.0
/usr/lib/libresource.so.0.0.18
/usr/lib/libresource-glib.so.0
/usr/lib/libresource-glib.so.0.0.18
/usr/lib/libsailfishpolicy.so.0
/usr/lib/libsailfishpolicy.so.0.4
/usr/lib/libsailfishpolicy.so.0.4.17
/usr/lib/qt5/qml/Sailfish/Policy/libsailfishpolicyplugin.so
/usr/lib/alienaudioservice/pulseaudio.so
/usr/lib/alienaudioservice/sailfish.so
/usr/lib/apkd-bridge-user/available/libgeo-qtpositioning.so
/usr/lib/apkd-bridge-user/libgeo-qtpositioning.so
config:
/etc/aas-seccomp-profile
/etc/apkd/app-blacklist
/etc/apkd/notif-blacklist
/etc/appsupport.conf.d/00-defaults.conf
/etc/appsupport.conf.d/10-hybris.conf
/etc/appsupport.conf.d/80-aas-config.conf
/etc/appsupport.conf.d/mount-hooks/10-mount-rootfs.sh
/etc/appsupport.conf.d/property-post-hooks/50-config-properties.sh
/etc/appsupport.conf.d/property-post-hooks/80-create-container-nodes.sh
/etc/appsupport.conf.d/property-post-hooks/90-create-storage-directory.sh
/etc/appsupport.conf.d/property-pre-hooks/10-codecs.sh
/etc/appsupport.conf.d/property-pre-hooks/20-vulkan.sh
/etc/appsupport.conf.d/property-pre-hooks/50-networking.sh
/etc/appsupport.conf.d/property-pre-hooks/50-wait-lipstick.sh
/etc/gbinder.conf
/etc/gbinder.d/alien.conf
aliendalvik build props + system and vendor image:
/opt/alien/build.prop
/opt/alien/system.img
/opt/alien/vendor/etc/media_codecs.xml
/opt/alien/vendor/etc/media_codecs_google_audio.xml
/opt/alien/vendor/etc/media_codecs_google_telephony.xml
/opt/alien/vendor/etc/media_codecs_google_video.xml
/opt/alien/vendor/etc/media_codecs_vendor_audio.xml
/opt/alien/vendor/etc/media_profiles_V1_0.xml
/opt/alien/vendor/etc/video_system_specs.json
/opt/alien/vendor/etc/vintf/manifest.xml
/opt/alien/vendor/firmware
/opt/alien/vendor/lib
/opt/alien/vendor/lib64
runtime generated LXC config:
/tmp/appsupport/aliendalvik/10-bsp_config
/tmp/appsupport/aliendalvik/20-privilege_config
/tmp/appsupport/aliendalvik/30-net_config
/tmp/appsupport/aliendalvik/40-rootfs_config
/tmp/appsupport/aliendalvik/alien.user
/tmp/appsupport/aliendalvik/config
/tmp/appsupport/aliendalvik/generated_props
optional script with some commands to run inside android container after startup:
/usr/libexec/appsupport/alien-post-startup.sh

View File

@ -0,0 +1,582 @@
general stuff
- we can't use ashmem (sailfish has it) because that was dropped from mainline kernels
- android supports memfd these days, but that has to be enabled via prop sys.use_memfd
- this is overwritten by android init system though
- need to comment the override out it system/etc/init/hw/init.rc (can use overlayfs for that)
- for graphics, we mostly need these props just like waydroid
ro.hardware.gralloc=gbm
ro.hardware.egl=mesa
apkd:
- providing some kind of host integration
- probably for startup and management of the container
- daemon running as root listening to com.jolla.apkd.control on dbus
- user daemon apkd-bridge
- install dbus configs not into /etc/ but into /usr/share/dbus-1/system.d/
- appears to want to talk to systemd about aliendalvik.service
- that service needs to be installed
apkd-bridge:
- deps:
- libnemonotifications compiled from jolla
- libqt5contacts.so
- sailfish-policy package (for library) from phone
- (maybe not necessary) group privileged needs to exist, otherwise error
- package packagekit-qt5 for libraries
- forwards notifications and app launch requests to host
- runs as user on host
- only registers it's launcher thing on the binder if it sees that aliendalvik.service is running
- can check with binder-list -d /dev/binder for alien.notification and alien.launcher
- still doesn't seem to launch apps successfully though
- ahaa, it seems like it only works when all HALs sucessfully load or something?
alienaudioservice
- needs libalienaudioservice
- needs symlink from /usr/lib64 to /usr/lib :(
- appears to need /etc/gbinder.conf and /etc/gbinder.d/alien.conf
- alienaudioservice -d /dev/binder -n /dev/vndbinder -w /dev/hwbinder --verbose
- ugh, the thing doesn't read configuration in /etc/appsupport.d/, so need to set binder devices via argument
- now wants to connect to default_alien and AlienAudioService: fails there
- ooof this one is tricky
- it appears to be something on /dev/vndbinder
- oh wow, it appears to work when starting android shortly before
- probably it needs a service manager to be running to register the services
- ERROR: service: Cannot connect to alien.audio.control/android.media.IAlienAudioControlService
- seems to not be a problem/blocking at this stage, this service starts up fairly late in android
- nothing to worry about as long as early startup isn't through
- what is the problem is that this enumeration of audio devices doesn't happen
- that's what it looks like on stdout with --verbose
[AlienAudioService] service: Shared buffer fd 31 (0x7dd32d1000) size 7680
[AlienAudioService] service: Output standby (0/125)
[AlienAudioService] service: Set parameters 125: "routing=2"
[AlienAudioService] service: Open output (0) io_handle(133) devices(2) flags(0x00000008) sample_rate(48000) channel_mask(3) format(1) -> 0
- ugh.. the problem is the UID mapping in lxc container config.. the whole thing has to run as the UID mapped there
- alright this thing works pretty well now
- seems that with pipewire-pulse, sound output stops after a while
- lets just use pulseaudio on the host for the time being
apkd-bridge-user:
- not needed to finish bootup
- fairly independent from other things it seems.
- what it does is bridge the HALs in #Proxies=android.hardware.graphics.allocator@4.0 et al into the container
- when Proxies are set in config, Service 'package_native' will wait and block boot for these
- install libQt5Sensors.so.5 from pacman (don't copy from dev, must match installed QT version)
- for gps stuff it needs (somewhat optional, also starts without it) /usr/lib64/apkd-bridge-user/libgeo-qtpositioning.so (jolla pkg apkd-plugin-geo-qtpositioning)
- that pulls in libQt5Positioning.so (arch pkg qt5-location)
- aha, actually this thing somehow provides HALs on hwbinder for gnss, sensors, wifi.supplicant, wifi
- it does a ton more stuff when looking at strings on the binary...
- it also does the mpris indicator
- yup, it also adds service on the normal binder: alien.NativeCall, alien.mediabrowsercontrol.bridge, alien.mce, wifinl80211
- arghhhh, I've spent 6 hours or something looking into why it doesn't install services on the hwbinder
- and it ended up being another damn UID thing: ro.alien.privileged_host_uid needs to be set to the one that's mapped to 1 apparently
system/vendor:
- general strategy: use aliendalvik vendor blob and put waydroid vendor blob on top (alien doesn't ship mesa drivers that work with mainline)
- symlinks of /etc/media_* must be removed and also replaced with waydroid ones
- otherwise signal won't start?
- graphics.allocator HAL? seems it's fine to comment that out
- apparently it's also possible to make it work by installing the waydroid vendor/bin stuff
- we can't *quite* reuse the normal aliendalvik vendor blob
- in alien vendor lib(64)/hw points to /host_vendor/lib(64)/hw
- we need lib(64) pointing to /host_vendor/lib(64)
- why? because /host_vendor is waydroid vendor, and we need to access egl drivers in there (and also various libs these drivers need)
- also in etc/vintf/manifest.xml, android.hardware.power and android.hardware.graphics.allocator need to be commented out
- there's no power HAL nor graphics allocator HAL available
- both are forwarded from hybris on sailfish
- graphics allocator we could provide via waydroid vendor, but doesn't seem to get us any benefits
video codecs:
- with libhybris we could forward the HW decoder directly it seems
- looks like we fail to decode h264/h265, but not in MKV container (test-videos.co.uk/bigbuckbunny is very helpful)
- hmm with the mediaextractor minijail thing we did for Signal this seems to work, just super slow
- so debug.stagefright.ccodec=0 makes stagefright try to use sw codecs
- ccodec appears to the abstraction for hw codecs, going through libcodec2_client into libcodec2_vndk.so or libcodec2_hidl_client.so
- it tries to use libcodec2_vndk.so by default, that tries to access /dev/ion and crashes
- looks like ro.alien.hwservicemanager and ro.alien.host_has_hwservicemanager12 play a role here, they are used in all these libs
[tester@suagaze system-img]$ grep -r ro.alien.hwservicemanager
grep: system/lib64/libhidlbase.so: binary file matches
grep: system/lib64/libcodec2_client.so: binary file matches
grep: system/lib/libhidlbase.so: binary file matches
grep: system/lib/libcodec2_client.so: binary file matches
grep: system/apex/com.android.media.swcodec/lib64/libhidlbase.so: binary file matches
grep: system/apex/com.android.media/lib64/extractors/libmpeg2extractor.so: binary file matches
grep: system/apex/com.android.neuralnetworks/lib64/libneuralnetworks.so: binary file matches
grep: system/apex/com.android.neuralnetworks/lib/libneuralnetworks.so: binary file matches
- when unsetting ro.alien.hwservicemanager, android.hardware.media.omx fails to start and we hang when starting video
- appears to crash in libminijail due to: blocked syscall: recvfrom
- there should be policy for that in /vendor/etc/seccomp_policy/mediaswcodec.policy, but that file doesn't exist
- now it's complaining about /host_vendor/etc/seccomp_policy/mediacodec.policy, give him that too
- looks a lot like ro.alien.hwservicemanager=0 and debug.stagefright.ccodec=0 do the same thing
- hmm couldn't figure that out, I feel like this debug message plays a role
Unsupported profile 4 for video/mp4v-es
- oh there's also a few properties that can be set by appsupport-generate-config tool:
- ro.media.xml_variant.codecs, ro.media.xml_variant.codecs_performance, ro.media.xml_variant.profiles
- also CodecXmlSuffix in config
- playing videos in telegram doesn't work
- in Signal, getting called gives us a mediaextractor crash
- problem seems to be minijail blocking syscalls
- works by adding /opt/alien/vendor/etc/seccomp_policy/mediaextractor.policy with this content
- https://github.com/waydroid/android_external_stagefright-plugins/blob/da49cdba7b938ec9d973b9a74c9aac210b55bc8e/codec2/seccomp_policy/android.hardware.media.c2%401.1-ffmpeg-arm64.policy
- but remove all the fancy comparisons and make it always 1, otherwise filter won't compile
- outgoing call on whatsapp to iphone, voip connection takes super long
08-09 10:41:27.164 140 272 I WindowManager: Input event dispatching timed out sending to com.whatsapp/com.whatsapp.voipcalling.VoipActivityV2. Reason: ad09381 com.whatsapp/com.whatsapp.voipcalling.VoipActivityV2 (server) is not responding. Waited 5005ms for FocusEvent(hasFocus=true)
input/OSK:
- normal zwp_text_input through wayland appears to actually work
- but it's buggy and crashes on preedit_string(null)
- this is explicitly legal according to protocol
- hack might be to not send preedit_string with NIL string??
- it's actually *very* messy
- set_surrounding_text() only returns the text that's before the cursor, nothing behind it
- it also doesn't handle selected text at all
- preedit_string() doesn't appear to be handled at all
- commit_string() is only handled when cursor is at 0 (maybe this is connected to an empty set_surrounded_text() coming in before)
- or when doing commit_string() twice, but that might be the set_surrounded_text() reason
- either way, any commit_string() causes it to disable() and re-enable() the input panel
- this causes it to never disable() it anymore later.
- oh wow even better the damn thing seems to append "\n" to any string
- actually emulating normal wl_keyboard events might be our best bet
- then the auto-hide should keep working, and we're left with the auto-hide bug only for the emoji panel
- sailfish uses maliit and a custom keyboard on top of it
- maliit itself just spawns a fullscreens wayland surface to show the OSK
- yay, it's using qt_extended_surface protocol extension to implement always-on-top (https://github.com/qt/qtwayland/blob/dev/src/extensions/surface-extension.xml)
- actually that protocol doesn't seem too bad
- small dump of init of the OSK surface
[3342860.994] -> wl_compositor@4.create_surface(new id wl_surface@20)
[3342861.309] -> wl_registry@2.bind(11, "wl_shell", 1, new id [unknown]@21)
[3342861.565] -> wl_shell@21.get_shell_surface(new id wl_shell_surface@22, wl_surface@20)
[3342861.684] -> qt_surface_extension@9.get_extended_surface(new id qt_extended_surface@23, wl_surface@20)
[3342861.806] -> wl_shell_surface@22.set_title("")
[3342861.866] -> wl_shell_surface@22.set_class("maliit-server")
[3342861.907] -> wl_shell_surface@22.set_toplevel()
[3342861.947] -> wl_surface@20.set_buffer_scale(1)
[3342861.997] -> qt_extended_surface@23.set_content_orientation_mask(0)
[3342862.040] -> qt_extended_surface@23.set_window_flags(2)
[3342862.128] -> wl_shell_surface@22.set_fullscreen(0, 0, nil)
[3342862.208] -> wl_surface@20.set_buffer_transform(0)
[3342862.248] -> wl_surface@20.commit()
[3342863.572] -> wl_compositor@4.create_region(new id wl_region@24)
[3342863.686] -> wl_region@24.add(0, 2520, 1080, 0)
[3342863.796] -> wl_surface@20.set_opaque_region(wl_region@24)
[3342863.839] -> wl_region@24.destroy()
[3342863.989] -> qt_extended_surface@23.update_generic_property("CATEGORY", array)
[3342864.076] -> qt_extended_surface@23.update_generic_property("MOUSE_REGION", array)
[3342910.604] -> wl_compositor@4.create_surface(new id wl_surface@25)
- maybe zwp_input_panel_surface_v1 is what we want for that actually
- it seems that on sailfish, all IM/text input communication with OSK goes through peer-to-peer dbus socket, zero wayland involved
- /run/user/uid/maliit-server/dbus-socket
- could sniff that with advanced and very fancy eBPF stuff: https://bulimov.me/post/2021/12/02/unix-socket-snoop/, https://github.com/mechpen/sockdump
- qt apps talk directly on that private dbus (in qt it proabably works via IM plugin, set using global QT_IM_MODULE=Maliit)
- maliit also appears to support zwp_input_method_context_v1
- if we implement that in mutter, we could make communication Gtk<->maliit go through that
- that'd be what we want for OSK's in the future either way
- alienkeyboardservice talks directly to that socket just as qt
- oh hey we can snoop that using QDBUS_DEBUG=1 alienkeyboardservice
- uhh okay this is not too bad
- maybe we could shim a few things and keep using wl_text_input_v3
- shifting up input fields on android works via maliit
- <method name="updateInputMethodArea">
- could try to shim that?
- or we just run a full blown maliit as our keyboard
- possibly supporting zwp_input_method_context_v1 is "all" we need for that in mutter
- apparently there's also input_method_v2 from purism (https://lists.freedesktop.org/archives/wayland-devel/2018-August/039255.html)
- seems not really worth it to implement v1 when it will get replaced anyway
- clipboard sharing works on sailfish from container to host, not other way round
- seems that sends proper wl_data_source.offer() via surfaceflinger, neat....
- alienkeyboardservice:
- yayy, this thing has a -d argument for the binder dev, but it doesn't actually use it
- can just use hex editor and change the binder dev in the binary, it's a NUL-terminated string, easy
- talks to the inputmethod jolla inside android
- talks to maliit-server over dbus p2p socket
- still not sure how to enable debugging there, strings suggests it has a verbose mode, no idea how it works
- we might want to shim maliit for the text-input shifting behavior inside android
- oh well, shimming maliit was nicely possible with some fancy python things
- buuut the damn thing crashes when wl_text_input is enabled at same time as alienkeyboard thingy
- only solution for us is to kill wl_text_input (their implementation is super duper buggy anyway)
- add a WAYLAND_DISABLE_PROTOCOL env var to wayland
- and make our shim a small wayland client for zwp_text_input
- pip3 install --user --break-system-packages pywayland
- python3 -m pywayland.scanner --with-protocols -o protocols
- oof, this is getting more and more tricky
- had to go the whole route and disable wl_text_input_v3 for alien
- now it does work, but the damn python dbus+wayland thing I wrote is pretty weird
- so getting a working keyboard now needs
- python fake-server.py
- python test.py
- alienkeyboardservice
compositor things:
- wayland socket is located at /run/display and is world-read+writeable on sailfish
- this is to allow surfaceflinger in the android container (with different user) to access it
- seems a bit dangerous that it's also accessible to random android processes?
- looks like we can create a separate user+group for SurfaceFlinger (it runs with UID 501000)
- then chown wayland socket for that group and make it 775
- okay fun, lipstick also implements a surface role for wayland: alien_manager / alien_surface
- looks like that is actually just a way of working around that lipstick doesn't do xdg-toplevel/xdg-wm
- seems like because of that we get to see the bugs now
- tried implementing the protocol in mutter, but doing two surface roles at the same time is a bad idea (and surfaceflinger really wants to)
- surfaceflinger crashes in wl_log() when enabling wayland debugging via debug.sf.wayland
- so surfaceflinger crashes on closing the last open window, then opening a new one, then touching it
- we send xdg_wm_base pings on input to windows to make sure they're alive
- it seems that when it sees a ping in some cases, it crashes when handling the event
- disabling pinging in mutter seems to do the trick
- also surfaceflinger sometimes accesses xdg_surfaces that have implicitly been freed after it requested wl_surface.destroy()
- causes client error from libwayland, tearing down the connection
- these can be worked around by making those client errors non-fatal in wayland
- another workaround seems to be waiting a bit longer with freeing the wl_resource on surface destroy in mutter
- REPRODUCER: open netflix, error appears and click "learn more", app crashes and surfaceflinger fucks up
- REPRODUCER: or open other apps and click the back button to leave them
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197137.171] -> xdg_surface#42.configure(93)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197137.201] -> wl_keyboard#12.leave(301, wl_surface#41)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197137.214] -> zwp_text_input_v3#3.leave(wl_surface#41)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197141.457] wl_surface#41.destroy()
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197167.465] -> wl_display#1.delete_id(33)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197167.501] -> wl_display#1.delete_id(42)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197167.538] -> wl_display#1.delete_id(41)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197167.549] wl_display#1.sync(new id wl_callback#46)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197167.557] -> wl_callback#46.done(301)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197167.563] -> wl_display#1.delete_id(46)
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: [4197167.780] -> wl_display#1.error(wl_display#1, 0, "invalid object 42")
Jul 12 15:36:19 oneplus6 gnome-shell[448812]: WL: error in client communication (pid 456513)
- another occurence
Jul 12 14:52:47 oneplus6 gnome-shell[425720]: [1585117.972] -> wl_display@1.error(wl_display@1, 1, "invalid arguments for wl_surface@55.attach")
Jul 12 14:52:47 oneplus6 gnome-shell[425720]: WL: unknown object (2117946272), message attach(?oii)
Jul 12 14:52:47 oneplus6 gnome-shell[425720]: WL: error in client communication (pid 439093)
- when starting apps, they often only start drawing on touch input
- could have something to do with us only focusing the app on input?
- maybe it's the configure() event we send them when focusing
- scaling is borked, on hidpi alien windows are blurry
- lipstick supports wl_output, but does wl_output.scale(1), apparently scaling is done via env variable or smth
- can fix that by reading the wm_class and then special-casing alien windows in mutter
- it seems they're leaking their wl_region's, lovely...
- sailfish sets opaque regions too, good thing their phones have so much ram :D
- we also get our fair share of bugs :)
- looks like we sometimes send zwp_text_input.leave event after wl_surface.destroy()
- REPRODUCER: sometimes this works: open netflix, error appears and click "learn more", now app crashes
Jul 12 14:46:10 oneplus6 gnome-shell[425720]: [1187342.350] wl_surface@34.destroy()
Jul 12 14:46:10 oneplus6 gnome-shell[425720]: [1187342.532] -> zwp_text_input_v3@3.leave(wl_surface@34)
Jul 12 14:46:10 oneplus6 gnome-shell[425720]: WL: error marshalling arguments for leave (signature uo): null value passed for arg 1
- on the pinephone pro, we crash after a while in the gallium driver
- fixed by setting different openglES version: ro.opengles.version=196609
network access/fake wifi:
- there's two props that exclude each other: ro.alien.sailfish_networking ro.alien.default_networking
- sailfish uses the former by default, controlled by /etc/appsupport.conf.d/property-pre-hooks/50-networking.sh
- ah damn, it's also provided somehow by apkd-bridge-user
- waydroid uses lxc networking spawning an eth0 inside the container
- sets up manually a waydroid0 interface on host with firwall and masquerading (https://github.com/waydroid/waydroid/blob/822598850d0c16a968fb8ea4b5768d4ba323f0e5/data/scripts/waydroid-net.sh)
- see for lxc config https://github.com/waydroid/waydroid/blob/822598850d0c16a968fb8ea4b5768d4ba323f0e5/data/configs/config_1
- probably due to being eth0, this requires fake wifi stuff
- waydroid has a fake wifi thing controlled by persist.waydroid.fake_wifi (https://github.com/waydroid/android_vendor_waydroid/commit/629b76f254d07d373092f7c18efcbefbc0f9ad94)
- seems to be per app (https://github.com/waydroid/docs/blob/9b5be41b9233aecf201471596fc6e84f7423ab85/usage/waydroid-prop-options.md?plain=1#L22)
- not used by default?
- alright, alien also uses lxc to install a bridge into the container
- but at the same time it implements a wifi HAL to pretend to be connected to wifi
- it asks connman for connected wifi and then returns that SSID, interesting
- need to copy lxc-net from device, seems that arch lxc no longer ships that script
- need to shim connman dbus
- what we're looking for from the contianer is starting the scanner, then notifying the net
com.jolla.apkd.wifi: apkd: android.net.wifi.nl80211.IWifiScannerImpl 10
com.jolla.apkd.wifi: apkd - supplicant - notifyWifiNetwork 0xaaaae832fac0 "iPhone von Jonas"
- connman installed on system is still needed (probably only for the dbus interface definition)
- alright took me like another hour to get the shim working for android to pick up the network
- but then android said "no internet", I thought I'm missing something else in the shim
- after two more hours of randomly shimming other apis and trying whatever finally figured it out
- android can't resolve dns, and its not because of the shim
- it'S because it uses the dns cache of the host and sets its dns 127.0.0.1
- connman provided a resolver on localhost:53, and the systemd-resolved NM uses apparently doesn't answer those queries
- can test with "dig heise.de @127.0.0.1"
- resolved listens on 127.0.0.53 by default
- setting DNSStubListenerExtra=127.0.0.1 makes it work, arghhhhh.
cellular network
- android is always looking for iRadio HAL, need to check if that one's exposed by apkd-bridge on jolla
- things work just fine with the wifi shim for now
- looks like exposing cellular info via connman shim doesn't work :/
- actually iRadio HAL is not exposed by any apkd-* tools, instead it's exposed by ofono it seems
- that's unfortunate, it's probably bound to ofono making use of hybris radio HALs somehow
- yup, there's /usr/lib64/ofono/plugins/alienbinderplugin.so
gps
- good news, appears to go via geoclue
- kinda works OOTB, but location is not as accurate as on host it seems
- apkd-bridge-user has debug output for it
- there's a nice gtk app for debugging: Satellite on flathub (it talks to ModemManager directly)
- turns out modemManager doesn't do gps without a sim card
https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/183
- okay, so there's the geoclue2 API backend for qtpositioning, that's good
- sadly it doesn't have a satellites API anymore like Geoclue dbus api had
- alright, let's build qtLocation 5.0 ourselves
- looks like it really wants to use the old Geoclue1 api, the plugin has a higher prio
- can run geoclue with debug using sudo G_MESSAGES_DEBUG=Geoclue /usr/lib/geoclue
- aha, here's our problem: the thing only requests shit accuracy from geoclue
- seems it relies on a thing that both the android and geoclue1 plugin do: set default accuracy to ALL in plugin constructor
- if we do that too, things work!!
sensors
- qtsensors has a fairly minimal iio-sensor-proxy backend
- no support for proximity
- fairly easy, can wire that up quickly
- no accellerometer (iio-sensor-proxy doesn't expose)
- https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/merge_requests/193
- first need to allow querying iio-sensor-proxy as user by changing polkit
/usr/share/polkit-1/actions/net.hadess.SensorProxy.policy
- for compass access also need to change dbus policy
/usr/share/dbus-1/system.d/net.hadess.SensorProxy.conf
- compass doesn't have a backend that works on most phones yet, see
https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/merge_requests/316
- rotation/gyro sensor is not really wanted in iio-sensor-proxy without a use-case
https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/issues/221
- seems that messengers use proximity sensor for audio route during voice messages actually
- looool telegram combines it with accelerometer readings it seems, how insane
- seems like also android makes use of orientation sensor and rotates apps, we probably don't want that
app rotation
- android does it itself based on orientation sensor readings
- looks weird and interferes with mutter, rotating, also doesn't adhere to "allow autorotation" gsetting
- can disable with "settings put system accelerometer_rotation 0;" in container
vibration
- can debug feedbackd with G_MESSAGES_DEBUG=all /usr/lib/feedbackd
- doesn't work by default
- seems to be provided by alienaudioservice actually
- more specifically by the sailfish plugin, interesting
- let's try loading the plugin
- fails without these libs: libprofile, libresource, libresource-glib, libngf0
- now it hangs up looking for org.maemo.resource.manager on dbus it seems
- is exposed by ohmd (open hardware manager)
- more specifically by this plugin it seems https://github.com/sailfishos/ohm-plugins-misc/blob/master/plugins/resource/
- trace of system dbus on initialization here: dbus-trace-alienaudio-sailfish-plugin.txt
- let's shim it, ah neat preexisting stuff to shim the policy manager
https://github.com/sailfishos/libresource/blob/master/tests/dbus/dummy-policy-manager.py
audio routing:
- goes through alienaudioservice sailfish plugin
https://github.com/sailfishos/ohm-plugins-misc/blob/master/plugins/route/org.nemomobile.Route.Manager.xml
https://github.com/sailfishos/ohm-plugins-misc/blob/master/plugins/route/ohm-ext/route.h
- routing to earpiece during voice messages that goes a bit differently
- sailfish doesn't re-route here
- app reads sensors and sets media role:
[AlienAudioService] sailfish: Stream 29 set 'media.role'='phone'
[AlienAudioService] sailfish: Stream 29 set 'module-stream-restore.id'='sink-input-by-media-role:voip'
- maybe this is how it works on android and we're supposed to route to earpiece now?
lockscreen calls:
- seems sailfish doesn't do fullscreen intents for incoming calls
- we can possibly hack that and put app into lockscreen overlay by looking at notification
- resident == true && category == call
- activate default action and show surface as lockscreen overlay
- tricky: telegram behaves differently depending on screen was off or on
- when off, it shows swipy thing to not accidentlly click, when on, it shows clicky thing
- what about ongoing calls on lockscreen
- there's again a notification, maybe can use that still
ringtone silencing
- on sailfish, ngfd just enforces the silent profile by killing haptics
https://github.com/sailfishos/ngfd/blob/master/src/ngf/haptic.c#L187
- seems like same goes for ringtone, the stream is created, but appears to be killed by pulse based on media.role=ringing
- what do we do?
- in the future, call ringtone and vibration will be played by notification server anyway
- we know when an alien call is ringing, so can probably kill vibration and mute the alien stream in our audio shim to allow notification server taking over
- kills custom ringtones on android, oh well
- won't work for alarm clocks, there we don't know about ringing state
- or we just let things through normally and enforce silent profile in the shim for both haptics and audio on incoming call
- maybe that's the best way for now
contacts sync:
- another tricky one, they replace system contacts UI and database with host one
- breaks things for us of course
- we might have to shim com.jolla.contacts.ui dbus
- we can see createContact() being called from android
- handled by apkd-bridge
- according to changelogs, bridge "Sync all contacts to alien on service connect"
- to ensure it works, on startup of container, look for this
com.jolla.apkd.binder: Connected to Alien Service alien.contacts
com.jolla.apkd.contacts: Checking if Alien contacts service is ready for synchronisation
com.jolla.apkd.contacts: Alien contacts service is available, performing initial sync
Successfully notified Alien contacts service of current contacts.
- also contact modification should be detected
"Notifying Alien contacts service of contact addition:"
- okayy, so this talks to libQtContacts and a custom sqlite backend on sailfish
- wowwww, we're lucky, there's a libfolks backend from ~2010 for QtCOntacts available
- https://wiki.gnome.org/Projects/Folks/QtFolks
- https://blog.barisione.org/2010/11/17/folks-and-qtcontacts/
- https://launchpad.net/~m-gehre/+archive/ubuntu/ppa/+packages
- damn was finding those sources hard
- okay with a few adjustments it builds and the demo confirms it works, yaaaaay!
- now still have to make sure it gets loaded and used by apkd-bridge
- ah wow that was super tricky, because strings didn't find any references to the plugin name (org.nemomobile.contacts.sqlite) in any binaries
- turns out apkd-bridge still demands that plugin, it probably puts the string together in an un-greppable way, damn....
- okay so we're gonna have to force our own plugin then via custom build of libQt5Contacts
- ugh, it's still not working, but at least now apkd-bridge spews a log on contact changes in folks, let's try removing data dir
- damn, another few hours later, managed to get some debug output from contacts sync on sailfish now
- apkd-bridge can only read contacts db when run with invoker, but then we don't get debug output
- so instead run it as root to read new contacts db, and create contacts with jolla-contacts run as root
- okay now we know that successful initial sync looks like this
[D] unknown:0 - Alien contacts service is available, performing initial sync
[D] unknown:0 - Notifying Alien contacts service of all current contacts: 1
[D] unknown:0 - Successfully notified Alien contacts service of contact change.
[W] unknown:0 - Successfully notified Alien contacts service of current contacts.
- turns out there's also a race involved
- apkd-bridge gets the contacts via ManagerEngine::contacts() before we got our invidiuals-changed from folks
- this means it doesn't sync any contacts initially, but doesn't explain why it also won't pick up changes to contacts
- oh woooow
- adding and modifying contact changes seems to go via dbus (all with variant (au))
- org.nemomobile.contacts.sqlite.contactsAdded
- org.nemomobile.contacts.sqlite.contactsChanged
- deleting can go via both QtCOntacts API signal or dbus signal
- org.nemomobile.contacts.sqlite.contactsRemoved
- it seems that sailfish creates two contacts for everyone, possibly one system one and one android one
- the IDs on their dbus output are QContactId.toString()
- the IDs passed on their dbus signals are the QContactId without prefix 73716c2d3 (QByteArrayLiteral("sql-"))
- so these dbus signals are emitted from the sqlite backend actually, no idea why that would be done in addition to the normal cpp-signals
- after another two days, got it to pick up dbus emissions too by setting the QCollectionId (QByteArrayLiteral("col-")) and QContactType on individual contacts now, yaayyy
desktop files for apps
- mostly appears to work
- jolla style of icons is a bit annoying
- handled by apkd-bridge
file sharing between host and container
- looks like some xdg-folders are synced into container as sdcard
- home directory is synced into android as sdcard via config MountHome
- it's just mounted by lxc, neat
other things
- after startup bluetooth crashes all the time
- seems to be an "upstream" bug, jolla solves this using alien-post-startup.sh by disabling bluetooth daemon (see comment in there)
- video decoding for some videos doesn't work (see video codecs section)
- the media control service can crash sometimes (playing around with switching between apps during playing spotify music)
- see media-control-service-while-starting-spotify crash file
- system webview is crashing
- it appears to try using ashmem and then fails because
07-13 16:57:45.257 8198 8198 E chromium: [ERROR:platform_shared_memory_region_android.cc(189)] Ashmem region has a wrong protection mask: it is not read-only but it should be
- it's a memfd instead of ashmem specific issue, there's a patch that fixes it in waydroid
https://chromium.googlesource.com/chromium/src/+/HEAD/third_party/ashmem/patches/0004-Fixup-ashmem_get_prot_region-for-memfd.patch
- can work around by replacing webview with the one from waydroid
- camera will only work when running on top libhybris and forwarding the HAL
what's needed to be done:
- lots of dbus shimming (sorted by importance)
- launching of system apps from within android (just a single dbus call invoking the thing)
- browser
- contacts
- more...
- send configure() wayland events so that clients start drawing immediately
incomplete list of deps and files:
apdk-bridge deps
- libnemonotifications-qt5.so.1 (get from phone)
- libpackagekitqt5.so.1 (arch pkg packagekit-qt5)
- libQt5Contacts.so.5 (no arch pkg, build it ourselves)
alienaudioservice
- libalienaudioservice (get from phone)
- libglibutil.so.1 (arch pkg libglibutil)
- libgbinder.so.1 (arch pkg libgbinder)
apkd-bridge-user
- libmlite5.so.0 (arch pkg mlite)
- libkeepalive.so.1 and libkeepalive-glib.so.1 (get from phone)
- libambermpris (get from phone)
- libapkd (get from phone)
- libqt5sensors (arch pkg qt5-sensors)
- libiphb.so.0 (get from phone)
- libdbusaccess.so.1 (get from phone)
- libconnman-qt5.so.1 (get from phone)
- apkd-plugin-geo-qtpositioning
- installs /usr/lib64/apkd-bridge-user/libgeo-qtpositioning.so
- libQt5Positioning.so (arch pkg qt5-location)
config files
/etc/aas-seccomp-profile
/etc/apkd/app-blacklist (here we removed settings app)
/etc/apkd/notif-blacklist
/etc/gbinder.conf
/etc/gbinder.d/alien.conf
/etc/appsupport.conf.d/*
/usr/lib/systemd/system/aliendalvik.service
aliendalvik system img + vendor img + build.prop:
/opt/alien/vendor/*
/opt/alien/system.img
/opt/alien/build.prop
useful stuff:
all tools are using Qt debugging tools, debug using QT_LOGGING_RULES="*.debug=true"
shell inside container: lxc-attach --name=aliendalvik --lxcpath=/tmp/appsupport -- /system/bin/sh
trace files that get opened: strace -f -t -e trace=file binary
debugging wayland because debug.sf.wayland causes crash: put WAYLAND_DEBUG into /etc/environment of host to use mutter debugging
starting app inside android: am start com.android.settings
installing app inside android: pm install -t -f /data/local/tmp/app.apk (needs right permissions)
starting things automatically
- it's kinda bound to be a mess :(
- alien it depends on stuff running in the user session, and can only start when the user session is up
- alien itself needs to be run by root though
- and that's not enough, most things in the user session need to be started at a specific pointer after container is up
- so what do we do?
- really nice would be starting and stopping the whole thing from a user service
- could talk to a root helper via dbus which then does configuration and starts/stops the container
- would have to fiddle with user services as root again though
- for data isolation between users
- let's have the data dirs inside user dirs so they can be encrypted
- maybe make it an img file that can be owned fully by the user and is mounted into lxc

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,80 @@
================================================================
SAILFISH OS
Changelog from 4.3.0.12 to 4.3.0.15
2022-02-07
================================================================
Packages modified
polkit
Updated : 0.105+git5-1.5.3.jolla -- 0.105+git8-1.6.1.jolla
- [polkit] Fix for CVE-2021-4034 (PwnKit).
- [polkit] Drop unneeded Debian patches.
- [packaging] Separate Debian patches from the rest
- [packaging] Use pkgconfig symbols for -devel requires
- [polkit] Update Debian patches, drop patches already included.
ruby
Updated : 2.7.1+git1 -- 2.7.1+git2
- [ruby] Fix build with newer bison.
sdk-setup
Updated : 1.4.11-1.5.1.jolla -- 1.4.42-1.6.1.jolla
- [mb2] Refresh git index before creating a stash.
- [mb2] Sync as needed when closing maintenance shell.
- [oomadvice] Do not check journal where it is not available.
- [sdk-manage] Allow to explicitly operate on snapshots.
- [sdk-manage] Fix reseting snapshot forcefully.
- [mb2] Do not fail to create git-stash.
- [sdk-chroot] Add support for usernames with a dot.
- [mb2] Deal with git worktree without commits.
- [mb2] Allow to diff build environment changes.
- [sdk-assistant] Allow to clone build tools.
- [mb2] Cache packages installed as build deps under snapshots.
- [sdk-manage] Allow to prune package caches
- [sdk-manage] Fix checking for package removal in original target.
- [sdk-manage] Fix checking for RPM DB changes in original target.
- [mb2] Only reset snapshot if pulling build requires.
- [sdk-manage] Do not clean package cache when updating.
- [sdk-manage] Fix reseting snapshots after SSU changes
- [mb2] Fix buildroot timestamp check under VBox.
- [sdk-setup] Do not rely on ConnMan for proxy configuration.
- [sdk-setup] Do not use systemd under Docker.
- [mb2] Print progress during zypper based deployment.
- [sdk-chroot] Export SAILFISH_SDK.
- [sdk-chroot] Rename mer-sdk-chroot to sdk-chroot.
- [mb2] Fix false error on talking to SSH agent.
- [sdk-init] Support ApplicationName.
- [mb2] Allow deployment with password-protected SSH keys.
- [mb2] Allow running builds concurently.
- [mb2] Do not pollute random CWDs with state files.
- [mb2] Do not purge default output dir.
- [mb2] Fix applying patches with CRLF on Unix.
- [mb2] Fix explicit pull with --no-pull-build-requires
- [mb2] Fix use with .spec with local includes.
- [mb2] Prune older RPMs by default.
- [sdk-assistant] Do not leak true command name in messages.
- [sdk-vm] Do not automatically refresh RPM repos.
- [sdk-make-qmltypes] Allow in-place use without deployment.
- [sdk-manage] Do not fail to sync targets with broken symlinks.
- [mb2] Do not switch to snapshot for 'run' command
- [sdk-make-qmltypes] Automatically determine source revision.
- [sdk-make-qmltypes] Continue batch after job failure
- [sdk-make-qmltypes] Use per-user media path.
- [mb2] Exit if applying patch fails.
- [sdk-manage] Use rpmdb directly.
- [sdk-setup] Use correct Short Name for the license.
- [sdk-setup] Use correct Short Names for the license.
- [sdk-assistant] Be more clear about (not) proceeding with target update
- [sdk-assistant] Do not always suppress zypper interactivity.
- [sdk-assistant] Supplying a password is a confirmation.
- [sdk-manage] Do not leak zypper processes when interrupted.
- [sdk-manage] Handle more info-level zypper exit codes
- [sdk-assistant] Make package-search alias of package-list.
- [sdk-assistant] Rename package-list to package-search.
- [mb2] Allow more control over sb2 invocation.
- [packaging] BuildRequire systemd via pkgconfig.
- [sdk-manage] Don't add trailing slash to tooling path.
- [mb2] Fix error handling in build and package commands.
ssu
Updated : 1.0.14-1.5.1.jolla -- 1.0.14.1-1.6.1.jolla
- [ssu] Make sure the ssu cache is up-to-date.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,202 @@
============================================================================
SAILFISH OS
Changelog from 4.4.0.58 to 4.4.0.64
2022-05-11
============================================================================
# PACKAGES MODIFIED
### apkd-l10n
- Updated : 1.145.2-1.6.1.jolla -- 1.145.3-1.7.1.jolla
- [l10n] Commit from Jolla localisation: 38 of 38 strings translated (0 need review).
### commhistory-daemon-l10n
- Updated : 1.90.2-1.6.1.jolla -- 1.90.3-1.7.1.jolla
- [l10n] Commit from Jolla localisation: 43 of 43 strings translated (0 need review).
### droid-config-xqbt52
- Updated : 1.8.2.5-1.10.1.jolla -- 1.8.2.10-1.13.1.jolla
- [dconf] Add key to show reboot dialog when inserting sim cards.
- [patterns] Add VoLTE enablers to adaptation pattern.
- [configs] Set default data profile id.
- [configs] Add workaround for camera service crash.
- [configs] Add possibility to define specific VOIP sink.
- [sparse] Add a service for memory reclaim.
- [sparse] Disable update_verifier for ports starting from Android 10.
- [sparse] Move sysctl files to /usr/lib.
### droid-hal-pdx213
- Updated : 1.8.4-1.6.1.jolla -- 1.9.0-1.7.4.jolla
- [kernel] Fix display brightness control.
- [dhd] Immediately fail Android builds on OBS if a command fails.
- [helpers] Build pulseaudio-modules-droid-jb2q for Android versions up to 10.
- [kernel] Fix defconfig symbol wrongfully changed.
- [kernel] Fix port lowmemorykiller driver from 4.14.
- [helpers] Refactor utils to use mb2 --package-timeline. Contributes to
- [kernel] Port lowmemorykiller driver from 4.14 and enable android lmk.
- [kernel] Replace or remove invalid config symbols in hybris defconfig.
- [localbuild] Make all build script changes persistent.
- [localbuild] Pass local repo to zypper ahead of `ssu ar` removal.
- [localbuild] Remove leftovers manually for now.
- [localbuild] Switch local repo to flat dir structure.
- [localbuild] Use mb2 --output-dir instead to deploy RPMs.
- [localbuild] Use sdk-assistant maintain instead of sb2.
### droid-src-sony-lena
- Updated : 1.8.4-1.5.3.jolla -- 1.9.1-1.7.1.jolla
- [hybris] mixer_paths: Use handset mic for speaker mode workaround.
- [camera] QCamera2: mm-interface: Change media entity enumeration logic for k4.19.
- [droid-src] frameworks: av: Fix browser crash after playing videos.
- [hybris] device: sony: common: Proper SIM detection fix is now upstream.
- [sony-common] Revert "init: qcrild.rc : Add vendor prefix to ril-daemon".
### droid-system-pdx213
- Updated : 1.9.1-1.7.1.jolla -- 1.9.6-1.10.1.jolla
- [system] Enable loudspeaker echo cancellation.
- [hybris] mixer_paths: Use handset mic for speaker mode workaround.
- [camera] QCamera2: mm-interface: Change media entity enumeration logic for k4.19.
- [droid-src] frameworks: av: Fix browser crash after playing videos.
- [hybris] device: sony: common: Proper SIM detection fix is now upstream.
- [sony-common] Revert "init: qcrild.rc : Add vendor prefix to ril-daemon".
- [hybris] device: sony: lena: Disable sensors of tele and uwide lenses for now.
- [hybris] init: Enable low memory killer.
### droid-system-pdx213-xqbt52
- Updated : 1.9.1-1.7.1.jolla -- 1.9.6-1.10.1.jolla
- [system] Enable loudspeaker echo cancellation.
- [hybris] mixer_paths: Use handset mic for speaker mode workaround.
- [camera] QCamera2: mm-interface: Change media entity enumeration logic for k4.19.
- [droid-src] frameworks: av: Fix browser crash after playing videos.
- [hybris] device: sony: common: Proper SIM detection fix is now upstream.
- [sony-common] Revert "init: qcrild.rc : Add vendor prefix to ril-daemon".
- [hybris] device: sony: lena: Disable sensors of tele and uwide lenses for now.
- [hybris] init: Enable low memory killer.
### jolla-alarm-ui-l10n
- Updated : 1.98.2-1.7.1.jolla -- 1.98.3-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 31 of 33 strings translated (2 need review).
### jolla-calendar-l10n
- Updated : 1.249.2-1.8.1.jolla -- 1.249.3-1.9.1.jolla
- [l10n] Commit from Jolla localisation: 139 of 139 strings translated (0 need review).
### jolla-camera
- Updated : 1.2.16.2-1.8.1.jolla -- 1.2.16.3-1.9.1.jolla
- [jolla-camera] Restart camera upon error (xperia 10 III).
### jolla-camera-l10n
- Updated : 1.218.2-1.8.1.jolla -- 1.218.3-1.9.1.jolla
- [l10n] Commit from Jolla localisation: 73 of 73 strings translated (0 need review).
### jolla-clock-l10n
- Updated : 1.162.2-1.6.1.jolla -- 1.162.3-1.7.1.jolla
- [l10n] Commit from Jolla localisation: 47 of 48 strings translated (0 need review).
### jolla-contacts-l10n
- Updated : 1.187.2-1.7.1.jolla -- 1.187.3-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 60 of 60 strings translated (0 need review).
### jolla-devicelock-l10n
- Updated : 1.48.2-1.5.1.jolla -- 1.48.3-1.6.1.jolla
- [l10n] Commit from Jolla localisation: 7 of 7 strings translated (0 need review).
### jolla-email-l10n
- Updated : 1.293.2-1.7.1.jolla -- 1.293.5-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 233 of 233 strings translated (0 need review).
### jolla-gallery-facebook-l10n
- Updated : 1.74.3-1.5.1.jolla -- 1.74.4-1.6.1.jolla
- [l10n] Commit from Jolla localisation: 14 of 14 strings translated (0 need review).
### jolla-gallery-l10n
- Updated : 1.172.2-1.8.1.jolla -- 1.172.3-1.9.1.jolla
- [l10n] Commit from Jolla localisation: 17 of 17 strings translated (0 need review).
### jolla-messages-l10n
- Updated : 1.199.2-1.8.1.jolla -- 1.199.3-1.9.1.jolla
- [l10n] Commit from Jolla localisation: 88 of 88 strings translated (0 need review).
### jolla-settings-l10n
- Updated : 1.145.2-1.7.1.jolla -- 1.145.3-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 22 of 22 strings translated (0 need review).
### jolla-settings-sailfishos-l10n
- Updated : 1.139.2-1.8.1.jolla -- 1.139.3-1.9.1.jolla
- [l10n] Commit from Jolla localisation: 53 of 53 strings translated (0 need review).
### jolla-settings-system-l10n
- Updated : 1.556.5-1.12.1.jolla -- 1.556.6-1.13.1.jolla
- [l10n] Commit from Jolla localisation: 631 of 631 strings translated (0 need review).
### libgbinder-radio
- Updated : 1.4.8-1.4.1.jolla -- 1.4.10-1.5.1.jolla
- [gbinder-radio] Tweaked completion callback criteria.
- [gbinder-radio] Added IMS types.
### libglibutil
- Updated : 1.0.61-1.12.1.jolla -- 1.0.62-1.13.1.jolla
- [glibutil] Added gutil_strlen0()
- [glibutil] Added gutil_strv_find_last() and gutil_strv_remove_dups()
- [glibutil] Fixed a few weird unit test issues
- [glibutil]
- [license] Freshened up copyright
### lipstick-jolla-home-qt5-l10n
- Updated : 1.428.2-1.8.1.jolla -- 1.428.3-1.9.1.jolla
- [l10n] Commit from Jolla localisation: 262 of 262 strings translated (0 need review).
### mlsdb-data
- Updated : 0.1.5-1.9.1.jolla -- 0.1.6-1.10.1.jolla
- [mlsdb] Update Mozilla Location DB offline data to 2022-03-22.
### ofono
- Updated : 1.28+git3.1-1.12.1.jolla -- 1.28+git3.2-1.13.1.jolla
- [ims] D-Bus access control for org.ofono.IpMultimediaSystem.
- [ims] Disable IMS registration by default
- [ims] Extend org.ofono.IpMultimediaSystem D-Bus API.
- [ims] Tweak the treatment of the default Registration value
- [watch] Added reg_tech watch.
### ofono-binder-plugin
- Updated : 1.0.2-1.1.1.jolla -- 1.1.1-1.2.1.jolla
- Binaries added : libofonobinderpluginext - 1.1.1-1.2.1.jolla, libofonobinderpluginext-devel - 1.1.1-1.2.1.jolla
- [ofono-binder] Allow lte value for MaxNonDataMode.
- [ofono-binder] Fix startup with IRadioConfig 1.2 missing.
- [ofono-binder] Make data profile ids configurable.
- [build] Make sure strip is defined
- [ext] Debian packaging for libofonobinderpluginext.
- [ext] Don't invoke virtual method from a slot finalizer
- [ext] Removed binder_ext_slot_plugin_name
- [ofono-binder] Added IMS state registration tracker object.
- [ofono-binder] Documented extPlugin config option
- [ofono-binder] Extension for voice calls.
- [ofono-binder] Fixed conversion of vec<string> to char**
- [ofono-binder] Housekeeping
- [ofono-binder] IMS control extension.
- [ofono-binder] Prevent infinite recursion
- [ofono-binder] Refactored SMS extension interface.
- [ofono-binder] Send SMS over IMS when we can.
- [ofono-binder] Support for plugin extensions.
- [ofono-binder] Tweaked SMS extension interface.
- [unit] More unit tests
- [ofono-binder] Added ofono_ims_driver.
### qmf-eas-plugin-l10n
- Updated : 1.110.2-1.7.1.jolla -- 1.110.3-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 106 of 106 strings translated (0 need review).
### qt5
- Updated : 5.6.3+git46.1-1.16.2.jolla -- 5.6.3+git46.2-1.17.1.jolla
- [qtbase] Protect QNetworkAccessManager on duplicated state changes.
### sailfish-browser-l10n
- Updated : 1.262.8-1.15.1.jolla -- 1.262.9-1.16.1.jolla
- [l10n] Commit from Jolla localisation: 162 of 162 strings translated (0 need review).
### sailfish-components-contacts-qt5-l10n
- Updated : 1.198.2-1.7.1.jolla -- 1.198.3-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 158 of 158 strings translated (0 need review).
### sailfish-components-filemanager-l10n
- Updated : 1.99.4-1.7.1.jolla -- 1.99.5-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 65 of 65 strings translated (0 need review).
### sailfish-components-webview-qt5-l10n
- Updated : 1.83.4-1.11.1.jolla -- 1.83.5-1.12.1.jolla
- [l10n] Commit from Jolla localisation: 123 of 123 strings translated (0 need review).
### sailfish-office-l10n
- Updated : 1.156.2-1.7.1.jolla -- 1.156.3-1.8.1.jolla
- [l10n] Commit from Jolla localisation: 86 of 86 strings translated (0 need review).
### sailfish-utilities
- Updated : 0.1.14-1.5.11.jolla -- 0.1.16-1.6.1.jolla
- [sailfish-utilities] Add a Restart Fingerprint button.
- [sailfish-utilities] Updated project file for easier development.
- [sailfish-utilities] Include license file as %license.
### sailfishsilica-qt5-l10n
- Updated : 1.156.3-1.6.1.jolla -- 1.156.6-1.7.1.jolla
- [l10n] Commit from Jolla localisation: 49 of 107 strings translated (0 need review).
### sailjail-permissions
- Updated : 1.0.99-1.30.2.jolla -- 1.1.0-1.31.1.jolla
- [permissions] Allow Location to access sensors to make compass work.
### simkit-l10n
- Updated : 1.59.3-1.5.1.jolla -- 1.59.4-1.6.1.jolla
- [l10n] Commit from Jolla localisation: 14 of 14 strings translated (0 need review).
### voicecall-ui-jolla
- Updated : 1.14.38-1.5.1.jolla -- 1.14.38.1-1.6.1.jolla
- [voicecall-ui] Combine desktop files.
### voicecall-ui-jolla-l10n
- Updated : 1.301.2-1.8.1.jolla -- 1.301.3-1.9.1.jolla
- [l10n] Commit from Jolla localisation: 250 of 250 strings translated (0 need review).
### xulrunner-qt5
- Updated : 78.15.1+git24.1-1.30.1.jolla -- 78.15.1+git24.2-1.31.1.jolla
- [sailfishos][embedlite] Drop radio and checkbox max size restriction.
-- the end --

View File

@ -0,0 +1,638 @@
============================================================================
SAILFISH OS
Changelog from 4.4.0.64 to 4.4.0.68
2022-07-13
============================================================================
# PACKAGES MODIFIED
### acl
- Updated : 2.2.53-1.6.16.jolla -- 2.2.53-1.7.6.jolla
- [packaging] Fix submodule URL.
### acpid
- Updated : 2.0.14-1.3.1.jolla -- 2.0.14+git3-1.1.1.jolla
- [packaging] Fix systemd unit install path.
- [packaging] Drop YAML packaging.
- [packaging] Use submodule for packaging.
### aliendalvik-configs
- Updated : 10.0.59-1.4.1.jolla -- 10.0.59.1-1.5.1.jolla
- [appsupport] increase the size of the /dev tmpfs to 2M.
### aliendalvik-system
- Updated : 10.0.0.62.1.1-1.8.1.jolla -- 10.0.0.62.1.4-1.9.1.jolla
- [appsupport] avoid an issue with the selinux mount.
- [appsupport] disallow access to /sys/fs/selinux.
- [appsupport] keep metaState from input as EventHub::mapKey output. Fixes
- [alien] Fix handling of networks.
### alsa-utils
- Updated : 1.2.3+git3-1.6.1.jolla -- 1.2.3+git4-1.7.1.jolla
- [git] Move submodule repos to github.
### attr
- Updated : 2.4.47+git1-1.6.1.jolla -- 2.4.47+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### audit
- Updated : 2.8.4+git7-1.8.12.jolla -- 2.8.4+git8-1.9.2.jolla
- [git] Move submodule repos to github.
### augeas
- Updated : 1.12.0+git2-1.6.1.jolla -- 1.12.0+git4-1.7.1.jolla
- [packaging] Fix submodule URL.
- [augeas] Avoid installing tests with -libs.
### autoconf-archive
- Updated : 2019.01.06+git2-1.5.1.jolla -- 2019.01.06+git3-1.6.1.jolla
- [git] Move more submodule repos to github.
- [git] Move submodule repos to github.
### binutils
- Updated : 2.32+git3-1.7.5.jolla -- 2.32+git3.1-1.8.2.jolla
- [packaging] Fix submodule URL.
### btrfs-progs
- Updated : 3.16+git3-1.6.1.jolla -- 3.16+git4-1.7.1.jolla
- [packaging] Fix submodule URL.
### cmake
- Updated : 3.19.3+git4-1.10.2.jolla -- 3.19.3+git5-1.11.1.jolla
- [git] Move submodule repos to github.
### commhistory-daemon
- Updated : 0.8.43-1.11.1.jolla -- 0.8.44-1.12.1.jolla
- [commhistory] Restore notification categories.
### connman
- Updated : 1.32+git180.2-1.16.1.jolla -- 1.32+git187-1.17.1.jolla
- [blacklist monitor] Plugin to prevent IPv6 default routes on blacklisted ifs.
- [device] Add wrapper to check if interface is blacklisted for plugins.
- [inet] Do not add RTF_HOST for IPv6 default route.
- [inet] Support setting metric value with IPv6 network route.
- [ipconfig] Add wrapper to conf type getter for plugins.
- [rtnl] Extend notify and better support IPv6 routes set via RA.
- [service] Add wrappers for network and index lookup, getter for ipconfig.
- [unit] Add blacklist monitor unit tests.
- [connman] Apply upstream rtnl patches, revert debug disable commit.
- [connman] Follow upstream in setting getter naming.
- [main] Add path to localtime to config options.
- [main] Add RegdomFollowsTimezone option for regdom changes.
- [ofono] Do not change regdom when it follows timezone.
- [timezone] Change regdom along timezone, use localtime config.
- [connman] Add configurable run dir, drop legacy /var/run use. Fixes
- [agent] Add support to check for active pending requests.
- [service] Check if hidden service has a pending request.
- [connman] Fix CVE-2022-23096 CVE-2022-23097 CVE-2022-23098. Fixes
- [service] Implement counting of available services.
- [wifi] Implement a heurestic for determening a weak WiFi.
### connman-network-monitor
- Updated : 0.0.0+git1-1.5.1.jolla -- 0.0.0+git2-1.6.1.jolla
- [packaging] Fix submodule URL.
### crda
- Updated : 4.14+git4-1.6.12.jolla -- 4.14+git5-1.7.2.jolla
- [packaging] Fix submodule URL.
### createrepo_c
- Updated : 0.12.0-1.2.1.jolla -- 0.12.0+git1-1.3.1.jolla
- [packaging] Fix submodule URL.
### cross-aarch64-binutils
- Updated : 2.32+git3-1.7.2.jolla -- 2.32+git3.1-1.8.1.jolla
- [packaging] Fix submodule URL.
### cross-aarch64-gdb
- Updated : 8.2.1+git8-1.5.2.jolla -- 8.2.1+git9-1.6.1.jolla
- [packaging] Fix submodule URL.
### cross-armv7hl-binutils
- Updated : 2.32+git3-1.7.2.jolla -- 2.32+git3.1-1.8.1.jolla
- [packaging] Fix submodule URL.
### cross-armv7hl-gdb
- Updated : 8.2.1+git8-1.5.2.jolla -- 8.2.1+git9-1.6.1.jolla
- [packaging] Fix submodule URL.
### cross-i486-binutils
- Updated : 2.32+git3-1.7.2.jolla -- 2.32+git3.1-1.8.1.jolla
- [packaging] Fix submodule URL.
### cross-i486-gdb
- Updated : 8.2.1+git8-1.7.2.jolla -- 8.2.1+git9-1.8.1.jolla
- [packaging] Fix submodule URL.
### cups
- Updated : 2.3.1+git2-1.7.2.jolla -- 2.3.1+git3-1.8.1.jolla
- [git] Move submodule repos to github.
### cython
- Updated : 0.29.14+git2-1.6.1.jolla -- 0.29.14+git3-1.7.1.jolla
- [packaging] Fix submodule URL.
### dconf
- Updated : 0.40.0+git3-1.8.1.jolla -- 0.40.0+git4-1.9.1.jolla
- [git] Move submodule repos to github.
### desktop-file-utils
- Updated : 0.26+git3-1.7.1.jolla -- 0.26+git4-1.8.1.jolla
- [packaging] Fix submodule URL.
### droid-config-xqau51
- Updated : 0.1.24.1-1.6.1.jolla -- 0.1.24.3-1.7.1.jolla
- Binaries removed : droid-config-xqau51-bluez4
- [patterns] Add VoLTE enablers to adaptation pattern. Fixes
- [configs] Package ofono-binder-plugin.
- [configs] Remove BlueZ4 bluetoothd configs.
- [configs] Remove BlueZ4 packaging. Fixes
- [configs] Remove BlueZ4 PulseAudio related configuration.
- [lib] Install oneshot scripts under /usr/lib.
- [patterns] Add configuration to modify installed sailfish patterns.
- [rpm] Obsolete ofono-configs-binder, we provide our own configs. Fixes
### droid-config-xqau52
- Updated : 0.1.24.1-1.6.1.jolla -- 0.1.24.3-1.7.1.jolla
- Binaries removed : droid-config-xqau52-bluez4
- [patterns] Add VoLTE enablers to adaptation pattern. Fixes
- [configs] Package ofono-binder-plugin.
- [configs] Remove BlueZ4 bluetoothd configs.
- [configs] Remove BlueZ4 packaging. Fixes
- [configs] Remove BlueZ4 PulseAudio related configuration.
- [lib] Install oneshot scripts under /usr/lib.
- [patterns] Add configuration to modify installed sailfish patterns.
- [rpm] Obsolete ofono-configs-binder, we provide our own configs. Fixes
### droid-src-sony-seine
- Updated : 0.1.7-1.4.4.jolla -- 1.12.2-1.5.2.jolla
- [dhs] Immediately fail Android builds on OBS if a command fails. Fixes
- [droid-src] Add modem configs for Finnish providers Elisa and DNA.
- [droid-src] Fix path of do not log battery status to kernel log patch.
- [droid-src] hardware/adreno: Add back vendor->odm symlink for vulkan.qcom.so.
- [hybris] device: sony: common: Do not log battery status to kernel log.
- [droid-src] hybris: init: improve low memory killer thresholds. Fixes
- [manifest] temporarily introduce manifest versioning.
### droid-system-pdx201
- Updated : 0.1.7-1.5.1.jolla -- 0.1.9-1.6.1.jolla
- [dsd] helpers: Add support for product and system_ext.
- [dsd] helpers: Replace all build user instances.
- [dsd] helpers: Return true for setcap post commands.
- [sparse] Add back vendor->odm symlink for vulkan.qcom.so.
- [sparse] Add modem configs for Finnish providers Elisa and DNA.
- [sparse] Do not log battery status to kernel log.
- [hybris] init: improve low memory killer thresholds. Fixes
### droid-system-pdx201-xqau51
- Updated : 0.1.7-1.5.1.jolla -- 0.1.9-1.6.1.jolla
- [dsd] helpers: Add support for product and system_ext.
- [dsd] helpers: Replace all build user instances.
- [dsd] helpers: Return true for setcap post commands.
- [sparse] Add back vendor->odm symlink for vulkan.qcom.so.
- [sparse] Add modem configs for Finnish providers Elisa and DNA.
- [sparse] Do not log battery status to kernel log.
- [hybris] init: improve low memory killer thresholds. Fixes
### droid-system-pdx201-xqau52
- Updated : 0.1.7-1.5.1.jolla -- 0.1.9-1.6.1.jolla
- [dsd] helpers: Add support for product and system_ext.
- [dsd] helpers: Replace all build user instances.
- [dsd] helpers: Return true for setcap post commands.
- [sparse] Add back vendor->odm symlink for vulkan.qcom.so.
- [sparse] Add modem configs for Finnish providers Elisa and DNA.
- [sparse] Do not log battery status to kernel log.
- [hybris] init: improve low memory killer thresholds. Fixes
### dtc
- Updated : 1.4.7-1.2.1.jolla -- 1.4.7+git1-1.3.1.jolla
- [packaging] Fix submodule URL.
### elfutils
- Updated : 0.177+git1-1.6.1.jolla -- 0.177+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### embedlite-components-search-engines
- Updated : 0.0.3-1.5.1.jolla -- 0.0.5-1.6.1.jolla
- [search-engines] Update google search engine xml. Fixes
### ffmpeg
- Updated : 4.4.1+git1-1.6.1.jolla -- 4.4.1+git2-1.7.1.jolla
- [ffmpeg] Enable ALAC codec. Fixes
### flex
- Updated : 2.6.4+git1-1.6.16.jolla -- 2.6.4+git2-1.7.6.jolla
- [git] Move submodule repos to github.
### fontconfig
- Updated : 2.13.1+git3-1.5.1.jolla -- 2.13.1+git3.1-1.6.1.jolla
- [packaging] Fix submodule URL.
### fribidi
- Updated : 1.0.10+git1-1.6.1.jolla -- 1.0.10+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### gdb
- Updated : 8.2.1+git8-1.7.4.jolla -- 8.2.1+git9-1.8.2.jolla
- [packaging] Fix submodule URL.
### git
- Updated : 2.26.2+git1-1.2.2.jolla -- 2.26.2+git2-1.3.1.jolla
- [packaging] Fix submodule URL.
### gmp-droid
- Updated : 0.5-1.3.1.jolla -- 0.5.1-1.4.1.jolla
- [packaging] Fix submodule URL.
### gnu-findutils
- Updated : 4.6.0+git2-1.5.1.jolla -- 4.6.0+git3-1.6.1.jolla
- [packaging] Fix submodule URL.
### gnupg2
- Updated : 2.0.4+git3-1.6.13.jolla -- 2.0.4+git4-1.7.2.jolla
- [packaging] Fix submodule URL.
### gnutls
- Updated : 2.12.24+git1-1.6.12.jolla -- 2.12.24+git2-1.7.2.jolla
- [git] Move submodule repos to github.
### gpgme
- Updated : 1.2.0+git6-1.6.1.jolla -- 1.2.0+git7-1.7.1.jolla
- [packaging] Fix submodule URL.
### grubby
- Updated : 7.0.8-1.5.1.jolla -- 7.0.8+git2-1.1.1.jolla
- [packaging] Drop YAML packaging.
- [packaging] Use submodule for packaging.
### gtest
- Updated : 1.11.0+git2-1.6.1.jolla -- 1.11.0+git3-1.7.1.jolla
- [packaging] Fix submodule URL.
### gupnp-av
- Updated : 0.12.10-1.5.1.jolla -- 0.12.10-1.6.1.jolla
- [git] Move submodule repos to github.
### gupnp-dlna
- Updated : 0.10.5-1.5.1.jolla -- 0.10.5-1.6.1.jolla
- [git] Move submodule repos to github.
### htop
- Updated : 3.0.2+git1-1.2.1.jolla -- 3.0.2+git2-1.3.1.jolla
- [git] Move submodule repos to github.
### hunspell
- Updated : 1.6.2+git1-1.6.1.jolla -- 1.6.2+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### iproute
- Updated : 3.7.0+git6-1.6.1.jolla -- 3.7.0+git6.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### iso-codes
- Updated : 3.79+git1-1.6.1.jolla -- 3.79+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### iw
- Updated : 5.0.1+git1-1.6.1.jolla -- 5.0.1+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### jolla-common-configurations
- Updated : 0.11.3-1.5.1.jolla -- 0.11.3.1-1.6.1.jolla
- [connman] Use timed localtime, set regdom to follow timezone. Fixes
### jolla-keyboard
- Updated : 0.8.28.2-1.6.1.jolla -- 0.8.28.3-1.7.1.jolla
- [keyboard] Decrease spacebar row punctionation keys.
### jolla-settings-accounts
- Updated : 0.4.57-1.5.1.jolla -- 0.4.57.1-1.6.1.jolla
- [settings-accounts] Add password reset link to the forget password. Fixes
- [settings-accounts] Show 'Update sign-in credentials' always for Google account. Fixes
- [settings-accounts] Switch ToS views to use Gecko WebView.
- [settings-accounts] Use externel browser for Google account. Fixes
### jolla-settings-networking
- Updated : 1.0.1-1.4.1.jolla -- 1.0.1.1-1.5.1.jolla
- [settings-network] Add VoLTE registration switch for the 'Mobile network'. Fixes
### jolla-settings-system
- Updated : 1.1.51.1-1.8.4.jolla -- 1.1.51.2-1.9.1.jolla
- [jolla-settings-system] Add rpm linking to the libsystemsettingsplugin.so. Fixes
- [settings-system] Add packageName and whatProvides properties.
- [system-settings] Add RPM info class.
### kernel-cmdline
- Updated : 1.1.0-1.2.42.jolla -- 1.1.1-1.3.8.jolla
- [packaging] Fix submodule URL.
### kmod
- Updated : 27-1.6.1.jolla -- 27+git1-1.7.1.jolla
- [packaging] Fix submodule URL.
### libaccounts-qt5
- Updated : 1.16+git1-1.6.1.jolla -- 1.16+git3-1.7.1.jolla
- [packaging] Fix submodule URL.
- [libaccounts-qt5] Add %license file.
### libatomic_ops
- Updated : 7.4.4+git1-1.6.1.jolla -- 7.4.4+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### libcanberra
- Updated : 0.30+git1-1.6.1.jolla -- 0.30+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### libcap
- Updated : 2.25+git1-1.6.1.jolla -- 2.25+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### libeigen3-devel
- Updated : 3.3.5+git1-1.6.1.jolla -- 3.3.5+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### libffi
- Updated : 3.2.1+git1-1.6.1.jolla -- 3.2.1+git1.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### libgpg-error
- Updated : 1.27+git3-1.7.1.jolla -- 1.27+git3.1-1.8.1.jolla
- [packaging] Fix submodule URL.
### libhybris
- Updated : 0.0.5.44-1.3.1.jolla -- 0.0.5.44.1-1.4.1.jolla
- [packaging] Fix submodule URLs.
### libical
- Updated : 3.0.9+git1-1.5.1.jolla -- 3.0.9+git2-1.6.1.jolla
- [packaging] Fix submodule URL.
### libksba
- Updated : 1.3.5+git2-1.6.1.jolla -- 1.3.5+git3-1.7.1.jolla
- [packaging] Fix submodule URL.
### libnl
- Updated : 3.4.0+git3-1.6.1.jolla -- 3.4.0+git3.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### libqofono-qt5
- Updated : 0.103-1.5.1.jolla -- 0.112-1.6.1.jolla
- [libqofono] Support for IMS Registration property.
- [tests] Drop context manipulation parts from connman tests.
- [tests] Expect failure on context tests on Sailfish.
- [tests] Fix sim manager tests.
- [connectionmanager] Add support for reset contexts dbus call
- [libqofono] Added QOfonoConnectionManager::resetContexts.
- [libqofono] Housekeeping.
- [libqofono] Run tests with sailfish-radio group.
- [libqofono] Drop Qt4 legacy.
- [libqofono] Fix phonesim setup in tests.
- [libqofono] Move tests to /opt/tests.
- [libqofono] Support for org.ofono.IpMultimediaSystem.
- [libqofono] Fix systemctl path in tests.
- [libqofono] Housekeeping.
- [libqofono] Provide both In and Out annotations for signals
- [libqofono-qt5] Have license file as %license.
### libsbc
- Updated : 1.3-1.6.1.jolla -- 1.3.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### libselinux
- Updated : 3.1+git2-1.5.12.jolla -- 3.1+git3-1.6.2.jolla
- [git] Move submodule repos to github.
### libsepol
- Updated : 3.1+git2-1.5.1.jolla -- 3.1+git3-1.6.1.jolla
- [git] Move submodule repos to github.
### libtheora
- Updated : 1.2.0alpha1+git2-1.6.1.jolla -- 1.2.0alpha1+git4-1.7.1.jolla
- [packaging] Fix submodule URL.
- [libtheora] Declare license file as %license.
### libusb1
- Updated : 1.0.20-1.6.1.jolla -- 1.0.20.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### libutempter
- Updated : 1.1.5+git2-1.6.17.jolla -- 1.1.5+git3-1.7.6.jolla
- [packaging] Fix submodule URL.
### libvncserver
- Updated : 0.9.10+git1-1.2.1.jolla -- 0.9.10+git2-1.3.1.jolla
- [packaging] Fix submodule URL.
### libwbxml2
- Updated : 0.11.6+git1-1.6.1.jolla -- 0.11.6+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### libwebp
- Updated : 1.2.0-1.8.2.jolla -- 1.2.0+git1-1.9.1.jolla
- [packaging] Fix submodule URL.
### libwspcodec
- Updated : 2.2.4-1.5.1.jolla -- 2.2.6-1.6.1.jolla
- [libwspcodec] Allow empty quoted subject.
- [libwspcodec] Include license as %license.
- [rpm] Require rpm 4.11 for %license.
### ltrace
- Updated : 0.8.0+git1-1.2.1.jolla -- 0.8.0+git2-1.3.1.jolla
- [git] Move submodule repos to github.
### lvm2
- Updated : 2.02.177+git5-1.7.1.jolla -- 2.02.177+git6-1.8.1.jolla
- [packaging] Fix submodule URL.
### maliit-plugins
- Updated : 0.99.0+git6-1.6.7.jolla -- 0.99.0+git7-1.7.1.jolla
- [packaging] Fix submodule URL.
### modem_auto_config
- Updated : 1.0.0-1.1.1.jolla -- 1.0.1-1.2.1.jolla
- [modem-auto-config] Fix loading of modem configuration files.
### nemo-qtmultimedia-plugins-gstvideotexturebackend
- Updated : 0.1.2-1.5.1.jolla -- 0.1.4-1.6.1.jolla
- [videotexturebackend] Fix null pointer derefenence from init. Fixes
- [nemo-qtmultimedia-plugins] Add license file.
### ninja
- Updated : 1.10.2+git3-1.5.1.jolla -- 1.10.2+git4-1.6.1.jolla
- [git] Move submodule repos to github.
### nss-pem
- Updated : 1.0.6+git1-1.5.12.jolla -- 1.0.6+git2-1.6.2.jolla
- [packaging] Fix submodule URL.
### ofono-binder-plugin
- Updated : 1.1.1-1.2.1.jolla -- 1.1.3-1.3.1.jolla
- [ofono-binder] Use hangupWaitingOrBackground for incoming calls.
- [ofono-binder] Hook up currentEmergencyNumberList indication.
- [unit] Added unit_ext_plugin
### ofono-ril-plugin
- Updated : 1.0.2-1.2.2.jolla -- 1.0.2.1-1.3.1.jolla
- [ofono-ril-plugin] Use HANGUP_WAITING_OR_BACKGROUND for incoming calls.
### ofono-vendor-qti-radio-plugin
- Updated : 1.0.0-1.1.1.jolla -- 1.0.1-1.2.1.jolla
- [qti-radio] Housekeeping
- [qti-radio] Provide ofono-ims-support.
- [rpm] Bump libglibutil dependency version
### oprofile
- Updated : 1.2.0+git1-1.2.41.jolla -- 1.2.0+git2-1.3.8.jolla
- [packaging] Fix submodule URL.
### orc
- Updated : 0.4.26+git1-1.6.1.jolla -- 0.4.26+git1.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### parted
- Updated : 3.0+mer5-1.2.1.jolla -- 3.0+mer6-1.3.1.jolla
- [packaging] Fix submodule URL.
### passwd
- Updated : 0.80+git1-1.6.1.jolla -- 0.80+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### pixman
- Updated : 0.40.0+git1-1.6.1.jolla -- 0.40.0+git3-1.7.1.jolla
- [packaging] Fix submodule URL.
- [pixman] Include license as %license.
### polkit
- Updated : 0.105+git8-1.8.6.jolla -- 0.105+git9-1.9.1.jolla
- [packaging] Fix submodule URL.
### powertop
- Updated : 2.10+git1-1.2.1.jolla -- 2.10+git2-1.3.1.jolla
- [packaging] Fix submodule URL.
### procps-ng
- Updated : 3.3.16+git1-1.5.1.jolla -- 3.3.16+git2-1.6.1.jolla
- [packaging] Fix submodule URL.
### pykickstart
- Updated : 3.25+git2-1.2.1.jolla -- 3.25+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python
- Updated : 2.7.17+git7-1.6.1.jolla -- 2.7.17+git8-1.7.1.jolla
- [git] Move submodule repos to github.
### python3-cairo
- Updated : 1.19.0+git1-1.6.1.jolla -- 1.19.0+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### python3-certifi
- Updated : 2020.04.05.1+git2-1.2.1.jolla -- 2020.04.05.1+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python3-chardet
- Updated : 3.0.4+git2-1.2.1.jolla -- 3.0.4+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python3-cheetah
- Updated : 3.2.4+git1-1.3.57.jolla -- 3.2.4+git2-1.4.13.jolla
- [packaging] Fix submodule URL.
### python3-distro
- Updated : 1.5.0+git2-1.2.1.jolla -- 1.5.0+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python3-markdown
- Updated : 3.2.1+git2-1.2.1.jolla -- 3.2.1+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python3-ordered-set
- Updated : 3.1+git2-1.2.1.jolla -- 3.1+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python3-pycurl
- Updated : 7.43.0.5+git2-1.2.2.jolla -- 7.43.0.5+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python3-pygments
- Updated : 2.6.1+git2-1.2.11.jolla -- 2.6.1+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### python3-requests
- Updated : 2.23.0+git3-1.2.43.jolla -- 2.23.0+git4-1.3.8.jolla
- [packaging] Fix submodule URL.
### python3-six
- Updated : 1.14.0+git2-1.5.1.jolla -- 1.14.0+git4-1.6.1.jolla
- [packaging] Fix submodule URL.
- [python3-six] Have license file as %license.
### python3-urlgrabber
- Updated : 4.1.0+git3-1.2.44.jolla -- 4.1.0+git4-1.3.9.jolla
- [packaging] Fix submodule URL.
### python3-urllib3
- Updated : 1.25.9+git2-1.2.1.jolla -- 1.25.9+git3-1.3.1.jolla
- [packaging] Fix submodule URL.
### qmf-qt5
- Updated : 4.0.4+git135-1.8.1.jolla -- 4.0.4+git136-1.9.1.jolla
- [packaging] Fix submodule URL.
### qt5-qtdeclarative
- Updated : 5.6.3+git21-1.8.1.jolla -- 5.6.3+git21.1-1.9.1.jolla
- [tests] Remove unused submodule.
### qt5-qtgraphicaleffects
- Updated : 5.6.2+git3-1.5.1.jolla -- 5.6.2+git4-1.6.1.jolla
- [packaging] Fix submodule URL.
### qt5-qtimageformats
- Updated : 5.6.3+git2-1.5.1.jolla -- 5.6.3+git4-1.6.1.jolla
- [packaging] Fix submodule URL.
- [qtimageformats] Add %license file to packages.
### qt5-qtwebkit
- Updated : 5.6.2+git14-1.6.1.jolla -- 5.6.2+git16-1.7.1.jolla
- [packaging] Fix submodule URL.
- [qtwebkit] Strip debug symbols from the shared libraries. Fixes
### qt5-qtxmlpatterns
- Updated : 5.6.3+git3-1.6.1.jolla -- 5.6.3+git4-1.7.1.jolla
- [packaging] Use submodule for packaging.
### qtmozembed-qt5
- Updated : 1.53.20-1.31.8.jolla -- 1.53.22-1.32.2.jolla
- [qtmozembed] Avoid sending orientation signal on scene changes. Fixes
- [tests] Split checkDefaultSearch of tst_searchengine to three.
- [tests] Wait engine to load in initTestCase.
### qtscenegraph-adaptation
- Updated : 0.7.6-1.3.1.jolla -- 0.7.7-1.4.1.jolla
- [customcontext] Fix copying QImages from hybris textures.
### quilt
- Updated : 0.64-1.6.1.jolla -- 0.64+git1-1.7.1.jolla
- [packaging] Fix submodule URL.
### quota
- Updated : 4.05+git1-1.5.1.jolla -- 4.05+git2-1.6.1.jolla
- [git] Move submodule repos to github.
### re2c
- Updated : 2.0.3+git2-1.5.1.jolla -- 2.0.3+git3-1.6.1.jolla
- [packaging] Fix submodule URL.
### recode
- Updated : 3.6-1.6.1.jolla -- 3.6-1.7.1.jolla
- [packaging] Drop YAML packaging.
- [packaging] Fix submodule URL.
### rfkill
- Updated : 0.5+git1-1.6.1.jolla -- 0.5+git2-1.7.1.jolla
- [packaging] Fix submodule URL.
### rpm
- Updated : 4.16.1.3+git8-1.10.1.jolla -- 4.16.1.3+git9-1.11.1.jolla
- [packaging] Fix submodule URL.
### rpm-python
- Updated : 4.16.1.3+git8-1.10.12.jolla -- 4.16.1.3+git9-1.11.2.jolla
- [packaging] Fix submodule URL.
### rsync
- Updated : 3.1.3+git1-1.5.1.jolla -- 3.1.3+git2-1.6.1.jolla
- [packaging] Fix submodule URL.
### sailfish-components-webview-qt5
- Updated : 1.5.9-1.19.1.jolla -- 1.5.9.2-1.20.1.jolla
- [webview] Guard programmatic preference change with marker file. Fixes
- [components-webview] Adjust keyboard margin based on position.
- [components-webview] Fix keyboard margin calculation.
- [components-webview] Respect component height. Fixes
- [webview-docs] Add Jolla copyright to docs footer.
- [webview-docs] Elaborate on using local content with CORS protection. Fixes
### sailfish-content-browser-default
- Updated : 0.1.4-1.2.1.jolla -- 0.1.6-1.3.1.jolla
- [git] Bump up submodule sha1. Fixes
- [git] Move submodule repos to github.
### scons
- Updated : 3.0.5+git2-1.6.13.jolla -- 3.0.5+git3-1.7.2.jolla
- [packaging] Fix submodule URL.
### screen
- Updated : 4.7.0+git2-1.7.12.jolla -- 4.7.0+git3-1.8.2.jolla
- [packaging] Fix submodule URL.
### sdk-setup
- Updated : 1.4.55-1.24.1.jolla -- 1.4.58-1.25.1.jolla
- [sdk-manage] Obey also brand when matching SSU releases
- [sdk-manage] Use tarball metadata to look up tooling.
- [sdk-setup] Automatically load available bash completion.
- [sdk-setup] Drop outdated bash completion.
- [sdk-chroot] Utilize profile.d for bash setup.
### shared-mime-info
- Updated : 1.12-1.6.1.jolla -- 1.12+git1-1.7.1.jolla
- [packaging] Fix submodule URL.
### signon-qt5
- Updated : 8.60.0+git3-1.8.18.jolla -- 8.60.0+git5-1.9.1.jolla
- [packaging] Fix submodule URL.
- [libsignon-qt5] Have license file as %license.
- [libsignon-qt5] Have license file for libsignon-qt5 too.
- [tests] Cleanup test definitions. Fixes
### sound-theme-freedesktop
- Updated : 0.8-1.6.1.jolla -- 0.8+git1-1.7.1.jolla
- [packaging] Fix submodule URL.
- [sound-theme-freedesktop] Package license file.
### spectacle
- Updated : 0.32-1.2.44.jolla -- 0.33-1.3.8.jolla
- [packaging] Drop YAML packaging.
### sqlcipher
- Updated : 3.4.1+git2-1.5.1.jolla -- 3.4.1+git2.1-1.6.1.jolla
- [packaging] Fix submodule URL.
### stress-ng
- Updated : 0.10.17-1.2.1.jolla -- 0.10.17+git1-1.3.1.jolla
- [packaging] Fix submodule URL.
### systemd
- Updated : 238+git13-1.13.1.jolla -- 238+git13.1-1.14.1.jolla
- [packaging] Fix submodule URL.
### systemd-bootchart
- Updated : 233+git2-1.7.1.jolla -- 233+git3-1.8.1.jolla
- [git] Move submodule repos to github.
### systemd-mini
- Updated : 238+git13-1.2.1.jolla -- 238+git13.1-1.3.1.jolla
- [packaging] Fix submodule URL.
### taglib
- Updated : 1.12+git1-1.5.1.jolla -- 1.12+git2-1.6.1.jolla
- [packaging] Fix submodule URL.
### tcpdump
- Updated : 4.9.2+git1-1.3.1.jolla -- 4.9.2+git2-1.4.1.jolla
- [packaging] Fix submodule URL.
### telepathy-qt5
- Updated : 0.9.8+git2-1.9.1.jolla -- 0.9.8+git2.1-1.10.1.jolla
- [packaging] Fix submodule URL.
### totem-pl-parser
- Updated : 3.26.1+git1-1.6.1.jolla -- 3.26.1+git1.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### usbutils
- Updated : 008-1.6.1.jolla -- 008.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### util-linux
- Updated : 2.33+git3-1.7.15.jolla -- 2.33+git4-1.8.6.jolla
- [packaging] Fix submodule URL.
### vim
- Updated : 8.2.0000-1.5.10.jolla -- 8.2.0000.1-1.6.2.jolla
- [packaging] Fix submodule URL.
### volume_key
- Updated : 0.3.9+git2-1.6.1.jolla -- 0.3.9+git3-1.7.1.jolla
- [packaging] Fix submodule URL.
### wireless-regdb
- Updated : 2020.04.29+git3-1.5.12.jolla -- 2020.04.29+git4-1.6.2.jolla
- [packaging] Fix submodule URL.
### wpa_supplicant
- Updated : 2.9+git4-1.7.1.jolla -- 2.9+git5-1.8.1.jolla
- [packaging] Fix submodule URL.
### xdg-dbus-proxy
- Updated : 0.1.2+git3-1.7.1.jolla -- 0.1.2+git4-1.8.1.jolla
- [packaging] Fix submodule URL.
### xdg-user-dirs
- Updated : 0.16+git2-1.6.1.jolla -- 0.16+git2.1-1.7.1.jolla
- [packaging] Fix submodule URL.
### xulrunner-qt5
- Updated : 78.15.1+git24.2-1.31.1.jolla -- 78.15.1+git24.3-1.32.1.jolla
- [sailfishos][build] Add support for aarch64 to elfhack.
- [sailfishos][build] Enable elf-hack. Fixes
- [sailfishos][embedlite] Add a content controller stack. Fixes
- [sailfishos][embedlite] Prefer profile directory for search engines. Fixes
### yasm
- Updated : 1.3.0+git2-1.5.3.jolla -- 1.3.0+git2.1-1.6.1.jolla
- [packaging] Fix submodule URL.
### zlib
- Updated : 1.2.11+git1-1.6.16.jolla -- 1.2.11+git2-1.7.6.jolla
- [packaging] Fix submodule URL.
### zxing-cpp
- Updated : 1.1.1+git1-1.6.1.jolla -- 1.1.1+git2-1.7.1.jolla
- [git] Move submodule repos to github.
### zypper
- Updated : 1.14.38+git2-1.6.1.jolla -- 1.14.38+git3-1.7.1.jolla
- [packaging] Fix submodule URL.
# PACKAGES ADDED
### ofono-modem-switcher-plugin
- Binaries added : ofono-modem-switcher-plugin - 1.0.2-1.1.1.jolla
- [modemswitcher] Write configuration to rild when it changes.
- [modemswitcher] Undo configuration on uninstallation.
- [modemswitcher] Changed package name
- [modemswitcher] Housekeeping
- [modemswitcher] Initial import.
# PACKAGES REMOVED
### enchant

View File

@ -0,0 +1,130 @@
=======================================
SAILFISH OS
Changelog from 4.4.0.68 to 4.4.0.72
2022-09-30
=======================================
# PACKAGES MODIFIED
### buteo-sync-plugins-sailfisheas
- Updated : 0.1.2-1.5.1.jolla -- 0.1.3-1.6.2.jolla
- [common] Derive sync service name from provider.
### jolla-settings-accounts
- Updated : 0.4.57.1-1.6.1.jolla -- 0.4.57.2-1.7.1.jolla
- [settings-accounts] Support 3-legged OAuth 1.0a flow with external browser.
### libjollasignonuiservice-qt5
- Updated : 0.4.14-1.3.1.jolla -- 0.4.17-1.4.1.jolla
- [libjollasignonservice] Get state query item from OAuth plugin.
- [signonuiservice] Support external browser with 3-legged OAuth.
- [signonuiservice] Switch OAuth to gecko WebView.
### libsailfishkeyprovider-data-jolla
- Updated : 0.0.18-1.2.1.jolla -- 0.1.0-1.3.2.jolla
- [keyprovider-data] Add sailfisheas data.
### mic
- Updated : 1.0.9-1.3.57.jolla -- 1.0.11-1.4.13.jolla
- [mic] Automatically create missing /var/lock.
- [mic] Run scripts verbosely when mic is verbose
- [mic] Run scripts with errexit when --erroronfail is used.
- [packaging] Require kmod.
### ofono-binder-plugin
- Updated : 1.1.3-1.3.1.jolla -- 1.1.5-1.4.2.jolla
- [debian] Bumped debhelper compat level to 7
- [ofono-binder] Fix call forwarding query.
- [debian] Updated changelog version
- [ofono-binder] Fetch IMS registration state from one place.
### patterns-sailfish
- Updated : 1.1.6+git1-1.7.1.jolla -- 1.1.6+git2-1.8.1.jolla
- [patterns] Require 'android-tools' from image-creation-tools.
- [patterns] Require 'atruncate' from image-creation-tools.
### pj-oss-project-config
- Updated : 0.0.20-1.8.1.jolla -- 0.0.22-1.9.2.jolla
- [prjconf] Ensure diffutils are available for build-compare.
- [prjconf] Set source_date_epoch_from_changelog.
### qmf-eas-plugin
- Updated : 0.3.40-1.3.5.jolla -- 0.4.1-1.5.1.jolla
- [qmf-eas-plugin] Fix checking credentials again after failure.
- [qmf-eas-plugin] Use outlook.office.com domain in scopes.
- [qmf-eas-plugin] Add account update page.
- [qmf-eas-plugin] Add support for logging in with OAuth.
- [qmf-eas] Remove declarations without implementation.
### qtmozembed-qt5
- Updated : 1.53.22-1.32.2.jolla -- 1.53.23-1.33.1.jolla
- [qtmozembed] Use physicalDotsPerInch for EmbedLiteView dpi.
### rpmlint
- Updated : 2.0.0+git2-1.6.14.jolla -- 2.0.0+git2.1-1.7.3.jolla
- [rpmlint] Ignore dynamic parts of version/release number.
### sailfish-browser
- Updated : 2.2.38.4-1.25.1.jolla -- 2.2.54.1-1.26.1.jolla
- [browser] Ignore SIGPIPE.
- [browser] Quick copy url to clipboard by press-and-hold url from toolbar.
- [ua] Add linux for facebook user-agent.
- [user-agent] Update preprocessed user agent overrides
- [ua] Add linux for facebook user-agent.
- [user-agent] Update user-agent overrides for 78.0.
- [user-agent] Update preprocessed user agent overrides
- [ua] Adjust linkedin.com user-agent.
- [user-agent] Update user-agent overrides for 78.8.
- [user-agent] Update preprocessed user agent overrides
- [browser] Remove browser application name from google domain overrides.
- [browser] Do not raise overlay when starting with requested url.
- [browser] Webview test crash fix.
- [tests] Stabilize declarativehistorymodel test case.
- [browser] Fix icon for add to app grid.
- [browser] Bump up package version
- [browser] Cleanup general.useragent.override from preferences.
- [browser] Fix popup input region.
- [browser] Fix tab closing in app exit.
- [browser] Explicitly state Camera permission.
- [browser] Make it possible to configure max live tab count via setting.
- [tests] Stop embedding after views&window destoyed (tst_webview).
- [tests] Do not spy urlChanged signals on forwardBackwardNavigation case.
- [tests] Mark tst_webview restart test as skipped.
- [tests] Mark webcontainer of tst_webview as C++ owned.
- [tests] Sleep 10ms whilst waiting for signals.
- [tests] Add running property to the test object.
- [tests] Cleanup tst_logins.
- [browser] Add missing method for webpage mock
- [tests] Improve test case comments.
- [tests] The most recently used tab is activated when an active tab is closed.
- [tests] Wait that created tabs are loaded.
- [browser] After closing the active shift new active tab index.
- [browser] Support touch events when selection active.
- [user-agent] Update preprocessed user agent overrides for m.vk.com
- [browser] Decreate overlay animation duration to 250ms.
- [browser] Add invisible footer for favorite grid and history list.
- [browser] Follow drag direction when opening / closing overlay.
### sailfish-eas
- Updated : 0.5.18.1-1.5.1.jolla -- 0.5.18.3-1.6.1.jolla
- [sailfish-eas] Allow alternative provider and service name.
- [sailfish-eas] Add OAuth to login flow and protocol commands.
- [sailfish-eas] Ask to update credentials on failure.
- [sailfish-eas] Implement token refresh on authentication error.
### sailfish-mdm
- Updated : 0.4.14-1.4.32.jolla -- 0.4.15-1.5.1.jolla
- [docs] Fix links to User Manager docs.
### sailfish-qdoc-template
- Updated : 0.1.0-1.2.2.jolla -- 0.3-1.3.2.jolla
- [sailfish-qdoc-template] Package documentation in HTML format.
- [sailfish-qdoc-template] Allow linking between projects.
- [sailfish-qdoc-template] Export BASE_URL to qdoc.
### sailjail-permissions
- Updated : 1.1.0-1.31.2.jolla -- 1.1.1-1.32.4.jolla
- [docs] Advice on data migration.
### sdk-setup
- Updated : 1.4.58-1.25.1.jolla -- 1.4.61-1.26.1.jolla
- [mb2] Fix passing arguments to make with %make_build.
- [git-change-log] Allow for changes in tag naming conventions.
- [git-change-log] Only consider tags reachable through first parent
- [mb2] Prefer .changes.run file over .changes.
### signon-plugin-oauth2-qt5
- Updated : 0.21.7+git1-1.5.1.jolla -- 0.25+git1-1.6.1.jolla
- [git] Move submodule repos to github.
- [signon-plugin-oauth2] Update to version 0.25.
### signon-qt5
- Updated : 8.60.0+git5-1.9.1.jolla -- 8.60.0+git6-1.10.2.jolla
- [libsignon] Increase maximum token storage size.
### user-managerd
- Updated : 0.8.5-1.7.2.jolla -- 0.8.7-1.8.2.jolla
- [docs] Fix index file generation.
- [user-managerd] Include license file as %license.
-- the end --

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
=====================================
SAILFISH OS
Changelog from 4.5.0.16 to 4.5.0.18
2023-02-16
=====================================
# Packages modified (9)
### declarative-transferengine-qt5
Updated : 1.1.3-1.9.1.jolla -- 1.1.4-1.10.1.jolla
- [declarative-transferengine] Add plugins.qmltypes for Sailfish.Tranferengine.
### kf5bluezqt-bluez5
Updated : 5.50.0+git4-1.8.1.jolla -- 5.50.0+git6-1.9.1.jolla
- [kf5bluezqt] Add plugins.qmltypes.
- [kf5bluezqt] Fix qmlplugindump crash.
- [kf5bluezqt] Add qch to documentation package.
- [kf5bluezqt] Force light mode in documentation.
### libxslt
Updated : 1.1.37+git1-1.7.2.jolla -- 1.1.37+git2-1.9.1.jolla
- [libxslt] Backport patch to add missing symbolic links.
### lipstick-jolla-home-qt5
Updated : 1.25.13.2-1.14.1.jolla -- 1.25.13.3-1.15.1.jolla
- [lipstick-jolla] Fix lock view ongoing call item being out of screen.
### mer-qdoc-template
Updated : 0.0.6-1.6.1.jolla -- 0.0.7-1.7.1.jolla
- [mer-qdoc-template] Add left margin.
- [mer-qdoc-template] Use px for margin definition.
### sailfish-components-bluetooth-qt5
Updated : 0.2.23.1-1.7.1.jolla -- 0.2.23.2-1.8.1.jolla
- [components-bluetooth] Add plugins.qmltypes.
### sailfish-qdoc-template
Updated : 0.3-1.3.1.jolla -- 0.4-1.4.1.jolla
- [sailfish-qdoc-template] Add left margin.
- [sailfish-qdoc-template] Use px in margin definition.
### sdk-setup
Updated : 1.4.79-1.15.1.jolla -- 1.4.84-1.18.1.jolla
- [sdk-info] Fix path to the 'ip' command.
- [sdk-setup] Authenticate connections from sfdk.
- [mb2] Use /usr/local/bin/git if available.
- [sdk-init] Separate spec files per builder.
- [sdk-make-qmltypes] Enable use with git submodules.
### xulrunner-qt5
Updated : 78.15.1+git33-1.19.1.jolla -- 78.15.1+git33.1-1.20.1.jolla
- [sailfishos][gecko] Backport support for ffmpeg 5.0.

View File

@ -0,0 +1,98 @@
# SAILFISH OS: Changelog from 4.5.0.18 to 4.5.0.19
2023-03-15
## Packages modified (8)
### aliendalvik-configs
- Updated : 11.0.26-1.17.1.jolla -- 11.0.26.2-1.18.1.jolla
- [appsupport] Fix startup during SailfishOS boot.
- [appsupport] Fix supplementary service control.
- [appsupport] restart container after new wayland socket.
### connman
- Updated : 1.32+git193-1.18.1.jolla -- 1.32+git194-1.19.1.jolla
- [clat] Add frag hdr and dynamic pool support.
- [clat] Avoid tayga zombies, fix config, improve state changes.
- [clat] Call task stop only once.
- [clat] Delay DNS query to ipv4only.arpa until nameservers are set.
- [clat] Do DAD immediately when CLAT starts, then with timeout.
- [clat] Do restart if interface is lost/invalid.
- [clat] Do task stop when prefix cannot be resolved.
- [clat] Ensure cleanup and stop in error cases.
- [clat] Fix DAD return value use and reply processing.
- [clat] Fix error cases, add leeway + tolerance for resolv errors.
- [clat] Fix memory leaks and mem use error.
- [clat] Fix prefix resolv failure shutdown case.
- [clat] Fix process start and restart cases, handle segfaults.
- [clat] Handle GResolv error cases better, support resolv retry.
- [clat] Implement clat plugin to run tayga for IPv6 cellular.
- [clat] Improve interface error handling and fix if error restart.
- [clat] Improve tethering state monitor, stop if IPv6 goes away.
- [clat] Keep ptr to ipconfig between IPv6 prep and restore.
- [clat] Monitor tethering changes and enable double nat if on.
- [clat] Prepare NAT when interface is up, add MTU 1260 for IPv4 route.
- [clat] Re-add prefix query timeout, fix prefix change check.
- [clat] Repeat prefix query for NO_ANSWER when doing initial one.
- [clat] Stop CLAT if default changes to NULL.
- [clat] Use wakeup timer for DAD and GResolv.
- [connman] Implement CLAT support with tayga.
- [inet] Add functions for creating and removing tun dev.
- [inet] Add support for add/del neighbour proxy.
- [inet] Expose ipv6_do_dad for plugins.
- [inet] Review fix: Add functions for creating and removing tun dev.
- [inet] Set host flag only for a single IPv6 host route.
- [inet] Support adding IPv4 network routes with metric and MTU.
- [ipconfig] Add get/set for ipaddress, accept_ra, ndproxy.
- [nat] Add IPv6 preparation and double NAT support.
- [ofono] Clear IP-address when protocol does not use it.
- [packaging] Depend on tayga.
- [service] Add getter wrapper for ipconfig.
- [tools] Add ipconfig/inet dummies for iptables test.
- [unit] Add CLAT plugin unit tests.
- [unit] Add dummies for ipconfig ref/unref to iptables unit.
### droid-hal-pdx213
- Updated : 1.9.5-1.6.6.jolla -- 1.9.6-1.7.1.jolla
- [Kernel] Enable BNEP options
- [kernel] Fix random restarts while using Android AppSupport or crash reporter
- [kernel] input: sec_ts: Don't use ts->debug_flag to early, fix compile error.
- [kernel] psi: Fix uaf issue when psi trigger is destroyed while being polled.
- [kernel] usb: gadget: ffs: Remove IPC logging support.
### jolla-calendar
- Updated : 1.1.5-1.9.1.jolla -- 1.1.6-1.10.1.jolla
- [calendar] Fix date opened externally.
- [jolla-calendar] Add a gotoDate() function to views.
- [jolla-calendar] Adjust size of view in container.
- [jolla-calendar] Bind view date in TabHeader instance.
- [jolla-calendar] Fix DBus invocation to go to a specific date.
- [jolla-calendar] Replace the gotoToday() signal with gotoDate()
- [jolla-calendar] Use bindings for tab header height.
### jolla-settings-system
- Updated : 1.2.5.3-1.15.1.jolla -- 1.2.5.4-1.16.1.jolla
- [settings-system] Fix landscape lock screen with virtual keyboard.
### lipstick-jolla-home-qt5
- Updated : 1.25.13.3-1.15.1.jolla -- 1.25.13.6-1.16.1.jolla
- [lipstick-jolla-home] Fixup silica requirement.
- [lipstick-jolla-home] Use File.exist to check Weather and Calendar widgets.
- [lipstick-jolla-home] Allow captiveportal raise during Startup Wizard.
### sailfish-homescreen
- Updated : 0.1.7-1.5.1.jolla -- 0.1.7.1-1.6.1.jolla
- [sailfish-homescreen] Trigger captive portal during SUW when requested.
### sailfishsilica-qt5
- Updated : 1.2.103-1.13.2.jolla -- 1.2.103.1-1.14.1.jolla
- [silica] Add internal qmlImportPath.
## Packages added (1)
### tayga
- Binaries added : tayga - 0.9.2+git3-1.1.1.jolla
- [tayga] Remove the ignored patches as well because of OBS.
- [tayga] EAM patches break CLAT, ignore them for now.
- [tayga] Adding packaging data.

View File

@ -0,0 +1,170 @@
SAILFISH OS: Changelog from 4.5.0.19 to 4.5.0.21
2023-07-11
## Packages modified (21)
### aliendalvik-configs
Updated : 11.0.26.2-1.18.1.jolla -- 11.0.26.3-1.19.1.jolla
- [appsupport] Remove mknod and mknodat syscalls from seccomp blocked list.
### droid-hal-pdx201
Updated : 0.0.30-1.10.5.jolla -- 0.0.31-1.11.1.jolla
- [kernel] free task immediately to prevent slab task_struct memory leak.
### droid-hal-pdx213
Updated : 1.9.6-1.7.1.jolla -- 1.9.7-1.8.1.jolla
- [kernel] enable CONFIG_SLAB.
- [kernel] free task immediately to prevent slab task_struct memory leak.
### droidmedia
Updated : 0.20220929.0-1.6.2.jolla -- 0.20230605.1-1.8.1.jolla
- [droidmedia] Fix build for droid versions < 7.
- [droidmedia] Add encoder setting for CBR/VBR.
- [droidmedia] Fix ALOG usage.
- [droidmedia] Fix AsyncCodecSource to be asynchronous.
### droidmedia-devel
Updated : 0.20220929.0-1.4.3.jolla -- 0.20230605.1-1.6.1.jolla
- [droidmedia] Fix build for droid versions < 7.
- [droidmedia] Add encoder setting for CBR/VBR.
- [droidmedia] Fix ALOG usage.
- [droidmedia] Fix AsyncCodecSource to be asynchronous.
### gecko-camera
Updated : 0.1.6-1.4.1.jolla -- 0.1.7-1.6.1.jolla
- [gecko-camera] Set up the video encoder to produce CBR stream.
- [gecko-camera] Use media buffers depending on CPU vendor.
### gecko-camera-droid-plugin
Updated : 0.1.6-1.4.1.jolla -- 0.1.7-1.6.1.jolla
- [gecko-camera] Set up the video encoder to produce CBR stream.
- [gecko-camera] Use media buffers depending on CPU vendor.
### gmp-droid
Updated : 0.7-1.4.1.jolla -- 0.8-1.5.1.jolla
- [gmp-droid] Set up the video encoder to produce CBR stream.
### hybris-libsensorfw-qt5-binder
Updated : 0.12.6-1.5.1.jolla -- 0.14.4-1.6.1.jolla
- [sensorfw] Fix units used for sleep in sysfsadaptor.
- [sensorfwd] Use ms values for getAvailableIntervals() reply.
- [hybrisadaptor] Fix build errors from unresolvable id() calls.
- [hybrisadaptor] Define data and interval ranges earlier.
- [hybrisadaptor] Silence als/ps initial value warnings.
- [sensorfwd] Add node id to diagnostic logging messages
- [clientapitest] Move unit test operator== away from API header
- [sensorfwd] Use float values for XYZ data.
- [tapadaptor] Silence unused parameter warnings
- [declinationfilter] Add unit suffixes to time values
- [hybrisadaptor] Fix setDelay() return value
- [nodebase] Remove dead code
- [nodebase] Use closest supported data rate.
- [nodebase] Use m_variableName convention for all members
- [sensorfw] Add setDataRate() D-Bus method.
- [sensorfw] Drop evaluateIntervalRequests overloading.
- [sensorfw] Explicitly indicate interval time units.
- [sensorfw] Handle intervals in microsecond granularity.
- [sensorfw] Normalize setInterval() parameter order.
- [hybrisadaptor] Force cancellation of pending POLL transaction.
- [hybrisadaptor] Read and process capped number of events.
- [hybrisadaptor] Shuffle cleanup order.
- [sendorfwd] Skip deadlocking libgbinder cleanup.
### hybris-libsensorfw-qt5-hal
Updated : 0.12.6-1.5.1.jolla -- 0.14.4-1.6.1.jolla
- [sensorfw] Fix units used for sleep in sysfsadaptor.
- [sensorfwd] Use ms values for getAvailableIntervals() reply.
- [hybrisadaptor] Fix build errors from unresolvable id() calls.
- [hybrisadaptor] Define data and interval ranges earlier.
- [hybrisadaptor] Silence als/ps initial value warnings.
- [sensorfwd] Add node id to diagnostic logging messages
- [clientapitest] Move unit test operator== away from API header
- [sensorfwd] Use float values for XYZ data.
- [tapadaptor] Silence unused parameter warnings
- [declinationfilter] Add unit suffixes to time values
- [hybrisadaptor] Fix setDelay() return value
- [nodebase] Remove dead code
- [nodebase] Use closest supported data rate.
- [nodebase] Use m_variableName convention for all members
- [sensorfw] Add setDataRate() D-Bus method.
- [sensorfw] Drop evaluateIntervalRequests overloading.
- [sensorfw] Explicitly indicate interval time units.
- [sensorfw] Handle intervals in microsecond granularity.
- [sensorfw] Normalize setInterval() parameter order.
- [hybrisadaptor] Force cancellation of pending POLL transaction.
- [hybrisadaptor] Read and process capped number of events.
- [hybrisadaptor] Shuffle cleanup order.
- [sendorfwd] Skip deadlocking libgbinder cleanup.
### jolla-email
Updated : 1.1.37-1.11.1.jolla -- 1.1.38-1.12.1.jolla
- [email] Fix sharing url or plain text.
### libmce-glib
Updated : 1.0.13-1.7.1.jolla -- 1.1.0-1.8.1.jolla
- [debian] Bumped debhelper compat level to 7
- [libmce-glib] A better way to silence deprecation warnings
- [libmce-glib] Add an example application
- [libmce-glib] Add MceInactivity object
### lipstick-jolla-home-qt5
Updated : 1.25.13.6-1.16.1.jolla -- 1.25.13.7-1.17.1.jolla
- [lipstick-jolla-home] Fix notification popups getting lost.
### mapplauncherd-booster-browser
Updated : 0.1.3-1.6.1.jolla -- 0.2.0-1.7.1.jolla
- [booster-browser] Drop booster-browser.service.
### mkcal-qt5
Updated : 0.6.12-1.17.1.jolla -- 0.6.12.1-1.18.1.jolla
- [mkcal] Fix alarm setting for recurring events.
- [mkcal] Fix recurring event alarms with offset.
### nemo-qml-plugin-dbus-qt5
Updated : 2.1.30-1.7.2.jolla -- 2.1.32-1.8.1.jolla
- [nemo-dbus] Support a{sv} typed parameters.
- [nemo-dbus] Deprecation warning on org.nemomobile.dbus import.
### qt5-plugin-position-geoclue
Updated : 5.4.2+git2-1.6.1.jolla -- 5.4.2+git3-1.7.1.jolla
- [qtlocation] Change OSM tileserver URLs to ones which are currently available.
### qt5-qtlocation-source
Updated : 5.4.2+git2-1.6.1.jolla -- 5.4.2+git3-1.7.1.jolla
- [qtlocation] Change OSM tileserver URLs to ones which are currently available.
### qt5-qtsensors
Updated : 5.6.3+git2-1.5.1.jolla -- 5.6.3+git3-1.6.1.jolla
- [sensorfw] Use setDataRate() for settings data rates.
### sensorfw-qt5
Updated : 0.12.6-1.8.1.jolla -- 0.14.4-1.9.1.jolla
- [sensorfw] Fix units used for sleep in sysfsadaptor.
- [sensorfwd] Use ms values for getAvailableIntervals() reply.
- [hybrisadaptor] Fix build errors from unresolvable id() calls.
- [hybrisadaptor] Define data and interval ranges earlier.
- [hybrisadaptor] Silence als/ps initial value warnings.
- [sensorfwd] Add node id to diagnostic logging messages
- [clientapitest] Move unit test operator== away from API header
- [sensorfwd] Use float values for XYZ data.
- [tapadaptor] Silence unused parameter warnings
- [declinationfilter] Add unit suffixes to time values
- [hybrisadaptor] Fix setDelay() return value
- [nodebase] Remove dead code
- [nodebase] Use closest supported data rate.
- [nodebase] Use m_variableName convention for all members
- [sensorfw] Add setDataRate() D-Bus method.
- [sensorfw] Drop evaluateIntervalRequests overloading.
- [sensorfw] Explicitly indicate interval time units.
- [sensorfw] Handle intervals in microsecond granularity.
- [sensorfw] Normalize setInterval() parameter order.
- [hybrisadaptor] Force cancellation of pending POLL transaction.
- [hybrisadaptor] Read and process capped number of events.
- [hybrisadaptor] Shuffle cleanup order.
- [sendorfwd] Skip deadlocking libgbinder cleanup.
### xulrunner-qt5
Updated : 78.15.1+git33.1-1.20.1.jolla -- 78.15.1+git33.2-1.21.1.jolla
- [sailfishos][embedlite] Enable dialog element.

View File

@ -0,0 +1,70 @@
SAILFISH OS: Changelog from 4.5.0.21 to 4.5.0.24
2023-09-07
## Packages modified (13)
### declarative-transferengine-qt5
Updated : 1.1.4-1.10.1.jolla -- 1.1.5-1.11.1.jolla
- [declarative-transferengine] Do not clip download ProgressBar.
### jolla-calculator
Updated : 1.0.8-1.4.1.jolla -- 1.0.9-1.5.1.jolla
- [calculator] Use page high dragging area.
### jolla-keyboard
Updated : 0.9.5-1.9.1.jolla -- 0.9.6-1.10.1.jolla
- [keyboard] Allow text field to prevent vkb hiding.
### jolla-sessions-qt5
Updated : 1.4.22-1.4.1.jolla -- 1.4.24.1-1.6.1.jolla
- [jolla-sessions-qt5] Revert SUW done files changes.
- [jolla-sessions] Update license to BSD.
- [base-jolla-sessions-qt5] Startupwizard done files dir change.
### jolla-settings-system
Updated : 1.2.5.4-1.16.1.jolla -- 1.2.5.7-1.17.1.jolla
Binaries removed : jolla-settings-system-about-font-licenses, jolla-settings-system-about-package-licenses
- [settings-system] Allow to pick a separate ringtone for SIM2.
- [settings-system] Disable user closing virtual keyboard on lock input.
- [settings-system] Stop tone preview playback when entering subpage.
- [jolla-settings-system] Add 'Licenses' button to About product.
- [settings-system] Remove obsolete about-font-licenses subpackage.
### mapplauncherd-booster-browser
Updated : 0.2.0-1.7.1.jolla -- 0.2.1-1.8.1.jolla
- [packaging] Use pkgconfig for systemd build requirement.
### nemo-qml-plugin-systemsettings
Updated : 0.10.2-1.14.1.jolla -- 0.10.3-1.15.1.jolla
- [systemsettings] Support another ringtone for SIM2.
### sailfish-components-weather-qt5
Updated : 1.1.16-1.7.3.jolla -- 1.1.19-1.8.1.jolla
- [sailfish-weather] Handle unauthorized API key.
- [components-weather] Migrate nemo import name.
- [components-weather] Remove bad connman-qt5 usage from unused location detection.
### sailfish-content-tones-default
Updated : 0.16.1-1.2.1.jolla -- 0.16.2-1.3.1.jolla
- [ringtones] Support profiled config for SIM2 ringtone.
### sailfish-fonts
Updated : 0.3.0-1.4.1.jolla -- 0.3.1-1.6.1.jolla
- [packaging] Remove unneeded font license package dependency.
### sailfish-weather
Updated : 1.0.11-1.6.2.jolla -- 1.0.14-1.8.1.jolla
- [sailfish-weather] Add credential error message below main header.
- [sailfish-weather] Handle unauthorized API key.
- [weather] Migrate nemo configuration plugin import name.
### voicecall-qt5
Updated : 0.8.0-1.9.1.jolla -- 0.8.1-1.10.1.jolla
- [voicecall] Support playing app-requested ringtone file.
### voicecall-ui-jolla
Updated : 1.15.0.1-1.8.1.jolla -- 1.15.0.2-1.9.1.jolla
- [voicecall-ui] Use separate ringtone for SIM2.

View File

@ -0,0 +1,361 @@
● Xperia10III
State: degraded
Jobs: 0 queued
Failed: 3 units
Since: Wed 2023-07-05 13:32:43 CEST; 2 days ago
CGroup: /
├─user.slice
│ └─user-100000.slice
│ ├─session-c4.scope
│ │ ├─22470 sshd: defaultuser [priv]
│ │ ├─22472 sshd: defaultuser@pts/1
│ │ ├─22473 -bash
│ │ └─22672 systemctl status
│ ├─user@100000.service
│ │ ├─ambienced.service
│ │ │ └─5575 /usr/bin/invoker -o -s --type=qt5 /usr/bin/ambienced
│ │ ├─alienaudio.service
│ │ │ └─21162 /usr/bin/alienaudioservice -p pulseaudio -p sailfish
│ │ ├─jolla-messages.service
│ │ │ └─6756 /usr/bin/invoker --type=generic -- /usr/bin/sailjail -- /usr/bin/jolla-messages -prestart
│ │ ├─booster\x2dbrowser.slice
│ │ │ ├─booster-browser@sailfish-browser.service
│ │ │ │ └─6457 /usr/bin/invoker --type=silica-session -- /usr/bin/sailjail --profile=sailfish-browser -- /usr/libexec/mapplauncherd/booster-browser --application=sailfish-browser
│ │ │ └─booster-browser@jolla-email.service
│ │ │ └─6460 /usr/bin/invoker --type=silica-session -- /usr/bin/sailjail --profile=jolla-email -- /usr/libexec/mapplauncherd/booster-browser --application=jolla-email
│ │ ├─lipstick-security-ui.service
│ │ │ └─6507 /usr/bin/invoker -s --type=silica-session /usr/libexec/lipstick-security-ui-launcher
│ │ ├─ohm-session-agent.service
│ │ │ └─5520 /usr/bin/ohm-session-agent
│ │ ├─simkit-agent.service
│ │ │ └─7067 /usr/bin/simkit
│ │ ├─connectionagent.service
│ │ │ └─5579 /usr/bin/invoker -o --type=qt5 /usr/bin/connectionagent
│ │ ├─background.slice
│ │ │ └─tracker-miner-fs-3.service
│ │ │ └─7079 /usr/libexec/tracker-miner-fs-3
│ │ ├─apkd-bridge-user.service
│ │ │ └─21223 /usr/bin/invoker -o -s --global-syms --type=qt5 /usr/bin/apkd-bridge-user
│ │ ├─dconf.service
│ │ │ └─6069 /usr/libexec/dconf-service
│ │ ├─pulseaudio.service
│ │ │ ├─5794 /usr/bin/pulseaudio --daemonize=no -n --file=/etc/pulse/arm_droid_default.pa
│ │ │ └─5924 /usr/libexec/audiosystem-passthrough/audiosystem-passthrough --module
│ │ ├─mission-control-5.service
│ │ │ └─6456 /usr/bin/invoker --type=generic --keep-oom-score /usr/libexec/mission-control-5
│ │ ├─booster\x2dsilica\x2dmedia.slice
│ │ │ ├─booster-silica-media@jolla-camera-lockscreen.service
│ │ │ │ └─6463 /usr/bin/invoker --type=silica-session -- /usr/bin/sailjail --profile=jolla-camera-lockscreen -- /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera-lockscreen
│ │ │ └─booster-silica-media@jolla-camera.service
│ │ │ └─6451 /usr/bin/invoker --type=silica-session -- /usr/bin/sailjail --profile=jolla-camera -- /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera
│ │ ├─xt9-server.service
│ │ │ └─5576 /usr/libexec/xt9/xt9-server
│ │ ├─alienkeyboard.service
│ │ │ └─21183 /usr/bin/alienkeyboardservice
│ │ ├─mpris-proxy.service
│ │ │ └─6454 /usr/bin/mpris-proxy
│ │ ├─profiled.service
│ │ │ └─5567 /usr/bin/profiled
│ │ ├─msyncd.service
│ │ │ └─5571 /usr/bin/invoker -G -o -s --type=qt5 /usr/bin/msyncd
│ │ ├─booster-qt5.service
│ │ │ ├─ 5518 /usr/libexec/mapplauncherd/booster-qt5 --systemd --boot-mode
│ │ │ ├─ 5547 /usr/bin/voicecall-manager
│ │ │ ├─ 5588 /usr/bin/msyncd
│ │ │ ├─ 5591 /usr/bin/ambienced
│ │ │ ├─ 5593 /usr/bin/connectionagent
│ │ │ ├─ 5595 /usr/bin/jolla-signon-ui
│ │ │ ├─ 6462 /usr/bin/maliit-server
│ │ │ ├─ 6465 /usr/bin/commhistoryd
│ │ │ ├─ 6468 /usr/bin/contactsd
│ │ │ ├─20348 booster [qt5]
│ │ │ ├─21201 /usr/bin/apkd-bridge-user
│ │ │ └─28380 /usr/bin/apkd-bridge
│ │ ├─booster-generic.service
│ │ │ ├─ 5524 /usr/libexec/mapplauncherd/booster-generic --systemd
│ │ │ ├─ 5802 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:voicecall --private-bin=voicecall-ui --whitelist=/usr/share/voicecall-ui-jolla --whitelist=/usr/share/applications/voicecall-ui.desktop --whitelist=${HOME}/.local/share/voicecall-ui --whitelist=${HOME}/.config/voicecall-ui --whitelist=${HOME}/.cache/voicecall-ui --mkdir=${HOME}/.cache/com.jolla/voicecall --whitelist=${HOME}/.cache/com.jolla/voicecall --mkdir=${HOME}/.local/share/com.jolla/voicecall --whitelist=${HOME}/.local/share/com.jolla/voicecall --mkdir=${HOME}/.config/com.jolla/voicecall --whitelist=${HOME}/.config/com.jolla/voicecall --dbus-user.own=com.jolla.voicecall --dbus-user.own=com.jolla.voicecall.ui --profile=/etc/sailjail/permissions/voicecall-ui.profile --profile=/etc/sailjail/permissions/Phone.permission --profile=/etc/sailjail/permissions/CallRecordings.permission --profile=/etc/sailjail/permissions/CommunicationHistory.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/UserDirs.permission --profile=/etc/sailjail/permissions/Contacts.permission --profile=/etc/sailjail/permissions/Bluetooth.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/bin/voicecall-ui -prestart
│ │ │ ├─ 6464 /usr/libexec/mission-control-5
│ │ │ ├─ 6497 /usr/bin/xdg-dbus-proxy --fd=4 --args=5
│ │ │ ├─ 6506 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:voicecall --private-bin=voicecall-ui --whitelist=/usr/share/voicecall-ui-jolla --whitelist=/usr/share/applications/voicecall-ui.desktop --whitelist=${HOME}/.local/share/voicecall-ui --whitelist=${HOME}/.config/voicecall-ui --whitelist=${HOME}/.cache/voicecall-ui --mkdir=${HOME}/.cache/com.jolla/voicecall --whitelist=${HOME}/.cache/com.jolla/voicecall --mkdir=${HOME}/.local/share/com.jolla/voicecall --whitelist=${HOME}/.local/share/com.jolla/voicecall --mkdir=${HOME}/.config/com.jolla/voicecall --whitelist=${HOME}/.config/com.jolla/voicecall --dbus-user.own=com.jolla.voicecall --dbus-user.own=com.jolla.voicecall.ui --profile=/etc/sailjail/permissions/voicecall-ui.profile --profile=/etc/sailjail/permissions/Phone.permission --profile=/etc/sailjail/permissions/CallRecordings.permission --profile=/etc/sailjail/permissions/CommunicationHistory.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/UserDirs.permission --profile=/etc/sailjail/permissions/Contacts.permission --profile=/etc/sailjail/permissions/Bluetooth.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/bin/voicecall-ui -prestart
│ │ │ ├─ 6750 /usr/bin/firejail --quiet --template=OrganizationName:org.sailfishos --template=ApplicationName:Messages --private-bin=jolla-messages --whitelist=/usr/share/jolla-messages --whitelist=/usr/share/applications/jolla-messages.desktop --whitelist=${HOME}/.local/share/jolla-messages --whitelist=${HOME}/.config/jolla-messages --whitelist=${HOME}/.cache/jolla-messages --mkdir=${HOME}/.cache/org.sailfishos/Messages --whitelist=${HOME}/.cache/org.sailfishos/Messages --mkdir=${HOME}/.local/share/org.sailfishos/Messages --whitelist=${HOME}/.local/share/org.sailfishos/Messages --mkdir=${HOME}/.config/org.sailfishos/Messages --whitelist=${HOME}/.config/org.sailfishos/Messages --dbus-user.own=org.sailfishos.Messages --profile=/etc/sailjail/permissions/jolla-messages.profile --profile=/etc/sailjail/permissions/Contacts.permission --profile=/etc/sailjail/permissions/Messages.permission --profile=/etc/sailjail/permissions/CommunicationHistory.permission --profile=/etc/sailjail/permissions/Ambience.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/Pictures.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/bin/jolla-messages -prestart
│ │ │ ├─ 6781 /usr/bin/voicecall-ui -prestart
│ │ │ ├─ 6821 /usr/libexec/telepathy-ring
│ │ │ ├─ 6845 /usr/bin/xdg-dbus-proxy --fd=4 --args=5
│ │ │ ├─ 6855 /usr/bin/firejail --quiet --template=OrganizationName:org.sailfishos --template=ApplicationName:Messages --private-bin=jolla-messages --whitelist=/usr/share/jolla-messages --whitelist=/usr/share/applications/jolla-messages.desktop --whitelist=${HOME}/.local/share/jolla-messages --whitelist=${HOME}/.config/jolla-messages --whitelist=${HOME}/.cache/jolla-messages --mkdir=${HOME}/.cache/org.sailfishos/Messages --whitelist=${HOME}/.cache/org.sailfishos/Messages --mkdir=${HOME}/.local/share/org.sailfishos/Messages --whitelist=${HOME}/.local/share/org.sailfishos/Messages --mkdir=${HOME}/.config/org.sailfishos/Messages --whitelist=${HOME}/.config/org.sailfishos/Messages --dbus-user.own=org.sailfishos.Messages --profile=/etc/sailjail/permissions/jolla-messages.profile --profile=/etc/sailjail/permissions/Contacts.permission --profile=/etc/sailjail/permissions/Messages.permission --profile=/etc/sailjail/permissions/CommunicationHistory.permission --profile=/etc/sailjail/permissions/Ambience.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/Pictures.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/bin/jolla-messages -prestart
│ │ │ ├─ 6998 /usr/bin/jolla-messages -prestart
│ │ │ ├─15307 /usr/bin/firejail --quiet --template=OrganizationName:org.sailfishos --template=ApplicationName:AudioRecorder --private-bin=sailfish-audiorecorder --whitelist=/usr/share/sailfish-audiorecorder --whitelist=/usr/share/applications/sailfish-audiorecorder.desktop --whitelist=${HOME}/.local/share/sailfish-audiorecorder --whitelist=${HOME}/.config/sailfish-audiorecorder --whitelist=${HOME}/.cache/sailfish-audiorecorder --mkdir=${HOME}/.cache/org.sailfishos/AudioRecorder --whitelist=${HOME}/.cache/org.sailfishos/AudioRecorder --mkdir=${HOME}/.local/share/org.sailfishos/AudioRecorder --whitelist=${HOME}/.local/share/org.sailfishos/AudioRecorder --mkdir=${HOME}/.config/org.sailfishos/AudioRecorder --whitelist=${HOME}/.config/org.sailfishos/AudioRecorder --dbus-user.own=org.sailfishos.AudioRecorder --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Documents.permission --profile=/etc/sailjail/permissions/Microphone.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/bin/sailfish-audiorecorder
│ │ │ ├─20561 booster [generic]
│ │ │ ├─23111 /usr/bin/xdg-dbus-proxy --fd=4 --args=5
│ │ │ ├─23113 /usr/bin/firejail --quiet --template=OrganizationName:org.sailfishos --template=ApplicationName:AudioRecorder --private-bin=sailfish-audiorecorder --whitelist=/usr/share/sailfish-audiorecorder --whitelist=/usr/share/applications/sailfish-audiorecorder.desktop --whitelist=${HOME}/.local/share/sailfish-audiorecorder --whitelist=${HOME}/.config/sailfish-audiorecorder --whitelist=${HOME}/.cache/sailfish-audiorecorder --mkdir=${HOME}/.cache/org.sailfishos/AudioRecorder --whitelist=${HOME}/.cache/org.sailfishos/AudioRecorder --mkdir=${HOME}/.local/share/org.sailfishos/AudioRecorder --whitelist=${HOME}/.local/share/org.sailfishos/AudioRecorder --mkdir=${HOME}/.config/org.sailfishos/AudioRecorder --whitelist=${HOME}/.config/org.sailfishos/AudioRecorder --dbus-user.own=org.sailfishos.AudioRecorder --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Documents.permission --profile=/etc/sailjail/permissions/Microphone.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/bin/sailfish-audiorecorder
│ │ │ └─23140 /usr/bin/sailfish-audiorecorder
│ │ ├─sailfish-homescreen-services.service
│ │ │ └─5517 /usr/libexec/sailfish-homescreen-services
│ │ ├─jolla-signon-ui.service
│ │ │ └─6448 /usr/bin/invoker -o -s --type=qt5 /usr/bin/jolla-signon-ui
│ │ ├─commhistoryd.service
│ │ │ └─6450 /usr/bin/invoker -o --type=qt5 /usr/bin/commhistoryd
│ │ ├─voicecall-ui-prestart.service
│ │ │ └─6458 /usr/bin/invoker -o -s --type=generic -- /usr/bin/sailjail -p voicecall-ui -- /usr/bin/voicecall-ui -prestart
│ │ ├─voicecall-manager.service
│ │ │ └─5569 /usr/bin/invoker -o --type=qt5 /usr/bin/voicecall-manager
│ │ ├─init.scope
│ │ │ ├─5424 /usr/lib/systemd/systemd --user --unit=default.target
│ │ │ └─5427 (sd-pam)
│ │ ├─maliit-server.service
│ │ │ └─6447 /usr/bin/invoker --type=qt5 /usr/bin/maliit-server
│ │ ├─timed-qt5.service
│ │ │ └─5526 /usr/bin/timed-qt5 --systemd
│ │ ├─contactsd.service
│ │ │ └─7076 /usr/bin/invoker -o -s --global-syms --type=qt5 /usr/bin/contactsd
│ │ ├─lipstick.service
│ │ │ ├─ 5736 /usr/bin/lipstick -plugin evdevtouch -plugin evdevmouse -plugin evdevkeyboard:keymap=/usr/share/qt5/keymaps/droid.qmap --systemd
│ │ │ └─23102 invoker --type=generic --id=sailfish-audiorecorder --single-instance /usr/bin/sailjail -p sailfish-audiorecorder.desktop /usr/bin/sailfish-audiorecorder
│ │ ├─ngfd.service
│ │ │ └─5570 /usr/bin/ngfd
│ │ ├─telepathy-ring.service
│ │ │ └─6773 /usr/bin/invoker --type=generic --keep-oom-score /usr/libexec/telepathy-ring
│ │ ├─apkd-bridge.service
│ │ │ └─21200 /usr/bin/invoker -o -s --global-syms --type=qt5 /usr/bin/apkd-bridge
│ │ ├─obex.service
│ │ │ └─6076 /usr/libexec/bluetooth/obexd -n --capability !/usr/bin/obex-capability --noplugin=syncevolution,ftp,mas,irmc --exclude=bluetooth:pcsuite --root=/home/defaultuser
│ │ ├─dbus.service
│ │ │ ├─ 5522 /usr/bin/dbus-daemon --session --address=systemd: --nofork --systemd-activation
│ │ │ └─21612 /usr/libexec/geoclue-master
│ │ └─booster-browser.service
│ │ ├─7066 /usr/libexec/mapplauncherd/booster-browser --systemd
│ │ └─7075 booster [browser]
│ └─session-1.scope
│ ├─ 5367 /usr/libexec/mapplauncherd/booster-silica-session --boot-mode
│ ├─ 5502 (sd-pam)
│ ├─ 5515 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:camera --private-bin=jolla-camera --whitelist=/usr/share/jolla-camera --whitelist=/usr/share/applications/jolla-camera.desktop --whitelist=${HOME}/.local/share/jolla-camera --whitelist=${HOME}/.config/jolla-camera --whitelist=${HOME}/.cache/jolla-camera --mkdir=${HOME}/.cache/com.jolla/camera --whitelist=${HOME}/.cache/com.jolla/camera --mkdir=${HOME}/.local/share/com.jolla/camera --whitelist=${HOME}/.local/share/com.jolla/camera --mkdir=${HOME}/.config/com.jolla/camera --whitelist=${HOME}/.config/com.jolla/camera --dbus-user.own=com.jolla.camera --profile=/etc/sailjail/permissions/booster-silica-media.profile --profile=/etc/sailjail/permissions/jolla-camera.profile --profile=/etc/sailjail/permissions/Camera.permission --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Microphone.permission --profile=/etc/sailjail/permissions/Pictures.permission --profile=/etc/sailjail/permissions/Videos.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Location.permission --profile=/etc/sailjail/permissions/Ambience.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera
│ ├─ 6466 /usr/bin/firejail --quiet --template=OrganizationName:org.sailfishos --template=ApplicationName:browser --private-bin=sailfish-browser --whitelist=/usr/share/sailfish-browser --whitelist=/usr/share/applications/sailfish-browser.desktop --whitelist=${HOME}/.local/share/sailfish-browser --whitelist=${HOME}/.config/sailfish-browser --whitelist=${HOME}/.cache/sailfish-browser --mkdir=${HOME}/.cache/org.sailfishos/browser --whitelist=${HOME}/.cache/org.sailfishos/browser --mkdir=${HOME}/.local/share/org.sailfishos/browser --whitelist=${HOME}/.local/share/org.sailfishos/browser --mkdir=${HOME}/.config/org.sailfishos/browser --whitelist=${HOME}/.config/org.sailfishos/browser --dbus-user.own=org.sailfishos.browser --dbus-user.own=org.sailfishos.browser.ui --profile=/etc/sailjail/permissions/booster-browser.profile --profile=/etc/sailjail/permissions/sailfish-browser.profile --profile=/etc/sailjail/permissions/WebView.permission --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Camera.permission --profile=/etc/sailjail/permissions/Location.permission --profile=/etc/sailjail/permissions/Internet.permission --profile=/etc/sailjail/permissions/UserDirs.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-browser --application=sailfish-browser
│ ├─ 6467 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:email --private-bin=jolla-email --whitelist=/usr/share/jolla-email --whitelist=/usr/share/applications/jolla-email.desktop --whitelist=${HOME}/.local/share/jolla-email --whitelist=${HOME}/.config/jolla-email --whitelist=${HOME}/.cache/jolla-email --mkdir=${HOME}/.cache/com.jolla/email --whitelist=${HOME}/.cache/com.jolla/email --mkdir=${HOME}/.local/share/com.jolla/email --whitelist=${HOME}/.local/share/com.jolla/email --mkdir=${HOME}/.config/com.jolla/email --whitelist=${HOME}/.config/com.jolla/email --dbus-user.own=com.jolla.email --dbus-user.own=com.jolla.email.ui --profile=/etc/sailjail/permissions/booster-browser.profile --profile=/etc/sailjail/permissions/jolla-email.profile --profile=/etc/sailjail/permissions/Accounts.permission --profile=/etc/sailjail/permissions/Contacts.permission --profile=/etc/sailjail/permissions/Phone.permission --profile=/etc/sailjail/permissions/Email.permission --profile=/etc/sailjail/permissions/WebView.permission --profile=/etc/sailjail/permissions/Internet.permission --profile=/etc/sailjail/permissions/AppLaunch.permission --profile=/etc/sailjail/permissions/Calendar.permission --profile=/etc/sailjail/permissions/UserDirs.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/CommunicationHistory.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-browser --application=jolla-email
│ ├─ 6469 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:camera --private-bin=jolla-camera-lockscreen --whitelist=/usr/share/jolla-camera --whitelist=/usr/share/applications/jolla-camera-lockscreen.desktop --whitelist=${HOME}/.local/share/jolla-camera-lockscreen --whitelist=${HOME}/.config/jolla-camera-lockscreen --whitelist=${HOME}/.cache/jolla-camera-lockscreen --mkdir=${HOME}/.cache/com.jolla/camera --whitelist=${HOME}/.cache/com.jolla/camera --mkdir=${HOME}/.local/share/com.jolla/camera --whitelist=${HOME}/.local/share/com.jolla/camera --mkdir=${HOME}/.config/com.jolla/camera --whitelist=${HOME}/.config/com.jolla/camera --dbus-user.own=com.jolla.camera --profile=/etc/sailjail/permissions/booster-silica-media.profile --profile=/etc/sailjail/permissions/jolla-camera-lockscreen.profile --profile=/etc/sailjail/permissions/Camera.permission --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Microphone.permission --profile=/etc/sailjail/permissions/Pictures.permission --profile=/etc/sailjail/permissions/Videos.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Location.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera-lockscreen
│ ├─ 6479 /usr/libexec/lipstick-security-ui
│ ├─ 6490 /usr/libexec/mapplauncherd/booster-silica-qt5 --daemon
│ ├─ 6496 /usr/bin/xdg-dbus-proxy --fd=4 --args=9
│ ├─ 6498 /usr/libexec/mapplauncherd/booster-silica-media --daemon
│ ├─ 6499 /usr/bin/xdg-dbus-proxy --fd=4 --args=9
│ ├─ 6502 booster [silica-media]
│ ├─ 6503 /usr/bin/xdg-dbus-proxy --fd=4 --args=9
│ ├─ 6509 /usr/bin/firejail --quiet --template=OrganizationName:org.sailfishos --template=ApplicationName:browser --private-bin=sailfish-browser --whitelist=/usr/share/sailfish-browser --whitelist=/usr/share/applications/sailfish-browser.desktop --whitelist=${HOME}/.local/share/sailfish-browser --whitelist=${HOME}/.config/sailfish-browser --whitelist=${HOME}/.cache/sailfish-browser --mkdir=${HOME}/.cache/org.sailfishos/browser --whitelist=${HOME}/.cache/org.sailfishos/browser --mkdir=${HOME}/.local/share/org.sailfishos/browser --whitelist=${HOME}/.local/share/org.sailfishos/browser --mkdir=${HOME}/.config/org.sailfishos/browser --whitelist=${HOME}/.config/org.sailfishos/browser --dbus-user.own=org.sailfishos.browser --dbus-user.own=org.sailfishos.browser.ui --profile=/etc/sailjail/permissions/booster-browser.profile --profile=/etc/sailjail/permissions/sailfish-browser.profile --profile=/etc/sailjail/permissions/WebView.permission --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Camera.permission --profile=/etc/sailjail/permissions/Location.permission --profile=/etc/sailjail/permissions/Internet.permission --profile=/etc/sailjail/permissions/UserDirs.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-browser --application=sailfish-browser
│ ├─ 6514 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:camera --private-bin=jolla-camera --whitelist=/usr/share/jolla-camera --whitelist=/usr/share/applications/jolla-camera.desktop --whitelist=${HOME}/.local/share/jolla-camera --whitelist=${HOME}/.config/jolla-camera --whitelist=${HOME}/.cache/jolla-camera --mkdir=${HOME}/.cache/com.jolla/camera --whitelist=${HOME}/.cache/com.jolla/camera --mkdir=${HOME}/.local/share/com.jolla/camera --whitelist=${HOME}/.local/share/com.jolla/camera --mkdir=${HOME}/.config/com.jolla/camera --whitelist=${HOME}/.config/com.jolla/camera --dbus-user.own=com.jolla.camera --profile=/etc/sailjail/permissions/booster-silica-media.profile --profile=/etc/sailjail/permissions/jolla-camera.profile --profile=/etc/sailjail/permissions/Camera.permission --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Microphone.permission --profile=/etc/sailjail/permissions/Pictures.permission --profile=/etc/sailjail/permissions/Videos.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Location.permission --profile=/etc/sailjail/permissions/Ambience.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera
│ ├─ 6515 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:camera --private-bin=jolla-camera-lockscreen --whitelist=/usr/share/jolla-camera --whitelist=/usr/share/applications/jolla-camera-lockscreen.desktop --whitelist=${HOME}/.local/share/jolla-camera-lockscreen --whitelist=${HOME}/.config/jolla-camera-lockscreen --whitelist=${HOME}/.cache/jolla-camera-lockscreen --mkdir=${HOME}/.cache/com.jolla/camera --whitelist=${HOME}/.cache/com.jolla/camera --mkdir=${HOME}/.local/share/com.jolla/camera --whitelist=${HOME}/.local/share/com.jolla/camera --mkdir=${HOME}/.config/com.jolla/camera --whitelist=${HOME}/.config/com.jolla/camera --dbus-user.own=com.jolla.camera --profile=/etc/sailjail/permissions/booster-silica-media.profile --profile=/etc/sailjail/permissions/jolla-camera-lockscreen.profile --profile=/etc/sailjail/permissions/Camera.permission --profile=/etc/sailjail/permissions/Audio.permission --profile=/etc/sailjail/permissions/Microphone.permission --profile=/etc/sailjail/permissions/Pictures.permission --profile=/etc/sailjail/permissions/Videos.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/Location.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera-lockscreen
│ ├─ 6517 /usr/bin/xdg-dbus-proxy --fd=4 --args=9
│ ├─ 6522 /usr/bin/firejail --quiet --template=OrganizationName:com.jolla --template=ApplicationName:email --private-bin=jolla-email --whitelist=/usr/share/jolla-email --whitelist=/usr/share/applications/jolla-email.desktop --whitelist=${HOME}/.local/share/jolla-email --whitelist=${HOME}/.config/jolla-email --whitelist=${HOME}/.cache/jolla-email --mkdir=${HOME}/.cache/com.jolla/email --whitelist=${HOME}/.cache/com.jolla/email --mkdir=${HOME}/.local/share/com.jolla/email --whitelist=${HOME}/.local/share/com.jolla/email --mkdir=${HOME}/.config/com.jolla/email --whitelist=${HOME}/.config/com.jolla/email --dbus-user.own=com.jolla.email --dbus-user.own=com.jolla.email.ui --profile=/etc/sailjail/permissions/booster-browser.profile --profile=/etc/sailjail/permissions/jolla-email.profile --profile=/etc/sailjail/permissions/Accounts.permission --profile=/etc/sailjail/permissions/Contacts.permission --profile=/etc/sailjail/permissions/Phone.permission --profile=/etc/sailjail/permissions/Email.permission --profile=/etc/sailjail/permissions/WebView.permission --profile=/etc/sailjail/permissions/Internet.permission --profile=/etc/sailjail/permissions/AppLaunch.permission --profile=/etc/sailjail/permissions/Calendar.permission --profile=/etc/sailjail/permissions/UserDirs.permission --profile=/etc/sailjail/permissions/RemovableMedia.permission --profile=/etc/sailjail/permissions/MediaIndexing.permission --profile=/etc/sailjail/permissions/CommunicationHistory.permission --profile=/etc/sailjail/permissions/Base.permission -- /usr/libexec/mapplauncherd/booster-browser --application=jolla-email
│ ├─ 6526 booster [silica-session]
│ ├─ 6770 /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera-lockscreen
│ ├─ 6778 /usr/libexec/mapplauncherd/booster-silica-media --application=jolla-camera
│ ├─ 6785 /usr/libexec/mapplauncherd/booster-browser --application=sailfish-browser
│ ├─ 6788 /usr/libexec/mapplauncherd/booster-browser --application=jolla-email
│ ├─ 6833 booster [browser]
│ ├─ 6834 booster [browser]
│ ├─20232 booster [silica-qt5]
│ ├─22946 /usr/bin/jolla-settings -prestart
│ ├─29805 booster [silica-media]
│ └─31972 booster [silica-media]
├─init.scope
│ └─1 /usr/lib/systemd/systemd --unit=default.target
└─system.slice
├─ofono.service
│ └─3308 /usr/sbin/ofonod -n --nobacktrace --noplugin=,he910,dun_gw_bluez5,hfp_bluez5,cdma_provision,isimodem,n900,u8500,qmimodem,gobi,cdmamodem,isiusb,nwmodem,ztemodem,iceramodem,huaweimodem,calypsomodem,swmodem,mbmmodem,hsomodem,ifxmodem,stemodem,dunmodem,hfpmodem,speedupmodem,phonesim,telitmodem,udev,udevng,bluez4,dun_gw_bluez4,hfp_ag_bluez4,hfp_bluez4,dun_gw_bluez5,hfp_bluez5
├─dummy_netd.service
│ └─3243 /usr/sbin/dummy_netd
├─systemd-udevd.service
│ └─687 /usr/lib/systemd/systemd-udevd
├─connman-vpn.service
│ └─5126 /usr/sbin/connman-vpnd -n
├─mce.service
│ └─2045 /usr/sbin/mce --systemd
├─ohmd.service
│ └─3128 /usr/sbin/ohmd --no-daemon --mlock=none
├─droid-hal-init.service
│ ├─ 3136 /sbin/droid-hal-init second_stage
│ ├─ 3139 /sbin/droid-hal-init subcontext u:r:vendor_init:s0 12
│ ├─ 3212 /system/bin/logd
│ ├─ 3213 /system/bin/servicemanager
│ ├─ 3214 /system/bin/hwservicemanager
│ ├─ 3215 /vendor/bin/vndservicemanager /dev/vndbinder
│ ├─ 3216 /odm/bin/qseecomd
│ ├─ 3218 /odm/bin/hw/android.hardware.keymaster@4.0-service-qti
│ ├─ 3337 /system/bin/hw/android.system.suspend@1.0-service
│ ├─ 3339 /vendor/bin/hw/android.hardware.boot@1.1-service
│ ├─ 3343 /vendor/bin/hw/android.hardware.configstore@1.1-service
│ ├─ 3345 /vendor/bin/hw/vendor.qti.hardware.display.allocator-service
│ ├─ 3585 /system/bin/tombstoned
│ ├─ 3589 /vendor/bin/hw/android.hardware.camera.provider@2.4-service_64
│ ├─ 3590 /system/bin/hw/android.hidl.allocator@1.0-service
│ ├─ 3591 /vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti
│ ├─ 3592 /vendor/bin/hw/android.hardware.cas@1.2-service
│ ├─ 3593 /vendor/bin/hw/android.hardware.gatekeeper@1.0-service
│ ├─ 3594 /vendor/bin/hw/android.hardware.gnss@2.1-service-qti
│ ├─ 3595 /vendor/bin/hw/android.hardware.health@2.0-service.sony
│ ├─ 3596 /vendor/bin/hw/android.hardware.light@2.0-service.sony
│ ├─ 3597 /vendor/bin/hw/android.hardware.memtrack@1.0-service
│ ├─ 3598 /vendor/bin/hw/android.hardware.nfc@1.2-service
│ ├─ 3599 /vendor/bin/hw/android.hardware.power@1.3-service.sony
│ ├─ 3600 /system/bin/sh -c sleep 3; /vendor/bin/hw/android.hardware.sensors@2.1-service.multihal
│ ├─ 3601 /vendor/bin/hw/android.hardware.thermal@1.0-service
│ ├─ 3602 /vendor/bin/hw/android.hardware.wifi@1.0-service
│ ├─ 3603 /odm/bin/hw/vendor.somc.hardware.miscta@1.0-service
│ ├─ 3604 /system/bin/credstore /data/misc/credstore
│ ├─ 3606 /system/bin/gpuservice
│ ├─ 3608 /odm/bin/mlog_qmi_service
│ ├─ 3609 /odm/bin/pd-mapper
│ ├─ 3611 /odm/bin/pm-service
│ ├─ 3612 /odm/bin/qrtr-ns -f
│ ├─ 3613 /odm/bin/sct_service
│ ├─ 3614 /odm/bin/ta_qmi_service
│ ├─ 3615 /odm/bin/tad_static /dev/block/bootdevice/by-name/TA 0,16
│ ├─ 3616 /odm/bin/tftp_server
│ ├─ 3662 /system/bin/gatekeeperd /data/misc/gatekeeper
│ ├─ 3665 /odm/bin/cnss-daemon -n -l
│ ├─ 3668 /odm/bin/dpmd
│ ├─ 3673 /odm/bin/hvdcp_opti
│ ├─ 3674 /usr/libexec/droid-hybris/system/bin/minimediaservice
│ ├─ 3675 /usr/libexec/droid-hybris/system/bin/minisfservice
│ ├─ 3677 /system/bin/drmserver
│ ├─ 3678 /system/bin/idmap2d
│ ├─ 3679 /system/bin/incidentd
│ ├─ 3683 /system/bin/keystore /data/misc/keystore
│ ├─ 3684 media.extractor aextractor
│ ├─ 3686 media.metrics diametrics
│ ├─ 3688 /odm/bin/adpl
│ ├─ 3689 /odm/bin/dpmd
│ ├─ 3721 media.codec hw/android.hardware.media.omx@1.0-service
│ ├─ 3740 /odm/bin/adsprpcd audiopd
│ ├─ 3761 /odm/bin/cnd
│ ├─ 3769 /odm/bin/qti
│ ├─ 3772 /odm/bin/dpmQmiMgr
│ ├─ 3773 /odm/bin/ims_rtp_daemon
│ ├─ 3774 /odm/bin/imsqmidaemon
│ ├─ 3775 /odm/bin/imsrcsd
│ ├─ 3777 /vendor/bin/ipacm
│ ├─ 3787 media.swcodec oid.media.swcodec/bin/mediaswcodec
│ ├─ 3789 /apex/com.android.os.statsd/bin/statsd
│ ├─ 3813 /system/bin/traced_probes
│ ├─ 3817 /system/bin/traced
│ ├─ 3828 /odm/bin/netmgrd
│ ├─ 3835 /odm/bin/hw/qcrild
│ ├─ 3844 /odm/bin/hw/qcrild -c 2
│ ├─ 3848 /odm/bin/rmt_storage
│ ├─ 3851 /odm/bin/imsdatadaemon
│ ├─ 3852 /odm/bin/adsprpcd
│ ├─ 3867 /odm/bin/adsprpcd sensorspd
│ ├─ 3996 /odm/bin/cdsprpcd
│ ├─ 4371 /vendor/bin/hw/android.hardware.sensors@2.1-service.multihal
│ ├─ 5693 /vendor/bin/hw/vendor.qti.hardware.display.composer-service
│ ├─ 7272 /odm/bin/msm_irqbalance -f /vendor/etc/msm_irqbalance.conf
│ ├─ 7273 /odm/bin/pm-proxy
│ └─31661 /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.1-service.sony
├─aliendalvik.service
│ ├─18374 com.shazam.android
│ ├─18389 org.thoughtcrime.securesms
│ ├─21009 /bin/sh /usr/libexec/appsupport/start-aliendalvik.sh
│ ├─21052 lxc-start --rcfile=/tmp/appsupport/aliendalvik/config --lxcpath=/tmp/appsupport -n aliendalvik -F
│ ├─21059 /system/bin/init second_stage
│ ├─21123 /system/bin/logd
│ ├─21124 /system/bin/servicemanager
│ ├─21125 /system/bin/hwservicemanager
│ ├─21126 /system/bin/vndservicemanager /dev/vndbinder
│ ├─21127 /system/bin/vold --blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0 --fsck_context=u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
│ ├─21224 /system/bin/hw/android.system.suspend@1.0-service
│ ├─21237 /system/bin/tombstoned
│ ├─21241 /apex/com.android.os.statsd/bin/statsd
│ ├─21242 /system/bin/netd
│ ├─21243 zygote64
│ ├─21244 zygote
│ ├─21245 /system/bin/hw/android.hardware.audio.service
│ ├─21246 /system/bin/hw/android.hardware.configstore@1.1-service
│ ├─21247 /system/bin/hw/android.hardware.drm@1.0-service
│ ├─21248 /system/bin/hw/android.hardware.graphics.composer@2.1-service
│ ├─21249 /system/bin/hw/android.hardware.thermal@1.0-service
│ ├─21250 /system/bin/hw/android.hidl.allocator@1.0-service
│ ├─21251 /system/bin/healthd
│ ├─21252 /system/bin/audioserver
│ ├─21253 /system/bin/credstore /data/misc/credstore
│ ├─21254 /system/bin/gpuservice
│ ├─21255 /system/bin/lmkd
│ ├─21260 /system/bin/traced_probes
│ ├─21261 /system/bin/traced
│ ├─21262 media.codec hw/android.hardware.media.omx@1.0-service
│ ├─21263 /system/bin/cameraserver
│ ├─21264 /system/bin/drmserver
│ ├─21265 /system/bin/idmap2d
│ ├─21266 /system/bin/incidentd
│ ├─21267 /system/bin/installd
│ ├─21268 /system/bin/iorapd
│ ├─21269 /system/bin/keystore /data/misc/keystore
│ ├─21270 media.extractor aextractor
│ ├─21271 media.metrics diametrics
│ ├─21272 /system/bin/mediaserver
│ ├─21273 /system/bin/storaged
│ ├─21274 media.swcodec oid.media.swcodec/bin/mediaswcodec
│ ├─21275 /system/bin/gatekeeperd /data/misc/gatekeeper
│ ├─21488 system_server
│ ├─21716 /system/bin/iorap.prefetcherd --input-fd 7 --output-fd 8
│ ├─21779 com.android.systemui
│ ├─21848 com.android.se
│ ├─21870 com.android.phone
│ ├─21884 android.ext.services
│ ├─21937 webview_zygote
│ ├─22024 com.android.providers.media.module
│ ├─22031 com.jolla.inputmethod.remote
│ ├─22089 android.process.acore
│ ├─22125 android.process.media
│ ├─22201 com.android.packageinstaller
│ ├─22232 com.android.permissioncontroller
│ ├─22350 com.android.providers.calendar
│ ├─22424 com.android.externalstorage
│ ├─22466 com.android.statementservice
│ ├─22602 org.fdroid.fdroid
│ ├─22664 app.organicmaps
│ ├─22767 cm.aptoide.pt
│ ├─22817 com.android.webview:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:0
│ ├─23189 org.telegram.messenger
│ ├─29151 com.spotify.music
│ └─29350 /system/bin/mdnsd
├─polkit.service
│ └─6565 /usr/libexec/polkit-1/polkitd --no-debug
├─bluetooth.service
│ └─4615 /usr/libexec/bluetooth/bluetoothd -n
├─sailfish-devicelock-encsfa-fpd.service
│ └─3280 /usr/lib64/qt5/plugins/devicelock/encsfa-fpd --daemon
├─wpa_supplicant.service
│ └─5293 /usr/sbin/wpa_supplicant -u -c /etc/wpa_supplicant/wpa_supplicant.conf -O/var/run/wpa_supplicant -u -P /var/run/wpa_supplicant.pid
├─systemd-journald.service
│ └─667 /usr/lib/systemd/systemd-journald
├─dsme.service
│ ├─2239 /usr/sbin/dsme -- -p /usr/lib64/dsme/startup.so --systemd
│ └─2254 /usr/sbin/dsme-server -p /usr/lib64/dsme/startup.so --systemd
├─sailfish-fpd.service
│ ├─22668 /usr/bin/sailfish-fpd --systemd
│ └─22669 /usr/libexec/sailfish-fpd/fpslave --log-to=syslog --log-level=4
├─connman.service
│ └─5118 /usr/sbin/connmand -n -W nl80211 --nobacktrace --noplugin=wifi
├─audiosystem-passthrough-dummy-af.service
│ └─2036 /usr/libexec/audiosystem-passthrough/audiosystem-passthrough --address dummy
├─quota_nld.service
│ └─3244 /usr/sbin/quota_nld --foreground --no-console --print-below
├─dbus-org.pacrunner.service
│ └─6151 /usr/sbin/pacrunner -n
├─sailjaild.service
│ └─5117 /usr/bin/sailjaild --systemd
├─bluebinder.service
│ └─3791 /usr/sbin/bluebinder
├─nfcd.service
│ └─3289 /usr/sbin/nfcd -o syslog
├─sensorfwd.service
│ └─3309 /usr/sbin/sensorfwd -c=/etc/sensorfw/primaryuse.conf --systemd --log-level=warning --no-magnetometer-bg-calibration
├─usb-moded.service
│ └─3127 /usr/sbin/usb_moded --systemd --force-syslog
├─systemd-ask-password-wall.service
│ └─5149 /usr/bin/systemd-tty-ask-password-agent --wall
├─udisks2.service
│ └─12029 /usr/libexec/udisks2/udisksd
├─dbus.service
│ └─2084 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
├─systemd-logind.service
│ └─3242 /usr/lib/systemd/systemd-logind
└─apkd.service
└─5139 /usr/sbin/apkd

View File

@ -0,0 +1,37 @@
From 3d6b0e30abb2c5629a503c5ef1e9b3bc36717361 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Wed, 20 Dec 2023 09:43:26 +0100
Subject: [PATCH 1/5] xdg-shell: disable pinging of windows
Pings are buggy in aliendalvik and cause surfaceflinger (which acts as the
wayland client) to crash, let's disable pinging windows.
---
src/wayland/meta-wayland-xdg-shell.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
index 268a5e7c7..d47fedbdd 100644
--- a/src/wayland/meta-wayland-xdg-shell.c
+++ b/src/wayland/meta-wayland-xdg-shell.c
@@ -1856,8 +1856,17 @@ meta_wayland_xdg_surface_ping (MetaWaylandShellSurface *shell_surface,
MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (shell_surface);
MetaWaylandXdgSurfacePrivate *priv =
meta_wayland_xdg_surface_get_instance_private (xdg_surface);
+MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (shell_surface);
+
+ MetaContext *context =
+ meta_wayland_compositor_get_context (surface->compositor);
+
+ MetaDisplay *display = meta_context_get_display (context);
+
+
+// xdg_wm_base_send_ping (priv->shell_client->resource, serial);
+ meta_display_pong_for_serial (display, serial);
- xdg_wm_base_send_ping (priv->shell_client->resource, serial);
}
static void
--
2.43.0

View File

@ -0,0 +1,65 @@
From 962fedd7b3dc2abdb2c988c6aa040b187d001995 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Wed, 20 Dec 2023 09:44:50 +0100
Subject: [PATCH 2/5] window: force geometry scale for alien windows to 1
---
src/core/window.c | 2 ++
src/wayland/meta-window-wayland.c | 11 +++++++++++
src/wayland/meta-window-wayland.h | 2 ++
3 files changed, 15 insertions(+)
diff --git a/src/core/window.c b/src/core/window.c
index 15d35864f..3ee584e46 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -7333,6 +7333,8 @@ meta_window_set_wm_class (MetaWindow *window,
window->res_name = g_strdup (wm_instance);
window->res_class = g_strdup (wm_class);
+ meta_window_wayland_update_geometry_scale (window);
+
g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_WM_CLASS]);
}
diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c
index f022fcf8d..b8d686f7d 100644
--- a/src/wayland/meta-window-wayland.c
+++ b/src/wayland/meta-window-wayland.c
@@ -1088,9 +1088,20 @@ meta_window_wayland_get_geometry_scale (MetaWindow *window)
if (!window->monitor)
return 1;
+ if (g_str_has_prefix (window->res_class, "alien_"))
+ return 1;
+
return get_window_geometry_scale_for_logical_monitor (window->monitor);
}
+void
+meta_window_wayland_update_geometry_scale (MetaWindow *window)
+{
+ MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window);
+
+ set_geometry_scale_for_window (wl_window, meta_window_wayland_get_geometry_scale (window));
+}
+
static void
calculate_position (MetaWaylandWindowConfiguration *configuration,
MtkRectangle *geometry,
diff --git a/src/wayland/meta-window-wayland.h b/src/wayland/meta-window-wayland.h
index a02224e55..d23d9ea90 100644
--- a/src/wayland/meta-window-wayland.h
+++ b/src/wayland/meta-window-wayland.h
@@ -43,6 +43,8 @@ void meta_window_wayland_finish_move_resize (MetaWindow *window,
int meta_window_wayland_get_geometry_scale (MetaWindow *window);
+void meta_window_wayland_update_geometry_scale (MetaWindow *window);
+
void meta_window_place_with_placement_rule (MetaWindow *window,
MetaPlacementRule *placement_rule);
--
2.43.0

View File

@ -0,0 +1,29 @@
From be9b9c35a5a5fb8476da760f097fcf24053661d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Wed, 20 Dec 2023 09:40:16 +0100
Subject: [PATCH 3/5] window-wayland: disable xdg_toplevel_minimize
Looks like the xdg toplevel implementation of aliendalvik uses this
request quite extensively to hide windows when they go out of focus.
That is not on user request and quite confusing, so force-disable the
whole minimization behavior, we don't really need it anyway.
---
src/wayland/meta-wayland-xdg-shell.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
index d47fedbdd..6a5044bbc 100644
--- a/src/wayland/meta-wayland-xdg-shell.c
+++ b/src/wayland/meta-wayland-xdg-shell.c
@@ -538,7 +538,7 @@ xdg_toplevel_set_minimized (struct wl_client *client,
if (!window)
return;
- meta_window_minimize (window);
+// meta_window_minimize (window);
}
static const struct xdg_toplevel_interface meta_wayland_xdg_toplevel_interface = {
--
2.43.0

View File

@ -0,0 +1,36 @@
From 32a1f557572f79b7cd0d4f24c38852282ec938c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Wed, 20 Dec 2023 09:48:36 +0100
Subject: [PATCH 4/5] wayland/text-input: small improvements which are
hopefully correct
---
src/wayland/meta-wayland-text-input.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/wayland/meta-wayland-text-input.c b/src/wayland/meta-wayland-text-input.c
index 7befbcdb0..8d67e29be 100644
--- a/src/wayland/meta-wayland-text-input.c
+++ b/src/wayland/meta-wayland-text-input.c
@@ -367,6 +367,8 @@ meta_wayland_text_input_set_focus (MetaWaylandTextInput *text_input,
wl_resource_for_each (resource, &text_input->focus_resource_list)
{
+g_warning("MUTTER sending text input leave to surface %p res %p", text_input->surface, text_input->surface->resource);
+if (text_input->surface->resource)
zwp_text_input_v3_send_leave (resource,
text_input->surface->resource);
}
@@ -740,8 +742,7 @@ meta_wayland_text_input_create_new_resource (MetaWaylandTextInput *text_input,
&meta_text_input_interface,
text_input, text_input_destructor);
- if (text_input->surface &&
- wl_resource_get_client (text_input->surface->resource) == client)
+ if (client_matches_focus (text_input, client))
{
wl_list_insert (&text_input->focus_resource_list,
wl_resource_get_link (text_input_resource));
--
2.43.0

View File

@ -0,0 +1,200 @@
From 02767d9d81bb167f7621189bcf3044910ab4daee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Wed, 20 Dec 2023 09:50:57 +0100
Subject: [PATCH 5/5] wayland/text-input: replace focus for aliendalvik with
another client
While there is wl_text_input v3 support in Aliendalvik, the implementation
is so broken it's impossible to use, even with workarounds in the
compositor.
Instead we don't use wl_text_input for Aliendalvik clients at all (we force
disable the protocol in libwayland) and trick aliendalvik into using the
dbus based protocol that's used on Sailfish OS. We shim this dbus
based protocol in the alienkeyboard-maliit-shim. This process also acts as
a wayland client for wl_text_input, and acts as a drop-in for wl_text_input
of the aliendalvik surface.
This patch implements a really crude "magic string"-based solution for
wayland clients to take over wl_text_input handling for the current surface.
This is a really bad hack, and it's quite insecure (every client knowing the
magic string can take over handling, not just the shimming script).
---
src/wayland/meta-wayland-text-input.c | 93 +++++++++++++++++++++++----
1 file changed, 81 insertions(+), 12 deletions(-)
diff --git a/src/wayland/meta-wayland-text-input.c b/src/wayland/meta-wayland-text-input.c
index 8d67e29be..0b55e2c25 100644
--- a/src/wayland/meta-wayland-text-input.c
+++ b/src/wayland/meta-wayland-text-input.c
@@ -81,6 +81,9 @@ struct _MetaWaylandTextInput
} preedit;
guint done_idle_id;
+
+ struct wl_resource *magic_resource;
+
};
struct _MetaWaylandTextInputFocus
@@ -306,6 +309,12 @@ meta_wayland_text_input_focus_new (MetaWaylandTextInput *text_input)
return CLUTTER_INPUT_FOCUS (focus);
}
+static void
+move_resources (struct wl_list *destination, struct wl_list *source)
+{
+ wl_list_insert_list (destination, source);
+ wl_list_init (source);
+}
static void
text_input_handle_focus_surface_destroy (struct wl_listener *listener,
@@ -313,17 +322,54 @@ text_input_handle_focus_surface_destroy (struct wl_listener *listener,
{
MetaWaylandTextInput *text_input = wl_container_of (listener, text_input,
surface_listener);
+g_warning("MUTTER: text input on focus surface destroy");
- meta_wayland_text_input_set_focus (text_input, NULL);
-}
+ text_input->pending_state = META_WAYLAND_PENDING_STATE_NONE;
+
+ if (text_input->surface)
+ {
+ if (!wl_list_empty (&text_input->focus_resource_list))
+ {
+ ClutterInputFocus *focus = text_input->input_focus;
+ ClutterInputMethod *input_method;
+ struct wl_resource *resource;
+
+ if (clutter_input_focus_is_focused (focus))
+ {
+ input_method = clutter_backend_get_input_method (clutter_get_default_backend ());
+ clutter_input_focus_reset (focus);
+ meta_wayland_text_input_focus_flush_done (focus);
+ clutter_input_method_focus_out (input_method);
+ }
+
+ wl_resource_for_each (resource, &text_input->focus_resource_list)
+ {
+ if (resource != text_input->magic_resource)
+ {
+ zwp_text_input_v3_send_leave (resource,
+ text_input->surface->resource);
+ }
+ }
+
+ move_resources (&text_input->resource_list,
+ &text_input->focus_resource_list);
+
+ if (text_input->magic_resource)
+ {
+ g_warning("INPUT: tehre's a magic resource though,readding");
+ wl_list_remove (wl_resource_get_link (text_input->magic_resource));
+ wl_list_insert (&text_input->focus_resource_list, wl_resource_get_link (text_input->magic_resource));
+ }
+
+ }
+
+ wl_list_remove (&text_input->surface_listener.link);
+ text_input->surface = NULL;
+ }
-static void
-move_resources (struct wl_list *destination, struct wl_list *source)
-{
- wl_list_insert_list (destination, source);
- wl_list_init (source);
}
+
static void
move_resources_for_client (struct wl_list *destination,
struct wl_list *source,
@@ -367,10 +413,12 @@ meta_wayland_text_input_set_focus (MetaWaylandTextInput *text_input,
wl_resource_for_each (resource, &text_input->focus_resource_list)
{
-g_warning("MUTTER sending text input leave to surface %p res %p", text_input->surface, text_input->surface->resource);
-if (text_input->surface->resource)
- zwp_text_input_v3_send_leave (resource,
- text_input->surface->resource);
+ g_warning("MUTTER sending text input leave to surface %p res %p", text_input->surface, text_input->surface->resource);
+ if (text_input->surface->resource && resource != text_input->magic_resource)
+ {
+ zwp_text_input_v3_send_leave (resource,
+ text_input->surface->resource);
+ }
}
move_resources (&text_input->resource_list,
@@ -400,6 +448,7 @@ if (text_input->surface->resource)
wl_resource_for_each (resource, &text_input->focus_resource_list)
{
+if (resource != text_input->magic_resource)
zwp_text_input_v3_send_enter (resource, surface->resource);
}
}
@@ -413,6 +462,12 @@ text_input_destructor (struct wl_resource *resource)
g_hash_table_remove (text_input->resource_serials, resource);
wl_list_remove (wl_resource_get_link (resource));
+
+ if (text_input->magic_resource == resource)
+ {
+ g_warning("INPUT: The magic resource got destroyed, unsettng");
+ text_input->magic_resource = NULL;
+ }
}
static void
@@ -429,6 +484,11 @@ client_matches_focus (MetaWaylandTextInput *text_input,
if (!text_input->surface)
return FALSE;
+ if (text_input->magic_resource &&
+ client == wl_resource_get_client (text_input->magic_resource))
+ return TRUE;
+
+
return client == wl_resource_get_client (text_input->surface->resource);
}
@@ -467,6 +527,14 @@ text_input_set_surrounding_text (struct wl_client *client,
{
MetaWaylandTextInput *text_input = wl_resource_get_user_data (resource);
+ if (g_strcmp0 (text, "magictext") == 0)
+ {
+ g_warning("INPUT GOT THE MAGIC TEXT, inserting us into focus list");
+ text_input->magic_resource = resource;
+ wl_list_remove (wl_resource_get_link (text_input->magic_resource));
+ wl_list_insert (&text_input->focus_resource_list, wl_resource_get_link (text_input->magic_resource));
+ }
+
if (!client_matches_focus (text_input, client))
return;
@@ -717,6 +785,7 @@ meta_wayland_text_input_new (MetaWaylandSeat *seat)
void
meta_wayland_text_input_destroy (MetaWaylandTextInput *text_input)
{
+g_warning("MUTTER text input itself destroy, setting to NULL");
meta_wayland_text_input_set_focus (text_input, NULL);
g_object_unref (text_input->input_focus);
g_hash_table_destroy (text_input->resource_serials);
@@ -746,7 +815,7 @@ meta_wayland_text_input_create_new_resource (MetaWaylandTextInput *text_input,
{
wl_list_insert (&text_input->focus_resource_list,
wl_resource_get_link (text_input_resource));
-
+if (text_input_resource != text_input->magic_resource)
zwp_text_input_v3_send_enter (text_input_resource,
text_input->surface->resource);
}
--
2.43.0

View File

@ -0,0 +1,73 @@
From 94b98f0e8e05e0fcd6398eefd15397f61b9acc85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Wed, 20 Dec 2023 09:30:02 +0100
Subject: [PATCH 1/2] server: don't be so angry about client errors
It seems the aliendalvik sometimes doesn't comply to the protocols
and cause protocol errors in libwayland. Things work fine if we just
ignore them instead of terminating the connection to the compositor,
so be a bit more gentle about those errors.
---
src/wayland-server.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/src/wayland-server.c b/src/wayland-server.c
index e784ef6..b3a29eb 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -381,10 +381,12 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
resource = wl_map_lookup(&client->objects, p[0]);
resource_flags = wl_map_lookup_flags(&client->objects, p[0]);
if (resource == NULL) {
- wl_resource_post_error(client->display_resource,
- WL_DISPLAY_ERROR_INVALID_OBJECT,
- "invalid object %u", p[0]);
- break;
+// wl_resource_post_error(client->display_resource,
+// WL_DISPLAY_ERROR_INVALID_OBJECT,
+// "invalid object %u", p[0]);
+ wl_log("DISCARDING request from buggy client: invalid object %u\n", p[0]);
+ wl_connection_consume(connection, size);
+ goto next;
}
object = &resource->object;
@@ -421,14 +423,19 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
break;
} else if (closure == NULL ||
wl_closure_lookup_objects(closure, &client->objects) < 0) {
- wl_resource_post_error(client->display_resource,
- WL_DISPLAY_ERROR_INVALID_METHOD,
- "invalid arguments for %s#%u.%s",
- object->interface->name,
- object->id,
- message->name);
+// wl_resource_post_error(client->display_resource,
+// WL_DISPLAY_ERROR_INVALID_METHOD,
+// "invalid arguments for %s#%u.%s",
+// object->interface->name,
+// object->id,
+// message->name);
+ wl_log("DISCARDING: invalid arguments for %s#%u.%s\n",
+ object->interface->name,
+ object->id,
+ message->name);
+
wl_closure_destroy(closure);
- break;
+ goto next;
}
log_closure(resource, closure, false);
@@ -446,7 +453,7 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
if (client->error)
break;
-
+next:
len = wl_connection_pending_input(connection);
}
--
2.43.0

View File

@ -0,0 +1,53 @@
From a76eb21146fe9c24373eacd0bce41eaac73e4d19 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Wed, 20 Dec 2023 09:28:15 +0100
Subject: [PATCH 2/2] don't offer zwp_text_input_v3 to alien clients
their implementation is extremely buggy, we want the thing to connect to
maliit via dbus instead for text input, and it will only do that if it
doesn't get offered zwp_text_input.
So (very very crudely) detect that the client is aliendalvik and then
remove the zwp_text_input protocol from the ones the server offers.
---
src/wayland-server.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/src/wayland-server.c b/src/wayland-server.c
index b3a29eb..f61cf5f 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -212,6 +212,7 @@ handle_array(struct wl_resource *resource, uint32_t opcode,
{
struct wl_closure *closure;
struct wl_object *object = &resource->object;
+ static const char *disable_protocol = NULL;
if (resource->client->error)
return;
@@ -229,6 +230,22 @@ handle_array(struct wl_resource *resource, uint32_t opcode,
return;
}
+
+ if (resource->client->uid >= 500000) {
+ fprintf(stderr, "client has high UID %d, assuming it's aliendalvik", resource->client->uid);
+ disable_protocol = "zwp_text_input_manager_v3";
+ } else {
+ disable_protocol = "";
+ }
+
+ if (strcmp (object->interface->name, "wl_registry") == 0 &&
+ strcmp (closure->message->name, "global") == 0 &&
+ strcmp (closure->args[1].s, disable_protocol) == 0) {
+ fprintf(stderr, "found disabled proto queu %s\n", closure->args[1].s);
+ wl_closure_destroy(closure);
+ return;
+ }
+
log_closure(resource, closure, true);
if (send_func(closure, resource->client->connection))
--
2.43.0

110
running.txt 100644
View File

@ -0,0 +1,110 @@
- create overlayfs for system img (as root)
mkdir /tmp/from
mkdir /tmp/to
mkdir /tmp/work
mount /opt/alien/system.img /tmp/from
# if for some reason mount didn't work, go with this (and skip the mount -t overlay)
unsquashfs /opt/alien/system.img
mv squashfs-root/ /opt/alien/rootfs
mount -t overlay -o lowerdir=/tmp/from,upperdir=/tmp/to,workdir=/tmp/work overlay /opt/alien/rootfs
- edit init file in rootfs to comment out memfd override
nano /opt/alien/rootfs/system/etc/init/hw/init.rc
# comment out this line
setprop sys.use_memfd false
- chmod device files (as root)
# TODO: if there's no binder devices, either create using binder_linux
modprobe binder_linux devices=
# or binderfs module (and link whatever devices are available)
mkdir /dev/binderfs
mount -t binder binder /dev/binderfs
ln -s /dev/binderfs/anbox-binder /dev/binder
ln -s /dev/binderfs/anbox-hwbinder /dev/hwbinder
ln -s /dev/binderfs/anbox-vndbinder /dev/vndbinder
chmod 777 /dev/binder
chmod 777 /dev/hwbinder
chmod 777 /dev/vndbinder
chmod 777 /dev/dri/card0
- chmod wayland socket
chown YOUR_USER:appsupport-wayland /run/user/YOUR_UID/wayland-0
chmod 775 /run/user/YOUR_UID/wayland-0
- setup the waydroid vendor blob with another overlayfs (as root)
mkdir /tmp/from2
mkdir /tmp/to2
mkdir /tmp/work2
mkdir /tmp/waydroid-vendor
mount waydroid/vendor.img /tmp/from2
mount -t overlay -o lowerdir=/tmp/from2,upperdir=/tmp/to2,workdir=/tmp/work2 overlay /tmp/waydroid-vendor
# remove gatekeeper, that seems to be the only HAL that's loaded (and it also crashes)
rm /tmp/waydroid-vendor/lib64/hw/android.hardware.gatekeeper@1.0-impl.so
rm /tmp/waydroid-vendor/lib/hw/android.hardware.gatekeeper@1.0-impl.so
- replace webview with waydroid one
mkdir /tmp/waydroid-system
mount waydroid/system.img /tmp/waydroid-system
cp /tmp/waydroid-system/system/product/app/webview/webview.apk /opt/alien/rootfs/system/app/webview/webview.apk
- optional: copy overlay for gesture navigation from waydroid into alien (as root)
cp -r /tmp/waydroid-system/system/product/overlay /opt/alien/rootfs/product/
- set data dir in LXC config
nano /tmp/appsupport/aliendalvik/10-bsp_config
# set __DATA_DIR__ to /opt/alien/data
- set UID in LXC config
nano /tmp/appsupport/aliendalvik/10-bsp_config
# set __UID__ to your UID in this line
lxc.mount.entry = /run/user/__UID__/wayland-0 run/display/wayland-0 none bind,nodev,nosuid,create=file 0 0
nano /tmp/appsupport/aliendalvik/20-privilege_config
# set __UID__ to your UID (this maps your UID to UID 100000 inside the container)
lxc.idmap = u 100000 __UID__ 1
lxc.idmap = g 100000 __UID__ 1
- setup networking for container
/usr/lib/lxc/lxc-net start
- now check if lxc wants to startup
/usr/bin/lxc-start --rcfile=/tmp/appsupport/aliendalvik/config --lxcpath=/tmp/appsupport/aliendalvik -n aliendalvik -F
# shouldn't error out immediately, but should crash after like 30 seconds
# there should be stuff in /opt/alien/data now, and logs in /opt/alien/data/logcats/log
# if you got to this point, you're very close :)
- setup at least 7 ssh sessions on the device to run all the daemons
- get connman shim up and running (as root)
gjs shimming/connman/mock.js
- get maliit shim up and running (as user)
WAYLAND_DEBUG=1 python shimming/maliit/maliit-shim.py
- start the systemd service that runs the container (as root)
systemctl start aliendalvik
- right after that start integration daemons (as user)
alienaudioservice -d /dev/binder -n /dev/vndbinder -w /dev/hwbinder -p pulseaudio --verbose
QT_DEBUG_PLUGINS=1 QTCONTACTS_MANAGER_OVERRIDE=folks QT_LOGGING_RULES="*.debug=true" apkd-bridge
QT_LOGGING_RULES="*.debug=true" apkd-bridge-user
QDBUS_DEBUG=1 alienkeyboardservice
- things are running now, android settings app should appear on your app grid
if it doesn't, but you can see it in .local/share/applications/, relogin for shell to pick it up
- can now install fdroid via (as user)
wget https://f-droid.org/F-Droid.apk
apkd-install F-Droid.apk
- optional: run commands inside the android container from alien-post-startup.sh script
- optional: use gesture navigation in android to have swipe-back gesture
# go into container and disable -> enable the overlay
lxc-attach --name=aliendalvik --lxcpath=/tmp/appsupport -- /system/bin/sh
cmd overlay disable com.android.internal.systemui.navbar.gestural
cmd overlay enable com.android.internal.systemui.navbar.gestural
notes:
- when apps don't draw after startup, touch the screen to trigger the app to start drawing

View File

@ -0,0 +1,40 @@
- enable systemd-resolved to actually answer queries on port 53 so that android can ask dns queries
# add this line to /etc/systemd/resolved.conf
DNSStubListenerExtra=127.0.0.1
# then restart systemd-resolved
sudo systemctl restart systemd-resolved
- setup users/groups needed for aliendalvik
# create user+group that gets permissions for wayland-socket
useradd -u 501000 -U appsupport-wayland
groupmod -g 501000 appsupport-wayland
# create appsupport-root user with UID and GID 500000
useradd -u 500000 -U appsupport-root
groupmod -g 500000 appsupport-root
# own data directory
mkdir -p /opt/alien/data/
chown -R appsupport-root:appsupport-root /opt/alien/data/
# set subuids (no clue how correct this actually is, but works)
# might have to create those files
touch /etc/subuid
touch /etc/subgid
usermod --add-subuids 100000-100000 --add-subgids 100000-100000 root
usermod --add-subuids 100000-100000 --add-subgids 100000-100000 appsupport-root
usermod --add-subuids 500000-599999 --add-subgids 500000-599999 root
usermod --add-subuids 500000-599999 --add-subgids 500000-599999 appsupport-root
usermod --add-subuids 600001-700000 --add-subgids 600001-700000 root
usermod --add-subuids 600001-700000 --add-subgids 600001-700000 appsupport-root
- symlink from /usr/lib to /usr/lib64 (alienaudioservice hardcodes some paths to lib64 :/)
ln -s /usr/lib /usr/lib64
- make sure pulseaudio is used instead of pipewire (pipewire for some reason stops working after a few minutes)
systemctl --user mask pipewire
systemctl --user disable --now pipewire.socket
systemctl --user enable --now pulseaudio
- modify alienkeyboardservice binary to use the correct binder device
use a hex editor to replace the NULL-terminated string /dev/puddlejumper with /dev/binder

View File

@ -0,0 +1,24 @@
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<policy context="default">
<allow own="org.maemo.resource.manager"/>
<allow send_interface="org.maemo.resource.client"/>
<allow send_interface="org.maemo.resource.manager"/>
</policy>
<policy context="default">
<allow own="org.nemomobile.Route.Manager"/>
<allow send_interface="org.nemomobile.Route.Manager"/>
</policy>
<policy context="default">
<allow own="com.nokia.NonGraphicFeedback1.Backend"/>
<allow send_interface="com.nokia.NonGraphicFeedback1"/>
</policy>
<policy context="default">
<allow own="com.nokia.mce"/>
<allow send_interface="com.nokia.mce.request"/>
</policy>
</busconfig>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
[Unit]
Description=Aliendalvik audio DBus shim provider
After=dbus.socket graphical-session.target
Requires=dbus.socket graphical-session.target
[Service]
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/bin/alienaudio-shim

View File

@ -0,0 +1,443 @@
#!/usr/bin/python3
import os
import asyncio
from pywayland.client import Display
from pywayland.protocol.wayland import (
WlSeat,
WlShell,
WlShm,
)
from protocols.text_input_unstable_v3 import ZwpTextInputManagerV3
import dbussy as dbus
from dbussy import \
DBUS, \
Introspection
import ravel
socket_path = os.environ["XDG_RUNTIME_DIR"] + "/maliit-server"
if not os.path.exists(socket_path):
os.makedirs(socket_path)
my_socket_name = "unix:path=" + socket_path + "/dbus-socket"
my_interface_name = "com.meego.inputmethod.uiserver1"
client_interface_name = "com.meego.inputmethod.inputcontext1"
idle_timeout = 15 # seconds, short value for testing
ClientInterface = ravel.def_proxy_interface \
(
ravel.INTERFACE.CLIENT,
name = "ClientInterface",
introspected =
Introspection.Interface
(
name = client_interface_name,
methods =
[
Introspection.Interface.Method
(
name = "setLanguage",
args =
[
Introspection.Interface.Method.Arg
(
name = "lang",
type = dbus.BasicType(dbus.TYPE.STRING),
direction = Introspection.DIRECTION.IN
),
],
),
Introspection.Interface.Method
(
name = "setRedirectKeys",
args =
[
Introspection.Interface.Method.Arg
(
name = "redi",
type = dbus.BasicType(dbus.TYPE.BOOLEAN),
direction = Introspection.DIRECTION.IN
),
],
),
Introspection.Interface.Method
(
name = "updateInputMethodArea",
args =
[
Introspection.Interface.Method.Arg
(
name = "x",
type = dbus.BasicType(dbus.TYPE.INT32),
direction = Introspection.DIRECTION.IN
),
Introspection.Interface.Method.Arg
(
name = "y",
type = dbus.BasicType(dbus.TYPE.INT32),
direction = Introspection.DIRECTION.IN
),
Introspection.Interface.Method.Arg
(
name = "width",
type = dbus.BasicType(dbus.TYPE.INT32),
direction = Introspection.DIRECTION.IN
),
Introspection.Interface.Method.Arg
(
name = "height",
type = dbus.BasicType(dbus.TYPE.INT32),
direction = Introspection.DIRECTION.IN
),
],
),
Introspection.Interface.Method
(
name = "commitString",
args =
[
Introspection.Interface.Method.Arg
(
name = "string",
type = dbus.BasicType(dbus.TYPE.STRING),
direction = Introspection.DIRECTION.IN
),
Introspection.Interface.Method.Arg
(
name = "replacementStart",
type = dbus.BasicType(dbus.TYPE.INT32),
direction = Introspection.DIRECTION.IN
),
Introspection.Interface.Method.Arg
(
name = "replacementLength",
type = dbus.BasicType(dbus.TYPE.INT32),
direction = Introspection.DIRECTION.IN
),
Introspection.Interface.Method.Arg
(
name = "cursorPos",
type = dbus.BasicType(dbus.TYPE.INT32),
direction = Introspection.DIRECTION.IN
),
],
),
],
),
is_async = True
)
useless_objects_bus_name = "org.maliit.server"
useless_objects_iface_name = "org.maliit.Server.Address"
@ravel.interface(ravel.INTERFACE.SERVER, name = useless_objects_iface_name)
class UselessObjectServer :
__slots__ = ("bus",)
def __init__(self, bus) :
self.bus = bus
#end __init__
@ravel.propgetter \
(
name = "address",
type = dbus.BasicType(dbus.TYPE.STRING),
change_notification = dbus.Introspection.PROP_CHANGE_NOTIFICATION.NEW_VALUE,
)
def get_address(self) :
return "unix:path=" + socket_path + "/dbus-socket"
#end get_address
object_created = ravel.def_signal_stub \
(
name = "object_created",
in_signature = [],
)
object_deleted = ravel.def_signal_stub \
(
name = "object_deleted",
in_signature = [],
)
#end UselessObjectServer
background_tasks = set()
def run_in_background(invocation):
task = asyncio.create_task(invocation)
background_tasks.add(task)
task.add_done_callback(background_tasks.discard)
@ravel.interface(ravel.INTERFACE.SERVER, name = my_interface_name)
class DirectConnectServer :
__slots__ = ("bus", "_last_request", "intf", "wayland")
def __init__(self, bus, wayland) :
self.bus = bus
self.wayland = wayland
self.intf = ClientInterface \
(
connection = self.bus.connection,
dest = "com.meego.inputmethod.inputcontext1", # no D-Bus daemon to care
)["/com/meego/inputmethod/inputcontext"]
#end __init__
# @ravel.method \
# (
# name = "reset",
# in_signature = "",
# out_signature = "",
# arg_keys = [],
# )
# def reset(self) :
# print("got reset() message")
# #end reset
@ravel.method \
(
name = "updateWidgetInformation",
in_signature = "a{sv}b",
out_signature = "",
arg_keys = ["vardict", "boolean"],
)
def updateWidgetInformation(self, vardict, boolean) :
# print("got updateWidgetInformation() message")
# print(vardict)
surrounding_text = vardict["surroundingText"][1]
cursor_position = vardict["cursorPosition"][1]
self.wayland["text_input"].set_surrounding_text(surrounding_text, cursor_position, cursor_position)
self.wayland["text_input"].commit()
self.wayland["display"].flush()
#end updateWidgetInformation
# @ravel.method \
# (
# name = "activateContext",
# in_signature = "",
# out_signature = "",
# arg_keys = [],
# )
# def activateContext(self) :
# print("got activateContext() message")
# #end activateContext
@ravel.method \
(
name = "appOrientationChanged",
in_signature = "i",
out_signature = "",
arg_keys = ["orientation"],
)
def appOrientationChanged(self, orientation) :
print("got appOrientationChanged() message")
#end appOrientationChanged
@ravel.method \
(
name = "showInputMethod",
in_signature = "",
out_signature = "",
arg_keys = [],
)
def showInputMethod(self) :
# print("got showInputMethod() message, setting input size")
self.wayland["text_input"].set_surrounding_text("magictext", 0, 0)
self.wayland["display"].flush()
self.wayland["text_input"].set_content_type(0, 0)
self.wayland["text_input"].enable()
self.wayland["text_input"].commit()
self.wayland["display"].flush()
run_in_background(self.intf.updateInputMethodArea(0, 1360, 1080, 670))
#end showInputMethod
@ravel.method \
(
name = "hideInputMethod",
in_signature = "",
out_signature = "",
arg_keys = [],
)
def hideInputMethod(self) :
# print("got hideInputMethod() message, setting input size")
self.wayland["text_input"].disable()
self.wayland["text_input"].commit()
self.wayland["display"].flush()
run_in_background(self.intf.updateInputMethodArea(0, 0, 0, 0))
#end hideInputMethod
# @ravel.method \
# (
# name = "setGlobalCorrectionEnabled",
# in_signature = "b",
# out_signature = "",
# arg_keys = ["enabled"],
# )
# def setGlobalCorrectionEnabled(self, enabled) :
# print("got setGlobalCorrectionEnabled() message")
# #end setGlobalCorrectionEnabled
# @ravel.method \
# (
# name = "setDetectableAutoRepeat",
# in_signature = "b",
# out_signature = "",
# arg_keys = ["detectable"],
# )
# def setDetectableAutoRepeat(self, detectable) :
# print("got setDetectableAutoRepeat() message")
# #end setDetectableAutoRepeat
#end DirectConnectServer
def handle_enter(text_input, surface):
# print("got enter event for surface ")
return 0
def handle_leave(text_input, surface):
# print("got leave event for surface ")
return 0
def handle_preedit_string(text_input, string, cursor_begin, cursor_end):
# print("got preedit str ")
return 0
def handle_commit_string(text_input, string):
# print("commit str: " + string + " sending to dbus")
wayland = text_input.user_data
run_in_background(wayland["dbus_server"].intf.commitString(string, 0, 0, 0))
return 0
def handle_delete_surrounding_text(text_input, before_len, after_len):
# print("got delete surrounding text")
return 0
def handle_done(text_input, serial):
# print("got a done event serial " + str(serial))
return 0
def handle_seat_capabilities(wl_seat, capabilities):
wayland = wl_seat.user_data
if "text_input_manager" not in wayland:
raise Exception("text_input_manager protocol is not supported by compositor")
wayland["text_input"] = wayland["text_input_manager"].get_text_input(wl_seat)
wayland["text_input"].user_data = wayland
wayland["text_input"].dispatcher["enter"] = handle_enter
wayland["text_input"].dispatcher["leave"] = handle_leave
# wayland["text_input"].dispatcher["preedit_string"] = handle_preedit_string
wayland["text_input"].dispatcher["commit_string"] = handle_commit_string
wayland["text_input"].dispatcher["delete_surrounding_text"] = handle_delete_surrounding_text
wayland["text_input"].dispatcher["done"] = handle_done
wayland["display"].flush()
return 1
def handle_registry_global(wl_registry, id_num, iface_name, version):
wayland = wl_registry.user_data
if iface_name == "wl_seat":
wayland["seat"] = wl_registry.bind(id_num, WlSeat, version)
wayland["seat"].user_data = wayland
wayland["seat"].dispatcher["capabilities"] = handle_seat_capabilities
elif iface_name == "zwp_text_input_manager_v3":
wayland["text_input_manager"] = wl_registry.bind(id_num, ZwpTextInputManagerV3, version)
wayland["display"].flush()
return 1
async def setup_dbus(wayland):
listen = ravel.Server(address = my_socket_name)
clients = {}
@ravel.signal \
(
in_signature = "",
bus_keyword = "conn"
)
def connection_terminated(conn) :
# handler for signal sent by libdbus when client disconnects.
print("connection from PID %s terminated\n" % conn.connection.unix_process_id)
del clients[id(conn)]
#end connection_terminated
while True :
conn = await listen.await_new_connection(timeout = idle_timeout / 3)
if conn != None :
print("new connection on DBus")
server = DirectConnectServer(conn, wayland)
wayland["dbus_server"] = server
conn.register \
(
path = "/com/meego/inputmethod/uiserver1",
fallback = True,
interface = server
)
conn.listen_signal \
(
path = "/",
fallback = True,
interface = DBUS.INTERFACE_LOCAL,
name = "Disconnected",
func = connection_terminated
)
clients[id(conn)] = conn
await server.intf.setLanguage('')
#end if
#end while
async def run_dbus_loop(wayland):
server = await setup_dbus(wayland)
display = Display()
display.connect()
loop = asyncio.new_event_loop()
loop.add_reader(display.get_fd(), lambda: display.dispatch(block=True))
wayland = {}
wayland["display"] = display
wayland["registry"] = wayland["display"].get_registry()
wayland["registry"].user_data = wayland
wayland["registry"].dispatcher["global"] = handle_registry_global
wayland["display"].flush()
bus = ravel.session_bus()
bus.attach_asyncio(loop)
bus.request_name \
(
bus_name = useless_objects_bus_name,
flags = DBUS.NAME_FLAG_DO_NOT_QUEUE
)
bus.register \
(
path = "/org/maliit/server",
fallback = True,
interface = UselessObjectServer(bus)
)
loop.create_task(run_dbus_loop(wayland))
loop.run_forever()

View File

@ -0,0 +1,10 @@
[Unit]
Description=Aliendalvik keyboard DBus shim provider
After=dbus.socket graphical-session.target
Requires=dbus.socket graphical-session.target
[Service]
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/bin/alienkeyboard-maliit-shim/alienkeyboard-maliit-shim

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2021 Emmanuel Gil Peyrot
# Copyright © 2022 Xaver Hugl
#
# 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.
from .wp_content_type_manager_v1 import WpContentTypeManagerV1 # noqa: F401
from .wp_content_type_v1 import WpContentTypeV1 # noqa: F401

View File

@ -0,0 +1,107 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2021 Emmanuel Gil Peyrot
# Copyright © 2022 Xaver Hugl
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSurface
from .wp_content_type_v1 import WpContentTypeV1
class WpContentTypeManagerV1(Interface):
"""Surface content type manager
This interface allows a client to describe the kind of content a surface
will display, to allow the compositor to optimize its behavior for it.
Warning! The protocol described in this file is currently in the testing
phase. Backward compatible changes may be added together with the
corresponding interface version bump. Backward incompatible changes can
only be done by creating a new major version of the extension.
"""
name = "wp_content_type_manager_v1"
version = 1
class error(enum.IntEnum):
already_constructed = 0
class WpContentTypeManagerV1Proxy(Proxy[WpContentTypeManagerV1]):
interface = WpContentTypeManagerV1
@WpContentTypeManagerV1.request()
def destroy(self) -> None:
"""Destroy the content type manager object
Destroy the content type manager. This doesn't destroy objects created
with the manager.
"""
self._marshal(0)
self._destroy()
@WpContentTypeManagerV1.request(
Argument(ArgumentType.NewId, interface=WpContentTypeV1),
Argument(ArgumentType.Object, interface=WlSurface),
)
def get_surface_content_type(self, surface: WlSurface) -> Proxy[WpContentTypeV1]:
"""Create a new toplevel decoration object
Create a new content type object associated with the given surface.
Creating a :class:`~pywayland.protocol.content_type_v1.WpContentTypeV1`
from a :class:`~pywayland.protocol.wayland.WlSurface` which already has
one attached is a client error: already_constructed.
:param surface:
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:returns:
:class:`~pywayland.protocol.content_type_v1.WpContentTypeV1`
"""
id = self._marshal_constructor(1, WpContentTypeV1, surface)
return id
class WpContentTypeManagerV1Resource(Resource):
interface = WpContentTypeManagerV1
class WpContentTypeManagerV1Global(Global):
interface = WpContentTypeManagerV1
WpContentTypeManagerV1._gen_c()
WpContentTypeManagerV1.proxy_class = WpContentTypeManagerV1Proxy
WpContentTypeManagerV1.resource_class = WpContentTypeManagerV1Resource
WpContentTypeManagerV1.global_class = WpContentTypeManagerV1Global

View File

@ -0,0 +1,110 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2021 Emmanuel Gil Peyrot
# Copyright © 2022 Xaver Hugl
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class WpContentTypeV1(Interface):
"""Content type object for a surface
The content type object allows the compositor to optimize for the kind of
content shown on the surface. A compositor may for example use it to set
relevant drm properties like "content type".
The client may request to switch to another content type at any time. When
the associated surface gets destroyed, this object becomes inert and the
client should destroy it.
"""
name = "wp_content_type_v1"
version = 1
class type(enum.IntEnum):
none = 0
photo = 1
video = 2
game = 3
class WpContentTypeV1Proxy(Proxy[WpContentTypeV1]):
interface = WpContentTypeV1
@WpContentTypeV1.request()
def destroy(self) -> None:
"""Destroy the content type object
Switch back to not specifying the content type of this surface. This is
equivalent to setting the content type to none, including double
buffering semantics. See set_content_type for details.
"""
self._marshal(0)
self._destroy()
@WpContentTypeV1.request(
Argument(ArgumentType.Uint),
)
def set_content_type(self, content_type: int) -> None:
"""Specify the content type
Set the surface content type. This informs the compositor that the
client believes it is displaying buffers matching this content type.
This is purely a hint for the compositor, which can be used to adjust
its behavior or hardware settings to fit the presented content best.
The content type is double-buffered state, see
:func:`WlSurface.commit()
<pywayland.protocol.wayland.WlSurface.commit>` for details.
:param content_type:
the content type
:type content_type:
`ArgumentType.Uint`
"""
self._marshal(1, content_type)
class WpContentTypeV1Resource(Resource):
interface = WpContentTypeV1
class WpContentTypeV1Global(Global):
interface = WpContentTypeV1
WpContentTypeV1._gen_c()
WpContentTypeV1.proxy_class = WpContentTypeV1Proxy
WpContentTypeV1.resource_class = WpContentTypeV1Resource
WpContentTypeV1.global_class = WpContentTypeV1Global

View File

@ -0,0 +1,24 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2018 The Chromium Authors
# Copyright 2023 Simon Ser
#
# 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.
from .wp_cursor_shape_device_v1 import WpCursorShapeDeviceV1 # noqa: F401
from .wp_cursor_shape_manager_v1 import WpCursorShapeManagerV1 # noqa: F401

View File

@ -0,0 +1,154 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2018 The Chromium Authors
# Copyright 2023 Simon Ser
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class WpCursorShapeDeviceV1(Interface):
"""Cursor shape for a device
This interface advertises the list of supported cursor shapes for a device,
and allows clients to set the cursor shape.
"""
name = "wp_cursor_shape_device_v1"
version = 1
class shape(enum.IntEnum):
default = 1
context_menu = 2
help = 3
pointer = 4
progress = 5
wait = 6
cell = 7
crosshair = 8
text = 9
vertical_text = 10
alias = 11
copy = 12
move = 13
no_drop = 14
not_allowed = 15
grab = 16
grabbing = 17
e_resize = 18
n_resize = 19
ne_resize = 20
nw_resize = 21
s_resize = 22
se_resize = 23
sw_resize = 24
w_resize = 25
ew_resize = 26
ns_resize = 27
nesw_resize = 28
nwse_resize = 29
col_resize = 30
row_resize = 31
all_scroll = 32
zoom_in = 33
zoom_out = 34
class error(enum.IntEnum):
invalid_shape = 1
class WpCursorShapeDeviceV1Proxy(Proxy[WpCursorShapeDeviceV1]):
interface = WpCursorShapeDeviceV1
@WpCursorShapeDeviceV1.request()
def destroy(self) -> None:
"""Destroy the cursor shape device
Destroy the cursor shape device.
The device cursor shape remains unchanged.
"""
self._marshal(0)
self._destroy()
@WpCursorShapeDeviceV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def set_shape(self, serial: int, shape: int) -> None:
"""Set device cursor to the shape
Sets the device cursor to the specified shape. The compositor will
change the cursor image based on the specified shape.
The cursor actually changes only if the input device focus is one of
the requesting client's surfaces. If any, the previous cursor image
(surface or shape) is replaced.
The "shape" argument must be a valid enum entry, otherwise the
invalid_shape protocol error is raised.
This is similar to the :func:`WlPointer.set_cursor()
<pywayland.protocol.wayland.WlPointer.set_cursor>` and
:func:`ZwpTabletToolV2.set_cursor()
<pywayland.protocol.tablet_unstable_v2.ZwpTabletToolV2.set_cursor>`
requests, but this request accepts a shape instead of contents in the
form of a surface. Clients can mix set_cursor and set_shape requests.
The serial parameter must match the latest :func:`WlPointer.enter()
<pywayland.protocol.wayland.WlPointer.enter>` or
:func:`ZwpTabletToolV2.proximity_in()
<pywayland.protocol.tablet_unstable_v2.ZwpTabletToolV2.proximity_in>`
serial number sent to the client. Otherwise the request will be
ignored.
:param serial:
serial number of the enter event
:type serial:
`ArgumentType.Uint`
:param shape:
:type shape:
`ArgumentType.Uint`
"""
self._marshal(1, serial, shape)
class WpCursorShapeDeviceV1Resource(Resource):
interface = WpCursorShapeDeviceV1
class WpCursorShapeDeviceV1Global(Global):
interface = WpCursorShapeDeviceV1
WpCursorShapeDeviceV1._gen_c()
WpCursorShapeDeviceV1.proxy_class = WpCursorShapeDeviceV1Proxy
WpCursorShapeDeviceV1.resource_class = WpCursorShapeDeviceV1Resource
WpCursorShapeDeviceV1.global_class = WpCursorShapeDeviceV1Global

View File

@ -0,0 +1,123 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2018 The Chromium Authors
# Copyright 2023 Simon Ser
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..tablet_unstable_v2 import ZwpTabletToolV2
from ..wayland import WlPointer
from .wp_cursor_shape_device_v1 import WpCursorShapeDeviceV1
class WpCursorShapeManagerV1(Interface):
"""Cursor shape manager
This global offers an alternative, optional way to set cursor images. This
new way uses enumerated cursors instead of a
:class:`~pywayland.protocol.wayland.WlSurface` like
:func:`WlPointer.set_cursor()
<pywayland.protocol.wayland.WlPointer.set_cursor>` does.
Warning! The protocol described in this file is currently in the testing
phase. Backward compatible changes may be added together with the
corresponding interface version bump. Backward incompatible changes can
only be done by creating a new major version of the extension.
"""
name = "wp_cursor_shape_manager_v1"
version = 1
class WpCursorShapeManagerV1Proxy(Proxy[WpCursorShapeManagerV1]):
interface = WpCursorShapeManagerV1
@WpCursorShapeManagerV1.request()
def destroy(self) -> None:
"""Destroy the manager
Destroy the cursor shape manager.
"""
self._marshal(0)
self._destroy()
@WpCursorShapeManagerV1.request(
Argument(ArgumentType.NewId, interface=WpCursorShapeDeviceV1),
Argument(ArgumentType.Object, interface=WlPointer),
)
def get_pointer(self, pointer: WlPointer) -> Proxy[WpCursorShapeDeviceV1]:
"""Manage the cursor shape of a pointer device
Obtain a
:class:`~pywayland.protocol.cursor_shape_v1.WpCursorShapeDeviceV1` for
a :class:`~pywayland.protocol.wayland.WlPointer` object.
:param pointer:
:type pointer:
:class:`~pywayland.protocol.wayland.WlPointer`
:returns:
:class:`~pywayland.protocol.cursor_shape_v1.WpCursorShapeDeviceV1`
"""
cursor_shape_device = self._marshal_constructor(1, WpCursorShapeDeviceV1, pointer)
return cursor_shape_device
@WpCursorShapeManagerV1.request(
Argument(ArgumentType.NewId, interface=WpCursorShapeDeviceV1),
Argument(ArgumentType.Object, interface=ZwpTabletToolV2),
)
def get_tablet_tool_v2(self, tablet_tool: ZwpTabletToolV2) -> Proxy[WpCursorShapeDeviceV1]:
"""Manage the cursor shape of a tablet tool device
Obtain a
:class:`~pywayland.protocol.cursor_shape_v1.WpCursorShapeDeviceV1` for
a :class:`~pywayland.protocol.tablet_unstable_v2.ZwpTabletToolV2`
object.
:param tablet_tool:
:type tablet_tool:
:class:`~pywayland.protocol.tablet_unstable_v2.ZwpTabletToolV2`
:returns:
:class:`~pywayland.protocol.cursor_shape_v1.WpCursorShapeDeviceV1`
"""
cursor_shape_device = self._marshal_constructor(2, WpCursorShapeDeviceV1, tablet_tool)
return cursor_shape_device
class WpCursorShapeManagerV1Resource(Resource):
interface = WpCursorShapeManagerV1
class WpCursorShapeManagerV1Global(Global):
interface = WpCursorShapeManagerV1
WpCursorShapeManagerV1._gen_c()
WpCursorShapeManagerV1.proxy_class = WpCursorShapeManagerV1Proxy
WpCursorShapeManagerV1.resource_class = WpCursorShapeManagerV1Resource
WpCursorShapeManagerV1.global_class = WpCursorShapeManagerV1Global

View File

@ -0,0 +1,29 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 NXP
# Copyright © 2019 Status Research & Development GmbH.
# Copyright © 2021 Xaver Hugl
#
# 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.
from .wp_drm_lease_connector_v1 import WpDrmLeaseConnectorV1 # noqa: F401
from .wp_drm_lease_device_v1 import WpDrmLeaseDeviceV1 # noqa: F401
from .wp_drm_lease_request_v1 import WpDrmLeaseRequestV1 # noqa: F401
from .wp_drm_lease_v1 import WpDrmLeaseV1 # noqa: F401

View File

@ -0,0 +1,174 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 NXP
# Copyright © 2019 Status Research & Development GmbH.
# Copyright © 2021 Xaver Hugl
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class WpDrmLeaseConnectorV1(Interface):
"""A leasable drm connector
Represents a DRM connector which is available for lease. These objects are
created via :func:`WpDrmLeaseDeviceV1.connector()
<pywayland.protocol.drm_lease_v1.WpDrmLeaseDeviceV1.connector>` events, and
should be passed to lease requests via
:func:`WpDrmLeaseRequestV1.request_connector()
<pywayland.protocol.drm_lease_v1.WpDrmLeaseRequestV1.request_connector>`.
Immediately after the :class:`WpDrmLeaseConnectorV1` object is created the
compositor will send a name, a description, a connector_id and a done
event. When the description is updated the compositor will send a
description event followed by a done event.
"""
name = "wp_drm_lease_connector_v1"
version = 1
class WpDrmLeaseConnectorV1Proxy(Proxy[WpDrmLeaseConnectorV1]):
interface = WpDrmLeaseConnectorV1
@WpDrmLeaseConnectorV1.request()
def destroy(self) -> None:
"""Destroy connector
The client may send this request to indicate that it will not use this
connector. Clients are encouraged to send this after receiving the
"withdrawn" event so that the server can release the resources
associated with this connector offer. Neither existing lease requests
nor leases will be affected.
"""
self._marshal(0)
self._destroy()
class WpDrmLeaseConnectorV1Resource(Resource):
interface = WpDrmLeaseConnectorV1
@WpDrmLeaseConnectorV1.event(
Argument(ArgumentType.String),
)
def name(self, name: str) -> None:
"""Name
The compositor sends this event once the connector is created to
indicate the name of this connector. This will not change for the
duration of the Wayland session, but is not guaranteed to be consistent
between sessions.
If the compositor supports
:class:`~pywayland.protocol.wayland.WlOutput` version 4 and this
connector corresponds to a
:class:`~pywayland.protocol.wayland.WlOutput`, the compositor should
use the same name as for the
:class:`~pywayland.protocol.wayland.WlOutput`.
:param name:
connector name
:type name:
`ArgumentType.String`
"""
self._post_event(0, name)
@WpDrmLeaseConnectorV1.event(
Argument(ArgumentType.String),
)
def description(self, description: str) -> None:
"""Description
The compositor sends this event once the connector is created to
provide a human-readable description for this connector, which may be
presented to the user. The compositor may send this event multiple
times over the lifetime of this object to reflect changes in the
description.
:param description:
connector description
:type description:
`ArgumentType.String`
"""
self._post_event(1, description)
@WpDrmLeaseConnectorV1.event(
Argument(ArgumentType.Uint),
)
def connector_id(self, connector_id: int) -> None:
"""Connector_id
The compositor sends this event once the connector is created to
indicate the DRM object ID which represents the underlying connector
that is being offered. Note that the final lease may include additional
object IDs, such as CRTCs and planes.
:param connector_id:
DRM connector ID
:type connector_id:
`ArgumentType.Uint`
"""
self._post_event(2, connector_id)
@WpDrmLeaseConnectorV1.event()
def done(self) -> None:
"""All properties have been sent
This event is sent after all properties of a connector have been sent.
This allows changes to the properties to be seen as atomic even if they
happen via multiple events.
"""
self._post_event(3)
@WpDrmLeaseConnectorV1.event()
def withdrawn(self) -> None:
"""Lease offer withdrawn
Sent to indicate that the compositor will no longer honor requests for
DRM leases which include this connector. The client may still issue a
lease request including this connector, but the compositor will send
:func:`WpDrmLeaseV1.finished()
<pywayland.protocol.drm_lease_v1.WpDrmLeaseV1.finished>` without
issuing a lease fd. Compositors are encouraged to send this event when
they lose access to connector, for example when the connector is hot-
unplugged, when the connector gets leased to a client or when the
compositor loses DRM master.
"""
self._post_event(4)
class WpDrmLeaseConnectorV1Global(Global):
interface = WpDrmLeaseConnectorV1
WpDrmLeaseConnectorV1._gen_c()
WpDrmLeaseConnectorV1.proxy_class = WpDrmLeaseConnectorV1Proxy
WpDrmLeaseConnectorV1.resource_class = WpDrmLeaseConnectorV1Resource
WpDrmLeaseConnectorV1.global_class = WpDrmLeaseConnectorV1Global

View File

@ -0,0 +1,206 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 NXP
# Copyright © 2019 Status Research & Development GmbH.
# Copyright © 2021 Xaver Hugl
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from .wp_drm_lease_connector_v1 import WpDrmLeaseConnectorV1
from .wp_drm_lease_request_v1 import WpDrmLeaseRequestV1
class WpDrmLeaseDeviceV1(Interface):
"""Lease device
This protocol is used by Wayland compositors which act as Direct
Renderering Manager (DRM) masters to lease DRM resources to Wayland
clients.
The compositor will advertise one :class:`WpDrmLeaseDeviceV1` global for
each DRM node. Some time after a client binds to the
:class:`WpDrmLeaseDeviceV1` global, the compositor will send a drm_fd event
followed by zero, one or more connector events. After all currently
available connectors have been sent, the compositor will send a
:func:`WpDrmLeaseDeviceV1.done()` event.
When the list of connectors available for lease changes the compositor will
send :func:`WpDrmLeaseDeviceV1.connector()` events for added connectors and
:func:`WpDrmLeaseConnectorV1.withdrawn()
<pywayland.protocol.drm_lease_v1.WpDrmLeaseConnectorV1.withdrawn>` events
for removed connectors, followed by a :func:`WpDrmLeaseDeviceV1.done()`
event.
The compositor will indicate when a device is gone by removing the global
via a :func:`WlRegistry.global_remove()
<pywayland.protocol.wayland.WlRegistry.global_remove>` event. Upon
receiving this event, the client should destroy any matching
:class:`WpDrmLeaseDeviceV1` object.
To destroy a :class:`WpDrmLeaseDeviceV1` object, the client must first
issue a release request. Upon receiving this request, the compositor will
immediately send a released event and destroy the object. The client must
continue to process and discard drm_fd and connector events until it
receives the released event. Upon receiving the released event, the client
can safely cleanup any client-side resources.
Warning! The protocol described in this file is currently in the testing
phase. Backward compatible changes may be added together with the
corresponding interface version bump. Backward incompatible changes can
only be done by creating a new major version of the extension.
"""
name = "wp_drm_lease_device_v1"
version = 1
class WpDrmLeaseDeviceV1Proxy(Proxy[WpDrmLeaseDeviceV1]):
interface = WpDrmLeaseDeviceV1
@WpDrmLeaseDeviceV1.request(
Argument(ArgumentType.NewId, interface=WpDrmLeaseRequestV1),
)
def create_lease_request(self) -> Proxy[WpDrmLeaseRequestV1]:
"""Create a lease request object
Creates a lease request object.
See the documentation for
:class:`~pywayland.protocol.drm_lease_v1.WpDrmLeaseRequestV1` for
details.
:returns:
:class:`~pywayland.protocol.drm_lease_v1.WpDrmLeaseRequestV1`
"""
id = self._marshal_constructor(0, WpDrmLeaseRequestV1)
return id
@WpDrmLeaseDeviceV1.request()
def release(self) -> None:
"""Release this object
Indicates the client no longer wishes to use this object. In response
the compositor will immediately send the released event and destroy
this object. It can however not guarantee that the client won't receive
connector events before the released event. The client must not send
any requests after this one, doing so will raise a
:class:`~pywayland.protocol.wayland.WlDisplay` error. Existing
connectors, lease request and leases will not be affected.
"""
self._marshal(1)
class WpDrmLeaseDeviceV1Resource(Resource):
interface = WpDrmLeaseDeviceV1
@WpDrmLeaseDeviceV1.event(
Argument(ArgumentType.FileDescriptor),
)
def drm_fd(self, fd: int) -> None:
"""Open a non-master fd for this drm node
The compositor will send this event when the
:class:`WpDrmLeaseDeviceV1` global is bound, although there are no
guarantees as to how long this takes - the compositor might need to
wait until regaining DRM master. The included fd is a non-master DRM
file descriptor opened for this device and the compositor must not
authenticate it. The purpose of this event is to give the client the
ability to query DRM and discover information which may help them pick
the appropriate DRM device or select the appropriate connectors
therein.
:param fd:
DRM file descriptor
:type fd:
`ArgumentType.FileDescriptor`
"""
self._post_event(0, fd)
@WpDrmLeaseDeviceV1.event(
Argument(ArgumentType.NewId, interface=WpDrmLeaseConnectorV1),
)
def connector(self, id: WpDrmLeaseConnectorV1) -> None:
"""Advertise connectors available for leases
The compositor will use this event to advertise connectors available
for lease by clients. This object may be passed into a lease request to
indicate the client would like to lease that connector, see
:func:`WpDrmLeaseRequestV1.request_connector()
<pywayland.protocol.drm_lease_v1.WpDrmLeaseRequestV1.request_connector>`
for details. While the compositor will make a best effort to not send
disconnected connectors, no guarantees can be made.
The compositor must send the drm_fd event before sending connectors.
After the drm_fd event it will send all available connectors but may
send additional connectors at any time.
:param id:
:type id:
:class:`~pywayland.protocol.drm_lease_v1.WpDrmLeaseConnectorV1`
"""
self._post_event(1, id)
@WpDrmLeaseDeviceV1.event()
def done(self) -> None:
"""Signals grouping of connectors
The compositor will send this event to indicate that it has sent all
currently available connectors after the client binds to the global or
when it updates the connector list, for example on hotplug, drm master
change or when a leased connector becomes available again. It will
similarly send this event to group
:func:`WpDrmLeaseConnectorV1.withdrawn()
<pywayland.protocol.drm_lease_v1.WpDrmLeaseConnectorV1.withdrawn>`
events of connectors of this device.
"""
self._post_event(2)
@WpDrmLeaseDeviceV1.event()
def released(self) -> None:
"""The compositor has finished using the device
This event is sent in response to the release request and indicates
that the compositor is done sending connector events. The compositor
will destroy this object immediately after sending the event and it
will become invalid. The client should release any resources associated
with this device after receiving this event.
"""
self._post_event(3)
class WpDrmLeaseDeviceV1Global(Global):
interface = WpDrmLeaseDeviceV1
WpDrmLeaseDeviceV1._gen_c()
WpDrmLeaseDeviceV1.proxy_class = WpDrmLeaseDeviceV1Proxy
WpDrmLeaseDeviceV1.resource_class = WpDrmLeaseDeviceV1Resource
WpDrmLeaseDeviceV1.global_class = WpDrmLeaseDeviceV1Global

View File

@ -0,0 +1,120 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 NXP
# Copyright © 2019 Status Research & Development GmbH.
# Copyright © 2021 Xaver Hugl
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from .wp_drm_lease_connector_v1 import WpDrmLeaseConnectorV1
from .wp_drm_lease_v1 import WpDrmLeaseV1
class WpDrmLeaseRequestV1(Interface):
"""Drm lease request
A client that wishes to lease DRM resources will attach the list of
connectors advertised with :func:`WpDrmLeaseDeviceV1.connector()
<pywayland.protocol.drm_lease_v1.WpDrmLeaseDeviceV1.connector>` that they
wish to lease, then use :func:`WpDrmLeaseRequestV1.submit()` to submit the
request.
"""
name = "wp_drm_lease_request_v1"
version = 1
class error(enum.IntEnum):
wrong_device = 0
duplicate_connector = 1
empty_lease = 2
class WpDrmLeaseRequestV1Proxy(Proxy[WpDrmLeaseRequestV1]):
interface = WpDrmLeaseRequestV1
@WpDrmLeaseRequestV1.request(
Argument(ArgumentType.Object, interface=WpDrmLeaseConnectorV1),
)
def request_connector(self, connector: WpDrmLeaseConnectorV1) -> None:
"""Request a connector for this lease
Indicates that the client would like to lease the given connector. This
is only used as a suggestion, the compositor may choose to include any
resources in the lease it issues, or change the set of leased resources
at any time. Compositors are however encouraged to include the
requested connector and other resources necessary to drive the
connected output in the lease.
Requesting a connector that was created from a different lease device
than this lease request raises the wrong_device error. Requesting a
connector twice will raise the duplicate_connector error.
:param connector:
:type connector:
:class:`~pywayland.protocol.drm_lease_v1.WpDrmLeaseConnectorV1`
"""
self._marshal(0, connector)
@WpDrmLeaseRequestV1.request(
Argument(ArgumentType.NewId, interface=WpDrmLeaseV1),
)
def submit(self) -> Proxy[WpDrmLeaseV1]:
"""Submit the lease request
Submits the lease request and creates a new
:class:`~pywayland.protocol.drm_lease_v1.WpDrmLeaseV1` object. After
calling submit the compositor will immediately destroy this object,
issuing any more requests will cause a wl_diplay error. The compositor
doesn't make any guarantees about the events of the lease object,
clients cannot expect an immediate response. Not requesting any
connectors before submitting the lease request will raise the
empty_lease error.
:returns:
:class:`~pywayland.protocol.drm_lease_v1.WpDrmLeaseV1`
"""
id = self._marshal_constructor(1, WpDrmLeaseV1)
return id
class WpDrmLeaseRequestV1Resource(Resource):
interface = WpDrmLeaseRequestV1
class WpDrmLeaseRequestV1Global(Global):
interface = WpDrmLeaseRequestV1
WpDrmLeaseRequestV1._gen_c()
WpDrmLeaseRequestV1.proxy_class = WpDrmLeaseRequestV1Proxy
WpDrmLeaseRequestV1.resource_class = WpDrmLeaseRequestV1Resource
WpDrmLeaseRequestV1.global_class = WpDrmLeaseRequestV1Global

View File

@ -0,0 +1,120 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 NXP
# Copyright © 2019 Status Research & Development GmbH.
# Copyright © 2021 Xaver Hugl
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class WpDrmLeaseV1(Interface):
"""A drm lease
A DRM lease object is used to transfer the DRM file descriptor to the
client and manage the lifetime of the lease.
Some time after the :class:`WpDrmLeaseV1` object is created, the compositor
will reply with the lease request's result. If the lease request is
granted, the compositor will send a lease_fd event. If the lease request is
denied, the compositor will send a finished event without a lease_fd event.
"""
name = "wp_drm_lease_v1"
version = 1
class WpDrmLeaseV1Proxy(Proxy[WpDrmLeaseV1]):
interface = WpDrmLeaseV1
@WpDrmLeaseV1.request()
def destroy(self) -> None:
"""Destroys the lease object
The client should send this to indicate that it no longer wishes to use
this lease. The compositor should use drmModeRevokeLease on the
appropriate file descriptor, if necessary.
"""
self._marshal(0)
self._destroy()
class WpDrmLeaseV1Resource(Resource):
interface = WpDrmLeaseV1
@WpDrmLeaseV1.event(
Argument(ArgumentType.FileDescriptor),
)
def lease_fd(self, leased_fd: int) -> None:
"""Shares the drm file descriptor
This event returns a file descriptor suitable for use with DRM-related
ioctls. The client should use drmModeGetLease to enumerate the DRM
objects which have been leased to them. The compositor guarantees it
will not use the leased DRM objects itself until it sends the finished
event. If the compositor cannot or will not grant a lease for the
requested connectors, it will not send this event, instead sending the
finished event.
The compositor will send this event at most once during this objects
lifetime.
:param leased_fd:
leased DRM file descriptor
:type leased_fd:
`ArgumentType.FileDescriptor`
"""
self._post_event(0, leased_fd)
@WpDrmLeaseV1.event()
def finished(self) -> None:
"""Sent when the lease has been revoked
The compositor uses this event to either reject a lease request, or if
it previously sent a lease_fd, to notify the client that the lease has
been revoked. If the client requires a new lease, they should destroy
this object and submit a new lease request. The compositor will send no
further events for this object after sending the finish event.
Compositors should revoke the lease when any of the leased resources
become unavailable, namely when a hot-unplug occurs or when the
compositor loses DRM master.
"""
self._post_event(1)
class WpDrmLeaseV1Global(Global):
interface = WpDrmLeaseV1
WpDrmLeaseV1._gen_c()
WpDrmLeaseV1.proxy_class = WpDrmLeaseV1Proxy
WpDrmLeaseV1.resource_class = WpDrmLeaseV1Resource
WpDrmLeaseV1.global_class = WpDrmLeaseV1Global

View File

@ -0,0 +1,30 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 Ilia Bozhinov
# Copyright © 2020 Isaac Freund
# Copyright © 2022 wb9688
# Copyright © 2023 i509VCB
#
# Permission to use, copy, modify, distribute, and sell this
# software and its documentation for any purpose is hereby granted
# without fee, provided that the above copyright notice appear in
# all copies and that both that copyright notice and this permission
# notice appear in supporting documentation, and that the name of
# the copyright holders not be used in advertising or publicity
# pertaining to distribution of the software without specific,
# written prior permission. The copyright holders make no
# representations about the suitability of this software for any
# purpose. It is provided "as is" without express or implied
# warranty.
#
# THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
# SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
# AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
# THIS SOFTWARE.
from .ext_foreign_toplevel_handle_v1 import ExtForeignToplevelHandleV1 # noqa: F401
from .ext_foreign_toplevel_list_v1 import ExtForeignToplevelListV1 # noqa: F401

View File

@ -0,0 +1,192 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 Ilia Bozhinov
# Copyright © 2020 Isaac Freund
# Copyright © 2022 wb9688
# Copyright © 2023 i509VCB
#
# Permission to use, copy, modify, distribute, and sell this
# software and its documentation for any purpose is hereby granted
# without fee, provided that the above copyright notice appear in
# all copies and that both that copyright notice and this permission
# notice appear in supporting documentation, and that the name of
# the copyright holders not be used in advertising or publicity
# pertaining to distribution of the software without specific,
# written prior permission. The copyright holders make no
# representations about the suitability of this software for any
# purpose. It is provided "as is" without express or implied
# warranty.
#
# THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
# SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
# AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
# THIS SOFTWARE.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class ExtForeignToplevelHandleV1(Interface):
"""A mapped toplevel
A :class:`ExtForeignToplevelHandleV1` object represents a mapped toplevel
window. A single app may have multiple mapped toplevels.
"""
name = "ext_foreign_toplevel_handle_v1"
version = 1
class ExtForeignToplevelHandleV1Proxy(Proxy[ExtForeignToplevelHandleV1]):
interface = ExtForeignToplevelHandleV1
@ExtForeignToplevelHandleV1.request()
def destroy(self) -> None:
"""Destroy the :class:`ExtForeignToplevelHandleV1` object
This request should be used when the client will no longer use the
handle or after the closed event has been received to allow destruction
of the object.
When a handle is destroyed, a new handle may not be created by the
server until the toplevel is unmapped and then remapped. Destroying a
toplevel handle is not recommended unless the client is cleaning up
child objects before destroying the
:class:`~pywayland.protocol.ext_foreign_toplevel_list_v1.ExtForeignToplevelListV1`
object, the toplevel was closed or the toplevel handle will not be used
in the future.
Other protocols which extend the :class:`ExtForeignToplevelHandleV1`
interface should require destructors for extension interfaces be called
before allowing the toplevel handle to be destroyed.
"""
self._marshal(0)
self._destroy()
class ExtForeignToplevelHandleV1Resource(Resource):
interface = ExtForeignToplevelHandleV1
@ExtForeignToplevelHandleV1.event()
def closed(self) -> None:
"""The toplevel has been closed
The server will emit no further events on the
:class:`ExtForeignToplevelHandleV1` after this event. Any requests
received aside from the destroy request must be ignored. Upon receiving
this event, the client should destroy the handle.
Other protocols which extend the :class:`ExtForeignToplevelHandleV1`
interface must also ignore requests other than destructors.
"""
self._post_event(0)
@ExtForeignToplevelHandleV1.event()
def done(self) -> None:
"""All information about the toplevel has been sent
This event is sent after all changes in the toplevel state have been
sent.
This allows changes to the :class:`ExtForeignToplevelHandleV1`
properties to be atomically applied. Other protocols which extend the
:class:`ExtForeignToplevelHandleV1` interface may use this event to
also atomically apply any pending state.
This event must not be sent after the
:func:`ExtForeignToplevelHandleV1.closed()` event.
"""
self._post_event(1)
@ExtForeignToplevelHandleV1.event(
Argument(ArgumentType.String),
)
def title(self, title: str) -> None:
"""Title change
The title of the toplevel has changed.
The configured state must not be applied immediately. See
:func:`ExtForeignToplevelHandleV1.done()` for details.
:param title:
:type title:
`ArgumentType.String`
"""
self._post_event(2, title)
@ExtForeignToplevelHandleV1.event(
Argument(ArgumentType.String),
)
def app_id(self, app_id: str) -> None:
"""App_id change
The app id of the toplevel has changed.
The configured state must not be applied immediately. See
:func:`ExtForeignToplevelHandleV1.done()` for details.
:param app_id:
:type app_id:
`ArgumentType.String`
"""
self._post_event(3, app_id)
@ExtForeignToplevelHandleV1.event(
Argument(ArgumentType.String),
)
def identifier(self, identifier: str) -> None:
"""A stable identifier for a toplevel
This identifier is used to check if two or more toplevel handles belong
to the same toplevel.
The identifier is useful for command line tools or privileged clients
which may need to reference an exact toplevel across processes or
instances of the
:class:`~pywayland.protocol.ext_foreign_toplevel_list_v1.ExtForeignToplevelListV1`
global.
The compositor must only send this event when the handle is created.
The identifier must be unique per toplevel and it's handles. Two
different toplevels must not have the same identifier. The identifier
is only valid as long as the toplevel is mapped. If the toplevel is
unmapped the identifier must not be reused. An identifier must not be
reused by the compositor to ensure there are no races when sharing
identifiers between processes.
An identifier is a string that contains up to 32 printable ASCII bytes.
An identifier must not be an empty string. It is recommended that a
compositor includes an opaque generation value in identifiers. How the
generation value is used when generating the identifier is
implementation dependent.
:param identifier:
:type identifier:
`ArgumentType.String`
"""
self._post_event(4, identifier)
class ExtForeignToplevelHandleV1Global(Global):
interface = ExtForeignToplevelHandleV1
ExtForeignToplevelHandleV1._gen_c()
ExtForeignToplevelHandleV1.proxy_class = ExtForeignToplevelHandleV1Proxy
ExtForeignToplevelHandleV1.resource_class = ExtForeignToplevelHandleV1Resource
ExtForeignToplevelHandleV1.global_class = ExtForeignToplevelHandleV1Global

View File

@ -0,0 +1,151 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2018 Ilia Bozhinov
# Copyright © 2020 Isaac Freund
# Copyright © 2022 wb9688
# Copyright © 2023 i509VCB
#
# Permission to use, copy, modify, distribute, and sell this
# software and its documentation for any purpose is hereby granted
# without fee, provided that the above copyright notice appear in
# all copies and that both that copyright notice and this permission
# notice appear in supporting documentation, and that the name of
# the copyright holders not be used in advertising or publicity
# pertaining to distribution of the software without specific,
# written prior permission. The copyright holders make no
# representations about the suitability of this software for any
# purpose. It is provided "as is" without express or implied
# warranty.
#
# THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
# SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
# AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
# THIS SOFTWARE.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from .ext_foreign_toplevel_handle_v1 import ExtForeignToplevelHandleV1
class ExtForeignToplevelListV1(Interface):
"""List toplevels
A toplevel is defined as a surface with a role similar to
:class:`~pywayland.protocol.xdg_shell.XdgToplevel`. XWayland surfaces may
be treated like toplevels in this protocol.
After a client binds the :class:`ExtForeignToplevelListV1`, each mapped
toplevel window will be sent using the
:func:`ExtForeignToplevelListV1.toplevel()` event.
Clients which only care about the current state can perform a roundtrip
after binding this global.
For each instance of :class:`ExtForeignToplevelListV1`, the compositor must
create a new
:class:`~pywayland.protocol.ext_foreign_toplevel_list_v1.ExtForeignToplevelHandleV1`
object for each mapped toplevel.
If a compositor implementation sends the
:func:`ExtForeignToplevelListV1.finished()` event after the global is
bound, the compositor must not send any
:func:`ExtForeignToplevelListV1.toplevel()` events.
"""
name = "ext_foreign_toplevel_list_v1"
version = 1
class ExtForeignToplevelListV1Proxy(Proxy[ExtForeignToplevelListV1]):
interface = ExtForeignToplevelListV1
@ExtForeignToplevelListV1.request()
def stop(self) -> None:
"""Stop sending events
This request indicates that the client no longer wishes to receive
events for new toplevels.
The Wayland protocol is asynchronous, meaning the compositor may send
further toplevel events until the stop request is processed. The client
should wait for a :func:`ExtForeignToplevelListV1.finished()` event
before destroying this object.
"""
self._marshal(0)
@ExtForeignToplevelListV1.request()
def destroy(self) -> None:
"""Destroy the :class:`ExtForeignToplevelListV1` object
This request should be called either when the client will no longer use
the :class:`ExtForeignToplevelListV1` or after the finished event has
been received to allow destruction of the object.
If a client wishes to destroy this object it should send a
:func:`ExtForeignToplevelListV1.stop()` request and wait for a
:func:`ExtForeignToplevelListV1.finished()` event, then destroy the
handles and then this object.
"""
self._marshal(1)
self._destroy()
class ExtForeignToplevelListV1Resource(Resource):
interface = ExtForeignToplevelListV1
@ExtForeignToplevelListV1.event(
Argument(ArgumentType.NewId, interface=ExtForeignToplevelHandleV1),
)
def toplevel(self, toplevel: ExtForeignToplevelHandleV1) -> None:
"""A toplevel has been created
This event is emitted whenever a new toplevel window is created. It is
emitted for all toplevels, regardless of the app that has created them.
All initial properties of the toplevel (identifier, title, app_id) will
be sent immediately after this event using the corresponding events for
:class:`~pywayland.protocol.ext_foreign_toplevel_list_v1.ExtForeignToplevelHandleV1`.
The compositor will use the :func:`ExtForeignToplevelHandleV1.done()
<pywayland.protocol.ext_foreign_toplevel_list_v1.ExtForeignToplevelHandleV1.done>`
event to indicate when all data has been sent.
:param toplevel:
:type toplevel:
:class:`~pywayland.protocol.ext_foreign_toplevel_list_v1.ExtForeignToplevelHandleV1`
"""
self._post_event(0, toplevel)
@ExtForeignToplevelListV1.event()
def finished(self) -> None:
"""The compositor has finished with the toplevel manager
This event indicates that the compositor is done sending events to this
object. The client should should destroy the object. See
:func:`ExtForeignToplevelListV1.destroy()` for more information.
The compositor must not send any more toplevel events after this event.
"""
self._post_event(1)
class ExtForeignToplevelListV1Global(Global):
interface = ExtForeignToplevelListV1
ExtForeignToplevelListV1._gen_c()
ExtForeignToplevelListV1.proxy_class = ExtForeignToplevelListV1Proxy
ExtForeignToplevelListV1.resource_class = ExtForeignToplevelListV1Resource
ExtForeignToplevelListV1.global_class = ExtForeignToplevelListV1Global

View File

@ -0,0 +1,26 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2015 Martin Gräßlin
# Copyright © 2022 Simon Ser
#
# 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.
from .ext_idle_notification_v1 import ExtIdleNotificationV1 # noqa: F401
from .ext_idle_notifier_v1 import ExtIdleNotifierV1 # noqa: F401

View File

@ -0,0 +1,102 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2015 Martin Gräßlin
# Copyright © 2022 Simon Ser
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import Global, Interface, Proxy, Resource
class ExtIdleNotificationV1(Interface):
"""Idle notification
This interface is used by the compositor to send idle notification events
to clients.
Initially the notification object is not idle. The notification object
becomes idle when no user activity has happened for at least the timeout
duration, starting from the creation of the notification object. User
activity may include input events or a presence sensor, but is compositor-
specific. If an idle inhibitor is active (e.g. another client has created a
:class:`~pywayland.protocol.idle_inhibit_unstable_v1.ZwpIdleInhibitorV1` on
a visible surface), the compositor must not make the notification object
idle.
When the notification object becomes idle, an idled event is sent. When
user activity starts again, the notification object stops being idle, a
resumed event is sent and the timeout is restarted.
"""
name = "ext_idle_notification_v1"
version = 1
class ExtIdleNotificationV1Proxy(Proxy[ExtIdleNotificationV1]):
interface = ExtIdleNotificationV1
@ExtIdleNotificationV1.request()
def destroy(self) -> None:
"""Destroy the notification object
Destroy the notification object.
"""
self._marshal(0)
self._destroy()
class ExtIdleNotificationV1Resource(Resource):
interface = ExtIdleNotificationV1
@ExtIdleNotificationV1.event()
def idled(self) -> None:
"""Notification object is idle
This event is sent when the notification object becomes idle.
It's a compositor protocol error to send this event twice without a
resumed event in-between.
"""
self._post_event(0)
@ExtIdleNotificationV1.event()
def resumed(self) -> None:
"""Notification object is no longer idle
This event is sent when the notification object stops being idle.
It's a compositor protocol error to send this event twice without an
idled event in-between. It's a compositor protocol error to send this
event prior to any idled event.
"""
self._post_event(1)
class ExtIdleNotificationV1Global(Global):
interface = ExtIdleNotificationV1
ExtIdleNotificationV1._gen_c()
ExtIdleNotificationV1.proxy_class = ExtIdleNotificationV1Proxy
ExtIdleNotificationV1.resource_class = ExtIdleNotificationV1Resource
ExtIdleNotificationV1.global_class = ExtIdleNotificationV1Global

View File

@ -0,0 +1,111 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2015 Martin Gräßlin
# Copyright © 2022 Simon Ser
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSeat
from .ext_idle_notification_v1 import ExtIdleNotificationV1
class ExtIdleNotifierV1(Interface):
"""Idle notification manager
This interface allows clients to monitor user idle status.
After binding to this global, clients can create
:class:`~pywayland.protocol.ext_idle_notify_v1.ExtIdleNotificationV1`
objects to get notified when the user is idle for a given amount of time.
"""
name = "ext_idle_notifier_v1"
version = 1
class ExtIdleNotifierV1Proxy(Proxy[ExtIdleNotifierV1]):
interface = ExtIdleNotifierV1
@ExtIdleNotifierV1.request()
def destroy(self) -> None:
"""Destroy the manager
Destroy the manager object. All objects created via this interface
remain valid.
"""
self._marshal(0)
self._destroy()
@ExtIdleNotifierV1.request(
Argument(ArgumentType.NewId, interface=ExtIdleNotificationV1),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Object, interface=WlSeat),
)
def get_idle_notification(self, timeout: int, seat: WlSeat) -> Proxy[ExtIdleNotificationV1]:
"""Create a notification object
Create a new idle notification object.
The notification object has a minimum timeout duration and is tied to a
seat. The client will be notified if the seat is inactive for at least
the provided timeout. See
:class:`~pywayland.protocol.ext_idle_notify_v1.ExtIdleNotificationV1`
for more details.
A zero timeout is valid and means the client wants to be notified as
soon as possible when the seat is inactive.
:param timeout:
minimum idle timeout in msec
:type timeout:
`ArgumentType.Uint`
:param seat:
:type seat:
:class:`~pywayland.protocol.wayland.WlSeat`
:returns:
:class:`~pywayland.protocol.ext_idle_notify_v1.ExtIdleNotificationV1`
"""
id = self._marshal_constructor(1, ExtIdleNotificationV1, timeout, seat)
return id
class ExtIdleNotifierV1Resource(Resource):
interface = ExtIdleNotifierV1
class ExtIdleNotifierV1Global(Global):
interface = ExtIdleNotifierV1
ExtIdleNotifierV1._gen_c()
ExtIdleNotifierV1.proxy_class = ExtIdleNotifierV1Proxy
ExtIdleNotifierV1.resource_class = ExtIdleNotifierV1Resource
ExtIdleNotifierV1.global_class = ExtIdleNotifierV1Global

View File

@ -0,0 +1,25 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2021 Isaac Freund
#
# 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.
from .ext_session_lock_manager_v1 import ExtSessionLockManagerV1 # noqa: F401
from .ext_session_lock_surface_v1 import ExtSessionLockSurfaceV1 # noqa: F401
from .ext_session_lock_v1 import ExtSessionLockV1 # noqa: F401

View File

@ -0,0 +1,93 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2021 Isaac Freund
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from .ext_session_lock_v1 import ExtSessionLockV1
class ExtSessionLockManagerV1(Interface):
"""Used to lock the session
This interface is used to request that the session be locked.
"""
name = "ext_session_lock_manager_v1"
version = 1
class ExtSessionLockManagerV1Proxy(Proxy[ExtSessionLockManagerV1]):
interface = ExtSessionLockManagerV1
@ExtSessionLockManagerV1.request()
def destroy(self) -> None:
"""Destroy the session lock manager object
This informs the compositor that the session lock manager object will
no longer be used. Existing objects created through this interface
remain valid.
"""
self._marshal(0)
self._destroy()
@ExtSessionLockManagerV1.request(
Argument(ArgumentType.NewId, interface=ExtSessionLockV1),
)
def lock(self) -> Proxy[ExtSessionLockV1]:
"""Attempt to lock the session
This request creates a session lock and asks the compositor to lock the
session. The compositor will send either the
:func:`ExtSessionLockV1.locked()
<pywayland.protocol.ext_session_lock_v1.ExtSessionLockV1.locked>` or
:func:`ExtSessionLockV1.finished()
<pywayland.protocol.ext_session_lock_v1.ExtSessionLockV1.finished>`
event on the created object in response to this request.
:returns:
:class:`~pywayland.protocol.ext_session_lock_v1.ExtSessionLockV1`
"""
id = self._marshal_constructor(1, ExtSessionLockV1)
return id
class ExtSessionLockManagerV1Resource(Resource):
interface = ExtSessionLockManagerV1
class ExtSessionLockManagerV1Global(Global):
interface = ExtSessionLockManagerV1
ExtSessionLockManagerV1._gen_c()
ExtSessionLockManagerV1.proxy_class = ExtSessionLockManagerV1Proxy
ExtSessionLockManagerV1.resource_class = ExtSessionLockManagerV1Resource
ExtSessionLockManagerV1.global_class = ExtSessionLockManagerV1Global

View File

@ -0,0 +1,166 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2021 Isaac Freund
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class ExtSessionLockSurfaceV1(Interface):
"""A surface displayed while the session is locked
The client may use lock surfaces to display a screensaver, render a dialog
to enter a password and unlock the session, or however else it sees fit.
On binding this interface the compositor will immediately send the first
configure event. After making the ack_configure request in response to this
event the client should attach and commit the first buffer. Committing the
surface before acking the first configure is a protocol error. Committing
the surface with a null buffer at any time is a protocol error.
The compositor is free to handle keyboard/pointer focus for lock surfaces
however it chooses. A reasonable way to do this would be to give the first
lock surface created keyboard focus and change keyboard focus if the user
clicks on other surfaces.
"""
name = "ext_session_lock_surface_v1"
version = 1
class error(enum.IntEnum):
commit_before_first_ack = 0
null_buffer = 1
dimensions_mismatch = 2
invalid_serial = 3
class ExtSessionLockSurfaceV1Proxy(Proxy[ExtSessionLockSurfaceV1]):
interface = ExtSessionLockSurfaceV1
@ExtSessionLockSurfaceV1.request()
def destroy(self) -> None:
"""Destroy the lock surface object
This informs the compositor that the lock surface object will no longer
be used.
It is recommended for a lock client to destroy lock surfaces if their
corresponding :class:`~pywayland.protocol.wayland.WlOutput` global is
removed.
If a lock surface on an active output is destroyed before the
:func:`ExtSessionLockV1.unlock_and_destroy()
<pywayland.protocol.ext_session_lock_v1.ExtSessionLockV1.unlock_and_destroy>`
event is sent, the compositor must fall back to rendering a solid
color.
"""
self._marshal(0)
self._destroy()
@ExtSessionLockSurfaceV1.request(
Argument(ArgumentType.Uint),
)
def ack_configure(self, serial: int) -> None:
"""Ack a configure event
When a configure event is received, if a client commits the surface in
response to the configure event, then the client must make an
ack_configure request sometime before the commit request, passing along
the serial of the configure event.
If the client receives multiple configure events before it can respond
to one, it only has to ack the last configure event.
A client is not required to commit immediately after sending an
ack_configure request - it may even ack_configure several times before
its next surface commit.
A client may send multiple ack_configure requests before committing,
but only the last request sent before a commit indicates which
configure event the client really is responding to.
Sending an ack_configure request consumes the configure event
referenced by the given serial, as well as all older configure events
sent on this object.
It is a protocol error to issue multiple ack_configure requests
referencing the same configure event or to issue an ack_configure
request referencing a configure event older than the last configure
event acked for a given lock surface.
:param serial:
serial from the configure event
:type serial:
`ArgumentType.Uint`
"""
self._marshal(1, serial)
class ExtSessionLockSurfaceV1Resource(Resource):
interface = ExtSessionLockSurfaceV1
@ExtSessionLockSurfaceV1.event(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def configure(self, serial: int, width: int, height: int) -> None:
"""The client should resize its surface
This event is sent once on binding the interface and may be sent again
at the compositor's discretion, for example if output geometry changes.
The width and height are in surface-local coordinates and are exact
requirements. Failing to match these surface dimensions in the next
commit after acking a configure is a protocol error.
:param serial:
serial for use in ack_configure
:type serial:
`ArgumentType.Uint`
:param width:
:type width:
`ArgumentType.Uint`
:param height:
:type height:
`ArgumentType.Uint`
"""
self._post_event(0, serial, width, height)
class ExtSessionLockSurfaceV1Global(Global):
interface = ExtSessionLockSurfaceV1
ExtSessionLockSurfaceV1._gen_c()
ExtSessionLockSurfaceV1.proxy_class = ExtSessionLockSurfaceV1Proxy
ExtSessionLockSurfaceV1.resource_class = ExtSessionLockSurfaceV1Resource
ExtSessionLockSurfaceV1.global_class = ExtSessionLockSurfaceV1Global

View File

@ -0,0 +1,246 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2021 Isaac Freund
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlOutput
from ..wayland import WlSurface
from .ext_session_lock_surface_v1 import ExtSessionLockSurfaceV1
class ExtSessionLockV1(Interface):
"""Manage lock state and create lock surfaces
In response to the creation of this object the compositor must send either
the locked or finished event.
The locked event indicates that the session is locked. This means that the
compositor must stop rendering and providing input to normal clients.
Instead the compositor must blank all outputs with an opaque color such
that their normal content is fully hidden.
The only surfaces that should be rendered while the session is locked are
the lock surfaces created through this interface and optionally, at the
compositor's discretion, special privileged surfaces such as input methods
or portions of desktop shell UIs.
The locked event must not be sent until a new "locked" frame (either from a
session lock surface or the compositor blanking the output) has been
presented on all outputs and no security sensitive normal/unlocked content
is possibly visible.
The finished event should be sent immediately on creation of this object if
the compositor decides that the locked event will not be sent.
The compositor may wait for the client to create and render session lock
surfaces before sending the locked event to avoid displaying intermediate
blank frames. However, it must impose a reasonable time limit if waiting
and send the locked event as soon as the hard requirements described above
can be met if the time limit expires. Clients should immediately create
lock surfaces for all outputs on creation of this object to make this
possible.
This behavior of the locked event is required in order to prevent possible
race conditions with clients that wish to suspend the system or similar
after locking the session. Without these semantics, clients triggering a
suspend after receiving the locked event would race with the first "locked"
frame being presented and normal/unlocked frames might be briefly visible
as the system is resumed if the suspend operation wins the race.
If the client dies while the session is locked, the compositor must not
unlock the session in response. It is acceptable for the session to be
permanently locked if this happens. The compositor may choose to continue
to display the lock surfaces the client had mapped before it died or
alternatively fall back to a solid color, this is compositor policy.
Compositors may also allow a secure way to recover the session, the details
of this are compositor policy. Compositors may allow a new client to create
a :class:`ExtSessionLockV1` object and take responsibility for unlocking
the session, they may even start a new lock client instance automatically.
"""
name = "ext_session_lock_v1"
version = 1
class error(enum.IntEnum):
invalid_destroy = 0
invalid_unlock = 1
role = 2
duplicate_output = 3
already_constructed = 4
class ExtSessionLockV1Proxy(Proxy[ExtSessionLockV1]):
interface = ExtSessionLockV1
@ExtSessionLockV1.request()
def destroy(self) -> None:
"""Destroy the session lock
This informs the compositor that the lock object will no longer be
used. Existing objects created through this interface remain valid.
After this request is made, lock surfaces created through this object
should be destroyed by the client as they will no longer be used by the
compositor.
It is a protocol error to make this request if the locked event was
sent, the unlock_and_destroy request must be used instead.
"""
self._marshal(0)
self._destroy()
@ExtSessionLockV1.request(
Argument(ArgumentType.NewId, interface=ExtSessionLockSurfaceV1),
Argument(ArgumentType.Object, interface=WlSurface),
Argument(ArgumentType.Object, interface=WlOutput),
)
def get_lock_surface(self, surface: WlSurface, output: WlOutput) -> Proxy[ExtSessionLockSurfaceV1]:
"""Create a lock surface for a given output
The client is expected to create lock surfaces for all outputs
currently present and any new outputs as they are advertised. These
won't be displayed by the compositor unless the lock is successful and
the locked event is sent.
Providing a :class:`~pywayland.protocol.wayland.WlSurface` which
already has a role or already has a buffer attached or committed is a
protocol error, as is attaching/committing a buffer before the first
:func:`ExtSessionLockSurfaceV1.configure()
<pywayland.protocol.ext_session_lock_v1.ExtSessionLockSurfaceV1.configure>`
event.
Attempting to create more than one lock surface for a given output is a
duplicate_output protocol error.
:param surface:
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:param output:
:type output:
:class:`~pywayland.protocol.wayland.WlOutput`
:returns:
:class:`~pywayland.protocol.ext_session_lock_v1.ExtSessionLockSurfaceV1`
"""
id = self._marshal_constructor(1, ExtSessionLockSurfaceV1, surface, output)
return id
@ExtSessionLockV1.request()
def unlock_and_destroy(self) -> None:
"""Unlock the session, destroying the object
This request indicates that the session should be unlocked, for example
because the user has entered their password and it has been verified by
the client.
This request also informs the compositor that the lock object will no
longer be used and should be destroyed. Existing objects created
through this interface remain valid.
After this request is made, lock surfaces created through this object
should be destroyed by the client as they will no longer be used by the
compositor.
It is a protocol error to make this request if the locked event has not
been sent. In that case, the lock object must be destroyed using the
destroy request.
Note that a correct client that wishes to exit directly after unlocking
the session must use the :func:`WlDisplay.sync()
<pywayland.protocol.wayland.WlDisplay.sync>` request to ensure the
server receives and processes the unlock_and_destroy request. Otherwise
there is no guarantee that the server has unlocked the session due to
the asynchronous nature of the Wayland protocol. For example, the
server might terminate the client with a protocol error before it
processes the unlock_and_destroy request.
"""
self._marshal(2)
self._destroy()
class ExtSessionLockV1Resource(Resource):
interface = ExtSessionLockV1
@ExtSessionLockV1.event()
def locked(self) -> None:
"""Session successfully locked
This client is now responsible for displaying graphics while the
session is locked and deciding when to unlock the session.
The locked event must not be sent until a new "locked" frame has been
presented on all outputs and no security sensitive normal/unlocked
content is possibly visible.
If this event is sent, making the destroy request is a protocol error,
the lock object must be destroyed using the unlock_and_destroy request.
"""
self._post_event(0)
@ExtSessionLockV1.event()
def finished(self) -> None:
"""The session lock object should be destroyed
The compositor has decided that the session lock should be destroyed as
it will no longer be used by the compositor. Exactly when this event is
sent is compositor policy, but it must never be sent more than once for
a given session lock object.
This might be sent because there is already another
:class:`ExtSessionLockV1` object held by a client, or the compositor
has decided to deny the request to lock the session for some other
reason. This might also be sent because the compositor implements some
alternative, secure way to authenticate and unlock the session.
The finished event should be sent immediately on creation of this
object if the compositor decides that the locked event will not be
sent.
If the locked event is sent on creation of this object the finished
event may still be sent at some later time in this object's lifetime.
This is compositor policy.
Upon receiving this event, the client should make either the destroy
request or the unlock_and_destroy request, depending on whether or not
the locked event was received on this object.
"""
self._post_event(1)
class ExtSessionLockV1Global(Global):
interface = ExtSessionLockV1
ExtSessionLockV1._gen_c()
ExtSessionLockV1.proxy_class = ExtSessionLockV1Proxy
ExtSessionLockV1.resource_class = ExtSessionLockV1Resource
ExtSessionLockV1.global_class = ExtSessionLockV1Global

View File

@ -0,0 +1,25 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2022 Kenny Levinsen
#
# 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.
from .wp_fractional_scale_manager_v1 import WpFractionalScaleManagerV1 # noqa: F401
from .wp_fractional_scale_v1 import WpFractionalScaleV1 # noqa: F401

View File

@ -0,0 +1,106 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2022 Kenny Levinsen
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSurface
from .wp_fractional_scale_v1 import WpFractionalScaleV1
class WpFractionalScaleManagerV1(Interface):
"""Fractional surface scale information
A global interface for requesting surfaces to use fractional scales.
"""
name = "wp_fractional_scale_manager_v1"
version = 1
class error(enum.IntEnum):
fractional_scale_exists = 0
class WpFractionalScaleManagerV1Proxy(Proxy[WpFractionalScaleManagerV1]):
interface = WpFractionalScaleManagerV1
@WpFractionalScaleManagerV1.request()
def destroy(self) -> None:
"""Unbind the fractional surface scale interface
Informs the server that the client will not be using this protocol
object anymore. This does not affect any other objects,
:class:`~pywayland.protocol.fractional_scale_v1.WpFractionalScaleV1`
objects included.
"""
self._marshal(0)
self._destroy()
@WpFractionalScaleManagerV1.request(
Argument(ArgumentType.NewId, interface=WpFractionalScaleV1),
Argument(ArgumentType.Object, interface=WlSurface),
)
def get_fractional_scale(self, surface: WlSurface) -> Proxy[WpFractionalScaleV1]:
"""Extend surface interface for scale information
Create an add-on object for the the
:class:`~pywayland.protocol.wayland.WlSurface` to let the compositor
request fractional scales. If the given
:class:`~pywayland.protocol.wayland.WlSurface` already has a
:class:`~pywayland.protocol.fractional_scale_v1.WpFractionalScaleV1`
object associated, the fractional_scale_exists protocol error is
raised.
:param surface:
the surface
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:returns:
:class:`~pywayland.protocol.fractional_scale_v1.WpFractionalScaleV1`
-- the new surface scale info interface id
"""
id = self._marshal_constructor(1, WpFractionalScaleV1, surface)
return id
class WpFractionalScaleManagerV1Resource(Resource):
interface = WpFractionalScaleManagerV1
class WpFractionalScaleManagerV1Global(Global):
interface = WpFractionalScaleManagerV1
WpFractionalScaleManagerV1._gen_c()
WpFractionalScaleManagerV1.proxy_class = WpFractionalScaleManagerV1Proxy
WpFractionalScaleManagerV1.resource_class = WpFractionalScaleManagerV1Resource
WpFractionalScaleManagerV1.global_class = WpFractionalScaleManagerV1Global

View File

@ -0,0 +1,93 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2022 Kenny Levinsen
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class WpFractionalScaleV1(Interface):
"""Fractional scale interface to a :class:`~pywayland.protocol.wayland.WlSurface`
An additional interface to a :class:`~pywayland.protocol.wayland.WlSurface`
object which allows the compositor to inform the client of the preferred
scale.
"""
name = "wp_fractional_scale_v1"
version = 1
class WpFractionalScaleV1Proxy(Proxy[WpFractionalScaleV1]):
interface = WpFractionalScaleV1
@WpFractionalScaleV1.request()
def destroy(self) -> None:
"""Remove surface scale information for surface
Destroy the fractional scale object. When this object is destroyed,
preferred_scale events will no longer be sent.
"""
self._marshal(0)
self._destroy()
class WpFractionalScaleV1Resource(Resource):
interface = WpFractionalScaleV1
@WpFractionalScaleV1.event(
Argument(ArgumentType.Uint),
)
def preferred_scale(self, scale: int) -> None:
"""Notify of new preferred scale
Notification of a new preferred scale for this surface that the
compositor suggests that the client should use.
The sent scale is the numerator of a fraction with a denominator of
120.
:param scale:
the new preferred scale
:type scale:
`ArgumentType.Uint`
"""
self._post_event(0, scale)
class WpFractionalScaleV1Global(Global):
interface = WpFractionalScaleV1
WpFractionalScaleV1._gen_c()
WpFractionalScaleV1.proxy_class = WpFractionalScaleV1Proxy
WpFractionalScaleV1.resource_class = WpFractionalScaleV1Resource
WpFractionalScaleV1.global_class = WpFractionalScaleV1Global

View File

@ -0,0 +1,27 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2016 Yong Bakos
# Copyright © 2015 Jason Ekstrand
# Copyright © 2015 Jonas Ådahl
#
# 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.
from .zwp_fullscreen_shell_mode_feedback_v1 import ZwpFullscreenShellModeFeedbackV1 # noqa: F401
from .zwp_fullscreen_shell_v1 import ZwpFullscreenShellV1 # noqa: F401

View File

@ -0,0 +1,91 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2016 Yong Bakos
# Copyright © 2015 Jason Ekstrand
# Copyright © 2015 Jonas Ådahl
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import Global, Interface, Proxy, Resource
class ZwpFullscreenShellModeFeedbackV1(Interface):
name = "zwp_fullscreen_shell_mode_feedback_v1"
version = 1
class ZwpFullscreenShellModeFeedbackV1Proxy(Proxy[ZwpFullscreenShellModeFeedbackV1]):
interface = ZwpFullscreenShellModeFeedbackV1
class ZwpFullscreenShellModeFeedbackV1Resource(Resource):
interface = ZwpFullscreenShellModeFeedbackV1
@ZwpFullscreenShellModeFeedbackV1.event()
def mode_successful(self) -> None:
"""Mode switch succeeded
This event indicates that the attempted mode switch operation was
successful. A surface of the size requested in the mode switch will
fill the output without scaling.
Upon receiving this event, the client should destroy the
wl_fullscreen_shell_mode_feedback object.
"""
self._post_event(0)
@ZwpFullscreenShellModeFeedbackV1.event()
def mode_failed(self) -> None:
"""Mode switch failed
This event indicates that the attempted mode switch operation failed.
This may be because the requested output mode is not possible or it may
mean that the compositor does not want to allow it.
Upon receiving this event, the client should destroy the
wl_fullscreen_shell_mode_feedback object.
"""
self._post_event(1)
@ZwpFullscreenShellModeFeedbackV1.event()
def present_cancelled(self) -> None:
"""Mode switch cancelled
This event indicates that the attempted mode switch operation was
cancelled. Most likely this is because the client requested a second
mode switch before the first one completed.
Upon receiving this event, the client should destroy the
wl_fullscreen_shell_mode_feedback object.
"""
self._post_event(2)
class ZwpFullscreenShellModeFeedbackV1Global(Global):
interface = ZwpFullscreenShellModeFeedbackV1
ZwpFullscreenShellModeFeedbackV1._gen_c()
ZwpFullscreenShellModeFeedbackV1.proxy_class = ZwpFullscreenShellModeFeedbackV1Proxy
ZwpFullscreenShellModeFeedbackV1.resource_class = ZwpFullscreenShellModeFeedbackV1Resource
ZwpFullscreenShellModeFeedbackV1.global_class = ZwpFullscreenShellModeFeedbackV1Global

View File

@ -0,0 +1,260 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2016 Yong Bakos
# Copyright © 2015 Jason Ekstrand
# Copyright © 2015 Jonas Ådahl
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlOutput
from ..wayland import WlSurface
from .zwp_fullscreen_shell_mode_feedback_v1 import ZwpFullscreenShellModeFeedbackV1
class ZwpFullscreenShellV1(Interface):
"""Displays a single surface per output
Displays a single surface per output.
This interface provides a mechanism for a single client to display simple
full-screen surfaces. While there technically may be multiple clients
bound to this interface, only one of those clients should be shown at a
time.
To present a surface, the client uses either the present_surface or
present_surface_for_mode requests. Presenting a surface takes effect on
the next :func:`WlSurface.commit()
<pywayland.protocol.wayland.WlSurface.commit>`. See the individual
requests for details about scaling and mode switches.
The client can have at most one surface per output at any time. Requesting
a surface to be presented on an output that already has a surface replaces
the previously presented surface. Presenting a null surface removes its
content and effectively disables the output. Exactly what happens when an
output is "disabled" is compositor-specific. The same surface may be
presented on multiple outputs simultaneously.
Once a surface is presented on an output, it stays on that output until
either the client removes it or the compositor destroys the output. This
way, the client can update the output's contents by simply attaching a new
buffer.
Warning! The protocol described in this file is experimental and backward
incompatible changes may be made. Backward compatible changes may be added
together with the corresponding interface version bump. Backward
incompatible changes are done by bumping the version number in the protocol
and interface names and resetting the interface version. Once the protocol
is to be declared stable, the 'z' prefix and the version number in the
protocol and interface names are removed and the interface version number
is reset.
"""
name = "zwp_fullscreen_shell_v1"
version = 1
class capability(enum.IntEnum):
arbitrary_modes = 1
cursor_plane = 2
class present_method(enum.IntEnum):
default = 0
center = 1
zoom = 2
zoom_crop = 3
stretch = 4
class error(enum.IntEnum):
invalid_method = 0
role = 1
class ZwpFullscreenShellV1Proxy(Proxy[ZwpFullscreenShellV1]):
interface = ZwpFullscreenShellV1
@ZwpFullscreenShellV1.request()
def release(self) -> None:
"""Release the wl_fullscreen_shell interface
Release the binding from the wl_fullscreen_shell interface.
This destroys the server-side object and frees this binding. If the
client binds to wl_fullscreen_shell multiple times, it may wish to free
some of those bindings.
"""
self._marshal(0)
self._destroy()
@ZwpFullscreenShellV1.request(
Argument(ArgumentType.Object, interface=WlSurface, nullable=True),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Object, interface=WlOutput, nullable=True),
)
def present_surface(self, surface: WlSurface | None, method: int, output: WlOutput | None) -> None:
"""Present surface for display
Present a surface on the given output.
If the output is null, the compositor will present the surface on
whatever display (or displays) it thinks best. In particular, this may
replace any or all surfaces currently presented so it should not be
used in combination with placing surfaces on specific outputs.
The method parameter is a hint to the compositor for how the surface is
to be presented. In particular, it tells the compositor how to handle
a size mismatch between the presented surface and the output. The
compositor is free to ignore this parameter.
The "zoom", "zoom_crop", and "stretch" methods imply a scaling
operation on the surface. This will override any kind of output
scaling, so the buffer_scale property of the surface is effectively
ignored.
This request gives the surface the role of a fullscreen shell surface.
If the surface already has another role, it raises a role protocol
error.
:param surface:
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface` or `None`
:param method:
:type method:
`ArgumentType.Uint`
:param output:
:type output:
:class:`~pywayland.protocol.wayland.WlOutput` or `None`
"""
self._marshal(1, surface, method, output)
@ZwpFullscreenShellV1.request(
Argument(ArgumentType.Object, interface=WlSurface),
Argument(ArgumentType.Object, interface=WlOutput),
Argument(ArgumentType.Int),
Argument(ArgumentType.NewId, interface=ZwpFullscreenShellModeFeedbackV1),
)
def present_surface_for_mode(self, surface: WlSurface, output: WlOutput, framerate: int) -> Proxy[ZwpFullscreenShellModeFeedbackV1]:
"""Present surface for display at a particular mode
Presents a surface on the given output for a particular mode.
If the current size of the output differs from that of the surface, the
compositor will attempt to change the size of the output to match the
surface. The result of the mode-switch operation will be returned via
the provided wl_fullscreen_shell_mode_feedback object.
If the current output mode matches the one requested or if the
compositor successfully switches the mode to match the surface, then
the mode_successful event will be sent and the output will contain the
contents of the given surface. If the compositor cannot match the
output size to the surface size, the mode_failed will be sent and the
output will contain the contents of the previously presented surface
(if any). If another surface is presented on the given output before
either of these has a chance to happen, the present_cancelled event
will be sent.
Due to race conditions and other issues unknown to the client, no mode-
switch operation is guaranteed to succeed. However, if the mode is one
advertised by :func:`WlOutput.mode()
<pywayland.protocol.wayland.WlOutput.mode>` or if the compositor
advertises the ARBITRARY_MODES capability, then the client should
expect that the mode-switch operation will usually succeed.
If the size of the presented surface changes, the resulting output is
undefined. The compositor may attempt to change the output mode to
compensate. However, there is no guarantee that a suitable mode will
be found and the client has no way to be notified of success or
failure.
The framerate parameter specifies the desired framerate for the output
in mHz. The compositor is free to ignore this parameter. A value of 0
indicates that the client has no preference.
If the value of :func:`WlOutput.scale()
<pywayland.protocol.wayland.WlOutput.scale>` differs from
:func:`WlSurface.buffer_scale()
<pywayland.protocol.wayland.WlSurface.buffer_scale>`, then the
compositor may choose a mode that matches either the buffer size or the
surface size. In either case, the surface will fill the output.
This request gives the surface the role of a fullscreen shell surface.
If the surface already has another role, it raises a role protocol
error.
:param surface:
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:param output:
:type output:
:class:`~pywayland.protocol.wayland.WlOutput`
:param framerate:
:type framerate:
`ArgumentType.Int`
:returns:
:class:`~pywayland.protocol.fullscreen_shell_unstable_v1.ZwpFullscreenShellModeFeedbackV1`
"""
feedback = self._marshal_constructor(2, ZwpFullscreenShellModeFeedbackV1, surface, output, framerate)
return feedback
class ZwpFullscreenShellV1Resource(Resource):
interface = ZwpFullscreenShellV1
@ZwpFullscreenShellV1.event(
Argument(ArgumentType.Uint),
)
def capability(self, capability: int) -> None:
"""Advertises a capability of the compositor
Advertises a single capability of the compositor.
When the wl_fullscreen_shell interface is bound, this event is emitted
once for each capability advertised. Valid capabilities are given by
the wl_fullscreen_shell.capability enum. If clients want to take
advantage of any of these capabilities, they should use a
:func:`WlDisplay.sync() <pywayland.protocol.wayland.WlDisplay.sync>`
request immediately after binding to ensure that they receive all the
capability events.
:param capability:
:type capability:
`ArgumentType.Uint`
"""
self._post_event(0, capability)
class ZwpFullscreenShellV1Global(Global):
interface = ZwpFullscreenShellV1
ZwpFullscreenShellV1._gen_c()
ZwpFullscreenShellV1.proxy_class = ZwpFullscreenShellV1Proxy
ZwpFullscreenShellV1.resource_class = ZwpFullscreenShellV1Resource
ZwpFullscreenShellV1.global_class = ZwpFullscreenShellV1Global

View File

@ -0,0 +1,25 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2015 Samsung Electronics Co., 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.
from .zwp_idle_inhibit_manager_v1 import ZwpIdleInhibitManagerV1 # noqa: F401
from .zwp_idle_inhibitor_v1 import ZwpIdleInhibitorV1 # noqa: F401

View File

@ -0,0 +1,103 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2015 Samsung Electronics Co., 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSurface
from .zwp_idle_inhibitor_v1 import ZwpIdleInhibitorV1
class ZwpIdleInhibitManagerV1(Interface):
"""Control behavior when display idles
This interface permits inhibiting the idle behavior such as screen
blanking, locking, and screensaving. The client binds the idle manager
globally, then creates idle-inhibitor objects for each surface.
Warning! The protocol described in this file is experimental and backward
incompatible changes may be made. Backward compatible changes may be added
together with the corresponding interface version bump. Backward
incompatible changes are done by bumping the version number in the protocol
and interface names and resetting the interface version. Once the protocol
is to be declared stable, the 'z' prefix and the version number in the
protocol and interface names are removed and the interface version number
is reset.
"""
name = "zwp_idle_inhibit_manager_v1"
version = 1
class ZwpIdleInhibitManagerV1Proxy(Proxy[ZwpIdleInhibitManagerV1]):
interface = ZwpIdleInhibitManagerV1
@ZwpIdleInhibitManagerV1.request()
def destroy(self) -> None:
"""Destroy the idle inhibitor object
Destroy the inhibit manager.
"""
self._marshal(0)
self._destroy()
@ZwpIdleInhibitManagerV1.request(
Argument(ArgumentType.NewId, interface=ZwpIdleInhibitorV1),
Argument(ArgumentType.Object, interface=WlSurface),
)
def create_inhibitor(self, surface: WlSurface) -> Proxy[ZwpIdleInhibitorV1]:
"""Create a new inhibitor object
Create a new inhibitor object associated with the given surface.
:param surface:
the surface that inhibits the idle behavior
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:returns:
:class:`~pywayland.protocol.idle_inhibit_unstable_v1.ZwpIdleInhibitorV1`
"""
id = self._marshal_constructor(1, ZwpIdleInhibitorV1, surface)
return id
class ZwpIdleInhibitManagerV1Resource(Resource):
interface = ZwpIdleInhibitManagerV1
class ZwpIdleInhibitManagerV1Global(Global):
interface = ZwpIdleInhibitManagerV1
ZwpIdleInhibitManagerV1._gen_c()
ZwpIdleInhibitManagerV1.proxy_class = ZwpIdleInhibitManagerV1Proxy
ZwpIdleInhibitManagerV1.resource_class = ZwpIdleInhibitManagerV1Resource
ZwpIdleInhibitManagerV1.global_class = ZwpIdleInhibitManagerV1Global

View File

@ -0,0 +1,76 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2015 Samsung Electronics Co., 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.
from __future__ import annotations
from pywayland.protocol_core import Global, Interface, Proxy, Resource
class ZwpIdleInhibitorV1(Interface):
"""Context object for inhibiting idle behavior
An idle inhibitor prevents the output that the associated surface is
visible on from being set to a state where it is not visually usable due to
lack of user interaction (e.g. blanked, dimmed, locked, set to power save,
etc.) Any screensaver processes are also blocked from displaying.
If the surface is destroyed, unmapped, becomes occluded, loses visibility,
or otherwise becomes not visually relevant for the user, the idle inhibitor
will not be honored by the compositor; if the surface subsequently regains
visibility the inhibitor takes effect once again. Likewise, the inhibitor
isn't honored if the system was already idled at the time the inhibitor was
established, although if the system later de-idles and re-idles the
inhibitor will take effect.
"""
name = "zwp_idle_inhibitor_v1"
version = 1
class ZwpIdleInhibitorV1Proxy(Proxy[ZwpIdleInhibitorV1]):
interface = ZwpIdleInhibitorV1
@ZwpIdleInhibitorV1.request()
def destroy(self) -> None:
"""Destroy the idle inhibitor object
Remove the inhibitor effect from the associated
:class:`~pywayland.protocol.wayland.WlSurface`.
"""
self._marshal(0)
self._destroy()
class ZwpIdleInhibitorV1Resource(Resource):
interface = ZwpIdleInhibitorV1
class ZwpIdleInhibitorV1Global(Global):
interface = ZwpIdleInhibitorV1
ZwpIdleInhibitorV1._gen_c()
ZwpIdleInhibitorV1.proxy_class = ZwpIdleInhibitorV1Proxy
ZwpIdleInhibitorV1.resource_class = ZwpIdleInhibitorV1Resource
ZwpIdleInhibitorV1.global_class = ZwpIdleInhibitorV1Global

View File

@ -0,0 +1,27 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2012, 2013 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.
from .zwp_input_method_context_v1 import ZwpInputMethodContextV1 # noqa: F401
from .zwp_input_method_v1 import ZwpInputMethodV1 # noqa: F401
from .zwp_input_panel_surface_v1 import ZwpInputPanelSurfaceV1 # noqa: F401
from .zwp_input_panel_v1 import ZwpInputPanelV1 # noqa: F401

View File

@ -0,0 +1,510 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2012, 2013 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlKeyboard
class ZwpInputMethodContextV1(Interface):
"""Input method context
Corresponds to a text input on the input method side. An input method
context is created on text input activation on the input method side. It
allows receiving information about the text input from the application via
events. Input method contexts do not keep state after deactivation and
should be destroyed after deactivation is handled.
Text is generally UTF-8 encoded, indices and lengths are in bytes.
Serials are used to synchronize the state between the text input and an
input method. New serials are sent by the text input in the commit_state
request and are used by the input method to indicate the known text input
state in events like preedit_string, commit_string, and keysym. The text
input can then ignore events from the input method which are based on an
outdated state (for example after a reset).
Warning! The protocol described in this file is experimental and backward
incompatible changes may be made. Backward compatible changes may be added
together with the corresponding interface version bump. Backward
incompatible changes are done by bumping the version number in the protocol
and interface names and resetting the interface version. Once the protocol
is to be declared stable, the 'z' prefix and the version number in the
protocol and interface names are removed and the interface version number
is reset.
"""
name = "zwp_input_method_context_v1"
version = 1
class ZwpInputMethodContextV1Proxy(Proxy[ZwpInputMethodContextV1]):
interface = ZwpInputMethodContextV1
@ZwpInputMethodContextV1.request()
def destroy(self) -> None:
"""destroy
"""
self._marshal(0)
self._destroy()
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.String),
)
def commit_string(self, serial: int, text: str) -> None:
"""Commit string
Send the commit string text for insertion to the application.
The text to commit could be either just a single character after a key
press or the result of some composing (pre-edit). It could be also an
empty text when some text should be removed (see
delete_surrounding_text) or when the input cursor should be moved (see
cursor_position).
Any previously set composing text will be removed.
:param serial:
serial of the latest known text input state
:type serial:
`ArgumentType.Uint`
:param text:
:type text:
`ArgumentType.String`
"""
self._marshal(1, serial, text)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.String),
Argument(ArgumentType.String),
)
def preedit_string(self, serial: int, text: str, commit: str) -> None:
"""Pre-edit string
Send the pre-edit string text to the application text input.
The commit text can be used to replace the pre-edit text on reset (for
example on unfocus).
Previously sent preedit_style and preedit_cursor requests are also
processed by the text_input.
:param serial:
serial of the latest known text input state
:type serial:
`ArgumentType.Uint`
:param text:
:type text:
`ArgumentType.String`
:param commit:
:type commit:
`ArgumentType.String`
"""
self._marshal(2, serial, text, commit)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def preedit_styling(self, index: int, length: int, style: int) -> None:
"""Pre-edit styling
Set the styling information on composing text. The style is applied for
length in bytes from index relative to the beginning of the composing
text (as byte offset). Multiple styles can be applied to a composing
text.
This request should be sent before sending a preedit_string request.
:param index:
:type index:
`ArgumentType.Uint`
:param length:
:type length:
`ArgumentType.Uint`
:param style:
:type style:
`ArgumentType.Uint`
"""
self._marshal(3, index, length, style)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Int),
)
def preedit_cursor(self, index: int) -> None:
"""Pre-edit cursor
Set the cursor position inside the composing text (as byte offset)
relative to the start of the composing text.
When index is negative no cursor should be displayed.
This request should be sent before sending a preedit_string request.
:param index:
:type index:
`ArgumentType.Int`
"""
self._marshal(4, index)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Int),
Argument(ArgumentType.Uint),
)
def delete_surrounding_text(self, index: int, length: int) -> None:
"""Delete text
Remove the surrounding text.
This request will be handled on the text_input side directly following
a commit_string request.
:param index:
:type index:
`ArgumentType.Int`
:param length:
:type length:
`ArgumentType.Uint`
"""
self._marshal(5, index, length)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Int),
Argument(ArgumentType.Int),
)
def cursor_position(self, index: int, anchor: int) -> None:
"""Set cursor to a new position
Set the cursor and anchor to a new position. Index is the new cursor
position in bytes (when >= 0 this is relative to the end of the
inserted text, otherwise it is relative to the beginning of the
inserted text). Anchor is the new anchor position in bytes (when >= 0
this is relative to the end of the inserted text, otherwise it is
relative to the beginning of the inserted text). When there should be
no selected text, anchor should be the same as index.
This request will be handled on the text_input side directly following
a commit_string request.
:param index:
:type index:
`ArgumentType.Int`
:param anchor:
:type anchor:
`ArgumentType.Int`
"""
self._marshal(6, index, anchor)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Array),
)
def modifiers_map(self, map: list) -> None:
"""modifiers_map
:param map:
:type map:
`ArgumentType.Array`
"""
self._marshal(7, map)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def keysym(self, serial: int, time: int, sym: int, state: int, modifiers: int) -> None:
"""Keysym
Notify when a key event was sent. Key events should not be used for
normal text input operations, which should be done with commit_string,
delete_surrounding_text, etc. The key event follows the
:class:`~pywayland.protocol.wayland.WlKeyboard` key event convention.
Sym is an XKB keysym, state is a
:class:`~pywayland.protocol.wayland.WlKeyboard` key_state.
:param serial:
serial of the latest known text input state
:type serial:
`ArgumentType.Uint`
:param time:
:type time:
`ArgumentType.Uint`
:param sym:
:type sym:
`ArgumentType.Uint`
:param state:
:type state:
`ArgumentType.Uint`
:param modifiers:
:type modifiers:
`ArgumentType.Uint`
"""
self._marshal(8, serial, time, sym, state, modifiers)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.NewId, interface=WlKeyboard),
)
def grab_keyboard(self) -> Proxy[WlKeyboard]:
"""Grab hardware keyboard
Allow an input method to receive hardware keyboard input and process
key events to generate text events (with pre-edit) over the wire. This
allows input methods which compose multiple key events for inputting
text like it is done for CJK languages.
:returns:
:class:`~pywayland.protocol.wayland.WlKeyboard`
"""
keyboard = self._marshal_constructor(9, WlKeyboard)
return keyboard
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def key(self, serial: int, time: int, key: int, state: int) -> None:
"""Forward key event
Forward a :class:`~pywayland.protocol.wayland.WlKeyboard`::key event to
the client that was not processed by the input method itself. Should be
used when filtering key events with grab_keyboard. The arguments
should be the ones from the
:class:`~pywayland.protocol.wayland.WlKeyboard`::key event.
For generating custom key events use the keysym request instead.
:param serial:
serial from :class:`~pywayland.protocol.wayland.WlKeyboard`::key
:type serial:
`ArgumentType.Uint`
:param time:
time from :class:`~pywayland.protocol.wayland.WlKeyboard`::key
:type time:
`ArgumentType.Uint`
:param key:
key from :class:`~pywayland.protocol.wayland.WlKeyboard`::key
:type key:
`ArgumentType.Uint`
:param state:
state from :class:`~pywayland.protocol.wayland.WlKeyboard`::key
:type state:
`ArgumentType.Uint`
"""
self._marshal(10, serial, time, key, state)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def modifiers(self, serial: int, mods_depressed: int, mods_latched: int, mods_locked: int, group: int) -> None:
"""Forward modifiers event
Forward a :class:`~pywayland.protocol.wayland.WlKeyboard`::modifiers
event to the client that was not processed by the input method itself.
Should be used when filtering key events with grab_keyboard. The
arguments should be the ones from the
:class:`~pywayland.protocol.wayland.WlKeyboard`::modifiers event.
:param serial:
serial from
:class:`~pywayland.protocol.wayland.WlKeyboard`::modifiers
:type serial:
`ArgumentType.Uint`
:param mods_depressed:
mods_depressed from
:class:`~pywayland.protocol.wayland.WlKeyboard`::modifiers
:type mods_depressed:
`ArgumentType.Uint`
:param mods_latched:
mods_latched from
:class:`~pywayland.protocol.wayland.WlKeyboard`::modifiers
:type mods_latched:
`ArgumentType.Uint`
:param mods_locked:
mods_locked from
:class:`~pywayland.protocol.wayland.WlKeyboard`::modifiers
:type mods_locked:
`ArgumentType.Uint`
:param group:
group from
:class:`~pywayland.protocol.wayland.WlKeyboard`::modifiers
:type group:
`ArgumentType.Uint`
"""
self._marshal(11, serial, mods_depressed, mods_latched, mods_locked, group)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.String),
)
def language(self, serial: int, language: str) -> None:
"""language
:param serial:
serial of the latest known text input state
:type serial:
`ArgumentType.Uint`
:param language:
:type language:
`ArgumentType.String`
"""
self._marshal(12, serial, language)
@ZwpInputMethodContextV1.request(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def text_direction(self, serial: int, direction: int) -> None:
"""text_direction
:param serial:
serial of the latest known text input state
:type serial:
`ArgumentType.Uint`
:param direction:
:type direction:
`ArgumentType.Uint`
"""
self._marshal(13, serial, direction)
class ZwpInputMethodContextV1Resource(Resource):
interface = ZwpInputMethodContextV1
@ZwpInputMethodContextV1.event(
Argument(ArgumentType.String),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def surrounding_text(self, text: str, cursor: int, anchor: int) -> None:
"""Surrounding text event
The plain surrounding text around the input position. Cursor is the
position in bytes within the surrounding text relative to the beginning
of the text. Anchor is the position in bytes of the selection anchor
within the surrounding text relative to the beginning of the text. If
there is no selected text then anchor is the same as cursor.
:param text:
:type text:
`ArgumentType.String`
:param cursor:
:type cursor:
`ArgumentType.Uint`
:param anchor:
:type anchor:
`ArgumentType.Uint`
"""
self._post_event(0, text, cursor, anchor)
@ZwpInputMethodContextV1.event()
def reset(self) -> None:
"""reset
"""
self._post_event(1)
@ZwpInputMethodContextV1.event(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def content_type(self, hint: int, purpose: int) -> None:
"""content_type
:param hint:
:type hint:
`ArgumentType.Uint`
:param purpose:
:type purpose:
`ArgumentType.Uint`
"""
self._post_event(2, hint, purpose)
@ZwpInputMethodContextV1.event(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def invoke_action(self, button: int, index: int) -> None:
"""invoke_action
:param button:
:type button:
`ArgumentType.Uint`
:param index:
:type index:
`ArgumentType.Uint`
"""
self._post_event(3, button, index)
@ZwpInputMethodContextV1.event(
Argument(ArgumentType.Uint),
)
def commit_state(self, serial: int) -> None:
"""commit_state
:param serial:
serial of text input state
:type serial:
`ArgumentType.Uint`
"""
self._post_event(4, serial)
@ZwpInputMethodContextV1.event(
Argument(ArgumentType.String),
)
def preferred_language(self, language: str) -> None:
"""preferred_language
:param language:
:type language:
`ArgumentType.String`
"""
self._post_event(5, language)
class ZwpInputMethodContextV1Global(Global):
interface = ZwpInputMethodContextV1
ZwpInputMethodContextV1._gen_c()
ZwpInputMethodContextV1.proxy_class = ZwpInputMethodContextV1Proxy
ZwpInputMethodContextV1.resource_class = ZwpInputMethodContextV1Resource
ZwpInputMethodContextV1.global_class = ZwpInputMethodContextV1Global

View File

@ -0,0 +1,97 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2012, 2013 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from .zwp_input_method_context_v1 import ZwpInputMethodContextV1
class ZwpInputMethodV1(Interface):
"""Input method
An input method object is responsible for composing text in response to
input from hardware or virtual keyboards. There is one input method object
per seat. On activate there is a new input method context object created
which allows the input method to communicate with the text input.
"""
name = "zwp_input_method_v1"
version = 1
class ZwpInputMethodV1Proxy(Proxy[ZwpInputMethodV1]):
interface = ZwpInputMethodV1
class ZwpInputMethodV1Resource(Resource):
interface = ZwpInputMethodV1
@ZwpInputMethodV1.event(
Argument(ArgumentType.NewId, interface=ZwpInputMethodContextV1),
)
def activate(self, id: ZwpInputMethodContextV1) -> None:
"""Activate event
A text input was activated. Creates an input method context object
which allows communication with the text input.
:param id:
:type id:
:class:`~pywayland.protocol.input_method_unstable_v1.ZwpInputMethodContextV1`
"""
self._post_event(0, id)
@ZwpInputMethodV1.event(
Argument(ArgumentType.Object, interface=ZwpInputMethodContextV1),
)
def deactivate(self, context: ZwpInputMethodContextV1) -> None:
"""Deactivate event
The text input corresponding to the context argument was deactivated.
The input method context should be destroyed after deactivation is
handled.
:param context:
:type context:
:class:`~pywayland.protocol.input_method_unstable_v1.ZwpInputMethodContextV1`
"""
self._post_event(1, context)
class ZwpInputMethodV1Global(Global):
interface = ZwpInputMethodV1
ZwpInputMethodV1._gen_c()
ZwpInputMethodV1.proxy_class = ZwpInputMethodV1Proxy
ZwpInputMethodV1.resource_class = ZwpInputMethodV1Resource
ZwpInputMethodV1.global_class = ZwpInputMethodV1Global

View File

@ -0,0 +1,93 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2012, 2013 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlOutput
class ZwpInputPanelSurfaceV1(Interface):
name = "zwp_input_panel_surface_v1"
version = 1
class position(enum.IntEnum):
center_bottom = 0
class ZwpInputPanelSurfaceV1Proxy(Proxy[ZwpInputPanelSurfaceV1]):
interface = ZwpInputPanelSurfaceV1
@ZwpInputPanelSurfaceV1.request(
Argument(ArgumentType.Object, interface=WlOutput),
Argument(ArgumentType.Uint),
)
def set_toplevel(self, output: WlOutput, position: int) -> None:
"""Set the surface type as a keyboard
Set the input_panel_surface type to keyboard.
A keyboard surface is only shown when a text input is active.
:param output:
:type output:
:class:`~pywayland.protocol.wayland.WlOutput`
:param position:
:type position:
`ArgumentType.Uint`
"""
self._marshal(0, output, position)
@ZwpInputPanelSurfaceV1.request()
def set_overlay_panel(self) -> None:
"""Set the surface type as an overlay panel
Set the input_panel_surface to be an overlay panel.
This is shown near the input cursor above the application window when a
text input is active.
"""
self._marshal(1)
class ZwpInputPanelSurfaceV1Resource(Resource):
interface = ZwpInputPanelSurfaceV1
class ZwpInputPanelSurfaceV1Global(Global):
interface = ZwpInputPanelSurfaceV1
ZwpInputPanelSurfaceV1._gen_c()
ZwpInputPanelSurfaceV1.proxy_class = ZwpInputPanelSurfaceV1Proxy
ZwpInputPanelSurfaceV1.resource_class = ZwpInputPanelSurfaceV1Resource
ZwpInputPanelSurfaceV1.global_class = ZwpInputPanelSurfaceV1Global

View File

@ -0,0 +1,80 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2012, 2013 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSurface
from .zwp_input_panel_surface_v1 import ZwpInputPanelSurfaceV1
class ZwpInputPanelV1(Interface):
"""Interface for implementing keyboards
Only one client can bind this interface at a time.
"""
name = "zwp_input_panel_v1"
version = 1
class ZwpInputPanelV1Proxy(Proxy[ZwpInputPanelV1]):
interface = ZwpInputPanelV1
@ZwpInputPanelV1.request(
Argument(ArgumentType.NewId, interface=ZwpInputPanelSurfaceV1),
Argument(ArgumentType.Object, interface=WlSurface),
)
def get_input_panel_surface(self, surface: WlSurface) -> Proxy[ZwpInputPanelSurfaceV1]:
"""get_input_panel_surface
:param surface:
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:returns:
:class:`~pywayland.protocol.input_method_unstable_v1.ZwpInputPanelSurfaceV1`
"""
id = self._marshal_constructor(0, ZwpInputPanelSurfaceV1, surface)
return id
class ZwpInputPanelV1Resource(Resource):
interface = ZwpInputPanelV1
class ZwpInputPanelV1Global(Global):
interface = ZwpInputPanelV1
ZwpInputPanelV1._gen_c()
ZwpInputPanelV1.proxy_class = ZwpInputPanelV1Proxy
ZwpInputPanelV1.resource_class = ZwpInputPanelV1Resource
ZwpInputPanelV1.global_class = ZwpInputPanelV1Global

View File

@ -0,0 +1,25 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2017 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.
from .zwp_input_timestamps_manager_v1 import ZwpInputTimestampsManagerV1 # noqa: F401
from .zwp_input_timestamps_v1 import ZwpInputTimestampsV1 # noqa: F401

View File

@ -0,0 +1,166 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2017 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlKeyboard
from ..wayland import WlPointer
from ..wayland import WlTouch
from .zwp_input_timestamps_v1 import ZwpInputTimestampsV1
class ZwpInputTimestampsManagerV1(Interface):
"""Context object for high-resolution input timestamps
A global interface used for requesting high-resolution timestamps for input
events.
"""
name = "zwp_input_timestamps_manager_v1"
version = 1
class ZwpInputTimestampsManagerV1Proxy(Proxy[ZwpInputTimestampsManagerV1]):
interface = ZwpInputTimestampsManagerV1
@ZwpInputTimestampsManagerV1.request()
def destroy(self) -> None:
"""Destroy the input timestamps manager object
Informs the server that the client will no longer be using this
protocol object. Existing objects created by this object are not
affected.
"""
self._marshal(0)
self._destroy()
@ZwpInputTimestampsManagerV1.request(
Argument(ArgumentType.NewId, interface=ZwpInputTimestampsV1),
Argument(ArgumentType.Object, interface=WlKeyboard),
)
def get_keyboard_timestamps(self, keyboard: WlKeyboard) -> Proxy[ZwpInputTimestampsV1]:
"""Subscribe to high-resolution keyboard timestamp events
Creates a new input timestamps object that represents a subscription to
high-resolution timestamp events for all
:class:`~pywayland.protocol.wayland.WlKeyboard` events that carry a
timestamp.
If the associated :class:`~pywayland.protocol.wayland.WlKeyboard`
object is invalidated, either through client action (e.g. release) or
server-side changes, the input timestamps object becomes inert and the
client should destroy it by calling
:func:`ZwpInputTimestampsV1.destroy()
<pywayland.protocol.input_timestamps_unstable_v1.ZwpInputTimestampsV1.destroy>`.
:param keyboard:
the :class:`~pywayland.protocol.wayland.WlKeyboard` object for
which to get timestamp events
:type keyboard:
:class:`~pywayland.protocol.wayland.WlKeyboard`
:returns:
:class:`~pywayland.protocol.input_timestamps_unstable_v1.ZwpInputTimestampsV1`
"""
id = self._marshal_constructor(1, ZwpInputTimestampsV1, keyboard)
return id
@ZwpInputTimestampsManagerV1.request(
Argument(ArgumentType.NewId, interface=ZwpInputTimestampsV1),
Argument(ArgumentType.Object, interface=WlPointer),
)
def get_pointer_timestamps(self, pointer: WlPointer) -> Proxy[ZwpInputTimestampsV1]:
"""Subscribe to high-resolution pointer timestamp events
Creates a new input timestamps object that represents a subscription to
high-resolution timestamp events for all
:class:`~pywayland.protocol.wayland.WlPointer` events that carry a
timestamp.
If the associated :class:`~pywayland.protocol.wayland.WlPointer` object
is invalidated, either through client action (e.g. release) or server-
side changes, the input timestamps object becomes inert and the client
should destroy it by calling :func:`ZwpInputTimestampsV1.destroy()
<pywayland.protocol.input_timestamps_unstable_v1.ZwpInputTimestampsV1.destroy>`.
:param pointer:
the :class:`~pywayland.protocol.wayland.WlPointer` object for which
to get timestamp events
:type pointer:
:class:`~pywayland.protocol.wayland.WlPointer`
:returns:
:class:`~pywayland.protocol.input_timestamps_unstable_v1.ZwpInputTimestampsV1`
"""
id = self._marshal_constructor(2, ZwpInputTimestampsV1, pointer)
return id
@ZwpInputTimestampsManagerV1.request(
Argument(ArgumentType.NewId, interface=ZwpInputTimestampsV1),
Argument(ArgumentType.Object, interface=WlTouch),
)
def get_touch_timestamps(self, touch: WlTouch) -> Proxy[ZwpInputTimestampsV1]:
"""Subscribe to high-resolution touch timestamp events
Creates a new input timestamps object that represents a subscription to
high-resolution timestamp events for all
:class:`~pywayland.protocol.wayland.WlTouch` events that carry a
timestamp.
If the associated :class:`~pywayland.protocol.wayland.WlTouch` object
becomes invalid, either through client action (e.g. release) or server-
side changes, the input timestamps object becomes inert and the client
should destroy it by calling :func:`ZwpInputTimestampsV1.destroy()
<pywayland.protocol.input_timestamps_unstable_v1.ZwpInputTimestampsV1.destroy>`.
:param touch:
the :class:`~pywayland.protocol.wayland.WlTouch` object for which
to get timestamp events
:type touch:
:class:`~pywayland.protocol.wayland.WlTouch`
:returns:
:class:`~pywayland.protocol.input_timestamps_unstable_v1.ZwpInputTimestampsV1`
"""
id = self._marshal_constructor(3, ZwpInputTimestampsV1, touch)
return id
class ZwpInputTimestampsManagerV1Resource(Resource):
interface = ZwpInputTimestampsManagerV1
class ZwpInputTimestampsManagerV1Global(Global):
interface = ZwpInputTimestampsManagerV1
ZwpInputTimestampsManagerV1._gen_c()
ZwpInputTimestampsManagerV1.proxy_class = ZwpInputTimestampsManagerV1Proxy
ZwpInputTimestampsManagerV1.resource_class = ZwpInputTimestampsManagerV1Resource
ZwpInputTimestampsManagerV1.global_class = ZwpInputTimestampsManagerV1Global

View File

@ -0,0 +1,114 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2017 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class ZwpInputTimestampsV1(Interface):
"""Context object for input timestamps
Provides high-resolution timestamp events for a set of subscribed input
events. The set of subscribed input events is determined by the
:class:`~pywayland.protocol.input_timestamps_unstable_v1.ZwpInputTimestampsManagerV1`
request used to create this object.
"""
name = "zwp_input_timestamps_v1"
version = 1
class ZwpInputTimestampsV1Proxy(Proxy[ZwpInputTimestampsV1]):
interface = ZwpInputTimestampsV1
@ZwpInputTimestampsV1.request()
def destroy(self) -> None:
"""Destroy the input timestamps object
Informs the server that the client will no longer be using this
protocol object. After the server processes the request, no more
timestamp events will be emitted.
"""
self._marshal(0)
self._destroy()
class ZwpInputTimestampsV1Resource(Resource):
interface = ZwpInputTimestampsV1
@ZwpInputTimestampsV1.event(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def timestamp(self, tv_sec_hi: int, tv_sec_lo: int, tv_nsec: int) -> None:
"""High-resolution timestamp event
The timestamp event is associated with the first subsequent input event
carrying a timestamp which belongs to the set of input events this
object is subscribed to.
The timestamp provided by this event is a high-resolution version of
the timestamp argument of the associated input event. The provided
timestamp is in the same clock domain and is at least as accurate as
the associated input event timestamp.
The timestamp is expressed as tv_sec_hi, tv_sec_lo, tv_nsec triples,
each component being an unsigned 32-bit value. Whole seconds are in
tv_sec which is a 64-bit value combined from tv_sec_hi and tv_sec_lo,
and the additional fractional part in tv_nsec as nanoseconds. Hence,
for valid timestamps tv_nsec must be in [0, 999999999].
:param tv_sec_hi:
high 32 bits of the seconds part of the timestamp
:type tv_sec_hi:
`ArgumentType.Uint`
:param tv_sec_lo:
low 32 bits of the seconds part of the timestamp
:type tv_sec_lo:
`ArgumentType.Uint`
:param tv_nsec:
nanoseconds part of the timestamp
:type tv_nsec:
`ArgumentType.Uint`
"""
self._post_event(0, tv_sec_hi, tv_sec_lo, tv_nsec)
class ZwpInputTimestampsV1Global(Global):
interface = ZwpInputTimestampsV1
ZwpInputTimestampsV1._gen_c()
ZwpInputTimestampsV1.proxy_class = ZwpInputTimestampsV1Proxy
ZwpInputTimestampsV1.resource_class = ZwpInputTimestampsV1Resource
ZwpInputTimestampsV1.global_class = ZwpInputTimestampsV1Global

View File

@ -0,0 +1,25 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2017 Red Hat Inc.
#
# 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.
from .zwp_keyboard_shortcuts_inhibit_manager_v1 import ZwpKeyboardShortcutsInhibitManagerV1 # noqa: F401
from .zwp_keyboard_shortcuts_inhibitor_v1 import ZwpKeyboardShortcutsInhibitorV1 # noqa: F401

View File

@ -0,0 +1,107 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2017 Red Hat Inc.
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSeat
from ..wayland import WlSurface
from .zwp_keyboard_shortcuts_inhibitor_v1 import ZwpKeyboardShortcutsInhibitorV1
class ZwpKeyboardShortcutsInhibitManagerV1(Interface):
"""Context object for keyboard grab_manager
A global interface used for inhibiting the compositor keyboard shortcuts.
"""
name = "zwp_keyboard_shortcuts_inhibit_manager_v1"
version = 1
class error(enum.IntEnum):
already_inhibited = 0
class ZwpKeyboardShortcutsInhibitManagerV1Proxy(Proxy[ZwpKeyboardShortcutsInhibitManagerV1]):
interface = ZwpKeyboardShortcutsInhibitManagerV1
@ZwpKeyboardShortcutsInhibitManagerV1.request()
def destroy(self) -> None:
"""Destroy the keyboard shortcuts inhibitor object
Destroy the keyboard shortcuts inhibitor manager.
"""
self._marshal(0)
self._destroy()
@ZwpKeyboardShortcutsInhibitManagerV1.request(
Argument(ArgumentType.NewId, interface=ZwpKeyboardShortcutsInhibitorV1),
Argument(ArgumentType.Object, interface=WlSurface),
Argument(ArgumentType.Object, interface=WlSeat),
)
def inhibit_shortcuts(self, surface: WlSurface, seat: WlSeat) -> Proxy[ZwpKeyboardShortcutsInhibitorV1]:
"""Create a new keyboard shortcuts inhibitor object
Create a new keyboard shortcuts inhibitor object associated with the
given surface for the given seat.
If shortcuts are already inhibited for the specified seat and surface,
a protocol error "already_inhibited" is raised by the compositor.
:param surface:
the surface that inhibits the keyboard shortcuts behavior
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:param seat:
the :class:`~pywayland.protocol.wayland.WlSeat` for which keyboard
shortcuts should be disabled
:type seat:
:class:`~pywayland.protocol.wayland.WlSeat`
:returns:
:class:`~pywayland.protocol.keyboard_shortcuts_inhibit_unstable_v1.ZwpKeyboardShortcutsInhibitorV1`
"""
id = self._marshal_constructor(1, ZwpKeyboardShortcutsInhibitorV1, surface, seat)
return id
class ZwpKeyboardShortcutsInhibitManagerV1Resource(Resource):
interface = ZwpKeyboardShortcutsInhibitManagerV1
class ZwpKeyboardShortcutsInhibitManagerV1Global(Global):
interface = ZwpKeyboardShortcutsInhibitManagerV1
ZwpKeyboardShortcutsInhibitManagerV1._gen_c()
ZwpKeyboardShortcutsInhibitManagerV1.proxy_class = ZwpKeyboardShortcutsInhibitManagerV1Proxy
ZwpKeyboardShortcutsInhibitManagerV1.resource_class = ZwpKeyboardShortcutsInhibitManagerV1Resource
ZwpKeyboardShortcutsInhibitManagerV1.global_class = ZwpKeyboardShortcutsInhibitManagerV1Global

View File

@ -0,0 +1,120 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2017 Red Hat Inc.
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import Global, Interface, Proxy, Resource
class ZwpKeyboardShortcutsInhibitorV1(Interface):
"""Context object for keyboard shortcuts inhibitor
A keyboard shortcuts inhibitor instructs the compositor to ignore its own
keyboard shortcuts when the associated surface has keyboard focus. As a
result, when the surface has keyboard focus on the given seat, it will
receive all key events originating from the specified seat, even those
which would normally be caught by the compositor for its own shortcuts.
The Wayland compositor is however under no obligation to disable all of its
shortcuts, and may keep some special key combo for its own use, including
but not limited to one allowing the user to forcibly restore normal
keyboard events routing in the case of an unwilling client. The compositor
may also use the same key combo to reactivate an existing shortcut
inhibitor that was previously deactivated on user request.
When the compositor restores its own keyboard shortcuts, an "inactive"
event is emitted to notify the client that the keyboard shortcuts inhibitor
is not effectively active for the surface and seat any more, and the client
should not expect to receive all keyboard events.
When the keyboard shortcuts inhibitor is inactive, the client has no way to
forcibly reactivate the keyboard shortcuts inhibitor.
The user can chose to re-enable a previously deactivated keyboard shortcuts
inhibitor using any mechanism the compositor may offer, in which case the
compositor will send an "active" event to notify the client.
If the surface is destroyed, unmapped, or loses the seat's keyboard focus,
the keyboard shortcuts inhibitor becomes irrelevant and the compositor will
restore its own keyboard shortcuts but no "inactive" event is emitted in
this case.
"""
name = "zwp_keyboard_shortcuts_inhibitor_v1"
version = 1
class ZwpKeyboardShortcutsInhibitorV1Proxy(Proxy[ZwpKeyboardShortcutsInhibitorV1]):
interface = ZwpKeyboardShortcutsInhibitorV1
@ZwpKeyboardShortcutsInhibitorV1.request()
def destroy(self) -> None:
"""Destroy the keyboard shortcuts inhibitor object
Remove the keyboard shortcuts inhibitor from the associated
:class:`~pywayland.protocol.wayland.WlSurface`.
"""
self._marshal(0)
self._destroy()
class ZwpKeyboardShortcutsInhibitorV1Resource(Resource):
interface = ZwpKeyboardShortcutsInhibitorV1
@ZwpKeyboardShortcutsInhibitorV1.event()
def active(self) -> None:
"""Shortcuts are inhibited
This event indicates that the shortcut inhibitor is active.
The compositor sends this event every time compositor shortcuts are
inhibited on behalf of the surface. When active, the client may receive
input events normally reserved by the compositor (see
:class:`ZwpKeyboardShortcutsInhibitorV1`).
This occurs typically when the initial request "inhibit_shortcuts"
first becomes active or when the user instructs the compositor to re-
enable and existing shortcuts inhibitor using any mechanism offered by
the compositor.
"""
self._post_event(0)
@ZwpKeyboardShortcutsInhibitorV1.event()
def inactive(self) -> None:
"""Shortcuts are restored
This event indicates that the shortcuts inhibitor is inactive, normal
shortcuts processing is restored by the compositor.
"""
self._post_event(1)
class ZwpKeyboardShortcutsInhibitorV1Global(Global):
interface = ZwpKeyboardShortcutsInhibitorV1
ZwpKeyboardShortcutsInhibitorV1._gen_c()
ZwpKeyboardShortcutsInhibitorV1.proxy_class = ZwpKeyboardShortcutsInhibitorV1Proxy
ZwpKeyboardShortcutsInhibitorV1.resource_class = ZwpKeyboardShortcutsInhibitorV1Resource
ZwpKeyboardShortcutsInhibitorV1.global_class = ZwpKeyboardShortcutsInhibitorV1Global

View File

@ -0,0 +1,26 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014, 2015 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.
from .zwp_linux_buffer_params_v1 import ZwpLinuxBufferParamsV1 # noqa: F401
from .zwp_linux_dmabuf_feedback_v1 import ZwpLinuxDmabufFeedbackV1 # noqa: F401
from .zwp_linux_dmabuf_v1 import ZwpLinuxDmabufV1 # noqa: F401

View File

@ -0,0 +1,336 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014, 2015 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlBuffer
class ZwpLinuxBufferParamsV1(Interface):
"""Parameters for creating a dmabuf-based :class:`~pywayland.protocol.wayland.WlBuffer`
This temporary object is a collection of dmabufs and other parameters that
together form a single logical buffer. The temporary object may eventually
create one :class:`~pywayland.protocol.wayland.WlBuffer` unless cancelled
by destroying it before requesting 'create'.
Single-planar formats only require one dmabuf, however multi-planar formats
may require more than one dmabuf. For all formats, an 'add' request must be
called once per plane (even if the underlying dmabuf fd is identical).
You must use consecutive plane indices ('plane_idx' argument for 'add')
from zero to the number of planes used by the drm_fourcc format code. All
planes required by the format must be given exactly once, but can be given
in any order. Each plane index can be set only once.
"""
name = "zwp_linux_buffer_params_v1"
version = 4
class error(enum.IntEnum):
already_used = 0
plane_idx = 1
plane_set = 2
incomplete = 3
invalid_format = 4
invalid_dimensions = 5
out_of_bounds = 6
invalid_wl_buffer = 7
class flags(enum.IntFlag):
y_invert = 1
interlaced = 2
bottom_first = 4
class ZwpLinuxBufferParamsV1Proxy(Proxy[ZwpLinuxBufferParamsV1]):
interface = ZwpLinuxBufferParamsV1
@ZwpLinuxBufferParamsV1.request()
def destroy(self) -> None:
"""Delete this object, used or not
Cleans up the temporary data sent to the server for dmabuf-based
:class:`~pywayland.protocol.wayland.WlBuffer` creation.
"""
self._marshal(0)
self._destroy()
@ZwpLinuxBufferParamsV1.request(
Argument(ArgumentType.FileDescriptor),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def add(self, fd: int, plane_idx: int, offset: int, stride: int, modifier_hi: int, modifier_lo: int) -> None:
"""Add a dmabuf to the temporary set
This request adds one dmabuf to the set in this
:class:`ZwpLinuxBufferParamsV1`.
The 64-bit unsigned value combined from modifier_hi and modifier_lo is
the dmabuf layout modifier. DRM AddFB2 ioctl calls this the fb
modifier, which is defined in drm_mode.h of Linux UAPI. This is an
opaque token. Drivers use this token to express tiling, compression,
etc. driver-specific modifications to the base format defined by the
DRM fourcc code.
Starting from version 4, the invalid_format protocol error is sent if
the format + modifier pair was not advertised as supported.
This request raises the PLANE_IDX error if plane_idx is too large. The
error PLANE_SET is raised if attempting to set a plane that was already
set.
:param fd:
dmabuf fd
:type fd:
`ArgumentType.FileDescriptor`
:param plane_idx:
plane index
:type plane_idx:
`ArgumentType.Uint`
:param offset:
offset in bytes
:type offset:
`ArgumentType.Uint`
:param stride:
stride in bytes
:type stride:
`ArgumentType.Uint`
:param modifier_hi:
high 32 bits of layout modifier
:type modifier_hi:
`ArgumentType.Uint`
:param modifier_lo:
low 32 bits of layout modifier
:type modifier_lo:
`ArgumentType.Uint`
"""
self._marshal(1, fd, plane_idx, offset, stride, modifier_hi, modifier_lo)
@ZwpLinuxBufferParamsV1.request(
Argument(ArgumentType.Int),
Argument(ArgumentType.Int),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
)
def create(self, width: int, height: int, format: int, flags: int) -> None:
"""Create a :class:`~pywayland.protocol.wayland.WlBuffer` from the given dmabufs
This asks for creation of a
:class:`~pywayland.protocol.wayland.WlBuffer` from the added dmabuf
buffers. The :class:`~pywayland.protocol.wayland.WlBuffer` is not
created immediately but returned via the 'created' event if the dmabuf
sharing succeeds. The sharing may fail at runtime for reasons a client
cannot predict, in which case the 'failed' event is triggered.
The 'format' argument is a DRM_FORMAT code, as defined by the libdrm's
drm_fourcc.h. The Linux kernel's DRM sub-system is the authoritative
source on how the format codes should work.
The 'flags' is a bitfield of the flags defined in enum "flags".
'y_invert' means the that the image needs to be y-flipped.
Flag 'interlaced' means that the frame in the buffer is not progressive
as usual, but interlaced. An interlaced buffer as supported here must
always contain both top and bottom fields. The top field always begins
on the first pixel row. The temporal ordering between the two fields is
top field first, unless 'bottom_first' is specified. It is undefined
whether 'bottom_first' is ignored if 'interlaced' is not set.
This protocol does not convey any information about field rate,
duration, or timing, other than the relative ordering between the two
fields in one buffer. A compositor may have to estimate the intended
field rate from the incoming buffer rate. It is undefined whether the
time of receiving :func:`WlSurface.commit()
<pywayland.protocol.wayland.WlSurface.commit>` with a new buffer
attached, applying the :class:`~pywayland.protocol.wayland.WlSurface`
state, :func:`WlSurface.frame()
<pywayland.protocol.wayland.WlSurface.frame>` callback trigger,
presentation, or any other point in the compositor cycle is used to
measure the frame or field times. There is no support for detecting
missed or late frames/fields/buffers either, and there is no support
whatsoever for cooperating with interlaced compositor output.
The composited image quality resulting from the use of interlaced
buffers is explicitly undefined. A compositor may use elaborate
hardware features or software to deinterlace and create progressive
output frames from a sequence of interlaced input buffers, or it may
produce substandard image quality. However, compositors that cannot
guarantee reasonable image quality in all cases are recommended to just
reject all interlaced buffers.
Any argument errors, including non-positive width or height, mismatch
between the number of planes and the format, bad format, bad offset or
stride, may be indicated by fatal protocol errors: INCOMPLETE,
INVALID_FORMAT, INVALID_DIMENSIONS, OUT_OF_BOUNDS.
Dmabuf import errors in the server that are not obvious client bugs are
returned via the 'failed' event as non-fatal. This allows attempting
dmabuf sharing and falling back in the client if it fails.
This request can be sent only once in the object's lifetime, after
which the only legal request is destroy. This object should be
destroyed after issuing a 'create' request. Attempting to use this
object after issuing 'create' raises ALREADY_USED protocol error.
It is not mandatory to issue 'create'. If a client wants to cancel the
buffer creation, it can just destroy this object.
:param width:
base plane width in pixels
:type width:
`ArgumentType.Int`
:param height:
base plane height in pixels
:type height:
`ArgumentType.Int`
:param format:
DRM_FORMAT code
:type format:
`ArgumentType.Uint`
:param flags:
see enum flags
:type flags:
`ArgumentType.Uint`
"""
self._marshal(2, width, height, format, flags)
@ZwpLinuxBufferParamsV1.request(
Argument(ArgumentType.NewId, interface=WlBuffer),
Argument(ArgumentType.Int),
Argument(ArgumentType.Int),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
version=2,
)
def create_immed(self, width: int, height: int, format: int, flags: int) -> Proxy[WlBuffer]:
"""Immediately create a :class:`~pywayland.protocol.wayland.WlBuffer` from the given dmabufs
This asks for immediate creation of a
:class:`~pywayland.protocol.wayland.WlBuffer` by importing the added
dmabufs.
In case of import success, no event is sent from the server, and the
:class:`~pywayland.protocol.wayland.WlBuffer` is ready to be used by
the client.
Upon import failure, either of the following may happen, as seen fit by
the implementation: - the client is terminated with one of the
following fatal protocol errors: - INCOMPLETE, INVALID_FORMAT,
INVALID_DIMENSIONS, OUT_OF_BOUNDS, in case of argument errors such
as mismatch between the number of planes and the format, bad
format, non-positive width or height, or bad offset or stride. -
INVALID_WL_BUFFER, in case the cause for failure is unknown or
plaform specific. - the server creates an invalid
:class:`~pywayland.protocol.wayland.WlBuffer`, marks it as failed and
sends a 'failed' event to the client. The result of using this
invalid :class:`~pywayland.protocol.wayland.WlBuffer` as an argument in
any request by the client is defined by the compositor
implementation.
This takes the same arguments as a 'create' request, and obeys the same
restrictions.
:param width:
base plane width in pixels
:type width:
`ArgumentType.Int`
:param height:
base plane height in pixels
:type height:
`ArgumentType.Int`
:param format:
DRM_FORMAT code
:type format:
`ArgumentType.Uint`
:param flags:
see enum flags
:type flags:
`ArgumentType.Uint`
:returns:
:class:`~pywayland.protocol.wayland.WlBuffer` -- id for the newly
created :class:`~pywayland.protocol.wayland.WlBuffer`
"""
buffer_id = self._marshal_constructor(3, WlBuffer, width, height, format, flags)
return buffer_id
class ZwpLinuxBufferParamsV1Resource(Resource):
interface = ZwpLinuxBufferParamsV1
@ZwpLinuxBufferParamsV1.event(
Argument(ArgumentType.NewId, interface=WlBuffer),
)
def created(self, buffer: WlBuffer) -> None:
"""Buffer creation succeeded
This event indicates that the attempted buffer creation was successful.
It provides the new :class:`~pywayland.protocol.wayland.WlBuffer`
referencing the dmabuf(s).
Upon receiving this event, the client should destroy the
:class:`ZwpLinuxBufferParamsV1` object.
:param buffer:
the newly created :class:`~pywayland.protocol.wayland.WlBuffer`
:type buffer:
:class:`~pywayland.protocol.wayland.WlBuffer`
"""
self._post_event(0, buffer)
@ZwpLinuxBufferParamsV1.event()
def failed(self) -> None:
"""Buffer creation failed
This event indicates that the attempted buffer creation has failed. It
usually means that one of the dmabuf constraints has not been
fulfilled.
Upon receiving this event, the client should destroy the
:class:`ZwpLinuxBufferParamsV1` object.
"""
self._post_event(1)
class ZwpLinuxBufferParamsV1Global(Global):
interface = ZwpLinuxBufferParamsV1
ZwpLinuxBufferParamsV1._gen_c()
ZwpLinuxBufferParamsV1.proxy_class = ZwpLinuxBufferParamsV1Proxy
ZwpLinuxBufferParamsV1.resource_class = ZwpLinuxBufferParamsV1Resource
ZwpLinuxBufferParamsV1.global_class = ZwpLinuxBufferParamsV1Global

View File

@ -0,0 +1,294 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014, 2015 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
class ZwpLinuxDmabufFeedbackV1(Interface):
"""Dmabuf feedback
This object advertises dmabuf parameters feedback. This includes the
preferred devices and the supported formats/modifiers.
The parameters are sent once when this object is created and whenever they
change. The done event is always sent once after all parameters have been
sent. When a single parameter changes, all parameters are re-sent by the
compositor.
Compositors can re-send the parameters when the current client buffer
allocations are sub-optimal. Compositors should not re-send the parameters
if re-allocating the buffers would not result in a more optimal
configuration. In particular, compositors should avoid sending the exact
same parameters multiple times in a row.
The tranche_target_device and tranche_formats events are grouped by
tranches of preference. For each tranche, a tranche_target_device, one
tranche_flags and one or more tranche_formats events are sent, followed by
a tranche_done event finishing the list. The tranches are sent in
descending order of preference. All formats and modifiers in the same
tranche have the same preference.
To send parameters, the compositor sends one main_device event, tranches
(each consisting of one tranche_target_device event, one tranche_flags
event, tranche_formats events and then a tranche_done event), then one done
event.
"""
name = "zwp_linux_dmabuf_feedback_v1"
version = 4
class tranche_flags(enum.IntFlag):
scanout = 1
class ZwpLinuxDmabufFeedbackV1Proxy(Proxy[ZwpLinuxDmabufFeedbackV1]):
interface = ZwpLinuxDmabufFeedbackV1
@ZwpLinuxDmabufFeedbackV1.request()
def destroy(self) -> None:
"""Destroy the feedback object
Using this request a client can tell the server that it is not going to
use the wp_linux_dmabuf_feedback object anymore.
"""
self._marshal(0)
self._destroy()
class ZwpLinuxDmabufFeedbackV1Resource(Resource):
interface = ZwpLinuxDmabufFeedbackV1
@ZwpLinuxDmabufFeedbackV1.event()
def done(self) -> None:
"""All feedback has been sent
This event is sent after all parameters of a wp_linux_dmabuf_feedback
object have been sent.
This allows changes to the wp_linux_dmabuf_feedback parameters to be
seen as atomic, even if they happen via multiple events.
"""
self._post_event(0)
@ZwpLinuxDmabufFeedbackV1.event(
Argument(ArgumentType.FileDescriptor),
Argument(ArgumentType.Uint),
)
def format_table(self, fd: int, size: int) -> None:
"""Format and modifier table
This event provides a file descriptor which can be memory-mapped to
access the format and modifier table.
The table contains a tightly packed array of consecutive format +
modifier pairs. Each pair is 16 bytes wide. It contains a format as a
32-bit unsigned integer, followed by 4 bytes of unused padding, and a
modifier as a 64-bit unsigned integer. The native endianness is used.
The client must map the file descriptor in read-only private mode.
Compositors are not allowed to mutate the table file contents once this
event has been sent. Instead, compositors must create a new, separate
table file and re-send feedback parameters. Compositors are allowed to
store duplicate format + modifier pairs in the table.
:param fd:
table file descriptor
:type fd:
`ArgumentType.FileDescriptor`
:param size:
table size, in bytes
:type size:
`ArgumentType.Uint`
"""
self._post_event(1, fd, size)
@ZwpLinuxDmabufFeedbackV1.event(
Argument(ArgumentType.Array),
)
def main_device(self, device: list) -> None:
"""Preferred main device
This event advertises the main device that the server prefers to use
when direct scan-out to the target device isn't possible. The
advertised main device may be different for each
wp_linux_dmabuf_feedback object, and may change over time.
There is exactly one main device. The compositor must send at least one
preference tranche with tranche_target_device equal to main_device.
Clients need to create buffers that the main device can import and read
from, otherwise creating the dmabuf
:class:`~pywayland.protocol.wayland.WlBuffer` will fail (see the
wp_linux_buffer_params.create and create_immed requests for details).
The main device will also likely be kept active by the compositor, so
clients can use it instead of waking up another device for power
savings.
In general the device is a DRM node. The DRM node type (primary vs.
render) is unspecified. Clients must not rely on the compositor sending
a particular node type. Clients cannot check two devices for equality
by comparing the dev_t value.
If explicit modifiers are not supported and the client performs buffer
allocations on a different device than the main device, then the client
must force the buffer to have a linear layout.
:param device:
device dev_t value
:type device:
`ArgumentType.Array`
"""
self._post_event(2, device)
@ZwpLinuxDmabufFeedbackV1.event()
def tranche_done(self) -> None:
"""A preference tranche has been sent
This event splits tranche_target_device and tranche_formats events in
preference tranches. It is sent after a set of tranche_target_device
and tranche_formats events; it represents the end of a tranche. The
next tranche will have a lower preference.
"""
self._post_event(3)
@ZwpLinuxDmabufFeedbackV1.event(
Argument(ArgumentType.Array),
)
def tranche_target_device(self, device: list) -> None:
"""Target device
This event advertises the target device that the server prefers to use
for a buffer created given this tranche. The advertised target device
may be different for each preference tranche, and may change over time.
There is exactly one target device per tranche.
The target device may be a scan-out device, for example if the
compositor prefers to directly scan-out a buffer created given this
tranche. The target device may be a rendering device, for example if
the compositor prefers to texture from said buffer.
The client can use this hint to allocate the buffer in a way that makes
it accessible from the target device, ideally directly. The buffer must
still be accessible from the main device, either through direct import
or through a potentially more expensive fallback path. If the buffer
can't be directly imported from the main device then clients must be
prepared for the compositor changing the tranche priority or making
:class:`~pywayland.protocol.wayland.WlBuffer` creation fail (see the
wp_linux_buffer_params.create and create_immed requests for details).
If the device is a DRM node, the DRM node type (primary vs. render) is
unspecified. Clients must not rely on the compositor sending a
particular node type. Clients cannot check two devices for equality by
comparing the dev_t value.
This event is tied to a preference tranche, see the tranche_done event.
:param device:
device dev_t value
:type device:
`ArgumentType.Array`
"""
self._post_event(4, device)
@ZwpLinuxDmabufFeedbackV1.event(
Argument(ArgumentType.Array),
)
def tranche_formats(self, indices: list) -> None:
"""Supported buffer format modifier
This event advertises the format + modifier combinations that the
compositor supports.
It carries an array of indices, each referring to a format + modifier
pair in the last received format table (see the format_table event).
Each index is a 16-bit unsigned integer in native endianness.
For legacy support, DRM_FORMAT_MOD_INVALID is an allowed modifier. It
indicates that the server can support the format with an implicit
modifier. When a buffer has DRM_FORMAT_MOD_INVALID as its modifier, it
is as if no explicit modifier is specified. The effective modifier will
be derived from the dmabuf.
A compositor that sends valid modifiers and DRM_FORMAT_MOD_INVALID for
a given format supports both explicit modifiers and implicit modifiers.
Compositors must not send duplicate format + modifier pairs within the
same tranche or across two different tranches with the same target
device and flags.
This event is tied to a preference tranche, see the tranche_done event.
For the definition of the format and modifier codes, see the
wp_linux_buffer_params.create request.
:param indices:
array of 16-bit indexes
:type indices:
`ArgumentType.Array`
"""
self._post_event(5, indices)
@ZwpLinuxDmabufFeedbackV1.event(
Argument(ArgumentType.Uint),
)
def tranche_flags(self, flags: int) -> None:
"""Tranche flags
This event sets tranche-specific flags.
The scanout flag is a hint that direct scan-out may be attempted by the
compositor on the target device if the client appropriately allocates a
buffer. How to allocate a buffer that can be scanned out on the target
device is implementation-defined.
This event is tied to a preference tranche, see the tranche_done event.
:param flags:
tranche flags
:type flags:
`ArgumentType.Uint`
"""
self._post_event(6, flags)
class ZwpLinuxDmabufFeedbackV1Global(Global):
interface = ZwpLinuxDmabufFeedbackV1
ZwpLinuxDmabufFeedbackV1._gen_c()
ZwpLinuxDmabufFeedbackV1.proxy_class = ZwpLinuxDmabufFeedbackV1Proxy
ZwpLinuxDmabufFeedbackV1.resource_class = ZwpLinuxDmabufFeedbackV1Resource
ZwpLinuxDmabufFeedbackV1.global_class = ZwpLinuxDmabufFeedbackV1Global

View File

@ -0,0 +1,279 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014, 2015 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSurface
from .zwp_linux_buffer_params_v1 import ZwpLinuxBufferParamsV1
from .zwp_linux_dmabuf_feedback_v1 import ZwpLinuxDmabufFeedbackV1
class ZwpLinuxDmabufV1(Interface):
"""Factory for creating dmabuf-based wl_buffers
Following the interfaces from:
https://www.khronos.org/registry/egl/extensions/EXT/EGL_EXT_image_dma_buf_import.txt
https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt
and the Linux DRM sub-system's AddFb2 ioctl.
This interface offers ways to create generic dmabuf-based wl_buffers.
Clients can use the get_surface_feedback request to get dmabuf feedback for
a particular surface. If the client wants to retrieve feedback not tied to
a surface, they can use the get_default_feedback request.
The following are required from clients:
- Clients must ensure that either all data in the dma-buf is coherent for
all subsequent read access or that coherency is correctly handled by the
underlying kernel-side dma-buf implementation.
- Don't make any more attachments after sending the buffer to the
compositor. Making more attachments later increases the risk of the
compositor not being able to use (re-import) an existing dmabuf-based
:class:`~pywayland.protocol.wayland.WlBuffer`.
The underlying graphics stack must ensure the following:
- The dmabuf file descriptors relayed to the server will stay valid for the
whole lifetime of the :class:`~pywayland.protocol.wayland.WlBuffer`. This
means the server may at any time use those fds to import the dmabuf into
any kernel sub-system that might accept it.
However, when the underlying graphics stack fails to deliver the promise,
because of e.g. a device hot-unplug which raises internal errors, after the
:class:`~pywayland.protocol.wayland.WlBuffer` has been successfully created
the compositor must not raise protocol errors to the client when dmabuf
import later fails.
To create a :class:`~pywayland.protocol.wayland.WlBuffer` from one or more
dmabufs, a client creates a zwp_linux_dmabuf_params_v1 object with a
:func:`ZwpLinuxDmabufV1.create_params()` request. All planes required by
the intended format are added with the 'add' request. Finally, a 'create'
or 'create_immed' request is issued, which has the following outcome
depending on the import success.
The 'create' request, - on success, triggers a 'created' event which
provides the final :class:`~pywayland.protocol.wayland.WlBuffer` to the
client. - on failure, triggers a 'failed' event to convey that the server
cannot use the dmabufs received from the client.
For the 'create_immed' request, - on success, the server immediately
imports the added dmabufs to create a
:class:`~pywayland.protocol.wayland.WlBuffer`. No event is sent from the
server in this case. - on failure, the server can choose to either: -
terminate the client by raising a fatal error. - mark the
:class:`~pywayland.protocol.wayland.WlBuffer` as failed, and send a
'failed' event to the client. If the client uses a failed
:class:`~pywayland.protocol.wayland.WlBuffer` as an argument to any
request, the behaviour is compositor implementation-defined.
For all DRM formats and unless specified in another protocol extension,
pre-multiplied alpha is used for pixel values.
Warning! The protocol described in this file is experimental and backward
incompatible changes may be made. Backward compatible changes may be added
together with the corresponding interface version bump. Backward
incompatible changes are done by bumping the version number in the protocol
and interface names and resetting the interface version. Once the protocol
is to be declared stable, the 'z' prefix and the version number in the
protocol and interface names are removed and the interface version number
is reset.
"""
name = "zwp_linux_dmabuf_v1"
version = 4
class ZwpLinuxDmabufV1Proxy(Proxy[ZwpLinuxDmabufV1]):
interface = ZwpLinuxDmabufV1
@ZwpLinuxDmabufV1.request()
def destroy(self) -> None:
"""Unbind the factory
Objects created through this interface, especially wl_buffers, will
remain valid.
"""
self._marshal(0)
self._destroy()
@ZwpLinuxDmabufV1.request(
Argument(ArgumentType.NewId, interface=ZwpLinuxBufferParamsV1),
)
def create_params(self) -> Proxy[ZwpLinuxBufferParamsV1]:
"""Create a temporary object for buffer parameters
This temporary object is used to collect multiple dmabuf handles into a
single batch to create a :class:`~pywayland.protocol.wayland.WlBuffer`.
It can only be used once and should be destroyed after a 'created' or
'failed' event has been received.
:returns:
:class:`~pywayland.protocol.linux_dmabuf_unstable_v1.ZwpLinuxBufferParamsV1`
-- the new temporary
"""
params_id = self._marshal_constructor(1, ZwpLinuxBufferParamsV1)
return params_id
@ZwpLinuxDmabufV1.request(
Argument(ArgumentType.NewId, interface=ZwpLinuxDmabufFeedbackV1),
version=4,
)
def get_default_feedback(self) -> Proxy[ZwpLinuxDmabufFeedbackV1]:
"""Get default feedback
This request creates a new wp_linux_dmabuf_feedback object not bound to
a particular surface. This object will deliver feedback about dmabuf
parameters to use if the client doesn't support per-surface feedback
(see get_surface_feedback).
:returns:
:class:`~pywayland.protocol.linux_dmabuf_unstable_v1.ZwpLinuxDmabufFeedbackV1`
"""
id = self._marshal_constructor(2, ZwpLinuxDmabufFeedbackV1)
return id
@ZwpLinuxDmabufV1.request(
Argument(ArgumentType.NewId, interface=ZwpLinuxDmabufFeedbackV1),
Argument(ArgumentType.Object, interface=WlSurface),
version=4,
)
def get_surface_feedback(self, surface: WlSurface) -> Proxy[ZwpLinuxDmabufFeedbackV1]:
"""Get feedback for a surface
This request creates a new wp_linux_dmabuf_feedback object for the
specified :class:`~pywayland.protocol.wayland.WlSurface`. This object
will deliver feedback about dmabuf parameters to use for buffers
attached to this surface.
If the surface is destroyed before the wp_linux_dmabuf_feedback object,
the feedback object becomes inert.
:param surface:
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:returns:
:class:`~pywayland.protocol.linux_dmabuf_unstable_v1.ZwpLinuxDmabufFeedbackV1`
"""
id = self._marshal_constructor(3, ZwpLinuxDmabufFeedbackV1, surface)
return id
class ZwpLinuxDmabufV1Resource(Resource):
interface = ZwpLinuxDmabufV1
@ZwpLinuxDmabufV1.event(
Argument(ArgumentType.Uint),
)
def format(self, format: int) -> None:
"""Supported buffer format
This event advertises one buffer format that the server supports. All
the supported formats are advertised once when the client binds to this
interface. A roundtrip after binding guarantees that the client has
received all supported formats.
For the definition of the format codes, see the
:class:`~pywayland.protocol.linux_dmabuf_unstable_v1.ZwpLinuxBufferParamsV1`::create
request.
Starting version 4, the format event is deprecated and must not be sent
by compositors. Instead, use get_default_feedback or
get_surface_feedback.
:param format:
DRM_FORMAT code
:type format:
`ArgumentType.Uint`
"""
self._post_event(0, format)
@ZwpLinuxDmabufV1.event(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
version=3,
)
def modifier(self, format: int, modifier_hi: int, modifier_lo: int) -> None:
"""Supported buffer format modifier
This event advertises the formats that the server supports, along with
the modifiers supported for each format. All the supported modifiers
for all the supported formats are advertised once when the client binds
to this interface. A roundtrip after binding guarantees that the client
has received all supported format-modifier pairs.
For legacy support, DRM_FORMAT_MOD_INVALID (that is, modifier_hi ==
0x00ffffff and modifier_lo == 0xffffffff) is allowed in this event. It
indicates that the server can support the format with an implicit
modifier. When a plane has DRM_FORMAT_MOD_INVALID as its modifier, it
is as if no explicit modifier is specified. The effective modifier will
be derived from the dmabuf.
A compositor that sends valid modifiers and DRM_FORMAT_MOD_INVALID for
a given format supports both explicit modifiers and implicit modifiers.
For the definition of the format and modifier codes, see the
:class:`~pywayland.protocol.linux_dmabuf_unstable_v1.ZwpLinuxBufferParamsV1`::create
and
:class:`~pywayland.protocol.linux_dmabuf_unstable_v1.ZwpLinuxBufferParamsV1`::add
requests.
Starting version 4, the modifier event is deprecated and must not be
sent by compositors. Instead, use get_default_feedback or
get_surface_feedback.
:param format:
DRM_FORMAT code
:type format:
`ArgumentType.Uint`
:param modifier_hi:
high 32 bits of layout modifier
:type modifier_hi:
`ArgumentType.Uint`
:param modifier_lo:
low 32 bits of layout modifier
:type modifier_lo:
`ArgumentType.Uint`
"""
self._post_event(1, format, modifier_hi, modifier_lo)
class ZwpLinuxDmabufV1Global(Global):
interface = ZwpLinuxDmabufV1
ZwpLinuxDmabufV1._gen_c()
ZwpLinuxDmabufV1.proxy_class = ZwpLinuxDmabufV1Proxy
ZwpLinuxDmabufV1.resource_class = ZwpLinuxDmabufV1Resource
ZwpLinuxDmabufV1.global_class = ZwpLinuxDmabufV1Global

View File

@ -0,0 +1,27 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014 Jonas Ådahl
# Copyright © 2015 Red Hat Inc.
#
# 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.
from .zwp_confined_pointer_v1 import ZwpConfinedPointerV1 # noqa: F401
from .zwp_locked_pointer_v1 import ZwpLockedPointerV1 # noqa: F401
from .zwp_pointer_constraints_v1 import ZwpPointerConstraintsV1 # noqa: F401

View File

@ -0,0 +1,143 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014 Jonas Ådahl
# Copyright © 2015 Red Hat Inc.
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlRegion
class ZwpConfinedPointerV1(Interface):
"""Confined pointer object
The wp_confined_pointer interface represents a confined pointer state.
This object will send the event 'confined' when the confinement is
activated. Whenever the confinement is activated, it is guaranteed that the
surface the pointer is confined to will already have received pointer focus
and that the pointer will be within the region passed to the request
creating this object. It is up to the compositor to decide whether this
requires some user interaction and if the pointer will warp to within the
passed region if outside.
To unconfine the pointer, send the destroy request. This will also destroy
the wp_confined_pointer object.
If the compositor decides to unconfine the pointer the unconfined event is
sent. The wp_confined_pointer object is at this point defunct and should be
destroyed.
"""
name = "zwp_confined_pointer_v1"
version = 1
class ZwpConfinedPointerV1Proxy(Proxy[ZwpConfinedPointerV1]):
interface = ZwpConfinedPointerV1
@ZwpConfinedPointerV1.request()
def destroy(self) -> None:
"""Destroy the confined pointer object
Destroy the confined pointer object. If applicable, the compositor will
unconfine the pointer.
"""
self._marshal(0)
self._destroy()
@ZwpConfinedPointerV1.request(
Argument(ArgumentType.Object, interface=WlRegion, nullable=True),
)
def set_region(self, region: WlRegion | None) -> None:
"""Set a new confine region
Set a new region used to confine the pointer.
The new confine region is double-buffered. The new confine region will
only take effect when the associated surface gets its pending state
applied. See :func:`WlSurface.commit()
<pywayland.protocol.wayland.WlSurface.commit>` for details.
If the confinement is active when the new confinement region is applied
and the pointer ends up outside of newly applied region, the pointer
may warped to a position within the new confinement region. If warped,
a :func:`WlPointer.motion()
<pywayland.protocol.wayland.WlPointer.motion>` event will be emitted,
but no wp_relative_pointer.relative_motion event.
The compositor may also, instead of using the new region, unconfine the
pointer.
For details about the confine region, see wp_confined_pointer.
:param region:
region of surface
:type region:
:class:`~pywayland.protocol.wayland.WlRegion` or `None`
"""
self._marshal(1, region)
class ZwpConfinedPointerV1Resource(Resource):
interface = ZwpConfinedPointerV1
@ZwpConfinedPointerV1.event()
def confined(self) -> None:
"""Pointer confined
Notification that the pointer confinement of the seat's pointer is
activated.
"""
self._post_event(0)
@ZwpConfinedPointerV1.event()
def unconfined(self) -> None:
"""Pointer unconfined
Notification that the pointer confinement of the seat's pointer is no
longer active. If this is a oneshot pointer confinement (see
wp_pointer_constraints.lifetime) this object is now defunct and should
be destroyed. If this is a persistent pointer confinement (see
wp_pointer_constraints.lifetime) this pointer confinement may again
reactivate in the future.
"""
self._post_event(1)
class ZwpConfinedPointerV1Global(Global):
interface = ZwpConfinedPointerV1
ZwpConfinedPointerV1._gen_c()
ZwpConfinedPointerV1.proxy_class = ZwpConfinedPointerV1Proxy
ZwpConfinedPointerV1.resource_class = ZwpConfinedPointerV1Resource
ZwpConfinedPointerV1.global_class = ZwpConfinedPointerV1Global

View File

@ -0,0 +1,172 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014 Jonas Ådahl
# Copyright © 2015 Red Hat Inc.
#
# 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.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlRegion
class ZwpLockedPointerV1(Interface):
"""Receive relative pointer motion events
The wp_locked_pointer interface represents a locked pointer state.
While the lock of this object is active, the
:class:`~pywayland.protocol.wayland.WlPointer` objects of the associated
seat will not emit any :func:`WlPointer.motion()
<pywayland.protocol.wayland.WlPointer.motion>` events.
This object will send the event 'locked' when the lock is activated.
Whenever the lock is activated, it is guaranteed that the locked surface
will already have received pointer focus and that the pointer will be
within the region passed to the request creating this object.
To unlock the pointer, send the destroy request. This will also destroy the
wp_locked_pointer object.
If the compositor decides to unlock the pointer the unlocked event is sent.
See wp_locked_pointer.unlock for details.
When unlocking, the compositor may warp the cursor position to the set
cursor position hint. If it does, it will not result in any relative motion
events emitted via wp_relative_pointer.
If the surface the lock was requested on is destroyed and the lock is not
yet activated, the wp_locked_pointer object is now defunct and must be
destroyed.
"""
name = "zwp_locked_pointer_v1"
version = 1
class ZwpLockedPointerV1Proxy(Proxy[ZwpLockedPointerV1]):
interface = ZwpLockedPointerV1
@ZwpLockedPointerV1.request()
def destroy(self) -> None:
"""Destroy the locked pointer object
Destroy the locked pointer object. If applicable, the compositor will
unlock the pointer.
"""
self._marshal(0)
self._destroy()
@ZwpLockedPointerV1.request(
Argument(ArgumentType.Fixed),
Argument(ArgumentType.Fixed),
)
def set_cursor_position_hint(self, surface_x: float, surface_y: float) -> None:
"""Set the pointer cursor position hint
Set the cursor position hint relative to the top left corner of the
surface.
If the client is drawing its own cursor, it should update the position
hint to the position of its own cursor. A compositor may use this
information to warp the pointer upon unlock in order to avoid pointer
jumps.
The cursor position hint is double buffered. The new hint will only
take effect when the associated surface gets it pending state applied.
See :func:`WlSurface.commit()
<pywayland.protocol.wayland.WlSurface.commit>` for details.
:param surface_x:
surface-local x coordinate
:type surface_x:
`ArgumentType.Fixed`
:param surface_y:
surface-local y coordinate
:type surface_y:
`ArgumentType.Fixed`
"""
self._marshal(1, surface_x, surface_y)
@ZwpLockedPointerV1.request(
Argument(ArgumentType.Object, interface=WlRegion, nullable=True),
)
def set_region(self, region: WlRegion | None) -> None:
"""Set a new lock region
Set a new region used to lock the pointer.
The new lock region is double-buffered. The new lock region will only
take effect when the associated surface gets its pending state applied.
See :func:`WlSurface.commit()
<pywayland.protocol.wayland.WlSurface.commit>` for details.
For details about the lock region, see wp_locked_pointer.
:param region:
region of surface
:type region:
:class:`~pywayland.protocol.wayland.WlRegion` or `None`
"""
self._marshal(2, region)
class ZwpLockedPointerV1Resource(Resource):
interface = ZwpLockedPointerV1
@ZwpLockedPointerV1.event()
def locked(self) -> None:
"""Lock activation event
Notification that the pointer lock of the seat's pointer is activated.
"""
self._post_event(0)
@ZwpLockedPointerV1.event()
def unlocked(self) -> None:
"""Lock deactivation event
Notification that the pointer lock of the seat's pointer is no longer
active. If this is a oneshot pointer lock (see
wp_pointer_constraints.lifetime) this object is now defunct and should
be destroyed. If this is a persistent pointer lock (see
wp_pointer_constraints.lifetime) this pointer lock may again reactivate
in the future.
"""
self._post_event(1)
class ZwpLockedPointerV1Global(Global):
interface = ZwpLockedPointerV1
ZwpLockedPointerV1._gen_c()
ZwpLockedPointerV1.proxy_class = ZwpLockedPointerV1Proxy
ZwpLockedPointerV1.resource_class = ZwpLockedPointerV1Resource
ZwpLockedPointerV1.global_class = ZwpLockedPointerV1Global

View File

@ -0,0 +1,221 @@
# This file has been autogenerated by the pywayland scanner
# Copyright © 2014 Jonas Ådahl
# Copyright © 2015 Red Hat Inc.
#
# 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.
from __future__ import annotations
import enum
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlPointer
from ..wayland import WlRegion
from ..wayland import WlSurface
from .zwp_confined_pointer_v1 import ZwpConfinedPointerV1
from .zwp_locked_pointer_v1 import ZwpLockedPointerV1
class ZwpPointerConstraintsV1(Interface):
"""Constrain the movement of a pointer
The global interface exposing pointer constraining functionality. It
exposes two requests: lock_pointer for locking the pointer to its position,
and confine_pointer for locking the pointer to a region.
The lock_pointer and confine_pointer requests create the objects
wp_locked_pointer and wp_confined_pointer respectively, and the client can
use these objects to interact with the lock.
For any surface, only one lock or confinement may be active across all
:class:`~pywayland.protocol.wayland.WlPointer` objects of the same seat. If
a lock or confinement is requested when another lock or confinement is
active or requested on the same surface and with any of the
:class:`~pywayland.protocol.wayland.WlPointer` objects of the same seat, an
'already_constrained' error will be raised.
"""
name = "zwp_pointer_constraints_v1"
version = 1
class error(enum.IntEnum):
already_constrained = 1
class lifetime(enum.IntEnum):
oneshot = 1
persistent = 2
class ZwpPointerConstraintsV1Proxy(Proxy[ZwpPointerConstraintsV1]):
interface = ZwpPointerConstraintsV1
@ZwpPointerConstraintsV1.request()
def destroy(self) -> None:
"""Destroy the pointer constraints manager object
Used by the client to notify the server that it will no longer use this
pointer constraints object.
"""
self._marshal(0)
self._destroy()
@ZwpPointerConstraintsV1.request(
Argument(ArgumentType.NewId, interface=ZwpLockedPointerV1),
Argument(ArgumentType.Object, interface=WlSurface),
Argument(ArgumentType.Object, interface=WlPointer),
Argument(ArgumentType.Object, interface=WlRegion, nullable=True),
Argument(ArgumentType.Uint),
)
def lock_pointer(self, surface: WlSurface, pointer: WlPointer, region: WlRegion | None, lifetime: int) -> Proxy[ZwpLockedPointerV1]:
"""Lock pointer to a position
The lock_pointer request lets the client request to disable movements
of the virtual pointer (i.e. the cursor), effectively locking the
pointer to a position. This request may not take effect immediately; in
the future, when the compositor deems implementation-specific
constraints are satisfied, the pointer lock will be activated and the
compositor sends a locked event.
The protocol provides no guarantee that the constraints are ever
satisfied, and does not require the compositor to send an error if the
constraints cannot ever be satisfied. It is thus possible to request a
lock that will never activate.
There may not be another pointer constraint of any kind requested or
active on the surface for any of the
:class:`~pywayland.protocol.wayland.WlPointer` objects of the seat of
the passed pointer when requesting a lock. If there is, an error will
be raised. See general pointer lock documentation for more details.
The intersection of the region passed with this request and the input
region of the surface is used to determine where the pointer must be in
order for the lock to activate. It is up to the compositor whether to
warp the pointer or require some kind of user interaction for the lock
to activate. If the region is null the surface input region is used.
A surface may receive pointer focus without the lock being activated.
The request creates a new object wp_locked_pointer which is used to
interact with the lock as well as receive updates about its state. See
the the description of wp_locked_pointer for further information.
Note that while a pointer is locked, the
:class:`~pywayland.protocol.wayland.WlPointer` objects of the
corresponding seat will not emit any :func:`WlPointer.motion()
<pywayland.protocol.wayland.WlPointer.motion>` events, but relative
motion events will still be emitted via wp_relative_pointer objects of
the same seat. :func:`WlPointer.axis()
<pywayland.protocol.wayland.WlPointer.axis>` and
:func:`WlPointer.button()
<pywayland.protocol.wayland.WlPointer.button>` events are unaffected.
:param surface:
surface to lock pointer to
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:param pointer:
the pointer that should be locked
:type pointer:
:class:`~pywayland.protocol.wayland.WlPointer`
:param region:
region of surface
:type region:
:class:`~pywayland.protocol.wayland.WlRegion` or `None`
:param lifetime:
lock lifetime
:type lifetime:
`ArgumentType.Uint`
:returns:
:class:`~pywayland.protocol.pointer_constraints_unstable_v1.ZwpLockedPointerV1`
"""
id = self._marshal_constructor(1, ZwpLockedPointerV1, surface, pointer, region, lifetime)
return id
@ZwpPointerConstraintsV1.request(
Argument(ArgumentType.NewId, interface=ZwpConfinedPointerV1),
Argument(ArgumentType.Object, interface=WlSurface),
Argument(ArgumentType.Object, interface=WlPointer),
Argument(ArgumentType.Object, interface=WlRegion, nullable=True),
Argument(ArgumentType.Uint),
)
def confine_pointer(self, surface: WlSurface, pointer: WlPointer, region: WlRegion | None, lifetime: int) -> Proxy[ZwpConfinedPointerV1]:
"""Confine pointer to a region
The confine_pointer request lets the client request to confine the
pointer cursor to a given region. This request may not take effect
immediately; in the future, when the compositor deems implementation-
specific constraints are satisfied, the pointer confinement will be
activated and the compositor sends a confined event.
The intersection of the region passed with this request and the input
region of the surface is used to determine where the pointer must be in
order for the confinement to activate. It is up to the compositor
whether to warp the pointer or require some kind of user interaction
for the confinement to activate. If the region is null the surface
input region is used.
The request will create a new object wp_confined_pointer which is used
to interact with the confinement as well as receive updates about its
state. See the the description of wp_confined_pointer for further
information.
:param surface:
surface to lock pointer to
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:param pointer:
the pointer that should be confined
:type pointer:
:class:`~pywayland.protocol.wayland.WlPointer`
:param region:
region of surface
:type region:
:class:`~pywayland.protocol.wayland.WlRegion` or `None`
:param lifetime:
confinement lifetime
:type lifetime:
`ArgumentType.Uint`
:returns:
:class:`~pywayland.protocol.pointer_constraints_unstable_v1.ZwpConfinedPointerV1`
"""
id = self._marshal_constructor(2, ZwpConfinedPointerV1, surface, pointer, region, lifetime)
return id
class ZwpPointerConstraintsV1Resource(Resource):
interface = ZwpPointerConstraintsV1
class ZwpPointerConstraintsV1Global(Global):
interface = ZwpPointerConstraintsV1
ZwpPointerConstraintsV1._gen_c()
ZwpPointerConstraintsV1.proxy_class = ZwpPointerConstraintsV1Proxy
ZwpPointerConstraintsV1.resource_class = ZwpPointerConstraintsV1Resource
ZwpPointerConstraintsV1.global_class = ZwpPointerConstraintsV1Global

View File

@ -0,0 +1,20 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2015 Sean Vig
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from .zwp_pointer_gesture_hold_v1 import ZwpPointerGestureHoldV1 # noqa: F401
from .zwp_pointer_gesture_pinch_v1 import ZwpPointerGesturePinchV1 # noqa: F401
from .zwp_pointer_gesture_swipe_v1 import ZwpPointerGestureSwipeV1 # noqa: F401
from .zwp_pointer_gestures_v1 import ZwpPointerGesturesV1 # noqa: F401

View File

@ -0,0 +1,140 @@
# This file has been autogenerated by the pywayland scanner
# Copyright 2015 Sean Vig
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
from pywayland.protocol_core import (
Argument,
ArgumentType,
Global,
Interface,
Proxy,
Resource,
)
from ..wayland import WlSurface
class ZwpPointerGestureHoldV1(Interface):
"""A hold gesture object
A hold gesture object notifies a client about a single- or multi-finger
hold gesture detected on an indirect input device such as a touchpad. The
gesture is usually initiated by one or more fingers being held down without
significant movement. The precise conditions of when such a gesture is
detected are implementation-dependent.
In particular, this gesture may be used to cancel kinetic scrolling.
A hold gesture consists of two stages: begin and end. Unlike pinch and
swipe there is no update stage. There cannot be multiple simultaneous hold,
pinch or swipe gestures on a same pointer/seat, how compositors prevent
these situations is implementation-dependent.
A gesture may be cancelled by the compositor or the hardware. Clients
should not consider performing permanent or irreversible actions until the
end of a gesture has been received.
"""
name = "zwp_pointer_gesture_hold_v1"
version = 3
class ZwpPointerGestureHoldV1Proxy(Proxy[ZwpPointerGestureHoldV1]):
interface = ZwpPointerGestureHoldV1
@ZwpPointerGestureHoldV1.request(version=3)
def destroy(self) -> None:
"""Destroy the hold gesture object
"""
self._marshal(0)
self._destroy()
class ZwpPointerGestureHoldV1Resource(Resource):
interface = ZwpPointerGestureHoldV1
@ZwpPointerGestureHoldV1.event(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Object, interface=WlSurface),
Argument(ArgumentType.Uint),
version=3,
)
def begin(self, serial: int, time: int, surface: WlSurface, fingers: int) -> None:
"""Multi-finger hold begin
This event is sent when a hold gesture is detected on the device.
:param serial:
:type serial:
`ArgumentType.Uint`
:param time:
timestamp with millisecond granularity
:type time:
`ArgumentType.Uint`
:param surface:
:type surface:
:class:`~pywayland.protocol.wayland.WlSurface`
:param fingers:
number of fingers
:type fingers:
`ArgumentType.Uint`
"""
self._post_event(0, serial, time, surface, fingers)
@ZwpPointerGestureHoldV1.event(
Argument(ArgumentType.Uint),
Argument(ArgumentType.Uint),
Argument(ArgumentType.Int),
version=3,
)
def end(self, serial: int, time: int, cancelled: int) -> None:
"""Multi-finger hold end
This event is sent when a hold gesture ceases to be valid. This may
happen when the holding fingers are lifted or the gesture is cancelled,
for example if the fingers move past an implementation-defined
threshold, the finger count changes or the hold gesture changes into a
different type of gesture.
When a gesture is cancelled, the client may need to undo state changes
caused by this gesture. What causes a gesture to be cancelled is
implementation-dependent.
:param serial:
:type serial:
`ArgumentType.Uint`
:param time:
timestamp with millisecond granularity
:type time:
`ArgumentType.Uint`
:param cancelled:
1 if the gesture was cancelled, 0 otherwise
:type cancelled:
`ArgumentType.Int`
"""
self._post_event(1, serial, time, cancelled)
class ZwpPointerGestureHoldV1Global(Global):
interface = ZwpPointerGestureHoldV1
ZwpPointerGestureHoldV1._gen_c()
ZwpPointerGestureHoldV1.proxy_class = ZwpPointerGestureHoldV1Proxy
ZwpPointerGestureHoldV1.resource_class = ZwpPointerGestureHoldV1Resource
ZwpPointerGestureHoldV1.global_class = ZwpPointerGestureHoldV1Global

Some files were not shown because too many files have changed in this diff Show More