First cut at ETI libpanel. Lacks man pages and tests.

Not hooked into the build yet.
This commit is contained in:
uwe 2015-10-26 23:09:49 +00:00
parent b7ab9303c7
commit 5858a2db3d
20 changed files with 1001 additions and 0 deletions

31
lib/libpanel/Makefile Normal file
View File

@ -0,0 +1,31 @@
# $NetBSD: Makefile,v 1.1 2015/10/26 23:09:49 uwe Exp $
WARNS= 4
LIB= panel
INCS= panel.h
SRCS= #
SRCS+= _deck.c
SRCS+= above.c
SRCS+= below.c
SRCS+= bottom.c
SRCS+= del.c
SRCS+= getuser.c
SRCS+= hidden.c
SRCS+= hide.c
SRCS+= move.c
SRCS+= new.c
SRCS+= replace.c
SRCS+= setuser.c
SRCS+= show.c
SRCS+= top.c
SRCS+= update.c
SRCS+= window.c
#LIBDPLIBS+= curses ${.CURDIR}/../libcurses
.include <bsd.lib.mk>

34
lib/libpanel/_deck.c Normal file
View File

@ -0,0 +1,34 @@
/* $NetBSD: _deck.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: _deck.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
struct deck _deck __dso_hidden = TAILQ_HEAD_INITIALIZER(_deck);
PANEL _stdscr_panel __dso_hidden;

45
lib/libpanel/above.c Normal file
View File

@ -0,0 +1,45 @@
/* $NetBSD: above.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: above.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
PANEL *
panel_above(PANEL *p)
{
if (__predict_false(p == NULL))
return NULL;
if (__predict_false(PANEL_HIDDEN(p)))
return NULL;
return PANEL_ABOVE(p);
}

50
lib/libpanel/below.c Normal file
View File

@ -0,0 +1,50 @@
/* $NetBSD: below.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: below.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
PANEL *
panel_below(PANEL *p)
{
PANEL *below;
if (__predict_false(p == NULL))
return NULL;
if (__predict_false(PANEL_HIDDEN(p)))
return NULL;
below = PANEL_BELOW(p);
if (below == &_stdscr_panel)
return NULL;
else
return below;
}

48
lib/libpanel/bottom.c Normal file
View File

@ -0,0 +1,48 @@
/* $NetBSD: bottom.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: bottom.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
bottom_panel(PANEL *p)
{
if (__predict_false(p == NULL))
return ERR;
if (__predict_false(PANEL_HIDDEN(p)))
return ERR;
(void) hide_panel(p);
DECK_INSERT_BOTTOM(p);
return OK;
}

63
lib/libpanel/del.c Normal file
View File

@ -0,0 +1,63 @@
/* $NetBSD: del.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: del.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
#include <assert.h>
#include <stdlib.h>
int
del_panel(PANEL *p)
{
if (__predict_false(p == NULL))
return ERR;
(void) hide_panel(p);
free(p);
/*
* If the last panel is removed, remove the phantom stdscr
* panel as well.
*
* A program that wants to switch to a different screen with
* set_term(3), or ends and recreates curses session with
* endwin(3)/initscr(3), must delete all panels first, since
* their windows will become invalid. When it will create its
* first new panel afterwards, it will pick up new stdscr.
*/
if (TAILQ_LAST(&_deck, deck) == &_stdscr_panel) {
(void) hide_panel(&_stdscr_panel);
assert(TAILQ_EMPTY(&_deck));
}
return OK;
}

41
lib/libpanel/getuser.c Normal file
View File

@ -0,0 +1,41 @@
/* $NetBSD: getuser.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: getuser.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
char *
panel_userptr(PANEL *p)
{
if (p == NULL)
return NULL;
return p->user;
}

45
lib/libpanel/hidden.c Normal file
View File

@ -0,0 +1,45 @@
/* $NetBSD: hidden.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: hidden.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
panel_hidden(PANEL *p)
{
if (p == NULL)
return ERR;
if (PANEL_HIDDEN(p))
return TRUE;
else
return FALSE;
}

56
lib/libpanel/hide.c Normal file
View File

@ -0,0 +1,56 @@
/* $NetBSD: hide.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: hide.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
hide_panel(PANEL *p)
{
PANEL *other;
if (__predict_false(p == NULL))
return ERR;
if (__predict_false(PANEL_HIDDEN(p)))
return OK;
DECK_REMOVE(p);
/*
* The panel is no longer in the deck, so update_panels() will
* not handle it. Touch exposed areas now.
*/
FOREACH_PANEL (other) {
touchoverlap(p->win, other->win);
}
return OK;
}

