diff options
Diffstat (limited to 'nx-X11/lib/Xfixes')
-rw-r--r-- | nx-X11/lib/Xfixes/.cvsignore | 25 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/AUTHORS | 1 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/COPYING | 22 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/ChangeLog | 102 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Cursor.c | 220 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/INSTALL | 8 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Imakefile | 75 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Makefile.am | 56 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/NEWS | 0 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/README | 10 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Region.c | 441 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/SaveSet.c | 48 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Selection.c | 50 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Xfixes-def.cpp | 10 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Xfixes.c | 333 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Xfixes.h | 220 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Xfixes.man | 76 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/Xfixesint.h | 68 | ||||
-rwxr-xr-x | nx-X11/lib/Xfixes/autogen.sh | 3 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/configure.ac | 99 | ||||
-rw-r--r-- | nx-X11/lib/Xfixes/xfixes.pc.in | 10 |
21 files changed, 1877 insertions, 0 deletions
diff --git a/nx-X11/lib/Xfixes/.cvsignore b/nx-X11/lib/Xfixes/.cvsignore new file mode 100644 index 000000000..e69298c9d --- /dev/null +++ b/nx-X11/lib/Xfixes/.cvsignore @@ -0,0 +1,25 @@ +.deps +.libs +*.lo +*.la +Makefile +Makefile.in +aclocal.m4 +autogen.sh +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +depcomp +install-sh +libXfixes.la +libtool +ltmain.sh +missing +mkinstalldirs +stamp-h1 +xfixes.pc diff --git a/nx-X11/lib/Xfixes/AUTHORS b/nx-X11/lib/Xfixes/AUTHORS new file mode 100644 index 000000000..ab0e01b06 --- /dev/null +++ b/nx-X11/lib/Xfixes/AUTHORS @@ -0,0 +1 @@ +Keith Packard, HP and XFree86. diff --git a/nx-X11/lib/Xfixes/COPYING b/nx-X11/lib/Xfixes/COPYING new file mode 100644 index 000000000..e85d981e7 --- /dev/null +++ b/nx-X11/lib/Xfixes/COPYING @@ -0,0 +1,22 @@ +$Id: COPYING,v 1.1 2004/07/31 05:50:39 anholt Exp $ + +Copyright © 2001,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. + diff --git a/nx-X11/lib/Xfixes/ChangeLog b/nx-X11/lib/Xfixes/ChangeLog new file mode 100644 index 000000000..cf2da5a94 --- /dev/null +++ b/nx-X11/lib/Xfixes/ChangeLog @@ -0,0 +1,102 @@ +Tue May 17 13:00:21 2005 Søren Sandmann <sandmann@redhat.com> + + * *.c: Conditionally include <config.h> + +2004-07-26 Keith Packard <keithp@keithp.com> + + * Makefile.am: + * Region.c: (XFixesFetchRegion), (XFixesFetchRegionAndBounds), + (XFixesExpandRegion): + * Xfixes.c: (XFixesVersion): + * Xfixes.h: + * configure.ac: + Add XFixesExpandRegion and XFixesFetchRegionAndBounds + +2004-04-13 Daniel Stone <daniel@freedesktop.org> + + * Bump version to 2.0.2 for xlibs 1.0.1; no other changes. + +2004-04-01 Keith Packard <keithp@keithp.com> + + reviewed by: Bill Haneman + + * Region.c: (XFixesFetchRegion): + Forgot to store the region operand in the protocol request. + Made this function completely broken. + +2004-03-08 Keith Packard <keithp@keithp.com> + + * Cursor.c: (XFixesGetCursorImage), (XFixesSetCursorName), + (XFixesChangeCursorByName): + * Xfixes.h: + Use 'const' in API to make C++ happy + +2004-02-03 Jim Gettys <jg@freedesktop.org.org> + + * AUTHORS: Get a author file with contents. + +2004-01-15 Daniel Stone <daniel@fooishbar.org> + * Tag release 2.0.1 for first freedesktop.org clientside lib release. + +2004-01-15 Harold L Hunt II <huntharo@msu.edu> + * Makefile.am: Pass -no-undefined to libtool via LDFLAGS. + +2003-11-21 Keith Packard <keithp@keithp.com> + + * Region.c: (XFixesCopyRegion), (XFixesUnionRegion), + (XFixesIntersectRegion), (XFixesSubtractRegion), + (XFixesInvertRegion), (XFixesTranslateRegion): + * Xfixes.h: + Eliminate offset arguments in combining operators, + create separate XFixesCopyRegion and XFixesTranslateRegion functions. + +2003-11-02 Keith Packard <keithp@keithp.com> + + * Cursor.c: (XFixesSelectCursorInput), (XFixesGetCursorImage), + (XFixesSetCursorName), (XFixesGetCursorName), (XFixesChangeCursor), + (XFixesChangeCursorByName): + * Makefile.am: + * Region.c: (XFixesCreateRegion), (XFixesCreateRegionFromBitmap), + (XFixesCreateRegionFromWindow), (XFixesCreateRegionFromGC), + (XFixesCreateRegionFromPicture), (XFixesDestroyRegion), + (XFixesSetRegion), (XFixesUnionRegion), (XFixesIntersectRegion), + (XFixesSubtractRegion), (XFixesInvertRegion), + (XFixesRegionExtents), (XFixesFetchRegion), + (XFixesSetGCClipRegion), (XFixesSetWindowShapeRegion), + (XFixesSetPictureClipRegion): + * SaveSet.c: (XFixesChangeSaveSet): + * Selection.c: (XFixesSelectSelectionInput): + * Xfixes.c: (XFixesExtAddDisplay), (XFixesExtRemoveDisplay), + (XFixesExtFindDisplay), (XFixesFindDisplay), (XFixesCloseDisplay), + (XFixesWireToEvent), (XFixesEventToWire), (XFixesQueryExtension), + (XFixesQueryVersion): + * Xfixes.h: + * Xfixesint.h: + * configure.ac: + * xfixes.pc.in: + Merge in xfixes_2_branch + +2003-10-19 Keith Packard <keithp@keithp.com> + + * Cursor.c + * Region.c + * Makefile.am + * SaveSet.c + * Selection.c + * Xfixes.c + * Xfixes.h + * Xfixesint.h + * configure.ac + * xfixes.pc.in + Eliminate dependency on libXext by in-lining trivial code. + Switch to Xfixes 2.0, adding region and cursor name functions + +2003-09-16 Anders Carlsson <andersca@gnome.org> + + * configure.ac: + * randr-uninstalled.pc.in: + Add uninstalled pc file. + +2003-04-21 Keith Packard <keithp@keithp.com> + + + Added ChangeLog diff --git a/nx-X11/lib/Xfixes/Cursor.c b/nx-X11/lib/Xfixes/Cursor.c new file mode 100644 index 000000000..ada8a681a --- /dev/null +++ b/nx-X11/lib/Xfixes/Cursor.c @@ -0,0 +1,220 @@ +/* + * $XFree86: xc/lib/Xfixes/Cursor.c,v 1.1 2002/11/30 06:21:44 keithp Exp $ + * + * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xfixesint.h" + +void +XFixesSelectCursorInput (Display *dpy, + Window win, + unsigned long eventMask) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSelectCursorInputReq *req; + + XFixesSimpleCheckExtension (dpy, info); + + LockDisplay (dpy); + GetReq (XFixesSelectCursorInput, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSelectCursorInput; + req->window = win; + req->eventMask = eventMask; + UnlockDisplay (dpy); + SyncHandle (); +} + +XFixesCursorImage * +XFixesGetCursorImage (Display *dpy) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesGetCursorImageAndNameReq *req; + xXFixesGetCursorImageAndNameReply rep; + int npixels; + int nbytes_name; + int nbytes, nread, rlength; + XFixesCursorImage *image; + char *name; + + XFixesCheckExtension (dpy, info, 0); + LockDisplay (dpy); + GetReq (XFixesGetCursorImageAndName, req); + req->reqType = info->codes->major_opcode; + if (info->major_version >= 2) + req->xfixesReqType = X_XFixesGetCursorImageAndName; + else + req->xfixesReqType = X_XFixesGetCursorImage; + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) + { + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + if (info->major_version < 2) + { + rep.cursorName = None; + rep.nbytes = 0; + } + npixels = rep.width * rep.height; + nbytes_name = rep.nbytes; + /* reply data length */ + nbytes = (long) rep.length << 2; + /* bytes of actual data in the reply */ + nread = (npixels << 2) + nbytes_name; + /* size of data returned to application */ + rlength = (sizeof (XFixesCursorImage) + + npixels * sizeof (unsigned long) + + nbytes_name + 1); + + image = (XFixesCursorImage *) Xmalloc (rlength); + if (!image) + { + _XEatData (dpy, nbytes); + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + image->x = rep.x; + image->y = rep.y; + image->width = rep.width; + image->height = rep.height; + image->xhot = rep.xhot; + image->yhot = rep.yhot; + image->cursor_serial = rep.cursorSerial; + image->pixels = (unsigned long *) (image + 1); + image->atom = rep.cursorName; + name = (char *) (image->pixels + npixels); + image->name = name; + _XRead32 (dpy, image->pixels, npixels << 2); + _XRead (dpy, name, nbytes_name); + name[nbytes_name] = '\0'; /* null-terminate */ + /* skip any padding */ + if(nbytes > nread) + { + _XEatData (dpy, (unsigned long) (nbytes - nread)); + } + UnlockDisplay (dpy); + SyncHandle (); + return image; +} + +void +XFixesSetCursorName (Display *dpy, Cursor cursor, const char *name) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSetCursorNameReq *req; + int nbytes = strlen (name); + + XFixesSimpleCheckExtension (dpy, info); + if (info->major_version < 2) + return; + LockDisplay (dpy); + GetReq (XFixesSetCursorName, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSetCursorName; + req->cursor = cursor; + req->nbytes = nbytes; + req->length += (nbytes + 3) >> 2; + Data (dpy, name, nbytes); + UnlockDisplay (dpy); + SyncHandle (); +} + +const char * +XFixesGetCursorName (Display *dpy, Cursor cursor, Atom *atom) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesGetCursorNameReq *req; + xXFixesGetCursorNameReply rep; + char *name; + + XFixesCheckExtension (dpy, info, 0); + if (info->major_version < 2) + return 0; + LockDisplay (dpy); + GetReq (XFixesGetCursorName, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesGetCursorName; + req->cursor = cursor; + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) + { + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + *atom = rep.atom; + if ((name = (char *) Xmalloc(rep.nbytes+1))) { + _XReadPad(dpy, name, (long)rep.nbytes); + name[rep.nbytes] = '\0'; + } else { + _XEatData(dpy, (unsigned long) (rep.nbytes + 3) & ~3); + name = (char *) NULL; + } + UnlockDisplay(dpy); + SyncHandle(); + return(name); +} + +void +XFixesChangeCursor (Display *dpy, Cursor source, Cursor destination) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesChangeCursorReq *req; + + XFixesSimpleCheckExtension (dpy, info); + if (info->major_version < 2) + return; + LockDisplay (dpy); + GetReq (XFixesChangeCursor, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesChangeCursor; + req->source = source; + req->destination = destination; + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XFixesChangeCursorByName (Display *dpy, Cursor source, const char *name) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesChangeCursorByNameReq *req; + int nbytes = strlen (name); + + XFixesSimpleCheckExtension (dpy, info); + if (info->major_version < 2) + return; + LockDisplay (dpy); + GetReq (XFixesChangeCursorByName, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesChangeCursorByName; + req->source = source; + req->nbytes = nbytes; + req->length += (nbytes + 3) >> 2; + Data (dpy, name, nbytes); + UnlockDisplay(dpy); + SyncHandle(); +} diff --git a/nx-X11/lib/Xfixes/INSTALL b/nx-X11/lib/Xfixes/INSTALL new file mode 100644 index 000000000..557b5e871 --- /dev/null +++ b/nx-X11/lib/Xfixes/INSTALL @@ -0,0 +1,8 @@ +Xfixes is built with the traditional configure script: + + $ ./configure --prefix=/usr/X11R6 + +This should generate valid Makefiles, then: + + $ make + $ make install diff --git a/nx-X11/lib/Xfixes/Imakefile b/nx-X11/lib/Xfixes/Imakefile new file mode 100644 index 000000000..c053aa2b5 --- /dev/null +++ b/nx-X11/lib/Xfixes/Imakefile @@ -0,0 +1,75 @@ +XCOMM $XdotOrg: xc/lib/Xfixes/Imakefile,v 1.1 2004/07/31 05:50:39 anholt Exp $ + +#ifndef NormalLibXfixes +#define NormalLibXfixes YES +SOXFIXESREV=3.0.0 +#endif + +#ifndef SharedLibXfixes +#define SharedLibXfixes YES +#endif + +#define DoNormalLib NormalLibXfixes +#define DoSharedLib SharedLibXfixes +#define DoDebugLib DebugLibXfixes +#define DoProfileLib ProfileLibXfixes + +#define LibName Xfixes +#define SoRev SOXFIXESREV +#define IncSubdir X11 +#define IncSubSubdir extensions + +#include <Threads.tmpl> + +#ifdef SharedXfixesReqs +REQUIREDLIBS = SharedXfixesReqs +#endif + +XFIXES_VERSION=3.0.0 + +X_LIBS=-L$(SHLIBDIR) $(XONLYLIB) +X_CFLAGS=-I$(INCROOT) $(THREADS_DEFINES) + +RPATH_CFLAG = HardCodeLibdirFlag + +SRCS = Cursor.c \ + Region.c \ + SaveSet.c \ + Selection.c \ + Xfixes.c + +OBJS = Cursor.o \ + Region.o \ + SaveSet.o \ + Selection.o \ + Xfixes.o + +HEADERS = Xfixes.h + +SUBSTVARS=prefix="$(PROJECTROOT)" \ + exec_prefix="$(BINDIR)" \ + libdir="$(USRLIBDIR)" \ + hardcode_libdir_flag_spec="$(RPATH_CFLAG)" \ + includedir="$(INCROOT)" \ + X_LIBS="$(X_LIBS)" \ + X_CFLAGS="$(X_CFLAGS)" \ + VERSION="$(XFIXES_VERSION)" + +#include <Library.tmpl> + +MANSUFFIX=$(LIBMANSUFFIX) +InstallManPage(Xfixes,$(LIBMANDIR)) + +DependTarget() + +all:: xfixes.pc + +xfixes.pc: xfixes.pc.in + RemoveFile($@) + sh ../Xcursor/config-subst $(SUBSTVARS) < xfixes.pc.in > $@ + +InstallNonExecFile(xfixes.pc,$(USRLIBDIR)/pkgconfig) + +clean:: + RemoveFile(xfixes.pc) + diff --git a/nx-X11/lib/Xfixes/Makefile.am b/nx-X11/lib/Xfixes/Makefile.am new file mode 100644 index 000000000..08598f93e --- /dev/null +++ b/nx-X11/lib/Xfixes/Makefile.am @@ -0,0 +1,56 @@ +# +# $Id: Makefile.am,v 1.1 2004/07/31 05:50:39 anholt Exp $ +# +# Copyright © 2003 Keith Packard, Noah Levitt +# +# 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. + +AM_CFLAGS = $(FIXESEXT_CFLAGS) $(X_CFLAGS) + +lib_LTLIBRARIES = libXfixes.la + +libXfixes_la_SOURCES = \ + Cursor.c \ + Region.c \ + SaveSet.c \ + Selection.c \ + Xfixes.c \ + Xfixesint.h + +libXfixes_la_LIBADD = @X_LIBS@ + +# +# Library version info. Check the libtool docs for +# instructions on when and how to change this value +# +# bump when the ABI changes +XFIXES_CURRENT=2 +# bump for non-ABI changes, reset to zero when CURRENT changes +XFIXES_REVISION=0 +# bump when the ABI changes in backward-compatible fashion +XFIXES_AGE=2 +libXfixes_la_LDFLAGS = -version-info ${XFIXES_CURRENT}:${XFIXES_REVISION}:${XFIXES_AGE} -no-undefined + +libXfixesincludedir = $(includedir)/X11/extensions +libXfixesinclude_HEADERS = Xfixes.h + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = xfixes.pc + +EXTRA_DIST = xfixes.pc.in autogen.sh diff --git a/nx-X11/lib/Xfixes/NEWS b/nx-X11/lib/Xfixes/NEWS new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/nx-X11/lib/Xfixes/NEWS diff --git a/nx-X11/lib/Xfixes/README b/nx-X11/lib/Xfixes/README new file mode 100644 index 000000000..67cf1d8be --- /dev/null +++ b/nx-X11/lib/Xfixes/README @@ -0,0 +1,10 @@ + Xfixes + XFIXES Extension + Version 2.0.1 + 2002-10-4 + +This package contains header files and documentation for the XFIXES +extension. Library and server implementations are separate. + +Keith Packard +keithp@keithp.com diff --git a/nx-X11/lib/Xfixes/Region.c b/nx-X11/lib/Xfixes/Region.c new file mode 100644 index 000000000..f4781fe9b --- /dev/null +++ b/nx-X11/lib/Xfixes/Region.c @@ -0,0 +1,441 @@ +/* + * $Id: Region.c,v 1.3 2005/07/03 07:00:56 daniels Exp $ + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xfixesint.h" + +XserverRegion +XFixesCreateRegion (Display *dpy, XRectangle *rectangles, int nrectangles) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesCreateRegionReq *req; + long len; + XserverRegion region; + + XFixesCheckExtension (dpy, info, 0); + LockDisplay (dpy); + GetReq (XFixesCreateRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesCreateRegion; + region = req->region = XAllocID (dpy); + len = ((long) nrectangles) << 1; + SetReqLen (req, len, len); + len <<= 2; + Data16 (dpy, (short *) rectangles, len); + UnlockDisplay (dpy); + SyncHandle(); + return region; +} + +XserverRegion +XFixesCreateRegionFromBitmap (Display *dpy, Pixmap bitmap) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesCreateRegionFromBitmapReq *req; + XserverRegion region; + + XFixesCheckExtension (dpy, info, 0); + LockDisplay (dpy); + GetReq (XFixesCreateRegionFromBitmap, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesCreateRegionFromBitmap; + region = req->region = XAllocID (dpy); + req->bitmap = bitmap; + UnlockDisplay (dpy); + SyncHandle(); + return region; +} + +XserverRegion +XFixesCreateRegionFromWindow (Display *dpy, Window window, int kind) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesCreateRegionFromWindowReq *req; + XserverRegion region; + + XFixesCheckExtension (dpy, info, 0); + LockDisplay (dpy); + GetReq (XFixesCreateRegionFromWindow, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesCreateRegionFromWindow; + region = req->region = XAllocID (dpy); + req->window = window; + req->kind = kind; + UnlockDisplay (dpy); + SyncHandle(); + return region; +} + +XserverRegion +XFixesCreateRegionFromGC (Display *dpy, GC gc) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesCreateRegionFromGCReq *req; + XserverRegion region; + + XFixesCheckExtension (dpy, info, 0); + LockDisplay (dpy); + GetReq (XFixesCreateRegionFromGC, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesCreateRegionFromGC; + region = req->region = XAllocID (dpy); + req->gc = gc->gid; + UnlockDisplay (dpy); + SyncHandle(); + return region; +} + +XserverRegion +XFixesCreateRegionFromPicture (Display *dpy, XID picture) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesCreateRegionFromPictureReq *req; + XserverRegion region; + + XFixesCheckExtension (dpy, info, 0); + LockDisplay (dpy); + GetReq (XFixesCreateRegionFromPicture, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesCreateRegionFromPicture; + region = req->region = XAllocID (dpy); + req->picture = picture; + UnlockDisplay (dpy); + SyncHandle(); + return region; +} + +void +XFixesDestroyRegion (Display *dpy, XserverRegion region) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesDestroyRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesDestroyRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesDestroyRegion; + req->region = region; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesSetRegion (Display *dpy, XserverRegion region, + XRectangle *rectangles, int nrectangles) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSetRegionReq *req; + long len; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesSetRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSetRegion; + req->region = region; + len = ((long) nrectangles) << 1; + SetReqLen (req, len, len); + len <<= 2; + Data16 (dpy, (short *) rectangles, len); + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesCopyRegion (Display *dpy, XserverRegion dst, XserverRegion src) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesCopyRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesCopyRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesCopyRegion; + req->source = src; + req->destination = dst; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesUnionRegion (Display *dpy, XserverRegion dst, + XserverRegion src1, XserverRegion src2) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesUnionRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesUnionRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesUnionRegion; + req->source1 = src1; + req->source2 = src2; + req->destination = dst; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesIntersectRegion (Display *dpy, XserverRegion dst, + XserverRegion src1, XserverRegion src2) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesIntersectRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesIntersectRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesIntersectRegion; + req->source1 = src1; + req->source2 = src2; + req->destination = dst; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesSubtractRegion (Display *dpy, XserverRegion dst, + XserverRegion src1, XserverRegion src2) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSubtractRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesSubtractRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSubtractRegion; + req->source1 = src1; + req->source2 = src2; + req->destination = dst; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesInvertRegion (Display *dpy, XserverRegion dst, + XRectangle *rect, XserverRegion src) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesInvertRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesInvertRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesInvertRegion; + req->source = src; + req->destination = dst; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesTranslateRegion (Display *dpy, XserverRegion region, int dx, int dy) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesTranslateRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesTranslateRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesTranslateRegion; + req->region = region; + req->dx = dx; + req->dy = dy; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesRegionExtents (Display *dpy, XserverRegion dst, XserverRegion src) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesRegionExtentsReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesRegionExtents, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesRegionExtents; + req->source = src; + req->destination = dst; + UnlockDisplay (dpy); + SyncHandle(); +} + +XRectangle * +XFixesFetchRegion (Display *dpy, XserverRegion region, int *nrectanglesRet) +{ + XRectangle bounds; + + return XFixesFetchRegionAndBounds (dpy, region, nrectanglesRet, &bounds); +} + +XRectangle * +XFixesFetchRegionAndBounds (Display *dpy, + XserverRegion region, + int *nrectanglesRet, + XRectangle *bounds) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesFetchRegionReq *req; + xXFixesFetchRegionReply rep; + XRectangle *rects; + int nrects; + long nbytes; + long nread; + + XFixesCheckExtension (dpy, info, 0); + LockDisplay (dpy); + GetReq (XFixesFetchRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesFetchRegion; + req->region = region; + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) + { + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + bounds->x = rep.x; + bounds->y = rep.y; + bounds->width = rep.width; + bounds->height = rep.height; + nbytes = (long) rep.length << 2; + nrects = rep.length >> 1; + nread = nrects << 3; + rects = Xmalloc (nrects * sizeof (XRectangle)); + if (!rects) + { + _XEatData (dpy, nbytes); + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + _XRead16 (dpy, (short *) rects, nrects << 3); + /* skip any padding */ + if(nbytes > nread) + { + _XEatData (dpy, (unsigned long) (nbytes - nread)); + } + UnlockDisplay (dpy); + SyncHandle(); + *nrectanglesRet = nrects; + return rects; +} + +void +XFixesSetGCClipRegion (Display *dpy, GC gc, + int clip_x_origin, int clip_y_origin, + XserverRegion region) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSetGCClipRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesSetGCClipRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSetGCClipRegion; + req->gc = gc->gid; + req->region = region; + req->xOrigin = clip_x_origin; + req->yOrigin = clip_y_origin; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesSetWindowShapeRegion (Display *dpy, Window win, int shape_kind, + int x_off, int y_off, XserverRegion region) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSetWindowShapeRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesSetWindowShapeRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSetWindowShapeRegion; + req->dest = win; + req->destKind = shape_kind; + req->xOff = x_off; + req->yOff = y_off; + req->region = region; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesSetPictureClipRegion (Display *dpy, XID picture, + int clip_x_origin, int clip_y_origin, + XserverRegion region) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSetPictureClipRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesSetPictureClipRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSetPictureClipRegion; + req->picture = picture; + req->region = region; + req->xOrigin = clip_x_origin; + req->yOrigin = clip_y_origin; + UnlockDisplay (dpy); + SyncHandle(); +} + +void +XFixesExpandRegion (Display *dpy, XserverRegion dst, XserverRegion src, + unsigned left, unsigned right, + unsigned top, unsigned bottom) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesExpandRegionReq *req; + + XFixesSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq (XFixesExpandRegion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesExpandRegion; + req->source = src; + req->destination = dst; + req->left = left; + req->right = right; + req->top = top; + req->bottom = bottom; + UnlockDisplay (dpy); + SyncHandle(); +} + diff --git a/nx-X11/lib/Xfixes/SaveSet.c b/nx-X11/lib/Xfixes/SaveSet.c new file mode 100644 index 000000000..c5b73f9c9 --- /dev/null +++ b/nx-X11/lib/Xfixes/SaveSet.c @@ -0,0 +1,48 @@ +/* + * $XFree86: xc/lib/Xfixes/SaveSet.c,v 1.1 2002/11/30 18:41:33 keithp Exp $ + * + * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xfixesint.h" + +void +XFixesChangeSaveSet (Display *dpy, Window win, int mode, int target, int map) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesChangeSaveSetReq *req; + + XFixesSimpleCheckExtension (dpy, info); + + LockDisplay (dpy); + GetReq (XFixesChangeSaveSet, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesChangeSaveSet; + req->mode = mode; + req->target = target; + req->map = map; + req->window = win; + UnlockDisplay (dpy); + SyncHandle (); +} diff --git a/nx-X11/lib/Xfixes/Selection.c b/nx-X11/lib/Xfixes/Selection.c new file mode 100644 index 000000000..888dc84f0 --- /dev/null +++ b/nx-X11/lib/Xfixes/Selection.c @@ -0,0 +1,50 @@ +/* + * $XFree86: xc/lib/Xfixes/Selection.c,v 1.1 2002/11/30 06:21:45 keithp Exp $ + * + * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xfixesint.h" + +void +XFixesSelectSelectionInput (Display *dpy, + Window win, + Atom selection, + unsigned long eventMask) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + xXFixesSelectSelectionInputReq *req; + + XFixesSimpleCheckExtension (dpy, info); + + LockDisplay (dpy); + GetReq (XFixesSelectSelectionInput, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesSelectSelectionInput; + req->window = win; + req->selection = selection; + req->eventMask = eventMask; + UnlockDisplay (dpy); + SyncHandle (); +} diff --git a/nx-X11/lib/Xfixes/Xfixes-def.cpp b/nx-X11/lib/Xfixes/Xfixes-def.cpp new file mode 100644 index 000000000..bbab58858 --- /dev/null +++ b/nx-X11/lib/Xfixes/Xfixes-def.cpp @@ -0,0 +1,10 @@ +LIBRARY Xfixes +VERSION LIBRARY_VERSION +EXPORTS + XFixesQueryExtension + XFixesQueryVersion + XFixesChangeSaveSet + XFixesSelectSelectionInput + XFixesSelectCursorInput + XFixesGetCursorImage +/* $XFree86: xc/lib/Xfixes/Xfixes-def.cpp,v 1.1 2002/11/30 06:21:45 keithp Exp $ */ diff --git a/nx-X11/lib/Xfixes/Xfixes.c b/nx-X11/lib/Xfixes/Xfixes.c new file mode 100644 index 000000000..e4dfd05de --- /dev/null +++ b/nx-X11/lib/Xfixes/Xfixes.c @@ -0,0 +1,333 @@ +/* + * $XFree86: xc/lib/Xfixes/Xfixes.c,v 1.1 2002/11/30 06:21:45 keithp Exp $ + * + * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xfixesint.h" + +XFixesExtInfo XFixesExtensionInfo; +char XFixesExtensionName[] = XFIXES_NAME; + +static int +XFixesCloseDisplay (Display *dpy, XExtCodes *codes); + +static Bool +XFixesWireToEvent(Display *dpy, XEvent *event, xEvent *wire); + +static Status +XFixesEventToWire(Display *dpy, XEvent *event, xEvent *wire); + +/* + * XFixesExtAddDisplay - add a display to this extension. (Replaces + * XextAddDisplay) + */ +static XFixesExtDisplayInfo * +XFixesExtAddDisplay (XFixesExtInfo *extinfo, + Display *dpy, + char *ext_name) +{ + XFixesExtDisplayInfo *info; + int ev; + + info = (XFixesExtDisplayInfo *) Xmalloc (sizeof (XFixesExtDisplayInfo)); + if (!info) return NULL; + info->display = dpy; + + info->codes = XInitExtension (dpy, ext_name); + + /* + * if the server has the extension, then we can initialize the + * appropriate function vectors + */ + if (info->codes) { + xXFixesQueryVersionReply rep; + xXFixesQueryVersionReq *req; + XESetCloseDisplay (dpy, info->codes->extension, + XFixesCloseDisplay); + for (ev = info->codes->first_event; + ev < info->codes->first_event + XFixesNumberEvents; + ev++) + { + XESetWireToEvent (dpy, ev, XFixesWireToEvent); + XESetEventToWire (dpy, ev, XFixesEventToWire); + } + /* + * Get the version info + */ + LockDisplay (dpy); + GetReq (XFixesQueryVersion, req); + req->reqType = info->codes->major_opcode; + req->xfixesReqType = X_XFixesQueryVersion; + req->majorVersion = XFIXES_MAJOR; + req->minorVersion = XFIXES_MINOR; + if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) + { + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + info->major_version = rep.majorVersion; + info->minor_version = rep.minorVersion; + UnlockDisplay (dpy); + } else { + /* The server doesn't have this extension. + * Use a private Xlib-internal extension to hang the close_display + * hook on so that the "cache" (extinfo->cur) is properly cleaned. + * (XBUG 7955) + */ + XExtCodes *codes = XAddExtension(dpy); + if (!codes) { + XFree(info); + return NULL; + } + XESetCloseDisplay (dpy, codes->extension, XFixesCloseDisplay); + } + + /* + * now, chain it onto the list + */ + _XLockMutex(_Xglobal_lock); + info->next = extinfo->head; + extinfo->head = info; + extinfo->cur = info; + extinfo->ndisplays++; + _XUnlockMutex(_Xglobal_lock); + return info; +} + + +/* + * XFixesExtRemoveDisplay - remove the indicated display from the + * extension object. (Replaces XextRemoveDisplay.) + */ +static int +XFixesExtRemoveDisplay (XFixesExtInfo *extinfo, Display *dpy) +{ + XFixesExtDisplayInfo *info, *prev; + + /* + * locate this display and its back link so that it can be removed + */ + _XLockMutex(_Xglobal_lock); + prev = NULL; + for (info = extinfo->head; info; info = info->next) { + if (info->display == dpy) break; + prev = info; + } + if (!info) { + _XUnlockMutex(_Xglobal_lock); + return 0; /* hmm, actually an error */ + } + + /* + * remove the display from the list; handles going to zero + */ + if (prev) + prev->next = info->next; + else + extinfo->head = info->next; + + extinfo->ndisplays--; + if (info == extinfo->cur) extinfo->cur = NULL; /* flush cache */ + _XUnlockMutex(_Xglobal_lock); + + Xfree ((char *) info); + return 1; +} + +/* + * XFixesExtFindDisplay - look for a display in this extension; keeps a + * cache of the most-recently used for efficiency. (Replaces + * XextFindDisplay.) + */ +static XFixesExtDisplayInfo * +XFixesExtFindDisplay (XFixesExtInfo *extinfo, + Display *dpy) +{ + XFixesExtDisplayInfo *info; + + /* + * see if this was the most recently accessed display + */ + if ((info = extinfo->cur) && info->display == dpy) + return info; + + /* + * look for display in list + */ + _XLockMutex(_Xglobal_lock); + for (info = extinfo->head; info; info = info->next) { + if (info->display == dpy) { + extinfo->cur = info; /* cache most recently used */ + _XUnlockMutex(_Xglobal_lock); + return info; + } + } + _XUnlockMutex(_Xglobal_lock); + + return NULL; +} + +XFixesExtDisplayInfo * +XFixesFindDisplay (Display *dpy) +{ + XFixesExtDisplayInfo *info; + + info = XFixesExtFindDisplay (&XFixesExtensionInfo, dpy); + if (!info) + info = XFixesExtAddDisplay (&XFixesExtensionInfo, dpy, + XFixesExtensionName); + return info; +} + +static int +XFixesCloseDisplay (Display *dpy, XExtCodes *codes) +{ + return XFixesExtRemoveDisplay (&XFixesExtensionInfo, dpy); +} + +static Bool +XFixesWireToEvent(Display *dpy, XEvent *event, xEvent *wire) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay(dpy); + + XFixesCheckExtension(dpy, info, False); + + switch ((wire->u.u.type & 0x7F) - info->codes->first_event) + { + case XFixesSelectionNotify: { + XFixesSelectionNotifyEvent *aevent; + xXFixesSelectionNotifyEvent *awire; + awire = (xXFixesSelectionNotifyEvent *) wire; + aevent = (XFixesSelectionNotifyEvent *) event; + aevent->type = awire->type & 0x7F; + aevent->subtype = awire->subtype; + aevent->serial = _XSetLastRequestRead(dpy, + (xGenericReply *) wire); + aevent->send_event = (awire->type & 0x80) != 0; + aevent->display = dpy; + aevent->window = awire->window; + aevent->owner = awire->owner; + aevent->selection = awire->selection; + aevent->timestamp = awire->timestamp; + aevent->selection_timestamp = awire->selectionTimestamp; + return True; + } + case XFixesCursorNotify: { + XFixesCursorNotifyEvent *aevent; + xXFixesCursorNotifyEvent *awire; + awire = (xXFixesCursorNotifyEvent *) wire; + aevent = (XFixesCursorNotifyEvent *) event; + aevent->type = awire->type & 0x7F; + aevent->subtype = awire->subtype; + aevent->serial = _XSetLastRequestRead(dpy, + (xGenericReply *) wire); + aevent->send_event = (awire->type & 0x80) != 0; + aevent->display = dpy; + aevent->window = awire->window; + aevent->cursor_serial = awire->cursorSerial; + aevent->timestamp = awire->timestamp; + aevent->cursor_name = awire->name; + return True; + } + } + return False; +} + +static Status +XFixesEventToWire(Display *dpy, XEvent *event, xEvent *wire) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay(dpy); + + XFixesCheckExtension(dpy, info, False); + + switch ((event->type & 0x7F) - info->codes->first_event) + { + case XFixesSelectionNotify: { + XFixesSelectionNotifyEvent *aevent; + xXFixesSelectionNotifyEvent *awire; + awire = (xXFixesSelectionNotifyEvent *) wire; + aevent = (XFixesSelectionNotifyEvent *) event; + awire->type = aevent->type | (aevent->send_event ? 0x80 : 0); + awire->subtype = aevent->subtype; + awire->window = aevent->window; + awire->owner = aevent->owner; + awire->selection = aevent->selection; + awire->timestamp = aevent->timestamp; + awire->selectionTimestamp = aevent->selection_timestamp; + return True; + } + case XFixesCursorNotify: { + XFixesCursorNotifyEvent *aevent; + xXFixesCursorNotifyEvent *awire; + awire = (xXFixesCursorNotifyEvent *) wire; + aevent = (XFixesCursorNotifyEvent *) event; + awire->type = aevent->type | (aevent->send_event ? 0x80 : 0); + awire->subtype = aevent->subtype; + awire->window = aevent->window; + awire->timestamp = aevent->timestamp; + awire->cursorSerial = aevent->cursor_serial; + awire->name = aevent->cursor_name; + } + } + return False; +} + +Bool +XFixesQueryExtension (Display *dpy, int *event_basep, int *error_basep) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + + if (XFixesHasExtension(info)) + { + *event_basep = info->codes->first_event; + *error_basep = info->codes->first_error; + return True; + } + else + return False; +} + +Status +XFixesQueryVersion (Display *dpy, + int *major_versionp, + int *minor_versionp) +{ + XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy); + + XFixesCheckExtension (dpy, info, 0); + + *major_versionp = info->major_version; + *minor_versionp = info->minor_version; + UnlockDisplay (dpy); + SyncHandle (); + return 1; +} + +int +XFixesVersion (void) +{ + return XFIXES_VERSION; +} diff --git a/nx-X11/lib/Xfixes/Xfixes.h b/nx-X11/lib/Xfixes/Xfixes.h new file mode 100644 index 000000000..28ca28f1a --- /dev/null +++ b/nx-X11/lib/Xfixes/Xfixes.h @@ -0,0 +1,220 @@ +/* + * $XFree86: xc/lib/Xfixes/Xfixes.h,v 1.1 2002/11/30 06:21:45 keithp Exp $ + * + * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. + * + * 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 _XFIXES_H_ +#define _XFIXES_H_ + +#include <X11/extensions/xfixeswire.h> + +#include <X11/Xfuncproto.h> + +/* + * This revision number also appears in configure.ac, they have + * to be manually synchronized + */ +#define XFIXES_REVISION 1 +#define XFIXES_VERSION ((XFIXES_MAJOR * 10000) + (XFIXES_MINOR * 100) + (XFIXES_REVISION)) + +typedef struct { + int type; /* event base */ + unsigned long serial; + Bool send_event; + Display *display; + Window window; + int subtype; + Window owner; + Atom selection; + Time timestamp; + Time selection_timestamp; +} XFixesSelectionNotifyEvent; + +typedef struct { + int type; /* event base */ + unsigned long serial; + Bool send_event; + Display *display; + Window window; + int subtype; + unsigned long cursor_serial; + Time timestamp; + Atom cursor_name; +} XFixesCursorNotifyEvent; + +typedef struct { + short x, y; + unsigned short width, height; + unsigned short xhot, yhot; + unsigned long cursor_serial; + unsigned long *pixels; +#if XFIXES_MAJOR >= 2 + Atom atom; /* Version >= 2 only */ + const char *name; /* Version >= 2 only */ +#endif +} XFixesCursorImage; + +#if XFIXES_MAJOR >= 2 +/* Version 2 types */ + +typedef XID XserverRegion; + +typedef struct { + short x, y; + unsigned short width, height; + unsigned short xhot, yhot; + unsigned long cursor_serial; + unsigned long *pixels; + Atom atom; + const char *name; +} XFixesCursorImageAndName; + +#endif + +_XFUNCPROTOBEGIN + +Bool XFixesQueryExtension (Display *dpy, int *event_basep, int *error_basep); +Status XFixesQueryVersion (Display *dpy, + int *major_versionp, + int *minor_versionp); + +int XFixesVersion (void); + +void +XFixesChangeSaveSet (Display *dpy, + Window win, + int mode, + int target, + int map); + +void +XFixesSelectSelectionInput (Display *dpy, + Window win, + Atom selection, + unsigned long eventMask); + +void +XFixesSelectCursorInput (Display *dpy, + Window win, + unsigned long eventMask); + +XFixesCursorImage * +XFixesGetCursorImage (Display *dpy); + +#if XFIXES_MAJOR >= 2 +/* Version 2 functions */ + +XserverRegion +XFixesCreateRegion (Display *dpy, XRectangle *rectangles, int nrectangles); + +XserverRegion +XFixesCreateRegionFromBitmap (Display *dpy, Pixmap bitmap); + +XserverRegion +XFixesCreateRegionFromWindow (Display *dpy, Window window, int kind); + +XserverRegion +XFixesCreateRegionFromGC (Display *dpy, GC gc); + +XserverRegion +XFixesCreateRegionFromPicture (Display *dpy, XID picture); + +void +XFixesDestroyRegion (Display *dpy, XserverRegion region); + +void +XFixesSetRegion (Display *dpy, XserverRegion region, + XRectangle *rectangles, int nrectangles); + +void +XFixesCopyRegion (Display *dpy, XserverRegion dst, XserverRegion src); + +void +XFixesUnionRegion (Display *dpy, XserverRegion dst, + XserverRegion src1, XserverRegion src2); + +void +XFixesIntersectRegion (Display *dpy, XserverRegion dst, + XserverRegion src1, XserverRegion src2); + +void +XFixesSubtractRegion (Display *dpy, XserverRegion dst, + XserverRegion src1, XserverRegion src2); + +void +XFixesInvertRegion (Display *dpy, XserverRegion dst, + XRectangle *rect, XserverRegion src); + +void +XFixesTranslateRegion (Display *dpy, XserverRegion region, int dx, int dy); + +void +XFixesRegionExtents (Display *dpy, XserverRegion dst, XserverRegion src); + +XRectangle * +XFixesFetchRegion (Display *dpy, XserverRegion region, int *nrectanglesRet); + +XRectangle * +XFixesFetchRegionAndBounds (Display *dpy, XserverRegion region, + int *nrectanglesRet, + XRectangle *bounds); + +void +XFixesSetGCClipRegion (Display *dpy, GC gc, + int clip_x_origin, int clip_y_origin, + XserverRegion region); + +void +XFixesSetWindowShapeRegion (Display *dpy, Window win, int shape_kind, + int x_off, int y_off, XserverRegion region); + +void +XFixesSetPictureClipRegion (Display *dpy, XID picture, + int clip_x_origin, int clip_y_origin, + XserverRegion region); + +void +XFixesSetCursorName (Display *dpy, Cursor cursor, const char *name); + +const char * +XFixesGetCursorName (Display *dpy, Cursor cursor, Atom *atom); + +void +XFixesChangeCursor (Display *dpy, Cursor source, Cursor destination); + +void +XFixesChangeCursorByName (Display *dpy, Cursor source, const char *name); + +#endif /* XFIXES_MAJOR >= 2 */ + +#if XFIXES_MAJOR >= 3 + +void +XFixesExpandRegion (Display *dpy, XserverRegion dst, XserverRegion src, + unsigned left, unsigned right, + unsigned top, unsigned bottom); + +#endif /* XFIXES_MAJOR >= 3 */ + +_XFUNCPROTOEND + +#endif /* _XFIXES_H_ */ diff --git a/nx-X11/lib/Xfixes/Xfixes.man b/nx-X11/lib/Xfixes/Xfixes.man new file mode 100644 index 000000000..f081cc54e --- /dev/null +++ b/nx-X11/lib/Xfixes/Xfixes.man @@ -0,0 +1,76 @@ +.\" +.\" $XFree86: xc/lib/Xfixes/Xfixes.man,v 1.1 2002/11/30 06:21:45 keithp Exp $ +.\" +.\" Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. +.\" +.\" 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. +.\" +.de TQ +.br +.ns +.TP \\$1 +.. +.TH XFIXES 3 "Version 1.0" "XFree86" + +.SH NAME +XFixes \- Augmented versions of core protocol requests +.SH SYNTAX +\&#include <X11/extensions/Xfixes.h> +.nf +.sp +Bool XFixesQueryExtension \^(\^Display *\fIdpy\fP, + int *\fIevent_basep\fP, int *\fIerror_basep\fP\^); +.sp +Status XFixesQueryVersion \^(\^Display *\fIdpy\fP, + int *\fImajor_versionp\fP, + int *\fIminor_versionp\fP\^); +.sp +void XFixesChangeSaveSet \^(\^Display *dpy, + Window \fIwindow\fP, + int \fImode\fP, + int \fItarget\fP, + int \fImap\fP); +.fi +.SH ARGUMENTS +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIwindow\fP 1i +Specifies which window. +.IP \fImode\fP 1i +Specifies the save set operation (SetModeInsert/SetModeDelete). +.IP \fItarget\fP 1i +Specifies the target when executing the save set +(SaveSetNearest/SaveSetRoot). In SaveSetNearest mode, the save set member +window will be reparented to the nearest window not owned by the save set +client. In SaveSetRoot mode, the save set member window will be reparented +to the root window. +.IP \fImap\fP 1i +Specifies the map mode (SaveSetMap/SaveSetUnmap) which selects whether the +save setmember window will be mapped or unmapped during save set processing. +.SH DESCRIPTION +.B Xfixes +is a simple library designed to interface the X Fixes +Extension. This extension provides application with work arounds for +various limitations in the core protocol. +.SH RESTRICTIONS +.B Xfixes +will remain upward compatible after the current 1.0 release. +.SH AUTHORS +Keith Packard, member of the XFree86 Project, Inc. and +HP, Owen Taylor, member of the Gnome Foundation and Redhat, Inc. diff --git a/nx-X11/lib/Xfixes/Xfixesint.h b/nx-X11/lib/Xfixes/Xfixesint.h new file mode 100644 index 000000000..e227571be --- /dev/null +++ b/nx-X11/lib/Xfixes/Xfixesint.h @@ -0,0 +1,68 @@ +/* + * $XFree86: xc/lib/Xfixes/Xfixesint.h,v 1.1 2002/11/30 06:21:45 keithp Exp $ + * + * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. + * + * 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 _XFIXESINT_H_ +#define _XFIXESINT_H_ + +#define NEED_EVENTS +#define NEED_REPLIES +#include <stdio.h> +#include <X11/Xlib.h> +#include <X11/Xlibint.h> +#include <X11/Xutil.h> +#include "Xfixes.h" +#include <X11/extensions/xfixesproto.h> + +extern char XFixesExtensionName[]; + +typedef struct _XFixesExtDisplayInfo { + struct _XFixesExtDisplayInfo *next; /* keep a linked list */ + Display *display; /* which display this is */ + XExtCodes *codes; /* the extension protocol codes */ + int major_version; /* -1 means we don't know */ + int minor_version; /* -1 means we don't know */ +} XFixesExtDisplayInfo; + +/* replaces XExtensionInfo */ +typedef struct _XFixesExtInfo { + XFixesExtDisplayInfo *head; /* start of the list */ + XFixesExtDisplayInfo *cur; /* most recently used */ + int ndisplays; /* number of displays */ +} XFixesExtInfo; + +extern XFixesExtInfo XFixesExtensionInfo; +extern char XFixesExtensionName[]; + +XFixesExtDisplayInfo * +XFixesFindDisplay (Display *dpy); + +#define XFixesHasExtension(i) ((i) && ((i)->codes)) + +#define XFixesCheckExtension(dpy,i,val) \ + if (!XFixesHasExtension(i)) { return val; } + +#define XFixesSimpleCheckExtension(dpy,i) \ + if (!XFixesHasExtension(i)) { return; } + +#endif /* _XFIXESINT_H_ */ diff --git a/nx-X11/lib/Xfixes/autogen.sh b/nx-X11/lib/Xfixes/autogen.sh new file mode 100755 index 000000000..b1376df5a --- /dev/null +++ b/nx-X11/lib/Xfixes/autogen.sh @@ -0,0 +1,3 @@ +#! /bin/sh +autoreconf -v --install || exit 1 +./configure --enable-maintainer-mode "$@" diff --git a/nx-X11/lib/Xfixes/configure.ac b/nx-X11/lib/Xfixes/configure.ac new file mode 100644 index 000000000..37b123516 --- /dev/null +++ b/nx-X11/lib/Xfixes/configure.ac @@ -0,0 +1,99 @@ +dnl +dnl $Id: configure.ac,v 1.1 2004/07/31 05:50:39 anholt Exp $ +dnl +dnl Copyright © 2003 Keith Packard, Noah Levitt +dnl +dnl Permission to use, copy, modify, distribute, and sell this software and its +dnl documentation for any purpose is hereby granted without fee, provided that +dnl the above copyright notice appear in all copies and that both that +dnl copyright notice and this permission notice appear in supporting +dnl documentation, and that the name of Keith Packard not be used in +dnl advertising or publicity pertaining to distribution of the software without +dnl specific, written prior permission. Keith Packard makes no +dnl representations about the suitability of this software for any purpose. It +dnl is provided "as is" without express or implied warranty. +dnl +dnl KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +dnl EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +dnl DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +dnl TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +dnl PERFORMANCE OF THIS SOFTWARE. +dnl +dnl Process this file with autoconf to create configure. + +AC_PREREQ([2.57]) + +dnl +dnl Version should match the current XFixes version. XFixesQueryVersion +dnl returns the version from xfixeswire.h, NOT the version we set here. But we +dnl try to keep these the same. Note that the library has an extra +dnl digit in the version number to track changes which don't affect the +dnl protocol, so Xfixes version l.n.m corresponds to protocol version l.n, +dnl that 'revision' number appears in Xfixes.h and has to be manually +dnl synchronized. +dnl +AC_INIT(libXfixes, 3.0.0, [keithp@keithp.com], libXfixes) +AM_INIT_AUTOMAKE([dist-bzip2]) +AM_MAINTAINER_MODE + +AM_CONFIG_HEADER(config.h) +AC_CONFIG_AUX_DIR(.) + +# Check for progs +AC_PROG_CC +AC_PROG_LIBTOOL + +# Check for X +PKG_CHECK_MODULES(X, x11, + [x_found_with_pkgconfig=yes], + [x_found_with_pkgconfig=no]) +AC_SUBST(X_CFLAGS) +AC_SUBST(X_LIBS) + +if test "$x_found_with_pkgconfig" = "no" +then + AC_PATH_XTRA + X_LIBS="$X_LIBS -lX11" + + if test "x$no_x" = "xyes" + then + AC_MSG_ERROR([X is required, but it was either disabled or not found.]) + fi + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $X_CFLAGS" + LIBS="$LIBS $X_LIBS" + + AC_MSG_CHECKING([for XTHREADS in Xlib]) + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([[#include <X11/Xlib.h>]], + [[return XInitThreads() == 0 ? 0 : 1;]])], + [xthreads=no], + [xthreads=yes], + [xthreads=yes]) + + AC_MSG_RESULT($xthreads) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + if test "x$xthreads" = "xyes" + then + X_CFLAGS="$X_CFLAGS -DXTHREADS" + fi +fi + +# Check fixesext configuration, strip extra digits from package version to +# find the required protocol version + +FIXESEXT_VERSION=[`echo $VERSION | sed 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/'`] +PKG_CHECK_MODULES(FIXESEXT, [fixesext >= $FIXESEXT_VERSION]) +AC_SUBST(FIXESEXT_CFLAGS) +AC_SUBST(FIXESEXT_LIBS) + +AC_OUTPUT([Makefile + xfixes.pc]) + diff --git a/nx-X11/lib/Xfixes/xfixes.pc.in b/nx-X11/lib/Xfixes/xfixes.pc.in new file mode 100644 index 000000000..6180ea371 --- /dev/null +++ b/nx-X11/lib/Xfixes/xfixes.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Xfixes +Description: X Fixes Library +Version: @VERSION@ +Cflags: -I${includedir} @X_CFLAGS@ +Libs: -L${libdir} -lXfixes @X_LIBS@ |