/****************************************************************************
- * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
* and: Thomas E. Dickey 1996-on *
+ * and: Juergen Pfeifer 2009 *
****************************************************************************/
/*
#include <curses.priv.h>
#include <stddef.h>
-MODULE_ID("$Id: lib_newwin.c,v 1.46 2008/04/05 19:16:42 tom Exp $")
+MODULE_ID("$Id: lib_newwin.c,v 1.53 2009/02/15 00:38:00 tom Exp $")
-#define window_is(name) (sp->_##name == win)
+#define window_is(name) ((sp)->_##name == win)
#if USE_REENTRANT
#define remove_window(name) \
name = 0
#endif
-static WINDOW *
+static void
remove_window_from_screen(WINDOW *win)
{
- SCREEN **scan = &_nc_screen_chain;
+ SCREEN *sp;
- while (*scan) {
- SCREEN *sp = *scan;
+ for (each_screen(sp)) {
if (window_is(curscr)) {
remove_window(curscr);
+ break;
} else if (window_is(stdscr)) {
remove_window(stdscr);
+ break;
} else if (window_is(newscr)) {
remove_window(newscr);
- } else {
- scan = &(*scan)->_next_screen;
- continue;
+ break;
}
- break;
}
-
- return 0;
}
NCURSES_EXPORT(int)
T((T_CALLED("_nc_freewin(%p)"), win));
if (win != 0) {
- if (_nc_try_global(windowlist) == 0) {
- for (p = _nc_windows, q = 0; p != 0; q = p, p = p->next) {
+ if (_nc_try_global(curses) == 0) {
+ q = 0;
+ for (each_window(p)) {
if (&(p->win) == win) {
remove_window_from_screen(win);
if (q == 0)
T(("...deleted win=%p", win));
break;
}
+ q = p;
}
- _nc_unlock_global(windowlist);
+ _nc_unlock_global(curses);
}
}
returnCode(result);
}
NCURSES_EXPORT(WINDOW *)
-newwin(int num_lines, int num_columns, int begy, int begx)
+NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx
+ int num_lines, int num_columns, int begy, int begx)
{
WINDOW *win;
NCURSES_CH_T *ptr;
returnWin(0);
if (num_lines == 0)
- num_lines = SP->_lines_avail - begy;
+ num_lines = SP_PARM->_lines_avail - begy;
if (num_columns == 0)
num_columns = screen_columns - begx;
returnWin(win);
}
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(WINDOW *)
+newwin(int num_lines, int num_columns, int begy, int begx)
+{
+ return NCURSES_SP_NAME(newwin) (CURRENT_SCREEN, num_lines, num_columns,
+ begy, begx);
+}
+#endif
+
NCURSES_EXPORT(WINDOW *)
derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx)
{
if ((wp = typeCalloc(WINDOWLIST, 1)) == 0)
returnWin(0);
- _nc_mutex_init(&(wp->mutex_use_window));
-
win = &(wp->win);
if ((win->_line = typeCalloc(struct ldat, ((unsigned) num_lines))) == 0) {
returnWin(0);
}
- _nc_lock_global(windowlist);
+ _nc_lock_global(curses);
win->_curx = 0;
win->_cury = 0;
}
wp->next = _nc_windows;
+ wp->screen = SP;
_nc_windows = wp;
T((T_CREATE("window %p"), win));
- _nc_unlock_global(windowlist);
+ _nc_unlock_global(curses);
returnWin(win);
}
+
+/*
+ * wgetch() and other functions with a WINDOW* parameter may use a SCREEN*
+ * internally, and it is useful to allow those to be invoked without switching
+ * SCREEN's, e.g., for multi-threaded applications.
+ */
+NCURSES_EXPORT(SCREEN *)
+_nc_screen_of(WINDOW *win)
+{
+ SCREEN *sp = 0;
+
+ if (win != 0) {
+ WINDOWLIST *wp = (WINDOWLIST *) win;
+ sp = wp->screen;
+ }
+ return (sp);
+}