58
lib/libpanel/move.c Normal file
View File

@ -0,0 +1,58 @@
/* $NetBSD: move.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: move.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
move_panel(PANEL *p, int y, int x)
{
int oldy, oldx;
if (__predict_false(p == NULL))
return ERR;
getbegyx(p->win, oldy, oldx);
if (__predict_false(y == oldy && x == oldx))
return OK;
if (!PANEL_HIDDEN(p)) {
PANEL *other;
/* touch exposed areas at the old location now */
FOREACH_PANEL (other) {
if (other != p) {
touchoverlap(p->win, other->win);
}
}
}
return mvwin(p->win, y, x);
}

75
lib/libpanel/new.c Normal file
View File

@ -0,0 +1,75 @@
/* $NetBSD: new.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: new.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
#include <assert.h>
#include <stdlib.h>
static PANEL *
_new_panel(WINDOW *w)
{
PANEL *p;
p = (PANEL *)malloc(sizeof(PANEL));
if (p == NULL)
return NULL;
p->win = w;
p->user = NULL;
DECK_INSERT_TOP(p);
return p;
}
PANEL *
new_panel(WINDOW *w)
{
if (__predict_false(w == NULL))
return NULL;
if (__predict_false(w == stdscr))
return NULL;
/*
* Ensure there's phantom panel for stdscr at (below) the
* bottom. We explicitly re-assign stdscr in case it changed.
*/
if (TAILQ_EMPTY(&_deck)) {
assert(PANEL_HIDDEN(&_stdscr_panel));
_stdscr_panel.win = stdscr;
DECK_INSERT_TOP(&_stdscr_panel);
}
return _new_panel(w);
}

62
lib/libpanel/panel.h Normal file
View File

@ -0,0 +1,62 @@
/* $NetBSD: panel.h,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#ifndef _PANEL_H_
#define _PANEL_H_
#include <sys/cdefs.h>
#include <curses.h>
typedef struct __panel PANEL;
__BEGIN_DECLS
PANEL *new_panel(WINDOW *);
int del_panel(PANEL *);
int replace_panel(PANEL *, WINDOW *);
WINDOW *panel_window(PANEL *);
int set_panel_userptr(PANEL *, char *);
char *panel_userptr(PANEL *);
int hide_panel(PANEL *);
int show_panel(PANEL *);
int panel_hidden(PANEL *);
int top_panel(PANEL *);
int bottom_panel(PANEL *);
PANEL *panel_above(PANEL *);
PANEL *panel_below(PANEL *);
int move_panel(PANEL *, int, int);
void update_panels(void);
__END_DECLS
#endif /* _PANEL_H_ */

92
lib/libpanel/panel_impl.h Normal file
View File

@ -0,0 +1,92 @@
/* $NetBSD: panel_impl.h,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#ifndef _PANEL_IMPL_H_
#define _PANEL_IMPL_H_
#include "panel.h"
#include <sys/queue.h>
#define DECK_HEAD(head) TAILQ_HEAD(head, __panel)
#define DECK_ENTRY TAILQ_ENTRY(__panel)
/*
* Panels are just curses windows with Z-order added.
* See update_panels() for details.
*/
struct __panel {
WINDOW *win;
void *user;
DECK_ENTRY zorder;
};
/* Deck of panels in Z-order from bottom to top. */
DECK_HEAD(deck);
extern struct deck _deck __dso_hidden;
/* Fake stdscr panel at the bottom, not user visible */
extern PANEL _stdscr_panel __dso_hidden;
/*
* Hidden panels are not in the deck. <sys/queue.h> macros don't have
* a concept of an entry not on the list, so provide a kludge that
* digs into internals.
*/
#define TAILQ_REMOVE_NP(head, elm, field) do { \
TAILQ_REMOVE((head), (elm), field); \
(elm)->field.tqe_next = NULL; \
(elm)->field.tqe_prev = NULL; \
} while (/*CONSTCOND*/ 0)
#define TAILQ_LINKED_NP(elm, field) \
(((elm)->field.tqe_prev) != NULL)
#define DECK_INSERT_TOP(p) do { \
TAILQ_INSERT_TAIL(&_deck, (p), zorder); \
} while (/*CONSTCOND*/ 0)
#define DECK_INSERT_BOTTOM(p) do { \
TAILQ_INSERT_AFTER(&_deck, &_stdscr_panel, (p), zorder); \
} while (/*CONSTCOND*/ 0)
#define DECK_REMOVE(p) do { \
TAILQ_REMOVE_NP(&_deck, (p), zorder); \
} while (/*CONSTCOND*/ 0)
#define PANEL_ABOVE(p) (TAILQ_NEXT((p), zorder))
#define PANEL_BELOW(p) (TAILQ_PREV((p), deck, zorder))
#define PANEL_HIDDEN(p) (!TAILQ_LINKED_NP((p), zorder))
#define FOREACH_PANEL(var) TAILQ_FOREACH(var, &_deck, zorder)
#endif /* _PANEL_IMPL_H_ */

