Update to xlsclients 1.1.0. Rewritten to use XCB.

This commit is contained in:
matthieu 2010-11-25 21:52:03 +00:00
parent a33d3d9ce4
commit f59c0fe9bd
12 changed files with 2318 additions and 421 deletions

View File

@ -1,4 +1,5 @@
Copyright 1989, 1991, 1994, 1998 The Open Group
Copyright 2009 Open Text Corporation
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
@ -19,3 +20,23 @@ 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 (c) 2009 Apple Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice 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 ABOVE LISTED COPYRIGHT HOLDER(S) 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.

View File

@ -1,3 +1,130 @@
commit cc6dbd2c1e7966b32e333142ab7630ed19700414
Author: Alan Coopersmith <alan.coopersmith@oracle.com>
Date: Thu Jun 3 16:05:20 2010 -0700
xlsclients 1.1.0
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
commit 1a4649f30813b02caac49de85e2f8b52b7a967fb
Author: Gaetan Nadon <memsize@videotron.ca>
Date: Thu Nov 26 09:19:54 2009 -0500
Makefile.am: add ChangeLog and INSTALL on MAINTAINERCLEANFILES
Now that the INSTALL file is generated.
Allows running make maintainer-clean.
commit 677599f014077c139d42d1c081f24cfcd15882da
Author: Gaetan Nadon <memsize@videotron.ca>
Date: Wed Oct 28 14:09:08 2009 -0400
INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206
Add missing INSTALL file. Use standard GNU file on building tarball
README may have been updated
Remove AUTHORS file as it is empty and no content available yet.
Remove NEWS file as it is empty and no content available yet.
commit d3a3f207f7ee1a4d6ee854d262f9875449bca29f
Author: Gaetan Nadon <memsize@videotron.ca>
Date: Mon Oct 26 22:08:39 2009 -0400
Makefile.am: ChangeLog not required: EXTRA_DIST or *CLEANFILES #24432
ChangeLog filename is known to Automake and requires no further
coding in the makefile.
commit ca9714918eaa05fb631448519c60457d00bb66ae
Author: Gaetan Nadon <memsize@videotron.ca>
Date: Thu Oct 22 12:34:15 2009 -0400
.gitignore: use common defaults with custom section # 24239
Using common defaults will reduce errors and maintenance.
Only the very small or inexistent custom section need periodic maintenance
when the structure of the component changes. Do not edit defaults.
commit 8dda84e71446de8726846a2fa5c83b4354e4811b
Author: Alan Coopersmith <alan.coopersmith@sun.com>
Date: Tue Oct 27 12:54:51 2009 -0700
Add Copyright/License notice for xcb & strnlen changes to COPYING
Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
commit 9745fd920083438ef2c1566947f179b105bf8deb
Author: Alan Coopersmith <alan.coopersmith@sun.com>
Date: Tue Oct 20 16:20:18 2009 -0700
Fix check for xcb_connect failure
Prevents core dump when display can't be opened
Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
commit 222dc9735d6fd2ab1b22003eb00348b98b87afe7
Author: Gaetan Nadon <memsize@videotron.ca>
Date: Wed Oct 21 12:25:58 2009 -0700
xlsclients is not a GNU project, so declare it foreign.
On Wed, 2009-10-21 at 13:36 +1000, Peter Hutterer wrote:
> On Tue, Oct 20, 2009 at 08:23:55PM -0700, Jeremy Huddleston wrote:
> > I noticed an INSTALL file in xlsclients and libXvMC today, and it
> > was quite annoying to work around since 'autoreconf -fvi' replaces
> > it and git wants to commit it. Should these files even be in git?
> > Can I nuke them for the betterment of humanity and since they get
> > created by autoreconf anyways?
>
> See https://bugs.freedesktop.org/show_bug.cgi?id=24206
As an interim measure, replace AM_INIT_AUTOMAKE([dist-bzip2]) with
AM_INIT_AUTOMAKE([foreign dist-bzip2]). This will prevent the generation
of the INSTALL file. It is also part of the 24206 solution.
commit 7720fa29dfe664c363c27c0038a269bc8aeea74f
Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
Date: Wed Oct 21 00:18:26 2009 -0500
Use inttypes.h for correct printf formats
xcb_atom_t and xcb_window_t are both typedef'd as uint32_t.
Since PRI*32 are a C99 feature that may not be available, fallbacks
are provided based on the assumption of a 32-bit int.
Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
Signed-off-by: Jamey Sharp <jamey@minilop.net>
commit 2793689cc2eda675ec11a3a0cfed5e470fa83ee3
Author: Jeremy Huddleston <jeremyhu@freedesktop.org>
Date: Tue Oct 20 15:40:13 2009 -0700
Add implementation of strnlen for systems without this function
Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org>
commit 1839eabbdd697039a264fe7ebb3f4d26f08ddabe
Author: Peter Harris <pharris@opentext.com>
Date: Mon Oct 19 18:21:26 2009 -0700
Rewrite xlsclients to use XCB, avoiding many (many) round trips
This version spends bandwidth to reduce latency; in particular, it
aggressively calls query_tree before the answer to get_property(WM_STATE) is
available.
Even on my local box, this version is 4-10 times faster (30ms typical, vs
200ms typical for Xlib). I get similar results over the local network.
At least one person reports this version takes less than 2 seconds over ssh,
vs over a minute for the Xlib version (~30x faster).
Reviewed-by: Jamey Sharp <jamey@minilop.net>
commit 47f2d188a231a1c59d5d3030a1a2470c774d1e0d
Author: Alan Coopersmith <alan.coopersmith@sun.com>
Date: Fri Oct 16 18:56:01 2009 -0700

View File

