init
This commit is contained in:
commit
d5b024c1c7
40
README.md
Normal file
40
README.md
Normal file
@ -0,0 +1,40 @@
|
||||
# Calista xserver - код и скрипты сборки x-server 1.18.4 для операционной системы Calista
|
||||
|
||||
Оригинальный код x-server 1.18.4 взят с https://www.x.org/releases/individual/xserver/xorg-server-1.18.4.tar.gz
|
||||
|
||||
|
||||
# Информация для написания новых версий данной автоматизации
|
||||
|
||||
## Локальный репозиторий
|
||||
|
||||
```
|
||||
|
||||
#Создана структура папок
|
||||
|
||||
mkdir ./packages/All
|
||||
|
||||
#Переходим и добавляем нужные пакеты
|
||||
|
||||
cd ./packages/All
|
||||
pkg fetch -o . pixman #Добавили сам пакет
|
||||
pkg fetch -o . $(pkg rquery %dn pixman) # зависимости pixman
|
||||
|
||||
#Возвращаемся
|
||||
|
||||
cd ../..
|
||||
|
||||
pkg repo packages #Инициировали репозиторий
|
||||
|
||||
nano pkg.conf #Добавляем конфиг
|
||||
|
||||
#x-server-dep: {
|
||||
# url: "file:///root/calista-xserver/packages",
|
||||
# enabled: yes,
|
||||
# priority: 100
|
||||
#}
|
||||
|
||||
#Добавили пакет - обновили репозиторий
|
||||
|
||||
pkg repo packages
|
||||
|
||||
```
|
||||
16
build
Executable file
16
build
Executable file
@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
|
||||
REPO_CONF_DIR="${PWD}"
|
||||
REPO_CONF_NAME="pkg.conf"
|
||||
|
||||
cat > pkg.conf << EOF
|
||||
xserver_dep_repo: {
|
||||
url: "file://${PWD}/packages",
|
||||
enabled: yes,
|
||||
priority: 100
|
||||
}
|
||||
EOF
|
||||
|
||||
pkg -o REPOS_DIR="$REPO_CONF_DIR" -o repositories_conf="$REPO_CONF_NAME" install -y pixman
|
||||
|
||||
pkg delete -y pixman
|
||||
BIN
packages/All/All/Hashed/pixman-0.46.2~5cf1518ef2.pkg
Normal file
BIN
packages/All/All/Hashed/pixman-0.46.2~5cf1518ef2.pkg
Normal file
Binary file not shown.
BIN
packages/data.pkg
Normal file
BIN
packages/data.pkg
Normal file
Binary file not shown.
7
packages/meta
Normal file
7
packages/meta
Normal file
@ -0,0 +1,7 @@
|
||||
version = 2;
|
||||
packing_format = "tzst";
|
||||
manifests = "packagesite.yaml";
|
||||
data = "data";
|
||||
filesite = "filesite.yaml";
|
||||
manifests_archive = "packagesite";
|
||||
filesite_archive = "filesite";
|
||||
7
packages/meta.conf
Normal file
7
packages/meta.conf
Normal file
@ -0,0 +1,7 @@
|
||||
version = 2;
|
||||
packing_format = "tzst";
|
||||
manifests = "packagesite.yaml";
|
||||
data = "data";
|
||||
filesite = "filesite.yaml";
|
||||
manifests_archive = "packagesite";
|
||||
filesite_archive = "filesite";
|
||||
BIN
packages/packagesite.pkg
Normal file
BIN
packages/packagesite.pkg
Normal file
Binary file not shown.
5
pkg.conf
Normal file
5
pkg.conf
Normal file
@ -0,0 +1,5 @@
|
||||
xserver_dep_repo: {
|
||||
url: "file:///root/calista-xserver/packages",
|
||||
enabled: yes,
|
||||
priority: 100
|
||||
}
|
||||
BIN
xorg-server-1.18.4.tar.gz
Normal file
BIN
xorg-server-1.18.4.tar.gz
Normal file
Binary file not shown.
1847
xorg-server-1.18.4/COPYING
Normal file
1847
xorg-server-1.18.4/COPYING
Normal file
File diff suppressed because it is too large
Load Diff
165968
xorg-server-1.18.4/ChangeLog
Normal file
165968
xorg-server-1.18.4/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
370
xorg-server-1.18.4/INSTALL
Normal file
370
xorg-server-1.18.4/INSTALL
Normal file
@ -0,0 +1,370 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. This file is offered as-is,
|
||||
without warranty of any kind.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CPP="gcc -E" CXXCPP="g++ -E"
|
||||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX `make' updates targets which have the same time stamps as
|
||||
their prerequisites, which makes it generally unusable when shipped
|
||||
generated files such as `configure' are involved. Use GNU `make'
|
||||
instead.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
||||
130
xorg-server-1.18.4/Makefile.am
Normal file
130
xorg-server-1.18.4/Makefile.am
Normal file
@ -0,0 +1,130 @@
|
||||
AUTOMAKE_OPTIONS=nostdinc
|
||||
|
||||
# Required for automake < 1.14
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
if COMPOSITE
|
||||
COMPOSITE_DIR=composite
|
||||
endif
|
||||
|
||||
if GLX
|
||||
GLX_DIR=glx
|
||||
endif
|
||||
|
||||
if DBE
|
||||
DBE_DIR=dbe
|
||||
endif
|
||||
|
||||
if RECORD
|
||||
RECORD_DIR=record
|
||||
endif
|
||||
|
||||
if DRI3
|
||||
DRI3_DIR=dri3
|
||||
endif
|
||||
|
||||
if PRESENT
|
||||
PRESENT_DIR=present
|
||||
endif
|
||||
|
||||
if PSEUDORAMIX
|
||||
PSEUDORAMIX_DIR=pseudoramiX
|
||||
endif
|
||||
|
||||
if GLAMOR
|
||||
GLAMOR_DIR=glamor
|
||||
endif
|
||||
|
||||
SUBDIRS = \
|
||||
doc \
|
||||
man \
|
||||
include \
|
||||
dix \
|
||||
fb \
|
||||
mi \
|
||||
Xext \
|
||||
miext \
|
||||
os \
|
||||
randr \
|
||||
render \
|
||||
Xi \
|
||||
xkb \
|
||||
$(PSEUDORAMIX_DIR) \
|
||||
$(DBE_DIR) \
|
||||
$(RECORD_DIR) \
|
||||
xfixes \
|
||||
damageext \
|
||||
$(COMPOSITE_DIR) \
|
||||
$(GLX_DIR) \
|
||||
$(PRESENT_DIR) \
|
||||
$(DRI3_DIR) \
|
||||
exa \
|
||||
$(GLAMOR_DIR) \
|
||||
config \
|
||||
hw \
|
||||
test
|
||||
|
||||
if XORG
|
||||
aclocaldir = $(datadir)/aclocal
|
||||
aclocal_DATA = xorg-server.m4
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = xorg-server.pc
|
||||
endif
|
||||
|
||||
EXTRA_DIST = xorg-server.pc.in xorg-server.m4 autogen.sh
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS=\
|
||||
--with-xkb-path=$(XKB_BASE_DIRECTORY) \
|
||||
--with-xkb-bin-directory=$(XKB_BIN_DIRECTORY) \
|
||||
--with-xkb-output='$${datadir}/X11/xkb/compiled'
|
||||
|
||||
.PHONY: ChangeLog INSTALL
|
||||
|
||||
INSTALL:
|
||||
$(INSTALL_CMD)
|
||||
|
||||
ChangeLog:
|
||||
$(CHANGELOG_CMD)
|
||||
|
||||
dist-hook: ChangeLog INSTALL
|
||||
|
||||
DIST_SUBDIRS = \
|
||||
doc \
|
||||
man \
|
||||
include \
|
||||
dix \
|
||||
fb \
|
||||
mi \
|
||||
Xext \
|
||||
miext \
|
||||
os \
|
||||
pseudoramiX \
|
||||
randr \
|
||||
render \
|
||||
Xi \
|
||||
xkb \
|
||||
dbe \
|
||||
record \
|
||||
xfixes \
|
||||
damageext \
|
||||
composite \
|
||||
glx \
|
||||
exa \
|
||||
glamor \
|
||||
config \
|
||||
dri3 \
|
||||
present \
|
||||
hw \
|
||||
test
|
||||
|
||||
# gross hack
|
||||
relink: all
|
||||
$(AM_V_at)$(MAKE) -C hw relink
|
||||
|
||||
install-headers: Makefile
|
||||
+find . -name Makefile | while read m; do \
|
||||
if grep -q install-sdkHEADERS $$m; then \
|
||||
(cd `dirname "$$m"` && make install-sdkHEADERS) \
|
||||
fi \
|
||||
done
|
||||
1214
xorg-server-1.18.4/Makefile.in
Normal file
1214
xorg-server-1.18.4/Makefile.in
Normal file
File diff suppressed because it is too large
Load Diff
38
xorg-server-1.18.4/README
Normal file
38
xorg-server-1.18.4/README
Normal file
@ -0,0 +1,38 @@
|
||||
X Server
|
||||
|
||||
The X server accepts requests from client applications to create windows,
|
||||
which are (normally rectangular) "virtual screens" that the client program
|
||||
can draw into.
|
||||
|
||||
Windows are then composed on the actual screen by the X server
|
||||
(or by a separate composite manager) as directed by the window manager,
|
||||
which usually communicates with the user via graphical controls such as buttons
|
||||
and draggable titlebars and borders.
|
||||
|
||||
For a comprehensive overview of X Server and X Window System, consult the
|
||||
following article:
|
||||
http://en.wikipedia.org/wiki/X_server
|
||||
|
||||
All questions regarding this software should be directed at the
|
||||
Xorg mailing list:
|
||||
|
||||
http://lists.freedesktop.org/mailman/listinfo/xorg
|
||||
|
||||
Please submit bug reports to the Xorg bugzilla:
|
||||
|
||||
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
|
||||
|
||||
The master development code repository can be found at:
|
||||
|
||||
git://anongit.freedesktop.org/git/xorg/xserver
|
||||
|
||||
http://cgit.freedesktop.org/xorg/xserver
|
||||
|
||||
For patch submission instructions, see:
|
||||
|
||||
http://www.x.org/wiki/Development/Documentation/SubmittingPatches
|
||||
|
||||
For more information on the git code manager, see:
|
||||
|
||||
http://wiki.x.org/wiki/GitPage
|
||||
|
||||
92
xorg-server-1.18.4/TODO
Normal file
92
xorg-server-1.18.4/TODO
Normal file
@ -0,0 +1,92 @@
|
||||
tree inheritance:
|
||||
|
||||
init-cleanup
|
||||
|
||||
driver todo for megamerge:
|
||||
nuke ddc1 paths
|
||||
nuke weak functions
|
||||
i810 kms
|
||||
mach64 LinearVidMem removal
|
||||
openbsd pciaccess fd inversion
|
||||
fix linux int10 ReadBIOS and/or merge int10 and generic
|
||||
geode/sis/xgi *apVidMem removal
|
||||
i128/mga BiosBase removal
|
||||
sis virtualFrom removal
|
||||
mach64/rendition max[HV]Value removal
|
||||
cirrus should prefer 16bpp
|
||||
external RAMDAC code motion for glint/s3/tga
|
||||
freedreno oslib.h detangle
|
||||
|
||||
unify xinerama protocol ~-1kloc
|
||||
- add screen id token
|
||||
- add removal api
|
||||
- add primary flag dealie?
|
||||
|
||||
fold up pre-1.2 randr
|
||||
s/xf86DefaultModes/DMTModes/ -100
|
||||
GLX for Xnest (works-ish on other branch)
|
||||
rootless-merge merge
|
||||
rootless-using xwayland
|
||||
glxproxy something something, -15kloc if you can delete it...
|
||||
maybe merge int10/vbe
|
||||
fix shadow for multiple pixmaps
|
||||
top-level loader (almost, ported api, needs motion)
|
||||
loadable glx for all ddxes
|
||||
un-special-case colormap privates
|
||||
redo fbbits a la sna
|
||||
merge the one snafb bugfix
|
||||
render: FindGlyph -> FindGlyphs
|
||||
miValidateTree: 'forward' might be a pessimization
|
||||
RegionOp's overlapFunc is constant
|
||||
detach dmx from fb
|
||||
destroywindow should return void
|
||||
redo de-sdking of opaque.h
|
||||
|
||||
PRIVATE_COLORMAP
|
||||
only reason this is special is xf86HandleColormaps, which the ddx drivers
|
||||
call _after_ creating default colormap, but which registers a devprivate.
|
||||
should find some symbol always called before xf86HC but never called in
|
||||
randr 1.2 drivers? xf86ValidateModes perhaps?
|
||||
|
||||
XRT Must Die
|
||||
Class: Drawable
|
||||
Types: Colormap, Damage, GC, Picture, Pixmap, Window
|
||||
|
||||
colormaps:
|
||||
CreateColormap has a special case for the default cmap
|
||||
uninstall is skipped for server cmaps? because default?
|
||||
WindowOptRec->colormap is an id not a pointer
|
||||
ScreenRec->defColormap is an id not a pointer, but, okay?
|
||||
CopyColormapAndFree is... odd.
|
||||
AllocColor's CMAPENTRY special case should be moved
|
||||
ListInstalledColormaps is godawful
|
||||
not clear why vfb/nest duplicate micmap so much
|
||||
|
||||
pixmap/window:
|
||||
aaaaaaaaaa
|
||||
|
||||
---
|
||||
|
||||
FakeClientID(0):
|
||||
weird lifetimes:
|
||||
screensaver window
|
||||
applewm/winwm event resource
|
||||
visuals should use separate allocator (fbconfigs too?)
|
||||
GetNewFontClientID?
|
||||
hmm: xwin GenerateAuthorization, auth .Add
|
||||
|
||||
FakeClientID(client->index):
|
||||
dri2 add_frame_event hurrr
|
||||
DRI2CreateDrawable2
|
||||
|
||||
---
|
||||
|
||||
dmx wraps render, fuck.
|
||||
|
||||
Create/Free GlyphSet: Annoying because GlyphSets are display-wide, so there's
|
||||
no obvious place to add a wrap chain. Likewise Add/FreeGlyphs, although there
|
||||
the problem is that glyphs embed their own per-screen list! Fuck sake.
|
||||
|
||||
RenderCompositeGlyphs is correspondingly weird.
|
||||
|
||||
Not entirely sure why SetPictureTransform/Filter are wrapped.
|
||||
116
xorg-server-1.18.4/Xext/Makefile.am
Normal file
116
xorg-server-1.18.4/Xext/Makefile.am
Normal file
@ -0,0 +1,116 @@
|
||||
noinst_LTLIBRARIES = libXext.la libXextdpmsstubs.la libXvidmode.la
|
||||
|
||||
AM_CFLAGS = $(DIX_CFLAGS)
|
||||
|
||||
if XORG
|
||||
sdk_HEADERS = xvdix.h xvmcext.h geext.h geint.h shmint.h syncsdk.h
|
||||
endif
|
||||
|
||||
# Sources always included in libXextbuiltin.la, libXext.la
|
||||
BUILTIN_SRCS = \
|
||||
bigreq.c \
|
||||
geext.c \
|
||||
shape.c \
|
||||
sleepuntil.c \
|
||||
sleepuntil.h \
|
||||
sync.c \
|
||||
syncsdk.h \
|
||||
syncsrv.h \
|
||||
xcmisc.c \
|
||||
xtest.c
|
||||
BUILTIN_LIBS =
|
||||
|
||||
# Optional sources included if extension enabled by configure.ac rules
|
||||
|
||||
# MIT Shared Memory extension
|
||||
MITSHM_SRCS = shm.c shmint.h
|
||||
if MITSHM
|
||||
BUILTIN_SRCS += $(MITSHM_SRCS)
|
||||
endif
|
||||
|
||||
# XVideo extension
|
||||
XV_SRCS = xvmain.c xvdisp.c xvmc.c xvdix.h xvmcext.h xvdisp.h
|
||||
if XV
|
||||
BUILTIN_SRCS += $(XV_SRCS)
|
||||
endif
|
||||
|
||||
# XResource extension: lets clients get data about per-client resource usage
|
||||
RES_SRCS = hashtable.c hashtable.h xres.c
|
||||
if RES
|
||||
BUILTIN_SRCS += $(RES_SRCS)
|
||||
endif
|
||||
|
||||
# MIT ScreenSaver extension
|
||||
SCREENSAVER_SRCS = saver.c
|
||||
if SCREENSAVER
|
||||
BUILTIN_SRCS += $(SCREENSAVER_SRCS)
|
||||
endif
|
||||
|
||||
# Xinerama extension: making multiple video devices act as one virtual screen
|
||||
XINERAMA_SRCS = panoramiX.c panoramiX.h panoramiXh.h panoramiXsrv.h panoramiXprocs.c panoramiXSwap.c
|
||||
if XINERAMA
|
||||
BUILTIN_SRCS += $(XINERAMA_SRCS)
|
||||
if XORG
|
||||
sdk_HEADERS += panoramiXsrv.h panoramiX.h
|
||||
endif
|
||||
endif
|
||||
|
||||
# X-ACE extension: provides hooks for building security policy extensions
|
||||
# like XC-Security, X-SELinux & XTSol
|
||||
XACE_SRCS = xace.c xace.h xacestr.h
|
||||
if XACE
|
||||
BUILTIN_SRCS += $(XACE_SRCS)
|
||||
if XORG
|
||||
sdk_HEADERS += xace.h xacestr.h
|
||||
endif
|
||||
endif
|
||||
|
||||
# SELinux extension: provides SELinux policy support for X objects
|
||||
# requires X-ACE extension
|
||||
XSELINUX_SRCS = xselinux_ext.c xselinux_hooks.c xselinux_label.c xselinux.h xselinuxint.h
|
||||
if XSELINUX
|
||||
BUILTIN_SRCS += $(XSELINUX_SRCS)
|
||||
BUILTIN_LIBS += $(SELINUX_LIBS)
|
||||
endif
|
||||
|
||||
# Security extension: multi-level security to protect clients from each other
|
||||
XCSECURITY_SRCS = security.c securitysrv.h
|
||||
if XCSECURITY
|
||||
BUILTIN_SRCS += $(XCSECURITY_SRCS)
|
||||
endif
|
||||
|
||||
# XF86 Big Font extension
|
||||
BIGFONT_SRCS = xf86bigfont.c xf86bigfontsrv.h
|
||||
if XF86BIGFONT
|
||||
BUILTIN_SRCS += $(BIGFONT_SRCS)
|
||||
endif
|
||||
|
||||
# DPMS extension
|
||||
DPMS_SRCS = dpms.c dpmsproc.h
|
||||
if DPMSExtension
|
||||
BUILTIN_SRCS += $(DPMS_SRCS)
|
||||
endif
|
||||
|
||||
# Now take all of the above, mix well, bake for 10 minutes and get libXext*.la
|
||||
|
||||
libXext_la_SOURCES = $(BUILTIN_SRCS)
|
||||
libXext_la_LIBADD = $(BUILTIN_LIBS)
|
||||
|
||||
libXextdpmsstubs_la_SOURCES = dpmsstubs.c
|
||||
|
||||
# XVidMode extension
|
||||
libXvidmode_la_SOURCES = vidmode.c
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(MITSHM_SRCS) \
|
||||
$(XV_SRCS) \
|
||||
$(RES_SRCS) \
|
||||
$(SCREENSAVER_SRCS) \
|
||||
$(XACE_SRCS) \
|
||||
$(XCSECURITY_SRCS) \
|
||||
$(XSELINUX_SRCS) \
|
||||
$(XINERAMA_SRCS) \
|
||||
$(BIGFONT_SRCS) \
|
||||
$(DPMS_SRCS) \
|
||||
$(GE_SRCS)
|
||||
|
||||
1031
xorg-server-1.18.4/Xext/Makefile.in
Normal file
1031
xorg-server-1.18.4/Xext/Makefile.in
Normal file
File diff suppressed because it is too large
Load Diff
76
xorg-server-1.18.4/Xext/bigreq.c
Normal file
76
xorg-server-1.18.4/Xext/bigreq.c
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
|
||||
Copyright 1992, 1998 The Open Group
|
||||
|
||||
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 OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
#include "dixstruct.h"
|
||||
#include "extnsionst.h"
|
||||
#include <X11/extensions/bigreqsproto.h>
|
||||
#include "opaque.h"
|
||||
#include "extinit.h"
|
||||
|
||||
static int
|
||||
ProcBigReqDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xBigReqEnableReq);
|
||||
xBigReqEnableReply rep;
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&stuff->length);
|
||||
}
|
||||
if (stuff->brReqType != X_BigReqEnable)
|
||||
return BadRequest;
|
||||
REQUEST_SIZE_MATCH(xBigReqEnableReq);
|
||||
client->big_requests = TRUE;
|
||||
rep = (xBigReqEnableReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.max_request_size = maxBigRequestSize
|
||||
};
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swapl(&rep.max_request_size);
|
||||
}
|
||||
WriteToClient(client, sizeof(xBigReqEnableReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
void
|
||||
BigReqExtensionInit(void)
|
||||
{
|
||||
AddExtension(XBigReqExtensionName, 0, 0,
|
||||
ProcBigReqDispatch, ProcBigReqDispatch,
|
||||
NULL, StandardMinorOpcode);
|
||||
}
|
||||
363
xorg-server-1.18.4/Xext/dpms.c
Normal file
363
xorg-server-1.18.4/Xext/dpms.c
Normal file
@ -0,0 +1,363 @@
|
||||
/*****************************************************************
|
||||
|
||||
Copyright (c) 1996 Digital Equipment Corporation, Maynard, Massachusetts.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software.
|
||||
|
||||
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
|
||||
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
|
||||
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL 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 Digital Equipment Corporation
|
||||
shall not be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Software without prior written authorization from Digital
|
||||
Equipment Corporation.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
#include "dixstruct.h"
|
||||
#include "extnsionst.h"
|
||||
#include "opaque.h"
|
||||
#include <X11/extensions/dpmsproto.h>
|
||||
#include "dpmsproc.h"
|
||||
#include "extinit.h"
|
||||
|
||||
static int
|
||||
ProcDPMSGetVersion(ClientPtr client)
|
||||
{
|
||||
/* REQUEST(xDPMSGetVersionReq); */
|
||||
xDPMSGetVersionReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.majorVersion = DPMSMajorVersion,
|
||||
.minorVersion = DPMSMinorVersion
|
||||
};
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSGetVersionReq);
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swaps(&rep.majorVersion);
|
||||
swaps(&rep.minorVersion);
|
||||
}
|
||||
WriteToClient(client, sizeof(xDPMSGetVersionReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSCapable(ClientPtr client)
|
||||
{
|
||||
/* REQUEST(xDPMSCapableReq); */
|
||||
xDPMSCapableReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.capable = DPMSCapableFlag
|
||||
};
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSCapableReq);
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
}
|
||||
WriteToClient(client, sizeof(xDPMSCapableReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSGetTimeouts(ClientPtr client)
|
||||
{
|
||||
/* REQUEST(xDPMSGetTimeoutsReq); */
|
||||
xDPMSGetTimeoutsReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.standby = DPMSStandbyTime / MILLI_PER_SECOND,
|
||||
.suspend = DPMSSuspendTime / MILLI_PER_SECOND,
|
||||
.off = DPMSOffTime / MILLI_PER_SECOND
|
||||
};
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSGetTimeoutsReq);
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swaps(&rep.standby);
|
||||
swaps(&rep.suspend);
|
||||
swaps(&rep.off);
|
||||
}
|
||||
WriteToClient(client, sizeof(xDPMSGetTimeoutsReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSSetTimeouts(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSSetTimeoutsReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSSetTimeoutsReq);
|
||||
|
||||
if ((stuff->off != 0) && (stuff->off < stuff->suspend)) {
|
||||
client->errorValue = stuff->off;
|
||||
return BadValue;
|
||||
}
|
||||
if ((stuff->suspend != 0) && (stuff->suspend < stuff->standby)) {
|
||||
client->errorValue = stuff->suspend;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
DPMSStandbyTime = stuff->standby * MILLI_PER_SECOND;
|
||||
DPMSSuspendTime = stuff->suspend * MILLI_PER_SECOND;
|
||||
DPMSOffTime = stuff->off * MILLI_PER_SECOND;
|
||||
SetScreenSaverTimer();
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSEnable(ClientPtr client)
|
||||
{
|
||||
Bool was_enabled = DPMSEnabled;
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSEnableReq);
|
||||
|
||||
if (DPMSCapableFlag) {
|
||||
DPMSEnabled = TRUE;
|
||||
if (!was_enabled)
|
||||
SetScreenSaverTimer();
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSDisable(ClientPtr client)
|
||||
{
|
||||
/* REQUEST(xDPMSDisableReq); */
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSDisableReq);
|
||||
|
||||
DPMSSet(client, DPMSModeOn);
|
||||
|
||||
DPMSEnabled = FALSE;
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSForceLevel(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSForceLevelReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSForceLevelReq);
|
||||
|
||||
if (!DPMSEnabled)
|
||||
return BadMatch;
|
||||
|
||||
if (stuff->level != DPMSModeOn &&
|
||||
stuff->level != DPMSModeStandby &&
|
||||
stuff->level != DPMSModeSuspend && stuff->level != DPMSModeOff) {
|
||||
client->errorValue = stuff->level;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
DPMSSet(client, stuff->level);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSInfo(ClientPtr client)
|
||||
{
|
||||
/* REQUEST(xDPMSInfoReq); */
|
||||
xDPMSInfoReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.power_level = DPMSPowerLevel,
|
||||
.state = DPMSEnabled
|
||||
};
|
||||
|
||||
REQUEST_SIZE_MATCH(xDPMSInfoReq);
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swaps(&rep.power_level);
|
||||
}
|
||||
WriteToClient(client, sizeof(xDPMSInfoReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDPMSDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
|
||||
switch (stuff->data) {
|
||||
case X_DPMSGetVersion:
|
||||
return ProcDPMSGetVersion(client);
|
||||
case X_DPMSCapable:
|
||||
return ProcDPMSCapable(client);
|
||||
case X_DPMSGetTimeouts:
|
||||
return ProcDPMSGetTimeouts(client);
|
||||
case X_DPMSSetTimeouts:
|
||||
return ProcDPMSSetTimeouts(client);
|
||||
case X_DPMSEnable:
|
||||
return ProcDPMSEnable(client);
|
||||
case X_DPMSDisable:
|
||||
return ProcDPMSDisable(client);
|
||||
case X_DPMSForceLevel:
|
||||
return ProcDPMSForceLevel(client);
|
||||
case X_DPMSInfo:
|
||||
return ProcDPMSInfo(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSGetVersion(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSGetVersionReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSGetVersionReq);
|
||||
swaps(&stuff->majorVersion);
|
||||
swaps(&stuff->minorVersion);
|
||||
return ProcDPMSGetVersion(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSCapable(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSCapableReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSCapableReq);
|
||||
|
||||
return ProcDPMSCapable(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSGetTimeouts(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSGetTimeoutsReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSGetTimeoutsReq);
|
||||
|
||||
return ProcDPMSGetTimeouts(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSSetTimeouts(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSSetTimeoutsReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSSetTimeoutsReq);
|
||||
|
||||
swaps(&stuff->standby);
|
||||
swaps(&stuff->suspend);
|
||||
swaps(&stuff->off);
|
||||
return ProcDPMSSetTimeouts(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSEnable(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSEnableReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSEnableReq);
|
||||
|
||||
return ProcDPMSEnable(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSDisable(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSDisableReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSDisableReq);
|
||||
|
||||
return ProcDPMSDisable(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSForceLevel(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSForceLevelReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSForceLevelReq);
|
||||
|
||||
swaps(&stuff->level);
|
||||
|
||||
return ProcDPMSForceLevel(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSInfo(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDPMSInfoReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xDPMSInfoReq);
|
||||
|
||||
return ProcDPMSInfo(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDPMSDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
switch (stuff->data) {
|
||||
case X_DPMSGetVersion:
|
||||
return SProcDPMSGetVersion(client);
|
||||
case X_DPMSCapable:
|
||||
return SProcDPMSCapable(client);
|
||||
case X_DPMSGetTimeouts:
|
||||
return SProcDPMSGetTimeouts(client);
|
||||
case X_DPMSSetTimeouts:
|
||||
return SProcDPMSSetTimeouts(client);
|
||||
case X_DPMSEnable:
|
||||
return SProcDPMSEnable(client);
|
||||
case X_DPMSDisable:
|
||||
return SProcDPMSDisable(client);
|
||||
case X_DPMSForceLevel:
|
||||
return SProcDPMSForceLevel(client);
|
||||
case X_DPMSInfo:
|
||||
return SProcDPMSInfo(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DPMSExtensionInit(void)
|
||||
{
|
||||
AddExtension(DPMSExtensionName, 0, 0,
|
||||
ProcDPMSDispatch, SProcDPMSDispatch,
|
||||
NULL, StandardMinorOpcode);
|
||||
}
|
||||
15
xorg-server-1.18.4/Xext/dpmsproc.h
Normal file
15
xorg-server-1.18.4/Xext/dpmsproc.h
Normal file
@ -0,0 +1,15 @@
|
||||
/* Prototypes for functions that the DDX must provide */
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _DPMSPROC_H_
|
||||
#define _DPMSPROC_H_
|
||||
|
||||
#include "dixstruct.h"
|
||||
|
||||
int _X_EXPORT DPMSSet(ClientPtr client, int level);
|
||||
Bool _X_EXPORT DPMSSupported(void);
|
||||
|
||||
#endif
|
||||
47
xorg-server-1.18.4/Xext/dpmsstubs.c
Normal file
47
xorg-server-1.18.4/Xext/dpmsstubs.c
Normal file
@ -0,0 +1,47 @@
|
||||
/*****************************************************************
|
||||
|
||||
Copyright (c) 1996 Digital Equipment Corporation, Maynard, Massachusetts.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software.
|
||||
|
||||
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
|
||||
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
|
||||
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL 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 Digital Equipment Corporation
|
||||
shall not be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Software without prior written authorization from Digital
|
||||
Equipment Corporation.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "dpmsproc.h"
|
||||
|
||||
#define FALSE 0
|
||||
|
||||
Bool
|
||||
DPMSSupported(void)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int
|
||||
DPMSSet(ClientPtr client, int level)
|
||||
{
|
||||
return Success;
|
||||
}
|
||||
257
xorg-server-1.18.4/Xext/geext.c
Normal file
257
xorg-server-1.18.4/Xext/geext.c
Normal file
@ -0,0 +1,257 @@
|
||||
/*
|
||||
* Copyright 2007-2008 Peter Hutterer
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Author: Peter Hutterer, University of South Australia, NICTA
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
#include "windowstr.h"
|
||||
#include <X11/extensions/ge.h>
|
||||
|
||||
#include "geint.h"
|
||||
#include "geext.h"
|
||||
#include "protocol-versions.h"
|
||||
#include "extinit.h"
|
||||
|
||||
DevPrivateKeyRec GEClientPrivateKeyRec;
|
||||
|
||||
GEExtension GEExtensions[MAXEXTENSIONS];
|
||||
|
||||
/* Major available requests */
|
||||
static const int version_requests[] = {
|
||||
X_GEQueryVersion, /* before client sends QueryVersion */
|
||||
X_GEQueryVersion, /* must be set to last request in version 1 */
|
||||
};
|
||||
|
||||
/* Forward declarations */
|
||||
static void SGEGenericEvent(xEvent *from, xEvent *to);
|
||||
|
||||
#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
|
||||
#define EXT_MASK(ext) ((ext) & 0x7F)
|
||||
|
||||
/************************************************************/
|
||||
/* request handlers */
|
||||
/************************************************************/
|
||||
|
||||
static int
|
||||
ProcGEQueryVersion(ClientPtr client)
|
||||
{
|
||||
GEClientInfoPtr pGEClient = GEGetClient(client);
|
||||
xGEQueryVersionReply rep;
|
||||
|
||||
REQUEST(xGEQueryVersionReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(xGEQueryVersionReq);
|
||||
|
||||
rep = (xGEQueryVersionReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_GEQueryVersion,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
|
||||
/* return the supported version by the server */
|
||||
.majorVersion = SERVER_GE_MAJOR_VERSION,
|
||||
.minorVersion = SERVER_GE_MINOR_VERSION
|
||||
};
|
||||
|
||||
/* Remember version the client requested */
|
||||
pGEClient->major_version = stuff->majorVersion;
|
||||
pGEClient->minor_version = stuff->minorVersion;
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swapl(&rep.length);
|
||||
swaps(&rep.majorVersion);
|
||||
swaps(&rep.minorVersion);
|
||||
}
|
||||
|
||||
WriteToClient(client, sizeof(xGEQueryVersionReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int (*ProcGEVector[GENumberRequests]) (ClientPtr) = {
|
||||
/* Version 1.0 */
|
||||
ProcGEQueryVersion,
|
||||
};
|
||||
|
||||
/************************************************************/
|
||||
/* swapped request handlers */
|
||||
/************************************************************/
|
||||
static int
|
||||
SProcGEQueryVersion(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGEQueryVersionReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xGEQueryVersionReq);
|
||||
swaps(&stuff->majorVersion);
|
||||
swaps(&stuff->minorVersion);
|
||||
return (*ProcGEVector[stuff->ReqType]) (client);
|
||||
}
|
||||
|
||||
static int (*SProcGEVector[GENumberRequests]) (ClientPtr) = {
|
||||
/* Version 1.0 */
|
||||
SProcGEQueryVersion
|
||||
};
|
||||
|
||||
/************************************************************/
|
||||
/* callbacks */
|
||||
/************************************************************/
|
||||
|
||||
/* dispatch requests */
|
||||
static int
|
||||
ProcGEDispatch(ClientPtr client)
|
||||
{
|
||||
GEClientInfoPtr pGEClient = GEGetClient(client);
|
||||
|
||||
REQUEST(xGEReq);
|
||||
|
||||
if (pGEClient->major_version >= NUM_VERSION_REQUESTS)
|
||||
return BadRequest;
|
||||
if (stuff->ReqType > version_requests[pGEClient->major_version])
|
||||
return BadRequest;
|
||||
|
||||
return (ProcGEVector[stuff->ReqType]) (client);
|
||||
}
|
||||
|
||||
/* dispatch swapped requests */
|
||||
static int
|
||||
SProcGEDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGEReq);
|
||||
if (stuff->ReqType >= GENumberRequests)
|
||||
return BadRequest;
|
||||
return (*SProcGEVector[stuff->ReqType]) (client);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a new client inits a connection to the X server.
|
||||
*
|
||||
* We alloc a simple struct to store the client's major/minor version. Can be
|
||||
* used in the furture for versioning support.
|
||||
*/
|
||||
static void
|
||||
GEClientCallback(CallbackListPtr *list, void *closure, void *data)
|
||||
{
|
||||
NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
|
||||
ClientPtr pClient = clientinfo->client;
|
||||
GEClientInfoPtr pGEClient = GEGetClient(pClient);
|
||||
|
||||
pGEClient->major_version = 0;
|
||||
pGEClient->minor_version = 0;
|
||||
}
|
||||
|
||||
/* Reset extension. Called on server shutdown. */
|
||||
static void
|
||||
GEResetProc(ExtensionEntry * extEntry)
|
||||
{
|
||||
DeleteCallback(&ClientStateCallback, GEClientCallback, 0);
|
||||
EventSwapVector[GenericEvent] = NotImplemented;
|
||||
}
|
||||
|
||||
/* Calls the registered event swap function for the extension.
|
||||
*
|
||||
* Each extension can register a swap function to handle GenericEvents being
|
||||
* swapped properly. The server calls SGEGenericEvent() before the event is
|
||||
* written on the wire, this one calls the registered swap function to do the
|
||||
* work.
|
||||
*/
|
||||
static void
|
||||
SGEGenericEvent(xEvent *from, xEvent *to)
|
||||
{
|
||||
xGenericEvent *gefrom = (xGenericEvent *) from;
|
||||
xGenericEvent *geto = (xGenericEvent *) to;
|
||||
|
||||
if ((gefrom->extension & 0x7f) > MAXEXTENSIONS) {
|
||||
ErrorF("GE: Invalid extension offset for event.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (GEExtensions[EXT_MASK(gefrom->extension)].evswap)
|
||||
GEExtensions[EXT_MASK(gefrom->extension)].evswap(gefrom, geto);
|
||||
}
|
||||
|
||||
/* Init extension, register at server.
|
||||
* Since other extensions may rely on XGE (XInput does already), it is a good
|
||||
* idea to init XGE first, before any other extension.
|
||||
*/
|
||||
void
|
||||
GEExtensionInit(void)
|
||||
{
|
||||
ExtensionEntry *extEntry;
|
||||
|
||||
if (!dixRegisterPrivateKey
|
||||
(&GEClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(GEClientInfoRec)))
|
||||
FatalError("GEExtensionInit: GE private request failed.\n");
|
||||
|
||||
if (!AddCallback(&ClientStateCallback, GEClientCallback, 0)) {
|
||||
FatalError("GEExtensionInit: register client callback failed.\n");
|
||||
}
|
||||
|
||||
if ((extEntry = AddExtension(GE_NAME,
|
||||
0, GENumberErrors,
|
||||
ProcGEDispatch, SProcGEDispatch,
|
||||
GEResetProc, StandardMinorOpcode)) != 0) {
|
||||
memset(GEExtensions, 0, sizeof(GEExtensions));
|
||||
|
||||
EventSwapVector[GenericEvent] = (EventSwapPtr) SGEGenericEvent;
|
||||
}
|
||||
else {
|
||||
FatalError("GEInit: AddExtensions failed.\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/* interface for extensions */
|
||||
/************************************************************/
|
||||
|
||||
/* Register an extension with GE. The given swap function will be called each
|
||||
* time an event is sent to a client with different byte order.
|
||||
* @param extension The extensions major opcode
|
||||
* @param ev_swap The event swap function.
|
||||
* @param ev_fill Called for an event before delivery. The extension now has
|
||||
* the chance to fill in necessary fields for the event.
|
||||
*/
|
||||
void
|
||||
GERegisterExtension(int extension,
|
||||
void (*ev_swap) (xGenericEvent *from, xGenericEvent *to))
|
||||
{
|
||||
if (EXT_MASK(extension) >= MAXEXTENSIONS)
|
||||
FatalError("GE: extension > MAXEXTENSIONS. This should not happen.\n");
|
||||
|
||||
/* extension opcodes are > 128, might as well save some space here */
|
||||
GEExtensions[EXT_MASK(extension)].evswap = ev_swap;
|
||||
}
|
||||
|
||||
/* Sets type and extension field for a generic event. This is just an
|
||||
* auxiliary function, extensions could do it manually too.
|
||||
*/
|
||||
void
|
||||
GEInitEvent(xGenericEvent *ev, int extension)
|
||||
{
|
||||
ev->type = GenericEvent;
|
||||
ev->extension = extension;
|
||||
ev->length = 0;
|
||||
}
|
||||
81
xorg-server-1.18.4/Xext/geext.h
Normal file
81
xorg-server-1.18.4/Xext/geext.h
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _GEEXT_H_
|
||||
#define _GEEXT_H_
|
||||
#include <X11/extensions/geproto.h>
|
||||
|
||||
/** Struct to keep information about registered extensions */
|
||||
typedef struct _GEExtension {
|
||||
/** Event swapping routine */
|
||||
void (*evswap) (xGenericEvent *from, xGenericEvent *to);
|
||||
} GEExtension, *GEExtensionPtr;
|
||||
|
||||
/* All registered extensions and their handling functions. */
|
||||
extern _X_EXPORT GEExtension GEExtensions[MAXEXTENSIONS];
|
||||
|
||||
/* Typecast to generic event */
|
||||
#define GEV(ev) ((xGenericEvent*)(ev))
|
||||
/* Returns the extension offset from the event */
|
||||
#define GEEXT(ev) (GEV(ev)->extension)
|
||||
|
||||
/* Return zero-based extension offset (offset - 128). Only for use in arrays */
|
||||
#define GEEXTIDX(ev) (GEEXT(ev) & 0x7F)
|
||||
/* True if mask is set for extension on window */
|
||||
#define GEMaskIsSet(pWin, extension, mask) \
|
||||
((pWin)->optional && \
|
||||
(pWin)->optional->geMasks && \
|
||||
((pWin)->optional->geMasks->eventMasks[(extension) & 0x7F] & (mask)))
|
||||
|
||||
/* Returns first client */
|
||||
#define GECLIENT(pWin) \
|
||||
(((pWin)->optional) ? (pWin)->optional->geMasks->geClients : NULL)
|
||||
|
||||
/* Returns the event_fill for the given event */
|
||||
#define GEEventFill(ev) \
|
||||
GEExtensions[GEEXTIDX(ev)].evfill
|
||||
|
||||
#define GEIsType(ev, ext, ev_type) \
|
||||
((GEV(ev)->type == GenericEvent) && \
|
||||
GEEXT(ev) == (ext) && \
|
||||
GEV(ev)->evtype == (ev_type))
|
||||
|
||||
/* Interface for other extensions */
|
||||
extern _X_EXPORT void GERegisterExtension(int extension,
|
||||
void (*ev_dispatch) (xGenericEvent
|
||||
*from,
|
||||
xGenericEvent
|
||||
*to));
|
||||
|
||||
extern _X_EXPORT void GEInitEvent(xGenericEvent *ev, int extension);
|
||||
|
||||
#endif /* _GEEXT_H_ */
|
||||
51
xorg-server-1.18.4/Xext/geint.h
Normal file
51
xorg-server-1.18.4/Xext/geint.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright 2007-2008 Peter Hutterer
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Author: Peter Hutterer, University of South Australia, NICTA
|
||||
*/
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _GEINT_H_
|
||||
#define _GEINT_H_
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
#include "dixstruct.h"
|
||||
#include "extnsionst.h"
|
||||
#include <X11/extensions/geproto.h>
|
||||
|
||||
extern DevPrivateKeyRec GEClientPrivateKeyRec;
|
||||
|
||||
#define GEClientPrivateKey (&GEClientPrivateKeyRec)
|
||||
|
||||
typedef struct _GEClientInfo {
|
||||
CARD32 major_version;
|
||||
CARD32 minor_version;
|
||||
} GEClientInfoRec, *GEClientInfoPtr;
|
||||
|
||||
#define GEGetClient(pClient) ((GEClientInfoPtr)(dixLookupPrivate(&((pClient)->devPrivates), GEClientPrivateKey)))
|
||||
|
||||
#endif /* _GEINT_H_ */
|
||||
295
xorg-server-1.18.4/Xext/hashtable.c
Normal file
295
xorg-server-1.18.4/Xext/hashtable.c
Normal file
@ -0,0 +1,295 @@
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "misc.h"
|
||||
#include "hashtable.h"
|
||||
|
||||
/* HashResourceID */
|
||||
#include "resource.h"
|
||||
|
||||
#define INITHASHSIZE 6
|
||||
#define MAXHASHSIZE 11
|
||||
|
||||
struct HashTableRec {
|
||||
int keySize;
|
||||
int dataSize;
|
||||
|
||||
int elements; /* number of elements inserted */
|
||||
int bucketBits; /* number of buckets is 1 << bucketBits */
|
||||
struct xorg_list *buckets; /* array of bucket list heads */
|
||||
|
||||
HashFunc hash;
|
||||
HashCompareFunc compare;
|
||||
|
||||
void *cdata;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct xorg_list l;
|
||||
void *key;
|
||||
void *data;
|
||||
} BucketRec, *BucketPtr;
|
||||
|
||||
HashTable
|
||||
ht_create(int keySize,
|
||||
int dataSize,
|
||||
HashFunc hash,
|
||||
HashCompareFunc compare,
|
||||
void *cdata)
|
||||
{
|
||||
int c;
|
||||
int numBuckets;
|
||||
HashTable ht = malloc(sizeof(struct HashTableRec));
|
||||
|
||||
if (!ht) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ht->keySize = keySize;
|
||||
ht->dataSize = dataSize;
|
||||
ht->hash = hash;
|
||||
ht->compare = compare;
|
||||
ht->elements = 0;
|
||||
ht->bucketBits = INITHASHSIZE;
|
||||
numBuckets = 1 << ht->bucketBits;
|
||||
ht->buckets = xallocarray(numBuckets, sizeof(*ht->buckets));
|
||||
ht->cdata = cdata;
|
||||
|
||||
if (ht->buckets) {
|
||||
for (c = 0; c < numBuckets; ++c) {
|
||||
xorg_list_init(&ht->buckets[c]);
|
||||
}
|
||||
return ht;
|
||||
} else {
|
||||
free(ht);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ht_destroy(HashTable ht)
|
||||
{
|
||||
int c;
|
||||
BucketPtr it, tmp;
|
||||
int numBuckets = 1 << ht->bucketBits;
|
||||
for (c = 0; c < numBuckets; ++c) {
|
||||
xorg_list_for_each_entry_safe(it, tmp, &ht->buckets[c], l) {
|
||||
xorg_list_del(&it->l);
|
||||
free(it);
|
||||
}
|
||||
}
|
||||
free(ht->buckets);
|
||||
}
|
||||
|
||||
static Bool
|
||||
double_size(HashTable ht)
|
||||
{
|
||||
struct xorg_list *newBuckets;
|
||||
int numBuckets = 1 << ht->bucketBits;
|
||||
int newBucketBits = ht->bucketBits + 1;
|
||||
int newNumBuckets = 1 << newBucketBits;
|
||||
int c;
|
||||
|
||||
newBuckets = xallocarray(newNumBuckets, sizeof(*ht->buckets));
|
||||
if (newBuckets) {
|
||||
for (c = 0; c < newNumBuckets; ++c) {
|
||||
xorg_list_init(&newBuckets[c]);
|
||||
}
|
||||
|
||||
for (c = 0; c < numBuckets; ++c) {
|
||||
BucketPtr it, tmp;
|
||||
xorg_list_for_each_entry_safe(it, tmp, &ht->buckets[c], l) {
|
||||
struct xorg_list *newBucket =
|
||||
&newBuckets[ht->hash(ht->cdata, it->key, newBucketBits)];
|
||||
xorg_list_del(&it->l);
|
||||
xorg_list_add(&it->l, newBucket);
|
||||
}
|
||||
}
|
||||
free(ht->buckets);
|
||||
|
||||
ht->buckets = newBuckets;
|
||||
ht->bucketBits = newBucketBits;
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
ht_add(HashTable ht, const void *key)
|
||||
{
|
||||
unsigned index = ht->hash(ht->cdata, key, ht->bucketBits);
|
||||
struct xorg_list *bucket = &ht->buckets[index];
|
||||
BucketRec *elem = calloc(1, sizeof(BucketRec));
|
||||
if (!elem) {
|
||||
goto outOfMemory;
|
||||
}
|
||||
elem->key = malloc(ht->keySize);
|
||||
if (!elem->key) {
|
||||
goto outOfMemory;
|
||||
}
|
||||
/* we avoid signaling an out-of-memory error if dataSize is 0 */
|
||||
elem->data = calloc(1, ht->dataSize);
|
||||
if (ht->dataSize && !elem->data) {
|
||||
goto outOfMemory;
|
||||
}
|
||||
xorg_list_add(&elem->l, bucket);
|
||||
++ht->elements;
|
||||
|
||||
memcpy(elem->key, key, ht->keySize);
|
||||
|
||||
if (ht->elements > 4 * (1 << ht->bucketBits) &&
|
||||
ht->bucketBits < MAXHASHSIZE) {
|
||||
if (!double_size(ht)) {
|
||||
--ht->elements;
|
||||
xorg_list_del(&elem->l);
|
||||
goto outOfMemory;
|
||||
}
|
||||
}
|
||||
|
||||
/* if memory allocation has failed due to dataSize being 0, return
|
||||
a "dummy" pointer pointing at the of the key */
|
||||
return elem->data ? elem->data : ((char*) elem->key + ht->keySize);
|
||||
|
||||
outOfMemory:
|
||||
if (elem) {
|
||||
free(elem->key);
|
||||
free(elem->data);
|
||||
free(elem);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
ht_remove(HashTable ht, const void *key)
|
||||
{
|
||||
unsigned index = ht->hash(ht->cdata, key, ht->bucketBits);
|
||||
struct xorg_list *bucket = &ht->buckets[index];
|
||||
BucketPtr it;
|
||||
|
||||
xorg_list_for_each_entry(it, bucket, l) {
|
||||
if (ht->compare(ht->cdata, key, it->key) == 0) {
|
||||
xorg_list_del(&it->l);
|
||||
--ht->elements;
|
||||
free(it->key);
|
||||
free(it->data);
|
||||
free(it);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
ht_find(HashTable ht, const void *key)
|
||||
{
|
||||
unsigned index = ht->hash(ht->cdata, key, ht->bucketBits);
|
||||
struct xorg_list *bucket = &ht->buckets[index];
|
||||
BucketPtr it;
|
||||
|
||||
xorg_list_for_each_entry(it, bucket, l) {
|
||||
if (ht->compare(ht->cdata, key, it->key) == 0) {
|
||||
return it->data ? it->data : ((char*) it->key + ht->keySize);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
ht_dump_distribution(HashTable ht)
|
||||
{
|
||||
int c;
|
||||
int numBuckets = 1 << ht->bucketBits;
|
||||
for (c = 0; c < numBuckets; ++c) {
|
||||
BucketPtr it;
|
||||
int n = 0;
|
||||
|
||||
xorg_list_for_each_entry(it, &ht->buckets[c], l) {
|
||||
++n;
|
||||
}
|
||||
printf("%d: %d\n", c, n);
|
||||
}
|
||||
}
|
||||
|
||||
/* Picked the function from http://burtleburtle.net/bob/hash/doobs.html by
|
||||
Bob Jenkins, which is released in public domain */
|
||||
static CARD32
|
||||
one_at_a_time_hash(const void *data, int len)
|
||||
{
|
||||
CARD32 hash;
|
||||
int i;
|
||||
const char *key = data;
|
||||
for (hash=0, i=0; i<len; ++i) {
|
||||
hash += key[i];
|
||||
hash += (hash << 10);
|
||||
hash ^= (hash >> 6);
|
||||
}
|
||||
hash += (hash << 3);
|
||||
hash ^= (hash >> 11);
|
||||
hash += (hash << 15);
|
||||
return hash;
|
||||
}
|
||||
|
||||
unsigned
|
||||
ht_generic_hash(void *cdata, const void *ptr, int numBits)
|
||||
{
|
||||
HtGenericHashSetupPtr setup = cdata;
|
||||
return one_at_a_time_hash(ptr, setup->keySize) & ~((~0) << numBits);
|
||||
}
|
||||
|
||||
int
|
||||
ht_generic_compare(void *cdata, const void *l, const void *r)
|
||||
{
|
||||
HtGenericHashSetupPtr setup = cdata;
|
||||
return memcmp(l, r, setup->keySize);
|
||||
}
|
||||
|
||||
unsigned
|
||||
ht_resourceid_hash(void * cdata, const void * data, int numBits)
|
||||
{
|
||||
const XID* idPtr = data;
|
||||
XID id = *idPtr & RESOURCE_ID_MASK;
|
||||
(void) cdata;
|
||||
return HashResourceID(id, numBits);
|
||||
}
|
||||
|
||||
int
|
||||
ht_resourceid_compare(void* cdata, const void* a, const void* b)
|
||||
{
|
||||
const XID* xa = a;
|
||||
const XID* xb = b;
|
||||
(void) cdata;
|
||||
return
|
||||
*xa < *xb ? -1 :
|
||||
*xa > *xb ? 1 :
|
||||
0;
|
||||
}
|
||||
|
||||
void
|
||||
ht_dump_contents(HashTable ht,
|
||||
void (*print_key)(void *opaque, void *key),
|
||||
void (*print_value)(void *opaque, void *value),
|
||||
void* opaque)
|
||||
{
|
||||
int c;
|
||||
int numBuckets = 1 << ht->bucketBits;
|
||||
for (c = 0; c < numBuckets; ++c) {
|
||||
BucketPtr it;
|
||||
int n = 0;
|
||||
|
||||
printf("%d: ", c);
|
||||
xorg_list_for_each_entry(it, &ht->buckets[c], l) {
|
||||
if (n > 0) {
|
||||
printf(", ");
|
||||
}
|
||||
print_key(opaque, it->key);
|
||||
printf("->");
|
||||
print_value(opaque, it->data);
|
||||
++n;
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
137
xorg-server-1.18.4/Xext/hashtable.h
Normal file
137
xorg-server-1.18.4/Xext/hashtable.h
Normal file
@ -0,0 +1,137 @@
|
||||
#ifndef HASHTABLE_H
|
||||
#define HASHTABLE_H 1
|
||||
|
||||
#include <dix-config.h>
|
||||
#include <X11/Xfuncproto.h>
|
||||
#include <X11/Xdefs.h>
|
||||
#include "list.h"
|
||||
|
||||
/** @brief A hashing function.
|
||||
|
||||
@param[in/out] cdata Opaque data that can be passed to HtInit that will
|
||||
eventually end up here
|
||||
@param[in] ptr The data to be hashed. The size of the data, if
|
||||
needed, can be configured via a record that can be
|
||||
passed via cdata.
|
||||
@param[in] numBits The number of bits this hash needs to have in the
|
||||
resulting hash
|
||||
|
||||
@return A numBits-bit hash of the data
|
||||
*/
|
||||
typedef unsigned (*HashFunc)(void * cdata, const void * ptr, int numBits);
|
||||
|
||||
/** @brief A comparison function for hashed keys.
|
||||
|
||||
@param[in/out] cdata Opaque data that ca be passed to Htinit that will
|
||||
eventually end up here
|
||||
@param[in] l The left side data to be compared
|
||||
@param[in] r The right side data to be compared
|
||||
|
||||
@return -1 if l < r, 0 if l == r, 1 if l > r
|
||||
*/
|
||||
typedef int (*HashCompareFunc)(void * cdata, const void * l, const void * r);
|
||||
|
||||
struct HashTableRec;
|
||||
|
||||
typedef struct HashTableRec *HashTable;
|
||||
|
||||
/** @brief A configuration for HtGenericHash */
|
||||
typedef struct {
|
||||
int keySize;
|
||||
} HtGenericHashSetupRec, *HtGenericHashSetupPtr;
|
||||
|
||||
/** @brief ht_create initalizes a hash table for a certain hash table
|
||||
configuration
|
||||
|
||||
@param[out] ht The hash table structure to initialize
|
||||
@param[in] keySize The key size in bytes
|
||||
@param[in] dataSize The data size in bytes
|
||||
@param[in] hash The hash function to use for hashing keys
|
||||
@param[in] compare The comparison function for hashing keys
|
||||
@param[in] cdata Opaque data that will be passed to hash and
|
||||
comparison functions
|
||||
*/
|
||||
extern _X_EXPORT HashTable ht_create(int keySize,
|
||||
int dataSize,
|
||||
HashFunc hash,
|
||||
HashCompareFunc compare,
|
||||
void *cdata);
|
||||
/** @brief HtDestruct deinitializes the structure. It does not free the
|
||||
memory allocated to HashTableRec
|
||||
*/
|
||||
extern _X_EXPORT void ht_destroy(HashTable ht);
|
||||
|
||||
/** @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
|
||||
be initialized with zeroes.
|
||||
|
||||
@param[in/out] ht The hash table
|
||||
@param[key] key The key. The contents of the key will be copied.
|
||||
|
||||
@return On error NULL is returned, otherwise a pointer to the data
|
||||
associated with the newly inserted key.
|
||||
|
||||
@note If dataSize is 0, a pointer to the end of the key may be returned
|
||||
to avoid returning NULL. Obviously the data pointed cannot be
|
||||
modified, as implied by dataSize being 0.
|
||||
*/
|
||||
extern _X_EXPORT void *ht_add(HashTable ht, const void *key);
|
||||
|
||||
/** @brief Removes a key from the hash table along with its
|
||||
associated data, which will be free'd.
|
||||
*/
|
||||
extern _X_EXPORT void ht_remove(HashTable ht, const void *key);
|
||||
|
||||
/** @brief Finds the associated data of a key from the hash table.
|
||||
|
||||
@return If the key cannot be found, the function returns NULL.
|
||||
Otherwise it returns a pointer to the data associated
|
||||
with the key.
|
||||
|
||||
@note If dataSize == 0, this function may return NULL
|
||||
even if the key has been inserted! If dataSize == NULL,
|
||||
use HtMember instead to determine if a key has been
|
||||
inserted.
|
||||
*/
|
||||
extern _X_EXPORT void *ht_find(HashTable ht, const void *key);
|
||||
|
||||
/** @brief A generic hash function */
|
||||
extern _X_EXPORT unsigned ht_generic_hash(void *cdata,
|
||||
const void *ptr,
|
||||
int numBits);
|
||||
|
||||
/** @brief A generic comparison function. It compares data byte-wise. */
|
||||
extern _X_EXPORT int ht_generic_compare(void *cdata,
|
||||
const void *l,
|
||||
const void *r);
|
||||
|
||||
/** @brief A debugging function that dumps the distribution of the
|
||||
hash table: for each bucket, list the number of elements
|
||||
contained within. */
|
||||
extern _X_EXPORT void ht_dump_distribution(HashTable ht);
|
||||
|
||||
/** @brief A debugging function that dumps the contents of the hash
|
||||
table: for each bucket, list the elements contained
|
||||
within. */
|
||||
extern _X_EXPORT void ht_dump_contents(HashTable ht,
|
||||
void (*print_key)(void *opaque, void *key),
|
||||
void (*print_value)(void *opaque, void *value),
|
||||
void* opaque);
|
||||
|
||||
/** @brief A hashing function to be used for hashing resource IDs when
|
||||
used with HashTables. It makes no use of cdata, so that can
|
||||
be NULL. It uses HashXID underneath, and should HashXID be
|
||||
unable to hash the value, it switches into using the generic
|
||||
hash function. */
|
||||
extern _X_EXPORT unsigned ht_resourceid_hash(void *cdata,
|
||||
const void * data,
|
||||
int numBits);
|
||||
|
||||
/** @brief A comparison function to be used for comparing resource
|
||||
IDs when used with HashTables. It makes no use of cdata,
|
||||
so that can be NULL. */
|
||||
extern _X_EXPORT int ht_resourceid_compare(void *cdata,
|
||||
const void *a,
|
||||
const void *b);
|
||||
|
||||
#endif // HASHTABLE_H
|
||||
1298
xorg-server-1.18.4/Xext/panoramiX.c
Normal file
1298
xorg-server-1.18.4/Xext/panoramiX.c
Normal file
File diff suppressed because it is too large
Load Diff
79
xorg-server-1.18.4/Xext/panoramiX.h
Normal file
79
xorg-server-1.18.4/Xext/panoramiX.h
Normal file
@ -0,0 +1,79 @@
|
||||
/*****************************************************************
|
||||
|
||||
Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software.
|
||||
|
||||
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
|
||||
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
|
||||
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL 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 Digital Equipment Corporation
|
||||
shall not be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Software without prior written authorization from Digital
|
||||
Equipment Corporation.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/* THIS IS NOT AN X PROJECT TEAM SPECIFICATION */
|
||||
|
||||
/*
|
||||
* PanoramiX definitions
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _PANORAMIX_H_
|
||||
#define _PANORAMIX_H_
|
||||
|
||||
#define _PANORAMIX_SERVER
|
||||
#include <X11/extensions/panoramiXproto.h>
|
||||
#undef _PANORAMIX_SERVER
|
||||
#include "gcstruct.h"
|
||||
#include "dixstruct.h"
|
||||
|
||||
typedef struct _PanoramiXInfo {
|
||||
XID id;
|
||||
} PanoramiXInfo;
|
||||
|
||||
typedef struct {
|
||||
PanoramiXInfo info[MAXSCREENS];
|
||||
RESTYPE type;
|
||||
union {
|
||||
struct {
|
||||
char visibility;
|
||||
char class;
|
||||
char root;
|
||||
} win;
|
||||
struct {
|
||||
Bool shared;
|
||||
} pix;
|
||||
struct {
|
||||
Bool root;
|
||||
} pict;
|
||||
char raw_data[4];
|
||||
} u;
|
||||
} PanoramiXRes;
|
||||
|
||||
#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_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_ROOT_DRAWABLE(d) (((d)->type == XRT_WINDOW) && (d)->u.win.root)
|
||||
#endif /* _PANORAMIX_H_ */
|
||||
133
xorg-server-1.18.4/Xext/panoramiXSwap.c
Normal file
133
xorg-server-1.18.4/Xext/panoramiXSwap.c
Normal file
@ -0,0 +1,133 @@
|
||||
/*****************************************************************
|
||||
Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software.
|
||||
|
||||
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
|
||||
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
|
||||
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL 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 Digital Equipment Corporation
|
||||
shall not be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Software without prior written authorization from Digital
|
||||
Equipment Corporation.
|
||||
******************************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include "misc.h"
|
||||
#include "cursor.h"
|
||||
#include "cursorstr.h"
|
||||
#include "extnsionst.h"
|
||||
#include "dixstruct.h"
|
||||
#include "gc.h"
|
||||
#include "gcstruct.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "window.h"
|
||||
#include "windowstr.h"
|
||||
#include "pixmapstr.h"
|
||||
#include "panoramiX.h"
|
||||
#include <X11/extensions/panoramiXproto.h>
|
||||
#include "panoramiXsrv.h"
|
||||
#include "globals.h"
|
||||
#include "panoramiXh.h"
|
||||
|
||||
static int
|
||||
SProcPanoramiXQueryVersion(ClientPtr client)
|
||||
{
|
||||
REQUEST(xPanoramiXQueryVersionReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
|
||||
return ProcPanoramiXQueryVersion(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcPanoramiXGetState(ClientPtr client)
|
||||
{
|
||||
REQUEST(xPanoramiXGetStateReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
|
||||
swapl(&stuff->window);
|
||||
return ProcPanoramiXGetState(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcPanoramiXGetScreenCount(ClientPtr client)
|
||||
{
|
||||
REQUEST(xPanoramiXGetScreenCountReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
|
||||
swapl(&stuff->window);
|
||||
return ProcPanoramiXGetScreenCount(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcPanoramiXGetScreenSize(ClientPtr client)
|
||||
{
|
||||
REQUEST(xPanoramiXGetScreenSizeReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
|
||||
swapl(&stuff->window);
|
||||
swapl(&stuff->screen);
|
||||
return ProcPanoramiXGetScreenSize(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXineramaIsActive(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXineramaIsActiveReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
|
||||
return ProcXineramaIsActive(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXineramaQueryScreens(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXineramaQueryScreensReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
|
||||
return ProcXineramaQueryScreens(client);
|
||||
}
|
||||
|
||||
int
|
||||
SProcPanoramiXDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
switch (stuff->data) {
|
||||
case X_PanoramiXQueryVersion:
|
||||
return SProcPanoramiXQueryVersion(client);
|
||||
case X_PanoramiXGetState:
|
||||
return SProcPanoramiXGetState(client);
|
||||
case X_PanoramiXGetScreenCount:
|
||||
return SProcPanoramiXGetScreenCount(client);
|
||||
case X_PanoramiXGetScreenSize:
|
||||
return SProcPanoramiXGetScreenSize(client);
|
||||
case X_XineramaIsActive:
|
||||
return SProcXineramaIsActive(client);
|
||||
case X_XineramaQueryScreens:
|
||||
return SProcXineramaQueryScreens(client);
|
||||
}
|
||||
return BadRequest;
|
||||
}
|
||||
73
xorg-server-1.18.4/Xext/panoramiXh.h
Normal file
73
xorg-server-1.18.4/Xext/panoramiXh.h
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
/*
|
||||
* Server dispatcher function replacements
|
||||
*/
|
||||
|
||||
extern int PanoramiXCreateWindow(ClientPtr client);
|
||||
extern int PanoramiXChangeWindowAttributes(ClientPtr client);
|
||||
extern int PanoramiXDestroyWindow(ClientPtr client);
|
||||
extern int PanoramiXDestroySubwindows(ClientPtr client);
|
||||
extern int PanoramiXChangeSaveSet(ClientPtr client);
|
||||
extern int PanoramiXReparentWindow(ClientPtr client);
|
||||
extern int PanoramiXMapWindow(ClientPtr client);
|
||||
extern int PanoramiXMapSubwindows(ClientPtr client);
|
||||
extern int PanoramiXUnmapWindow(ClientPtr client);
|
||||
extern int PanoramiXUnmapSubwindows(ClientPtr client);
|
||||
extern int PanoramiXConfigureWindow(ClientPtr client);
|
||||
extern int PanoramiXCirculateWindow(ClientPtr client);
|
||||
extern int PanoramiXGetGeometry(ClientPtr client);
|
||||
extern int PanoramiXTranslateCoords(ClientPtr client);
|
||||
extern int PanoramiXCreatePixmap(ClientPtr client);
|
||||
extern int PanoramiXFreePixmap(ClientPtr client);
|
||||
extern int PanoramiXChangeGC(ClientPtr client);
|
||||
extern int PanoramiXCopyGC(ClientPtr client);
|
||||
extern int PanoramiXCopyColormapAndFree(ClientPtr client);
|
||||
extern int PanoramiXCreateGC(ClientPtr client);
|
||||
extern int PanoramiXSetDashes(ClientPtr client);
|
||||
extern int PanoramiXSetClipRectangles(ClientPtr client);
|
||||
extern int PanoramiXFreeGC(ClientPtr client);
|
||||
extern int PanoramiXClearToBackground(ClientPtr client);
|
||||
extern int PanoramiXCopyArea(ClientPtr client);
|
||||
extern int PanoramiXCopyPlane(ClientPtr client);
|
||||
extern int PanoramiXPolyPoint(ClientPtr client);
|
||||
extern int PanoramiXPolyLine(ClientPtr client);
|
||||
extern int PanoramiXPolySegment(ClientPtr client);
|
||||
extern int PanoramiXPolyRectangle(ClientPtr client);
|
||||
extern int PanoramiXPolyArc(ClientPtr client);
|
||||
extern int PanoramiXFillPoly(ClientPtr client);
|
||||
extern int PanoramiXPolyFillArc(ClientPtr client);
|
||||
extern int PanoramiXPolyFillRectangle(ClientPtr client);
|
||||
extern int PanoramiXPutImage(ClientPtr client);
|
||||
extern int PanoramiXGetImage(ClientPtr client);
|
||||
extern int PanoramiXPolyText8(ClientPtr client);
|
||||
extern int PanoramiXPolyText16(ClientPtr client);
|
||||
extern int PanoramiXImageText8(ClientPtr client);
|
||||
extern int PanoramiXImageText16(ClientPtr client);
|
||||
extern int PanoramiXCreateColormap(ClientPtr client);
|
||||
extern int PanoramiXFreeColormap(ClientPtr client);
|
||||
extern int PanoramiXInstallColormap(ClientPtr client);
|
||||
extern int PanoramiXUninstallColormap(ClientPtr client);
|
||||
extern int PanoramiXAllocColor(ClientPtr client);
|
||||
extern int PanoramiXAllocNamedColor(ClientPtr client);
|
||||
extern int PanoramiXAllocColorCells(ClientPtr client);
|
||||
extern int PanoramiXStoreNamedColor(ClientPtr client);
|
||||
extern int PanoramiXFreeColors(ClientPtr client);
|
||||
extern int PanoramiXStoreColors(ClientPtr client);
|
||||
extern int PanoramiXAllocColorPlanes(ClientPtr client);
|
||||
|
||||
#define PROC_EXTERN(pfunc) extern int pfunc(ClientPtr)
|
||||
|
||||
PROC_EXTERN(ProcPanoramiXQueryVersion);
|
||||
PROC_EXTERN(ProcPanoramiXGetState);
|
||||
PROC_EXTERN(ProcPanoramiXGetScreenCount);
|
||||
PROC_EXTERN(ProcPanoramiXGetScreenSize);
|
||||
|
||||
PROC_EXTERN(ProcXineramaQueryScreens);
|
||||
PROC_EXTERN(ProcXineramaIsActive);
|
||||
|
||||
extern int SProcPanoramiXDispatch(ClientPtr client);
|
||||
|
||||
extern int connBlockScreenStart;
|
||||
extern xConnSetupPrefix connSetupPrefix;
|
||||
|
||||
extern int (*SavedProcVector[256]) (ClientPtr client);
|
||||
2552
xorg-server-1.18.4/Xext/panoramiXprocs.c
Normal file
2552
xorg-server-1.18.4/Xext/panoramiXprocs.c
Normal file
File diff suppressed because it is too large
Load Diff
63
xorg-server-1.18.4/Xext/panoramiXsrv.h
Normal file
63
xorg-server-1.18.4/Xext/panoramiXsrv.h
Normal file
@ -0,0 +1,63 @@
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _PANORAMIXSRV_H_
|
||||
#define _PANORAMIXSRV_H_
|
||||
|
||||
#include "panoramiX.h"
|
||||
|
||||
extern _X_EXPORT int PanoramiXNumScreens;
|
||||
extern _X_EXPORT int PanoramiXPixWidth;
|
||||
extern _X_EXPORT int PanoramiXPixHeight;
|
||||
extern _X_EXPORT RegionRec PanoramiXScreenRegion;
|
||||
|
||||
extern _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);
|
||||
|
||||
extern _X_EXPORT void XineramaReinitData(void);
|
||||
|
||||
extern _X_EXPORT RESTYPE XRC_DRAWABLE;
|
||||
extern _X_EXPORT RESTYPE XRT_WINDOW;
|
||||
extern _X_EXPORT RESTYPE XRT_PIXMAP;
|
||||
extern _X_EXPORT RESTYPE XRT_GC;
|
||||
extern _X_EXPORT RESTYPE XRT_COLORMAP;
|
||||
extern _X_EXPORT RESTYPE XRT_PICTURE;
|
||||
|
||||
/*
|
||||
* Drivers are allowed to wrap this function. Each wrapper can decide that the
|
||||
* two visuals are unequal, but if they are deemed equal, the wrapper must call
|
||||
* down and return FALSE if the wrapped function does. This ensures that all
|
||||
* layers agree that the visuals are equal. The first visual is always from
|
||||
* screen 0.
|
||||
*/
|
||||
typedef Bool (*XineramaVisualsEqualProcPtr) (VisualPtr, ScreenPtr, VisualPtr);
|
||||
extern _X_EXPORT XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr;
|
||||
|
||||
extern _X_EXPORT void XineramaGetImageData(DrawablePtr *pDrawables,
|
||||
int left,
|
||||
int top,
|
||||
int width,
|
||||
int height,
|
||||
unsigned int format,
|
||||
unsigned long planemask,
|
||||
char *data, int pitch, Bool isRoot);
|
||||
|
||||
static inline void
|
||||
panoramix_setup_ids(PanoramiXRes * resource, ClientPtr client, XID base_id)
|
||||
{
|
||||
int j;
|
||||
|
||||
resource->info[0].id = base_id;
|
||||
FOR_NSCREENS_FORWARD_SKIP(j) {
|
||||
resource->info[j].id = FakeClientID(client->index);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _PANORAMIXSRV_H_ */
|
||||
1392
xorg-server-1.18.4/Xext/saver.c
Normal file
1392
xorg-server-1.18.4/Xext/saver.c
Normal file
File diff suppressed because it is too large
Load Diff
1090
xorg-server-1.18.4/Xext/security.c
Normal file
1090
xorg-server-1.18.4/Xext/security.c
Normal file
File diff suppressed because it is too large
Load Diff
82
xorg-server-1.18.4/Xext/securitysrv.h
Normal file
82
xorg-server-1.18.4/Xext/securitysrv.h
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
Copyright 1996, 1998 The Open Group
|
||||
|
||||
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 OPEN GROUP 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 Open Group 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 Open Group.
|
||||
*/
|
||||
|
||||
/* Xserver internals for Security extension - moved here from
|
||||
_SECURITY_SERVER section of <X11/extensions/security.h> */
|
||||
|
||||
#ifndef _SECURITY_SRV_H
|
||||
#define _SECURITY_SRV_H
|
||||
|
||||
/* Allow client side portions of <X11/extensions/security.h> to compile */
|
||||
#ifndef Status
|
||||
#define Status int
|
||||
#define NEED_UNDEF_Status
|
||||
#endif
|
||||
#ifndef Display
|
||||
#define Display void
|
||||
#define NEED_UNDEF_Display
|
||||
#endif
|
||||
|
||||
#include <X11/extensions/secur.h>
|
||||
|
||||
#ifdef NEED_UNDEF_Status
|
||||
#undef Status
|
||||
#undef NEED_UNDEF_Status
|
||||
#endif
|
||||
#ifdef NEED_UNDEF_Display
|
||||
#undef Display
|
||||
#undef NEED_UNDEF_Display
|
||||
#endif
|
||||
|
||||
#include "input.h" /* for DeviceIntPtr */
|
||||
#include "property.h" /* for PropertyPtr */
|
||||
#include "pixmap.h" /* for DrawablePtr */
|
||||
#include "resource.h" /* for RESTYPE */
|
||||
|
||||
/* resource type to pass in LookupIDByType for authorizations */
|
||||
extern RESTYPE SecurityAuthorizationResType;
|
||||
|
||||
/* this is what we store for an authorization */
|
||||
typedef struct {
|
||||
XID id; /* resource ID */
|
||||
CARD32 timeout; /* how long to live in seconds after refcnt == 0 */
|
||||
unsigned int trustLevel; /* trusted/untrusted */
|
||||
XID group; /* see embedding extension */
|
||||
unsigned int refcnt; /* how many clients connected with this auth */
|
||||
unsigned int secondsRemaining; /* overflow time amount for >49 days */
|
||||
OsTimerPtr timer; /* timer for this auth */
|
||||
struct _OtherClients *eventClients; /* clients wanting events */
|
||||
} SecurityAuthorizationRec, *SecurityAuthorizationPtr;
|
||||
|
||||
typedef struct {
|
||||
XID group; /* the group that was sent in GenerateAuthorization */
|
||||
Bool valid; /* did anyone recognize it? if so, set to TRUE */
|
||||
} SecurityValidateGroupInfoRec;
|
||||
|
||||
/* Give this value or higher to the -audit option to get security messages */
|
||||
#define SECURITY_AUDIT_LEVEL 4
|
||||
|
||||
#endif /* _SECURITY_SRV_H */
|
||||
1240
xorg-server-1.18.4/Xext/shape.c
Normal file
1240
xorg-server-1.18.4/Xext/shape.c
Normal file
File diff suppressed because it is too large
Load Diff
1533
xorg-server-1.18.4/Xext/shm.c
Normal file
1533
xorg-server-1.18.4/Xext/shm.c
Normal file
File diff suppressed because it is too large
Load Diff
93
xorg-server-1.18.4/Xext/shmint.h
Normal file
93
xorg-server-1.18.4/Xext/shmint.h
Normal file
@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright © 2003 Keith Packard
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of Keith Packard not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. Keith Packard makes no
|
||||
* representations about the suitability of this software for any purpose. It
|
||||
* is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _SHMINT_H_
|
||||
#define _SHMINT_H_
|
||||
|
||||
#include <X11/extensions/shmproto.h>
|
||||
|
||||
#include "screenint.h"
|
||||
#include "pixmap.h"
|
||||
#include "gc.h"
|
||||
|
||||
#define XSHM_PUT_IMAGE_ARGS \
|
||||
DrawablePtr /* dst */, \
|
||||
GCPtr /* pGC */, \
|
||||
int /* depth */, \
|
||||
unsigned int /* format */, \
|
||||
int /* w */, \
|
||||
int /* h */, \
|
||||
int /* sx */, \
|
||||
int /* sy */, \
|
||||
int /* sw */, \
|
||||
int /* sh */, \
|
||||
int /* dx */, \
|
||||
int /* dy */, \
|
||||
char * /* data */
|
||||
|
||||
#define XSHM_CREATE_PIXMAP_ARGS \
|
||||
ScreenPtr /* pScreen */, \
|
||||
int /* width */, \
|
||||
int /* height */, \
|
||||
int /* depth */, \
|
||||
char * /* addr */
|
||||
|
||||
typedef struct _ShmFuncs {
|
||||
PixmapPtr (*CreatePixmap) (XSHM_CREATE_PIXMAP_ARGS);
|
||||
void (*PutImage) (XSHM_PUT_IMAGE_ARGS);
|
||||
} ShmFuncs, *ShmFuncsPtr;
|
||||
|
||||
#if XTRANS_SEND_FDS
|
||||
#define SHM_FD_PASSING 1
|
||||
#endif
|
||||
|
||||
typedef struct _ShmDesc {
|
||||
struct _ShmDesc *next;
|
||||
int shmid;
|
||||
int refcnt;
|
||||
char *addr;
|
||||
Bool writable;
|
||||
unsigned long size;
|
||||
#ifdef SHM_FD_PASSING
|
||||
Bool is_fd;
|
||||
struct busfault *busfault;
|
||||
XID resource;
|
||||
#endif
|
||||
} ShmDescRec, *ShmDescPtr;
|
||||
|
||||
#ifdef SHM_FD_PASSING
|
||||
#define SHMDESC_IS_FD(shmdesc) ((shmdesc)->is_fd)
|
||||
#else
|
||||
#define SHMDESC_IS_FD(shmdesc) (0)
|
||||
#endif
|
||||
|
||||
extern _X_EXPORT void
|
||||
ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
|
||||
|
||||
extern _X_EXPORT void
|
||||
ShmRegisterFbFuncs(ScreenPtr pScreen);
|
||||
|
||||
extern _X_EXPORT RESTYPE ShmSegType;
|
||||
extern _X_EXPORT int ShmCompletionCode;
|
||||
extern _X_EXPORT int BadShmSegCode;
|
||||
|
||||
#endif /* _SHMINT_H_ */
|
||||
209
xorg-server-1.18.4/Xext/sleepuntil.c
Normal file
209
xorg-server-1.18.4/Xext/sleepuntil.c
Normal file
@ -0,0 +1,209 @@
|
||||
/*
|
||||
*
|
||||
Copyright 1992, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
*
|
||||
* Author: Keith Packard, MIT X Consortium
|
||||
*/
|
||||
|
||||
/* dixsleep.c - implement millisecond timeouts for X clients */
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "sleepuntil.h"
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xmd.h>
|
||||
#include "misc.h"
|
||||
#include "windowstr.h"
|
||||
#include "dixstruct.h"
|
||||
#include "pixmapstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
typedef struct _Sertafied {
|
||||
struct _Sertafied *next;
|
||||
TimeStamp revive;
|
||||
ClientPtr pClient;
|
||||
XID id;
|
||||
void (*notifyFunc) (ClientPtr /* client */ ,
|
||||
void * /* closure */
|
||||
);
|
||||
|
||||
void *closure;
|
||||
} SertafiedRec, *SertafiedPtr;
|
||||
|
||||
static SertafiedPtr pPending;
|
||||
static RESTYPE SertafiedResType;
|
||||
static Bool BlockHandlerRegistered;
|
||||
static int SertafiedGeneration;
|
||||
|
||||
static void ClientAwaken(ClientPtr /* client */ ,
|
||||
void * /* closure */
|
||||
);
|
||||
static int SertafiedDelete(void * /* value */ ,
|
||||
XID /* id */
|
||||
);
|
||||
static void SertafiedBlockHandler(void * /* data */ ,
|
||||
OSTimePtr /* wt */ ,
|
||||
void * /* LastSelectMask */
|
||||
);
|
||||
static void SertafiedWakeupHandler(void * /* data */ ,
|
||||
int /* i */ ,
|
||||
void * /* LastSelectMask */
|
||||
);
|
||||
|
||||
int
|
||||
ClientSleepUntil(ClientPtr client,
|
||||
TimeStamp *revive,
|
||||
void (*notifyFunc) (ClientPtr, void *), void *closure)
|
||||
{
|
||||
SertafiedPtr pRequest, pReq, pPrev;
|
||||
|
||||
if (SertafiedGeneration != serverGeneration) {
|
||||
SertafiedResType = CreateNewResourceType(SertafiedDelete,
|
||||
"ClientSleep");
|
||||
if (!SertafiedResType)
|
||||
return FALSE;
|
||||
SertafiedGeneration = serverGeneration;
|
||||
BlockHandlerRegistered = FALSE;
|
||||
}
|
||||
pRequest = malloc(sizeof(SertafiedRec));
|
||||
if (!pRequest)
|
||||
return FALSE;
|
||||
pRequest->pClient = client;
|
||||
pRequest->revive = *revive;
|
||||
pRequest->id = FakeClientID(client->index);
|
||||
pRequest->closure = closure;
|
||||
if (!BlockHandlerRegistered) {
|
||||
if (!RegisterBlockAndWakeupHandlers(SertafiedBlockHandler,
|
||||
SertafiedWakeupHandler,
|
||||
(void *) 0)) {
|
||||
free(pRequest);
|
||||
return FALSE;
|
||||
}
|
||||
BlockHandlerRegistered = TRUE;
|
||||
}
|
||||
pRequest->notifyFunc = 0;
|
||||
if (!AddResource(pRequest->id, SertafiedResType, (void *) pRequest))
|
||||
return FALSE;
|
||||
if (!notifyFunc)
|
||||
notifyFunc = ClientAwaken;
|
||||
pRequest->notifyFunc = notifyFunc;
|
||||
/* Insert into time-ordered queue, with earliest activation time coming first. */
|
||||
pPrev = 0;
|
||||
for (pReq = pPending; pReq; pReq = pReq->next) {
|
||||
if (CompareTimeStamps(pReq->revive, *revive) == LATER)
|
||||
break;
|
||||
pPrev = pReq;
|
||||
}
|
||||
if (pPrev)
|
||||
pPrev->next = pRequest;
|
||||
else
|
||||
pPending = pRequest;
|
||||
pRequest->next = pReq;
|
||||
IgnoreClient(client);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
ClientAwaken(ClientPtr client, void *closure)
|
||||
{
|
||||
if (!client->clientGone)
|
||||
AttendClient(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SertafiedDelete(void *value, XID id)
|
||||
{
|
||||
SertafiedPtr pRequest = (SertafiedPtr) value;
|
||||
SertafiedPtr pReq, pPrev;
|
||||
|
||||
pPrev = 0;
|
||||
for (pReq = pPending; pReq; pPrev = pReq, pReq = pReq->next)
|
||||
if (pReq == pRequest) {
|
||||
if (pPrev)
|
||||
pPrev->next = pReq->next;
|
||||
else
|
||||
pPending = pReq->next;
|
||||
break;
|
||||
}
|
||||
if (pRequest->notifyFunc)
|
||||
(*pRequest->notifyFunc) (pRequest->pClient, pRequest->closure);
|
||||
free(pRequest);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
SertafiedBlockHandler(void *data, OSTimePtr wt, void *LastSelectMask)
|
||||
{
|
||||
SertafiedPtr pReq, pNext;
|
||||
unsigned long delay;
|
||||
TimeStamp now;
|
||||
|
||||
if (!pPending)
|
||||
return;
|
||||
now.milliseconds = GetTimeInMillis();
|
||||
now.months = currentTime.months;
|
||||
if ((int) (now.milliseconds - currentTime.milliseconds) < 0)
|
||||
now.months++;
|
||||
for (pReq = pPending; pReq; pReq = pNext) {
|
||||
pNext = pReq->next;
|
||||
if (CompareTimeStamps(pReq->revive, now) == LATER)
|
||||
break;
|
||||
FreeResource(pReq->id, RT_NONE);
|
||||
|
||||
/* AttendClient() may have been called via the resource delete
|
||||
* function so a client may have input to be processed and so
|
||||
* set delay to 0 to prevent blocking in WaitForSomething().
|
||||
*/
|
||||
AdjustWaitForDelay(wt, 0);
|
||||
}
|
||||
pReq = pPending;
|
||||
if (!pReq)
|
||||
return;
|
||||
delay = pReq->revive.milliseconds - now.milliseconds;
|
||||
AdjustWaitForDelay(wt, delay);
|
||||
}
|
||||
|
||||
static void
|
||||
SertafiedWakeupHandler(void *data, int i, void *LastSelectMask)
|
||||
{
|
||||
SertafiedPtr pReq, pNext;
|
||||
TimeStamp now;
|
||||
|
||||
now.milliseconds = GetTimeInMillis();
|
||||
now.months = currentTime.months;
|
||||
if ((int) (now.milliseconds - currentTime.milliseconds) < 0)
|
||||
now.months++;
|
||||
for (pReq = pPending; pReq; pReq = pNext) {
|
||||
pNext = pReq->next;
|
||||
if (CompareTimeStamps(pReq->revive, now) == LATER)
|
||||
break;
|
||||
FreeResource(pReq->id, RT_NONE);
|
||||
}
|
||||
if (!pPending) {
|
||||
RemoveBlockAndWakeupHandlers(SertafiedBlockHandler,
|
||||
SertafiedWakeupHandler, (void *) 0);
|
||||
BlockHandlerRegistered = FALSE;
|
||||
}
|
||||
}
|
||||
42
xorg-server-1.18.4/Xext/sleepuntil.h
Normal file
42
xorg-server-1.18.4/Xext/sleepuntil.h
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (C) 2001 The XFree86 Project, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* XFREE86 PROJECT 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 XFree86 Project 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
|
||||
* XFree86 Project.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef _SLEEPUNTIL_H_
|
||||
#define _SLEEPUNTIL_H_ 1
|
||||
|
||||
#include "dix.h"
|
||||
|
||||
extern int ClientSleepUntil(ClientPtr client,
|
||||
TimeStamp *revive,
|
||||
void (*notifyFunc) (ClientPtr /* client */ ,
|
||||
void * /* closure */
|
||||
), void *Closure);
|
||||
|
||||
#endif
|
||||
2877
xorg-server-1.18.4/Xext/sync.c
Normal file
2877
xorg-server-1.18.4/Xext/sync.c
Normal file
File diff suppressed because it is too large
Load Diff
46
xorg-server-1.18.4/Xext/syncsdk.h
Normal file
46
xorg-server-1.18.4/Xext/syncsdk.h
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright © 2010 NVIDIA Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _SYNCSDK_H_
|
||||
#define _SYNCSDK_H_
|
||||
|
||||
#include "misync.h"
|
||||
|
||||
extern _X_EXPORT int
|
||||
SyncVerifyFence(SyncFence ** ppFence, XID fid, ClientPtr client, Mask mode);
|
||||
|
||||
#define VERIFY_SYNC_FENCE(pFence, fid, client, mode) \
|
||||
do { \
|
||||
int rc; \
|
||||
rc = SyncVerifyFence(&(pFence), (fid), (client), (mode)); \
|
||||
if (Success != rc) return rc; \
|
||||
} while (0)
|
||||
|
||||
#define VERIFY_SYNC_FENCE_OR_NONE(pFence, fid, client, mode) \
|
||||
do { \
|
||||
pFence = 0; \
|
||||
if (None != fid) \
|
||||
VERIFY_SYNC_FENCE((pFence), (fid), (client), (mode)); \
|
||||
} while (0)
|
||||
|
||||
#endif /* _SYNCSDK_H_ */
|
||||
152
xorg-server-1.18.4/Xext/syncsrv.h
Normal file
152
xorg-server-1.18.4/Xext/syncsrv.h
Normal file
@ -0,0 +1,152 @@
|
||||
/*
|
||||
|
||||
Copyright 1991, 1993, 1994, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
*/
|
||||
|
||||
/***********************************************************
|
||||
Copyright 1991,1993 by Digital Equipment Corporation, Maynard, Massachusetts,
|
||||
and Olivetti Research Limited, Cambridge, England.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Digital or Olivetti
|
||||
not be used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
DIGITAL AND OLIVETTI DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS, IN NO EVENT SHALL THEY BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef _SYNCSRV_H_
|
||||
#define _SYNCSRV_H_
|
||||
|
||||
#include "list.h"
|
||||
#include "misync.h"
|
||||
#include "misyncstr.h"
|
||||
|
||||
/*
|
||||
* The System Counter interface
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
XSyncCounterNeverChanges,
|
||||
XSyncCounterNeverIncreases,
|
||||
XSyncCounterNeverDecreases,
|
||||
XSyncCounterUnrestricted
|
||||
} SyncCounterType;
|
||||
|
||||
typedef void (*SyncSystemCounterQueryValue)(void *counter,
|
||||
CARD64 *value_return
|
||||
);
|
||||
typedef void (*SyncSystemCounterBracketValues)(void *counter,
|
||||
CARD64 *pbracket_less,
|
||||
CARD64 *pbracket_greater
|
||||
);
|
||||
|
||||
typedef struct _SysCounterInfo {
|
||||
SyncCounter *pCounter;
|
||||
char *name;
|
||||
CARD64 resolution;
|
||||
CARD64 bracket_greater;
|
||||
CARD64 bracket_less;
|
||||
SyncCounterType counterType; /* how can this counter change */
|
||||
SyncSystemCounterQueryValue QueryValue;
|
||||
SyncSystemCounterBracketValues BracketValues;
|
||||
void *private;
|
||||
struct xorg_list entry;
|
||||
} SysCounterInfo;
|
||||
|
||||
typedef struct _SyncAlarmClientList {
|
||||
ClientPtr client;
|
||||
XID delete_id;
|
||||
struct _SyncAlarmClientList *next;
|
||||
} SyncAlarmClientList;
|
||||
|
||||
typedef struct _SyncAlarm {
|
||||
SyncTrigger trigger;
|
||||
ClientPtr client;
|
||||
XSyncAlarm alarm_id;
|
||||
CARD64 delta;
|
||||
int events;
|
||||
int state;
|
||||
SyncAlarmClientList *pEventClients;
|
||||
} SyncAlarm;
|
||||
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
CARD32 delete_id;
|
||||
int num_waitconditions;
|
||||
} SyncAwaitHeader;
|
||||
|
||||
typedef struct {
|
||||
SyncTrigger trigger;
|
||||
CARD64 event_threshold;
|
||||
SyncAwaitHeader *pHeader;
|
||||
} SyncAwait;
|
||||
|
||||
typedef union {
|
||||
SyncAwaitHeader header;
|
||||
SyncAwait await;
|
||||
} SyncAwaitUnion;
|
||||
|
||||
extern SyncCounter* SyncCreateSystemCounter(const char *name,
|
||||
CARD64 initial_value,
|
||||
CARD64 resolution,
|
||||
SyncCounterType counterType,
|
||||
SyncSystemCounterQueryValue QueryValue,
|
||||
SyncSystemCounterBracketValues BracketValues
|
||||
);
|
||||
|
||||
extern void SyncChangeCounter(SyncCounter *pCounter,
|
||||
CARD64 new_value
|
||||
);
|
||||
|
||||
extern void SyncDestroySystemCounter(void *pCounter);
|
||||
|
||||
extern SyncCounter *SyncInitDeviceIdleTime(DeviceIntPtr dev);
|
||||
extern void SyncRemoveDeviceIdleTime(SyncCounter *counter);
|
||||
|
||||
int
|
||||
SyncCreateFenceFromFD(ClientPtr client, DrawablePtr pDraw, XID id, int fd, BOOL initially_triggered);
|
||||
|
||||
int
|
||||
SyncFDFromFence(ClientPtr client, DrawablePtr pDraw, SyncFence *fence);
|
||||
|
||||
void
|
||||
SyncDeleteTriggerFromSyncObject(SyncTrigger * pTrigger);
|
||||
|
||||
int
|
||||
SyncAddTriggerToSyncObject(SyncTrigger * pTrigger);
|
||||
|
||||
#endif /* _SYNCSRV_H_ */
|
||||
2151
xorg-server-1.18.4/Xext/vidmode.c
Normal file
2151
xorg-server-1.18.4/Xext/vidmode.c
Normal file
File diff suppressed because it is too large
Load Diff
347
xorg-server-1.18.4/Xext/xace.c
Normal file
347
xorg-server-1.18.4/Xext/xace.c
Normal file
@ -0,0 +1,347 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include "scrnintstr.h"
|
||||
#include "extnsionst.h"
|
||||
#include "pixmapstr.h"
|
||||
#include "regionstr.h"
|
||||
#include "gcstruct.h"
|
||||
#include "xacestr.h"
|
||||
|
||||
_X_EXPORT CallbackListPtr XaceHooks[XACE_NUM_HOOKS] = { 0 };
|
||||
|
||||
/* Special-cased hook functions. Called by Xserver.
|
||||
*/
|
||||
int
|
||||
XaceHookDispatch(ClientPtr client, int major)
|
||||
{
|
||||
/* Call the audit begin callback, there is no return value. */
|
||||
XaceAuditRec rec = { client, 0 };
|
||||
CallCallbacks(&XaceHooks[XACE_AUDIT_BEGIN], &rec);
|
||||
|
||||
if (major < 128) {
|
||||
/* Call the core dispatch hook */
|
||||
XaceCoreDispatchRec drec = { client, Success /* default allow */ };
|
||||
CallCallbacks(&XaceHooks[XACE_CORE_DISPATCH], &drec);
|
||||
return drec.status;
|
||||
}
|
||||
else {
|
||||
/* Call the extension dispatch hook */
|
||||
ExtensionEntry *ext = GetExtensionEntry(major);
|
||||
XaceExtAccessRec erec = { client, ext, DixUseAccess, Success };
|
||||
if (ext)
|
||||
CallCallbacks(&XaceHooks[XACE_EXT_DISPATCH], &erec);
|
||||
/* On error, pretend extension doesn't exist */
|
||||
return (erec.status == Success) ? Success : BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
XaceHookPropertyAccess(ClientPtr client, WindowPtr pWin,
|
||||
PropertyPtr *ppProp, Mask access_mode)
|
||||
{
|
||||
XacePropertyAccessRec rec = { client, pWin, ppProp, access_mode, Success };
|
||||
CallCallbacks(&XaceHooks[XACE_PROPERTY_ACCESS], &rec);
|
||||
return rec.status;
|
||||
}
|
||||
|
||||
int
|
||||
XaceHookSelectionAccess(ClientPtr client, Selection ** ppSel, Mask access_mode)
|
||||
{
|
||||
XaceSelectionAccessRec rec = { client, ppSel, access_mode, Success };
|
||||
CallCallbacks(&XaceHooks[XACE_SELECTION_ACCESS], &rec);
|
||||
return rec.status;
|
||||
}
|
||||
|
||||
void
|
||||
XaceHookAuditEnd(ClientPtr ptr, int result)
|
||||
{
|
||||
XaceAuditRec rec = { ptr, result };
|
||||
/* call callbacks, there is no return value. */
|
||||
CallCallbacks(&XaceHooks[XACE_AUDIT_END], &rec);
|
||||
}
|
||||
|
||||
/* Entry point for hook functions. Called by Xserver.
|
||||
*/
|
||||
int
|
||||
XaceHook(int hook, ...)
|
||||
{
|
||||
union {
|
||||
XaceResourceAccessRec res;
|
||||
XaceDeviceAccessRec dev;
|
||||
XaceSendAccessRec send;
|
||||
XaceReceiveAccessRec recv;
|
||||
XaceClientAccessRec client;
|
||||
XaceExtAccessRec ext;
|
||||
XaceServerAccessRec server;
|
||||
XaceScreenAccessRec screen;
|
||||
XaceAuthAvailRec auth;
|
||||
XaceKeyAvailRec key;
|
||||
} u;
|
||||
int *prv = NULL; /* points to return value from callback */
|
||||
va_list ap; /* argument list */
|
||||
|
||||
if (!XaceHooks[hook])
|
||||
return Success;
|
||||
|
||||
va_start(ap, hook);
|
||||
|
||||
/* Marshal arguments for passing to callback.
|
||||
* Each callback has its own case, which sets up a structure to hold
|
||||
* the arguments and integer return parameter, or in some cases just
|
||||
* sets calldata directly to a single argument (with no return result)
|
||||
*/
|
||||
switch (hook) {
|
||||
case XACE_RESOURCE_ACCESS:
|
||||
u.res.client = va_arg(ap, ClientPtr);
|
||||
u.res.id = va_arg(ap, XID);
|
||||
u.res.rtype = va_arg(ap, RESTYPE);
|
||||
u.res.res = va_arg(ap, void *);
|
||||
u.res.ptype = va_arg(ap, RESTYPE);
|
||||
u.res.parent = va_arg(ap, void *);
|
||||
u.res.access_mode = va_arg(ap, Mask);
|
||||
|
||||
u.res.status = Success; /* default allow */
|
||||
prv = &u.res.status;
|
||||
break;
|
||||
case XACE_DEVICE_ACCESS:
|
||||
u.dev.client = va_arg(ap, ClientPtr);
|
||||
u.dev.dev = va_arg(ap, DeviceIntPtr);
|
||||
u.dev.access_mode = va_arg(ap, Mask);
|
||||
|
||||
u.dev.status = Success; /* default allow */
|
||||
prv = &u.dev.status;
|
||||
break;
|
||||
case XACE_SEND_ACCESS:
|
||||
u.send.client = va_arg(ap, ClientPtr);
|
||||
u.send.dev = va_arg(ap, DeviceIntPtr);
|
||||
u.send.pWin = va_arg(ap, WindowPtr);
|
||||
|
||||
u.send.events = va_arg(ap, xEventPtr);
|
||||
u.send.count = va_arg(ap, int);
|
||||
|
||||
u.send.status = Success; /* default allow */
|
||||
prv = &u.send.status;
|
||||
break;
|
||||
case XACE_RECEIVE_ACCESS:
|
||||
u.recv.client = va_arg(ap, ClientPtr);
|
||||
u.recv.pWin = va_arg(ap, WindowPtr);
|
||||
|
||||
u.recv.events = va_arg(ap, xEventPtr);
|
||||
u.recv.count = va_arg(ap, int);
|
||||
|
||||
u.recv.status = Success; /* default allow */
|
||||
prv = &u.recv.status;
|
||||
break;
|
||||
case XACE_CLIENT_ACCESS:
|
||||
u.client.client = va_arg(ap, ClientPtr);
|
||||
u.client.target = va_arg(ap, ClientPtr);
|
||||
u.client.access_mode = va_arg(ap, Mask);
|
||||
|
||||
u.client.status = Success; /* default allow */
|
||||
prv = &u.client.status;
|
||||
break;
|
||||
case XACE_EXT_ACCESS:
|
||||
u.ext.client = va_arg(ap, ClientPtr);
|
||||
|
||||
u.ext.ext = va_arg(ap, ExtensionEntry *);
|
||||
u.ext.access_mode = DixGetAttrAccess;
|
||||
u.ext.status = Success; /* default allow */
|
||||
prv = &u.ext.status;
|
||||
break;
|
||||
case XACE_SERVER_ACCESS:
|
||||
u.server.client = va_arg(ap, ClientPtr);
|
||||
u.server.access_mode = va_arg(ap, Mask);
|
||||
|
||||
u.server.status = Success; /* default allow */
|
||||
prv = &u.server.status;
|
||||
break;
|
||||
case XACE_SCREEN_ACCESS:
|
||||
case XACE_SCREENSAVER_ACCESS:
|
||||
u.screen.client = va_arg(ap, ClientPtr);
|
||||
u.screen.screen = va_arg(ap, ScreenPtr);
|
||||
u.screen.access_mode = va_arg(ap, Mask);
|
||||
|
||||
u.screen.status = Success; /* default allow */
|
||||
prv = &u.screen.status;
|
||||
break;
|
||||
case XACE_AUTH_AVAIL:
|
||||
u.auth.client = va_arg(ap, ClientPtr);
|
||||
u.auth.authId = va_arg(ap, XID);
|
||||
|
||||
break;
|
||||
case XACE_KEY_AVAIL:
|
||||
u.key.event = va_arg(ap, xEventPtr);
|
||||
u.key.keybd = va_arg(ap, DeviceIntPtr);
|
||||
u.key.count = va_arg(ap, int);
|
||||
|
||||
break;
|
||||
default:
|
||||
va_end(ap);
|
||||
return 0; /* unimplemented hook number */
|
||||
}
|
||||
va_end(ap);
|
||||
|
||||
/* call callbacks and return result, if any. */
|
||||
CallCallbacks(&XaceHooks[hook], &u);
|
||||
return prv ? *prv : Success;
|
||||
}
|
||||
|
||||
/* XaceHookIsSet
|
||||
*
|
||||
* Utility function to determine whether there are any callbacks listening on a
|
||||
* particular XACE hook.
|
||||
*
|
||||
* Returns non-zero if there is a callback, zero otherwise.
|
||||
*/
|
||||
int
|
||||
XaceHookIsSet(int hook)
|
||||
{
|
||||
if (hook < 0 || hook >= XACE_NUM_HOOKS)
|
||||
return 0;
|
||||
return XaceHooks[hook] != NULL;
|
||||
}
|
||||
|
||||
/* XaceCensorImage
|
||||
*
|
||||
* Called after pScreen->GetImage to prevent pieces or trusted windows from
|
||||
* being returned in image data from an untrusted window.
|
||||
*
|
||||
* Arguments:
|
||||
* client is the client doing the GetImage.
|
||||
* pVisibleRegion is the visible region of the window.
|
||||
* widthBytesLine is the width in bytes of one horizontal line in pBuf.
|
||||
* pDraw is the source window.
|
||||
* x, y, w, h is the rectangle of image data from pDraw in pBuf.
|
||||
* format is the format of the image data in pBuf: ZPixmap or XYPixmap.
|
||||
* pBuf is the image data.
|
||||
*
|
||||
* Returns: nothing.
|
||||
*
|
||||
* Side Effects:
|
||||
* Any part of the rectangle (x, y, w, h) that is outside the visible
|
||||
* region of the window will be destroyed (overwritten) in pBuf.
|
||||
*/
|
||||
void
|
||||
XaceCensorImage(ClientPtr client,
|
||||
RegionPtr pVisibleRegion,
|
||||
long widthBytesLine,
|
||||
DrawablePtr pDraw,
|
||||
int x, int y, int w, int h, unsigned int format, char *pBuf)
|
||||
{
|
||||
RegionRec imageRegion; /* region representing x,y,w,h */
|
||||
RegionRec censorRegion; /* region to obliterate */
|
||||
BoxRec imageBox;
|
||||
int nRects;
|
||||
|
||||
imageBox.x1 = x;
|
||||
imageBox.y1 = y;
|
||||
imageBox.x2 = x + w;
|
||||
imageBox.y2 = y + h;
|
||||
RegionInit(&imageRegion, &imageBox, 1);
|
||||
RegionNull(&censorRegion);
|
||||
|
||||
/* censorRegion = imageRegion - visibleRegion */
|
||||
RegionSubtract(&censorRegion, &imageRegion, pVisibleRegion);
|
||||
nRects = RegionNumRects(&censorRegion);
|
||||
if (nRects > 0) { /* we have something to censor */
|
||||
GCPtr pScratchGC = NULL;
|
||||
PixmapPtr pPix = NULL;
|
||||
xRectangle *pRects = NULL;
|
||||
Bool failed = FALSE;
|
||||
int depth = 1;
|
||||
int bitsPerPixel = 1;
|
||||
int i;
|
||||
BoxPtr pBox;
|
||||
|
||||
/* convert region to list-of-rectangles for PolyFillRect */
|
||||
|
||||
pRects = malloc(nRects * sizeof(xRectangle));
|
||||
if (!pRects) {
|
||||
failed = TRUE;
|
||||
goto failSafe;
|
||||
}
|
||||
for (pBox = RegionRects(&censorRegion), i = 0; i < nRects; i++, pBox++) {
|
||||
pRects[i].x = pBox->x1;
|
||||
pRects[i].y = pBox->y1 - imageBox.y1;
|
||||
pRects[i].width = pBox->x2 - pBox->x1;
|
||||
pRects[i].height = pBox->y2 - pBox->y1;
|
||||
}
|
||||
|
||||
/* use pBuf as a fake pixmap */
|
||||
|
||||
if (format == ZPixmap) {
|
||||
depth = pDraw->depth;
|
||||
bitsPerPixel = pDraw->bitsPerPixel;
|
||||
}
|
||||
|
||||
pPix = GetScratchPixmapHeader(pDraw->pScreen, w, h,
|
||||
depth, bitsPerPixel,
|
||||
widthBytesLine, (void *) pBuf);
|
||||
if (!pPix) {
|
||||
failed = TRUE;
|
||||
goto failSafe;
|
||||
}
|
||||
|
||||
pScratchGC = GetScratchGC(depth, pPix->drawable.pScreen);
|
||||
if (!pScratchGC) {
|
||||
failed = TRUE;
|
||||
goto failSafe;
|
||||
}
|
||||
|
||||
ValidateGC(&pPix->drawable, pScratchGC);
|
||||
(*pScratchGC->ops->PolyFillRect) (&pPix->drawable,
|
||||
pScratchGC, nRects, pRects);
|
||||
|
||||
failSafe:
|
||||
if (failed) {
|
||||
/* Censoring was not completed above. To be safe, wipe out
|
||||
* all the image data so that nothing trusted gets out.
|
||||
*/
|
||||
memset(pBuf, 0, (int) (widthBytesLine * h));
|
||||
}
|
||||
free(pRects);
|
||||
if (pScratchGC)
|
||||
FreeScratchGC(pScratchGC);
|
||||
if (pPix)
|
||||
FreeScratchPixmapHeader(pPix);
|
||||
}
|
||||
RegionUninit(&imageRegion);
|
||||
RegionUninit(&censorRegion);
|
||||
} /* XaceCensorImage */
|
||||
|
||||
/*
|
||||
* Xtrans wrappers for use by modules
|
||||
*/
|
||||
int
|
||||
XaceGetConnectionNumber(ClientPtr client)
|
||||
{
|
||||
return GetClientFd(client);
|
||||
}
|
||||
|
||||
int
|
||||
XaceIsLocal(ClientPtr client)
|
||||
{
|
||||
return ClientIsLocal(client);
|
||||
}
|
||||
133
xorg-server-1.18.4/Xext/xace.h
Normal file
133
xorg-server-1.18.4/Xext/xace.h
Normal file
@ -0,0 +1,133 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifndef _XACE_H
|
||||
#define _XACE_H
|
||||
|
||||
#ifdef XACE
|
||||
|
||||
#define XACE_MAJOR_VERSION 2
|
||||
#define XACE_MINOR_VERSION 0
|
||||
|
||||
#include "pixmap.h"
|
||||
#include "region.h"
|
||||
#include "window.h"
|
||||
#include "property.h"
|
||||
#include "selection.h"
|
||||
|
||||
/* Default window background */
|
||||
#define XaceBackgroundNoneState(w) ((w)->forcedBG ? BackgroundPixel : None)
|
||||
|
||||
/* security hooks */
|
||||
/* Constants used to identify the available security hooks
|
||||
*/
|
||||
#define XACE_CORE_DISPATCH 0
|
||||
#define XACE_EXT_DISPATCH 1
|
||||
#define XACE_RESOURCE_ACCESS 2
|
||||
#define XACE_DEVICE_ACCESS 3
|
||||
#define XACE_PROPERTY_ACCESS 4
|
||||
#define XACE_SEND_ACCESS 5
|
||||
#define XACE_RECEIVE_ACCESS 6
|
||||
#define XACE_CLIENT_ACCESS 7
|
||||
#define XACE_EXT_ACCESS 8
|
||||
#define XACE_SERVER_ACCESS 9
|
||||
#define XACE_SELECTION_ACCESS 10
|
||||
#define XACE_SCREEN_ACCESS 11
|
||||
#define XACE_SCREENSAVER_ACCESS 12
|
||||
#define XACE_AUTH_AVAIL 13
|
||||
#define XACE_KEY_AVAIL 14
|
||||
#define XACE_AUDIT_BEGIN 15
|
||||
#define XACE_AUDIT_END 16
|
||||
#define XACE_NUM_HOOKS 17
|
||||
|
||||
extern _X_EXPORT CallbackListPtr XaceHooks[XACE_NUM_HOOKS];
|
||||
|
||||
/* Entry point for hook functions. Called by Xserver.
|
||||
* Required by libdbe and libextmod
|
||||
*/
|
||||
extern _X_EXPORT int XaceHook(int /*hook */ ,
|
||||
... /*appropriate args for hook */
|
||||
);
|
||||
|
||||
/* determine whether any callbacks are present for the XACE hook */
|
||||
extern _X_EXPORT int XaceHookIsSet(int hook);
|
||||
|
||||
/* Special-cased hook functions
|
||||
*/
|
||||
extern _X_EXPORT int XaceHookDispatch(ClientPtr ptr, int major);
|
||||
extern _X_EXPORT int XaceHookPropertyAccess(ClientPtr ptr, WindowPtr pWin,
|
||||
PropertyPtr *ppProp,
|
||||
Mask access_mode);
|
||||
extern _X_EXPORT int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel,
|
||||
Mask access_mode);
|
||||
extern _X_EXPORT void XaceHookAuditEnd(ClientPtr ptr, int result);
|
||||
|
||||
/* 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
|
||||
*/
|
||||
extern _X_EXPORT int XaceGetConnectionNumber(ClientPtr ptr);
|
||||
extern _X_EXPORT int XaceIsLocal(ClientPtr ptr);
|
||||
|
||||
/* From the original Security extension...
|
||||
*/
|
||||
|
||||
extern _X_EXPORT void XaceCensorImage(ClientPtr client,
|
||||
RegionPtr pVisibleRegion,
|
||||
long widthBytesLine,
|
||||
DrawablePtr pDraw,
|
||||
int x, int y, int w, int h,
|
||||
unsigned int format, char *pBuf);
|
||||
|
||||
#else /* XACE */
|
||||
|
||||
/* Default window background */
|
||||
#define XaceBackgroundNoneState(w) None
|
||||
|
||||
/* Define calls away when XACE is not being built. */
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define XaceHook(args...) Success
|
||||
#define XaceHookIsSet(args...) 0
|
||||
#define XaceHookDispatch(args...) Success
|
||||
#define XaceHookPropertyAccess(args...) Success
|
||||
#define XaceHookSelectionAccess(args...) Success
|
||||
#define XaceHookAuditEnd(args...) { ; }
|
||||
#define XaceCensorImage(args...) { ; }
|
||||
#else
|
||||
#define XaceHook(...) Success
|
||||
#define XaceHookIsSet(...) 0
|
||||
#define XaceHookDispatch(...) Success
|
||||
#define XaceHookPropertyAccess(...) Success
|
||||
#define XaceHookSelectionAccess(...) Success
|
||||
#define XaceHookAuditEnd(...) { ; }
|
||||
#define XaceCensorImage(...) { ; }
|
||||
#endif
|
||||
|
||||
#endif /* XACE */
|
||||
|
||||
#endif /* _XACE_H */
|
||||
147
xorg-server-1.18.4/Xext/xacestr.h
Normal file
147
xorg-server-1.18.4/Xext/xacestr.h
Normal file
@ -0,0 +1,147 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifndef _XACESTR_H
|
||||
#define _XACESTR_H
|
||||
|
||||
#include "dix.h"
|
||||
#include "resource.h"
|
||||
#include "extnsionst.h"
|
||||
#include "window.h"
|
||||
#include "input.h"
|
||||
#include "property.h"
|
||||
#include "selection.h"
|
||||
#include "xace.h"
|
||||
|
||||
/* XACE_CORE_DISPATCH */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
int status;
|
||||
} XaceCoreDispatchRec;
|
||||
|
||||
/* XACE_RESOURCE_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
XID id;
|
||||
RESTYPE rtype;
|
||||
void *res;
|
||||
RESTYPE ptype;
|
||||
void *parent;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XaceResourceAccessRec;
|
||||
|
||||
/* XACE_DEVICE_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
DeviceIntPtr dev;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XaceDeviceAccessRec;
|
||||
|
||||
/* XACE_PROPERTY_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
WindowPtr pWin;
|
||||
PropertyPtr *ppProp;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XacePropertyAccessRec;
|
||||
|
||||
/* XACE_SEND_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
DeviceIntPtr dev;
|
||||
WindowPtr pWin;
|
||||
xEventPtr events;
|
||||
int count;
|
||||
int status;
|
||||
} XaceSendAccessRec;
|
||||
|
||||
/* XACE_RECEIVE_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
WindowPtr pWin;
|
||||
xEventPtr events;
|
||||
int count;
|
||||
int status;
|
||||
} XaceReceiveAccessRec;
|
||||
|
||||
/* XACE_CLIENT_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
ClientPtr target;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XaceClientAccessRec;
|
||||
|
||||
/* XACE_EXT_DISPATCH */
|
||||
/* XACE_EXT_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
ExtensionEntry *ext;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XaceExtAccessRec;
|
||||
|
||||
/* XACE_SERVER_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XaceServerAccessRec;
|
||||
|
||||
/* XACE_SELECTION_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
Selection **ppSel;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XaceSelectionAccessRec;
|
||||
|
||||
/* XACE_SCREEN_ACCESS */
|
||||
/* XACE_SCREENSAVER_ACCESS */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
ScreenPtr screen;
|
||||
Mask access_mode;
|
||||
int status;
|
||||
} XaceScreenAccessRec;
|
||||
|
||||
/* XACE_AUTH_AVAIL */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
XID authId;
|
||||
} XaceAuthAvailRec;
|
||||
|
||||
/* XACE_KEY_AVAIL */
|
||||
typedef struct {
|
||||
xEventPtr event;
|
||||
DeviceIntPtr keybd;
|
||||
int count;
|
||||
} XaceKeyAvailRec;
|
||||
|
||||
/* XACE_AUDIT_BEGIN */
|
||||
/* XACE_AUDIT_END */
|
||||
typedef struct {
|
||||
ClientPtr client;
|
||||
int requestResult;
|
||||
} XaceAuditRec;
|
||||
|
||||
#endif /* _XACESTR_H */
|
||||
199
xorg-server-1.18.4/Xext/xcmisc.c
Normal file
199
xorg-server-1.18.4/Xext/xcmisc.c
Normal file
@ -0,0 +1,199 @@
|
||||
/*
|
||||
|
||||
Copyright 1993, 1998 The Open Group
|
||||
|
||||
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 OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
#include "dixstruct.h"
|
||||
#include "extnsionst.h"
|
||||
#include "swaprep.h"
|
||||
#include <X11/extensions/xcmiscproto.h>
|
||||
#include "extinit.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
static int
|
||||
ProcXCMiscGetVersion(ClientPtr client)
|
||||
{
|
||||
xXCMiscGetVersionReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.majorVersion = XCMiscMajorVersion,
|
||||
.minorVersion = XCMiscMinorVersion
|
||||
};
|
||||
|
||||
REQUEST_SIZE_MATCH(xXCMiscGetVersionReq);
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swaps(&rep.majorVersion);
|
||||
swaps(&rep.minorVersion);
|
||||
}
|
||||
WriteToClient(client, sizeof(xXCMiscGetVersionReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXCMiscGetXIDRange(ClientPtr client)
|
||||
{
|
||||
xXCMiscGetXIDRangeReply rep;
|
||||
XID min_id, max_id;
|
||||
|
||||
REQUEST_SIZE_MATCH(xXCMiscGetXIDRangeReq);
|
||||
GetXIDRange(client->index, FALSE, &min_id, &max_id);
|
||||
rep = (xXCMiscGetXIDRangeReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.start_id = min_id,
|
||||
.count = max_id - min_id + 1
|
||||
};
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swapl(&rep.start_id);
|
||||
swapl(&rep.count);
|
||||
}
|
||||
WriteToClient(client, sizeof(xXCMiscGetXIDRangeReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXCMiscGetXIDList(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXCMiscGetXIDListReq);
|
||||
xXCMiscGetXIDListReply rep;
|
||||
XID *pids;
|
||||
unsigned int count;
|
||||
|
||||
REQUEST_SIZE_MATCH(xXCMiscGetXIDListReq);
|
||||
|
||||
if (stuff->count > UINT32_MAX / sizeof(XID))
|
||||
return BadAlloc;
|
||||
|
||||
pids = xallocarray(stuff->count, sizeof(XID));
|
||||
if (!pids) {
|
||||
return BadAlloc;
|
||||
}
|
||||
count = GetXIDList(client, stuff->count, pids);
|
||||
rep = (xXCMiscGetXIDListReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = count,
|
||||
.count = count
|
||||
};
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swapl(&rep.length);
|
||||
swapl(&rep.count);
|
||||
}
|
||||
WriteToClient(client, sizeof(xXCMiscGetXIDListReply), &rep);
|
||||
if (count) {
|
||||
client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
|
||||
WriteSwappedDataToClient(client, count * sizeof(XID), pids);
|
||||
}
|
||||
free(pids);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXCMiscDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
switch (stuff->data) {
|
||||
case X_XCMiscGetVersion:
|
||||
return ProcXCMiscGetVersion(client);
|
||||
case X_XCMiscGetXIDRange:
|
||||
return ProcXCMiscGetXIDRange(client);
|
||||
case X_XCMiscGetXIDList:
|
||||
return ProcXCMiscGetXIDList(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXCMiscGetVersion(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXCMiscGetVersionReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xXCMiscGetVersionReq);
|
||||
swaps(&stuff->majorVersion);
|
||||
swaps(&stuff->minorVersion);
|
||||
return ProcXCMiscGetVersion(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXCMiscGetXIDRange(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
return ProcXCMiscGetXIDRange(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXCMiscGetXIDList(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXCMiscGetXIDListReq);
|
||||
REQUEST_SIZE_MATCH(xXCMiscGetXIDListReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
swapl(&stuff->count);
|
||||
return ProcXCMiscGetXIDList(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXCMiscDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
switch (stuff->data) {
|
||||
case X_XCMiscGetVersion:
|
||||
return SProcXCMiscGetVersion(client);
|
||||
case X_XCMiscGetXIDRange:
|
||||
return SProcXCMiscGetXIDRange(client);
|
||||
case X_XCMiscGetXIDList:
|
||||
return SProcXCMiscGetXIDList(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
XCMiscExtensionInit(void)
|
||||
{
|
||||
AddExtension(XCMiscExtensionName, 0, 0,
|
||||
ProcXCMiscDispatch, SProcXCMiscDispatch,
|
||||
NULL, StandardMinorOpcode);
|
||||
}
|
||||
739
xorg-server-1.18.4/Xext/xf86bigfont.c
Normal file
739
xorg-server-1.18.4/Xext/xf86bigfont.c
Normal file
@ -0,0 +1,739 @@
|
||||
/*
|
||||
* BIGFONT extension for sharing font metrics between clients (if possible)
|
||||
* and for transmitting font metrics to clients in a compressed form.
|
||||
*
|
||||
* Copyright (c) 1999-2000 Bruno Haible
|
||||
* Copyright (c) 1999-2000 The XFree86 Project, Inc.
|
||||
*/
|
||||
|
||||
/* THIS IS NOT AN X CONSORTIUM STANDARD */
|
||||
|
||||
/*
|
||||
* Big fonts suffer from the following: All clients that have opened a
|
||||
* font can access the complete glyph metrics array (the XFontStruct member
|
||||
* `per_char') directly, without going through a macro. Moreover these
|
||||
* glyph metrics are ink metrics, i.e. are not redundant even for a
|
||||
* fixed-width font. For a Unicode font, the size of this array is 768 KB.
|
||||
*
|
||||
* Problems: 1. It eats a lot of memory in each client. 2. All this glyph
|
||||
* metrics data is piped through the socket when the font is opened.
|
||||
*
|
||||
* This extension addresses these two problems for local clients, by using
|
||||
* shared memory. It also addresses the second problem for non-local clients,
|
||||
* by compressing the data before transmit by a factor of nearly 6.
|
||||
*
|
||||
* If you use this extension, your OS ought to nicely support shared memory.
|
||||
* This means: Shared memory should be swappable to the swap, and the limits
|
||||
* should be high enough (SHMMNI at least 64, SHMMAX at least 768 KB,
|
||||
* SHMALL at least 48 MB). It is a plus if your OS allows shmat() calls
|
||||
* on segments that have already been marked "removed", because it permits
|
||||
* these segments to be cleaned up by the OS if the X server is killed with
|
||||
* signal SIGKILL.
|
||||
*
|
||||
* This extension is transparently exploited by Xlib (functions XQueryFont,
|
||||
* XLoadQueryFont).
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifdef HAS_SHM
|
||||
#if defined(linux) && (!defined(__GNU_LIBRARY__) || __GNU_LIBRARY__ < 2)
|
||||
/* libc4 does not define __GNU_LIBRARY__, libc5 defines __GNU_LIBRARY__ as 1 */
|
||||
/* Linux libc4 and libc5 only (because glibc doesn't include kernel headers):
|
||||
Linux 2.0.x and 2.2.x define SHMLBA as PAGE_SIZE, but forget to define
|
||||
PAGE_SIZE. It is defined in <asm/page.h>. */
|
||||
#include <asm/page.h>
|
||||
#endif
|
||||
#ifdef SVR4
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
#if defined(__CYGWIN__)
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
#include "dixstruct.h"
|
||||
#include "gcstruct.h"
|
||||
#include "dixfontstr.h"
|
||||
#include "extnsionst.h"
|
||||
#include "extinit.h"
|
||||
#include "protocol-versions.h"
|
||||
|
||||
#include <X11/extensions/xf86bigfproto.h>
|
||||
#include "xf86bigfontsrv.h"
|
||||
|
||||
static void XF86BigfontResetProc(ExtensionEntry * /* extEntry */
|
||||
);
|
||||
|
||||
#ifdef HAS_SHM
|
||||
|
||||
/* A random signature, transmitted to the clients so they can verify that the
|
||||
shared memory segment they are attaching to was really established by the
|
||||
X server they are talking to. */
|
||||
static CARD32 signature;
|
||||
|
||||
/* Index for additional information stored in a FontRec's devPrivates array. */
|
||||
static int FontShmdescIndex;
|
||||
|
||||
static unsigned int pagesize;
|
||||
|
||||
static Bool badSysCall = FALSE;
|
||||
|
||||
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) || defined(__DragonFly__)
|
||||
|
||||
#include <sys/signal.h>
|
||||
|
||||
static void
|
||||
SigSysHandler(int signo)
|
||||
{
|
||||
badSysCall = TRUE;
|
||||
}
|
||||
|
||||
static Bool
|
||||
CheckForShmSyscall(void)
|
||||
{
|
||||
void (*oldHandler) (int);
|
||||
int shmid = -1;
|
||||
|
||||
/* If no SHM support in the kernel, the bad syscall will generate SIGSYS */
|
||||
oldHandler = signal(SIGSYS, SigSysHandler);
|
||||
|
||||
badSysCall = FALSE;
|
||||
shmid = shmget(IPC_PRIVATE, 4096, IPC_CREAT);
|
||||
if (shmid != -1) {
|
||||
/* Successful allocation - clean up */
|
||||
shmctl(shmid, IPC_RMID, NULL);
|
||||
}
|
||||
else {
|
||||
/* Allocation failed */
|
||||
badSysCall = TRUE;
|
||||
}
|
||||
signal(SIGSYS, oldHandler);
|
||||
return !badSysCall;
|
||||
}
|
||||
|
||||
#define MUST_CHECK_FOR_SHM_SYSCALL
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* ========== Management of shared memory segments ========== */
|
||||
|
||||
#ifdef HAS_SHM
|
||||
|
||||
#ifdef __linux__
|
||||
/* On Linux, shared memory marked as "removed" can still be attached.
|
||||
Nice feature, because the kernel will automatically free the associated
|
||||
storage when the server and all clients are gone. */
|
||||
#define EARLY_REMOVE
|
||||
#endif
|
||||
|
||||
typedef struct _ShmDesc {
|
||||
struct _ShmDesc *next;
|
||||
struct _ShmDesc **prev;
|
||||
int shmid;
|
||||
char *attach_addr;
|
||||
} ShmDescRec, *ShmDescPtr;
|
||||
|
||||
static ShmDescPtr ShmList = (ShmDescPtr) NULL;
|
||||
|
||||
static ShmDescPtr
|
||||
shmalloc(unsigned int size)
|
||||
{
|
||||
ShmDescPtr pDesc;
|
||||
int shmid;
|
||||
char *addr;
|
||||
|
||||
#ifdef MUST_CHECK_FOR_SHM_SYSCALL
|
||||
if (pagesize == 0)
|
||||
return (ShmDescPtr) NULL;
|
||||
#endif
|
||||
|
||||
/* On some older Linux systems, the number of shared memory segments
|
||||
system-wide is 127. In Linux 2.4, it is 4095.
|
||||
Therefore there is a tradeoff to be made between allocating a
|
||||
shared memory segment on one hand, and allocating memory and piping
|
||||
the glyph metrics on the other hand. If the glyph metrics size is
|
||||
small, we prefer the traditional way. */
|
||||
if (size < 3500)
|
||||
return (ShmDescPtr) NULL;
|
||||
|
||||
pDesc = malloc(sizeof(ShmDescRec));
|
||||
if (!pDesc)
|
||||
return (ShmDescPtr) NULL;
|
||||
|
||||
size = (size + pagesize - 1) & -pagesize;
|
||||
shmid = shmget(IPC_PRIVATE, size, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
|
||||
if (shmid == -1) {
|
||||
ErrorF(XF86BIGFONTNAME " extension: shmget() failed, size = %u, %s\n",
|
||||
size, strerror(errno));
|
||||
free(pDesc);
|
||||
return (ShmDescPtr) NULL;
|
||||
}
|
||||
|
||||
if ((addr = shmat(shmid, 0, 0)) == (char *) -1) {
|
||||
ErrorF(XF86BIGFONTNAME " extension: shmat() failed, size = %u, %s\n",
|
||||
size, strerror(errno));
|
||||
shmctl(shmid, IPC_RMID, (void *) 0);
|
||||
free(pDesc);
|
||||
return (ShmDescPtr) NULL;
|
||||
}
|
||||
|
||||
#ifdef EARLY_REMOVE
|
||||
shmctl(shmid, IPC_RMID, (void *) 0);
|
||||
#endif
|
||||
|
||||
pDesc->shmid = shmid;
|
||||
pDesc->attach_addr = addr;
|
||||
if (ShmList)
|
||||
ShmList->prev = &pDesc->next;
|
||||
pDesc->next = ShmList;
|
||||
pDesc->prev = &ShmList;
|
||||
ShmList = pDesc;
|
||||
|
||||
return pDesc;
|
||||
}
|
||||
|
||||
static void
|
||||
shmdealloc(ShmDescPtr pDesc)
|
||||
{
|
||||
#ifndef EARLY_REMOVE
|
||||
shmctl(pDesc->shmid, IPC_RMID, (void *) 0);
|
||||
#endif
|
||||
shmdt(pDesc->attach_addr);
|
||||
|
||||
if (pDesc->next)
|
||||
pDesc->next->prev = pDesc->prev;
|
||||
*pDesc->prev = pDesc->next;
|
||||
free(pDesc);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Called when a font is closed. */
|
||||
void
|
||||
XF86BigfontFreeFontShm(FontPtr pFont)
|
||||
{
|
||||
#ifdef HAS_SHM
|
||||
ShmDescPtr pDesc;
|
||||
|
||||
/* If during shutdown of the server, XF86BigfontCleanup() has already
|
||||
* called shmdealloc() for all segments, we don't need to do it here.
|
||||
*/
|
||||
if (!ShmList)
|
||||
return;
|
||||
|
||||
pDesc = (ShmDescPtr) FontGetPrivate(pFont, FontShmdescIndex);
|
||||
if (pDesc)
|
||||
shmdealloc(pDesc);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Called upon fatal signal. */
|
||||
void
|
||||
XF86BigfontCleanup(void)
|
||||
{
|
||||
#ifdef HAS_SHM
|
||||
while (ShmList)
|
||||
shmdealloc(ShmList);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Called when a server generation dies. */
|
||||
static void
|
||||
XF86BigfontResetProc(ExtensionEntry * extEntry)
|
||||
{
|
||||
/* This function is normally called from CloseDownExtensions(), called
|
||||
* from main(). It will be followed by a call to FreeAllResources(),
|
||||
* which will call XF86BigfontFreeFontShm() for each font. Thus it
|
||||
* appears that we do not need to do anything in this function. --
|
||||
* But I prefer to write robust code, and not keep shared memory lying
|
||||
* around when it's not needed any more. (Someone might close down the
|
||||
* extension without calling FreeAllResources()...)
|
||||
*/
|
||||
XF86BigfontCleanup();
|
||||
}
|
||||
|
||||
/* ========== Handling of extension specific requests ========== */
|
||||
|
||||
static int
|
||||
ProcXF86BigfontQueryVersion(ClientPtr client)
|
||||
{
|
||||
xXF86BigfontQueryVersionReply reply;
|
||||
|
||||
REQUEST_SIZE_MATCH(xXF86BigfontQueryVersionReq);
|
||||
reply = (xXF86BigfontQueryVersionReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.majorVersion = SERVER_XF86BIGFONT_MAJOR_VERSION,
|
||||
.minorVersion = SERVER_XF86BIGFONT_MINOR_VERSION,
|
||||
.uid = geteuid(),
|
||||
.gid = getegid(),
|
||||
#ifdef HAS_SHM
|
||||
.signature = signature,
|
||||
.capabilities = (client->local && !client->swapped)
|
||||
? XF86Bigfont_CAP_LocalShm : 0
|
||||
#else
|
||||
.signature = 0,
|
||||
.capabilities = 0
|
||||
#endif
|
||||
};
|
||||
if (client->swapped) {
|
||||
swaps(&reply.sequenceNumber);
|
||||
swapl(&reply.length);
|
||||
swaps(&reply.majorVersion);
|
||||
swaps(&reply.minorVersion);
|
||||
swapl(&reply.uid);
|
||||
swapl(&reply.gid);
|
||||
swapl(&reply.signature);
|
||||
}
|
||||
WriteToClient(client, sizeof(xXF86BigfontQueryVersionReply), &reply);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static void
|
||||
swapCharInfo(xCharInfo * pCI)
|
||||
{
|
||||
swaps(&pCI->leftSideBearing);
|
||||
swaps(&pCI->rightSideBearing);
|
||||
swaps(&pCI->characterWidth);
|
||||
swaps(&pCI->ascent);
|
||||
swaps(&pCI->descent);
|
||||
swaps(&pCI->attributes);
|
||||
}
|
||||
|
||||
/* static CARD32 hashCI (xCharInfo *p); */
|
||||
#define hashCI(p) \
|
||||
(CARD32)(((p->leftSideBearing << 27) + (p->leftSideBearing >> 5) + \
|
||||
(p->rightSideBearing << 23) + (p->rightSideBearing >> 9) + \
|
||||
(p->characterWidth << 16) + \
|
||||
(p->ascent << 11) + (p->descent << 6)) ^ p->attributes)
|
||||
|
||||
static int
|
||||
ProcXF86BigfontQueryFont(ClientPtr client)
|
||||
{
|
||||
FontPtr pFont;
|
||||
|
||||
REQUEST(xXF86BigfontQueryFontReq);
|
||||
CARD32 stuff_flags;
|
||||
xCharInfo *pmax;
|
||||
xCharInfo *pmin;
|
||||
int nCharInfos;
|
||||
int shmid;
|
||||
|
||||
#ifdef HAS_SHM
|
||||
ShmDescPtr pDesc = NULL;
|
||||
#else
|
||||
#define pDesc 0
|
||||
#endif
|
||||
xCharInfo *pCI;
|
||||
CARD16 *pIndex2UniqIndex;
|
||||
CARD16 *pUniqIndex2Index;
|
||||
CARD32 nUniqCharInfos;
|
||||
|
||||
#if 0
|
||||
REQUEST_SIZE_MATCH(xXF86BigfontQueryFontReq);
|
||||
#else
|
||||
switch (client->req_len) {
|
||||
case 2: /* client with version 1.0 libX11 */
|
||||
stuff_flags = (client->local &&
|
||||
!client->swapped ? XF86Bigfont_FLAGS_Shm : 0);
|
||||
break;
|
||||
case 3: /* client with version 1.1 libX11 */
|
||||
stuff_flags = stuff->flags;
|
||||
break;
|
||||
default:
|
||||
return BadLength;
|
||||
}
|
||||
#endif
|
||||
if (dixLookupFontable(&pFont, stuff->id, client, DixGetAttrAccess) !=
|
||||
Success)
|
||||
return BadFont; /* procotol spec says only error is BadFont */
|
||||
|
||||
pmax = FONTINKMAX(pFont);
|
||||
pmin = FONTINKMIN(pFont);
|
||||
nCharInfos =
|
||||
(pmax->rightSideBearing == pmin->rightSideBearing
|
||||
&& pmax->leftSideBearing == pmin->leftSideBearing
|
||||
&& pmax->descent == pmin->descent
|
||||
&& pmax->ascent == pmin->ascent
|
||||
&& pmax->characterWidth == pmin->characterWidth)
|
||||
? 0 : N2dChars(pFont);
|
||||
shmid = -1;
|
||||
pCI = NULL;
|
||||
pIndex2UniqIndex = NULL;
|
||||
pUniqIndex2Index = NULL;
|
||||
nUniqCharInfos = 0;
|
||||
|
||||
if (nCharInfos > 0) {
|
||||
#ifdef HAS_SHM
|
||||
if (!badSysCall)
|
||||
pDesc = (ShmDescPtr) FontGetPrivate(pFont, FontShmdescIndex);
|
||||
if (pDesc) {
|
||||
pCI = (xCharInfo *) pDesc->attach_addr;
|
||||
if (stuff_flags & XF86Bigfont_FLAGS_Shm)
|
||||
shmid = pDesc->shmid;
|
||||
}
|
||||
else {
|
||||
if (stuff_flags & XF86Bigfont_FLAGS_Shm && !badSysCall)
|
||||
pDesc = shmalloc(nCharInfos * sizeof(xCharInfo)
|
||||
+ sizeof(CARD32));
|
||||
if (pDesc) {
|
||||
pCI = (xCharInfo *) pDesc->attach_addr;
|
||||
shmid = pDesc->shmid;
|
||||
}
|
||||
else {
|
||||
#endif
|
||||
pCI = xallocarray(nCharInfos, sizeof(xCharInfo));
|
||||
if (!pCI)
|
||||
return BadAlloc;
|
||||
#ifdef HAS_SHM
|
||||
}
|
||||
#endif
|
||||
/* Fill nCharInfos starting at pCI. */
|
||||
{
|
||||
xCharInfo *prCI = pCI;
|
||||
int ninfos = 0;
|
||||
int ncols = pFont->info.lastCol - pFont->info.firstCol + 1;
|
||||
int row;
|
||||
|
||||
for (row = pFont->info.firstRow;
|
||||
row <= pFont->info.lastRow && ninfos < nCharInfos; row++) {
|
||||
unsigned char chars[512];
|
||||
xCharInfo *tmpCharInfos[256];
|
||||
unsigned long count;
|
||||
int col;
|
||||
unsigned long i;
|
||||
|
||||
i = 0;
|
||||
for (col = pFont->info.firstCol;
|
||||
col <= pFont->info.lastCol; col++) {
|
||||
chars[i++] = row;
|
||||
chars[i++] = col;
|
||||
}
|
||||
(*pFont->get_metrics) (pFont, ncols, chars, TwoD16Bit,
|
||||
&count, tmpCharInfos);
|
||||
for (i = 0; i < count && ninfos < nCharInfos; i++) {
|
||||
*prCI++ = *tmpCharInfos[i];
|
||||
ninfos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef HAS_SHM
|
||||
if (pDesc && !badSysCall) {
|
||||
*(CARD32 *) (pCI + nCharInfos) = signature;
|
||||
if (!FontSetPrivate(pFont, FontShmdescIndex, pDesc)) {
|
||||
shmdealloc(pDesc);
|
||||
return BadAlloc;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (shmid == -1) {
|
||||
/* Cannot use shared memory, so remove-duplicates the xCharInfos
|
||||
using a temporary hash table. */
|
||||
/* Note that CARD16 is suitable as index type, because
|
||||
nCharInfos <= 0x10000. */
|
||||
CARD32 hashModulus;
|
||||
CARD16 *pHash2UniqIndex;
|
||||
CARD16 *pUniqIndex2NextUniqIndex;
|
||||
CARD32 NextIndex;
|
||||
CARD32 NextUniqIndex;
|
||||
CARD16 *tmp;
|
||||
CARD32 i, j;
|
||||
|
||||
hashModulus = 67;
|
||||
if (hashModulus > nCharInfos + 1)
|
||||
hashModulus = nCharInfos + 1;
|
||||
|
||||
tmp = xallocarray(4 * nCharInfos + 1, sizeof(CARD16));
|
||||
if (!tmp) {
|
||||
if (!pDesc)
|
||||
free(pCI);
|
||||
return BadAlloc;
|
||||
}
|
||||
pIndex2UniqIndex = tmp;
|
||||
/* nCharInfos elements */
|
||||
pUniqIndex2Index = tmp + nCharInfos;
|
||||
/* max. nCharInfos elements */
|
||||
pUniqIndex2NextUniqIndex = tmp + 2 * nCharInfos;
|
||||
/* max. nCharInfos elements */
|
||||
pHash2UniqIndex = tmp + 3 * nCharInfos;
|
||||
/* hashModulus (<= nCharInfos+1) elements */
|
||||
|
||||
/* Note that we can use 0xffff as end-of-list indicator, because
|
||||
even if nCharInfos = 0x10000, 0xffff can not occur as valid
|
||||
entry before the last element has been inserted. And once the
|
||||
last element has been inserted, we don't need the hash table
|
||||
any more. */
|
||||
for (j = 0; j < hashModulus; j++)
|
||||
pHash2UniqIndex[j] = (CARD16) (-1);
|
||||
|
||||
NextUniqIndex = 0;
|
||||
for (NextIndex = 0; NextIndex < nCharInfos; NextIndex++) {
|
||||
xCharInfo *p = &pCI[NextIndex];
|
||||
CARD32 hashCode = hashCI(p) % hashModulus;
|
||||
|
||||
for (i = pHash2UniqIndex[hashCode];
|
||||
i != (CARD16) (-1); i = pUniqIndex2NextUniqIndex[i]) {
|
||||
j = pUniqIndex2Index[i];
|
||||
if (pCI[j].leftSideBearing == p->leftSideBearing
|
||||
&& pCI[j].rightSideBearing == p->rightSideBearing
|
||||
&& pCI[j].characterWidth == p->characterWidth
|
||||
&& pCI[j].ascent == p->ascent
|
||||
&& pCI[j].descent == p->descent
|
||||
&& pCI[j].attributes == p->attributes)
|
||||
break;
|
||||
}
|
||||
if (i != (CARD16) (-1)) {
|
||||
/* Found *p at Index j, UniqIndex i */
|
||||
pIndex2UniqIndex[NextIndex] = i;
|
||||
}
|
||||
else {
|
||||
/* Allocate a new entry in the Uniq table */
|
||||
if (hashModulus <= 2 * NextUniqIndex
|
||||
&& hashModulus < nCharInfos + 1) {
|
||||
/* Time to increate hash table size */
|
||||
hashModulus = 2 * hashModulus + 1;
|
||||
if (hashModulus > nCharInfos + 1)
|
||||
hashModulus = nCharInfos + 1;
|
||||
for (j = 0; j < hashModulus; j++)
|
||||
pHash2UniqIndex[j] = (CARD16) (-1);
|
||||
for (i = 0; i < NextUniqIndex; i++)
|
||||
pUniqIndex2NextUniqIndex[i] = (CARD16) (-1);
|
||||
for (i = 0; i < NextUniqIndex; i++) {
|
||||
j = pUniqIndex2Index[i];
|
||||
p = &pCI[j];
|
||||
hashCode = hashCI(p) % hashModulus;
|
||||
pUniqIndex2NextUniqIndex[i] =
|
||||
pHash2UniqIndex[hashCode];
|
||||
pHash2UniqIndex[hashCode] = i;
|
||||
}
|
||||
p = &pCI[NextIndex];
|
||||
hashCode = hashCI(p) % hashModulus;
|
||||
}
|
||||
i = NextUniqIndex++;
|
||||
pUniqIndex2NextUniqIndex[i] = pHash2UniqIndex[hashCode];
|
||||
pHash2UniqIndex[hashCode] = i;
|
||||
pUniqIndex2Index[i] = NextIndex;
|
||||
pIndex2UniqIndex[NextIndex] = i;
|
||||
}
|
||||
}
|
||||
nUniqCharInfos = NextUniqIndex;
|
||||
/* fprintf(stderr, "font metrics: nCharInfos = %d, nUniqCharInfos = %d, hashModulus = %d\n", nCharInfos, nUniqCharInfos, hashModulus); */
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
int nfontprops = pFont->info.nprops;
|
||||
int rlength = sizeof(xXF86BigfontQueryFontReply)
|
||||
+ nfontprops * sizeof(xFontProp)
|
||||
+ (nCharInfos > 0 && shmid == -1
|
||||
? nUniqCharInfos * sizeof(xCharInfo)
|
||||
+ (nCharInfos + 1) / 2 * 2 * sizeof(CARD16)
|
||||
: 0);
|
||||
xXF86BigfontQueryFontReply *reply = calloc(1, rlength);
|
||||
char *p;
|
||||
|
||||
if (!reply) {
|
||||
if (nCharInfos > 0) {
|
||||
if (shmid == -1)
|
||||
free(pIndex2UniqIndex);
|
||||
if (!pDesc)
|
||||
free(pCI);
|
||||
}
|
||||
return BadAlloc;
|
||||
}
|
||||
reply->type = X_Reply;
|
||||
reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
|
||||
reply->sequenceNumber = client->sequence;
|
||||
reply->minBounds = pFont->info.ink_minbounds;
|
||||
reply->maxBounds = pFont->info.ink_maxbounds;
|
||||
reply->minCharOrByte2 = pFont->info.firstCol;
|
||||
reply->maxCharOrByte2 = pFont->info.lastCol;
|
||||
reply->defaultChar = pFont->info.defaultCh;
|
||||
reply->nFontProps = pFont->info.nprops;
|
||||
reply->drawDirection = pFont->info.drawDirection;
|
||||
reply->minByte1 = pFont->info.firstRow;
|
||||
reply->maxByte1 = pFont->info.lastRow;
|
||||
reply->allCharsExist = pFont->info.allExist;
|
||||
reply->fontAscent = pFont->info.fontAscent;
|
||||
reply->fontDescent = pFont->info.fontDescent;
|
||||
reply->nCharInfos = nCharInfos;
|
||||
reply->nUniqCharInfos = nUniqCharInfos;
|
||||
reply->shmid = shmid;
|
||||
reply->shmsegoffset = 0;
|
||||
if (client->swapped) {
|
||||
swaps(&reply->sequenceNumber);
|
||||
swapl(&reply->length);
|
||||
swapCharInfo(&reply->minBounds);
|
||||
swapCharInfo(&reply->maxBounds);
|
||||
swaps(&reply->minCharOrByte2);
|
||||
swaps(&reply->maxCharOrByte2);
|
||||
swaps(&reply->defaultChar);
|
||||
swaps(&reply->nFontProps);
|
||||
swaps(&reply->fontAscent);
|
||||
swaps(&reply->fontDescent);
|
||||
swapl(&reply->nCharInfos);
|
||||
swapl(&reply->nUniqCharInfos);
|
||||
swapl(&reply->shmid);
|
||||
swapl(&reply->shmsegoffset);
|
||||
}
|
||||
p = (char *) &reply[1];
|
||||
{
|
||||
FontPropPtr pFP;
|
||||
xFontProp *prFP;
|
||||
int i;
|
||||
|
||||
for (i = 0, pFP = pFont->info.props, prFP = (xFontProp *) p;
|
||||
i < nfontprops; i++, pFP++, prFP++) {
|
||||
prFP->name = pFP->name;
|
||||
prFP->value = pFP->value;
|
||||
if (client->swapped) {
|
||||
swapl(&prFP->name);
|
||||
swapl(&prFP->value);
|
||||
}
|
||||
}
|
||||
p = (char *) prFP;
|
||||
}
|
||||
if (nCharInfos > 0 && shmid == -1) {
|
||||
xCharInfo *pci;
|
||||
CARD16 *ps;
|
||||
int i, j;
|
||||
|
||||
pci = (xCharInfo *) p;
|
||||
for (i = 0; i < nUniqCharInfos; i++, pci++) {
|
||||
*pci = pCI[pUniqIndex2Index[i]];
|
||||
if (client->swapped)
|
||||
swapCharInfo(pci);
|
||||
}
|
||||
ps = (CARD16 *) pci;
|
||||
for (j = 0; j < nCharInfos; j++, ps++) {
|
||||
*ps = pIndex2UniqIndex[j];
|
||||
if (client->swapped) {
|
||||
swaps(ps);
|
||||
}
|
||||
}
|
||||
}
|
||||
WriteToClient(client, rlength, reply);
|
||||
free(reply);
|
||||
if (nCharInfos > 0) {
|
||||
if (shmid == -1)
|
||||
free(pIndex2UniqIndex);
|
||||
if (!pDesc)
|
||||
free(pCI);
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXF86BigfontDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
|
||||
switch (stuff->data) {
|
||||
case X_XF86BigfontQueryVersion:
|
||||
return ProcXF86BigfontQueryVersion(client);
|
||||
case X_XF86BigfontQueryFont:
|
||||
return ProcXF86BigfontQueryFont(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXF86BigfontQueryVersion(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXF86BigfontQueryVersionReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
return ProcXF86BigfontQueryVersion(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXF86BigfontQueryFont(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXF86BigfontQueryFontReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xXF86BigfontQueryFontReq);
|
||||
swapl(&stuff->id);
|
||||
return ProcXF86BigfontQueryFont(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXF86BigfontDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
|
||||
switch (stuff->data) {
|
||||
case X_XF86BigfontQueryVersion:
|
||||
return SProcXF86BigfontQueryVersion(client);
|
||||
case X_XF86BigfontQueryFont:
|
||||
return SProcXF86BigfontQueryFont(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
XFree86BigfontExtensionInit(void)
|
||||
{
|
||||
if (AddExtension(XF86BIGFONTNAME,
|
||||
XF86BigfontNumberEvents,
|
||||
XF86BigfontNumberErrors,
|
||||
ProcXF86BigfontDispatch,
|
||||
SProcXF86BigfontDispatch,
|
||||
XF86BigfontResetProc, StandardMinorOpcode)) {
|
||||
#ifdef HAS_SHM
|
||||
#ifdef MUST_CHECK_FOR_SHM_SYSCALL
|
||||
/*
|
||||
* Note: Local-clients will not be optimized without shared memory
|
||||
* support. Remote-client optimization does not depend on shared
|
||||
* memory support. Thus, the extension is still registered even
|
||||
* when shared memory support is not functional.
|
||||
*/
|
||||
if (!CheckForShmSyscall()) {
|
||||
ErrorF(XF86BIGFONTNAME
|
||||
" extension local-client optimization disabled due to lack of shared memory support in the kernel\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
srand((unsigned int) time(NULL));
|
||||
signature = ((unsigned int) (65536.0 / (RAND_MAX + 1.0) * rand()) << 16)
|
||||
+ (unsigned int) (65536.0 / (RAND_MAX + 1.0) * rand());
|
||||
/* fprintf(stderr, "signature = 0x%08X\n", signature); */
|
||||
|
||||
FontShmdescIndex = AllocateFontPrivateIndex();
|
||||
|
||||
#if !defined(CSRG_BASED) && !defined(__CYGWIN__)
|
||||
pagesize = SHMLBA;
|
||||
#else
|
||||
#ifdef _SC_PAGESIZE
|
||||
pagesize = sysconf(_SC_PAGESIZE);
|
||||
#else
|
||||
pagesize = getpagesize();
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
33
xorg-server-1.18.4/Xext/xf86bigfontsrv.h
Normal file
33
xorg-server-1.18.4/Xext/xf86bigfontsrv.h
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright © 2010 Yaakov Selkowitz
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _XF86BIGFONTSRV_H_
|
||||
#define _XF86BIGFONTSRV_H_
|
||||
|
||||
#include <X11/fonts/font.h>
|
||||
|
||||
extern void XF86BigfontFreeFontShm(FontPtr);
|
||||
extern void XF86BigfontCleanup(void);
|
||||
|
||||
#endif
|
||||
1190
xorg-server-1.18.4/Xext/xres.c
Normal file
1190
xorg-server-1.18.4/Xext/xres.c
Normal file
File diff suppressed because it is too large
Load Diff
139
xorg-server-1.18.4/Xext/xselinux.h
Normal file
139
xorg-server-1.18.4/Xext/xselinux.h
Normal file
@ -0,0 +1,139 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifndef _XSELINUX_H
|
||||
#define _XSELINUX_H
|
||||
|
||||
/* Extension info */
|
||||
#define SELINUX_EXTENSION_NAME "SELinux"
|
||||
#define SELINUX_MAJOR_VERSION 1
|
||||
#define SELINUX_MINOR_VERSION 1
|
||||
#define SELinuxNumberEvents 0
|
||||
#define SELinuxNumberErrors 0
|
||||
|
||||
/* Extension protocol */
|
||||
#define X_SELinuxQueryVersion 0
|
||||
#define X_SELinuxSetDeviceCreateContext 1
|
||||
#define X_SELinuxGetDeviceCreateContext 2
|
||||
#define X_SELinuxSetDeviceContext 3
|
||||
#define X_SELinuxGetDeviceContext 4
|
||||
#define X_SELinuxSetDrawableCreateContext 5
|
||||
#define X_SELinuxGetDrawableCreateContext 6
|
||||
#define X_SELinuxGetDrawableContext 7
|
||||
#define X_SELinuxSetPropertyCreateContext 8
|
||||
#define X_SELinuxGetPropertyCreateContext 9
|
||||
#define X_SELinuxSetPropertyUseContext 10
|
||||
#define X_SELinuxGetPropertyUseContext 11
|
||||
#define X_SELinuxGetPropertyContext 12
|
||||
#define X_SELinuxGetPropertyDataContext 13
|
||||
#define X_SELinuxListProperties 14
|
||||
#define X_SELinuxSetSelectionCreateContext 15
|
||||
#define X_SELinuxGetSelectionCreateContext 16
|
||||
#define X_SELinuxSetSelectionUseContext 17
|
||||
#define X_SELinuxGetSelectionUseContext 18
|
||||
#define X_SELinuxGetSelectionContext 19
|
||||
#define X_SELinuxGetSelectionDataContext 20
|
||||
#define X_SELinuxListSelections 21
|
||||
#define X_SELinuxGetClientContext 22
|
||||
|
||||
typedef struct {
|
||||
CARD8 reqType;
|
||||
CARD8 SELinuxReqType;
|
||||
CARD16 length;
|
||||
CARD8 client_major;
|
||||
CARD8 client_minor;
|
||||
} SELinuxQueryVersionReq;
|
||||
|
||||
typedef struct {
|
||||
CARD8 type;
|
||||
CARD8 pad1;
|
||||
CARD16 sequenceNumber;
|
||||
CARD32 length;
|
||||
CARD16 server_major;
|
||||
CARD16 server_minor;
|
||||
CARD32 pad2;
|
||||
CARD32 pad3;
|
||||
CARD32 pad4;
|
||||
CARD32 pad5;
|
||||
CARD32 pad6;
|
||||
} SELinuxQueryVersionReply;
|
||||
|
||||
typedef struct {
|
||||
CARD8 reqType;
|
||||
CARD8 SELinuxReqType;
|
||||
CARD16 length;
|
||||
CARD32 context_len;
|
||||
} SELinuxSetCreateContextReq;
|
||||
|
||||
typedef struct {
|
||||
CARD8 reqType;
|
||||
CARD8 SELinuxReqType;
|
||||
CARD16 length;
|
||||
} SELinuxGetCreateContextReq;
|
||||
|
||||
typedef struct {
|
||||
CARD8 reqType;
|
||||
CARD8 SELinuxReqType;
|
||||
CARD16 length;
|
||||
CARD32 id;
|
||||
CARD32 context_len;
|
||||
} SELinuxSetContextReq;
|
||||
|
||||
typedef struct {
|
||||
CARD8 reqType;
|
||||
CARD8 SELinuxReqType;
|
||||
CARD16 length;
|
||||
CARD32 id;
|
||||
} SELinuxGetContextReq;
|
||||
|
||||
typedef struct {
|
||||
CARD8 reqType;
|
||||
CARD8 SELinuxReqType;
|
||||
CARD16 length;
|
||||
CARD32 window;
|
||||
CARD32 property;
|
||||
} SELinuxGetPropertyContextReq;
|
||||
|
||||
typedef struct {
|
||||
CARD8 type;
|
||||
CARD8 pad1;
|
||||
CARD16 sequenceNumber;
|
||||
CARD32 length;
|
||||
CARD32 context_len;
|
||||
CARD32 pad2;
|
||||
CARD32 pad3;
|
||||
CARD32 pad4;
|
||||
CARD32 pad5;
|
||||
CARD32 pad6;
|
||||
} SELinuxGetContextReply;
|
||||
|
||||
typedef struct {
|
||||
CARD8 type;
|
||||
CARD8 pad1;
|
||||
CARD16 sequenceNumber;
|
||||
CARD32 length;
|
||||
CARD32 count;
|
||||
CARD32 pad2;
|
||||
CARD32 pad3;
|
||||
CARD32 pad4;
|
||||
CARD32 pad5;
|
||||
CARD32 pad6;
|
||||
} SELinuxListItemsReply;
|
||||
|
||||
#endif /* _XSELINUX_H */
|
||||
719
xorg-server-1.18.4/Xext/xselinux_ext.c
Normal file
719
xorg-server-1.18.4/Xext/xselinux_ext.c
Normal file
@ -0,0 +1,719 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "selection.h"
|
||||
#include "inputstr.h"
|
||||
#include "windowstr.h"
|
||||
#include "propertyst.h"
|
||||
#include "extnsionst.h"
|
||||
#include "extinit.h"
|
||||
#include "xselinuxint.h"
|
||||
|
||||
#define CTX_DEV offsetof(SELinuxSubjectRec, dev_create_sid)
|
||||
#define CTX_WIN offsetof(SELinuxSubjectRec, win_create_sid)
|
||||
#define CTX_PRP offsetof(SELinuxSubjectRec, prp_create_sid)
|
||||
#define CTX_SEL offsetof(SELinuxSubjectRec, sel_create_sid)
|
||||
#define USE_PRP offsetof(SELinuxSubjectRec, prp_use_sid)
|
||||
#define USE_SEL offsetof(SELinuxSubjectRec, sel_use_sid)
|
||||
|
||||
typedef struct {
|
||||
security_context_t octx;
|
||||
security_context_t dctx;
|
||||
CARD32 octx_len;
|
||||
CARD32 dctx_len;
|
||||
CARD32 id;
|
||||
} SELinuxListItemRec;
|
||||
|
||||
/*
|
||||
* Extension Dispatch
|
||||
*/
|
||||
|
||||
static security_context_t
|
||||
SELinuxCopyContext(char *ptr, unsigned len)
|
||||
{
|
||||
security_context_t copy = malloc(len + 1);
|
||||
|
||||
if (!copy)
|
||||
return NULL;
|
||||
strncpy(copy, ptr, len);
|
||||
copy[len] = '\0';
|
||||
return copy;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxQueryVersion(ClientPtr client)
|
||||
{
|
||||
SELinuxQueryVersionReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.server_major = SELINUX_MAJOR_VERSION,
|
||||
.server_minor = SELINUX_MINOR_VERSION
|
||||
};
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swapl(&rep.length);
|
||||
swaps(&rep.server_major);
|
||||
swaps(&rep.server_minor);
|
||||
}
|
||||
WriteToClient(client, sizeof(rep), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
SELinuxSendContextReply(ClientPtr client, security_id_t sid)
|
||||
{
|
||||
SELinuxGetContextReply rep;
|
||||
security_context_t ctx = NULL;
|
||||
int len = 0;
|
||||
|
||||
if (sid) {
|
||||
if (avc_sid_to_context_raw(sid, &ctx) < 0)
|
||||
return BadValue;
|
||||
len = strlen(ctx) + 1;
|
||||
}
|
||||
|
||||
rep = (SELinuxGetContextReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = bytes_to_int32(len),
|
||||
.context_len = len
|
||||
};
|
||||
|
||||
if (client->swapped) {
|
||||
swapl(&rep.length);
|
||||
swaps(&rep.sequenceNumber);
|
||||
swapl(&rep.context_len);
|
||||
}
|
||||
|
||||
WriteToClient(client, sizeof(SELinuxGetContextReply), &rep);
|
||||
WriteToClient(client, len, ctx);
|
||||
freecon(ctx);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxSetCreateContext(ClientPtr client, unsigned offset)
|
||||
{
|
||||
PrivateRec **privPtr = &client->devPrivates;
|
||||
security_id_t *pSid;
|
||||
security_context_t ctx = NULL;
|
||||
char *ptr;
|
||||
int rc;
|
||||
|
||||
REQUEST(SELinuxSetCreateContextReq);
|
||||
REQUEST_FIXED_SIZE(SELinuxSetCreateContextReq, stuff->context_len);
|
||||
|
||||
if (stuff->context_len > 0) {
|
||||
ctx = SELinuxCopyContext((char *) (stuff + 1), stuff->context_len);
|
||||
if (!ctx)
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
ptr = dixLookupPrivate(privPtr, subjectKey);
|
||||
pSid = (security_id_t *) (ptr + offset);
|
||||
*pSid = NULL;
|
||||
|
||||
rc = Success;
|
||||
if (stuff->context_len > 0) {
|
||||
if (security_check_context_raw(ctx) < 0 ||
|
||||
avc_context_to_sid_raw(ctx, pSid) < 0)
|
||||
rc = BadValue;
|
||||
}
|
||||
|
||||
free(ctx);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxGetCreateContext(ClientPtr client, unsigned offset)
|
||||
{
|
||||
security_id_t *pSid;
|
||||
char *ptr;
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetCreateContextReq);
|
||||
|
||||
if (offset == CTX_DEV)
|
||||
ptr = dixLookupPrivate(&serverClient->devPrivates, subjectKey);
|
||||
else
|
||||
ptr = dixLookupPrivate(&client->devPrivates, subjectKey);
|
||||
|
||||
pSid = (security_id_t *) (ptr + offset);
|
||||
return SELinuxSendContextReply(client, *pSid);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxSetDeviceContext(ClientPtr client)
|
||||
{
|
||||
security_context_t ctx;
|
||||
security_id_t sid;
|
||||
DeviceIntPtr dev;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
int rc;
|
||||
|
||||
REQUEST(SELinuxSetContextReq);
|
||||
REQUEST_FIXED_SIZE(SELinuxSetContextReq, stuff->context_len);
|
||||
|
||||
if (stuff->context_len < 1)
|
||||
return BadLength;
|
||||
ctx = SELinuxCopyContext((char *) (stuff + 1), stuff->context_len);
|
||||
if (!ctx)
|
||||
return BadAlloc;
|
||||
|
||||
rc = dixLookupDevice(&dev, stuff->id, client, DixManageAccess);
|
||||
if (rc != Success)
|
||||
goto out;
|
||||
|
||||
if (security_check_context_raw(ctx) < 0 ||
|
||||
avc_context_to_sid_raw(ctx, &sid) < 0) {
|
||||
rc = BadValue;
|
||||
goto out;
|
||||
}
|
||||
|
||||
subj = dixLookupPrivate(&dev->devPrivates, subjectKey);
|
||||
subj->sid = sid;
|
||||
obj = dixLookupPrivate(&dev->devPrivates, objectKey);
|
||||
obj->sid = sid;
|
||||
|
||||
rc = Success;
|
||||
out:
|
||||
free(ctx);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxGetDeviceContext(ClientPtr client)
|
||||
{
|
||||
DeviceIntPtr dev;
|
||||
SELinuxSubjectRec *subj;
|
||||
int rc;
|
||||
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
|
||||
rc = dixLookupDevice(&dev, stuff->id, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
subj = dixLookupPrivate(&dev->devPrivates, subjectKey);
|
||||
return SELinuxSendContextReply(client, subj->sid);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxGetDrawableContext(ClientPtr client)
|
||||
{
|
||||
DrawablePtr pDraw;
|
||||
PrivateRec **privatePtr;
|
||||
SELinuxObjectRec *obj;
|
||||
int rc;
|
||||
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
|
||||
rc = dixLookupDrawable(&pDraw, stuff->id, client, 0, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
if (pDraw->type == DRAWABLE_PIXMAP)
|
||||
privatePtr = &((PixmapPtr) pDraw)->devPrivates;
|
||||
else
|
||||
privatePtr = &((WindowPtr) pDraw)->devPrivates;
|
||||
|
||||
obj = dixLookupPrivate(privatePtr, objectKey);
|
||||
return SELinuxSendContextReply(client, obj->sid);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxGetPropertyContext(ClientPtr client, void *privKey)
|
||||
{
|
||||
WindowPtr pWin;
|
||||
PropertyPtr pProp;
|
||||
SELinuxObjectRec *obj;
|
||||
int rc;
|
||||
|
||||
REQUEST(SELinuxGetPropertyContextReq);
|
||||
REQUEST_SIZE_MATCH(SELinuxGetPropertyContextReq);
|
||||
|
||||
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetPropAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
rc = dixLookupProperty(&pProp, pWin, stuff->property, client,
|
||||
DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
obj = dixLookupPrivate(&pProp->devPrivates, privKey);
|
||||
return SELinuxSendContextReply(client, obj->sid);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxGetSelectionContext(ClientPtr client, void *privKey)
|
||||
{
|
||||
Selection *pSel;
|
||||
SELinuxObjectRec *obj;
|
||||
int rc;
|
||||
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
|
||||
rc = dixLookupSelection(&pSel, stuff->id, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
obj = dixLookupPrivate(&pSel->devPrivates, privKey);
|
||||
return SELinuxSendContextReply(client, obj->sid);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxGetClientContext(ClientPtr client)
|
||||
{
|
||||
ClientPtr target;
|
||||
SELinuxSubjectRec *subj;
|
||||
int rc;
|
||||
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
|
||||
rc = dixLookupClient(&target, stuff->id, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
subj = dixLookupPrivate(&target->devPrivates, subjectKey);
|
||||
return SELinuxSendContextReply(client, subj->sid);
|
||||
}
|
||||
|
||||
static int
|
||||
SELinuxPopulateItem(SELinuxListItemRec * i, PrivateRec ** privPtr, CARD32 id,
|
||||
int *size)
|
||||
{
|
||||
SELinuxObjectRec *obj = dixLookupPrivate(privPtr, objectKey);
|
||||
SELinuxObjectRec *data = dixLookupPrivate(privPtr, dataKey);
|
||||
|
||||
if (avc_sid_to_context_raw(obj->sid, &i->octx) < 0)
|
||||
return BadValue;
|
||||
if (avc_sid_to_context_raw(data->sid, &i->dctx) < 0)
|
||||
return BadValue;
|
||||
|
||||
i->id = id;
|
||||
i->octx_len = bytes_to_int32(strlen(i->octx) + 1);
|
||||
i->dctx_len = bytes_to_int32(strlen(i->dctx) + 1);
|
||||
|
||||
*size += i->octx_len + i->dctx_len + 3;
|
||||
return Success;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxFreeItems(SELinuxListItemRec * items, int count)
|
||||
{
|
||||
int k;
|
||||
|
||||
for (k = 0; k < count; k++) {
|
||||
freecon(items[k].octx);
|
||||
freecon(items[k].dctx);
|
||||
}
|
||||
free(items);
|
||||
}
|
||||
|
||||
static int
|
||||
SELinuxSendItemsToClient(ClientPtr client, SELinuxListItemRec * items,
|
||||
int size, int count)
|
||||
{
|
||||
int rc, k, pos = 0;
|
||||
SELinuxListItemsReply rep;
|
||||
CARD32 *buf;
|
||||
|
||||
buf = calloc(size, sizeof(CARD32));
|
||||
if (size && !buf) {
|
||||
rc = BadAlloc;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Fill in the buffer */
|
||||
for (k = 0; k < count; k++) {
|
||||
buf[pos] = items[k].id;
|
||||
if (client->swapped)
|
||||
swapl(buf + pos);
|
||||
pos++;
|
||||
|
||||
buf[pos] = items[k].octx_len * 4;
|
||||
if (client->swapped)
|
||||
swapl(buf + pos);
|
||||
pos++;
|
||||
|
||||
buf[pos] = items[k].dctx_len * 4;
|
||||
if (client->swapped)
|
||||
swapl(buf + pos);
|
||||
pos++;
|
||||
|
||||
memcpy((char *) (buf + pos), items[k].octx, strlen(items[k].octx) + 1);
|
||||
pos += items[k].octx_len;
|
||||
memcpy((char *) (buf + pos), items[k].dctx, strlen(items[k].dctx) + 1);
|
||||
pos += items[k].dctx_len;
|
||||
}
|
||||
|
||||
/* Send reply to client */
|
||||
rep = (SELinuxListItemsReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = size,
|
||||
.count = count
|
||||
};
|
||||
|
||||
if (client->swapped) {
|
||||
swapl(&rep.length);
|
||||
swaps(&rep.sequenceNumber);
|
||||
swapl(&rep.count);
|
||||
}
|
||||
|
||||
WriteToClient(client, sizeof(SELinuxListItemsReply), &rep);
|
||||
WriteToClient(client, size * 4, buf);
|
||||
|
||||
/* Free stuff and return */
|
||||
rc = Success;
|
||||
free(buf);
|
||||
out:
|
||||
SELinuxFreeItems(items, count);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxListProperties(ClientPtr client)
|
||||
{
|
||||
WindowPtr pWin;
|
||||
PropertyPtr pProp;
|
||||
SELinuxListItemRec *items;
|
||||
int rc, count, size, i;
|
||||
CARD32 id;
|
||||
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
|
||||
rc = dixLookupWindow(&pWin, stuff->id, client, DixListPropAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
/* Count the number of properties and allocate items */
|
||||
count = 0;
|
||||
for (pProp = wUserProps(pWin); pProp; pProp = pProp->next)
|
||||
count++;
|
||||
items = calloc(count, sizeof(SELinuxListItemRec));
|
||||
if (count && !items)
|
||||
return BadAlloc;
|
||||
|
||||
/* Fill in the items and calculate size */
|
||||
i = 0;
|
||||
size = 0;
|
||||
for (pProp = wUserProps(pWin); pProp; pProp = pProp->next) {
|
||||
id = pProp->propertyName;
|
||||
rc = SELinuxPopulateItem(items + i, &pProp->devPrivates, id, &size);
|
||||
if (rc != Success) {
|
||||
SELinuxFreeItems(items, count);
|
||||
return rc;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return SELinuxSendItemsToClient(client, items, size, count);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxListSelections(ClientPtr client)
|
||||
{
|
||||
Selection *pSel;
|
||||
SELinuxListItemRec *items;
|
||||
int rc, count, size, i;
|
||||
CARD32 id;
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetCreateContextReq);
|
||||
|
||||
/* Count the number of selections and allocate items */
|
||||
count = 0;
|
||||
for (pSel = CurrentSelections; pSel; pSel = pSel->next)
|
||||
count++;
|
||||
items = calloc(count, sizeof(SELinuxListItemRec));
|
||||
if (count && !items)
|
||||
return BadAlloc;
|
||||
|
||||
/* Fill in the items and calculate size */
|
||||
i = 0;
|
||||
size = 0;
|
||||
for (pSel = CurrentSelections; pSel; pSel = pSel->next) {
|
||||
id = pSel->selection;
|
||||
rc = SELinuxPopulateItem(items + i, &pSel->devPrivates, id, &size);
|
||||
if (rc != Success) {
|
||||
SELinuxFreeItems(items, count);
|
||||
return rc;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return SELinuxSendItemsToClient(client, items, size, count);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcSELinuxDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
switch (stuff->data) {
|
||||
case X_SELinuxQueryVersion:
|
||||
return ProcSELinuxQueryVersion(client);
|
||||
case X_SELinuxSetDeviceCreateContext:
|
||||
return ProcSELinuxSetCreateContext(client, CTX_DEV);
|
||||
case X_SELinuxGetDeviceCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_DEV);
|
||||
case X_SELinuxSetDeviceContext:
|
||||
return ProcSELinuxSetDeviceContext(client);
|
||||
case X_SELinuxGetDeviceContext:
|
||||
return ProcSELinuxGetDeviceContext(client);
|
||||
case X_SELinuxSetDrawableCreateContext:
|
||||
return ProcSELinuxSetCreateContext(client, CTX_WIN);
|
||||
case X_SELinuxGetDrawableCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_WIN);
|
||||
case X_SELinuxGetDrawableContext:
|
||||
return ProcSELinuxGetDrawableContext(client);
|
||||
case X_SELinuxSetPropertyCreateContext:
|
||||
return ProcSELinuxSetCreateContext(client, CTX_PRP);
|
||||
case X_SELinuxGetPropertyCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_PRP);
|
||||
case X_SELinuxSetPropertyUseContext:
|
||||
return ProcSELinuxSetCreateContext(client, USE_PRP);
|
||||
case X_SELinuxGetPropertyUseContext:
|
||||
return ProcSELinuxGetCreateContext(client, USE_PRP);
|
||||
case X_SELinuxGetPropertyContext:
|
||||
return ProcSELinuxGetPropertyContext(client, objectKey);
|
||||
case X_SELinuxGetPropertyDataContext:
|
||||
return ProcSELinuxGetPropertyContext(client, dataKey);
|
||||
case X_SELinuxListProperties:
|
||||
return ProcSELinuxListProperties(client);
|
||||
case X_SELinuxSetSelectionCreateContext:
|
||||
return ProcSELinuxSetCreateContext(client, CTX_SEL);
|
||||
case X_SELinuxGetSelectionCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_SEL);
|
||||
case X_SELinuxSetSelectionUseContext:
|
||||
return ProcSELinuxSetCreateContext(client, USE_SEL);
|
||||
case X_SELinuxGetSelectionUseContext:
|
||||
return ProcSELinuxGetCreateContext(client, USE_SEL);
|
||||
case X_SELinuxGetSelectionContext:
|
||||
return ProcSELinuxGetSelectionContext(client, objectKey);
|
||||
case X_SELinuxGetSelectionDataContext:
|
||||
return ProcSELinuxGetSelectionContext(client, dataKey);
|
||||
case X_SELinuxListSelections:
|
||||
return ProcSELinuxListSelections(client);
|
||||
case X_SELinuxGetClientContext:
|
||||
return ProcSELinuxGetClientContext(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxQueryVersion(ClientPtr client)
|
||||
{
|
||||
return ProcSELinuxQueryVersion(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxSetCreateContext(ClientPtr client, unsigned offset)
|
||||
{
|
||||
REQUEST(SELinuxSetCreateContextReq);
|
||||
|
||||
REQUEST_AT_LEAST_SIZE(SELinuxSetCreateContextReq);
|
||||
swapl(&stuff->context_len);
|
||||
return ProcSELinuxSetCreateContext(client, offset);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxSetDeviceContext(ClientPtr client)
|
||||
{
|
||||
REQUEST(SELinuxSetContextReq);
|
||||
|
||||
REQUEST_AT_LEAST_SIZE(SELinuxSetContextReq);
|
||||
swapl(&stuff->id);
|
||||
swapl(&stuff->context_len);
|
||||
return ProcSELinuxSetDeviceContext(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxGetDeviceContext(ClientPtr client)
|
||||
{
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
swapl(&stuff->id);
|
||||
return ProcSELinuxGetDeviceContext(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxGetDrawableContext(ClientPtr client)
|
||||
{
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
swapl(&stuff->id);
|
||||
return ProcSELinuxGetDrawableContext(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxGetPropertyContext(ClientPtr client, void *privKey)
|
||||
{
|
||||
REQUEST(SELinuxGetPropertyContextReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetPropertyContextReq);
|
||||
swapl(&stuff->window);
|
||||
swapl(&stuff->property);
|
||||
return ProcSELinuxGetPropertyContext(client, privKey);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxGetSelectionContext(ClientPtr client, void *privKey)
|
||||
{
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
swapl(&stuff->id);
|
||||
return ProcSELinuxGetSelectionContext(client, privKey);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxListProperties(ClientPtr client)
|
||||
{
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
swapl(&stuff->id);
|
||||
return ProcSELinuxListProperties(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxGetClientContext(ClientPtr client)
|
||||
{
|
||||
REQUEST(SELinuxGetContextReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(SELinuxGetContextReq);
|
||||
swapl(&stuff->id);
|
||||
return ProcSELinuxGetClientContext(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcSELinuxDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
|
||||
switch (stuff->data) {
|
||||
case X_SELinuxQueryVersion:
|
||||
return SProcSELinuxQueryVersion(client);
|
||||
case X_SELinuxSetDeviceCreateContext:
|
||||
return SProcSELinuxSetCreateContext(client, CTX_DEV);
|
||||
case X_SELinuxGetDeviceCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_DEV);
|
||||
case X_SELinuxSetDeviceContext:
|
||||
return SProcSELinuxSetDeviceContext(client);
|
||||
case X_SELinuxGetDeviceContext:
|
||||
return SProcSELinuxGetDeviceContext(client);
|
||||
case X_SELinuxSetDrawableCreateContext:
|
||||
return SProcSELinuxSetCreateContext(client, CTX_WIN);
|
||||
case X_SELinuxGetDrawableCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_WIN);
|
||||
case X_SELinuxGetDrawableContext:
|
||||
return SProcSELinuxGetDrawableContext(client);
|
||||
case X_SELinuxSetPropertyCreateContext:
|
||||
return SProcSELinuxSetCreateContext(client, CTX_PRP);
|
||||
case X_SELinuxGetPropertyCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_PRP);
|
||||
case X_SELinuxSetPropertyUseContext:
|
||||
return SProcSELinuxSetCreateContext(client, USE_PRP);
|
||||
case X_SELinuxGetPropertyUseContext:
|
||||
return ProcSELinuxGetCreateContext(client, USE_PRP);
|
||||
case X_SELinuxGetPropertyContext:
|
||||
return SProcSELinuxGetPropertyContext(client, objectKey);
|
||||
case X_SELinuxGetPropertyDataContext:
|
||||
return SProcSELinuxGetPropertyContext(client, dataKey);
|
||||
case X_SELinuxListProperties:
|
||||
return SProcSELinuxListProperties(client);
|
||||
case X_SELinuxSetSelectionCreateContext:
|
||||
return SProcSELinuxSetCreateContext(client, CTX_SEL);
|
||||
case X_SELinuxGetSelectionCreateContext:
|
||||
return ProcSELinuxGetCreateContext(client, CTX_SEL);
|
||||
case X_SELinuxSetSelectionUseContext:
|
||||
return SProcSELinuxSetCreateContext(client, USE_SEL);
|
||||
case X_SELinuxGetSelectionUseContext:
|
||||
return ProcSELinuxGetCreateContext(client, USE_SEL);
|
||||
case X_SELinuxGetSelectionContext:
|
||||
return SProcSELinuxGetSelectionContext(client, objectKey);
|
||||
case X_SELinuxGetSelectionDataContext:
|
||||
return SProcSELinuxGetSelectionContext(client, dataKey);
|
||||
case X_SELinuxListSelections:
|
||||
return ProcSELinuxListSelections(client);
|
||||
case X_SELinuxGetClientContext:
|
||||
return SProcSELinuxGetClientContext(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Extension Setup / Teardown
|
||||
*/
|
||||
|
||||
static void
|
||||
SELinuxResetProc(ExtensionEntry * extEntry)
|
||||
{
|
||||
SELinuxFlaskReset();
|
||||
SELinuxLabelReset();
|
||||
}
|
||||
|
||||
void
|
||||
SELinuxExtensionInit(void)
|
||||
{
|
||||
ExtensionEntry *extEntry;
|
||||
|
||||
/* Check SELinux mode on system, configuration file, and boolean */
|
||||
if (!is_selinux_enabled()) {
|
||||
LogMessage(X_INFO, "SELinux: Disabled on system\n");
|
||||
return;
|
||||
}
|
||||
if (selinuxEnforcingState == SELINUX_MODE_DISABLED) {
|
||||
LogMessage(X_INFO, "SELinux: Disabled in configuration file\n");
|
||||
return;
|
||||
}
|
||||
if (!security_get_boolean_active("xserver_object_manager")) {
|
||||
LogMessage(X_INFO, "SELinux: Disabled by boolean\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set up XACE hooks */
|
||||
SELinuxLabelInit();
|
||||
SELinuxFlaskInit();
|
||||
|
||||
/* Add extension to server */
|
||||
extEntry = AddExtension(SELINUX_EXTENSION_NAME,
|
||||
SELinuxNumberEvents, SELinuxNumberErrors,
|
||||
ProcSELinuxDispatch, SProcSELinuxDispatch,
|
||||
SELinuxResetProc, StandardMinorOpcode);
|
||||
|
||||
AddExtensionAlias("Flask", extEntry);
|
||||
}
|
||||
946
xorg-server-1.18.4/Xext/xselinux_hooks.c
Normal file
946
xorg-server-1.18.4/Xext/xselinux_hooks.c
Normal file
@ -0,0 +1,946 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/*
|
||||
* Portions of this code copyright (c) 2005 by Trusted Computer Solutions, Inc.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <libaudit.h>
|
||||
|
||||
#include <X11/Xatom.h>
|
||||
#include "selection.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "windowstr.h"
|
||||
#include "propertyst.h"
|
||||
#include "extnsionst.h"
|
||||
#include "xacestr.h"
|
||||
#include "client.h"
|
||||
#define _XSELINUX_NEED_FLASK_MAP
|
||||
#include "xselinuxint.h"
|
||||
|
||||
/* structure passed to auditing callback */
|
||||
typedef struct {
|
||||
ClientPtr client; /* client */
|
||||
DeviceIntPtr dev; /* device */
|
||||
char *command; /* client's executable path */
|
||||
unsigned id; /* resource id, if any */
|
||||
int restype; /* resource type, if any */
|
||||
int event; /* event type, if any */
|
||||
Atom property; /* property name, if any */
|
||||
Atom selection; /* selection name, if any */
|
||||
char *extension; /* extension name, if any */
|
||||
} SELinuxAuditRec;
|
||||
|
||||
/* private state keys */
|
||||
DevPrivateKeyRec subjectKeyRec;
|
||||
DevPrivateKeyRec objectKeyRec;
|
||||
DevPrivateKeyRec dataKeyRec;
|
||||
|
||||
/* audit file descriptor */
|
||||
static int audit_fd;
|
||||
|
||||
/* atoms for window label properties */
|
||||
static Atom atom_ctx;
|
||||
static Atom atom_client_ctx;
|
||||
|
||||
/* The unlabeled SID */
|
||||
static security_id_t unlabeled_sid;
|
||||
|
||||
/* forward declarations */
|
||||
static void SELinuxScreen(CallbackListPtr *, void *, void *);
|
||||
|
||||
/* "true" pointer value for use as callback data */
|
||||
static void *truep = (void *) 1;
|
||||
|
||||
/*
|
||||
* Performs an SELinux permission check.
|
||||
*/
|
||||
static int
|
||||
SELinuxDoCheck(SELinuxSubjectRec * subj, SELinuxObjectRec * obj,
|
||||
security_class_t class, Mask mode, SELinuxAuditRec * auditdata)
|
||||
{
|
||||
/* serverClient requests OK */
|
||||
if (subj->privileged)
|
||||
return Success;
|
||||
|
||||
auditdata->command = subj->command;
|
||||
errno = 0;
|
||||
|
||||
if (avc_has_perm(subj->sid, obj->sid, class, mode, &subj->aeref,
|
||||
auditdata) < 0) {
|
||||
if (mode == DixUnknownAccess)
|
||||
return Success; /* DixUnknownAccess requests OK ... for now */
|
||||
if (errno == EACCES)
|
||||
return BadAccess;
|
||||
ErrorF("SELinux: avc_has_perm: unexpected error %d\n", errno);
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* Labels a newly connected client.
|
||||
*/
|
||||
static void
|
||||
SELinuxLabelClient(ClientPtr client)
|
||||
{
|
||||
int fd = XaceGetConnectionNumber(client);
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
security_context_t ctx;
|
||||
|
||||
subj = dixLookupPrivate(&client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&client->devPrivates, objectKey);
|
||||
|
||||
/* Try to get a context from the socket */
|
||||
if (fd < 0 || getpeercon_raw(fd, &ctx) < 0) {
|
||||
/* Otherwise, fall back to a default context */
|
||||
ctx = SELinuxDefaultClientLabel();
|
||||
}
|
||||
|
||||
/* For local clients, try and determine the executable name */
|
||||
if (XaceIsLocal(client)) {
|
||||
/* Get cached command name if CLIENTIDS is enabled. */
|
||||
const char *cmdname = GetClientCmdName(client);
|
||||
Bool cached = (cmdname != NULL);
|
||||
|
||||
/* If CLIENTIDS is disabled, figure out the command name from
|
||||
* scratch. */
|
||||
if (!cmdname) {
|
||||
pid_t pid = DetermineClientPid(client);
|
||||
|
||||
if (pid != -1)
|
||||
DetermineClientCmd(pid, &cmdname, NULL);
|
||||
}
|
||||
|
||||
if (!cmdname)
|
||||
goto finish;
|
||||
|
||||
strncpy(subj->command, cmdname, COMMAND_LEN - 1);
|
||||
|
||||
if (!cached)
|
||||
free((void *) cmdname); /* const char * */
|
||||
}
|
||||
|
||||
finish:
|
||||
/* Get a SID from the context */
|
||||
if (avc_context_to_sid_raw(ctx, &subj->sid) < 0)
|
||||
FatalError("SELinux: client %d: context_to_sid_raw(%s) failed\n",
|
||||
client->index, ctx);
|
||||
|
||||
obj->sid = subj->sid;
|
||||
freecon(ctx);
|
||||
}
|
||||
|
||||
/*
|
||||
* Labels initial server objects.
|
||||
*/
|
||||
static void
|
||||
SELinuxLabelInitial(void)
|
||||
{
|
||||
int i;
|
||||
XaceScreenAccessRec srec;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
security_context_t ctx;
|
||||
void *unused;
|
||||
|
||||
/* Do the serverClient */
|
||||
subj = dixLookupPrivate(&serverClient->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&serverClient->devPrivates, objectKey);
|
||||
subj->privileged = 1;
|
||||
|
||||
/* Use the context of the X server process for the serverClient */
|
||||
if (getcon_raw(&ctx) < 0)
|
||||
FatalError("SELinux: couldn't get context of X server process\n");
|
||||
|
||||
/* Get a SID from the context */
|
||||
if (avc_context_to_sid_raw(ctx, &subj->sid) < 0)
|
||||
FatalError("SELinux: serverClient: context_to_sid(%s) failed\n", ctx);
|
||||
|
||||
obj->sid = subj->sid;
|
||||
freecon(ctx);
|
||||
|
||||
srec.client = serverClient;
|
||||
srec.access_mode = DixCreateAccess;
|
||||
srec.status = Success;
|
||||
|
||||
for (i = 0; i < screenInfo.numScreens; i++) {
|
||||
/* Do the screen object */
|
||||
srec.screen = screenInfo.screens[i];
|
||||
SELinuxScreen(NULL, NULL, &srec);
|
||||
|
||||
/* Do the default colormap */
|
||||
dixLookupResourceByType(&unused, screenInfo.screens[i]->defColormap,
|
||||
RT_COLORMAP, serverClient, DixCreateAccess);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Labels new resource objects.
|
||||
*/
|
||||
static int
|
||||
SELinuxLabelResource(XaceResourceAccessRec * rec, SELinuxSubjectRec * subj,
|
||||
SELinuxObjectRec * obj, security_class_t class)
|
||||
{
|
||||
int offset;
|
||||
security_id_t tsid;
|
||||
|
||||
/* Check for a create context */
|
||||
if (rec->rtype & RC_DRAWABLE && subj->win_create_sid) {
|
||||
obj->sid = subj->win_create_sid;
|
||||
return Success;
|
||||
}
|
||||
|
||||
if (rec->parent)
|
||||
offset = dixLookupPrivateOffset(rec->ptype);
|
||||
|
||||
if (rec->parent && offset >= 0) {
|
||||
/* Use the SID of the parent object in the labeling operation */
|
||||
PrivateRec **privatePtr = DEVPRIV_AT(rec->parent, offset);
|
||||
SELinuxObjectRec *pobj = dixLookupPrivate(privatePtr, objectKey);
|
||||
|
||||
tsid = pobj->sid;
|
||||
}
|
||||
else {
|
||||
/* Use the SID of the subject */
|
||||
tsid = subj->sid;
|
||||
}
|
||||
|
||||
/* Perform a transition to obtain the final SID */
|
||||
if (avc_compute_create(subj->sid, tsid, class, &obj->sid) < 0) {
|
||||
ErrorF("SELinux: a compute_create call failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* Libselinux Callbacks
|
||||
*/
|
||||
|
||||
static int
|
||||
SELinuxAudit(void *auditdata,
|
||||
security_class_t class, char *msgbuf, size_t msgbufsize)
|
||||
{
|
||||
SELinuxAuditRec *audit = auditdata;
|
||||
ClientPtr client = audit->client;
|
||||
char idNum[16];
|
||||
const char *propertyName, *selectionName;
|
||||
int major = -1, minor = -1;
|
||||
|
||||
if (client) {
|
||||
REQUEST(xReq);
|
||||
if (stuff) {
|
||||
major = client->majorOp;
|
||||
minor = client->minorOp;
|
||||
}
|
||||
}
|
||||
if (audit->id)
|
||||
snprintf(idNum, 16, "%x", audit->id);
|
||||
|
||||
propertyName = audit->property ? NameForAtom(audit->property) : NULL;
|
||||
selectionName = audit->selection ? NameForAtom(audit->selection) : NULL;
|
||||
|
||||
return snprintf(msgbuf, msgbufsize,
|
||||
"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
(major >= 0) ? "request=" : "",
|
||||
(major >= 0) ? LookupRequestName(major, minor) : "",
|
||||
audit->command ? " comm=" : "",
|
||||
audit->command ? audit->command : "",
|
||||
audit->dev ? " xdevice=\"" : "",
|
||||
audit->dev ? audit->dev->name : "",
|
||||
audit->dev ? "\"" : "",
|
||||
audit->id ? " resid=" : "",
|
||||
audit->id ? idNum : "",
|
||||
audit->restype ? " restype=" : "",
|
||||
audit->restype ? LookupResourceName(audit->restype) : "",
|
||||
audit->event ? " event=" : "",
|
||||
audit->event ? LookupEventName(audit->event & 127) : "",
|
||||
audit->property ? " property=" : "",
|
||||
audit->property ? propertyName : "",
|
||||
audit->selection ? " selection=" : "",
|
||||
audit->selection ? selectionName : "",
|
||||
audit->extension ? " extension=" : "",
|
||||
audit->extension ? audit->extension : "");
|
||||
}
|
||||
|
||||
static int
|
||||
SELinuxLog(int type, const char *fmt, ...) _X_ATTRIBUTE_PRINTF(2, 3);
|
||||
|
||||
static int
|
||||
SELinuxLog(int type, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char buf[MAX_AUDIT_MESSAGE_LENGTH];
|
||||
int rc, aut;
|
||||
|
||||
switch (type) {
|
||||
case SELINUX_INFO:
|
||||
aut = AUDIT_USER_MAC_POLICY_LOAD;
|
||||
break;
|
||||
case SELINUX_AVC:
|
||||
aut = AUDIT_USER_AVC;
|
||||
break;
|
||||
default:
|
||||
aut = AUDIT_USER_SELINUX_ERR;
|
||||
break;
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, MAX_AUDIT_MESSAGE_LENGTH, fmt, ap);
|
||||
rc = audit_log_user_avc_message(audit_fd, aut, buf, NULL, NULL, NULL, 0);
|
||||
(void) rc;
|
||||
va_end(ap);
|
||||
LogMessageVerb(X_WARNING, 0, "%s", buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* XACE Callbacks
|
||||
*/
|
||||
|
||||
static void
|
||||
SELinuxDevice(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceDeviceAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client,.dev = rec->dev };
|
||||
security_class_t cls;
|
||||
int rc;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&rec->dev->devPrivates, objectKey);
|
||||
|
||||
/* If this is a new object that needs labeling, do it now */
|
||||
if (rec->access_mode & DixCreateAccess) {
|
||||
SELinuxSubjectRec *dsubj;
|
||||
|
||||
dsubj = dixLookupPrivate(&rec->dev->devPrivates, subjectKey);
|
||||
|
||||
if (subj->dev_create_sid) {
|
||||
/* Label the device with the create context */
|
||||
obj->sid = subj->dev_create_sid;
|
||||
dsubj->sid = subj->dev_create_sid;
|
||||
}
|
||||
else {
|
||||
/* Label the device directly with the process SID */
|
||||
obj->sid = subj->sid;
|
||||
dsubj->sid = subj->sid;
|
||||
}
|
||||
}
|
||||
|
||||
cls = IsPointerDevice(rec->dev) ? SECCLASS_X_POINTER : SECCLASS_X_KEYBOARD;
|
||||
rc = SELinuxDoCheck(subj, obj, cls, rec->access_mode, &auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxSend(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceSendAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj, ev_sid;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client,.dev = rec->dev };
|
||||
security_class_t class;
|
||||
int rc, i, type;
|
||||
|
||||
if (rec->dev)
|
||||
subj = dixLookupPrivate(&rec->dev->devPrivates, subjectKey);
|
||||
else
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
|
||||
obj = dixLookupPrivate(&rec->pWin->devPrivates, objectKey);
|
||||
|
||||
/* Check send permission on window */
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_DRAWABLE, DixSendAccess,
|
||||
&auditdata);
|
||||
if (rc != Success)
|
||||
goto err;
|
||||
|
||||
/* Check send permission on specific event types */
|
||||
for (i = 0; i < rec->count; i++) {
|
||||
type = rec->events[i].u.u.type;
|
||||
class = (type & 128) ? SECCLASS_X_FAKEEVENT : SECCLASS_X_EVENT;
|
||||
|
||||
rc = SELinuxEventToSID(type, obj->sid, &ev_sid);
|
||||
if (rc != Success)
|
||||
goto err;
|
||||
|
||||
auditdata.event = type;
|
||||
rc = SELinuxDoCheck(subj, &ev_sid, class, DixSendAccess, &auditdata);
|
||||
if (rc != Success)
|
||||
goto err;
|
||||
}
|
||||
return;
|
||||
err:
|
||||
rec->status = rc;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxReceive(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceReceiveAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj, ev_sid;
|
||||
SELinuxAuditRec auditdata = {.client = NULL };
|
||||
security_class_t class;
|
||||
int rc, i, type;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&rec->pWin->devPrivates, objectKey);
|
||||
|
||||
/* Check receive permission on window */
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_DRAWABLE, DixReceiveAccess,
|
||||
&auditdata);
|
||||
if (rc != Success)
|
||||
goto err;
|
||||
|
||||
/* Check receive permission on specific event types */
|
||||
for (i = 0; i < rec->count; i++) {
|
||||
type = rec->events[i].u.u.type;
|
||||
class = (type & 128) ? SECCLASS_X_FAKEEVENT : SECCLASS_X_EVENT;
|
||||
|
||||
rc = SELinuxEventToSID(type, obj->sid, &ev_sid);
|
||||
if (rc != Success)
|
||||
goto err;
|
||||
|
||||
auditdata.event = type;
|
||||
rc = SELinuxDoCheck(subj, &ev_sid, class, DixReceiveAccess, &auditdata);
|
||||
if (rc != Success)
|
||||
goto err;
|
||||
}
|
||||
return;
|
||||
err:
|
||||
rec->status = rc;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxExtension(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceExtAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj, *serv;
|
||||
SELinuxObjectRec *obj;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client };
|
||||
int rc;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&rec->ext->devPrivates, objectKey);
|
||||
|
||||
/* If this is a new object that needs labeling, do it now */
|
||||
/* XXX there should be a separate callback for this */
|
||||
if (obj->sid == NULL) {
|
||||
security_id_t sid;
|
||||
|
||||
serv = dixLookupPrivate(&serverClient->devPrivates, subjectKey);
|
||||
rc = SELinuxExtensionToSID(rec->ext->name, &sid);
|
||||
if (rc != Success) {
|
||||
rec->status = rc;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Perform a transition to obtain the final SID */
|
||||
if (avc_compute_create(serv->sid, sid, SECCLASS_X_EXTENSION,
|
||||
&obj->sid) < 0) {
|
||||
ErrorF("SELinux: a SID transition call failed!\n");
|
||||
rec->status = BadValue;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform the security check */
|
||||
auditdata.extension = (char *) rec->ext->name;
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_EXTENSION, rec->access_mode,
|
||||
&auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxSelection(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceSelectionAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj, *data;
|
||||
Selection *pSel = *rec->ppSel;
|
||||
Atom name = pSel->selection;
|
||||
Mask access_mode = rec->access_mode;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client,.selection = name };
|
||||
security_id_t tsid;
|
||||
int rc;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&pSel->devPrivates, objectKey);
|
||||
|
||||
/* If this is a new object that needs labeling, do it now */
|
||||
if (access_mode & DixCreateAccess) {
|
||||
rc = SELinuxSelectionToSID(name, subj, &obj->sid, &obj->poly);
|
||||
if (rc != Success)
|
||||
obj->sid = unlabeled_sid;
|
||||
access_mode = DixSetAttrAccess;
|
||||
}
|
||||
/* If this is a polyinstantiated object, find the right instance */
|
||||
else if (obj->poly) {
|
||||
rc = SELinuxSelectionToSID(name, subj, &tsid, NULL);
|
||||
if (rc != Success) {
|
||||
rec->status = rc;
|
||||
return;
|
||||
}
|
||||
while (pSel->selection != name || obj->sid != tsid) {
|
||||
if ((pSel = pSel->next) == NULL)
|
||||
break;
|
||||
obj = dixLookupPrivate(&pSel->devPrivates, objectKey);
|
||||
}
|
||||
|
||||
if (pSel)
|
||||
*rec->ppSel = pSel;
|
||||
else {
|
||||
rec->status = BadMatch;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform the security check */
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SELECTION, access_mode,
|
||||
&auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
|
||||
/* Label the content (advisory only) */
|
||||
if (access_mode & DixSetAttrAccess) {
|
||||
data = dixLookupPrivate(&pSel->devPrivates, dataKey);
|
||||
if (subj->sel_create_sid)
|
||||
data->sid = subj->sel_create_sid;
|
||||
else
|
||||
data->sid = obj->sid;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxProperty(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XacePropertyAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj, *data;
|
||||
PropertyPtr pProp = *rec->ppProp;
|
||||
Atom name = pProp->propertyName;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client,.property = name };
|
||||
security_id_t tsid;
|
||||
int rc;
|
||||
|
||||
/* Don't care about the new content check */
|
||||
if (rec->access_mode & DixPostAccess)
|
||||
return;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&pProp->devPrivates, objectKey);
|
||||
|
||||
/* If this is a new object that needs labeling, do it now */
|
||||
if (rec->access_mode & DixCreateAccess) {
|
||||
rc = SELinuxPropertyToSID(name, subj, &obj->sid, &obj->poly);
|
||||
if (rc != Success) {
|
||||
rec->status = rc;
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* If this is a polyinstantiated object, find the right instance */
|
||||
else if (obj->poly) {
|
||||
rc = SELinuxPropertyToSID(name, subj, &tsid, NULL);
|
||||
if (rc != Success) {
|
||||
rec->status = rc;
|
||||
return;
|
||||
}
|
||||
while (pProp->propertyName != name || obj->sid != tsid) {
|
||||
if ((pProp = pProp->next) == NULL)
|
||||
break;
|
||||
obj = dixLookupPrivate(&pProp->devPrivates, objectKey);
|
||||
}
|
||||
|
||||
if (pProp)
|
||||
*rec->ppProp = pProp;
|
||||
else {
|
||||
rec->status = BadMatch;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform the security check */
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_PROPERTY, rec->access_mode,
|
||||
&auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
|
||||
/* Label the content (advisory only) */
|
||||
if (rec->access_mode & DixWriteAccess) {
|
||||
data = dixLookupPrivate(&pProp->devPrivates, dataKey);
|
||||
if (subj->prp_create_sid)
|
||||
data->sid = subj->prp_create_sid;
|
||||
else
|
||||
data->sid = obj->sid;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxResource(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceResourceAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client };
|
||||
Mask access_mode = rec->access_mode;
|
||||
PrivateRec **privatePtr;
|
||||
security_class_t class;
|
||||
int rc, offset;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
|
||||
/* Determine if the resource object has a devPrivates field */
|
||||
offset = dixLookupPrivateOffset(rec->rtype);
|
||||
if (offset < 0) {
|
||||
/* No: use the SID of the owning client */
|
||||
class = SECCLASS_X_RESOURCE;
|
||||
privatePtr = &clients[CLIENT_ID(rec->id)]->devPrivates;
|
||||
obj = dixLookupPrivate(privatePtr, objectKey);
|
||||
}
|
||||
else {
|
||||
/* Yes: use the SID from the resource object itself */
|
||||
class = SELinuxTypeToClass(rec->rtype);
|
||||
privatePtr = DEVPRIV_AT(rec->res, offset);
|
||||
obj = dixLookupPrivate(privatePtr, objectKey);
|
||||
}
|
||||
|
||||
/* If this is a new object that needs labeling, do it now */
|
||||
if (access_mode & DixCreateAccess && offset >= 0) {
|
||||
rc = SELinuxLabelResource(rec, subj, obj, class);
|
||||
if (rc != Success) {
|
||||
rec->status = rc;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Collapse generic resource permissions down to read/write */
|
||||
if (class == SECCLASS_X_RESOURCE) {
|
||||
access_mode = ! !(rec->access_mode & SELinuxReadMask); /* rd */
|
||||
access_mode |= ! !(rec->access_mode & ~SELinuxReadMask) << 1; /* wr */
|
||||
}
|
||||
|
||||
/* Perform the security check */
|
||||
auditdata.restype = rec->rtype;
|
||||
auditdata.id = rec->id;
|
||||
rc = SELinuxDoCheck(subj, obj, class, access_mode, &auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
|
||||
/* Perform the background none check on windows */
|
||||
if (access_mode & DixCreateAccess && rec->rtype == RT_WINDOW) {
|
||||
rc = SELinuxDoCheck(subj, obj, class, DixBlendAccess, &auditdata);
|
||||
if (rc != Success)
|
||||
((WindowPtr) rec->res)->forcedBG = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxScreen(CallbackListPtr *pcbl, void *is_saver, void *calldata)
|
||||
{
|
||||
XaceScreenAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client };
|
||||
Mask access_mode = rec->access_mode;
|
||||
int rc;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&rec->screen->devPrivates, objectKey);
|
||||
|
||||
/* If this is a new object that needs labeling, do it now */
|
||||
if (access_mode & DixCreateAccess) {
|
||||
/* Perform a transition to obtain the final SID */
|
||||
if (avc_compute_create(subj->sid, subj->sid, SECCLASS_X_SCREEN,
|
||||
&obj->sid) < 0) {
|
||||
ErrorF("SELinux: a compute_create call failed!\n");
|
||||
rec->status = BadValue;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_saver)
|
||||
access_mode <<= 2;
|
||||
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SCREEN, access_mode, &auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxClient(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceClientAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client };
|
||||
int rc;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&rec->target->devPrivates, objectKey);
|
||||
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_CLIENT, rec->access_mode,
|
||||
&auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxServer(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
XaceServerAccessRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
SELinuxAuditRec auditdata = {.client = rec->client };
|
||||
int rc;
|
||||
|
||||
subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
|
||||
obj = dixLookupPrivate(&serverClient->devPrivates, objectKey);
|
||||
|
||||
rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SERVER, rec->access_mode,
|
||||
&auditdata);
|
||||
if (rc != Success)
|
||||
rec->status = rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* DIX Callbacks
|
||||
*/
|
||||
|
||||
static void
|
||||
SELinuxClientState(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
NewClientInfoRec *pci = calldata;
|
||||
|
||||
switch (pci->client->clientState) {
|
||||
case ClientStateInitial:
|
||||
SELinuxLabelClient(pci->client);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxResourceState(CallbackListPtr *pcbl, void *unused, void *calldata)
|
||||
{
|
||||
ResourceStateInfoRec *rec = calldata;
|
||||
SELinuxSubjectRec *subj;
|
||||
SELinuxObjectRec *obj;
|
||||
WindowPtr pWin;
|
||||
|
||||
if (rec->type != RT_WINDOW)
|
||||
return;
|
||||
if (rec->state != ResourceStateAdding)
|
||||
return;
|
||||
|
||||
pWin = (WindowPtr) rec->value;
|
||||
subj = dixLookupPrivate(&wClient(pWin)->devPrivates, subjectKey);
|
||||
|
||||
if (subj->sid) {
|
||||
security_context_t ctx;
|
||||
int rc = avc_sid_to_context_raw(subj->sid, &ctx);
|
||||
|
||||
if (rc < 0)
|
||||
FatalError("SELinux: Failed to get security context!\n");
|
||||
rc = dixChangeWindowProperty(serverClient,
|
||||
pWin, atom_client_ctx, XA_STRING, 8,
|
||||
PropModeReplace, strlen(ctx), ctx, FALSE);
|
||||
if (rc != Success)
|
||||
FatalError("SELinux: Failed to set label property on window!\n");
|
||||
freecon(ctx);
|
||||
}
|
||||
else
|
||||
FatalError("SELinux: Unexpected unlabeled client found\n");
|
||||
|
||||
obj = dixLookupPrivate(&pWin->devPrivates, objectKey);
|
||||
|
||||
if (obj->sid) {
|
||||
security_context_t ctx;
|
||||
int rc = avc_sid_to_context_raw(obj->sid, &ctx);
|
||||
|
||||
if (rc < 0)
|
||||
FatalError("SELinux: Failed to get security context!\n");
|
||||
rc = dixChangeWindowProperty(serverClient,
|
||||
pWin, atom_ctx, XA_STRING, 8,
|
||||
PropModeReplace, strlen(ctx), ctx, FALSE);
|
||||
if (rc != Success)
|
||||
FatalError("SELinux: Failed to set label property on window!\n");
|
||||
freecon(ctx);
|
||||
}
|
||||
else
|
||||
FatalError("SELinux: Unexpected unlabeled window found\n");
|
||||
}
|
||||
|
||||
static int netlink_fd;
|
||||
|
||||
static void
|
||||
SELinuxBlockHandler(void *data, struct timeval **tv, void *read_mask)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxWakeupHandler(void *data, int num_fds, void *read_mask)
|
||||
{
|
||||
if (num_fds > 0 && FD_ISSET(netlink_fd, (fd_set *) read_mask))
|
||||
avc_netlink_check_nb();
|
||||
}
|
||||
|
||||
void
|
||||
SELinuxFlaskReset(void)
|
||||
{
|
||||
/* Unregister callbacks */
|
||||
DeleteCallback(&ClientStateCallback, SELinuxClientState, NULL);
|
||||
DeleteCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
|
||||
|
||||
XaceDeleteCallback(XACE_EXT_DISPATCH, SELinuxExtension, NULL);
|
||||
XaceDeleteCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
|
||||
XaceDeleteCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
|
||||
XaceDeleteCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
|
||||
XaceDeleteCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
|
||||
XaceDeleteCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
|
||||
XaceDeleteCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
|
||||
XaceDeleteCallback(XACE_EXT_ACCESS, SELinuxExtension, NULL);
|
||||
XaceDeleteCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
|
||||
XaceDeleteCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
|
||||
XaceDeleteCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
|
||||
XaceDeleteCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);
|
||||
|
||||
/* Tear down SELinux stuff */
|
||||
audit_close(audit_fd);
|
||||
avc_netlink_release_fd();
|
||||
RemoveBlockAndWakeupHandlers(SELinuxBlockHandler, SELinuxWakeupHandler,
|
||||
NULL);
|
||||
RemoveGeneralSocket(netlink_fd);
|
||||
|
||||
avc_destroy();
|
||||
}
|
||||
|
||||
void
|
||||
SELinuxFlaskInit(void)
|
||||
{
|
||||
struct selinux_opt avc_option = { AVC_OPT_SETENFORCE, (char *) 0 };
|
||||
security_context_t ctx;
|
||||
int ret = TRUE;
|
||||
|
||||
switch (selinuxEnforcingState) {
|
||||
case SELINUX_MODE_ENFORCING:
|
||||
LogMessage(X_INFO, "SELinux: Configured in enforcing mode\n");
|
||||
avc_option.value = (char *) 1;
|
||||
break;
|
||||
case SELINUX_MODE_PERMISSIVE:
|
||||
LogMessage(X_INFO, "SELinux: Configured in permissive mode\n");
|
||||
avc_option.value = (char *) 0;
|
||||
break;
|
||||
default:
|
||||
avc_option.type = AVC_OPT_UNUSED;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set up SELinux stuff */
|
||||
selinux_set_callback(SELINUX_CB_LOG, (union selinux_callback) SELinuxLog);
|
||||
selinux_set_callback(SELINUX_CB_AUDIT,
|
||||
(union selinux_callback) SELinuxAudit);
|
||||
|
||||
if (selinux_set_mapping(map) < 0) {
|
||||
if (errno == EINVAL) {
|
||||
ErrorF
|
||||
("SELinux: Invalid object class mapping, disabling SELinux support.\n");
|
||||
return;
|
||||
}
|
||||
FatalError("SELinux: Failed to set up security class mapping\n");
|
||||
}
|
||||
|
||||
if (avc_open(&avc_option, 1) < 0)
|
||||
FatalError("SELinux: Couldn't initialize SELinux userspace AVC\n");
|
||||
|
||||
if (security_get_initial_context_raw("unlabeled", &ctx) < 0)
|
||||
FatalError("SELinux: Failed to look up unlabeled context\n");
|
||||
if (avc_context_to_sid_raw(ctx, &unlabeled_sid) < 0)
|
||||
FatalError("SELinux: a context_to_SID call failed!\n");
|
||||
freecon(ctx);
|
||||
|
||||
/* Prepare for auditing */
|
||||
audit_fd = audit_open();
|
||||
if (audit_fd < 0)
|
||||
FatalError("SELinux: Failed to open the system audit log\n");
|
||||
|
||||
/* Allocate private storage */
|
||||
if (!dixRegisterPrivateKey
|
||||
(subjectKey, PRIVATE_XSELINUX, sizeof(SELinuxSubjectRec)) ||
|
||||
!dixRegisterPrivateKey(objectKey, PRIVATE_XSELINUX,
|
||||
sizeof(SELinuxObjectRec)) ||
|
||||
!dixRegisterPrivateKey(dataKey, PRIVATE_XSELINUX,
|
||||
sizeof(SELinuxObjectRec)))
|
||||
FatalError("SELinux: Failed to allocate private storage.\n");
|
||||
|
||||
/* Create atoms for doing window labeling */
|
||||
atom_ctx = MakeAtom("_SELINUX_CONTEXT", 16, TRUE);
|
||||
if (atom_ctx == BAD_RESOURCE)
|
||||
FatalError("SELinux: Failed to create atom\n");
|
||||
atom_client_ctx = MakeAtom("_SELINUX_CLIENT_CONTEXT", 23, TRUE);
|
||||
if (atom_client_ctx == BAD_RESOURCE)
|
||||
FatalError("SELinux: Failed to create atom\n");
|
||||
|
||||
netlink_fd = avc_netlink_acquire_fd();
|
||||
AddGeneralSocket(netlink_fd);
|
||||
RegisterBlockAndWakeupHandlers(SELinuxBlockHandler, SELinuxWakeupHandler,
|
||||
NULL);
|
||||
|
||||
/* Register callbacks */
|
||||
ret &= AddCallback(&ClientStateCallback, SELinuxClientState, NULL);
|
||||
ret &= AddCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
|
||||
|
||||
ret &= XaceRegisterCallback(XACE_EXT_DISPATCH, SELinuxExtension, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_EXT_ACCESS, SELinuxExtension, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
|
||||
ret &= XaceRegisterCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);
|
||||
if (!ret)
|
||||
FatalError("SELinux: Failed to register one or more callbacks\n");
|
||||
|
||||
/* Label objects that were created before we could register ourself */
|
||||
SELinuxLabelInitial();
|
||||
}
|
||||
381
xorg-server-1.18.4/Xext/xselinux_label.c
Normal file
381
xorg-server-1.18.4/Xext/xselinux_label.c
Normal file
@ -0,0 +1,381 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <selinux/label.h>
|
||||
|
||||
#include "registry.h"
|
||||
#include "xselinuxint.h"
|
||||
|
||||
/* selection and property atom cache */
|
||||
typedef struct {
|
||||
SELinuxObjectRec prp;
|
||||
SELinuxObjectRec sel;
|
||||
} SELinuxAtomRec;
|
||||
|
||||
/* dynamic array */
|
||||
typedef struct {
|
||||
unsigned size;
|
||||
void **array;
|
||||
} SELinuxArrayRec;
|
||||
|
||||
/* labeling handle */
|
||||
static struct selabel_handle *label_hnd;
|
||||
|
||||
/* Array of object classes indexed by resource type */
|
||||
SELinuxArrayRec arr_types;
|
||||
|
||||
/* Array of event SIDs indexed by event type */
|
||||
SELinuxArrayRec arr_events;
|
||||
|
||||
/* Array of property and selection SID structures */
|
||||
SELinuxArrayRec arr_atoms;
|
||||
|
||||
/*
|
||||
* Dynamic array helpers
|
||||
*/
|
||||
static void *
|
||||
SELinuxArrayGet(SELinuxArrayRec * rec, unsigned key)
|
||||
{
|
||||
return (rec->size > key) ? rec->array[key] : 0;
|
||||
}
|
||||
|
||||
static int
|
||||
SELinuxArraySet(SELinuxArrayRec * rec, unsigned key, void *val)
|
||||
{
|
||||
if (key >= rec->size) {
|
||||
/* Need to increase size of array */
|
||||
rec->array = reallocarray(rec->array, key + 1, sizeof(val));
|
||||
if (!rec->array)
|
||||
return FALSE;
|
||||
memset(rec->array + rec->size, 0, (key - rec->size + 1) * sizeof(val));
|
||||
rec->size = key + 1;
|
||||
}
|
||||
|
||||
rec->array[key] = val;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
SELinuxArrayFree(SELinuxArrayRec * rec, int free_elements)
|
||||
{
|
||||
if (free_elements) {
|
||||
unsigned i = rec->size;
|
||||
|
||||
while (i)
|
||||
free(rec->array[--i]);
|
||||
}
|
||||
|
||||
free(rec->array);
|
||||
rec->size = 0;
|
||||
rec->array = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Looks up a name in the selection or property mappings
|
||||
*/
|
||||
static int
|
||||
SELinuxAtomToSIDLookup(Atom atom, SELinuxObjectRec * obj, int map, int polymap)
|
||||
{
|
||||
const char *name = NameForAtom(atom);
|
||||
security_context_t ctx;
|
||||
int rc = Success;
|
||||
|
||||
obj->poly = 1;
|
||||
|
||||
/* Look in the mappings of names to contexts */
|
||||
if (selabel_lookup_raw(label_hnd, &ctx, name, map) == 0) {
|
||||
obj->poly = 0;
|
||||
}
|
||||
else if (errno != ENOENT) {
|
||||
ErrorF("SELinux: a property label lookup failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
else if (selabel_lookup_raw(label_hnd, &ctx, name, polymap) < 0) {
|
||||
ErrorF("SELinux: a property label lookup failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
/* Get a SID for context */
|
||||
if (avc_context_to_sid_raw(ctx, &obj->sid) < 0) {
|
||||
ErrorF("SELinux: a context_to_SID_raw call failed!\n");
|
||||
rc = BadAlloc;
|
||||
}
|
||||
|
||||
freecon(ctx);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Looks up the SID corresponding to the given property or selection atom
|
||||
*/
|
||||
int
|
||||
SELinuxAtomToSID(Atom atom, int prop, SELinuxObjectRec ** obj_rtn)
|
||||
{
|
||||
SELinuxAtomRec *rec;
|
||||
SELinuxObjectRec *obj;
|
||||
int rc, map, polymap;
|
||||
|
||||
rec = SELinuxArrayGet(&arr_atoms, atom);
|
||||
if (!rec) {
|
||||
rec = calloc(1, sizeof(SELinuxAtomRec));
|
||||
if (!rec || !SELinuxArraySet(&arr_atoms, atom, rec))
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
if (prop) {
|
||||
obj = &rec->prp;
|
||||
map = SELABEL_X_PROP;
|
||||
polymap = SELABEL_X_POLYPROP;
|
||||
}
|
||||
else {
|
||||
obj = &rec->sel;
|
||||
map = SELABEL_X_SELN;
|
||||
polymap = SELABEL_X_POLYSELN;
|
||||
}
|
||||
|
||||
if (!obj->sid) {
|
||||
rc = SELinuxAtomToSIDLookup(atom, obj, map, polymap);
|
||||
if (rc != Success)
|
||||
goto out;
|
||||
}
|
||||
|
||||
*obj_rtn = obj;
|
||||
rc = Success;
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Looks up a SID for a selection/subject pair
|
||||
*/
|
||||
int
|
||||
SELinuxSelectionToSID(Atom selection, SELinuxSubjectRec * subj,
|
||||
security_id_t * sid_rtn, int *poly_rtn)
|
||||
{
|
||||
int rc;
|
||||
SELinuxObjectRec *obj;
|
||||
security_id_t tsid;
|
||||
|
||||
/* Get the default context and polyinstantiation bit */
|
||||
rc = SELinuxAtomToSID(selection, 0, &obj);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
/* Check for an override context next */
|
||||
if (subj->sel_use_sid) {
|
||||
tsid = subj->sel_use_sid;
|
||||
goto out;
|
||||
}
|
||||
|
||||
tsid = obj->sid;
|
||||
|
||||
/* Polyinstantiate if necessary to obtain the final SID */
|
||||
if (obj->poly && avc_compute_member(subj->sid, obj->sid,
|
||||
SECCLASS_X_SELECTION, &tsid) < 0) {
|
||||
ErrorF("SELinux: a compute_member call failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
out:
|
||||
*sid_rtn = tsid;
|
||||
if (poly_rtn)
|
||||
*poly_rtn = obj->poly;
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* Looks up a SID for a property/subject pair
|
||||
*/
|
||||
int
|
||||
SELinuxPropertyToSID(Atom property, SELinuxSubjectRec * subj,
|
||||
security_id_t * sid_rtn, int *poly_rtn)
|
||||
{
|
||||
int rc;
|
||||
SELinuxObjectRec *obj;
|
||||
security_id_t tsid, tsid2;
|
||||
|
||||
/* Get the default context and polyinstantiation bit */
|
||||
rc = SELinuxAtomToSID(property, 1, &obj);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
/* Check for an override context next */
|
||||
if (subj->prp_use_sid) {
|
||||
tsid = subj->prp_use_sid;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Perform a transition */
|
||||
if (avc_compute_create(subj->sid, obj->sid, SECCLASS_X_PROPERTY, &tsid) < 0) {
|
||||
ErrorF("SELinux: a compute_create call failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
/* Polyinstantiate if necessary to obtain the final SID */
|
||||
if (obj->poly) {
|
||||
tsid2 = tsid;
|
||||
if (avc_compute_member(subj->sid, tsid2,
|
||||
SECCLASS_X_PROPERTY, &tsid) < 0) {
|
||||
ErrorF("SELinux: a compute_member call failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
}
|
||||
out:
|
||||
*sid_rtn = tsid;
|
||||
if (poly_rtn)
|
||||
*poly_rtn = obj->poly;
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* Looks up the SID corresponding to the given event type
|
||||
*/
|
||||
int
|
||||
SELinuxEventToSID(unsigned type, security_id_t sid_of_window,
|
||||
SELinuxObjectRec * sid_return)
|
||||
{
|
||||
const char *name = LookupEventName(type);
|
||||
security_id_t sid;
|
||||
security_context_t ctx;
|
||||
|
||||
type &= 127;
|
||||
|
||||
sid = SELinuxArrayGet(&arr_events, type);
|
||||
if (!sid) {
|
||||
/* Look in the mappings of event names to contexts */
|
||||
if (selabel_lookup_raw(label_hnd, &ctx, name, SELABEL_X_EVENT) < 0) {
|
||||
ErrorF("SELinux: an event label lookup failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
/* Get a SID for context */
|
||||
if (avc_context_to_sid_raw(ctx, &sid) < 0) {
|
||||
ErrorF("SELinux: a context_to_SID_raw call failed!\n");
|
||||
freecon(ctx);
|
||||
return BadAlloc;
|
||||
}
|
||||
freecon(ctx);
|
||||
/* Cache the SID value */
|
||||
if (!SELinuxArraySet(&arr_events, type, sid))
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
/* Perform a transition to obtain the final SID */
|
||||
if (avc_compute_create(sid_of_window, sid, SECCLASS_X_EVENT,
|
||||
&sid_return->sid) < 0) {
|
||||
ErrorF("SELinux: a compute_create call failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
int
|
||||
SELinuxExtensionToSID(const char *name, security_id_t * sid_rtn)
|
||||
{
|
||||
security_context_t ctx;
|
||||
|
||||
/* Look in the mappings of extension names to contexts */
|
||||
if (selabel_lookup_raw(label_hnd, &ctx, name, SELABEL_X_EXT) < 0) {
|
||||
ErrorF("SELinux: a property label lookup failed!\n");
|
||||
return BadValue;
|
||||
}
|
||||
/* Get a SID for context */
|
||||
if (avc_context_to_sid_raw(ctx, sid_rtn) < 0) {
|
||||
ErrorF("SELinux: a context_to_SID_raw call failed!\n");
|
||||
freecon(ctx);
|
||||
return BadAlloc;
|
||||
}
|
||||
freecon(ctx);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the object class corresponding to the given resource type.
|
||||
*/
|
||||
security_class_t
|
||||
SELinuxTypeToClass(RESTYPE type)
|
||||
{
|
||||
void *tmp;
|
||||
|
||||
tmp = SELinuxArrayGet(&arr_types, type & TypeMask);
|
||||
if (!tmp) {
|
||||
unsigned long class = SECCLASS_X_RESOURCE;
|
||||
|
||||
if (type & RC_DRAWABLE)
|
||||
class = SECCLASS_X_DRAWABLE;
|
||||
else if (type == RT_GC)
|
||||
class = SECCLASS_X_GC;
|
||||
else if (type == RT_FONT)
|
||||
class = SECCLASS_X_FONT;
|
||||
else if (type == RT_CURSOR)
|
||||
class = SECCLASS_X_CURSOR;
|
||||
else if (type == RT_COLORMAP)
|
||||
class = SECCLASS_X_COLORMAP;
|
||||
else {
|
||||
/* Need to do a string lookup */
|
||||
const char *str = LookupResourceName(type);
|
||||
|
||||
if (!strcmp(str, "PICTURE"))
|
||||
class = SECCLASS_X_DRAWABLE;
|
||||
else if (!strcmp(str, "GLYPHSET"))
|
||||
class = SECCLASS_X_FONT;
|
||||
}
|
||||
|
||||
tmp = (void *) class;
|
||||
SELinuxArraySet(&arr_types, type & TypeMask, tmp);
|
||||
}
|
||||
|
||||
return (security_class_t) (unsigned long) tmp;
|
||||
}
|
||||
|
||||
security_context_t
|
||||
SELinuxDefaultClientLabel(void)
|
||||
{
|
||||
security_context_t ctx;
|
||||
|
||||
if (selabel_lookup_raw(label_hnd, &ctx, "remote", SELABEL_X_CLIENT) < 0)
|
||||
FatalError("SELinux: failed to look up remote-client context\n");
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void
|
||||
SELinuxLabelInit(void)
|
||||
{
|
||||
struct selinux_opt selabel_option = { SELABEL_OPT_VALIDATE, (char *) 1 };
|
||||
|
||||
label_hnd = selabel_open(SELABEL_CTX_X, &selabel_option, 1);
|
||||
if (!label_hnd)
|
||||
FatalError("SELinux: Failed to open x_contexts mapping in policy\n");
|
||||
}
|
||||
|
||||
void
|
||||
SELinuxLabelReset(void)
|
||||
{
|
||||
selabel_close(label_hnd);
|
||||
label_hnd = NULL;
|
||||
|
||||
/* Free local state */
|
||||
SELinuxArrayFree(&arr_types, 0);
|
||||
SELinuxArrayFree(&arr_events, 0);
|
||||
SELinuxArrayFree(&arr_atoms, 1);
|
||||
}
|
||||
564
xorg-server-1.18.4/Xext/xselinuxint.h
Normal file
564
xorg-server-1.18.4/Xext/xselinuxint.h
Normal file
@ -0,0 +1,564 @@
|
||||
/************************************************************
|
||||
|
||||
Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
this permission notice appear in supporting documentation. 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.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifndef _XSELINUXINT_H
|
||||
#define _XSELINUXINT_H
|
||||
|
||||
#include <selinux/selinux.h>
|
||||
#include <selinux/avc.h>
|
||||
|
||||
#include "globals.h"
|
||||
#include "dixaccess.h"
|
||||
#include "dixstruct.h"
|
||||
#include "privates.h"
|
||||
#include "resource.h"
|
||||
#include "registry.h"
|
||||
#include "inputstr.h"
|
||||
#include "xselinux.h"
|
||||
|
||||
/*
|
||||
* Types
|
||||
*/
|
||||
|
||||
#define COMMAND_LEN 64
|
||||
|
||||
/* subject state (clients and devices only) */
|
||||
typedef struct {
|
||||
security_id_t sid;
|
||||
security_id_t dev_create_sid;
|
||||
security_id_t win_create_sid;
|
||||
security_id_t sel_create_sid;
|
||||
security_id_t prp_create_sid;
|
||||
security_id_t sel_use_sid;
|
||||
security_id_t prp_use_sid;
|
||||
struct avc_entry_ref aeref;
|
||||
char command[COMMAND_LEN];
|
||||
int privileged;
|
||||
} SELinuxSubjectRec;
|
||||
|
||||
/* object state */
|
||||
typedef struct {
|
||||
security_id_t sid;
|
||||
int poly;
|
||||
} SELinuxObjectRec;
|
||||
|
||||
/*
|
||||
* Globals
|
||||
*/
|
||||
|
||||
extern DevPrivateKeyRec subjectKeyRec;
|
||||
|
||||
#define subjectKey (&subjectKeyRec)
|
||||
extern DevPrivateKeyRec objectKeyRec;
|
||||
|
||||
#define objectKey (&objectKeyRec)
|
||||
extern DevPrivateKeyRec dataKeyRec;
|
||||
|
||||
#define dataKey (&dataKeyRec)
|
||||
|
||||
/*
|
||||
* Label functions
|
||||
*/
|
||||
|
||||
int
|
||||
SELinuxAtomToSID(Atom atom, int prop, SELinuxObjectRec ** obj_rtn);
|
||||
|
||||
int
|
||||
|
||||
SELinuxSelectionToSID(Atom selection, SELinuxSubjectRec * subj,
|
||||
security_id_t * sid_rtn, int *poly_rtn);
|
||||
|
||||
int
|
||||
|
||||
SELinuxPropertyToSID(Atom property, SELinuxSubjectRec * subj,
|
||||
security_id_t * sid_rtn, int *poly_rtn);
|
||||
|
||||
int
|
||||
|
||||
SELinuxEventToSID(unsigned type, security_id_t sid_of_window,
|
||||
SELinuxObjectRec * sid_return);
|
||||
|
||||
int
|
||||
SELinuxExtensionToSID(const char *name, security_id_t * sid_rtn);
|
||||
|
||||
security_class_t SELinuxTypeToClass(RESTYPE type);
|
||||
|
||||
security_context_t SELinuxDefaultClientLabel(void);
|
||||
|
||||
void
|
||||
SELinuxLabelInit(void);
|
||||
|
||||
void
|
||||
SELinuxLabelReset(void);
|
||||
|
||||
/*
|
||||
* Security module functions
|
||||
*/
|
||||
|
||||
void
|
||||
SELinuxFlaskInit(void);
|
||||
|
||||
void
|
||||
SELinuxFlaskReset(void);
|
||||
|
||||
/*
|
||||
* Private Flask definitions
|
||||
*/
|
||||
|
||||
/* Security class constants */
|
||||
#define SECCLASS_X_DRAWABLE 1
|
||||
#define SECCLASS_X_SCREEN 2
|
||||
#define SECCLASS_X_GC 3
|
||||
#define SECCLASS_X_FONT 4
|
||||
#define SECCLASS_X_COLORMAP 5
|
||||
#define SECCLASS_X_PROPERTY 6
|
||||
#define SECCLASS_X_SELECTION 7
|
||||
#define SECCLASS_X_CURSOR 8
|
||||
#define SECCLASS_X_CLIENT 9
|
||||
#define SECCLASS_X_POINTER 10
|
||||
#define SECCLASS_X_KEYBOARD 11
|
||||
#define SECCLASS_X_SERVER 12
|
||||
#define SECCLASS_X_EXTENSION 13
|
||||
#define SECCLASS_X_EVENT 14
|
||||
#define SECCLASS_X_FAKEEVENT 15
|
||||
#define SECCLASS_X_RESOURCE 16
|
||||
|
||||
#ifdef _XSELINUX_NEED_FLASK_MAP
|
||||
/* Mapping from DixAccess bits to Flask permissions */
|
||||
static struct security_class_mapping map[] = {
|
||||
{"x_drawable",
|
||||
{"read", /* DixReadAccess */
|
||||
"write", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"list_property", /* DixListPropAccess */
|
||||
"get_property", /* DixGetPropAccess */
|
||||
"set_property", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"list_child", /* DixListAccess */
|
||||
"add_child", /* DixAddAccess */
|
||||
"remove_child", /* DixRemoveAccess */
|
||||
"hide", /* DixHideAccess */
|
||||
"show", /* DixShowAccess */
|
||||
"blend", /* DixBlendAccess */
|
||||
"override", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"send", /* DixSendAccess */
|
||||
"receive", /* DixReceiveAccess */
|
||||
"", /* DixUseAccess */
|
||||
"manage", /* DixManageAccess */
|
||||
NULL}},
|
||||
{"x_screen",
|
||||
{"", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"", /* DixDestroyAccess */
|
||||
"", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"saver_getattr", /* DixListPropAccess */
|
||||
"saver_setattr", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"hide_cursor", /* DixHideAccess */
|
||||
"show_cursor", /* DixShowAccess */
|
||||
"saver_hide", /* DixBlendAccess */
|
||||
"saver_show", /* DixGrabAccess */
|
||||
NULL}},
|
||||
{"x_gc",
|
||||
{"", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"use", /* DixUseAccess */
|
||||
NULL}},
|
||||
{"x_font",
|
||||
{"", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"add_glyph", /* DixAddAccess */
|
||||
"remove_glyph", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"use", /* DixUseAccess */
|
||||
NULL}},
|
||||
{"x_colormap",
|
||||
{"read", /* DixReadAccess */
|
||||
"write", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"add_color", /* DixAddAccess */
|
||||
"remove_color", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"install", /* DixInstallAccess */
|
||||
"uninstall", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"use", /* DixUseAccess */
|
||||
NULL}},
|
||||
{"x_property",
|
||||
{"read", /* DixReadAccess */
|
||||
"write", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"write", /* DixBlendAccess */
|
||||
NULL}},
|
||||
{"x_selection",
|
||||
{"read", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"", /* DixDestroyAccess */
|
||||
"setattr", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
NULL}},
|
||||
{"x_cursor",
|
||||
{"read", /* DixReadAccess */
|
||||
"write", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"use", /* DixUseAccess */
|
||||
NULL}},
|
||||
{"x_client",
|
||||
{"", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"", /* DixUseAccess */
|
||||
"manage", /* DixManageAccess */
|
||||
NULL}},
|
||||
{"x_pointer",
|
||||
{"read", /* DixReadAccess */
|
||||
"write", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"list_property", /* DixListPropAccess */
|
||||
"get_property", /* DixGetPropAccess */
|
||||
"set_property", /* DixSetPropAccess */
|
||||
"getfocus", /* DixGetFocusAccess */
|
||||
"setfocus", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"add", /* DixAddAccess */
|
||||
"remove", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"grab", /* DixGrabAccess */
|
||||
"freeze", /* DixFreezeAccess */
|
||||
"force_cursor", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"use", /* DixUseAccess */
|
||||
"manage", /* DixManageAccess */
|
||||
"", /* DixDebugAccess */
|
||||
"bell", /* DixBellAccess */
|
||||
NULL}},
|
||||
{"x_keyboard",
|
||||
{"read", /* DixReadAccess */
|
||||
"write", /* DixWriteAccess */
|
||||
"destroy", /* DixDestroyAccess */
|
||||
"create", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"list_property", /* DixListPropAccess */
|
||||
"get_property", /* DixGetPropAccess */
|
||||
"set_property", /* DixSetPropAccess */
|
||||
"getfocus", /* DixGetFocusAccess */
|
||||
"setfocus", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"add", /* DixAddAccess */
|
||||
"remove", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"grab", /* DixGrabAccess */
|
||||
"freeze", /* DixFreezeAccess */
|
||||
"force_cursor", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"use", /* DixUseAccess */
|
||||
"manage", /* DixManageAccess */
|
||||
"", /* DixDebugAccess */
|
||||
"bell", /* DixBellAccess */
|
||||
NULL}},
|
||||
{"x_server",
|
||||
{"record", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"", /* DixDestroyAccess */
|
||||
"", /* DixCreateAccess */
|
||||
"getattr", /* DixGetAttrAccess */
|
||||
"setattr", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"grab", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"", /* DixUseAccess */
|
||||
"manage", /* DixManageAccess */
|
||||
"debug", /* DixDebugAccess */
|
||||
NULL}},
|
||||
{"x_extension",
|
||||
{"", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"", /* DixDestroyAccess */
|
||||
"", /* DixCreateAccess */
|
||||
"query", /* DixGetAttrAccess */
|
||||
"", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"", /* DixSendAccess */
|
||||
"", /* DixReceiveAccess */
|
||||
"use", /* DixUseAccess */
|
||||
NULL}},
|
||||
{"x_event",
|
||||
{"", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"", /* DixDestroyAccess */
|
||||
"", /* DixCreateAccess */
|
||||
"", /* DixGetAttrAccess */
|
||||
"", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"send", /* DixSendAccess */
|
||||
"receive", /* DixReceiveAccess */
|
||||
NULL}},
|
||||
{"x_synthetic_event",
|
||||
{"", /* DixReadAccess */
|
||||
"", /* DixWriteAccess */
|
||||
"", /* DixDestroyAccess */
|
||||
"", /* DixCreateAccess */
|
||||
"", /* DixGetAttrAccess */
|
||||
"", /* DixSetAttrAccess */
|
||||
"", /* DixListPropAccess */
|
||||
"", /* DixGetPropAccess */
|
||||
"", /* DixSetPropAccess */
|
||||
"", /* DixGetFocusAccess */
|
||||
"", /* DixSetFocusAccess */
|
||||
"", /* DixListAccess */
|
||||
"", /* DixAddAccess */
|
||||
"", /* DixRemoveAccess */
|
||||
"", /* DixHideAccess */
|
||||
"", /* DixShowAccess */
|
||||
"", /* DixBlendAccess */
|
||||
"", /* DixGrabAccess */
|
||||
"", /* DixFreezeAccess */
|
||||
"", /* DixForceAccess */
|
||||
"", /* DixInstallAccess */
|
||||
"", /* DixUninstallAccess */
|
||||
"send", /* DixSendAccess */
|
||||
"receive", /* DixReceiveAccess */
|
||||
NULL}},
|
||||
{"x_resource",
|
||||
{"read", /* DixReadAccess */
|
||||
"write", /* DixWriteAccess */
|
||||
"write", /* DixDestroyAccess */
|
||||
"write", /* DixCreateAccess */
|
||||
"read", /* DixGetAttrAccess */
|
||||
"write", /* DixSetAttrAccess */
|
||||
"read", /* DixListPropAccess */
|
||||
"read", /* DixGetPropAccess */
|
||||
"write", /* DixSetPropAccess */
|
||||
"read", /* DixGetFocusAccess */
|
||||
"write", /* DixSetFocusAccess */
|
||||
"read", /* DixListAccess */
|
||||
"write", /* DixAddAccess */
|
||||
"write", /* DixRemoveAccess */
|
||||
"write", /* DixHideAccess */
|
||||
"read", /* DixShowAccess */
|
||||
"read", /* DixBlendAccess */
|
||||
"write", /* DixGrabAccess */
|
||||
"write", /* DixFreezeAccess */
|
||||
"write", /* DixForceAccess */
|
||||
"write", /* DixInstallAccess */
|
||||
"write", /* DixUninstallAccess */
|
||||
"write", /* DixSendAccess */
|
||||
"read", /* DixReceiveAccess */
|
||||
"read", /* DixUseAccess */
|
||||
"write", /* DixManageAccess */
|
||||
"read", /* DixDebugAccess */
|
||||
"write", /* DixBellAccess */
|
||||
NULL}},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
/* x_resource "read" bits from the list above */
|
||||
#define SELinuxReadMask (DixReadAccess|DixGetAttrAccess|DixListPropAccess| \
|
||||
DixGetPropAccess|DixGetFocusAccess|DixListAccess| \
|
||||
DixShowAccess|DixBlendAccess|DixReceiveAccess| \
|
||||
DixUseAccess|DixDebugAccess)
|
||||
|
||||
#endif /* _XSELINUX_NEED_FLASK_MAP */
|
||||
#endif /* _XSELINUXINT_H */
|
||||
694
xorg-server-1.18.4/Xext/xtest.c
Normal file
694
xorg-server-1.18.4/Xext/xtest.c
Normal file
@ -0,0 +1,694 @@
|
||||
/*
|
||||
|
||||
Copyright 1992, 1998 The Open Group
|
||||
|
||||
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 OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
#include "dixstruct.h"
|
||||
#include "extnsionst.h"
|
||||
#include "windowstr.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "dixevents.h"
|
||||
#include "sleepuntil.h"
|
||||
#include "mi.h"
|
||||
#include "xkbsrv.h"
|
||||
#include "xkbstr.h"
|
||||
#include <X11/extensions/xtestproto.h>
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
#include "mipointer.h"
|
||||
#include "xserver-properties.h"
|
||||
#include "exevents.h"
|
||||
#include "eventstr.h"
|
||||
#include "inpututils.h"
|
||||
|
||||
#include "extinit.h"
|
||||
|
||||
/* XTest events are sent during request processing and may be interruped by
|
||||
* a SIGIO. We need a separate event list to avoid events overwriting each
|
||||
* other's memory */
|
||||
static InternalEvent *xtest_evlist;
|
||||
|
||||
/**
|
||||
* xtestpointer
|
||||
* is the virtual pointer for XTest. It is the first slave
|
||||
* device of the VCP.
|
||||
* xtestkeyboard
|
||||
* is the virtual keyboard for XTest. It is the first slave
|
||||
* device of the VCK
|
||||
*
|
||||
* Neither of these devices can be deleted.
|
||||
*/
|
||||
DeviceIntPtr xtestpointer, xtestkeyboard;
|
||||
|
||||
#ifdef PANORAMIX
|
||||
#include "panoramiX.h"
|
||||
#include "panoramiXsrv.h"
|
||||
#endif
|
||||
|
||||
static int XTestSwapFakeInput(ClientPtr /* client */ ,
|
||||
xReq * /* req */
|
||||
);
|
||||
|
||||
static int
|
||||
ProcXTestGetVersion(ClientPtr client)
|
||||
{
|
||||
xXTestGetVersionReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.majorVersion = XTestMajorVersion,
|
||||
.minorVersion = XTestMinorVersion
|
||||
};
|
||||
|
||||
REQUEST_SIZE_MATCH(xXTestGetVersionReq);
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
swaps(&rep.minorVersion);
|
||||
}
|
||||
WriteToClient(client, sizeof(xXTestGetVersionReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXTestCompareCursor(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXTestCompareCursorReq);
|
||||
xXTestCompareCursorReply rep;
|
||||
WindowPtr pWin;
|
||||
CursorPtr pCursor;
|
||||
int rc;
|
||||
DeviceIntPtr ptr = PickPointer(client);
|
||||
|
||||
REQUEST_SIZE_MATCH(xXTestCompareCursorReq);
|
||||
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
if (!ptr)
|
||||
return BadAccess;
|
||||
|
||||
if (stuff->cursor == None)
|
||||
pCursor = NullCursor;
|
||||
else if (stuff->cursor == XTestCurrentCursor)
|
||||
pCursor = GetSpriteCursor(ptr);
|
||||
else {
|
||||
rc = dixLookupResourceByType((void **) &pCursor, stuff->cursor,
|
||||
RT_CURSOR, client, DixReadAccess);
|
||||
if (rc != Success) {
|
||||
client->errorValue = stuff->cursor;
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
rep = (xXTestCompareCursorReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.same = (wCursor(pWin) == pCursor)
|
||||
};
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber);
|
||||
}
|
||||
WriteToClient(client, sizeof(xXTestCompareCursorReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXTestFakeInput(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXTestFakeInputReq);
|
||||
int nev, n, type, rc;
|
||||
xEvent *ev;
|
||||
DeviceIntPtr dev = NULL;
|
||||
WindowPtr root;
|
||||
Bool extension = FALSE;
|
||||
ValuatorMask mask;
|
||||
int valuators[MAX_VALUATORS] = { 0 };
|
||||
int numValuators = 0;
|
||||
int firstValuator = 0;
|
||||
int nevents = 0;
|
||||
int i;
|
||||
int base = 0;
|
||||
int flags = 0;
|
||||
int need_ptr_update = 1;
|
||||
|
||||
nev = (stuff->length << 2) - sizeof(xReq);
|
||||
if ((nev % sizeof(xEvent)) || !nev)
|
||||
return BadLength;
|
||||
nev /= sizeof(xEvent);
|
||||
UpdateCurrentTime();
|
||||
ev = (xEvent *) &((xReq *) stuff)[1];
|
||||
type = ev->u.u.type & 0177;
|
||||
|
||||
if (type >= EXTENSION_EVENT_BASE) {
|
||||
extension = TRUE;
|
||||
|
||||
/* check device */
|
||||
rc = dixLookupDevice(&dev, stuff->deviceid & 0177, client,
|
||||
DixWriteAccess);
|
||||
if (rc != Success) {
|
||||
client->errorValue = stuff->deviceid & 0177;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* check type */
|
||||
type -= DeviceValuator;
|
||||
switch (type) {
|
||||
case XI_DeviceKeyPress:
|
||||
case XI_DeviceKeyRelease:
|
||||
if (!dev->key) {
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
break;
|
||||
case XI_DeviceButtonPress:
|
||||
case XI_DeviceButtonRelease:
|
||||
if (!dev->button) {
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
break;
|
||||
case XI_DeviceMotionNotify:
|
||||
if (!dev->valuator) {
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
break;
|
||||
case XI_ProximityIn:
|
||||
case XI_ProximityOut:
|
||||
if (!dev->proximity) {
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
/* check validity */
|
||||
if (nev == 1 && type == XI_DeviceMotionNotify)
|
||||
return BadLength; /* DevMotion must be followed by DevValuator */
|
||||
|
||||
if (type == XI_DeviceMotionNotify) {
|
||||
firstValuator = ((deviceValuator *) (ev + 1))->first_valuator;
|
||||
if (firstValuator > dev->valuator->numAxes) {
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
if (ev->u.u.detail == xFalse)
|
||||
flags |= POINTER_ABSOLUTE;
|
||||
}
|
||||
else {
|
||||
firstValuator = 0;
|
||||
flags |= POINTER_ABSOLUTE;
|
||||
}
|
||||
|
||||
if (nev > 1 && !dev->valuator) {
|
||||
client->errorValue = firstValuator;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
/* check validity of valuator events */
|
||||
base = firstValuator;
|
||||
for (n = 1; n < nev; n++) {
|
||||
deviceValuator *dv = (deviceValuator *) (ev + n);
|
||||
if (dv->type != DeviceValuator) {
|
||||
client->errorValue = dv->type;
|
||||
return BadValue;
|
||||
}
|
||||
if (dv->first_valuator != base) {
|
||||
client->errorValue = dv->first_valuator;
|
||||
return BadValue;
|
||||
}
|
||||
switch (dv->num_valuators) {
|
||||
case 6:
|
||||
valuators[base + 5] = dv->valuator5;
|
||||
case 5:
|
||||
valuators[base + 4] = dv->valuator4;
|
||||
case 4:
|
||||
valuators[base + 3] = dv->valuator3;
|
||||
case 3:
|
||||
valuators[base + 2] = dv->valuator2;
|
||||
case 2:
|
||||
valuators[base + 1] = dv->valuator1;
|
||||
case 1:
|
||||
valuators[base] = dv->valuator0;
|
||||
break;
|
||||
default:
|
||||
client->errorValue = dv->num_valuators;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
base += dv->num_valuators;
|
||||
numValuators += dv->num_valuators;
|
||||
|
||||
if (firstValuator + numValuators > dev->valuator->numAxes) {
|
||||
client->errorValue = dv->num_valuators;
|
||||
return BadValue;
|
||||
}
|
||||
}
|
||||
type = type - XI_DeviceKeyPress + KeyPress;
|
||||
|
||||
}
|
||||
else {
|
||||
if (nev != 1)
|
||||
return BadLength;
|
||||
switch (type) {
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
dev = PickKeyboard(client);
|
||||
break;
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
dev = PickPointer(client);
|
||||
break;
|
||||
case MotionNotify:
|
||||
dev = PickPointer(client);
|
||||
valuators[0] = ev->u.keyButtonPointer.rootX;
|
||||
valuators[1] = ev->u.keyButtonPointer.rootY;
|
||||
numValuators = 2;
|
||||
firstValuator = 0;
|
||||
if (ev->u.u.detail == xFalse)
|
||||
flags = POINTER_ABSOLUTE | POINTER_DESKTOP;
|
||||
break;
|
||||
default:
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
/* Technically the protocol doesn't allow for BadAccess here but
|
||||
* this can only happen when all MDs are disabled. */
|
||||
if (!dev)
|
||||
return BadAccess;
|
||||
|
||||
dev = GetXTestDevice(dev);
|
||||
}
|
||||
|
||||
|
||||
/* If the event has a time set, wait for it to pass */
|
||||
if (ev->u.keyButtonPointer.time) {
|
||||
TimeStamp activateTime;
|
||||
CARD32 ms;
|
||||
|
||||
activateTime = currentTime;
|
||||
ms = activateTime.milliseconds + ev->u.keyButtonPointer.time;
|
||||
if (ms < activateTime.milliseconds)
|
||||
activateTime.months++;
|
||||
activateTime.milliseconds = ms;
|
||||
ev->u.keyButtonPointer.time = 0;
|
||||
|
||||
/* see mbuf.c:QueueDisplayRequest (from the deprecated Multibuffer
|
||||
* extension) for code similar to this */
|
||||
|
||||
if (!ClientSleepUntil(client, &activateTime, NULL, NULL)) {
|
||||
return BadAlloc;
|
||||
}
|
||||
/* swap the request back so we can simply re-execute it */
|
||||
if (client->swapped) {
|
||||
(void) XTestSwapFakeInput(client, (xReq *) stuff);
|
||||
swaps(&stuff->length);
|
||||
}
|
||||
ResetCurrentRequest(client);
|
||||
client->sequence--;
|
||||
return Success;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
if (!dev->key)
|
||||
return BadDevice;
|
||||
|
||||
if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
|
||||
ev->u.u.detail > dev->key->xkbInfo->desc->max_key_code) {
|
||||
client->errorValue = ev->u.u.detail;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
need_ptr_update = 0;
|
||||
break;
|
||||
case MotionNotify:
|
||||
if (!dev->valuator)
|
||||
return BadDevice;
|
||||
|
||||
if (!(extension || ev->u.keyButtonPointer.root == None)) {
|
||||
rc = dixLookupWindow(&root, ev->u.keyButtonPointer.root,
|
||||
client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
if (root->parent) {
|
||||
client->errorValue = ev->u.keyButtonPointer.root;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
/* Add the root window's offset to the valuators */
|
||||
if ((flags & POINTER_ABSOLUTE) && firstValuator <= 1 && numValuators > 0) {
|
||||
if (firstValuator == 0)
|
||||
valuators[0] += root->drawable.pScreen->x;
|
||||
if (firstValuator < 2 && firstValuator + numValuators > 1)
|
||||
valuators[1 - firstValuator] += root->drawable.pScreen->y;
|
||||
}
|
||||
}
|
||||
if (ev->u.u.detail != xTrue && ev->u.u.detail != xFalse) {
|
||||
client->errorValue = ev->u.u.detail;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
/* FIXME: Xinerama! */
|
||||
|
||||
break;
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
if (!dev->button)
|
||||
return BadDevice;
|
||||
|
||||
if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons) {
|
||||
client->errorValue = ev->u.u.detail;
|
||||
return BadValue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (screenIsSaved == SCREEN_SAVER_ON)
|
||||
dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
|
||||
|
||||
switch (type) {
|
||||
case MotionNotify:
|
||||
valuator_mask_set_range(&mask, firstValuator, numValuators, valuators);
|
||||
nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags, &mask);
|
||||
break;
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
valuator_mask_set_range(&mask, firstValuator, numValuators, valuators);
|
||||
nevents = GetPointerEvents(xtest_evlist, dev, type, ev->u.u.detail,
|
||||
flags, &mask);
|
||||
break;
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
nevents =
|
||||
GetKeyboardEvents(xtest_evlist, dev, type, ev->u.u.detail);
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < nevents; i++)
|
||||
mieqProcessDeviceEvent(dev, &xtest_evlist[i], miPointerGetScreen(inputInfo.pointer));
|
||||
|
||||
if (need_ptr_update)
|
||||
miPointerUpdateSprite(dev);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXTestGrabControl(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXTestGrabControlReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(xXTestGrabControlReq);
|
||||
if ((stuff->impervious != xTrue) && (stuff->impervious != xFalse)) {
|
||||
client->errorValue = stuff->impervious;
|
||||
return BadValue;
|
||||
}
|
||||
if (stuff->impervious)
|
||||
MakeClientGrabImpervious(client);
|
||||
else
|
||||
MakeClientGrabPervious(client);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXTestDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
switch (stuff->data) {
|
||||
case X_XTestGetVersion:
|
||||
return ProcXTestGetVersion(client);
|
||||
case X_XTestCompareCursor:
|
||||
return ProcXTestCompareCursor(client);
|
||||
case X_XTestFakeInput:
|
||||
return ProcXTestFakeInput(client);
|
||||
case X_XTestGrabControl:
|
||||
return ProcXTestGrabControl(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXTestGetVersion(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXTestGetVersionReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xXTestGetVersionReq);
|
||||
swaps(&stuff->minorVersion);
|
||||
return ProcXTestGetVersion(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXTestCompareCursor(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXTestCompareCursorReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xXTestCompareCursorReq);
|
||||
swapl(&stuff->window);
|
||||
swapl(&stuff->cursor);
|
||||
return ProcXTestCompareCursor(client);
|
||||
}
|
||||
|
||||
static int
|
||||
XTestSwapFakeInput(ClientPtr client, xReq * req)
|
||||
{
|
||||
int nev;
|
||||
xEvent *ev;
|
||||
xEvent sev;
|
||||
EventSwapPtr proc;
|
||||
|
||||
nev = ((req->length << 2) - sizeof(xReq)) / sizeof(xEvent);
|
||||
for (ev = (xEvent *) &req[1]; --nev >= 0; ev++) {
|
||||
/* Swap event */
|
||||
proc = EventSwapVector[ev->u.u.type & 0177];
|
||||
/* no swapping proc; invalid event type? */
|
||||
if (!proc || proc == NotImplemented) {
|
||||
client->errorValue = ev->u.u.type;
|
||||
return BadValue;
|
||||
}
|
||||
(*proc) (ev, &sev);
|
||||
*ev = sev;
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXTestFakeInput(ClientPtr client)
|
||||
{
|
||||
int n;
|
||||
|
||||
REQUEST(xReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
n = XTestSwapFakeInput(client, stuff);
|
||||
if (n != Success)
|
||||
return n;
|
||||
return ProcXTestFakeInput(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXTestGrabControl(ClientPtr client)
|
||||
{
|
||||
REQUEST(xXTestGrabControlReq);
|
||||
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xXTestGrabControlReq);
|
||||
return ProcXTestGrabControl(client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXTestDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
switch (stuff->data) {
|
||||
case X_XTestGetVersion:
|
||||
return SProcXTestGetVersion(client);
|
||||
case X_XTestCompareCursor:
|
||||
return SProcXTestCompareCursor(client);
|
||||
case X_XTestFakeInput:
|
||||
return SProcXTestFakeInput(client);
|
||||
case X_XTestGrabControl:
|
||||
return SProcXTestGrabControl(client);
|
||||
default:
|
||||
return BadRequest;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate an virtual slave device for xtest events, this
|
||||
* is a slave device to inputInfo master devices
|
||||
*/
|
||||
void
|
||||
InitXTestDevices(void)
|
||||
{
|
||||
if (AllocXTestDevice(serverClient, "Virtual core",
|
||||
&xtestpointer, &xtestkeyboard,
|
||||
inputInfo.pointer, inputInfo.keyboard) != Success)
|
||||
FatalError("Failed to allocate XTest devices");
|
||||
|
||||
if (ActivateDevice(xtestpointer, TRUE) != Success ||
|
||||
ActivateDevice(xtestkeyboard, TRUE) != Success)
|
||||
FatalError("Failed to activate XTest core devices.");
|
||||
if (!EnableDevice(xtestpointer, TRUE) || !EnableDevice(xtestkeyboard, TRUE))
|
||||
FatalError("Failed to enable XTest core devices.");
|
||||
|
||||
AttachDevice(NULL, xtestpointer, inputInfo.pointer);
|
||||
|
||||
AttachDevice(NULL, xtestkeyboard, inputInfo.keyboard);
|
||||
}
|
||||
|
||||
/**
|
||||
* Don't allow changing the XTest property.
|
||||
*/
|
||||
static int
|
||||
DeviceSetXTestProperty(DeviceIntPtr dev, Atom property,
|
||||
XIPropertyValuePtr prop, BOOL checkonly)
|
||||
{
|
||||
if (property == XIGetKnownProperty(XI_PROP_XTEST_DEVICE))
|
||||
return BadAccess;
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a device pair that is initialised as a slave
|
||||
* device with properties that identify the devices as belonging
|
||||
* to XTest subsystem.
|
||||
* This only creates the pair, Activate/Enable Device
|
||||
* still need to be called.
|
||||
*/
|
||||
int
|
||||
AllocXTestDevice(ClientPtr client, const char *name,
|
||||
DeviceIntPtr *ptr, DeviceIntPtr *keybd,
|
||||
DeviceIntPtr master_ptr, DeviceIntPtr master_keybd)
|
||||
{
|
||||
int retval;
|
||||
char *xtestname;
|
||||
char dummy = 1;
|
||||
|
||||
if (asprintf(&xtestname, "%s XTEST", name) == -1)
|
||||
return BadAlloc;
|
||||
|
||||
retval =
|
||||
AllocDevicePair(client, xtestname, ptr, keybd, CorePointerProc,
|
||||
CoreKeyboardProc, FALSE);
|
||||
if (retval == Success) {
|
||||
(*ptr)->xtest_master_id = master_ptr->id;
|
||||
(*keybd)->xtest_master_id = master_keybd->id;
|
||||
|
||||
XIChangeDeviceProperty(*ptr, XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
|
||||
XA_INTEGER, 8, PropModeReplace, 1, &dummy,
|
||||
FALSE);
|
||||
XISetDevicePropertyDeletable(*ptr,
|
||||
XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
|
||||
FALSE);
|
||||
XIRegisterPropertyHandler(*ptr, DeviceSetXTestProperty, NULL, NULL);
|
||||
XIChangeDeviceProperty(*keybd, XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
|
||||
XA_INTEGER, 8, PropModeReplace, 1, &dummy,
|
||||
FALSE);
|
||||
XISetDevicePropertyDeletable(*keybd,
|
||||
XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
|
||||
FALSE);
|
||||
XIRegisterPropertyHandler(*keybd, DeviceSetXTestProperty, NULL, NULL);
|
||||
}
|
||||
|
||||
free(xtestname);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* If master is NULL, return TRUE if the given device is an xtest device or
|
||||
* FALSE otherwise.
|
||||
* If master is not NULL, return TRUE if the given device is this master's
|
||||
* xtest device.
|
||||
*/
|
||||
BOOL
|
||||
IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
|
||||
{
|
||||
if (IsMaster(dev))
|
||||
return FALSE;
|
||||
|
||||
/* deviceid 0 is reserved for XIAllDevices, non-zero mid means XTest
|
||||
* device */
|
||||
if (master)
|
||||
return dev->xtest_master_id == master->id;
|
||||
|
||||
return dev->xtest_master_id != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The X Test virtual device for the given master.
|
||||
*/
|
||||
DeviceIntPtr
|
||||
GetXTestDevice(DeviceIntPtr master)
|
||||
{
|
||||
DeviceIntPtr it;
|
||||
|
||||
for (it = inputInfo.devices; it; it = it->next) {
|
||||
if (IsXTestDevice(it, master))
|
||||
return it;
|
||||
}
|
||||
|
||||
/* This only happens if master is a slave device. don't do that */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
XTestExtensionTearDown(ExtensionEntry * e)
|
||||
{
|
||||
FreeEventList(xtest_evlist, GetMaximumEventsNum());
|
||||
xtest_evlist = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
XTestExtensionInit(void)
|
||||
{
|
||||
AddExtension(XTestExtensionName, 0, 0,
|
||||
ProcXTestDispatch, SProcXTestDispatch,
|
||||
XTestExtensionTearDown, StandardMinorOpcode);
|
||||
|
||||
xtest_evlist = InitEventList(GetMaximumEventsNum());
|
||||
}
|
||||
1813
xorg-server-1.18.4/Xext/xvdisp.c
Normal file
1813
xorg-server-1.18.4/Xext/xvdisp.c
Normal file
File diff suppressed because it is too large
Load Diff
2
xorg-server-1.18.4/Xext/xvdisp.h
Normal file
2
xorg-server-1.18.4/Xext/xvdisp.h
Normal file
@ -0,0 +1,2 @@
|
||||
extern void XineramifyXv(void);
|
||||
extern void XvResetProcVector(void);
|
||||
262
xorg-server-1.18.4/Xext/xvdix.h
Normal file
262
xorg-server-1.18.4/Xext/xvdix.h
Normal file
@ -0,0 +1,262 @@
|
||||
/***********************************************************
|
||||
Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
|
||||
and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Digital or MIT not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef XVDIX_H
|
||||
#define XVDIX_H
|
||||
/*
|
||||
** File:
|
||||
**
|
||||
** xvdix.h --- Xv device independent header file
|
||||
**
|
||||
** Author:
|
||||
**
|
||||
** David Carver (Digital Workstation Engineering/Project Athena)
|
||||
**
|
||||
** Revisions:
|
||||
**
|
||||
** 29.08.91 Carver
|
||||
** - removed UnrealizeWindow wrapper unrealizing windows no longer
|
||||
** preempts video
|
||||
**
|
||||
** 11.06.91 Carver
|
||||
** - changed SetPortControl to SetPortAttribute
|
||||
** - changed GetPortControl to GetPortAttribute
|
||||
** - changed QueryBestSize
|
||||
**
|
||||
** 15.05.91 Carver
|
||||
** - version 2.0 upgrade
|
||||
**
|
||||
** 24.01.91 Carver
|
||||
** - version 1.4 upgrade
|
||||
**
|
||||
*/
|
||||
|
||||
#include "scrnintstr.h"
|
||||
#include <X11/extensions/Xvproto.h>
|
||||
|
||||
extern _X_EXPORT unsigned long XvExtensionGeneration;
|
||||
extern _X_EXPORT unsigned long XvScreenGeneration;
|
||||
extern _X_EXPORT unsigned long XvResourceGeneration;
|
||||
|
||||
extern _X_EXPORT int XvReqCode;
|
||||
extern _X_EXPORT int XvEventBase;
|
||||
extern _X_EXPORT int XvErrorBase;
|
||||
|
||||
extern _X_EXPORT RESTYPE XvRTPort;
|
||||
extern _X_EXPORT RESTYPE XvRTEncoding;
|
||||
extern _X_EXPORT RESTYPE XvRTGrab;
|
||||
extern _X_EXPORT RESTYPE XvRTVideoNotify;
|
||||
extern _X_EXPORT RESTYPE XvRTVideoNotifyList;
|
||||
extern _X_EXPORT RESTYPE XvRTPortNotify;
|
||||
|
||||
typedef struct {
|
||||
int numerator;
|
||||
int denominator;
|
||||
} XvRationalRec, *XvRationalPtr;
|
||||
|
||||
typedef struct {
|
||||
char depth;
|
||||
unsigned long visual;
|
||||
} XvFormatRec, *XvFormatPtr;
|
||||
|
||||
typedef struct {
|
||||
unsigned long id;
|
||||
ClientPtr client;
|
||||
} XvGrabRec, *XvGrabPtr;
|
||||
|
||||
typedef struct _XvVideoNotifyRec {
|
||||
struct _XvVideoNotifyRec *next;
|
||||
ClientPtr client;
|
||||
unsigned long id;
|
||||
unsigned long mask;
|
||||
} XvVideoNotifyRec, *XvVideoNotifyPtr;
|
||||
|
||||
typedef struct _XvPortNotifyRec {
|
||||
struct _XvPortNotifyRec *next;
|
||||
ClientPtr client;
|
||||
unsigned long id;
|
||||
} XvPortNotifyRec, *XvPortNotifyPtr;
|
||||
|
||||
typedef struct {
|
||||
int id;
|
||||
ScreenPtr pScreen;
|
||||
char *name;
|
||||
unsigned short width, height;
|
||||
XvRationalRec rate;
|
||||
} XvEncodingRec, *XvEncodingPtr;
|
||||
|
||||
typedef struct _XvAttributeRec {
|
||||
int flags;
|
||||
int min_value;
|
||||
int max_value;
|
||||
char *name;
|
||||
} XvAttributeRec, *XvAttributePtr;
|
||||
|
||||
typedef struct {
|
||||
int id;
|
||||
int type;
|
||||
int byte_order;
|
||||
char guid[16];
|
||||
int bits_per_pixel;
|
||||
int format;
|
||||
int num_planes;
|
||||
|
||||
/* for RGB formats only */
|
||||
int depth;
|
||||
unsigned int red_mask;
|
||||
unsigned int green_mask;
|
||||
unsigned int blue_mask;
|
||||
|
||||
/* for YUV formats only */
|
||||
unsigned int y_sample_bits;
|
||||
unsigned int u_sample_bits;
|
||||
unsigned int v_sample_bits;
|
||||
unsigned int horz_y_period;
|
||||
unsigned int horz_u_period;
|
||||
unsigned int horz_v_period;
|
||||
unsigned int vert_y_period;
|
||||
unsigned int vert_u_period;
|
||||
unsigned int vert_v_period;
|
||||
char component_order[32];
|
||||
int scanline_order;
|
||||
} XvImageRec, *XvImagePtr;
|
||||
|
||||
typedef struct {
|
||||
unsigned long base_id;
|
||||
unsigned char type;
|
||||
char *name;
|
||||
int nEncodings;
|
||||
XvEncodingPtr pEncodings;
|
||||
int nFormats;
|
||||
XvFormatPtr pFormats;
|
||||
int nAttributes;
|
||||
XvAttributePtr pAttributes;
|
||||
int nImages;
|
||||
XvImagePtr pImages;
|
||||
int nPorts;
|
||||
struct _XvPortRec *pPorts;
|
||||
ScreenPtr pScreen;
|
||||
int (*ddPutVideo) (DrawablePtr, struct _XvPortRec *, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
int (*ddPutStill) (DrawablePtr, struct _XvPortRec *, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
int (*ddGetVideo) (DrawablePtr, struct _XvPortRec *, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
int (*ddGetStill) (DrawablePtr, struct _XvPortRec *, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
int (*ddStopVideo) (struct _XvPortRec *, DrawablePtr);
|
||||
int (*ddSetPortAttribute) (struct _XvPortRec *, Atom, INT32);
|
||||
int (*ddGetPortAttribute) (struct _XvPortRec *, Atom, INT32 *);
|
||||
int (*ddQueryBestSize) (struct _XvPortRec *, CARD8,
|
||||
CARD16, CARD16, CARD16, CARD16,
|
||||
unsigned int *, unsigned int *);
|
||||
int (*ddPutImage) (DrawablePtr, struct _XvPortRec *, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
XvImagePtr, unsigned char *, Bool, CARD16, CARD16);
|
||||
int (*ddQueryImageAttributes) (struct _XvPortRec *, XvImagePtr,
|
||||
CARD16 *, CARD16 *, int *, int *);
|
||||
DevUnion devPriv;
|
||||
} XvAdaptorRec, *XvAdaptorPtr;
|
||||
|
||||
typedef struct _XvPortRec {
|
||||
unsigned long id;
|
||||
XvAdaptorPtr pAdaptor;
|
||||
XvPortNotifyPtr pNotify;
|
||||
DrawablePtr pDraw;
|
||||
ClientPtr client;
|
||||
XvGrabRec grab;
|
||||
TimeStamp time;
|
||||
DevUnion devPriv;
|
||||
} XvPortRec, *XvPortPtr;
|
||||
|
||||
#define VALIDATE_XV_PORT(portID, pPort, mode)\
|
||||
{\
|
||||
int rc = dixLookupResourceByType((void **)&(pPort), portID,\
|
||||
XvRTPort, client, mode);\
|
||||
if (rc != Success)\
|
||||
return rc;\
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
int version, revision;
|
||||
int nAdaptors;
|
||||
XvAdaptorPtr pAdaptors;
|
||||
DestroyWindowProcPtr DestroyWindow;
|
||||
DestroyPixmapProcPtr DestroyPixmap;
|
||||
CloseScreenProcPtr CloseScreen;
|
||||
} XvScreenRec, *XvScreenPtr;
|
||||
|
||||
#define SCREEN_PROLOGUE(pScreen, field) ((pScreen)->field = ((XvScreenPtr) \
|
||||
dixLookupPrivate(&(pScreen)->devPrivates, XvScreenKey))->field)
|
||||
|
||||
#define SCREEN_EPILOGUE(pScreen, field, wrapper)\
|
||||
((pScreen)->field = wrapper)
|
||||
|
||||
/* Errors */
|
||||
|
||||
#define _XvBadPort (XvBadPort+XvErrorBase)
|
||||
#define _XvBadEncoding (XvBadEncoding+XvErrorBase)
|
||||
|
||||
extern _X_EXPORT int ProcXvDispatch(ClientPtr);
|
||||
extern _X_EXPORT int SProcXvDispatch(ClientPtr);
|
||||
|
||||
extern _X_EXPORT int XvScreenInit(ScreenPtr);
|
||||
extern _X_EXPORT DevPrivateKey XvGetScreenKey(void);
|
||||
extern _X_EXPORT unsigned long XvGetRTPort(void);
|
||||
extern _X_EXPORT void XvFreeAdaptor(XvAdaptorPtr pAdaptor);
|
||||
extern void _X_EXPORT XvFillColorKey(DrawablePtr pDraw, CARD32 key,
|
||||
RegionPtr region);
|
||||
extern _X_EXPORT int XvdiSendPortNotify(XvPortPtr, Atom, INT32);
|
||||
|
||||
extern _X_EXPORT int XvdiPutVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
extern _X_EXPORT int XvdiPutStill(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
extern _X_EXPORT int XvdiGetVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
extern _X_EXPORT int XvdiGetStill(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16);
|
||||
extern _X_EXPORT int XvdiPutImage(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
INT16, INT16, CARD16, CARD16,
|
||||
XvImagePtr, unsigned char *, Bool,
|
||||
CARD16, CARD16);
|
||||
extern _X_EXPORT int XvdiSelectVideoNotify(ClientPtr, DrawablePtr, BOOL);
|
||||
extern _X_EXPORT int XvdiSelectPortNotify(ClientPtr, XvPortPtr, BOOL);
|
||||
extern _X_EXPORT int XvdiSetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32);
|
||||
extern _X_EXPORT int XvdiGetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32 *);
|
||||
extern _X_EXPORT int XvdiStopVideo(ClientPtr, XvPortPtr, DrawablePtr);
|
||||
extern _X_EXPORT int XvdiMatchPort(XvPortPtr, DrawablePtr);
|
||||
extern _X_EXPORT int XvdiGrabPort(ClientPtr, XvPortPtr, Time, int *);
|
||||
extern _X_EXPORT int XvdiUngrabPort(ClientPtr, XvPortPtr, Time);
|
||||
#endif /* XVDIX_H */
|
||||
1086
xorg-server-1.18.4/Xext/xvmain.c
Normal file
1086
xorg-server-1.18.4/Xext/xvmain.c
Normal file
File diff suppressed because it is too large
Load Diff
825
xorg-server-1.18.4/Xext/xvmc.c
Normal file
825
xorg-server-1.18.4/Xext/xvmc.c
Normal file
@ -0,0 +1,825 @@
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
#include "dixstruct.h"
|
||||
#include "resource.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "extnsionst.h"
|
||||
#include "extinit.h"
|
||||
#include "servermd.h"
|
||||
#include <X11/Xfuncproto.h>
|
||||
#include "xvdix.h"
|
||||
#include <X11/extensions/XvMC.h>
|
||||
#include <X11/extensions/Xvproto.h>
|
||||
#include <X11/extensions/XvMCproto.h>
|
||||
#include "xvmcext.h"
|
||||
#include "protocol-versions.h"
|
||||
|
||||
#ifdef HAS_XVMCSHM
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/shm.h>
|
||||
#endif /* HAS_XVMCSHM */
|
||||
|
||||
#define DR_CLIENT_DRIVER_NAME_SIZE 48
|
||||
#define DR_BUSID_SIZE 48
|
||||
|
||||
static DevPrivateKeyRec XvMCScreenKeyRec;
|
||||
|
||||
#define XvMCScreenKey (&XvMCScreenKeyRec)
|
||||
static Bool XvMCInUse;
|
||||
|
||||
int XvMCReqCode;
|
||||
int XvMCEventBase;
|
||||
|
||||
static RESTYPE XvMCRTContext;
|
||||
static RESTYPE XvMCRTSurface;
|
||||
static RESTYPE XvMCRTSubpicture;
|
||||
|
||||
int (*XvMCScreenInitProc)(ScreenPtr, int, XvMCAdaptorPtr) = NULL;
|
||||
|
||||
typedef struct {
|
||||
int num_adaptors;
|
||||
XvMCAdaptorPtr adaptors;
|
||||
CloseScreenProcPtr CloseScreen;
|
||||
char clientDriverName[DR_CLIENT_DRIVER_NAME_SIZE];
|
||||
char busID[DR_BUSID_SIZE];
|
||||
int major;
|
||||
int minor;
|
||||
int patchLevel;
|
||||
} XvMCScreenRec, *XvMCScreenPtr;
|
||||
|
||||
#define XVMC_GET_PRIVATE(pScreen) \
|
||||
(XvMCScreenPtr)(dixLookupPrivate(&(pScreen)->devPrivates, XvMCScreenKey))
|
||||
|
||||
static int
|
||||
XvMCDestroyContextRes(void *data, XID id)
|
||||
{
|
||||
XvMCContextPtr pContext = (XvMCContextPtr) data;
|
||||
|
||||
pContext->refcnt--;
|
||||
|
||||
if (!pContext->refcnt) {
|
||||
XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
|
||||
|
||||
(*pScreenPriv->adaptors[pContext->adapt_num].DestroyContext) (pContext);
|
||||
free(pContext);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
XvMCDestroySurfaceRes(void *data, XID id)
|
||||
{
|
||||
XvMCSurfacePtr pSurface = (XvMCSurfacePtr) data;
|
||||
XvMCContextPtr pContext = pSurface->context;
|
||||
XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
|
||||
|
||||
(*pScreenPriv->adaptors[pContext->adapt_num].DestroySurface) (pSurface);
|
||||
free(pSurface);
|
||||
|
||||
XvMCDestroyContextRes((void *) pContext, pContext->context_id);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
XvMCDestroySubpictureRes(void *data, XID id)
|
||||
{
|
||||
XvMCSubpicturePtr pSubpict = (XvMCSubpicturePtr) data;
|
||||
XvMCContextPtr pContext = pSubpict->context;
|
||||
XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
|
||||
|
||||
(*pScreenPriv->adaptors[pContext->adapt_num].DestroySubpicture) (pSubpict);
|
||||
free(pSubpict);
|
||||
|
||||
XvMCDestroyContextRes((void *) pContext, pContext->context_id);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCQueryVersion(ClientPtr client)
|
||||
{
|
||||
xvmcQueryVersionReply rep = {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.major = SERVER_XVMC_MAJOR_VERSION,
|
||||
.minor = SERVER_XVMC_MINOR_VERSION
|
||||
};
|
||||
|
||||
/* REQUEST(xvmcQueryVersionReq); */
|
||||
REQUEST_SIZE_MATCH(xvmcQueryVersionReq);
|
||||
|
||||
WriteToClient(client, sizeof(xvmcQueryVersionReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCListSurfaceTypes(ClientPtr client)
|
||||
{
|
||||
XvPortPtr pPort;
|
||||
int i;
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
xvmcListSurfaceTypesReply rep;
|
||||
xvmcSurfaceInfo info;
|
||||
XvMCAdaptorPtr adaptor = NULL;
|
||||
XvMCSurfaceInfoPtr surface;
|
||||
int num_surfaces;
|
||||
|
||||
REQUEST(xvmcListSurfaceTypesReq);
|
||||
REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq);
|
||||
|
||||
VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
|
||||
|
||||
if (XvMCInUse) { /* any adaptors at all */
|
||||
ScreenPtr pScreen = pPort->pAdaptor->pScreen;
|
||||
|
||||
if ((pScreenPriv = XVMC_GET_PRIVATE(pScreen))) { /* any this screen */
|
||||
for (i = 0; i < pScreenPriv->num_adaptors; i++) {
|
||||
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
|
||||
adaptor = &(pScreenPriv->adaptors[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
num_surfaces = (adaptor) ? adaptor->num_surfaces : 0;
|
||||
rep = (xvmcListSurfaceTypesReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.num = num_surfaces,
|
||||
.length = bytes_to_int32(num_surfaces * sizeof(xvmcSurfaceInfo)),
|
||||
};
|
||||
|
||||
WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), &rep);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCCreateContext(ClientPtr client)
|
||||
{
|
||||
XvPortPtr pPort;
|
||||
CARD32 *data = NULL;
|
||||
int dwords = 0;
|
||||
int i, result, adapt_num = -1;
|
||||
ScreenPtr pScreen;
|
||||
XvMCContextPtr pContext;
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
XvMCAdaptorPtr adaptor = NULL;
|
||||
XvMCSurfaceInfoPtr surface = NULL;
|
||||
xvmcCreateContextReply rep;
|
||||
|
||||
REQUEST(xvmcCreateContextReq);
|
||||
REQUEST_SIZE_MATCH(xvmcCreateContextReq);
|
||||
|
||||
VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
|
||||
|
||||
pScreen = pPort->pAdaptor->pScreen;
|
||||
|
||||
if (!XvMCInUse) /* no XvMC adaptors */
|
||||
return BadMatch;
|
||||
|
||||
if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen))) /* none this screen */
|
||||
return BadMatch;
|
||||
|
||||
for (i = 0; i < pScreenPriv->num_adaptors; i++) {
|
||||
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
|
||||
adaptor = &(pScreenPriv->adaptors[i]);
|
||||
adapt_num = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (adapt_num < 0) /* none this port */
|
||||
return BadMatch;
|
||||
|
||||
for (i = 0; i < adaptor->num_surfaces; i++) {
|
||||
if (adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
|
||||
surface = adaptor->surfaces[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* adaptor doesn't support this suface_type_id */
|
||||
if (!surface)
|
||||
return BadMatch;
|
||||
|
||||
if ((stuff->width > surface->max_width) ||
|
||||
(stuff->height > surface->max_height))
|
||||
return BadValue;
|
||||
|
||||
if (!(pContext = malloc(sizeof(XvMCContextRec)))) {
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
pContext->pScreen = pScreen;
|
||||
pContext->adapt_num = adapt_num;
|
||||
pContext->context_id = stuff->context_id;
|
||||
pContext->surface_type_id = stuff->surface_type_id;
|
||||
pContext->width = stuff->width;
|
||||
pContext->height = stuff->height;
|
||||
pContext->flags = stuff->flags;
|
||||
pContext->refcnt = 1;
|
||||
|
||||
result = (*adaptor->CreateContext) (pPort, pContext, &dwords, &data);
|
||||
|
||||
if (result != Success) {
|
||||
free(pContext);
|
||||
return result;
|
||||
}
|
||||
if (!AddResource(pContext->context_id, XvMCRTContext, pContext)) {
|
||||
free(data);
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
rep = (xvmcCreateContextReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = dwords,
|
||||
.width_actual = pContext->width,
|
||||
.height_actual = pContext->height,
|
||||
.flags_return = pContext->flags
|
||||
};
|
||||
|
||||
WriteToClient(client, sizeof(xvmcCreateContextReply), &rep);
|
||||
if (dwords)
|
||||
WriteToClient(client, dwords << 2, data);
|
||||
|
||||
free(data);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCDestroyContext(ClientPtr client)
|
||||
{
|
||||
void *val;
|
||||
int rc;
|
||||
|
||||
REQUEST(xvmcDestroyContextReq);
|
||||
REQUEST_SIZE_MATCH(xvmcDestroyContextReq);
|
||||
|
||||
rc = dixLookupResourceByType(&val, stuff->context_id, XvMCRTContext,
|
||||
client, DixDestroyAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
FreeResource(stuff->context_id, RT_NONE);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCCreateSurface(ClientPtr client)
|
||||
{
|
||||
CARD32 *data = NULL;
|
||||
int dwords = 0;
|
||||
int result;
|
||||
XvMCContextPtr pContext;
|
||||
XvMCSurfacePtr pSurface;
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
xvmcCreateSurfaceReply rep;
|
||||
|
||||
REQUEST(xvmcCreateSurfaceReq);
|
||||
REQUEST_SIZE_MATCH(xvmcCreateSurfaceReq);
|
||||
|
||||
result = dixLookupResourceByType((void **) &pContext, stuff->context_id,
|
||||
XvMCRTContext, client, DixUseAccess);
|
||||
if (result != Success)
|
||||
return result;
|
||||
|
||||
pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
|
||||
|
||||
if (!(pSurface = malloc(sizeof(XvMCSurfaceRec))))
|
||||
return BadAlloc;
|
||||
|
||||
pSurface->surface_id = stuff->surface_id;
|
||||
pSurface->surface_type_id = pContext->surface_type_id;
|
||||
pSurface->context = pContext;
|
||||
|
||||
result =
|
||||
(*pScreenPriv->adaptors[pContext->adapt_num].CreateSurface) (pSurface,
|
||||
&dwords,
|
||||
&data);
|
||||
|
||||
if (result != Success) {
|
||||
free(pSurface);
|
||||
return result;
|
||||
}
|
||||
if (!AddResource(pSurface->surface_id, XvMCRTSurface, pSurface)) {
|
||||
free(data);
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
rep = (xvmcCreateSurfaceReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = dwords
|
||||
};
|
||||
|
||||
WriteToClient(client, sizeof(xvmcCreateSurfaceReply), &rep);
|
||||
if (dwords)
|
||||
WriteToClient(client, dwords << 2, data);
|
||||
|
||||
free(data);
|
||||
|
||||
pContext->refcnt++;
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCDestroySurface(ClientPtr client)
|
||||
{
|
||||
void *val;
|
||||
int rc;
|
||||
|
||||
REQUEST(xvmcDestroySurfaceReq);
|
||||
REQUEST_SIZE_MATCH(xvmcDestroySurfaceReq);
|
||||
|
||||
rc = dixLookupResourceByType(&val, stuff->surface_id, XvMCRTSurface,
|
||||
client, DixDestroyAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
FreeResource(stuff->surface_id, RT_NONE);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCCreateSubpicture(ClientPtr client)
|
||||
{
|
||||
Bool image_supported = FALSE;
|
||||
CARD32 *data = NULL;
|
||||
int i, result, dwords = 0;
|
||||
XvMCContextPtr pContext;
|
||||
XvMCSubpicturePtr pSubpicture;
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
xvmcCreateSubpictureReply rep;
|
||||
XvMCAdaptorPtr adaptor;
|
||||
XvMCSurfaceInfoPtr surface = NULL;
|
||||
|
||||
REQUEST(xvmcCreateSubpictureReq);
|
||||
REQUEST_SIZE_MATCH(xvmcCreateSubpictureReq);
|
||||
|
||||
result = dixLookupResourceByType((void **) &pContext, stuff->context_id,
|
||||
XvMCRTContext, client, DixUseAccess);
|
||||
if (result != Success)
|
||||
return result;
|
||||
|
||||
pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
|
||||
|
||||
adaptor = &(pScreenPriv->adaptors[pContext->adapt_num]);
|
||||
|
||||
/* find which surface this context supports */
|
||||
for (i = 0; i < adaptor->num_surfaces; i++) {
|
||||
if (adaptor->surfaces[i]->surface_type_id == pContext->surface_type_id) {
|
||||
surface = adaptor->surfaces[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!surface)
|
||||
return BadMatch;
|
||||
|
||||
/* make sure this surface supports that xvimage format */
|
||||
if (!surface->compatible_subpictures)
|
||||
return BadMatch;
|
||||
|
||||
for (i = 0; i < surface->compatible_subpictures->num_xvimages; i++) {
|
||||
if (surface->compatible_subpictures->xvimage_ids[i] ==
|
||||
stuff->xvimage_id) {
|
||||
image_supported = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!image_supported)
|
||||
return BadMatch;
|
||||
|
||||
/* make sure the size is OK */
|
||||
if ((stuff->width > surface->subpicture_max_width) ||
|
||||
(stuff->height > surface->subpicture_max_height))
|
||||
return BadValue;
|
||||
|
||||
if (!(pSubpicture = malloc(sizeof(XvMCSubpictureRec))))
|
||||
return BadAlloc;
|
||||
|
||||
pSubpicture->subpicture_id = stuff->subpicture_id;
|
||||
pSubpicture->xvimage_id = stuff->xvimage_id;
|
||||
pSubpicture->width = stuff->width;
|
||||
pSubpicture->height = stuff->height;
|
||||
pSubpicture->num_palette_entries = 0; /* overwritten by DDX */
|
||||
pSubpicture->entry_bytes = 0; /* overwritten by DDX */
|
||||
pSubpicture->component_order[0] = 0; /* overwritten by DDX */
|
||||
pSubpicture->component_order[1] = 0;
|
||||
pSubpicture->component_order[2] = 0;
|
||||
pSubpicture->component_order[3] = 0;
|
||||
pSubpicture->context = pContext;
|
||||
|
||||
result =
|
||||
(*pScreenPriv->adaptors[pContext->adapt_num].
|
||||
CreateSubpicture) (pSubpicture, &dwords, &data);
|
||||
|
||||
if (result != Success) {
|
||||
free(pSubpicture);
|
||||
return result;
|
||||
}
|
||||
if (!AddResource(pSubpicture->subpicture_id, XvMCRTSubpicture, pSubpicture)) {
|
||||
free(data);
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
rep = (xvmcCreateSubpictureReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = dwords,
|
||||
.width_actual = pSubpicture->width,
|
||||
.height_actual = pSubpicture->height,
|
||||
.num_palette_entries = pSubpicture->num_palette_entries,
|
||||
.entry_bytes = pSubpicture->entry_bytes,
|
||||
.component_order[0] = pSubpicture->component_order[0],
|
||||
.component_order[1] = pSubpicture->component_order[1],
|
||||
.component_order[2] = pSubpicture->component_order[2],
|
||||
.component_order[3] = pSubpicture->component_order[3]
|
||||
};
|
||||
|
||||
WriteToClient(client, sizeof(xvmcCreateSubpictureReply), &rep);
|
||||
if (dwords)
|
||||
WriteToClient(client, dwords << 2, data);
|
||||
|
||||
free(data);
|
||||
|
||||
pContext->refcnt++;
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCDestroySubpicture(ClientPtr client)
|
||||
{
|
||||
void *val;
|
||||
int rc;
|
||||
|
||||
REQUEST(xvmcDestroySubpictureReq);
|
||||
REQUEST_SIZE_MATCH(xvmcDestroySubpictureReq);
|
||||
|
||||
rc = dixLookupResourceByType(&val, stuff->subpicture_id, XvMCRTSubpicture,
|
||||
client, DixDestroyAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
FreeResource(stuff->subpicture_id, RT_NONE);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCListSubpictureTypes(ClientPtr client)
|
||||
{
|
||||
XvPortPtr pPort;
|
||||
xvmcListSubpictureTypesReply rep;
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
ScreenPtr pScreen;
|
||||
XvMCAdaptorPtr adaptor = NULL;
|
||||
XvMCSurfaceInfoPtr surface = NULL;
|
||||
xvImageFormatInfo info;
|
||||
XvImagePtr pImage;
|
||||
int i, j;
|
||||
|
||||
REQUEST(xvmcListSubpictureTypesReq);
|
||||
REQUEST_SIZE_MATCH(xvmcListSubpictureTypesReq);
|
||||
|
||||
VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
|
||||
|
||||
pScreen = pPort->pAdaptor->pScreen;
|
||||
|
||||
if (!dixPrivateKeyRegistered(XvMCScreenKey))
|
||||
return BadMatch; /* No XvMC adaptors */
|
||||
|
||||
if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
|
||||
return BadMatch; /* None this screen */
|
||||
|
||||
for (i = 0; i < pScreenPriv->num_adaptors; i++) {
|
||||
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
|
||||
adaptor = &(pScreenPriv->adaptors[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!adaptor)
|
||||
return BadMatch;
|
||||
|
||||
for (i = 0; i < adaptor->num_surfaces; i++) {
|
||||
if (adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
|
||||
surface = adaptor->surfaces[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!surface)
|
||||
return BadMatch;
|
||||
|
||||
rep = (xvmcListSubpictureTypesReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.num = 0
|
||||
};
|
||||
if (surface->compatible_subpictures)
|
||||
rep.num = surface->compatible_subpictures->num_xvimages;
|
||||
|
||||
rep.length = bytes_to_int32(rep.num * sizeof(xvImageFormatInfo));
|
||||
|
||||
WriteToClient(client, sizeof(xvmcListSubpictureTypesReply), &rep);
|
||||
|
||||
for (i = 0; i < rep.num; i++) {
|
||||
pImage = NULL;
|
||||
for (j = 0; j < adaptor->num_subpictures; j++) {
|
||||
if (surface->compatible_subpictures->xvimage_ids[i] ==
|
||||
adaptor->subpictures[j]->id) {
|
||||
pImage = adaptor->subpictures[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!pImage)
|
||||
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);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
ProcXvMCGetDRInfo(ClientPtr client)
|
||||
{
|
||||
xvmcGetDRInfoReply rep;
|
||||
XvPortPtr pPort;
|
||||
ScreenPtr pScreen;
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
|
||||
#ifdef HAS_XVMCSHM
|
||||
volatile CARD32 *patternP;
|
||||
#endif
|
||||
|
||||
REQUEST(xvmcGetDRInfoReq);
|
||||
REQUEST_SIZE_MATCH(xvmcGetDRInfoReq);
|
||||
|
||||
VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
|
||||
|
||||
pScreen = pPort->pAdaptor->pScreen;
|
||||
pScreenPriv = XVMC_GET_PRIVATE(pScreen);
|
||||
|
||||
rep = (xvmcGetDRInfoReply) {
|
||||
.type = X_Reply,
|
||||
.sequenceNumber = client->sequence,
|
||||
.major = pScreenPriv->major,
|
||||
.minor = pScreenPriv->minor,
|
||||
.patchLevel = pScreenPriv->patchLevel,
|
||||
.nameLen = bytes_to_int32(strlen(pScreenPriv->clientDriverName) + 1),
|
||||
.busIDLen = bytes_to_int32(strlen(pScreenPriv->busID) + 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
|
||||
* segment she prepared for us.
|
||||
*/
|
||||
|
||||
#ifdef HAS_XVMCSHM
|
||||
patternP = (CARD32 *) shmat(stuff->shmKey, NULL, SHM_RDONLY);
|
||||
if (-1 != (long) patternP) {
|
||||
volatile CARD32 *patternC = patternP;
|
||||
int i;
|
||||
CARD32 magic = stuff->magic;
|
||||
|
||||
rep.isLocal = 1;
|
||||
i = 1024 / sizeof(CARD32);
|
||||
|
||||
while (i--) {
|
||||
if (*patternC++ != magic) {
|
||||
rep.isLocal = 0;
|
||||
break;
|
||||
}
|
||||
magic = ~magic;
|
||||
}
|
||||
shmdt((char *) patternP);
|
||||
}
|
||||
#endif /* HAS_XVMCSHM */
|
||||
|
||||
WriteToClient(client, sizeof(xvmcGetDRInfoReply), &rep);
|
||||
if (rep.length) {
|
||||
WriteToClient(client, rep.nameLen, pScreenPriv->clientDriverName);
|
||||
WriteToClient(client, rep.busIDLen, pScreenPriv->busID);
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
int (*ProcXvMCVector[xvmcNumRequest]) (ClientPtr) = {
|
||||
ProcXvMCQueryVersion,
|
||||
ProcXvMCListSurfaceTypes,
|
||||
ProcXvMCCreateContext,
|
||||
ProcXvMCDestroyContext,
|
||||
ProcXvMCCreateSurface,
|
||||
ProcXvMCDestroySurface,
|
||||
ProcXvMCCreateSubpicture,
|
||||
ProcXvMCDestroySubpicture,
|
||||
ProcXvMCListSubpictureTypes, ProcXvMCGetDRInfo};
|
||||
|
||||
static int
|
||||
ProcXvMCDispatch(ClientPtr client)
|
||||
{
|
||||
REQUEST(xReq);
|
||||
|
||||
if (stuff->data < xvmcNumRequest)
|
||||
return (*ProcXvMCVector[stuff->data]) (client);
|
||||
else
|
||||
return BadRequest;
|
||||
}
|
||||
|
||||
static int
|
||||
SProcXvMCDispatch(ClientPtr client)
|
||||
{
|
||||
/* We only support local */
|
||||
return BadImplementation;
|
||||
}
|
||||
|
||||
void
|
||||
XvMCExtensionInit(void)
|
||||
{
|
||||
ExtensionEntry *extEntry;
|
||||
|
||||
if (!dixPrivateKeyRegistered(XvMCScreenKey))
|
||||
return;
|
||||
|
||||
if (!(XvMCRTContext = CreateNewResourceType(XvMCDestroyContextRes,
|
||||
"XvMCRTContext")))
|
||||
return;
|
||||
|
||||
if (!(XvMCRTSurface = CreateNewResourceType(XvMCDestroySurfaceRes,
|
||||
"XvMCRTSurface")))
|
||||
return;
|
||||
|
||||
if (!(XvMCRTSubpicture = CreateNewResourceType(XvMCDestroySubpictureRes,
|
||||
"XvMCRTSubpicture")))
|
||||
return;
|
||||
|
||||
extEntry = AddExtension(XvMCName, XvMCNumEvents, XvMCNumErrors,
|
||||
ProcXvMCDispatch, SProcXvMCDispatch,
|
||||
NULL, StandardMinorOpcode);
|
||||
|
||||
if (!extEntry)
|
||||
return;
|
||||
|
||||
XvMCReqCode = extEntry->base;
|
||||
XvMCEventBase = extEntry->eventBase;
|
||||
SetResourceTypeErrorValue(XvMCRTContext,
|
||||
extEntry->errorBase + XvMCBadContext);
|
||||
SetResourceTypeErrorValue(XvMCRTSurface,
|
||||
extEntry->errorBase + XvMCBadSurface);
|
||||
SetResourceTypeErrorValue(XvMCRTSubpicture,
|
||||
extEntry->errorBase + XvMCBadSubpicture);
|
||||
}
|
||||
|
||||
static Bool
|
||||
XvMCCloseScreen(ScreenPtr pScreen)
|
||||
{
|
||||
XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen);
|
||||
|
||||
pScreen->CloseScreen = pScreenPriv->CloseScreen;
|
||||
|
||||
free(pScreenPriv);
|
||||
|
||||
return (*pScreen->CloseScreen) (pScreen);
|
||||
}
|
||||
|
||||
int
|
||||
XvMCScreenInit(ScreenPtr pScreen, int num, XvMCAdaptorPtr pAdapt)
|
||||
{
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
|
||||
if (!dixRegisterPrivateKey(&XvMCScreenKeyRec, PRIVATE_SCREEN, 0))
|
||||
return BadAlloc;
|
||||
|
||||
if (!(pScreenPriv = malloc(sizeof(XvMCScreenRec))))
|
||||
return BadAlloc;
|
||||
|
||||
dixSetPrivate(&pScreen->devPrivates, XvMCScreenKey, pScreenPriv);
|
||||
|
||||
pScreenPriv->CloseScreen = pScreen->CloseScreen;
|
||||
pScreen->CloseScreen = XvMCCloseScreen;
|
||||
|
||||
pScreenPriv->num_adaptors = num;
|
||||
pScreenPriv->adaptors = pAdapt;
|
||||
pScreenPriv->clientDriverName[0] = 0;
|
||||
pScreenPriv->busID[0] = 0;
|
||||
pScreenPriv->major = 0;
|
||||
pScreenPriv->minor = 0;
|
||||
pScreenPriv->patchLevel = 0;
|
||||
|
||||
XvMCInUse = TRUE;
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
XvImagePtr
|
||||
XvMCFindXvImage(XvPortPtr pPort, CARD32 id)
|
||||
{
|
||||
XvImagePtr pImage = NULL;
|
||||
ScreenPtr pScreen = pPort->pAdaptor->pScreen;
|
||||
XvMCScreenPtr pScreenPriv;
|
||||
XvMCAdaptorPtr adaptor = NULL;
|
||||
int i;
|
||||
|
||||
if (!dixPrivateKeyRegistered(XvMCScreenKey))
|
||||
return NULL;
|
||||
|
||||
if (!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < pScreenPriv->num_adaptors; i++) {
|
||||
if (pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
|
||||
adaptor = &(pScreenPriv->adaptors[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!adaptor)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < adaptor->num_subpictures; i++) {
|
||||
if (adaptor->subpictures[i]->id == id) {
|
||||
pImage = adaptor->subpictures[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return pImage;
|
||||
}
|
||||
|
||||
int
|
||||
xf86XvMCRegisterDRInfo(ScreenPtr pScreen, const char *name,
|
||||
const char *busID, int major, int minor, int patchLevel)
|
||||
{
|
||||
XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen);
|
||||
|
||||
strlcpy(pScreenPriv->clientDriverName, name, DR_CLIENT_DRIVER_NAME_SIZE);
|
||||
strlcpy(pScreenPriv->busID, busID, DR_BUSID_SIZE);
|
||||
pScreenPriv->major = major;
|
||||
pScreenPriv->minor = minor;
|
||||
pScreenPriv->patchLevel = patchLevel;
|
||||
return Success;
|
||||
}
|
||||
98
xorg-server-1.18.4/Xext/xvmcext.h
Normal file
98
xorg-server-1.18.4/Xext/xvmcext.h
Normal file
@ -0,0 +1,98 @@
|
||||
|
||||
#ifndef _XVMC_H
|
||||
#define _XVMC_H
|
||||
#include <X11/extensions/Xv.h>
|
||||
#include "xvdix.h"
|
||||
|
||||
typedef struct {
|
||||
int num_xvimages;
|
||||
int *xvimage_ids;
|
||||
} XvMCImageIDList;
|
||||
|
||||
typedef struct {
|
||||
int surface_type_id;
|
||||
int chroma_format;
|
||||
int color_description;
|
||||
unsigned short max_width;
|
||||
unsigned short max_height;
|
||||
unsigned short subpicture_max_width;
|
||||
unsigned short subpicture_max_height;
|
||||
int mc_type;
|
||||
int flags;
|
||||
XvMCImageIDList *compatible_subpictures;
|
||||
} XvMCSurfaceInfoRec, *XvMCSurfaceInfoPtr;
|
||||
|
||||
typedef struct {
|
||||
XID context_id;
|
||||
ScreenPtr pScreen;
|
||||
int adapt_num;
|
||||
int surface_type_id;
|
||||
unsigned short width;
|
||||
unsigned short height;
|
||||
CARD32 flags;
|
||||
int refcnt;
|
||||
void *port_priv;
|
||||
void *driver_priv;
|
||||
} XvMCContextRec, *XvMCContextPtr;
|
||||
|
||||
typedef struct {
|
||||
XID surface_id;
|
||||
int surface_type_id;
|
||||
XvMCContextPtr context;
|
||||
void *driver_priv;
|
||||
} XvMCSurfaceRec, *XvMCSurfacePtr;
|
||||
|
||||
typedef struct {
|
||||
XID subpicture_id;
|
||||
int xvimage_id;
|
||||
unsigned short width;
|
||||
unsigned short height;
|
||||
int num_palette_entries;
|
||||
int entry_bytes;
|
||||
char component_order[4];
|
||||
XvMCContextPtr context;
|
||||
void *driver_priv;
|
||||
} XvMCSubpictureRec, *XvMCSubpicturePtr;
|
||||
|
||||
typedef int (*XvMCCreateContextProcPtr) (XvPortPtr port,
|
||||
XvMCContextPtr context,
|
||||
int *num_priv, CARD32 **priv);
|
||||
|
||||
typedef void (*XvMCDestroyContextProcPtr) (XvMCContextPtr context);
|
||||
|
||||
typedef int (*XvMCCreateSurfaceProcPtr) (XvMCSurfacePtr surface,
|
||||
int *num_priv, CARD32 **priv);
|
||||
|
||||
typedef void (*XvMCDestroySurfaceProcPtr) (XvMCSurfacePtr surface);
|
||||
|
||||
typedef int (*XvMCCreateSubpictureProcPtr) (XvMCSubpicturePtr subpicture,
|
||||
int *num_priv, CARD32 **priv);
|
||||
|
||||
typedef void (*XvMCDestroySubpictureProcPtr) (XvMCSubpicturePtr subpicture);
|
||||
|
||||
typedef struct {
|
||||
XvAdaptorPtr xv_adaptor;
|
||||
int num_surfaces;
|
||||
XvMCSurfaceInfoPtr *surfaces;
|
||||
int num_subpictures;
|
||||
XvImagePtr *subpictures;
|
||||
XvMCCreateContextProcPtr CreateContext;
|
||||
XvMCDestroyContextProcPtr DestroyContext;
|
||||
XvMCCreateSurfaceProcPtr CreateSurface;
|
||||
XvMCDestroySurfaceProcPtr DestroySurface;
|
||||
XvMCCreateSubpictureProcPtr CreateSubpicture;
|
||||
XvMCDestroySubpictureProcPtr DestroySubpicture;
|
||||
} XvMCAdaptorRec, *XvMCAdaptorPtr;
|
||||
|
||||
extern int (*XvMCScreenInitProc)(ScreenPtr, int, XvMCAdaptorPtr);
|
||||
|
||||
extern _X_EXPORT int XvMCScreenInit(ScreenPtr pScreen,
|
||||
int num, XvMCAdaptorPtr adapt);
|
||||
|
||||
extern _X_EXPORT XvImagePtr XvMCFindXvImage(XvPortPtr pPort, CARD32 id);
|
||||
|
||||
extern _X_EXPORT int xf86XvMCRegisterDRInfo(ScreenPtr pScreen, const char *name,
|
||||
const char *busID, int major, int minor,
|
||||
int patchLevel);
|
||||
|
||||
#endif /* _XVMC_H */
|
||||
111
xorg-server-1.18.4/Xi/Makefile.am
Normal file
111
xorg-server-1.18.4/Xi/Makefile.am
Normal file
@ -0,0 +1,111 @@
|
||||
noinst_LTLIBRARIES = libXi.la libXistubs.la
|
||||
|
||||
AM_CFLAGS = $(DIX_CFLAGS)
|
||||
|
||||
libXi_la_SOURCES = \
|
||||
allowev.c \
|
||||
allowev.h \
|
||||
chgdctl.c \
|
||||
chgdctl.h \
|
||||
chgfctl.c \
|
||||
chgfctl.h \
|
||||
chgkbd.c \
|
||||
chgkbd.h \
|
||||
chgkmap.c \
|
||||
chgkmap.h \
|
||||
chgprop.c \
|
||||
chgprop.h \
|
||||
chgptr.c \
|
||||
chgptr.h \
|
||||
closedev.c \
|
||||
closedev.h \
|
||||
devbell.c \
|
||||
devbell.h \
|
||||
exevents.c \
|
||||
exglobals.h \
|
||||
extinit.c \
|
||||
getbmap.c \
|
||||
getbmap.h \
|
||||
getdctl.c \
|
||||
getdctl.h \
|
||||
getfctl.c \
|
||||
getfctl.h \
|
||||
getfocus.c \
|
||||
getfocus.h \
|
||||
getkmap.c \
|
||||
getkmap.h \
|
||||
getmmap.c \
|
||||
getmmap.h \
|
||||
getprop.c \
|
||||
getprop.h \
|
||||
getselev.c \
|
||||
getselev.h \
|
||||
getvers.c \
|
||||
getvers.h \
|
||||
grabdev.c \
|
||||
grabdev.h \
|
||||
grabdevb.c \
|
||||
grabdevb.h \
|
||||
grabdevk.c \
|
||||
grabdevk.h \
|
||||
gtmotion.c \
|
||||
gtmotion.h \
|
||||
listdev.c \
|
||||
listdev.h \
|
||||
opendev.c \
|
||||
opendev.h \
|
||||
queryst.c \
|
||||
queryst.h \
|
||||
selectev.c \
|
||||
selectev.h \
|
||||
sendexev.c \
|
||||
sendexev.h \
|
||||
setbmap.c \
|
||||
setbmap.h \
|
||||
setdval.c \
|
||||
setdval.h \
|
||||
setfocus.c \
|
||||
setfocus.h \
|
||||
setmmap.c \
|
||||
setmmap.h \
|
||||
setmode.c \
|
||||
setmode.h \
|
||||
ungrdev.c \
|
||||
ungrdev.h \
|
||||
ungrdevb.c \
|
||||
ungrdevb.h \
|
||||
ungrdevk.c \
|
||||
ungrdevk.h \
|
||||
xiallowev.c \
|
||||
xiallowev.h \
|
||||
xibarriers.c \
|
||||
xibarriers.h \
|
||||
xichangecursor.c \
|
||||
xichangecursor.h \
|
||||
xichangehierarchy.c \
|
||||
xichangehierarchy.h \
|
||||
xigetclientpointer.c \
|
||||
xigetclientpointer.h \
|
||||
xigrabdev.c \
|
||||
xigrabdev.h \
|
||||
xipassivegrab.h \
|
||||
xipassivegrab.c \
|
||||
xiproperty.c \
|
||||
xiproperty.h \
|
||||
xiquerydevice.c \
|
||||
xiquerydevice.h \
|
||||
xiquerypointer.c \
|
||||
xiquerypointer.h \
|
||||
xiqueryversion.c \
|
||||
xiqueryversion.h \
|
||||
xiselectev.c \
|
||||
xiselectev.h \
|
||||
xisetclientpointer.c \
|
||||
xisetclientpointer.h \
|
||||
xisetdevfocus.c \
|
||||
xisetdevfocus.h \
|
||||
xiwarppointer.c \
|
||||
xiwarppointer.h
|
||||
|
||||
libXistubs_la_SOURCES = \
|
||||
stubs.c
|
||||
998
xorg-server-1.18.4/Xi/Makefile.in
Normal file
998
xorg-server-1.18.4/Xi/Makefile.in
Normal file
@ -0,0 +1,998 @@
|
||||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = Xi
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ac_define_dir.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/include/do-not-use-config.h \
|
||||
$(top_builddir)/include/xorg-server.h \
|
||||
$(top_builddir)/include/dix-config.h \
|
||||
$(top_builddir)/include/xorg-config.h \
|
||||
$(top_builddir)/include/xkb-config.h \
|
||||
$(top_builddir)/include/xwin-config.h \
|
||||
$(top_builddir)/include/kdrive-config.h \
|
||||
$(top_builddir)/include/version-config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||
libXi_la_LIBADD =
|
||||
am_libXi_la_OBJECTS = allowev.lo chgdctl.lo chgfctl.lo chgkbd.lo \
|
||||
chgkmap.lo chgprop.lo chgptr.lo closedev.lo devbell.lo \
|
||||
exevents.lo extinit.lo getbmap.lo getdctl.lo getfctl.lo \
|
||||
getfocus.lo getkmap.lo getmmap.lo getprop.lo getselev.lo \
|
||||
getvers.lo grabdev.lo grabdevb.lo grabdevk.lo gtmotion.lo \
|
||||
listdev.lo opendev.lo queryst.lo selectev.lo sendexev.lo \
|
||||
setbmap.lo setdval.lo setfocus.lo setmmap.lo setmode.lo \
|
||||
ungrdev.lo ungrdevb.lo ungrdevk.lo xiallowev.lo xibarriers.lo \
|
||||
xichangecursor.lo xichangehierarchy.lo xigetclientpointer.lo \
|
||||
xigrabdev.lo xipassivegrab.lo xiproperty.lo xiquerydevice.lo \
|
||||
xiquerypointer.lo xiqueryversion.lo xiselectev.lo \
|
||||
xisetclientpointer.lo xisetdevfocus.lo xiwarppointer.lo
|
||||
libXi_la_OBJECTS = $(am_libXi_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
libXistubs_la_LIBADD =
|
||||
am_libXistubs_la_OBJECTS = stubs.lo
|
||||
libXistubs_la_OBJECTS = $(am_libXistubs_la_OBJECTS)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
|
||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CFLAGS) $(CFLAGS)
|
||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||
am__v_CC_0 = @echo " CC " $@;
|
||||
am__v_CC_1 =
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = $(libXi_la_SOURCES) $(libXistubs_la_SOURCES)
|
||||
DIST_SOURCES = $(libXi_la_SOURCES) $(libXistubs_la_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
ADMIN_MAN_DIR = @ADMIN_MAN_DIR@
|
||||
ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
APPLE_APPLICATIONS_DIR = @APPLE_APPLICATIONS_DIR@
|
||||
APPLE_APPLICATION_NAME = @APPLE_APPLICATION_NAME@
|
||||
APP_MAN_DIR = @APP_MAN_DIR@
|
||||
APP_MAN_SUFFIX = @APP_MAN_SUFFIX@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
BASE_CFLAGS = @BASE_CFLAGS@
|
||||
BASE_FONT_PATH = @BASE_FONT_PATH@
|
||||
BUILD_DATE = @BUILD_DATE@
|
||||
BUILD_TIME = @BUILD_TIME@
|
||||
BUNDLE_ID_PREFIX = @BUNDLE_ID_PREFIX@
|
||||
BUNDLE_VERSION = @BUNDLE_VERSION@
|
||||
BUNDLE_VERSION_STRING = @BUNDLE_VERSION_STRING@
|
||||
CC = @CC@
|
||||
CCAS = @CCAS@
|
||||
CCASDEPMODE = @CCASDEPMODE@
|
||||
CCASFLAGS = @CCASFLAGS@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CHANGELOG_CMD = @CHANGELOG_CMD@
|
||||
COMPILEDDEFAULTFONTPATH = @COMPILEDDEFAULTFONTPATH@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CWARNFLAGS = @CWARNFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DBUS_CFLAGS = @DBUS_CFLAGS@
|
||||
DBUS_LIBS = @DBUS_LIBS@
|
||||
DEFAULT_LIBRARY_PATH = @DEFAULT_LIBRARY_PATH@
|
||||
DEFAULT_LOGDIR = @DEFAULT_LOGDIR@
|
||||
DEFAULT_LOGPREFIX = @DEFAULT_LOGPREFIX@
|
||||
DEFAULT_MODULE_PATH = @DEFAULT_MODULE_PATH@
|
||||
DEFAULT_XDG_DATA_HOME = @DEFAULT_XDG_DATA_HOME@
|
||||
DEFAULT_XDG_DATA_HOME_LOGDIR = @DEFAULT_XDG_DATA_HOME_LOGDIR@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DGA_CFLAGS = @DGA_CFLAGS@
|
||||
DGA_LIBS = @DGA_LIBS@
|
||||
DIX_CFLAGS = @DIX_CFLAGS@
|
||||
DIX_LIB = @DIX_LIB@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DLOPEN_LIBS = @DLOPEN_LIBS@
|
||||
DMXEXAMPLES_DEP_CFLAGS = @DMXEXAMPLES_DEP_CFLAGS@
|
||||
DMXEXAMPLES_DEP_LIBS = @DMXEXAMPLES_DEP_LIBS@
|
||||
DMXMODULES_CFLAGS = @DMXMODULES_CFLAGS@
|
||||
DMXMODULES_LIBS = @DMXMODULES_LIBS@
|
||||
DMXXIEXAMPLES_DEP_CFLAGS = @DMXXIEXAMPLES_DEP_CFLAGS@
|
||||
DMXXIEXAMPLES_DEP_LIBS = @DMXXIEXAMPLES_DEP_LIBS@
|
||||
DMXXMUEXAMPLES_DEP_CFLAGS = @DMXXMUEXAMPLES_DEP_CFLAGS@
|
||||
DMXXMUEXAMPLES_DEP_LIBS = @DMXXMUEXAMPLES_DEP_LIBS@
|
||||
DOT = @DOT@
|
||||
DOXYGEN = @DOXYGEN@
|
||||
DRI2PROTO_CFLAGS = @DRI2PROTO_CFLAGS@
|
||||
DRI2PROTO_LIBS = @DRI2PROTO_LIBS@
|
||||
DRI3PROTO_CFLAGS = @DRI3PROTO_CFLAGS@
|
||||
DRI3PROTO_LIBS = @DRI3PROTO_LIBS@
|
||||
DRIVER_MAN_DIR = @DRIVER_MAN_DIR@
|
||||
DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@
|
||||
DRI_DRIVER_PATH = @DRI_DRIVER_PATH@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DTRACE = @DTRACE@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
FILE_MAN_DIR = @FILE_MAN_DIR@
|
||||
FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@
|
||||
FONT100DPIDIR = @FONT100DPIDIR@
|
||||
FONT75DPIDIR = @FONT75DPIDIR@
|
||||
FONTMISCDIR = @FONTMISCDIR@
|
||||
FONTOTFDIR = @FONTOTFDIR@
|
||||
FONTROOTDIR = @FONTROOTDIR@
|
||||
FONTTTFDIR = @FONTTTFDIR@
|
||||
FONTTYPE1DIR = @FONTTYPE1DIR@
|
||||
FOP = @FOP@
|
||||
GBM_CFLAGS = @GBM_CFLAGS@
|
||||
GBM_LIBS = @GBM_LIBS@
|
||||
GLAMOR_CFLAGS = @GLAMOR_CFLAGS@
|
||||
GLAMOR_LIBS = @GLAMOR_LIBS@
|
||||
GLX_ARCH_DEFINES = @GLX_ARCH_DEFINES@
|
||||
GLX_DEFINES = @GLX_DEFINES@
|
||||
GLX_SYS_LIBS = @GLX_SYS_LIBS@
|
||||
GL_CFLAGS = @GL_CFLAGS@
|
||||
GL_LIBS = @GL_LIBS@
|
||||
GREP = @GREP@
|
||||
HAL_CFLAGS = @HAL_CFLAGS@
|
||||
HAL_LIBS = @HAL_LIBS@
|
||||
HAVE_DOT = @HAVE_DOT@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_CMD = @INSTALL_CMD@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
KDRIVE_CFLAGS = @KDRIVE_CFLAGS@
|
||||
KDRIVE_INCS = @KDRIVE_INCS@
|
||||
KDRIVE_LIBS = @KDRIVE_LIBS@
|
||||
KDRIVE_LOCAL_LIBS = @KDRIVE_LOCAL_LIBS@
|
||||
KDRIVE_MAIN_LIB = @KDRIVE_MAIN_LIB@
|
||||
KDRIVE_PURE_INCS = @KDRIVE_PURE_INCS@
|
||||
KDRIVE_PURE_LIBS = @KDRIVE_PURE_LIBS@
|
||||
KHRONOS_OPENGL_REGISTRY_CFLAGS = @KHRONOS_OPENGL_REGISTRY_CFLAGS@
|
||||
KHRONOS_OPENGL_REGISTRY_LIBS = @KHRONOS_OPENGL_REGISTRY_LIBS@
|
||||
KHRONOS_SPEC_DIR = @KHRONOS_SPEC_DIR@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LD_EXPORT_SYMBOLS_FLAG = @LD_EXPORT_SYMBOLS_FLAG@
|
||||
LD_NO_UNDEFINED_FLAG = @LD_NO_UNDEFINED_FLAG@
|
||||
LEX = @LEX@
|
||||
LEXLIB = @LEXLIB@
|
||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||
LIBDRM_CFLAGS = @LIBDRM_CFLAGS@
|
||||
LIBDRM_LIBS = @LIBDRM_LIBS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBSHA1_CFLAGS = @LIBSHA1_CFLAGS@
|
||||
LIBSHA1_LIBS = @LIBSHA1_LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@
|
||||
LIBUNWIND_LIBS = @LIBUNWIND_LIBS@
|
||||
LIB_MAN_DIR = @LIB_MAN_DIR@
|
||||
LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAIN_LIB = @MAIN_LIB@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MAN_SUBSTS = @MAN_SUBSTS@
|
||||
MISC_MAN_DIR = @MISC_MAN_DIR@
|
||||
MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJC = @OBJC@
|
||||
OBJCCLD = @OBJCCLD@
|
||||
OBJCDEPMODE = @OBJCDEPMODE@
|
||||
OBJCFLAGS = @OBJCFLAGS@
|
||||
OBJCLINK = @OBJCLINK@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
|
||||
OPENSSL_LIBS = @OPENSSL_LIBS@
|
||||
OS_LIB = @OS_LIB@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@
|
||||
PCIACCESS_LIBS = @PCIACCESS_LIBS@
|
||||
PCI_TXT_IDS_PATH = @PCI_TXT_IDS_PATH@
|
||||
PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
|
||||
PIXMAN_LIBS = @PIXMAN_LIBS@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
PROJECTROOT = @PROJECTROOT@
|
||||
PYTHON3 = @PYTHON3@
|
||||
RANLIB = @RANLIB@
|
||||
RAWCPP = @RAWCPP@
|
||||
RAWCPPFLAGS = @RAWCPPFLAGS@
|
||||
RELEASE_DATE = @RELEASE_DATE@
|
||||
SDK_REQUIRED_MODULES = @SDK_REQUIRED_MODULES@
|
||||
SED = @SED@
|
||||
SELINUX_CFLAGS = @SELINUX_CFLAGS@
|
||||
SELINUX_LIBS = @SELINUX_LIBS@
|
||||
SERVER_MISC_CONFIG_PATH = @SERVER_MISC_CONFIG_PATH@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHA1_CFLAGS = @SHA1_CFLAGS@
|
||||
SHA1_LIBS = @SHA1_LIBS@
|
||||
SHELL = @SHELL@
|
||||
SOLARIS_INOUT_ARCH = @SOLARIS_INOUT_ARCH@
|
||||
STRICT_CFLAGS = @STRICT_CFLAGS@
|
||||
STRIP = @STRIP@
|
||||
STYLESHEET_SRCDIR = @STYLESHEET_SRCDIR@
|
||||
SUID_WRAPPER_DIR = @SUID_WRAPPER_DIR@
|
||||
SYSCONFDIR = @SYSCONFDIR@
|
||||
SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@
|
||||
SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@
|
||||
TRADITIONALCPPFLAGS = @TRADITIONALCPPFLAGS@
|
||||
TSLIB_CFLAGS = @TSLIB_CFLAGS@
|
||||
TSLIB_LIBS = @TSLIB_LIBS@
|
||||
UDEV_CFLAGS = @UDEV_CFLAGS@
|
||||
UDEV_LIBS = @UDEV_LIBS@
|
||||
UTILS_SYS_LIBS = @UTILS_SYS_LIBS@
|
||||
VENDOR_NAME_SHORT = @VENDOR_NAME_SHORT@
|
||||
VERSION = @VERSION@
|
||||
WAYLAND_SCANNER = @WAYLAND_SCANNER@
|
||||
WINDOWSWM_CFLAGS = @WINDOWSWM_CFLAGS@
|
||||
WINDOWSWM_LIBS = @WINDOWSWM_LIBS@
|
||||
WINDRES = @WINDRES@
|
||||
X11EXAMPLES_DEP_CFLAGS = @X11EXAMPLES_DEP_CFLAGS@
|
||||
X11EXAMPLES_DEP_LIBS = @X11EXAMPLES_DEP_LIBS@
|
||||
XDMCP_CFLAGS = @XDMCP_CFLAGS@
|
||||
XDMCP_LIBS = @XDMCP_LIBS@
|
||||
XDMXCONFIG_DEP_CFLAGS = @XDMXCONFIG_DEP_CFLAGS@
|
||||
XDMXCONFIG_DEP_LIBS = @XDMXCONFIG_DEP_LIBS@
|
||||
XDMX_CFLAGS = @XDMX_CFLAGS@
|
||||
XDMX_LIBS = @XDMX_LIBS@
|
||||
XDMX_SYS_LIBS = @XDMX_SYS_LIBS@
|
||||
XEPHYR_CFLAGS = @XEPHYR_CFLAGS@
|
||||
XEPHYR_INCS = @XEPHYR_INCS@
|
||||
XEPHYR_LIBS = @XEPHYR_LIBS@
|
||||
XF86CONFIGDIR = @XF86CONFIGDIR@
|
||||
XF86CONFIGFILE = @XF86CONFIGFILE@
|
||||
XKB_BASE_DIRECTORY = @XKB_BASE_DIRECTORY@
|
||||
XKB_BIN_DIRECTORY = @XKB_BIN_DIRECTORY@
|
||||
XKB_COMPILED_DIR = @XKB_COMPILED_DIR@
|
||||
XKB_DFLT_LAYOUT = @XKB_DFLT_LAYOUT@
|
||||
XKB_DFLT_MODEL = @XKB_DFLT_MODEL@
|
||||
XKB_DFLT_OPTIONS = @XKB_DFLT_OPTIONS@
|
||||
XKB_DFLT_RULES = @XKB_DFLT_RULES@
|
||||
XKB_DFLT_VARIANT = @XKB_DFLT_VARIANT@
|
||||
XKM_OUTPUT_DIR = @XKM_OUTPUT_DIR@
|
||||
XLIB_CFLAGS = @XLIB_CFLAGS@
|
||||
XLIB_LIBS = @XLIB_LIBS@
|
||||
XMLTO = @XMLTO@
|
||||
XNESTMODULES_CFLAGS = @XNESTMODULES_CFLAGS@
|
||||
XNESTMODULES_LIBS = @XNESTMODULES_LIBS@
|
||||
XNEST_LIBS = @XNEST_LIBS@
|
||||
XNEST_SYS_LIBS = @XNEST_SYS_LIBS@
|
||||
XORG_CFLAGS = @XORG_CFLAGS@
|
||||
XORG_DRIVER_LIBS = @XORG_DRIVER_LIBS@
|
||||
XORG_INCS = @XORG_INCS@
|
||||
XORG_LIBS = @XORG_LIBS@
|
||||
XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@
|
||||
XORG_MAN_PAGE = @XORG_MAN_PAGE@
|
||||
XORG_MODULES_CFLAGS = @XORG_MODULES_CFLAGS@
|
||||
XORG_MODULES_LIBS = @XORG_MODULES_LIBS@
|
||||
XORG_OS_SUBDIR = @XORG_OS_SUBDIR@
|
||||
XORG_SGML_PATH = @XORG_SGML_PATH@
|
||||
XORG_SYS_LIBS = @XORG_SYS_LIBS@
|
||||
XPBPROXY_CFLAGS = @XPBPROXY_CFLAGS@
|
||||
XPBPROXY_LIBS = @XPBPROXY_LIBS@
|
||||
XQUARTZ_LIBS = @XQUARTZ_LIBS@
|
||||
XQUARTZ_SPARKLE = @XQUARTZ_SPARKLE@
|
||||
XQUARTZ_SPARKLE_FEED_URL = @XQUARTZ_SPARKLE_FEED_URL@
|
||||
XRESEXAMPLES_DEP_CFLAGS = @XRESEXAMPLES_DEP_CFLAGS@
|
||||
XRESEXAMPLES_DEP_LIBS = @XRESEXAMPLES_DEP_LIBS@
|
||||
XSERVERCFLAGS_CFLAGS = @XSERVERCFLAGS_CFLAGS@
|
||||
XSERVERCFLAGS_LIBS = @XSERVERCFLAGS_LIBS@
|
||||
XSERVERLIBS_CFLAGS = @XSERVERLIBS_CFLAGS@
|
||||
XSERVERLIBS_LIBS = @XSERVERLIBS_LIBS@
|
||||
XSERVER_LIBS = @XSERVER_LIBS@
|
||||
XSERVER_SYS_LIBS = @XSERVER_SYS_LIBS@
|
||||
XSHMFENCE_CFLAGS = @XSHMFENCE_CFLAGS@
|
||||
XSHMFENCE_LIBS = @XSHMFENCE_LIBS@
|
||||
XSLTPROC = @XSLTPROC@
|
||||
XSL_STYLESHEET = @XSL_STYLESHEET@
|
||||
XTSTEXAMPLES_DEP_CFLAGS = @XTSTEXAMPLES_DEP_CFLAGS@
|
||||
XTSTEXAMPLES_DEP_LIBS = @XTSTEXAMPLES_DEP_LIBS@
|
||||
XVFB_LIBS = @XVFB_LIBS@
|
||||
XVFB_SYS_LIBS = @XVFB_SYS_LIBS@
|
||||
XWAYLANDMODULES_CFLAGS = @XWAYLANDMODULES_CFLAGS@
|
||||
XWAYLANDMODULES_LIBS = @XWAYLANDMODULES_LIBS@
|
||||
XWAYLAND_LIBS = @XWAYLAND_LIBS@
|
||||
XWAYLAND_SYS_LIBS = @XWAYLAND_SYS_LIBS@
|
||||
XWINMODULES_CFLAGS = @XWINMODULES_CFLAGS@
|
||||
XWINMODULES_LIBS = @XWINMODULES_LIBS@
|
||||
XWIN_LIBS = @XWIN_LIBS@
|
||||
XWIN_SERVER_NAME = @XWIN_SERVER_NAME@
|
||||
XWIN_SYS_LIBS = @XWIN_SYS_LIBS@
|
||||
YACC = @YACC@
|
||||
YFLAGS = @YFLAGS@
|
||||
__XCONFIGDIR__ = @__XCONFIGDIR__@
|
||||
__XCONFIGFILE__ = @__XCONFIGFILE__@
|
||||
abi_ansic = @abi_ansic@
|
||||
abi_extension = @abi_extension@
|
||||
abi_videodrv = @abi_videodrv@
|
||||
abi_xinput = @abi_xinput@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
driverdir = @driverdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
extdir = @extdir@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
logdir = @logdir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
moduledir = @moduledir@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sdkdir = @sdkdir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
symbol_visibility = @symbol_visibility@
|
||||
sysconfdir = @sysconfdir@
|
||||
sysconfigdir = @sysconfigdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
noinst_LTLIBRARIES = libXi.la libXistubs.la
|
||||
AM_CFLAGS = $(DIX_CFLAGS)
|
||||
libXi_la_SOURCES = \
|
||||
allowev.c \
|
||||
allowev.h \
|
||||
chgdctl.c \
|
||||
chgdctl.h \
|
||||
chgfctl.c \
|
||||
chgfctl.h \
|
||||
chgkbd.c \
|
||||
chgkbd.h \
|
||||
chgkmap.c \
|
||||
chgkmap.h \
|
||||
chgprop.c \
|
||||
chgprop.h \
|
||||
chgptr.c \
|
||||
chgptr.h \
|
||||
closedev.c \
|
||||
closedev.h \
|
||||
devbell.c \
|
||||
devbell.h \
|
||||
exevents.c \
|
||||
exglobals.h \
|
||||
extinit.c \
|
||||
getbmap.c \
|
||||
getbmap.h \
|
||||
getdctl.c \
|
||||
getdctl.h \
|
||||
getfctl.c \
|
||||
getfctl.h \
|
||||
getfocus.c \
|
||||
getfocus.h \
|
||||
getkmap.c \
|
||||
getkmap.h \
|
||||
getmmap.c \
|
||||
getmmap.h \
|
||||
getprop.c \
|
||||
getprop.h \
|
||||
getselev.c \
|
||||
getselev.h \
|
||||
getvers.c \
|
||||
getvers.h \
|
||||
grabdev.c \
|
||||
grabdev.h \
|
||||
grabdevb.c \
|
||||
grabdevb.h \
|
||||
grabdevk.c \
|
||||
grabdevk.h \
|
||||
gtmotion.c \
|
||||
gtmotion.h \
|
||||
listdev.c \
|
||||
listdev.h \
|
||||
opendev.c \
|
||||
opendev.h \
|
||||
queryst.c \
|
||||
queryst.h \
|
||||
selectev.c \
|
||||
selectev.h \
|
||||
sendexev.c \
|
||||
sendexev.h \
|
||||
setbmap.c \
|
||||
setbmap.h \
|
||||
setdval.c \
|
||||
setdval.h \
|
||||
setfocus.c \
|
||||
setfocus.h \
|
||||
setmmap.c \
|
||||
setmmap.h \
|
||||
setmode.c \
|
||||
setmode.h \
|
||||
ungrdev.c \
|
||||
ungrdev.h \
|
||||
ungrdevb.c \
|
||||
ungrdevb.h \
|
||||
ungrdevk.c \
|
||||
ungrdevk.h \
|
||||
xiallowev.c \
|
||||
xiallowev.h \
|
||||
xibarriers.c \
|
||||
xibarriers.h \
|
||||
xichangecursor.c \
|
||||
xichangecursor.h \
|
||||
xichangehierarchy.c \
|
||||
xichangehierarchy.h \
|
||||
xigetclientpointer.c \
|
||||
xigetclientpointer.h \
|
||||
xigrabdev.c \
|
||||
xigrabdev.h \
|
||||
xipassivegrab.h \
|
||||
xipassivegrab.c \
|
||||
xiproperty.c \
|
||||
xiproperty.h \
|
||||
xiquerydevice.c \
|
||||
xiquerydevice.h \
|
||||
xiquerypointer.c \
|
||||
xiquerypointer.h \
|
||||
xiqueryversion.c \
|
||||
xiqueryversion.h \
|
||||
xiselectev.c \
|
||||
xiselectev.h \
|
||||
xisetclientpointer.c \
|
||||
xisetclientpointer.h \
|
||||
xisetdevfocus.c \
|
||||
xisetdevfocus.h \
|
||||
xiwarppointer.c \
|
||||
xiwarppointer.h
|
||||
|
||||
libXistubs_la_SOURCES = \
|
||||
stubs.c
|
||||
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Xi/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign Xi/Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
clean-noinstLTLIBRARIES:
|
||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
@list='$(noinst_LTLIBRARIES)'; \
|
||||
locs=`for p in $$list; do echo $$p; done | \
|
||||
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||
sort -u`; \
|
||||
test -z "$$locs" || { \
|
||||
echo rm -f $${locs}; \
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libXi.la: $(libXi_la_OBJECTS) $(libXi_la_DEPENDENCIES) $(EXTRA_libXi_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(LINK) $(libXi_la_OBJECTS) $(libXi_la_LIBADD) $(LIBS)
|
||||
|
||||
libXistubs.la: $(libXistubs_la_OBJECTS) $(libXistubs_la_DEPENDENCIES) $(EXTRA_libXistubs_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(LINK) $(libXistubs_la_OBJECTS) $(libXistubs_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allowev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chgdctl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chgfctl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chgkbd.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chgkmap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chgprop.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chgptr.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closedev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/devbell.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exevents.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extinit.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getbmap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdctl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getfctl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getfocus.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getkmap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getmmap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getprop.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getselev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getvers.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grabdev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grabdevb.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grabdevk.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtmotion.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listdev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opendev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queryst.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selectev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendexev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setbmap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setdval.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setfocus.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setmmap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setmode.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stubs.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ungrdev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ungrdevb.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ungrdevk.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiallowev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xibarriers.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xichangecursor.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xichangehierarchy.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xigetclientpointer.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xigrabdev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xipassivegrab.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiproperty.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiquerydevice.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiquerypointer.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiqueryversion.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiselectev.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xisetclientpointer.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xisetdevfocus.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiwarppointer.Plo@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-am
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-am
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscopelist: cscopelist-am
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(LTLIBRARIES)
|
||||
installdirs:
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am:
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am:
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||
clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
|
||||
ctags-am distclean distclean-compile distclean-generic \
|
||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-pdf install-pdf-am \
|
||||
install-ps install-ps-am install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags tags-am uninstall uninstall-am
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
127
xorg-server-1.18.4/Xi/allowev.c
Normal file
127
xorg-server-1.18.4/Xi/allowev.c
Normal file
@ -0,0 +1,127 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Function to allow frozen events to be routed from extension input devices.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "allowev.h"
|
||||
#include "dixevents.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure allows frozen events to be routed.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXAllowDeviceEvents(ClientPtr client)
|
||||
{
|
||||
REQUEST(xAllowDeviceEventsReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xAllowDeviceEventsReq);
|
||||
swapl(&stuff->time);
|
||||
return (ProcXAllowDeviceEvents(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure allows frozen events to be routed.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXAllowDeviceEvents(ClientPtr client)
|
||||
{
|
||||
TimeStamp time;
|
||||
DeviceIntPtr thisdev;
|
||||
int rc;
|
||||
|
||||
REQUEST(xAllowDeviceEventsReq);
|
||||
REQUEST_SIZE_MATCH(xAllowDeviceEventsReq);
|
||||
|
||||
rc = dixLookupDevice(&thisdev, stuff->deviceid, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
time = ClientTimeToServerTime(stuff->time);
|
||||
|
||||
switch (stuff->mode) {
|
||||
case ReplayThisDevice:
|
||||
AllowSome(client, time, thisdev, NOT_GRABBED);
|
||||
break;
|
||||
case SyncThisDevice:
|
||||
AllowSome(client, time, thisdev, FREEZE_NEXT_EVENT);
|
||||
break;
|
||||
case AsyncThisDevice:
|
||||
AllowSome(client, time, thisdev, THAWED);
|
||||
break;
|
||||
case AsyncOtherDevices:
|
||||
AllowSome(client, time, thisdev, THAW_OTHERS);
|
||||
break;
|
||||
case SyncAll:
|
||||
AllowSome(client, time, thisdev, FREEZE_BOTH_NEXT_EVENT);
|
||||
break;
|
||||
case AsyncAll:
|
||||
AllowSome(client, time, thisdev, THAWED_BOTH);
|
||||
break;
|
||||
default:
|
||||
client->errorValue = stuff->mode;
|
||||
return BadValue;
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
39
xorg-server-1.18.4/Xi/allowev.h
Normal file
39
xorg-server-1.18.4/Xi/allowev.h
Normal file
@ -0,0 +1,39 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef ALLOWEV_H
|
||||
#define ALLOWEV_H 1
|
||||
|
||||
int SProcXAllowDeviceEvents(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXAllowDeviceEvents(ClientPtr /* client */
|
||||
);
|
||||
|
||||
#endif /* ALLOWEV_H */
|
||||
257
xorg-server-1.18.4/Xi/chgdctl.c
Normal file
257
xorg-server-1.18.4/Xi/chgdctl.c
Normal file
@ -0,0 +1,257 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* Change Device control attributes for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h> /* control constants */
|
||||
#include "XIstubs.h"
|
||||
|
||||
#include "exglobals.h"
|
||||
#include "exevents.h"
|
||||
|
||||
#include "chgdctl.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure changes the control attributes for an extension device,
|
||||
* for clients on machines with a different byte ordering than the server.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXChangeDeviceControl(ClientPtr client)
|
||||
{
|
||||
xDeviceCtl *ctl;
|
||||
|
||||
REQUEST(xChangeDeviceControlReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_AT_LEAST_EXTRA_SIZE(xChangeDeviceControlReq, sizeof(xDeviceCtl));
|
||||
swaps(&stuff->control);
|
||||
ctl = (xDeviceCtl *) &stuff[1];
|
||||
swaps(&ctl->control);
|
||||
swaps(&ctl->length);
|
||||
switch (stuff->control) {
|
||||
case DEVICE_ABS_CALIB:
|
||||
case DEVICE_ABS_AREA:
|
||||
case DEVICE_CORE:
|
||||
case DEVICE_ENABLE:
|
||||
case DEVICE_RESOLUTION:
|
||||
/* hmm. beer. *drool* */
|
||||
break;
|
||||
|
||||
}
|
||||
return (ProcXChangeDeviceControl(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Change the control attributes.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXChangeDeviceControl(ClientPtr client)
|
||||
{
|
||||
unsigned len;
|
||||
int i, status, ret = BadValue;
|
||||
DeviceIntPtr dev;
|
||||
xDeviceResolutionCtl *r;
|
||||
xChangeDeviceControlReply rep;
|
||||
AxisInfoPtr a;
|
||||
CARD32 *resolution;
|
||||
xDeviceEnableCtl *e;
|
||||
|
||||
REQUEST(xChangeDeviceControlReq);
|
||||
REQUEST_AT_LEAST_EXTRA_SIZE(xChangeDeviceControlReq, sizeof(xDeviceCtl));
|
||||
|
||||
len = stuff->length - bytes_to_int32(sizeof(xChangeDeviceControlReq));
|
||||
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
|
||||
if (ret != Success)
|
||||
goto out;
|
||||
|
||||
/* XTest devices are special, none of the below apply to them anyway */
|
||||
if (IsXTestDevice(dev, NULL)) {
|
||||
ret = BadMatch;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rep = (xChangeDeviceControlReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_ChangeDeviceControl,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.status = Success,
|
||||
};
|
||||
|
||||
switch (stuff->control) {
|
||||
case DEVICE_RESOLUTION:
|
||||
r = (xDeviceResolutionCtl *) &stuff[1];
|
||||
if ((len < bytes_to_int32(sizeof(xDeviceResolutionCtl))) ||
|
||||
(len !=
|
||||
bytes_to_int32(sizeof(xDeviceResolutionCtl)) + r->num_valuators)) {
|
||||
ret = BadLength;
|
||||
goto out;
|
||||
}
|
||||
if (!dev->valuator) {
|
||||
ret = BadMatch;
|
||||
goto out;
|
||||
}
|
||||
if ((dev->deviceGrab.grab) && !SameClient(dev->deviceGrab.grab, client)) {
|
||||
rep.status = AlreadyGrabbed;
|
||||
ret = Success;
|
||||
goto out;
|
||||
}
|
||||
resolution = (CARD32 *) (r + 1);
|
||||
if (r->first_valuator + r->num_valuators > dev->valuator->numAxes) {
|
||||
ret = BadValue;
|
||||
goto out;
|
||||
}
|
||||
status = ChangeDeviceControl(client, dev, (xDeviceCtl *) r);
|
||||
if (status == Success) {
|
||||
a = &dev->valuator->axes[r->first_valuator];
|
||||
for (i = 0; i < r->num_valuators; i++)
|
||||
if (*(resolution + i) < (a + i)->min_resolution ||
|
||||
*(resolution + i) > (a + i)->max_resolution)
|
||||
return BadValue;
|
||||
for (i = 0; i < r->num_valuators; i++)
|
||||
(a++)->resolution = *resolution++;
|
||||
|
||||
ret = Success;
|
||||
}
|
||||
else if (status == DeviceBusy) {
|
||||
rep.status = DeviceBusy;
|
||||
ret = Success;
|
||||
}
|
||||
else {
|
||||
ret = BadMatch;
|
||||
}
|
||||
break;
|
||||
case DEVICE_ABS_CALIB:
|
||||
case DEVICE_ABS_AREA:
|
||||
/* Calibration is now done through properties, and never had any effect
|
||||
* on anything (in the open-source world). Thus, be honest. */
|
||||
ret = BadMatch;
|
||||
break;
|
||||
case DEVICE_CORE:
|
||||
/* Sorry, no device core switching no more. If you want a device to
|
||||
* send core events, attach it to a master device */
|
||||
ret = BadMatch;
|
||||
break;
|
||||
case DEVICE_ENABLE:
|
||||
e = (xDeviceEnableCtl *) &stuff[1];
|
||||
if ((len != bytes_to_int32(sizeof(xDeviceEnableCtl)))) {
|
||||
ret = BadLength;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (IsXTestDevice(dev, NULL))
|
||||
status = !Success;
|
||||
else
|
||||
status = ChangeDeviceControl(client, dev, (xDeviceCtl *) e);
|
||||
|
||||
if (status == Success) {
|
||||
if (e->enable)
|
||||
EnableDevice(dev, TRUE);
|
||||
else
|
||||
DisableDevice(dev, TRUE);
|
||||
ret = Success;
|
||||
}
|
||||
else if (status == DeviceBusy) {
|
||||
rep.status = DeviceBusy;
|
||||
ret = Success;
|
||||
}
|
||||
else {
|
||||
ret = BadMatch;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
ret = BadValue;
|
||||
}
|
||||
|
||||
out:
|
||||
if (ret == Success) {
|
||||
devicePresenceNotify dpn = {
|
||||
.type = DevicePresenceNotify,
|
||||
.time = currentTime.milliseconds,
|
||||
.devchange = DeviceControlChanged,
|
||||
.deviceid = dev->id,
|
||||
.control = stuff->control
|
||||
};
|
||||
SendEventToAllWindows(dev, DevicePresenceNotifyMask,
|
||||
(xEvent *) &dpn, 1);
|
||||
|
||||
WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the xChangeDeviceControl function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
SRepXChangeDeviceControl(ClientPtr client, int size,
|
||||
xChangeDeviceControlReply * rep)
|
||||
{
|
||||
swaps(&rep->sequenceNumber);
|
||||
swapl(&rep->length);
|
||||
WriteToClient(client, size, rep);
|
||||
}
|
||||
44
xorg-server-1.18.4/Xi/chgdctl.h
Normal file
44
xorg-server-1.18.4/Xi/chgdctl.h
Normal file
@ -0,0 +1,44 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef CHGDCTL_H
|
||||
#define CHGDCTL_H 1
|
||||
|
||||
int SProcXChangeDeviceControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXChangeDeviceControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void SRepXChangeDeviceControl(ClientPtr /* client */ ,
|
||||
int /* size */ ,
|
||||
xChangeDeviceControlReply * /* rep */
|
||||
);
|
||||
|
||||
#endif /* CHGDCTL_H */
|
||||
517
xorg-server-1.18.4/Xi/chgfctl.c
Normal file
517
xorg-server-1.18.4/Xi/chgfctl.c
Normal file
@ -0,0 +1,517 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* Change feedback control attributes for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h> /* control constants */
|
||||
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "chgfctl.h"
|
||||
|
||||
#define DO_ALL (-1)
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure changes the control attributes for an extension device,
|
||||
* for clients on machines with a different byte ordering than the server.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXChangeFeedbackControl(ClientPtr client)
|
||||
{
|
||||
REQUEST(xChangeFeedbackControlReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_AT_LEAST_SIZE(xChangeFeedbackControlReq);
|
||||
swapl(&stuff->mask);
|
||||
return (ProcXChangeFeedbackControl(client));
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* This procedure changes KbdFeedbackClass data.
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
ChangeKbdFeedback(ClientPtr client, DeviceIntPtr dev, long unsigned int mask,
|
||||
KbdFeedbackPtr k, xKbdFeedbackCtl * f)
|
||||
{
|
||||
KeybdCtrl kctrl;
|
||||
int t;
|
||||
int key = DO_ALL;
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&f->length);
|
||||
swaps(&f->pitch);
|
||||
swaps(&f->duration);
|
||||
swapl(&f->led_mask);
|
||||
swapl(&f->led_values);
|
||||
}
|
||||
|
||||
kctrl = k->ctrl;
|
||||
if (mask & DvKeyClickPercent) {
|
||||
t = f->click;
|
||||
if (t == -1)
|
||||
t = defaultKeyboardControl.click;
|
||||
else if (t < 0 || t > 100) {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
kctrl.click = t;
|
||||
}
|
||||
|
||||
if (mask & DvPercent) {
|
||||
t = f->percent;
|
||||
if (t == -1)
|
||||
t = defaultKeyboardControl.bell;
|
||||
else if (t < 0 || t > 100) {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
kctrl.bell = t;
|
||||
}
|
||||
|
||||
if (mask & DvPitch) {
|
||||
t = f->pitch;
|
||||
if (t == -1)
|
||||
t = defaultKeyboardControl.bell_pitch;
|
||||
else if (t < 0) {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
kctrl.bell_pitch = t;
|
||||
}
|
||||
|
||||
if (mask & DvDuration) {
|
||||
t = f->duration;
|
||||
if (t == -1)
|
||||
t = defaultKeyboardControl.bell_duration;
|
||||
else if (t < 0) {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
kctrl.bell_duration = t;
|
||||
}
|
||||
|
||||
if (mask & DvLed) {
|
||||
kctrl.leds &= ~(f->led_mask);
|
||||
kctrl.leds |= (f->led_mask & f->led_values);
|
||||
}
|
||||
|
||||
if (mask & DvKey) {
|
||||
key = (KeyCode) f->key;
|
||||
if (key < 8 || key > 255) {
|
||||
client->errorValue = key;
|
||||
return BadValue;
|
||||
}
|
||||
if (!(mask & DvAutoRepeatMode))
|
||||
return BadMatch;
|
||||
}
|
||||
|
||||
if (mask & DvAutoRepeatMode) {
|
||||
int inx = (key >> 3);
|
||||
int kmask = (1 << (key & 7));
|
||||
|
||||
t = (CARD8) f->auto_repeat_mode;
|
||||
if (t == AutoRepeatModeOff) {
|
||||
if (key == DO_ALL)
|
||||
kctrl.autoRepeat = FALSE;
|
||||
else
|
||||
kctrl.autoRepeats[inx] &= ~kmask;
|
||||
}
|
||||
else if (t == AutoRepeatModeOn) {
|
||||
if (key == DO_ALL)
|
||||
kctrl.autoRepeat = TRUE;
|
||||
else
|
||||
kctrl.autoRepeats[inx] |= kmask;
|
||||
}
|
||||
else if (t == AutoRepeatModeDefault) {
|
||||
if (key == DO_ALL)
|
||||
kctrl.autoRepeat = defaultKeyboardControl.autoRepeat;
|
||||
else
|
||||
kctrl.autoRepeats[inx] &= ~kmask;
|
||||
kctrl.autoRepeats[inx] =
|
||||
(kctrl.autoRepeats[inx] & ~kmask) |
|
||||
(defaultKeyboardControl.autoRepeats[inx] & kmask);
|
||||
}
|
||||
else {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
}
|
||||
|
||||
k->ctrl = kctrl;
|
||||
(*k->CtrlProc) (dev, &k->ctrl);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* This procedure changes PtrFeedbackClass data.
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
ChangePtrFeedback(ClientPtr client, DeviceIntPtr dev, long unsigned int mask,
|
||||
PtrFeedbackPtr p, xPtrFeedbackCtl * f)
|
||||
{
|
||||
PtrCtrl pctrl; /* might get BadValue part way through */
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&f->length);
|
||||
swaps(&f->num);
|
||||
swaps(&f->denom);
|
||||
swaps(&f->thresh);
|
||||
}
|
||||
|
||||
pctrl = p->ctrl;
|
||||
if (mask & DvAccelNum) {
|
||||
int accelNum;
|
||||
|
||||
accelNum = f->num;
|
||||
if (accelNum == -1)
|
||||
pctrl.num = defaultPointerControl.num;
|
||||
else if (accelNum < 0) {
|
||||
client->errorValue = accelNum;
|
||||
return BadValue;
|
||||
}
|
||||
else
|
||||
pctrl.num = accelNum;
|
||||
}
|
||||
|
||||
if (mask & DvAccelDenom) {
|
||||
int accelDenom;
|
||||
|
||||
accelDenom = f->denom;
|
||||
if (accelDenom == -1)
|
||||
pctrl.den = defaultPointerControl.den;
|
||||
else if (accelDenom <= 0) {
|
||||
client->errorValue = accelDenom;
|
||||
return BadValue;
|
||||
}
|
||||
else
|
||||
pctrl.den = accelDenom;
|
||||
}
|
||||
|
||||
if (mask & DvThreshold) {
|
||||
int threshold;
|
||||
|
||||
threshold = f->thresh;
|
||||
if (threshold == -1)
|
||||
pctrl.threshold = defaultPointerControl.threshold;
|
||||
else if (threshold < 0) {
|
||||
client->errorValue = threshold;
|
||||
return BadValue;
|
||||
}
|
||||
else
|
||||
pctrl.threshold = threshold;
|
||||
}
|
||||
|
||||
p->ctrl = pctrl;
|
||||
(*p->CtrlProc) (dev, &p->ctrl);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* This procedure changes IntegerFeedbackClass data.
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
ChangeIntegerFeedback(ClientPtr client, DeviceIntPtr dev,
|
||||
long unsigned int mask, IntegerFeedbackPtr i,
|
||||
xIntegerFeedbackCtl * f)
|
||||
{
|
||||
if (client->swapped) {
|
||||
swaps(&f->length);
|
||||
swapl(&f->int_to_display);
|
||||
}
|
||||
|
||||
i->ctrl.integer_displayed = f->int_to_display;
|
||||
(*i->CtrlProc) (dev, &i->ctrl);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* This procedure changes StringFeedbackClass data.
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
ChangeStringFeedback(ClientPtr client, DeviceIntPtr dev,
|
||||
long unsigned int mask, StringFeedbackPtr s,
|
||||
xStringFeedbackCtl * f)
|
||||
{
|
||||
int i, j;
|
||||
KeySym *syms, *sup_syms;
|
||||
|
||||
syms = (KeySym *) (f + 1);
|
||||
if (client->swapped) {
|
||||
swaps(&f->length); /* swapped num_keysyms in calling proc */
|
||||
SwapLongs((CARD32 *) syms, f->num_keysyms);
|
||||
}
|
||||
|
||||
if (f->num_keysyms > s->ctrl.max_symbols)
|
||||
return BadValue;
|
||||
|
||||
sup_syms = s->ctrl.symbols_supported;
|
||||
for (i = 0; i < f->num_keysyms; i++) {
|
||||
for (j = 0; j < s->ctrl.num_symbols_supported; j++)
|
||||
if (*(syms + i) == *(sup_syms + j))
|
||||
break;
|
||||
if (j == s->ctrl.num_symbols_supported)
|
||||
return BadMatch;
|
||||
}
|
||||
|
||||
s->ctrl.num_symbols_displayed = f->num_keysyms;
|
||||
for (i = 0; i < f->num_keysyms; i++)
|
||||
*(s->ctrl.symbols_displayed + i) = *(syms + i);
|
||||
(*s->CtrlProc) (dev, &s->ctrl);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* This procedure changes BellFeedbackClass data.
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
ChangeBellFeedback(ClientPtr client, DeviceIntPtr dev,
|
||||
long unsigned int mask, BellFeedbackPtr b,
|
||||
xBellFeedbackCtl * f)
|
||||
{
|
||||
int t;
|
||||
BellCtrl bctrl; /* might get BadValue part way through */
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&f->length);
|
||||
swaps(&f->pitch);
|
||||
swaps(&f->duration);
|
||||
}
|
||||
|
||||
bctrl = b->ctrl;
|
||||
if (mask & DvPercent) {
|
||||
t = f->percent;
|
||||
if (t == -1)
|
||||
t = defaultKeyboardControl.bell;
|
||||
else if (t < 0 || t > 100) {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
bctrl.percent = t;
|
||||
}
|
||||
|
||||
if (mask & DvPitch) {
|
||||
t = f->pitch;
|
||||
if (t == -1)
|
||||
t = defaultKeyboardControl.bell_pitch;
|
||||
else if (t < 0) {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
bctrl.pitch = t;
|
||||
}
|
||||
|
||||
if (mask & DvDuration) {
|
||||
t = f->duration;
|
||||
if (t == -1)
|
||||
t = defaultKeyboardControl.bell_duration;
|
||||
else if (t < 0) {
|
||||
client->errorValue = t;
|
||||
return BadValue;
|
||||
}
|
||||
bctrl.duration = t;
|
||||
}
|
||||
b->ctrl = bctrl;
|
||||
(*b->CtrlProc) (dev, &b->ctrl);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* This procedure changes LedFeedbackClass data.
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
ChangeLedFeedback(ClientPtr client, DeviceIntPtr dev, long unsigned int mask,
|
||||
LedFeedbackPtr l, xLedFeedbackCtl * f)
|
||||
{
|
||||
LedCtrl lctrl; /* might get BadValue part way through */
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&f->length);
|
||||
swapl(&f->led_values);
|
||||
swapl(&f->led_mask);
|
||||
}
|
||||
|
||||
f->led_mask &= l->ctrl.led_mask; /* set only supported leds */
|
||||
f->led_values &= l->ctrl.led_mask; /* set only supported leds */
|
||||
if (mask & DvLed) {
|
||||
lctrl.led_mask = f->led_mask;
|
||||
lctrl.led_values = f->led_values;
|
||||
(*l->CtrlProc) (dev, &lctrl);
|
||||
l->ctrl.led_values &= ~(f->led_mask); /* zero changed leds */
|
||||
l->ctrl.led_values |= (f->led_mask & f->led_values); /* OR in set leds */
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Change the control attributes.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXChangeFeedbackControl(ClientPtr client)
|
||||
{
|
||||
unsigned len;
|
||||
DeviceIntPtr dev;
|
||||
KbdFeedbackPtr k;
|
||||
PtrFeedbackPtr p;
|
||||
IntegerFeedbackPtr i;
|
||||
StringFeedbackPtr s;
|
||||
BellFeedbackPtr b;
|
||||
LedFeedbackPtr l;
|
||||
int rc;
|
||||
|
||||
REQUEST(xChangeFeedbackControlReq);
|
||||
REQUEST_AT_LEAST_SIZE(xChangeFeedbackControlReq);
|
||||
|
||||
len = stuff->length - bytes_to_int32(sizeof(xChangeFeedbackControlReq));
|
||||
rc = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
switch (stuff->feedbackid) {
|
||||
case KbdFeedbackClass:
|
||||
if (len != bytes_to_int32(sizeof(xKbdFeedbackCtl)))
|
||||
return BadLength;
|
||||
|
||||
for (k = dev->kbdfeed; k; k = k->next)
|
||||
if (k->ctrl.id == ((xKbdFeedbackCtl *) &stuff[1])->id)
|
||||
return ChangeKbdFeedback(client, dev, stuff->mask, k,
|
||||
(xKbdFeedbackCtl *) &stuff[1]);
|
||||
break;
|
||||
case PtrFeedbackClass:
|
||||
if (len != bytes_to_int32(sizeof(xPtrFeedbackCtl)))
|
||||
return BadLength;
|
||||
|
||||
for (p = dev->ptrfeed; p; p = p->next)
|
||||
if (p->ctrl.id == ((xPtrFeedbackCtl *) &stuff[1])->id)
|
||||
return ChangePtrFeedback(client, dev, stuff->mask, p,
|
||||
(xPtrFeedbackCtl *) &stuff[1]);
|
||||
break;
|
||||
case StringFeedbackClass:
|
||||
{
|
||||
xStringFeedbackCtl *f = ((xStringFeedbackCtl *) &stuff[1]);
|
||||
|
||||
if (client->swapped) {
|
||||
if (len < bytes_to_int32(sizeof(xStringFeedbackCtl)))
|
||||
return BadLength;
|
||||
swaps(&f->num_keysyms);
|
||||
}
|
||||
if (len !=
|
||||
(bytes_to_int32(sizeof(xStringFeedbackCtl)) + f->num_keysyms))
|
||||
return BadLength;
|
||||
|
||||
for (s = dev->stringfeed; s; s = s->next)
|
||||
if (s->ctrl.id == ((xStringFeedbackCtl *) &stuff[1])->id)
|
||||
return ChangeStringFeedback(client, dev, stuff->mask, s,
|
||||
(xStringFeedbackCtl *) &stuff[1]);
|
||||
break;
|
||||
}
|
||||
case IntegerFeedbackClass:
|
||||
if (len != bytes_to_int32(sizeof(xIntegerFeedbackCtl)))
|
||||
return BadLength;
|
||||
|
||||
for (i = dev->intfeed; i; i = i->next)
|
||||
if (i->ctrl.id == ((xIntegerFeedbackCtl *) &stuff[1])->id)
|
||||
return ChangeIntegerFeedback(client, dev, stuff->mask, i,
|
||||
(xIntegerFeedbackCtl *) &
|
||||
stuff[1]);
|
||||
break;
|
||||
case LedFeedbackClass:
|
||||
if (len != bytes_to_int32(sizeof(xLedFeedbackCtl)))
|
||||
return BadLength;
|
||||
|
||||
for (l = dev->leds; l; l = l->next)
|
||||
if (l->ctrl.id == ((xLedFeedbackCtl *) &stuff[1])->id)
|
||||
return ChangeLedFeedback(client, dev, stuff->mask, l,
|
||||
(xLedFeedbackCtl *) &stuff[1]);
|
||||
break;
|
||||
case BellFeedbackClass:
|
||||
if (len != bytes_to_int32(sizeof(xBellFeedbackCtl)))
|
||||
return BadLength;
|
||||
|
||||
for (b = dev->bell; b; b = b->next)
|
||||
if (b->ctrl.id == ((xBellFeedbackCtl *) &stuff[1])->id)
|
||||
return ChangeBellFeedback(client, dev, stuff->mask, b,
|
||||
(xBellFeedbackCtl *) &stuff[1]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return BadMatch;
|
||||
}
|
||||
39
xorg-server-1.18.4/Xi/chgfctl.h
Normal file
39
xorg-server-1.18.4/Xi/chgfctl.h
Normal file
@ -0,0 +1,39 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef CHGFCTL_H
|
||||
#define CHGFCTL_H 1
|
||||
|
||||
int SProcXChangeFeedbackControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXChangeFeedbackControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
#endif /* CHGFCTL_H */
|
||||
98
xorg-server-1.18.4/Xi/chgkbd.c
Normal file
98
xorg-server-1.18.4/Xi/chgkbd.c
Normal file
@ -0,0 +1,98 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Extension function to change the keyboard device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "XIstubs.h"
|
||||
#include "globals.h"
|
||||
|
||||
#include "exevents.h"
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "chgkbd.h"
|
||||
#include "chgptr.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure changes the keyboard device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXChangeKeyboardDevice(ClientPtr client)
|
||||
{
|
||||
REQUEST(xChangeKeyboardDeviceReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xChangeKeyboardDeviceReq);
|
||||
return (ProcXChangeKeyboardDevice(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure is invoked to swap the request bytes if the server and
|
||||
* client have a different byte order.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXChangeKeyboardDevice(ClientPtr client)
|
||||
{
|
||||
/* REQUEST(xChangeKeyboardDeviceReq); */
|
||||
REQUEST_SIZE_MATCH(xChangeKeyboardDeviceReq);
|
||||
|
||||
return BadDevice;
|
||||
}
|
||||
39
xorg-server-1.18.4/Xi/chgkbd.h
Normal file
39
xorg-server-1.18.4/Xi/chgkbd.h
Normal file
@ -0,0 +1,39 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef CHGKBD_H
|
||||
#define CHGKBD_H 1
|
||||
|
||||
int SProcXChangeKeyboardDevice(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXChangeKeyboardDevice(ClientPtr /* client */
|
||||
);
|
||||
|
||||
#endif /* CHGKBD_H */
|
||||
116
xorg-server-1.18.4/Xi/chgkmap.c
Normal file
116
xorg-server-1.18.4/Xi/chgkmap.c
Normal file
@ -0,0 +1,116 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* Change key mapping for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exevents.h"
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "chgkmap.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure swaps the request when the client and
|
||||
* server have different byte orderings.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXChangeDeviceKeyMapping(ClientPtr client)
|
||||
{
|
||||
unsigned int count;
|
||||
|
||||
REQUEST(xChangeDeviceKeyMappingReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_AT_LEAST_SIZE(xChangeDeviceKeyMappingReq);
|
||||
count = stuff->keyCodes * stuff->keySymsPerKeyCode;
|
||||
REQUEST_FIXED_SIZE(xChangeDeviceKeyMappingReq, count * sizeof(CARD32));
|
||||
SwapLongs((CARD32 *) (&stuff[1]), count);
|
||||
return (ProcXChangeDeviceKeyMapping(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Change the device key mapping.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXChangeDeviceKeyMapping(ClientPtr client)
|
||||
{
|
||||
int ret;
|
||||
unsigned len;
|
||||
DeviceIntPtr dev;
|
||||
unsigned int count;
|
||||
|
||||
REQUEST(xChangeDeviceKeyMappingReq);
|
||||
REQUEST_AT_LEAST_SIZE(xChangeDeviceKeyMappingReq);
|
||||
|
||||
count = stuff->keyCodes * stuff->keySymsPerKeyCode;
|
||||
REQUEST_FIXED_SIZE(xChangeDeviceKeyMappingReq, count * sizeof(CARD32));
|
||||
|
||||
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
|
||||
if (ret != Success)
|
||||
return ret;
|
||||
len = stuff->length - bytes_to_int32(sizeof(xChangeDeviceKeyMappingReq));
|
||||
|
||||
ret = ChangeKeyMapping(client, dev, len, DeviceMappingNotify,
|
||||
stuff->firstKeyCode, stuff->keyCodes,
|
||||
stuff->keySymsPerKeyCode, (KeySym *) &stuff[1]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
39
xorg-server-1.18.4/Xi/chgkmap.h
Normal file
39
xorg-server-1.18.4/Xi/chgkmap.h
Normal file
@ -0,0 +1,39 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef CHGKMAP_H
|
||||
#define CHGKMAP_H 1
|
||||
|
||||
int SProcXChangeDeviceKeyMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXChangeDeviceKeyMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
#endif /* CHGKMAP_H */
|
||||
142
xorg-server-1.18.4/Xi/chgprop.c
Normal file
142
xorg-server-1.18.4/Xi/chgprop.c
Normal file
@ -0,0 +1,142 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Function to modify the dont-propagate-list for an extension input device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include "windowstr.h"
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
|
||||
#include "exevents.h"
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "chgprop.h"
|
||||
#include "grabdev.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure returns the extension version.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXChangeDeviceDontPropagateList(ClientPtr client)
|
||||
{
|
||||
REQUEST(xChangeDeviceDontPropagateListReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_AT_LEAST_SIZE(xChangeDeviceDontPropagateListReq);
|
||||
swapl(&stuff->window);
|
||||
swaps(&stuff->count);
|
||||
REQUEST_FIXED_SIZE(xChangeDeviceDontPropagateListReq,
|
||||
stuff->count * sizeof(CARD32));
|
||||
SwapLongs((CARD32 *) (&stuff[1]), stuff->count);
|
||||
return (ProcXChangeDeviceDontPropagateList(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure changes the dont-propagate list for the specified window.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXChangeDeviceDontPropagateList(ClientPtr client)
|
||||
{
|
||||
int i, rc;
|
||||
WindowPtr pWin;
|
||||
struct tmask tmp[EMASKSIZE];
|
||||
OtherInputMasks *others;
|
||||
|
||||
REQUEST(xChangeDeviceDontPropagateListReq);
|
||||
REQUEST_AT_LEAST_SIZE(xChangeDeviceDontPropagateListReq);
|
||||
|
||||
if (stuff->length !=
|
||||
bytes_to_int32(sizeof(xChangeDeviceDontPropagateListReq)) +
|
||||
stuff->count)
|
||||
return BadLength;
|
||||
|
||||
rc = dixLookupWindow(&pWin, stuff->window, client, DixSetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
if (stuff->mode != AddToList && stuff->mode != DeleteFromList) {
|
||||
client->errorValue = stuff->window;
|
||||
return BadMode;
|
||||
}
|
||||
|
||||
if ((rc = CreateMaskFromList(client, (XEventClass *) &stuff[1],
|
||||
stuff->count, tmp, NULL,
|
||||
X_ChangeDeviceDontPropagateList)) != Success)
|
||||
return rc;
|
||||
|
||||
others = wOtherInputMasks(pWin);
|
||||
if (!others && stuff->mode == DeleteFromList)
|
||||
return Success;
|
||||
for (i = 0; i < EMASKSIZE; i++) {
|
||||
if (tmp[i].mask == 0)
|
||||
continue;
|
||||
|
||||
if (stuff->mode == DeleteFromList)
|
||||
tmp[i].mask = (others->dontPropagateMask[i] & ~tmp[i].mask);
|
||||
else if (others)
|
||||
tmp[i].mask |= others->dontPropagateMask[i];
|
||||
|
||||
if (DeviceEventSuppressForWindow(pWin, client, tmp[i].mask, i) !=
|
||||
Success)
|
||||
return BadClass;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
39
xorg-server-1.18.4/Xi/chgprop.h
Normal file
39
xorg-server-1.18.4/Xi/chgprop.h
Normal file
@ -0,0 +1,39 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef CHGPROP_H
|
||||
#define CHGPROP_H 1
|
||||
|
||||
int SProcXChangeDeviceDontPropagateList(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXChangeDeviceDontPropagateList(ClientPtr /* client */
|
||||
);
|
||||
|
||||
#endif /* CHGPROP_H */
|
||||
99
xorg-server-1.18.4/Xi/chgptr.c
Normal file
99
xorg-server-1.18.4/Xi/chgptr.c
Normal file
@ -0,0 +1,99 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Extension function to change the pointer device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "XIstubs.h"
|
||||
#include "windowstr.h" /* window structure */
|
||||
#include "scrnintstr.h" /* screen structure */
|
||||
|
||||
#include "dixevents.h"
|
||||
#include "exevents.h"
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "chgptr.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure is invoked to swap the request bytes if the server and
|
||||
* client have a different byte order.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXChangePointerDevice(ClientPtr client)
|
||||
{
|
||||
REQUEST(xChangePointerDeviceReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xChangePointerDeviceReq);
|
||||
return (ProcXChangePointerDevice(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure changes the device used as the X pointer.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXChangePointerDevice(ClientPtr client)
|
||||
{
|
||||
/* REQUEST(xChangePointerDeviceReq); */
|
||||
REQUEST_SIZE_MATCH(xChangePointerDeviceReq);
|
||||
|
||||
return BadDevice;
|
||||
}
|
||||
42
xorg-server-1.18.4/Xi/chgptr.h
Normal file
42
xorg-server-1.18.4/Xi/chgptr.h
Normal file
@ -0,0 +1,42 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef CHGPTR_H
|
||||
#define CHGPTR_H 1
|
||||
|
||||
int SProcXChangePointerDevice(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXChangePointerDevice(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void DeleteFocusClassDeviceStruct(DeviceIntPtr /* dev */
|
||||
);
|
||||
|
||||
#endif /* CHGPTR_H */
|
||||
164
xorg-server-1.18.4/Xi/closedev.c
Normal file
164
xorg-server-1.18.4/Xi/closedev.c
Normal file
@ -0,0 +1,164 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Extension function to close an extension input device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include "windowstr.h" /* window structure */
|
||||
#include "scrnintstr.h" /* screen structure */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "XIstubs.h"
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "closedev.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure closes an input device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXCloseDevice(ClientPtr client)
|
||||
{
|
||||
REQUEST(xCloseDeviceReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xCloseDeviceReq);
|
||||
return (ProcXCloseDevice(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Clear out event selections and passive grabs from a window for the
|
||||
* specified device.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
DeleteDeviceEvents(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client)
|
||||
{
|
||||
InputClientsPtr others;
|
||||
OtherInputMasks *pOthers;
|
||||
GrabPtr grab, next;
|
||||
|
||||
if ((pOthers = wOtherInputMasks(pWin)) != 0)
|
||||
for (others = pOthers->inputClients; others; others = others->next)
|
||||
if (SameClient(others, client))
|
||||
others->mask[dev->id] = NoEventMask;
|
||||
|
||||
for (grab = wPassiveGrabs(pWin); grab; grab = next) {
|
||||
next = grab->next;
|
||||
if ((grab->device == dev) &&
|
||||
(client->clientAsMask == CLIENT_BITS(grab->resource)))
|
||||
FreeResource(grab->resource, RT_NONE);
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Walk througth the window tree, deleting event selections for this client
|
||||
* from this device from all windows.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
DeleteEventsFromChildren(DeviceIntPtr dev, WindowPtr p1, ClientPtr client)
|
||||
{
|
||||
WindowPtr p2;
|
||||
|
||||
while (p1) {
|
||||
p2 = p1->firstChild;
|
||||
DeleteDeviceEvents(dev, p1, client);
|
||||
DeleteEventsFromChildren(dev, p2, client);
|
||||
p1 = p1->nextSib;
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure closes an input device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXCloseDevice(ClientPtr client)
|
||||
{
|
||||
int rc, i;
|
||||
WindowPtr pWin, p1;
|
||||
DeviceIntPtr d;
|
||||
|
||||
REQUEST(xCloseDeviceReq);
|
||||
REQUEST_SIZE_MATCH(xCloseDeviceReq);
|
||||
|
||||
rc = dixLookupDevice(&d, stuff->deviceid, client, DixUseAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
if (d->deviceGrab.grab && SameClient(d->deviceGrab.grab, client))
|
||||
(*d->deviceGrab.DeactivateGrab) (d); /* release active grab */
|
||||
|
||||
/* Remove event selections from all windows for events from this device
|
||||
* and selected by this client.
|
||||
* Delete passive grabs from all windows for this device. */
|
||||
|
||||
for (i = 0; i < screenInfo.numScreens; i++) {
|
||||
pWin = screenInfo.screens[i]->root;
|
||||
DeleteDeviceEvents(d, pWin, client);
|
||||
p1 = pWin->firstChild;
|
||||
DeleteEventsFromChildren(d, p1, client);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
39
xorg-server-1.18.4/Xi/closedev.h
Normal file
39
xorg-server-1.18.4/Xi/closedev.h
Normal file
@ -0,0 +1,39 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef CLOSEDEV_H
|
||||
#define CLOSEDEV_H 1
|
||||
|
||||
int SProcXCloseDevice(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXCloseDevice(ClientPtr /* client */
|
||||
);
|
||||
|
||||
#endif /* CLOSEDEV_H */
|
||||
149
xorg-server-1.18.4/Xi/devbell.c
Normal file
149
xorg-server-1.18.4/Xi/devbell.c
Normal file
@ -0,0 +1,149 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Extension function to change the keyboard device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "devbell.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure is invoked to swap the request bytes if the server and
|
||||
* client have a different byte order.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXDeviceBell(ClientPtr client)
|
||||
{
|
||||
REQUEST(xDeviceBellReq);
|
||||
swaps(&stuff->length);
|
||||
return (ProcXDeviceBell(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure rings a bell on an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXDeviceBell(ClientPtr client)
|
||||
{
|
||||
DeviceIntPtr dev;
|
||||
KbdFeedbackPtr k;
|
||||
BellFeedbackPtr b;
|
||||
int rc, base;
|
||||
int newpercent;
|
||||
CARD8 class;
|
||||
void *ctrl;
|
||||
BellProcPtr proc;
|
||||
|
||||
REQUEST(xDeviceBellReq);
|
||||
REQUEST_SIZE_MATCH(xDeviceBellReq);
|
||||
|
||||
rc = dixLookupDevice(&dev, stuff->deviceid, client, DixBellAccess);
|
||||
if (rc != Success) {
|
||||
client->errorValue = stuff->deviceid;
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (stuff->percent < -100 || stuff->percent > 100) {
|
||||
client->errorValue = stuff->percent;
|
||||
return BadValue;
|
||||
}
|
||||
if (stuff->feedbackclass == KbdFeedbackClass) {
|
||||
for (k = dev->kbdfeed; k; k = k->next)
|
||||
if (k->ctrl.id == stuff->feedbackid)
|
||||
break;
|
||||
if (!k) {
|
||||
client->errorValue = stuff->feedbackid;
|
||||
return BadValue;
|
||||
}
|
||||
base = k->ctrl.bell;
|
||||
proc = k->BellProc;
|
||||
ctrl = (void *) &(k->ctrl);
|
||||
class = KbdFeedbackClass;
|
||||
}
|
||||
else if (stuff->feedbackclass == BellFeedbackClass) {
|
||||
for (b = dev->bell; b; b = b->next)
|
||||
if (b->ctrl.id == stuff->feedbackid)
|
||||
break;
|
||||
if (!b) {
|
||||
client->errorValue = stuff->feedbackid;
|
||||
return BadValue;
|
||||
}
|
||||
base = b->ctrl.percent;
|
||||
proc = b->BellProc;
|
||||
ctrl = (void *) &(b->ctrl);
|
||||
class = BellFeedbackClass;
|
||||
}
|
||||
else {
|
||||
client->errorValue = stuff->feedbackclass;
|
||||
return BadValue;
|
||||
}
|
||||
newpercent = (base * stuff->percent) / 100;
|
||||
if (stuff->percent < 0)
|
||||
newpercent = base + newpercent;
|
||||
else
|
||||
newpercent = base - newpercent + stuff->percent;
|
||||
if (proc == NULL)
|
||||
return BadValue;
|
||||
(*proc) (newpercent, dev, ctrl, class);
|
||||
return Success;
|
||||
}
|
||||
39
xorg-server-1.18.4/Xi/devbell.h
Normal file
39
xorg-server-1.18.4/Xi/devbell.h
Normal file
@ -0,0 +1,39 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef DEVBELL_H
|
||||
#define DEVBELL_H 1
|
||||
|
||||
int SProcXDeviceBell(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXDeviceBell(ClientPtr /* client */
|
||||
);
|
||||
|
||||
#endif /* DEVBELL_H */
|
||||
3087
xorg-server-1.18.4/Xi/exevents.c
Normal file
3087
xorg-server-1.18.4/Xi/exevents.c
Normal file
File diff suppressed because it is too large
Load Diff
85
xorg-server-1.18.4/Xi/exglobals.h
Normal file
85
xorg-server-1.18.4/Xi/exglobals.h
Normal file
@ -0,0 +1,85 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/*****************************************************************
|
||||
*
|
||||
* Globals referenced elsewhere in the server.
|
||||
*
|
||||
*/
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
#include "privates.h"
|
||||
|
||||
#ifndef EXGLOBALS_H
|
||||
#define EXGLOBALS_H 1
|
||||
|
||||
extern int IReqCode;
|
||||
extern int IEventBase;
|
||||
extern int BadDevice;
|
||||
extern int BadMode;
|
||||
extern int DeviceBusy;
|
||||
extern int BadClass;
|
||||
|
||||
/* Note: only the ones needed in files other than extinit.c are declared */
|
||||
extern const Mask DevicePointerMotionMask;
|
||||
extern const Mask DevicePointerMotionHintMask;
|
||||
extern const Mask DeviceFocusChangeMask;
|
||||
extern const Mask DeviceStateNotifyMask;
|
||||
extern const Mask DeviceMappingNotifyMask;
|
||||
extern const Mask DeviceOwnerGrabButtonMask;
|
||||
extern const Mask DeviceButtonGrabMask;
|
||||
extern const Mask DeviceButtonMotionMask;
|
||||
extern const Mask DevicePresenceNotifyMask;
|
||||
extern const Mask DevicePropertyNotifyMask;
|
||||
extern const Mask XIAllMasks;
|
||||
|
||||
extern Mask PropagateMask[];
|
||||
|
||||
extern int DeviceValuator;
|
||||
extern int DeviceKeyPress;
|
||||
extern int DeviceKeyRelease;
|
||||
extern int DeviceButtonPress;
|
||||
extern int DeviceButtonRelease;
|
||||
extern int DeviceMotionNotify;
|
||||
extern int DeviceFocusIn;
|
||||
extern int DeviceFocusOut;
|
||||
extern int ProximityIn;
|
||||
extern int ProximityOut;
|
||||
extern int DeviceStateNotify;
|
||||
extern int DeviceKeyStateNotify;
|
||||
extern int DeviceButtonStateNotify;
|
||||
extern int DeviceMappingNotify;
|
||||
extern int ChangeDeviceNotify;
|
||||
extern int DevicePresenceNotify;
|
||||
extern int DevicePropertyNotify;
|
||||
|
||||
extern RESTYPE RT_INPUTCLIENT;
|
||||
|
||||
extern DevPrivateKeyRec XIClientPrivateKeyRec;
|
||||
|
||||
#define XIClientPrivateKey (&XIClientPrivateKeyRec)
|
||||
|
||||
#endif /* EXGLOBALS_H */
|
||||
1352
xorg-server-1.18.4/Xi/extinit.c
Normal file
1352
xorg-server-1.18.4/Xi/extinit.c
Normal file
File diff suppressed because it is too large
Load Diff
132
xorg-server-1.18.4/Xi/getbmap.c
Normal file
132
xorg-server-1.18.4/Xi/getbmap.c
Normal file
@ -0,0 +1,132 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Extension function to return the version of the extension.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "getbmap.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the button mapping for the specified device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXGetDeviceButtonMapping(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGetDeviceButtonMappingReq);
|
||||
swaps(&stuff->length);
|
||||
return (ProcXGetDeviceButtonMapping(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the button mapping for the specified device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXGetDeviceButtonMapping(ClientPtr client)
|
||||
{
|
||||
DeviceIntPtr dev;
|
||||
xGetDeviceButtonMappingReply rep;
|
||||
ButtonClassPtr b;
|
||||
int rc;
|
||||
|
||||
REQUEST(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);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
b = dev->button;
|
||||
if (b == NULL)
|
||||
return BadMatch;
|
||||
|
||||
rep.nElts = b->numButtons;
|
||||
rep.length = bytes_to_int32(rep.nElts);
|
||||
WriteReplyToClient(client, sizeof(xGetDeviceButtonMappingReply), &rep);
|
||||
WriteToClient(client, rep.nElts, &b->map[1]);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the XGetDeviceButtonMapping function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
SRepXGetDeviceButtonMapping(ClientPtr client, int size,
|
||||
xGetDeviceButtonMappingReply * rep)
|
||||
{
|
||||
swaps(&rep->sequenceNumber);
|
||||
swapl(&rep->length);
|
||||
WriteToClient(client, size, rep);
|
||||
}
|
||||
44
xorg-server-1.18.4/Xi/getbmap.h
Normal file
44
xorg-server-1.18.4/Xi/getbmap.h
Normal file
@ -0,0 +1,44 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef GETBMAP_H
|
||||
#define GETBMAP_H 1
|
||||
|
||||
int SProcXGetDeviceButtonMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXGetDeviceButtonMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void SRepXGetDeviceButtonMapping(ClientPtr /* client */ ,
|
||||
int /* size */ ,
|
||||
xGetDeviceButtonMappingReply * /* rep */
|
||||
);
|
||||
|
||||
#endif /* GETBMAP_H */
|
||||
236
xorg-server-1.18.4/Xi/getdctl.c
Normal file
236
xorg-server-1.18.4/Xi/getdctl.c
Normal file
@ -0,0 +1,236 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* Get Device control attributes for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "getdctl.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the control attributes for an extension device,
|
||||
* for clients on machines with a different byte ordering than the server.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXGetDeviceControl(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGetDeviceControlReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xGetDeviceControlReq);
|
||||
swaps(&stuff->control);
|
||||
return (ProcXGetDeviceControl(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure copies DeviceResolution data, swapping if necessary.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
CopySwapDeviceResolution(ClientPtr client, ValuatorClassPtr v, char *buf,
|
||||
int length)
|
||||
{
|
||||
AxisInfoPtr a;
|
||||
xDeviceResolutionState *r;
|
||||
int i, *iptr;
|
||||
|
||||
r = (xDeviceResolutionState *) buf;
|
||||
r->control = DEVICE_RESOLUTION;
|
||||
r->length = length;
|
||||
r->num_valuators = v->numAxes;
|
||||
buf += sizeof(xDeviceResolutionState);
|
||||
iptr = (int *) buf;
|
||||
for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
|
||||
*iptr++ = a->resolution;
|
||||
for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
|
||||
*iptr++ = a->min_resolution;
|
||||
for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
|
||||
*iptr++ = a->max_resolution;
|
||||
if (client->swapped) {
|
||||
swaps(&r->control);
|
||||
swaps(&r->length);
|
||||
swapl(&r->num_valuators);
|
||||
iptr = (int *) buf;
|
||||
for (i = 0; i < (3 * v->numAxes); i++, iptr++) {
|
||||
swapl(iptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
CopySwapDeviceCore(ClientPtr client, DeviceIntPtr dev, char *buf)
|
||||
{
|
||||
xDeviceCoreState *c = (xDeviceCoreState *) buf;
|
||||
|
||||
c->control = DEVICE_CORE;
|
||||
c->length = sizeof(xDeviceCoreState);
|
||||
c->status = dev->coreEvents;
|
||||
c->iscore = (dev == inputInfo.keyboard || dev == inputInfo.pointer);
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&c->control);
|
||||
swaps(&c->length);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
CopySwapDeviceEnable(ClientPtr client, DeviceIntPtr dev, char *buf)
|
||||
{
|
||||
xDeviceEnableState *e = (xDeviceEnableState *) buf;
|
||||
|
||||
e->control = DEVICE_ENABLE;
|
||||
e->length = sizeof(xDeviceEnableState);
|
||||
e->enable = dev->enabled;
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&e->control);
|
||||
swaps(&e->length);
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the xGetDeviceControl function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
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.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXGetDeviceControl(ClientPtr client)
|
||||
{
|
||||
int rc, total_length = 0;
|
||||
char *buf, *savbuf;
|
||||
DeviceIntPtr dev;
|
||||
xGetDeviceControlReply rep;
|
||||
|
||||
REQUEST(xGetDeviceControlReq);
|
||||
REQUEST_SIZE_MATCH(xGetDeviceControlReq);
|
||||
|
||||
rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
rep = (xGetDeviceControlReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_GetDeviceControl,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0
|
||||
};
|
||||
|
||||
switch (stuff->control) {
|
||||
case DEVICE_RESOLUTION:
|
||||
if (!dev->valuator)
|
||||
return BadMatch;
|
||||
total_length = sizeof(xDeviceResolutionState) +
|
||||
(3 * sizeof(int) * dev->valuator->numAxes);
|
||||
break;
|
||||
case DEVICE_ABS_CALIB:
|
||||
case DEVICE_ABS_AREA:
|
||||
return BadMatch;
|
||||
case DEVICE_CORE:
|
||||
total_length = sizeof(xDeviceCoreState);
|
||||
break;
|
||||
case DEVICE_ENABLE:
|
||||
total_length = sizeof(xDeviceEnableState);
|
||||
break;
|
||||
default:
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
buf = (char *) malloc(total_length);
|
||||
if (!buf)
|
||||
return BadAlloc;
|
||||
savbuf = buf;
|
||||
|
||||
switch (stuff->control) {
|
||||
case DEVICE_RESOLUTION:
|
||||
CopySwapDeviceResolution(client, dev->valuator, buf, total_length);
|
||||
break;
|
||||
case DEVICE_CORE:
|
||||
CopySwapDeviceCore(client, dev, buf);
|
||||
break;
|
||||
case DEVICE_ENABLE:
|
||||
CopySwapDeviceEnable(client, dev, buf);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
rep.length = bytes_to_int32(total_length);
|
||||
WriteReplyToClient(client, sizeof(xGetDeviceControlReply), &rep);
|
||||
WriteToClient(client, total_length, savbuf);
|
||||
free(savbuf);
|
||||
return Success;
|
||||
}
|
||||
44
xorg-server-1.18.4/Xi/getdctl.h
Normal file
44
xorg-server-1.18.4/Xi/getdctl.h
Normal file
@ -0,0 +1,44 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef GETDCTL_H
|
||||
#define GETDCTL_H 1
|
||||
|
||||
int SProcXGetDeviceControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXGetDeviceControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void SRepXGetDeviceControl(ClientPtr /* client */ ,
|
||||
int /* size */ ,
|
||||
xGetDeviceControlReply * /* rep */
|
||||
);
|
||||
|
||||
#endif /* GETDCTL_H */
|
||||
358
xorg-server-1.18.4/Xi/getfctl.c
Normal file
358
xorg-server-1.18.4/Xi/getfctl.c
Normal file
@ -0,0 +1,358 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* Get feedback control attributes for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "getfctl.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the control attributes for an extension device,
|
||||
* for clients on machines with a different byte ordering than the server.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXGetFeedbackControl(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGetFeedbackControlReq);
|
||||
swaps(&stuff->length);
|
||||
return (ProcXGetFeedbackControl(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure copies KbdFeedbackClass data, swapping if necessary.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
CopySwapKbdFeedback(ClientPtr client, KbdFeedbackPtr k, char **buf)
|
||||
{
|
||||
int i;
|
||||
xKbdFeedbackState *k2;
|
||||
|
||||
k2 = (xKbdFeedbackState *) * buf;
|
||||
k2->class = KbdFeedbackClass;
|
||||
k2->length = sizeof(xKbdFeedbackState);
|
||||
k2->id = k->ctrl.id;
|
||||
k2->click = k->ctrl.click;
|
||||
k2->percent = k->ctrl.bell;
|
||||
k2->pitch = k->ctrl.bell_pitch;
|
||||
k2->duration = k->ctrl.bell_duration;
|
||||
k2->led_mask = k->ctrl.leds;
|
||||
k2->global_auto_repeat = k->ctrl.autoRepeat;
|
||||
for (i = 0; i < 32; i++)
|
||||
k2->auto_repeats[i] = k->ctrl.autoRepeats[i];
|
||||
if (client->swapped) {
|
||||
swaps(&k2->length);
|
||||
swaps(&k2->pitch);
|
||||
swaps(&k2->duration);
|
||||
swapl(&k2->led_mask);
|
||||
swapl(&k2->led_values);
|
||||
}
|
||||
*buf += sizeof(xKbdFeedbackState);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure copies PtrFeedbackClass data, swapping if necessary.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
CopySwapPtrFeedback(ClientPtr client, PtrFeedbackPtr p, char **buf)
|
||||
{
|
||||
xPtrFeedbackState *p2;
|
||||
|
||||
p2 = (xPtrFeedbackState *) * buf;
|
||||
p2->class = PtrFeedbackClass;
|
||||
p2->length = sizeof(xPtrFeedbackState);
|
||||
p2->id = p->ctrl.id;
|
||||
p2->accelNum = p->ctrl.num;
|
||||
p2->accelDenom = p->ctrl.den;
|
||||
p2->threshold = p->ctrl.threshold;
|
||||
if (client->swapped) {
|
||||
swaps(&p2->length);
|
||||
swaps(&p2->accelNum);
|
||||
swaps(&p2->accelDenom);
|
||||
swaps(&p2->threshold);
|
||||
}
|
||||
*buf += sizeof(xPtrFeedbackState);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure copies IntegerFeedbackClass data, swapping if necessary.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
CopySwapIntegerFeedback(ClientPtr client, IntegerFeedbackPtr i, char **buf)
|
||||
{
|
||||
xIntegerFeedbackState *i2;
|
||||
|
||||
i2 = (xIntegerFeedbackState *) * buf;
|
||||
i2->class = IntegerFeedbackClass;
|
||||
i2->length = sizeof(xIntegerFeedbackState);
|
||||
i2->id = i->ctrl.id;
|
||||
i2->resolution = i->ctrl.resolution;
|
||||
i2->min_value = i->ctrl.min_value;
|
||||
i2->max_value = i->ctrl.max_value;
|
||||
if (client->swapped) {
|
||||
swaps(&i2->length);
|
||||
swapl(&i2->resolution);
|
||||
swapl(&i2->min_value);
|
||||
swapl(&i2->max_value);
|
||||
}
|
||||
*buf += sizeof(xIntegerFeedbackState);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure copies StringFeedbackClass data, swapping if necessary.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
CopySwapStringFeedback(ClientPtr client, StringFeedbackPtr s, char **buf)
|
||||
{
|
||||
int i;
|
||||
xStringFeedbackState *s2;
|
||||
KeySym *kptr;
|
||||
|
||||
s2 = (xStringFeedbackState *) * buf;
|
||||
s2->class = StringFeedbackClass;
|
||||
s2->length = sizeof(xStringFeedbackState) +
|
||||
s->ctrl.num_symbols_supported * sizeof(KeySym);
|
||||
s2->id = s->ctrl.id;
|
||||
s2->max_symbols = s->ctrl.max_symbols;
|
||||
s2->num_syms_supported = s->ctrl.num_symbols_supported;
|
||||
*buf += sizeof(xStringFeedbackState);
|
||||
kptr = (KeySym *) (*buf);
|
||||
for (i = 0; i < s->ctrl.num_symbols_supported; i++)
|
||||
*kptr++ = *(s->ctrl.symbols_supported + i);
|
||||
if (client->swapped) {
|
||||
swaps(&s2->length);
|
||||
swaps(&s2->max_symbols);
|
||||
swaps(&s2->num_syms_supported);
|
||||
kptr = (KeySym *) (*buf);
|
||||
for (i = 0; i < s->ctrl.num_symbols_supported; i++, kptr++) {
|
||||
swapl(kptr);
|
||||
}
|
||||
}
|
||||
*buf += (s->ctrl.num_symbols_supported * sizeof(KeySym));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure copies LedFeedbackClass data, swapping if necessary.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
CopySwapLedFeedback(ClientPtr client, LedFeedbackPtr l, char **buf)
|
||||
{
|
||||
xLedFeedbackState *l2;
|
||||
|
||||
l2 = (xLedFeedbackState *) * buf;
|
||||
l2->class = LedFeedbackClass;
|
||||
l2->length = sizeof(xLedFeedbackState);
|
||||
l2->id = l->ctrl.id;
|
||||
l2->led_values = l->ctrl.led_values;
|
||||
l2->led_mask = l->ctrl.led_mask;
|
||||
if (client->swapped) {
|
||||
swaps(&l2->length);
|
||||
swapl(&l2->led_values);
|
||||
swapl(&l2->led_mask);
|
||||
}
|
||||
*buf += sizeof(xLedFeedbackState);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure copies BellFeedbackClass data, swapping if necessary.
|
||||
*
|
||||
*/
|
||||
|
||||
static void
|
||||
CopySwapBellFeedback(ClientPtr client, BellFeedbackPtr b, char **buf)
|
||||
{
|
||||
xBellFeedbackState *b2;
|
||||
|
||||
b2 = (xBellFeedbackState *) * buf;
|
||||
b2->class = BellFeedbackClass;
|
||||
b2->length = sizeof(xBellFeedbackState);
|
||||
b2->id = b->ctrl.id;
|
||||
b2->percent = b->ctrl.percent;
|
||||
b2->pitch = b->ctrl.pitch;
|
||||
b2->duration = b->ctrl.duration;
|
||||
if (client->swapped) {
|
||||
swaps(&b2->length);
|
||||
swaps(&b2->pitch);
|
||||
swaps(&b2->duration);
|
||||
}
|
||||
*buf += sizeof(xBellFeedbackState);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the xGetFeedbackControl function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
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.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXGetFeedbackControl(ClientPtr client)
|
||||
{
|
||||
int rc, total_length = 0;
|
||||
char *buf, *savbuf;
|
||||
DeviceIntPtr dev;
|
||||
KbdFeedbackPtr k;
|
||||
PtrFeedbackPtr p;
|
||||
IntegerFeedbackPtr i;
|
||||
StringFeedbackPtr s;
|
||||
BellFeedbackPtr b;
|
||||
LedFeedbackPtr l;
|
||||
xGetFeedbackControlReply rep;
|
||||
|
||||
REQUEST(xGetFeedbackControlReq);
|
||||
REQUEST_SIZE_MATCH(xGetFeedbackControlReq);
|
||||
|
||||
rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
rep = (xGetFeedbackControlReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_GetFeedbackControl,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.num_feedbacks = 0
|
||||
};
|
||||
|
||||
for (k = dev->kbdfeed; k; k = k->next) {
|
||||
rep.num_feedbacks++;
|
||||
total_length += sizeof(xKbdFeedbackState);
|
||||
}
|
||||
for (p = dev->ptrfeed; p; p = p->next) {
|
||||
rep.num_feedbacks++;
|
||||
total_length += sizeof(xPtrFeedbackState);
|
||||
}
|
||||
for (s = dev->stringfeed; s; s = s->next) {
|
||||
rep.num_feedbacks++;
|
||||
total_length += sizeof(xStringFeedbackState) +
|
||||
(s->ctrl.num_symbols_supported * sizeof(KeySym));
|
||||
}
|
||||
for (i = dev->intfeed; i; i = i->next) {
|
||||
rep.num_feedbacks++;
|
||||
total_length += sizeof(xIntegerFeedbackState);
|
||||
}
|
||||
for (l = dev->leds; l; l = l->next) {
|
||||
rep.num_feedbacks++;
|
||||
total_length += sizeof(xLedFeedbackState);
|
||||
}
|
||||
for (b = dev->bell; b; b = b->next) {
|
||||
rep.num_feedbacks++;
|
||||
total_length += sizeof(xBellFeedbackState);
|
||||
}
|
||||
|
||||
if (total_length == 0)
|
||||
return BadMatch;
|
||||
|
||||
buf = (char *) malloc(total_length);
|
||||
if (!buf)
|
||||
return BadAlloc;
|
||||
savbuf = buf;
|
||||
|
||||
for (k = dev->kbdfeed; k; k = k->next)
|
||||
CopySwapKbdFeedback(client, k, &buf);
|
||||
for (p = dev->ptrfeed; p; p = p->next)
|
||||
CopySwapPtrFeedback(client, p, &buf);
|
||||
for (s = dev->stringfeed; s; s = s->next)
|
||||
CopySwapStringFeedback(client, s, &buf);
|
||||
for (i = dev->intfeed; i; i = i->next)
|
||||
CopySwapIntegerFeedback(client, i, &buf);
|
||||
for (l = dev->leds; l; l = l->next)
|
||||
CopySwapLedFeedback(client, l, &buf);
|
||||
for (b = dev->bell; b; b = b->next)
|
||||
CopySwapBellFeedback(client, b, &buf);
|
||||
|
||||
rep.length = bytes_to_int32(total_length);
|
||||
WriteReplyToClient(client, sizeof(xGetFeedbackControlReply), &rep);
|
||||
WriteToClient(client, total_length, savbuf);
|
||||
free(savbuf);
|
||||
return Success;
|
||||
}
|
||||
44
xorg-server-1.18.4/Xi/getfctl.h
Normal file
44
xorg-server-1.18.4/Xi/getfctl.h
Normal file
@ -0,0 +1,44 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef GETFCTL_H
|
||||
#define GETFCTL_H 1
|
||||
|
||||
int SProcXGetFeedbackControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXGetFeedbackControl(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void SRepXGetFeedbackControl(ClientPtr /* client */ ,
|
||||
int /* size */ ,
|
||||
xGetFeedbackControlReply * /* rep */
|
||||
);
|
||||
|
||||
#endif /* GETFCTL_H */
|
||||
141
xorg-server-1.18.4/Xi/getfocus.c
Normal file
141
xorg-server-1.18.4/Xi/getfocus.c
Normal file
@ -0,0 +1,141 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Extension function to get the focus for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "windowstr.h" /* focus struct */
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "getfocus.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the focus for a device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXGetDeviceFocus(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGetDeviceFocusReq);
|
||||
swaps(&stuff->length);
|
||||
return (ProcXGetDeviceFocus(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the focus for a device.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXGetDeviceFocus(ClientPtr client)
|
||||
{
|
||||
DeviceIntPtr dev;
|
||||
FocusClassPtr focus;
|
||||
xGetDeviceFocusReply rep;
|
||||
int rc;
|
||||
|
||||
REQUEST(xGetDeviceFocusReq);
|
||||
REQUEST_SIZE_MATCH(xGetDeviceFocusReq);
|
||||
|
||||
rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetFocusAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
if (!dev->focus)
|
||||
return BadDevice;
|
||||
|
||||
rep = (xGetDeviceFocusReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_GetDeviceFocus,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0
|
||||
};
|
||||
|
||||
focus = dev->focus;
|
||||
|
||||
if (focus->win == NoneWin)
|
||||
rep.focus = None;
|
||||
else if (focus->win == PointerRootWin)
|
||||
rep.focus = PointerRoot;
|
||||
else if (focus->win == FollowKeyboardWin)
|
||||
rep.focus = FollowKeyboard;
|
||||
else
|
||||
rep.focus = focus->win->drawable.id;
|
||||
|
||||
rep.time = focus->time.milliseconds;
|
||||
rep.revertTo = focus->revert;
|
||||
WriteReplyToClient(client, sizeof(xGetDeviceFocusReply), &rep);
|
||||
return Success;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the GetDeviceFocus function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
SRepXGetDeviceFocus(ClientPtr client, int size, xGetDeviceFocusReply * rep)
|
||||
{
|
||||
swaps(&rep->sequenceNumber);
|
||||
swapl(&rep->length);
|
||||
swapl(&rep->focus);
|
||||
swapl(&rep->time);
|
||||
WriteToClient(client, size, rep);
|
||||
}
|
||||
44
xorg-server-1.18.4/Xi/getfocus.h
Normal file
44
xorg-server-1.18.4/Xi/getfocus.h
Normal file
@ -0,0 +1,44 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef GETFOCUS_H
|
||||
#define GETFOCUS_H 1
|
||||
|
||||
int SProcXGetDeviceFocus(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXGetDeviceFocus(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void SRepXGetDeviceFocus(ClientPtr /* client */ ,
|
||||
int /* size */ ,
|
||||
xGetDeviceFocusReply * /* rep */
|
||||
);
|
||||
|
||||
#endif /* GETFOCUS_H */
|
||||
156
xorg-server-1.18.4/Xi/getkmap.c
Normal file
156
xorg-server-1.18.4/Xi/getkmap.c
Normal file
@ -0,0 +1,156 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* Get the key mapping for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
#include "swaprep.h"
|
||||
#include "xkbsrv.h"
|
||||
#include "xkbstr.h"
|
||||
|
||||
#include "getkmap.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the key mapping for an extension device,
|
||||
* for clients on machines with a different byte ordering than the server.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXGetDeviceKeyMapping(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGetDeviceKeyMappingReq);
|
||||
swaps(&stuff->length);
|
||||
return (ProcXGetDeviceKeyMapping(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Get the device key mapping.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXGetDeviceKeyMapping(ClientPtr client)
|
||||
{
|
||||
xGetDeviceKeyMappingReply rep;
|
||||
DeviceIntPtr dev;
|
||||
XkbDescPtr xkb;
|
||||
KeySymsPtr syms;
|
||||
int rc;
|
||||
|
||||
REQUEST(xGetDeviceKeyMappingReq);
|
||||
REQUEST_SIZE_MATCH(xGetDeviceKeyMappingReq);
|
||||
|
||||
rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
if (dev->key == NULL)
|
||||
return BadMatch;
|
||||
xkb = dev->key->xkbInfo->desc;
|
||||
|
||||
if (stuff->firstKeyCode < xkb->min_key_code ||
|
||||
stuff->firstKeyCode > xkb->max_key_code) {
|
||||
client->errorValue = stuff->firstKeyCode;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
|
||||
client->errorValue = stuff->count;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
syms = XkbGetCoreMap(dev);
|
||||
if (!syms)
|
||||
return BadAlloc;
|
||||
|
||||
rep = (xGetDeviceKeyMappingReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_GetDeviceKeyMapping,
|
||||
.sequenceNumber = client->sequence,
|
||||
.keySymsPerKeyCode = syms->mapWidth,
|
||||
.length = (syms->mapWidth * stuff->count) /* KeySyms are 4 bytes */
|
||||
};
|
||||
WriteReplyToClient(client, sizeof(xGetDeviceKeyMappingReply), &rep);
|
||||
|
||||
client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
|
||||
WriteSwappedDataToClient(client,
|
||||
syms->mapWidth * stuff->count * sizeof(KeySym),
|
||||
&syms->map[syms->mapWidth * (stuff->firstKeyCode -
|
||||
syms->minKeyCode)]);
|
||||
free(syms->map);
|
||||
free(syms);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the XGetDeviceKeyMapping function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
SRepXGetDeviceKeyMapping(ClientPtr client, int size,
|
||||
xGetDeviceKeyMappingReply * rep)
|
||||
{
|
||||
swaps(&rep->sequenceNumber);
|
||||
swapl(&rep->length);
|
||||
WriteToClient(client, size, rep);
|
||||
}
|
||||
44
xorg-server-1.18.4/Xi/getkmap.h
Normal file
44
xorg-server-1.18.4/Xi/getkmap.h
Normal file
@ -0,0 +1,44 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef GETKMAP_H
|
||||
#define GETKMAP_H 1
|
||||
|
||||
int SProcXGetDeviceKeyMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXGetDeviceKeyMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void SRepXGetDeviceKeyMapping(ClientPtr /* client */ ,
|
||||
int /* size */ ,
|
||||
xGetDeviceKeyMappingReply * /* rep */
|
||||
);
|
||||
|
||||
#endif /* GETKMAP_H */
|
||||
135
xorg-server-1.18.4/Xi/getmmap.c
Normal file
135
xorg-server-1.18.4/Xi/getmmap.c
Normal file
@ -0,0 +1,135 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* Get the modifier mapping for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h> /* Request macro */
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "getmmap.h"
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets the modifier mapping for an extension device,
|
||||
* for clients on machines with a different byte ordering than the server.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXGetDeviceModifierMapping(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGetDeviceModifierMappingReq);
|
||||
swaps(&stuff->length);
|
||||
return (ProcXGetDeviceModifierMapping(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Get the device Modifier mapping.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXGetDeviceModifierMapping(ClientPtr client)
|
||||
{
|
||||
DeviceIntPtr dev;
|
||||
xGetDeviceModifierMappingReply rep;
|
||||
KeyCode *modkeymap = NULL;
|
||||
int ret, max_keys_per_mod;
|
||||
|
||||
REQUEST(xGetDeviceModifierMappingReq);
|
||||
REQUEST_SIZE_MATCH(xGetDeviceModifierMappingReq);
|
||||
|
||||
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
|
||||
if (ret != Success)
|
||||
return ret;
|
||||
|
||||
ret = generate_modkeymap(client, dev, &modkeymap, &max_keys_per_mod);
|
||||
if (ret != Success)
|
||||
return ret;
|
||||
|
||||
rep = (xGetDeviceModifierMappingReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_GetDeviceModifierMapping,
|
||||
.sequenceNumber = client->sequence,
|
||||
.numKeyPerModifier = max_keys_per_mod,
|
||||
/* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
|
||||
.length = max_keys_per_mod << 1
|
||||
};
|
||||
|
||||
WriteReplyToClient(client, sizeof(xGetDeviceModifierMappingReply), &rep);
|
||||
WriteToClient(client, max_keys_per_mod * 8, modkeymap);
|
||||
|
||||
free(modkeymap);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the XGetDeviceModifierMapping function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
SRepXGetDeviceModifierMapping(ClientPtr client, int size,
|
||||
xGetDeviceModifierMappingReply * rep)
|
||||
{
|
||||
swaps(&rep->sequenceNumber);
|
||||
swapl(&rep->length);
|
||||
WriteToClient(client, size, rep);
|
||||
}
|
||||
44
xorg-server-1.18.4/Xi/getmmap.h
Normal file
44
xorg-server-1.18.4/Xi/getmmap.h
Normal file
@ -0,0 +1,44 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of the above listed
|
||||
copyright holder(s) not be used in advertising or publicity pertaining
|
||||
to distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
|
||||
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef GETMMAP_H
|
||||
#define GETMMAP_H 1
|
||||
|
||||
int SProcXGetDeviceModifierMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
int ProcXGetDeviceModifierMapping(ClientPtr /* client */
|
||||
);
|
||||
|
||||
void SRepXGetDeviceModifierMapping(ClientPtr /* client */ ,
|
||||
int /* size */ ,
|
||||
xGetDeviceModifierMappingReply * /* rep */
|
||||
);
|
||||
|
||||
#endif /* GETMMAP_H */
|
||||
184
xorg-server-1.18.4/Xi/getprop.c
Normal file
184
xorg-server-1.18.4/Xi/getprop.c
Normal file
@ -0,0 +1,184 @@
|
||||
/************************************************************
|
||||
|
||||
Copyright 1989, 1998 The Open Group
|
||||
|
||||
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
|
||||
OPEN GROUP 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 Open Group 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 Open Group.
|
||||
|
||||
Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Hewlett-Packard not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Function to return the dont-propagate-list for an extension device.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "inputstr.h" /* DeviceIntPtr */
|
||||
#include "windowstr.h" /* window structs */
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
#include "swaprep.h"
|
||||
|
||||
#include "getprop.h"
|
||||
|
||||
extern XExtEventInfo EventInfo[];
|
||||
extern int ExtEventIndex;
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Handle a request from a client with a different byte order.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
SProcXGetDeviceDontPropagateList(ClientPtr client)
|
||||
{
|
||||
REQUEST(xGetDeviceDontPropagateListReq);
|
||||
swaps(&stuff->length);
|
||||
REQUEST_SIZE_MATCH(xGetDeviceDontPropagateListReq);
|
||||
swapl(&stuff->window);
|
||||
return (ProcXGetDeviceDontPropagateList(client));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure lists the input devices available to the server.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
ProcXGetDeviceDontPropagateList(ClientPtr client)
|
||||
{
|
||||
CARD16 count = 0;
|
||||
int i, rc;
|
||||
XEventClass *buf = NULL, *tbuf;
|
||||
WindowPtr pWin;
|
||||
xGetDeviceDontPropagateListReply rep;
|
||||
OtherInputMasks *others;
|
||||
|
||||
REQUEST(xGetDeviceDontPropagateListReq);
|
||||
REQUEST_SIZE_MATCH(xGetDeviceDontPropagateListReq);
|
||||
|
||||
rep = (xGetDeviceDontPropagateListReply) {
|
||||
.repType = X_Reply,
|
||||
.RepType = X_GetDeviceDontPropagateList,
|
||||
.sequenceNumber = client->sequence,
|
||||
.length = 0,
|
||||
.count = 0
|
||||
};
|
||||
|
||||
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
if ((others = wOtherInputMasks(pWin)) != 0) {
|
||||
for (i = 0; i < EMASKSIZE; i++)
|
||||
ClassFromMask(NULL, others->dontPropagateMask[i], i, &count, COUNT);
|
||||
if (count) {
|
||||
rep.count = count;
|
||||
buf = xallocarray(rep.count, sizeof(XEventClass));
|
||||
rep.length = bytes_to_int32(rep.count * sizeof(XEventClass));
|
||||
|
||||
tbuf = buf;
|
||||
for (i = 0; i < EMASKSIZE; i++)
|
||||
tbuf = ClassFromMask(tbuf, others->dontPropagateMask[i], i,
|
||||
NULL, CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
WriteReplyToClient(client, sizeof(xGetDeviceDontPropagateListReply), &rep);
|
||||
|
||||
if (count) {
|
||||
client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
|
||||
WriteSwappedDataToClient(client, count * sizeof(XEventClass), buf);
|
||||
free(buf);
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure gets a list of event classes from a mask word.
|
||||
* A single mask may translate to more than one event class.
|
||||
*
|
||||
*/
|
||||
|
||||
XEventClass
|
||||
* ClassFromMask(XEventClass * buf, Mask mask, int maskndx, CARD16 *count,
|
||||
int mode)
|
||||
{
|
||||
int i, j;
|
||||
int id = maskndx;
|
||||
Mask tmask = 0x80000000;
|
||||
|
||||
for (i = 0; i < 32; i++, tmask >>= 1)
|
||||
if (tmask & mask) {
|
||||
for (j = 0; j < ExtEventIndex; j++)
|
||||
if (EventInfo[j].mask == tmask) {
|
||||
if (mode == COUNT)
|
||||
(*count)++;
|
||||
else
|
||||
*buf++ = (id << 8) | EventInfo[j].type;
|
||||
}
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* This procedure writes the reply for the XGetDeviceDontPropagateList function,
|
||||
* if the client and server have a different byte ordering.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
SRepXGetDeviceDontPropagateList(ClientPtr client, int size,
|
||||
xGetDeviceDontPropagateListReply * rep)
|
||||
{
|
||||
swaps(&rep->sequenceNumber);
|
||||
swapl(&rep->length);
|
||||
swaps(&rep->count);
|
||||
WriteToClient(client, size, rep);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user