geext.h revision 6747b715
14642e01fSmrg/*
24642e01fSmrg
34642e01fSmrgCopyright 2007 Peter Hutterer <peter@cs.unisa.edu.au>
44642e01fSmrg
54642e01fSmrgPermission to use, copy, modify, distribute, and sell this software and its
64642e01fSmrgdocumentation for any purpose is hereby granted without fee, provided that
74642e01fSmrgthe above copyright notice appear in all copies and that both that
84642e01fSmrgcopyright notice and this permission notice appear in supporting
94642e01fSmrgdocumentation.
104642e01fSmrg
114642e01fSmrgThe above copyright notice and this permission notice shall be included
124642e01fSmrgin all copies or substantial portions of the Software.
134642e01fSmrg
144642e01fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
154642e01fSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
164642e01fSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
174642e01fSmrgIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
184642e01fSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
194642e01fSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
204642e01fSmrgOTHER DEALINGS IN THE SOFTWARE.
214642e01fSmrg
224642e01fSmrgExcept as contained in this notice, the name of the author shall
234642e01fSmrgnot be used in advertising or otherwise to promote the sale, use or
244642e01fSmrgother dealings in this Software without prior written authorization
254642e01fSmrgfrom the author.
264642e01fSmrg
274642e01fSmrg*/
284642e01fSmrg
294642e01fSmrg#ifdef HAVE_DIX_CONFIG_H
304642e01fSmrg#include <dix-config.h>
314642e01fSmrg#endif
324642e01fSmrg
334642e01fSmrg#ifndef _GEEXT_H_
344642e01fSmrg#define _GEEXT_H_
354642e01fSmrg#include <X11/extensions/geproto.h>
364642e01fSmrg
376747b715Smrg/** Struct to keep information about registered extensions */
384642e01fSmrgtypedef struct _GEExtension {
396747b715Smrg    /** Event swapping routine */
404642e01fSmrg    void (*evswap)(xGenericEvent* from, xGenericEvent* to);
414642e01fSmrg} GEExtension, *GEExtensionPtr;
424642e01fSmrg
434642e01fSmrg
444642e01fSmrg/* All registered extensions and their handling functions. */
456747b715Smrgextern _X_EXPORT GEExtension GEExtensions[MAXEXTENSIONS];
464642e01fSmrg
476747b715Smrg/* Typecast to generic event */
486747b715Smrg#define GEV(ev) ((xGenericEvent*)(ev))
494642e01fSmrg/* Returns the extension offset from the event */
506747b715Smrg#define GEEXT(ev) (GEV(ev)->extension)
514642e01fSmrg
526747b715Smrg/* Return zero-based extension offset (offset - 128). Only for use in arrays */
534642e01fSmrg#define GEEXTIDX(ev) (GEEXT(ev) & 0x7F)
544642e01fSmrg/* True if mask is set for extension on window */
554642e01fSmrg#define GEMaskIsSet(pWin, extension, mask) \
564642e01fSmrg    ((pWin)->optional && \
574642e01fSmrg     (pWin)->optional->geMasks && \
584642e01fSmrg     ((pWin)->optional->geMasks->eventMasks[(extension) & 0x7F] & (mask)))
594642e01fSmrg
604642e01fSmrg/* Returns first client */
614642e01fSmrg#define GECLIENT(pWin) \
624642e01fSmrg    (((pWin)->optional) ? (pWin)->optional->geMasks->geClients : NULL)
634642e01fSmrg
644642e01fSmrg/* Returns the event_fill for the given event */
654642e01fSmrg#define GEEventFill(ev) \
666747b715Smrg    GEExtensions[GEEXTIDX(ev)].evfill
674642e01fSmrg
684642e01fSmrg#define GEIsType(ev, ext, ev_type) \
696747b715Smrg        ((GEV(ev)->type == GenericEvent) &&  \
706747b715Smrg         GEEXT(ev) == (ext) && \
716747b715Smrg         GEV(ev)->evtype == (ev_type))
724642e01fSmrg
734642e01fSmrg
744642e01fSmrg/* Interface for other extensions */
756747b715Smrgextern _X_EXPORT void GERegisterExtension(
764642e01fSmrg        int extension,
776747b715Smrg        void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to));
784642e01fSmrg
796747b715Smrgextern _X_EXPORT void GEInitEvent(xGenericEvent* ev, int extension);
804642e01fSmrg
816747b715Smrgextern _X_EXPORT void GEExtensionInit(void);
824642e01fSmrg
834642e01fSmrg#endif /* _GEEXT_H_ */
84