@ -1,6 +1,297 @@
Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
2006, 2007, 2008 Free Software Foundation, Inc.
This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.
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.
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.
4. Type `make install' to install the programs and any data files and
documentation.
5. 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.
6. Often, you can also type `make uninstall' to remove the installed
files again.
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 `..'.
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'.
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.
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'.
Optional Features
=================
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.
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"
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
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"
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.
Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
Software Foundation, Inc.

View File

@ -22,7 +22,7 @@
bin_PROGRAMS = xlsclients
AM_CFLAGS = $(CWARNFLAGS) $(XLSCLIENTS_CFLAGS)
xlsclients_LDADD = $(XLSCLIENTS_LIBS)
xlsclients_LDADD = $(XLSCLIENTS_LIBS) $(LIBOBJS)
xlsclients_SOURCES = \
xlsclients.c
@ -36,6 +36,7 @@ appmandir = $(APP_MAN_DIR)
appman_DATA = $(appman_PRE:man=@APP_MAN_SUFFIX@)
EXTRA_DIST = $(appman_PRE)
MAINTAINERCLEANFILES = ChangeLog INSTALL
CLEANFILES = $(appman_DATA)
SED = sed
@ -62,12 +63,13 @@ SUFFIXES = .$(APP_MAN_SUFFIX) .man
.man.$(APP_MAN_SUFFIX):
$(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
EXTRA_DIST += ChangeLog
MAINTAINERCLEANFILES = ChangeLog
.PHONY: ChangeLog
.PHONY: ChangeLog INSTALL
INSTALL:
$(INSTALL_CMD)
ChangeLog:
$(CHANGELOG_CMD)
dist-hook: ChangeLog
dist-hook: ChangeLog INSTALL

View File

@ -62,7 +62,7 @@ bin_PROGRAMS = xlsclients$(EXEEXT)
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
config.guess config.sub depcomp install-sh missing
config.guess config.sub depcomp install-sh missing strnlen.c
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
@ -79,7 +79,8 @@ PROGRAMS = $(bin_PROGRAMS)
am_xlsclients_OBJECTS = xlsclients.$(OBJEXT)
xlsclients_OBJECTS = $(am_xlsclients_OBJECTS)
am__DEPENDENCIES_1 =
xlsclients_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__DEPENDENCIES_2 = @LIBOBJS@
xlsclients_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@ -109,12 +110,14 @@ am__remove_distdir = \
DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
ADMIN_MAN_DIR = @ADMIN_MAN_DIR@
ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
APP_MAN_DIR = @APP_MAN_DIR@
APP_MAN_SUFFIX = @APP_MAN_SUFFIX@
AUTOCONF = @AUTOCONF@
@ -141,6 +144,7 @@ EXEEXT = @EXEEXT@
FILE_MAN_DIR = @FILE_MAN_DIR@
FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@
GREP = @GREP@
INSTALL_CMD = @INSTALL_CMD@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
@ -155,6 +159,19 @@ MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAN_SUBSTS = \
-e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
-e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
-e 's|__xservername__|Xorg|g' \
-e 's|__xconfigfile__|xorg.conf|g' \
-e 's|__projectroot__|$(prefix)|g' \
-e 's|__apploaddir__|$(appdefaultdir)|' \
-e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \
-e 's|__libmansuffix__|$(LIB_MAN_SUFFIX)|g' \
-e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \
-e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \
-e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g'
MISC_MAN_DIR = @MISC_MAN_DIR@
MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@
OBJEXT = @OBJEXT@
@ -166,12 +183,14 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
SED = sed
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
XLSCLIENTS_CFLAGS = @XLSCLIENTS_CFLAGS@
XLSCLIENTS_LIBS = @XLSCLIENTS_LIBS@
XORG_MAN_PAGE = @XORG_MAN_PAGE@
ac_ct_CC = @ac_ct_CC@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
@ -188,7 +207,6 @@ build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
datarootdir = @datarootdir@
distcleancheck_listfiles = @distcleancheck_listfiles@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
@ -217,7 +235,7 @@ sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
AM_CFLAGS = $(CWARNFLAGS) $(XLSCLIENTS_CFLAGS)
xlsclients_LDADD = $(XLSCLIENTS_LIBS)
xlsclients_LDADD = $(XLSCLIENTS_LIBS) $(LIBOBJS)
xlsclients_SOURCES = \
xlsclients.c
@ -226,28 +244,14 @@ appman_PRE = \
appmandir = $(APP_MAN_DIR)
appman_DATA = $(appman_PRE:man=@APP_MAN_SUFFIX@)
EXTRA_DIST = $(appman_PRE) ChangeLog
EXTRA_DIST = $(appman_PRE)
MAINTAINERCLEANFILES = ChangeLog INSTALL
CLEANFILES = $(appman_DATA)
SED = sed
# Strings to replace in man pages
XORGRELSTRING = @PACKAGE_STRING@
XORGMANNAME = X Version 11
MAN_SUBSTS = \
-e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
-e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
-e 's|__xservername__|Xorg|g' \
-e 's|__xconfigfile__|xorg.conf|g' \
-e 's|__projectroot__|$(prefix)|g' \
-e 's|__apploaddir__|$(appdefaultdir)|' \
-e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \
-e 's|__libmansuffix__|$(LIB_MAN_SUFFIX)|g' \
-e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \
-e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \
-e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g'
SUFFIXES = .$(APP_MAN_SUFFIX) .man
MAINTAINERCLEANFILES = ChangeLog
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-am
@ -259,15 +263,15 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
cd $(srcdir) && $(AUTOMAKE) --gnu \
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
cd $(srcdir) && $(AUTOMAKE) --foreign \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu Makefile
$(AUTOMAKE) --foreign Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@ -336,6 +340,7 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strnlen.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlsclients.Po@am__quote@
.c.o:
@ -586,7 +591,7 @@ clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
distclean: distclean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf ./$(DEPDIR)
-rm -rf $(DEPDIR) ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-hdr distclean-tags
@ -614,7 +619,7 @@ installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -rf ./$(DEPDIR)
-rm -rf $(DEPDIR) ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
@ -652,12 +657,15 @@ uninstall-am: uninstall-appmanDATA uninstall-binPROGRAMS \
.man.$(APP_MAN_SUFFIX):
$(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
.PHONY: ChangeLog
.PHONY: ChangeLog INSTALL
INSTALL:
$(INSTALL_CMD)
ChangeLog:
$(CHANGELOG_CMD)
dist-hook: ChangeLog
dist-hook: ChangeLog INSTALL
# 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:

View File

@ -1,6 +1,9 @@
xlsclients is a utility for listing information about the client
applications running on a X11 server.
Version 1.1 and later of xlsclients use (and require) libxcb instead
of libX11, for more efficient communication with the X server.
All questions regarding this software should be directed at the
Xorg mailing list:

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,9 @@
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have a working strnlen function. */
#undef HAVE_STRNLEN
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
@ -59,3 +62,35 @@
/* Version number of package */
#undef VERSION
/* Define to 1 if on MINIX. */
#undef _MINIX
/* Define to 2 if the system does not provide POSIX.1 features except with
this defined. */
#undef _POSIX_1_SOURCE
/* Define to 1 if you need to in order for `stat' and other things to work. */
#undef _POSIX_SOURCE
/* Enable extensions on AIX 3, Interix. */
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
#endif
/* Enable GNU extensions on systems that have them. */
#ifndef _GNU_SOURCE
# undef _GNU_SOURCE
#endif
/* Enable threading extensions on Solaris. */
#ifndef _POSIX_PTHREAD_SEMANTICS
# undef _POSIX_PTHREAD_SEMANTICS
#endif
/* Enable extensions on HP NonStop. */
#ifndef _TANDEM_SOURCE
# undef _TANDEM_SOURCE
#endif
/* Enable general extensions on Solaris. */
#ifndef __EXTENSIONS__
# undef __EXTENSIONS__
#endif

