1
0
Fork 0
screen/layer.h
Daniel Baumann e88291c4cd
Adding upstream version 4.9.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 15:19:57 +02:00

163 lines
5 KiB
C

/* Copyright (c) 2008, 2009
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
* Micah Cowan (micah@cowan.name)
* Sadrul Habib Chowdhury (sadrul@users.sourceforge.net)
* Copyright (c) 1993-2002, 2003, 2005, 2006, 2007
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
* Copyright (c) 1987 Oliver Laumann
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see the file COPYING); if not, see
* https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*
****************************************************************
* $Id$ GNU
*/
#ifndef SCREEN_LAYER_H
#define SCREEN_LAYER_H
/*
* This is the overlay structure. It is used to create a seperate
* layer over the current windows.
*/
struct mchar; /* forward declaration */
struct LayFuncs
{
void (*lf_LayProcess) __P((char **, int *));
void (*lf_LayAbort) __P((void));
void (*lf_LayRedisplayLine) __P((int, int, int, int));
void (*lf_LayClearLine) __P((int, int, int, int));
int (*lf_LayRewrite) __P((int, int, int, struct mchar *, int));
int (*lf_LayResize) __P((int, int));
void (*lf_LayRestore) __P((void));
void (*lf_LayFree) __P((void *)); /* Should only free any data kept in
flayer->l_data (but not flayer->l_data itself). */
};
struct layer
{
struct canvas *l_cvlist; /* list of canvases displaying layer */
int l_width;
int l_height;
int l_x; /* cursor position */
int l_y;
int l_encoding;
struct LayFuncs *l_layfn;
void *l_data;
struct layer *l_next; /* layer stack, should be in data? */
struct layer *l_bottom; /* bottom element of layer stack */
int l_blocking;
int l_mode; /* non-zero == edit mode */
struct {
unsigned char buffer[3]; /* [0]: the button
[1]: x
[2]: y
*/
int len;
int start;
} l_mouseevent;
struct {
int d : 1; /* Is the output for the layer blocked? */
/* After unpausing, what region should we refresh? */
int *left, *right;
int top, bottom;
int lines;
} l_pause;
};
#define LayProcess (*flayer->l_layfn->lf_LayProcess)
#define LayAbort (*flayer->l_layfn->lf_LayAbort)
#define LayRedisplayLine (*flayer->l_layfn->lf_LayRedisplayLine)
#define LayClearLine (*flayer->l_layfn->lf_LayClearLine)
#define LayRewrite (*flayer->l_layfn->lf_LayRewrite)
#define LayResize (*flayer->l_layfn->lf_LayResize)
#define LayRestore (*flayer->l_layfn->lf_LayRestore)
#define LayFree (*flayer->l_layfn->lf_LayFree)
#define LaySetCursor() LGotoPos(flayer, flayer->l_x, flayer->l_y)
#define LayCanResize(l) (l->l_layfn->LayResize != DefResize)
/* XXX: AArgh! think again! */
#define LAY_CALL_UP(fn) do \
{ \
struct layer *oldlay = flayer; \
struct canvas *oldcvlist, *cv; \
debug("LayCallUp\n"); \
flayer = flayer->l_next; \
oldcvlist = flayer->l_cvlist; \
debug1("oldcvlist: %lx\n", (long)oldcvlist); \
flayer->l_cvlist = oldlay->l_cvlist; \
for (cv = flayer->l_cvlist; cv; cv = cv->c_lnext) \
cv->c_layer = flayer; \
fn; \
flayer = oldlay; \
for (cv = flayer->l_cvlist; cv; cv = cv->c_lnext) \
cv->c_layer = flayer; \
flayer->l_next->l_cvlist = oldcvlist; \
} while(0)
#define LAY_DISPLAYS(l, fn) do \
{ \
struct display *olddisplay = display; \
struct canvas *cv; \
for (display = displays; display; display = display->d_next) \
{ \
for (cv = D_cvlist; cv; cv = cv->c_next) \
if (cv->c_layer == l) \
break; \
if (cv == 0) \
continue; \
fn; \
} \
display = olddisplay; \
} while(0)
#endif /* SCREEN_LAYER_H */
/**
* (Un)Pauses a layer.
*
* @param layer The layer that should be (un)paused.
* @param pause Should we pause the layer?
*/
void LayPause __P((struct layer *layer, int pause));
/**
* Update the region to refresh after a layer is unpaused.
*
* @param layer The layer.
* @param xs The left-end of the region.
* @param xe The right-end of the region.
* @param ys The top-end of the region.
* @param ye The bottom-end of the region.
*/
void LayPauseUpdateRegion __P((struct layer *layer, int xs, int xe, int ys, int ye));
/**
* Free any internal memory for the layer.
*
* @param layer The layer.
*/
void LayerCleanupMemory __P((struct layer *layer));