/*
* Copyright (c) 1994 Christian E. Hopps
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Christian E. Hopps.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* The view major device is a placeholder device. It serves
* simply to map the semantics of a graphics display to
* the semantics of a character block device. In other
* words the graphics system as currently built does not like to be
* referred to by open/close/ioctl. This device serves as
* a interface to graphics. */
static void
view_display(struct view_softc *vu)
{
int s, i;
if (vu == NULL)
return;
s = spltty ();
/*
* mark views that share this monitor as not displaying
*/
for (i=0; i<NVIEW; i++) {
if ((views[i].flags & VUF_DISPLAY) &&
views[i].monitor == vu->monitor)
views[i].flags &= ~VUF_DISPLAY;
}
/*
* remove a view from our added list if it is marked as displaying
* switch to a new display.
*/
static void
view_remove(struct view_softc *vu)
{
int i;
if ((vu->flags & VUF_ADDED) == 0)
return;
vu->flags &= ~VUF_ADDED;
if (vu->flags & VUF_DISPLAY) {
for (i = 0; i < NVIEW; i++) {
if ((views[i].flags & VUF_ADDED) && &views[i] != vu &&
views[i].monitor == vu->monitor) {
view_display(&views[i]);
break;
}
}
}
vu->flags &= ~VUF_DISPLAY;
grf_remove_view(vu->view);
}
static int
view_setsize(struct view_softc *vu, struct view_size *vs)
{
view_t *new, *old;
dimen_t ns;
int co, cs;
co = 0;
cs = 0;
if (vs->x != vu->size.x || vs->y != vu->size.y)
co = 1;
/*
* we need a custom remove here to avoid letting
* another view display mark as not added or displayed
*/
if (vu->flags & VUF_DISPLAY) {
vu->flags &= ~(VUF_ADDED|VUF_DISPLAY);
view_display(vu);
}
grf_free_view(old);
return(0);
}
/*
* functions made available by conf.c
*/
/*ARGSUSED*/
int
viewopen(dev_t dev, int flags, int mode, struct lwp *l)
{
dimen_t size;
struct view_softc *vu;