/* Copyright (c) 1993, 2015, Oracle and/or its affiliates. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* ** draw_db.c - Drawable veneer for DGA window buffer control routines */ #ifdef SERVER_DGA #include #endif /* SERVER_DGA */ #include "dga_incls.h" int dga_draw_db_grab (Dga_drawable dgadraw, int nbuffers, int (*vrtfunc)(Dga_drawable), u_int *vrtcounterp) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { return (0); } return (dga_db_grab((Dga_window)dgawin, nbuffers, vrtfunc, vrtcounterp)); } case DGA_DRAW_PIXMAP: default: return (0); } } int dga_draw_db_ungrab (Dga_drawable dgadraw) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { return (0); } return (dga_db_ungrab((Dga_window)dgawin)); } case DGA_DRAW_PIXMAP: default: return (0); } } void dga_draw_db_write (Dga_drawable dgadraw, int buffer, int (*writefunc)(void*, Dga_drawable, int), void *data) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { break; } dga_db_write((Dga_window)dgawin, buffer, writefunc, data); break; } case DGA_DRAW_PIXMAP: break; } } void dga_draw_db_read (Dga_drawable dgadraw, int buffer, int (*readfunc)(void*, Dga_drawable, int), void *data) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { break; } dga_db_read((Dga_window)dgawin, buffer, readfunc, data); break; } case DGA_DRAW_PIXMAP: break; } } void dga_draw_db_display (Dga_drawable dgadraw, int buffer, int (*visfunc)(void*, Dga_drawable, int), void *data) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { break; } dga_db_display((Dga_window)dgawin, buffer, visfunc, data); break; } case DGA_DRAW_PIXMAP: break; } } void dga_draw_db_interval (Dga_drawable dgadraw, int interval) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { break; } dga_db_interval((Dga_window)dgawin, interval); break; } case DGA_DRAW_PIXMAP: break; } } void dga_draw_db_interval_wait (Dga_drawable dgadraw) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { break; } dga_db_interval_wait((Dga_window)dgawin); break; } case DGA_DRAW_PIXMAP: break; } } int dga_draw_db_interval_check (Dga_drawable dgadraw) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { /* not applicable to multibuffers - consider interval always expired */ return (1); } return (dga_db_interval_check((Dga_window)dgawin)); } case DGA_DRAW_PIXMAP: default: /* not applicable to pixmaps - consider interval always expired */ return (1); } } int dga_draw_db_write_inquire (Dga_drawable dgadraw) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { /* not applicable to multibuffers - always return an invalid buffer index */ return (-1); } return (dga_db_write_inquire((Dga_window)dgawin)); } case DGA_DRAW_PIXMAP: default: /* not applicable to pixmaps - always return an invalid buffer index */ return (-1); } } int dga_draw_db_read_inquire (Dga_drawable dgadraw) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { /* not applicable to multibuffers - always return an invalid buffer index */ return (-1); } return (dga_db_read_inquire((Dga_window)dgawin)); } case DGA_DRAW_PIXMAP: default: /* not applicable to pixmaps - always return an invalid buffer index */ return (-1); } } int dga_draw_db_display_inquire (Dga_drawable dgadraw) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { /* not applicable to multibuffers - always return an invalid buffer index */ return (-1); } return (dga_db_display_inquire((Dga_window)dgawin)); } case DGA_DRAW_PIXMAP: default: /* not applicable to pixmaps - always return an invalid buffer index */ return (-1); } } int dga_draw_db_display_done (Dga_drawable dgadraw, int flag, int (*display_done_func)(Dga_drawable)) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { /* not applicable to multibuffers - consider display done (to prevent hangs) */ return (1); } return (dga_db_display_done((Dga_window)dgawin, flag, display_done_func)); } case DGA_DRAW_PIXMAP: default: /* not applicable to pixmaps - consider display done (to prevent hangs) */ return (1); } } Dga_dbinfo * dga_draw_db_dbinfop (Dga_drawable dgadraw) { switch ( ((_Dga_drawable)dgadraw)->drawable_type) { case DGA_DRAW_WINDOW: { _Dga_window dgawin = (_Dga_window)dgadraw; if (!DGA_LOCKSUBJ_WINDOW(dgawin, dgawin->eLockSubj)) { /* not applicable to multibuffers - return NULL */ return (NULL); } return (dga_win_dbinfop((Dga_window)dgawin)); } case DGA_DRAW_PIXMAP: default: /* not applicable to pixmaps - return NULL */ return (NULL); } }