e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz/* Copyright (c) 1993, 2015, Oracle and/or its affiliates. All rights reserved.
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Permission is hereby granted, free of charge, to any person obtaining a
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg * copy of this software and associated documentation files (the "Software"),
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen * to deal in the Software without restriction, including without limitation
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * the rights to use, copy, modify, merge, publish, distribute, sublicense,
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * and/or sell copies of the Software, and to permit persons to whom the
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Software is furnished to do so, subject to the following conditions:
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * The above copyright notice and this permission notice (including the next
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * paragraph) shall be included in all copies or substantial portions of the
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Software.
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen * DEALINGS IN THE SOFTWARE.
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk */
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#ifndef _DGA_INTERNAL_H
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#define _DGA_INTERNAL_H
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk/*
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk * dga_internal.h - Sun Direct Graphics Access interface internal include file
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz/* Note that _Dga_window, _Dga_cmap, _Dga_pixmap are all internal declarations
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * for the externally visible Dga_window, Dga_cmap and Dga_pixmap ( no leading
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * underscore). In the externally visible include file, these are all declared
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg * as void * and thus quite opaque.
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Note: there is a DGA_FAST_DRAW_LOCK() macro that also access the
39a897cf2c4e5c0208d081fe7d51dc893b5c33d1Liam P. White * fields in struct dga_window and dga_pixmap but is not currently in dga.h.
3cddc158875c47546688b0746fb0f36a8b71a299Liam P. White * Consider this macro before modifying fields.
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz*/
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruztypedef u_int *Dga_lockp;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruztypedef struct dga_mbufset *DgaMbufSetPtr;
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg/* used only to get at the drawable type. After that, we vector off
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg to either a window or pixmap routine */
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdgtypedef struct dga_drawable {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int drawable_type; /* pointer to drawable type */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz} *_Dga_drawable;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruztypedef struct dga_window {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int drawable_type; /* pointer to drawable type */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_chngcnt; /* last recorded window change count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_chngcnt_p; /* ptr to server's global change cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int w_lockcnt; /* lock count for nested locks */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz Dga_lockp w_lockp; /* pointer to lock page */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz Dga_lockp w_unlockp; /* points to unlock page */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#ifdef MT
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz mutex_t *mutexp; /* points to drawable's mutex */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#else
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int (*w_lock_func)(); /* alternate function for locking */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#endif
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int (*w_unlock_func)(Dga_drawable); /* alternate func for unlocking */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int (*w_update_func)(Dga_drawable);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int w_modif; /* cached result of update check */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_wm_chngcnt[17]; /* last recorded global change counts */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *w_wm_2nd; /* Ptr to second entry in wm_chngcnt[]*/
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *w_info; /* pointer to shared memory */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_clipseq; /* last recorded clip change count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_clipseq_p; /* ptr to server's clip change count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz short *w_clipptr; /* client virtual ptr to clip array. */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int w_cliplen; /* client's size of cliplist in bytes*/
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz Dga_token w_token; /* token used to grab window */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int w_infofd; /* fd of shared memory file */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int w_devfd; /* fd of framebuffer */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int w_grab_count; /* how many times we've grabbed it */
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk struct dga_window *w_next; /* used to link all grabbed windows */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *w_lib_private; /* library private data */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *w_client; /* for client use */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* cursor grabber info */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *curs_info; /* pointer to client's cursor info */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int curs_fd; /* Client side file descriptor */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_curseq; /* last recorded cursor change count */
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk u_int *s_curseq_p; /* ptr to server's cursor change cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* Ancillay Buffer info */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *back;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *depth;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *stencil;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *accum;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen void *alpha;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int buf_resize_flag;
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk u_int c_buffer_swap;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* double buffering info */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int db_enabled; /* flag to tell if initialized */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *db_vrtcntrp; /* Client's ptr to VRT counter */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int db_lastvrtcntr; /* VRT counter value at last flip */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int db_swapint; /* number of intervals between flips */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int (*vrt_func)(Dga_window);/* user supplied vrt retrace func */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk /* retained window grabber info */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int rtn_fd; /* Client side fd for shared memory */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int rtn_size; /* Client size of pixel block in bytes */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_rtnseq; /* Client rtn modification counter */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_rtnseq_p;/* Ptr to server's rtn mod counter */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_rtncachseq;/* Client device cache modification counter */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_rtncachseq_p; /* Ptr to server's dev cache modification counter */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen void *rtn_info; /* Ptr to Shared memory structure */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *rtn_pixels; /* Client ptr to Client pixel mapping */
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk u_int rtn_flags; /* to record state of retained grab */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /*
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz ** New fields for drawable grabber.
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz Display *w_dpy; /* display the window belongs to */
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg Window w_id; /* XID of window */
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg DgaMbufSetPtr pMbs; /* Non-null for multibuf wins */
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg u_int *s_mbufseq_p; /* pointer to mbuf seq in shinfo */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_mbufseq; /* last mbufset composition sequence count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_mbcomposseq_p; /* pointer to mbufset compos seq in shinfo */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_mbcomposseq; /* last mb state sequence count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_devinfoseq_p; /* pointer to devinfo seq in shinfo */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_devinfoseq; /* last devinfo state sequence count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg /* notification functions */
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg DgaSiteNotifyFunc siteNotifyFunc;
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg void *siteNotifyClientData;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz DgaMbNotifyFunc mbNotifyFunc;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *mbNotifyClientData;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz DgaRendBufNotifyFunc rendBufNotifyFunc;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *rendBufNotifyClientData;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* real lock subject - the win/mbuf currently locked by the client */
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg short rLockSubj;
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg /* effective lock subject - the actual lock subject. This will be used by
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz the DGA state inquiry functions called by the client. If the
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz win/mbuf is not aliased, eLockSubj will be the same as rLockSubj */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz short eLockSubj;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* previous effective lock subject - the lock subject for which a
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz change was last signalled to the client. It is assumed that the
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg client synchronized its state to this lock subject. This is always
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg true for well-behaved DGA clients */
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg short eLockSubjPrev;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* mbChgReason is the reason for an mbufset change. prevWasMbuffered
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz is used to help us figure this out. It is set during the update
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz phase and may be used during the inquiry phase */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz char prevWasMbuffered;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz char mbChgReason;
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg /* used during update phase to indicate what state changed */
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg u_int changeMask;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* reason for any site change */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz char siteChgReason;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* Has the window been previously locked? */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg char prevLocked;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg u_char alignPad[2];
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen /* overlay info
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * If the window is an overlay, the isOverlay flag will be set to
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk * true and the s_ovlstate_p pointer will point to the ovlstate
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * flag on the shared page and the s_ovlshapevalid_p pointer will
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * point to the w_ovl_shape_valid flag.
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int isOverlay;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int c_ovlstate;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int *s_ovlstate_p;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int *s_ovlshapevalid_p;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg DgaOvlStateNotifyFunc ovlStateNotifyFunc;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg void *ovlStateNotifyClientData;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#ifdef MT
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* For the threaded case, this stores the real change counts while
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * c_wm_chngcnt[] is used to force the update function to be called.
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int shadow_chngcnt[17];
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen#endif
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz} *_Dga_window;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelentypedef struct _dgaLastSeqs {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int mbufseq;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int clipseq;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int curseq;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int rtnseq;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz} DgaLastSeqs, *DgaLastSeqsPtr;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelentypedef struct dga_cmap {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen void *cm_info;/* pointer to shared memory */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int c_chngcnt; /* last recorded change count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_chngcnt_p; /* last recorded change count */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int cm_lockcnt; /* lock count for nested locks */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int *cm_lockp; /* pointer to lock page */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int *cm_unlockp; /* pointer to unlock page */
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg int cm_use_new_ioctl; /* use new hardware ioctl? */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg Dga_token cm_token; /* token used to grab cmap */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int cm_infofd; /* fd of shared memory file */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int cm_devfd; /* fd of framebuffer */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int cm_lockfd; /* fd of lock device
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg * (if not framebuffer) */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int cm_sunwindows_def_fd; /* client fd for server's
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg SunWindows default cmap window */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int cm_sunwindows_inst_fd; /* client fd for server's
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg SunWindows installed cmap window */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int cm_grab_count; /* how many times we've grabbed it */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg struct dga_cmap *cm_next; /* used to link all grabbed cmaps */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg void *cm_lib_private; /* library private data */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg void *cm_client; /* for client use */
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg} *_Dga_cmap;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg/*
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg* When the pixmap interface is made public, this declaration should be
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg* moved into the dga.h file and taken out of the dga_internal.h file
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg* Also the lock routiens currently in pix_grab,c should be made into
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg* macros and added to dga.h
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg*/
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdgtypedef struct dga_pixmap {
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg int drawable_type; /* pointer to drawable type - window/pixmap*/
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg u_int obsolete; /* last recorded global change count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_chngcnt_p; /* ptr to server's global change cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz int p_lockcnt; /* lock count for nested locks */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen Dga_lockp p_lockp; /* pointer to lock page */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen Dga_lockp p_unlockp; /* points to unlock page */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#ifdef MT
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen mutex_t *mutexp; /* points to drawable's mutex */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen#else
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int (*p_lock_func)(); /* alternate function for locking */
39a897cf2c4e5c0208d081fe7d51dc893b5c33d1Liam P. White#endif
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int (*p_unlock_func)(Dga_drawable); /* alternate func for unlocking */
39a897cf2c4e5c0208d081fe7d51dc893b5c33d1Liam P. White int (*p_update_func)(Dga_drawable, short); /* function to call for updates */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen int p_modif; /* cached result of update check ?? */
3cddc158875c47546688b0746fb0f36a8b71a299Liam P. White u_int c_chngcnt[1]; /* Last recorded global change count */
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen u_int *p_chngcnt_2nd; /* Pts to c_chngcnt[0]*/
3cddc158875c47546688b0746fb0f36a8b71a299Liam P. White void *p_infop; /* pointer to shared pixmap memory*/
3cddc158875c47546688b0746fb0f36a8b71a299Liam P. White/* TODO: Why are the next two entries in here? It's not clear to me why
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * the client side cares if the shpx_dir changes. The only time a pixmap
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen * is removed from the directory structure is when it is destroyed and
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen * then the obsolete flag is set. */
7171e57dfc6ef06705f2df1bb917ce7de8fc5f5bLiam P. White u_int c_dirchngcnt; /* Client's last recorderd dir chng cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_dirchngcnt_p;/* Ptr to server's dir chng cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_devinfocnt; /* Client's last recorded devinfo seq cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_devinfocnt_p; /* Ptr to server's devinfo seq cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int c_cachecnt; /* Client's last recorded cache sequence cnt */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int *s_cachecnt_p; /* ptr to Server cache sequence count */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_char c_cached; /* Client's last recorded cache state */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_char *s_cached_p; /* Ptr to server's cache state */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz u_int p_dir_index; /* Client's pixmap's directory index */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *p_shpx_dir; /* Client's ptr to the shpx dir */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz void *p_shpx_client; /* Client's ptr to the shpx client struct */
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan Dga_token p_token; /* token used to grab window */
u_int c_size; /* Client's size of pixel array */
u_char *c_pixels; /* pointer to clients pixels */
u_char depth; /* pixmap depth in bits */
char pad0; /* padding to align to int */
u_short pad1; /* padding to align to int */
u_int linebytes; /* pixmap linebyte */
struct dga_pixmap *p_next; /* used to link all grabbed pixmaps */
int p_infofd; /* fd of shared memory file */
u_int pix_flags; /* to record state of grab ?? */
Display *p_dpy;
Pixmap p_id; /* XID of pixmap */
void *p_client; /* for client use */
/* used during update phase to indicate what state changed */
u_int changeMask;
/* reason for any site change */
char siteChgReason;
u_char alignPad[3];
DgaSiteNotifyFunc siteNotifyFunc;
void *siteNotifyClientData;
#ifdef MT
/* For the threaded case, this stores the real change counts while
* c_chngcnt[] is used to force the update function to be called.
*/
u_int shadow_chngcnt[1];
#endif
} *_Dga_pixmap;
typedef void * Dga_pixmap;
#ifdef MT
extern mutex_t dgaGlobalMutex;
extern mutex_t dgaGlobalPixmapMutex;
extern int dgaThreaded;
extern int dgaMTOn;
#endif
#ifdef MT
extern int dgai_unlock(Dga_drawable dgadraw);
#endif
/* Pixmap grabber routines - these are not Public yet */
extern Dga_token XDgaGrabPixmap(Display*, Pixmap);
extern int XDgaUnGrabPixmap(Display*, Pixmap);
extern Dga_pixmap dga_pix_grab(Dga_token, Pixmap);
extern void dga_pix_ungrab(Dga_pixmap);
extern int dga_pix_cachechg(Dga_pixmap);
extern int dga_pix_cached(Dga_pixmap);
extern char* dga_pix_devname(Dga_pixmap);
extern void *dga_pix_pixels(Dga_pixmap);
extern int dga_pix_linebytes(Dga_pixmap);
extern u_char dga_pix_depth(Dga_pixmap);
extern void *dga_pix_devinfo(Dga_pixmap);
/* These are always going to be private routines to be backward
* compatible
*/
extern int XDgaGrabRetainedWindow(Display*, Window);
extern int XDgaUnGrabRetainedWindow(Display *, Window);
extern int XDgaGetRetainedPath(Display*, Window, char*);
extern int XDgaQueryVersion(Display*, int*, int*);
extern int XDgaGrabBuffers(Display *, Window, int );
extern int XDgaUnGrabBuffers(Display *, Window);
extern void dga_cm_get(Dga_cmap, int, int, u_char *, u_char *,
u_char *);
extern void dga_cm_put(Dga_cmap, int, int, u_char *, u_char*,
u_char *);
extern int dga_db_access(Dga_window);
extern void dga_db_release(Dga_window);
extern int dga_db_display_complete(Dga_window, int);
extern void *dga_rtn_devinfo(Dga_window);
/*
** Internal mbuf grab routine
*/
extern Dga_window dga_mbuf_grab (int devfd, Dga_token winToken);
/*
** Internal mbufset member update routines
*/
extern int dgai_mbsmemb_update (Dga_drawable dgadraw, short bufIndex);
extern int dgai_mbsmemb_syncZombie (_Dga_window dgawin);
extern void dgai_mbsmemb_syncMbufset (_Dga_window dgawin);
extern void dgai_mbsmemb_syncRendBuf (_Dga_window dgawin);
extern void dgai_mbsmemb_figureDerivChgs (_Dga_window dgawin);
extern void dgai_mbsmemb_notify (_Dga_window dgawin);
extern void dgai_mbsmemb_devinfo_update(_Dga_window dgawin);
/*
** Internal window update routines
*/
extern Dga_window dgai_win_grab_common (Display *dpy, int devfd, Dga_token token, int drawableGrabber);
extern int dgai_win_update (_Dga_window dgawin, short bufIndex);
extern void dgai_win_clip_update(_Dga_window dgawin);
extern void dgai_win_curs_update(_Dga_window dgawin);
extern void dgai_win_rtn_update(_Dga_window dgawin);
extern void dgai_win_syncChanges (_Dga_window dgawin, DgaLastSeqsPtr pLastSeqs);
extern int dgai_win_visibility(Dga_window wini);
/*
** Internal multibuffer update routines
*/
extern int dgai_mbuf_update (_Dga_window dgawin, short bufIndex);
extern void dgai_vmbuf_syncChanges (_Dga_window dgawin, DgaLastSeqsPtr pLastSeqs, short bufIndex);
extern void dgai_nmbuf_syncChanges (_Dga_window dgawin);
extern void dgai_nmbuf_cache_update(_Dga_window dgawin);
extern void dgai_nmbuf_devinfo_update(_Dga_window dgawin);
/*
** Internal multibuffer set routines
*/
extern DgaMbufSetPtr dgai_mbufset_create (_Dga_window dgawin);
extern void dgai_mbufset_incref (DgaMbufSetPtr pMbs);
extern void dgai_mbufset_decref (DgaMbufSetPtr pMbs);
/*
** Internal mbufset member inquiry routines
*/
extern Display * dgai_mbsmemb_display (_Dga_window dgawin);
extern char * dgai_mbsmemb_devname (_Dga_window dgawin);
extern int dgai_mbsmemb_devfd (_Dga_window dgawin);
extern int dgai_mbsmemb_depth (_Dga_window dgawin);
extern void dgai_mbsmemb_set_client_infop (_Dga_window dgawin, void *client_info_ptr);
extern void * dgai_mbsmemb_get_client_infop (_Dga_window dgawin);
extern void * dgai_mbsmemb_devinfo (_Dga_window dgawin);
extern int dgai_mbsmemb_sitechg (_Dga_window dgawin, int *reason);
extern void dgai_mbsmemb_sitesetnotify (_Dga_window dgawin,
DgaSiteNotifyFunc site_notify_func,
void *client_data);
extern void dgai_mbsmemb_sitegetnotify (_Dga_window dgawin,
DgaSiteNotifyFunc *site_notify_func,
void **client_data);
extern int dgai_mbsmemb_site (_Dga_window dgawin);
extern void * dgai_mbsmemb_address (_Dga_window dgawin);
extern int dgai_mbsmemb_linebytes (_Dga_window dgawin);
extern int dgai_mbsmemb_bitsperpixel (_Dga_window dgawin);
extern int dgai_mbsmemb_clipchg (_Dga_window dgawin);
extern void dgai_mbsmemb_bbox(_Dga_window dgawin, int *xp, int *yp,
int *widthp, int *heightp);
extern int dgai_mbsmemb_visibility (_Dga_window dgawin);
extern int dgai_mbsmemb_empty (_Dga_window dgawin);
extern short * dgai_mbsmemb_clipinfo (_Dga_window dgawin);
extern int dgai_mbsmemb_singlerect (_Dga_window dgawin);
extern int dgai_mbsmemb_obscured (_Dga_window dgawin);
extern u_short dgai_mbsmemb_borderwidth (_Dga_window dgawin);
extern void dgai_mbsmemb_curshandle (_Dga_window dgawin, DgaCursTakeDownFunc take_down_func,
void *client_data);
extern int dgai_mbsmemb_rtngrab (_Dga_window dgawin);
extern int dgai_mbsmemb_rtnungrab (_Dga_window dgawin);
extern int dgai_mbsmemb_rtnchg (_Dga_window dgawin);
extern int dgai_mbsmemb_rtnactive (_Dga_window dgawin);
extern int dgai_mbsmemb_rtncached (_Dga_window dgawin);
extern void * dgai_mbsmemb_rtndevinfop (_Dga_window dgawin);
extern void dgai_mbsmemb_rtndevtype (_Dga_window dgawin, u_char *type,
char **name);
extern void dgai_mbsmemb_rtndimensions (_Dga_window dgawin, short *width,
short *height, u_int *linebytes);
extern int dgai_mbsmemb_rtnbitsperpixel(_Dga_window dgawin);
extern void * dgai_mbsmemb_rtnpixels (_Dga_window dgawin);
extern int dgai_mbsmemb_mbchg (_Dga_window dgawin, int *reason);
extern void dgai_mbsmemb_mbsetnotify (_Dga_window dgawin, DgaMbNotifyFunc mb_notify_func,
void *client_data);
extern void dgai_mbsmemb_mbgetnotify (_Dga_window dgawin, DgaMbNotifyFunc *mb_notify_func,
void **client_data);
extern int dgai_mbsmemb_mbaccessmode (_Dga_window dgawin);
extern int dgai_mbsmemb_mbsitetypeconst (_Dga_window dgawin);
extern void dgai_mbsmemb_mbsetrendbufnotify (_Dga_window dgawin,
DgaRendBufNotifyFunc rb_notify_func,
void *client_data);
extern void dgai_mbsmemb_mbgetrendbufnotify (_Dga_window dgawin,
DgaRendBufNotifyFunc *rb_notify_func,
void **client_data);
extern int dgai_mbsmemb_ovlstatechg (_Dga_window dgawin);
extern int dgai_mbsmemb_ovlstate (_Dga_window dgawin);
extern void dgai_mbsmemb_setovlstatenotify (_Dga_window dgawin,
DgaOvlStateNotifyFunc ovlstate_notify_func,
void *client_data);
extern void dgai_mbsmemb_getovlstatenotify (_Dga_window dgawin,
DgaOvlStateNotifyFunc *ovlstate_notify_func,
void **client_data);
/*
** Internal pixmap inquiry routines
*/
/* TODO: dhuff: must supply */
extern int dgai_pix_update(Dga_drawable dgadraw, short bufIndex);
extern Display * dgai_pix_display (_Dga_pixmap dgapix);
extern char * dgai_pix_devname (_Dga_pixmap dgapix);
extern int dgai_pix_devfd (_Dga_pixmap dgapix);
extern int dgai_pix_depth (_Dga_pixmap dgapix);
extern void dgai_pix_set_client_infop (_Dga_pixmap dgapix, void *client_info_ptr);
extern void * dgai_pix_get_client_infop (_Dga_pixmap dgapix);
extern void * dgai_pix_devinfo (_Dga_pixmap dgapix);
extern int dgai_pix_sitechg (_Dga_pixmap dgapix, int *reason);
extern void dgai_pix_sitesetnotify (_Dga_pixmap dgapix,
DgaSiteNotifyFunc site_notify_func,
void *client_data);
extern void dgai_pix_sitegetnotify (_Dga_pixmap dgapix,
DgaSiteNotifyFunc *site_notify_func,
void **client_data);
extern int dgai_pix_site (_Dga_pixmap dgapix);
extern void * dgai_pix_address (_Dga_pixmap dgapix);
extern int dgai_pix_linebytes (_Dga_pixmap dgapix);
extern int dgai_pix_bitsperpixel (_Dga_pixmap dgapix);
extern int dgai_pix_clipchg (_Dga_pixmap dgapix);
extern void dgai_pix_bbox(_Dga_pixmap dgapix, int *xp, int *yp,
int *widthp, int *heightp);
extern int dgai_pix_empty (_Dga_pixmap dgapix);
extern short * dgai_pix_clipinfo (_Dga_pixmap dgapix);
#endif /* _DGA_INTERNAL_H */