View File

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.62 for xlsclients 1.0.2.
# Generated by GNU Autoconf 2.62 for xlsclients 1.1.0.
#
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
#
@ -596,8 +596,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='xlsclients'
PACKAGE_TARNAME='xlsclients'
PACKAGE_VERSION='1.0.2'
PACKAGE_STRING='xlsclients 1.0.2'
PACKAGE_VERSION='1.1.0'
PACKAGE_STRING='xlsclients 1.1.0'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
# Factoring default headers for most tests.
@ -716,9 +716,11 @@ am__fastdepCC_FALSE
CPP
GREP
EGREP
LIBOBJS
CWARNFLAGS
CHANGELOG_CMD
distcleancheck_listfiles
PKG_CONFIG
INSTALL_CMD
build
build_cpu
build_vendor
@ -727,6 +729,7 @@ host
host_cpu
host_vendor
host_os
SED
APP_MAN_SUFFIX
LIB_MAN_SUFFIX
FILE_MAN_SUFFIX
@ -739,10 +742,11 @@ FILE_MAN_DIR
MISC_MAN_DIR
DRIVER_MAN_DIR
ADMIN_MAN_DIR
PKG_CONFIG
XORG_MAN_PAGE
MAN_SUBSTS
AM_DEFAULT_VERBOSITY
XLSCLIENTS_CFLAGS
XLSCLIENTS_LIBS
LIBOBJS
LTLIBOBJS'
ac_subst_files=''
ac_user_opts='
@ -750,7 +754,6 @@ enable_option_checking
enable_maintainer_mode
enable_dependency_tracking
enable_strict_compilation
with_release_version
'
ac_precious_vars='build_alias
host_alias
@ -1316,7 +1319,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures xlsclients 1.0.2 to adapt to many kinds of systems.
\`configure' configures xlsclients 1.1.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1386,7 +1389,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of xlsclients 1.0.2:";;
short | recursive ) echo "Configuration of xlsclients 1.1.0:";;
esac
cat <<\_ACEOF
@ -1402,12 +1405,6 @@ Optional Features:
Enable all warnings from compiler and make them
errors (default: disabled)
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-release-version=STRING
Use release version string in package name
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
@ -1489,7 +1486,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
xlsclients configure 1.0.2
xlsclients configure 1.1.0
generated by GNU Autoconf 2.62
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@ -1503,7 +1500,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by xlsclients $as_me 1.0.2, which was
It was created by xlsclients $as_me 1.1.0, which was
generated by GNU Autoconf 2.62. Invocation command line was
$ $0 $@
@ -2152,7 +2149,7 @@ fi
# Define the identity of the package.
PACKAGE='xlsclients'
VERSION='1.0.2'
VERSION='1.1.0'
cat >>confdefs.h <<_ACEOF
@ -3538,6 +3535,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
# Check for functional strnlen
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
@ -4158,6 +4156,332 @@ fi
done
if test "${ac_cv_header_minix_config_h+set}" = set; then
{ $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5
$as_echo_n "checking for minix/config.h... " >&6; }
if test "${ac_cv_header_minix_config_h+set}" = set; then
$as_echo_n "(cached) " >&6
fi
{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
$as_echo "$ac_cv_header_minix_config_h" >&6; }
else
# Is the header compilable?
{ $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5
$as_echo_n "checking minix/config.h usability... " >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <minix/config.h>
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then
ac_header_compiler=yes
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }
# Is the header present?
{ $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5
$as_echo_n "checking minix/config.h presence... " >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <minix/config.h>
_ACEOF
if { (ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null && {
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
test ! -s conftest.err
}; then
ac_header_preproc=yes
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;}
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;}
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;}
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
$as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;}
{ $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5
$as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;}
( cat <<\_ASBOX
## ---------------------------------------------------------------------- ##
## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=xorg ##
## ---------------------------------------------------------------------- ##
_ASBOX
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
{ $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5
$as_echo_n "checking for minix/config.h... " >&6; }
if test "${ac_cv_header_minix_config_h+set}" = set; then
$as_echo_n "(cached) " >&6
else
ac_cv_header_minix_config_h=$ac_header_preproc
fi
{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
$as_echo "$ac_cv_header_minix_config_h" >&6; }
fi
if test $ac_cv_header_minix_config_h = yes; then
MINIX=yes
else
MINIX=
fi
if test "$MINIX" = yes; then
cat >>confdefs.h <<\_ACEOF
#define _POSIX_SOURCE 1
_ACEOF
cat >>confdefs.h <<\_ACEOF
#define _POSIX_1_SOURCE 2
_ACEOF
cat >>confdefs.h <<\_ACEOF
#define _MINIX 1
_ACEOF
fi
{ $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5
$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
if test "${ac_cv_safe_to_define___extensions__+set}" = set; then
$as_echo_n "(cached) " >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
# define __EXTENSIONS__ 1
$ac_includes_default
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then
ac_cv_safe_to_define___extensions__=yes
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_safe_to_define___extensions__=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5
$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
test $ac_cv_safe_to_define___extensions__ = yes &&
cat >>confdefs.h <<\_ACEOF
#define __EXTENSIONS__ 1
_ACEOF
cat >>confdefs.h <<\_ACEOF
#define _ALL_SOURCE 1
_ACEOF
cat >>confdefs.h <<\_ACEOF
#define _GNU_SOURCE 1
_ACEOF
cat >>confdefs.h <<\_ACEOF
#define _POSIX_PTHREAD_SEMANTICS 1
_ACEOF
cat >>confdefs.h <<\_ACEOF
#define _TANDEM_SOURCE 1
_ACEOF
{ $as_echo "$as_me:$LINENO: checking for working strnlen" >&5
$as_echo_n "checking for working strnlen... " >&6; }
if test "${ac_cv_func_strnlen_working+set}" = set; then
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then
ac_cv_func_strnlen_working=no
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
int
main ()
{
#define S "foobar"
#define S_LEN (sizeof S - 1)
/* At least one implementation is buggy: that of AIX 4.3 would
give strnlen (S, 1) == 3. */
int i;
for (i = 0; i < S_LEN + 1; ++i)
{
int expected = i <= S_LEN ? i : S_LEN;
if (strnlen (S, i) != expected)
return 1;
}
return 0;
;
return 0;
}
_ACEOF
rm -f conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_strnlen_working=yes
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
ac_cv_func_strnlen_working=no
fi
rm -rf conftest.dSYM
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_strnlen_working" >&5
$as_echo "$ac_cv_func_strnlen_working" >&6; }
test $ac_cv_func_strnlen_working = no && case " $LIBOBJS " in
*" strnlen.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS strnlen.$ac_objext"
;;
esac
if test "x$ac_cv_func_strnlen_working" = xyes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_STRNLEN 1
_ACEOF
fi
{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5
$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
if test "${ac_cv_prog_cc_c99+set}" = set; then
@ -4360,6 +4684,126 @@ esac
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
$as_echo_n "(cached) " >&6
else
case $PKG_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
if test -n "$PKG_CONFIG"; then
{ $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
$as_echo "$PKG_CONFIG" >&6; }
else
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_path_PKG_CONFIG"; then
ac_pt_PKG_CONFIG=$PKG_CONFIG
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
$as_echo_n "(cached) " >&6
else
case $ac_pt_PKG_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
if test -n "$ac_pt_PKG_CONFIG"; then
{ $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
$as_echo "$ac_pt_PKG_CONFIG" >&6; }
else
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_pt_PKG_CONFIG" = x; then
PKG_CONFIG=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
whose name does not start with the host triplet. If you think this
configuration is useful to you, please write to autoconf@gnu.org." >&5
$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
whose name does not start with the host triplet. If you think this
configuration is useful to you, please write to autoconf@gnu.org." >&2;}
ac_tool_warned=yes ;;
esac
PKG_CONFIG=$ac_pt_PKG_CONFIG
fi
else
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=0.9.0
{ $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
PKG_CONFIG=""
fi
fi
# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
{ { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
@ -4443,13 +4887,85 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
if test "${ac_cv_path_SED+set}" = set; then
$as_echo_n "(cached) " >&6
else
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
for ac_i in 1 2 3 4 5 6 7; do
ac_script="$ac_script$as_nl$ac_script"
done
echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
$as_unset ac_script || ac_script=
if test -z "$SED"; then
ac_path_SED_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in sed gsed; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
{ test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
# Check for GNU ac_path_SED and select it if it is found.
# Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
*GNU*)
ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo '' >> "conftest.nl"
"$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
ac_count=`expr $ac_count + 1`
if test $ac_count -gt ${ac_path_SED_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_SED="$ac_path_SED"
ac_path_SED_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_SED_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_SED"; then
{ { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5
$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;}
{ (exit 1); exit 1; }; }
fi
else
ac_cv_path_SED=$SED
fi
fi
{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5
$as_echo "$ac_cv_path_SED" >&6; }
SED="$ac_cv_path_SED"
rm -f conftest.sed
if test "x$GCC" = xyes ; then
CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \
-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \
-Wbad-function-cast"
-Wbad-function-cast -Wformat=2"
case `$CC -dumpversion` in
3.4.* | 4.*)
CWARNFLAGS="$CWARNFLAGS -Wold-style-definition -Wdeclaration-after-statement"
@ -4522,8 +5038,7 @@ fi
# If the module's configure.ac calls AC_PROG_CC later on, CC gets set to C89
@ -4666,20 +5181,6 @@ CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS"
# Check whether --with-release-version was given.
if test "${with_release_version+set}" = set; then
withval=$with_release_version; RELEASE_VERSION="$withval"
else
RELEASE_VERSION=""
fi
if test "x$RELEASE_VERSION" != "x"; then
PACKAGE="$PACKAGE-$RELEASE_VERSION"
PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION"
{ $as_echo "$as_me:$LINENO: Building with package name set to $PACKAGE" >&5
$as_echo "$as_me: Building with package name set to $PACKAGE" >&6;}
fi
cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1`
_ACEOF
@ -4704,11 +5205,20 @@ _ACEOF
CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > .changelog.tmp && \
mv .changelog.tmp ChangeLog) || (rm -f .changelog.tmp; touch ChangeLog; \
CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > \$(top_srcdir)/.changelog.tmp && \
mv \$(top_srcdir)/.changelog.tmp \$(top_srcdir)/ChangeLog) \
|| (rm -f \$(top_srcdir)/.changelog.tmp; touch \$(top_srcdir)/ChangeLog; \
echo 'git directory not found: installing possibly empty changelog.' >&2)"
distcleancheck_listfiles='find . -type f ! -name ChangeLog -print'
macros_datadir=`$PKG_CONFIG --print-errors --variable=pkgdatadir xorg-macros`
INSTALL_CMD="(cp -f "$macros_datadir/INSTALL" \$(top_srcdir)/.INSTALL.tmp && \
mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \
|| (rm -f \$(top_srcdir)/.INSTALL.tmp; touch \$(top_srcdir)/INSTALL; \
echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)"
@ -4782,130 +5292,30 @@ fi
XORG_MAN_PAGE="X Version 11"
MAN_SUBSTS="\
-e 's|__vendorversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \
-e 's|__xorgversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \
-e 's|__xservername__|Xorg|g' \
-e 's|__xconfigfile__|xorg.conf|g' \
-e 's|__projectroot__|\$(prefix)|g' \
-e 's|__apploaddir__|\$(appdefaultdir)|g' \
-e 's|__appmansuffix__|\$(APP_MAN_SUFFIX)|g' \
-e 's|__drivermansuffix__|\$(DRIVER_MAN_SUFFIX)|g' \
-e 's|__adminmansuffix__|\$(ADMIN_MAN_SUFFIX)|g' \
-e 's|__libmansuffix__|\$(LIB_MAN_SUFFIX)|g' \
-e 's|__miscmansuffix__|\$(MISC_MAN_SUFFIX)|g' \
-e 's|__filemansuffix__|\$(FILE_MAN_SUFFIX)|g'"
AM_DEFAULT_VERBOSITY=1
# Checks for pkg-config packages
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
$as_echo_n "(cached) " >&6
else
case $PKG_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
if test -n "$PKG_CONFIG"; then
{ $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
$as_echo "$PKG_CONFIG" >&6; }
else
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_path_PKG_CONFIG"; then
ac_pt_PKG_CONFIG=$PKG_CONFIG
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
$as_echo_n "(cached) " >&6
else
case $ac_pt_PKG_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
if test -n "$ac_pt_PKG_CONFIG"; then
{ $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
$as_echo "$ac_pt_PKG_CONFIG" >&6; }
else
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_pt_PKG_CONFIG" = x; then
PKG_CONFIG=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
whose name does not start with the host triplet. If you think this
configuration is useful to you, please write to autoconf@gnu.org." >&5
$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
whose name does not start with the host triplet. If you think this
configuration is useful to you, please write to autoconf@gnu.org." >&2;}
ac_tool_warned=yes ;;
esac
PKG_CONFIG=$ac_pt_PKG_CONFIG
fi
else
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=0.9.0
{ $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
PKG_CONFIG=""
fi
fi
pkg_failed=no
{ $as_echo "$as_me:$LINENO: checking for XLSCLIENTS" >&5
$as_echo_n "checking for XLSCLIENTS... " >&6; }
@ -4915,12 +5325,12 @@ if test -n "$PKG_CONFIG"; then
pkg_cv_XLSCLIENTS_CFLAGS="$XLSCLIENTS_CFLAGS"
else
if test -n "$PKG_CONFIG" && \
{ ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xmuu\"") >&5
($PKG_CONFIG --exists --print-errors "x11 xmuu") 2>&5
{ ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xcb xcb-atom\"") >&5
($PKG_CONFIG --exists --print-errors "xcb xcb-atom") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
pkg_cv_XLSCLIENTS_CFLAGS=`$PKG_CONFIG --cflags "x11 xmuu" 2>/dev/null`
pkg_cv_XLSCLIENTS_CFLAGS=`$PKG_CONFIG --cflags "xcb xcb-atom" 2>/dev/null`
else
pkg_failed=yes
fi
@ -4933,12 +5343,12 @@ if test -n "$PKG_CONFIG"; then
pkg_cv_XLSCLIENTS_LIBS="$XLSCLIENTS_LIBS"
else
if test -n "$PKG_CONFIG" && \
{ ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xmuu\"") >&5
($PKG_CONFIG --exists --print-errors "x11 xmuu") 2>&5
{ ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xcb xcb-atom\"") >&5
($PKG_CONFIG --exists --print-errors "xcb xcb-atom") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; then
pkg_cv_XLSCLIENTS_LIBS=`$PKG_CONFIG --libs "x11 xmuu" 2>/dev/null`
pkg_cv_XLSCLIENTS_LIBS=`$PKG_CONFIG --libs "xcb xcb-atom" 2>/dev/null`
else
pkg_failed=yes
fi
@ -4957,14 +5367,14 @@ else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
XLSCLIENTS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "x11 xmuu"`
XLSCLIENTS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xcb xcb-atom"`
else
XLSCLIENTS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "x11 xmuu"`
XLSCLIENTS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xcb xcb-atom"`
fi
# Put the nasty error message in config.log where it belongs
echo "$XLSCLIENTS_PKG_ERRORS" >&5
{ { $as_echo "$as_me:$LINENO: error: Package requirements (x11 xmuu) were not met:
{ { $as_echo "$as_me:$LINENO: error: Package requirements (xcb xcb-atom) were not met:
$XLSCLIENTS_PKG_ERRORS
@ -4975,7 +5385,7 @@ Alternatively, you may set the environment variables XLSCLIENTS_CFLAGS
and XLSCLIENTS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
" >&5
$as_echo "$as_me: error: Package requirements (x11 xmuu) were not met:
$as_echo "$as_me: error: Package requirements (xcb xcb-atom) were not met:
$XLSCLIENTS_PKG_ERRORS
@ -5461,7 +5871,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by xlsclients $as_me 1.0.2, which was
This file was extended by xlsclients $as_me 1.1.0, which was
generated by GNU Autoconf 2.62. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -5514,7 +5924,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
xlsclients config.status 1.0.2
xlsclients config.status 1.1.0
configured by $0, generated by GNU Autoconf 2.62,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

View File

@ -22,8 +22,10 @@ dnl
dnl Process this file with autoconf to create configure.
AC_PREREQ([2.57])
AC_INIT(xlsclients, [1.0.2], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xlsclients)
AM_INIT_AUTOMAKE([dist-bzip2])
AC_INIT(xlsclients, [1.1.0],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
xlsclients)
AM_INIT_AUTOMAKE([foreign dist-bzip2])
AM_MAINTAINER_MODE
# Require xorg-macros 1.3 or later: XORG_DEFAULT_OPTIONS
@ -36,10 +38,17 @@ AM_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_PROG_INSTALL
# Check for functional strnlen
AC_USE_SYSTEM_EXTENSIONS
AC_FUNC_STRNLEN
if test "x$ac_cv_func_strnlen_working" = xyes; then
AC_DEFINE(HAVE_STRNLEN, 1, [Define to 1 if you have a working strnlen function.])
fi
XORG_DEFAULT_OPTIONS
# Checks for pkg-config packages
PKG_CHECK_MODULES(XLSCLIENTS, x11 xmuu)
PKG_CHECK_MODULES(XLSCLIENTS, xcb xcb-atom)
AC_SUBST(XLSCLIENTS_CFLAGS)
AC_SUBST(XLSCLIENTS_LIBS)

37
app/xlsclients/strnlen.c Normal file
View File

@ -0,0 +1,37 @@
/*
* Copyright (c) 2009 Apple Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice 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 ABOVE LISTED COPYRIGHT HOLDER(S) 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: Jeremy Huddleston, Apple Inc.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <strnlen.h>
#include <string.h>
size_t strnlen(const char *s, size_t maxlen) {
const char *p = memchr(s, 0, maxlen);
return (size_t)(p ? (p - s) : maxlen);
}

View File

@ -1,8 +1,6 @@
/*
* $Xorg: xlsclients.c,v 1.4 2001/02/09 02:05:54 xorgcvs Exp $
*
*
Copyright 1989, 1998 The Open Group
Copyright 2009 Open Text Corporation
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
@ -25,26 +23,47 @@ 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: Jim Fulton, MIT X Consortium
* Author: Peter Harris, Open Text Corporation
*/
/* $XFree86: xc/programs/xlsclients/xlsclients.c,v 1.5 2001/04/01 14:00:23 tsi Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
#include <X11/Xmu/WinUtil.h>
#include <inttypes.h>
#include <xcb/xcb.h>
#include <xcb/xproto.h>
#include <xcb/xcb_atom.h>
#ifndef HAVE_STRNLEN
#include "strnlen.h"
#endif
#ifndef PRIx32
#define PRIx32 "x"
#endif
#ifndef PRIu32
#define PRIu32 "u"
#endif
static char *ProgramName;
static void lookat ( Display *dpy, Window root, Bool verbose, int maxcmdlen );
static void print_client_properties ( Display *dpy, Window w,
Bool verbose, int maxcmdlen );
static void print_text_field ( Display *dpy, char *s, XTextProperty *tp );
static int print_quoted_word ( char *s, int maxlen );
static void unknown ( Display *dpy, Atom actual_type, int actual_format );
static xcb_atom_t WM_STATE;
static void lookat (xcb_connection_t *dpy, xcb_window_t root, int verbose, int maxcmdlen);
static void print_client_properties (xcb_connection_t *dpy, xcb_window_t w,
int verbose, int maxcmdlen );
static void print_text_field (xcb_connection_t *dpy, char *s, xcb_get_property_reply_t *tp );
static int print_quoted_word (char *s, int maxlen);
static void unknown (xcb_connection_t *dpy, xcb_atom_t actual_type, int actual_format );
/* For convenience: */
typedef int Bool;
#define False (0)
#define True (!False)
static void
usage(void)
@ -54,6 +73,73 @@ usage(void)
exit (1);
}
typedef void (*queue_func)(void *closure);
typedef struct queue_blob {
queue_func func;
void *closure;
struct queue_blob *next;
} queue_blob;
static queue_blob *head = NULL;
static queue_blob **tail = &head;
static void enqueue(queue_func func, void *closure)
{
queue_blob *blob = malloc(sizeof(*blob));
if (!blob)
return; /* TODO: print OOM error */
blob->func = func;
blob->closure = closure;
blob->next = NULL;
*tail = blob;
tail = &blob->next;
}
static void run_queue(void)
{
while (head) {
queue_blob *blob = head;
blob->func(blob->closure);
head = blob->next;
free(blob);
}
tail = &head;
}
typedef struct {
xcb_connection_t *c;
xcb_intern_atom_cookie_t cookie;
xcb_atom_t *atom;
} atom_state;
static void atom_done(void *closure)
{
xcb_intern_atom_reply_t *reply;
atom_state *as = closure;
reply = xcb_intern_atom_reply(as->c, as->cookie, NULL);
if (!reply)
goto done; /* TODO: print Error message */
*(as->atom) = reply->atom;
free(reply);
done:
free(as);
}
static void init_atoms(xcb_connection_t *c)
{
atom_state *as;
as = malloc(sizeof(*as));
as->c = c;
as->atom = &WM_STATE;
as->cookie = xcb_intern_atom(c, 0, strlen("WM_STATE"), "WM_STATE");
enqueue(atom_done, as);
}
int
main(int argc, char *argv[])
{
@ -61,7 +147,9 @@ main(int argc, char *argv[])
char *displayname = NULL;
Bool all_screens = False;
Bool verbose = False;
Display *dpy;
xcb_connection_t *dpy;
const xcb_setup_t *setup;
int screen_number = 0;
int maxcmdlen = 10000;
ProgramName = argv[0];
@ -100,146 +188,391 @@ main(int argc, char *argv[])
}
}
dpy = XOpenDisplay (displayname);
if (!dpy) {
dpy = xcb_connect(displayname, &screen_number);
if (xcb_connection_has_error(dpy)) {
char *name = displayname;
if (!name)
name = getenv("DISPLAY");
if (!name)
name = "";
fprintf (stderr, "%s: unable to open display \"%s\"\r\n",
ProgramName, XDisplayName (displayname));
ProgramName, name);
exit (1);
}
init_atoms(dpy);
setup = xcb_get_setup(dpy);
if (all_screens) {
for (i = 0; i < ScreenCount(dpy); i++) {
lookat (dpy, RootWindow(dpy,i), verbose, maxcmdlen);
}
xcb_screen_iterator_t screen;
screen = xcb_setup_roots_iterator(setup);
do {
lookat(dpy, screen.data->root, verbose, maxcmdlen);
xcb_screen_next(&screen);
} while (screen.rem);
} else {
lookat (dpy, DefaultRootWindow(dpy), verbose, maxcmdlen);
xcb_screen_iterator_t screen;
screen = xcb_setup_roots_iterator(setup);
for (i = 0; i < screen_number; i++)
xcb_screen_next(&screen);
lookat (dpy, screen.data->root, verbose, maxcmdlen);
}
XCloseDisplay (dpy);
run_queue();
xcb_disconnect(dpy);
exit (0);
}
static void
lookat(Display *dpy, Window root, Bool verbose, int maxcmdlen)
typedef struct {
xcb_connection_t *c;
xcb_get_property_cookie_t *prop_cookie;
xcb_query_tree_cookie_t *tree_cookie;
xcb_window_t *win;
xcb_window_t orig_win;
int list_length;
int verbose;
int maxcmdlen;
} child_wm_state;
static void child_info(void *closure)
{
Window dummy, *children = NULL, client;
unsigned int i, nchildren = 0;
child_wm_state *cs = closure;
xcb_window_t orig = cs->orig_win;
xcb_connection_t *c = cs->c;
int verbose = cs->verbose;
int maxcmdlen = cs->maxcmdlen;
int i, j;
/*
* clients are not allowed to stomp on the root and ICCCM doesn't yet
* say anything about window managers putting stuff there; but, try
* anyway.
*/
print_client_properties (dpy, root, verbose, maxcmdlen);
int child_count, num_rep;
xcb_query_tree_reply_t **reply;
/*
* then, get the list of windows
*/
if (!XQueryTree (dpy, root, &dummy, &dummy, &children, &nchildren)) {
return;
for (i = 0; i < cs->list_length; i++) {
xcb_get_property_reply_t *reply;
reply = xcb_get_property_reply(c, cs->prop_cookie[i], NULL);
if (reply) {
if (reply->type) {
/* Show information for this window */
print_client_properties(c, cs->win[i], cs->verbose, cs->maxcmdlen);
free(reply);
/* drain stale replies */
for (j = i+1; j < cs->list_length; j++) {
reply = xcb_get_property_reply(c, cs->prop_cookie[j], NULL);
if (reply)
free(reply);
}
for (j = 0; j < cs->list_length; j++) {
xcb_query_tree_reply_t *rep;
rep = xcb_query_tree_reply(c, cs->tree_cookie[j], NULL);
if (rep)
free(rep);
}
goto done;
}
free(reply);
}
}
for (i = 0; i < nchildren; i++) {
client = XmuClientWindow (dpy, children[i]);
if (client != None)
print_client_properties (dpy, client, verbose, maxcmdlen);
/* WM_STATE not found. Recurse into children: */
num_rep = 0;
reply = malloc(sizeof(*reply) * cs->list_length);
if (!reply)
goto done; /* TODO: print OOM message, drain reply queue */
for (i = 0; i < cs->list_length; i++) {
reply[num_rep] = xcb_query_tree_reply(c, cs->tree_cookie[i], NULL);
if (reply[num_rep])
num_rep++;
}
child_count = 0;
for (i = 0; i < num_rep; i++)
child_count += reply[i]->children_len;
if (!child_count) {
/* No children have CS_STATE; try the parent window */
print_client_properties(c, cs->orig_win, cs->verbose, cs->maxcmdlen);
goto reply_done;
}
cs = malloc(sizeof(*cs) + child_count * (sizeof(*cs->prop_cookie) + sizeof(*cs->tree_cookie) + sizeof(*cs->win)));
if (!cs)
goto reply_done; /* TODO: print OOM message */
cs->c = c;
cs->verbose = verbose;
cs->maxcmdlen = maxcmdlen;
cs->orig_win = orig;
cs->prop_cookie = (void *)&cs[1];
cs->tree_cookie = (void *)&cs->prop_cookie[child_count];
cs->win = (void *)&cs->tree_cookie[child_count];
cs->list_length = child_count;
child_count = 0;
for (i = 0; i < num_rep; i++) {
xcb_window_t *child = xcb_query_tree_children(reply[i]);
for (j = 0; j < reply[i]->children_len; j++) {
cs->win[child_count] = child[j];
cs->prop_cookie[child_count] = xcb_get_property(c, 0, child[j],
WM_STATE, XCB_GET_PROPERTY_TYPE_ANY,
0, 0);
/* Just in case the property isn't there, get the tree too */
cs->tree_cookie[child_count++] = xcb_query_tree(c, child[j]);
}
}
enqueue(child_info, cs);
reply_done:
for (i = 0; i < num_rep; i++)
free(reply[i]);
free(reply);
done:
free(closure);
}
typedef struct {
xcb_connection_t *c;
xcb_query_tree_cookie_t cookie;
int verbose;
int maxcmdlen;
} root_list_state;
static void root_list(void *closure)
{
int i;
xcb_window_t *child;
xcb_query_tree_reply_t *reply;
root_list_state *rl = closure;
reply = xcb_query_tree_reply(rl->c, rl->cookie, NULL);
if (!reply)
goto done;
child = xcb_query_tree_children(reply);
for (i = 0; i < reply->children_len; i++) {
/* Get information about each child */
child_wm_state *cs = malloc(sizeof(*cs) + sizeof(*cs->prop_cookie) + sizeof(*cs->tree_cookie) + sizeof(*cs->win));
if (!cs)
goto done; /* TODO: print OOM message */
cs->c = rl->c;
cs->verbose = rl->verbose;
cs->maxcmdlen = rl->maxcmdlen;
cs->prop_cookie = (void *)&cs[1];
cs->tree_cookie = (void *)&cs->prop_cookie[1];
cs->win = (void *)&cs->tree_cookie[1];
cs->orig_win = child[i];
cs->win[0] = child[i];
cs->prop_cookie[0] = xcb_get_property(rl->c, 0, child[i],
WM_STATE, XCB_GET_PROPERTY_TYPE_ANY,
0, 0);
/* Just in case the property isn't there, get the tree too */
cs->tree_cookie[0] = xcb_query_tree(rl->c, child[i]);
cs->list_length = 1;
enqueue(child_info, cs);
}
free(reply);
done:
free(rl);
}
static void
lookat(xcb_connection_t *dpy, xcb_window_t root, int verbose, int maxcmdlen)
{
root_list_state *rl = malloc(sizeof(*rl));
if (!rl)
return; /* TODO: OOM message */
/*
* get the list of windows
*/
rl->c = dpy;
rl->cookie = xcb_query_tree(dpy, root);
rl->verbose = verbose;
rl->maxcmdlen = maxcmdlen;
enqueue(root_list, rl);
}
static char *Nil = "(nil)";
typedef struct {
xcb_connection_t *c;
xcb_get_property_cookie_t client_machine;
xcb_get_property_cookie_t command;
xcb_get_property_cookie_t name;
xcb_get_property_cookie_t icon_name;
xcb_get_property_cookie_t wm_class;
xcb_window_t w;
int verbose;
int maxcmdlen;
} client_state;
static void
print_client_properties(Display *dpy, Window w, Bool verbose, int maxcmdlen)
show_client_properties(void *closure)
{
char **cliargv = NULL;
int i, cliargc;
XTextProperty nametp, machtp, tp;
int charsleft = maxcmdlen;
client_state *cs = closure;
xcb_get_property_reply_t *client_machine;
xcb_get_property_reply_t *command;
xcb_get_property_reply_t *name;
xcb_get_property_reply_t *icon_name;
xcb_get_property_reply_t *wm_class;
char *argv;
int charsleft = cs->maxcmdlen;
int i;
/*
* get the WM_MACHINE and WM_COMMAND list of strings
*/
if (!XGetWMClientMachine (dpy, w, &machtp)) {
machtp.value = NULL;
machtp.encoding = None;
client_machine = xcb_get_property_reply(cs->c, cs->client_machine, NULL);
command = xcb_get_property_reply(cs->c, cs->command, NULL);
if (cs->verbose) {
name = xcb_get_property_reply(cs->c, cs->name, NULL);
icon_name = xcb_get_property_reply(cs->c, cs->icon_name, NULL);
wm_class = xcb_get_property_reply(cs->c, cs->wm_class, NULL);
}
if (!XGetCommand (dpy, w, &cliargv, &cliargc)) {
if (machtp.value) XFree ((char *) machtp.value);
return;
}
if (!command || !command->type)
goto done;
/*
* do header information
*/
if (verbose) {
printf ("Window 0x%lx:\n", w);
print_text_field (dpy, " Machine: ", &machtp);
if (XGetWMName (dpy, w, &nametp)) {
print_text_field (dpy, " Name: ", &nametp);
if (nametp.value) XFree ((char *) nametp.value);
}
if (cs->verbose) {
printf ("Window 0x%" PRIx32 ":\n", cs->w);
print_text_field (cs->c, " Machine: ", client_machine);
if (name && name->type)
print_text_field (cs->c, " Name: ", name);
} else {
print_text_field (dpy, NULL, &machtp);
print_text_field (cs->c, NULL, client_machine);
putchar (' ');
putchar (' ');
}
if (machtp.value) XFree ((char *) machtp.value);
if (verbose) {
if (XGetWMIconName (dpy, w, &tp)) {
print_text_field (dpy, " Icon Name: ", &tp);
if (tp.value) XFree ((char *) tp.value);
}
}
if (cs->verbose)
if (icon_name && icon_name->type)
print_text_field (cs->c, " Icon Name: ", icon_name);
/*
* do the command
*/
if (verbose) {
if (cs->verbose)
printf (" Command: ");
}
for (i = 0; i < cliargc && charsleft > 0; ) {
charsleft -= print_quoted_word (cliargv[i], charsleft);
i++;
if (i < cliargc && charsleft > 0) {
putchar (' '); charsleft--;
argv = xcb_get_property_value(command);
for (i = 0; i < command->value_len && charsleft > 0; ) {
charsleft -= print_quoted_word (argv + i, charsleft);
i += strnlen(argv + i, command->value_len - i) + 1;
if (i < command->value_len && charsleft > 0) {
putchar (' ');
charsleft--;
}
}
putchar ('\n');
XFreeStringList (cliargv);
/*
* do trailer information
*/
if (verbose) {
XClassHint clh;
if (XGetClassHint (dpy, w, &clh)) {
printf (" Instance/Class: %s/%s",
clh.res_name ? clh.res_name : Nil,
clh.res_class ? clh.res_class : Nil);
if (clh.res_name) XFree (clh.res_name);
if (clh.res_class) XFree (clh.res_class);
if (cs->verbose) {
if (wm_class && wm_class->type) {
char *res_name, *res_class;
int name_len, class_len;
res_name = xcb_get_property_value(wm_class);
name_len = strnlen(res_name, wm_class->value_len) + 1;
class_len = wm_class->value_len - name_len;
if (class_len > 0) {
res_class = res_name + name_len;
} else {
res_class = Nil;
class_len = strlen(res_class);
}
printf (" Instance/Class: %.*s/%.*s",
name_len, res_name,
class_len, res_class);
putchar ('\n');
}
}
done:
if (client_machine)
free(client_machine);
if (command)
free(command);
if (cs->verbose) {
if (name)
free(name);
if (icon_name)
free(icon_name);
if (wm_class)
free(wm_class);
}
free(cs);
}
static void
print_text_field(Display *dpy, char *s, XTextProperty *tp)
print_client_properties(xcb_connection_t *dpy, xcb_window_t w, int verbose, int maxcmdlen)
{
if (tp->encoding == None || tp->format == 0) {
client_state *cs = malloc(sizeof(*cs));
if (!cs)
return; /* TODO: print OOM message */
cs->c = dpy;
cs->w = w;
cs->verbose = verbose;
cs->maxcmdlen = maxcmdlen;
/*
* get the WM_CLIENT_MACHINE and WM_COMMAND list of strings
*/
cs->client_machine = xcb_get_property(dpy, 0, w,
WM_CLIENT_MACHINE, XCB_GET_PROPERTY_TYPE_ANY,
0, 1000000L);
cs->command = xcb_get_property(dpy, 0, w,
WM_COMMAND, XCB_GET_PROPERTY_TYPE_ANY,
0, 1000000L);
if (verbose) {
cs->name = xcb_get_property(dpy, 0, w,
WM_NAME, XCB_GET_PROPERTY_TYPE_ANY,
0, 1000000L);
cs->icon_name = xcb_get_property(dpy, 0, w,
WM_ICON_NAME, XCB_GET_PROPERTY_TYPE_ANY,
0, 1000000L);
cs->wm_class = xcb_get_property(dpy, 0, w,
WM_CLASS, STRING,
0, 1000000L);
}
enqueue(show_client_properties, cs);
}
static void
print_text_field(xcb_connection_t *dpy, char *s, xcb_get_property_reply_t *tp)
{
if (tp->type == XCB_NONE || tp->format == 0) { /* Or XCB_ATOM_NONE after libxcb 1.5 */
printf ("''");
return;
}
if (s) printf ("%s", s);
if (tp->encoding == XA_STRING && tp->format == 8) {
printf ("%s", tp->value ? (char *) tp->value : Nil);
if (tp->type == STRING && tp->format == 8) {
printf ("%.*s", (int)tp->value_len, (char *)xcb_get_property_value(tp));
} else {
unknown (dpy, tp->encoding, tp->format);
unknown (dpy, tp->type, tp->format);
}
if (s) putchar ('\n');
}
@ -303,18 +636,22 @@ print_quoted_word(char *s,
}
static void
unknown(Display *dpy, Atom actual_type, int actual_format)
unknown(xcb_connection_t *dpy, xcb_atom_t actual_type, int actual_format)
{
char *s;
printf ("<unknown type ");
if (actual_type == None) printf ("None");
else if ((s = XGetAtomName (dpy, actual_type)) != NULL) {
fputs (s, stdout);
XFree (s);
} else {
fputs (Nil, stdout);
if (actual_type == XCB_NONE)
printf ("None");
else {
/* This should happen so rarely as to make no odds. Eat a round-trip: */
xcb_get_atom_name_reply_t *atom =
xcb_get_atom_name_reply(dpy,
xcb_get_atom_name(dpy, actual_type), NULL);
if (atom) {
printf("%.*s", xcb_get_atom_name_name_length(atom),
xcb_get_atom_name_name(atom));
free(atom);
} else
fputs (Nil, stdout);
}
printf (" (%ld) or format %d>", actual_type, actual_format);
printf (" (%" PRIu32 ") or format %d>", actual_type, actual_format);
}