53
lib/libpanel/replace.c Normal file
View File

@ -0,0 +1,53 @@
/* $NetBSD: replace.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: replace.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
replace_panel(PANEL *p, WINDOW *w)
{
if (__predict_false(p == NULL || w == NULL))
return ERR;
if (!PANEL_HIDDEN(p)) {
PANEL *other;
/* touch exposed areas at the old location now */
FOREACH_PANEL (other) {
if (other != p)
touchoverlap(p->win, other->win);
}
}
p->win = w;
return OK;
}

42
lib/libpanel/setuser.c Normal file
View File

@ -0,0 +1,42 @@
/* $NetBSD: setuser.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: setuser.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
set_panel_userptr(PANEL *p, char *u)
{
if (p == NULL)
return ERR;
p->user = u;
return OK;
}

View File

@ -0,0 +1,5 @@
# $NetBSD: shlib_version,v 1.1 2015/10/26 23:09:49 uwe Exp $
# Remember to update distrib/sets/lists/base/shl.* when changing
#
major=1
minor=0

47
lib/libpanel/show.c Normal file
View File

@ -0,0 +1,47 @@
/* $NetBSD: show.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: show.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
show_panel(PANEL *p)
{
if (__predict_false(p == NULL))
return ERR;
/* unlike top_panel() */
if (__predict_false(!PANEL_HIDDEN(p)))
return ERR;
DECK_INSERT_TOP(p);
return OK;
}

49
lib/libpanel/top.c Normal file
View File

@ -0,0 +1,49 @@
/* $NetBSD: top.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: top.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
int
top_panel(PANEL *p)
{
if (__predict_false(p == NULL))
return ERR;
/* unlike show_panel() */
if (__predict_false(PANEL_HIDDEN(p)))
return ERR;
/* XXX: use common internal functions instead */
(void) hide_panel(p);
(void) show_panel(p);
return OK;
}

62
lib/libpanel/update.c Normal file
View File

@ -0,0 +1,62 @@
/* $NetBSD: update.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: update.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
void
update_panels(void)
{
PANEL *p;
/*
* For each panel tell panels above it they need to refresh
* regions that overlap (are above) this panel. This ensures
* that even if a panel below was touched, it's still
* overwritten by a panel above.
*
* Note that we also need to do this during "destructive"
* operations (hide, move, replace window - which see).
*/
FOREACH_PANEL (p) {
PANEL *above = p;
while ((above = PANEL_ABOVE(above)) != NULL) {
touchoverlap(p->win, above->win);
}
}
/*
* This is what effects Z-order: the window updated later
* overwrites contents of the windows below (before) it.
*/
FOREACH_PANEL (p) {
wnoutrefresh(p->win);
}
}

43
lib/libpanel/window.c Normal file
View File

@ -0,0 +1,43 @@
/* $NetBSD: window.c,v 1.1 2015/10/26 23:09:49 uwe Exp $ */
/*
* Copyright (c) 2015 Valery Ushakov
* 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.
*
* 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.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: window.c,v 1.1 2015/10/26 23:09:49 uwe Exp $");
#include "panel_impl.h"
WINDOW *
panel_window(PANEL *p)
{
if (p == NULL)
return NULL;
return p->win;
}