xref: /netbsd-src/lib/libpanel/new.c (revision c3c23fd40bd578c348e48e8a546ccb5d52bbb7bb)
1*c3c23fd4Skamil /*	$NetBSD: new.c,v 1.3 2015/11/02 02:45:25 kamil Exp $ */
25858a2dbSuwe 
35858a2dbSuwe /*
45858a2dbSuwe  * Copyright (c) 2015 Valery Ushakov
55858a2dbSuwe  * All rights reserved.
65858a2dbSuwe  *
75858a2dbSuwe  * Redistribution and use in source and binary forms, with or without
85858a2dbSuwe  * modification, are permitted provided that the following conditions
95858a2dbSuwe  * are met:
105858a2dbSuwe  * 1. Redistributions of source code must retain the above copyright
115858a2dbSuwe  *    notice, this list of conditions and the following disclaimer.
125858a2dbSuwe  * 2. Redistributions in binary form must reproduce the above copyright
135858a2dbSuwe  *    notice, this list of conditions and the following disclaimer in the
145858a2dbSuwe  *    documentation and/or other materials provided with the distribution.
155858a2dbSuwe  *
165858a2dbSuwe  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
175858a2dbSuwe  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
185858a2dbSuwe  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
195858a2dbSuwe  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
205858a2dbSuwe  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
215858a2dbSuwe  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
225858a2dbSuwe  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
235858a2dbSuwe  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245858a2dbSuwe  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
255858a2dbSuwe  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265858a2dbSuwe  */
275858a2dbSuwe 
285858a2dbSuwe #include <sys/cdefs.h>
29*c3c23fd4Skamil __RCSID("$NetBSD: new.c,v 1.3 2015/11/02 02:45:25 kamil Exp $");
305858a2dbSuwe 
315858a2dbSuwe #include "panel_impl.h"
325858a2dbSuwe 
335858a2dbSuwe #include <assert.h>
345858a2dbSuwe #include <stdlib.h>
355858a2dbSuwe 
365858a2dbSuwe 
375858a2dbSuwe static PANEL *
_new_panel(WINDOW * w)385858a2dbSuwe _new_panel(WINDOW *w)
395858a2dbSuwe {
405858a2dbSuwe 	PANEL *p;
415858a2dbSuwe 
425858a2dbSuwe 	p = (PANEL *)malloc(sizeof(PANEL));
43f7b066afSkamil 	if (__predict_false(p == NULL))
445858a2dbSuwe 		return NULL;
455858a2dbSuwe 
465858a2dbSuwe 	p->win = w;
475858a2dbSuwe 	p->user = NULL;
485858a2dbSuwe 
495858a2dbSuwe 	DECK_INSERT_TOP(p);
505858a2dbSuwe 	return p;
515858a2dbSuwe }
525858a2dbSuwe 
535858a2dbSuwe 
545858a2dbSuwe PANEL *
new_panel(WINDOW * w)555858a2dbSuwe new_panel(WINDOW *w)
565858a2dbSuwe {
57*c3c23fd4Skamil 
585858a2dbSuwe 	if (__predict_false(w == NULL))
595858a2dbSuwe 		return NULL;
605858a2dbSuwe 
615858a2dbSuwe 	if (__predict_false(w == stdscr))
625858a2dbSuwe 		return NULL;
635858a2dbSuwe 
645858a2dbSuwe 	/*
655858a2dbSuwe 	 * Ensure there's phantom panel for stdscr at (below) the
665858a2dbSuwe 	 * bottom.  We explicitly re-assign stdscr in case it changed.
675858a2dbSuwe 	 */
685858a2dbSuwe 	if (TAILQ_EMPTY(&_deck)) {
695858a2dbSuwe 		assert(PANEL_HIDDEN(&_stdscr_panel));
705858a2dbSuwe 
715858a2dbSuwe 		_stdscr_panel.win = stdscr;
725858a2dbSuwe 		DECK_INSERT_TOP(&_stdscr_panel);
735858a2dbSuwe 	}
745858a2dbSuwe 
755858a2dbSuwe 	return _new_panel(w);
765858a2dbSuwe }
77