Compare commits

..

9 Commits

Author SHA1 Message Date
Enrico Weigelt, metux IT consult 6b1d95ad96 xkb: xkbgeom.h: drop stale forward declarations
There're lots of forward declarations for functions that don't exist
at all. These have been removed in 06e4ba8b26
back 12 years ago, but forgotten to removed the prototypes, too.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult be00adc39f xkb: drop unused XkbFreeGeomOverlayKeys()
Not called anywhere, so no need to keep it around any longer.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult 8e74034426 xkb: xkbgeom.h: drop unused XkbSetKey(Shape|Color) macros
Not used anywhere, so no need to keep them any longer.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult 3b91f8217d xkb: xkbgeom.h: drop unused XkbSetLogoDoodad(Color|Shape) macros
Not used anywhere, so no need to keep them any longer.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult 9a1e9a348f xkb: xkbgeom.h: drop some unused XkbSetIndicatorDoodad*() macros
These macros aren't used anywhere:

* XkbSetIndicatorDoodadOnColor()
* XkbSetIndicatorDoodadOffColor()
* XkbSetIndicatorDoodadShape()

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult c52e3069d1 xkb: xkbgeom: drop unused XkbSetTextDoodadColor() macro
Not used anywhere, so no need to keep it any longer.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult 799c65a296 xkb: xkbgeom: drop unused XkbSetShapeDoodad(Color|Shape) macros
These aren't used anywhere, so no need to keep them any longer.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult 2c6cbc2591 xkb: xkbgeom.h: drop unused XkbBounds(Width|Height) macros
These aren't used anywhere, so no need to keep them.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
Enrico Weigelt, metux IT consult 86fa60ea88 xkb: xkbgeom: need to include <X11/Xdefs.h>
Using the type "Bool", which is defined in Xdefs.h, therefore this
header should be include, so we don't need to rely on it being
included indirectly by somebody else.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:22 +00:00
862 changed files with 34444 additions and 17103 deletions

View File

@ -1,65 +0,0 @@
name: 🐞 Bug report
description: Create a report to help us improve
labels: [bug, needs-triage]
#type: bug
body:
- type: markdown
attributes:
value: |
Please fill out the sections below to help everyone identify and fix the bug. If you have a general idea or question then please use the [discussions](https://github.com/orgs/X11Libre/discussions).
- type: dropdown
id: affected-version
attributes:
label: Select the version
options:
- 25.0.0.X
- Git master branch
- other or don't know
default: 1
validations:
required: true
- type: textarea
id: description
attributes:
label: Describe your issue
placeholder: When I did X then Y happened.
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce
placeholder: |
1. Start ...
2. Do this
3. Do that
validations:
required: true
- type: textarea
id: expected
attributes:
label: What did you expect?
placeholder: I expected this to happen.
- type: textarea
id: environment
attributes:
label: Additional Information
description: Additional information you want to provide such as logs, system info, environment, screenshots, etc.
placeholder: |
Add any other context about the bug here.
- type: checkboxes
id: checks
attributes:
label: Extra fields
options:
- label: I have checked the existing [issues](https://github.com/X11Libre/xserver/issues)
required: true
- label: I have read the [Contributing Guidelines](https://github.com/X11Libre/xserver/blob/master/CONTRIBUTING.md)
required: true
- label: I'd like to work on this issue
- type: markdown
attributes:
value: |
Thanks for reporting this issue! We will get back to you as soon as possible.

View File

@ -1,49 +0,0 @@
name: ✨ Feature request
description: Suggest a feature for this software
labels: [enhancement, needs-triage]
body:
- type: markdown
attributes:
value: |
Please fill out the sections below to properly describe the new software feature you are suggesting. If you have a general idea or question then please use the [discussions](https://github.com/orgs/X11Libre/discussions).
- type: textarea
id: description
attributes:
label: "Describe the feature"
placeholder: A thing in X that allows to do Y.
validations:
required: true
- type: textarea
id: rationale
attributes:
label: "It should be implemented because"
placeholder: Doing Y is needed for Z.
validations:
required: true
- type: textarea
id: alternative
attributes:
label: "What are the alternatives?"
placeholder: We could do A or B instead.
- type: textarea
id: context
attributes:
label: Additional context
description: Additional information you want to provide such as references to related issues or protocols, the implications on existing use cases, etc.
placeholder: |
Add any other context about the feature request here.
- type: checkboxes
id: checks
attributes:
label: Extra fields
options:
- label: I have checked the existing [issues](https://github.com/X11Libre/xserver/issues)
required: true
- label: I have read the [Contributing Guidelines](https://github.com/X11Libre/xserver/blob/master/CONTRIBUTING.md)
required: true
- label: I'd like to work on this issue
- type: markdown
attributes:
value: |
Thanks for your suggestion! Let's see together if it can be implemented.

View File

@ -1,50 +0,0 @@
name: 🔧 Code cleanup
description: Level up the source code
labels: [code-cleanup, needs-triage]
#type: codecleanup
body:
- type: markdown
attributes:
value: |
Please fill out the sections below to properly describe the code cleanup you are suggesting. If you have a general idea or question then please use the [discussions](https://github.com/orgs/X11Libre/discussions).
- type: textarea
id: description
attributes:
label: "Describe the cleanup"
placeholder: C in X needs to be changed into D.
validations:
required: true
- type: textarea
id: rationale
attributes:
label: "It should be done because"
placeholder: Having D is needed for E.
validations:
required: true
- type: textarea
id: alternative
attributes:
label: "What are the alternatives?"
placeholder: We could do A or B instead.
- type: textarea
id: context
attributes:
label: Additional context
description: Additional information you want to provide such as implications on existing code, how to ensure API/ABI stability, which tests are needed or to be run, related issues, etc.
placeholder: |
Add any other context about the cleanup here.
- type: checkboxes
id: checks
attributes:
label: Extra fields
options:
- label: I have checked the existing [issues](https://github.com/X11Libre/xserver/issues)
required: true
- label: I have read the [Contributing Guidelines](https://github.com/X11Libre/xserver/blob/master/CONTRIBUTING.md)
required: true
- label: I'd like to work on this issue
- type: markdown
attributes:
value: |
Thanks for looking at the source code! Let's see together how it can be improved.

View File

@ -1,39 +0,0 @@
name: 🔖 Documentation update
description: Make your mark for better documentation
labels: [documentation, needs-triage]
#type: docchange
body:
- type: markdown
attributes:
value: |
Please fill out the sections below to help others understand our software. If you have a general idea or question then please use the [discussions](https://github.com/orgs/X11Libre/discussions).
- type: textarea
id: description
attributes:
label: Describe the update
placeholder: These things need to be better documented.
validations:
required: true
- type: textarea
id: environment
attributes:
label: Additional Information
description: Additional information you want to provide such as tickets related to changes in the software, affected files, screenshots, etc.
placeholder: |
Add any other context about the update here.
- type: checkboxes
id: checks
attributes:
label: Extra fields
options:
- label: I have checked the existing [issues](https://github.com/X11Libre/xserver/issues)
required: true
- label: I have read the [Contributing Guidelines](https://github.com/X11Libre/xserver/blob/master/CONTRIBUTING.md)
required: true
- label: I'd like to work on this issue
- type: markdown
attributes:
value: |
Thanks for requesting this update! We will get back to you as soon as possible.

View File

@ -1,44 +0,0 @@
name: ✅ Organizational task
description: Create a task for project organization
labels: [needs-triage, organization]
#type: task
body:
- type: markdown
attributes:
value: |
Please fill out the sections below to get organizational things done. If you have a general idea or question then please use the [discussions](https://github.com/orgs/X11Libre/discussions).
- type: textarea
id: description
attributes:
label: Describe the task
placeholder: These things need to be done.
validations:
required: true
- type: textarea
id: rationale
attributes:
label: "It should be done because"
placeholder: Doing Y is needed for Z.
- type: textarea
id: environment
attributes:
label: Additional Information
description: Additional information you want to provide such as the context for bigger tasks, the implicatons on existing workflows, related issues, etc.
placeholder: |
Add any other context about the task here.
- type: checkboxes
id: checks
attributes:
label: Extra fields
options:
- label: I have checked the existing [issues](https://github.com/X11Libre/xserver/issues)
required: true
- label: I have read the [Contributing Guidelines](https://github.com/X11Libre/xserver/blob/master/CONTRIBUTING.md)
required: true
- label: I'd like to work on this issue
- type: markdown
attributes:
value: |
Thanks for adding this task! We will get back to you as soon as possible.

View File

@ -1,8 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: XLibre Community Support
url: https://github.com/orgs/X11Libre/discussions
about: Please ask and answer questions here.
- name: Mailing List
url: https://www.freelists.org/list/xlibre
about: You can join the discussions on our mailing list.

View File

@ -1,32 +0,0 @@
#!/bin/bash
set -e
. .github/scripts/util.sh
export PKG_CONFIG_PATH="/usr/local/lib/x86_64-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH"
export ACLOCAL_PATH="/usr/share/aclocal:/usr/local/share/aclocal"
export X11L_DRV_GIT=https://github.com/X11Libre/
mkdir -p $DRV_BUILD_DIR
cd $DRV_BUILD_DIR
build_drv_ac xf86-input-elographics $X11L_DRV_GIT/xf86-input-elographics master
build_drv_ac xf86-input-evdev $X11L_DRV_GIT/xf86-input-evdev master
build_drv_ac xf86-input-libinput $X11L_DRV_GIT/xf86-input-libinput master
build_drv_ac xf86-input-mouse $X11L_DRV_GIT/xf86-input-mouse master
build_drv_ac xf86-input-synaptics $X11L_DRV_GIT/xf86-input-synaptics master
build_drv_ac xf86-video-amdgpu $X11L_DRV_GIT/xf86-video-amdgpu xf86-video-amdgpu-23.0.0
build_drv_ac xf86-video-ati $X11L_DRV_GIT/xf86-video-ati xf86-video-ati-22.0.0
build_drv_ac xf86-video-intel $X11L_DRV_GIT/xf86-video-intel.git master
build_drv_ac xf86-video-nouveau $X11L_DRV_GIT/xf86-video-nouveau xf86-video-nouveau-1.0.18
build_drv_ac xf86-video-omap $X11L_DRV_GIT/xf86-video-omap master
build_drv_ac xf86-video-qxl $X11L_DRV_GIT/xf86-video-qxl master
build_drv_ac xf86-video-r128 $X11L_DRV_GIT/xf86-video-r128 master
build_drv_ac xf86-video-vesa $X11L_DRV_GIT/xf86-video-vesa xf86-video-vesa-2.6.0
build_drv_ac xf86-video-vmware $X11L_DRV_GIT/xf86-video-vmware xf86-video-vmware-13.4.0
# doesn't compile on Linux
# build_drv_ac xf86-input-mouse $X11L_DRV_GIT/xf86-input-mouse master
# build_drv_ac xf86-input-keyboard $X11L_DRV_GIT/xf86-input-keyboard master

View File

@ -1,13 +0,0 @@
export X11_OS=`uname -s`
export X11_PREFIX="${X11_PREFIX:-$HOME/x11}"
export X11_BUILD_DIR="${X11_BUILD_DIR:-$HOME/build-deps}"
export DRV_BUILD_DIR="${DRV_BUILD_DIR:-$HOME/build-drivers}"
case "$X11_OS" in
Darwin) export FDO_CI_CONCURRENT=`sysctl -n hw.logicalcpu` ;;
Linux) export FDO_CI_CONCURRENT=`nproc` ;;
esac
export PATH="$X11_PREFIX/bin:$PATH"
export PKG_CONFIG_PATH="$X11_PREFIX/lib/x86_64-linux-gnu/pkgconfig:$X11_PREFIX/lib/pkgconfig:$X11_PREFIX/share/pkgconfig:$PKG_CONFIG_PATH"

View File

@ -1,34 +0,0 @@
#!/bin/bash
set -e
. .github/scripts/util.sh
mkdir -p $X11_BUILD_DIR
cd $X11_BUILD_DIR
build_meson rendercheck https://gitlab.freedesktop.org/xorg/test/rendercheck rendercheck-1.6
if [ "$X11_OS" = "Linux" ]; then
build_meson drm https://gitlab.freedesktop.org/mesa/drm libdrm-2.4.121 \
-Domap=enabled
fi
build_meson libxcvt https://gitlab.freedesktop.org/xorg/lib/libxcvt libxcvt-0.1.0
build_ac xorgproto https://gitlab.freedesktop.org/xorg/proto/xorgproto xorgproto-2024.1
if [ "$X11_OS" = "Linux" ]; then
build_meson wayland https://gitlab.freedesktop.org/wayland/wayland 1.21.0 \
-Dtests=false -Ddocumentation=false -Ddtd_validation=false
build_meson wayland-protocols https://gitlab.freedesktop.org/wayland/wayland-protocols 1.38
build_meson libdecor https://gitlab.freedesktop.org/libdecor/libdecor 0.1.1 \
-D{demo,install_demo}=false
build_meson libei https://gitlab.freedesktop.org/libinput/libei 1.0.0 \
-Dtests=disabled -Ddocumentation=[] -Dliboeffis=enabled
fi
if [ "$X11_OS" = "Darwin" ]; then
build_ac xset https://gitlab.freedesktop.org/xorg/app/xset xset-1.2.5
fi
build_ac_xts xts https://gitlab.freedesktop.org/xorg/test/xts master # dbbfa96c036e596346147081cbceda136e7c86c1
clone_source piglit https://gitlab.freedesktop.org/mesa/piglit main # 265896c86f90cb72e8f218ba6a3617fca8b9a1e3
echo '[xts]' > piglit/piglit.conf
echo "path=$X11_BUILD_DIR/xts" >> piglit/piglit.conf

View File

@ -1,38 +0,0 @@
#!/bin/sh
set -e
brew update
brew install \
autoconf \
automake \
bdftopcf \
libapplewm \
libtool \
libx11 \
libxau \
libxaw \
libxcb \
libxdmcp \
libxext \
libxfixes \
libxfont2 \
libxkbfile \
libxi \
libxmu \
libxrender \
libxt \
libxtst \
meson \
mkfontscale \
pkgconf \
pixman \
util-macros \
xdpyinfo \
xkbcomp \
xkeyboard-config \
xtrans
pip3 install --break-system-packages \
mako

View File

@ -1,95 +0,0 @@
#!/bin/bash
set -e
# Packages which are needed by this script, but not for the xserver build
EPHEMERAL="
libexpat-dev
libgles2-mesa-dev
libxkbcommon-dev
x11-utils
x11-xserver-utils
xauth
xvfb
"
apt-get update
apt-get install -y \
$EPHEMERAL \
autoconf \
automake \
build-essential \
ca-certificates \
libaudit-dev \
libbsd-dev \
libcairo2-dev \
libdbus-1-dev \
libdrm-dev \
libegl1-mesa-dev \
libepoxy-dev \
libevdev2 \
libexpat1 \
libffi-dev \
libgbm-dev \
libgcrypt-dev \
libgl1-mesa-dev \
libgles2 \
libglx-mesa0 \
libinput10 \
libinput-dev \
libnvidia-egl-wayland-dev \
libpciaccess-dev \
libpixman-1-dev \
libselinux1-dev \
libspice-protocol-dev \
libsystemd-dev \
libudev-dev \
libunwind-dev \
libx11-dev \
libx11-xcb-dev \
libxau-dev \
libxaw7-dev \
libxcb-glx0-dev \
libxcb-icccm4-dev \
libxcb-image0-dev \
libxcb-keysyms1-dev \
libxcb-randr0-dev \
libxcb-render-util0-dev \
libxcb-render0-dev \
libxcb-shape0-dev \
libxcb-shm0-dev \
libxcb-util0-dev \
libxcb-xf86dri0-dev \
libxcb-xkb-dev \
libxcb-xv0-dev \
libxcb1-dev \
libxdmcp-dev \
libxext-dev \
libxfixes-dev \
libxfont-dev \
libxi-dev \
libxinerama-dev \
libxkbcommon0 \
libxkbfile-dev \
libxmu-dev \
libxmuu-dev \
libxpm-dev \
libxrender-dev \
libxres-dev \
libxshmfence-dev \
libxt-dev \
libxtst-dev \
libxv-dev \
mesa-common-dev \
meson \
nettle-dev \
libpango1.0-dev \
pkg-config \
x11-xkb-utils \
xfonts-utils \
xkb-data \
xtrans-dev \
xutils-dev \
libxaw7-dev \
python3-mako

View File

@ -1,161 +0,0 @@
#!/bin/bash
apt-mark auto \
7zip \
7zip-rar \
acl \
ant \
apache2 \
apache2-bin \
aria2 \
azure-cli \
brotli \
buildah \
chrony \
cifs-utils \
clang-format-16 \
clang-format-17 \
clang-format-18 \
clang-tidy-16 \
clang-tidy-17 \
clang-tidy-18 \
cloud-init \
dbus \
dotnet-sdk-8.0 \
eatmydata \
efibootmgr \
firefox \
fonts-noto-color-emoji \
gfortran \
gfortran-12 \
gfortran-13 \
gfortran-14 \
google-chrome-stable \
google-cloud-cli \
haveged \
keyutils \
kubectl \
libeatmydata1 \
libgmp-dev \
liblz4-dev \
libmysqlclient-dev \
libpq-dev \
libsqlite3-dev \
libssl-dev \
libtss2-esys-3.0.2-0t64 \
libtss2-mu-4.0.1-0t64 \
libtss2-rc0t64 \
libwrap0 \
libyaml-dev \
lsscsi \
lz4 \
mediainfo \
mercurial \
microsoft-edge-stable \
mysql-client \
mysql-server \
ncurses-base \
ncurses-bin \
ncurses-term \
nginx \
nvme-cli \
packages-microsoft-prod \
php-pear \
php8.3 \
php8.3-amqp \
php8.3-apcu \
php8.3-bcmath \
php8.3-bz2 \
php8.3-cgi \
php8.3-cli \
php8.3-common \
php8.3-curl \
php8.3-dba \
php8.3-dev \
php8.3-enchant \
php8.3-fpm \
php8.3-gd \
php8.3-gmp \
php8.3-igbinary \
php8.3-imagick \
php8.3-imap \
php8.3-interbase \
php8.3-intl \
php8.3-ldap \
php8.3-mbstring \
php8.3-memcache \
php8.3-memcached \
php8.3-mongodb \
php8.3-mysql \
php8.3-odbc \
php8.3-opcache \
php8.3-pcov \
php8.3-pgsql \
php8.3-phpdbg \
php8.3-pspell \
php8.3-readline \
php8.3-redis \
php8.3-snmp \
php8.3-soap \
php8.3-sqlite3 \
php8.3-sybase \
php8.3-tidy \
php8.3-xdebug \
php8.3-xml \
php8.3-xsl \
php8.3-yaml \
php8.3-zip \
php8.3-zmq \
pigz \
podman \
pollinate \
postgresql-16 \
powershell \
python-babel-localedata \
python3-babel \
python3-dev \
python3-jinja2 \
python3-json-pointer \
python3-jsonpatch \
python3-jsonschema \
python3-markupsafe \
python3-parted \
python3-pyrsistent \
python3-serial \
python3-six \
python3-tz \
python3-venv \
rpm \
ruby-full \
session-manager-plugin \
shellcheck \
shim-signed \
skopeo \
snap \
snmp \
software-properties-common \
sphinxsearch \
sqlite3 \
swig \
sysstat \
systemd-coredump \
temurin-11-jdk \
temurin-17-jdk \
temurin-21-jdk \
temurin-8-jdk \
texinfo \
tk \
tree \
tzdata \
ubuntu-server \
ubuntu-standard \
unzip \
upx-ucl \
util-linux \
walinuxagent \
xvfb \
xz-utils \
zip \
zsync
apt-get autoremove -y

View File

@ -1,110 +0,0 @@
. .github/scripts/conf.sh
clone_source() {
local pkgname="$1"
local url="$2"
local ref="$3"
if [ ! -f $pkgname/.git/config ]; then
echo "need to clone $pkgname"
git clone $url $pkgname --branch=$ref --depth 1
else
echo "already cloned $pkgname"
fi
}
build_meson() {
local pkgname="$1"
local url="$2"
local ref="$3"
shift
shift
shift
if [ -f $X11_PREFIX/$pkgname.DONE ]; then
echo "package $pkgname already built"
else
clone_source "$pkgname" "$url" "$ref"
(
cd $pkgname
meson "$@" build -Dprefix=$X11_PREFIX
ninja -j${FDO_CI_CONCURRENT:-4} -C build install
)
touch $X11_PREFIX/$pkgname.DONE
fi
}
build_ac() {
local pkgname="$1"
local url="$2"
local ref="$3"
shift
shift
shift
if [ -f $X11_PREFIX/$pkgname.DONE ]; then
echo "package $pkgname already built"
else
clone_source "$pkgname" "$url" "$ref"
(
cd $pkgname
./autogen.sh --prefix=$X11_PREFIX
make -j${FDO_CI_CONCURRENT:-4} install
)
touch $X11_PREFIX/$pkgname.DONE
fi
}
build_drv_ac() {
local pkgname="$1"
local url="$2"
local ref="$3"
shift
shift
shift
clone_source "$pkgname" "$url" "$ref"
(
cd $pkgname
./autogen.sh # --prefix=$X11_PREFIX
make -j${FDO_CI_CONCURRENT:-4} # install
)
}
build_ac_xts() {
local pkgname="$1"
local url="$2"
local ref="$3"
shift
shift
shift
if [ -f $X11_PREFIX/$pkgname.DONE ]; then
echo "package $pkgname already built"
else
clone_source "$pkgname" "$url" "$ref"
(
cd $pkgname
CFLAGS='-fcommon'
if [ "$X11_OS" = "Darwin" ]; then
# xts5/include/XtTest.h includes <X11/Intrinsic.h> => needs xt
# xts5/src/libXtaw/*.c include <X11/Xaw/*.h> and <X11/Xmu/*.h> => need xmu and xaw7
sed -E -i~ 's|(\[XTS\], \[)|\1xt xmu xaw7 |' configure.ac
# xts5/Xlib14/X{mb,wc}TextListToTextProperty.m define a function accepting `XTextProperty` but call it passing
#`XTextProperty*`; since the parameter is seemingly meant for output, accept it as pointer
sed -E -i~ -e 's|(XTextProperty)[[:space:]]+(text_prop_good)|\1 *\2|' -e 's|(style_good),[[:space:]]*&(text_prop_good)|\1,\2|' -e 's|text_prop_good\.|text_prop_good->|' xts5/Xlib14/X{mb,wc}TextListToTextProperty.m
# xts5/Xlib*/*.m forward-declare `strcpy()` which is incompatible with _FORTIFY_SOURCE > 0 where `strcpy` is
# a macro; set _FORTIFY_SOURCE to 0 as we don't care much about security in this test code
CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0"
# declarations for `XtAppSetError{,Msg}Handler()` in <X11/Intrinsic.h> (libXt) make it hard to write warning-
# free code: they want a noreturn-annotated handler as input but return old handler without noreturn annotation,
# so e.g. `XtAppSetErrorHandler(XtAppSetErrorHandler(NULL))` (similar to xts5/Xt13/XtAppSetError*Handler.m)
# doesn't compile complaining about incompatible function pointers, at least with Apple Clang 16 (not sure why
# it treats this warning as error by default though)
if cc -Werror=unknown-warning-option -Wincompatible-function-pointer-types -c -xc -o /dev/null /dev/null 2>/dev/null; then
CFLAGS="$CFLAGS -Wno-error=incompatible-function-pointer-types"
fi
fi
./autogen.sh --prefix=$X11_PREFIX CFLAGS="$CFLAGS"
make -j${FDO_CI_CONCURRENT:-4} install
)
touch $X11_PREFIX/$pkgname.DONE
fi
}

View File

@ -1,182 +0,0 @@
name: Build X servers
permissions:
contents: read
env:
MESON_BUILDDIR: "build"
X11_PREFIX: /home/runner/x11
X11_BUILD_DIR: /home/runner/build-deps
on:
push:
pull_request:
jobs:
xserver-build-ubuntu:
env:
MESON_ARGS: -Dc_args="-fno-common" -Dprefix=/usr -Dxephyr=true -Dwerror=false -Dxcsecurity=true -Dxorg=true -Dxvfb=true -Dxnest=true
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: prepare build environment
run: |
MACHINE=`gcc -dumpmachine`
echo "MACHINE=$MACHINE" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/$MACHINE/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
sudo chown root /bin/tar && sudo chmod u+s /bin/tar
- name: apt cache
uses: actions/cache@v4
with:
path: /var/cache/apt
key: apt-cache-${{ hashFiles('.github/scripts/ubuntu/install-pkg.sh') }}
restore-keys: apt-cache-
- name: pkg install
run: sudo .github/scripts/ubuntu/install-pkg.sh
- name: X11 prereq cache
uses: actions/cache@v4
with:
path: |
${{ env.X11_PREFIX }}
${{ env.X11_BUILD_DIR }}/xts
${{ env.X11_BUILD_DIR }}/piglit
key: ${{ runner.name }}-x11-deps-${{ hashFiles('.github/scripts/install-prereq.sh') }}
restore-keys: ${{ runner.name }}-x11-deps-
- name: generic prereq
run: .github/scripts/install-prereq.sh
- name: build
run: .gitlab-ci/meson-build.sh
- name: tests (may fail)
continue-on-error: true
run: meson test -C "${{ env.MESON_BUILDDIR }}" --print-errorlogs || true
env:
XTEST_DIR: ${{ env.X11_BUILD_DIR }}/xts
PIGLIT_DIR: ${{ env.X11_BUILD_DIR }}/piglit
- name: archive build logs
uses: actions/upload-artifact@v4
with:
name: build-logs
path: |
build/meson-logs/*
- name: ddx build check
run: .gitlab-ci/check-ddx-build.sh
- name: manpage check
run: .gitlab-ci/manpages-check
drivers-build-ubuntu:
env:
MESON_ARGS: -Dc_args="-fno-common" -Dprefix=/usr -Dxephyr=false -Dwerror=false -Dxcsecurity=false -Dxorg=true -Dxvfb=false -Dxnest=false
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: prepare build environment
run: |
MACHINE=`gcc -dumpmachine`
echo "MACHINE=$MACHINE" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/$MACHINE/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
sudo chown root /bin/tar && sudo chmod u+s /bin/tar
- name: apt cache
uses: actions/cache@v4
with:
path: /var/cache/apt
key: apt-cache-${{ hashFiles('.github/scripts/ubuntu/install-pkg.sh') }}
restore-keys: apt-cache-
- name: pkg install
run: sudo .github/scripts/ubuntu/install-pkg.sh
- name: X11 prereq cache
uses: actions/cache@v4
with:
path: |
${{ env.X11_PREFIX }}
${{ env.X11_BUILD_DIR }}/xts
${{ env.X11_BUILD_DIR }}/piglit
key: ${{ runner.name }}-x11-deps-${{ hashFiles('.github/scripts/install-prereq.sh') }}
restore-keys: ${{ runner.name }}-x11-deps-
- name: generic prereq
run: .github/scripts/install-prereq.sh
- name: build xserver sdk
run: |
echo -n > .meson_environment
echo "export MESON_BUILDDIR=$MESON_BUILDDIR" >> .meson_environment
echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH" >> .meson_environment
.gitlab-ci/meson-build.sh --skip-test
sudo meson install --no-rebuild -C "$MESON_BUILDDIR"
sudo mkdir -p /usr/local/lib/$MACHINE/xorg/modules # /home/runner/x11/lib/xorg/modules
sudo chown -R runner /usr/local/lib/$MACHINE/xorg/modules # /home/runner/x11/lib/xorg/modules
- name: compile drivers
run: .github/scripts/compile-drivers.sh
xserver-build-macos:
env:
MESON_ARGS: -Dprefix=/tmp -Dglx=false -Dxnest=false
X11_PREFIX: /Users/runner/x11
X11_BUILD_DIR: /Users/runner/build-deps
runs-on: macos-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: prepare build environment
run: |
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
- name: homebrew cache
uses: actions/cache@v4
with:
path: /Users/runner/Library/Caches/Homebrew
key: ${{ runner.os }}-homebrew-cache-${{ hashFiles('.github/scripts/macos/install-pkg.sh') }}
restore-keys: ${{ runner.os }}-homebrew-cache-
- name: pkg install
run: .github/scripts/macos/install-pkg.sh
- name: X11 prereq cache
uses: actions/cache@v4
with:
path: |
${{ env.X11_PREFIX }}
${{ env.X11_BUILD_DIR }}/xts
${{ env.X11_BUILD_DIR }}/piglit
key: ${{ runner.os }}-x11-deps-${{ hashFiles('.github/scripts/install-prereq.sh') }}
restore-keys: ${{ runner.os }}-x11-deps-
- name: generic prereq
run: .github/scripts/install-prereq.sh
- name: build
run: .gitlab-ci/meson-build.sh
- name: tests (may fail)
continue-on-error: true
run: meson test -C "${{ env.MESON_BUILDDIR }}" --print-errorlogs -j1 || true
env:
XTEST_DIR: ${{ env.X11_BUILD_DIR }}/xts
PIGLIT_DIR: ${{ env.X11_BUILD_DIR }}/piglit
- name: archive build logs
uses: actions/upload-artifact@v4
with:
name: build-logs-macos
path: |
build/meson-logs/*
- name: ddx build check
run: .gitlab-ci/check-ddx-build.sh
- name: manpage check
run: .gitlab-ci/manpages-check

View File

@ -21,10 +21,10 @@ variables:
REPO_URL_XORGPROTO: 'https://gitlab.freedesktop.org/xorg/proto/xorgproto.git' REPO_URL_XORGPROTO: 'https://gitlab.freedesktop.org/xorg/proto/xorgproto.git'
XORG_DEBIAN_VERSION: 'bullseye-slim' XORG_DEBIAN_VERSION: 'bullseye-slim'
XORG_DEBIAN_EXEC: 'env FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash .gitlab-ci/debian-install.sh' XORG_DEBIAN_EXEC: 'env FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash .gitlab-ci/debian-install.sh'
XORG_DEBIAN_TAG: '2025-03-07-libdrm.1' XORG_DEBIAN_TAG: '2025-02-26-xcb-deps'
XORG_FREEBSD_VERSION: '14.2' XORG_FREEBSD_VERSION: '14.2'
XORG_FREEBSD_EXEC: '' XORG_FREEBSD_EXEC: ''
XORG_FREEBSD_TAG: '2025-05-27-xcb' XORG_FREEBSD_TAG: '2025-02-18-vm-image'
include: include:
- project: 'freedesktop/ci-templates' - project: 'freedesktop/ci-templates'
@ -92,6 +92,9 @@ stages:
.xorg_paths: &xorg_paths .xorg_paths: &xorg_paths
- hw/xfree86/**/* - hw/xfree86/**/*
.xwayland_paths: &xwayland_paths
- hw/xwayland/**/*
.all_ddx_paths: .all_ddx_paths:
- hw/**/* - hw/**/*
@ -108,7 +111,7 @@ stages:
FDO_DISTRIBUTION_TAG: '$XORG_FREEBSD_TAG' FDO_DISTRIBUTION_TAG: '$XORG_FREEBSD_TAG'
FDO_DISTRIBUTION_VERSION: '$XORG_FREEBSD_VERSION' FDO_DISTRIBUTION_VERSION: '$XORG_FREEBSD_VERSION'
FDO_DISTRIBUTION_EXEC: '' FDO_DISTRIBUTION_EXEC: ''
FDO_DISTRIBUTION_PACKAGES: 'git gcc pkgconf autoconf automake libtool xorg-macros xorgproto bash meson ninja pixman xtrans libXau libXdmcp libXfont2 libxkbfile libxcvt libpciaccess font-util libepoll-shim libxvmc xcb-util xcb-util-wm' FDO_DISTRIBUTION_PACKAGES: 'git gcc pkgconf autoconf automake libtool xorg-macros xorgproto bash meson ninja pixman xtrans libXau libXdmcp libXfont2 libxkbfile libxcvt libpciaccess font-util libepoll-shim'
FDO_IMAGE_SIZE: '30G' FDO_IMAGE_SIZE: '30G'
debian-bullseye: debian-bullseye:
@ -152,7 +155,7 @@ freebsd-image:
- $MESON_BUILDDIR/meson-logs/ - $MESON_BUILDDIR/meson-logs/
- $MESON_BUILDDIR/test/piglit-results/ - $MESON_BUILDDIR/test/piglit-results/
variables: variables:
MESON_ARGS: -Dc_args="-fno-common" -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true -Dxv=true -Dxvmc=true MESON_ARGS: -Dc_args="-fno-common" -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true
CCACHE_COMPILERCHECK: content CCACHE_COMPILERCHECK: content
CCACHE_DIR: /cache/xserver/cache CCACHE_DIR: /cache/xserver/cache
LC_ALL: C.UTF-8 LC_ALL: C.UTF-8
@ -175,11 +178,12 @@ meson:
PIGLIT_DIR: /root/piglit PIGLIT_DIR: /root/piglit
LP_NUM_THREADS: 0 LP_NUM_THREADS: 0
MESON_DDX_BUILD_ARGS: > MESON_DDX_BUILD_ARGS: >
-Dxorg=${BUILD_XORG} -Dxephyr=${BUILD_XEPHYR} -Dxvfb=${BUILD_XVFB} -Dxnest=${BUILD_XNEST} -Dxwayland=${BUILD_XWAYLAND} -Dxorg=${BUILD_XORG} -Dxephyr=${BUILD_XEPHYR} -Dxvfb=${BUILD_XVFB} -Dxnest=${BUILD_XNEST}
BUILD_XEPHYR: true BUILD_XEPHYR: true
BUILD_XNEST: true BUILD_XNEST: true
BUILD_XORG: true BUILD_XORG: true
BUILD_XVFB: true BUILD_XVFB: true
BUILD_XWAYLAND: true
MESON_EXTRA_ARGS: ${MESON_DDX_BUILD_ARGS} MESON_EXTRA_ARGS: ${MESON_DDX_BUILD_ARGS}
meson-noglamor: meson-noglamor:
@ -187,19 +191,28 @@ meson-noglamor:
variables: variables:
MESON_EXTRA_ARGS: -Dglamor=false ${MESON_DDX_BUILD_ARGS} MESON_EXTRA_ARGS: -Dglamor=false ${MESON_DDX_BUILD_ARGS}
xwayland-nolibdecor:
extends: meson
variables:
BUILD_XEPHYR: false
BUILD_XNEST: false
BUILD_XORG: false
BUILD_XVFB: false
MESON_EXTRA_ARGS: -Dlibdecor=false ${MESON_DDX_BUILD_ARGS}
mingw-cross-build: mingw-cross-build:
extends: .common-build-and-test extends: .common-build-and-test
script: script:
- .gitlab-ci/meson-build.sh --run-install - .gitlab-ci/meson-build.sh --run-install
variables: variables:
MESON_ARGS: --cross-file=.gitlab-ci/cross-i686-w64-mingw32.txt -Dglx=false -Dlisten_tcp=true -Dxvmc=true -Dxv=true MESON_ARGS: --cross-file=.gitlab-ci/cross-i686-w64-mingw32.txt -Dglx=false -Dlisten_tcp=true
freebsd: freebsd:
stage: build-and-test stage: build-and-test
extends: extends:
- .xorg-image@freebsd - .xorg-image@freebsd
variables: variables:
MESON_ARGS: -Dglx=false -Dglamor=false -Dudev=false -Dudev_kms=false -Dxvmc=true -Dxv=true MESON_ARGS: -Dglx=false -Dglamor=false -Dudev=false -Dudev_kms=false
script: script:
# running of of disk space without this # running of of disk space without this
# needed until https://gitlab.freedesktop.org/freedesktop/ci-templates/-/issues/67 is fixed # needed until https://gitlab.freedesktop.org/freedesktop/ci-templates/-/issues/67 is fixed
@ -208,8 +221,6 @@ freebsd:
- /app/vmctl start - /app/vmctl start
- set +e - set +e
- scp -r $PWD "vm:" - scp -r $PWD "vm:"
# need to install extra packages, as long as image cant be rebuilt
- /app/vmctl exec "pkg update && pkg add libxvmc xcb-util xcb-util-wm"
# need to install newer xorgproto # need to install newer xorgproto
- /app/vmctl exec "cd $CI_PROJECT_NAME/dep.xorgproto && ./autogen.sh --prefix=/usr && make && make install" - /app/vmctl exec "cd $CI_PROJECT_NAME/dep.xorgproto && ./autogen.sh --prefix=/usr && make && make install"
- /app/vmctl exec "cd $CI_PROJECT_NAME && PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\" MESON_ARGS=\"$MESON_ARGS\" MESON_BUILDDIR=\"$MESON_BUILDDIR\" .gitlab-ci/meson-build.sh --skip-test" && touch .success - /app/vmctl exec "cd $CI_PROJECT_NAME && PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\" MESON_ARGS=\"$MESON_ARGS\" MESON_BUILDDIR=\"$MESON_BUILDDIR\" .gitlab-ci/meson-build.sh --skip-test" && touch .success
@ -243,102 +254,26 @@ xf86-driver-build-test:
stage: drivers stage: drivers
parallel: parallel:
matrix: matrix:
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-elographics
SHA: xf86-input-elographics-1.4.4
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev
SHA: xf86-input-evdev-2.11.0 SHA: xf86-input-evdev-2.10.6
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-joystick
SHA: fa296d27fb479107fa6328a7565f665de2de98d3 # 5 commits ahead of 1.6.4
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput
SHA: xf86-input-libinput-1.5.0 SHA: xf86-input-libinput-1.4.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-mouse - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-mouse
SHA: xf86-input-mouse-1.9.5 SHA: xf86-input-mouse-1.9.5
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-synaptics - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-synaptics
SHA: xf86-input-synaptics-1.10.0 SHA: xf86-input-synaptics-1.9.2
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-vmmouse
SHA: 3bbcb6a143bb3f53e5b776fb70a4933229c1781a # 2 commits ahead of 13.2.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-void
SHA: b43e11eeb8b96aa87da910991da8b005d9847783 # 4 commits ahead of 1.4.2
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu
SHA: 2cb59a92de4a19909682a35e4f31f3c02de2899f # 18 commits ahead of 23.0.0 SHA: xf86-video-amdgpu-23.0.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-apm
SHA: 196784e691b8f8739792439434ffa002e9f5cdfa # 14 commits ahead of 1.3.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ark
SHA: 109745d5c7e6982ee0dabbc5a233c1f2667ad5c9 # 9 commits ahead of 0.7.4
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ast
SHA: db56de34bdf70f1904dba50d98774aaa950a2ca5 # 10 commits ahead of 1.1.6
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ati - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ati
SHA: c610c037369500089baddd86aa3cf8046f3dc48b # 11 commits ahead of 22.0.0 SHA: xf86-video-ati-22.0.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-chips - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-intel
SHA: 4503aece04cc8860df18ce946633b5449a0cb47b # 7 commits ahead of 1.5.0 SHA: e6a4c4740c15ace9dd79dc7c18955f2eb413a6a5 # no release yet
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-cirrus - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-qxl
SHA: 15d68316524c593bd67a6ea59b5c746a94c6c1f6 # 10 commits ahead of 1.6.0 SHA: 989ff620220e8d0555cec38c1508b57dfbcfb0c6 # no release yet
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-dummy
SHA: 3a407a34c4a2b6b263a535b6aa7b49dd70784fdf # 9 commits ahead of 0.4.1
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-fbdev
SHA: c8d9f3be7e95689d793bb2f45a5dddf409e46811 # 15 commits ahead of 0.5.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-i128
SHA: 4fd0309834deca78e5ef6cad5ecba8864a308ba5 # 7 commits ahead of 1.4.1
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-i740
SHA: d610334264e82a18477b9a5c3a4095c49c18f47b # 11 commits ahead of 1.4.0
- REPO: https://gitlab.freedesktop.org/metux/xf86-video-intel
SHA: submit/fixes-for-xserver # temporary
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-mach64
SHA: 878048e3aec04c6bb8034f21afdfff37e3528c5f # 20 commits ahead of 6.9.7
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-mga
SHA: 66ee371516c48c30b67684317a8e3c24ba7f1f4e # 11 commits ahead of 2.0.1
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-neomagic
SHA: 69cafdeebf7c338ede076424f9bcb97f26ede7a8 # 8 commits ahead of 1.3.1
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-nested
SHA: 86b6dc3bb6d78f40905ecc63df3635b284214836 # no release yet
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-nouveau
SHA: xf86-video-nouveau-1.0.18
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-nv
SHA: a8608636da97fdd880edb1bce919a0d3029f24dd # 15 commits ahead of 2.1.23
- REPO: https://gitlab.freedesktop.org/metux/xf86-video-qxl
SHA: incubate # temporary
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-r128
SHA: bc21fcdffa623bb8e7150e1da69aeaed6cd7c5d2 # 1 commits ahead of 6.13.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-rendition
SHA: 49d50f1fdeb4dc81895fec81be9fae1dc78e5974 # 14 commits ahead of 4.2.7
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-s3virge
SHA: 8834f100114ba136d52590e711054ab063306421 # 11 commits ahead of 1.11.1
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-savage
SHA: 09f6c06f0a793c7d297f152227b551c128f20875 # 8 commits ahead of 2.4.1
- REPO: https://gitlab.freedesktop.org/metux/xf86-video-siliconmotion
SHA: incubate # temporary
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-sis
SHA: ee451146c0afd735b50488588f82f3f158e9da03 # 68 commits ahead of 0.12.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-sisusb
SHA: ccff93b681968463d00793a9a7c5c2db8301634f # 30 commits ahead of 0.12.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-suncg14
SHA: 471e04fe84abaf2f868fb85566d99495142692a9 # 9 commits ahead of 1.1.3
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-suncg3
SHA: 8162844221f6d59e540c3c3a146a9c581d413949 # 9 commits ahead of 1.1.3
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-suncg6
SHA: 37a28d0d9dbb9b0c6631aa7b09d558d5f552c627 # 10 commits ahead of 1.1.3
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-sunffb
SHA: 6100635debdda392ca420e87c5b0d70bd22dfed8 # 14 commits ahead of 1.2.3
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-sunleo
SHA: 6d56a007f3d47fa43e95f1a0c8619be00b0c1c97 # 10 commits ahead of 1.2.3
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-suntcx
SHA: c1c0e384b95da18b81793612b90f693891f2e476 # 9 commits ahead of 1.1.3
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-tdfx
SHA: 5253278119a4db07b5a01856f0de34e576f4dcdd # 9 commits ahead of 1.5.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-trident
SHA: fddaa2084b9aac51a845ee1ede8c498cbc9330cf # 13 commits ahead of 1.4.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-v4l
SHA: eb1e55874cbacf7455f70269581a877e88e3bf37 # 15 commits ahead of 0.3.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vbox
SHA: ec4bc6b8e9d1a83526573d27afd099debbd5b86b # 7 commits ahead of 1.0.1
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vesa - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vesa
SHA: 5b33e95acb831768c52d491de079a1adcae762e0 # 10 commits ahead of 2.6.0 SHA: xf86-video-vesa-2.6.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vmware - REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vmware
SHA: 92cc4534146dd84c0d843759cdb30f75abddddd6 # 6 commits ahead 13.4.0 SHA: xf86-video-vmware-13.4.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-voodoo
SHA: c70353ddf49d557c596a47b835b6b8d8bbe35ebe # 15 commits ahead of 1.2.6
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-xgi
SHA: e73ff14a7f1b7562ff447aad527641cc35f557ae # 49 commits ahead 1.6.1
script: script:
# built xserver is taken from meson-dist job # built xserver is taken from meson-dist job
- export PKG_CONFIG_PATH=$(pwd)/xserver-tarball/install/lib/x86_64-linux-gnu/pkgconfig - export PKG_CONFIG_PATH=$(pwd)/xserver-tarball/install/lib/x86_64-linux-gnu/pkgconfig
@ -361,7 +296,33 @@ xf86-driver-build-test:
variables: variables:
GIT_DEPTH: 1 GIT_DEPTH: 1
MESON_ARGS: -Dprefix=/usr/ MESON_ARGS: -Dprefix=/usr/
MESON_EXTRA_ARGS: -Dxnest=false -Dxvfb=false -Dxquartz=false -Ddocs=false MESON_EXTRA_ARGS: -Dxwayland=false -Dxnest=false -Dxvfb=false -Dxquartz=false -Ddocs=false
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
changes:
*dix_paths
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
changes:
*xorg_paths
#
# Verify that commit messages are as expected
#
check-commits:
extends:
- .fdo.ci-fairy
needs: []
stage: test
script:
- ci-fairy check-commits --junit-xml=results.xml
except:
- master@xorg/xserver
variables:
GIT_DEPTH: 100
artifacts:
reports:
junit: results.xml
allow_failure: true
# #
# Verify that the merge request has the allow-collaboration checkbox ticked # Verify that the merge request has the allow-collaboration checkbox ticked

View File

@ -19,7 +19,7 @@ fi
[[ "$BUILD_XEPHYR" == true ]] && check_executable "hw/kdrive/ephyr/Xephyr" [[ "$BUILD_XEPHYR" == true ]] && check_executable "hw/kdrive/ephyr/Xephyr"
[[ "$BUILD_XNEST" == true ]] && check_executable "hw/xnest/Xnest" [[ "$BUILD_XNEST" == true ]] && check_executable "hw/xnest/Xnest"
[[ "$BUILD_XORG" == true ]] && check_executable "hw/xfree86/Xorg" [[ "$BUILD_XORG" == true ]] && check_executable "hw/xfree86/Xorg"
[[ "$BUILD_XQUARTZ" == true ]] && check_executable "hw/xquartz/mach-startup/Xquartz"
[[ "$BUILD_XVFB" == true ]] && check_executable "hw/vfb/Xvfb" [[ "$BUILD_XVFB" == true ]] && check_executable "hw/vfb/Xvfb"
[[ "$BUILD_XWAYLAND" == true ]] && check_executable "hw/xwayland/Xwayland"
exit 0 exit 0

View File

@ -27,3 +27,4 @@ check_piglit_results ()
check_piglit_results xephyr-glamor hw/kdrive/ephyr/Xephyr.p/ephyr_glamor.c.o check_piglit_results xephyr-glamor hw/kdrive/ephyr/Xephyr.p/ephyr_glamor.c.o
check_piglit_results xvfb hw/vfb/Xvfb check_piglit_results xvfb hw/vfb/Xvfb
check_piglit_results xwayland hw/xwayland/Xwayland

View File

@ -49,6 +49,7 @@ apt-get install -y \
libglx-mesa0 \ libglx-mesa0 \
libinput10 \ libinput10 \
libinput-dev \ libinput-dev \
libnvidia-egl-wayland-dev \
libpango1.0-0 \ libpango1.0-0 \
libpango1.0-dev \ libpango1.0-dev \
libpciaccess-dev \ libpciaccess-dev \
@ -59,6 +60,7 @@ apt-get install -y \
libtool \ libtool \
libudev-dev \ libudev-dev \
libunwind-dev \ libunwind-dev \
libwayland-dev \
libx11-dev \ libx11-dev \
libx11-xcb-dev \ libx11-xcb-dev \
libxau-dev \ libxau-dev \
@ -129,8 +131,8 @@ apt-get install -y \
cd /root cd /root
# drm 2.4.116 for drmSyncobjEventfd # Xwayland requires drm 2.4.116 for drmSyncobjEventfd
git clone https://gitlab.freedesktop.org/mesa/drm --depth 1 --branch=libdrm-2.4.121 git clone https://gitlab.freedesktop.org/mesa/drm --depth 1 --branch=libdrm-2.4.116
cd drm cd drm
meson _build meson _build
ninja -C _build -j${FDO_CI_CONCURRENT:-4} install ninja -C _build -j${FDO_CI_CONCURRENT:-4} install
@ -145,7 +147,7 @@ ninja -C _build -j${FDO_CI_CONCURRENT:-4} install
cd .. cd ..
rm -rf libxcvt rm -rf libxcvt
# xserver requires xorgproto >= 2024.1 # xserver requires xorgproto >= 2024.1 for XWAYLAND
git clone https://gitlab.freedesktop.org/xorg/proto/xorgproto.git --depth 1 --branch=xorgproto-2024.1 git clone https://gitlab.freedesktop.org/xorg/proto/xorgproto.git --depth 1 --branch=xorgproto-2024.1
pushd xorgproto pushd xorgproto
./autogen.sh ./autogen.sh
@ -153,6 +155,38 @@ make -j${FDO_CI_CONCURRENT:-4} install
popd popd
rm -rf xorgproto rm -rf xorgproto
# wayland-protocols requires wayland-scanner 1.20, but Debian bullseye has 1.18 only
git clone https://gitlab.freedesktop.org/wayland/wayland.git --depth 1 --branch=1.21.0
cd wayland
meson -Dtests=false -Ddocumentation=false -Ddtd_validation=false _build
ninja -C _build -j${FDO_CI_CONCURRENT:-4} install
cd ..
rm -rf wayland
# Xwayland requires wayland-protocols >= 1.38, but Debian bullseye has 1.20 only
git clone https://gitlab.freedesktop.org/wayland/wayland-protocols.git --depth 1 --branch=1.38
cd wayland-protocols
meson _build
ninja -C _build -j${FDO_CI_CONCURRENT:-4} install
cd ..
rm -rf wayland-protocols
# Install libdecor for Xwayland
git clone https://gitlab.freedesktop.org/libdecor/libdecor.git --depth 1 --branch=0.1.1
cd libdecor
meson _build -D{demo,install_demo}=false
ninja -C _build -j${FDO_CI_CONCURRENT:-4} install
cd ..
rm -rf libdecor
# Install libei for Xwayland
git clone https://gitlab.freedesktop.org/libinput/libei.git --depth 1 --branch=1.0.0
cd libei
meson setup _build -Dtests=disabled -Ddocumentation=[] -Dliboeffis=enabled
ninja -C _build -j${FDO_CI_CONCURRENT:-4} install
cd ..
rm -rf libei
git clone https://gitlab.freedesktop.org/mesa/piglit.git git clone https://gitlab.freedesktop.org/mesa/piglit.git
cd piglit cd piglit
git checkout 265896c86f90cb72e8f218ba6a3617fca8b9a1e3 git checkout 265896c86f90cb72e8f218ba6a3617fca8b9a1e3

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
find build/ -type f -regex ".*\.[1-9]$" -exec grep -E \ find build/ -regex ".*\.[1-9]$" -exec grep -E \
@vendorversion@\|\ @vendorversion@\|\
@xorgversion@\|\ @xorgversion@\|\
@xservername@\|\ @xservername@\|\

View File

@ -277,8 +277,7 @@ Paulo Zanoni <paulo.r.zanoni@intel.com> Paulo Ricardo Zanoni <pzanoni@mandriva.c
Pekka Paalanen <pekka.paalanen@collabora.co.uk> <pekka.paalanen@collabora.com> Pekka Paalanen <pekka.paalanen@collabora.co.uk> <pekka.paalanen@collabora.com>
Peter Harris <pharris2@rocketsoftware.com> <peter.harris@hummingbird.com> Peter Harris <pharris@opentext.com> <peter.harris@hummingbird.com>
Peter Harris <pharris2@rocketsoftware.com> <pharris@opentext.com>
Peter Hutterer <peter.hutterer@who-t.net> <peter.hutterer@redhat.com> Peter Hutterer <peter.hutterer@who-t.net> <peter.hutterer@redhat.com>
Peter Hutterer <peter.hutterer@who-t.net> <peter@cs.unisa.edu.au> Peter Hutterer <peter.hutterer@who-t.net> <peter@cs.unisa.edu.au>

View File

@ -1 +0,0 @@
404

View File

@ -1,18 +0,0 @@
# Contribution Guidelines
1. All commits need a sign-off by the author (except for drafts)
If additional reviewers gave their ack, a proper attribution
header may be added.
2. Commit messages should explain what's really done here and their
headlines need a short an precise subject. See history for examples.
Keep in mind that history is also a piece of documentation.
3. Once release is out, bugfixes should be submitted separately, against
the affected release branch(es) as well as master (so multiple pull requests)
4. If new functions or types are introduced, these should be documented
in-code, so we can generate docs directly from the code :)
5. Use pull request tags if you can - if we need some more, just ask.

View File

@ -8,7 +8,6 @@ possible, and insert their name to this list. Please sort by surname
for people, and by the full name for other entities (e.g. Juliusz for people, and by the full name for other entities (e.g. Juliusz
Chroboczek sorts before Intel Corporation sorts before Daniel Stone). Chroboczek sorts before Intel Corporation sorts before Daniel Stone).
Copyright © 2025 Enrico Weigelt, metux IT consult
Copyright © 2011 Dave Airlie Copyright © 2011 Dave Airlie
Copyright © 2000-2001 Juliusz Chroboczek Copyright © 2000-2001 Juliusz Chroboczek
Copyright © 1998 Egbert Eich Copyright © 1998 Egbert Eich

1
CoC.md
View File

@ -1 +0,0 @@
-ENOENT

141
README.md
View File

@ -1,128 +1,35 @@
XLibre Xserver X Server
=============== --------
Xlibre is a fork of the [Xorg Xserver](https://gitlab.freedesktop.org/xorg/xserver) The X server accepts requests from client applications to create windows,
with lots of code cleanups and enhanced functionality. which are (normally rectangular) "virtual screens" that the client program
can draw into.
This fork was necessary since toxic elements within Xorg projects, moles Windows are then composed on the actual screen by the X server
from BigTech, are boycotting any substantial work on Xorg, in order to (or by a separate composite manager) as directed by the window manager,
destroy the project, to eliminate competition of their own products. which usually communicates with the user via graphical controls such as buttons
Classic "embrace, extend, extinguish" tactics. and draggable titlebars and borders.
Right after journalists first began covering the planned fork Xlibre, For a comprehensive overview of X Server and X Window System, consult the
on June 6th 2025, Redhat employees started a purge on the Xlibre founder's following article:
GitLab account on freedesktop.org: deleted the git repo, tickets, merge https://en.wikipedia.org/wiki/X_server
requests, etc, and so fired the shot that the whole world heard.
This is an independent project, not at all affiliated with BigTech or any All questions regarding this software should be directed at the
of their subsidiaries or tax evasion tools, nor any political activists Xorg mailing list:
groups, state actors, etc. It's explicitly free of any "DEI" or similar
discriminatory policies. Anybody who's treating others nicely is welcomed.
It doesn't matter which country you're coming from, your political views, https://lists.freedesktop.org/mailman/listinfo/xorg
your race, your sex, your age, your food menu, whether you wear boots or
heels, whether you're furry or fairy, Conan or McKay, comic character, a
small furry creature from Alpha Centauri, or just a boring average person.
Anybody who's interested in bringing X forward is welcome.
Together we'll make X great again! The primary development code repository can be found at:
Upgrade notice https://gitlab.freedesktop.org/xorg/xserver
--------------
* Module ABIs have changed - drivers MUST be recompiled against this Xserver For patch submission instructions, see:
version, otherwise the Xserver can crash or fail to start up correctly.
* If your console is locked up (no input possible, not even VT switch), then https://www.x.org/wiki/Development/Documentation/SubmittingPatches
most likely the input driver couldn't be loaded due to a version mismatch.
When unsure, it's best to be prepared to ssh into your machine from another one
or set a timer that's calling `chvt 1` after certain time, so you don't
need a cold reboot.
Or, make sure that you have magic `SysRq` key enabled (`Alt+PrtSc`)
via sysctl (`kernel.sysrq=1`), then press following combination depending on keyboard
layout to make kernel regain control over keyboard to make VT switching work:
- QWERTY/AZERTY keyboard layout: `SysRq + R`
- Dvorak/Colemak keyboard layout: `SysRq + P`
* Proprietary Nvidia drivers might break: they still haven't managed to do As with other projects hosted on freedesktop.org, X.Org follows its
even simple cleanups to catch up with Xorg master for about a year. Code of Conduct, based on the Contributor Covenant. Please conduct
All attempts to get into direct mail contact have failed. We're trying to yourself in a respectful and civilized manner when using the above
work around this, but cannot give any guarantees. But you can make it work mailing lists, bug trackers, etc:
by adding `Option "IgnoreABI" "1"` line to `ServerFlags` section in Xorg config.
* Most Xorg drivers should run as-is (once recompiled!), with some exceptions. https://www.freedesktop.org/wiki/CodeOfConduct
See `.gitlab-ci.yml` for the versions/branches built along with Xlibre.
Driver repositories
-------------------
Since Redhat had deleted and banned all X11Libre repositories from freedesktop.org,
the driver repositories are now moved to GitHub:
| Driver | Git repository | Release tag |
| --- | --- | --- |
| xf86-input-elographics: | https://github.com/X11Libre/xf86-input-elographics | xlibre-xf86-input-elographics-1.4.4.1 |
| xf86-input-evdev: | https://github.com/X11Libre/xf86-input-evdev | xlibre-xf86-input-evdev-2.11.0.1 |
| xf86-input-void: | https://github.com/X11Libre/xf86-input-void | xlibre-xf86-input-void-1.4.2.1 |
| xf86-input-joystick: | https://github.com/X11Libre/xf86-input-joystick | xlibre-xf86-input-joystick-1.6.4.1 |
| xf86-input-keyboard: | https://github.com/X11Libre/xf86-input-keyboard | xlibre-xf86-input-keyboard-2.1.0.1 |
| xf86-input-libinput: | https://github.com/X11Libre/xf86-input-libinput | xlibre-xf86-input-libinput-1.5.0.1 |
| xf86-input-mouse: | https://github.com/X11Libre/xf86-input-mouse | xlibre-xf86-input-mouse-1.9.5.1 |
| xf86-input-synaptics: | https://github.com/X11Libre/xf86-input-synaptics | xlibre-xf86-input-synaptics-1.10.0.1 |
| xf86-input-vmmouse: | https://github.com/X11Libre/xf86-input-vmmouse | xlibre-xf86-input-vmmouse-13.2.0.1 |
| xf86-input-wacom: | https://github.com/X11Libre/xf86-input-wacom | xlibre-xf86-input-wacom-1.2.3.1 |
| xf86-video-amdgpu: | https://github.com/X11Libre/xf86-video-amdgpu | xlibre-xf86-video-amdgpu-23.0.0.1 |
| xf86-video-apm: | https://github.com/X11Libre/xf86-video-apm | xlibre-xf86-video-apm-1.3.0.1 |
| xf86-video-ark: | https://github.com/X11Libre/xf86-video-ark | xfree-xf86-video-ark-0.7.6.1 |
| xf86-video-ast: | https://github.com/X11Libre/xf86-video-ast | xlibre-xf86-video-ast-1.2.0 |
| xf86-video-ati: | https://github.com/X11Libre/xf86-video-ati | xfree-xf86-video-ati-22.0.0.1 |
| xf86-video-chips: | https://github.com/X11Libre/xf86-video-chips | xlibre-xf86-video-chips-1.5.0.1 |
| xf86-video-cirrus: | https://github.com/X11Libre/xf86-video-cirrus | xlibre-xf86-video-cirrus-1.6.0.1 |
| xf86-video-dummy: | https://github.com/X11Libre/xf86-video-dummy | xlibre-xf86-video-dummy-0.4.1.1 |
| xf86-video-fbdev: | https://github.com/X11Libre/xf86-video-fbdev | xlibre-xf86-video-fbdev-0.5.1.1 |
| xf86-video-freedreno: | https://github.com/X11Libre/xf86-video-freedreno | xlibre-xf86-video-freedreno-1.4.0.1 |
| xf86-video-geode: | https://github.com/X11Libre/xf86-video-geode | xlibre-xf86-video-geode-2.18.1.1 |
| xf86-video-i128: | https://github.com/X11Libre/xf86-video-i128 | xlibre-xf86-video-i128-1.4.1.1 |
| xf86-video-i740: | https://github.com/X11Libre/xf86-video-i740 | xlibre-xf86-video-i740-1.4.0.1 |
| xf86-video-intel: | https://github.com/X11Libre/xf86-video-intel | xlibre-xf86-video-intel-3.0.0.1 |
| xf86-video-mach64: | https://github.com/X11Libre/xf86-video-mach64 | xlibre-xf86-video-mach64-6.10.0.1 |
| xf86-video-mga: | https://github.com/X11Libre/xf86-video-mga | xlibre-xf86-video-mga-2.1.0.1 |
| xf86-video-neomagic: | https://github.com/X11Libre/xf86-video-neomagic | xlibre-xf86-video-neomagic-1.3.1.1 |
| xf86-video-nested: | https://github.com/X11Libre/xf86-video-nested | xlibre-xf86-video-nested-1.0.0.1 |
| xf86-video-nouveau: | https://github.com/X11Libre/xf86-video-nouveau | xlibre-xf86-video-nouveau-1.0.18.1 |
| xf86-video-nv: | https://github.com/X11Libre/xf86-video-nv | xlibre-xf86-video-nv-2.1.23.1 |
| xf86-video-omap: | https://github.com/X11Libre/xf86-video-omap | xlibre-xf86-video-omap-0.4.5.1 |
| xf86-video-qxl: | https://github.com/X11Libre/xf86-video-qxl | xlibre-xf86-video-qxl-0.1.6.1 |
| xf86-video-r128: | https://github.com/X11Libre/xf86-video-r128 | xlibre-xf86-video-r128-6.13.0.1 |
| xf86-video-rendition: | https://github.com/X11Libre/xf86-video-rendition | xlibre-xf86-video-rendition-4.2.7.1 |
| xf86-video-s3virge: | https://github.com/X11Libre/xf86-video-s3virge | xlibre-xf86-video-s3virge-1.11.1.1 |
| xf86-video-savage: | https://github.com/X11Libre/xf86-video-savage | xlibre-xf86-video-savage-2.4.1.1 |
| xf86-video-siliconmotion: | https://github.com/X11Libre/xf86-video-siliconmotion | xlibre-xf86-video-siliconmotion-1.7.10.1 |
| xf86-video-sis: | https://github.com/X11Libre/xf86-video-sis | xlibre-xf86-video-sis-0.12.0.1 |
| xf86-video-sisusb: | https://github.com/X11Libre/xf86-video-sisusb | xlibre-xf86-video-sisusb-0.9.7.1 |
| xf86-video-suncg14: | https://github.com/X11Libre/xf86-video-suncg14 | xlibre-xf86-video-suncg14-1.2.0 |
| xf86-video-suncg3: | https://github.com/X11Libre/xf86-video-suncg3 | xlibre-xf86-video-suncg3-1.1.3.0 |
| xf86-video-suncg6: | https://github.com/X11Libre/xf86-video-suncg6 | xlibre-xf86-video-suncg6-1.1.3.1 |
| xf86-video-sunffb: | https://github.com/X11Libre/xf86-video-sunffb | xlibre-xf86-video-sunffb-1.2.3.1 |
| xf86-video-sunleo: | https://github.com/X11Libre/xf86-video-sunleo | xlibre-xf86-video-sunleo-1.2.3.1 |
| xf86-video-suntcx: | https://github.com/X11Libre/xf86-video-suntcx | xlibre-xf86-video-suntcx-1.1.3.1 |
| xf86-video-tdfx: | https://github.com/X11Libre/xf86-video-tdfx | xlibre-xf86-video-tdfx-1.5.0.1 |
| xf86-video-trident: | https://github.com/X11Libre/xf86-video-trident | xlibre-xf86-video-trident-1.4.0.1 |
| xf86-video-vbox: | https://github.com/X11Libre/xf86-video-vbox | xlibre-xf86-video-vbox-1.0.1.1 |
| xf86-video-v4l: | https://github.com/X11Libre/xf86-video-v4l | xlibre-xf86-video-v4l-0.3.0.1 |
| xf86-video-vesa: | https://github.com/X11Libre/xf86-video-vesa | xlibre-xf86-video-vesa-2.6.0.1 |
| xf86-video-vmware: | https://github.com/X11Libre/xf86-video-vmware | xlibre-xf86-video-vmware-13.4.0.1 |
| xf86-video-voodoo: | https://github.com/X11Libre/xf86-video-voodoo | xlibre-xf86-video-voodoo-1.2.6.1 |
| xf86-video-wsfb: | https://github.com/X11Libre/xf86-video-wsfb | xlibre-xf86-video-wsfb-0.4.1.1 |
| xf86-video-xgi: | https://github.com/X11Libre/xf86-video-xgi | xlibre-xf86-video-xgi-1.6.1.1 |
Contact
-------
| | |
| --- | --- |
| Mailing list: | https://www.freelists.org/list/xlibre |
| Telegram channel: | https://t.me/x11dev |
| Matrix room (mirror of tg group): | https://matrix.to/#/#xlibre:matrix.org |

View File

@ -33,13 +33,13 @@ from The Open Group.
#include <X11/extensions/bigreqsproto.h> #include <X11/extensions/bigreqsproto.h>
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "miext/extinit_priv.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
#include "dixstruct.h" #include "dixstruct.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "opaque.h" #include "opaque.h"
#include "extinit_priv.h"
static int static int
ProcBigReqDispatch(ClientPtr client) ProcBigReqDispatch(ClientPtr client)

View File

@ -30,18 +30,18 @@ Equipment Corporation.
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include <X11/extensions/dpmsproto.h>
#include "miext/extinit_priv.h"
#include "os/screensaver.h" #include "os/screensaver.h"
#include "Xext/geext_priv.h" #include "Xext/geext.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
#include "dixstruct.h" #include "dixstruct.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "opaque.h" #include "opaque.h"
#include <X11/extensions/dpmsproto.h>
#include "dpmsproc.h" #include "dpmsproc.h"
#include "extinit_priv.h"
#include "scrnintstr.h" #include "scrnintstr.h"
#include "windowstr.h" #include "windowstr.h"
#include "protocol-versions.h" #include "protocol-versions.h"
@ -145,9 +145,10 @@ ProcDPMSSelectInput(register ClientPtr client)
} }
/* build the entry */ /* build the entry */
pNewEvent = calloc(1, sizeof(DPMSEventRec)); pNewEvent = (DPMSEventPtr)malloc(sizeof(DPMSEventRec));
if (!pNewEvent) if (!pNewEvent)
return BadAlloc; return BadAlloc;
pNewEvent->next = 0;
pNewEvent->client = client; pNewEvent->client = client;
pNewEvent->mask = stuff->eventMask; pNewEvent->mask = stuff->eventMask;
/* /*
@ -163,7 +164,7 @@ ProcDPMSSelectInput(register ClientPtr client)
* of clients selecting input * of clients selecting input
*/ */
if (i != Success || !pHead) { if (i != Success || !pHead) {
pHead = calloc(1, sizeof(DPMSEventPtr)); pHead = (DPMSEventPtr *)malloc(sizeof(DPMSEventPtr));
if (!pHead || if (!pHead ||
!AddResource(eventResource, DPMSEventType, (void *)pHead)) { !AddResource(eventResource, DPMSEventType, (void *)pHead)) {
FreeResource(clientResource, X11_RESTYPE_NONE); FreeResource(clientResource, X11_RESTYPE_NONE);
@ -588,7 +589,7 @@ DPMSExtensionInit(void)
ClientType = CreateNewResourceType(DPMSFreeClient, "DPMSClient"); ClientType = CreateNewResourceType(DPMSFreeClient, "DPMSClient");
DPMSEventType = CreateNewResourceType(DPMSFreeEvents, "DPMSEvent"); DPMSEventType = CreateNewResourceType(DPMSFreeEvents, "DPMSEvent");
eventResource = dixAllocServerXID(); eventResource = FakeClientID(0);
if (DPMSEnabled && ClientType && DPMSEventType && if (DPMSEnabled && ClientType && DPMSEventType &&
(extEntry = AddExtension(DPMSExtensionName, 0, 0, (extEntry = AddExtension(DPMSExtensionName, 0, 0,

View File

@ -1,6 +1,8 @@
/* Prototypes for functions that the DDX must provide */ /* Prototypes for functions that the DDX must provide */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h> #include <dix-config.h>
#endif
#ifndef _DPMSPROC_H_ #ifndef _DPMSPROC_H_
#define _DPMSPROC_H_ #define _DPMSPROC_H_

View File

@ -24,15 +24,12 @@
*/ */
#include <dix-config.h> #include <dix-config.h>
#include <X11/extensions/ge.h>
#include <X11/extensions/geproto.h>
#include "miext/extinit_priv.h"
#include "Xext/geext_priv.h"
#include "windowstr.h" #include "windowstr.h"
#include <X11/extensions/ge.h>
#include "geext.h"
#include "protocol-versions.h" #include "protocol-versions.h"
#include "extinit_priv.h"
#define MAXEXTENSIONS 128 #define MAXEXTENSIONS 128

41
Xext/geext.h Normal file
View File

@ -0,0 +1,41 @@
/*
Copyright 2007 Peter Hutterer <peter@cs.unisa.edu.au>
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.
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 AUTHOR 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.
Except as contained in this notice, the name of the author shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from the author.
*/
#ifndef _GEEXT_H_
#define _GEEXT_H_
#include <X11/Xfuncproto.h>
#include <X11/extensions/geproto.h>
/* Interface for other extensions */
extern _X_EXPORT void GERegisterExtension(int extension,
void (*ev_dispatch) (xGenericEvent
*from,
xGenericEvent
*to));
#endif /* _GEEXT_H_ */

View File

@ -1,22 +0,0 @@
/* SPDX-License-Identifier: MIT OR X11
*
* Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
*/
#ifndef _XORG_GEEXT_PRIV_H
#define _XORG_GEEXT_PRIV_H
#include <X11/Xproto.h>
typedef void (*XorgGESwapProcPtr) (xGenericEvent *from, xGenericEvent *to);
/*
* Register generic event extension dispatch handler
*
* @param extension base opcode
* @param event swap handler function
*/
_X_EXPORT /* just for Nvidia legacy */
void GERegisterExtension(int extension, XorgGESwapProcPtr swap_handler);
#endif /* _XORG_GEEXT_PRIV_H */

View File

@ -1,9 +1,6 @@
#include <dix-config.h> #include <dix-config.h>
#include <stdlib.h> #include <stdlib.h>
#include "dix/resource_priv.h"
#include "misc.h" #include "misc.h"
#include "hashtable.h" #include "hashtable.h"
@ -42,7 +39,7 @@ ht_create(int keySize,
{ {
int c; int c;
int numBuckets; int numBuckets;
HashTable ht = calloc(1, sizeof(struct HashTableRec)); HashTable ht = malloc(sizeof(struct HashTableRec));
if (!ht) { if (!ht) {
return NULL; return NULL;
@ -55,7 +52,7 @@ ht_create(int keySize,
ht->elements = 0; ht->elements = 0;
ht->bucketBits = INITHASHSIZE; ht->bucketBits = INITHASHSIZE;
numBuckets = 1 << ht->bucketBits; numBuckets = 1 << ht->bucketBits;
ht->buckets = calloc(numBuckets, sizeof(*ht->buckets)); ht->buckets = xallocarray(numBuckets, sizeof(*ht->buckets));
ht->cdata = cdata; ht->cdata = cdata;
if (ht->buckets) { if (ht->buckets) {
@ -96,7 +93,7 @@ double_size(HashTable ht)
int newNumBuckets = 1 << newBucketBits; int newNumBuckets = 1 << newBucketBits;
int c; int c;
newBuckets = calloc(newNumBuckets, sizeof(*ht->buckets)); newBuckets = xallocarray(newNumBuckets, sizeof(*ht->buckets));
if (newBuckets) { if (newBuckets) {
for (c = 0; c < newNumBuckets; ++c) { for (c = 0; c < newNumBuckets; ++c) {
xorg_list_init(&newBuckets[c]); xorg_list_init(&newBuckets[c]);
@ -130,7 +127,7 @@ ht_add(HashTable ht, const void *key)
if (!elem) { if (!elem) {
goto outOfMemory; goto outOfMemory;
} }
elem->key = calloc(1, ht->keySize); elem->key = malloc(ht->keySize);
if (!elem->key) { if (!elem->key) {
goto outOfMemory; goto outOfMemory;
} }

View File

@ -51,7 +51,7 @@ typedef struct {
@param[in] cdata Opaque data that will be passed to hash and @param[in] cdata Opaque data that will be passed to hash and
comparison functions comparison functions
*/ */
HashTable ht_create(int keySize, extern _X_EXPORT HashTable ht_create(int keySize,
int dataSize, int dataSize,
HashFunc hash, HashFunc hash,
HashCompareFunc compare, HashCompareFunc compare,
@ -59,7 +59,7 @@ HashTable ht_create(int keySize,
/** @brief HtDestruct deinitializes the structure. It does not free the /** @brief HtDestruct deinitializes the structure. It does not free the
memory allocated to HashTableRec memory allocated to HashTableRec
*/ */
void ht_destroy(HashTable ht); extern _X_EXPORT void ht_destroy(HashTable ht);
/** @brief Adds a new key to the hash table. The key will be copied /** @brief Adds a new key to the hash table. The key will be copied
and a pointer to the value will be returned. The data will and a pointer to the value will be returned. The data will
@ -75,12 +75,12 @@ void ht_destroy(HashTable ht);
to avoid returning NULL. Obviously the data pointed cannot be to avoid returning NULL. Obviously the data pointed cannot be
modified, as implied by dataSize being 0. modified, as implied by dataSize being 0.
*/ */
void *ht_add(HashTable ht, const void *key); extern _X_EXPORT void *ht_add(HashTable ht, const void *key);
/** @brief Removes a key from the hash table along with its /** @brief Removes a key from the hash table along with its
associated data, which will be free'd. associated data, which will be free'd.
*/ */
void ht_remove(HashTable ht, const void *key); extern _X_EXPORT void ht_remove(HashTable ht, const void *key);
/** @brief Finds the associated data of a key from the hash table. /** @brief Finds the associated data of a key from the hash table.
@ -93,27 +93,27 @@ void ht_remove(HashTable ht, const void *key);
use HtMember instead to determine if a key has been use HtMember instead to determine if a key has been
inserted. inserted.
*/ */
void *ht_find(HashTable ht, const void *key); extern _X_EXPORT void *ht_find(HashTable ht, const void *key);
/** @brief A generic hash function */ /** @brief A generic hash function */
unsigned ht_generic_hash(void *cdata, extern _X_EXPORT unsigned ht_generic_hash(void *cdata,
const void *ptr, const void *ptr,
int numBits); int numBits);
/** @brief A generic comparison function. It compares data byte-wise. */ /** @brief A generic comparison function. It compares data byte-wise. */
int ht_generic_compare(void *cdata, extern _X_EXPORT int ht_generic_compare(void *cdata,
const void *l, const void *l,
const void *r); const void *r);
/** @brief A debugging function that dumps the distribution of the /** @brief A debugging function that dumps the distribution of the
hash table: for each bucket, list the number of elements hash table: for each bucket, list the number of elements
contained within. */ contained within. */
void ht_dump_distribution(HashTable ht); extern _X_EXPORT void ht_dump_distribution(HashTable ht);
/** @brief A debugging function that dumps the contents of the hash /** @brief A debugging function that dumps the contents of the hash
table: for each bucket, list the elements contained table: for each bucket, list the elements contained
within. */ within. */
void ht_dump_contents(HashTable ht, extern _X_EXPORT void ht_dump_contents(HashTable ht,
void (*print_key)(void *opaque, void *key), void (*print_key)(void *opaque, void *key),
void (*print_value)(void *opaque, void *value), void (*print_value)(void *opaque, void *value),
void* opaque); void* opaque);
@ -123,14 +123,14 @@ void ht_dump_contents(HashTable ht,
be NULL. It uses HashXID underneath, and should HashXID be be NULL. It uses HashXID underneath, and should HashXID be
unable to hash the value, it switches into using the generic unable to hash the value, it switches into using the generic
hash function. */ hash function. */
unsigned ht_resourceid_hash(void *cdata, extern _X_EXPORT unsigned ht_resourceid_hash(void *cdata,
const void * data, const void * data,
int numBits); int numBits);
/** @brief A comparison function to be used for comparing resource /** @brief A comparison function to be used for comparing resource
IDs when used with HashTables. It makes no use of cdata, IDs when used with HashTables. It makes no use of cdata,
so that can be NULL. */ so that can be NULL. */
int ht_resourceid_compare(void *cdata, extern _X_EXPORT int ht_resourceid_compare(void *cdata,
const void *a, const void *a,
const void *b); const void *b);

View File

@ -9,6 +9,7 @@ srcs_xext = [
] ]
hdrs_xext = [ hdrs_xext = [
'geext.h',
'syncsdk.h', 'syncsdk.h',
] ]
@ -58,13 +59,13 @@ if build_xv
hdrs_xext += ['xvdix.h', 'xvmcext.h'] hdrs_xext += ['xvdix.h', 'xvmcext.h']
endif endif
libxserver_xext = static_library('xserver_xext', libxserver_xext = static_library('libxserver_xext',
srcs_xext, srcs_xext,
include_directories: inc, include_directories: inc,
dependencies: common_dep, dependencies: common_dep,
) )
libxserver_xext_vidmode = static_library('xserver_xext_vidmode', libxserver_xext_vidmode = static_library('libxserver_xext_vidmode',
'vidmode.c', 'vidmode.c',
include_directories: inc, include_directories: inc,
dependencies: common_dep, dependencies: common_dep,

View File

@ -1,208 +0,0 @@
#include <dix-config.h>
#include <string.h>
#include <X11/Xdefs.h>
#include "os/auth.h"
#include "namespace.h"
struct Xnamespace ns_root = {
.allowMouseMotion = TRUE,
.allowShape = TRUE,
.allowTransparency = TRUE,
.allowXInput = TRUE,
.allowXKeyboard = TRUE,
.builtin = TRUE,
.name = NS_NAME_ROOT,
.refcnt = 1,
.superPower = TRUE,
};
struct Xnamespace ns_anon = {
.builtin = TRUE,
.name = NS_NAME_ANONYMOUS,
.refcnt = 1,
};
struct xorg_list ns_list = { 0 };
char *namespaceConfigFile = NULL;
static struct Xnamespace* select_ns(const char* name)
{
struct Xnamespace *walk;
xorg_list_for_each_entry(walk, &ns_list, entry) {
if (strcmp(walk->name, name)==0)
return walk;
}
struct Xnamespace *newns = calloc(1, sizeof(struct Xnamespace));
newns->name = strdup(name);
xorg_list_append(&newns->entry, &ns_list);
return newns;
}
#define atox(c) ('0' <= c && c <= '9' ? c - '0' : \
'a' <= c && c <= 'f' ? c - 'a' + 10 : \
'A' <= c && c <= 'F' ? c - 'A' + 10 : -1)
// warning: no error checking, no buffer clearing
static int hex2bin(const char *in, char *out)
{
while (in[0] && in[1]) {
int top = atox(in[0]);
if (top == -1)
return 0;
int bottom = atox(in[1]);
if (bottom == -1)
return 0;
*out++ = (top << 4) | bottom;
in += 2;
}
return 1;
}
/*
* loadConfig
*
* Load the container config
*/
static void parseLine(char *line, struct Xnamespace **walk_ns)
{
// trim newline and comments
char *c1 = strchr(line, '\n');
if (c1 != NULL)
*c1 = 0;
c1 = strchr(line, '#');
if (c1 != NULL)
*c1 = 0;
/* get the first token */
char *token = strtok(line, " ");
if (token == NULL)
return;
// if no "container" statement hasn't been issued yet, use root NS
struct Xnamespace * curr = (*walk_ns ? *walk_ns : &ns_root);
if (strcmp(token, "container") == 0)
{
if ((token = strtok(NULL, " ")) == NULL)
{
XNS_LOG("container missing id\n");
return;
}
curr = *walk_ns = select_ns(token);
return;
}
if (strcmp(token, "auth") == 0)
{
token = strtok(NULL, " ");
if (token == NULL)
return;
struct auth_token *new_token = calloc(1, sizeof(struct auth_token));
if (new_token == NULL)
FatalError("Xnamespace: failed allocating token\n");
new_token->authProto = strdup(token);
token = strtok(NULL, " ");
new_token->authTokenLen = strlen(token)/2;
new_token->authTokenData = calloc(1, new_token->authTokenLen);
if (!new_token->authTokenData) {
free(new_token);
return;
}
hex2bin(token, new_token->authTokenData);
new_token->authId = AddAuthorization(strlen(new_token->authProto),
new_token->authProto,
new_token->authTokenLen,
new_token->authTokenData);
xorg_list_append(&new_token->entry, &curr->auth_tokens);
return;
}
if (strcmp(token, "allow") == 0)
{
while ((token = strtok(NULL, " ")) != NULL)
{
if (strcmp(token, "mouse-motion") == 0)
curr->allowMouseMotion = TRUE;
else if (strcmp(token, "shape") == 0)
curr->allowShape = TRUE;
else if (strcmp(token, "transparency") == 0)
curr->allowTransparency = TRUE;
else if (strcmp(token, "xinput") == 0)
curr->allowXInput = TRUE;
else if (strcmp(token, "xkeyboard") == 0)
curr->allowXKeyboard = TRUE;
else
XNS_LOG("unknown allow: %s\n", token);
}
return;
}
if (strcmp(token, "superpower") == 0)
{
curr->superPower = TRUE;
return;
}
XNS_LOG("unknown token \"%s\"\n", token);
}
Bool XnsLoadConfig(void)
{
xorg_list_append_ndup(&ns_root.entry, &ns_list);
xorg_list_append_ndup(&ns_anon.entry, &ns_list);
if (!namespaceConfigFile) {
XNS_LOG("no namespace config given - Xnamespace disabled\n");
return FALSE;
}
FILE *fp = fopen(namespaceConfigFile, "r");
if (fp == NULL) {
FatalError("failed loading container config: %s\n", namespaceConfigFile);
return FALSE;
}
struct Xnamespace *walk_ns = NULL;
char linebuf[1024];
while (fgets(linebuf, sizeof(linebuf), fp) != NULL)
parseLine(linebuf, &walk_ns);
fclose(fp);
XNS_LOG("loaded namespace config file: %s\n", namespaceConfigFile);
struct Xnamespace *ns;
xorg_list_for_each_entry(ns, &ns_list, entry) {
XNS_LOG("namespace: \"%s\" \n", ns->name);
struct auth_token *at;
xorg_list_for_each_entry(at, &ns->auth_tokens, entry) {
XNS_LOG(" auth: \"%s\" \"", at->authProto);
for (int i=0; i<at->authTokenLen; i++)
printf("%02X", (unsigned char)at->authTokenData[i]);
printf("\"\n");
}
}
return TRUE;
}
struct Xnamespace *XnsFindByName(const char* name) {
struct Xnamespace *walk;
xorg_list_for_each_entry(walk, &ns_list, entry) {
if (strcmp(walk->name, name)==0)
return walk;
}
return NULL;
}

View File

@ -1,34 +0,0 @@
#define HOOK_NAME "client"
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "dix/extension_priv.h"
#include "dix/registry_priv.h"
#include "mi/miinitext.h"
#include "include/extinit.h"
#include "include/extnsionst.h"
#include "include/propertyst.h"
#include "include/protocol-versions.h"
#include "include/windowstr.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
void hookClient(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceClientAccessRec);
struct XnamespaceClientPriv *obj = XnsClientPriv(param->target);
if (subj->ns->superPower || XnsClientSameNS(subj, obj))
return;
XNS_HOOK_LOG("BLOCKED access on client %d\n", param->target->index);
/* returning BadValue instead of BadAccess, because we're pretending
the requested client doens't even exist at all. */
param->status = BadValue;
}

View File

@ -1,45 +0,0 @@
#define HOOK_NAME "clienstate"
#include <dix-config.h>
#include "dix/registry_priv.h"
#include "os/client_priv.h"
#include "os/auth.h"
#include "namespace.h"
#include "hooks.h"
void hookClientState(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(NewClientInfoRec);
switch (client->clientState) {
case ClientStateInitial:
// better assign *someting* than null -- clients can't do anything yet anyways
XnamespaceAssignClient(subj, &ns_anon);
break;
case ClientStateRunning:
subj->authId = AuthorizationIDOfClient(client);
short unsigned int name_len = 0, data_len = 0;
const char * name = NULL;
char * data = NULL;
if (AuthorizationFromID(subj->authId, &name_len, &name, &data_len, &data)) {
XnamespaceAssignClient(subj, XnsFindByAuth(name_len, name, data_len, data));
} else {
XNS_HOOK_LOG("no auth data - assuming anon\n");
}
break;
case ClientStateRetained:
XnamespaceAssignClient(subj, NULL);
break;
case ClientStateGone:
XnamespaceAssignClient(subj, NULL);
break;
default:
XNS_HOOK_LOG("unknown state =%d\n", client->clientState);
break;
}
}

View File

@ -1,64 +0,0 @@
#define HOOK_NAME "device"
#include <dix-config.h>
#include <X11/extensions/XIproto.h>
#include <X11/extensions/XI2proto.h>
#include <X11/extensions/XKB.h>
#include "dix/dix_priv.h"
#include "dix/extension_priv.h"
#include "dix/registry_priv.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
void hookDevice(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceDeviceAccessRec);
if (subj->ns->superPower)
goto pass;
// should be safe to pass for anybody
switch (client->majorOp) {
case X_QueryPointer:
case X_GetInputFocus:
case X_GetKeyboardMapping:
case X_GetModifierMapping:
case X_GrabButton: // needed by xterm -- should be safe
goto pass;
case EXTENSION_MAJOR_XKEYBOARD:
switch(client->minorOp) {
case X_kbSelectEvents: // needed by xterm
case X_kbGetMap: // needed by xterm
case X_kbBell: // needed by GIMP
case X_kbPerClientFlags: // needed by firefox
case X_kbGetState: // needed by firefox
case X_kbGetNames: // needed by firefox
case X_kbGetControls: // needed by firefox
goto pass;
default:
XNS_HOOK_LOG("BLOCKED unhandled XKEYBOARD %s\n", LookupRequestName(client->majorOp, client->minorOp));
goto block;
}
case EXTENSION_MAJOR_XINPUT:
switch (client->minorOp) {
case X_ListInputDevices:
case X_XIQueryDevice:
goto pass;
default:
XNS_HOOK_LOG("BLOCKED unhandled Xinput request\n");
goto block;
}
}
block:
param->status = BadAccess;
return;
pass:
param->status = Success;
return;
}

View File

@ -1,67 +0,0 @@
#define HOOK_NAME "ext-access"
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "dix/extension_priv.h"
#include "dix/registry_priv.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
/* called on X_QueryExtension */
void hookExtAccess(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceExtAccessRec);
/* root NS has super powers */
if (subj->ns->superPower)
goto pass;
switch (param->ext->index + EXTENSION_BASE) {
/* unrestricted access */
case EXTENSION_MAJOR_BIG_REQUESTS:
case EXTENSION_MAJOR_DAMAGE:
case EXTENSION_MAJOR_DOUBLE_BUFFER:
case EXTENSION_MAJOR_GENERIC_EVENT:
case EXTENSION_MAJOR_PRESENT:
case EXTENSION_MAJOR_SYNC:
case EXTENSION_MAJOR_XC_MISC:
case EXTENSION_MAJOR_XFIXES:
case EXTENSION_MAJOR_XKEYBOARD:
case EXTENSION_MAJOR_XRESOURCE:
goto pass;
/* really blacklisted */
case EXTENSION_MAJOR_MIT_SCREEN_SAVER:
case EXTENSION_MAJOR_RECORD:
case EXTENSION_MAJOR_SECURITY:
case EXTENSION_MAJOR_XTEST:
case EXTENSION_MAJOR_XVIDEO:
goto reject;
/* only allowed if namespace has flag set */
case EXTENSION_MAJOR_SHAPE:
if (subj->ns->allowShape)
goto pass;
goto reject;
/* only allowed if namespace has flag set */
case EXTENSION_MAJOR_XINPUT:
if (subj->ns->allowXInput)
goto pass;
goto reject;
}
XNS_HOOK_LOG("unhandled extension query: %s (%d)\n", param->ext->name, param->ext->index);
return;
reject:
param->status = BadAccess;
return;
pass:
param->status = Success;
return;
}

View File

@ -1,115 +0,0 @@
#define HOOK_NAME "ext-dispatch"
#include <dix-config.h>
#include <stdio.h>
#include <X11/Xdefs.h> // syncproto.h is broken
#include <X11/Xmd.h>
#include <X11/extensions/syncproto.h>
#include <X11/extensions/XIproto.h>
#include <X11/extensions/XKB.h>
#include <X11/extensions/xfixeswire.h>
#include "dix/dix_priv.h"
#include "dix/extension_priv.h"
#include "dix/registry_priv.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
void hookExtDispatch(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceExtAccessRec);
/* root NS has super powers */
if (subj->ns->superPower)
goto pass;
switch (client->majorOp) {
/* unrestricted access to these */
case EXTENSION_MAJOR_BIG_REQUESTS:
case EXTENSION_MAJOR_DAMAGE:
case EXTENSION_MAJOR_DOUBLE_BUFFER:
case EXTENSION_MAJOR_GENERIC_EVENT:
case EXTENSION_MAJOR_PRESENT:
case EXTENSION_MAJOR_XC_MISC:
case EXTENSION_MAJOR_XRESOURCE:
goto pass;
/* allow several operations */
case EXTENSION_MAJOR_XKEYBOARD:
if (subj->ns->allowXKeyboard)
goto pass;
switch (client->minorOp) {
case X_kbUseExtension:
case X_kbGetMap:
case X_kbSelectEvents: // fixme: might need special filtering
case X_kbGetState:
case X_kbGetNames:
case X_kbGetControls:
case X_kbPerClientFlags:
goto pass;
}
XNS_HOOK_LOG("BLOCKED unhandled XKEYBOARD call: %s\n", param->ext->name);
goto reject;
/* allow if namespace has flag set */
case EXTENSION_MAJOR_SHAPE:
if (subj->ns->allowShape)
goto pass;
break;
case EXTENSION_MAJOR_XINPUT:
if (subj->ns->allowXInput)
goto pass;
switch (client->minorOp) {
case X_ListInputDevices:
goto pass;
}
break;
case EXTENSION_MAJOR_XFIXES:
switch (client->minorOp) {
case X_XFixesQueryVersion:
case X_XFixesCreateRegion:
case X_XFixesSetCursorName:
case X_XFixesSelectSelectionInput:
goto pass;
}
XNS_HOOK_LOG("BLOCKED unhandled XFIXES call: %s\n", param->ext->name);
goto reject;
break;
case EXTENSION_MAJOR_SYNC:
switch (client->minorOp) {
case X_SyncCreateCounter:
case X_SyncDestroyCounter:
case X_SyncInitialize:
case X_SyncSetCounter:
goto pass;
}
XNS_HOOK_LOG("REJECT unhandled SYNC call: %s\n", param->ext->name);
goto reject;
break;
/* really blacklisted */
case EXTENSION_MAJOR_MIT_SCREEN_SAVER:
case EXTENSION_MAJOR_RECORD:
case EXTENSION_MAJOR_SECURITY:
case EXTENSION_MAJOR_XTEST:
goto reject;
break;
}
XNS_HOOK_LOG("unhandled extension call: %s\n", param->ext->name);
return;
reject:
XNS_HOOK_LOG("rejecting extension call: %s\n", param->ext->name);
param->status = BadAccess;
return;
pass:
param->status = Success;
return;
}

View File

@ -1,71 +0,0 @@
#define HOOK_NAME "initroot"
#include <dix-config.h>
#include <stdio.h>
#include <X11/Xatom.h>
#include <X11/Xmd.h>
#include "dix/window_priv.h"
#include "namespace.h"
#include "hooks.h"
static inline int setWinStrProp(WindowPtr pWin, Atom name, const char *text) {
return dixChangeWindowProperty(serverClient, pWin, name, XA_STRING,
8, PropModeReplace, strlen(text), text, TRUE);
}
void hookInitRootWindow(CallbackListPtr *pcbl, void *data, void *screen)
{
ScreenPtr pScreen = (ScreenPtr)screen;
// only act on first screen
if (pScreen->myNum)
return;
/* create the virtual root windows */
WindowPtr realRoot = pScreen->root;
assert(realRoot);
struct Xnamespace *walk;
xorg_list_for_each_entry(walk, &ns_list, entry) {
if (strcmp(walk->name, NS_NAME_ROOT)==0) {
walk->rootWindow = realRoot;
XNS_LOG("<%s> actual root 0x%0x\n", walk->name, walk->rootWindow->drawable.id);
continue;
}
int rc = 0;
WindowPtr pWin = dixCreateWindow(
FakeClientID(0), realRoot, 0, 0, 23, 23,
0, /* bw */
InputOutput,
0, /* vmask */
NULL, /* vlist */
0, /* depth */
serverClient,
wVisual(realRoot), /* visual */
&rc);
if (!pWin)
FatalError("hookInitRootWindow: cant create per-namespace root window for %s\n", walk->name);
Mask mask = pWin->eventMask;
pWin->eventMask = 0; /* subterfuge in case AddResource fails */
if (!AddResource(pWin->drawable.id, X11_RESTYPE_WINDOW, (void *) pWin))
FatalError("hookInitRootWindow: cant add per-namespace root window as resource\n");
pWin->eventMask = mask;
walk->rootWindow = pWin;
// set window name
char buf[PATH_MAX] = { 0 };
snprintf(buf, sizeof(buf)-1, "XNS-ROOT:%s", walk->name);
setWinStrProp(pWin, XA_WM_NAME, buf);
XNS_LOG("<%s> virtual root 0x%0x\n", walk->name, walk->rootWindow->drawable.id);
}
}

View File

@ -1,47 +0,0 @@
#define HOOK_NAME "property"
#include <dix-config.h>
#include <stdio.h>
#include "dix/dix_priv.h"
#include "dix/registry_priv.h"
#include "include/propertyst.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
static inline Bool winIsRoot(WindowPtr pWin) {
if (!pWin)
return FALSE;
if (pWin->drawable.pScreen->root == pWin)
return TRUE;
return FALSE;
}
void hookPropertyAccess(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XacePropertyAccessRec);
struct XnamespaceClientPriv *obj = XnsClientPriv(dixClientForWindow(param->pWin));
ATOM name = (*param->ppProp)->propertyName;
if (XnsClientSameNS(subj, obj))
return;
if (param->pWin == subj->ns->rootWindow)
return;
if (winIsRoot(param->pWin)) {
XNS_HOOK_LOG("window is the screen's root window\n");
} else {
XNS_HOOK_LOG("not a root window\n");
}
XNS_HOOK_LOG("access to property %s (atom 0x%x) window 0x%lx of client %d\n",
NameForAtom(name),
name,
(unsigned long)param->pWin->drawable.id,
dixClientForWindow(param->pWin)->index);
}

View File

@ -1,75 +0,0 @@
#define HOOK_NAME "recieve"
#include <dix-config.h>
#include <X11/Xmd.h>
#include "dix/extension_priv.h"
#include "dix/registry_priv.h"
#include "dix/resource_priv.h"
#include "Xext/xacestr.h"
#include "Xi/exglobals.h"
#include "namespace.h"
#include "hooks.h"
static inline Bool isRootWin(WindowPtr pWin) {
return (pWin->parent == NullWindow && dixClientForWindow(pWin) == serverClient);
}
void
hookReceive(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceReceiveAccessRec);
struct XnamespaceClientPriv *obj = XnsClientPriv(dixClientForWindow(param->pWin));
// send and receive within same namespace permitted without restrictions
if (XnsClientSameNS(subj, obj))
goto pass;
for (int i=0; i<param->count; i++) {
const int type = param->events[i].u.u.type;
switch (type) {
case GenericEvent: {
xGenericEvent *gev = (xGenericEvent*)&param->events[i].u;
if (gev->extension == EXTENSION_MAJOR_XINPUT) {
switch (gev->evtype) {
case XI_RawMotion:
if ((!subj->ns->allowMouseMotion) || !isRootWin(param->pWin))
goto reject;
continue;
case XI_RawKeyPress:
case XI_RawKeyRelease:
goto reject;
default:
XNS_HOOK_LOG("XI unknown %d\n", gev->evtype);
goto reject;
}
}
XNS_HOOK_LOG("BLOCKED #%d generic event extension=%d\n", i, gev->extension);
goto reject;
}
break;
default:
XNS_HOOK_LOG("BLOCKED event type #%d 0%0x 0%0x %s %s%s\n", i, type, param->events[i].u.u.detail,
LookupEventName(type), (type & 128) ? "fake" : "",
isRootWin(param->pWin) ? " (root window)" : "");
goto reject;
break;
}
}
pass:
return;
reject:
param->status = BadAccess;
XNS_HOOK_LOG("BLOCKED client %d [NS %s] receiving event sent to window 0x%lx of client %d [NS %s]\n",
client->index,
subj->ns->name,
(unsigned long)param->pWin->drawable.id,
dixClientForWindow(param->pWin)->index,
obj->ns->name);
return;
}

View File

@ -1,142 +0,0 @@
#define HOOK_NAME "resource"
#include <dix-config.h>
#include <X11/extensions/XI2proto.h>
#include "dix/dix_priv.h"
#include "dix/extension_priv.h"
#include "dix/registry_priv.h"
#include "dix/window_priv.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
static int checkAllowed(Mask requested, Mask allowed) {
return ((requested & allowed) == requested);
}
void hookResourceAccess(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceResourceAccessRec);
ClientPtr owner = dixLookupXIDOwner(param->id);
struct XnamespaceClientPriv *obj = XnsClientPriv(owner);
// server can do anything
if (param->client == serverClient)
goto pass;
// special filtering for windows: block transparency for untrusted clients
if (param->rtype == X11_RESTYPE_WINDOW) {
WindowPtr pWindow = (WindowPtr) param->res;
if (param->access_mode & DixCreateAccess) {
if (!subj->ns->allowTransparency) {
pWindow->forcedBG = TRUE;
}
}
}
// resource access inside same container is always permitted
if (XnsClientSameNS(subj, obj))
goto pass;
// check for root windows (screen or ns-virtual)
if (param->rtype == X11_RESTYPE_WINDOW) {
WindowPtr pWindow = (WindowPtr) param->res;
/* white-listed operations on namespace's virtual root window */
if (pWindow == subj->ns->rootWindow) {
switch (client->majorOp) {
case X_DeleteProperty:
case X_ChangeProperty:
case X_GetProperty:
case X_RotateProperties:
case X_QueryTree:
goto pass;
}
XNS_HOOK_LOG("unhandled access to NS' virtual root window 0x%0x\n", pWindow->drawable.id);
}
/* white-listed operations on actual root window */
if (pWindow && (pWindow == pWindow->drawable.pScreen->root)) {
switch (client->majorOp) {
case X_CreateWindow:
if (checkAllowed(param->access_mode, DixAddAccess))
goto pass;
break;
case X_CreateGC:
case X_CreatePixmap:
if (checkAllowed(param->access_mode, DixGetAttrAccess))
goto pass;
break;
// we reach here when destroying a top-level window:
// ProcDestroyWindow() checks whether one may remove a child
// from it's parent.
case X_DestroyWindow:
if (param->access_mode == DixRemoveAccess)
goto pass;
break;
case X_TranslateCoords:
case X_QueryTree:
goto pass;
case X_ChangeWindowAttributes:
case X_QueryPointer:
goto reject;
case X_SendEvent:
/* send hook needs to take care of this */
goto pass;
case EXTENSION_MAJOR_XINPUT:
switch(client->minorOp) {
// needed by xeyes. we should filter the mask
case X_XISelectEvents:
goto pass;
}
XNS_HOOK_LOG("unhandled XI operation on (real) root window\n");
goto reject;
}
}
}
/* server resources */
if (obj->isServer) {
if (param->rtype == X11_RESTYPE_COLORMAP) {
if (checkAllowed(param->access_mode, DixReadAccess | DixGetPropAccess | DixUseAccess | DixGetAttrAccess | DixAddAccess))
goto pass;
}
if (param->rtype == X11_RESTYPE_WINDOW) {
/* allowed ones should already been catched above */
XNS_HOOK_LOG("REJECT server owned window 0x%0x!\n", ((WindowPtr)param->res)->drawable.id);
goto reject;
}
if (checkAllowed(param->access_mode, DixReadAccess))
goto pass;
}
reject: ;
char accModeStr[128];
LookupDixAccessName(param->access_mode, (char*)&accModeStr, sizeof(accModeStr));
XNS_HOOK_LOG("BLOCKED access 0x%07lx %s to %s 0x%06lx of client %d @ %s\n",
(unsigned long)param->access_mode,
accModeStr,
LookupResourceName(param->rtype),
(unsigned long)param->id,
owner->index, // resource owner
obj->ns->name);
param->status = BadAccess;
return;
pass:
// request is passed as it is (or already had been rewritten)
param->status = Success;
}

View File

@ -1,67 +0,0 @@
#define HOOK_NAME "selection"
#include <dix-config.h>
#include <stdio.h>
#include "dix/selection_priv.h"
#include "namespace.h"
#include "hooks.h"
static inline const char *stripNS(const char* name) {
if ((!name) || (name[0] != '<'))
return name; // can this ever happen ?
const char *got = strchr(name, '>');
if (!got)
return name;
return ++got;
}
/*
* This hook is rewriting the client visible selection names to internally used,
* per namespace ones. Whenever a client is asking for a selection, it's name
* is replaced by a namespaced one, e.g. asking for "PRIMARY" while being in
* namespace "foo" will become "<foo>PRIMARY"
*
* A malicious client could still send specially crafted messages to others,
* asking them to send their selection data to him. This needs to be solved
* separately, by a send hook.
*/
void hookSelectionFilter(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(SelectionFilterParamRec);
/* no rewrite if client is in root namespace */
if (subj->ns->superPower)
return;
const char *origSelectionName = NameForAtom(param->selection);
char selname[PATH_MAX] = { 0 };
snprintf(selname, sizeof(selname)-1, "<%s>%s", subj->ns->name, origSelectionName);
Atom realSelection = MakeAtom(selname, strlen(selname), TRUE);
switch (param->op) {
case SELECTION_FILTER_GETOWNER:
case SELECTION_FILTER_SETOWNER:
case SELECTION_FILTER_CONVERT:
case SELECTION_FILTER_LISTEN:
// TODO: check whether window really belongs to the client
param->selection = realSelection;
break;
case SELECTION_FILTER_NOTIFY:
{
// need to translate back, since we're having the ns-prefixed name here
const char *stripped = stripNS(origSelectionName);
param->selection = MakeAtom(stripped, strlen(stripped), TRUE);
break;
}
// nothing to do here: already having the client visible name
case SELECTION_FILTER_EV_REQUEST:
case SELECTION_FILTER_EV_CLEAR:
break;
}
}

View File

@ -1,53 +0,0 @@
#define HOOK_NAME "send"
#include <dix-config.h>
#include "dix/registry_priv.h"
#include "dix/resource_priv.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
/* TRUE if subj client is allowed to do things on obj)
* usually if they're in the same namespace or subj is in a parent
* namespace of obj
*/
static Bool clientAllowedOnClient(ClientPtr subj, ClientPtr obj) {
struct XnamespaceClientPriv *subjPriv = XnsClientPriv(subj);
struct XnamespaceClientPriv *objPriv = XnsClientPriv(obj);
if (subjPriv && subjPriv->ns->superPower)
return TRUE;
return XnsClientSameNS(subjPriv, objPriv);
}
void hookSend(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceSendAccessRec);
/* if no sending client, then it's coming internally from the server itself */
if (!client)
goto pass;
ClientPtr targetClient = dixClientForWindow(param->pWin);
struct XnamespaceClientPriv *obj = XnsClientPriv(targetClient);
if (clientAllowedOnClient(client, targetClient))
goto pass;
XNS_HOOK_LOG("BLOCK target @ %s\n", obj->ns->name);
for (int i = 0; i < param->count; i++) {
XNS_HOOK_LOG("sending event of type %s to window 0x%lx of client %d\n",
LookupEventName(param->events[i].u.u.type),
(unsigned long)param->pWin->drawable.id,
targetClient->index);
}
param->status = BadAccess;
return;
pass:
param->status = Success;
return;
}

View File

@ -1,37 +0,0 @@
#define HOOK_NAME "server"
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "dix/registry_priv.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
void hookServerAccess(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(XaceServerAccessRec);
if (subj->ns->superPower)
goto pass;
switch (client->majorOp) {
case X_ListFonts:
case X_ListFontsWithInfo:
goto pass;
case X_GrabServer:
goto reject;
}
XNS_HOOK_LOG("BLOCKED access to server configuration request %s\n",
LookupRequestName(client->majorOp, client->minorOp));
reject:
param->status = BadAccess;
return;
pass:
param->status = Success;
}

View File

@ -1,44 +0,0 @@
#define HOOK_NAME "windowproperty"
#include <dix-config.h>
#include <X11/Xmd.h>
#include "dix/dix_priv.h"
#include "dix/property_priv.h"
#include "dix/window_priv.h"
#include "namespace.h"
#include "hooks.h"
void hookWindowProperty(CallbackListPtr *pcbl, void *unused, void *calldata)
{
XNS_HOOK_HEAD(PropertyFilterParam);
// no redirect on super power
if (subj->ns->superPower)
return;
const ClientPtr owner = dixLookupXIDOwner(param->window);
if (!owner) {
param->status = BadWindow;
param->skip = TRUE;
XNS_HOOK_LOG("owner of window 0x%0x doesn't exist\n", param->window);
return;
}
// whitelist anything that goes to caller's own namespace
struct XnamespaceClientPriv *obj = XnsClientPriv(owner);
if (XnsClientSameNS(subj, obj))
return;
// allow access to namespace virtual root
if (param->window == subj->ns->rootWindow->drawable.id)
return;
// redirect root window access to namespace's virtual root
if (dixWindowIsRoot(param->window)) {
param->window = subj->ns->rootWindow->drawable.id;
return;
}
}

View File

@ -1,41 +0,0 @@
#ifndef __XSERVER_NAMESPACE_HOOKS_H
#define __XSERVER_NAMESPACE_HOOKS_H
#include "dix/registry_priv.h"
#include "include/misc.h"
#include "namespace.h"
#define XNS_HOOK_LOG(...) do { \
printf("XNS [" HOOK_NAME "] (#%d@%d) {%s} <%s>: ", \
(client ? client->index : -1), \
(client ? client->sequence : -1), \
(subj ? (subj->ns ? subj->ns->name : "(no ns)") : "<no client>"), \
LookupRequestName(client ? client->majorOp : 0, \
client ? client->minorOp : 0)); \
printf(__VA_ARGS__); \
} while (0)
#define XNS_HOOK_HEAD(t) \
t *param = calldata; \
ClientPtr client = param->client; \
if (!client) { \
/* XNS_LOG("hook %s NULL client\n", HOOK_NAME); */ \
} \
struct XnamespaceClientPriv *subj = XnsClientPriv(client);
void hookClient(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookClientState(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookDevice(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookExtAccess(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookExtDispatch(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookInitRootWindow(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookPropertyAccess(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookReceive(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookResourceAccess(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookSelectionFilter(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookSend(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookServerAccess(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookWindowProperty(CallbackListPtr *pcbl, void *unused, void *calldata);
#endif /* __XSERVER_NAMESPACE_HOOKS_H */

View File

@ -1,22 +0,0 @@
libxserver_namespace = static_library(
'xserver_namespace',
[
'config.c',
'hook-client.c',
'hook-clientstate.c',
'hook-device.c',
'hook-ext-access.c',
'hook-ext-dispatch.c',
'hook-init-rootwindow.c',
'hook-property.c',
'hook-receive.c',
'hook-resource.c',
'hook-selection.c',
'hook-send.c',
'hook-server.c',
'hook-windowproperty.c',
'namespace.c',
],
include_directories: inc,
dependencies: common_dep,
)

View File

@ -1,92 +0,0 @@
#include <dix-config.h>
#include <stdio.h>
#include <X11/Xmd.h>
#include "dix/dix_priv.h"
#include "dix/property_priv.h"
#include "dix/selection_priv.h"
#include "include/os.h"
#include "miext/extinit_priv.h"
#include "Xext/xacestr.h"
#include "namespace.h"
#include "hooks.h"
Bool noNamespaceExtension = TRUE;
DevPrivateKeyRec namespaceClientPrivKeyRec = { 0 };
void
NamespaceExtensionInit(void)
{
XNS_LOG("initializing namespace extension ...\n");
/* load configuration */
if (!XnsLoadConfig()) {
XNS_LOG("No config file. disabling Xns extension\n");
return;
}
if (!(dixRegisterPrivateKey(&namespaceClientPrivKeyRec, PRIVATE_CLIENT,
sizeof(struct XnamespaceClientPriv)) &&
AddCallback(&ClientStateCallback, hookClientState, NULL) &&
AddCallback(&PostInitRootWindowCallback, hookInitRootWindow, NULL) &&
AddCallback(&PropertyFilterCallback, hookWindowProperty, NULL) &&
AddCallback(&SelectionFilterCallback, hookSelectionFilter, NULL) &&
XaceRegisterCallback(XACE_CLIENT_ACCESS, hookClient, NULL) &&
XaceRegisterCallback(XACE_DEVICE_ACCESS, hookDevice, NULL) &&
XaceRegisterCallback(XACE_EXT_DISPATCH, hookExtDispatch, NULL) &&
XaceRegisterCallback(XACE_EXT_ACCESS, hookExtAccess, NULL) &&
XaceRegisterCallback(XACE_PROPERTY_ACCESS, hookPropertyAccess, NULL) &&
XaceRegisterCallback(XACE_RECEIVE_ACCESS, hookReceive, NULL) &&
XaceRegisterCallback(XACE_RESOURCE_ACCESS, hookResourceAccess, NULL) &&
XaceRegisterCallback(XACE_SEND_ACCESS, hookSend, NULL) &&
XaceRegisterCallback(XACE_SERVER_ACCESS, hookServerAccess, NULL)))
FatalError("NamespaceExtensionInit: allocation failure\n");
/* Do the serverClient */
struct XnamespaceClientPriv *srv = XnsClientPriv(serverClient);
*srv = (struct XnamespaceClientPriv) { .isServer = TRUE };
XnamespaceAssignClient(srv, &ns_root);
}
void XnamespaceAssignClient(struct XnamespaceClientPriv *priv, struct Xnamespace *newns)
{
if (priv->ns != NULL)
priv->ns->refcnt--;
priv->ns = newns;
if (newns != NULL)
newns->refcnt++;
}
void XnamespaceAssignClientByName(struct XnamespaceClientPriv *priv, const char *name)
{
struct Xnamespace *newns = XnsFindByName(name);
if (newns == NULL)
newns = &ns_anon;
XnamespaceAssignClient(priv, newns);
}
struct Xnamespace* XnsFindByAuth(size_t szAuthProto, const char* authProto, size_t szAuthToken, const char* authToken)
{
struct Xnamespace *walk;
xorg_list_for_each_entry(walk, &ns_list, entry) {
struct auth_token *at;
xorg_list_for_each_entry(at, &walk->auth_tokens, entry) {
int protoLen = at->authProto ? strlen(at->authProto) : 0;
if ((protoLen == szAuthProto) &&
(at->authTokenLen == szAuthToken) &&
(memcmp(at->authTokenData, authToken, szAuthToken)==0) &&
(memcmp(at->authProto, authProto, szAuthProto)==0))
return walk;
}
}
// default to anonymous if credentials aren't assigned to specific NS
return &ns_anon;
}

View File

@ -1,82 +0,0 @@
#ifndef __XSERVER_NAMESPACE_H
#define __XSERVER_NAMESPACE_H
#include <stdio.h>
#include <X11/Xmd.h>
#include "include/dixstruct.h"
#include "include/list.h"
#include "include/privates.h"
#include "include/window.h"
#include "include/windowstr.h"
struct auth_token {
struct xorg_list entry;
const char *authProto;
char *authTokenData;
size_t authTokenLen;
XID authId;
};
struct Xnamespace {
struct xorg_list entry;
const char *name;
Bool builtin;
Bool allowMouseMotion;
Bool allowShape;
Bool allowTransparency;
Bool allowXInput;
Bool allowXKeyboard;
Bool superPower;
struct xorg_list auth_tokens;
size_t refcnt;
WindowPtr rootWindow;
};
extern struct xorg_list ns_list;
extern struct Xnamespace ns_root;
extern struct Xnamespace ns_anon;
struct XnamespaceClientPriv {
Bool isServer;
XID authId;
struct Xnamespace* ns;
};
#define NS_NAME_ROOT "root"
#define NS_NAME_ANONYMOUS "anon"
extern DevPrivateKeyRec namespaceClientPrivKeyRec;
Bool XnsLoadConfig(void);
struct Xnamespace *XnsFindByName(const char* name);
struct Xnamespace* XnsFindByAuth(size_t szAuthProto, const char* authProto, size_t szAuthToken, const char* authToken);
void XnamespaceAssignClient(struct XnamespaceClientPriv *priv, struct Xnamespace *ns);
void XnamespaceAssignClientByName(struct XnamespaceClientPriv *priv, const char *name);
static inline struct XnamespaceClientPriv *XnsClientPriv(ClientPtr client) {
if (client == NULL) return NULL;
return dixLookupPrivate(&client->devPrivates, &namespaceClientPrivKeyRec);
}
static inline Bool XnsClientSameNS(struct XnamespaceClientPriv *p1, struct XnamespaceClientPriv *p2)
{
if (!p1 && !p2)
return TRUE;
if (!p1 || !p2)
return FALSE;
return (p1->ns == p2->ns);
}
#define XNS_LOG(...) do { printf("XNS "); printf(__VA_ARGS__); } while (0)
static inline Bool streq(const char *a, const char *b)
{
if (!a && !b)
return TRUE;
if (!a || !b)
return FALSE;
return (strcmp(a,b) == 0);
}
#endif /* __XSERVER_NAMESPACE_H */

View File

@ -1,18 +0,0 @@
# auth <proto> <hex-key>
auth MIT-MAGIC-COOKIE-1 46f8e62b78e58962de0ceefc05ad90b0
auth MIT-MAGIC-COOKIE-1 56f8e62b78e58962de0ceefc05ad90b0
# container <name> <parent_name>
container xeyes root
auth MIT-MAGIC-COOKIE-1 46f8e62b78e58962de0ceefc05ad90b8
auth MIT-MAGIC-COOKIE-1 46f8e62b78e58962de0ceefc05ad90a8
allow mouse-motion
allow shape
allow xinput
container xclock root
auth MIT-MAGIC-COOKIE-1 46f8e62b78e58962de0ceefc05ad90b7
auth MIT-MAGIC-COOKIE-1 46f8e62b78e58962de0ceefc05ad91b7
auth MIT-MAGIC-COOKIE-1 46f8e62b78e58962de0ceefc05ad92b7
auth MIT-MAGIC-COOKIE-1 46f8e62b78e58962de0ceefc05ad93b7

View File

@ -32,11 +32,6 @@ Equipment Corporation.
#include <X11/extensions/panoramiXproto.h> #include <X11/extensions/panoramiXproto.h>
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/resource_priv.h"
#include "dix/screen_hooks_priv.h"
#include "miext/extinit_priv.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "misc.h" #include "misc.h"
#include "cursor.h" #include "cursor.h"
@ -49,13 +44,18 @@ Equipment Corporation.
#include "window.h" #include "window.h"
#include "windowstr.h" #include "windowstr.h"
#include "pixmapstr.h" #include "pixmapstr.h"
#include "panoramiX.h"
#include "panoramiXsrv.h"
#include "globals.h" #include "globals.h"
#include "servermd.h" #include "servermd.h"
#include "resource.h" #include "resource.h"
#include "picturestr_priv.h" #include "picturestr_priv.h"
#include "xfixesint.h" #include "xfixesint.h"
#include "damageextint.h" #include "damageextint.h"
#ifdef COMPOSITE
#include "compint.h" #include "compint.h"
#endif
#include "extinit_priv.h"
#include "protocol-versions.h" #include "protocol-versions.h"
#ifdef GLXPROXY #ifdef GLXPROXY
@ -74,7 +74,7 @@ int PanoramiXPixWidth = 0;
int PanoramiXPixHeight = 0; int PanoramiXPixHeight = 0;
int PanoramiXNumScreens = 0; int PanoramiXNumScreens = 0;
RegionRec PanoramiXScreenRegion = { {0, 0, 0, 0}, NULL }; _X_EXPORT RegionRec PanoramiXScreenRegion = { {0, 0, 0, 0}, NULL };
static int PanoramiXNumDepths; static int PanoramiXNumDepths;
static DepthPtr PanoramiXDepths; static DepthPtr PanoramiXDepths;
@ -88,7 +88,7 @@ RESTYPE XRT_GC;
RESTYPE XRT_COLORMAP; RESTYPE XRT_COLORMAP;
static Bool VisualsEqual(VisualPtr, ScreenPtr, VisualPtr); static Bool VisualsEqual(VisualPtr, ScreenPtr, VisualPtr);
static XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr = &VisualsEqual; XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr = &VisualsEqual;
/* /*
* Function prototypes * Function prototypes
@ -123,6 +123,7 @@ typedef struct {
typedef struct { typedef struct {
CreateGCProcPtr CreateGC; CreateGCProcPtr CreateGC;
CloseScreenProcPtr CloseScreen;
} PanoramiXScreenRec, *PanoramiXScreenPtr; } PanoramiXScreenRec, *PanoramiXScreenPtr;
static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr); static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr);
@ -147,23 +148,21 @@ static const GCFuncs XineramaGCFuncs = {
pGCPriv->wrapFuncs = (pGC)->funcs;\ pGCPriv->wrapFuncs = (pGC)->funcs;\
(pGC)->funcs = &XineramaGCFuncs; (pGC)->funcs = &XineramaGCFuncs;
static void XineramaCloseScreen(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unsused) static Bool
XineramaCloseScreen(ScreenPtr pScreen)
{ {
dixScreenUnhookClose(pScreen, XineramaCloseScreen);
PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr) PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey); dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
if (!pScreenPriv) pScreen->CloseScreen = pScreenPriv->CloseScreen;
return;
pScreen->CreateGC = pScreenPriv->CreateGC; pScreen->CreateGC = pScreenPriv->CreateGC;
if (pScreen->myNum == 0) if (pScreen->myNum == 0)
RegionUninit(&PanoramiXScreenRegion); RegionUninit(&PanoramiXScreenRegion);
free(pScreenPriv); free(pScreenPriv);
dixSetPrivate(&pScreen->devPrivates, PanoramiXScreenKey, NULL);
return (*pScreen->CloseScreen) (pScreen);
} }
static Bool static Bool
@ -353,7 +352,7 @@ PanoramiXFindIDByScrnum(RESTYPE type, XID id, int screen)
data.screen = screen; data.screen = screen;
data.id = id; data.id = id;
return LookupClientResourceComplex(dixClientForXID(id), type, return LookupClientResourceComplex(clients[CLIENT_ID(id)], type,
XineramaFindIDByScrnum, &data); XineramaFindIDByScrnum, &data);
} }
@ -369,7 +368,7 @@ XineramaRegisterConnectionBlockCallback(void (*func) (void))
{ {
XineramaConnectionCallbackList *newlist; XineramaConnectionCallbackList *newlist;
if (!(newlist = calloc(1, sizeof(XineramaConnectionCallbackList)))) if (!(newlist = malloc(sizeof(XineramaConnectionCallbackList))))
return FALSE; return FALSE;
newlist->next = ConnectionCallbackList; newlist->next = ConnectionCallbackList;
@ -385,7 +384,7 @@ XineramaInitData(void)
int i, w, h; int i, w, h;
RegionNull(&PanoramiXScreenRegion); RegionNull(&PanoramiXScreenRegion);
FOR_NSCREENS_BACKWARD(i) { FOR_NSCREENS(i) {
BoxRec TheBox; BoxRec TheBox;
RegionRec ScreenRegion; RegionRec ScreenRegion;
@ -419,6 +418,13 @@ XineramaInitData(void)
} }
} }
void
XineramaReinitData(void)
{
RegionUninit(&PanoramiXScreenRegion);
XineramaInitData();
}
/* /*
* PanoramiXExtensionInit(): * PanoramiXExtensionInit():
* Called from InitExtensions in main(). * Called from InitExtensions in main().
@ -433,6 +439,7 @@ PanoramiXExtensionInit(void)
Bool success = FALSE; Bool success = FALSE;
ExtensionEntry *extEntry; ExtensionEntry *extEntry;
ScreenPtr pScreen = screenInfo.screens[0]; ScreenPtr pScreen = screenInfo.screens[0];
PanoramiXScreenPtr pScreenPriv;
if (noPanoramiXExtension) if (noPanoramiXExtension)
return; return;
@ -467,9 +474,9 @@ PanoramiXExtensionInit(void)
* run in non-PanoramiXeen mode. * run in non-PanoramiXeen mode.
*/ */
FOR_NSCREENS_BACKWARD(i) { FOR_NSCREENS(i) {
pScreen = screenInfo.screens[i]; pScreen = screenInfo.screens[i];
PanoramiXScreenPtr pScreenPriv = calloc(1, sizeof(PanoramiXScreenRec)); pScreenPriv = malloc(sizeof(PanoramiXScreenRec));
dixSetPrivate(&pScreen->devPrivates, PanoramiXScreenKey, dixSetPrivate(&pScreen->devPrivates, PanoramiXScreenKey,
pScreenPriv); pScreenPriv);
if (!pScreenPriv) { if (!pScreenPriv) {
@ -477,10 +484,11 @@ PanoramiXExtensionInit(void)
return; return;
} }
dixScreenHookClose(pScreen, XineramaCloseScreen);
pScreenPriv->CreateGC = pScreen->CreateGC; pScreenPriv->CreateGC = pScreen->CreateGC;
pScreenPriv->CloseScreen = pScreen->CloseScreen;
pScreen->CreateGC = XineramaCreateGC; pScreen->CreateGC = XineramaCreateGC;
pScreen->CloseScreen = XineramaCloseScreen;
} }
XRC_DRAWABLE = CreateNewResourceClass(); XRC_DRAWABLE = CreateNewResourceClass();
@ -576,7 +584,10 @@ PanoramiXExtensionInit(void)
PanoramiXRenderInit(); PanoramiXRenderInit();
PanoramiXFixesInit(); PanoramiXFixesInit();
PanoramiXDamageInit(); PanoramiXDamageInit();
#ifdef COMPOSITE
PanoramiXCompositeInit(); PanoramiXCompositeInit();
#endif
} }
Bool Bool
@ -795,6 +806,7 @@ extern void
PanoramiXConsolidate(void) PanoramiXConsolidate(void)
{ {
int i; int i;
PanoramiXRes *root, *defmap, *saver;
ScreenPtr pScreen = screenInfo.screens[0]; ScreenPtr pScreen = screenInfo.screens[0];
DepthPtr pDepth = pScreen->allowedDepths; DepthPtr pDepth = pScreen->allowedDepths;
VisualPtr pVisual = pScreen->visuals; VisualPtr pVisual = pScreen->visuals;
@ -808,26 +820,14 @@ PanoramiXConsolidate(void)
for (i = 0; i < pScreen->numVisuals; i++) for (i = 0; i < pScreen->numVisuals; i++)
PanoramiXMaybeAddVisual(pVisual++); PanoramiXMaybeAddVisual(pVisual++);
PanoramiXRes *root = calloc(1, sizeof(PanoramiXRes)); root = malloc(sizeof(PanoramiXRes));
if (!root)
return;
root->type = XRT_WINDOW; root->type = XRT_WINDOW;
PanoramiXRes *defmap = calloc(1, sizeof(PanoramiXRes)); defmap = malloc(sizeof(PanoramiXRes));
if (!defmap) {
free(root);
return;
}
defmap->type = XRT_COLORMAP; defmap->type = XRT_COLORMAP;
PanoramiXRes *saver = calloc(1, sizeof(PanoramiXRes)); saver = malloc(sizeof(PanoramiXRes));
if (!saver) {
free(root);
free(defmap);
return;
}
saver->type = XRT_WINDOW; saver->type = XRT_WINDOW;
FOR_NSCREENS_BACKWARD(i) { FOR_NSCREENS(i) {
ScreenPtr scr = screenInfo.screens[i]; ScreenPtr scr = screenInfo.screens[i];
root->info[i].id = scr->root->drawable.id; root->info[i].id = scr->root->drawable.id;
@ -889,7 +889,9 @@ PanoramiXResetProc(ExtensionEntry * extEntry)
PanoramiXRenderReset(); PanoramiXRenderReset();
PanoramiXFixesReset(); PanoramiXFixesReset();
PanoramiXDamageReset(); PanoramiXDamageReset();
#ifdef COMPOSITE
PanoramiXCompositeReset (); PanoramiXCompositeReset ();
#endif
screenInfo.numScreens = PanoramiXNumScreens; screenInfo.numScreens = PanoramiXNumScreens;
for (i = 256; i--;) for (i = 256; i--;)
ProcVector[i] = SavedProcVector[i]; ProcVector[i] = SavedProcVector[i];
@ -1070,7 +1072,7 @@ ProcXineramaQueryScreens(ClientPtr client)
xXineramaScreenInfo scratch; xXineramaScreenInfo scratch;
int i; int i;
FOR_NSCREENS_BACKWARD(i) { FOR_NSCREENS(i) {
scratch.x_org = screenInfo.screens[i]->x; scratch.x_org = screenInfo.screens[i]->x;
scratch.y_org = screenInfo.screens[i]->y; scratch.y_org = screenInfo.screens[i]->y;
scratch.width = screenInfo.screens[i]->width; scratch.width = screenInfo.screens[i]->width;
@ -1169,7 +1171,7 @@ XineramaGetImageData(DrawablePtr *pDrawables,
depth = (format == XYPixmap) ? 1 : pDraw->depth; depth = (format == XYPixmap) ? 1 : pDraw->depth;
FOR_NSCREENS_BACKWARD(i) { FOR_NSCREENS(i) {
BoxRec TheBox; BoxRec TheBox;
ScreenPtr pScreen; ScreenPtr pScreen;
@ -1251,16 +1253,12 @@ XineramaGetImageData(DrawablePtr *pDrawables,
for (j = 0, index = (pitch * y) + x, index2 = 0; j < h; for (j = 0, index = (pitch * y) + x, index2 = 0; j < h;
j++, index += pitch, index2 += ScratchPitch) { j++, index += pitch, index2 += ScratchPitch) {
if (w) { if (w) {
if (!shift) { if (!shift)
assert(ScratchMem);
memcpy(data + index, ScratchMem + index2, w); memcpy(data + index, ScratchMem + index2, w);
} else
else {
assert(ScratchMem);
CopyBits(data + index, shift, CopyBits(data + index, shift,
ScratchMem + index2, w); ScratchMem + index2, w);
} }
}
if (leftover) { if (leftover) {
data[index + w] |= data[index + w] |=
@ -1279,7 +1277,6 @@ XineramaGetImageData(DrawablePtr *pDrawables,
w *= j; w *= j;
for (j = 0; j < h; j++) { for (j = 0; j < h; j++) {
assert(ScratchMem);
memcpy(data + (pitch * (y + j)) + x, memcpy(data + (pitch * (y + j)) + x,
ScratchMem + (ScratchPitch * j), w); ScratchMem + (ScratchPitch * j), w);
} }

View File

@ -32,12 +32,13 @@ Equipment Corporation.
* PanoramiX definitions * PanoramiX definitions
*/ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h> #include <dix-config.h>
#endif
#ifndef _PANORAMIX_H_ #ifndef _PANORAMIX_H_
#define _PANORAMIX_H_ #define _PANORAMIX_H_
#include <X11/Xmd.h>
#include <X11/extensions/panoramiXproto.h> #include <X11/extensions/panoramiXproto.h>
#include "gcstruct.h" #include "gcstruct.h"
@ -69,6 +70,7 @@ typedef struct {
#define FOR_NSCREENS_FORWARD(j) for(j = 0; j < PanoramiXNumScreens; j++) #define FOR_NSCREENS_FORWARD(j) for(j = 0; j < PanoramiXNumScreens; j++)
#define FOR_NSCREENS_FORWARD_SKIP(j) for(j = 1; j < PanoramiXNumScreens; j++) #define FOR_NSCREENS_FORWARD_SKIP(j) for(j = 1; j < PanoramiXNumScreens; j++)
#define FOR_NSCREENS_BACKWARD(j) for(j = PanoramiXNumScreens - 1; j >= 0; j--) #define FOR_NSCREENS_BACKWARD(j) for(j = PanoramiXNumScreens - 1; j >= 0; j--)
#define FOR_NSCREENS(j) FOR_NSCREENS_FORWARD(j)
#define IS_SHARED_PIXMAP(r) (((r)->type == XRT_PIXMAP) && (r)->u.pix.shared) #define IS_SHARED_PIXMAP(r) (((r)->type == XRT_PIXMAP) && (r)->u.pix.shared)

View File

@ -28,11 +28,6 @@ Equipment Corporation.
#include <stdio.h> #include <stdio.h>
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include <X11/extensions/panoramiXproto.h>
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "misc.h" #include "misc.h"
#include "cursor.h" #include "cursor.h"
#include "cursorstr.h" #include "cursorstr.h"
@ -44,6 +39,9 @@ Equipment Corporation.
#include "window.h" #include "window.h"
#include "windowstr.h" #include "windowstr.h"
#include "pixmapstr.h" #include "pixmapstr.h"
#include "panoramiX.h"
#include <X11/extensions/panoramiXproto.h>
#include "panoramiXsrv.h"
#include "globals.h" #include "globals.h"
#include "panoramiXh.h" #include "panoramiXh.h"

View File

@ -1,10 +1,8 @@
/* /*
* Server dispatcher function replacements * Server dispatcher function replacements
*/ */
#ifndef XSERVER_PANORAMIXH_H
#define XSERVER_PANORAMIXH_H
extern int PanoramiXCreateWindow(ClientPtr client); extern int PanoramiXCreateWindow(ClientPtr client);
extern int PanoramiXChangeWindowAttributes(ClientPtr client); extern int PanoramiXChangeWindowAttributes(ClientPtr client);
extern int PanoramiXDestroyWindow(ClientPtr client); extern int PanoramiXDestroyWindow(ClientPtr client);
@ -73,5 +71,3 @@ extern int connBlockScreenStart;
extern xConnSetupPrefix connSetupPrefix; extern xConnSetupPrefix connSetupPrefix;
extern int (*SavedProcVector[256]) (ClientPtr client); extern int (*SavedProcVector[256]) (ClientPtr client);
#endif /* XSERVER_PANORAMIXH_H */

View File

@ -33,18 +33,19 @@ Equipment Corporation.
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "os/osdep.h" #include "os/osdep.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "windowstr.h" #include "windowstr.h"
#include "dixfontstr.h" #include "dixfontstr.h"
#include "gcstruct.h" #include "gcstruct.h"
#include "colormapst.h"
#include "scrnintstr.h" #include "scrnintstr.h"
#include "opaque.h" #include "opaque.h"
#include "inputstr.h" #include "inputstr.h"
#include "migc.h" #include "migc.h"
#include "misc.h" #include "misc.h"
#include "dixstruct.h" #include "dixstruct.h"
#include "panoramiX.h"
#include "panoramiXsrv.h"
#include "resource.h" #include "resource.h"
#include "panoramiXh.h" #include "panoramiXh.h"
@ -116,7 +117,7 @@ PanoramiXCreateWindow(ClientPtr client)
} }
} }
if (!(newWin = calloc(1, sizeof(PanoramiXRes)))) if (!(newWin = malloc(sizeof(PanoramiXRes))))
return BadAlloc; return BadAlloc;
newWin->type = XRT_WINDOW; newWin->type = XRT_WINDOW;
@ -556,6 +557,7 @@ PanoramiXCirculateWindow(ClientPtr client)
int int
PanoramiXGetGeometry(ClientPtr client) PanoramiXGetGeometry(ClientPtr client)
{ {
xGetGeometryReply rep;
DrawablePtr pDraw; DrawablePtr pDraw;
int rc; int rc;
@ -566,7 +568,7 @@ PanoramiXGetGeometry(ClientPtr client)
if (rc != Success) if (rc != Success)
return rc; return rc;
xGetGeometryReply rep = { rep = (xGetGeometryReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0, .length = 0,
@ -600,16 +602,7 @@ PanoramiXGetGeometry(ClientPtr client)
rep.borderWidth = pWin->borderWidth; rep.borderWidth = pWin->borderWidth;
} }
if (client->swapped) { WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
swaps(&rep.sequenceNumber);
swapl(&rep.root);
swaps(&rep.x);
swaps(&rep.y);
swaps(&rep.width);
swaps(&rep.height);
swaps(&rep.borderWidth);
}
WriteToClient(client, sizeof(xGetGeometryReply), &rep);
return Success; return Success;
} }
@ -621,6 +614,7 @@ PanoramiXTranslateCoords(ClientPtr client)
REQUEST(xTranslateCoordsReq); REQUEST(xTranslateCoordsReq);
int rc; int rc;
WindowPtr pWin, pDst; WindowPtr pWin, pDst;
xTranslateCoordsReply rep;
REQUEST_SIZE_MATCH(xTranslateCoordsReq); REQUEST_SIZE_MATCH(xTranslateCoordsReq);
rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess); rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess);
@ -629,8 +623,7 @@ PanoramiXTranslateCoords(ClientPtr client)
rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess); rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess);
if (rc != Success) if (rc != Success)
return rc; return rc;
rep = (xTranslateCoordsReply) {
xTranslateCoordsReply rep = {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0, .length = 0,
@ -681,13 +674,7 @@ PanoramiXTranslateCoords(ClientPtr client)
rep.dstY += screenInfo.screens[0]->y; rep.dstY += screenInfo.screens[0]->y;
} }
if (client->swapped) { WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
swaps(&rep.sequenceNumber);
swapl(&rep.child);
swaps(&rep.dstX);
swaps(&rep.dstY);
}
WriteToClient(client, sizeof(rep), &rep);
return Success; return Success;
} }
@ -707,7 +694,7 @@ PanoramiXCreatePixmap(ClientPtr client)
if (result != Success) if (result != Success)
return (result == BadValue) ? BadDrawable : result; return (result == BadValue) ? BadDrawable : result;
if (!(newPix = calloc(1, sizeof(PanoramiXRes)))) if (!(newPix = malloc(sizeof(PanoramiXRes))))
return BadAlloc; return BadAlloc;
newPix->type = XRT_PIXMAP; newPix->type = XRT_PIXMAP;
@ -814,7 +801,7 @@ PanoramiXCreateGC(ClientPtr client)
} }
} }
if (!(newGC = calloc(1, sizeof(PanoramiXRes)))) if (!(newGC = malloc(sizeof(PanoramiXRes))))
return BadAlloc; return BadAlloc;
newGC->type = XRT_GC; newGC->type = XRT_GC;
@ -930,7 +917,7 @@ PanoramiXCopyGC(ClientPtr client)
if (result != Success) if (result != Success)
return result; return result;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
stuff->srcGC = srcGC->info[j].id; stuff->srcGC = srcGC->info[j].id;
stuff->dstGC = dstGC->info[j].id; stuff->dstGC = dstGC->info[j].id;
result = (*SavedProcVector[X_CopyGC]) (client); result = (*SavedProcVector[X_CopyGC]) (client);
@ -1111,11 +1098,11 @@ PanoramiXCopyArea(ClientPtr client)
if ((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) { if ((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) {
DrawablePtr drawables[MAXSCREENS]; DrawablePtr drawables[MAXSCREENS];
DrawablePtr pDst; DrawablePtr pDst;
GCPtr pGC = NULL; GCPtr pGC;
char *data; char *data;
int pitch, rc; int pitch, rc;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
rc = dixLookupDrawable(drawables + j, src->info[j].id, client, 0, rc = dixLookupDrawable(drawables + j, src->info[j].id, client, 0,
DixGetAttrAccess); DixGetAttrAccess);
if (rc != Success) if (rc != Success)
@ -1149,7 +1136,7 @@ PanoramiXCopyArea(ClientPtr client)
} }
free(data); free(data);
if (pGC && pGC->graphicsExposures) { if (pGC->graphicsExposures) {
RegionRec rgn; RegionRec rgn;
int dx, dy; int dx, dy;
BoxRec sourceBox; BoxRec sourceBox;
@ -1169,7 +1156,7 @@ PanoramiXCopyArea(ClientPtr client)
RegionInit(&rgn, &sourceBox, 1); RegionInit(&rgn, &sourceBox, 1);
/* subtract the (screen-space) clips of the source drawables */ /* subtract the (screen-space) clips of the source drawables */
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
ScreenPtr screen = screenInfo.screens[j]; ScreenPtr screen = screenInfo.screens[j];
RegionPtr sd; RegionPtr sd;
@ -1387,6 +1374,7 @@ PanoramiXPolyPoint(ClientPtr client)
{ {
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
int result, npoint, j; int result, npoint, j;
xPoint *origPts;
Bool isRoot; Bool isRoot;
REQUEST(xPolyPointReq); REQUEST(xPolyPointReq);
@ -1409,10 +1397,7 @@ PanoramiXPolyPoint(ClientPtr client)
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq)); npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
if (npoint > 0) { if (npoint > 0) {
xPoint *origPts = calloc(npoint, sizeof(xPoint)); origPts = xallocarray(npoint, sizeof(xPoint));
if (!origPts)
return BadAlloc;
memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1454,6 +1439,7 @@ PanoramiXPolyLine(ClientPtr client)
{ {
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
int result, npoint, j; int result, npoint, j;
xPoint *origPts;
Bool isRoot; Bool isRoot;
REQUEST(xPolyLineReq); REQUEST(xPolyLineReq);
@ -1476,9 +1462,7 @@ PanoramiXPolyLine(ClientPtr client)
isRoot = IS_ROOT_DRAWABLE(draw); isRoot = IS_ROOT_DRAWABLE(draw);
npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq)); npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
if (npoint > 0) { if (npoint > 0) {
xPoint *origPts = calloc(npoint, sizeof(xPoint)); origPts = xallocarray(npoint, sizeof(xPoint));
if (!origPts)
return BadAlloc;
memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1520,6 +1504,7 @@ PanoramiXPolySegment(ClientPtr client)
{ {
int result, nsegs, i, j; int result, nsegs, i, j;
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
xSegment *origSegs;
Bool isRoot; Bool isRoot;
REQUEST(xPolySegmentReq); REQUEST(xPolySegmentReq);
@ -1546,9 +1531,7 @@ PanoramiXPolySegment(ClientPtr client)
return BadLength; return BadLength;
nsegs >>= 3; nsegs >>= 3;
if (nsegs > 0) { if (nsegs > 0) {
xSegment *origSegs = calloc(nsegs, sizeof(xSegment)); origSegs = xallocarray(nsegs, sizeof(xSegment));
if (!origSegs)
return BadAlloc;
memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment)); memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1590,6 +1573,7 @@ PanoramiXPolyRectangle(ClientPtr client)
int result, nrects, i, j; int result, nrects, i, j;
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
Bool isRoot; Bool isRoot;
xRectangle *origRecs;
REQUEST(xPolyRectangleReq); REQUEST(xPolyRectangleReq);
@ -1615,9 +1599,7 @@ PanoramiXPolyRectangle(ClientPtr client)
return BadLength; return BadLength;
nrects >>= 3; nrects >>= 3;
if (nrects > 0) { if (nrects > 0) {
xRectangle *origRecs = calloc(nrects, sizeof(xRectangle)); origRecs = xallocarray(nrects, sizeof(xRectangle));
if (!origRecs)
return BadAlloc;
memcpy((char *) origRecs, (char *) &stuff[1], memcpy((char *) origRecs, (char *) &stuff[1],
nrects * sizeof(xRectangle)); nrects * sizeof(xRectangle));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1658,6 +1640,7 @@ PanoramiXPolyArc(ClientPtr client)
int result, narcs, i, j; int result, narcs, i, j;
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
Bool isRoot; Bool isRoot;
xArc *origArcs;
REQUEST(xPolyArcReq); REQUEST(xPolyArcReq);
@ -1683,9 +1666,7 @@ PanoramiXPolyArc(ClientPtr client)
return BadLength; return BadLength;
narcs /= sizeof(xArc); narcs /= sizeof(xArc);
if (narcs > 0) { if (narcs > 0) {
xArc *origArcs = calloc(narcs, sizeof(xArc)); origArcs = xallocarray(narcs, sizeof(xArc));
if (!origArcs)
return BadAlloc;
memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1724,6 +1705,7 @@ PanoramiXFillPoly(ClientPtr client)
int result, count, j; int result, count, j;
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
Bool isRoot; Bool isRoot;
DDXPointPtr locPts;
REQUEST(xFillPolyReq); REQUEST(xFillPolyReq);
@ -1746,9 +1728,7 @@ PanoramiXFillPoly(ClientPtr client)
count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq)); count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
if (count > 0) { if (count > 0) {
DDXPointPtr locPts = calloc(count, sizeof(DDXPointRec)); locPts = xallocarray(count, sizeof(DDXPointRec));
if (!locPts)
return BadAlloc;
memcpy((char *) locPts, (char *) &stuff[1], memcpy((char *) locPts, (char *) &stuff[1],
count * sizeof(DDXPointRec)); count * sizeof(DDXPointRec));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1791,6 +1771,8 @@ PanoramiXPolyFillRectangle(ClientPtr client)
int result, things, i, j; int result, things, i, j;
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
Bool isRoot; Bool isRoot;
xRectangle *origRects;
REQUEST(xPolyFillRectangleReq); REQUEST(xPolyFillRectangleReq);
REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq); REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
@ -1815,9 +1797,7 @@ PanoramiXPolyFillRectangle(ClientPtr client)
return BadLength; return BadLength;
things >>= 3; things >>= 3;
if (things > 0) { if (things > 0) {
xRectangle *origRects = calloc(things, sizeof(xRectangle)); origRects = xallocarray(things, sizeof(xRectangle));
if (!origRects)
return BadAlloc;
memcpy((char *) origRects, (char *) &stuff[1], memcpy((char *) origRects, (char *) &stuff[1],
things * sizeof(xRectangle)); things * sizeof(xRectangle));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1858,6 +1838,7 @@ PanoramiXPolyFillArc(ClientPtr client)
PanoramiXRes *gc, *draw; PanoramiXRes *gc, *draw;
Bool isRoot; Bool isRoot;
int result, narcs, i, j; int result, narcs, i, j;
xArc *origArcs;
REQUEST(xPolyFillArcReq); REQUEST(xPolyFillArcReq);
@ -1883,9 +1864,7 @@ PanoramiXPolyFillArc(ClientPtr client)
return BadLength; return BadLength;
narcs /= sizeof(xArc); narcs /= sizeof(xArc);
if (narcs > 0) { if (narcs > 0) {
xArc *origArcs = calloc(narcs, sizeof(xArc)); origArcs = xallocarray(narcs, sizeof(xArc));
if (!origArcs)
return BadAlloc;
memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
FOR_NSCREENS_FORWARD(j) { FOR_NSCREENS_FORWARD(j) {
@ -1967,6 +1946,7 @@ PanoramiXGetImage(ClientPtr client)
DrawablePtr drawables[MAXSCREENS]; DrawablePtr drawables[MAXSCREENS];
DrawablePtr pDraw; DrawablePtr pDraw;
PanoramiXRes *draw; PanoramiXRes *draw;
xGetImageReply xgi;
Bool isRoot; Bool isRoot;
char *pBuf; char *pBuf;
int i, x, y, w, h, format, rc; int i, x, y, w, h, format, rc;
@ -2040,7 +2020,12 @@ PanoramiXGetImage(ClientPtr client)
IncludeInferiors); IncludeInferiors);
} }
xgi = (xGetImageReply) {
.type = X_Reply,
.sequenceNumber = client->sequence,
.visual = wVisual(((WindowPtr) pDraw)),
.depth = pDraw->depth
};
if (format == ZPixmap) { if (format == ZPixmap) {
widthBytesLine = PixmapBytePad(w, pDraw->depth); widthBytesLine = PixmapBytePad(w, pDraw->depth);
length = widthBytesLine * h; length = widthBytesLine * h;
@ -2054,13 +2039,7 @@ PanoramiXGetImage(ClientPtr client)
} }
xGetImageReply rep = { xgi.length = bytes_to_int32(length);
.type = X_Reply,
.sequenceNumber = client->sequence,
.visual = wVisual(((WindowPtr) pDraw)),
.depth = pDraw->depth,
.length = bytes_to_int32(length),
};
if (widthBytesLine == 0 || h == 0) if (widthBytesLine == 0 || h == 0)
linesPerBuf = 0; linesPerBuf = 0;
@ -2071,15 +2050,10 @@ PanoramiXGetImage(ClientPtr client)
if (linesPerBuf > h) if (linesPerBuf > h)
linesPerBuf = h; linesPerBuf = h;
} }
if (!(pBuf = calloc(linesPerBuf, widthBytesLine))) if (!(pBuf = xallocarray(linesPerBuf, widthBytesLine)))
return BadAlloc; return BadAlloc;
if (client->swapped) { WriteReplyToClient(client, sizeof(xGetImageReply), &xgi);
swaps(&rep.sequenceNumber);
swapl(&rep.length);
swapl(&rep.visual);
}
WriteToClient(client, sizeof(rep), &rep);
if (linesPerBuf == 0) { if (linesPerBuf == 0) {
/* nothing to do */ /* nothing to do */
@ -2315,7 +2289,7 @@ PanoramiXCreateColormap(ClientPtr client)
if (result != Success) if (result != Success)
return result; return result;
if (!(newCmap = calloc(1, sizeof(PanoramiXRes)))) if (!(newCmap = malloc(sizeof(PanoramiXRes))))
return BadAlloc; return BadAlloc;
newCmap->type = XRT_COLORMAP; newCmap->type = XRT_COLORMAP;
@ -2387,7 +2361,7 @@ PanoramiXCopyColormapAndFree(ClientPtr client)
if (result != Success) if (result != Success)
return result; return result;
if (!(newCmap = calloc(1, sizeof(PanoramiXRes)))) if (!(newCmap = malloc(sizeof(PanoramiXRes))))
return BadAlloc; return BadAlloc;
newCmap->type = XRT_COLORMAP; newCmap->type = XRT_COLORMAP;

View File

@ -1,33 +1,34 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h> #include <dix-config.h>
#endif
#ifndef _PANORAMIXSRV_H_ #ifndef _PANORAMIXSRV_H_
#define _PANORAMIXSRV_H_ #define _PANORAMIXSRV_H_
#include "panoramiX.h" #include "panoramiX.h"
extern int PanoramiXNumScreens; extern _X_EXPORT int PanoramiXNumScreens;
extern int PanoramiXPixWidth; extern _X_EXPORT int PanoramiXPixWidth;
extern int PanoramiXPixHeight; extern _X_EXPORT int PanoramiXPixHeight;
extern RegionRec PanoramiXScreenRegion; extern _X_EXPORT RegionRec PanoramiXScreenRegion;
// exported for nvidia extern _X_EXPORT VisualID PanoramiXTranslateVisualID(int screen, VisualID orig);
_X_EXPORT VisualID PanoramiXTranslateVisualID(int screen, VisualID orig); extern _X_EXPORT void PanoramiXConsolidate(void);
extern _X_EXPORT Bool PanoramiXCreateConnectionBlock(void);
extern _X_EXPORT PanoramiXRes *PanoramiXFindIDByScrnum(RESTYPE, XID, int);
extern _X_EXPORT Bool
XineramaRegisterConnectionBlockCallback(void (*func) (void));
extern _X_EXPORT int XineramaDeleteResource(void *, XID);
void PanoramiXConsolidate(void); extern _X_EXPORT void XineramaReinitData(void);
Bool PanoramiXCreateConnectionBlock(void);
PanoramiXRes *PanoramiXFindIDByScrnum(RESTYPE, XID, int);
Bool XineramaRegisterConnectionBlockCallback(void (*func) (void));
int XineramaDeleteResource(void *, XID);
/* only exported for Nvidia legacy. This really shouldn't be used by drivers */
extern _X_EXPORT RESTYPE XRC_DRAWABLE; extern _X_EXPORT RESTYPE XRC_DRAWABLE;
extern _X_EXPORT RESTYPE XRT_WINDOW;
extern RESTYPE XRT_WINDOW; extern _X_EXPORT RESTYPE XRT_PIXMAP;
extern RESTYPE XRT_PIXMAP; extern _X_EXPORT RESTYPE XRT_GC;
extern RESTYPE XRT_GC; extern _X_EXPORT RESTYPE XRT_COLORMAP;
extern RESTYPE XRT_COLORMAP; extern _X_EXPORT RESTYPE XRT_PICTURE;
extern RESTYPE XRT_PICTURE;
/* /*
* Drivers are allowed to wrap this function. Each wrapper can decide that the * Drivers are allowed to wrap this function. Each wrapper can decide that the
@ -37,8 +38,9 @@ extern RESTYPE XRT_PICTURE;
* screen 0. * screen 0.
*/ */
typedef Bool (*XineramaVisualsEqualProcPtr) (VisualPtr, ScreenPtr, VisualPtr); typedef Bool (*XineramaVisualsEqualProcPtr) (VisualPtr, ScreenPtr, VisualPtr);
extern _X_EXPORT XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr;
void XineramaGetImageData(DrawablePtr *pDrawables, extern _X_EXPORT void XineramaGetImageData(DrawablePtr *pDrawables,
int left, int left,
int top, int top,
int width, int width,

View File

@ -36,12 +36,8 @@ in this Software without prior written authorization from the X Consortium.
#include "dix/colormap_priv.h" #include "dix/colormap_priv.h"
#include "dix/cursor_priv.h" #include "dix/cursor_priv.h"
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/window_priv.h"
#include "miext/extinit_priv.h"
#include "os/osdep.h" #include "os/osdep.h"
#include "os/screensaver.h" #include "os/screensaver.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
@ -53,13 +49,23 @@ in this Software without prior written authorization from the X Consortium.
#include "resource.h" #include "resource.h"
#include "gcstruct.h" #include "gcstruct.h"
#include "cursorstr.h" #include "cursorstr.h"
#include "colormapst.h"
#include "xace.h" #include "xace.h"
#include "inputstr.h" #include "inputstr.h"
#ifdef XINERAMA
#include "panoramiX.h"
#include "panoramiXsrv.h"
#endif /* XINERAMA */
#ifdef DPMSExtension #ifdef DPMSExtension
#include <X11/extensions/dpmsconst.h> #include <X11/extensions/dpmsconst.h>
#include "dpmsproc.h" #include "dpmsproc.h"
#endif #endif
#include "protocol-versions.h" #include "protocol-versions.h"
#include "extinit_priv.h"
// temporary workaround for win32/mingw32 name clash
// see: https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1355
#undef CreateWindow
Bool noScreenSaverExtension = FALSE; Bool noScreenSaverExtension = FALSE;
@ -470,7 +476,7 @@ CreateSaverWindow(ScreenPtr pScreen)
if (GrabInProgress && GrabInProgress != pAttr->client->index) if (GrabInProgress && GrabInProgress != pAttr->client->index)
return FALSE; return FALSE;
pWin = dixCreateWindow(pSaver->wid, pScreen->root, pWin = CreateWindow(pSaver->wid, pScreen->root,
pAttr->x, pAttr->y, pAttr->width, pAttr->height, pAttr->x, pAttr->y, pAttr->width, pAttr->height,
pAttr->borderWidth, pAttr->class, pAttr->borderWidth, pAttr->class,
pAttr->mask, (XID *) pAttr->values, pAttr->mask, (XID *) pAttr->values,
@ -495,11 +501,13 @@ CreateSaverWindow(ScreenPtr pScreen)
mask |= CWBorderPixmap; mask |= CWBorderPixmap;
} }
if (pAttr->pCursor) { if (pAttr->pCursor) {
CursorPtr cursor;
if (!pWin->optional)
if (!MakeWindowOptional(pWin)) { if (!MakeWindowOptional(pWin)) {
FreeResource(pWin->drawable.id, X11_RESTYPE_NONE); FreeResource(pWin->drawable.id, X11_RESTYPE_NONE);
return FALSE; return FALSE;
} }
CursorPtr cursor = RefCursor(pAttr->pCursor); cursor = RefCursor(pAttr->pCursor);
if (pWin->optional->cursor) if (pWin->optional->cursor)
FreeCursor(pWin->optional->cursor, (Cursor) 0); FreeCursor(pWin->optional->cursor, (Cursor) 0);
pWin->optional->cursor = cursor; pWin->optional->cursor = cursor;
@ -749,7 +757,7 @@ ScreenSaverSetAttributes(ClientPtr client, xScreenSaverSetAttributesReq *stuff)
depth = stuff->depth; depth = stuff->depth;
visual = stuff->visualID; visual = stuff->visualID;
/* copied directly from dixCreateWindow */ /* copied directly from CreateWindow */
if (class == CopyFromParent) if (class == CopyFromParent)
class = pParent->drawable.class; class = pParent->drawable.class;
@ -802,7 +810,7 @@ ScreenSaverSetAttributes(ClientPtr client, xScreenSaverSetAttributesReq *stuff)
return BadMatch; return BadMatch;
} }
/* end of errors from dixCreateWindow */ /* end of errors from CreateWindow */
pPriv = GetScreenPrivate(pScreen); pPriv = GetScreenPrivate(pScreen);
if (pPriv && pPriv->attr) { if (pPriv && pPriv->attr) {
@ -820,7 +828,7 @@ ScreenSaverSetAttributes(ClientPtr client, xScreenSaverSetAttributesReq *stuff)
goto bail; goto bail;
} }
/* over allocate for override redirect */ /* over allocate for override redirect */
pAttr->values = values = calloc(len + 1, sizeof(unsigned long)); pAttr->values = values = xallocarray(len + 1, sizeof(unsigned long));
if (!values) { if (!values) {
ret = BadAlloc; ret = BadAlloc;
goto bail; goto bail;
@ -1209,7 +1217,7 @@ ProcScreenSaverSuspend(ClientPtr client)
* to the record, so the screensaver will be re-enabled and the record freed * to the record, so the screensaver will be re-enabled and the record freed
* if the client disconnects without reenabling it first. * if the client disconnects without reenabling it first.
*/ */
this = calloc(1, sizeof(ScreenSaverSuspensionRec)); this = malloc(sizeof(ScreenSaverSuspensionRec));
if (!this) if (!this)
return BadAlloc; return BadAlloc;

View File

@ -32,8 +32,7 @@ in this Software without prior written authorization from The Open Group.
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/registry_priv.h" #include "dix/registry_priv.h"
#include "dix/resource_priv.h" #include "include/extinit_priv.h"
#include "miext/extinit_priv.h"
#include "os/audit.h" #include "os/audit.h"
#include "os/auth.h" #include "os/auth.h"
#include "os/client_priv.h" #include "os/client_priv.h"
@ -43,9 +42,11 @@ in this Software without prior written authorization from The Open Group.
#include "inputstr.h" #include "inputstr.h"
#include "windowstr.h" #include "windowstr.h"
#include "propertyst.h" #include "propertyst.h"
#include "colormapst.h"
#include "privates.h" #include "privates.h"
#include "xacestr.h" #include "xacestr.h"
#include "securitysrv.h" #include "securitysrv.h"
#include "extinit.h"
#include "protocol-versions.h" #include "protocol-versions.h"
Bool noSecurityExtension = FALSE; Bool noSecurityExtension = FALSE;
@ -206,7 +207,7 @@ SecurityDeleteAuthorization(void *value, XID id)
.type = SecurityEventBase + XSecurityAuthorizationRevoked, .type = SecurityEventBase + XSecurityAuthorizationRevoked,
.authId = pAuth->id .authId = pAuth->id
}; };
WriteEventsToClient(dixClientForOtherClients(pEventClient), 1, (xEvent *) &are); WriteEventsToClient(rClient(pEventClient), 1, (xEvent *) &are);
FreeResource(pEventClient->resource, X11_RESTYPE_NONE); FreeResource(pEventClient->resource, X11_RESTYPE_NONE);
} }
@ -384,7 +385,7 @@ SecurityEventSelectForAuthorization(SecurityAuthorizationPtr pAuth,
} }
} }
pEventClient = calloc(1, sizeof(OtherClients)); pEventClient = malloc(sizeof(OtherClients));
if (!pEventClient) if (!pEventClient)
return BadAlloc; return BadAlloc;
pEventClient->mask = mask; pEventClient->mask = mask;
@ -405,6 +406,7 @@ ProcSecurityGenerateAuthorization(ClientPtr client)
REQUEST(xSecurityGenerateAuthorizationReq); REQUEST(xSecurityGenerateAuthorizationReq);
int len; /* request length in CARD32s */ int len; /* request length in CARD32s */
Bool removeAuth = FALSE; /* if bailout, call RemoveAuthorization? */ Bool removeAuth = FALSE; /* if bailout, call RemoveAuthorization? */
SecurityAuthorizationPtr pAuth = NULL; /* auth we are creating */
int err; /* error to return from this function */ int err; /* error to return from this function */
XID authId; /* authorization ID assigned by os layer */ XID authId; /* authorization ID assigned by os layer */
xSecurityGenerateAuthorizationReply rep; /* reply struct */ xSecurityGenerateAuthorizationReply rep; /* reply struct */
@ -490,8 +492,9 @@ ProcSecurityGenerateAuthorization(ClientPtr client)
authId = GenerateAuthorization(stuff->nbytesAuthProto, protoname, authId = GenerateAuthorization(stuff->nbytesAuthProto, protoname,
stuff->nbytesAuthData, protodata, stuff->nbytesAuthData, protodata,
&authdata_len, &pAuthdata); &authdata_len, &pAuthdata);
if (!authId) { if ((XID) ~0L == authId) {
return SecurityErrorBase + XSecurityBadAuthorizationProtocol; err = SecurityErrorBase + XSecurityBadAuthorizationProtocol;
goto bailout;
} }
/* now that we've added the auth, remember to remove it if we have to /* now that we've added the auth, remember to remove it if we have to
@ -501,7 +504,7 @@ ProcSecurityGenerateAuthorization(ClientPtr client)
/* associate additional information with this auth ID */ /* associate additional information with this auth ID */
SecurityAuthorizationPtr pAuth = calloc(1, sizeof(SecurityAuthorizationRec)); pAuth = malloc(sizeof(SecurityAuthorizationRec));
if (!pAuth) { if (!pAuth) {
err = BadAlloc; err = BadAlloc;
goto bailout; goto bailout;
@ -741,6 +744,7 @@ SecurityResource(CallbackListPtr *pcbl, void *unused, void *calldata)
{ {
XaceResourceAccessRec *rec = calldata; XaceResourceAccessRec *rec = calldata;
SecurityStateRec *subj, *obj; SecurityStateRec *subj, *obj;
int cid = CLIENT_ID(rec->id);
Mask requested = rec->access_mode; Mask requested = rec->access_mode;
Mask allowed = SecurityResourceMask; Mask allowed = SecurityResourceMask;
@ -755,12 +759,8 @@ SecurityResource(CallbackListPtr *pcbl, void *unused, void *calldata)
if (rec->rtype == X11_RESTYPE_WINDOW) if (rec->rtype == X11_RESTYPE_WINDOW)
allowed |= SecurityWindowExtraMask; allowed |= SecurityWindowExtraMask;
ClientPtr owner = dixClientForXID(rec->id);
if (!owner)
goto denied;
/* special checks for server-owned resources */ /* special checks for server-owned resources */
if (dixResouceIsServerOwned(rec->id)) { if (cid == 0) {
if (rec->rtype & RC_DRAWABLE) if (rec->rtype & RC_DRAWABLE)
/* additional operations allowed on root windows */ /* additional operations allowed on root windows */
allowed |= SecurityRootWindowExtraMask; allowed |= SecurityRootWindowExtraMask;
@ -774,15 +774,15 @@ SecurityResource(CallbackListPtr *pcbl, void *unused, void *calldata)
allowed |= DixReadAccess; allowed |= DixReadAccess;
} }
obj = dixLookupPrivate(&owner->devPrivates, stateKey); if (clients[cid] != NULL) {
obj = dixLookupPrivate(&clients[cid]->devPrivates, stateKey);
if (SecurityDoCheck(subj, obj, requested, allowed) == Success) if (SecurityDoCheck(subj, obj, requested, allowed) == Success)
return; return;
}
denied:
SecurityAudit("Security: denied client %d access %lx to resource 0x%lx " SecurityAudit("Security: denied client %d access %lx to resource 0x%lx "
"of client %d on request %s\n", rec->client->index, "of client %d on request %s\n", rec->client->index,
(unsigned long)requested, (unsigned long)rec->id, (unsigned long)requested, (unsigned long)rec->id, cid,
dixClientIdForXID(rec->id),
SecurityLookupRequestName(rec->client)); SecurityLookupRequestName(rec->client));
rec->status = BadAccess; /* deny access */ rec->status = BadAccess; /* deny access */
} }
@ -858,13 +858,13 @@ SecurityProperty(CallbackListPtr *pcbl, void *unused, void *calldata)
Mask allowed = SecurityResourceMask | DixReadAccess; Mask allowed = SecurityResourceMask | DixReadAccess;
subj = dixLookupPrivate(&rec->client->devPrivates, stateKey); subj = dixLookupPrivate(&rec->client->devPrivates, stateKey);
obj = dixLookupPrivate(&dixClientForWindow(rec->pWin)->devPrivates, stateKey); obj = dixLookupPrivate(&wClient(rec->pWin)->devPrivates, stateKey);
if (SecurityDoCheck(subj, obj, requested, allowed) != Success) { if (SecurityDoCheck(subj, obj, requested, allowed) != Success) {
SecurityAudit("Security: denied client %d access to property %s " SecurityAudit("Security: denied client %d access to property %s "
"(atom 0x%x) window 0x%lx of client %d on request %s\n", "(atom 0x%x) window 0x%lx of client %d on request %s\n",
rec->client->index, NameForAtom(name), name, rec->client->index, NameForAtom(name), name,
(unsigned long)rec->pWin->drawable.id, dixClientForWindow(rec->pWin)->index, (unsigned long)rec->pWin->drawable.id, wClient(rec->pWin)->index,
SecurityLookupRequestName(rec->client)); SecurityLookupRequestName(rec->client));
rec->status = BadAccess; rec->status = BadAccess;
} }
@ -880,7 +880,7 @@ SecuritySend(CallbackListPtr *pcbl, void *unused, void *calldata)
int i; int i;
subj = dixLookupPrivate(&rec->client->devPrivates, stateKey); subj = dixLookupPrivate(&rec->client->devPrivates, stateKey);
obj = dixLookupPrivate(&dixClientForWindow(rec->pWin)->devPrivates, stateKey); obj = dixLookupPrivate(&wClient(rec->pWin)->devPrivates, stateKey);
if (SecurityDoCheck(subj, obj, DixSendAccess, 0) == Success) if (SecurityDoCheck(subj, obj, DixSendAccess, 0) == Success)
return; return;
@ -895,7 +895,7 @@ SecuritySend(CallbackListPtr *pcbl, void *unused, void *calldata)
rec->client->index, rec->client->index,
LookupEventName(rec->events[i].u.u.type), LookupEventName(rec->events[i].u.u.type),
(unsigned long)rec->pWin->drawable.id, (unsigned long)rec->pWin->drawable.id,
dixClientForWindow(rec->pWin)->index); wClient(rec->pWin)->index);
rec->status = BadAccess; rec->status = BadAccess;
return; return;
} }
@ -909,7 +909,7 @@ SecurityReceive(CallbackListPtr *pcbl, void *unused, void *calldata)
SecurityStateRec *subj, *obj; SecurityStateRec *subj, *obj;
subj = dixLookupPrivate(&rec->client->devPrivates, stateKey); subj = dixLookupPrivate(&rec->client->devPrivates, stateKey);
obj = dixLookupPrivate(&dixClientForWindow(rec->pWin)->devPrivates, stateKey); obj = dixLookupPrivate(&wClient(rec->pWin)->devPrivates, stateKey);
if (SecurityDoCheck(subj, obj, DixReceiveAccess, 0) == Success) if (SecurityDoCheck(subj, obj, DixReceiveAccess, 0) == Success)
return; return;
@ -917,7 +917,7 @@ SecurityReceive(CallbackListPtr *pcbl, void *unused, void *calldata)
SecurityAudit("Security: denied client %d from receiving an event " SecurityAudit("Security: denied client %d from receiving an event "
"sent to window 0x%lx of client %d\n", "sent to window 0x%lx of client %d\n",
rec->client->index, (unsigned long)rec->pWin->drawable.id, rec->client->index, (unsigned long)rec->pWin->drawable.id,
dixClientForWindow(rec->pWin)->index); wClient(rec->pWin)->index);
rec->status = BadAccess; rec->status = BadAccess;
} }

View File

@ -33,6 +33,7 @@ from The Open Group.
#include <X11/extensions/secur.h> #include <X11/extensions/secur.h>
#include "input.h" /* for DeviceIntPtr */ #include "input.h" /* for DeviceIntPtr */
#include "property.h" /* for PropertyPtr */
#include "pixmap.h" /* for DrawablePtr */ #include "pixmap.h" /* for DrawablePtr */
#include "resource.h" /* for RESTYPE */ #include "resource.h" /* for RESTYPE */

View File

@ -33,10 +33,6 @@ in this Software without prior written authorization from The Open Group.
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/gc_priv.h" #include "dix/gc_priv.h"
#include "dix/window_priv.h"
#include "miext/extinit_priv.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
@ -49,6 +45,7 @@ in this Software without prior written authorization from The Open Group.
#include "opaque.h" #include "opaque.h"
#include "regionstr.h" #include "regionstr.h"
#include "gcstruct.h" #include "gcstruct.h"
#include "extinit_priv.h"
#include "protocol-versions.h" #include "protocol-versions.h"
Bool noShapeExtension = FALSE; Bool noShapeExtension = FALSE;
@ -70,6 +67,11 @@ static void SShapeNotifyEvent(xShapeNotifyEvent * /* from */ ,
* externally by the Xfixes extension and are now defined in window.h * externally by the Xfixes extension and are now defined in window.h
*/ */
#ifdef XINERAMA
#include "panoramiX.h"
#include "panoramiXsrv.h"
#endif /* XINERAMA */
static int ShapeEventBase = 0; static int ShapeEventBase = 0;
static RESTYPE ClientType, ShapeEventType; /* resource types for event masks */ static RESTYPE ClientType, ShapeEventType; /* resource types for event masks */
@ -268,9 +270,8 @@ ShapeRectangles(ClientPtr client, xShapeRectanglesReq *stuff)
return BadMatch; return BadMatch;
srcRgn = RegionFromRects(nrects, prects, ctype); srcRgn = RegionFromRects(nrects, prects, ctype);
if (!MakeWindowOptional(pWin)) if (!pWin->optional)
return BadAlloc; MakeWindowOptional(pWin);
switch (stuff->destKind) { switch (stuff->destKind) {
case ShapeBounding: case ShapeBounding:
destRgn = &pWin->optional->boundingShape; destRgn = &pWin->optional->boundingShape;
@ -308,7 +309,7 @@ ProcShapeRectangles(ClientPtr client)
if (result != Success) if (result != Success)
return result; return result;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
stuff->dest = win->info[j].id; stuff->dest = win->info[j].id;
result = ShapeRectangles(client, stuff); result = ShapeRectangles(client, stuff);
if (result != Success) if (result != Success)
@ -365,9 +366,8 @@ ShapeMask(ClientPtr client, xShapeMaskReq *stuff)
return BadAlloc; return BadAlloc;
} }
if (!MakeWindowOptional(pWin)) if (!pWin->optional)
return BadAlloc; MakeWindowOptional(pWin);
switch (stuff->destKind) { switch (stuff->destKind) {
case ShapeBounding: case ShapeBounding:
destRgn = &pWin->optional->boundingShape; destRgn = &pWin->optional->boundingShape;
@ -414,7 +414,7 @@ ProcShapeMask(ClientPtr client)
else else
pmap = NULL; pmap = NULL;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
stuff->dest = win->info[j].id; stuff->dest = win->info[j].id;
if (pmap) if (pmap)
stuff->src = pmap->info[j].id; stuff->src = pmap->info[j].id;
@ -443,9 +443,8 @@ ShapeCombine(ClientPtr client, xShapeCombineReq *stuff)
rc = dixLookupWindow(&pDestWin, stuff->dest, client, DixSetAttrAccess); rc = dixLookupWindow(&pDestWin, stuff->dest, client, DixSetAttrAccess);
if (rc != Success) if (rc != Success)
return rc; return rc;
if (!MakeWindowOptional(pDestWin)) if (!pDestWin->optional)
return BadAlloc; MakeWindowOptional(pDestWin);
switch (stuff->destKind) { switch (stuff->destKind) {
case ShapeBounding: case ShapeBounding:
createDefault = CreateBoundingShape; createDefault = CreateBoundingShape;
@ -493,9 +492,8 @@ ShapeCombine(ClientPtr client, xShapeCombineReq *stuff)
else else
srcRgn = (*createSrc) (pSrcWin); srcRgn = (*createSrc) (pSrcWin);
if (!MakeWindowOptional(pDestWin)) if (!pDestWin->optional)
return BadAlloc; MakeWindowOptional(pDestWin);
switch (stuff->destKind) { switch (stuff->destKind) {
case ShapeBounding: case ShapeBounding:
destRgn = &pDestWin->optional->boundingShape; destRgn = &pDestWin->optional->boundingShape;
@ -538,7 +536,7 @@ ProcShapeCombine(ClientPtr client)
if (result != Success) if (result != Success)
return result; return result;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
stuff->dest = win->info[j].id; stuff->dest = win->info[j].id;
stuff->src = win2->info[j].id; stuff->src = win2->info[j].id;
result = ShapeCombine(client, stuff); result = ShapeCombine(client, stuff);
@ -602,7 +600,7 @@ ProcShapeOffset(ClientPtr client)
if (result != Success) if (result != Success)
return result; return result;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
stuff->dest = win->info[j].id; stuff->dest = win->info[j].id;
result = ShapeOffset(client, stuff); result = ShapeOffset(client, stuff);
if (result != Success) if (result != Success)
@ -754,7 +752,7 @@ ProcShapeSelectInput(ClientPtr client)
} }
/* build the entry */ /* build the entry */
pNewShapeEvent = calloc(1, sizeof(ShapeEventRec)); pNewShapeEvent = malloc(sizeof(ShapeEventRec));
if (!pNewShapeEvent) if (!pNewShapeEvent)
return BadAlloc; return BadAlloc;
pNewShapeEvent->next = 0; pNewShapeEvent->next = 0;
@ -775,7 +773,7 @@ ProcShapeSelectInput(ClientPtr client)
* done through the resource database. * done through the resource database.
*/ */
if (!pHead) { if (!pHead) {
pHead = calloc(1, sizeof(ShapeEventPtr)); pHead = malloc(sizeof(ShapeEventPtr));
if (!pHead || if (!pHead ||
!AddResource(pWin->drawable.id, ShapeEventType, !AddResource(pWin->drawable.id, ShapeEventType,
(void *) pHead)) { (void *) pHead)) {
@ -940,7 +938,7 @@ ProcShapeGetRectangles(ClientPtr client)
REQUEST(xShapeGetRectanglesReq); REQUEST(xShapeGetRectanglesReq);
WindowPtr pWin; WindowPtr pWin;
xShapeGetRectanglesReply rep; xShapeGetRectanglesReply rep;
xRectangle *rects = NULL; xRectangle *rects;
int nrects, i, rc; int nrects, i, rc;
RegionPtr region; RegionPtr region;
@ -964,7 +962,7 @@ ProcShapeGetRectangles(ClientPtr client)
} }
if (!region) { if (!region) {
nrects = 1; nrects = 1;
rects = calloc(1, sizeof(xRectangle)); rects = malloc(sizeof(xRectangle));
if (!rects) if (!rects)
return BadAlloc; return BadAlloc;
switch (stuff->kind) { switch (stuff->kind) {
@ -993,9 +991,8 @@ ProcShapeGetRectangles(ClientPtr client)
nrects = RegionNumRects(region); nrects = RegionNumRects(region);
box = RegionRects(region); box = RegionRects(region);
if (nrects) { rects = xallocarray(nrects, sizeof(xRectangle));
rects = calloc(nrects, sizeof(xRectangle)); if (!rects && nrects)
if (!rects)
return BadAlloc; return BadAlloc;
for (i = 0; i < nrects; i++, box++) { for (i = 0; i < nrects; i++, box++) {
rects[i].x = box->x1; rects[i].x = box->x1;
@ -1004,7 +1001,6 @@ ProcShapeGetRectangles(ClientPtr client)
rects[i].height = box->y2 - box->y1; rects[i].height = box->y2 - box->y1;
} }
} }
}
rep = (xShapeGetRectanglesReply) { rep = (xShapeGetRectanglesReply) {
.type = X_Reply, .type = X_Reply,
.ordering = YXBanded, .ordering = YXBanded,

View File

@ -43,15 +43,10 @@ in this Software without prior written authorization from The Open Group.
#include <X11/Xfuncproto.h> #include <X11/Xfuncproto.h>
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/screen_hooks_priv.h"
#include "miext/extinit_priv.h"
#include "os/auth.h" #include "os/auth.h"
#include "os/busfault.h" #include "os/busfault.h"
#include "os/client_priv.h" #include "os/client_priv.h"
#include "os/log_priv.h"
#include "os/osdep.h" #include "os/osdep.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
@ -65,6 +60,7 @@ in this Software without prior written authorization from The Open Group.
#include "servermd.h" #include "servermd.h"
#include "shmint.h" #include "shmint.h"
#include "xace.h" #include "xace.h"
#include "extinit_priv.h"
#include "protocol-versions.h" #include "protocol-versions.h"
/* Needed for Solaris cross-zone shared memory extension */ /* Needed for Solaris cross-zone shared memory extension */
@ -94,9 +90,15 @@ in this Software without prior written authorization from The Open Group.
#define SHMPERM_MODE(p) p->mode #define SHMPERM_MODE(p) p->mode
#endif #endif
#ifdef XINERAMA
#include "panoramiX.h"
#include "panoramiXsrv.h"
#endif /* XINERAMA */
typedef struct _ShmScrPrivateRec { typedef struct _ShmScrPrivateRec {
CloseScreenProcPtr CloseScreen;
ShmFuncsPtr shmFuncs; ShmFuncsPtr shmFuncs;
DestroyPixmapProcPtr destroyPixmap;
} ShmScrPrivateRec; } ShmScrPrivateRec;
Bool noMITShmExtension = FALSE; Bool noMITShmExtension = FALSE;
@ -107,7 +109,7 @@ static void ShmResetProc(ExtensionEntry *extEntry);
static void SShmCompletionEvent(xShmCompletionEvent *from, static void SShmCompletionEvent(xShmCompletionEvent *from,
xShmCompletionEvent *to); xShmCompletionEvent *to);
static int ShmCreatePixmap(ClientPtr client, xShmCreatePixmapReq *stuff); static Bool ShmDestroyPixmap(PixmapPtr pPixmap);
static unsigned char ShmReqCode; static unsigned char ShmReqCode;
int ShmCompletionCode; int ShmCompletionCode;
@ -155,7 +157,7 @@ static ShmFuncs fbFuncs = { fbShmCreatePixmap, NULL };
} \ } \
} }
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) || defined(__DragonFly__)
static Bool badSysCall = FALSE; static Bool badSysCall = FALSE;
@ -193,13 +195,15 @@ CheckForShmSyscall(void)
#endif #endif
static void static Bool
ShmScreenClose(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused) ShmCloseScreen(ScreenPtr pScreen)
{ {
ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen); ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
pScreen->CloseScreen = screen_priv->CloseScreen;
dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, NULL); dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, NULL);
free(screen_priv); free(screen_priv);
return (*pScreen->CloseScreen) (pScreen);
} }
static ShmScrPrivateRec * static ShmScrPrivateRec *
@ -209,8 +213,9 @@ ShmInitScreenPriv(ScreenPtr pScreen)
if (!screen_priv) { if (!screen_priv) {
screen_priv = calloc(1, sizeof(ShmScrPrivateRec)); screen_priv = calloc(1, sizeof(ShmScrPrivateRec));
screen_priv->CloseScreen = pScreen->CloseScreen;
dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, screen_priv); dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, screen_priv);
dixScreenHookClose(pScreen, ShmScreenClose); pScreen->CloseScreen = ShmCloseScreen;
} }
return screen_priv; return screen_priv;
} }
@ -242,6 +247,28 @@ ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs)
ShmInitScreenPriv(pScreen)->shmFuncs = funcs; ShmInitScreenPriv(pScreen)->shmFuncs = funcs;
} }
static Bool
ShmDestroyPixmap(PixmapPtr pPixmap)
{
ScreenPtr pScreen = pPixmap->drawable.pScreen;
ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
void *shmdesc = NULL;
Bool ret = TRUE;
if (pPixmap->refcnt == 1)
shmdesc = dixLookupPrivate(&pPixmap->devPrivates, shmPixmapPrivateKey);
pScreen->DestroyPixmap = screen_priv->destroyPixmap;
if (pScreen->DestroyPixmap)
ret = pScreen->DestroyPixmap(pPixmap);
screen_priv->destroyPixmap = pScreen->DestroyPixmap;
pScreen->DestroyPixmap = ShmDestroyPixmap;
if (shmdesc)
ShmDetachSegment(shmdesc, 0);
return ret;
}
void void
ShmRegisterFbFuncs(ScreenPtr pScreen) ShmRegisterFbFuncs(ScreenPtr pScreen)
@ -347,15 +374,12 @@ shm_access(ClientPtr client, SHMPERM_TYPE * perm, int readonly)
static int static int
ProcShmAttach(ClientPtr client) ProcShmAttach(ClientPtr client)
{ {
REQUEST(xShmAttachReq);
REQUEST_SIZE_MATCH(xShmAttachReq);
if (!client->local)
return BadRequest;
SHMSTAT_TYPE buf; SHMSTAT_TYPE buf;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
REQUEST(xShmAttachReq);
REQUEST_SIZE_MATCH(xShmAttachReq);
LEGAL_NEW_RESOURCE(stuff->shmseg, client); LEGAL_NEW_RESOURCE(stuff->shmseg, client);
if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse)) { if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse)) {
client->errorValue = stuff->readOnly; client->errorValue = stuff->readOnly;
@ -371,7 +395,7 @@ ProcShmAttach(ClientPtr client)
shmdesc->refcnt++; shmdesc->refcnt++;
} }
else { else {
shmdesc = calloc(1, sizeof(ShmDescRec)); shmdesc = malloc(sizeof(ShmDescRec));
if (!shmdesc) if (!shmdesc)
return BadAlloc; return BadAlloc;
#ifdef SHM_FD_PASSING #ifdef SHM_FD_PASSING
@ -413,9 +437,6 @@ ShmDetachSegment(void *value, /* must conform to DeleteType */
ShmDescPtr shmdesc = (ShmDescPtr) value; ShmDescPtr shmdesc = (ShmDescPtr) value;
ShmDescPtr *prev; ShmDescPtr *prev;
if (!shmdesc)
return Success;
if (--shmdesc->refcnt) if (--shmdesc->refcnt)
return TRUE; return TRUE;
#if SHM_FD_PASSING #if SHM_FD_PASSING
@ -435,14 +456,11 @@ ShmDetachSegment(void *value, /* must conform to DeleteType */
static int static int
ProcShmDetach(ClientPtr client) ProcShmDetach(ClientPtr client)
{ {
REQUEST(xShmDetachReq);
REQUEST_SIZE_MATCH(xShmDetachReq);
if (!client->local)
return BadRequest;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
REQUEST(xShmDetachReq);
REQUEST_SIZE_MATCH(xShmDetachReq);
VERIFY_SHMSEG(stuff->shmseg, shmdesc, client); VERIFY_SHMSEG(stuff->shmseg, shmdesc, client);
FreeResource(stuff->shmseg, X11_RESTYPE_NONE); FreeResource(stuff->shmseg, X11_RESTYPE_NONE);
return Success; return Success;
@ -499,13 +517,16 @@ doShmPutImage(DrawablePtr dst, GCPtr pGC,
} }
static int static int
ShmPutImage(ClientPtr client, xShmPutImageReq *stuff) ProcShmPutImage(ClientPtr client)
{ {
GCPtr pGC; GCPtr pGC;
DrawablePtr pDraw; DrawablePtr pDraw;
long length; long length;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
REQUEST(xShmPutImageReq);
REQUEST_SIZE_MATCH(xShmPutImageReq);
VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess); VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
VERIFY_SHMPTR(stuff->shmseg, stuff->offset, FALSE, shmdesc, client); VERIFY_SHMPTR(stuff->shmseg, stuff->offset, FALSE, shmdesc, client);
if ((stuff->sendEvent != xTrue) && (stuff->sendEvent != xFalse)) if ((stuff->sendEvent != xTrue) && (stuff->sendEvent != xFalse))
@ -595,7 +616,7 @@ ShmPutImage(ClientPtr client, xShmPutImageReq *stuff)
} }
static int static int
ShmGetImage(ClientPtr client, xShmGetImageReq *stuff) ProcShmGetImage(ClientPtr client)
{ {
DrawablePtr pDraw; DrawablePtr pDraw;
long lenPer = 0, length; long lenPer = 0, length;
@ -606,6 +627,9 @@ ShmGetImage(ClientPtr client, xShmGetImageReq *stuff)
RegionPtr pVisibleRegion = NULL; RegionPtr pVisibleRegion = NULL;
int rc; int rc;
REQUEST(xShmGetImageReq);
REQUEST_SIZE_MATCH(xShmGetImageReq);
if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) { if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
client->errorValue = stuff->format; client->errorValue = stuff->format;
return BadValue; return BadValue;
@ -710,22 +734,16 @@ ShmGetImage(ClientPtr client, xShmGetImageReq *stuff)
return Success; return Success;
} }
static int
ProcShmPutImage(ClientPtr client)
{
REQUEST(xShmPutImageReq);
REQUEST_SIZE_MATCH(xShmPutImageReq);
if (!client->local)
return BadRequest;
#ifdef XINERAMA #ifdef XINERAMA
static int
ProcPanoramiXShmPutImage(ClientPtr client)
{
int j, result, orig_x, orig_y; int j, result, orig_x, orig_y;
PanoramiXRes *draw, *gc; PanoramiXRes *draw, *gc;
Bool sendEvent, isRoot; Bool sendEvent, isRoot;
if (noPanoramiXExtension) REQUEST(xShmPutImageReq);
return ShmPutImage(client, stuff); REQUEST_SIZE_MATCH(xShmPutImageReq);
result = dixLookupResourceByClass((void **) &draw, stuff->drawable, result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess); XRC_DRAWABLE, client, DixWriteAccess);
@ -743,7 +761,7 @@ ProcShmPutImage(ClientPtr client)
orig_y = stuff->dstY; orig_y = stuff->dstY;
sendEvent = stuff->sendEvent; sendEvent = stuff->sendEvent;
stuff->sendEvent = 0; stuff->sendEvent = 0;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
if (!j) if (!j)
stuff->sendEvent = sendEvent; stuff->sendEvent = sendEvent;
stuff->drawable = draw->info[j].id; stuff->drawable = draw->info[j].id;
@ -752,27 +770,18 @@ ProcShmPutImage(ClientPtr client)
stuff->dstX = orig_x - screenInfo.screens[j]->x; stuff->dstX = orig_x - screenInfo.screens[j]->x;
stuff->dstY = orig_y - screenInfo.screens[j]->y; stuff->dstY = orig_y - screenInfo.screens[j]->y;
} }
result = ShmPutImage(client, stuff); result = ProcShmPutImage(client);
if (result != Success) if (result != Success)
break; break;
} }
return result; return result;
#else
return ShmPutImage(client, stuff);
#endif /* XINERAMA */
} }
static int static int
ProcShmGetImage(ClientPtr client) ProcPanoramiXShmGetImage(ClientPtr client)
{ {
REQUEST(xShmGetImageReq);
REQUEST_SIZE_MATCH(xShmGetImageReq);
if (!client->local)
return BadRequest;
#ifdef XINERAMA
PanoramiXRes *draw; PanoramiXRes *draw;
DrawablePtr *drawables;
DrawablePtr pDraw; DrawablePtr pDraw;
xShmGetImageReply xgi; xShmGetImageReply xgi;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
@ -781,8 +790,9 @@ ProcShmGetImage(ClientPtr client)
long lenPer = 0, length, widthBytesLine; long lenPer = 0, length, widthBytesLine;
Bool isRoot; Bool isRoot;
if (noPanoramiXExtension) REQUEST(xShmGetImageReq);
return ShmGetImage(client, stuff);
REQUEST_SIZE_MATCH(xShmGetImageReq);
if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) { if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
client->errorValue = stuff->format; client->errorValue = stuff->format;
@ -795,7 +805,7 @@ ProcShmGetImage(ClientPtr client)
return (rc == BadValue) ? BadDrawable : rc; return (rc == BadValue) ? BadDrawable : rc;
if (draw->type == XRT_PIXMAP) if (draw->type == XRT_PIXMAP)
return ShmGetImage(client, stuff); return ProcShmGetImage(client);
rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReadAccess); rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReadAccess);
if (rc != Success) if (rc != Success)
@ -846,7 +856,7 @@ ProcShmGetImage(ClientPtr client)
VERIFY_SHMSIZE(shmdesc, stuff->offset, length, client); VERIFY_SHMSIZE(shmdesc, stuff->offset, length, client);
DrawablePtr *drawables = calloc(PanoramiXNumScreens, sizeof(DrawablePtr)); drawables = calloc(PanoramiXNumScreens, sizeof(DrawablePtr));
if (!drawables) if (!drawables)
return BadAlloc; return BadAlloc;
@ -906,34 +916,24 @@ ProcShmGetImage(ClientPtr client)
WriteToClient(client, sizeof(xShmGetImageReply), &xgi); WriteToClient(client, sizeof(xShmGetImageReply), &xgi);
return Success; return Success;
#else
return ShmGetImage(client, stuff);
#endif /* XINERAMA */
} }
static int static int
ProcShmCreatePixmap(ClientPtr client) ProcPanoramiXShmCreatePixmap(ClientPtr client)
{ {
REQUEST(xShmCreatePixmapReq);
REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
if (!client->local)
return BadRequest;
#ifdef XINERAMA
if (noPanoramiXExtension)
return ShmCreatePixmap(client, stuff);
ScreenPtr pScreen = NULL; ScreenPtr pScreen = NULL;
PixmapPtr pMap = NULL; PixmapPtr pMap = NULL;
DrawablePtr pDraw; DrawablePtr pDraw;
DepthPtr pDepth; DepthPtr pDepth;
int i, j, result, rc; int i, j, result, rc;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
REQUEST(xShmCreatePixmapReq);
unsigned int width, height, depth; unsigned int width, height, depth;
unsigned long size; unsigned long size;
PanoramiXRes *newPix; PanoramiXRes *newPix;
REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
client->errorValue = stuff->pid; client->errorValue = stuff->pid;
if (!sharedPixmaps) if (!sharedPixmaps)
return BadImplementation; return BadImplementation;
@ -976,7 +976,7 @@ ProcShmCreatePixmap(ClientPtr client)
VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client); VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client);
if (!(newPix = calloc(1, sizeof(PanoramiXRes)))) if (!(newPix = malloc(sizeof(PanoramiXRes))))
return BadAlloc; return BadAlloc;
newPix->type = XRT_PIXMAP; newPix->type = XRT_PIXMAP;
@ -985,7 +985,7 @@ ProcShmCreatePixmap(ClientPtr client)
result = Success; result = Success;
FOR_NSCREENS_BACKWARD(j) { FOR_NSCREENS(j) {
ShmScrPrivateRec *screen_priv; ShmScrPrivateRec *screen_priv;
pScreen = screenInfo.screens[j]; pScreen = screenInfo.screens[j];
@ -1029,10 +1029,8 @@ ProcShmCreatePixmap(ClientPtr client)
AddResource(stuff->pid, XRT_PIXMAP, newPix); AddResource(stuff->pid, XRT_PIXMAP, newPix);
return result; return result;
#else
return ShmCreatePixmap(client, stuff);
#endif /* XINERAMA */
} }
#endif /* XINERAMA */
static PixmapPtr static PixmapPtr
fbShmCreatePixmap(ScreenPtr pScreen, fbShmCreatePixmap(ScreenPtr pScreen,
@ -1055,7 +1053,7 @@ fbShmCreatePixmap(ScreenPtr pScreen,
} }
static int static int
ShmCreatePixmap(ClientPtr client, xShmCreatePixmapReq *stuff) ProcShmCreatePixmap(ClientPtr client)
{ {
PixmapPtr pMap; PixmapPtr pMap;
DrawablePtr pDraw; DrawablePtr pDraw;
@ -1063,9 +1061,12 @@ ShmCreatePixmap(ClientPtr client, xShmCreatePixmapReq *stuff)
int i, rc; int i, rc;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
ShmScrPrivateRec *screen_priv; ShmScrPrivateRec *screen_priv;
REQUEST(xShmCreatePixmapReq);
unsigned int width, height, depth; unsigned int width, height, depth;
unsigned long size; unsigned long size;
REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
client->errorValue = stuff->pid; client->errorValue = stuff->pid;
if (!sharedPixmaps) if (!sharedPixmaps)
return BadImplementation; return BadImplementation;
@ -1147,17 +1148,13 @@ ShmBusfaultNotify(void *context)
static int static int
ProcShmAttachFd(ClientPtr client) ProcShmAttachFd(ClientPtr client)
{ {
REQUEST(xShmAttachFdReq);
REQUEST_SIZE_MATCH(xShmAttachFdReq);
if (!client->local)
return BadRequest;
int fd; int fd;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
REQUEST(xShmAttachFdReq);
struct stat statb; struct stat statb;
SetReqFds(client, 1); SetReqFds(client, 1);
REQUEST_SIZE_MATCH(xShmAttachFdReq);
LEGAL_NEW_RESOURCE(stuff->shmseg, client); LEGAL_NEW_RESOURCE(stuff->shmseg, client);
if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse)) { if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse)) {
client->errorValue = stuff->readOnly; client->errorValue = stuff->readOnly;
@ -1172,7 +1169,7 @@ ProcShmAttachFd(ClientPtr client)
return BadMatch; return BadMatch;
} }
shmdesc = calloc(1, sizeof(ShmDescRec)); shmdesc = malloc(sizeof(ShmDescRec));
if (!shmdesc) { if (!shmdesc) {
close(fd); close(fd);
return BadAlloc; return BadAlloc;
@ -1266,14 +1263,9 @@ shm_tmpfile(void)
static int static int
ProcShmCreateSegment(ClientPtr client) ProcShmCreateSegment(ClientPtr client)
{ {
REQUEST(xShmCreateSegmentReq);
REQUEST_SIZE_MATCH(xShmCreateSegmentReq);
if (!client->local)
return BadRequest;
int fd; int fd;
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
REQUEST(xShmCreateSegmentReq);
xShmCreateSegmentReply rep = { xShmCreateSegmentReply rep = {
.type = X_Reply, .type = X_Reply,
.nfd = 1, .nfd = 1,
@ -1281,6 +1273,7 @@ ProcShmCreateSegment(ClientPtr client)
.length = 0, .length = 0,
}; };
REQUEST_SIZE_MATCH(xShmCreateSegmentReq);
LEGAL_NEW_RESOURCE(stuff->shmseg, client); LEGAL_NEW_RESOURCE(stuff->shmseg, client);
if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse)) { if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse)) {
client->errorValue = stuff->readOnly; client->errorValue = stuff->readOnly;
@ -1293,7 +1286,7 @@ ProcShmCreateSegment(ClientPtr client)
close(fd); close(fd);
return BadAlloc; return BadAlloc;
} }
shmdesc = calloc(1, sizeof(ShmDescRec)); shmdesc = malloc(sizeof(ShmDescRec));
if (!shmdesc) { if (!shmdesc) {
close(fd); close(fd);
return BadAlloc; return BadAlloc;
@ -1345,18 +1338,34 @@ ProcShmDispatch(ClientPtr client)
{ {
REQUEST(xReq); REQUEST(xReq);
switch (stuff->data) { if (stuff->data == X_ShmQueryVersion)
case X_ShmQueryVersion:
return ProcShmQueryVersion(client); return ProcShmQueryVersion(client);
if (!client->local)
return BadRequest;
switch (stuff->data) {
case X_ShmAttach: case X_ShmAttach:
return ProcShmAttach(client); return ProcShmAttach(client);
case X_ShmDetach: case X_ShmDetach:
return ProcShmDetach(client); return ProcShmDetach(client);
case X_ShmPutImage: case X_ShmPutImage:
#ifdef XINERAMA
if (!noPanoramiXExtension)
return ProcPanoramiXShmPutImage(client);
#endif /* XINERAMA */
return ProcShmPutImage(client); return ProcShmPutImage(client);
case X_ShmGetImage: case X_ShmGetImage:
#ifdef XINERAMA
if (!noPanoramiXExtension)
return ProcPanoramiXShmGetImage(client);
#endif /* XINERAMA */
return ProcShmGetImage(client); return ProcShmGetImage(client);
case X_ShmCreatePixmap: case X_ShmCreatePixmap:
#ifdef XINERAMA
if (!noPanoramiXExtension)
return ProcPanoramiXShmCreatePixmap(client);
#endif /* XINERAMA */
return ProcShmCreatePixmap(client); return ProcShmCreatePixmap(client);
#ifdef SHM_FD_PASSING #ifdef SHM_FD_PASSING
case X_ShmAttachFd: case X_ShmAttachFd:
@ -1477,9 +1486,13 @@ SProcShmDispatch(ClientPtr client)
{ {
REQUEST(xReq); REQUEST(xReq);
switch (stuff->data) { if (stuff->data == X_ShmQueryVersion)
case X_ShmQueryVersion:
return ProcShmQueryVersion(client); return ProcShmQueryVersion(client);
if (!client->local)
return BadRequest;
switch (stuff->data) {
case X_ShmAttach: case X_ShmAttach:
return SProcShmAttach(client); return SProcShmAttach(client);
case X_ShmDetach: case X_ShmDetach:
@ -1501,14 +1514,6 @@ SProcShmDispatch(ClientPtr client)
} }
} }
static void ShmPixmapDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, PixmapPtr pPixmap)
{
ShmDetachSegment(
dixLookupPrivate(&pPixmap->devPrivates, shmPixmapPrivateKey),
0);
dixSetPrivate(&pPixmap->devPrivates, shmPixmapPrivateKey, NULL);
}
void void
ShmExtensionInit(void) ShmExtensionInit(void)
{ {
@ -1531,16 +1536,19 @@ ShmExtensionInit(void)
for (i = 0; i < screenInfo.numScreens; i++) { for (i = 0; i < screenInfo.numScreens; i++) {
ShmScrPrivateRec *screen_priv = ShmScrPrivateRec *screen_priv =
ShmInitScreenPriv(screenInfo.screens[i]); ShmInitScreenPriv(screenInfo.screens[i]);
if (!screen_priv)
continue;
if (!screen_priv->shmFuncs) if (!screen_priv->shmFuncs)
screen_priv->shmFuncs = &miFuncs; screen_priv->shmFuncs = &miFuncs;
if (!screen_priv->shmFuncs->CreatePixmap) if (!screen_priv->shmFuncs->CreatePixmap)
sharedPixmaps = xFalse; sharedPixmaps = xFalse;
} }
if (sharedPixmaps) if (sharedPixmaps)
for (i = 0; i < screenInfo.numScreens; i++) for (i = 0; i < screenInfo.numScreens; i++) {
dixScreenHookPixmapDestroy(screenInfo.screens[i], ShmPixmapDestroy); ShmScrPrivateRec *screen_priv =
ShmGetScreenPriv(screenInfo.screens[i]);
screen_priv->destroyPixmap =
screenInfo.screens[i]->DestroyPixmap;
screenInfo.screens[i]->DestroyPixmap = ShmDestroyPixmap;
}
} }
ShmSegType = CreateNewResourceType(ShmDetachSegment, "ShmSeg"); ShmSegType = CreateNewResourceType(ShmDetachSegment, "ShmSeg");
if (ShmSegType && if (ShmSegType &&

View File

@ -72,7 +72,7 @@ ClientSleepUntil(ClientPtr client,
TimeStamp *revive, TimeStamp *revive,
void (*notifyFunc) (ClientPtr, void *), void *closure) void (*notifyFunc) (ClientPtr, void *), void *closure)
{ {
SertafiedPtr pReq, pPrev; SertafiedPtr pRequest, pReq, pPrev;
if (SertafiedGeneration != serverGeneration) { if (SertafiedGeneration != serverGeneration) {
SertafiedResType = CreateNewResourceType(SertafiedDelete, SertafiedResType = CreateNewResourceType(SertafiedDelete,
@ -82,8 +82,7 @@ ClientSleepUntil(ClientPtr client,
SertafiedGeneration = serverGeneration; SertafiedGeneration = serverGeneration;
BlockHandlerRegistered = FALSE; BlockHandlerRegistered = FALSE;
} }
pRequest = malloc(sizeof(SertafiedRec));
SertafiedPtr pRequest = calloc(1, sizeof(SertafiedRec));
if (!pRequest) if (!pRequest)
return FALSE; return FALSE;
pRequest->pClient = client; pRequest->pClient = client;

View File

@ -24,7 +24,9 @@
* XFree86 Project. * XFree86 Project.
*/ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h> #include <dix-config.h>
#endif
#ifndef _SLEEPUNTIL_H_ #ifndef _SLEEPUNTIL_H_
#define _SLEEPUNTIL_H_ 1 #define _SLEEPUNTIL_H_ 1

View File

@ -59,7 +59,6 @@ PERFORMANCE OF THIS SOFTWARE.
#include <X11/extensions/syncproto.h> #include <X11/extensions/syncproto.h>
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "miext/extinit_priv.h"
#include "os/bug_priv.h" #include "os/bug_priv.h"
#include "os/osdep.h" #include "os/osdep.h"
@ -79,6 +78,8 @@ PERFORMANCE OF THIS SOFTWARE.
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#include "extinit_priv.h"
/* /*
* Local Global Variables * Local Global Variables
*/ */
@ -649,7 +650,7 @@ SyncAwaitTriggerFired(SyncTrigger * pTrigger)
pAwaitUnion = (SyncAwaitUnion *) pAwait->pHeader; pAwaitUnion = (SyncAwaitUnion *) pAwait->pHeader;
numwaits = pAwaitUnion->header.num_waitconditions; numwaits = pAwaitUnion->header.num_waitconditions;
ppAwait = calloc(numwaits, sizeof(SyncAwait *)); ppAwait = xallocarray(numwaits, sizeof(SyncAwait *));
if (!ppAwait) if (!ppAwait)
goto bail; goto bail;
@ -763,6 +764,8 @@ SyncChangeCounter(SyncCounter * pCounter, int64_t newval)
static Bool static Bool
SyncEventSelectForAlarm(SyncAlarm * pAlarm, ClientPtr client, Bool wantevents) SyncEventSelectForAlarm(SyncAlarm * pAlarm, ClientPtr client, Bool wantevents)
{ {
SyncAlarmClientList *pClients;
if (client == pAlarm->client) { /* alarm owner */ if (client == pAlarm->client) { /* alarm owner */
pAlarm->events = wantevents; pAlarm->events = wantevents;
return Success; return Success;
@ -770,8 +773,7 @@ SyncEventSelectForAlarm(SyncAlarm * pAlarm, ClientPtr client, Bool wantevents)
/* see if the client is already on the list (has events selected) */ /* see if the client is already on the list (has events selected) */
for (SyncAlarmClientList *pClients = pClients = pAlarm->pEventClients; for (pClients = pAlarm->pEventClients; pClients; pClients = pClients->next) {
pClients; pClients = pClients->next) {
if (pClients->client == client) { if (pClients->client == client) {
/* client's presence on the list indicates desire for /* client's presence on the list indicates desire for
* events. If the client doesn't want events, remove it * events. If the client doesn't want events, remove it
@ -797,7 +799,7 @@ SyncEventSelectForAlarm(SyncAlarm * pAlarm, ClientPtr client, Bool wantevents)
/* add new client to pAlarm->pEventClients */ /* add new client to pAlarm->pEventClients */
SyncAlarmClientList *pClients = calloc(1, sizeof(SyncAlarmClientList)); pClients = malloc(sizeof(SyncAlarmClientList));
if (!pClients) if (!pClients)
return BadAlloc; return BadAlloc;
@ -932,7 +934,7 @@ SyncCreate(ClientPtr client, XID id, unsigned char type)
switch (type) { switch (type) {
case SYNC_COUNTER: case SYNC_COUNTER:
pSync = calloc(1, sizeof(SyncCounter)); pSync = malloc(sizeof(SyncCounter));
resType = RTCounter; resType = RTCounter;
break; break;
case SYNC_FENCE: case SYNC_FENCE:
@ -1025,10 +1027,12 @@ SyncCreateSystemCounter(const char *name,
SyncSystemCounterBracketValues BracketValues SyncSystemCounterBracketValues BracketValues
) )
{ {
SyncCounter *pCounter = SyncCreateCounter(NULL, dixAllocServerXID(), initial); SyncCounter *pCounter = SyncCreateCounter(NULL, FakeClientID(0), initial);
if (pCounter) { if (pCounter) {
SysCounterInfo *psci = calloc(1, sizeof(SysCounterInfo)); SysCounterInfo *psci;
psci = malloc(sizeof(SysCounterInfo));
if (!psci) { if (!psci) {
FreeResource(pCounter->sync.id, X11_RESTYPE_NONE); FreeResource(pCounter->sync.id, X11_RESTYPE_NONE);
return pCounter; return pCounter;
@ -1307,7 +1311,7 @@ ProcSyncListSystemCounters(ClientPtr client)
} }
if (len) { if (len) {
walklist = list = calloc(1, len); walklist = list = malloc(len);
if (!list) if (!list)
return BadAlloc; return BadAlloc;
} }
@ -1354,8 +1358,7 @@ ProcSyncListSystemCounters(ClientPtr client)
} }
/* /*
* Set the priority of the client owning given resource. * ** Set client Priority
* If the resource ID is None then set the priority of calling client.
*/ */
static int static int
ProcSyncSetPriority(ClientPtr client) ProcSyncSetPriority(ClientPtr client)
@ -1369,7 +1372,7 @@ ProcSyncSetPriority(ClientPtr client)
if (stuff->id == None) if (stuff->id == None)
priorityclient = client; priorityclient = client;
else { else {
rc = dixLookupResourceOwner(&priorityclient, stuff->id, client, rc = dixLookupClient(&priorityclient, stuff->id, client,
DixSetAttrAccess); DixSetAttrAccess);
if (rc != Success) if (rc != Success)
return rc; return rc;
@ -1389,8 +1392,7 @@ ProcSyncSetPriority(ClientPtr client)
} }
/* /*
* Retrieve the priority of the client owning given resource. * ** Get client Priority
* If the resource ID is None then retrieve the priority of calling client.
*/ */
static int static int
ProcSyncGetPriority(ClientPtr client) ProcSyncGetPriority(ClientPtr client)
@ -1405,7 +1407,7 @@ ProcSyncGetPriority(ClientPtr client)
if (stuff->id == None) if (stuff->id == None)
priorityclient = client; priorityclient = client;
else { else {
rc = dixLookupResourceOwner(&priorityclient, stuff->id, client, rc = dixLookupClient(&priorityclient, stuff->id, client,
DixGetAttrAccess); DixGetAttrAccess);
if (rc != Success) if (rc != Success)
return rc; return rc;
@ -1545,7 +1547,7 @@ SyncAwaitPrologue(ClientPtr client, int items)
/* all the memory for the entire await list is allocated /* all the memory for the entire await list is allocated
* here in one chunk * here in one chunk
*/ */
pAwaitUnion = calloc(items + 1, sizeof(SyncAwaitUnion)); pAwaitUnion = xallocarray(items + 1, sizeof(SyncAwaitUnion));
if (!pAwaitUnion) if (!pAwaitUnion)
return NULL; return NULL;
@ -1737,7 +1739,7 @@ ProcSyncCreateAlarm(ClientPtr client)
if (len != (Ones(vmask) + Ones(vmask & (XSyncCAValue | XSyncCADelta)))) if (len != (Ones(vmask) + Ones(vmask & (XSyncCAValue | XSyncCADelta))))
return BadLength; return BadLength;
if (!(pAlarm = calloc(1, sizeof(SyncAlarm)))) { if (!(pAlarm = malloc(sizeof(SyncAlarm)))) {
return BadAlloc; return BadAlloc;
} }
@ -2645,15 +2647,16 @@ typedef struct {
static void static void
IdleTimeQueryValue(void *pCounter, int64_t *pValue_return) IdleTimeQueryValue(void *pCounter, int64_t *pValue_return)
{ {
int deviceid = XIAllDevices; int deviceid;
CARD32 idle; CARD32 idle;
if (pCounter) { if (pCounter) {
SyncCounter *counter = pCounter; SyncCounter *counter = pCounter;
IdleCounterPriv *priv = SysCounterGetPrivate(counter); IdleCounterPriv *priv = SysCounterGetPrivate(counter);
if (priv)
deviceid = priv->deviceid; deviceid = priv->deviceid;
} }
else
deviceid = XIAllDevices;
idle = GetTimeInMillis() - LastEventTime(deviceid).milliseconds; idle = GetTimeInMillis() - LastEventTime(deviceid).milliseconds;
*pValue_return = idle; *pValue_return = idle;
} }
@ -2663,8 +2666,6 @@ IdleTimeBlockHandler(void *pCounter, void *wt)
{ {
SyncCounter *counter = pCounter; SyncCounter *counter = pCounter;
IdleCounterPriv *priv = SysCounterGetPrivate(counter); IdleCounterPriv *priv = SysCounterGetPrivate(counter);
if (!priv)
return;
int64_t *less = priv->value_less; int64_t *less = priv->value_less;
int64_t *greater = priv->value_greater; int64_t *greater = priv->value_greater;
int64_t idle, old_idle; int64_t idle, old_idle;
@ -2755,8 +2756,6 @@ IdleTimeWakeupHandler(void *pCounter, int rc)
{ {
SyncCounter *counter = pCounter; SyncCounter *counter = pCounter;
IdleCounterPriv *priv = SysCounterGetPrivate(counter); IdleCounterPriv *priv = SysCounterGetPrivate(counter);
if (!priv)
return;
int64_t *less = priv->value_less; int64_t *less = priv->value_less;
int64_t *greater = priv->value_greater; int64_t *greater = priv->value_greater;
int64_t idle; int64_t idle;
@ -2790,8 +2789,6 @@ IdleTimeBracketValues(void *pCounter, int64_t *pbracket_less,
{ {
SyncCounter *counter = pCounter; SyncCounter *counter = pCounter;
IdleCounterPriv *priv = SysCounterGetPrivate(counter); IdleCounterPriv *priv = SysCounterGetPrivate(counter);
if (!priv)
return;
int64_t *less = priv->value_less; int64_t *less = priv->value_less;
int64_t *greater = priv->value_greater; int64_t *greater = priv->value_greater;
Bool registered = (less || greater); Bool registered = (less || greater);
@ -2821,24 +2818,20 @@ init_system_idle_counter(const char *name, int deviceid)
IdleTimeQueryValue(NULL, &idle); IdleTimeQueryValue(NULL, &idle);
IdleCounterPriv *priv = calloc(1, sizeof(IdleCounterPriv));
if (!priv)
return NULL;
idle_time_counter = SyncCreateSystemCounter(name, idle, resolution, idle_time_counter = SyncCreateSystemCounter(name, idle, resolution,
XSyncCounterUnrestricted, XSyncCounterUnrestricted,
IdleTimeQueryValue, IdleTimeQueryValue,
IdleTimeBracketValues); IdleTimeBracketValues);
if (!idle_time_counter) { if (idle_time_counter != NULL) {
free(priv); IdleCounterPriv *priv = malloc(sizeof(IdleCounterPriv));
return NULL;
}
priv->value_less = priv->value_greater = NULL; priv->value_less = priv->value_greater = NULL;
priv->deviceid = deviceid; priv->deviceid = deviceid;
idle_time_counter->pSysCounterInfo->private = priv; idle_time_counter->pSysCounterInfo->private = priv;
}
return idle_time_counter; return idle_time_counter;
} }

File diff suppressed because it is too large Load Diff

View File

@ -204,6 +204,7 @@ XaceCensorImage(ClientPtr client,
if (nRects > 0) { /* we have something to censor */ if (nRects > 0) { /* we have something to censor */
GCPtr pScratchGC = NULL; GCPtr pScratchGC = NULL;
PixmapPtr pPix = NULL; PixmapPtr pPix = NULL;
xRectangle *pRects = NULL;
Bool failed = FALSE; Bool failed = FALSE;
int depth = 1; int depth = 1;
int bitsPerPixel = 1; int bitsPerPixel = 1;
@ -212,7 +213,7 @@ XaceCensorImage(ClientPtr client,
/* convert region to list-of-rectangles for PolyFillRect */ /* convert region to list-of-rectangles for PolyFillRect */
xRectangle *pRects = calloc(1, nRects * sizeof(xRectangle)); pRects = malloc(nRects * sizeof(xRectangle));
if (!pRects) { if (!pRects) {
failed = TRUE; failed = TRUE;
goto failSafe; goto failSafe;
@ -280,15 +281,3 @@ XaceIsLocal(ClientPtr client)
{ {
return ClientIsLocal(client); return ClientIsLocal(client);
} }
Bool
XaceRegisterCallback(int hook, CallbackProcPtr callback, void *data)
{
return AddCallback(XaceHooks+(hook), callback, data);
}
Bool
XaceDeleteCallback(int hook, CallbackProcPtr callback, void *data)
{
return DeleteCallback(XaceHooks+(hook), callback, data);
}

View File

@ -25,13 +25,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define XACE_MAJOR_VERSION 2 #define XACE_MAJOR_VERSION 2
#define XACE_MINOR_VERSION 0 #define XACE_MINOR_VERSION 0
#include "dix/selection_priv.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "pixmap.h" #include "pixmap.h"
#include "region.h" #include "region.h"
#include "window.h" #include "window.h"
#include "property.h" #include "property.h"
#include "selection.h"
/* Default window background */ /* Default window background */
#define XaceBackgroundNoneState(w) ((w)->forcedBG ? BackgroundPixel : None) #define XaceBackgroundNoneState(w) ((w)->forcedBG ? BackgroundPixel : None)
@ -39,6 +38,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
/* security hooks */ /* security hooks */
/* Constants used to identify the available security hooks /* Constants used to identify the available security hooks
*/ */
#define XACE_CORE_DISPATCH 0
#define XACE_EXT_DISPATCH 1 #define XACE_EXT_DISPATCH 1
#define XACE_RESOURCE_ACCESS 2 #define XACE_RESOURCE_ACCESS 2
#define XACE_DEVICE_ACCESS 3 #define XACE_DEVICE_ACCESS 3
@ -58,10 +58,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
extern CallbackListPtr XaceHooks[XACE_NUM_HOOKS]; extern CallbackListPtr XaceHooks[XACE_NUM_HOOKS];
/* Entry point for hook functions. Called by Xserver. /* Entry point for hook functions. Called by Xserver.
* Required by several modules * Required by libdbe and libextmod
*/ */
_X_EXPORT Bool XaceRegisterCallback(int hook, CallbackProcPtr callback, void *data); /* needs to be exported for in-tree modsetting driver, but not part
_X_EXPORT Bool XaceDeleteCallback(int hook, CallbackProcPtr callback, void *data); of public API for external modules */
_X_EXPORT int XaceHook(int hook, ... /* appropriate args for hook */);
/* determine whether any callbacks are present for the XACE hook */ /* determine whether any callbacks are present for the XACE hook */
int XaceHookIsSet(int hook); int XaceHookIsSet(int hook);
@ -78,7 +79,7 @@ int XaceHookPropertyAccess(ClientPtr ptr, WindowPtr pWin, PropertyPtr *ppProp,
Mask access_mode); Mask access_mode);
int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel, Mask access_mode); int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel, Mask access_mode);
/* needs to be exported for in-tree modesetting, but not part of public API */ /* needs to be exported for in-tree modsetting, but not part of public API */
_X_EXPORT int XaceHookResourceAccess(ClientPtr client, XID id, RESTYPE rtype, void *res, _X_EXPORT int XaceHookResourceAccess(ClientPtr client, XID id, RESTYPE rtype, void *res,
RESTYPE ptype, void *parent, Mask access_mode); RESTYPE ptype, void *parent, Mask access_mode);
@ -95,7 +96,16 @@ int XaceHookScreensaverAccess(ClientPtr client, ScreenPtr screen, Mask access_mo
int XaceHookAuthAvail(ClientPtr client, XID authId); int XaceHookAuthAvail(ClientPtr client, XID authId);
int XaceHookKeyAvail(xEventPtr ev, DeviceIntPtr dev, int count); int XaceHookKeyAvail(xEventPtr ev, DeviceIntPtr dev, int count);
/* Register / unregister a callback for a given hook. */
/* Register a callback for a given hook.
*/
#define XaceRegisterCallback(hook,callback,data) \
AddCallback(XaceHooks+(hook), callback, data)
/* Unregister an existing callback for a given hook.
*/
#define XaceDeleteCallback(hook,callback,data) \
DeleteCallback(XaceHooks+(hook), callback, data)
/* XTrans wrappers for use by security modules /* XTrans wrappers for use by security modules
*/ */

View File

@ -20,16 +20,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#ifndef _XACESTR_H #ifndef _XACESTR_H
#define _XACESTR_H #define _XACESTR_H
#include "dix/selection_priv.h"
#include "dix.h" #include "dix.h"
#include "resource.h" #include "resource.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "window.h" #include "window.h"
#include "input.h" #include "input.h"
#include "property.h" #include "property.h"
#include "selection.h"
#include "xace.h" #include "xace.h"
/* XACE_CORE_DISPATCH */
typedef struct {
ClientPtr client;
int status;
} XaceCoreDispatchRec;
/* XACE_RESOURCE_ACCESS */ /* XACE_RESOURCE_ACCESS */
typedef struct { typedef struct {
ClientPtr client; ClientPtr client;

View File

@ -28,19 +28,17 @@ from The Open Group.
#include <dix-config.h> #include <dix-config.h>
#include <stdint.h>
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include <X11/extensions/xcmiscproto.h>
#include "dix/resource_priv.h"
#include "miext/extinit_priv.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
#include "dixstruct.h" #include "dixstruct.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "swaprep.h" #include "swaprep.h"
#include <X11/extensions/xcmiscproto.h>
#include "extinit_priv.h"
#include <stdint.h>
static int static int
ProcXCMiscGetVersion(ClientPtr client) ProcXCMiscGetVersion(ClientPtr client)
@ -101,7 +99,7 @@ ProcXCMiscGetXIDList(ClientPtr client)
if (stuff->count > UINT32_MAX / sizeof(XID)) if (stuff->count > UINT32_MAX / sizeof(XID))
return BadAlloc; return BadAlloc;
pids = calloc(stuff->count, sizeof(XID)); pids = xallocarray(stuff->count, sizeof(XID));
if (!pids) { if (!pids) {
return BadAlloc; return BadAlloc;
} }

View File

@ -41,6 +41,10 @@
#ifdef SVR4 #ifdef SVR4
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#endif #endif
#if defined(__CYGWIN__)
#include <sys/param.h>
#include <sys/sysmacros.h>
#endif
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -53,10 +57,6 @@
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include <X11/extensions/xf86bigfproto.h> #include <X11/extensions/xf86bigfproto.h>
#include <X11/fonts/fontstruct.h>
#include <X11/fonts/libxfont2.h>
#include "miext/extinit_priv.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
@ -64,6 +64,7 @@
#include "gcstruct.h" #include "gcstruct.h"
#include "dixfontstr.h" #include "dixfontstr.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "extinit.h"
#include "protocol-versions.h" #include "protocol-versions.h"
#include "xf86bigfontsrv.h" #include "xf86bigfontsrv.h"
@ -86,7 +87,7 @@ static unsigned int pagesize;
static Bool badSysCall = FALSE; static Bool badSysCall = FALSE;
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) || defined(__DragonFly__)
static void static void
SigSysHandler(int signo) SigSysHandler(int signo)
@ -146,6 +147,7 @@ static ShmDescPtr ShmList = (ShmDescPtr) NULL;
static ShmDescPtr static ShmDescPtr
shmalloc(unsigned int size) shmalloc(unsigned int size)
{ {
ShmDescPtr pDesc;
int shmid; int shmid;
char *addr; char *addr;
@ -163,7 +165,7 @@ shmalloc(unsigned int size)
if (size < 3500) if (size < 3500)
return (ShmDescPtr) NULL; return (ShmDescPtr) NULL;
ShmDescPtr pDesc = calloc(1, sizeof(ShmDescRec)); pDesc = malloc(sizeof(ShmDescRec));
if (!pDesc) if (!pDesc)
return (ShmDescPtr) NULL; return (ShmDescPtr) NULL;
@ -264,11 +266,13 @@ XF86BigfontResetProc(ExtensionEntry * extEntry)
static int static int
ProcXF86BigfontQueryVersion(ClientPtr client) ProcXF86BigfontQueryVersion(ClientPtr client)
{ {
REQUEST_SIZE_MATCH(xXF86BigfontQueryVersionReq); xXF86BigfontQueryVersionReply reply;
xXF86BigfontQueryVersionReply reply = { REQUEST_SIZE_MATCH(xXF86BigfontQueryVersionReq);
reply = (xXF86BigfontQueryVersionReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.majorVersion = SERVER_XF86BIGFONT_MAJOR_VERSION, .majorVersion = SERVER_XF86BIGFONT_MAJOR_VERSION,
.minorVersion = SERVER_XF86BIGFONT_MINOR_VERSION, .minorVersion = SERVER_XF86BIGFONT_MINOR_VERSION,
.uid = geteuid(), .uid = geteuid(),
@ -277,6 +281,9 @@ ProcXF86BigfontQueryVersion(ClientPtr client)
.signature = signature, .signature = signature,
.capabilities = (client->local && !client->swapped) .capabilities = (client->local && !client->swapped)
? XF86Bigfont_CAP_LocalShm : 0 ? XF86Bigfont_CAP_LocalShm : 0
#else
.signature = 0,
.capabilities = 0
#endif #endif
}; };
if (client->swapped) { if (client->swapped) {
@ -383,7 +390,7 @@ ProcXF86BigfontQueryFont(ClientPtr client)
} }
else { else {
#endif #endif
pCI = calloc(nCharInfos, sizeof(xCharInfo)); pCI = xallocarray(nCharInfos, sizeof(xCharInfo));
if (!pCI) if (!pCI)
return BadAlloc; return BadAlloc;
#ifdef MITSHM #ifdef MITSHM
@ -445,7 +452,7 @@ ProcXF86BigfontQueryFont(ClientPtr client)
if (hashModulus > nCharInfos + 1) if (hashModulus > nCharInfos + 1)
hashModulus = nCharInfos + 1; hashModulus = nCharInfos + 1;
tmp = calloc(4 * nCharInfos + 1, sizeof(CARD16)); tmp = xallocarray(4 * nCharInfos + 1, sizeof(CARD16));
if (!tmp) { if (!tmp) {
if (!pDesc) if (!pDesc)
free(pCI); free(pCI);
@ -532,9 +539,8 @@ ProcXF86BigfontQueryFont(ClientPtr client)
: 0); : 0);
xXF86BigfontQueryFontReply rep = { xXF86BigfontQueryFontReply rep = {
.type = X_Reply, .type = X_Reply;
.length = bytes_to_int32(sizeof(xXF86BigfontQueryFontReply) .length = bytes_to_int32(buflength),
- sizeof(xGenericReply) + rlength),
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.minBounds = pFont->info.ink_minbounds, .minBounds = pFont->info.ink_minbounds,
.maxBounds = pFont->info.ink_maxbounds, .maxBounds = pFont->info.ink_maxbounds,
@ -647,6 +653,7 @@ ProcXF86BigfontDispatch(ClientPtr client)
static int _X_COLD static int _X_COLD
SProcXF86BigfontQueryVersion(ClientPtr client) SProcXF86BigfontQueryVersion(ClientPtr client)
{ {
REQUEST(xXF86BigfontQueryVersionReq);
return ProcXF86BigfontQueryVersion(client); return ProcXF86BigfontQueryVersion(client);
} }
@ -705,7 +712,7 @@ XFree86BigfontExtensionInit(void)
FontShmdescIndex = xfont2_allocate_font_private_index(); FontShmdescIndex = xfont2_allocate_font_private_index();
#if !defined(CSRG_BASED) #if !defined(CSRG_BASED) && !defined(__CYGWIN__)
pagesize = SHMLBA; pagesize = SHMLBA;
#else #else
#ifdef _SC_PAGESIZE #ifdef _SC_PAGESIZE

View File

@ -12,10 +12,7 @@
#include <X11/extensions/XResproto.h> #include <X11/extensions/XResproto.h>
#include "dix/registry_priv.h" #include "dix/registry_priv.h"
#include "dix/resource_priv.h"
#include "os/client_priv.h" #include "os/client_priv.h"
#include "miext/extinit_priv.h"
#include "Xext/xace.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
@ -25,12 +22,17 @@
#include "pixmapstr.h" #include "pixmapstr.h"
#include "windowstr.h" #include "windowstr.h"
#include "gcstruct.h" #include "gcstruct.h"
#include "extinit_priv.h"
#include "protocol-versions.h" #include "protocol-versions.h"
#include "list.h" #include "list.h"
#include "misc.h" #include "misc.h"
#include <string.h>
#include "hashtable.h" #include "hashtable.h"
#include "picturestr.h" #include "picturestr.h"
#ifdef COMPOSITE
#include "compint.h" #include "compint.h"
#endif
Bool noResExtension = FALSE; Bool noResExtension = FALSE;
@ -101,7 +103,7 @@ typedef struct {
static void * static void *
AddFragment(struct xorg_list *frags, int bytes) AddFragment(struct xorg_list *frags, int bytes)
{ {
FragmentList *f = calloc(1, sizeof(FragmentList) + bytes); FragmentList *f = malloc(sizeof(FragmentList) + bytes);
if (!f) { if (!f) {
return NULL; return NULL;
} else { } else {
@ -111,6 +113,21 @@ AddFragment(struct xorg_list *frags, int bytes)
} }
} }
/** @brief Sends all fragments in the list to the client. Does not
free anything.
@param client The client to send the fragments to
@param frags The head of the list of fragments
*/
static void
WriteFragmentsToClient(ClientPtr client, struct xorg_list *frags)
{
FragmentList *it;
xorg_list_for_each_entry(it, frags, l) {
WriteToClient(client, it->bytes, (char*) it + sizeof(*it));
}
}
/** @brief Frees a list of fragments. Does not free() root node. /** @brief Frees a list of fragments. Does not free() root node.
@param frags The head of the list of fragments @param frags The head of the list of fragments
@ -119,12 +136,10 @@ static void
DestroyFragments(struct xorg_list *frags) DestroyFragments(struct xorg_list *frags)
{ {
FragmentList *it, *tmp; FragmentList *it, *tmp;
if (!xorg_list_is_empty(frags)) {
xorg_list_for_each_entry_safe(it, tmp, frags, l) { xorg_list_for_each_entry_safe(it, tmp, frags, l) {
xorg_list_del(&it->l); xorg_list_del(&it->l);
free(it); free(it);
} }
}
} }
/** @brief Constructs a context record for ConstructClientId* functions /** @brief Constructs a context record for ConstructClientId* functions
@ -180,15 +195,16 @@ DestroyConstructResourceBytesCtx(ConstructResourceBytesCtx *ctx)
static int static int
ProcXResQueryVersion(ClientPtr client) ProcXResQueryVersion(ClientPtr client)
{ {
REQUEST_SIZE_MATCH(xXResQueryVersionReq);
xXResQueryVersionReply rep = { xXResQueryVersionReply rep = {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.server_major = SERVER_XRES_MAJOR_VERSION, .server_major = SERVER_XRES_MAJOR_VERSION,
.server_minor = SERVER_XRES_MINOR_VERSION .server_minor = SERVER_XRES_MINOR_VERSION
}; };
REQUEST_SIZE_MATCH(xXResQueryVersionReq);
if (client->swapped) { if (client->swapped) {
swaps(&rep.sequenceNumber); swaps(&rep.sequenceNumber);
swapl(&rep.length); swapl(&rep.length);
@ -202,23 +218,24 @@ ProcXResQueryVersion(ClientPtr client)
static int static int
ProcXResQueryClients(ClientPtr client) ProcXResQueryClients(ClientPtr client)
{ {
/* REQUEST(xXResQueryClientsReq); */
xXResQueryClientsReply rep;
int *current_clients;
int i, num_clients;
REQUEST_SIZE_MATCH(xXResQueryClientsReq); REQUEST_SIZE_MATCH(xXResQueryClientsReq);
int *current_clients = calloc(currentMaxClients, sizeof(int)); current_clients = xallocarray(currentMaxClients, sizeof(int));
if (!current_clients)
return BadAlloc;
int num_clients = 0; num_clients = 0;
for (int i = 0; i < currentMaxClients; i++) { for (i = 0; i < currentMaxClients; i++) {
if (clients[i]) { if (clients[i]) {
if (XaceHookClientAccess(client, clients[i], DixReadAccess) == Success) {
current_clients[num_clients] = i; current_clients[num_clients] = i;
num_clients++; num_clients++;
} }
} }
}
xXResQueryClientsReply rep = { rep = (xXResQueryClientsReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = bytes_to_int32(num_clients * sz_xXResClient), .length = bytes_to_int32(num_clients * sz_xXResClient),
@ -229,31 +246,25 @@ ProcXResQueryClients(ClientPtr client)
swapl(&rep.length); swapl(&rep.length);
swapl(&rep.num_clients); swapl(&rep.num_clients);
} }
WriteToClient(client, sizeof(xXResQueryClientsReply), &rep);
xXResClient *scratch = NULL;
if (num_clients) { if (num_clients) {
scratch = calloc(sizeof(xXResClient), num_clients); xXResClient scratch;
if (!scratch) {
free(current_clients);
return BadAlloc;
}
for (int i = 0; i < num_clients; i++) { for (i = 0; i < num_clients; i++) {
scratch[i].resource_base = clients[current_clients[i]]->clientAsMask; scratch.resource_base = clients[current_clients[i]]->clientAsMask;
scratch[i].resource_mask = RESOURCE_ID_MASK; scratch.resource_mask = RESOURCE_ID_MASK;
if (client->swapped) { if (client->swapped) {
swapl(&scratch[i].resource_base); swapl(&scratch.resource_base);
swapl(&scratch[i].resource_mask); swapl(&scratch.resource_mask);
} }
WriteToClient(client, sz_xXResClient, &scratch);
} }
} }
WriteToClient(client, sizeof(xXResQueryClientsReply), &rep);
WriteToClient(client, sizeof(xXResClient) * num_clients, scratch);
free(current_clients); free(current_clients);
free(scratch);
return Success; return Success;
} }
@ -287,30 +298,31 @@ static int
ProcXResQueryClientResources(ClientPtr client) ProcXResQueryClientResources(ClientPtr client)
{ {
REQUEST(xXResQueryClientResourcesReq); REQUEST(xXResQueryClientResourcesReq);
xXResQueryClientResourcesReply rep;
int i, clientID, num_types;
int *counts;
REQUEST_SIZE_MATCH(xXResQueryClientResourcesReq); REQUEST_SIZE_MATCH(xXResQueryClientResourcesReq);
ClientPtr resClient = dixClientForXID(stuff->xid); clientID = CLIENT_ID(stuff->xid);
if ((!resClient) || if ((clientID >= currentMaxClients) || !clients[clientID]) {
(XaceHookClientAccess(client, resClient, DixReadAccess)
!= Success)) {
client->errorValue = stuff->xid; client->errorValue = stuff->xid;
return BadValue; return BadValue;
} }
int *counts = calloc(lastResourceType + 1, sizeof(int)); counts = calloc(lastResourceType + 1, sizeof(int));
if (!counts)
return BadAlloc;
FindAllClientResources(resClient, ResFindAllRes, counts); FindAllClientResources(clients[clientID], ResFindAllRes, counts);
int num_types = 0; num_types = 0;
for (int i = 0; i <= lastResourceType; i++) {
for (i = 0; i <= lastResourceType; i++) {
if (counts[i]) if (counts[i])
num_types++; num_types++;
} }
xXResQueryClientResourcesReply rep = { rep = (xXResQueryClientResourcesReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = bytes_to_int32(num_types * sz_xXResType), .length = bytes_to_int32(num_types * sz_xXResType),
@ -322,27 +334,28 @@ ProcXResQueryClientResources(ClientPtr client)
swapl(&rep.num_types); swapl(&rep.num_types);
} }
xXResType *scratch = calloc(sizeof(xXResType), num_types); WriteToClient(client, sizeof(xXResQueryClientResourcesReply), &rep);
if (!scratch) {
free(counts);
return BadAlloc;
}
for (int i = 0; i < num_types; i++) { if (num_types) {
scratch[i].resource_type = resourceTypeAtom(i + 1); xXResType scratch;
scratch[i].count = counts[i];
for (i = 0; i < lastResourceType; i++) {
if (!counts[i])
continue;
scratch.resource_type = resourceTypeAtom(i + 1);
scratch.count = counts[i];
if (client->swapped) { if (client->swapped) {
swapl(&scratch[i].resource_type); swapl(&scratch.resource_type);
swapl(&scratch[i].count); swapl(&scratch.count);
}
WriteToClient(client, sz_xXResType, &scratch);
} }
} }
free(counts); free(counts);
WriteToClient(client, sizeof(xXResQueryClientResourcesReply), &rep);
WriteToClient(client, num_types * sizeof(xXResType), scratch);
free(scratch);
return Success; return Success;
} }
@ -361,26 +374,33 @@ static int
ProcXResQueryClientPixmapBytes(ClientPtr client) ProcXResQueryClientPixmapBytes(ClientPtr client)
{ {
REQUEST(xXResQueryClientPixmapBytesReq); REQUEST(xXResQueryClientPixmapBytesReq);
xXResQueryClientPixmapBytesReply rep;
int clientID;
unsigned long bytes;
REQUEST_SIZE_MATCH(xXResQueryClientPixmapBytesReq); REQUEST_SIZE_MATCH(xXResQueryClientPixmapBytesReq);
ClientPtr owner = dixClientForXID(stuff->xid); clientID = CLIENT_ID(stuff->xid);
if ((!owner) ||
(XaceHookClientAccess(client, owner, DixReadAccess) if ((clientID >= currentMaxClients) || !clients[clientID]) {
!= Success)) {
client->errorValue = stuff->xid; client->errorValue = stuff->xid;
return BadValue; return BadValue;
} }
unsigned long bytes = 0; bytes = 0;
FindAllClientResources(owner, ResFindResourcePixmaps,
FindAllClientResources(clients[clientID], ResFindResourcePixmaps,
(void *) (&bytes)); (void *) (&bytes));
xXResQueryClientPixmapBytesReply rep = { rep = (xXResQueryClientPixmapBytesReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.bytes = bytes, .bytes = bytes,
#ifdef _XSERVER64 #ifdef _XSERVER64
.bytes_overflow = bytes >> 32 .bytes_overflow = bytes >> 32
#else
.bytes_overflow = 0
#endif #endif
}; };
if (client->swapped) { if (client->swapped) {
@ -439,10 +459,9 @@ static Bool
ConstructClientIdValue(ClientPtr sendClient, ClientPtr client, CARD32 mask, ConstructClientIdValue(ClientPtr sendClient, ClientPtr client, CARD32 mask,
ConstructClientIdCtx *ctx) ConstructClientIdCtx *ctx)
{ {
xXResClientIdValue rep = { xXResClientIdValue rep;
.spec.client = client->clientAsMask,
};
rep.spec.client = client->clientAsMask;
if (client->swapped) { if (client->swapped) {
swapl (&rep.spec.client); swapl (&rep.spec.client);
} }
@ -454,6 +473,7 @@ ConstructClientIdValue(ClientPtr sendClient, ClientPtr client, CARD32 mask,
} }
rep.spec.mask = X_XResClientXIDMask; rep.spec.mask = X_XResClientXIDMask;
rep.length = 0;
if (sendClient->swapped) { if (sendClient->swapped) {
swapl (&rep.spec.mask); swapl (&rep.spec.mask);
/* swapl (&rep.length, n); - not required for rep.length = 0 */ /* swapl (&rep.length, n); - not required for rep.length = 0 */
@ -482,6 +502,9 @@ ConstructClientIdValue(ClientPtr sendClient, ClientPtr client, CARD32 mask,
if (sendClient->swapped) { if (sendClient->swapped) {
swapl (&rep.spec.mask); swapl (&rep.spec.mask);
swapl (&rep.length); swapl (&rep.length);
}
if (sendClient->swapped) {
swapl (value); swapl (value);
} }
memcpy(ptr, &rep, sizeof(rep)); memcpy(ptr, &rep, sizeof(rep));
@ -510,13 +533,13 @@ ConstructClientIds(ClientPtr client,
int numSpecs, xXResClientIdSpec* specs, int numSpecs, xXResClientIdSpec* specs,
ConstructClientIdCtx *ctx) ConstructClientIdCtx *ctx)
{ {
for (int specIdx = 0; specIdx < numSpecs; ++specIdx) { int specIdx;
for (specIdx = 0; specIdx < numSpecs; ++specIdx) {
if (specs[specIdx].client == 0) { if (specs[specIdx].client == 0) {
int c; int c;
for (c = 0; c < currentMaxClients; ++c) { for (c = 0; c < currentMaxClients; ++c) {
if (clients[c] && if (clients[c]) {
(XaceHookClientAccess(client, clients[c], DixReadAccess)
== Success)) {
if (!ConstructClientIdValue(client, clients[c], if (!ConstructClientIdValue(client, clients[c],
specs[specIdx].mask, ctx)) { specs[specIdx].mask, ctx)) {
return BadAlloc; return BadAlloc;
@ -524,11 +547,10 @@ ConstructClientIds(ClientPtr client,
} }
} }
} else { } else {
ClientPtr owner = dixClientForXID(specs[specIdx].client); int clientID = CLIENT_ID(specs[specIdx].client);
if (owner &&
(XaceHookClientAccess(client, owner, DixReadAccess) if ((clientID < currentMaxClients) && clients[clientID]) {
== Success)) { if (!ConstructClientIdValue(client, clients[clientID],
if (!ConstructClientIdValue(client, owner,
specs[specIdx].mask, ctx)) { specs[specIdx].mask, ctx)) {
return BadAlloc; return BadAlloc;
} }
@ -553,6 +575,7 @@ ProcXResQueryClientIds (ClientPtr client)
REQUEST(xXResQueryClientIdsReq); REQUEST(xXResQueryClientIdsReq);
xXResClientIdSpec *specs = (void*) ((char*) stuff + sizeof(*stuff)); xXResClientIdSpec *specs = (void*) ((char*) stuff + sizeof(*stuff));
int rc;
ConstructClientIdCtx ctx; ConstructClientIdCtx ctx;
InitConstructClientIdCtx(&ctx); InitConstructClientIdCtx(&ctx);
@ -561,22 +584,9 @@ ProcXResQueryClientIds (ClientPtr client)
REQUEST_FIXED_SIZE(xXResQueryClientIdsReq, REQUEST_FIXED_SIZE(xXResQueryClientIdsReq,
stuff->numSpecs * sizeof(specs[0])); stuff->numSpecs * sizeof(specs[0]));
int rc = ConstructClientIds(client, stuff->numSpecs, specs, &ctx); rc = ConstructClientIds(client, stuff->numSpecs, specs, &ctx);
if (rc == Success) { if (rc == Success) {
char *buf = calloc(1, ctx.resultBytes);
if (!buf) {
rc = BadAlloc;
goto out;
}
char *walk = buf;
FragmentList *it;
xorg_list_for_each_entry(it, &ctx.response, l) {
memcpy(walk, FRAGMENT_DATA(it), it->bytes);
walk += it->bytes;
}
xXResQueryClientIdsReply rep = { xXResQueryClientIdsReply rep = {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
@ -584,6 +594,8 @@ ProcXResQueryClientIds (ClientPtr client)
.numIds = ctx.numIds .numIds = ctx.numIds
}; };
assert((ctx.resultBytes & 3) == 0);
if (client->swapped) { if (client->swapped) {
swaps (&rep.sequenceNumber); swaps (&rep.sequenceNumber);
swapl (&rep.length); swapl (&rep.length);
@ -591,11 +603,9 @@ ProcXResQueryClientIds (ClientPtr client)
} }
WriteToClient(client, sizeof(rep), &rep); WriteToClient(client, sizeof(rep), &rep);
WriteToClient(client, ctx.resultBytes, buf); WriteFragmentsToClient(client, &ctx.response);
free(buf);
} }
out:
DestroyConstructClientIdCtx(&ctx); DestroyConstructClientIdCtx(&ctx);
return rc; return rc;
@ -632,11 +642,12 @@ static void
SwapXResQueryResourceBytes(struct xorg_list *response) SwapXResQueryResourceBytes(struct xorg_list *response)
{ {
struct xorg_list *it = response->next; struct xorg_list *it = response->next;
int c;
while (it != response) { while (it != response) {
xXResResourceSizeValue *value = FRAGMENT_DATA(it); xXResResourceSizeValue *value = FRAGMENT_DATA(it);
it = it->next; it = it->next;
for (int c = 0; c < value->numCrossReferences; ++c) { for (c = 0; c < value->numCrossReferences; ++c) {
xXResResourceSizeSpec *spec = FRAGMENT_DATA(it); xXResResourceSizeSpec *spec = FRAGMENT_DATA(it);
SwapXResResourceSizeSpec(spec); SwapXResResourceSizeSpec(spec);
it = it->next; it = it->next;
@ -839,7 +850,8 @@ static void
ConstructClientResourceBytes(ClientPtr aboutClient, ConstructClientResourceBytes(ClientPtr aboutClient,
ConstructResourceBytesCtx *ctx) ConstructResourceBytesCtx *ctx)
{ {
for (int specIdx = 0; specIdx < ctx->numSpecs; ++specIdx) { int specIdx;
for (specIdx = 0; specIdx < ctx->numSpecs; ++specIdx) {
xXResResourceIdSpec* spec = ctx->specs + specIdx; xXResResourceIdSpec* spec = ctx->specs + specIdx;
if (spec->resource) { if (spec->resource) {
/* these specs are handled elsewhere */ /* these specs are handled elsewhere */
@ -871,11 +883,15 @@ ConstructClientResourceBytes(ClientPtr aboutClient,
static void static void
ConstructResourceBytesByResource(XID aboutClient, ConstructResourceBytesCtx *ctx) ConstructResourceBytesByResource(XID aboutClient, ConstructResourceBytesCtx *ctx)
{ {
for (int specIdx = 0; specIdx < ctx->numSpecs; ++specIdx) { int specIdx;
for (specIdx = 0; specIdx < ctx->numSpecs; ++specIdx) {
xXResResourceIdSpec *spec = ctx->specs + specIdx; xXResResourceIdSpec *spec = ctx->specs + specIdx;
if (spec->resource) { if (spec->resource) {
ClientPtr client = dixClientForXID(spec->resource); int cid = CLIENT_ID(spec->resource);
if (client && (aboutClient == None || aboutClient == client->index)) { if (cid < currentMaxClients &&
(aboutClient == None || cid == aboutClient)) {
ClientPtr client = clients[cid];
if (client) {
ctx->curSpec = spec; ctx->curSpec = spec;
FindAllClientResources(client, FindAllClientResources(client,
AddResourceSizeValueByResource, AddResourceSizeValueByResource,
@ -883,6 +899,7 @@ ConstructResourceBytesByResource(XID aboutClient, ConstructResourceBytesCtx *ctx
} }
} }
} }
}
} }
/** @brief Build the resource size response for the given client /** @brief Build the resource size response for the given client
@ -898,12 +915,16 @@ ConstructResourceBytes(XID aboutClient,
ConstructResourceBytesCtx *ctx) ConstructResourceBytesCtx *ctx)
{ {
if (aboutClient) { if (aboutClient) {
ClientPtr client = dixClientForXID(aboutClient); int clientIdx = CLIENT_ID(aboutClient);
if (!client) { ClientPtr client = NullClient;
if ((clientIdx >= currentMaxClients) || !clients[clientIdx]) {
ctx->sendClient->errorValue = aboutClient; ctx->sendClient->errorValue = aboutClient;
return BadValue; return BadValue;
} }
client = clients[clientIdx];
ConstructClientResourceBytes(client, ctx); ConstructClientResourceBytes(client, ctx);
ConstructResourceBytesByResource(aboutClient, ctx); ConstructResourceBytesByResource(aboutClient, ctx);
} else { } else {
@ -931,9 +952,11 @@ static int
ProcXResQueryResourceBytes (ClientPtr client) ProcXResQueryResourceBytes (ClientPtr client)
{ {
REQUEST(xXResQueryResourceBytesReq); REQUEST(xXResQueryResourceBytesReq);
REQUEST_AT_LEAST_SIZE(xXResQueryResourceBytesReq);
int rc;
ConstructResourceBytesCtx ctx; ConstructResourceBytesCtx ctx;
REQUEST_AT_LEAST_SIZE(xXResQueryResourceBytesReq);
if (stuff->numSpecs > UINT32_MAX / sizeof(ctx.specs[0])) if (stuff->numSpecs > UINT32_MAX / sizeof(ctx.specs[0]))
return BadLength; return BadLength;
REQUEST_FIXED_SIZE(xXResQueryResourceBytesReq, REQUEST_FIXED_SIZE(xXResQueryResourceBytesReq,
@ -946,7 +969,7 @@ ProcXResQueryResourceBytes (ClientPtr client)
return BadAlloc; return BadAlloc;
} }
int rc = ConstructResourceBytes(stuff->client, &ctx); rc = ConstructResourceBytes(stuff->client, &ctx);
if (rc == Success) { if (rc == Success) {
xXResQueryResourceBytesReply rep = { xXResQueryResourceBytesReply rep = {
@ -964,24 +987,10 @@ ProcXResQueryResourceBytes (ClientPtr client)
SwapXResQueryResourceBytes(&ctx.response); SwapXResQueryResourceBytes(&ctx.response);
} }
char *buf = calloc(1, ctx.resultBytes);
if (!buf) {
rc = BadAlloc;
goto out;
}
char *walk = buf;
FragmentList *it;
xorg_list_for_each_entry(it, &ctx.response, l) {
memcpy(walk, FRAGMENT_DATA(it), it->bytes);
walk += it->bytes;
}
WriteToClient(client, sizeof(rep), &rep); WriteToClient(client, sizeof(rep), &rep);
WriteToClient(client, ctx.resultBytes, buf); WriteFragmentsToClient(client, &ctx.response);
free(buf);
} }
out:
DestroyConstructResourceBytesCtx(&ctx); DestroyConstructResourceBytesCtx(&ctx);
return rc; return rc;

View File

@ -21,13 +21,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/property_priv.h" #include "dix/property_priv.h"
#include "dix/selection_priv.h"
#include "miext/extinit_priv.h"
#include "selection.h"
#include "inputstr.h" #include "inputstr.h"
#include "windowstr.h" #include "windowstr.h"
#include "propertyst.h" #include "propertyst.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "extinit_priv.h"
#include "xselinuxint.h" #include "xselinuxint.h"
#define CTX_DEV offsetof(SELinuxSubjectRec, dev_create_sid) #define CTX_DEV offsetof(SELinuxSubjectRec, dev_create_sid)
@ -55,7 +55,7 @@ int selinuxEnforcingState = SELINUX_MODE_DEFAULT;
static char * static char *
SELinuxCopyContext(char *ptr, unsigned len) SELinuxCopyContext(char *ptr, unsigned len)
{ {
char *copy = calloc(1, len + 1); char *copy = malloc(len + 1);
if (!copy) if (!copy)
return NULL; return NULL;
@ -298,7 +298,7 @@ ProcSELinuxGetClientContext(ClientPtr client)
REQUEST(SELinuxGetContextReq); REQUEST(SELinuxGetContextReq);
REQUEST_SIZE_MATCH(SELinuxGetContextReq); REQUEST_SIZE_MATCH(SELinuxGetContextReq);
rc = dixLookupResourceOwner(&target, stuff->id, client, DixGetAttrAccess); rc = dixLookupClient(&target, stuff->id, client, DixGetAttrAccess);
if (rc != Success) if (rc != Success)
return rc; return rc;
@ -313,8 +313,6 @@ SELinuxPopulateItem(SELinuxListItemRec * i, PrivateRec ** privPtr, CARD32 id,
SELinuxObjectRec *obj = dixLookupPrivate(privPtr, objectKey); SELinuxObjectRec *obj = dixLookupPrivate(privPtr, objectKey);
SELinuxObjectRec *data = dixLookupPrivate(privPtr, dataKey); SELinuxObjectRec *data = dixLookupPrivate(privPtr, dataKey);
if (!i)
return BadValue;
if (avc_sid_to_context_raw(obj->sid, &i->octx) < 0) if (avc_sid_to_context_raw(obj->sid, &i->octx) < 0)
return BadValue; return BadValue;
if (avc_sid_to_context_raw(data->sid, &i->dctx) < 0) if (avc_sid_to_context_raw(data->sid, &i->dctx) < 0)
@ -333,9 +331,6 @@ SELinuxFreeItems(SELinuxListItemRec * items, int count)
{ {
int k; int k;
if (!items)
return;
for (k = 0; k < count; k++) { for (k = 0; k < count; k++) {
freecon(items[k].octx); freecon(items[k].octx);
freecon(items[k].dctx); freecon(items[k].dctx);
@ -353,9 +348,6 @@ SELinuxSendItemsToClient(ClientPtr client, SELinuxListItemRec * items,
goto out; goto out;
} }
if (!buf) // silence analyzer warning
goto sendreply;
/* Fill in the buffer */ /* Fill in the buffer */
for (k = 0; k < count; k++) { for (k = 0; k < count; k++) {
buf[pos] = items[k].id; buf[pos] = items[k].id;
@ -379,7 +371,6 @@ SELinuxSendItemsToClient(ClientPtr client, SELinuxListItemRec * items,
pos += items[k].dctx_len; pos += items[k].dctx_len;
} }
sendreply: ;
/* Send reply to client */ /* Send reply to client */
SELinuxListItemsReply rep = { SELinuxListItemsReply rep = {
.type = X_Reply, .type = X_Reply,
@ -423,7 +414,7 @@ ProcSELinuxListProperties(ClientPtr client)
/* Count the number of properties and allocate items */ /* Count the number of properties and allocate items */
count = 0; count = 0;
for (pProp = pWin->properties; pProp; pProp = pProp->next) for (pProp = wUserProps(pWin); pProp; pProp = pProp->next)
count++; count++;
items = calloc(count, sizeof(SELinuxListItemRec)); items = calloc(count, sizeof(SELinuxListItemRec));
if (count && !items) if (count && !items)
@ -432,7 +423,7 @@ ProcSELinuxListProperties(ClientPtr client)
/* Fill in the items and calculate size */ /* Fill in the items and calculate size */
i = 0; i = 0;
size = 0; size = 0;
for (pProp = pWin->properties; pProp; pProp = pProp->next) { for (pProp = wUserProps(pWin); pProp; pProp = pProp->next) {
id = pProp->propertyName; id = pProp->propertyName;
rc = SELinuxPopulateItem(items + i, &pProp->devPrivates, id, &size); rc = SELinuxPopulateItem(items + i, &pProp->devPrivates, id, &size);
if (rc != Success) { if (rc != Success) {

View File

@ -32,12 +32,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include <X11/Xfuncproto.h> #include <X11/Xfuncproto.h>
#include "dix/input_priv.h"
#include "dix/registry_priv.h" #include "dix/registry_priv.h"
#include "dix/resource_priv.h"
#include "dix/selection_priv.h"
#include "os/client_priv.h" #include "os/client_priv.h"
#include "selection.h"
#include "inputstr.h" #include "inputstr.h"
#include "scrnintstr.h" #include "scrnintstr.h"
#include "windowstr.h" #include "windowstr.h"
@ -632,10 +630,7 @@ SELinuxResource(CallbackListPtr *pcbl, void *unused, void *calldata)
if (offset < 0) { if (offset < 0) {
/* No: use the SID of the owning client */ /* No: use the SID of the owning client */
class = SECCLASS_X_RESOURCE; class = SECCLASS_X_RESOURCE;
ClientPtr owner = dixClientForXID(rec->id); privatePtr = &clients[CLIENT_ID(rec->id)]->devPrivates;
if (!owner)
return;
privatePtr = &owner->devPrivates;
obj = dixLookupPrivate(privatePtr, objectKey); obj = dixLookupPrivate(privatePtr, objectKey);
} }
else { else {
@ -776,7 +771,7 @@ SELinuxResourceState(CallbackListPtr *pcbl, void *unused, void *calldata)
return; return;
pWin = (WindowPtr) rec->value; pWin = (WindowPtr) rec->value;
subj = dixLookupPrivate(&dixClientForWindow(pWin)->devPrivates, subjectKey); subj = dixLookupPrivate(&wClient(pWin)->devPrivates, subjectKey);
if (subj->sid) { if (subj->sid) {
char *ctx; char *ctx;

View File

@ -40,11 +40,8 @@
#include "dix/exevents_priv.h" #include "dix/exevents_priv.h"
#include "mi/mi_priv.h" #include "mi/mi_priv.h"
#include "mi/mipointer_priv.h" #include "mi/mipointer_priv.h"
#include "miext/extinit_priv.h"
#include "os/client_priv.h" #include "os/client_priv.h"
#include "os/osdep.h" #include "os/osdep.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "misc.h" #include "misc.h"
#include "os.h" #include "os.h"
@ -53,6 +50,7 @@
#include "windowstr.h" #include "windowstr.h"
#include "inputstr.h" #include "inputstr.h"
#include "scrnintstr.h" #include "scrnintstr.h"
#include "dixevents.h"
#include "sleepuntil.h" #include "sleepuntil.h"
#include "xkbsrv.h" #include "xkbsrv.h"
#include "xkbstr.h" #include "xkbstr.h"
@ -61,6 +59,7 @@
#include "xserver-properties.h" #include "xserver-properties.h"
#include "eventstr.h" #include "eventstr.h"
#include "inpututils.h" #include "inpututils.h"
#include "extinit_priv.h"
Bool noTestExtensions = FALSE; Bool noTestExtensions = FALSE;
@ -82,6 +81,11 @@ static InternalEvent *xtest_evlist;
*/ */
DeviceIntPtr xtestpointer, xtestkeyboard; DeviceIntPtr xtestpointer, xtestkeyboard;
#ifdef XINERAMA
#include "panoramiX.h"
#include "panoramiXsrv.h"
#endif /* XINERAMA */
static int XTestSwapFakeInput(ClientPtr /* client */ , static int XTestSwapFakeInput(ClientPtr /* client */ ,
xReq * /* req */ xReq * /* req */
); );
@ -128,7 +132,7 @@ ProcXTestCompareCursor(ClientPtr client)
if (stuff->cursor == None) if (stuff->cursor == None)
pCursor = NullCursor; pCursor = NullCursor;
else if (stuff->cursor == XTestCurrentCursor) else if (stuff->cursor == XTestCurrentCursor)
pCursor = InputDevGetSpriteCursor(ptr); pCursor = GetSpriteCursor(ptr);
else { else {
rc = dixLookupResourceByType((void **) &pCursor, stuff->cursor, rc = dixLookupResourceByType((void **) &pCursor, stuff->cursor,
X11_RESTYPE_CURSOR, client, DixReadAccess); X11_RESTYPE_CURSOR, client, DixReadAccess);
@ -381,7 +385,7 @@ ProcXTestFakeInput(ClientPtr client)
switch (type) { switch (type) {
case KeyPress: case KeyPress:
case KeyRelease: case KeyRelease:
if ((!dev) || (!dev->key)) if (!dev->key)
return BadDevice; return BadDevice;
if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code || if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
@ -393,7 +397,7 @@ ProcXTestFakeInput(ClientPtr client)
need_ptr_update = 0; need_ptr_update = 0;
break; break;
case MotionNotify: case MotionNotify:
if (!dev || !dev->valuator) if (!dev->valuator)
return BadDevice; return BadDevice;
if (!(extension || ev->u.keyButtonPointer.root == None)) { if (!(extension || ev->u.keyButtonPointer.root == None)) {
@ -424,7 +428,7 @@ ProcXTestFakeInput(ClientPtr client)
break; break;
case ButtonPress: case ButtonPress:
case ButtonRelease: case ButtonRelease:
if (!dev || !dev->button) if (!dev->button)
return BadDevice; return BadDevice;
if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons) { if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons) {
@ -438,7 +442,7 @@ ProcXTestFakeInput(ClientPtr client)
valuator_mask_set_range(&mask, firstValuator, numValuators, valuators); valuator_mask_set_range(&mask, firstValuator, numValuators, valuators);
if (dev && dev->sendEventsProc) if (dev->sendEventsProc)
(*dev->sendEventsProc) (dev, type, ev->u.u.detail, flags, &mask); (*dev->sendEventsProc) (dev, type, ev->u.u.detail, flags, &mask);
if (need_ptr_update) if (need_ptr_update)
@ -647,7 +651,7 @@ AllocXTestDevice(ClientPtr client, const char *name,
BOOL BOOL
IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master) IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
{ {
if (InputDevIsMaster(dev)) if (IsMaster(dev))
return FALSE; return FALSE;
/* deviceid 0 is reserved for XIAllDevices, non-zero mid means XTest /* deviceid 0 is reserved for XIAllDevices, non-zero mid means XTest

View File

@ -32,8 +32,6 @@ SOFTWARE.
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "Xext/xvdix_priv.h" #include "Xext/xvdix_priv.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "misc.h" #include "misc.h"
#include "scrnintstr.h" #include "scrnintstr.h"
@ -51,6 +49,9 @@ SOFTWARE.
#include "xvdisp.h" #include "xvdisp.h"
#ifdef XINERAMA #ifdef XINERAMA
#include "panoramiX.h"
#include "panoramiXsrv.h"
unsigned long XvXRTPort; unsigned long XvXRTPort;
#endif /* XINERAMA */ #endif /* XINERAMA */
@ -320,6 +321,7 @@ ProcXvQueryAdaptors(ClientPtr client)
{ {
xvFormat format; xvFormat format;
xvAdaptorInfo ainfo; xvAdaptorInfo ainfo;
xvQueryAdaptorsReply rep;
int totalSize, na, nf, rc; int totalSize, na, nf, rc;
int nameSize; int nameSize;
XvAdaptorPtr pa; XvAdaptorPtr pa;
@ -335,20 +337,27 @@ ProcXvQueryAdaptors(ClientPtr client)
if (rc != Success) if (rc != Success)
return rc; return rc;
xvQueryAdaptorsReply rep = {
.type = X_Reply,
.sequenceNumber = client->sequence,
};
pScreen = pWin->drawable.pScreen; pScreen = pWin->drawable.pScreen;
pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
XvGetScreenKey()); XvGetScreenKey());
if (!pxvs) { if (!pxvs) {
rep = (xvQueryAdaptorsReply) {
.type = X_Reply,
.sequenceNumber = client->sequence,
.length = 0,
.num_adaptors = 0
};
_WriteQueryAdaptorsReply(client, &rep); _WriteQueryAdaptorsReply(client, &rep);
return Success; return Success;
} }
rep.num_adaptors = pxvs->nAdaptors; rep = (xvQueryAdaptorsReply) {
.type = X_Reply,
.sequenceNumber = client->sequence,
.num_adaptors = pxvs->nAdaptors
};
/* CALCULATE THE TOTAL SIZE OF THE REPLY IN BYTES */ /* CALCULATE THE TOTAL SIZE OF THE REPLY IN BYTES */
@ -402,6 +411,7 @@ static int
ProcXvQueryEncodings(ClientPtr client) ProcXvQueryEncodings(ClientPtr client)
{ {
xvEncodingInfo einfo; xvEncodingInfo einfo;
xvQueryEncodingsReply rep;
int totalSize; int totalSize;
int nameSize; int nameSize;
XvPortPtr pPort; XvPortPtr pPort;
@ -413,6 +423,12 @@ ProcXvQueryEncodings(ClientPtr client)
VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess); VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
rep = (xvQueryEncodingsReply) {
.type = X_Reply,
.sequenceNumber = client->sequence,
.num_encodings = pPort->pAdaptor->nEncodings
};
/* FOR EACH ENCODING ADD UP THE BYTES FOR ENCODING NAMES */ /* FOR EACH ENCODING ADD UP THE BYTES FOR ENCODING NAMES */
ne = pPort->pAdaptor->nEncodings; ne = pPort->pAdaptor->nEncodings;
@ -423,12 +439,7 @@ ProcXvQueryEncodings(ClientPtr client)
pe++; pe++;
} }
xvQueryEncodingsReply rep = { rep.length = bytes_to_int32(totalSize);
.type = X_Reply,
.sequenceNumber = client->sequence,
.num_encodings = pPort->pAdaptor->nEncodings,
.length = bytes_to_int32(totalSize),
};
_WriteQueryEncodingsReply(client, &rep); _WriteQueryEncodingsReply(client, &rep);
@ -450,7 +461,7 @@ ProcXvQueryEncodings(ClientPtr client)
} }
static int static int
SingleXvPutVideo(ClientPtr client) ProcXvPutVideo(ClientPtr client)
{ {
DrawablePtr pDraw; DrawablePtr pDraw;
XvPortPtr pPort; XvPortPtr pPort;
@ -479,20 +490,8 @@ SingleXvPutVideo(ClientPtr client)
stuff->drw_w, stuff->drw_h); stuff->drw_w, stuff->drw_h);
} }
static int XineramaXvPutVideo(ClientPtr client);
static int static int
ProcXvPutVideo(ClientPtr client) ProcXvPutStill(ClientPtr client)
{
#ifdef XINERAMA
if (xvUseXinerama)
return XineramaXvPutVideo(client);
#endif
return SingleXvPutVideo(client);
}
static int
SingleXvPutStill(ClientPtr client)
{ {
DrawablePtr pDraw; DrawablePtr pDraw;
XvPortPtr pPort; XvPortPtr pPort;
@ -521,18 +520,6 @@ SingleXvPutStill(ClientPtr client)
stuff->drw_w, stuff->drw_h); stuff->drw_w, stuff->drw_h);
} }
static int XineramaXvPutStill(ClientPtr client);
static int
ProcXvPutStill(ClientPtr client)
{
#ifdef XINERAMA
if (xvUseXinerama)
return XineramaXvPutStill(client);
#endif
return SingleXvPutStill(client);
}
static int static int
ProcXvGetVideo(ClientPtr client) ProcXvGetVideo(ClientPtr client)
{ {
@ -628,6 +615,7 @@ ProcXvGrabPort(ClientPtr client)
{ {
int result, status; int result, status;
XvPortPtr pPort; XvPortPtr pPort;
xvGrabPortReply rep;
REQUEST(xvGrabPortReq); REQUEST(xvGrabPortReq);
REQUEST_SIZE_MATCH(xvGrabPortReq); REQUEST_SIZE_MATCH(xvGrabPortReq);
@ -639,9 +627,10 @@ ProcXvGrabPort(ClientPtr client)
if (status != Success) { if (status != Success) {
return status; return status;
} }
xvGrabPortReply rep = { rep = (xvGrabPortReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.result = result .result = result
}; };
@ -664,7 +653,7 @@ ProcXvUngrabPort(ClientPtr client)
} }
static int static int
SingleXvStopVideo(ClientPtr client) ProcXvStopVideo(ClientPtr client)
{ {
int ret; int ret;
DrawablePtr pDraw; DrawablePtr pDraw;
@ -682,20 +671,8 @@ SingleXvStopVideo(ClientPtr client)
return XvdiStopVideo(client, pPort, pDraw); return XvdiStopVideo(client, pPort, pDraw);
} }
static int XineramaXvStopVideo(ClientPtr client);
static int static int
ProcXvStopVideo(ClientPtr client) ProcXvSetPortAttribute(ClientPtr client)
{
#ifdef XINERAMA
if (xvUseXinerama)
return XineramaXvStopVideo(client);
#endif
return SingleXvStopVideo(client);
}
static int
SingleXvSetPortAttribute(ClientPtr client)
{ {
int status; int status;
XvPortPtr pPort; XvPortPtr pPort;
@ -721,24 +698,13 @@ SingleXvSetPortAttribute(ClientPtr client)
return status; return status;
} }
static int XineramaXvSetPortAttribute(ClientPtr client);
static int
ProcXvSetPortAttribute(ClientPtr client)
{
#ifdef XINERAMA
if (xvUseXinerama)
return XineramaXvSetPortAttribute(client);
#endif
return SingleXvSetPortAttribute(client);
}
static int static int
ProcXvGetPortAttribute(ClientPtr client) ProcXvGetPortAttribute(ClientPtr client)
{ {
INT32 value; INT32 value;
int status; int status;
XvPortPtr pPort; XvPortPtr pPort;
xvGetPortAttributeReply rep;
REQUEST(xvGetPortAttributeReq); REQUEST(xvGetPortAttributeReq);
REQUEST_SIZE_MATCH(xvGetPortAttributeReq); REQUEST_SIZE_MATCH(xvGetPortAttributeReq);
@ -756,9 +722,10 @@ ProcXvGetPortAttribute(ClientPtr client)
return status; return status;
} }
xvGetPortAttributeReply rep = { rep = (xvGetPortAttributeReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.value = value .value = value
}; };
@ -772,6 +739,7 @@ ProcXvQueryBestSize(ClientPtr client)
{ {
unsigned int actual_width, actual_height; unsigned int actual_width, actual_height;
XvPortPtr pPort; XvPortPtr pPort;
xvQueryBestSizeReply rep;
REQUEST(xvQueryBestSizeReq); REQUEST(xvQueryBestSizeReq);
REQUEST_SIZE_MATCH(xvQueryBestSizeReq); REQUEST_SIZE_MATCH(xvQueryBestSizeReq);
@ -783,9 +751,10 @@ ProcXvQueryBestSize(ClientPtr client)
stuff->drw_w, stuff->drw_h, stuff->drw_w, stuff->drw_h,
&actual_width, &actual_height); &actual_width, &actual_height);
xvQueryBestSizeReply rep = { rep = (xvQueryBestSizeReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.actual_width = actual_width, .actual_width = actual_width,
.actual_height = actual_height .actual_height = actual_height
}; };
@ -801,6 +770,7 @@ ProcXvQueryPortAttributes(ClientPtr client)
int size, i; int size, i;
XvPortPtr pPort; XvPortPtr pPort;
XvAttributePtr pAtt; XvAttributePtr pAtt;
xvQueryPortAttributesReply rep;
xvAttributeInfo Info; xvAttributeInfo Info;
REQUEST(xvQueryPortAttributesReq); REQUEST(xvQueryPortAttributesReq);
@ -808,10 +778,11 @@ ProcXvQueryPortAttributes(ClientPtr client)
VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess); VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
xvQueryPortAttributesReply rep = { rep = (xvQueryPortAttributesReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.num_attributes = pPort->pAdaptor->nAttributes, .num_attributes = pPort->pAdaptor->nAttributes,
.text_size = 0
}; };
for (i = 0, pAtt = pPort->pAdaptor->pAttributes; for (i = 0, pAtt = pPort->pAdaptor->pAttributes;
@ -842,7 +813,7 @@ ProcXvQueryPortAttributes(ClientPtr client)
} }
static int static int
SingleXvPutImage(ClientPtr client) ProcXvPutImage(ClientPtr client)
{ {
DrawablePtr pDraw; DrawablePtr pDraw;
XvPortPtr pPort; XvPortPtr pPort;
@ -898,23 +869,10 @@ SingleXvPutImage(ClientPtr client)
stuff->width, stuff->height); stuff->width, stuff->height);
} }
static int
XineramaXvPutImage(ClientPtr client);
static int
ProcXvPutImage(ClientPtr client)
{
#ifdef XINERAMA
if (xvUseXinerama)
return XineramaXvPutImage(client);
#endif
return SingleXvPutImage(client);
}
#ifdef MITSHM #ifdef MITSHM
static int static int
SingleXvShmPutImage(ClientPtr client) ProcXvShmPutImage(ClientPtr client)
{ {
ShmDescPtr shmdesc; ShmDescPtr shmdesc;
DrawablePtr pDraw; DrawablePtr pDraw;
@ -987,24 +945,13 @@ SingleXvShmPutImage(ClientPtr client)
return status; return status;
} }
#else /* !MITSHM */
static int XineramaXvShmPutImage(ClientPtr client);
#endif /* MITSHM */
static int static int
ProcXvShmPutImage(ClientPtr client) ProcXvShmPutImage(ClientPtr client)
{ {
#ifdef MITSHM
#ifdef XINERAMA
if (xvUseXinerama)
return XineramaXvShmPutImage(client);
#endif
return SingleXvShmPutImage(client);
#else
return BadImplementation; return BadImplementation;
#endif
} }
#endif
#ifdef XvMCExtension #ifdef XvMCExtension
#include "xvmcext.h" #include "xvmcext.h"
@ -1018,8 +965,9 @@ ProcXvQueryImageAttributes(ClientPtr client)
CARD16 width, height; CARD16 width, height;
XvImagePtr pImage = NULL; XvImagePtr pImage = NULL;
XvPortPtr pPort; XvPortPtr pPort;
int32_t *offsets; int *offsets;
int32_t *pitches; int *pitches;
int planeLength;
REQUEST(xvQueryImageAttributesReq); REQUEST(xvQueryImageAttributesReq);
@ -1044,9 +992,7 @@ ProcXvQueryImageAttributes(ClientPtr client)
num_planes = pImage->num_planes; num_planes = pImage->num_planes;
// allocating for `offsets` as well as `pitches` in one block if (!(offsets = malloc(num_planes << 3)))
// both having CARD32 * num_planes (actually int32_t put into CARD32)
if (!(offsets = calloc(num_planes*2, sizeof(CARD32))))
return BadAlloc; return BadAlloc;
pitches = offsets + num_planes; pitches = offsets + num_planes;
@ -1060,7 +1006,7 @@ ProcXvQueryImageAttributes(ClientPtr client)
rep = (xvQueryImageAttributesReply) { rep = (xvQueryImageAttributesReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = num_planes * 2, // in 32bit units .length = planeLength = num_planes << 1,
.num_planes = num_planes, .num_planes = num_planes,
.width = width, .width = width,
.height = height, .height = height,
@ -1069,8 +1015,8 @@ ProcXvQueryImageAttributes(ClientPtr client)
_WriteQueryImageAttributesReply(client, &rep); _WriteQueryImageAttributesReply(client, &rep);
if (client->swapped) if (client->swapped)
SwapLongs((CARD32 *) offsets, rep.length); SwapLongs((CARD32 *) offsets, planeLength);
WriteToClient(client, rep.length * sizeof(CARD32), offsets); WriteToClient(client, planeLength << 2, offsets);
free(offsets); free(offsets);
@ -1083,6 +1029,7 @@ ProcXvListImageFormats(ClientPtr client)
XvPortPtr pPort; XvPortPtr pPort;
XvImagePtr pImage; XvImagePtr pImage;
int i; int i;
xvListImageFormatsReply rep;
xvImageFormatInfo info; xvImageFormatInfo info;
REQUEST(xvListImageFormatsReq); REQUEST(xvListImageFormatsReq);
@ -1091,7 +1038,7 @@ ProcXvListImageFormats(ClientPtr client)
VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess); VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
xvListImageFormatsReply rep = { rep = (xvListImageFormatsReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.num_formats = pPort->pAdaptor->nImages, .num_formats = pPort->pAdaptor->nImages,
@ -1132,6 +1079,26 @@ ProcXvListImageFormats(ClientPtr client)
return Success; return Success;
} }
static int (*XvProcVector[xvNumRequests]) (ClientPtr) = {
ProcXvQueryExtension,
ProcXvQueryAdaptors,
ProcXvQueryEncodings,
ProcXvGrabPort,
ProcXvUngrabPort,
ProcXvPutVideo,
ProcXvPutStill,
ProcXvGetVideo,
ProcXvGetStill,
ProcXvStopVideo,
ProcXvSelectVideoNotify,
ProcXvSelectPortNotify,
ProcXvQueryBestSize,
ProcXvSetPortAttribute,
ProcXvGetPortAttribute,
ProcXvQueryPortAttributes,
ProcXvListImageFormats,
ProcXvQueryImageAttributes, ProcXvPutImage, ProcXvShmPutImage,};
int int
ProcXvDispatch(ClientPtr client) ProcXvDispatch(ClientPtr client)
{ {
@ -1139,50 +1106,11 @@ ProcXvDispatch(ClientPtr client)
UpdateCurrentTime(); UpdateCurrentTime();
switch (stuff->data) { if (stuff->data >= xvNumRequests) {
case xv_QueryExtension:
return ProcXvQueryExtension(client);
case xv_QueryAdaptors:
return ProcXvQueryAdaptors(client);
case xv_QueryEncodings:
return ProcXvQueryEncodings(client);
case xv_GrabPort:
return ProcXvGrabPort(client);
case xv_UngrabPort:
return ProcXvUngrabPort(client);
case xv_PutVideo:
return ProcXvPutVideo(client);
case xv_PutStill:
return ProcXvPutStill(client);
case xv_GetVideo:
return ProcXvGetVideo(client);
case xv_GetStill:
return ProcXvGetStill(client);
case xv_StopVideo:
return ProcXvStopVideo(client);
case xv_SelectVideoNotify:
return ProcXvSelectVideoNotify(client);
case xv_SelectPortNotify:
return ProcXvSelectPortNotify(client);
case xv_QueryBestSize:
return ProcXvQueryBestSize(client);
case xv_SetPortAttribute:
return ProcXvSetPortAttribute(client);
case xv_GetPortAttribute:
return ProcXvGetPortAttribute(client);
case xv_QueryPortAttributes:
return ProcXvQueryPortAttributes(client);
case xv_ListImageFormats:
return ProcXvListImageFormats(client);
case xv_QueryImageAttributes:
return ProcXvQueryImageAttributes(client);
case xv_PutImage:
return ProcXvPutImage(client);
case xv_ShmPutImage:
return ProcXvShmPutImage(client);
default:
return BadRequest; return BadRequest;
} }
return XvProcVector[stuff->data] (client);
} }
/* Swapped Procs */ /* Swapped Procs */
@ -1193,7 +1121,7 @@ SProcXvQueryAdaptors(ClientPtr client)
REQUEST(xvQueryAdaptorsReq); REQUEST(xvQueryAdaptorsReq);
REQUEST_SIZE_MATCH(xvQueryAdaptorsReq); REQUEST_SIZE_MATCH(xvQueryAdaptorsReq);
swapl(&stuff->window); swapl(&stuff->window);
return ProcXvQueryAdaptors(client); return XvProcVector[xv_QueryAdaptors] (client);
} }
static int _X_COLD static int _X_COLD
@ -1202,7 +1130,7 @@ SProcXvQueryEncodings(ClientPtr client)
REQUEST(xvQueryEncodingsReq); REQUEST(xvQueryEncodingsReq);
REQUEST_SIZE_MATCH(xvQueryEncodingsReq); REQUEST_SIZE_MATCH(xvQueryEncodingsReq);
swapl(&stuff->port); swapl(&stuff->port);
return ProcXvQueryEncodings(client); return XvProcVector[xv_QueryEncodings] (client);
} }
static int _X_COLD static int _X_COLD
@ -1212,7 +1140,7 @@ SProcXvGrabPort(ClientPtr client)
REQUEST_SIZE_MATCH(xvGrabPortReq); REQUEST_SIZE_MATCH(xvGrabPortReq);
swapl(&stuff->port); swapl(&stuff->port);
swapl(&stuff->time); swapl(&stuff->time);
return ProcXvGrabPort(client); return XvProcVector[xv_GrabPort] (client);
} }
static int _X_COLD static int _X_COLD
@ -1222,7 +1150,7 @@ SProcXvUngrabPort(ClientPtr client)
REQUEST_SIZE_MATCH(xvUngrabPortReq); REQUEST_SIZE_MATCH(xvUngrabPortReq);
swapl(&stuff->port); swapl(&stuff->port);
swapl(&stuff->time); swapl(&stuff->time);
return ProcXvUngrabPort(client); return XvProcVector[xv_UngrabPort] (client);
} }
static int _X_COLD static int _X_COLD
@ -1241,7 +1169,7 @@ SProcXvPutVideo(ClientPtr client)
swaps(&stuff->drw_y); swaps(&stuff->drw_y);
swaps(&stuff->drw_w); swaps(&stuff->drw_w);
swaps(&stuff->drw_h); swaps(&stuff->drw_h);
return ProcXvPutVideo(client); return XvProcVector[xv_PutVideo] (client);
} }
static int _X_COLD static int _X_COLD
@ -1260,7 +1188,7 @@ SProcXvPutStill(ClientPtr client)
swaps(&stuff->drw_y); swaps(&stuff->drw_y);
swaps(&stuff->drw_w); swaps(&stuff->drw_w);
swaps(&stuff->drw_h); swaps(&stuff->drw_h);
return ProcXvPutStill(client); return XvProcVector[xv_PutStill] (client);
} }
static int _X_COLD static int _X_COLD
@ -1279,7 +1207,7 @@ SProcXvGetVideo(ClientPtr client)
swaps(&stuff->drw_y); swaps(&stuff->drw_y);
swaps(&stuff->drw_w); swaps(&stuff->drw_w);
swaps(&stuff->drw_h); swaps(&stuff->drw_h);
return ProcXvGetVideo(client); return XvProcVector[xv_GetVideo] (client);
} }
static int _X_COLD static int _X_COLD
@ -1298,7 +1226,7 @@ SProcXvGetStill(ClientPtr client)
swaps(&stuff->drw_y); swaps(&stuff->drw_y);
swaps(&stuff->drw_w); swaps(&stuff->drw_w);
swaps(&stuff->drw_h); swaps(&stuff->drw_h);
return ProcXvGetStill(client); return XvProcVector[xv_GetStill] (client);
} }
static int _X_COLD static int _X_COLD
@ -1320,7 +1248,7 @@ SProcXvPutImage(ClientPtr client)
swaps(&stuff->drw_h); swaps(&stuff->drw_h);
swaps(&stuff->width); swaps(&stuff->width);
swaps(&stuff->height); swaps(&stuff->height);
return ProcXvPutImage(client); return XvProcVector[xv_PutImage] (client);
} }
#ifdef MITSHM #ifdef MITSHM
@ -1345,7 +1273,7 @@ SProcXvShmPutImage(ClientPtr client)
swaps(&stuff->drw_h); swaps(&stuff->drw_h);
swaps(&stuff->width); swaps(&stuff->width);
swaps(&stuff->height); swaps(&stuff->height);
return ProcXvShmPutImage(client); return XvProcVector[xv_ShmPutImage] (client);
} }
#else /* MITSHM */ #else /* MITSHM */
#define SProcXvShmPutImage ProcXvShmPutImage #define SProcXvShmPutImage ProcXvShmPutImage
@ -1357,7 +1285,7 @@ SProcXvSelectVideoNotify(ClientPtr client)
REQUEST(xvSelectVideoNotifyReq); REQUEST(xvSelectVideoNotifyReq);
REQUEST_SIZE_MATCH(xvSelectVideoNotifyReq); REQUEST_SIZE_MATCH(xvSelectVideoNotifyReq);
swapl(&stuff->drawable); swapl(&stuff->drawable);
return ProcXvSelectVideoNotify(client); return XvProcVector[xv_SelectVideoNotify] (client);
} }
static int _X_COLD static int _X_COLD
@ -1366,7 +1294,7 @@ SProcXvSelectPortNotify(ClientPtr client)
REQUEST(xvSelectPortNotifyReq); REQUEST(xvSelectPortNotifyReq);
REQUEST_SIZE_MATCH(xvSelectPortNotifyReq); REQUEST_SIZE_MATCH(xvSelectPortNotifyReq);
swapl(&stuff->port); swapl(&stuff->port);
return ProcXvSelectPortNotify(client); return XvProcVector[xv_SelectPortNotify] (client);
} }
static int _X_COLD static int _X_COLD
@ -1376,7 +1304,7 @@ SProcXvStopVideo(ClientPtr client)
REQUEST_SIZE_MATCH(xvStopVideoReq); REQUEST_SIZE_MATCH(xvStopVideoReq);
swapl(&stuff->port); swapl(&stuff->port);
swapl(&stuff->drawable); swapl(&stuff->drawable);
return ProcXvStopVideo(client); return XvProcVector[xv_StopVideo] (client);
} }
static int _X_COLD static int _X_COLD
@ -1387,7 +1315,7 @@ SProcXvSetPortAttribute(ClientPtr client)
swapl(&stuff->port); swapl(&stuff->port);
swapl(&stuff->attribute); swapl(&stuff->attribute);
swapl(&stuff->value); swapl(&stuff->value);
return ProcXvSetPortAttribute(client); return XvProcVector[xv_SetPortAttribute] (client);
} }
static int _X_COLD static int _X_COLD
@ -1397,7 +1325,7 @@ SProcXvGetPortAttribute(ClientPtr client)
REQUEST_SIZE_MATCH(xvGetPortAttributeReq); REQUEST_SIZE_MATCH(xvGetPortAttributeReq);
swapl(&stuff->port); swapl(&stuff->port);
swapl(&stuff->attribute); swapl(&stuff->attribute);
return ProcXvGetPortAttribute(client); return XvProcVector[xv_GetPortAttribute] (client);
} }
static int _X_COLD static int _X_COLD
@ -1410,7 +1338,7 @@ SProcXvQueryBestSize(ClientPtr client)
swaps(&stuff->vid_h); swaps(&stuff->vid_h);
swaps(&stuff->drw_w); swaps(&stuff->drw_w);
swaps(&stuff->drw_h); swaps(&stuff->drw_h);
return ProcXvQueryBestSize(client); return XvProcVector[xv_QueryBestSize] (client);
} }
static int _X_COLD static int _X_COLD
@ -1419,7 +1347,7 @@ SProcXvQueryPortAttributes(ClientPtr client)
REQUEST(xvQueryPortAttributesReq); REQUEST(xvQueryPortAttributesReq);
REQUEST_SIZE_MATCH(xvQueryPortAttributesReq); REQUEST_SIZE_MATCH(xvQueryPortAttributesReq);
swapl(&stuff->port); swapl(&stuff->port);
return ProcXvQueryPortAttributes(client); return XvProcVector[xv_QueryPortAttributes] (client);
} }
static int _X_COLD static int _X_COLD
@ -1431,7 +1359,7 @@ SProcXvQueryImageAttributes(ClientPtr client)
swapl(&stuff->id); swapl(&stuff->id);
swaps(&stuff->width); swaps(&stuff->width);
swaps(&stuff->height); swaps(&stuff->height);
return ProcXvQueryImageAttributes(client); return XvProcVector[xv_QueryImageAttributes] (client);
} }
static int _X_COLD static int _X_COLD
@ -1440,9 +1368,29 @@ SProcXvListImageFormats(ClientPtr client)
REQUEST(xvListImageFormatsReq); REQUEST(xvListImageFormatsReq);
REQUEST_SIZE_MATCH(xvListImageFormatsReq); REQUEST_SIZE_MATCH(xvListImageFormatsReq);
swapl(&stuff->port); swapl(&stuff->port);
return ProcXvListImageFormats(client); return XvProcVector[xv_ListImageFormats] (client);
} }
static int (*SXvProcVector[xvNumRequests]) (ClientPtr) = {
ProcXvQueryExtension,
SProcXvQueryAdaptors,
SProcXvQueryEncodings,
SProcXvGrabPort,
SProcXvUngrabPort,
SProcXvPutVideo,
SProcXvPutStill,
SProcXvGetVideo,
SProcXvGetStill,
SProcXvStopVideo,
SProcXvSelectVideoNotify,
SProcXvSelectPortNotify,
SProcXvQueryBestSize,
SProcXvSetPortAttribute,
SProcXvGetPortAttribute,
SProcXvQueryPortAttributes,
SProcXvListImageFormats,
SProcXvQueryImageAttributes, SProcXvPutImage, SProcXvShmPutImage,};
int _X_COLD int _X_COLD
SProcXvDispatch(ClientPtr client) SProcXvDispatch(ClientPtr client)
{ {
@ -1450,50 +1398,11 @@ SProcXvDispatch(ClientPtr client)
UpdateCurrentTime(); UpdateCurrentTime();
switch (stuff->data) { if (stuff->data >= xvNumRequests) {
case xv_QueryExtension:
return ProcXvQueryExtension(client);
case xv_QueryAdaptors:
return SProcXvQueryAdaptors(client);
case xv_QueryEncodings:
return SProcXvQueryEncodings(client);
case xv_GrabPort:
return SProcXvGrabPort(client);
case xv_UngrabPort:
return SProcXvUngrabPort(client);
case xv_PutVideo:
return SProcXvPutVideo(client);
case xv_PutStill:
return SProcXvPutStill(client);
case xv_GetVideo:
return SProcXvGetVideo(client);
case xv_GetStill:
return SProcXvGetStill(client);
case xv_StopVideo:
return SProcXvStopVideo(client);
case xv_SelectVideoNotify:
return SProcXvSelectVideoNotify(client);
case xv_SelectPortNotify:
return SProcXvSelectPortNotify(client);
case xv_QueryBestSize:
return SProcXvQueryBestSize(client);
case xv_SetPortAttribute:
return SProcXvSetPortAttribute(client);
case xv_GetPortAttribute:
return SProcXvGetPortAttribute(client);
case xv_QueryPortAttributes:
return SProcXvQueryPortAttributes(client);
case xv_ListImageFormats:
return SProcXvListImageFormats(client);
case xv_QueryImageAttributes:
return SProcXvQueryImageAttributes(client);
case xv_PutImage:
return SProcXvPutImage(client);
case xv_ShmPutImage:
return SProcXvShmPutImage(client);
default:
return BadRequest; return BadRequest;
} }
return SXvProcVector[stuff->data] (client);
} }
#ifdef XINERAMA #ifdef XINERAMA
@ -1520,7 +1429,7 @@ XineramaXvStopVideo(ClientPtr client)
if (port->info[i].id) { if (port->info[i].id) {
stuff->drawable = draw->info[i].id; stuff->drawable = draw->info[i].id;
stuff->port = port->info[i].id; stuff->port = port->info[i].id;
result = SingleXvStopVideo(client); result = ProcXvStopVideo(client);
} }
} }
@ -1544,7 +1453,7 @@ XineramaXvSetPortAttribute(ClientPtr client)
FOR_NSCREENS_BACKWARD(i) { FOR_NSCREENS_BACKWARD(i) {
if (port->info[i].id) { if (port->info[i].id) {
stuff->port = port->info[i].id; stuff->port = port->info[i].id;
result = SingleXvSetPortAttribute(client); result = ProcXvSetPortAttribute(client);
} }
} }
return result; return result;
@ -1597,7 +1506,7 @@ XineramaXvShmPutImage(ClientPtr client)
} }
stuff->send_event = (send_event && !i) ? 1 : 0; stuff->send_event = (send_event && !i) ? 1 : 0;
result = SingleXvShmPutImage(client); result = ProcXvShmPutImage(client);
} }
} }
return result; return result;
@ -1648,7 +1557,7 @@ XineramaXvPutImage(ClientPtr client)
stuff->drw_y -= screenInfo.screens[i]->y; stuff->drw_y -= screenInfo.screens[i]->y;
} }
result = SingleXvPutImage(client); result = ProcXvPutImage(client);
} }
} }
return result; return result;
@ -1696,7 +1605,7 @@ XineramaXvPutVideo(ClientPtr client)
stuff->drw_y -= screenInfo.screens[i]->y; stuff->drw_y -= screenInfo.screens[i]->y;
} }
result = SingleXvPutVideo(client); result = ProcXvPutVideo(client);
} }
} }
return result; return result;
@ -1744,7 +1653,7 @@ XineramaXvPutStill(ClientPtr client)
stuff->drw_y -= screenInfo.screens[i]->y; stuff->drw_y -= screenInfo.screens[i]->y;
} }
result = SingleXvPutStill(client); result = ProcXvPutStill(client);
} }
} }
return result; return result;
@ -1836,12 +1745,12 @@ XineramifyXv(void)
/* now create a resource for each port */ /* now create a resource for each port */
for (j = 0; j < refAdapt->nPorts; j++) { for (j = 0; j < refAdapt->nPorts; j++) {
PanoramiXRes *port = calloc(1, sizeof(PanoramiXRes)); PanoramiXRes *port = malloc(sizeof(PanoramiXRes));
if (!port) if (!port)
break; break;
FOR_NSCREENS_BACKWARD(k) { FOR_NSCREENS(k) {
if (MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j)) if (MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j))
port->info[k].id = MatchingAdaptors[k]->base_id + j; port->info[k].id = MatchingAdaptors[k]->base_id + j;
else else
@ -1851,6 +1760,25 @@ XineramifyXv(void)
} }
} }
xvUseXinerama = 1; /* munge the dispatch vector */
XvProcVector[xv_PutVideo] = XineramaXvPutVideo;
XvProcVector[xv_PutStill] = XineramaXvPutStill;
XvProcVector[xv_StopVideo] = XineramaXvStopVideo;
XvProcVector[xv_SetPortAttribute] = XineramaXvSetPortAttribute;
XvProcVector[xv_PutImage] = XineramaXvPutImage;
XvProcVector[xv_ShmPutImage] = XineramaXvShmPutImage;
} }
#endif /* XINERAMA */ #endif /* XINERAMA */
void
XvResetProcVector(void)
{
#ifdef XINERAMA
XvProcVector[xv_PutVideo] = ProcXvPutVideo;
XvProcVector[xv_PutStill] = ProcXvPutStill;
XvProcVector[xv_StopVideo] = ProcXvStopVideo;
XvProcVector[xv_SetPortAttribute] = ProcXvSetPortAttribute;
XvProcVector[xv_PutImage] = ProcXvPutImage;
XvProcVector[xv_ShmPutImage] = ProcXvShmPutImage;
#endif /* XINERAMA */
}

View File

@ -1,7 +1,2 @@
#ifndef XSERVER_XVDISP_H
#define XSERVER_XVDISP_H
extern void XineramifyXv(void); extern void XineramifyXv(void);
extern int xvUseXinerama; extern void XvResetProcVector(void);
#endif /* XSERVER_XVDISP_H */

View File

@ -173,9 +173,9 @@ typedef struct {
int version, revision; int version, revision;
int nAdaptors; int nAdaptors;
XvAdaptorPtr pAdaptors; XvAdaptorPtr pAdaptors;
void *_dummy1; // required in place of a removed field for ABI compatibility DestroyWindowProcPtr DestroyWindow;
void *_dummy2; // required in place of a removed field for ABI compatibility DestroyPixmapProcPtr DestroyPixmap;
void *_dummy3; // required in place of a removed field for ABI compatibility CloseScreenProcPtr CloseScreen;
} XvScreenRec, *XvScreenPtr; } XvScreenRec, *XvScreenPtr;
extern _X_EXPORT int XvScreenInit(ScreenPtr); extern _X_EXPORT int XvScreenInit(ScreenPtr);

View File

@ -2,9 +2,7 @@
* *
* Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net> * Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
*/ */
#ifndef _XORG_XVDIX_PRIV_H #ifndef _XORG_XVDIX_PRIV_H
#define _XORG_XVDIX_PRIV_H
#include <X11/Xdefs.h> #include <X11/Xdefs.h>

View File

@ -81,10 +81,6 @@ SOFTWARE.
#include <X11/extensions/Xv.h> #include <X11/extensions/Xv.h>
#include <X11/extensions/Xvproto.h> #include <X11/extensions/Xvproto.h>
#include "dix/screen_hooks_priv.h"
#include "miext/extinit_priv.h"
#include "Xext/panoramiX.h"
#include "Xext/panoramiXsrv.h"
#include "Xext/xvdix_priv.h" #include "Xext/xvdix_priv.h"
#include "misc.h" #include "misc.h"
@ -94,10 +90,16 @@ SOFTWARE.
#include "pixmapstr.h" #include "pixmapstr.h"
#include "gcstruct.h" #include "gcstruct.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "extinit_priv.h"
#include "dixstruct.h" #include "dixstruct.h"
#include "resource.h" #include "resource.h"
#include "opaque.h" #include "opaque.h"
#include "input.h" #include "input.h"
#ifdef XINERAMA
#include "panoramiX.h"
#include "panoramiXsrv.h"
#endif /* XINERAMA */
#include "xvdisp.h" #include "xvdisp.h"
#define SCREEN_PROLOGUE(pScreen, field) ((pScreen)->field = ((XvScreenPtr) \ #define SCREEN_PROLOGUE(pScreen, field) ((pScreen)->field = ((XvScreenPtr) \
@ -126,8 +128,6 @@ int XvReqCode;
static int XvEventBase; static int XvEventBase;
int XvErrorBase; int XvErrorBase;
int xvUseXinerama = 0;
RESTYPE XvRTPort; RESTYPE XvRTPort;
static RESTYPE XvRTEncoding; static RESTYPE XvRTEncoding;
static RESTYPE XvRTGrab; static RESTYPE XvRTGrab;
@ -141,7 +141,9 @@ static void WriteSwappedVideoNotifyEvent(xvEvent *, xvEvent *);
static void WriteSwappedPortNotifyEvent(xvEvent *, xvEvent *); static void WriteSwappedPortNotifyEvent(xvEvent *, xvEvent *);
static Bool CreateResourceTypes(void); static Bool CreateResourceTypes(void);
static void XvScreenClose(CallbackListPtr *pcbl, ScreenPtr, void *arg); static Bool XvCloseScreen(ScreenPtr);
static Bool XvDestroyPixmap(PixmapPtr);
static Bool XvDestroyWindow(WindowPtr);
static void XvResetProc(ExtensionEntry *); static void XvResetProc(ExtensionEntry *);
static int XvdiDestroyGrab(void *, XID); static int XvdiDestroyGrab(void *, XID);
static int XvdiDestroyEncoding(void *, XID); static int XvdiDestroyEncoding(void *, XID);
@ -150,7 +152,6 @@ static int XvdiDestroyPortNotify(void *, XID);
static int XvdiDestroyVideoNotifyList(void *, XID); static int XvdiDestroyVideoNotifyList(void *, XID);
static int XvdiDestroyPort(void *, XID); static int XvdiDestroyPort(void *, XID);
static int XvdiSendVideoNotify(XvPortPtr, DrawablePtr, int); static int XvdiSendVideoNotify(XvPortPtr, DrawablePtr, int);
static void XvStopAdaptors(DrawablePtr pDrawable);
/* /*
** XvExtensionInit ** XvExtensionInit
@ -256,19 +257,11 @@ CreateResourceTypes(void)
} }
static void XvWindowDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, WindowPtr pWin)
{
XvStopAdaptors(&pWin->drawable);
}
static void XvPixmapDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, PixmapPtr pPixmap)
{
XvStopAdaptors(&pPixmap->drawable);
}
int int
XvScreenInit(ScreenPtr pScreen) XvScreenInit(ScreenPtr pScreen)
{ {
XvScreenPtr pxvs;
if (XvScreenGeneration != serverGeneration) { if (XvScreenGeneration != serverGeneration) {
if (!CreateResourceTypes()) { if (!CreateResourceTypes()) {
ErrorF("XvScreenInit: Unable to allocate resource types\n"); ErrorF("XvScreenInit: Unable to allocate resource types\n");
@ -289,7 +282,7 @@ XvScreenInit(ScreenPtr pScreen)
/* ALLOCATE SCREEN PRIVATE RECORD */ /* ALLOCATE SCREEN PRIVATE RECORD */
XvScreenPtr pxvs = calloc(1, sizeof(XvScreenRec)); pxvs = malloc(sizeof(XvScreenRec));
if (!pxvs) { if (!pxvs) {
ErrorF("XvScreenInit: Unable to allocate screen private structure\n"); ErrorF("XvScreenInit: Unable to allocate screen private structure\n");
return BadAlloc; return BadAlloc;
@ -297,32 +290,40 @@ XvScreenInit(ScreenPtr pScreen)
dixSetPrivate(&pScreen->devPrivates, XvScreenKey, pxvs); dixSetPrivate(&pScreen->devPrivates, XvScreenKey, pxvs);
dixScreenHookWindowDestroy(pScreen, XvWindowDestroy); pxvs->DestroyPixmap = pScreen->DestroyPixmap;
dixScreenHookClose(pScreen, XvScreenClose); pxvs->DestroyWindow = pScreen->DestroyWindow;
dixScreenHookPixmapDestroy(pScreen, XvPixmapDestroy); pxvs->CloseScreen = pScreen->CloseScreen;
pScreen->DestroyPixmap = XvDestroyPixmap;
pScreen->DestroyWindow = XvDestroyWindow;
pScreen->CloseScreen = XvCloseScreen;
return Success; return Success;
} }
static void XvScreenClose(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused) static Bool
XvCloseScreen(ScreenPtr pScreen)
{ {
XvScreenPtr pxvs; XvScreenPtr pxvs;
pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, XvScreenKey); pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
dixScreenUnhookWindowDestroy(pScreen, XvWindowDestroy); pScreen->DestroyPixmap = pxvs->DestroyPixmap;
dixScreenUnhookClose(pScreen, XvScreenClose); pScreen->DestroyWindow = pxvs->DestroyWindow;
dixScreenUnhookPixmapDestroy(pScreen, XvPixmapDestroy); pScreen->CloseScreen = pxvs->CloseScreen;
free(pxvs); free(pxvs);
dixSetPrivate(&pScreen->devPrivates, XvScreenKey, NULL); dixSetPrivate(&pScreen->devPrivates, XvScreenKey, NULL);
return (*pScreen->CloseScreen) (pScreen);
} }
static void static void
XvResetProc(ExtensionEntry * extEntry) XvResetProc(ExtensionEntry * extEntry)
{ {
xvUseXinerama = 0; XvResetProcVector();
} }
DevPrivateKey DevPrivateKey
@ -350,7 +351,7 @@ XvStopAdaptors(DrawablePtr pDrawable)
XvPortPtr pp = pa->pPorts; XvPortPtr pp = pa->pPorts;
int np = pa->nPorts; int np = pa->nPorts;
while ((np--) && (pp)) { while (np--) {
if (pp->pDraw == pDrawable) { if (pp->pDraw == pDrawable) {
XvdiSendVideoNotify(pp, pDrawable, XvPreempted); XvdiSendVideoNotify(pp, pDrawable, XvPreempted);
@ -366,6 +367,40 @@ XvStopAdaptors(DrawablePtr pDrawable)
} }
} }
static Bool
XvDestroyPixmap(PixmapPtr pPix)
{
ScreenPtr pScreen = pPix->drawable.pScreen;
Bool status = TRUE;
if (pPix->refcnt == 1)
XvStopAdaptors(&pPix->drawable);
SCREEN_PROLOGUE(pScreen, DestroyPixmap);
if (pScreen->DestroyPixmap)
status = pScreen->DestroyPixmap(pPix);
SCREEN_EPILOGUE(pScreen, DestroyPixmap, XvDestroyPixmap);
return status;
}
static Bool
XvDestroyWindow(WindowPtr pWin)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
Bool status;
XvStopAdaptors(&pWin->drawable);
SCREEN_PROLOGUE(pScreen, DestroyWindow);
status = (*pScreen->DestroyWindow) (pWin);
SCREEN_EPILOGUE(pScreen, DestroyWindow, XvDestroyWindow);
return status;
}
static int static int
XvdiDestroyPort(void *pPort, XID id) XvdiDestroyPort(void *pPort, XID id)
{ {
@ -774,7 +809,7 @@ XvdiSelectVideoNotify(ClientPtr client, DrawablePtr pDraw, BOOL onoff)
WILL BE DELETED WHEN THE DRAWABLE IS DESTROYED */ WILL BE DELETED WHEN THE DRAWABLE IS DESTROYED */
if (!pn) { if (!pn) {
if (!(tpn = calloc(1, sizeof(XvVideoNotifyRec)))) if (!(tpn = malloc(sizeof(XvVideoNotifyRec))))
return BadAlloc; return BadAlloc;
tpn->next = NULL; tpn->next = NULL;
tpn->client = NULL; tpn->client = NULL;
@ -810,7 +845,7 @@ XvdiSelectVideoNotify(ClientPtr client, DrawablePtr pDraw, BOOL onoff)
tpn = fpn; tpn = fpn;
} }
else { else {
if (!(tpn = calloc(1, sizeof(XvVideoNotifyRec)))) if (!(tpn = malloc(sizeof(XvVideoNotifyRec))))
return BadAlloc; return BadAlloc;
tpn->next = pn->next; tpn->next = pn->next;
pn->next = tpn; pn->next = tpn;
@ -864,7 +899,7 @@ XvdiSelectPortNotify(ClientPtr client, XvPortPtr pPort, BOOL onoff)
CREATE A NEW ONE AND ADD IT TO THE BEGINNING OF THE LIST */ CREATE A NEW ONE AND ADD IT TO THE BEGINNING OF THE LIST */
if (!tpn) { if (!tpn) {
if (!(tpn = calloc(1, sizeof(XvPortNotifyRec)))) if (!(tpn = malloc(sizeof(XvPortNotifyRec))))
return BadAlloc; return BadAlloc;
tpn->next = pPort->pNotify; tpn->next = pPort->pNotify;
pPort->pNotify = tpn; pPort->pNotify = tpn;
@ -1048,7 +1083,7 @@ XvFillColorKey(DrawablePtr pDraw, CARD32 key, RegionPtr region)
(void) ChangeGC(NullClient, gc, GCForeground | GCSubwindowMode, pval); (void) ChangeGC(NullClient, gc, GCForeground | GCSubwindowMode, pval);
ValidateGC(pDraw, gc); ValidateGC(pDraw, gc);
rects = calloc(nbox, sizeof(xRectangle)); rects = xallocarray(nbox, sizeof(xRectangle));
if (rects) { if (rects) {
for (i = 0; i < nbox; i++, pbox++) { for (i = 0; i < nbox; i++, pbox++) {
rects[i].x = pbox->x1 - pDraw->x; rects[i].x = pbox->x1 - pDraw->x;

View File

@ -3,14 +3,8 @@
#include <string.h> #include <string.h>
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xfuncproto.h>
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include <X11/extensions/XvMC.h>
#include <X11/extensions/Xvproto.h>
#include <X11/extensions/XvMCproto.h>
#include "dix/screen_hooks_priv.h"
#include "miext/extinit_priv.h"
#include "Xext/xvdix_priv.h" #include "Xext/xvdix_priv.h"
#include "misc.h" #include "misc.h"
@ -19,7 +13,12 @@
#include "resource.h" #include "resource.h"
#include "scrnintstr.h" #include "scrnintstr.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "extinit_priv.h"
#include "servermd.h" #include "servermd.h"
#include <X11/Xfuncproto.h>
#include <X11/extensions/XvMC.h>
#include <X11/extensions/Xvproto.h>
#include <X11/extensions/XvMCproto.h>
#include "xvmcext.h" #include "xvmcext.h"
#ifdef HAS_XVMCSHM #ifdef HAS_XVMCSHM
@ -49,6 +48,7 @@ static RESTYPE XvMCRTSubpicture;
typedef struct { typedef struct {
int num_adaptors; int num_adaptors;
XvMCAdaptorPtr adaptors; XvMCAdaptorPtr adaptors;
CloseScreenProcPtr CloseScreen;
char clientDriverName[DR_CLIENT_DRIVER_NAME_SIZE]; char clientDriverName[DR_CLIENT_DRIVER_NAME_SIZE];
char busID[DR_BUSID_SIZE]; char busID[DR_BUSID_SIZE];
int major; int major;
@ -112,6 +112,7 @@ ProcXvMCQueryVersion(ClientPtr client)
xvmcQueryVersionReply rep = { xvmcQueryVersionReply rep = {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.major = SERVER_XVMC_MAJOR_VERSION, .major = SERVER_XVMC_MAJOR_VERSION,
.minor = SERVER_XVMC_MINOR_VERSION .minor = SERVER_XVMC_MINOR_VERSION
}; };
@ -127,8 +128,13 @@ static int
ProcXvMCListSurfaceTypes(ClientPtr client) ProcXvMCListSurfaceTypes(ClientPtr client)
{ {
XvPortPtr pPort; XvPortPtr pPort;
int i;
XvMCScreenPtr pScreenPriv; XvMCScreenPtr pScreenPriv;
xvmcListSurfaceTypesReply rep;
xvmcSurfaceInfo info;
XvMCAdaptorPtr adaptor = NULL; XvMCAdaptorPtr adaptor = NULL;
XvMCSurfaceInfoPtr surface;
int num_surfaces;
REQUEST(xvmcListSurfaceTypesReq); REQUEST(xvmcListSurfaceTypesReq);
REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq); REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq);
@ -139,7 +145,7 @@ ProcXvMCListSurfaceTypes(ClientPtr client)
ScreenPtr pScreen = pPort->pAdaptor->pScreen; ScreenPtr pScreen = pPort->pAdaptor->pScreen;
if ((pScreenPriv = XVMC_GET_PRIVATE(pScreen))) { /* any this screen */ if ((pScreenPriv = XVMC_GET_PRIVATE(pScreen))) { /* any this screen */
for (int i = 0; i < pScreenPriv->num_adaptors; i++) { for (i = 0; i < pScreenPriv->num_adaptors; i++) {
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) { if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
adaptor = &(pScreenPriv->adaptors[i]); adaptor = &(pScreenPriv->adaptors[i]);
break; break;
@ -148,36 +154,28 @@ ProcXvMCListSurfaceTypes(ClientPtr client)
} }
} }
int num_surfaces = (adaptor) ? adaptor->num_surfaces : 0; num_surfaces = (adaptor) ? adaptor->num_surfaces : 0;
xvmcSurfaceInfo *info = NULL; rep = (xvmcListSurfaceTypesReply) {
if (num_surfaces) {
info = calloc(sizeof(xvmcSurfaceInfo), num_surfaces);
if (!info)
return BadAlloc;
for (int i = 0; i < num_surfaces; i++) {
XvMCSurfaceInfoPtr surface = adaptor->surfaces[i];
info[i].surface_type_id = surface->surface_type_id;
info[i].chroma_format = surface->chroma_format;
info[i].max_width = surface->max_width;
info[i].max_height = surface->max_height;
info[i].subpicture_max_width = surface->subpicture_max_width;
info[i].subpicture_max_height = surface->subpicture_max_height;
info[i].mc_type = surface->mc_type;
info[i].flags = surface->flags;
}
}
xvmcListSurfaceTypesReply rep = {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.num = num_surfaces, .num = num_surfaces,
.length = bytes_to_int32(sizeof(xvmcSurfaceInfo) * num_surfaces), .length = bytes_to_int32(num_surfaces * sizeof(xvmcSurfaceInfo)),
}; };
WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), &rep); WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), &rep);
WriteToClient(client, sizeof(xvmcSurfaceInfo) * num_surfaces, info);
free(info); for (i = 0; i < num_surfaces; i++) {
surface = adaptor->surfaces[i];
info.surface_type_id = surface->surface_type_id;
info.chroma_format = surface->chroma_format;
info.max_width = surface->max_width;
info.max_height = surface->max_height;
info.subpicture_max_width = surface->subpicture_max_width;
info.subpicture_max_height = surface->subpicture_max_height;
info.mc_type = surface->mc_type;
info.flags = surface->flags;
WriteToClient(client, sizeof(xvmcSurfaceInfo), &info);
}
return Success; return Success;
} }
@ -188,12 +186,13 @@ ProcXvMCCreateContext(ClientPtr client)
XvPortPtr pPort; XvPortPtr pPort;
CARD32 *data = NULL; CARD32 *data = NULL;
int dwords = 0; int dwords = 0;
int result, adapt_num = -1; int i, result, adapt_num = -1;
ScreenPtr pScreen; ScreenPtr pScreen;
XvMCContextPtr pContext; XvMCContextPtr pContext;
XvMCScreenPtr pScreenPriv; XvMCScreenPtr pScreenPriv;
XvMCAdaptorPtr adaptor = NULL; XvMCAdaptorPtr adaptor = NULL;
XvMCSurfaceInfoPtr surface = NULL; XvMCSurfaceInfoPtr surface = NULL;
xvmcCreateContextReply rep;
REQUEST(xvmcCreateContextReq); REQUEST(xvmcCreateContextReq);
REQUEST_SIZE_MATCH(xvmcCreateContextReq); REQUEST_SIZE_MATCH(xvmcCreateContextReq);
@ -208,7 +207,7 @@ ProcXvMCCreateContext(ClientPtr client)
if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen))) /* none this screen */ if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen))) /* none this screen */
return BadMatch; return BadMatch;
for (int i = 0; i < pScreenPriv->num_adaptors; i++) { for (i = 0; i < pScreenPriv->num_adaptors; i++) {
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) { if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
adaptor = &(pScreenPriv->adaptors[i]); adaptor = &(pScreenPriv->adaptors[i]);
adapt_num = i; adapt_num = i;
@ -219,7 +218,7 @@ ProcXvMCCreateContext(ClientPtr client)
if (adapt_num < 0) /* none this port */ if (adapt_num < 0) /* none this port */
return BadMatch; return BadMatch;
for (int i = 0; i < adaptor->num_surfaces; i++) { for (i = 0; i < adaptor->num_surfaces; i++) {
if (adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) { if (adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
surface = adaptor->surfaces[i]; surface = adaptor->surfaces[i];
break; break;
@ -234,7 +233,7 @@ ProcXvMCCreateContext(ClientPtr client)
(stuff->height > surface->max_height)) (stuff->height > surface->max_height))
return BadValue; return BadValue;
if (!(pContext = calloc(1, sizeof(XvMCContextRec)))) { if (!(pContext = malloc(sizeof(XvMCContextRec)))) {
return BadAlloc; return BadAlloc;
} }
@ -258,7 +257,7 @@ ProcXvMCCreateContext(ClientPtr client)
return BadAlloc; return BadAlloc;
} }
xvmcCreateContextReply rep = { rep = (xvmcCreateContextReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = dwords, .length = dwords,
@ -304,6 +303,7 @@ ProcXvMCCreateSurface(ClientPtr client)
XvMCContextPtr pContext; XvMCContextPtr pContext;
XvMCSurfacePtr pSurface; XvMCSurfacePtr pSurface;
XvMCScreenPtr pScreenPriv; XvMCScreenPtr pScreenPriv;
xvmcCreateSurfaceReply rep;
REQUEST(xvmcCreateSurfaceReq); REQUEST(xvmcCreateSurfaceReq);
REQUEST_SIZE_MATCH(xvmcCreateSurfaceReq); REQUEST_SIZE_MATCH(xvmcCreateSurfaceReq);
@ -315,7 +315,7 @@ ProcXvMCCreateSurface(ClientPtr client)
pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen); pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
if (!(pSurface = calloc(1, sizeof(XvMCSurfaceRec)))) if (!(pSurface = malloc(sizeof(XvMCSurfaceRec))))
return BadAlloc; return BadAlloc;
pSurface->surface_id = stuff->surface_id; pSurface->surface_id = stuff->surface_id;
@ -336,7 +336,7 @@ ProcXvMCCreateSurface(ClientPtr client)
return BadAlloc; return BadAlloc;
} }
xvmcCreateSurfaceReply rep = { rep = (xvmcCreateSurfaceReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = dwords .length = dwords
@ -377,10 +377,11 @@ ProcXvMCCreateSubpicture(ClientPtr client)
{ {
Bool image_supported = FALSE; Bool image_supported = FALSE;
CARD32 *data = NULL; CARD32 *data = NULL;
int result, dwords = 0; int i, result, dwords = 0;
XvMCContextPtr pContext; XvMCContextPtr pContext;
XvMCSubpicturePtr pSubpicture; XvMCSubpicturePtr pSubpicture;
XvMCScreenPtr pScreenPriv; XvMCScreenPtr pScreenPriv;
xvmcCreateSubpictureReply rep;
XvMCAdaptorPtr adaptor; XvMCAdaptorPtr adaptor;
XvMCSurfaceInfoPtr surface = NULL; XvMCSurfaceInfoPtr surface = NULL;
@ -397,7 +398,7 @@ ProcXvMCCreateSubpicture(ClientPtr client)
adaptor = &(pScreenPriv->adaptors[pContext->adapt_num]); adaptor = &(pScreenPriv->adaptors[pContext->adapt_num]);
/* find which surface this context supports */ /* find which surface this context supports */
for (int i = 0; i < adaptor->num_surfaces; i++) { for (i = 0; i < adaptor->num_surfaces; i++) {
if (adaptor->surfaces[i]->surface_type_id == pContext->surface_type_id) { if (adaptor->surfaces[i]->surface_type_id == pContext->surface_type_id) {
surface = adaptor->surfaces[i]; surface = adaptor->surfaces[i];
break; break;
@ -411,7 +412,7 @@ ProcXvMCCreateSubpicture(ClientPtr client)
if (!surface->compatible_subpictures) if (!surface->compatible_subpictures)
return BadMatch; return BadMatch;
for (int i = 0; i < surface->compatible_subpictures->num_xvimages; i++) { for (i = 0; i < surface->compatible_subpictures->num_xvimages; i++) {
if (surface->compatible_subpictures->xvimage_ids[i] == if (surface->compatible_subpictures->xvimage_ids[i] ==
stuff->xvimage_id) { stuff->xvimage_id) {
image_supported = TRUE; image_supported = TRUE;
@ -427,7 +428,7 @@ ProcXvMCCreateSubpicture(ClientPtr client)
(stuff->height > surface->subpicture_max_height)) (stuff->height > surface->subpicture_max_height))
return BadValue; return BadValue;
if (!(pSubpicture = calloc(1, sizeof(XvMCSubpictureRec)))) if (!(pSubpicture = malloc(sizeof(XvMCSubpictureRec))))
return BadAlloc; return BadAlloc;
pSubpicture->subpicture_id = stuff->subpicture_id; pSubpicture->subpicture_id = stuff->subpicture_id;
@ -455,7 +456,7 @@ ProcXvMCCreateSubpicture(ClientPtr client)
return BadAlloc; return BadAlloc;
} }
xvmcCreateSubpictureReply rep = { rep = (xvmcCreateSubpictureReply) {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = dwords, .length = dwords,
@ -503,11 +504,14 @@ static int
ProcXvMCListSubpictureTypes(ClientPtr client) ProcXvMCListSubpictureTypes(ClientPtr client)
{ {
XvPortPtr pPort; XvPortPtr pPort;
xvmcListSubpictureTypesReply rep;
XvMCScreenPtr pScreenPriv; XvMCScreenPtr pScreenPriv;
ScreenPtr pScreen; ScreenPtr pScreen;
XvMCAdaptorPtr adaptor = NULL; XvMCAdaptorPtr adaptor = NULL;
XvMCSurfaceInfoPtr surface = NULL; XvMCSurfaceInfoPtr surface = NULL;
xvImageFormatInfo info;
XvImagePtr pImage; XvImagePtr pImage;
int i, j;
REQUEST(xvmcListSubpictureTypesReq); REQUEST(xvmcListSubpictureTypesReq);
REQUEST_SIZE_MATCH(xvmcListSubpictureTypesReq); REQUEST_SIZE_MATCH(xvmcListSubpictureTypesReq);
@ -522,7 +526,7 @@ ProcXvMCListSubpictureTypes(ClientPtr client)
if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen))) if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
return BadMatch; /* None this screen */ return BadMatch; /* None this screen */
for (int i = 0; i < pScreenPriv->num_adaptors; i++) { for (i = 0; i < pScreenPriv->num_adaptors; i++) {
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) { if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
adaptor = &(pScreenPriv->adaptors[i]); adaptor = &(pScreenPriv->adaptors[i]);
break; break;
@ -532,7 +536,7 @@ ProcXvMCListSubpictureTypes(ClientPtr client)
if (!adaptor) if (!adaptor)
return BadMatch; return BadMatch;
for (int i = 0; i < adaptor->num_surfaces; i++) { for (i = 0; i < adaptor->num_surfaces; i++) {
if (adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) { if (adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
surface = adaptor->surfaces[i]; surface = adaptor->surfaces[i];
break; break;
@ -542,70 +546,62 @@ ProcXvMCListSubpictureTypes(ClientPtr client)
if (!surface) if (!surface)
return BadMatch; return BadMatch;
int num = (surface->compatible_subpictures ? rep = (xvmcListSubpictureTypesReply) {
surface->compatible_subpictures->num_xvimages : 0); .type = X_Reply,
.sequenceNumber = client->sequence,
.num = 0
};
if (surface->compatible_subpictures)
rep.num = surface->compatible_subpictures->num_xvimages;
xvImageFormatInfo *info = NULL; rep.length = bytes_to_int32(rep.num * sizeof(xvImageFormatInfo));
if (num) {
info = calloc(sizeof(xvImageFormatInfo), num);
if (!info)
return BadAlloc;
for (int i = 0; i < num; i++) { WriteToClient(client, sizeof(xvmcListSubpictureTypesReply), &rep);
for (i = 0; i < rep.num; i++) {
pImage = NULL; pImage = NULL;
for (int j = 0; j < adaptor->num_subpictures; j++) { for (j = 0; j < adaptor->num_subpictures; j++) {
if (surface->compatible_subpictures->xvimage_ids[i] == if (surface->compatible_subpictures->xvimage_ids[i] ==
adaptor->subpictures[j]->id) { adaptor->subpictures[j]->id) {
pImage = adaptor->subpictures[j]; pImage = adaptor->subpictures[j];
break; break;
} }
} }
if (!pImage) { if (!pImage)
free(info);
return BadImplementation; return BadImplementation;
info.id = pImage->id;
info.type = pImage->type;
info.byte_order = pImage->byte_order;
memcpy(&info.guid, pImage->guid, 16);
info.bpp = pImage->bits_per_pixel;
info.num_planes = pImage->num_planes;
info.depth = pImage->depth;
info.red_mask = pImage->red_mask;
info.green_mask = pImage->green_mask;
info.blue_mask = pImage->blue_mask;
info.format = pImage->format;
info.y_sample_bits = pImage->y_sample_bits;
info.u_sample_bits = pImage->u_sample_bits;
info.v_sample_bits = pImage->v_sample_bits;
info.horz_y_period = pImage->horz_y_period;
info.horz_u_period = pImage->horz_u_period;
info.horz_v_period = pImage->horz_v_period;
info.vert_y_period = pImage->vert_y_period;
info.vert_u_period = pImage->vert_u_period;
info.vert_v_period = pImage->vert_v_period;
memcpy(&info.comp_order, pImage->component_order, 32);
info.scanline_order = pImage->scanline_order;
WriteToClient(client, sizeof(xvImageFormatInfo), &info);
} }
info[i].id = pImage->id;
info[i].type = pImage->type;
info[i].byte_order = pImage->byte_order;
memcpy(&info[i].guid, pImage->guid, 16);
info[i].bpp = pImage->bits_per_pixel;
info[i].num_planes = pImage->num_planes;
info[i].depth = pImage->depth;
info[i].red_mask = pImage->red_mask;
info[i].green_mask = pImage->green_mask;
info[i].blue_mask = pImage->blue_mask;
info[i].format = pImage->format;
info[i].y_sample_bits = pImage->y_sample_bits;
info[i].u_sample_bits = pImage->u_sample_bits;
info[i].v_sample_bits = pImage->v_sample_bits;
info[i].horz_y_period = pImage->horz_y_period;
info[i].horz_u_period = pImage->horz_u_period;
info[i].horz_v_period = pImage->horz_v_period;
info[i].vert_y_period = pImage->vert_y_period;
info[i].vert_u_period = pImage->vert_u_period;
info[i].vert_v_period = pImage->vert_v_period;
memcpy(&info[i].comp_order, pImage->component_order, 32);
info[i].scanline_order = pImage->scanline_order;
}
}
xvmcListSubpictureTypesReply rep = {
.type = X_Reply,
.sequenceNumber = client->sequence,
.num = num,
.length = bytes_to_int32(num * sizeof(xvImageFormatInfo)),
};
WriteToClient(client, sizeof(xvmcListSubpictureTypesReply), &rep);
WriteToClient(client, sizeof(xvImageFormatInfo) * num, info);
free(info);
return Success; return Success;
} }
static int static int
ProcXvMCGetDRInfo(ClientPtr client) ProcXvMCGetDRInfo(ClientPtr client)
{ {
xvmcGetDRInfoReply rep;
XvPortPtr pPort; XvPortPtr pPort;
ScreenPtr pScreen; ScreenPtr pScreen;
XvMCScreenPtr pScreenPriv; XvMCScreenPtr pScreenPriv;
@ -622,30 +618,21 @@ ProcXvMCGetDRInfo(ClientPtr client)
pScreen = pPort->pAdaptor->pScreen; pScreen = pPort->pAdaptor->pScreen;
pScreenPriv = XVMC_GET_PRIVATE(pScreen); pScreenPriv = XVMC_GET_PRIVATE(pScreen);
int nameLen = strlen(pScreenPriv->clientDriverName) + 1; rep = (xvmcGetDRInfoReply) {
int busIDLen = strlen(pScreenPriv->busID) + 1;
// buffer holds two zero-terminated strings, padded to 4-byte ints
const size_t buflen = pad_to_int32(nameLen+busIDLen);
char *buf = calloc(1, buflen);
if (!buf)
return BadAlloc;
memcpy(buf, pScreenPriv->clientDriverName, nameLen);
memcpy(buf+nameLen, pScreenPriv->busID, busIDLen);
xvmcGetDRInfoReply rep = {
.type = X_Reply, .type = X_Reply,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.major = pScreenPriv->major, .major = pScreenPriv->major,
.minor = pScreenPriv->minor, .minor = pScreenPriv->minor,
.patchLevel = pScreenPriv->patchLevel, .patchLevel = pScreenPriv->patchLevel,
.nameLen = nameLen, .nameLen = bytes_to_int32(strlen(pScreenPriv->clientDriverName) + 1),
.busIDLen = busIDLen, .busIDLen = bytes_to_int32(strlen(pScreenPriv->busID) + 1),
.length = bytes_to_int32(sizeof(buf)),
.isLocal = 1 .isLocal = 1
}; };
rep.length = rep.nameLen + rep.busIDLen;
rep.nameLen <<= 2;
rep.busIDLen <<= 2;
/* /*
* Read back to the client what she has put in the shared memory * Read back to the client what she has put in the shared memory
* segment she prepared for us. * segment she prepared for us.
@ -673,40 +660,33 @@ ProcXvMCGetDRInfo(ClientPtr client)
#endif /* HAS_XVMCSHM */ #endif /* HAS_XVMCSHM */
WriteToClient(client, sizeof(xvmcGetDRInfoReply), &rep); WriteToClient(client, sizeof(xvmcGetDRInfoReply), &rep);
WriteToClient(client, buflen, buf); if (rep.length) {
free(buf); WriteToClient(client, rep.nameLen, pScreenPriv->clientDriverName);
WriteToClient(client, rep.busIDLen, pScreenPriv->busID);
}
return Success; return Success;
} }
int (*ProcXvMCVector[xvmcNumRequest]) (ClientPtr) = {
ProcXvMCQueryVersion,
ProcXvMCListSurfaceTypes,
ProcXvMCCreateContext,
ProcXvMCDestroyContext,
ProcXvMCCreateSurface,
ProcXvMCDestroySurface,
ProcXvMCCreateSubpicture,
ProcXvMCDestroySubpicture,
ProcXvMCListSubpictureTypes, ProcXvMCGetDRInfo};
static int static int
ProcXvMCDispatch(ClientPtr client) ProcXvMCDispatch(ClientPtr client)
{ {
REQUEST(xReq); REQUEST(xReq);
switch (stuff->data)
{ if (stuff->data < xvmcNumRequest)
case xvmc_QueryVersion: return (*ProcXvMCVector[stuff->data]) (client);
return ProcXvMCQueryVersion(client); else
case xvmc_ListSurfaceTypes:
return ProcXvMCListSurfaceTypes(client);
case xvmc_CreateContext:
return ProcXvMCCreateContext(client);
case xvmc_DestroyContext:
return ProcXvMCDestroyContext(client);
case xvmc_CreateSurface:
return ProcXvMCCreateSurface(client);
case xvmc_DestroySurface:
return ProcXvMCDestroySurface(client);
case xvmc_CreateSubpicture:
return ProcXvMCCreateSubpicture(client);
case xvmc_DestroySubpicture:
return ProcXvMCDestroySubpicture(client);
case xvmc_ListSubpictureTypes:
return ProcXvMCListSubpictureTypes(client);
case xvmc_GetDRInfo:
return ProcXvMCGetDRInfo(client);
default:
return BadRequest; return BadRequest;
}
} }
static int _X_COLD static int _X_COLD
@ -753,12 +733,16 @@ XvMCExtensionInit(void)
extEntry->errorBase + XvMCBadSubpicture); extEntry->errorBase + XvMCBadSubpicture);
} }
static void XvMCScreenClose(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused) static Bool
XvMCCloseScreen(ScreenPtr pScreen)
{ {
XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen); XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen);
pScreen->CloseScreen = pScreenPriv->CloseScreen;
free(pScreenPriv); free(pScreenPriv);
dixSetPrivate(&pScreen->devPrivates, XvMCScreenKey, NULL);
dixScreenUnhookClose(pScreen, XvMCScreenClose); return (*pScreen->CloseScreen) (pScreen);
} }
int int
@ -769,12 +753,13 @@ XvMCScreenInit(ScreenPtr pScreen, int num, XvMCAdaptorPtr pAdapt)
if (!dixRegisterPrivateKey(&XvMCScreenKeyRec, PRIVATE_SCREEN, 0)) if (!dixRegisterPrivateKey(&XvMCScreenKeyRec, PRIVATE_SCREEN, 0))
return BadAlloc; return BadAlloc;
if (!(pScreenPriv = calloc(1, sizeof(XvMCScreenRec)))) if (!(pScreenPriv = malloc(sizeof(XvMCScreenRec))))
return BadAlloc; return BadAlloc;
dixSetPrivate(&pScreen->devPrivates, XvMCScreenKey, pScreenPriv); dixSetPrivate(&pScreen->devPrivates, XvMCScreenKey, pScreenPriv);
dixScreenHookClose(pScreen, XvMCScreenClose); pScreenPriv->CloseScreen = pScreen->CloseScreen;
pScreen->CloseScreen = XvMCCloseScreen;
pScreenPriv->num_adaptors = num; pScreenPriv->num_adaptors = num;
pScreenPriv->adaptors = pAdapt; pScreenPriv->adaptors = pAdapt;
@ -796,6 +781,7 @@ XvMCFindXvImage(XvPortPtr pPort, CARD32 id)
ScreenPtr pScreen = pPort->pAdaptor->pScreen; ScreenPtr pScreen = pPort->pAdaptor->pScreen;
XvMCScreenPtr pScreenPriv; XvMCScreenPtr pScreenPriv;
XvMCAdaptorPtr adaptor = NULL; XvMCAdaptorPtr adaptor = NULL;
int i;
if (!dixPrivateKeyRegistered(XvMCScreenKey)) if (!dixPrivateKeyRegistered(XvMCScreenKey))
return NULL; return NULL;
@ -803,7 +789,7 @@ XvMCFindXvImage(XvPortPtr pPort, CARD32 id)
if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen))) if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
return NULL; return NULL;
for (int i = 0; i < pScreenPriv->num_adaptors; i++) { for (i = 0; i < pScreenPriv->num_adaptors; i++) {
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) { if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
adaptor = &(pScreenPriv->adaptors[i]); adaptor = &(pScreenPriv->adaptors[i]);
break; break;
@ -813,7 +799,7 @@ XvMCFindXvImage(XvPortPtr pPort, CARD32 id)
if (!adaptor) if (!adaptor)
return NULL; return NULL;
for (int i = 0; i < adaptor->num_subpictures; i++) { for (i = 0; i < adaptor->num_subpictures; i++) {
if (adaptor->subpictures[i]->id == id) { if (adaptor->subpictures[i]->id == id) {
pImage = adaptor->subpictures[i]; pImage = adaptor->subpictures[i];
break; break;

View File

@ -61,6 +61,7 @@ SOFTWARE.
#include "exglobals.h" #include "exglobals.h"
#include "allowev.h" #include "allowev.h"
#include "dixevents.h"
/*********************************************************************** /***********************************************************************
* *

View File

@ -57,7 +57,6 @@ SOFTWARE.
#include "dix/exevents_priv.h" #include "dix/exevents_priv.h"
#include "dix/input_priv.h" #include "dix/input_priv.h"
#include "dix/resource_priv.h"
#include "inputstr.h" /* DeviceIntPtr */ #include "inputstr.h" /* DeviceIntPtr */
#include "XIstubs.h" #include "XIstubs.h"
@ -108,6 +107,7 @@ ProcXChangeDeviceControl(ClientPtr client)
int i, status, ret = BadValue; int i, status, ret = BadValue;
DeviceIntPtr dev; DeviceIntPtr dev;
xDeviceResolutionCtl *r; xDeviceResolutionCtl *r;
xChangeDeviceControlReply rep;
AxisInfoPtr a; AxisInfoPtr a;
CARD32 *resolution; CARD32 *resolution;
xDeviceEnableCtl *e; xDeviceEnableCtl *e;
@ -126,9 +126,11 @@ ProcXChangeDeviceControl(ClientPtr client)
goto out; goto out;
} }
xChangeDeviceControlReply rep = { rep = (xChangeDeviceControlReply) {
.repType = X_Reply,
.RepType = X_ChangeDeviceControl, .RepType = X_ChangeDeviceControl,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.status = Success, .status = Success,
}; };
@ -230,11 +232,24 @@ ProcXChangeDeviceControl(ClientPtr client)
SendEventToAllWindows(dev, DevicePresenceNotifyMask, SendEventToAllWindows(dev, DevicePresenceNotifyMask,
(xEvent *) &dpn, 1); (xEvent *) &dpn, 1);
if (client->swapped) { WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
swaps(&rep.sequenceNumber);
}
WriteToClient(client, sizeof(xChangeDeviceControlReply), &rep);
} }
return ret; return ret;
} }
/***********************************************************************
*
* This procedure writes the reply for the xChangeDeviceControl function,
* if the client and server have a different byte ordering.
*
*/
void _X_COLD
SRepXChangeDeviceControl(ClientPtr client, int size,
xChangeDeviceControlReply * rep)
{
swaps(&rep->sequenceNumber);
swapl(&rep->length);
WriteToClient(client, size, rep);
}

View File

@ -36,4 +36,9 @@ int SProcXChangeDeviceControl(ClientPtr /* client */
int ProcXChangeDeviceControl(ClientPtr /* client */ int ProcXChangeDeviceControl(ClientPtr /* client */
); );
void SRepXChangeDeviceControl(ClientPtr /* client */ ,
int /* size */ ,
xChangeDeviceControlReply * /* rep */
);
#endif /* CHGDCTL_H */ #endif /* CHGDCTL_H */

View File

@ -59,6 +59,7 @@ SOFTWARE.
#include "windowstr.h" /* window structure */ #include "windowstr.h" /* window structure */
#include "scrnintstr.h" /* screen structure */ #include "scrnintstr.h" /* screen structure */
#include "dixevents.h"
#include "exevents.h" #include "exevents.h"
#include "exglobals.h" #include "exglobals.h"

View File

@ -52,14 +52,11 @@ SOFTWARE.
#include <dix-config.h> #include <dix-config.h>
#include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h>
#include "dix/resource_priv.h"
#include "inputstr.h" /* DeviceIntPtr */ #include "inputstr.h" /* DeviceIntPtr */
#include "windowstr.h" /* window structure */ #include "windowstr.h" /* window structure */
#include "scrnintstr.h" /* screen structure */ #include "scrnintstr.h" /* screen structure */
#include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h>
#include "XIstubs.h" #include "XIstubs.h"
#include "exglobals.h" #include "exglobals.h"

View File

@ -96,11 +96,7 @@ SOFTWARE.
#include "dix/eventconvert.h" #include "dix/eventconvert.h"
#include "dix/exevents_priv.h" #include "dix/exevents_priv.h"
#include "dix/input_priv.h" #include "dix/input_priv.h"
#include "dix/resource_priv.h"
#include "dix/window_priv.h"
#include "mi/mi_priv.h" #include "mi/mi_priv.h"
#include "os/log_priv.h"
#include "xkb/xkbsrv_priv.h"
#include "inputstr.h" #include "inputstr.h"
#include "windowstr.h" #include "windowstr.h"
@ -109,12 +105,14 @@ SOFTWARE.
#include "extnsionst.h" #include "extnsionst.h"
#include "exglobals.h" #include "exglobals.h"
#include "eventstr.h" #include "eventstr.h"
#include "dixevents.h" /* DeliverFocusedEvent */
#include "scrnintstr.h" #include "scrnintstr.h"
#include "listdev.h" /* for CopySwapXXXClass */ #include "listdev.h" /* for CopySwapXXXClass */
#include "xace.h" #include "xace.h"
#include "xiquerydevice.h" /* For List*Info */ #include "xiquerydevice.h" /* For List*Info */
#include "eventstr.h" #include "eventstr.h"
#include "inpututils.h" #include "inpututils.h"
#include "xkbsrv.h"
#define WID(w) ((w) ? ((w)->drawable.id) : 0) #define WID(w) ((w) ? ((w)->drawable.id) : 0)
#define AllModifiersMask ( \ #define AllModifiersMask ( \
@ -493,7 +491,6 @@ DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to)
if (!k->xkb_sli) if (!k->xkb_sli)
continue; continue;
if (k->xkb_sli->flags & XkbSLI_IsDefault) { if (k->xkb_sli->flags & XkbSLI_IsDefault) {
assert(to->key);
k->xkb_sli->names = to->key->xkbInfo->desc->names->indicators; k->xkb_sli->names = to->key->xkbInfo->desc->names->indicators;
k->xkb_sli->maps = to->key->xkbInfo->desc->indicators->maps; k->xkb_sli->maps = to->key->xkbInfo->desc->indicators->maps;
} }
@ -775,7 +772,7 @@ ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
int rc; int rc;
/* For now, we don't have devices that change physically. */ /* For now, we don't have devices that change physically. */
if (!InputDevIsMaster(device)) if (!IsMaster(device))
return; return;
rc = dixLookupDevice(&slave, dce->sourceid, serverClient, DixReadAccess); rc = dixLookupDevice(&slave, dce->sourceid, serverClient, DixReadAccess);
@ -783,10 +780,10 @@ ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
if (rc != Success) if (rc != Success)
return; /* Device has disappeared */ return; /* Device has disappeared */
if (InputDevIsMaster(slave)) if (IsMaster(slave))
return; return;
if (InputDevIsFloating(slave)) if (IsFloating(slave))
return; /* set floating since the event */ return; /* set floating since the event */
if (GetMaster(slave, MASTER_ATTACHED)->id != dce->masterid) if (GetMaster(slave, MASTER_ATTACHED)->id != dce->masterid)
@ -970,7 +967,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent *event)
if (!button_is_down(device, key, BUTTON_PROCESSED)) if (!button_is_down(device, key, BUTTON_PROCESSED))
return DONT_PROCESS; return DONT_PROCESS;
if (InputDevIsMaster(device)) { if (IsMaster(device)) {
DeviceIntPtr sd; DeviceIntPtr sd;
/* /*
@ -979,7 +976,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent *event)
* event being delivered through the slave first * event being delivered through the slave first
*/ */
for (sd = inputInfo.devices; sd; sd = sd->next) { for (sd = inputInfo.devices; sd; sd = sd->next) {
if (InputDevIsMaster(sd) || GetMaster(sd, MASTER_POINTER) != device) if (IsMaster(sd) || GetMaster(sd, MASTER_POINTER) != device)
continue; continue;
if (!sd->button) if (!sd->button)
continue; continue;
@ -1047,9 +1044,8 @@ TouchClientWantsOwnershipEvents(ClientPtr client, DeviceIntPtr dev,
{ {
InputClients *iclient; InputClients *iclient;
assert(wOtherInputMasks(win));
nt_list_for_each_entry(iclient, wOtherInputMasks(win)->inputClients, next) { nt_list_for_each_entry(iclient, wOtherInputMasks(win)->inputClients, next) {
if (dixClientForInputClients(iclient) != client) if (rClient(iclient) != client)
continue; continue;
return xi2mask_isset(iclient->xi2mask, dev, XI_TouchOwnership); return xi2mask_isset(iclient->xi2mask, dev, XI_TouchOwnership);
@ -1102,7 +1098,7 @@ DeliverOneTouchEvent(ClientPtr client, DeviceIntPtr dev, TouchPointInfoPtr ti,
filter = GetEventFilter(dev, xi2); filter = GetEventFilter(dev, xi2);
if (XaceHookReceiveAccess(client, win, xi2, 1) != Success) if (XaceHookReceiveAccess(client, win, xi2, 1) != Success)
return FALSE; return FALSE;
TryClientEvents(client, dev, xi2, 1, filter, filter, NullGrab); err = TryClientEvents(client, dev, xi2, 1, filter, filter, NullGrab);
free(xi2); free(xi2);
/* Returning the value from TryClientEvents isn't useful, since all our /* Returning the value from TryClientEvents isn't useful, since all our
@ -1121,7 +1117,7 @@ ActivateEarlyAccept(DeviceIntPtr dev, TouchPointInfoPtr ti)
ti->listeners[0].type != TOUCH_LISTENER_POINTER_GRAB); ti->listeners[0].type != TOUCH_LISTENER_POINTER_GRAB);
BUG_RETURN(!grab); BUG_RETURN(!grab);
client = dixClientForGrab(grab); client = rClient(grab);
if (TouchAcceptReject(client, dev, XIAcceptTouch, ti->client_id, if (TouchAcceptReject(client, dev, XIAcceptTouch, ti->client_id,
ti->listeners[0].window->drawable.id, &error) != Success) ti->listeners[0].window->drawable.id, &error) != Success)
@ -1373,7 +1369,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
BUG_RETURN_VAL(!*grab, FALSE); BUG_RETURN_VAL(!*grab, FALSE);
*client = dixClientForGrab(*grab); *client = rClient(*grab);
*win = (*grab)->window; *win = (*grab)->window;
*mask = (*grab)->xi2mask; *mask = (*grab)->xi2mask;
} }
@ -1393,8 +1389,6 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
else else
evtype = GetXI2Type(ev->any.type); evtype = GetXI2Type(ev->any.type);
assert(iclients);
assert(wOtherInputMasks(*win));
nt_list_for_each_entry(iclients, nt_list_for_each_entry(iclients,
wOtherInputMasks(*win)->inputClients, next) wOtherInputMasks(*win)->inputClients, next)
if (xi2mask_isset(iclients->xi2mask, dev, evtype)) if (xi2mask_isset(iclients->xi2mask, dev, evtype))
@ -1403,20 +1397,19 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
BUG_RETURN_VAL(!iclients, FALSE); BUG_RETURN_VAL(!iclients, FALSE);
*mask = iclients->xi2mask; *mask = iclients->xi2mask;
*client = dixClientForInputClients(iclients); *client = rClient(iclients);
} }
else if (listener->level == XI) { else if (listener->level == XI) {
int xi_type = GetXIType(TouchGetPointerEventType(ev)); int xi_type = GetXIType(TouchGetPointerEventType(ev));
Mask xi_filter = event_get_filter_from_type(dev, xi_type); Mask xi_filter = event_get_filter_from_type(dev, xi_type);
assert(wOtherInputMasks(*win));
nt_list_for_each_entry(iclients, nt_list_for_each_entry(iclients,
wOtherInputMasks(*win)->inputClients, next) wOtherInputMasks(*win)->inputClients, next)
if (iclients->mask[dev->id] & xi_filter) if (iclients->mask[dev->id] & xi_filter)
break; break;
BUG_RETURN_VAL(!iclients, FALSE); BUG_RETURN_VAL(!iclients, FALSE);
*client = dixClientForInputClients(iclients); *client = rClient(iclients);
} }
else { else {
int coretype = GetCoreType(TouchGetPointerEventType(ev)); int coretype = GetCoreType(TouchGetPointerEventType(ev));
@ -1430,7 +1423,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
break; break;
/* if owner selected, oclients is NULL */ /* if owner selected, oclients is NULL */
*client = oclients ? dixClientForOtherClients(oclients) : dixClientForWindow(*win); *client = oclients ? rClient(oclients) : wClient(*win);
} }
*grab = NULL; *grab = NULL;
@ -1456,7 +1449,7 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
if (grab) { if (grab) {
win = grab->window; win = grab->window;
xi2mask = grab->xi2mask; xi2mask = grab->xi2mask;
client = dixClientForGrab(grab); client = rClient(grab);
} }
} }
@ -1568,7 +1561,7 @@ static void
DeliverEmulatedMotionEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, DeliverEmulatedMotionEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
InternalEvent *ev) InternalEvent *ev)
{ {
InternalEvent motion; DeviceEvent motion;
if (ti->num_listeners) { if (ti->num_listeners) {
ClientPtr client; ClientPtr client;
@ -1580,27 +1573,27 @@ DeliverEmulatedMotionEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
ti->listeners[0].type != TOUCH_LISTENER_POINTER_GRAB) ti->listeners[0].type != TOUCH_LISTENER_POINTER_GRAB)
return; return;
motion.device_event = ev->device_event; motion = ev->device_event;
motion.device_event.type = ET_TouchUpdate; motion.type = ET_TouchUpdate;
motion.device_event.detail.button = 0; motion.detail.button = 0;
if (!RetrieveTouchDeliveryData(dev, ti, &motion, if (!RetrieveTouchDeliveryData(dev, ti, (InternalEvent*)&motion,
&ti->listeners[0], &client, &win, &grab, &ti->listeners[0], &client, &win, &grab,
&mask)) &mask))
return; return;
DeliverTouchEmulatedEvent(dev, ti, &motion, &ti->listeners[0], client, DeliverTouchEmulatedEvent(dev, ti, (InternalEvent*)&motion, &ti->listeners[0], client,
win, grab, mask); win, grab, mask);
} }
else { else {
InternalEvent button; InternalEvent button;
int converted; int converted;
converted = TouchConvertToPointerEvent(ev, &motion, &button); converted = TouchConvertToPointerEvent(ev, (InternalEvent*)&motion, &button);
BUG_WARN(converted == 0); BUG_WARN(converted == 0);
if (converted) if (converted)
ProcessOtherEvent(&motion, dev); ProcessOtherEvent((InternalEvent*)&motion, dev);
} }
} }
@ -1684,7 +1677,7 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
(ev->any.type == ET_TouchEnd && ti->num_listeners > 0))) (ev->any.type == ET_TouchEnd && ti->num_listeners > 0)))
DeliverEmulatedMotionEvent(dev, ti, ev); DeliverEmulatedMotionEvent(dev, ti, ev);
if (emulate_pointer && InputDevIsMaster(dev)) if (emulate_pointer && IsMaster(dev))
CheckMotion(&ev->device_event, dev); CheckMotion(&ev->device_event, dev);
kbd = GetMaster(dev, KEYBOARD_OR_FLOAT); kbd = GetMaster(dev, KEYBOARD_OR_FLOAT);
@ -1724,7 +1717,7 @@ ProcessBarrierEvent(InternalEvent *e, DeviceIntPtr dev)
int rc; int rc;
GrabPtr grab = dev->deviceGrab.grab; GrabPtr grab = dev->deviceGrab.grab;
if (!InputDevIsMaster(dev)) if (!IsMaster(dev))
return; return;
if (dixLookupWindow(&pWin, be->window, serverClient, DixReadAccess) != Success) if (dixLookupWindow(&pWin, be->window, serverClient, DixReadAccess) != Success)
@ -1745,7 +1738,7 @@ ProcessBarrierEvent(InternalEvent *e, DeviceIntPtr dev)
Otherwise, deliver normally to the client. Otherwise, deliver normally to the client.
*/ */
if (grab && if (grab &&
dixClientIdForXID(be->barrierid) == dixClientIdForXID(grab->resource) && CLIENT_ID(be->barrierid) == CLIENT_ID(grab->resource) &&
grab->window->drawable.id == be->window) { grab->window->drawable.id == be->window) {
DeliverGrabbedEvent(e, dev, FALSE); DeliverGrabbedEvent(e, dev, FALSE);
} else { } else {
@ -1785,7 +1778,7 @@ ProcessGestureEvent(InternalEvent *ev, DeviceIntPtr dev)
if (!dev->gesture) if (!dev->gesture)
return; return;
if (InputDevIsMaster(dev) && IsAnotherGestureActiveOnMaster(dev, ev)) if (IsMaster(dev) && IsAnotherGestureActiveOnMaster(dev, ev))
return; return;
if (IsGestureBeginEvent(ev)) if (IsGestureBeginEvent(ev))
@ -1860,7 +1853,7 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
b = device->button; b = device->button;
if (InputDevIsMaster(device) || InputDevIsFloating(device)) if (IsMaster(device) || IsFloating(device))
CheckMotion(event, device); CheckMotion(event, device);
switch (event->type) { switch (event->type) {
@ -1954,16 +1947,16 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
deactivateDeviceGrab); deactivateDeviceGrab);
else if (device->focus && !IsPointerEvent(ev)) else if (device->focus && !IsPointerEvent(ev))
DeliverFocusedEvent(device, (InternalEvent *) event, DeliverFocusedEvent(device, (InternalEvent *) event,
InputDevSpriteWindow(device)); GetSpriteWindow(device));
else else
DeliverDeviceEvents(InputDevSpriteWindow(device), (InternalEvent *) event, DeliverDeviceEvents(GetSpriteWindow(device), (InternalEvent *) event,
NullGrab, NullWindow, device); NullGrab, NullWindow, device);
} }
if (deactivateDeviceGrab == TRUE) { if (deactivateDeviceGrab == TRUE) {
(*device->deviceGrab.DeactivateGrab) (device); (*device->deviceGrab.DeactivateGrab) (device);
if (!InputDevIsMaster (device) && !InputDevIsFloating (device)) { if (!IsMaster (device) && !IsFloating (device)) {
int flags, num_events = 0; int flags, num_events = 0;
InternalEvent dce; InternalEvent dce;
@ -2251,7 +2244,7 @@ DeliverOneGestureEvent(ClientPtr client, DeviceIntPtr dev, GestureInfoPtr gi,
filter = GetEventFilter(dev, xi2); filter = GetEventFilter(dev, xi2);
if (XaceHookReceiveAccess(client, win, xi2, 1) != Success) if (XaceHookReceiveAccess(client, win, xi2, 1) != Success)
return FALSE; return FALSE;
TryClientEvents(client, dev, xi2, 1, filter, filter, NullGrab); err = TryClientEvents(client, dev, xi2, 1, filter, filter, NullGrab);
free(xi2); free(xi2);
/* Returning the value from TryClientEvents isn't useful, since all our /* Returning the value from TryClientEvents isn't useful, since all our
@ -2286,7 +2279,7 @@ RetrieveGestureDeliveryData(DeviceIntPtr dev, InternalEvent *ev, GestureListener
BUG_RETURN_VAL(!*grab, FALSE); BUG_RETURN_VAL(!*grab, FALSE);
*client = dixClientForGrab(*grab); *client = rClient(*grab);
*win = (*grab)->window; *win = (*grab)->window;
} }
else { else {
@ -2299,14 +2292,13 @@ RetrieveGestureDeliveryData(DeviceIntPtr dev, InternalEvent *ev, GestureListener
listener->type == GESTURE_LISTENER_REGULAR */ listener->type == GESTURE_LISTENER_REGULAR */
evtype = GetXI2Type(ev->any.type); evtype = GetXI2Type(ev->any.type);
assert(wOtherInputMasks(*win));
nt_list_for_each_entry(iclients, wOtherInputMasks(*win)->inputClients, next) nt_list_for_each_entry(iclients, wOtherInputMasks(*win)->inputClients, next)
if (xi2mask_isset(iclients->xi2mask, dev, evtype)) if (xi2mask_isset(iclients->xi2mask, dev, evtype))
break; break;
BUG_RETURN_VAL(!iclients, FALSE); BUG_RETURN_VAL(!iclients, FALSE);
*client = dixClientForInputClients(iclients); *client = rClient(iclients);
} }
return TRUE; return TRUE;
@ -2338,10 +2330,12 @@ DeliverGestureEventToOwner(DeviceIntPtr dev, GestureInfoPtr gi, InternalEvent *e
int int
InitProximityClassDeviceStruct(DeviceIntPtr dev) InitProximityClassDeviceStruct(DeviceIntPtr dev)
{ {
ProximityClassPtr proxc;
BUG_RETURN_VAL(dev == NULL, FALSE); BUG_RETURN_VAL(dev == NULL, FALSE);
BUG_RETURN_VAL(dev->proximity != NULL, FALSE); BUG_RETURN_VAL(dev->proximity != NULL, FALSE);
ProximityClassPtr proxc = calloc(1, sizeof(ProximityClassRec)); proxc = (ProximityClassPtr) malloc(sizeof(ProximityClassRec));
if (!proxc) if (!proxc)
return FALSE; return FALSE;
proxc->sourceid = dev->id; proxc->sourceid = dev->id;
@ -2534,7 +2528,7 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
else if (grabtype == XI2) else if (grabtype == XI2)
type = XI_ButtonPress; type = XI_ButtonPress;
grab = CreateGrab(client, dev, modifier_device, pWin, grabtype, grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
mask, param, type, button, confineTo, cursor); mask, param, type, button, confineTo, cursor);
if (!grab) if (!grab)
return BadAlloc; return BadAlloc;
@ -2582,7 +2576,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
if (rc != Success) if (rc != Success)
return rc; return rc;
grab = CreateGrab(client, dev, modifier_device, pWin, grabtype, grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
mask, param, type, key, NULL, NULL); mask, param, type, key, NULL, NULL);
if (!grab) if (!grab)
return BadAlloc; return BadAlloc;
@ -2625,7 +2619,7 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
if (rc != Success) if (rc != Success)
return rc; return rc;
grab = CreateGrab(client, dev, dev, pWin, XI2, grab = CreateGrab(client->index, dev, dev, pWin, XI2,
mask, param, mask, param,
(type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn, 0, (type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn, 0,
NULL, cursor); NULL, cursor);
@ -2656,7 +2650,7 @@ GrabTouchOrGesture(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr mod_dev,
if (rc != Success) if (rc != Success)
return rc; return rc;
grab = CreateGrab(client, dev, mod_dev, pWin, XI2, grab = CreateGrab(client->index, dev, mod_dev, pWin, XI2,
mask, param, type, 0, NullWindow, NullCursor); mask, param, type, 0, NullWindow, NullCursor);
if (!grab) if (!grab)
return BadAlloc; return BadAlloc;
@ -2687,7 +2681,6 @@ SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
return BadAccess; return BadAccess;
} }
} }
assert(wOtherInputMasks(pWin));
for (others = wOtherInputMasks(pWin)->inputClients; others; for (others = wOtherInputMasks(pWin)->inputClients; others;
others = others->next) { others = others->next) {
if (SameClient(others, client)) { if (SameClient(others, client)) {
@ -2740,7 +2733,7 @@ AddExtensionClient(WindowPtr pWin, ClientPtr client, Mask mask, int mskidx)
{ {
InputClientsPtr others; InputClientsPtr others;
if (!MakeWindowOptional(pWin)) if (!pWin->optional && !MakeWindowOptional(pWin))
return BadAlloc; return BadAlloc;
others = AllocInputClient(); others = AllocInputClient();
if (!others) if (!others)
@ -2860,7 +2853,7 @@ InputClientGone(WindowPtr pWin, XID id)
FreeInputClient(&other); FreeInputClient(&other);
} }
else { else {
other->resource = dixAllocServerXID(); other->resource = FakeClientID(0);
if (!AddResource(other->resource, RT_INPUTCLIENT, if (!AddResource(other->resource, RT_INPUTCLIENT,
(void *) pWin)) (void *) pWin))
return BadAlloc; return BadAlloc;
@ -2915,7 +2908,7 @@ SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
{ {
WindowPtr pWin; WindowPtr pWin;
WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */ WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */
WindowPtr spriteWin = InputDevSpriteWindow(d); WindowPtr spriteWin = GetSpriteWindow(d);
if (dest == PointerWindow) if (dest == PointerWindow)
pWin = spriteWin; pWin = spriteWin;
@ -2936,9 +2929,9 @@ SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
/* If the input focus is PointerRootWin, send the event to where /* If the input focus is PointerRootWin, send the event to where
* the pointer is if possible, then perhaps propagate up to root. */ * the pointer is if possible, then perhaps propagate up to root. */
if (inputFocus == PointerRootWin) if (inputFocus == PointerRootWin)
inputFocus = InputDevCurrentRootWindow(d); inputFocus = GetCurrentRootWindow(d);
if (WindowIsParent(inputFocus, spriteWin)) { if (IsParent(inputFocus, spriteWin)) {
effectiveFocus = inputFocus; effectiveFocus = inputFocus;
pWin = spriteWin; pWin = spriteWin;
} }
@ -3249,11 +3242,8 @@ DeviceEventSuppressForWindow(WindowPtr pWin, ClientPtr client, Mask mask,
inputMasks->dontPropagateMask[maskndx] = mask; inputMasks->dontPropagateMask[maskndx] = mask;
} }
RecalculateDeviceDeliverableEvents(pWin); RecalculateDeviceDeliverableEvents(pWin);
if (ShouldFreeInputMasks(pWin, FALSE)) { if (ShouldFreeInputMasks(pWin, FALSE))
BUG_RETURN_VAL(!inputMasks, BadImplementation);
BUG_RETURN_VAL(!inputMasks->inputClients, BadImplementation);
FreeResource(inputMasks->inputClients->resource, X11_RESTYPE_NONE); FreeResource(inputMasks->inputClients->resource, X11_RESTYPE_NONE);
}
return Success; return Success;
} }
@ -3347,7 +3337,6 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
if (len && !others) { if (len && !others) {
if (AddExtensionClient(win, client, 0, 0) != Success) if (AddExtensionClient(win, client, 0, 0) != Success)
return BadAlloc; return BadAlloc;
assert(wOtherInputMasks(win));
others = wOtherInputMasks(win)->inputClients; others = wOtherInputMasks(win)->inputClients;
} }
@ -3357,7 +3346,6 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
} }
if (len) { if (len) {
assert(others);
xi2mask_set_one_mask(others->xi2mask, dev->id, mask, len); xi2mask_set_one_mask(others->xi2mask, dev->id, mask, len);
} }

View File

@ -36,6 +36,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#ifndef EXGLOBALS_H #ifndef EXGLOBALS_H
#define EXGLOBALS_H 1 #define EXGLOBALS_H 1
extern int IReqCode;
extern int IEventBase; extern int IEventBase;
extern int BadDevice; extern int BadDevice;
extern int BadMode; extern int BadMode;

View File

@ -53,23 +53,20 @@ SOFTWARE.
#include <dix-config.h> #include <dix-config.h>
#include <assert.h>
#include <X11/extensions/XI.h> #include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h> #include <X11/extensions/XIproto.h>
#include <X11/extensions/XI2proto.h> #include <X11/extensions/XI2proto.h>
#include <X11/extensions/geproto.h> #include <X11/extensions/geproto.h>
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/input_priv.h"
#include "dix/exevents_priv.h" #include "dix/exevents_priv.h"
#include "dix/extension_priv.h"
#include "miext/extinit_priv.h"
#include "Xext/geext_priv.h"
#include "inputstr.h" #include "inputstr.h"
#include "gcstruct.h" /* pointer for extnsionst.h */ #include "gcstruct.h" /* pointer for extnsionst.h */
#include "extnsionst.h" /* extension entry */ #include "extnsionst.h" /* extension entry */
#include "geext.h" /* extension interfaces for ge */
#include "dixevents.h"
#include "extinit_priv.h"
#include "exglobals.h" #include "exglobals.h"
#include "swaprep.h" #include "swaprep.h"
#include "privates.h" #include "privates.h"
@ -182,12 +179,150 @@ XExtEventInfo EventInfo[32];
static DeviceIntRec xi_all_devices; static DeviceIntRec xi_all_devices;
static DeviceIntRec xi_all_master_devices; static DeviceIntRec xi_all_master_devices;
/**
* Dispatch vector. Functions defined in here will be called when the matching
* request arrives.
*/
static int (*ProcIVector[]) (ClientPtr) = {
NULL, /* 0 */
ProcXGetExtensionVersion, /* 1 */
ProcXListInputDevices, /* 2 */
ProcXOpenDevice, /* 3 */
ProcXCloseDevice, /* 4 */
ProcXSetDeviceMode, /* 5 */
ProcXSelectExtensionEvent, /* 6 */
ProcXGetSelectedExtensionEvents, /* 7 */
ProcXChangeDeviceDontPropagateList, /* 8 */
ProcXGetDeviceDontPropagateList, /* 9 */
ProcXGetDeviceMotionEvents, /* 10 */
ProcXChangeKeyboardDevice, /* 11 */
ProcXChangePointerDevice, /* 12 */
ProcXGrabDevice, /* 13 */
ProcXUngrabDevice, /* 14 */
ProcXGrabDeviceKey, /* 15 */
ProcXUngrabDeviceKey, /* 16 */
ProcXGrabDeviceButton, /* 17 */
ProcXUngrabDeviceButton, /* 18 */
ProcXAllowDeviceEvents, /* 19 */
ProcXGetDeviceFocus, /* 20 */
ProcXSetDeviceFocus, /* 21 */
ProcXGetFeedbackControl, /* 22 */
ProcXChangeFeedbackControl, /* 23 */
ProcXGetDeviceKeyMapping, /* 24 */
ProcXChangeDeviceKeyMapping, /* 25 */
ProcXGetDeviceModifierMapping, /* 26 */
ProcXSetDeviceModifierMapping, /* 27 */
ProcXGetDeviceButtonMapping, /* 28 */
ProcXSetDeviceButtonMapping, /* 29 */
ProcXQueryDeviceState, /* 30 */
ProcXSendExtensionEvent, /* 31 */
ProcXDeviceBell, /* 32 */
ProcXSetDeviceValuators, /* 33 */
ProcXGetDeviceControl, /* 34 */
ProcXChangeDeviceControl, /* 35 */
/* XI 1.5 */
ProcXListDeviceProperties, /* 36 */
ProcXChangeDeviceProperty, /* 37 */
ProcXDeleteDeviceProperty, /* 38 */
ProcXGetDeviceProperty, /* 39 */
/* XI 2 */
ProcXIQueryPointer, /* 40 */
ProcXIWarpPointer, /* 41 */
ProcXIChangeCursor, /* 42 */
ProcXIChangeHierarchy, /* 43 */
ProcXISetClientPointer, /* 44 */
ProcXIGetClientPointer, /* 45 */
ProcXISelectEvents, /* 46 */
ProcXIQueryVersion, /* 47 */
ProcXIQueryDevice, /* 48 */
ProcXISetFocus, /* 49 */
ProcXIGetFocus, /* 50 */
ProcXIGrabDevice, /* 51 */
ProcXIUngrabDevice, /* 52 */
ProcXIAllowEvents, /* 53 */
ProcXIPassiveGrabDevice, /* 54 */
ProcXIPassiveUngrabDevice, /* 55 */
ProcXIListProperties, /* 56 */
ProcXIChangeProperty, /* 57 */
ProcXIDeleteProperty, /* 58 */
ProcXIGetProperty, /* 59 */
ProcXIGetSelectedEvents, /* 60 */
ProcXIBarrierReleasePointer /* 61 */
};
/* For swapped clients */
static int (*SProcIVector[]) (ClientPtr) = {
NULL, /* 0 */
SProcXGetExtensionVersion, /* 1 */
ProcXListInputDevices, /* 2 */
ProcXOpenDevice, /* 3 */
ProcXCloseDevice, /* 4 */
ProcXSetDeviceMode, /* 5 */
SProcXSelectExtensionEvent, /* 6 */
SProcXGetSelectedExtensionEvents, /* 7 */
SProcXChangeDeviceDontPropagateList, /* 8 */
SProcXGetDeviceDontPropagateList, /* 9 */
SProcXGetDeviceMotionEvents, /* 10 */
ProcXChangeKeyboardDevice, /* 11 */
ProcXChangePointerDevice, /* 12 */
SProcXGrabDevice, /* 13 */
SProcXUngrabDevice, /* 14 */
SProcXGrabDeviceKey, /* 15 */
SProcXUngrabDeviceKey, /* 16 */
SProcXGrabDeviceButton, /* 17 */
SProcXUngrabDeviceButton, /* 18 */
SProcXAllowDeviceEvents, /* 19 */
ProcXGetDeviceFocus, /* 20 */
SProcXSetDeviceFocus, /* 21 */
ProcXGetFeedbackControl, /* 22 */
SProcXChangeFeedbackControl, /* 23 */
ProcXGetDeviceKeyMapping, /* 24 */
SProcXChangeDeviceKeyMapping, /* 25 */
ProcXGetDeviceModifierMapping, /* 26 */
ProcXSetDeviceModifierMapping, /* 27 */
ProcXGetDeviceButtonMapping, /* 28 */
ProcXSetDeviceButtonMapping, /* 29 */
ProcXQueryDeviceState, /* 30 */
SProcXSendExtensionEvent, /* 31 */
ProcXDeviceBell, /* 32 */
ProcXSetDeviceValuators, /* 33 */
SProcXGetDeviceControl, /* 34 */
SProcXChangeDeviceControl, /* 35 */
ProcXListDeviceProperties, /* 36 */
SProcXChangeDeviceProperty, /* 37 */
SProcXDeleteDeviceProperty, /* 38 */
SProcXGetDeviceProperty, /* 39 */
SProcXIQueryPointer, /* 40 */
SProcXIWarpPointer, /* 41 */
SProcXIChangeCursor, /* 42 */
ProcXIChangeHierarchy, /* 43 */
SProcXISetClientPointer, /* 44 */
SProcXIGetClientPointer, /* 45 */
SProcXISelectEvents, /* 46 */
SProcXIQueryVersion, /* 47 */
SProcXIQueryDevice, /* 48 */
SProcXISetFocus, /* 49 */
SProcXIGetFocus, /* 50 */
SProcXIGrabDevice, /* 51 */
SProcXIUngrabDevice, /* 52 */
SProcXIAllowEvents, /* 53 */
SProcXIPassiveGrabDevice, /* 54 */
SProcXIPassiveUngrabDevice, /* 55 */
SProcXIListProperties, /* 56 */
SProcXIChangeProperty, /* 57 */
SProcXIDeleteProperty, /* 58 */
SProcXIGetProperty, /* 59 */
SProcXIGetSelectedEvents, /* 60 */
SProcXIBarrierReleasePointer /* 61 */
};
/***************************************************************** /*****************************************************************
* *
* Globals referenced elsewhere in the server. * Globals referenced elsewhere in the server.
* *
*/ */
int IReqCode = 0;
int IEventBase = 0; int IEventBase = 0;
int BadDevice = 0; int BadDevice = 0;
static int BadEvent = 1; static int BadEvent = 1;
@ -248,137 +383,11 @@ static int
ProcIDispatch(ClientPtr client) ProcIDispatch(ClientPtr client)
{ {
REQUEST(xReq); REQUEST(xReq);
if (stuff->data >= ARRAY_SIZE(ProcIVector) || !ProcIVector[stuff->data])
return BadRequest;
UpdateCurrentTimeIf(); UpdateCurrentTimeIf();
return (*ProcIVector[stuff->data]) (client);
switch (stuff->data) {
case X_GetExtensionVersion:
return ProcXGetExtensionVersion(client);
case X_ListInputDevices:
return ProcXListInputDevices(client);
case X_OpenDevice:
return ProcXOpenDevice(client);
case X_CloseDevice:
return ProcXCloseDevice(client);
case X_SetDeviceMode:
return ProcXSetDeviceMode(client);
case X_SelectExtensionEvent:
return ProcXSelectExtensionEvent(client);
case X_GetSelectedExtensionEvents:
return ProcXGetSelectedExtensionEvents(client);
case X_ChangeDeviceDontPropagateList:
return ProcXChangeDeviceDontPropagateList(client);
case X_GetDeviceDontPropagateList:
return ProcXGetDeviceDontPropagateList(client);
case X_GetDeviceMotionEvents:
return ProcXGetDeviceMotionEvents(client);
case X_ChangeKeyboardDevice:
return ProcXChangeKeyboardDevice(client);
case X_ChangePointerDevice:
return ProcXChangePointerDevice(client);
case X_GrabDevice:
return ProcXGrabDevice(client);
case X_UngrabDevice:
return ProcXUngrabDevice(client);
case X_GrabDeviceKey:
return ProcXGrabDeviceKey(client);
case X_UngrabDeviceKey:
return ProcXUngrabDeviceKey(client);
case X_GrabDeviceButton:
return ProcXGrabDeviceButton(client);
case X_UngrabDeviceButton:
return ProcXUngrabDeviceButton(client);
case X_AllowDeviceEvents:
return ProcXAllowDeviceEvents(client);
case X_GetDeviceFocus:
return ProcXGetDeviceFocus(client);
case X_SetDeviceFocus:
return ProcXSetDeviceFocus(client);
case X_GetFeedbackControl:
return ProcXGetFeedbackControl(client);
case X_ChangeFeedbackControl:
return ProcXChangeFeedbackControl(client);
case X_GetDeviceKeyMapping:
return ProcXGetDeviceKeyMapping(client);
case X_ChangeDeviceKeyMapping:
return ProcXChangeDeviceKeyMapping(client);
case X_GetDeviceModifierMapping:
return ProcXGetDeviceModifierMapping(client);
case X_SetDeviceModifierMapping:
return ProcXSetDeviceModifierMapping(client);
case X_GetDeviceButtonMapping:
return ProcXGetDeviceButtonMapping(client);
case X_SetDeviceButtonMapping:
return ProcXSetDeviceButtonMapping(client);
case X_QueryDeviceState:
return ProcXQueryDeviceState(client);
case X_SendExtensionEvent:
return ProcXSendExtensionEvent(client);
case X_DeviceBell:
return ProcXDeviceBell(client);
case X_SetDeviceValuators:
return ProcXSetDeviceValuators(client);
case X_GetDeviceControl:
return ProcXGetDeviceControl(client);
case X_ChangeDeviceControl:
return ProcXChangeDeviceControl(client);
/* XI 1.5 */
case X_ListDeviceProperties:
return ProcXListDeviceProperties(client);
case X_ChangeDeviceProperty:
return ProcXChangeDeviceProperty(client);
case X_DeleteDeviceProperty:
return ProcXDeleteDeviceProperty(client);
case X_GetDeviceProperty:
return ProcXGetDeviceProperty(client);
/* XI 2 */
case X_XIQueryPointer:
return ProcXIQueryPointer(client);
case X_XIWarpPointer:
return ProcXIWarpPointer(client);
case X_XIChangeCursor:
return ProcXIChangeCursor(client);
case X_XIChangeHierarchy:
return ProcXIChangeHierarchy(client);
case X_XISetClientPointer:
return ProcXISetClientPointer(client);
case X_XIGetClientPointer:
return ProcXIGetClientPointer(client);
case X_XISelectEvents:
return ProcXISelectEvents(client);
case X_XIQueryVersion:
return ProcXIQueryVersion(client);
case X_XIQueryDevice:
return ProcXIQueryDevice(client);
case X_XISetFocus:
return ProcXISetFocus(client);
case X_XIGetFocus:
return ProcXIGetFocus(client);
case X_XIGrabDevice:
return ProcXIGrabDevice(client);
case X_XIUngrabDevice:
return ProcXIUngrabDevice(client);
case X_XIAllowEvents:
return ProcXIAllowEvents(client);
case X_XIPassiveGrabDevice:
return ProcXIPassiveGrabDevice(client);
case X_XIPassiveUngrabDevice:
return ProcXIPassiveUngrabDevice(client);
case X_XIListProperties:
return ProcXIListProperties(client);
case X_XIChangeProperty:
return ProcXIChangeProperty(client);
case X_XIDeleteProperty:
return ProcXIDeleteProperty(client);
case X_XIGetProperty:
return ProcXIGetProperty(client);
case X_XIGetSelectedEvents:
return ProcXIGetSelectedEvents(client);
case X_XIBarrierReleasePointer:
return ProcXIBarrierReleasePointer(client);
default:
return BadRequest;
}
} }
/******************************************************************************* /*******************************************************************************
@ -394,136 +403,102 @@ static int _X_COLD
SProcIDispatch(ClientPtr client) SProcIDispatch(ClientPtr client)
{ {
REQUEST(xReq); REQUEST(xReq);
if (stuff->data >= ARRAY_SIZE(SProcIVector) || !SProcIVector[stuff->data])
return BadRequest;
UpdateCurrentTimeIf(); UpdateCurrentTimeIf();
return (*SProcIVector[stuff->data]) (client);
}
switch (stuff->data) { /**********************************************************************
case X_GetExtensionVersion: *
return SProcXGetExtensionVersion(client); * SReplyIDispatch
case X_ListInputDevices: * Swap any replies defined in this extension.
return ProcXListInputDevices(client); *
case X_OpenDevice: */
return ProcXOpenDevice(client);
case X_CloseDevice: static void _X_COLD
return ProcXCloseDevice(client); SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
case X_SetDeviceMode: {
return ProcXSetDeviceMode(client); /* All we look at is the type field */
case X_SelectExtensionEvent: /* This is common to all replies */
return SProcXSelectExtensionEvent(client); if (rep->RepType == X_GetExtensionVersion)
case X_GetSelectedExtensionEvents: SRepXGetExtensionVersion(client, len,
return SProcXGetSelectedExtensionEvents(client); (xGetExtensionVersionReply *) rep);
case X_ChangeDeviceDontPropagateList: else if (rep->RepType == X_ListInputDevices)
return SProcXChangeDeviceDontPropagateList(client); SRepXListInputDevices(client, len, (xListInputDevicesReply *) rep);
case X_GetDeviceDontPropagateList: else if (rep->RepType == X_OpenDevice)
return SProcXGetDeviceDontPropagateList(client); SRepXOpenDevice(client, len, (xOpenDeviceReply *) rep);
case X_GetDeviceMotionEvents: else if (rep->RepType == X_SetDeviceMode)
return SProcXGetDeviceMotionEvents(client); SRepXSetDeviceMode(client, len, (xSetDeviceModeReply *) rep);
case X_ChangeKeyboardDevice: else if (rep->RepType == X_GetSelectedExtensionEvents)
return ProcXChangeKeyboardDevice(client); SRepXGetSelectedExtensionEvents(client, len,
case X_ChangePointerDevice: (xGetSelectedExtensionEventsReply *)
return ProcXChangePointerDevice(client); rep);
case X_GrabDevice: else if (rep->RepType == X_GetDeviceDontPropagateList)
return SProcXGrabDevice(client); SRepXGetDeviceDontPropagateList(client, len,
case X_UngrabDevice: (xGetDeviceDontPropagateListReply *)
return SProcXUngrabDevice(client); rep);
case X_GrabDeviceKey: else if (rep->RepType == X_GetDeviceMotionEvents)
return SProcXGrabDeviceKey(client); SRepXGetDeviceMotionEvents(client, len,
case X_UngrabDeviceKey: (xGetDeviceMotionEventsReply *) rep);
return SProcXUngrabDeviceKey(client); else if (rep->RepType == X_GrabDevice)
case X_GrabDeviceButton: SRepXGrabDevice(client, len, (xGrabDeviceReply *) rep);
return SProcXGrabDeviceButton(client); else if (rep->RepType == X_GetDeviceFocus)
case X_UngrabDeviceButton: SRepXGetDeviceFocus(client, len, (xGetDeviceFocusReply *) rep);
return SProcXUngrabDeviceButton(client); else if (rep->RepType == X_GetFeedbackControl)
case X_AllowDeviceEvents: SRepXGetFeedbackControl(client, len, (xGetFeedbackControlReply *) rep);
return SProcXAllowDeviceEvents(client); else if (rep->RepType == X_GetDeviceKeyMapping)
case X_GetDeviceFocus: SRepXGetDeviceKeyMapping(client, len,
return ProcXGetDeviceFocus(client); (xGetDeviceKeyMappingReply *) rep);
case X_SetDeviceFocus: else if (rep->RepType == X_GetDeviceModifierMapping)
return SProcXSetDeviceFocus(client); SRepXGetDeviceModifierMapping(client, len,
case X_GetFeedbackControl: (xGetDeviceModifierMappingReply *) rep);
return ProcXGetFeedbackControl(client); else if (rep->RepType == X_SetDeviceModifierMapping)
case X_ChangeFeedbackControl: SRepXSetDeviceModifierMapping(client, len,
return SProcXChangeFeedbackControl(client); (xSetDeviceModifierMappingReply *) rep);
case X_GetDeviceKeyMapping: else if (rep->RepType == X_GetDeviceButtonMapping)
return ProcXGetDeviceKeyMapping(client); SRepXGetDeviceButtonMapping(client, len,
case X_ChangeDeviceKeyMapping: (xGetDeviceButtonMappingReply *) rep);
return SProcXChangeDeviceKeyMapping(client); else if (rep->RepType == X_SetDeviceButtonMapping)
case X_GetDeviceModifierMapping: SRepXSetDeviceButtonMapping(client, len,
return ProcXGetDeviceModifierMapping(client); (xSetDeviceButtonMappingReply *) rep);
case X_SetDeviceModifierMapping: else if (rep->RepType == X_QueryDeviceState)
return ProcXSetDeviceModifierMapping(client); SRepXQueryDeviceState(client, len, (xQueryDeviceStateReply *) rep);
case X_GetDeviceButtonMapping: else if (rep->RepType == X_SetDeviceValuators)
return ProcXGetDeviceButtonMapping(client); SRepXSetDeviceValuators(client, len, (xSetDeviceValuatorsReply *) rep);
case X_SetDeviceButtonMapping: else if (rep->RepType == X_GetDeviceControl)
return ProcXSetDeviceButtonMapping(client); SRepXGetDeviceControl(client, len, (xGetDeviceControlReply *) rep);
case X_QueryDeviceState: else if (rep->RepType == X_ChangeDeviceControl)
return ProcXQueryDeviceState(client); SRepXChangeDeviceControl(client, len,
case X_SendExtensionEvent: (xChangeDeviceControlReply *) rep);
return SProcXSendExtensionEvent(client); else if (rep->RepType == X_ListDeviceProperties)
case X_DeviceBell: SRepXListDeviceProperties(client, len,
return ProcXDeviceBell(client); (xListDevicePropertiesReply *) rep);
case X_SetDeviceValuators: else if (rep->RepType == X_GetDeviceProperty)
return ProcXSetDeviceValuators(client); SRepXGetDeviceProperty(client, len, (xGetDevicePropertyReply *) rep);
case X_GetDeviceControl: else if (rep->RepType == X_XIQueryPointer)
return SProcXGetDeviceControl(client); SRepXIQueryPointer(client, len, (xXIQueryPointerReply *) rep);
case X_ChangeDeviceControl: else if (rep->RepType == X_XIGetClientPointer)
return SProcXChangeDeviceControl(client); SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply *) rep);
/* XI 1.5 */ else if (rep->RepType == X_XIQueryVersion)
case X_ListDeviceProperties: SRepXIQueryVersion(client, len, (xXIQueryVersionReply *) rep);
return ProcXListDeviceProperties(client); else if (rep->RepType == X_XIQueryDevice)
case X_ChangeDeviceProperty: SRepXIQueryDevice(client, len, (xXIQueryDeviceReply *) rep);
return SProcXChangeDeviceProperty(client); else if (rep->RepType == X_XIGrabDevice)
case X_DeleteDeviceProperty: SRepXIGrabDevice(client, len, (xXIGrabDeviceReply *) rep);
return SProcXDeleteDeviceProperty(client); else if (rep->RepType == X_XIPassiveGrabDevice)
case X_GetDeviceProperty: SRepXIPassiveGrabDevice(client, len, (xXIPassiveGrabDeviceReply *) rep);
return SProcXGetDeviceProperty(client); else if (rep->RepType == X_XIListProperties)
/* XI 2 */ SRepXIListProperties(client, len, (xXIListPropertiesReply *) rep);
case X_XIQueryPointer: else if (rep->RepType == X_XIGetProperty)
return SProcXIQueryPointer(client); SRepXIGetProperty(client, len, (xXIGetPropertyReply *) rep);
case X_XIWarpPointer: else if (rep->RepType == X_XIGetSelectedEvents)
return SProcXIWarpPointer(client); SRepXIGetSelectedEvents(client, len, (xXIGetSelectedEventsReply *) rep);
case X_XIChangeCursor: else if (rep->RepType == X_XIGetFocus)
return SProcXIChangeCursor(client); SRepXIGetFocus(client, len, (xXIGetFocusReply *) rep);
case X_XIChangeHierarchy: else {
return ProcXIChangeHierarchy(client); FatalError("XINPUT confused sending swapped reply");
case X_XISetClientPointer:
return SProcXISetClientPointer(client);
case X_XIGetClientPointer:
return SProcXIGetClientPointer(client);
case X_XISelectEvents:
return SProcXISelectEvents(client);
case X_XIQueryVersion:
return SProcXIQueryVersion(client);
case X_XIQueryDevice:
return SProcXIQueryDevice(client);
case X_XISetFocus:
return SProcXISetFocus(client);
case X_XIGetFocus:
return SProcXIGetFocus(client);
case X_XIGrabDevice:
return SProcXIGrabDevice(client);
case X_XIUngrabDevice:
return SProcXIUngrabDevice(client);
case X_XIAllowEvents:
return SProcXIAllowEvents(client);
case X_XIPassiveGrabDevice:
return SProcXIPassiveGrabDevice(client);
case X_XIPassiveUngrabDevice:
return SProcXIPassiveUngrabDevice(client);
case X_XIListProperties:
return SProcXIListProperties(client);
case X_XIChangeProperty:
return SProcXIChangeProperty(client);
case X_XIDeleteProperty:
return SProcXIDeleteProperty(client);
case X_XIGetProperty:
return SProcXIGetProperty(client);
case X_XIGetSelectedEvents:
return SProcXIGetSelectedEvents(client);
case X_XIBarrierReleasePointer:
return SProcXIBarrierReleasePointer(client);
default:
return BadRequest;
} }
} }
@ -1147,6 +1122,7 @@ RestoreExtensionEvents(void)
{ {
int i, j; int i, j;
IReqCode = 0;
IEventBase = 0; IEventBase = 0;
for (i = 0; i < ExtEventIndex - 1; i++) { for (i = 0; i < ExtEventIndex - 1; i++) {
@ -1195,6 +1171,7 @@ RestoreExtensionEvents(void)
static void static void
IResetProc(ExtensionEntry * unused) IResetProc(ExtensionEntry * unused)
{ {
ReplySwapVector[IReqCode] = ReplyNotSwappd;
EventSwapVector[DeviceValuator] = NotImplemented; EventSwapVector[DeviceValuator] = NotImplemented;
EventSwapVector[DeviceKeyPress] = NotImplemented; EventSwapVector[DeviceKeyPress] = NotImplemented;
EventSwapVector[DeviceKeyRelease] = NotImplemented; EventSwapVector[DeviceKeyRelease] = NotImplemented;
@ -1347,8 +1324,7 @@ XInputExtensionInit(void)
extEntry = AddExtension(INAME, IEVENTS, IERRORS, ProcIDispatch, extEntry = AddExtension(INAME, IEVENTS, IERRORS, ProcIDispatch,
SProcIDispatch, IResetProc, StandardMinorOpcode); SProcIDispatch, IResetProc, StandardMinorOpcode);
if (extEntry) { if (extEntry) {
assert(extEntry->base == EXTENSION_MAJOR_XINPUT); IReqCode = extEntry->base;
IEventBase = extEntry->eventBase; IEventBase = extEntry->eventBase;
XIVersion = thisversion; XIVersion = thisversion;
MakeDeviceTypeAtoms(); MakeDeviceTypeAtoms();
@ -1357,6 +1333,7 @@ XInputExtensionInit(void)
if (!RT_INPUTCLIENT) if (!RT_INPUTCLIENT)
FatalError("Failed to add resource type for XI.\n"); FatalError("Failed to add resource type for XI.\n");
FixExtensionEvents(extEntry); FixExtensionEvents(extEntry);
ReplySwapVector[IReqCode] = (ReplySwapPtr) SReplyIDispatch;
EventSwapVector[DeviceValuator] = SEventIDispatch; EventSwapVector[DeviceValuator] = SEventIDispatch;
EventSwapVector[DeviceKeyPress] = SEventIDispatch; EventSwapVector[DeviceKeyPress] = SEventIDispatch;
EventSwapVector[DeviceKeyRelease] = SEventIDispatch; EventSwapVector[DeviceKeyRelease] = SEventIDispatch;
@ -1374,7 +1351,7 @@ XInputExtensionInit(void)
EventSwapVector[ChangeDeviceNotify] = SEventIDispatch; EventSwapVector[ChangeDeviceNotify] = SEventIDispatch;
EventSwapVector[DevicePresenceNotify] = SEventIDispatch; EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
GERegisterExtension(EXTENSION_MAJOR_XINPUT, XI2EventSwap); GERegisterExtension(IReqCode, XI2EventSwap);
memset(&xi_all_devices, 0, sizeof(xi_all_devices)); memset(&xi_all_devices, 0, sizeof(xi_all_devices));
memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices)); memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices));

View File

@ -69,12 +69,21 @@ int
ProcXGetDeviceButtonMapping(ClientPtr client) ProcXGetDeviceButtonMapping(ClientPtr client)
{ {
DeviceIntPtr dev; DeviceIntPtr dev;
xGetDeviceButtonMappingReply rep;
ButtonClassPtr b; ButtonClassPtr b;
int rc; int rc;
REQUEST(xGetDeviceButtonMappingReq); REQUEST(xGetDeviceButtonMappingReq);
REQUEST_SIZE_MATCH(xGetDeviceButtonMappingReq); REQUEST_SIZE_MATCH(xGetDeviceButtonMappingReq);
rep = (xGetDeviceButtonMappingReply) {
.repType = X_Reply,
.RepType = X_GetDeviceButtonMapping,
.sequenceNumber = client->sequence,
.nElts = 0,
.length = 0
};
rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess); rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
if (rc != Success) if (rc != Success)
return rc; return rc;
@ -83,19 +92,25 @@ ProcXGetDeviceButtonMapping(ClientPtr client)
if (b == NULL) if (b == NULL)
return BadMatch; return BadMatch;
xGetDeviceButtonMappingReply rep = { rep.nElts = b->numButtons;
.repType = X_Reply, rep.length = bytes_to_int32(rep.nElts);
.RepType = X_GetDeviceButtonMapping, WriteReplyToClient(client, sizeof(xGetDeviceButtonMappingReply), &rep);
.sequenceNumber = client->sequence,
.nElts = b->numButtons,
.length = bytes_to_int32(b->numButtons),
};
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
}
WriteToClient(client, sizeof(xGetDeviceButtonMappingReply), &rep);
WriteToClient(client, rep.nElts, &b->map[1]); WriteToClient(client, rep.nElts, &b->map[1]);
return Success; return Success;
} }
/***********************************************************************
*
* This procedure writes the reply for the XGetDeviceButtonMapping function,
* if the client and server have a different byte ordering.
*
*/
void _X_COLD
SRepXGetDeviceButtonMapping(ClientPtr client, int size,
xGetDeviceButtonMappingReply * rep)
{
swaps(&rep->sequenceNumber);
swapl(&rep->length);
WriteToClient(client, size, rep);
}

View File

@ -33,4 +33,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
int ProcXGetDeviceButtonMapping(ClientPtr /* client */ int ProcXGetDeviceButtonMapping(ClientPtr /* client */
); );
void SRepXGetDeviceButtonMapping(ClientPtr /* client */ ,
int /* size */ ,
xGetDeviceButtonMappingReply * /* rep */
);
#endif /* GETBMAP_H */ #endif /* GETBMAP_H */

View File

@ -143,6 +143,21 @@ CopySwapDeviceEnable(ClientPtr client, DeviceIntPtr dev, char *buf)
} }
} }
/***********************************************************************
*
* This procedure writes the reply for the xGetDeviceControl function,
* if the client and server have a different byte ordering.
*
*/
void _X_COLD
SRepXGetDeviceControl(ClientPtr client, int size, xGetDeviceControlReply * rep)
{
swaps(&rep->sequenceNumber);
swapl(&rep->length);
WriteToClient(client, size, rep);
}
/*********************************************************************** /***********************************************************************
* *
* Get the state of the specified device control. * Get the state of the specified device control.
@ -153,8 +168,9 @@ int
ProcXGetDeviceControl(ClientPtr client) ProcXGetDeviceControl(ClientPtr client)
{ {
int rc, total_length = 0; int rc, total_length = 0;
char *savbuf; char *buf, *savbuf;
DeviceIntPtr dev; DeviceIntPtr dev;
xGetDeviceControlReply rep;
REQUEST(xGetDeviceControlReq); REQUEST(xGetDeviceControlReq);
REQUEST_SIZE_MATCH(xGetDeviceControlReq); REQUEST_SIZE_MATCH(xGetDeviceControlReq);
@ -163,6 +179,13 @@ ProcXGetDeviceControl(ClientPtr client)
if (rc != Success) if (rc != Success)
return rc; return rc;
rep = (xGetDeviceControlReply) {
.repType = X_Reply,
.RepType = X_GetDeviceControl,
.sequenceNumber = client->sequence,
.length = 0
};
switch (stuff->control) { switch (stuff->control) {
case DEVICE_RESOLUTION: case DEVICE_RESOLUTION:
if (!dev->valuator) if (!dev->valuator)
@ -183,7 +206,7 @@ ProcXGetDeviceControl(ClientPtr client)
return BadValue; return BadValue;
} }
char *buf = calloc(1, total_length); buf = (char *) malloc(total_length);
if (!buf) if (!buf)
return BadAlloc; return BadAlloc;
savbuf = buf; savbuf = buf;
@ -202,18 +225,8 @@ ProcXGetDeviceControl(ClientPtr client)
break; break;
} }
xGetDeviceControlReply rep = { rep.length = bytes_to_int32(total_length);
.repType = X_Reply, WriteReplyToClient(client, sizeof(xGetDeviceControlReply), &rep);
.RepType = X_GetDeviceControl,
.sequenceNumber = client->sequence,
.length = bytes_to_int32(total_length),
};
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
}
WriteToClient(client, sizeof(xGetDeviceControlReply), &rep);
WriteToClient(client, total_length, savbuf); WriteToClient(client, total_length, savbuf);
free(savbuf); free(savbuf);
return Success; return Success;

View File

@ -36,4 +36,9 @@ int SProcXGetDeviceControl(ClientPtr /* client */
int ProcXGetDeviceControl(ClientPtr /* client */ int ProcXGetDeviceControl(ClientPtr /* client */
); );
void SRepXGetDeviceControl(ClientPtr /* client */ ,
int /* size */ ,
xGetDeviceControlReply * /* rep */
);
#endif /* GETDCTL_H */ #endif /* GETDCTL_H */

View File

@ -234,6 +234,23 @@ CopySwapBellFeedback(ClientPtr client, BellFeedbackPtr b, char **buf)
*buf += sizeof(xBellFeedbackState); *buf += sizeof(xBellFeedbackState);
} }
/***********************************************************************
*
* This procedure writes the reply for the xGetFeedbackControl function,
* if the client and server have a different byte ordering.
*
*/
void _X_COLD
SRepXGetFeedbackControl(ClientPtr client, int size,
xGetFeedbackControlReply * rep)
{
swaps(&rep->sequenceNumber);
swapl(&rep->length);
swaps(&rep->num_feedbacks);
WriteToClient(client, size, rep);
}
/*********************************************************************** /***********************************************************************
* *
* Get the feedback control state. * Get the feedback control state.
@ -244,7 +261,7 @@ int
ProcXGetFeedbackControl(ClientPtr client) ProcXGetFeedbackControl(ClientPtr client)
{ {
int rc, total_length = 0; int rc, total_length = 0;
char *savbuf; char *buf, *savbuf;
DeviceIntPtr dev; DeviceIntPtr dev;
KbdFeedbackPtr k; KbdFeedbackPtr k;
PtrFeedbackPtr p; PtrFeedbackPtr p;
@ -252,6 +269,7 @@ ProcXGetFeedbackControl(ClientPtr client)
StringFeedbackPtr s; StringFeedbackPtr s;
BellFeedbackPtr b; BellFeedbackPtr b;
LedFeedbackPtr l; LedFeedbackPtr l;
xGetFeedbackControlReply rep;
REQUEST(xGetFeedbackControlReq); REQUEST(xGetFeedbackControlReq);
REQUEST_SIZE_MATCH(xGetFeedbackControlReq); REQUEST_SIZE_MATCH(xGetFeedbackControlReq);
@ -260,10 +278,12 @@ ProcXGetFeedbackControl(ClientPtr client)
if (rc != Success) if (rc != Success)
return rc; return rc;
xGetFeedbackControlReply rep = { rep = (xGetFeedbackControlReply) {
.repType = X_Reply, .repType = X_Reply,
.RepType = X_GetFeedbackControl, .RepType = X_GetFeedbackControl,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.length = 0,
.num_feedbacks = 0
}; };
for (k = dev->kbdfeed; k; k = k->next) { for (k = dev->kbdfeed; k; k = k->next) {
@ -295,7 +315,7 @@ ProcXGetFeedbackControl(ClientPtr client)
if (total_length == 0) if (total_length == 0)
return BadMatch; return BadMatch;
char *buf = (char *) calloc(1, total_length); buf = (char *) malloc(total_length);
if (!buf) if (!buf)
return BadAlloc; return BadAlloc;
savbuf = buf; savbuf = buf;
@ -314,13 +334,7 @@ ProcXGetFeedbackControl(ClientPtr client)
CopySwapBellFeedback(client, b, &buf); CopySwapBellFeedback(client, b, &buf);
rep.length = bytes_to_int32(total_length); rep.length = bytes_to_int32(total_length);
WriteReplyToClient(client, sizeof(xGetFeedbackControlReply), &rep);
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
swaps(&rep.num_feedbacks);
}
WriteToClient(client, sizeof(xGetFeedbackControlReply), &rep);
WriteToClient(client, total_length, savbuf); WriteToClient(client, total_length, savbuf);
free(savbuf); free(savbuf);
return Success; return Success;

View File

@ -33,4 +33,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
int ProcXGetFeedbackControl(ClientPtr /* client */ int ProcXGetFeedbackControl(ClientPtr /* client */
); );
void SRepXGetFeedbackControl(ClientPtr /* client */ ,
int /* size */ ,
xGetFeedbackControlReply * /* rep */
);
#endif /* GETFCTL_H */ #endif /* GETFCTL_H */

View File

@ -71,6 +71,7 @@ ProcXGetDeviceFocus(ClientPtr client)
{ {
DeviceIntPtr dev; DeviceIntPtr dev;
FocusClassPtr focus; FocusClassPtr focus;
xGetDeviceFocusReply rep;
int rc; int rc;
REQUEST(xGetDeviceFocusReq); REQUEST(xGetDeviceFocusReq);
@ -82,16 +83,15 @@ ProcXGetDeviceFocus(ClientPtr client)
if (!dev->focus) if (!dev->focus)
return BadDevice; return BadDevice;
focus = dev->focus; rep = (xGetDeviceFocusReply) {
xGetDeviceFocusReply rep = {
.repType = X_Reply, .repType = X_Reply,
.RepType = X_GetDeviceFocus, .RepType = X_GetDeviceFocus,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.time = focus->time.milliseconds, .length = 0
.revertTo = focus->revert,
}; };
focus = dev->focus;
if (focus->win == NoneWin) if (focus->win == NoneWin)
rep.focus = None; rep.focus = None;
else if (focus->win == PointerRootWin) else if (focus->win == PointerRootWin)
@ -101,12 +101,25 @@ ProcXGetDeviceFocus(ClientPtr client)
else else
rep.focus = focus->win->drawable.id; rep.focus = focus->win->drawable.id;
if (client->swapped) { rep.time = focus->time.milliseconds;
swaps(&rep.sequenceNumber); rep.revertTo = focus->revert;
swapl(&rep.length); WriteReplyToClient(client, sizeof(xGetDeviceFocusReply), &rep);
swapl(&rep.focus);
swapl(&rep.time);
}
WriteToClient(client, sizeof(xGetDeviceFocusReply), &rep);
return Success; return Success;
} }
/***********************************************************************
*
* This procedure writes the reply for the GetDeviceFocus function,
* if the client and server have a different byte ordering.
*
*/
void _X_COLD
SRepXGetDeviceFocus(ClientPtr client, int size, xGetDeviceFocusReply * rep)
{
swaps(&rep->sequenceNumber);
swapl(&rep->length);
swapl(&rep->focus);
swapl(&rep->time);
WriteToClient(client, size, rep);
}

View File

@ -33,4 +33,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
int ProcXGetDeviceFocus(ClientPtr /* client */ int ProcXGetDeviceFocus(ClientPtr /* client */
); );
void SRepXGetDeviceFocus(ClientPtr /* client */ ,
int /* size */ ,
xGetDeviceFocusReply * /* rep */
);
#endif /* GETFOCUS_H */ #endif /* GETFOCUS_H */

View File

@ -71,6 +71,7 @@ SOFTWARE.
int int
ProcXGetDeviceKeyMapping(ClientPtr client) ProcXGetDeviceKeyMapping(ClientPtr client)
{ {
xGetDeviceKeyMappingReply rep;
DeviceIntPtr dev; DeviceIntPtr dev;
XkbDescPtr xkb; XkbDescPtr xkb;
KeySymsPtr syms; KeySymsPtr syms;
@ -101,19 +102,14 @@ ProcXGetDeviceKeyMapping(ClientPtr client)
if (!syms) if (!syms)
return BadAlloc; return BadAlloc;
xGetDeviceKeyMappingReply rep = { rep = (xGetDeviceKeyMappingReply) {
.repType = X_Reply, .repType = X_Reply,
.RepType = X_GetDeviceKeyMapping, .RepType = X_GetDeviceKeyMapping,
.sequenceNumber = client->sequence, .sequenceNumber = client->sequence,
.keySymsPerKeyCode = syms->mapWidth, .keySymsPerKeyCode = syms->mapWidth,
.length = (syms->mapWidth * stuff->count) /* KeySyms are 4 bytes */ .length = (syms->mapWidth * stuff->count) /* KeySyms are 4 bytes */
}; };
WriteReplyToClient(client, sizeof(xGetDeviceKeyMappingReply), &rep);
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
}
WriteToClient(client, sizeof(xGetDeviceKeyMappingReply), &rep);
client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write; client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
WriteSwappedDataToClient(client, WriteSwappedDataToClient(client,
@ -125,3 +121,19 @@ ProcXGetDeviceKeyMapping(ClientPtr client)
return Success; return Success;
} }
/***********************************************************************
*
* This procedure writes the reply for the XGetDeviceKeyMapping function,
* if the client and server have a different byte ordering.
*
*/
void _X_COLD
SRepXGetDeviceKeyMapping(ClientPtr client, int size,
xGetDeviceKeyMappingReply * rep)
{
swaps(&rep->sequenceNumber);
swapl(&rep->length);
WriteToClient(client, size, rep);
}

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