17db96d56Sopenharmony_ci/*
27db96d56Sopenharmony_ci *   This is a curses module for Python.
37db96d56Sopenharmony_ci *
47db96d56Sopenharmony_ci *   Based on prior work by Lance Ellinghaus and Oliver Andrich
57db96d56Sopenharmony_ci *   Version 1.2 of this module: Copyright 1994 by Lance Ellinghouse,
67db96d56Sopenharmony_ci *    Cathedral City, California Republic, United States of America.
77db96d56Sopenharmony_ci *
87db96d56Sopenharmony_ci *   Version 1.5b1, heavily extended for ncurses by Oliver Andrich:
97db96d56Sopenharmony_ci *   Copyright 1996,1997 by Oliver Andrich, Koblenz, Germany.
107db96d56Sopenharmony_ci *
117db96d56Sopenharmony_ci *   Tidied for Python 1.6, and currently maintained by <amk@amk.ca>.
127db96d56Sopenharmony_ci *
137db96d56Sopenharmony_ci *   Permission is hereby granted, free of charge, to any person obtaining
147db96d56Sopenharmony_ci *   a copy of this source file to use, copy, modify, merge, or publish it
157db96d56Sopenharmony_ci *   subject to the following conditions:
167db96d56Sopenharmony_ci *
177db96d56Sopenharmony_ci *   The above copyright notice and this permission notice shall be included
187db96d56Sopenharmony_ci *   in all copies or in any new file that contains a substantial portion of
197db96d56Sopenharmony_ci *   this file.
207db96d56Sopenharmony_ci *
217db96d56Sopenharmony_ci *   THE  AUTHOR  MAKES  NO  REPRESENTATIONS ABOUT  THE  SUITABILITY  OF
227db96d56Sopenharmony_ci *   THE  SOFTWARE FOR  ANY  PURPOSE.  IT IS  PROVIDED  "AS IS"  WITHOUT
237db96d56Sopenharmony_ci *   EXPRESS OR  IMPLIED WARRANTY.  THE AUTHOR DISCLAIMS  ALL WARRANTIES
247db96d56Sopenharmony_ci *   WITH  REGARD TO  THIS  SOFTWARE, INCLUDING  ALL IMPLIED  WARRANTIES
257db96d56Sopenharmony_ci *   OF   MERCHANTABILITY,  FITNESS   FOR  A   PARTICULAR  PURPOSE   AND
267db96d56Sopenharmony_ci *   NON-INFRINGEMENT  OF THIRD  PARTY  RIGHTS. IN  NO  EVENT SHALL  THE
277db96d56Sopenharmony_ci *   AUTHOR  BE LIABLE  TO  YOU  OR ANY  OTHER  PARTY  FOR ANY  SPECIAL,
287db96d56Sopenharmony_ci *   INDIRECT,  OR  CONSEQUENTIAL  DAMAGES  OR  ANY  DAMAGES  WHATSOEVER
297db96d56Sopenharmony_ci *   WHETHER IN AN  ACTION OF CONTRACT, NEGLIGENCE,  STRICT LIABILITY OR
307db96d56Sopenharmony_ci *   ANY OTHER  ACTION ARISING OUT OF  OR IN CONNECTION WITH  THE USE OR
317db96d56Sopenharmony_ci *   PERFORMANCE OF THIS SOFTWARE.
327db96d56Sopenharmony_ci */
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci/*
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci  A number of SysV or ncurses functions don't have wrappers yet; if you
377db96d56Sopenharmony_ci  need a given function, add it and send a patch.  See
387db96d56Sopenharmony_ci  https://www.python.org/dev/patches/ for instructions on how to submit
397db96d56Sopenharmony_ci  patches to Python.
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci  Here's a list of currently unsupported functions:
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci  addchnstr addchstr color_set define_key
447db96d56Sopenharmony_ci  del_curterm delscreen dupwin inchnstr inchstr innstr keyok
457db96d56Sopenharmony_ci  mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
467db96d56Sopenharmony_ci  mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
477db96d56Sopenharmony_ci  mvwinchnstr mvwinchstr mvwinnstr newterm
487db96d56Sopenharmony_ci  restartterm ripoffline scr_dump
497db96d56Sopenharmony_ci  scr_init scr_restore scr_set scrl set_curterm set_term setterm
507db96d56Sopenharmony_ci  tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
517db96d56Sopenharmony_ci  vidattr vidputs waddchnstr waddchstr
527db96d56Sopenharmony_ci  wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci  Low-priority:
557db96d56Sopenharmony_ci  slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
567db96d56Sopenharmony_ci  slk_attron slk_attrset slk_clear slk_color slk_init slk_label
577db96d56Sopenharmony_ci  slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci  Menu extension (ncurses and probably SYSV):
607db96d56Sopenharmony_ci  current_item free_item free_menu item_count item_description
617db96d56Sopenharmony_ci  item_index item_init item_name item_opts item_opts_off
627db96d56Sopenharmony_ci  item_opts_on item_term item_userptr item_value item_visible
637db96d56Sopenharmony_ci  menu_back menu_driver menu_fore menu_format menu_grey
647db96d56Sopenharmony_ci  menu_init menu_items menu_mark menu_opts menu_opts_off
657db96d56Sopenharmony_ci  menu_opts_on menu_pad menu_pattern menu_request_by_name
667db96d56Sopenharmony_ci  menu_request_name menu_spacing menu_sub menu_term menu_userptr
677db96d56Sopenharmony_ci  menu_win new_item new_menu pos_menu_cursor post_menu
687db96d56Sopenharmony_ci  scale_menu set_current_item set_item_init set_item_opts
697db96d56Sopenharmony_ci  set_item_term set_item_userptr set_item_value set_menu_back
707db96d56Sopenharmony_ci  set_menu_fore set_menu_format set_menu_grey set_menu_init
717db96d56Sopenharmony_ci  set_menu_items set_menu_mark set_menu_opts set_menu_pad
727db96d56Sopenharmony_ci  set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
737db96d56Sopenharmony_ci  set_menu_userptr set_menu_win set_top_row top_row unpost_menu
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci  Form extension (ncurses and probably SYSV):
767db96d56Sopenharmony_ci  current_field data_ahead data_behind dup_field
777db96d56Sopenharmony_ci  dynamic_fieldinfo field_arg field_back field_buffer
787db96d56Sopenharmony_ci  field_count field_fore field_index field_info field_init
797db96d56Sopenharmony_ci  field_just field_opts field_opts_off field_opts_on field_pad
807db96d56Sopenharmony_ci  field_status field_term field_type field_userptr form_driver
817db96d56Sopenharmony_ci  form_fields form_init form_opts form_opts_off form_opts_on
827db96d56Sopenharmony_ci  form_page form_request_by_name form_request_name form_sub
837db96d56Sopenharmony_ci  form_term form_userptr form_win free_field free_form
847db96d56Sopenharmony_ci  link_field link_fieldtype move_field new_field new_form
857db96d56Sopenharmony_ci  new_page pos_form_cursor post_form scale_form
867db96d56Sopenharmony_ci  set_current_field set_field_back set_field_buffer
877db96d56Sopenharmony_ci  set_field_fore set_field_init set_field_just set_field_opts
887db96d56Sopenharmony_ci  set_field_pad set_field_status set_field_term set_field_type
897db96d56Sopenharmony_ci  set_field_userptr set_fieldtype_arg set_fieldtype_choice
907db96d56Sopenharmony_ci  set_form_fields set_form_init set_form_opts set_form_page
917db96d56Sopenharmony_ci  set_form_sub set_form_term set_form_userptr set_form_win
927db96d56Sopenharmony_ci  set_max_field set_new_page unpost_form
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci*/
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci/* Release Number */
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_cistatic const char PyCursesVersion[] = "2.2";
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci/* Includes */
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE_BUILTIN
1047db96d56Sopenharmony_ci#  define Py_BUILD_CORE_MODULE 1
1057db96d56Sopenharmony_ci#endif
1067db96d56Sopenharmony_ci#define NEEDS_PY_IDENTIFIER
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci#define PY_SSIZE_T_CLEAN
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci#include "Python.h"
1117db96d56Sopenharmony_ci#include "pycore_long.h"          // _PyLong_GetZero()
1127db96d56Sopenharmony_ci#include "pycore_structseq.h"     // _PyStructSequence_NewType()
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci#ifdef __hpux
1157db96d56Sopenharmony_ci#define STRICT_SYSV_CURSES
1167db96d56Sopenharmony_ci#endif
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci#define CURSES_MODULE
1197db96d56Sopenharmony_ci#include "py_curses.h"
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci#if defined(HAVE_TERM_H) || defined(__sgi)
1227db96d56Sopenharmony_ci/* For termname, longname, putp, tigetflag, tigetnum, tigetstr, tparm
1237db96d56Sopenharmony_ci   which are not declared in SysV curses and for setupterm. */
1247db96d56Sopenharmony_ci#include <term.h>
1257db96d56Sopenharmony_ci/* Including <term.h> #defines many common symbols. */
1267db96d56Sopenharmony_ci#undef lines
1277db96d56Sopenharmony_ci#undef columns
1287db96d56Sopenharmony_ci#endif
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci#ifdef HAVE_LANGINFO_H
1317db96d56Sopenharmony_ci#include <langinfo.h>
1327db96d56Sopenharmony_ci#endif
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
1357db96d56Sopenharmony_ci#define STRICT_SYSV_CURSES       /* Don't use ncurses extensions */
1367db96d56Sopenharmony_citypedef chtype attr_t;           /* No attr_t type is available */
1377db96d56Sopenharmony_ci#endif
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci#if defined(_AIX)
1407db96d56Sopenharmony_ci#define STRICT_SYSV_CURSES
1417db96d56Sopenharmony_ci#endif
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci#if NCURSES_EXT_FUNCS+0 >= 20170401 && NCURSES_EXT_COLORS+0 >= 20170401
1447db96d56Sopenharmony_ci#define _NCURSES_EXTENDED_COLOR_FUNCS   1
1457db96d56Sopenharmony_ci#else
1467db96d56Sopenharmony_ci#define _NCURSES_EXTENDED_COLOR_FUNCS   0
1477db96d56Sopenharmony_ci#endif
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci#if _NCURSES_EXTENDED_COLOR_FUNCS
1507db96d56Sopenharmony_ci#define _CURSES_COLOR_VAL_TYPE          int
1517db96d56Sopenharmony_ci#define _CURSES_COLOR_NUM_TYPE          int
1527db96d56Sopenharmony_ci#define _CURSES_INIT_COLOR_FUNC         init_extended_color
1537db96d56Sopenharmony_ci#define _CURSES_INIT_PAIR_FUNC          init_extended_pair
1547db96d56Sopenharmony_ci#define _COLOR_CONTENT_FUNC             extended_color_content
1557db96d56Sopenharmony_ci#define _CURSES_PAIR_CONTENT_FUNC       extended_pair_content
1567db96d56Sopenharmony_ci#else
1577db96d56Sopenharmony_ci#define _CURSES_COLOR_VAL_TYPE          short
1587db96d56Sopenharmony_ci#define _CURSES_COLOR_NUM_TYPE          short
1597db96d56Sopenharmony_ci#define _CURSES_INIT_COLOR_FUNC         init_color
1607db96d56Sopenharmony_ci#define _CURSES_INIT_PAIR_FUNC          init_pair
1617db96d56Sopenharmony_ci#define _COLOR_CONTENT_FUNC             color_content
1627db96d56Sopenharmony_ci#define _CURSES_PAIR_CONTENT_FUNC       pair_content
1637db96d56Sopenharmony_ci#endif  /* _NCURSES_EXTENDED_COLOR_FUNCS */
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci/*[clinic input]
1667db96d56Sopenharmony_cimodule _curses
1677db96d56Sopenharmony_ciclass _curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
1687db96d56Sopenharmony_ci[clinic start generated code]*/
1697db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=43265c372c2887d6]*/
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci/* Definition of exception curses.error */
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_cistatic PyObject *PyCursesError;
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci/* Tells whether setupterm() has been called to initialise terminfo.  */
1767db96d56Sopenharmony_cistatic int initialised_setupterm = FALSE;
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci/* Tells whether initscr() has been called to initialise curses.  */
1797db96d56Sopenharmony_cistatic int initialised = FALSE;
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci/* Tells whether start_color() has been called to initialise color usage. */
1827db96d56Sopenharmony_cistatic int initialisedcolors = FALSE;
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_cistatic char *screen_encoding = NULL;
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci/* Utility Macros */
1877db96d56Sopenharmony_ci#define PyCursesSetupTermCalled                                         \
1887db96d56Sopenharmony_ci    if (initialised_setupterm != TRUE) {                                \
1897db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError,                                  \
1907db96d56Sopenharmony_ci                        "must call (at least) setupterm() first");      \
1917db96d56Sopenharmony_ci        return 0; }
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci#define PyCursesInitialised                             \
1947db96d56Sopenharmony_ci    if (initialised != TRUE) {                          \
1957db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError,                  \
1967db96d56Sopenharmony_ci                        "must call initscr() first");   \
1977db96d56Sopenharmony_ci        return 0; }
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci#define PyCursesInitialisedColor                                \
2007db96d56Sopenharmony_ci    if (initialisedcolors != TRUE) {                            \
2017db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError,                          \
2027db96d56Sopenharmony_ci                        "must call start_color() first");       \
2037db96d56Sopenharmony_ci        return 0; }
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci/* Utility Functions */
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci/*
2087db96d56Sopenharmony_ci * Check the return code from a curses function and return None
2097db96d56Sopenharmony_ci * or raise an exception as appropriate.  These are exported using the
2107db96d56Sopenharmony_ci * capsule API.
2117db96d56Sopenharmony_ci */
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_cistatic PyObject *
2147db96d56Sopenharmony_ciPyCursesCheckERR(int code, const char *fname)
2157db96d56Sopenharmony_ci{
2167db96d56Sopenharmony_ci    if (code != ERR) {
2177db96d56Sopenharmony_ci        Py_RETURN_NONE;
2187db96d56Sopenharmony_ci    } else {
2197db96d56Sopenharmony_ci        if (fname == NULL) {
2207db96d56Sopenharmony_ci            PyErr_SetString(PyCursesError, catchall_ERR);
2217db96d56Sopenharmony_ci        } else {
2227db96d56Sopenharmony_ci            PyErr_Format(PyCursesError, "%s() returned ERR", fname);
2237db96d56Sopenharmony_ci        }
2247db96d56Sopenharmony_ci        return NULL;
2257db96d56Sopenharmony_ci    }
2267db96d56Sopenharmony_ci}
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci/* Convert an object to a byte (an integer of type chtype):
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   - int
2317db96d56Sopenharmony_ci   - bytes of length 1
2327db96d56Sopenharmony_ci   - str of length 1
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci   Return 1 on success, 0 on error (invalid type or integer overflow). */
2357db96d56Sopenharmony_cistatic int
2367db96d56Sopenharmony_ciPyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
2377db96d56Sopenharmony_ci{
2387db96d56Sopenharmony_ci    long value;
2397db96d56Sopenharmony_ci    if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
2407db96d56Sopenharmony_ci        value = (unsigned char)PyBytes_AsString(obj)[0];
2417db96d56Sopenharmony_ci    }
2427db96d56Sopenharmony_ci    else if (PyUnicode_Check(obj)) {
2437db96d56Sopenharmony_ci        if (PyUnicode_GetLength(obj) != 1) {
2447db96d56Sopenharmony_ci            PyErr_Format(PyExc_TypeError,
2457db96d56Sopenharmony_ci                         "expect bytes or str of length 1, or int, "
2467db96d56Sopenharmony_ci                         "got a str of length %zi",
2477db96d56Sopenharmony_ci                         PyUnicode_GET_LENGTH(obj));
2487db96d56Sopenharmony_ci            return 0;
2497db96d56Sopenharmony_ci        }
2507db96d56Sopenharmony_ci        value = PyUnicode_READ_CHAR(obj, 0);
2517db96d56Sopenharmony_ci        if (128 < value) {
2527db96d56Sopenharmony_ci            PyObject *bytes;
2537db96d56Sopenharmony_ci            const char *encoding;
2547db96d56Sopenharmony_ci            if (win)
2557db96d56Sopenharmony_ci                encoding = win->encoding;
2567db96d56Sopenharmony_ci            else
2577db96d56Sopenharmony_ci                encoding = screen_encoding;
2587db96d56Sopenharmony_ci            bytes = PyUnicode_AsEncodedString(obj, encoding, NULL);
2597db96d56Sopenharmony_ci            if (bytes == NULL)
2607db96d56Sopenharmony_ci                return 0;
2617db96d56Sopenharmony_ci            if (PyBytes_GET_SIZE(bytes) == 1)
2627db96d56Sopenharmony_ci                value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
2637db96d56Sopenharmony_ci            else
2647db96d56Sopenharmony_ci                value = -1;
2657db96d56Sopenharmony_ci            Py_DECREF(bytes);
2667db96d56Sopenharmony_ci            if (value < 0)
2677db96d56Sopenharmony_ci                goto overflow;
2687db96d56Sopenharmony_ci        }
2697db96d56Sopenharmony_ci    }
2707db96d56Sopenharmony_ci    else if (PyLong_CheckExact(obj)) {
2717db96d56Sopenharmony_ci        int long_overflow;
2727db96d56Sopenharmony_ci        value = PyLong_AsLongAndOverflow(obj, &long_overflow);
2737db96d56Sopenharmony_ci        if (long_overflow)
2747db96d56Sopenharmony_ci            goto overflow;
2757db96d56Sopenharmony_ci    }
2767db96d56Sopenharmony_ci    else {
2777db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError,
2787db96d56Sopenharmony_ci                     "expect bytes or str of length 1, or int, got %s",
2797db96d56Sopenharmony_ci                     Py_TYPE(obj)->tp_name);
2807db96d56Sopenharmony_ci        return 0;
2817db96d56Sopenharmony_ci    }
2827db96d56Sopenharmony_ci    *ch = (chtype)value;
2837db96d56Sopenharmony_ci    if ((long)*ch != value)
2847db96d56Sopenharmony_ci        goto overflow;
2857db96d56Sopenharmony_ci    return 1;
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_cioverflow:
2887db96d56Sopenharmony_ci    PyErr_SetString(PyExc_OverflowError,
2897db96d56Sopenharmony_ci                    "byte doesn't fit in chtype");
2907db96d56Sopenharmony_ci    return 0;
2917db96d56Sopenharmony_ci}
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci/* Convert an object to a byte (chtype) or a character (cchar_t):
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci    - int
2967db96d56Sopenharmony_ci    - bytes of length 1
2977db96d56Sopenharmony_ci    - str of length 1
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci   Return:
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci    - 2 if obj is a character (written into *wch)
3027db96d56Sopenharmony_ci    - 1 if obj is a byte (written into *ch)
3037db96d56Sopenharmony_ci    - 0 on error: raise an exception */
3047db96d56Sopenharmony_cistatic int
3057db96d56Sopenharmony_ciPyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
3067db96d56Sopenharmony_ci                          chtype *ch
3077db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
3087db96d56Sopenharmony_ci                          , wchar_t *wch
3097db96d56Sopenharmony_ci#endif
3107db96d56Sopenharmony_ci                          )
3117db96d56Sopenharmony_ci{
3127db96d56Sopenharmony_ci    long value;
3137db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
3147db96d56Sopenharmony_ci    wchar_t buffer[2];
3157db96d56Sopenharmony_ci#endif
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci    if (PyUnicode_Check(obj)) {
3187db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
3197db96d56Sopenharmony_ci        if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3207db96d56Sopenharmony_ci            PyErr_Format(PyExc_TypeError,
3217db96d56Sopenharmony_ci                         "expect bytes or str of length 1, or int, "
3227db96d56Sopenharmony_ci                         "got a str of length %zi",
3237db96d56Sopenharmony_ci                         PyUnicode_GET_LENGTH(obj));
3247db96d56Sopenharmony_ci            return 0;
3257db96d56Sopenharmony_ci        }
3267db96d56Sopenharmony_ci        *wch = buffer[0];
3277db96d56Sopenharmony_ci        return 2;
3287db96d56Sopenharmony_ci#else
3297db96d56Sopenharmony_ci        return PyCurses_ConvertToChtype(win, obj, ch);
3307db96d56Sopenharmony_ci#endif
3317db96d56Sopenharmony_ci    }
3327db96d56Sopenharmony_ci    else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
3337db96d56Sopenharmony_ci        value = (unsigned char)PyBytes_AsString(obj)[0];
3347db96d56Sopenharmony_ci    }
3357db96d56Sopenharmony_ci    else if (PyLong_CheckExact(obj)) {
3367db96d56Sopenharmony_ci        int overflow;
3377db96d56Sopenharmony_ci        value = PyLong_AsLongAndOverflow(obj, &overflow);
3387db96d56Sopenharmony_ci        if (overflow) {
3397db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
3407db96d56Sopenharmony_ci                            "int doesn't fit in long");
3417db96d56Sopenharmony_ci            return 0;
3427db96d56Sopenharmony_ci        }
3437db96d56Sopenharmony_ci    }
3447db96d56Sopenharmony_ci    else {
3457db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError,
3467db96d56Sopenharmony_ci                     "expect bytes or str of length 1, or int, got %s",
3477db96d56Sopenharmony_ci                     Py_TYPE(obj)->tp_name);
3487db96d56Sopenharmony_ci        return 0;
3497db96d56Sopenharmony_ci    }
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci    *ch = (chtype)value;
3527db96d56Sopenharmony_ci    if ((long)*ch != value) {
3537db96d56Sopenharmony_ci        PyErr_Format(PyExc_OverflowError,
3547db96d56Sopenharmony_ci                     "byte doesn't fit in chtype");
3557db96d56Sopenharmony_ci        return 0;
3567db96d56Sopenharmony_ci    }
3577db96d56Sopenharmony_ci    return 1;
3587db96d56Sopenharmony_ci}
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci/* Convert an object to a byte string (char*) or a wide character string
3617db96d56Sopenharmony_ci   (wchar_t*). Return:
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci    - 2 if obj is a character string (written into *wch)
3647db96d56Sopenharmony_ci    - 1 if obj is a byte string (written into *bytes)
3657db96d56Sopenharmony_ci    - 0 on error: raise an exception */
3667db96d56Sopenharmony_cistatic int
3677db96d56Sopenharmony_ciPyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
3687db96d56Sopenharmony_ci                         PyObject **bytes, wchar_t **wstr)
3697db96d56Sopenharmony_ci{
3707db96d56Sopenharmony_ci    char *str;
3717db96d56Sopenharmony_ci    if (PyUnicode_Check(obj)) {
3727db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
3737db96d56Sopenharmony_ci        assert (wstr != NULL);
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci        *wstr = PyUnicode_AsWideCharString(obj, NULL);
3767db96d56Sopenharmony_ci        if (*wstr == NULL)
3777db96d56Sopenharmony_ci            return 0;
3787db96d56Sopenharmony_ci        return 2;
3797db96d56Sopenharmony_ci#else
3807db96d56Sopenharmony_ci        assert (wstr == NULL);
3817db96d56Sopenharmony_ci        *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
3827db96d56Sopenharmony_ci        if (*bytes == NULL)
3837db96d56Sopenharmony_ci            return 0;
3847db96d56Sopenharmony_ci        /* check for embedded null bytes */
3857db96d56Sopenharmony_ci        if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
3867db96d56Sopenharmony_ci            Py_CLEAR(*bytes);
3877db96d56Sopenharmony_ci            return 0;
3887db96d56Sopenharmony_ci        }
3897db96d56Sopenharmony_ci        return 1;
3907db96d56Sopenharmony_ci#endif
3917db96d56Sopenharmony_ci    }
3927db96d56Sopenharmony_ci    else if (PyBytes_Check(obj)) {
3937db96d56Sopenharmony_ci        Py_INCREF(obj);
3947db96d56Sopenharmony_ci        *bytes = obj;
3957db96d56Sopenharmony_ci        /* check for embedded null bytes */
3967db96d56Sopenharmony_ci        if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
3977db96d56Sopenharmony_ci            Py_DECREF(obj);
3987db96d56Sopenharmony_ci            return 0;
3997db96d56Sopenharmony_ci        }
4007db96d56Sopenharmony_ci        return 1;
4017db96d56Sopenharmony_ci    }
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci    PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
4047db96d56Sopenharmony_ci                 Py_TYPE(obj)->tp_name);
4057db96d56Sopenharmony_ci    return 0;
4067db96d56Sopenharmony_ci}
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_cistatic int
4097db96d56Sopenharmony_cicolor_allow_default_converter(PyObject *arg, void *ptr)
4107db96d56Sopenharmony_ci{
4117db96d56Sopenharmony_ci    long color_number;
4127db96d56Sopenharmony_ci    int overflow;
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ci    color_number = PyLong_AsLongAndOverflow(arg, &overflow);
4157db96d56Sopenharmony_ci    if (color_number == -1 && PyErr_Occurred())
4167db96d56Sopenharmony_ci        return 0;
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci    if (overflow > 0 || color_number >= COLORS) {
4197db96d56Sopenharmony_ci        PyErr_Format(PyExc_ValueError,
4207db96d56Sopenharmony_ci                     "Color number is greater than COLORS-1 (%d).",
4217db96d56Sopenharmony_ci                     COLORS - 1);
4227db96d56Sopenharmony_ci        return 0;
4237db96d56Sopenharmony_ci    }
4247db96d56Sopenharmony_ci    else if (overflow < 0 || color_number < 0) {
4257db96d56Sopenharmony_ci        color_number = -1;
4267db96d56Sopenharmony_ci    }
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci    *(int *)ptr = (int)color_number;
4297db96d56Sopenharmony_ci    return 1;
4307db96d56Sopenharmony_ci}
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_cistatic int
4337db96d56Sopenharmony_cicolor_converter(PyObject *arg, void *ptr)
4347db96d56Sopenharmony_ci{
4357db96d56Sopenharmony_ci    if (!color_allow_default_converter(arg, ptr)) {
4367db96d56Sopenharmony_ci        return 0;
4377db96d56Sopenharmony_ci    }
4387db96d56Sopenharmony_ci    if (*(int *)ptr < 0) {
4397db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
4407db96d56Sopenharmony_ci                        "Color number is less than 0.");
4417db96d56Sopenharmony_ci        return 0;
4427db96d56Sopenharmony_ci    }
4437db96d56Sopenharmony_ci    return 1;
4447db96d56Sopenharmony_ci}
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci/*[python input]
4477db96d56Sopenharmony_ciclass color_converter(CConverter):
4487db96d56Sopenharmony_ci    type = 'int'
4497db96d56Sopenharmony_ci    converter = 'color_converter'
4507db96d56Sopenharmony_ci[python start generated code]*/
4517db96d56Sopenharmony_ci/*[python end generated code: output=da39a3ee5e6b4b0d input=4260d2b6e66b3709]*/
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci/*[python input]
4547db96d56Sopenharmony_ciclass color_allow_default_converter(CConverter):
4557db96d56Sopenharmony_ci    type = 'int'
4567db96d56Sopenharmony_ci    converter = 'color_allow_default_converter'
4577db96d56Sopenharmony_ci[python start generated code]*/
4587db96d56Sopenharmony_ci/*[python end generated code: output=da39a3ee5e6b4b0d input=975602bc058a872d]*/
4597db96d56Sopenharmony_ci
4607db96d56Sopenharmony_cistatic int
4617db96d56Sopenharmony_cipair_converter(PyObject *arg, void *ptr)
4627db96d56Sopenharmony_ci{
4637db96d56Sopenharmony_ci    long pair_number;
4647db96d56Sopenharmony_ci    int overflow;
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci    pair_number = PyLong_AsLongAndOverflow(arg, &overflow);
4677db96d56Sopenharmony_ci    if (pair_number == -1 && PyErr_Occurred())
4687db96d56Sopenharmony_ci        return 0;
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci#if _NCURSES_EXTENDED_COLOR_FUNCS
4717db96d56Sopenharmony_ci    if (overflow > 0 || pair_number > INT_MAX) {
4727db96d56Sopenharmony_ci        PyErr_Format(PyExc_ValueError,
4737db96d56Sopenharmony_ci                     "Color pair is greater than maximum (%d).",
4747db96d56Sopenharmony_ci                     INT_MAX);
4757db96d56Sopenharmony_ci        return 0;
4767db96d56Sopenharmony_ci    }
4777db96d56Sopenharmony_ci#else
4787db96d56Sopenharmony_ci    if (overflow > 0 || pair_number >= COLOR_PAIRS) {
4797db96d56Sopenharmony_ci        PyErr_Format(PyExc_ValueError,
4807db96d56Sopenharmony_ci                     "Color pair is greater than COLOR_PAIRS-1 (%d).",
4817db96d56Sopenharmony_ci                     COLOR_PAIRS - 1);
4827db96d56Sopenharmony_ci        return 0;
4837db96d56Sopenharmony_ci    }
4847db96d56Sopenharmony_ci#endif
4857db96d56Sopenharmony_ci    else if (overflow < 0 || pair_number < 0) {
4867db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
4877db96d56Sopenharmony_ci                        "Color pair is less than 0.");
4887db96d56Sopenharmony_ci        return 0;
4897db96d56Sopenharmony_ci    }
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci    *(int *)ptr = (int)pair_number;
4927db96d56Sopenharmony_ci    return 1;
4937db96d56Sopenharmony_ci}
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci/*[python input]
4967db96d56Sopenharmony_ciclass pair_converter(CConverter):
4977db96d56Sopenharmony_ci    type = 'int'
4987db96d56Sopenharmony_ci    converter = 'pair_converter'
4997db96d56Sopenharmony_ci[python start generated code]*/
5007db96d56Sopenharmony_ci/*[python end generated code: output=da39a3ee5e6b4b0d input=1a918ae6a1b32af7]*/
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_cistatic int
5037db96d56Sopenharmony_cicomponent_converter(PyObject *arg, void *ptr)
5047db96d56Sopenharmony_ci{
5057db96d56Sopenharmony_ci    long component;
5067db96d56Sopenharmony_ci    int overflow;
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci    component = PyLong_AsLongAndOverflow(arg, &overflow);
5097db96d56Sopenharmony_ci    if (component == -1 && PyErr_Occurred())
5107db96d56Sopenharmony_ci        return 0;
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci    if (overflow > 0 || component > 1000) {
5137db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
5147db96d56Sopenharmony_ci                        "Color component is greater than 1000");
5157db96d56Sopenharmony_ci        return 0;
5167db96d56Sopenharmony_ci    }
5177db96d56Sopenharmony_ci    else if (overflow < 0 || component < 0) {
5187db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
5197db96d56Sopenharmony_ci                        "Color component is less than 0");
5207db96d56Sopenharmony_ci        return 0;
5217db96d56Sopenharmony_ci    }
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ci    *(short *)ptr = (short)component;
5247db96d56Sopenharmony_ci    return 1;
5257db96d56Sopenharmony_ci}
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci/*[python input]
5287db96d56Sopenharmony_ciclass component_converter(CConverter):
5297db96d56Sopenharmony_ci    type = 'short'
5307db96d56Sopenharmony_ci    converter = 'component_converter'
5317db96d56Sopenharmony_ci[python start generated code]*/
5327db96d56Sopenharmony_ci/*[python end generated code: output=da39a3ee5e6b4b0d input=38e9be01d33927fb]*/
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci/* Function versions of the 3 functions for testing whether curses has been
5357db96d56Sopenharmony_ci   initialised or not. */
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_cistatic int func_PyCursesSetupTermCalled(void)
5387db96d56Sopenharmony_ci{
5397db96d56Sopenharmony_ci    PyCursesSetupTermCalled;
5407db96d56Sopenharmony_ci    return 1;
5417db96d56Sopenharmony_ci}
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_cistatic int func_PyCursesInitialised(void)
5447db96d56Sopenharmony_ci{
5457db96d56Sopenharmony_ci    PyCursesInitialised;
5467db96d56Sopenharmony_ci    return 1;
5477db96d56Sopenharmony_ci}
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_cistatic int func_PyCursesInitialisedColor(void)
5507db96d56Sopenharmony_ci{
5517db96d56Sopenharmony_ci    PyCursesInitialisedColor;
5527db96d56Sopenharmony_ci    return 1;
5537db96d56Sopenharmony_ci}
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci/*****************************************************************************
5567db96d56Sopenharmony_ci The Window Object
5577db96d56Sopenharmony_ci******************************************************************************/
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci/* Definition of the window type */
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ciPyTypeObject PyCursesWindow_Type;
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci/* Function prototype macros for Window object
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ci   X - function name
5667db96d56Sopenharmony_ci   TYPE - parameter Type
5677db96d56Sopenharmony_ci   ERGSTR - format string for construction of the return value
5687db96d56Sopenharmony_ci   PARSESTR - format string for argument parsing
5697db96d56Sopenharmony_ci*/
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci#define Window_NoArgNoReturnFunction(X)                         \
5727db96d56Sopenharmony_ci    static PyObject *PyCursesWindow_ ## X                       \
5737db96d56Sopenharmony_ci    (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored))  \
5747db96d56Sopenharmony_ci    { return PyCursesCheckERR(X(self->win), # X); }
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci#define Window_NoArgTrueFalseFunction(X)                                \
5777db96d56Sopenharmony_ci    static PyObject * PyCursesWindow_ ## X                              \
5787db96d56Sopenharmony_ci    (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored))          \
5797db96d56Sopenharmony_ci    {                                                                   \
5807db96d56Sopenharmony_ci        return PyBool_FromLong(X(self->win)); }
5817db96d56Sopenharmony_ci
5827db96d56Sopenharmony_ci#define Window_NoArgNoReturnVoidFunction(X)                     \
5837db96d56Sopenharmony_ci    static PyObject * PyCursesWindow_ ## X                      \
5847db96d56Sopenharmony_ci    (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored))  \
5857db96d56Sopenharmony_ci    {                                                           \
5867db96d56Sopenharmony_ci        X(self->win); Py_RETURN_NONE; }
5877db96d56Sopenharmony_ci
5887db96d56Sopenharmony_ci#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR)               \
5897db96d56Sopenharmony_ci    static PyObject * PyCursesWindow_ ## X                              \
5907db96d56Sopenharmony_ci    (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored))          \
5917db96d56Sopenharmony_ci    {                                                                   \
5927db96d56Sopenharmony_ci        TYPE arg1, arg2;                                                \
5937db96d56Sopenharmony_ci        X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR)            \
5967db96d56Sopenharmony_ci    static PyObject * PyCursesWindow_ ## X                              \
5977db96d56Sopenharmony_ci    (PyCursesWindowObject *self, PyObject *args)                        \
5987db96d56Sopenharmony_ci    {                                                                   \
5997db96d56Sopenharmony_ci        TYPE arg1;                                                      \
6007db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL;      \
6017db96d56Sopenharmony_ci        X(self->win,arg1); Py_RETURN_NONE; }
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR)                \
6047db96d56Sopenharmony_ci    static PyObject * PyCursesWindow_ ## X                              \
6057db96d56Sopenharmony_ci    (PyCursesWindowObject *self, PyObject *args)                        \
6067db96d56Sopenharmony_ci    {                                                                   \
6077db96d56Sopenharmony_ci        TYPE arg1;                                                      \
6087db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL;       \
6097db96d56Sopenharmony_ci        return PyCursesCheckERR(X(self->win, arg1), # X); }
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR)                \
6127db96d56Sopenharmony_ci    static PyObject * PyCursesWindow_ ## X                              \
6137db96d56Sopenharmony_ci    (PyCursesWindowObject *self, PyObject *args)                        \
6147db96d56Sopenharmony_ci    {                                                                   \
6157db96d56Sopenharmony_ci        TYPE arg1, arg2;                                                \
6167db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
6177db96d56Sopenharmony_ci        return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
6187db96d56Sopenharmony_ci
6197db96d56Sopenharmony_ci/* ------------- WINDOW routines --------------- */
6207db96d56Sopenharmony_ci
6217db96d56Sopenharmony_ciWindow_NoArgNoReturnFunction(untouchwin)
6227db96d56Sopenharmony_ciWindow_NoArgNoReturnFunction(touchwin)
6237db96d56Sopenharmony_ciWindow_NoArgNoReturnFunction(redrawwin)
6247db96d56Sopenharmony_ciWindow_NoArgNoReturnFunction(winsertln)
6257db96d56Sopenharmony_ciWindow_NoArgNoReturnFunction(werase)
6267db96d56Sopenharmony_ciWindow_NoArgNoReturnFunction(wdeleteln)
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ciWindow_NoArgTrueFalseFunction(is_wintouched)
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wsyncup)
6317db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wsyncdown)
6327db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wstandend)
6337db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wstandout)
6347db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wcursyncup)
6357db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wclrtoeol)
6367db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wclrtobot)
6377db96d56Sopenharmony_ciWindow_NoArgNoReturnVoidFunction(wclear)
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_ciWindow_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
6407db96d56Sopenharmony_ci#ifdef HAVE_CURSES_IMMEDOK
6417db96d56Sopenharmony_ciWindow_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
6427db96d56Sopenharmony_ci#endif
6437db96d56Sopenharmony_ciWindow_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
6447db96d56Sopenharmony_ci
6457db96d56Sopenharmony_ciWindow_NoArg2TupleReturnFunction(getyx, int, "ii")
6467db96d56Sopenharmony_ciWindow_NoArg2TupleReturnFunction(getbegyx, int, "ii")
6477db96d56Sopenharmony_ciWindow_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
6487db96d56Sopenharmony_ciWindow_NoArg2TupleReturnFunction(getparyx, int, "ii")
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
6517db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
6527db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
6537db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
6547db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
6557db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
6567db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
6577db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
6587db96d56Sopenharmony_ci#ifdef HAVE_CURSES_SYNCOK
6597db96d56Sopenharmony_ciWindow_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
6607db96d56Sopenharmony_ci#endif
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ciWindow_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
6637db96d56Sopenharmony_ciWindow_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
6647db96d56Sopenharmony_ciWindow_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
6657db96d56Sopenharmony_ci#ifndef STRICT_SYSV_CURSES
6667db96d56Sopenharmony_ciWindow_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
6677db96d56Sopenharmony_ci#endif
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci/* Allocation and deallocation of Window Objects */
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_cistatic PyObject *
6727db96d56Sopenharmony_ciPyCursesWindow_New(WINDOW *win, const char *encoding)
6737db96d56Sopenharmony_ci{
6747db96d56Sopenharmony_ci    PyCursesWindowObject *wo;
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci    if (encoding == NULL) {
6777db96d56Sopenharmony_ci#if defined(MS_WINDOWS)
6787db96d56Sopenharmony_ci        char *buffer[100];
6797db96d56Sopenharmony_ci        UINT cp;
6807db96d56Sopenharmony_ci        cp = GetConsoleOutputCP();
6817db96d56Sopenharmony_ci        if (cp != 0) {
6827db96d56Sopenharmony_ci            PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
6837db96d56Sopenharmony_ci            encoding = buffer;
6847db96d56Sopenharmony_ci        }
6857db96d56Sopenharmony_ci#elif defined(CODESET)
6867db96d56Sopenharmony_ci        const char *codeset = nl_langinfo(CODESET);
6877db96d56Sopenharmony_ci        if (codeset != NULL && codeset[0] != 0)
6887db96d56Sopenharmony_ci            encoding = codeset;
6897db96d56Sopenharmony_ci#endif
6907db96d56Sopenharmony_ci        if (encoding == NULL)
6917db96d56Sopenharmony_ci            encoding = "utf-8";
6927db96d56Sopenharmony_ci    }
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci    wo = PyObject_New(PyCursesWindowObject, &PyCursesWindow_Type);
6957db96d56Sopenharmony_ci    if (wo == NULL) return NULL;
6967db96d56Sopenharmony_ci    wo->win = win;
6977db96d56Sopenharmony_ci    wo->encoding = _PyMem_Strdup(encoding);
6987db96d56Sopenharmony_ci    if (wo->encoding == NULL) {
6997db96d56Sopenharmony_ci        Py_DECREF(wo);
7007db96d56Sopenharmony_ci        PyErr_NoMemory();
7017db96d56Sopenharmony_ci        return NULL;
7027db96d56Sopenharmony_ci    }
7037db96d56Sopenharmony_ci    return (PyObject *)wo;
7047db96d56Sopenharmony_ci}
7057db96d56Sopenharmony_ci
7067db96d56Sopenharmony_cistatic void
7077db96d56Sopenharmony_ciPyCursesWindow_Dealloc(PyCursesWindowObject *wo)
7087db96d56Sopenharmony_ci{
7097db96d56Sopenharmony_ci    if (wo->win != stdscr) delwin(wo->win);
7107db96d56Sopenharmony_ci    if (wo->encoding != NULL)
7117db96d56Sopenharmony_ci        PyMem_Free(wo->encoding);
7127db96d56Sopenharmony_ci    PyObject_Free(wo);
7137db96d56Sopenharmony_ci}
7147db96d56Sopenharmony_ci
7157db96d56Sopenharmony_ci/* Addch, Addstr, Addnstr */
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci/*[clinic input]
7187db96d56Sopenharmony_ci_curses.window.addch
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ci    [
7217db96d56Sopenharmony_ci    y: int
7227db96d56Sopenharmony_ci        Y-coordinate.
7237db96d56Sopenharmony_ci    x: int
7247db96d56Sopenharmony_ci        X-coordinate.
7257db96d56Sopenharmony_ci    ]
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci    ch: object
7287db96d56Sopenharmony_ci        Character to add.
7297db96d56Sopenharmony_ci
7307db96d56Sopenharmony_ci    [
7317db96d56Sopenharmony_ci    attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
7327db96d56Sopenharmony_ci        Attributes for the character.
7337db96d56Sopenharmony_ci    ]
7347db96d56Sopenharmony_ci    /
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ciPaint the character.
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ciPaint character ch at (y, x) with attributes attr,
7397db96d56Sopenharmony_cioverwriting any character previously painted at that location.
7407db96d56Sopenharmony_ciBy default, the character position and attributes are the
7417db96d56Sopenharmony_cicurrent settings for the window object.
7427db96d56Sopenharmony_ci[clinic start generated code]*/
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_cistatic PyObject *
7457db96d56Sopenharmony_ci_curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1,
7467db96d56Sopenharmony_ci                          int y, int x, PyObject *ch, int group_right_1,
7477db96d56Sopenharmony_ci                          long attr)
7487db96d56Sopenharmony_ci/*[clinic end generated code: output=00f4c37af3378f45 input=95ce131578458196]*/
7497db96d56Sopenharmony_ci{
7507db96d56Sopenharmony_ci    int coordinates_group = group_left_1;
7517db96d56Sopenharmony_ci    int rtn;
7527db96d56Sopenharmony_ci    int type;
7537db96d56Sopenharmony_ci    chtype cch = 0;
7547db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
7557db96d56Sopenharmony_ci    wchar_t wstr[2];
7567db96d56Sopenharmony_ci    cchar_t wcval;
7577db96d56Sopenharmony_ci#endif
7587db96d56Sopenharmony_ci    const char *funcname;
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
7617db96d56Sopenharmony_ci    type = PyCurses_ConvertToCchar_t(self, ch, &cch, wstr);
7627db96d56Sopenharmony_ci    if (type == 2) {
7637db96d56Sopenharmony_ci        funcname = "add_wch";
7647db96d56Sopenharmony_ci        wstr[1] = L'\0';
7657db96d56Sopenharmony_ci        setcchar(&wcval, wstr, attr, PAIR_NUMBER(attr), NULL);
7667db96d56Sopenharmony_ci        if (coordinates_group)
7677db96d56Sopenharmony_ci            rtn = mvwadd_wch(self->win,y,x, &wcval);
7687db96d56Sopenharmony_ci        else {
7697db96d56Sopenharmony_ci            rtn = wadd_wch(self->win, &wcval);
7707db96d56Sopenharmony_ci        }
7717db96d56Sopenharmony_ci    }
7727db96d56Sopenharmony_ci    else
7737db96d56Sopenharmony_ci#else
7747db96d56Sopenharmony_ci    type = PyCurses_ConvertToCchar_t(self, ch, &cch);
7757db96d56Sopenharmony_ci#endif
7767db96d56Sopenharmony_ci    if (type == 1) {
7777db96d56Sopenharmony_ci        funcname = "addch";
7787db96d56Sopenharmony_ci        if (coordinates_group)
7797db96d56Sopenharmony_ci            rtn = mvwaddch(self->win,y,x, cch | (attr_t) attr);
7807db96d56Sopenharmony_ci        else {
7817db96d56Sopenharmony_ci            rtn = waddch(self->win, cch | (attr_t) attr);
7827db96d56Sopenharmony_ci        }
7837db96d56Sopenharmony_ci    }
7847db96d56Sopenharmony_ci    else {
7857db96d56Sopenharmony_ci        return NULL;
7867db96d56Sopenharmony_ci    }
7877db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, funcname);
7887db96d56Sopenharmony_ci}
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_ci/*[clinic input]
7917db96d56Sopenharmony_ci_curses.window.addstr
7927db96d56Sopenharmony_ci
7937db96d56Sopenharmony_ci    [
7947db96d56Sopenharmony_ci    y: int
7957db96d56Sopenharmony_ci        Y-coordinate.
7967db96d56Sopenharmony_ci    x: int
7977db96d56Sopenharmony_ci        X-coordinate.
7987db96d56Sopenharmony_ci    ]
7997db96d56Sopenharmony_ci
8007db96d56Sopenharmony_ci    str: object
8017db96d56Sopenharmony_ci        String to add.
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci    [
8047db96d56Sopenharmony_ci    attr: long
8057db96d56Sopenharmony_ci        Attributes for characters.
8067db96d56Sopenharmony_ci    ]
8077db96d56Sopenharmony_ci    /
8087db96d56Sopenharmony_ci
8097db96d56Sopenharmony_ciPaint the string.
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ciPaint the string str at (y, x) with attributes attr,
8127db96d56Sopenharmony_cioverwriting anything previously on the display.
8137db96d56Sopenharmony_ciBy default, the character position and attributes are the
8147db96d56Sopenharmony_cicurrent settings for the window object.
8157db96d56Sopenharmony_ci[clinic start generated code]*/
8167db96d56Sopenharmony_ci
8177db96d56Sopenharmony_cistatic PyObject *
8187db96d56Sopenharmony_ci_curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1,
8197db96d56Sopenharmony_ci                           int y, int x, PyObject *str, int group_right_1,
8207db96d56Sopenharmony_ci                           long attr)
8217db96d56Sopenharmony_ci/*[clinic end generated code: output=65a928ea85ff3115 input=ff6cbb91448a22a3]*/
8227db96d56Sopenharmony_ci{
8237db96d56Sopenharmony_ci    int rtn;
8247db96d56Sopenharmony_ci    int strtype;
8257db96d56Sopenharmony_ci    PyObject *bytesobj = NULL;
8267db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
8277db96d56Sopenharmony_ci    wchar_t *wstr = NULL;
8287db96d56Sopenharmony_ci#endif
8297db96d56Sopenharmony_ci    attr_t attr_old = A_NORMAL;
8307db96d56Sopenharmony_ci    int use_xy = group_left_1, use_attr = group_right_1;
8317db96d56Sopenharmony_ci    const char *funcname;
8327db96d56Sopenharmony_ci
8337db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
8347db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
8357db96d56Sopenharmony_ci#else
8367db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
8377db96d56Sopenharmony_ci#endif
8387db96d56Sopenharmony_ci    if (strtype == 0) {
8397db96d56Sopenharmony_ci        return NULL;
8407db96d56Sopenharmony_ci    }
8417db96d56Sopenharmony_ci    if (use_attr) {
8427db96d56Sopenharmony_ci        attr_old = getattrs(self->win);
8437db96d56Sopenharmony_ci        (void)wattrset(self->win,attr);
8447db96d56Sopenharmony_ci    }
8457db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
8467db96d56Sopenharmony_ci    if (strtype == 2) {
8477db96d56Sopenharmony_ci        funcname = "addwstr";
8487db96d56Sopenharmony_ci        if (use_xy)
8497db96d56Sopenharmony_ci            rtn = mvwaddwstr(self->win,y,x,wstr);
8507db96d56Sopenharmony_ci        else
8517db96d56Sopenharmony_ci            rtn = waddwstr(self->win,wstr);
8527db96d56Sopenharmony_ci        PyMem_Free(wstr);
8537db96d56Sopenharmony_ci    }
8547db96d56Sopenharmony_ci    else
8557db96d56Sopenharmony_ci#endif
8567db96d56Sopenharmony_ci    {
8577db96d56Sopenharmony_ci        const char *str = PyBytes_AS_STRING(bytesobj);
8587db96d56Sopenharmony_ci        funcname = "addstr";
8597db96d56Sopenharmony_ci        if (use_xy)
8607db96d56Sopenharmony_ci            rtn = mvwaddstr(self->win,y,x,str);
8617db96d56Sopenharmony_ci        else
8627db96d56Sopenharmony_ci            rtn = waddstr(self->win,str);
8637db96d56Sopenharmony_ci        Py_DECREF(bytesobj);
8647db96d56Sopenharmony_ci    }
8657db96d56Sopenharmony_ci    if (use_attr)
8667db96d56Sopenharmony_ci        (void)wattrset(self->win,attr_old);
8677db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, funcname);
8687db96d56Sopenharmony_ci}
8697db96d56Sopenharmony_ci
8707db96d56Sopenharmony_ci/*[clinic input]
8717db96d56Sopenharmony_ci_curses.window.addnstr
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_ci    [
8747db96d56Sopenharmony_ci    y: int
8757db96d56Sopenharmony_ci        Y-coordinate.
8767db96d56Sopenharmony_ci    x: int
8777db96d56Sopenharmony_ci        X-coordinate.
8787db96d56Sopenharmony_ci    ]
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci    str: object
8817db96d56Sopenharmony_ci        String to add.
8827db96d56Sopenharmony_ci
8837db96d56Sopenharmony_ci    n: int
8847db96d56Sopenharmony_ci        Maximal number of characters.
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci    [
8877db96d56Sopenharmony_ci    attr: long
8887db96d56Sopenharmony_ci        Attributes for characters.
8897db96d56Sopenharmony_ci    ]
8907db96d56Sopenharmony_ci    /
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ciPaint at most n characters of the string.
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ciPaint at most n characters of the string str at (y, x) with
8957db96d56Sopenharmony_ciattributes attr, overwriting anything previously on the display.
8967db96d56Sopenharmony_ciBy default, the character position and attributes are the
8977db96d56Sopenharmony_cicurrent settings for the window object.
8987db96d56Sopenharmony_ci[clinic start generated code]*/
8997db96d56Sopenharmony_ci
9007db96d56Sopenharmony_cistatic PyObject *
9017db96d56Sopenharmony_ci_curses_window_addnstr_impl(PyCursesWindowObject *self, int group_left_1,
9027db96d56Sopenharmony_ci                            int y, int x, PyObject *str, int n,
9037db96d56Sopenharmony_ci                            int group_right_1, long attr)
9047db96d56Sopenharmony_ci/*[clinic end generated code: output=6d21cee2ce6876d9 input=72718415c2744a2a]*/
9057db96d56Sopenharmony_ci{
9067db96d56Sopenharmony_ci    int rtn;
9077db96d56Sopenharmony_ci    int strtype;
9087db96d56Sopenharmony_ci    PyObject *bytesobj = NULL;
9097db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
9107db96d56Sopenharmony_ci    wchar_t *wstr = NULL;
9117db96d56Sopenharmony_ci#endif
9127db96d56Sopenharmony_ci    attr_t attr_old = A_NORMAL;
9137db96d56Sopenharmony_ci    int use_xy = group_left_1, use_attr = group_right_1;
9147db96d56Sopenharmony_ci    const char *funcname;
9157db96d56Sopenharmony_ci
9167db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
9177db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
9187db96d56Sopenharmony_ci#else
9197db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
9207db96d56Sopenharmony_ci#endif
9217db96d56Sopenharmony_ci    if (strtype == 0)
9227db96d56Sopenharmony_ci        return NULL;
9237db96d56Sopenharmony_ci
9247db96d56Sopenharmony_ci    if (use_attr) {
9257db96d56Sopenharmony_ci        attr_old = getattrs(self->win);
9267db96d56Sopenharmony_ci        (void)wattrset(self->win,attr);
9277db96d56Sopenharmony_ci    }
9287db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
9297db96d56Sopenharmony_ci    if (strtype == 2) {
9307db96d56Sopenharmony_ci        funcname = "addnwstr";
9317db96d56Sopenharmony_ci        if (use_xy)
9327db96d56Sopenharmony_ci            rtn = mvwaddnwstr(self->win,y,x,wstr,n);
9337db96d56Sopenharmony_ci        else
9347db96d56Sopenharmony_ci            rtn = waddnwstr(self->win,wstr,n);
9357db96d56Sopenharmony_ci        PyMem_Free(wstr);
9367db96d56Sopenharmony_ci    }
9377db96d56Sopenharmony_ci    else
9387db96d56Sopenharmony_ci#endif
9397db96d56Sopenharmony_ci    {
9407db96d56Sopenharmony_ci        const char *str = PyBytes_AS_STRING(bytesobj);
9417db96d56Sopenharmony_ci        funcname = "addnstr";
9427db96d56Sopenharmony_ci        if (use_xy)
9437db96d56Sopenharmony_ci            rtn = mvwaddnstr(self->win,y,x,str,n);
9447db96d56Sopenharmony_ci        else
9457db96d56Sopenharmony_ci            rtn = waddnstr(self->win,str,n);
9467db96d56Sopenharmony_ci        Py_DECREF(bytesobj);
9477db96d56Sopenharmony_ci    }
9487db96d56Sopenharmony_ci    if (use_attr)
9497db96d56Sopenharmony_ci        (void)wattrset(self->win,attr_old);
9507db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, funcname);
9517db96d56Sopenharmony_ci}
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_ci/*[clinic input]
9547db96d56Sopenharmony_ci_curses.window.bkgd
9557db96d56Sopenharmony_ci
9567db96d56Sopenharmony_ci    ch: object
9577db96d56Sopenharmony_ci        Background character.
9587db96d56Sopenharmony_ci    attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
9597db96d56Sopenharmony_ci        Background attributes.
9607db96d56Sopenharmony_ci    /
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ciSet the background property of the window.
9637db96d56Sopenharmony_ci[clinic start generated code]*/
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_cistatic PyObject *
9667db96d56Sopenharmony_ci_curses_window_bkgd_impl(PyCursesWindowObject *self, PyObject *ch, long attr)
9677db96d56Sopenharmony_ci/*[clinic end generated code: output=058290afb2cf4034 input=634015bcb339283d]*/
9687db96d56Sopenharmony_ci{
9697db96d56Sopenharmony_ci    chtype bkgd;
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(self, ch, &bkgd))
9727db96d56Sopenharmony_ci        return NULL;
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ci    return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
9757db96d56Sopenharmony_ci}
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ci/*[clinic input]
9787db96d56Sopenharmony_ci_curses.window.attroff
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci    attr: long
9817db96d56Sopenharmony_ci    /
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ciRemove attribute attr from the "background" set.
9847db96d56Sopenharmony_ci[clinic start generated code]*/
9857db96d56Sopenharmony_ci
9867db96d56Sopenharmony_cistatic PyObject *
9877db96d56Sopenharmony_ci_curses_window_attroff_impl(PyCursesWindowObject *self, long attr)
9887db96d56Sopenharmony_ci/*[clinic end generated code: output=8a2fcd4df682fc64 input=786beedf06a7befe]*/
9897db96d56Sopenharmony_ci{
9907db96d56Sopenharmony_ci    return PyCursesCheckERR(wattroff(self->win, (attr_t)attr), "attroff");
9917db96d56Sopenharmony_ci}
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci/*[clinic input]
9947db96d56Sopenharmony_ci_curses.window.attron
9957db96d56Sopenharmony_ci
9967db96d56Sopenharmony_ci    attr: long
9977db96d56Sopenharmony_ci    /
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ciAdd attribute attr from the "background" set.
10007db96d56Sopenharmony_ci[clinic start generated code]*/
10017db96d56Sopenharmony_ci
10027db96d56Sopenharmony_cistatic PyObject *
10037db96d56Sopenharmony_ci_curses_window_attron_impl(PyCursesWindowObject *self, long attr)
10047db96d56Sopenharmony_ci/*[clinic end generated code: output=7afea43b237fa870 input=5a88fba7b1524f32]*/
10057db96d56Sopenharmony_ci{
10067db96d56Sopenharmony_ci    return PyCursesCheckERR(wattron(self->win, (attr_t)attr), "attron");
10077db96d56Sopenharmony_ci}
10087db96d56Sopenharmony_ci
10097db96d56Sopenharmony_ci/*[clinic input]
10107db96d56Sopenharmony_ci_curses.window.attrset
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci    attr: long
10137db96d56Sopenharmony_ci    /
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ciSet the "background" set of attributes.
10167db96d56Sopenharmony_ci[clinic start generated code]*/
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_cistatic PyObject *
10197db96d56Sopenharmony_ci_curses_window_attrset_impl(PyCursesWindowObject *self, long attr)
10207db96d56Sopenharmony_ci/*[clinic end generated code: output=84e379bff20c0433 input=42e400c0d0154ab5]*/
10217db96d56Sopenharmony_ci{
10227db96d56Sopenharmony_ci    return PyCursesCheckERR(wattrset(self->win, (attr_t)attr), "attrset");
10237db96d56Sopenharmony_ci}
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci/*[clinic input]
10267db96d56Sopenharmony_ci_curses.window.bkgdset
10277db96d56Sopenharmony_ci
10287db96d56Sopenharmony_ci    ch: object
10297db96d56Sopenharmony_ci        Background character.
10307db96d56Sopenharmony_ci    attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
10317db96d56Sopenharmony_ci        Background attributes.
10327db96d56Sopenharmony_ci    /
10337db96d56Sopenharmony_ci
10347db96d56Sopenharmony_ciSet the window's background.
10357db96d56Sopenharmony_ci[clinic start generated code]*/
10367db96d56Sopenharmony_ci
10377db96d56Sopenharmony_cistatic PyObject *
10387db96d56Sopenharmony_ci_curses_window_bkgdset_impl(PyCursesWindowObject *self, PyObject *ch,
10397db96d56Sopenharmony_ci                            long attr)
10407db96d56Sopenharmony_ci/*[clinic end generated code: output=8cb994fc4d7e2496 input=e09c682425c9e45b]*/
10417db96d56Sopenharmony_ci{
10427db96d56Sopenharmony_ci    chtype bkgd;
10437db96d56Sopenharmony_ci
10447db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(self, ch, &bkgd))
10457db96d56Sopenharmony_ci        return NULL;
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci    wbkgdset(self->win, bkgd | attr);
10487db96d56Sopenharmony_ci    return PyCursesCheckERR(0, "bkgdset");
10497db96d56Sopenharmony_ci}
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci/*[clinic input]
10527db96d56Sopenharmony_ci_curses.window.border
10537db96d56Sopenharmony_ci
10547db96d56Sopenharmony_ci    ls: object(c_default="NULL") = _curses.ACS_VLINE
10557db96d56Sopenharmony_ci        Left side.
10567db96d56Sopenharmony_ci    rs: object(c_default="NULL") = _curses.ACS_VLINE
10577db96d56Sopenharmony_ci        Right side.
10587db96d56Sopenharmony_ci    ts: object(c_default="NULL") = _curses.ACS_HLINE
10597db96d56Sopenharmony_ci        Top side.
10607db96d56Sopenharmony_ci    bs: object(c_default="NULL") = _curses.ACS_HLINE
10617db96d56Sopenharmony_ci        Bottom side.
10627db96d56Sopenharmony_ci    tl: object(c_default="NULL") = _curses.ACS_ULCORNER
10637db96d56Sopenharmony_ci        Upper-left corner.
10647db96d56Sopenharmony_ci    tr: object(c_default="NULL") = _curses.ACS_URCORNER
10657db96d56Sopenharmony_ci        Upper-right corner.
10667db96d56Sopenharmony_ci    bl: object(c_default="NULL") = _curses.ACS_LLCORNER
10677db96d56Sopenharmony_ci        Bottom-left corner.
10687db96d56Sopenharmony_ci    br: object(c_default="NULL") = _curses.ACS_LRCORNER
10697db96d56Sopenharmony_ci        Bottom-right corner.
10707db96d56Sopenharmony_ci    /
10717db96d56Sopenharmony_ci
10727db96d56Sopenharmony_ciDraw a border around the edges of the window.
10737db96d56Sopenharmony_ci
10747db96d56Sopenharmony_ciEach parameter specifies the character to use for a specific part of the
10757db96d56Sopenharmony_ciborder.  The characters can be specified as integers or as one-character
10767db96d56Sopenharmony_cistrings.  A 0 value for any parameter will cause the default character to be
10777db96d56Sopenharmony_ciused for that parameter.
10787db96d56Sopenharmony_ci[clinic start generated code]*/
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_cistatic PyObject *
10817db96d56Sopenharmony_ci_curses_window_border_impl(PyCursesWindowObject *self, PyObject *ls,
10827db96d56Sopenharmony_ci                           PyObject *rs, PyObject *ts, PyObject *bs,
10837db96d56Sopenharmony_ci                           PyObject *tl, PyObject *tr, PyObject *bl,
10847db96d56Sopenharmony_ci                           PyObject *br)
10857db96d56Sopenharmony_ci/*[clinic end generated code: output=670ef38d3d7c2aa3 input=e015f735d67a240b]*/
10867db96d56Sopenharmony_ci{
10877db96d56Sopenharmony_ci    chtype ch[8];
10887db96d56Sopenharmony_ci    int i;
10897db96d56Sopenharmony_ci
10907db96d56Sopenharmony_ci    /* Clear the array of parameters */
10917db96d56Sopenharmony_ci    for(i=0; i<8; i++)
10927db96d56Sopenharmony_ci        ch[i] = 0;
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci#define CONVERTTOCHTYPE(obj, i) \
10957db96d56Sopenharmony_ci    if ((obj) != NULL && !PyCurses_ConvertToChtype(self, (obj), &ch[(i)])) \
10967db96d56Sopenharmony_ci        return NULL;
10977db96d56Sopenharmony_ci
10987db96d56Sopenharmony_ci    CONVERTTOCHTYPE(ls, 0);
10997db96d56Sopenharmony_ci    CONVERTTOCHTYPE(rs, 1);
11007db96d56Sopenharmony_ci    CONVERTTOCHTYPE(ts, 2);
11017db96d56Sopenharmony_ci    CONVERTTOCHTYPE(bs, 3);
11027db96d56Sopenharmony_ci    CONVERTTOCHTYPE(tl, 4);
11037db96d56Sopenharmony_ci    CONVERTTOCHTYPE(tr, 5);
11047db96d56Sopenharmony_ci    CONVERTTOCHTYPE(bl, 6);
11057db96d56Sopenharmony_ci    CONVERTTOCHTYPE(br, 7);
11067db96d56Sopenharmony_ci
11077db96d56Sopenharmony_ci#undef CONVERTTOCHTYPE
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci    wborder(self->win,
11107db96d56Sopenharmony_ci            ch[0], ch[1], ch[2], ch[3],
11117db96d56Sopenharmony_ci            ch[4], ch[5], ch[6], ch[7]);
11127db96d56Sopenharmony_ci    Py_RETURN_NONE;
11137db96d56Sopenharmony_ci}
11147db96d56Sopenharmony_ci
11157db96d56Sopenharmony_ci/*[clinic input]
11167db96d56Sopenharmony_ci_curses.window.box
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci    [
11197db96d56Sopenharmony_ci    verch: object(c_default="_PyLong_GetZero()") = 0
11207db96d56Sopenharmony_ci        Left and right side.
11217db96d56Sopenharmony_ci    horch: object(c_default="_PyLong_GetZero()") = 0
11227db96d56Sopenharmony_ci        Top and bottom side.
11237db96d56Sopenharmony_ci    ]
11247db96d56Sopenharmony_ci    /
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ciDraw a border around the edges of the window.
11277db96d56Sopenharmony_ci
11287db96d56Sopenharmony_ciSimilar to border(), but both ls and rs are verch and both ts and bs are
11297db96d56Sopenharmony_cihorch.  The default corner characters are always used by this function.
11307db96d56Sopenharmony_ci[clinic start generated code]*/
11317db96d56Sopenharmony_ci
11327db96d56Sopenharmony_cistatic PyObject *
11337db96d56Sopenharmony_ci_curses_window_box_impl(PyCursesWindowObject *self, int group_right_1,
11347db96d56Sopenharmony_ci                        PyObject *verch, PyObject *horch)
11357db96d56Sopenharmony_ci/*[clinic end generated code: output=f3fcb038bb287192 input=f00435f9c8c98f60]*/
11367db96d56Sopenharmony_ci{
11377db96d56Sopenharmony_ci    chtype ch1 = 0, ch2 = 0;
11387db96d56Sopenharmony_ci    if (group_right_1) {
11397db96d56Sopenharmony_ci        if (!PyCurses_ConvertToChtype(self, verch, &ch1)) {
11407db96d56Sopenharmony_ci            return NULL;
11417db96d56Sopenharmony_ci        }
11427db96d56Sopenharmony_ci        if (!PyCurses_ConvertToChtype(self, horch, &ch2)) {
11437db96d56Sopenharmony_ci            return NULL;
11447db96d56Sopenharmony_ci        }
11457db96d56Sopenharmony_ci    }
11467db96d56Sopenharmony_ci    box(self->win,ch1,ch2);
11477db96d56Sopenharmony_ci    Py_RETURN_NONE;
11487db96d56Sopenharmony_ci}
11497db96d56Sopenharmony_ci
11507db96d56Sopenharmony_ci#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
11517db96d56Sopenharmony_ci#define py_mvwdelch mvwdelch
11527db96d56Sopenharmony_ci#else
11537db96d56Sopenharmony_ciint py_mvwdelch(WINDOW *w, int y, int x)
11547db96d56Sopenharmony_ci{
11557db96d56Sopenharmony_ci    mvwdelch(w,y,x);
11567db96d56Sopenharmony_ci    /* On HP/UX, mvwdelch already returns. On other systems,
11577db96d56Sopenharmony_ci       we may well run into this return statement. */
11587db96d56Sopenharmony_ci    return 0;
11597db96d56Sopenharmony_ci}
11607db96d56Sopenharmony_ci#endif
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ci#if defined(HAVE_CURSES_IS_PAD)
11637db96d56Sopenharmony_ci#define py_is_pad(win)      is_pad(win)
11647db96d56Sopenharmony_ci#elif defined(WINDOW_HAS_FLAGS)
11657db96d56Sopenharmony_ci#define py_is_pad(win)      ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
11667db96d56Sopenharmony_ci#endif
11677db96d56Sopenharmony_ci
11687db96d56Sopenharmony_ci/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
11697db96d56Sopenharmony_ci#ifdef HAVE_CURSES_WCHGAT
11707db96d56Sopenharmony_ci/*[-clinic input]
11717db96d56Sopenharmony_ci_curses.window.chgat
11727db96d56Sopenharmony_ci
11737db96d56Sopenharmony_ci    [
11747db96d56Sopenharmony_ci    y: int
11757db96d56Sopenharmony_ci        Y-coordinate.
11767db96d56Sopenharmony_ci    x: int
11777db96d56Sopenharmony_ci        X-coordinate.
11787db96d56Sopenharmony_ci    ]
11797db96d56Sopenharmony_ci
11807db96d56Sopenharmony_ci    n: int = -1
11817db96d56Sopenharmony_ci        Number of characters.
11827db96d56Sopenharmony_ci
11837db96d56Sopenharmony_ci    attr: long
11847db96d56Sopenharmony_ci        Attributes for characters.
11857db96d56Sopenharmony_ci    /
11867db96d56Sopenharmony_ci
11877db96d56Sopenharmony_ciSet the attributes of characters.
11887db96d56Sopenharmony_ci
11897db96d56Sopenharmony_ciSet the attributes of num characters at the current cursor position, or at
11907db96d56Sopenharmony_ciposition (y, x) if supplied.  If no value of num is given or num = -1, the
11917db96d56Sopenharmony_ciattribute will be set on all the characters to the end of the line.  This
11927db96d56Sopenharmony_cifunction does not move the cursor.  The changed line will be touched using
11937db96d56Sopenharmony_cithe touchline() method so that the contents will be redisplayed by the next
11947db96d56Sopenharmony_ciwindow refresh.
11957db96d56Sopenharmony_ci[-clinic start generated code]*/
11967db96d56Sopenharmony_cistatic PyObject *
11977db96d56Sopenharmony_ciPyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
11987db96d56Sopenharmony_ci{
11997db96d56Sopenharmony_ci    int rtn;
12007db96d56Sopenharmony_ci    int x, y;
12017db96d56Sopenharmony_ci    int num = -1;
12027db96d56Sopenharmony_ci    short color;
12037db96d56Sopenharmony_ci    attr_t attr = A_NORMAL;
12047db96d56Sopenharmony_ci    long lattr;
12057db96d56Sopenharmony_ci    int use_xy = FALSE;
12067db96d56Sopenharmony_ci
12077db96d56Sopenharmony_ci    switch (PyTuple_Size(args)) {
12087db96d56Sopenharmony_ci    case 1:
12097db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"l;attr", &lattr))
12107db96d56Sopenharmony_ci            return NULL;
12117db96d56Sopenharmony_ci        attr = lattr;
12127db96d56Sopenharmony_ci        break;
12137db96d56Sopenharmony_ci    case 2:
12147db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
12157db96d56Sopenharmony_ci            return NULL;
12167db96d56Sopenharmony_ci        attr = lattr;
12177db96d56Sopenharmony_ci        break;
12187db96d56Sopenharmony_ci    case 3:
12197db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
12207db96d56Sopenharmony_ci            return NULL;
12217db96d56Sopenharmony_ci        attr = lattr;
12227db96d56Sopenharmony_ci        use_xy = TRUE;
12237db96d56Sopenharmony_ci        break;
12247db96d56Sopenharmony_ci    case 4:
12257db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
12267db96d56Sopenharmony_ci            return NULL;
12277db96d56Sopenharmony_ci        attr = lattr;
12287db96d56Sopenharmony_ci        use_xy = TRUE;
12297db96d56Sopenharmony_ci        break;
12307db96d56Sopenharmony_ci    default:
12317db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
12327db96d56Sopenharmony_ci        return NULL;
12337db96d56Sopenharmony_ci    }
12347db96d56Sopenharmony_ci
12357db96d56Sopenharmony_ci    color = (short) PAIR_NUMBER(attr);
12367db96d56Sopenharmony_ci    attr = attr & A_ATTRIBUTES;
12377db96d56Sopenharmony_ci
12387db96d56Sopenharmony_ci    if (use_xy) {
12397db96d56Sopenharmony_ci        rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
12407db96d56Sopenharmony_ci        touchline(self->win,y,1);
12417db96d56Sopenharmony_ci    } else {
12427db96d56Sopenharmony_ci        getyx(self->win,y,x);
12437db96d56Sopenharmony_ci        rtn = wchgat(self->win,num,attr,color,NULL);
12447db96d56Sopenharmony_ci        touchline(self->win,y,1);
12457db96d56Sopenharmony_ci    }
12467db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, "chgat");
12477db96d56Sopenharmony_ci}
12487db96d56Sopenharmony_ci#endif
12497db96d56Sopenharmony_ci
12507db96d56Sopenharmony_ci/*[clinic input]
12517db96d56Sopenharmony_ci_curses.window.delch
12527db96d56Sopenharmony_ci
12537db96d56Sopenharmony_ci    [
12547db96d56Sopenharmony_ci    y: int
12557db96d56Sopenharmony_ci        Y-coordinate.
12567db96d56Sopenharmony_ci    x: int
12577db96d56Sopenharmony_ci        X-coordinate.
12587db96d56Sopenharmony_ci    ]
12597db96d56Sopenharmony_ci    /
12607db96d56Sopenharmony_ci
12617db96d56Sopenharmony_ciDelete any character at (y, x).
12627db96d56Sopenharmony_ci[clinic start generated code]*/
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_cistatic PyObject *
12657db96d56Sopenharmony_ci_curses_window_delch_impl(PyCursesWindowObject *self, int group_right_1,
12667db96d56Sopenharmony_ci                          int y, int x)
12677db96d56Sopenharmony_ci/*[clinic end generated code: output=22e77bb9fa11b461 input=d2f79e630a4fc6d0]*/
12687db96d56Sopenharmony_ci{
12697db96d56Sopenharmony_ci    if (!group_right_1) {
12707db96d56Sopenharmony_ci        return PyCursesCheckERR(wdelch(self->win), "wdelch");
12717db96d56Sopenharmony_ci    }
12727db96d56Sopenharmony_ci    else {
12737db96d56Sopenharmony_ci        return PyCursesCheckERR(py_mvwdelch(self->win, y, x), "mvwdelch");
12747db96d56Sopenharmony_ci    }
12757db96d56Sopenharmony_ci}
12767db96d56Sopenharmony_ci
12777db96d56Sopenharmony_ci/*[clinic input]
12787db96d56Sopenharmony_ci_curses.window.derwin
12797db96d56Sopenharmony_ci
12807db96d56Sopenharmony_ci    [
12817db96d56Sopenharmony_ci    nlines: int = 0
12827db96d56Sopenharmony_ci        Height.
12837db96d56Sopenharmony_ci    ncols: int = 0
12847db96d56Sopenharmony_ci        Width.
12857db96d56Sopenharmony_ci    ]
12867db96d56Sopenharmony_ci    begin_y: int
12877db96d56Sopenharmony_ci        Top side y-coordinate.
12887db96d56Sopenharmony_ci    begin_x: int
12897db96d56Sopenharmony_ci        Left side x-coordinate.
12907db96d56Sopenharmony_ci    /
12917db96d56Sopenharmony_ci
12927db96d56Sopenharmony_ciCreate a sub-window (window-relative coordinates).
12937db96d56Sopenharmony_ci
12947db96d56Sopenharmony_ciderwin() is the same as calling subwin(), except that begin_y and begin_x
12957db96d56Sopenharmony_ciare relative to the origin of the window, rather than relative to the entire
12967db96d56Sopenharmony_ciscreen.
12977db96d56Sopenharmony_ci[clinic start generated code]*/
12987db96d56Sopenharmony_ci
12997db96d56Sopenharmony_cistatic PyObject *
13007db96d56Sopenharmony_ci_curses_window_derwin_impl(PyCursesWindowObject *self, int group_left_1,
13017db96d56Sopenharmony_ci                           int nlines, int ncols, int begin_y, int begin_x)
13027db96d56Sopenharmony_ci/*[clinic end generated code: output=7924b112d9f70d6e input=966d9481f7f5022e]*/
13037db96d56Sopenharmony_ci{
13047db96d56Sopenharmony_ci    WINDOW *win;
13057db96d56Sopenharmony_ci
13067db96d56Sopenharmony_ci    win = derwin(self->win,nlines,ncols,begin_y,begin_x);
13077db96d56Sopenharmony_ci
13087db96d56Sopenharmony_ci    if (win == NULL) {
13097db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, catchall_NULL);
13107db96d56Sopenharmony_ci        return NULL;
13117db96d56Sopenharmony_ci    }
13127db96d56Sopenharmony_ci
13137db96d56Sopenharmony_ci    return (PyObject *)PyCursesWindow_New(win, NULL);
13147db96d56Sopenharmony_ci}
13157db96d56Sopenharmony_ci
13167db96d56Sopenharmony_ci/*[clinic input]
13177db96d56Sopenharmony_ci_curses.window.echochar
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ci    ch: object
13207db96d56Sopenharmony_ci        Character to add.
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci    attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
13237db96d56Sopenharmony_ci        Attributes for the character.
13247db96d56Sopenharmony_ci    /
13257db96d56Sopenharmony_ci
13267db96d56Sopenharmony_ciAdd character ch with attribute attr, and refresh.
13277db96d56Sopenharmony_ci[clinic start generated code]*/
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_cistatic PyObject *
13307db96d56Sopenharmony_ci_curses_window_echochar_impl(PyCursesWindowObject *self, PyObject *ch,
13317db96d56Sopenharmony_ci                             long attr)
13327db96d56Sopenharmony_ci/*[clinic end generated code: output=13e7dd875d4b9642 input=e7f34b964e92b156]*/
13337db96d56Sopenharmony_ci{
13347db96d56Sopenharmony_ci    chtype ch_;
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(self, ch, &ch_))
13377db96d56Sopenharmony_ci        return NULL;
13387db96d56Sopenharmony_ci
13397db96d56Sopenharmony_ci#ifdef py_is_pad
13407db96d56Sopenharmony_ci    if (py_is_pad(self->win)) {
13417db96d56Sopenharmony_ci        return PyCursesCheckERR(pechochar(self->win, ch_ | (attr_t)attr),
13427db96d56Sopenharmony_ci                                "echochar");
13437db96d56Sopenharmony_ci    }
13447db96d56Sopenharmony_ci    else
13457db96d56Sopenharmony_ci#endif
13467db96d56Sopenharmony_ci        return PyCursesCheckERR(wechochar(self->win, ch_ | (attr_t)attr),
13477db96d56Sopenharmony_ci                                "echochar");
13487db96d56Sopenharmony_ci}
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_ci#ifdef NCURSES_MOUSE_VERSION
13517db96d56Sopenharmony_ci/*[clinic input]
13527db96d56Sopenharmony_ci_curses.window.enclose
13537db96d56Sopenharmony_ci
13547db96d56Sopenharmony_ci    y: int
13557db96d56Sopenharmony_ci        Y-coordinate.
13567db96d56Sopenharmony_ci    x: int
13577db96d56Sopenharmony_ci        X-coordinate.
13587db96d56Sopenharmony_ci    /
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ciReturn True if the screen-relative coordinates are enclosed by the window.
13617db96d56Sopenharmony_ci[clinic start generated code]*/
13627db96d56Sopenharmony_ci
13637db96d56Sopenharmony_cistatic PyObject *
13647db96d56Sopenharmony_ci_curses_window_enclose_impl(PyCursesWindowObject *self, int y, int x)
13657db96d56Sopenharmony_ci/*[clinic end generated code: output=8679beef50502648 input=4fd3355d723f7bc9]*/
13667db96d56Sopenharmony_ci{
13677db96d56Sopenharmony_ci    return PyBool_FromLong(wenclose(self->win, y, x));
13687db96d56Sopenharmony_ci}
13697db96d56Sopenharmony_ci#endif
13707db96d56Sopenharmony_ci
13717db96d56Sopenharmony_ci/*[clinic input]
13727db96d56Sopenharmony_ci_curses.window.getbkgd -> long
13737db96d56Sopenharmony_ci
13747db96d56Sopenharmony_ciReturn the window's current background character/attribute pair.
13757db96d56Sopenharmony_ci[clinic start generated code]*/
13767db96d56Sopenharmony_ci
13777db96d56Sopenharmony_cistatic long
13787db96d56Sopenharmony_ci_curses_window_getbkgd_impl(PyCursesWindowObject *self)
13797db96d56Sopenharmony_ci/*[clinic end generated code: output=c52b25dc16b215c3 input=a69db882fa35426c]*/
13807db96d56Sopenharmony_ci{
13817db96d56Sopenharmony_ci    return (long) getbkgd(self->win);
13827db96d56Sopenharmony_ci}
13837db96d56Sopenharmony_ci
13847db96d56Sopenharmony_ci/*[clinic input]
13857db96d56Sopenharmony_ci_curses.window.getch -> int
13867db96d56Sopenharmony_ci
13877db96d56Sopenharmony_ci    [
13887db96d56Sopenharmony_ci    y: int
13897db96d56Sopenharmony_ci        Y-coordinate.
13907db96d56Sopenharmony_ci    x: int
13917db96d56Sopenharmony_ci        X-coordinate.
13927db96d56Sopenharmony_ci    ]
13937db96d56Sopenharmony_ci    /
13947db96d56Sopenharmony_ci
13957db96d56Sopenharmony_ciGet a character code from terminal keyboard.
13967db96d56Sopenharmony_ci
13977db96d56Sopenharmony_ciThe integer returned does not have to be in ASCII range: function keys,
13987db96d56Sopenharmony_cikeypad keys and so on return numbers higher than 256.  In no-delay mode, -1
13997db96d56Sopenharmony_ciis returned if there is no input, else getch() waits until a key is pressed.
14007db96d56Sopenharmony_ci[clinic start generated code]*/
14017db96d56Sopenharmony_ci
14027db96d56Sopenharmony_cistatic int
14037db96d56Sopenharmony_ci_curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
14047db96d56Sopenharmony_ci                          int y, int x)
14057db96d56Sopenharmony_ci/*[clinic end generated code: output=980aa6af0c0ca387 input=bb24ebfb379f991f]*/
14067db96d56Sopenharmony_ci{
14077db96d56Sopenharmony_ci    int rtn;
14087db96d56Sopenharmony_ci
14097db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
14107db96d56Sopenharmony_ci    if (!group_right_1) {
14117db96d56Sopenharmony_ci        rtn = wgetch(self->win);
14127db96d56Sopenharmony_ci    }
14137db96d56Sopenharmony_ci    else {
14147db96d56Sopenharmony_ci        rtn = mvwgetch(self->win, y, x);
14157db96d56Sopenharmony_ci    }
14167db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
14177db96d56Sopenharmony_ci
14187db96d56Sopenharmony_ci    return rtn;
14197db96d56Sopenharmony_ci}
14207db96d56Sopenharmony_ci
14217db96d56Sopenharmony_ci/*[clinic input]
14227db96d56Sopenharmony_ci_curses.window.getkey
14237db96d56Sopenharmony_ci
14247db96d56Sopenharmony_ci    [
14257db96d56Sopenharmony_ci    y: int
14267db96d56Sopenharmony_ci        Y-coordinate.
14277db96d56Sopenharmony_ci    x: int
14287db96d56Sopenharmony_ci        X-coordinate.
14297db96d56Sopenharmony_ci    ]
14307db96d56Sopenharmony_ci    /
14317db96d56Sopenharmony_ci
14327db96d56Sopenharmony_ciGet a character (string) from terminal keyboard.
14337db96d56Sopenharmony_ci
14347db96d56Sopenharmony_ciReturning a string instead of an integer, as getch() does.  Function keys,
14357db96d56Sopenharmony_cikeypad keys and other special keys return a multibyte string containing the
14367db96d56Sopenharmony_cikey name.  In no-delay mode, an exception is raised if there is no input.
14377db96d56Sopenharmony_ci[clinic start generated code]*/
14387db96d56Sopenharmony_ci
14397db96d56Sopenharmony_cistatic PyObject *
14407db96d56Sopenharmony_ci_curses_window_getkey_impl(PyCursesWindowObject *self, int group_right_1,
14417db96d56Sopenharmony_ci                           int y, int x)
14427db96d56Sopenharmony_ci/*[clinic end generated code: output=8490a182db46b10f input=be2dee34f5cf57f8]*/
14437db96d56Sopenharmony_ci{
14447db96d56Sopenharmony_ci    int rtn;
14457db96d56Sopenharmony_ci
14467db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
14477db96d56Sopenharmony_ci    if (!group_right_1) {
14487db96d56Sopenharmony_ci        rtn = wgetch(self->win);
14497db96d56Sopenharmony_ci    }
14507db96d56Sopenharmony_ci    else {
14517db96d56Sopenharmony_ci        rtn = mvwgetch(self->win, y, x);
14527db96d56Sopenharmony_ci    }
14537db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
14547db96d56Sopenharmony_ci
14557db96d56Sopenharmony_ci    if (rtn == ERR) {
14567db96d56Sopenharmony_ci        /* getch() returns ERR in nodelay mode */
14577db96d56Sopenharmony_ci        PyErr_CheckSignals();
14587db96d56Sopenharmony_ci        if (!PyErr_Occurred())
14597db96d56Sopenharmony_ci            PyErr_SetString(PyCursesError, "no input");
14607db96d56Sopenharmony_ci        return NULL;
14617db96d56Sopenharmony_ci    } else if (rtn <= 255) {
14627db96d56Sopenharmony_ci#ifdef NCURSES_VERSION_MAJOR
14637db96d56Sopenharmony_ci#if NCURSES_VERSION_MAJOR*100+NCURSES_VERSION_MINOR <= 507
14647db96d56Sopenharmony_ci        /* Work around a bug in ncurses 5.7 and earlier */
14657db96d56Sopenharmony_ci        if (rtn < 0) {
14667db96d56Sopenharmony_ci            rtn += 256;
14677db96d56Sopenharmony_ci        }
14687db96d56Sopenharmony_ci#endif
14697db96d56Sopenharmony_ci#endif
14707db96d56Sopenharmony_ci        return PyUnicode_FromOrdinal(rtn);
14717db96d56Sopenharmony_ci    } else {
14727db96d56Sopenharmony_ci        const char *knp = keyname(rtn);
14737db96d56Sopenharmony_ci        return PyUnicode_FromString((knp == NULL) ? "" : knp);
14747db96d56Sopenharmony_ci    }
14757db96d56Sopenharmony_ci}
14767db96d56Sopenharmony_ci
14777db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
14787db96d56Sopenharmony_ci/*[clinic input]
14797db96d56Sopenharmony_ci_curses.window.get_wch
14807db96d56Sopenharmony_ci
14817db96d56Sopenharmony_ci    [
14827db96d56Sopenharmony_ci    y: int
14837db96d56Sopenharmony_ci        Y-coordinate.
14847db96d56Sopenharmony_ci    x: int
14857db96d56Sopenharmony_ci        X-coordinate.
14867db96d56Sopenharmony_ci    ]
14877db96d56Sopenharmony_ci    /
14887db96d56Sopenharmony_ci
14897db96d56Sopenharmony_ciGet a wide character from terminal keyboard.
14907db96d56Sopenharmony_ci
14917db96d56Sopenharmony_ciReturn a character for most keys, or an integer for function keys,
14927db96d56Sopenharmony_cikeypad keys, and other special keys.
14937db96d56Sopenharmony_ci[clinic start generated code]*/
14947db96d56Sopenharmony_ci
14957db96d56Sopenharmony_cistatic PyObject *
14967db96d56Sopenharmony_ci_curses_window_get_wch_impl(PyCursesWindowObject *self, int group_right_1,
14977db96d56Sopenharmony_ci                            int y, int x)
14987db96d56Sopenharmony_ci/*[clinic end generated code: output=9f4f86e91fe50ef3 input=dd7e5367fb49dc48]*/
14997db96d56Sopenharmony_ci{
15007db96d56Sopenharmony_ci    int ct;
15017db96d56Sopenharmony_ci    wint_t rtn;
15027db96d56Sopenharmony_ci
15037db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
15047db96d56Sopenharmony_ci    if (!group_right_1) {
15057db96d56Sopenharmony_ci        ct = wget_wch(self->win ,&rtn);
15067db96d56Sopenharmony_ci    }
15077db96d56Sopenharmony_ci    else {
15087db96d56Sopenharmony_ci        ct = mvwget_wch(self->win, y, x, &rtn);
15097db96d56Sopenharmony_ci    }
15107db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
15117db96d56Sopenharmony_ci
15127db96d56Sopenharmony_ci    if (ct == ERR) {
15137db96d56Sopenharmony_ci        if (PyErr_CheckSignals())
15147db96d56Sopenharmony_ci            return NULL;
15157db96d56Sopenharmony_ci
15167db96d56Sopenharmony_ci        /* get_wch() returns ERR in nodelay mode */
15177db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, "no input");
15187db96d56Sopenharmony_ci        return NULL;
15197db96d56Sopenharmony_ci    }
15207db96d56Sopenharmony_ci    if (ct == KEY_CODE_YES)
15217db96d56Sopenharmony_ci        return PyLong_FromLong(rtn);
15227db96d56Sopenharmony_ci    else
15237db96d56Sopenharmony_ci        return PyUnicode_FromOrdinal(rtn);
15247db96d56Sopenharmony_ci}
15257db96d56Sopenharmony_ci#endif
15267db96d56Sopenharmony_ci
15277db96d56Sopenharmony_ci/*[-clinic input]
15287db96d56Sopenharmony_ci_curses.window.getstr
15297db96d56Sopenharmony_ci
15307db96d56Sopenharmony_ci    [
15317db96d56Sopenharmony_ci    y: int
15327db96d56Sopenharmony_ci        Y-coordinate.
15337db96d56Sopenharmony_ci    x: int
15347db96d56Sopenharmony_ci        X-coordinate.
15357db96d56Sopenharmony_ci    ]
15367db96d56Sopenharmony_ci    n: int = 1023
15377db96d56Sopenharmony_ci        Maximal number of characters.
15387db96d56Sopenharmony_ci    /
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ciRead a string from the user, with primitive line editing capacity.
15417db96d56Sopenharmony_ci[-clinic start generated code]*/
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_cistatic PyObject *
15447db96d56Sopenharmony_ciPyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
15457db96d56Sopenharmony_ci{
15467db96d56Sopenharmony_ci    int x, y, n;
15477db96d56Sopenharmony_ci    char rtn[1024]; /* This should be big enough.. I hope */
15487db96d56Sopenharmony_ci    int rtn2;
15497db96d56Sopenharmony_ci
15507db96d56Sopenharmony_ci    switch (PyTuple_Size(args)) {
15517db96d56Sopenharmony_ci    case 0:
15527db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
15537db96d56Sopenharmony_ci        rtn2 = wgetnstr(self->win,rtn, 1023);
15547db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
15557db96d56Sopenharmony_ci        break;
15567db96d56Sopenharmony_ci    case 1:
15577db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"i;n", &n))
15587db96d56Sopenharmony_ci            return NULL;
15597db96d56Sopenharmony_ci        if (n < 0) {
15607db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
15617db96d56Sopenharmony_ci            return NULL;
15627db96d56Sopenharmony_ci        }
15637db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
15647db96d56Sopenharmony_ci        rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
15657db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
15667db96d56Sopenharmony_ci        break;
15677db96d56Sopenharmony_ci    case 2:
15687db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
15697db96d56Sopenharmony_ci            return NULL;
15707db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
15717db96d56Sopenharmony_ci#ifdef STRICT_SYSV_CURSES
15727db96d56Sopenharmony_ci        rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
15737db96d56Sopenharmony_ci#else
15747db96d56Sopenharmony_ci        rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
15757db96d56Sopenharmony_ci#endif
15767db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
15777db96d56Sopenharmony_ci        break;
15787db96d56Sopenharmony_ci    case 3:
15797db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
15807db96d56Sopenharmony_ci            return NULL;
15817db96d56Sopenharmony_ci        if (n < 0) {
15827db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
15837db96d56Sopenharmony_ci            return NULL;
15847db96d56Sopenharmony_ci        }
15857db96d56Sopenharmony_ci#ifdef STRICT_SYSV_CURSES
15867db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
15877db96d56Sopenharmony_ci        rtn2 = wmove(self->win,y,x)==ERR ? ERR :
15887db96d56Sopenharmony_ci        wgetnstr(self->win, rtn, Py_MIN(n, 1023));
15897db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
15907db96d56Sopenharmony_ci#else
15917db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
15927db96d56Sopenharmony_ci        rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
15937db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
15947db96d56Sopenharmony_ci#endif
15957db96d56Sopenharmony_ci        break;
15967db96d56Sopenharmony_ci    default:
15977db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
15987db96d56Sopenharmony_ci        return NULL;
15997db96d56Sopenharmony_ci    }
16007db96d56Sopenharmony_ci    if (rtn2 == ERR)
16017db96d56Sopenharmony_ci        rtn[0] = 0;
16027db96d56Sopenharmony_ci    return PyBytes_FromString(rtn);
16037db96d56Sopenharmony_ci}
16047db96d56Sopenharmony_ci
16057db96d56Sopenharmony_ci/*[clinic input]
16067db96d56Sopenharmony_ci_curses.window.hline
16077db96d56Sopenharmony_ci
16087db96d56Sopenharmony_ci    [
16097db96d56Sopenharmony_ci    y: int
16107db96d56Sopenharmony_ci        Starting Y-coordinate.
16117db96d56Sopenharmony_ci    x: int
16127db96d56Sopenharmony_ci        Starting X-coordinate.
16137db96d56Sopenharmony_ci    ]
16147db96d56Sopenharmony_ci
16157db96d56Sopenharmony_ci    ch: object
16167db96d56Sopenharmony_ci        Character to draw.
16177db96d56Sopenharmony_ci    n: int
16187db96d56Sopenharmony_ci        Line length.
16197db96d56Sopenharmony_ci
16207db96d56Sopenharmony_ci    [
16217db96d56Sopenharmony_ci    attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
16227db96d56Sopenharmony_ci        Attributes for the characters.
16237db96d56Sopenharmony_ci    ]
16247db96d56Sopenharmony_ci    /
16257db96d56Sopenharmony_ci
16267db96d56Sopenharmony_ciDisplay a horizontal line.
16277db96d56Sopenharmony_ci[clinic start generated code]*/
16287db96d56Sopenharmony_ci
16297db96d56Sopenharmony_cistatic PyObject *
16307db96d56Sopenharmony_ci_curses_window_hline_impl(PyCursesWindowObject *self, int group_left_1,
16317db96d56Sopenharmony_ci                          int y, int x, PyObject *ch, int n,
16327db96d56Sopenharmony_ci                          int group_right_1, long attr)
16337db96d56Sopenharmony_ci/*[clinic end generated code: output=c00d489d61fc9eef input=81a4dea47268163e]*/
16347db96d56Sopenharmony_ci{
16357db96d56Sopenharmony_ci    chtype ch_;
16367db96d56Sopenharmony_ci
16377db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(self, ch, &ch_))
16387db96d56Sopenharmony_ci        return NULL;
16397db96d56Sopenharmony_ci    if (group_left_1) {
16407db96d56Sopenharmony_ci        if (wmove(self->win, y, x) == ERR) {
16417db96d56Sopenharmony_ci            return PyCursesCheckERR(ERR, "wmove");
16427db96d56Sopenharmony_ci        }
16437db96d56Sopenharmony_ci    }
16447db96d56Sopenharmony_ci    return PyCursesCheckERR(whline(self->win, ch_ | (attr_t)attr, n), "hline");
16457db96d56Sopenharmony_ci}
16467db96d56Sopenharmony_ci
16477db96d56Sopenharmony_ci/*[clinic input]
16487db96d56Sopenharmony_ci_curses.window.insch
16497db96d56Sopenharmony_ci
16507db96d56Sopenharmony_ci    [
16517db96d56Sopenharmony_ci    y: int
16527db96d56Sopenharmony_ci        Y-coordinate.
16537db96d56Sopenharmony_ci    x: int
16547db96d56Sopenharmony_ci        X-coordinate.
16557db96d56Sopenharmony_ci    ]
16567db96d56Sopenharmony_ci
16577db96d56Sopenharmony_ci    ch: object
16587db96d56Sopenharmony_ci        Character to insert.
16597db96d56Sopenharmony_ci
16607db96d56Sopenharmony_ci    [
16617db96d56Sopenharmony_ci    attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
16627db96d56Sopenharmony_ci        Attributes for the character.
16637db96d56Sopenharmony_ci    ]
16647db96d56Sopenharmony_ci    /
16657db96d56Sopenharmony_ci
16667db96d56Sopenharmony_ciInsert a character before the current or specified position.
16677db96d56Sopenharmony_ci
16687db96d56Sopenharmony_ciAll characters to the right of the cursor are shifted one position right, with
16697db96d56Sopenharmony_cithe rightmost characters on the line being lost.
16707db96d56Sopenharmony_ci[clinic start generated code]*/
16717db96d56Sopenharmony_ci
16727db96d56Sopenharmony_cistatic PyObject *
16737db96d56Sopenharmony_ci_curses_window_insch_impl(PyCursesWindowObject *self, int group_left_1,
16747db96d56Sopenharmony_ci                          int y, int x, PyObject *ch, int group_right_1,
16757db96d56Sopenharmony_ci                          long attr)
16767db96d56Sopenharmony_ci/*[clinic end generated code: output=ade8cfe3a3bf3e34 input=336342756ee19812]*/
16777db96d56Sopenharmony_ci{
16787db96d56Sopenharmony_ci    int rtn;
16797db96d56Sopenharmony_ci    chtype ch_ = 0;
16807db96d56Sopenharmony_ci
16817db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(self, ch, &ch_))
16827db96d56Sopenharmony_ci        return NULL;
16837db96d56Sopenharmony_ci
16847db96d56Sopenharmony_ci    if (!group_left_1) {
16857db96d56Sopenharmony_ci        rtn = winsch(self->win, ch_ | (attr_t)attr);
16867db96d56Sopenharmony_ci    }
16877db96d56Sopenharmony_ci    else {
16887db96d56Sopenharmony_ci        rtn = mvwinsch(self->win, y, x, ch_ | (attr_t)attr);
16897db96d56Sopenharmony_ci    }
16907db96d56Sopenharmony_ci
16917db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, "insch");
16927db96d56Sopenharmony_ci}
16937db96d56Sopenharmony_ci
16947db96d56Sopenharmony_ci/*[clinic input]
16957db96d56Sopenharmony_ci_curses.window.inch -> unsigned_long
16967db96d56Sopenharmony_ci
16977db96d56Sopenharmony_ci    [
16987db96d56Sopenharmony_ci    y: int
16997db96d56Sopenharmony_ci        Y-coordinate.
17007db96d56Sopenharmony_ci    x: int
17017db96d56Sopenharmony_ci        X-coordinate.
17027db96d56Sopenharmony_ci    ]
17037db96d56Sopenharmony_ci    /
17047db96d56Sopenharmony_ci
17057db96d56Sopenharmony_ciReturn the character at the given position in the window.
17067db96d56Sopenharmony_ci
17077db96d56Sopenharmony_ciThe bottom 8 bits are the character proper, and upper bits are the attributes.
17087db96d56Sopenharmony_ci[clinic start generated code]*/
17097db96d56Sopenharmony_ci
17107db96d56Sopenharmony_cistatic unsigned long
17117db96d56Sopenharmony_ci_curses_window_inch_impl(PyCursesWindowObject *self, int group_right_1,
17127db96d56Sopenharmony_ci                         int y, int x)
17137db96d56Sopenharmony_ci/*[clinic end generated code: output=6c4719fe978fe86a input=fac23ee11e3b3a66]*/
17147db96d56Sopenharmony_ci{
17157db96d56Sopenharmony_ci    unsigned long rtn;
17167db96d56Sopenharmony_ci
17177db96d56Sopenharmony_ci    if (!group_right_1) {
17187db96d56Sopenharmony_ci        rtn = winch(self->win);
17197db96d56Sopenharmony_ci    }
17207db96d56Sopenharmony_ci    else {
17217db96d56Sopenharmony_ci        rtn = mvwinch(self->win, y, x);
17227db96d56Sopenharmony_ci    }
17237db96d56Sopenharmony_ci
17247db96d56Sopenharmony_ci    return rtn;
17257db96d56Sopenharmony_ci}
17267db96d56Sopenharmony_ci
17277db96d56Sopenharmony_ci/*[-clinic input]
17287db96d56Sopenharmony_ci_curses.window.instr
17297db96d56Sopenharmony_ci
17307db96d56Sopenharmony_ci    [
17317db96d56Sopenharmony_ci    y: int
17327db96d56Sopenharmony_ci        Y-coordinate.
17337db96d56Sopenharmony_ci    x: int
17347db96d56Sopenharmony_ci        X-coordinate.
17357db96d56Sopenharmony_ci    ]
17367db96d56Sopenharmony_ci    n: int = 1023
17377db96d56Sopenharmony_ci        Maximal number of characters.
17387db96d56Sopenharmony_ci    /
17397db96d56Sopenharmony_ci
17407db96d56Sopenharmony_ciReturn a string of characters, extracted from the window.
17417db96d56Sopenharmony_ci
17427db96d56Sopenharmony_ciReturn a string of characters, extracted from the window starting at the
17437db96d56Sopenharmony_cicurrent cursor position, or at y, x if specified.  Attributes are stripped
17447db96d56Sopenharmony_cifrom the characters.  If n is specified, instr() returns a string at most
17457db96d56Sopenharmony_cin characters long (exclusive of the trailing NUL).
17467db96d56Sopenharmony_ci[-clinic start generated code]*/
17477db96d56Sopenharmony_cistatic PyObject *
17487db96d56Sopenharmony_ciPyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
17497db96d56Sopenharmony_ci{
17507db96d56Sopenharmony_ci    int x, y, n;
17517db96d56Sopenharmony_ci    char rtn[1024]; /* This should be big enough.. I hope */
17527db96d56Sopenharmony_ci    int rtn2;
17537db96d56Sopenharmony_ci
17547db96d56Sopenharmony_ci    switch (PyTuple_Size(args)) {
17557db96d56Sopenharmony_ci    case 0:
17567db96d56Sopenharmony_ci        rtn2 = winnstr(self->win,rtn, 1023);
17577db96d56Sopenharmony_ci        break;
17587db96d56Sopenharmony_ci    case 1:
17597db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"i;n", &n))
17607db96d56Sopenharmony_ci            return NULL;
17617db96d56Sopenharmony_ci        if (n < 0) {
17627db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
17637db96d56Sopenharmony_ci            return NULL;
17647db96d56Sopenharmony_ci        }
17657db96d56Sopenharmony_ci        rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
17667db96d56Sopenharmony_ci        break;
17677db96d56Sopenharmony_ci    case 2:
17687db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
17697db96d56Sopenharmony_ci            return NULL;
17707db96d56Sopenharmony_ci        rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
17717db96d56Sopenharmony_ci        break;
17727db96d56Sopenharmony_ci    case 3:
17737db96d56Sopenharmony_ci        if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
17747db96d56Sopenharmony_ci            return NULL;
17757db96d56Sopenharmony_ci        if (n < 0) {
17767db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
17777db96d56Sopenharmony_ci            return NULL;
17787db96d56Sopenharmony_ci        }
17797db96d56Sopenharmony_ci        rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
17807db96d56Sopenharmony_ci        break;
17817db96d56Sopenharmony_ci    default:
17827db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
17837db96d56Sopenharmony_ci        return NULL;
17847db96d56Sopenharmony_ci    }
17857db96d56Sopenharmony_ci    if (rtn2 == ERR)
17867db96d56Sopenharmony_ci        rtn[0] = 0;
17877db96d56Sopenharmony_ci    return PyBytes_FromString(rtn);
17887db96d56Sopenharmony_ci}
17897db96d56Sopenharmony_ci
17907db96d56Sopenharmony_ci/*[clinic input]
17917db96d56Sopenharmony_ci_curses.window.insstr
17927db96d56Sopenharmony_ci
17937db96d56Sopenharmony_ci    [
17947db96d56Sopenharmony_ci    y: int
17957db96d56Sopenharmony_ci        Y-coordinate.
17967db96d56Sopenharmony_ci    x: int
17977db96d56Sopenharmony_ci        X-coordinate.
17987db96d56Sopenharmony_ci    ]
17997db96d56Sopenharmony_ci
18007db96d56Sopenharmony_ci    str: object
18017db96d56Sopenharmony_ci        String to insert.
18027db96d56Sopenharmony_ci
18037db96d56Sopenharmony_ci    [
18047db96d56Sopenharmony_ci    attr: long
18057db96d56Sopenharmony_ci        Attributes for characters.
18067db96d56Sopenharmony_ci    ]
18077db96d56Sopenharmony_ci    /
18087db96d56Sopenharmony_ci
18097db96d56Sopenharmony_ciInsert the string before the current or specified position.
18107db96d56Sopenharmony_ci
18117db96d56Sopenharmony_ciInsert a character string (as many characters as will fit on the line)
18127db96d56Sopenharmony_cibefore the character under the cursor.  All characters to the right of
18137db96d56Sopenharmony_cithe cursor are shifted right, with the rightmost characters on the line
18147db96d56Sopenharmony_cibeing lost.  The cursor position does not change (after moving to y, x,
18157db96d56Sopenharmony_ciif specified).
18167db96d56Sopenharmony_ci[clinic start generated code]*/
18177db96d56Sopenharmony_ci
18187db96d56Sopenharmony_cistatic PyObject *
18197db96d56Sopenharmony_ci_curses_window_insstr_impl(PyCursesWindowObject *self, int group_left_1,
18207db96d56Sopenharmony_ci                           int y, int x, PyObject *str, int group_right_1,
18217db96d56Sopenharmony_ci                           long attr)
18227db96d56Sopenharmony_ci/*[clinic end generated code: output=c259a5265ad0b777 input=6827cddc6340a7f3]*/
18237db96d56Sopenharmony_ci{
18247db96d56Sopenharmony_ci    int rtn;
18257db96d56Sopenharmony_ci    int strtype;
18267db96d56Sopenharmony_ci    PyObject *bytesobj = NULL;
18277db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
18287db96d56Sopenharmony_ci    wchar_t *wstr = NULL;
18297db96d56Sopenharmony_ci#endif
18307db96d56Sopenharmony_ci    attr_t attr_old = A_NORMAL;
18317db96d56Sopenharmony_ci    int use_xy = group_left_1, use_attr = group_right_1;
18327db96d56Sopenharmony_ci    const char *funcname;
18337db96d56Sopenharmony_ci
18347db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
18357db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
18367db96d56Sopenharmony_ci#else
18377db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
18387db96d56Sopenharmony_ci#endif
18397db96d56Sopenharmony_ci    if (strtype == 0)
18407db96d56Sopenharmony_ci        return NULL;
18417db96d56Sopenharmony_ci
18427db96d56Sopenharmony_ci    if (use_attr) {
18437db96d56Sopenharmony_ci        attr_old = getattrs(self->win);
18447db96d56Sopenharmony_ci        (void)wattrset(self->win, (attr_t)attr);
18457db96d56Sopenharmony_ci    }
18467db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
18477db96d56Sopenharmony_ci    if (strtype == 2) {
18487db96d56Sopenharmony_ci        funcname = "inswstr";
18497db96d56Sopenharmony_ci        if (use_xy)
18507db96d56Sopenharmony_ci            rtn = mvwins_wstr(self->win,y,x,wstr);
18517db96d56Sopenharmony_ci        else
18527db96d56Sopenharmony_ci            rtn = wins_wstr(self->win,wstr);
18537db96d56Sopenharmony_ci        PyMem_Free(wstr);
18547db96d56Sopenharmony_ci    }
18557db96d56Sopenharmony_ci    else
18567db96d56Sopenharmony_ci#endif
18577db96d56Sopenharmony_ci    {
18587db96d56Sopenharmony_ci        const char *str = PyBytes_AS_STRING(bytesobj);
18597db96d56Sopenharmony_ci        funcname = "insstr";
18607db96d56Sopenharmony_ci        if (use_xy)
18617db96d56Sopenharmony_ci            rtn = mvwinsstr(self->win,y,x,str);
18627db96d56Sopenharmony_ci        else
18637db96d56Sopenharmony_ci            rtn = winsstr(self->win,str);
18647db96d56Sopenharmony_ci        Py_DECREF(bytesobj);
18657db96d56Sopenharmony_ci    }
18667db96d56Sopenharmony_ci    if (use_attr)
18677db96d56Sopenharmony_ci        (void)wattrset(self->win,attr_old);
18687db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, funcname);
18697db96d56Sopenharmony_ci}
18707db96d56Sopenharmony_ci
18717db96d56Sopenharmony_ci/*[clinic input]
18727db96d56Sopenharmony_ci_curses.window.insnstr
18737db96d56Sopenharmony_ci
18747db96d56Sopenharmony_ci    [
18757db96d56Sopenharmony_ci    y: int
18767db96d56Sopenharmony_ci        Y-coordinate.
18777db96d56Sopenharmony_ci    x: int
18787db96d56Sopenharmony_ci        X-coordinate.
18797db96d56Sopenharmony_ci    ]
18807db96d56Sopenharmony_ci
18817db96d56Sopenharmony_ci    str: object
18827db96d56Sopenharmony_ci        String to insert.
18837db96d56Sopenharmony_ci
18847db96d56Sopenharmony_ci    n: int
18857db96d56Sopenharmony_ci        Maximal number of characters.
18867db96d56Sopenharmony_ci
18877db96d56Sopenharmony_ci    [
18887db96d56Sopenharmony_ci    attr: long
18897db96d56Sopenharmony_ci        Attributes for characters.
18907db96d56Sopenharmony_ci    ]
18917db96d56Sopenharmony_ci    /
18927db96d56Sopenharmony_ci
18937db96d56Sopenharmony_ciInsert at most n characters of the string.
18947db96d56Sopenharmony_ci
18957db96d56Sopenharmony_ciInsert a character string (as many characters as will fit on the line)
18967db96d56Sopenharmony_cibefore the character under the cursor, up to n characters.  If n is zero
18977db96d56Sopenharmony_cior negative, the entire string is inserted.  All characters to the right
18987db96d56Sopenharmony_ciof the cursor are shifted right, with the rightmost characters on the line
18997db96d56Sopenharmony_cibeing lost.  The cursor position does not change (after moving to y, x, if
19007db96d56Sopenharmony_cispecified).
19017db96d56Sopenharmony_ci[clinic start generated code]*/
19027db96d56Sopenharmony_ci
19037db96d56Sopenharmony_cistatic PyObject *
19047db96d56Sopenharmony_ci_curses_window_insnstr_impl(PyCursesWindowObject *self, int group_left_1,
19057db96d56Sopenharmony_ci                            int y, int x, PyObject *str, int n,
19067db96d56Sopenharmony_ci                            int group_right_1, long attr)
19077db96d56Sopenharmony_ci/*[clinic end generated code: output=971a32ea6328ec8b input=70fa0cd543901a4c]*/
19087db96d56Sopenharmony_ci{
19097db96d56Sopenharmony_ci    int rtn;
19107db96d56Sopenharmony_ci    int strtype;
19117db96d56Sopenharmony_ci    PyObject *bytesobj = NULL;
19127db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
19137db96d56Sopenharmony_ci    wchar_t *wstr = NULL;
19147db96d56Sopenharmony_ci#endif
19157db96d56Sopenharmony_ci    attr_t attr_old = A_NORMAL;
19167db96d56Sopenharmony_ci    int use_xy = group_left_1, use_attr = group_right_1;
19177db96d56Sopenharmony_ci    const char *funcname;
19187db96d56Sopenharmony_ci
19197db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
19207db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
19217db96d56Sopenharmony_ci#else
19227db96d56Sopenharmony_ci    strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
19237db96d56Sopenharmony_ci#endif
19247db96d56Sopenharmony_ci    if (strtype == 0)
19257db96d56Sopenharmony_ci        return NULL;
19267db96d56Sopenharmony_ci
19277db96d56Sopenharmony_ci    if (use_attr) {
19287db96d56Sopenharmony_ci        attr_old = getattrs(self->win);
19297db96d56Sopenharmony_ci        (void)wattrset(self->win, (attr_t)attr);
19307db96d56Sopenharmony_ci    }
19317db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
19327db96d56Sopenharmony_ci    if (strtype == 2) {
19337db96d56Sopenharmony_ci        funcname = "insn_wstr";
19347db96d56Sopenharmony_ci        if (use_xy)
19357db96d56Sopenharmony_ci            rtn = mvwins_nwstr(self->win,y,x,wstr,n);
19367db96d56Sopenharmony_ci        else
19377db96d56Sopenharmony_ci            rtn = wins_nwstr(self->win,wstr,n);
19387db96d56Sopenharmony_ci        PyMem_Free(wstr);
19397db96d56Sopenharmony_ci    }
19407db96d56Sopenharmony_ci    else
19417db96d56Sopenharmony_ci#endif
19427db96d56Sopenharmony_ci    {
19437db96d56Sopenharmony_ci        const char *str = PyBytes_AS_STRING(bytesobj);
19447db96d56Sopenharmony_ci        funcname = "insnstr";
19457db96d56Sopenharmony_ci        if (use_xy)
19467db96d56Sopenharmony_ci            rtn = mvwinsnstr(self->win,y,x,str,n);
19477db96d56Sopenharmony_ci        else
19487db96d56Sopenharmony_ci            rtn = winsnstr(self->win,str,n);
19497db96d56Sopenharmony_ci        Py_DECREF(bytesobj);
19507db96d56Sopenharmony_ci    }
19517db96d56Sopenharmony_ci    if (use_attr)
19527db96d56Sopenharmony_ci        (void)wattrset(self->win,attr_old);
19537db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, funcname);
19547db96d56Sopenharmony_ci}
19557db96d56Sopenharmony_ci
19567db96d56Sopenharmony_ci/*[clinic input]
19577db96d56Sopenharmony_ci_curses.window.is_linetouched
19587db96d56Sopenharmony_ci
19597db96d56Sopenharmony_ci    line: int
19607db96d56Sopenharmony_ci        Line number.
19617db96d56Sopenharmony_ci    /
19627db96d56Sopenharmony_ci
19637db96d56Sopenharmony_ciReturn True if the specified line was modified, otherwise return False.
19647db96d56Sopenharmony_ci
19657db96d56Sopenharmony_ciRaise a curses.error exception if line is not valid for the given window.
19667db96d56Sopenharmony_ci[clinic start generated code]*/
19677db96d56Sopenharmony_ci
19687db96d56Sopenharmony_cistatic PyObject *
19697db96d56Sopenharmony_ci_curses_window_is_linetouched_impl(PyCursesWindowObject *self, int line)
19707db96d56Sopenharmony_ci/*[clinic end generated code: output=ad4a4edfee2db08c input=a7be0c189f243914]*/
19717db96d56Sopenharmony_ci{
19727db96d56Sopenharmony_ci    int erg;
19737db96d56Sopenharmony_ci    erg = is_linetouched(self->win, line);
19747db96d56Sopenharmony_ci    if (erg == ERR) {
19757db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
19767db96d56Sopenharmony_ci                        "is_linetouched: line number outside of boundaries");
19777db96d56Sopenharmony_ci        return NULL;
19787db96d56Sopenharmony_ci    }
19797db96d56Sopenharmony_ci    return PyBool_FromLong(erg);
19807db96d56Sopenharmony_ci}
19817db96d56Sopenharmony_ci
19827db96d56Sopenharmony_ci#ifdef py_is_pad
19837db96d56Sopenharmony_ci/*[clinic input]
19847db96d56Sopenharmony_ci_curses.window.noutrefresh
19857db96d56Sopenharmony_ci
19867db96d56Sopenharmony_ci    [
19877db96d56Sopenharmony_ci    pminrow: int
19887db96d56Sopenharmony_ci    pmincol: int
19897db96d56Sopenharmony_ci    sminrow: int
19907db96d56Sopenharmony_ci    smincol: int
19917db96d56Sopenharmony_ci    smaxrow: int
19927db96d56Sopenharmony_ci    smaxcol: int
19937db96d56Sopenharmony_ci    ]
19947db96d56Sopenharmony_ci    /
19957db96d56Sopenharmony_ci
19967db96d56Sopenharmony_ciMark for refresh but wait.
19977db96d56Sopenharmony_ci
19987db96d56Sopenharmony_ciThis function updates the data structure representing the desired state of the
19997db96d56Sopenharmony_ciwindow, but does not force an update of the physical screen.  To accomplish
20007db96d56Sopenharmony_cithat, call doupdate().
20017db96d56Sopenharmony_ci[clinic start generated code]*/
20027db96d56Sopenharmony_ci
20037db96d56Sopenharmony_cistatic PyObject *
20047db96d56Sopenharmony_ci_curses_window_noutrefresh_impl(PyCursesWindowObject *self,
20057db96d56Sopenharmony_ci                                int group_right_1, int pminrow, int pmincol,
20067db96d56Sopenharmony_ci                                int sminrow, int smincol, int smaxrow,
20077db96d56Sopenharmony_ci                                int smaxcol)
20087db96d56Sopenharmony_ci/*[clinic end generated code: output=809a1f3c6a03e23e input=3e56898388cd739e]*/
20097db96d56Sopenharmony_ci#else
20107db96d56Sopenharmony_ci/*[clinic input]
20117db96d56Sopenharmony_ci_curses.window.noutrefresh
20127db96d56Sopenharmony_ci
20137db96d56Sopenharmony_ciMark for refresh but wait.
20147db96d56Sopenharmony_ci
20157db96d56Sopenharmony_ciThis function updates the data structure representing the desired state of the
20167db96d56Sopenharmony_ciwindow, but does not force an update of the physical screen.  To accomplish
20177db96d56Sopenharmony_cithat, call doupdate().
20187db96d56Sopenharmony_ci[clinic start generated code]*/
20197db96d56Sopenharmony_ci
20207db96d56Sopenharmony_cistatic PyObject *
20217db96d56Sopenharmony_ci_curses_window_noutrefresh_impl(PyCursesWindowObject *self)
20227db96d56Sopenharmony_ci/*[clinic end generated code: output=6ef6dec666643fee input=876902e3fa431dbd]*/
20237db96d56Sopenharmony_ci#endif
20247db96d56Sopenharmony_ci{
20257db96d56Sopenharmony_ci    int rtn;
20267db96d56Sopenharmony_ci
20277db96d56Sopenharmony_ci#ifdef py_is_pad
20287db96d56Sopenharmony_ci    if (py_is_pad(self->win)) {
20297db96d56Sopenharmony_ci        if (!group_right_1) {
20307db96d56Sopenharmony_ci            PyErr_SetString(PyCursesError,
20317db96d56Sopenharmony_ci                            "noutrefresh() called for a pad "
20327db96d56Sopenharmony_ci                            "requires 6 arguments");
20337db96d56Sopenharmony_ci            return NULL;
20347db96d56Sopenharmony_ci        }
20357db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
20367db96d56Sopenharmony_ci        rtn = pnoutrefresh(self->win, pminrow, pmincol,
20377db96d56Sopenharmony_ci                           sminrow, smincol, smaxrow, smaxcol);
20387db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
20397db96d56Sopenharmony_ci        return PyCursesCheckERR(rtn, "pnoutrefresh");
20407db96d56Sopenharmony_ci    }
20417db96d56Sopenharmony_ci    if (group_right_1) {
20427db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
20437db96d56Sopenharmony_ci                        "noutrefresh() takes no arguments (6 given)");
20447db96d56Sopenharmony_ci        return NULL;
20457db96d56Sopenharmony_ci    }
20467db96d56Sopenharmony_ci#endif
20477db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
20487db96d56Sopenharmony_ci    rtn = wnoutrefresh(self->win);
20497db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
20507db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, "wnoutrefresh");
20517db96d56Sopenharmony_ci}
20527db96d56Sopenharmony_ci
20537db96d56Sopenharmony_ci/*[clinic input]
20547db96d56Sopenharmony_ci_curses.window.overlay
20557db96d56Sopenharmony_ci
20567db96d56Sopenharmony_ci    destwin: object(type="PyCursesWindowObject *", subclass_of="&PyCursesWindow_Type")
20577db96d56Sopenharmony_ci
20587db96d56Sopenharmony_ci    [
20597db96d56Sopenharmony_ci    sminrow: int
20607db96d56Sopenharmony_ci    smincol: int
20617db96d56Sopenharmony_ci    dminrow: int
20627db96d56Sopenharmony_ci    dmincol: int
20637db96d56Sopenharmony_ci    dmaxrow: int
20647db96d56Sopenharmony_ci    dmaxcol: int
20657db96d56Sopenharmony_ci    ]
20667db96d56Sopenharmony_ci    /
20677db96d56Sopenharmony_ci
20687db96d56Sopenharmony_ciOverlay the window on top of destwin.
20697db96d56Sopenharmony_ci
20707db96d56Sopenharmony_ciThe windows need not be the same size, only the overlapping region is copied.
20717db96d56Sopenharmony_ciThis copy is non-destructive, which means that the current background
20727db96d56Sopenharmony_cicharacter does not overwrite the old contents of destwin.
20737db96d56Sopenharmony_ci
20747db96d56Sopenharmony_ciTo get fine-grained control over the copied region, the second form of
20757db96d56Sopenharmony_cioverlay() can be used.  sminrow and smincol are the upper-left coordinates
20767db96d56Sopenharmony_ciof the source window, and the other variables mark a rectangle in the
20777db96d56Sopenharmony_cidestination window.
20787db96d56Sopenharmony_ci[clinic start generated code]*/
20797db96d56Sopenharmony_ci
20807db96d56Sopenharmony_cistatic PyObject *
20817db96d56Sopenharmony_ci_curses_window_overlay_impl(PyCursesWindowObject *self,
20827db96d56Sopenharmony_ci                            PyCursesWindowObject *destwin, int group_right_1,
20837db96d56Sopenharmony_ci                            int sminrow, int smincol, int dminrow,
20847db96d56Sopenharmony_ci                            int dmincol, int dmaxrow, int dmaxcol)
20857db96d56Sopenharmony_ci/*[clinic end generated code: output=82bb2c4cb443ca58 input=7edd23ad22cc1984]*/
20867db96d56Sopenharmony_ci{
20877db96d56Sopenharmony_ci    int rtn;
20887db96d56Sopenharmony_ci
20897db96d56Sopenharmony_ci    if (group_right_1) {
20907db96d56Sopenharmony_ci        rtn = copywin(self->win, destwin->win, sminrow, smincol,
20917db96d56Sopenharmony_ci                      dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
20927db96d56Sopenharmony_ci        return PyCursesCheckERR(rtn, "copywin");
20937db96d56Sopenharmony_ci    }
20947db96d56Sopenharmony_ci    else {
20957db96d56Sopenharmony_ci        rtn = overlay(self->win, destwin->win);
20967db96d56Sopenharmony_ci        return PyCursesCheckERR(rtn, "overlay");
20977db96d56Sopenharmony_ci    }
20987db96d56Sopenharmony_ci}
20997db96d56Sopenharmony_ci
21007db96d56Sopenharmony_ci/*[clinic input]
21017db96d56Sopenharmony_ci_curses.window.overwrite
21027db96d56Sopenharmony_ci
21037db96d56Sopenharmony_ci    destwin: object(type="PyCursesWindowObject *", subclass_of="&PyCursesWindow_Type")
21047db96d56Sopenharmony_ci
21057db96d56Sopenharmony_ci    [
21067db96d56Sopenharmony_ci    sminrow: int
21077db96d56Sopenharmony_ci    smincol: int
21087db96d56Sopenharmony_ci    dminrow: int
21097db96d56Sopenharmony_ci    dmincol: int
21107db96d56Sopenharmony_ci    dmaxrow: int
21117db96d56Sopenharmony_ci    dmaxcol: int
21127db96d56Sopenharmony_ci    ]
21137db96d56Sopenharmony_ci    /
21147db96d56Sopenharmony_ci
21157db96d56Sopenharmony_ciOverwrite the window on top of destwin.
21167db96d56Sopenharmony_ci
21177db96d56Sopenharmony_ciThe windows need not be the same size, in which case only the overlapping
21187db96d56Sopenharmony_ciregion is copied.  This copy is destructive, which means that the current
21197db96d56Sopenharmony_cibackground character overwrites the old contents of destwin.
21207db96d56Sopenharmony_ci
21217db96d56Sopenharmony_ciTo get fine-grained control over the copied region, the second form of
21227db96d56Sopenharmony_cioverwrite() can be used. sminrow and smincol are the upper-left coordinates
21237db96d56Sopenharmony_ciof the source window, the other variables mark a rectangle in the destination
21247db96d56Sopenharmony_ciwindow.
21257db96d56Sopenharmony_ci[clinic start generated code]*/
21267db96d56Sopenharmony_ci
21277db96d56Sopenharmony_cistatic PyObject *
21287db96d56Sopenharmony_ci_curses_window_overwrite_impl(PyCursesWindowObject *self,
21297db96d56Sopenharmony_ci                              PyCursesWindowObject *destwin,
21307db96d56Sopenharmony_ci                              int group_right_1, int sminrow, int smincol,
21317db96d56Sopenharmony_ci                              int dminrow, int dmincol, int dmaxrow,
21327db96d56Sopenharmony_ci                              int dmaxcol)
21337db96d56Sopenharmony_ci/*[clinic end generated code: output=12ae007d1681be28 input=ea5de1b35cd948e0]*/
21347db96d56Sopenharmony_ci{
21357db96d56Sopenharmony_ci    int rtn;
21367db96d56Sopenharmony_ci
21377db96d56Sopenharmony_ci    if (group_right_1) {
21387db96d56Sopenharmony_ci        rtn = copywin(self->win, destwin->win, sminrow, smincol,
21397db96d56Sopenharmony_ci                      dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
21407db96d56Sopenharmony_ci        return PyCursesCheckERR(rtn, "copywin");
21417db96d56Sopenharmony_ci    }
21427db96d56Sopenharmony_ci    else {
21437db96d56Sopenharmony_ci        rtn = overwrite(self->win, destwin->win);
21447db96d56Sopenharmony_ci        return PyCursesCheckERR(rtn, "overwrite");
21457db96d56Sopenharmony_ci    }
21467db96d56Sopenharmony_ci}
21477db96d56Sopenharmony_ci
21487db96d56Sopenharmony_ci/*[clinic input]
21497db96d56Sopenharmony_ci_curses.window.putwin
21507db96d56Sopenharmony_ci
21517db96d56Sopenharmony_ci    file: object
21527db96d56Sopenharmony_ci    /
21537db96d56Sopenharmony_ci
21547db96d56Sopenharmony_ciWrite all data associated with the window into the provided file object.
21557db96d56Sopenharmony_ci
21567db96d56Sopenharmony_ciThis information can be later retrieved using the getwin() function.
21577db96d56Sopenharmony_ci[clinic start generated code]*/
21587db96d56Sopenharmony_ci
21597db96d56Sopenharmony_cistatic PyObject *
21607db96d56Sopenharmony_ci_curses_window_putwin(PyCursesWindowObject *self, PyObject *file)
21617db96d56Sopenharmony_ci/*[clinic end generated code: output=3a25e2a5e7a040ac input=0608648e09c8ea0a]*/
21627db96d56Sopenharmony_ci{
21637db96d56Sopenharmony_ci    /* We have to simulate this by writing to a temporary FILE*,
21647db96d56Sopenharmony_ci       then reading back, then writing to the argument file. */
21657db96d56Sopenharmony_ci    FILE *fp;
21667db96d56Sopenharmony_ci    PyObject *res = NULL;
21677db96d56Sopenharmony_ci
21687db96d56Sopenharmony_ci    fp = tmpfile();
21697db96d56Sopenharmony_ci    if (fp == NULL)
21707db96d56Sopenharmony_ci        return PyErr_SetFromErrno(PyExc_OSError);
21717db96d56Sopenharmony_ci    if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
21727db96d56Sopenharmony_ci        goto exit;
21737db96d56Sopenharmony_ci    res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
21747db96d56Sopenharmony_ci    if (res == NULL)
21757db96d56Sopenharmony_ci        goto exit;
21767db96d56Sopenharmony_ci    fseek(fp, 0, 0);
21777db96d56Sopenharmony_ci    while (1) {
21787db96d56Sopenharmony_ci        char buf[BUFSIZ];
21797db96d56Sopenharmony_ci        Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
21807db96d56Sopenharmony_ci        _Py_IDENTIFIER(write);
21817db96d56Sopenharmony_ci
21827db96d56Sopenharmony_ci        if (n <= 0)
21837db96d56Sopenharmony_ci            break;
21847db96d56Sopenharmony_ci        Py_DECREF(res);
21857db96d56Sopenharmony_ci        res = _PyObject_CallMethodId(file, &PyId_write, "y#", buf, n);
21867db96d56Sopenharmony_ci        if (res == NULL)
21877db96d56Sopenharmony_ci            break;
21887db96d56Sopenharmony_ci    }
21897db96d56Sopenharmony_ci
21907db96d56Sopenharmony_ciexit:
21917db96d56Sopenharmony_ci    fclose(fp);
21927db96d56Sopenharmony_ci    return res;
21937db96d56Sopenharmony_ci}
21947db96d56Sopenharmony_ci
21957db96d56Sopenharmony_ci/*[clinic input]
21967db96d56Sopenharmony_ci_curses.window.redrawln
21977db96d56Sopenharmony_ci
21987db96d56Sopenharmony_ci    beg: int
21997db96d56Sopenharmony_ci        Starting line number.
22007db96d56Sopenharmony_ci    num: int
22017db96d56Sopenharmony_ci        The number of lines.
22027db96d56Sopenharmony_ci    /
22037db96d56Sopenharmony_ci
22047db96d56Sopenharmony_ciMark the specified lines corrupted.
22057db96d56Sopenharmony_ci
22067db96d56Sopenharmony_ciThey should be completely redrawn on the next refresh() call.
22077db96d56Sopenharmony_ci[clinic start generated code]*/
22087db96d56Sopenharmony_ci
22097db96d56Sopenharmony_cistatic PyObject *
22107db96d56Sopenharmony_ci_curses_window_redrawln_impl(PyCursesWindowObject *self, int beg, int num)
22117db96d56Sopenharmony_ci/*[clinic end generated code: output=ea216e334f9ce1b4 input=152155e258a77a7a]*/
22127db96d56Sopenharmony_ci{
22137db96d56Sopenharmony_ci    return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
22147db96d56Sopenharmony_ci}
22157db96d56Sopenharmony_ci
22167db96d56Sopenharmony_ci/*[clinic input]
22177db96d56Sopenharmony_ci_curses.window.refresh
22187db96d56Sopenharmony_ci
22197db96d56Sopenharmony_ci    [
22207db96d56Sopenharmony_ci    pminrow: int
22217db96d56Sopenharmony_ci    pmincol: int
22227db96d56Sopenharmony_ci    sminrow: int
22237db96d56Sopenharmony_ci    smincol: int
22247db96d56Sopenharmony_ci    smaxrow: int
22257db96d56Sopenharmony_ci    smaxcol: int
22267db96d56Sopenharmony_ci    ]
22277db96d56Sopenharmony_ci    /
22287db96d56Sopenharmony_ci
22297db96d56Sopenharmony_ciUpdate the display immediately.
22307db96d56Sopenharmony_ci
22317db96d56Sopenharmony_ciSynchronize actual screen with previous drawing/deleting methods.
22327db96d56Sopenharmony_ciThe 6 optional arguments can only be specified when the window is a pad
22337db96d56Sopenharmony_cicreated with newpad().  The additional parameters are needed to indicate
22347db96d56Sopenharmony_ciwhat part of the pad and screen are involved.  pminrow and pmincol specify
22357db96d56Sopenharmony_cithe upper left-hand corner of the rectangle to be displayed in the pad.
22367db96d56Sopenharmony_cisminrow, smincol, smaxrow, and smaxcol specify the edges of the rectangle to
22377db96d56Sopenharmony_cibe displayed on the screen.  The lower right-hand corner of the rectangle to
22387db96d56Sopenharmony_cibe displayed in the pad is calculated from the screen coordinates, since the
22397db96d56Sopenharmony_cirectangles must be the same size.  Both rectangles must be entirely contained
22407db96d56Sopenharmony_ciwithin their respective structures.  Negative values of pminrow, pmincol,
22417db96d56Sopenharmony_cisminrow, or smincol are treated as if they were zero.
22427db96d56Sopenharmony_ci[clinic start generated code]*/
22437db96d56Sopenharmony_ci
22447db96d56Sopenharmony_cistatic PyObject *
22457db96d56Sopenharmony_ci_curses_window_refresh_impl(PyCursesWindowObject *self, int group_right_1,
22467db96d56Sopenharmony_ci                            int pminrow, int pmincol, int sminrow,
22477db96d56Sopenharmony_ci                            int smincol, int smaxrow, int smaxcol)
22487db96d56Sopenharmony_ci/*[clinic end generated code: output=42199543115e6e63 input=95e01cb5ffc635d0]*/
22497db96d56Sopenharmony_ci{
22507db96d56Sopenharmony_ci    int rtn;
22517db96d56Sopenharmony_ci
22527db96d56Sopenharmony_ci#ifdef py_is_pad
22537db96d56Sopenharmony_ci    if (py_is_pad(self->win)) {
22547db96d56Sopenharmony_ci        if (!group_right_1) {
22557db96d56Sopenharmony_ci            PyErr_SetString(PyCursesError,
22567db96d56Sopenharmony_ci                            "refresh() for a pad requires 6 arguments");
22577db96d56Sopenharmony_ci            return NULL;
22587db96d56Sopenharmony_ci        }
22597db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
22607db96d56Sopenharmony_ci        rtn = prefresh(self->win, pminrow, pmincol,
22617db96d56Sopenharmony_ci                       sminrow, smincol, smaxrow, smaxcol);
22627db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
22637db96d56Sopenharmony_ci        return PyCursesCheckERR(rtn, "prefresh");
22647db96d56Sopenharmony_ci    }
22657db96d56Sopenharmony_ci#endif
22667db96d56Sopenharmony_ci    if (group_right_1) {
22677db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
22687db96d56Sopenharmony_ci                        "refresh() takes no arguments (6 given)");
22697db96d56Sopenharmony_ci        return NULL;
22707db96d56Sopenharmony_ci    }
22717db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
22727db96d56Sopenharmony_ci    rtn = wrefresh(self->win);
22737db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
22747db96d56Sopenharmony_ci    return PyCursesCheckERR(rtn, "prefresh");
22757db96d56Sopenharmony_ci}
22767db96d56Sopenharmony_ci
22777db96d56Sopenharmony_ci/*[clinic input]
22787db96d56Sopenharmony_ci_curses.window.setscrreg
22797db96d56Sopenharmony_ci
22807db96d56Sopenharmony_ci    top: int
22817db96d56Sopenharmony_ci        First line number.
22827db96d56Sopenharmony_ci    bottom: int
22837db96d56Sopenharmony_ci        Last line number.
22847db96d56Sopenharmony_ci    /
22857db96d56Sopenharmony_ci
22867db96d56Sopenharmony_ciDefine a software scrolling region.
22877db96d56Sopenharmony_ci
22887db96d56Sopenharmony_ciAll scrolling actions will take place in this region.
22897db96d56Sopenharmony_ci[clinic start generated code]*/
22907db96d56Sopenharmony_ci
22917db96d56Sopenharmony_cistatic PyObject *
22927db96d56Sopenharmony_ci_curses_window_setscrreg_impl(PyCursesWindowObject *self, int top,
22937db96d56Sopenharmony_ci                              int bottom)
22947db96d56Sopenharmony_ci/*[clinic end generated code: output=486ab5db218d2b1a input=1b517b986838bf0e]*/
22957db96d56Sopenharmony_ci{
22967db96d56Sopenharmony_ci    return PyCursesCheckERR(wsetscrreg(self->win, top, bottom), "wsetscrreg");
22977db96d56Sopenharmony_ci}
22987db96d56Sopenharmony_ci
22997db96d56Sopenharmony_ci/*[clinic input]
23007db96d56Sopenharmony_ci_curses.window.subwin
23017db96d56Sopenharmony_ci
23027db96d56Sopenharmony_ci    [
23037db96d56Sopenharmony_ci    nlines: int = 0
23047db96d56Sopenharmony_ci        Height.
23057db96d56Sopenharmony_ci    ncols: int = 0
23067db96d56Sopenharmony_ci        Width.
23077db96d56Sopenharmony_ci    ]
23087db96d56Sopenharmony_ci    begin_y: int
23097db96d56Sopenharmony_ci        Top side y-coordinate.
23107db96d56Sopenharmony_ci    begin_x: int
23117db96d56Sopenharmony_ci        Left side x-coordinate.
23127db96d56Sopenharmony_ci    /
23137db96d56Sopenharmony_ci
23147db96d56Sopenharmony_ciCreate a sub-window (screen-relative coordinates).
23157db96d56Sopenharmony_ci
23167db96d56Sopenharmony_ciBy default, the sub-window will extend from the specified position to the
23177db96d56Sopenharmony_cilower right corner of the window.
23187db96d56Sopenharmony_ci[clinic start generated code]*/
23197db96d56Sopenharmony_ci
23207db96d56Sopenharmony_cistatic PyObject *
23217db96d56Sopenharmony_ci_curses_window_subwin_impl(PyCursesWindowObject *self, int group_left_1,
23227db96d56Sopenharmony_ci                           int nlines, int ncols, int begin_y, int begin_x)
23237db96d56Sopenharmony_ci/*[clinic end generated code: output=93e898afc348f59a input=2129fa47fd57721c]*/
23247db96d56Sopenharmony_ci{
23257db96d56Sopenharmony_ci    WINDOW *win;
23267db96d56Sopenharmony_ci
23277db96d56Sopenharmony_ci    /* printf("Subwin: %i %i %i %i   \n", nlines, ncols, begin_y, begin_x); */
23287db96d56Sopenharmony_ci#ifdef py_is_pad
23297db96d56Sopenharmony_ci    if (py_is_pad(self->win)) {
23307db96d56Sopenharmony_ci        win = subpad(self->win, nlines, ncols, begin_y, begin_x);
23317db96d56Sopenharmony_ci    }
23327db96d56Sopenharmony_ci    else
23337db96d56Sopenharmony_ci#endif
23347db96d56Sopenharmony_ci        win = subwin(self->win, nlines, ncols, begin_y, begin_x);
23357db96d56Sopenharmony_ci
23367db96d56Sopenharmony_ci    if (win == NULL) {
23377db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, catchall_NULL);
23387db96d56Sopenharmony_ci        return NULL;
23397db96d56Sopenharmony_ci    }
23407db96d56Sopenharmony_ci
23417db96d56Sopenharmony_ci    return (PyObject *)PyCursesWindow_New(win, self->encoding);
23427db96d56Sopenharmony_ci}
23437db96d56Sopenharmony_ci
23447db96d56Sopenharmony_ci/*[clinic input]
23457db96d56Sopenharmony_ci_curses.window.scroll
23467db96d56Sopenharmony_ci
23477db96d56Sopenharmony_ci    [
23487db96d56Sopenharmony_ci    lines: int = 1
23497db96d56Sopenharmony_ci        Number of lines to scroll.
23507db96d56Sopenharmony_ci    ]
23517db96d56Sopenharmony_ci    /
23527db96d56Sopenharmony_ci
23537db96d56Sopenharmony_ciScroll the screen or scrolling region.
23547db96d56Sopenharmony_ci
23557db96d56Sopenharmony_ciScroll upward if the argument is positive and downward if it is negative.
23567db96d56Sopenharmony_ci[clinic start generated code]*/
23577db96d56Sopenharmony_ci
23587db96d56Sopenharmony_cistatic PyObject *
23597db96d56Sopenharmony_ci_curses_window_scroll_impl(PyCursesWindowObject *self, int group_right_1,
23607db96d56Sopenharmony_ci                           int lines)
23617db96d56Sopenharmony_ci/*[clinic end generated code: output=4541a8a11852d360 input=c969ca0cfabbdbec]*/
23627db96d56Sopenharmony_ci{
23637db96d56Sopenharmony_ci    if (!group_right_1) {
23647db96d56Sopenharmony_ci        return PyCursesCheckERR(scroll(self->win), "scroll");
23657db96d56Sopenharmony_ci    }
23667db96d56Sopenharmony_ci    else {
23677db96d56Sopenharmony_ci        return PyCursesCheckERR(wscrl(self->win, lines), "scroll");
23687db96d56Sopenharmony_ci    }
23697db96d56Sopenharmony_ci}
23707db96d56Sopenharmony_ci
23717db96d56Sopenharmony_ci/*[clinic input]
23727db96d56Sopenharmony_ci_curses.window.touchline
23737db96d56Sopenharmony_ci
23747db96d56Sopenharmony_ci    start: int
23757db96d56Sopenharmony_ci    count: int
23767db96d56Sopenharmony_ci    [
23777db96d56Sopenharmony_ci    changed: bool(accept={int}) = True
23787db96d56Sopenharmony_ci    ]
23797db96d56Sopenharmony_ci    /
23807db96d56Sopenharmony_ci
23817db96d56Sopenharmony_ciPretend count lines have been changed, starting with line start.
23827db96d56Sopenharmony_ci
23837db96d56Sopenharmony_ciIf changed is supplied, it specifies whether the affected lines are marked
23847db96d56Sopenharmony_cias having been changed (changed=True) or unchanged (changed=False).
23857db96d56Sopenharmony_ci[clinic start generated code]*/
23867db96d56Sopenharmony_ci
23877db96d56Sopenharmony_cistatic PyObject *
23887db96d56Sopenharmony_ci_curses_window_touchline_impl(PyCursesWindowObject *self, int start,
23897db96d56Sopenharmony_ci                              int count, int group_right_1, int changed)
23907db96d56Sopenharmony_ci/*[clinic end generated code: output=65d05b3f7438c61d input=918ad1cbdadf93ea]*/
23917db96d56Sopenharmony_ci{
23927db96d56Sopenharmony_ci    if (!group_right_1) {
23937db96d56Sopenharmony_ci        return PyCursesCheckERR(touchline(self->win, start, count), "touchline");
23947db96d56Sopenharmony_ci    }
23957db96d56Sopenharmony_ci    else {
23967db96d56Sopenharmony_ci        return PyCursesCheckERR(wtouchln(self->win, start, count, changed), "touchline");
23977db96d56Sopenharmony_ci    }
23987db96d56Sopenharmony_ci}
23997db96d56Sopenharmony_ci
24007db96d56Sopenharmony_ci/*[clinic input]
24017db96d56Sopenharmony_ci_curses.window.vline
24027db96d56Sopenharmony_ci
24037db96d56Sopenharmony_ci    [
24047db96d56Sopenharmony_ci    y: int
24057db96d56Sopenharmony_ci        Starting Y-coordinate.
24067db96d56Sopenharmony_ci    x: int
24077db96d56Sopenharmony_ci        Starting X-coordinate.
24087db96d56Sopenharmony_ci    ]
24097db96d56Sopenharmony_ci
24107db96d56Sopenharmony_ci    ch: object
24117db96d56Sopenharmony_ci        Character to draw.
24127db96d56Sopenharmony_ci    n: int
24137db96d56Sopenharmony_ci        Line length.
24147db96d56Sopenharmony_ci
24157db96d56Sopenharmony_ci    [
24167db96d56Sopenharmony_ci    attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
24177db96d56Sopenharmony_ci        Attributes for the character.
24187db96d56Sopenharmony_ci    ]
24197db96d56Sopenharmony_ci    /
24207db96d56Sopenharmony_ci
24217db96d56Sopenharmony_ciDisplay a vertical line.
24227db96d56Sopenharmony_ci[clinic start generated code]*/
24237db96d56Sopenharmony_ci
24247db96d56Sopenharmony_cistatic PyObject *
24257db96d56Sopenharmony_ci_curses_window_vline_impl(PyCursesWindowObject *self, int group_left_1,
24267db96d56Sopenharmony_ci                          int y, int x, PyObject *ch, int n,
24277db96d56Sopenharmony_ci                          int group_right_1, long attr)
24287db96d56Sopenharmony_ci/*[clinic end generated code: output=287ad1cc8982217f input=a6f2dc86a4648b32]*/
24297db96d56Sopenharmony_ci{
24307db96d56Sopenharmony_ci    chtype ch_;
24317db96d56Sopenharmony_ci
24327db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(self, ch, &ch_))
24337db96d56Sopenharmony_ci        return NULL;
24347db96d56Sopenharmony_ci    if (group_left_1) {
24357db96d56Sopenharmony_ci        if (wmove(self->win, y, x) == ERR)
24367db96d56Sopenharmony_ci            return PyCursesCheckERR(ERR, "wmove");
24377db96d56Sopenharmony_ci    }
24387db96d56Sopenharmony_ci    return PyCursesCheckERR(wvline(self->win, ch_ | (attr_t)attr, n), "vline");
24397db96d56Sopenharmony_ci}
24407db96d56Sopenharmony_ci
24417db96d56Sopenharmony_cistatic PyObject *
24427db96d56Sopenharmony_ciPyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
24437db96d56Sopenharmony_ci{
24447db96d56Sopenharmony_ci    return PyUnicode_FromString(self->encoding);
24457db96d56Sopenharmony_ci}
24467db96d56Sopenharmony_ci
24477db96d56Sopenharmony_cistatic int
24487db96d56Sopenharmony_ciPyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value, void *Py_UNUSED(ignored))
24497db96d56Sopenharmony_ci{
24507db96d56Sopenharmony_ci    PyObject *ascii;
24517db96d56Sopenharmony_ci    char *encoding;
24527db96d56Sopenharmony_ci
24537db96d56Sopenharmony_ci    /* It is illegal to del win.encoding */
24547db96d56Sopenharmony_ci    if (value == NULL) {
24557db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
24567db96d56Sopenharmony_ci                        "encoding may not be deleted");
24577db96d56Sopenharmony_ci        return -1;
24587db96d56Sopenharmony_ci    }
24597db96d56Sopenharmony_ci
24607db96d56Sopenharmony_ci    if (!PyUnicode_Check(value)) {
24617db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
24627db96d56Sopenharmony_ci                        "setting encoding to a non-string");
24637db96d56Sopenharmony_ci        return -1;
24647db96d56Sopenharmony_ci    }
24657db96d56Sopenharmony_ci    ascii = PyUnicode_AsASCIIString(value);
24667db96d56Sopenharmony_ci    if (ascii == NULL)
24677db96d56Sopenharmony_ci        return -1;
24687db96d56Sopenharmony_ci    encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
24697db96d56Sopenharmony_ci    Py_DECREF(ascii);
24707db96d56Sopenharmony_ci    if (encoding == NULL) {
24717db96d56Sopenharmony_ci        PyErr_NoMemory();
24727db96d56Sopenharmony_ci        return -1;
24737db96d56Sopenharmony_ci    }
24747db96d56Sopenharmony_ci    PyMem_Free(self->encoding);
24757db96d56Sopenharmony_ci    self->encoding = encoding;
24767db96d56Sopenharmony_ci    return 0;
24777db96d56Sopenharmony_ci}
24787db96d56Sopenharmony_ci
24797db96d56Sopenharmony_ci#include "clinic/_cursesmodule.c.h"
24807db96d56Sopenharmony_ci
24817db96d56Sopenharmony_cistatic PyMethodDef PyCursesWindow_Methods[] = {
24827db96d56Sopenharmony_ci    _CURSES_WINDOW_ADDCH_METHODDEF
24837db96d56Sopenharmony_ci    _CURSES_WINDOW_ADDNSTR_METHODDEF
24847db96d56Sopenharmony_ci    _CURSES_WINDOW_ADDSTR_METHODDEF
24857db96d56Sopenharmony_ci    _CURSES_WINDOW_ATTROFF_METHODDEF
24867db96d56Sopenharmony_ci    _CURSES_WINDOW_ATTRON_METHODDEF
24877db96d56Sopenharmony_ci    _CURSES_WINDOW_ATTRSET_METHODDEF
24887db96d56Sopenharmony_ci    _CURSES_WINDOW_BKGD_METHODDEF
24897db96d56Sopenharmony_ci#ifdef HAVE_CURSES_WCHGAT
24907db96d56Sopenharmony_ci    {"chgat",           (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
24917db96d56Sopenharmony_ci#endif
24927db96d56Sopenharmony_ci    _CURSES_WINDOW_BKGDSET_METHODDEF
24937db96d56Sopenharmony_ci    _CURSES_WINDOW_BORDER_METHODDEF
24947db96d56Sopenharmony_ci    _CURSES_WINDOW_BOX_METHODDEF
24957db96d56Sopenharmony_ci    {"clear",           (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
24967db96d56Sopenharmony_ci    {"clearok",         (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
24977db96d56Sopenharmony_ci    {"clrtobot",        (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
24987db96d56Sopenharmony_ci    {"clrtoeol",        (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
24997db96d56Sopenharmony_ci    {"cursyncup",       (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
25007db96d56Sopenharmony_ci    _CURSES_WINDOW_DELCH_METHODDEF
25017db96d56Sopenharmony_ci    {"deleteln",        (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
25027db96d56Sopenharmony_ci    _CURSES_WINDOW_DERWIN_METHODDEF
25037db96d56Sopenharmony_ci    _CURSES_WINDOW_ECHOCHAR_METHODDEF
25047db96d56Sopenharmony_ci    _CURSES_WINDOW_ENCLOSE_METHODDEF
25057db96d56Sopenharmony_ci    {"erase",           (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
25067db96d56Sopenharmony_ci    {"getbegyx",        (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
25077db96d56Sopenharmony_ci    _CURSES_WINDOW_GETBKGD_METHODDEF
25087db96d56Sopenharmony_ci    _CURSES_WINDOW_GETCH_METHODDEF
25097db96d56Sopenharmony_ci    _CURSES_WINDOW_GETKEY_METHODDEF
25107db96d56Sopenharmony_ci    _CURSES_WINDOW_GET_WCH_METHODDEF
25117db96d56Sopenharmony_ci    {"getmaxyx",        (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
25127db96d56Sopenharmony_ci    {"getparyx",        (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
25137db96d56Sopenharmony_ci    {"getstr",          (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
25147db96d56Sopenharmony_ci    {"getyx",           (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
25157db96d56Sopenharmony_ci    _CURSES_WINDOW_HLINE_METHODDEF
25167db96d56Sopenharmony_ci    {"idcok",           (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
25177db96d56Sopenharmony_ci    {"idlok",           (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
25187db96d56Sopenharmony_ci#ifdef HAVE_CURSES_IMMEDOK
25197db96d56Sopenharmony_ci    {"immedok",         (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
25207db96d56Sopenharmony_ci#endif
25217db96d56Sopenharmony_ci    _CURSES_WINDOW_INCH_METHODDEF
25227db96d56Sopenharmony_ci    _CURSES_WINDOW_INSCH_METHODDEF
25237db96d56Sopenharmony_ci    {"insdelln",        (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
25247db96d56Sopenharmony_ci    {"insertln",        (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
25257db96d56Sopenharmony_ci    _CURSES_WINDOW_INSNSTR_METHODDEF
25267db96d56Sopenharmony_ci    _CURSES_WINDOW_INSSTR_METHODDEF
25277db96d56Sopenharmony_ci    {"instr",           (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
25287db96d56Sopenharmony_ci    _CURSES_WINDOW_IS_LINETOUCHED_METHODDEF
25297db96d56Sopenharmony_ci    {"is_wintouched",   (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
25307db96d56Sopenharmony_ci    {"keypad",          (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
25317db96d56Sopenharmony_ci    {"leaveok",         (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
25327db96d56Sopenharmony_ci    {"move",            (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
25337db96d56Sopenharmony_ci    {"mvderwin",        (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
25347db96d56Sopenharmony_ci    {"mvwin",           (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
25357db96d56Sopenharmony_ci    {"nodelay",         (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
25367db96d56Sopenharmony_ci    {"notimeout",       (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
25377db96d56Sopenharmony_ci    _CURSES_WINDOW_NOUTREFRESH_METHODDEF
25387db96d56Sopenharmony_ci    _CURSES_WINDOW_OVERLAY_METHODDEF
25397db96d56Sopenharmony_ci    _CURSES_WINDOW_OVERWRITE_METHODDEF
25407db96d56Sopenharmony_ci    _CURSES_WINDOW_PUTWIN_METHODDEF
25417db96d56Sopenharmony_ci    _CURSES_WINDOW_REDRAWLN_METHODDEF
25427db96d56Sopenharmony_ci    {"redrawwin",       (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
25437db96d56Sopenharmony_ci    _CURSES_WINDOW_REFRESH_METHODDEF
25447db96d56Sopenharmony_ci#ifndef STRICT_SYSV_CURSES
25457db96d56Sopenharmony_ci    {"resize",          (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
25467db96d56Sopenharmony_ci#endif
25477db96d56Sopenharmony_ci    _CURSES_WINDOW_SCROLL_METHODDEF
25487db96d56Sopenharmony_ci    {"scrollok",        (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
25497db96d56Sopenharmony_ci    _CURSES_WINDOW_SETSCRREG_METHODDEF
25507db96d56Sopenharmony_ci    {"standend",        (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
25517db96d56Sopenharmony_ci    {"standout",        (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
25527db96d56Sopenharmony_ci    {"subpad", (PyCFunction)_curses_window_subwin, METH_VARARGS, _curses_window_subwin__doc__},
25537db96d56Sopenharmony_ci    _CURSES_WINDOW_SUBWIN_METHODDEF
25547db96d56Sopenharmony_ci    {"syncdown",        (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
25557db96d56Sopenharmony_ci#ifdef HAVE_CURSES_SYNCOK
25567db96d56Sopenharmony_ci    {"syncok",          (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
25577db96d56Sopenharmony_ci#endif
25587db96d56Sopenharmony_ci    {"syncup",          (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
25597db96d56Sopenharmony_ci    {"timeout",         (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
25607db96d56Sopenharmony_ci    _CURSES_WINDOW_TOUCHLINE_METHODDEF
25617db96d56Sopenharmony_ci    {"touchwin",        (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
25627db96d56Sopenharmony_ci    {"untouchwin",      (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
25637db96d56Sopenharmony_ci    _CURSES_WINDOW_VLINE_METHODDEF
25647db96d56Sopenharmony_ci    {NULL,                  NULL}   /* sentinel */
25657db96d56Sopenharmony_ci};
25667db96d56Sopenharmony_ci
25677db96d56Sopenharmony_cistatic PyGetSetDef PyCursesWindow_getsets[] = {
25687db96d56Sopenharmony_ci    {"encoding",
25697db96d56Sopenharmony_ci     (getter)PyCursesWindow_get_encoding,
25707db96d56Sopenharmony_ci     (setter)PyCursesWindow_set_encoding,
25717db96d56Sopenharmony_ci     "the typecode character used to create the array"},
25727db96d56Sopenharmony_ci    {NULL, NULL, NULL, NULL }  /* sentinel */
25737db96d56Sopenharmony_ci};
25747db96d56Sopenharmony_ci
25757db96d56Sopenharmony_ci/* -------------------------------------------------------*/
25767db96d56Sopenharmony_ci
25777db96d56Sopenharmony_ciPyTypeObject PyCursesWindow_Type = {
25787db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
25797db96d56Sopenharmony_ci    "_curses.window",           /*tp_name*/
25807db96d56Sopenharmony_ci    sizeof(PyCursesWindowObject),       /*tp_basicsize*/
25817db96d56Sopenharmony_ci    0,                          /*tp_itemsize*/
25827db96d56Sopenharmony_ci    /* methods */
25837db96d56Sopenharmony_ci    (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
25847db96d56Sopenharmony_ci    0,                          /*tp_vectorcall_offset*/
25857db96d56Sopenharmony_ci    (getattrfunc)0,             /*tp_getattr*/
25867db96d56Sopenharmony_ci    (setattrfunc)0,             /*tp_setattr*/
25877db96d56Sopenharmony_ci    0,                          /*tp_as_async*/
25887db96d56Sopenharmony_ci    0,                          /*tp_repr*/
25897db96d56Sopenharmony_ci    0,                          /*tp_as_number*/
25907db96d56Sopenharmony_ci    0,                          /*tp_as_sequence*/
25917db96d56Sopenharmony_ci    0,                          /*tp_as_mapping*/
25927db96d56Sopenharmony_ci    0,                          /*tp_hash*/
25937db96d56Sopenharmony_ci    0,                          /*tp_call*/
25947db96d56Sopenharmony_ci    0,                          /*tp_str*/
25957db96d56Sopenharmony_ci    0,                          /*tp_getattro*/
25967db96d56Sopenharmony_ci    0,                          /*tp_setattro*/
25977db96d56Sopenharmony_ci    0,                          /*tp_as_buffer*/
25987db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT,         /*tp_flags*/
25997db96d56Sopenharmony_ci    0,                          /*tp_doc*/
26007db96d56Sopenharmony_ci    0,                          /*tp_traverse*/
26017db96d56Sopenharmony_ci    0,                          /*tp_clear*/
26027db96d56Sopenharmony_ci    0,                          /*tp_richcompare*/
26037db96d56Sopenharmony_ci    0,                          /*tp_weaklistoffset*/
26047db96d56Sopenharmony_ci    0,                          /*tp_iter*/
26057db96d56Sopenharmony_ci    0,                          /*tp_iternext*/
26067db96d56Sopenharmony_ci    PyCursesWindow_Methods,     /*tp_methods*/
26077db96d56Sopenharmony_ci    0,                          /* tp_members */
26087db96d56Sopenharmony_ci    PyCursesWindow_getsets,     /* tp_getset */
26097db96d56Sopenharmony_ci};
26107db96d56Sopenharmony_ci
26117db96d56Sopenharmony_ci/* Function Prototype Macros - They are ugly but very, very useful. ;-)
26127db96d56Sopenharmony_ci
26137db96d56Sopenharmony_ci   X - function name
26147db96d56Sopenharmony_ci   TYPE - parameter Type
26157db96d56Sopenharmony_ci   ERGSTR - format string for construction of the return value
26167db96d56Sopenharmony_ci   PARSESTR - format string for argument parsing
26177db96d56Sopenharmony_ci   */
26187db96d56Sopenharmony_ci
26197db96d56Sopenharmony_ci#define NoArgNoReturnFunctionBody(X) \
26207db96d56Sopenharmony_ci{ \
26217db96d56Sopenharmony_ci  PyCursesInitialised \
26227db96d56Sopenharmony_ci  return PyCursesCheckERR(X(), # X); }
26237db96d56Sopenharmony_ci
26247db96d56Sopenharmony_ci#define NoArgOrFlagNoReturnFunctionBody(X, flag) \
26257db96d56Sopenharmony_ci{ \
26267db96d56Sopenharmony_ci    PyCursesInitialised \
26277db96d56Sopenharmony_ci    if (flag) \
26287db96d56Sopenharmony_ci        return PyCursesCheckERR(X(), # X); \
26297db96d56Sopenharmony_ci    else \
26307db96d56Sopenharmony_ci        return PyCursesCheckERR(no ## X(), # X); \
26317db96d56Sopenharmony_ci}
26327db96d56Sopenharmony_ci
26337db96d56Sopenharmony_ci#define NoArgReturnIntFunctionBody(X) \
26347db96d56Sopenharmony_ci{ \
26357db96d56Sopenharmony_ci PyCursesInitialised \
26367db96d56Sopenharmony_ci return PyLong_FromLong((long) X()); }
26377db96d56Sopenharmony_ci
26387db96d56Sopenharmony_ci
26397db96d56Sopenharmony_ci#define NoArgReturnStringFunctionBody(X) \
26407db96d56Sopenharmony_ci{ \
26417db96d56Sopenharmony_ci  PyCursesInitialised \
26427db96d56Sopenharmony_ci  return PyBytes_FromString(X()); }
26437db96d56Sopenharmony_ci
26447db96d56Sopenharmony_ci#define NoArgTrueFalseFunctionBody(X) \
26457db96d56Sopenharmony_ci{ \
26467db96d56Sopenharmony_ci  PyCursesInitialised \
26477db96d56Sopenharmony_ci  return PyBool_FromLong(X()); }
26487db96d56Sopenharmony_ci
26497db96d56Sopenharmony_ci#define NoArgNoReturnVoidFunctionBody(X) \
26507db96d56Sopenharmony_ci{ \
26517db96d56Sopenharmony_ci  PyCursesInitialised \
26527db96d56Sopenharmony_ci  X(); \
26537db96d56Sopenharmony_ci  Py_RETURN_NONE; }
26547db96d56Sopenharmony_ci
26557db96d56Sopenharmony_ci/*********************************************************************
26567db96d56Sopenharmony_ci Global Functions
26577db96d56Sopenharmony_ci**********************************************************************/
26587db96d56Sopenharmony_ci
26597db96d56Sopenharmony_ci#ifdef HAVE_CURSES_FILTER
26607db96d56Sopenharmony_ci/*[clinic input]
26617db96d56Sopenharmony_ci_curses.filter
26627db96d56Sopenharmony_ci
26637db96d56Sopenharmony_ci[clinic start generated code]*/
26647db96d56Sopenharmony_ci
26657db96d56Sopenharmony_cistatic PyObject *
26667db96d56Sopenharmony_ci_curses_filter_impl(PyObject *module)
26677db96d56Sopenharmony_ci/*[clinic end generated code: output=fb5b8a3642eb70b5 input=668c75a6992d3624]*/
26687db96d56Sopenharmony_ci{
26697db96d56Sopenharmony_ci    /* not checking for PyCursesInitialised here since filter() must
26707db96d56Sopenharmony_ci       be called before initscr() */
26717db96d56Sopenharmony_ci    filter();
26727db96d56Sopenharmony_ci    Py_RETURN_NONE;
26737db96d56Sopenharmony_ci}
26747db96d56Sopenharmony_ci#endif
26757db96d56Sopenharmony_ci
26767db96d56Sopenharmony_ci/*[clinic input]
26777db96d56Sopenharmony_ci_curses.baudrate
26787db96d56Sopenharmony_ci
26797db96d56Sopenharmony_ciReturn the output speed of the terminal in bits per second.
26807db96d56Sopenharmony_ci[clinic start generated code]*/
26817db96d56Sopenharmony_ci
26827db96d56Sopenharmony_cistatic PyObject *
26837db96d56Sopenharmony_ci_curses_baudrate_impl(PyObject *module)
26847db96d56Sopenharmony_ci/*[clinic end generated code: output=3c63c6c401d7d9c0 input=921f022ed04a0fd9]*/
26857db96d56Sopenharmony_ciNoArgReturnIntFunctionBody(baudrate)
26867db96d56Sopenharmony_ci
26877db96d56Sopenharmony_ci/*[clinic input]
26887db96d56Sopenharmony_ci_curses.beep
26897db96d56Sopenharmony_ci
26907db96d56Sopenharmony_ciEmit a short attention sound.
26917db96d56Sopenharmony_ci[clinic start generated code]*/
26927db96d56Sopenharmony_ci
26937db96d56Sopenharmony_cistatic PyObject *
26947db96d56Sopenharmony_ci_curses_beep_impl(PyObject *module)
26957db96d56Sopenharmony_ci/*[clinic end generated code: output=425274962abe49a2 input=a35698ca7d0162bc]*/
26967db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(beep)
26977db96d56Sopenharmony_ci
26987db96d56Sopenharmony_ci/*[clinic input]
26997db96d56Sopenharmony_ci_curses.can_change_color
27007db96d56Sopenharmony_ci
27017db96d56Sopenharmony_ciReturn True if the programmer can change the colors displayed by the terminal.
27027db96d56Sopenharmony_ci[clinic start generated code]*/
27037db96d56Sopenharmony_ci
27047db96d56Sopenharmony_cistatic PyObject *
27057db96d56Sopenharmony_ci_curses_can_change_color_impl(PyObject *module)
27067db96d56Sopenharmony_ci/*[clinic end generated code: output=359df8c3c77d8bf1 input=d7718884de0092f2]*/
27077db96d56Sopenharmony_ciNoArgTrueFalseFunctionBody(can_change_color)
27087db96d56Sopenharmony_ci
27097db96d56Sopenharmony_ci/*[clinic input]
27107db96d56Sopenharmony_ci_curses.cbreak
27117db96d56Sopenharmony_ci
27127db96d56Sopenharmony_ci    flag: bool(accept={int}) = True
27137db96d56Sopenharmony_ci        If false, the effect is the same as calling nocbreak().
27147db96d56Sopenharmony_ci    /
27157db96d56Sopenharmony_ci
27167db96d56Sopenharmony_ciEnter cbreak mode.
27177db96d56Sopenharmony_ci
27187db96d56Sopenharmony_ciIn cbreak mode (sometimes called "rare" mode) normal tty line buffering is
27197db96d56Sopenharmony_citurned off and characters are available to be read one by one.  However,
27207db96d56Sopenharmony_ciunlike raw mode, special characters (interrupt, quit, suspend, and flow
27217db96d56Sopenharmony_cicontrol) retain their effects on the tty driver and calling program.
27227db96d56Sopenharmony_ciCalling first raw() then cbreak() leaves the terminal in cbreak mode.
27237db96d56Sopenharmony_ci[clinic start generated code]*/
27247db96d56Sopenharmony_ci
27257db96d56Sopenharmony_cistatic PyObject *
27267db96d56Sopenharmony_ci_curses_cbreak_impl(PyObject *module, int flag)
27277db96d56Sopenharmony_ci/*[clinic end generated code: output=9f9dee9664769751 input=150be619eb1f1458]*/
27287db96d56Sopenharmony_ciNoArgOrFlagNoReturnFunctionBody(cbreak, flag)
27297db96d56Sopenharmony_ci
27307db96d56Sopenharmony_ci/*[clinic input]
27317db96d56Sopenharmony_ci_curses.color_content
27327db96d56Sopenharmony_ci
27337db96d56Sopenharmony_ci    color_number: color
27347db96d56Sopenharmony_ci        The number of the color (0 - (COLORS-1)).
27357db96d56Sopenharmony_ci    /
27367db96d56Sopenharmony_ci
27377db96d56Sopenharmony_ciReturn the red, green, and blue (RGB) components of the specified color.
27387db96d56Sopenharmony_ci
27397db96d56Sopenharmony_ciA 3-tuple is returned, containing the R, G, B values for the given color,
27407db96d56Sopenharmony_ciwhich will be between 0 (no component) and 1000 (maximum amount of component).
27417db96d56Sopenharmony_ci[clinic start generated code]*/
27427db96d56Sopenharmony_ci
27437db96d56Sopenharmony_cistatic PyObject *
27447db96d56Sopenharmony_ci_curses_color_content_impl(PyObject *module, int color_number)
27457db96d56Sopenharmony_ci/*[clinic end generated code: output=17b466df7054e0de input=03b5ed0472662aea]*/
27467db96d56Sopenharmony_ci{
27477db96d56Sopenharmony_ci    _CURSES_COLOR_VAL_TYPE r,g,b;
27487db96d56Sopenharmony_ci
27497db96d56Sopenharmony_ci    PyCursesInitialised;
27507db96d56Sopenharmony_ci    PyCursesInitialisedColor;
27517db96d56Sopenharmony_ci
27527db96d56Sopenharmony_ci    if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) == ERR) {
27537db96d56Sopenharmony_ci        PyErr_Format(PyCursesError, "%s() returned ERR",
27547db96d56Sopenharmony_ci                        Py_STRINGIFY(_COLOR_CONTENT_FUNC));
27557db96d56Sopenharmony_ci        return NULL;
27567db96d56Sopenharmony_ci    }
27577db96d56Sopenharmony_ci
27587db96d56Sopenharmony_ci    return Py_BuildValue("(iii)", r, g, b);
27597db96d56Sopenharmony_ci}
27607db96d56Sopenharmony_ci
27617db96d56Sopenharmony_ci/*[clinic input]
27627db96d56Sopenharmony_ci_curses.color_pair
27637db96d56Sopenharmony_ci
27647db96d56Sopenharmony_ci    pair_number: int
27657db96d56Sopenharmony_ci        The number of the color pair.
27667db96d56Sopenharmony_ci    /
27677db96d56Sopenharmony_ci
27687db96d56Sopenharmony_ciReturn the attribute value for displaying text in the specified color.
27697db96d56Sopenharmony_ci
27707db96d56Sopenharmony_ciThis attribute value can be combined with A_STANDOUT, A_REVERSE, and the
27717db96d56Sopenharmony_ciother A_* attributes.  pair_number() is the counterpart to this function.
27727db96d56Sopenharmony_ci[clinic start generated code]*/
27737db96d56Sopenharmony_ci
27747db96d56Sopenharmony_cistatic PyObject *
27757db96d56Sopenharmony_ci_curses_color_pair_impl(PyObject *module, int pair_number)
27767db96d56Sopenharmony_ci/*[clinic end generated code: output=60718abb10ce9feb input=6034e9146f343802]*/
27777db96d56Sopenharmony_ci{
27787db96d56Sopenharmony_ci    PyCursesInitialised;
27797db96d56Sopenharmony_ci    PyCursesInitialisedColor;
27807db96d56Sopenharmony_ci
27817db96d56Sopenharmony_ci    return  PyLong_FromLong(COLOR_PAIR(pair_number));
27827db96d56Sopenharmony_ci}
27837db96d56Sopenharmony_ci
27847db96d56Sopenharmony_ci/*[clinic input]
27857db96d56Sopenharmony_ci_curses.curs_set
27867db96d56Sopenharmony_ci
27877db96d56Sopenharmony_ci    visibility: int
27887db96d56Sopenharmony_ci        0 for invisible, 1 for normal visible, or 2 for very visible.
27897db96d56Sopenharmony_ci    /
27907db96d56Sopenharmony_ci
27917db96d56Sopenharmony_ciSet the cursor state.
27927db96d56Sopenharmony_ci
27937db96d56Sopenharmony_ciIf the terminal supports the visibility requested, the previous cursor
27947db96d56Sopenharmony_cistate is returned; otherwise, an exception is raised.  On many terminals,
27957db96d56Sopenharmony_cithe "visible" mode is an underline cursor and the "very visible" mode is
27967db96d56Sopenharmony_cia block cursor.
27977db96d56Sopenharmony_ci[clinic start generated code]*/
27987db96d56Sopenharmony_ci
27997db96d56Sopenharmony_cistatic PyObject *
28007db96d56Sopenharmony_ci_curses_curs_set_impl(PyObject *module, int visibility)
28017db96d56Sopenharmony_ci/*[clinic end generated code: output=ee8e62483b1d6cd4 input=81a7924a65d29504]*/
28027db96d56Sopenharmony_ci{
28037db96d56Sopenharmony_ci    int erg;
28047db96d56Sopenharmony_ci
28057db96d56Sopenharmony_ci    PyCursesInitialised;
28067db96d56Sopenharmony_ci
28077db96d56Sopenharmony_ci    erg = curs_set(visibility);
28087db96d56Sopenharmony_ci    if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
28097db96d56Sopenharmony_ci
28107db96d56Sopenharmony_ci    return PyLong_FromLong((long) erg);
28117db96d56Sopenharmony_ci}
28127db96d56Sopenharmony_ci
28137db96d56Sopenharmony_ci/*[clinic input]
28147db96d56Sopenharmony_ci_curses.def_prog_mode
28157db96d56Sopenharmony_ci
28167db96d56Sopenharmony_ciSave the current terminal mode as the "program" mode.
28177db96d56Sopenharmony_ci
28187db96d56Sopenharmony_ciThe "program" mode is the mode when the running program is using curses.
28197db96d56Sopenharmony_ci
28207db96d56Sopenharmony_ciSubsequent calls to reset_prog_mode() will restore this mode.
28217db96d56Sopenharmony_ci[clinic start generated code]*/
28227db96d56Sopenharmony_ci
28237db96d56Sopenharmony_cistatic PyObject *
28247db96d56Sopenharmony_ci_curses_def_prog_mode_impl(PyObject *module)
28257db96d56Sopenharmony_ci/*[clinic end generated code: output=05d5a351fff874aa input=768b9cace620dda5]*/
28267db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(def_prog_mode)
28277db96d56Sopenharmony_ci
28287db96d56Sopenharmony_ci/*[clinic input]
28297db96d56Sopenharmony_ci_curses.def_shell_mode
28307db96d56Sopenharmony_ci
28317db96d56Sopenharmony_ciSave the current terminal mode as the "shell" mode.
28327db96d56Sopenharmony_ci
28337db96d56Sopenharmony_ciThe "shell" mode is the mode when the running program is not using curses.
28347db96d56Sopenharmony_ci
28357db96d56Sopenharmony_ciSubsequent calls to reset_shell_mode() will restore this mode.
28367db96d56Sopenharmony_ci[clinic start generated code]*/
28377db96d56Sopenharmony_ci
28387db96d56Sopenharmony_cistatic PyObject *
28397db96d56Sopenharmony_ci_curses_def_shell_mode_impl(PyObject *module)
28407db96d56Sopenharmony_ci/*[clinic end generated code: output=d6e42f5c768f860f input=5ead21f6f0baa894]*/
28417db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(def_shell_mode)
28427db96d56Sopenharmony_ci
28437db96d56Sopenharmony_ci/*[clinic input]
28447db96d56Sopenharmony_ci_curses.delay_output
28457db96d56Sopenharmony_ci
28467db96d56Sopenharmony_ci    ms: int
28477db96d56Sopenharmony_ci        Duration in milliseconds.
28487db96d56Sopenharmony_ci    /
28497db96d56Sopenharmony_ci
28507db96d56Sopenharmony_ciInsert a pause in output.
28517db96d56Sopenharmony_ci[clinic start generated code]*/
28527db96d56Sopenharmony_ci
28537db96d56Sopenharmony_cistatic PyObject *
28547db96d56Sopenharmony_ci_curses_delay_output_impl(PyObject *module, int ms)
28557db96d56Sopenharmony_ci/*[clinic end generated code: output=b6613a67f17fa4f4 input=5316457f5f59196c]*/
28567db96d56Sopenharmony_ci{
28577db96d56Sopenharmony_ci    PyCursesInitialised;
28587db96d56Sopenharmony_ci
28597db96d56Sopenharmony_ci    return PyCursesCheckERR(delay_output(ms), "delay_output");
28607db96d56Sopenharmony_ci}
28617db96d56Sopenharmony_ci
28627db96d56Sopenharmony_ci/*[clinic input]
28637db96d56Sopenharmony_ci_curses.doupdate
28647db96d56Sopenharmony_ci
28657db96d56Sopenharmony_ciUpdate the physical screen to match the virtual screen.
28667db96d56Sopenharmony_ci[clinic start generated code]*/
28677db96d56Sopenharmony_ci
28687db96d56Sopenharmony_cistatic PyObject *
28697db96d56Sopenharmony_ci_curses_doupdate_impl(PyObject *module)
28707db96d56Sopenharmony_ci/*[clinic end generated code: output=f34536975a75680c input=8da80914432a6489]*/
28717db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(doupdate)
28727db96d56Sopenharmony_ci
28737db96d56Sopenharmony_ci/*[clinic input]
28747db96d56Sopenharmony_ci_curses.echo
28757db96d56Sopenharmony_ci
28767db96d56Sopenharmony_ci    flag: bool(accept={int}) = True
28777db96d56Sopenharmony_ci        If false, the effect is the same as calling noecho().
28787db96d56Sopenharmony_ci    /
28797db96d56Sopenharmony_ci
28807db96d56Sopenharmony_ciEnter echo mode.
28817db96d56Sopenharmony_ci
28827db96d56Sopenharmony_ciIn echo mode, each character input is echoed to the screen as it is entered.
28837db96d56Sopenharmony_ci[clinic start generated code]*/
28847db96d56Sopenharmony_ci
28857db96d56Sopenharmony_cistatic PyObject *
28867db96d56Sopenharmony_ci_curses_echo_impl(PyObject *module, int flag)
28877db96d56Sopenharmony_ci/*[clinic end generated code: output=03acb2ddfa6c8729 input=2e9e891d637eac5d]*/
28887db96d56Sopenharmony_ciNoArgOrFlagNoReturnFunctionBody(echo, flag)
28897db96d56Sopenharmony_ci
28907db96d56Sopenharmony_ci/*[clinic input]
28917db96d56Sopenharmony_ci_curses.endwin
28927db96d56Sopenharmony_ci
28937db96d56Sopenharmony_ciDe-initialize the library, and return terminal to normal status.
28947db96d56Sopenharmony_ci[clinic start generated code]*/
28957db96d56Sopenharmony_ci
28967db96d56Sopenharmony_cistatic PyObject *
28977db96d56Sopenharmony_ci_curses_endwin_impl(PyObject *module)
28987db96d56Sopenharmony_ci/*[clinic end generated code: output=c0150cd96d2f4128 input=e172cfa43062f3fa]*/
28997db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(endwin)
29007db96d56Sopenharmony_ci
29017db96d56Sopenharmony_ci/*[clinic input]
29027db96d56Sopenharmony_ci_curses.erasechar
29037db96d56Sopenharmony_ci
29047db96d56Sopenharmony_ciReturn the user's current erase character.
29057db96d56Sopenharmony_ci[clinic start generated code]*/
29067db96d56Sopenharmony_ci
29077db96d56Sopenharmony_cistatic PyObject *
29087db96d56Sopenharmony_ci_curses_erasechar_impl(PyObject *module)
29097db96d56Sopenharmony_ci/*[clinic end generated code: output=3df305dc6b926b3f input=628c136c3c5758d3]*/
29107db96d56Sopenharmony_ci{
29117db96d56Sopenharmony_ci    char ch;
29127db96d56Sopenharmony_ci
29137db96d56Sopenharmony_ci    PyCursesInitialised;
29147db96d56Sopenharmony_ci
29157db96d56Sopenharmony_ci    ch = erasechar();
29167db96d56Sopenharmony_ci
29177db96d56Sopenharmony_ci    return PyBytes_FromStringAndSize(&ch, 1);
29187db96d56Sopenharmony_ci}
29197db96d56Sopenharmony_ci
29207db96d56Sopenharmony_ci/*[clinic input]
29217db96d56Sopenharmony_ci_curses.flash
29227db96d56Sopenharmony_ci
29237db96d56Sopenharmony_ciFlash the screen.
29247db96d56Sopenharmony_ci
29257db96d56Sopenharmony_ciThat is, change it to reverse-video and then change it back in a short interval.
29267db96d56Sopenharmony_ci[clinic start generated code]*/
29277db96d56Sopenharmony_ci
29287db96d56Sopenharmony_cistatic PyObject *
29297db96d56Sopenharmony_ci_curses_flash_impl(PyObject *module)
29307db96d56Sopenharmony_ci/*[clinic end generated code: output=488b8a0ebd9ea9b8 input=02fdfb06c8fc3171]*/
29317db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(flash)
29327db96d56Sopenharmony_ci
29337db96d56Sopenharmony_ci/*[clinic input]
29347db96d56Sopenharmony_ci_curses.flushinp
29357db96d56Sopenharmony_ci
29367db96d56Sopenharmony_ciFlush all input buffers.
29377db96d56Sopenharmony_ci
29387db96d56Sopenharmony_ciThis throws away any typeahead that has been typed by the user and has not
29397db96d56Sopenharmony_ciyet been processed by the program.
29407db96d56Sopenharmony_ci[clinic start generated code]*/
29417db96d56Sopenharmony_ci
29427db96d56Sopenharmony_cistatic PyObject *
29437db96d56Sopenharmony_ci_curses_flushinp_impl(PyObject *module)
29447db96d56Sopenharmony_ci/*[clinic end generated code: output=7e7a1fc1473960f5 input=59d042e705cef5ec]*/
29457db96d56Sopenharmony_ciNoArgNoReturnVoidFunctionBody(flushinp)
29467db96d56Sopenharmony_ci
29477db96d56Sopenharmony_ci#ifdef getsyx
29487db96d56Sopenharmony_ci/*[clinic input]
29497db96d56Sopenharmony_ci_curses.getsyx
29507db96d56Sopenharmony_ci
29517db96d56Sopenharmony_ciReturn the current coordinates of the virtual screen cursor.
29527db96d56Sopenharmony_ci
29537db96d56Sopenharmony_ciReturn a (y, x) tuple.  If leaveok is currently true, return (-1, -1).
29547db96d56Sopenharmony_ci[clinic start generated code]*/
29557db96d56Sopenharmony_ci
29567db96d56Sopenharmony_cistatic PyObject *
29577db96d56Sopenharmony_ci_curses_getsyx_impl(PyObject *module)
29587db96d56Sopenharmony_ci/*[clinic end generated code: output=c8e6c3f42349a038 input=9e1f862f3b4f7cba]*/
29597db96d56Sopenharmony_ci{
29607db96d56Sopenharmony_ci    int x = 0;
29617db96d56Sopenharmony_ci    int y = 0;
29627db96d56Sopenharmony_ci
29637db96d56Sopenharmony_ci    PyCursesInitialised;
29647db96d56Sopenharmony_ci
29657db96d56Sopenharmony_ci    getsyx(y, x);
29667db96d56Sopenharmony_ci
29677db96d56Sopenharmony_ci    return Py_BuildValue("(ii)", y, x);
29687db96d56Sopenharmony_ci}
29697db96d56Sopenharmony_ci#endif
29707db96d56Sopenharmony_ci
29717db96d56Sopenharmony_ci#ifdef NCURSES_MOUSE_VERSION
29727db96d56Sopenharmony_ci/*[clinic input]
29737db96d56Sopenharmony_ci_curses.getmouse
29747db96d56Sopenharmony_ci
29757db96d56Sopenharmony_ciRetrieve the queued mouse event.
29767db96d56Sopenharmony_ci
29777db96d56Sopenharmony_ciAfter getch() returns KEY_MOUSE to signal a mouse event, this function
29787db96d56Sopenharmony_cireturns a 5-tuple (id, x, y, z, bstate).
29797db96d56Sopenharmony_ci[clinic start generated code]*/
29807db96d56Sopenharmony_ci
29817db96d56Sopenharmony_cistatic PyObject *
29827db96d56Sopenharmony_ci_curses_getmouse_impl(PyObject *module)
29837db96d56Sopenharmony_ci/*[clinic end generated code: output=ccf4242546b9cfa8 input=5b756ee6f5b481b1]*/
29847db96d56Sopenharmony_ci{
29857db96d56Sopenharmony_ci    int rtn;
29867db96d56Sopenharmony_ci    MEVENT event;
29877db96d56Sopenharmony_ci
29887db96d56Sopenharmony_ci    PyCursesInitialised;
29897db96d56Sopenharmony_ci
29907db96d56Sopenharmony_ci    rtn = getmouse( &event );
29917db96d56Sopenharmony_ci    if (rtn == ERR) {
29927db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, "getmouse() returned ERR");
29937db96d56Sopenharmony_ci        return NULL;
29947db96d56Sopenharmony_ci    }
29957db96d56Sopenharmony_ci    return Py_BuildValue("(hiiik)",
29967db96d56Sopenharmony_ci                         (short)event.id,
29977db96d56Sopenharmony_ci                         (int)event.x, (int)event.y, (int)event.z,
29987db96d56Sopenharmony_ci                         (unsigned long) event.bstate);
29997db96d56Sopenharmony_ci}
30007db96d56Sopenharmony_ci
30017db96d56Sopenharmony_ci/*[clinic input]
30027db96d56Sopenharmony_ci_curses.ungetmouse
30037db96d56Sopenharmony_ci
30047db96d56Sopenharmony_ci    id: short
30057db96d56Sopenharmony_ci    x: int
30067db96d56Sopenharmony_ci    y: int
30077db96d56Sopenharmony_ci    z: int
30087db96d56Sopenharmony_ci    bstate: unsigned_long(bitwise=True)
30097db96d56Sopenharmony_ci    /
30107db96d56Sopenharmony_ci
30117db96d56Sopenharmony_ciPush a KEY_MOUSE event onto the input queue.
30127db96d56Sopenharmony_ci
30137db96d56Sopenharmony_ciThe following getmouse() will return the given state data.
30147db96d56Sopenharmony_ci[clinic start generated code]*/
30157db96d56Sopenharmony_ci
30167db96d56Sopenharmony_cistatic PyObject *
30177db96d56Sopenharmony_ci_curses_ungetmouse_impl(PyObject *module, short id, int x, int y, int z,
30187db96d56Sopenharmony_ci                        unsigned long bstate)
30197db96d56Sopenharmony_ci/*[clinic end generated code: output=3430c9b0fc5c4341 input=fd650b2ca5a01e8f]*/
30207db96d56Sopenharmony_ci{
30217db96d56Sopenharmony_ci    MEVENT event;
30227db96d56Sopenharmony_ci
30237db96d56Sopenharmony_ci    PyCursesInitialised;
30247db96d56Sopenharmony_ci
30257db96d56Sopenharmony_ci    event.id = id;
30267db96d56Sopenharmony_ci    event.x = x;
30277db96d56Sopenharmony_ci    event.y = y;
30287db96d56Sopenharmony_ci    event.z = z;
30297db96d56Sopenharmony_ci    event.bstate = bstate;
30307db96d56Sopenharmony_ci    return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
30317db96d56Sopenharmony_ci}
30327db96d56Sopenharmony_ci#endif
30337db96d56Sopenharmony_ci
30347db96d56Sopenharmony_ci/*[clinic input]
30357db96d56Sopenharmony_ci_curses.getwin
30367db96d56Sopenharmony_ci
30377db96d56Sopenharmony_ci    file: object
30387db96d56Sopenharmony_ci    /
30397db96d56Sopenharmony_ci
30407db96d56Sopenharmony_ciRead window related data stored in the file by an earlier putwin() call.
30417db96d56Sopenharmony_ci
30427db96d56Sopenharmony_ciThe routine then creates and initializes a new window using that data,
30437db96d56Sopenharmony_cireturning the new window object.
30447db96d56Sopenharmony_ci[clinic start generated code]*/
30457db96d56Sopenharmony_ci
30467db96d56Sopenharmony_cistatic PyObject *
30477db96d56Sopenharmony_ci_curses_getwin(PyObject *module, PyObject *file)
30487db96d56Sopenharmony_ci/*[clinic end generated code: output=a79e0df3379af756 input=f713d2bba0e4c929]*/
30497db96d56Sopenharmony_ci{
30507db96d56Sopenharmony_ci    FILE *fp;
30517db96d56Sopenharmony_ci    PyObject *data;
30527db96d56Sopenharmony_ci    size_t datalen;
30537db96d56Sopenharmony_ci    WINDOW *win;
30547db96d56Sopenharmony_ci    _Py_IDENTIFIER(read);
30557db96d56Sopenharmony_ci    PyObject *res = NULL;
30567db96d56Sopenharmony_ci
30577db96d56Sopenharmony_ci    PyCursesInitialised;
30587db96d56Sopenharmony_ci
30597db96d56Sopenharmony_ci    fp = tmpfile();
30607db96d56Sopenharmony_ci    if (fp == NULL)
30617db96d56Sopenharmony_ci        return PyErr_SetFromErrno(PyExc_OSError);
30627db96d56Sopenharmony_ci
30637db96d56Sopenharmony_ci    if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
30647db96d56Sopenharmony_ci        goto error;
30657db96d56Sopenharmony_ci
30667db96d56Sopenharmony_ci    data = _PyObject_CallMethodIdNoArgs(file, &PyId_read);
30677db96d56Sopenharmony_ci    if (data == NULL)
30687db96d56Sopenharmony_ci        goto error;
30697db96d56Sopenharmony_ci    if (!PyBytes_Check(data)) {
30707db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError,
30717db96d56Sopenharmony_ci                     "f.read() returned %.100s instead of bytes",
30727db96d56Sopenharmony_ci                     Py_TYPE(data)->tp_name);
30737db96d56Sopenharmony_ci        Py_DECREF(data);
30747db96d56Sopenharmony_ci        goto error;
30757db96d56Sopenharmony_ci    }
30767db96d56Sopenharmony_ci    datalen = PyBytes_GET_SIZE(data);
30777db96d56Sopenharmony_ci    if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
30787db96d56Sopenharmony_ci        Py_DECREF(data);
30797db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
30807db96d56Sopenharmony_ci        goto error;
30817db96d56Sopenharmony_ci    }
30827db96d56Sopenharmony_ci    Py_DECREF(data);
30837db96d56Sopenharmony_ci
30847db96d56Sopenharmony_ci    fseek(fp, 0, 0);
30857db96d56Sopenharmony_ci    win = getwin(fp);
30867db96d56Sopenharmony_ci    if (win == NULL) {
30877db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, catchall_NULL);
30887db96d56Sopenharmony_ci        goto error;
30897db96d56Sopenharmony_ci    }
30907db96d56Sopenharmony_ci    res = PyCursesWindow_New(win, NULL);
30917db96d56Sopenharmony_ci
30927db96d56Sopenharmony_cierror:
30937db96d56Sopenharmony_ci    fclose(fp);
30947db96d56Sopenharmony_ci    return res;
30957db96d56Sopenharmony_ci}
30967db96d56Sopenharmony_ci
30977db96d56Sopenharmony_ci/*[clinic input]
30987db96d56Sopenharmony_ci_curses.halfdelay
30997db96d56Sopenharmony_ci
31007db96d56Sopenharmony_ci    tenths: byte
31017db96d56Sopenharmony_ci        Maximal blocking delay in tenths of seconds (1 - 255).
31027db96d56Sopenharmony_ci    /
31037db96d56Sopenharmony_ci
31047db96d56Sopenharmony_ciEnter half-delay mode.
31057db96d56Sopenharmony_ci
31067db96d56Sopenharmony_ciUse nocbreak() to leave half-delay mode.
31077db96d56Sopenharmony_ci[clinic start generated code]*/
31087db96d56Sopenharmony_ci
31097db96d56Sopenharmony_cistatic PyObject *
31107db96d56Sopenharmony_ci_curses_halfdelay_impl(PyObject *module, unsigned char tenths)
31117db96d56Sopenharmony_ci/*[clinic end generated code: output=e92cdf0ef33c0663 input=e42dce7259c15100]*/
31127db96d56Sopenharmony_ci{
31137db96d56Sopenharmony_ci    PyCursesInitialised;
31147db96d56Sopenharmony_ci
31157db96d56Sopenharmony_ci    return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
31167db96d56Sopenharmony_ci}
31177db96d56Sopenharmony_ci
31187db96d56Sopenharmony_ci/*[clinic input]
31197db96d56Sopenharmony_ci_curses.has_colors
31207db96d56Sopenharmony_ci
31217db96d56Sopenharmony_ciReturn True if the terminal can display colors; otherwise, return False.
31227db96d56Sopenharmony_ci[clinic start generated code]*/
31237db96d56Sopenharmony_ci
31247db96d56Sopenharmony_cistatic PyObject *
31257db96d56Sopenharmony_ci_curses_has_colors_impl(PyObject *module)
31267db96d56Sopenharmony_ci/*[clinic end generated code: output=db5667483139e3e2 input=b2ec41b739d896c6]*/
31277db96d56Sopenharmony_ciNoArgTrueFalseFunctionBody(has_colors)
31287db96d56Sopenharmony_ci
31297db96d56Sopenharmony_ci/*[clinic input]
31307db96d56Sopenharmony_ci_curses.has_ic
31317db96d56Sopenharmony_ci
31327db96d56Sopenharmony_ciReturn True if the terminal has insert- and delete-character capabilities.
31337db96d56Sopenharmony_ci[clinic start generated code]*/
31347db96d56Sopenharmony_ci
31357db96d56Sopenharmony_cistatic PyObject *
31367db96d56Sopenharmony_ci_curses_has_ic_impl(PyObject *module)
31377db96d56Sopenharmony_ci/*[clinic end generated code: output=6be24da9cb1268fe input=9bc2d3a797cc7324]*/
31387db96d56Sopenharmony_ciNoArgTrueFalseFunctionBody(has_ic)
31397db96d56Sopenharmony_ci
31407db96d56Sopenharmony_ci/*[clinic input]
31417db96d56Sopenharmony_ci_curses.has_il
31427db96d56Sopenharmony_ci
31437db96d56Sopenharmony_ciReturn True if the terminal has insert- and delete-line capabilities.
31447db96d56Sopenharmony_ci[clinic start generated code]*/
31457db96d56Sopenharmony_ci
31467db96d56Sopenharmony_cistatic PyObject *
31477db96d56Sopenharmony_ci_curses_has_il_impl(PyObject *module)
31487db96d56Sopenharmony_ci/*[clinic end generated code: output=d45bd7788ff9f5f4 input=cd939d5607ee5427]*/
31497db96d56Sopenharmony_ciNoArgTrueFalseFunctionBody(has_il)
31507db96d56Sopenharmony_ci
31517db96d56Sopenharmony_ci#ifdef HAVE_CURSES_HAS_KEY
31527db96d56Sopenharmony_ci/*[clinic input]
31537db96d56Sopenharmony_ci_curses.has_key
31547db96d56Sopenharmony_ci
31557db96d56Sopenharmony_ci    key: int
31567db96d56Sopenharmony_ci        Key number.
31577db96d56Sopenharmony_ci    /
31587db96d56Sopenharmony_ci
31597db96d56Sopenharmony_ciReturn True if the current terminal type recognizes a key with that value.
31607db96d56Sopenharmony_ci[clinic start generated code]*/
31617db96d56Sopenharmony_ci
31627db96d56Sopenharmony_cistatic PyObject *
31637db96d56Sopenharmony_ci_curses_has_key_impl(PyObject *module, int key)
31647db96d56Sopenharmony_ci/*[clinic end generated code: output=19ad48319414d0b1 input=78bd44acf1a4997c]*/
31657db96d56Sopenharmony_ci{
31667db96d56Sopenharmony_ci    PyCursesInitialised;
31677db96d56Sopenharmony_ci
31687db96d56Sopenharmony_ci    return PyBool_FromLong(has_key(key));
31697db96d56Sopenharmony_ci}
31707db96d56Sopenharmony_ci#endif
31717db96d56Sopenharmony_ci
31727db96d56Sopenharmony_ci/*[clinic input]
31737db96d56Sopenharmony_ci_curses.init_color
31747db96d56Sopenharmony_ci
31757db96d56Sopenharmony_ci    color_number: color
31767db96d56Sopenharmony_ci        The number of the color to be changed (0 - (COLORS-1)).
31777db96d56Sopenharmony_ci    r: component
31787db96d56Sopenharmony_ci        Red component (0 - 1000).
31797db96d56Sopenharmony_ci    g: component
31807db96d56Sopenharmony_ci        Green component (0 - 1000).
31817db96d56Sopenharmony_ci    b: component
31827db96d56Sopenharmony_ci        Blue component (0 - 1000).
31837db96d56Sopenharmony_ci    /
31847db96d56Sopenharmony_ci
31857db96d56Sopenharmony_ciChange the definition of a color.
31867db96d56Sopenharmony_ci
31877db96d56Sopenharmony_ciWhen init_color() is used, all occurrences of that color on the screen
31887db96d56Sopenharmony_ciimmediately change to the new definition.  This function is a no-op on
31897db96d56Sopenharmony_cimost terminals; it is active only if can_change_color() returns true.
31907db96d56Sopenharmony_ci[clinic start generated code]*/
31917db96d56Sopenharmony_ci
31927db96d56Sopenharmony_cistatic PyObject *
31937db96d56Sopenharmony_ci_curses_init_color_impl(PyObject *module, int color_number, short r, short g,
31947db96d56Sopenharmony_ci                        short b)
31957db96d56Sopenharmony_ci/*[clinic end generated code: output=d7ed71b2d818cdf2 input=ae2b8bea0f152c80]*/
31967db96d56Sopenharmony_ci{
31977db96d56Sopenharmony_ci    PyCursesInitialised;
31987db96d56Sopenharmony_ci    PyCursesInitialisedColor;
31997db96d56Sopenharmony_ci
32007db96d56Sopenharmony_ci    return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b),
32017db96d56Sopenharmony_ci                            Py_STRINGIFY(_CURSES_INIT_COLOR_FUNC));
32027db96d56Sopenharmony_ci}
32037db96d56Sopenharmony_ci
32047db96d56Sopenharmony_ci/*[clinic input]
32057db96d56Sopenharmony_ci_curses.init_pair
32067db96d56Sopenharmony_ci
32077db96d56Sopenharmony_ci    pair_number: pair
32087db96d56Sopenharmony_ci        The number of the color-pair to be changed (1 - (COLOR_PAIRS-1)).
32097db96d56Sopenharmony_ci    fg: color_allow_default
32107db96d56Sopenharmony_ci        Foreground color number (-1 - (COLORS-1)).
32117db96d56Sopenharmony_ci    bg: color_allow_default
32127db96d56Sopenharmony_ci        Background color number (-1 - (COLORS-1)).
32137db96d56Sopenharmony_ci    /
32147db96d56Sopenharmony_ci
32157db96d56Sopenharmony_ciChange the definition of a color-pair.
32167db96d56Sopenharmony_ci
32177db96d56Sopenharmony_ciIf the color-pair was previously initialized, the screen is refreshed and
32187db96d56Sopenharmony_ciall occurrences of that color-pair are changed to the new definition.
32197db96d56Sopenharmony_ci[clinic start generated code]*/
32207db96d56Sopenharmony_ci
32217db96d56Sopenharmony_cistatic PyObject *
32227db96d56Sopenharmony_ci_curses_init_pair_impl(PyObject *module, int pair_number, int fg, int bg)
32237db96d56Sopenharmony_ci/*[clinic end generated code: output=a0bba03d2bbc3ee6 input=54b421b44c12c389]*/
32247db96d56Sopenharmony_ci{
32257db96d56Sopenharmony_ci    PyCursesInitialised;
32267db96d56Sopenharmony_ci    PyCursesInitialisedColor;
32277db96d56Sopenharmony_ci
32287db96d56Sopenharmony_ci    if (_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg) == ERR) {
32297db96d56Sopenharmony_ci        if (pair_number >= COLOR_PAIRS) {
32307db96d56Sopenharmony_ci            PyErr_Format(PyExc_ValueError,
32317db96d56Sopenharmony_ci                         "Color pair is greater than COLOR_PAIRS-1 (%d).",
32327db96d56Sopenharmony_ci                         COLOR_PAIRS - 1);
32337db96d56Sopenharmony_ci        }
32347db96d56Sopenharmony_ci        else {
32357db96d56Sopenharmony_ci            PyErr_Format(PyCursesError, "%s() returned ERR",
32367db96d56Sopenharmony_ci                         Py_STRINGIFY(_CURSES_INIT_PAIR_FUNC));
32377db96d56Sopenharmony_ci        }
32387db96d56Sopenharmony_ci        return NULL;
32397db96d56Sopenharmony_ci    }
32407db96d56Sopenharmony_ci
32417db96d56Sopenharmony_ci    Py_RETURN_NONE;
32427db96d56Sopenharmony_ci}
32437db96d56Sopenharmony_ci
32447db96d56Sopenharmony_cistatic PyObject *ModDict;
32457db96d56Sopenharmony_ci
32467db96d56Sopenharmony_ci/*[clinic input]
32477db96d56Sopenharmony_ci_curses.initscr
32487db96d56Sopenharmony_ci
32497db96d56Sopenharmony_ciInitialize the library.
32507db96d56Sopenharmony_ci
32517db96d56Sopenharmony_ciReturn a WindowObject which represents the whole screen.
32527db96d56Sopenharmony_ci[clinic start generated code]*/
32537db96d56Sopenharmony_ci
32547db96d56Sopenharmony_cistatic PyObject *
32557db96d56Sopenharmony_ci_curses_initscr_impl(PyObject *module)
32567db96d56Sopenharmony_ci/*[clinic end generated code: output=619fb68443810b7b input=514f4bce1821f6b5]*/
32577db96d56Sopenharmony_ci{
32587db96d56Sopenharmony_ci    WINDOW *win;
32597db96d56Sopenharmony_ci    PyCursesWindowObject *winobj;
32607db96d56Sopenharmony_ci
32617db96d56Sopenharmony_ci    if (initialised) {
32627db96d56Sopenharmony_ci        wrefresh(stdscr);
32637db96d56Sopenharmony_ci        return (PyObject *)PyCursesWindow_New(stdscr, NULL);
32647db96d56Sopenharmony_ci    }
32657db96d56Sopenharmony_ci
32667db96d56Sopenharmony_ci    win = initscr();
32677db96d56Sopenharmony_ci
32687db96d56Sopenharmony_ci    if (win == NULL) {
32697db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, catchall_NULL);
32707db96d56Sopenharmony_ci        return NULL;
32717db96d56Sopenharmony_ci    }
32727db96d56Sopenharmony_ci
32737db96d56Sopenharmony_ci    initialised = initialised_setupterm = TRUE;
32747db96d56Sopenharmony_ci
32757db96d56Sopenharmony_ci/* This was moved from initcurses() because it core dumped on SGI,
32767db96d56Sopenharmony_ci   where they're not defined until you've called initscr() */
32777db96d56Sopenharmony_ci#define SetDictInt(string,ch)                                           \
32787db96d56Sopenharmony_ci    do {                                                                \
32797db96d56Sopenharmony_ci        PyObject *o = PyLong_FromLong((long) (ch));                     \
32807db96d56Sopenharmony_ci        if (o && PyDict_SetItemString(ModDict, string, o) == 0)     {   \
32817db96d56Sopenharmony_ci            Py_DECREF(o);                                               \
32827db96d56Sopenharmony_ci        }                                                               \
32837db96d56Sopenharmony_ci    } while (0)
32847db96d56Sopenharmony_ci
32857db96d56Sopenharmony_ci    /* Here are some graphic symbols you can use */
32867db96d56Sopenharmony_ci    SetDictInt("ACS_ULCORNER",      (ACS_ULCORNER));
32877db96d56Sopenharmony_ci    SetDictInt("ACS_LLCORNER",      (ACS_LLCORNER));
32887db96d56Sopenharmony_ci    SetDictInt("ACS_URCORNER",      (ACS_URCORNER));
32897db96d56Sopenharmony_ci    SetDictInt("ACS_LRCORNER",      (ACS_LRCORNER));
32907db96d56Sopenharmony_ci    SetDictInt("ACS_LTEE",          (ACS_LTEE));
32917db96d56Sopenharmony_ci    SetDictInt("ACS_RTEE",          (ACS_RTEE));
32927db96d56Sopenharmony_ci    SetDictInt("ACS_BTEE",          (ACS_BTEE));
32937db96d56Sopenharmony_ci    SetDictInt("ACS_TTEE",          (ACS_TTEE));
32947db96d56Sopenharmony_ci    SetDictInt("ACS_HLINE",         (ACS_HLINE));
32957db96d56Sopenharmony_ci    SetDictInt("ACS_VLINE",         (ACS_VLINE));
32967db96d56Sopenharmony_ci    SetDictInt("ACS_PLUS",          (ACS_PLUS));
32977db96d56Sopenharmony_ci#if !defined(__hpux) || defined(HAVE_NCURSES_H)
32987db96d56Sopenharmony_ci    /* On HP/UX 11, these are of type cchar_t, which is not an
32997db96d56Sopenharmony_ci       integral type. If this is a problem on more platforms, a
33007db96d56Sopenharmony_ci       configure test should be added to determine whether ACS_S1
33017db96d56Sopenharmony_ci       is of integral type. */
33027db96d56Sopenharmony_ci    SetDictInt("ACS_S1",            (ACS_S1));
33037db96d56Sopenharmony_ci    SetDictInt("ACS_S9",            (ACS_S9));
33047db96d56Sopenharmony_ci    SetDictInt("ACS_DIAMOND",       (ACS_DIAMOND));
33057db96d56Sopenharmony_ci    SetDictInt("ACS_CKBOARD",       (ACS_CKBOARD));
33067db96d56Sopenharmony_ci    SetDictInt("ACS_DEGREE",        (ACS_DEGREE));
33077db96d56Sopenharmony_ci    SetDictInt("ACS_PLMINUS",       (ACS_PLMINUS));
33087db96d56Sopenharmony_ci    SetDictInt("ACS_BULLET",        (ACS_BULLET));
33097db96d56Sopenharmony_ci    SetDictInt("ACS_LARROW",        (ACS_LARROW));
33107db96d56Sopenharmony_ci    SetDictInt("ACS_RARROW",        (ACS_RARROW));
33117db96d56Sopenharmony_ci    SetDictInt("ACS_DARROW",        (ACS_DARROW));
33127db96d56Sopenharmony_ci    SetDictInt("ACS_UARROW",        (ACS_UARROW));
33137db96d56Sopenharmony_ci    SetDictInt("ACS_BOARD",         (ACS_BOARD));
33147db96d56Sopenharmony_ci    SetDictInt("ACS_LANTERN",       (ACS_LANTERN));
33157db96d56Sopenharmony_ci    SetDictInt("ACS_BLOCK",         (ACS_BLOCK));
33167db96d56Sopenharmony_ci#endif
33177db96d56Sopenharmony_ci    SetDictInt("ACS_BSSB",          (ACS_ULCORNER));
33187db96d56Sopenharmony_ci    SetDictInt("ACS_SSBB",          (ACS_LLCORNER));
33197db96d56Sopenharmony_ci    SetDictInt("ACS_BBSS",          (ACS_URCORNER));
33207db96d56Sopenharmony_ci    SetDictInt("ACS_SBBS",          (ACS_LRCORNER));
33217db96d56Sopenharmony_ci    SetDictInt("ACS_SBSS",          (ACS_RTEE));
33227db96d56Sopenharmony_ci    SetDictInt("ACS_SSSB",          (ACS_LTEE));
33237db96d56Sopenharmony_ci    SetDictInt("ACS_SSBS",          (ACS_BTEE));
33247db96d56Sopenharmony_ci    SetDictInt("ACS_BSSS",          (ACS_TTEE));
33257db96d56Sopenharmony_ci    SetDictInt("ACS_BSBS",          (ACS_HLINE));
33267db96d56Sopenharmony_ci    SetDictInt("ACS_SBSB",          (ACS_VLINE));
33277db96d56Sopenharmony_ci    SetDictInt("ACS_SSSS",          (ACS_PLUS));
33287db96d56Sopenharmony_ci
33297db96d56Sopenharmony_ci    /* The following are never available with strict SYSV curses */
33307db96d56Sopenharmony_ci#ifdef ACS_S3
33317db96d56Sopenharmony_ci    SetDictInt("ACS_S3",            (ACS_S3));
33327db96d56Sopenharmony_ci#endif
33337db96d56Sopenharmony_ci#ifdef ACS_S7
33347db96d56Sopenharmony_ci    SetDictInt("ACS_S7",            (ACS_S7));
33357db96d56Sopenharmony_ci#endif
33367db96d56Sopenharmony_ci#ifdef ACS_LEQUAL
33377db96d56Sopenharmony_ci    SetDictInt("ACS_LEQUAL",        (ACS_LEQUAL));
33387db96d56Sopenharmony_ci#endif
33397db96d56Sopenharmony_ci#ifdef ACS_GEQUAL
33407db96d56Sopenharmony_ci    SetDictInt("ACS_GEQUAL",        (ACS_GEQUAL));
33417db96d56Sopenharmony_ci#endif
33427db96d56Sopenharmony_ci#ifdef ACS_PI
33437db96d56Sopenharmony_ci    SetDictInt("ACS_PI",            (ACS_PI));
33447db96d56Sopenharmony_ci#endif
33457db96d56Sopenharmony_ci#ifdef ACS_NEQUAL
33467db96d56Sopenharmony_ci    SetDictInt("ACS_NEQUAL",        (ACS_NEQUAL));
33477db96d56Sopenharmony_ci#endif
33487db96d56Sopenharmony_ci#ifdef ACS_STERLING
33497db96d56Sopenharmony_ci    SetDictInt("ACS_STERLING",      (ACS_STERLING));
33507db96d56Sopenharmony_ci#endif
33517db96d56Sopenharmony_ci
33527db96d56Sopenharmony_ci    SetDictInt("LINES", LINES);
33537db96d56Sopenharmony_ci    SetDictInt("COLS", COLS);
33547db96d56Sopenharmony_ci
33557db96d56Sopenharmony_ci    winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
33567db96d56Sopenharmony_ci    screen_encoding = winobj->encoding;
33577db96d56Sopenharmony_ci    return (PyObject *)winobj;
33587db96d56Sopenharmony_ci}
33597db96d56Sopenharmony_ci
33607db96d56Sopenharmony_ci/*[clinic input]
33617db96d56Sopenharmony_ci_curses.setupterm
33627db96d56Sopenharmony_ci
33637db96d56Sopenharmony_ci    term: str(accept={str, NoneType}) = None
33647db96d56Sopenharmony_ci        Terminal name.
33657db96d56Sopenharmony_ci        If omitted, the value of the TERM environment variable will be used.
33667db96d56Sopenharmony_ci    fd: int = -1
33677db96d56Sopenharmony_ci        File descriptor to which any initialization sequences will be sent.
33687db96d56Sopenharmony_ci        If not supplied, the file descriptor for sys.stdout will be used.
33697db96d56Sopenharmony_ci
33707db96d56Sopenharmony_ciInitialize the terminal.
33717db96d56Sopenharmony_ci[clinic start generated code]*/
33727db96d56Sopenharmony_ci
33737db96d56Sopenharmony_cistatic PyObject *
33747db96d56Sopenharmony_ci_curses_setupterm_impl(PyObject *module, const char *term, int fd)
33757db96d56Sopenharmony_ci/*[clinic end generated code: output=4584e587350f2848 input=4511472766af0c12]*/
33767db96d56Sopenharmony_ci{
33777db96d56Sopenharmony_ci    int err;
33787db96d56Sopenharmony_ci
33797db96d56Sopenharmony_ci    if (fd == -1) {
33807db96d56Sopenharmony_ci        PyObject* sys_stdout;
33817db96d56Sopenharmony_ci
33827db96d56Sopenharmony_ci        sys_stdout = PySys_GetObject("stdout");
33837db96d56Sopenharmony_ci
33847db96d56Sopenharmony_ci        if (sys_stdout == NULL || sys_stdout == Py_None) {
33857db96d56Sopenharmony_ci            PyErr_SetString(
33867db96d56Sopenharmony_ci                PyCursesError,
33877db96d56Sopenharmony_ci                "lost sys.stdout");
33887db96d56Sopenharmony_ci            return NULL;
33897db96d56Sopenharmony_ci        }
33907db96d56Sopenharmony_ci
33917db96d56Sopenharmony_ci        fd = PyObject_AsFileDescriptor(sys_stdout);
33927db96d56Sopenharmony_ci
33937db96d56Sopenharmony_ci        if (fd == -1) {
33947db96d56Sopenharmony_ci            return NULL;
33957db96d56Sopenharmony_ci        }
33967db96d56Sopenharmony_ci    }
33977db96d56Sopenharmony_ci
33987db96d56Sopenharmony_ci    if (!initialised_setupterm && setupterm((char *)term, fd, &err) == ERR) {
33997db96d56Sopenharmony_ci        const char* s = "setupterm: unknown error";
34007db96d56Sopenharmony_ci
34017db96d56Sopenharmony_ci        if (err == 0) {
34027db96d56Sopenharmony_ci            s = "setupterm: could not find terminal";
34037db96d56Sopenharmony_ci        } else if (err == -1) {
34047db96d56Sopenharmony_ci            s = "setupterm: could not find terminfo database";
34057db96d56Sopenharmony_ci        }
34067db96d56Sopenharmony_ci
34077db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError,s);
34087db96d56Sopenharmony_ci        return NULL;
34097db96d56Sopenharmony_ci    }
34107db96d56Sopenharmony_ci
34117db96d56Sopenharmony_ci    initialised_setupterm = TRUE;
34127db96d56Sopenharmony_ci
34137db96d56Sopenharmony_ci    Py_RETURN_NONE;
34147db96d56Sopenharmony_ci}
34157db96d56Sopenharmony_ci
34167db96d56Sopenharmony_ci#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102
34177db96d56Sopenharmony_ci// https://invisible-island.net/ncurses/NEWS.html#index-t20080119
34187db96d56Sopenharmony_ci
34197db96d56Sopenharmony_ci/*[clinic input]
34207db96d56Sopenharmony_ci_curses.get_escdelay
34217db96d56Sopenharmony_ci
34227db96d56Sopenharmony_ciGets the curses ESCDELAY setting.
34237db96d56Sopenharmony_ci
34247db96d56Sopenharmony_ciGets the number of milliseconds to wait after reading an escape character,
34257db96d56Sopenharmony_cito distinguish between an individual escape character entered on the
34267db96d56Sopenharmony_cikeyboard from escape sequences sent by cursor and function keys.
34277db96d56Sopenharmony_ci[clinic start generated code]*/
34287db96d56Sopenharmony_ci
34297db96d56Sopenharmony_cistatic PyObject *
34307db96d56Sopenharmony_ci_curses_get_escdelay_impl(PyObject *module)
34317db96d56Sopenharmony_ci/*[clinic end generated code: output=222fa1a822555d60 input=be2d5b3dd974d0a4]*/
34327db96d56Sopenharmony_ci{
34337db96d56Sopenharmony_ci    return PyLong_FromLong(ESCDELAY);
34347db96d56Sopenharmony_ci}
34357db96d56Sopenharmony_ci/*[clinic input]
34367db96d56Sopenharmony_ci_curses.set_escdelay
34377db96d56Sopenharmony_ci    ms: int
34387db96d56Sopenharmony_ci        length of the delay in milliseconds.
34397db96d56Sopenharmony_ci    /
34407db96d56Sopenharmony_ci
34417db96d56Sopenharmony_ciSets the curses ESCDELAY setting.
34427db96d56Sopenharmony_ci
34437db96d56Sopenharmony_ciSets the number of milliseconds to wait after reading an escape character,
34447db96d56Sopenharmony_cito distinguish between an individual escape character entered on the
34457db96d56Sopenharmony_cikeyboard from escape sequences sent by cursor and function keys.
34467db96d56Sopenharmony_ci[clinic start generated code]*/
34477db96d56Sopenharmony_ci
34487db96d56Sopenharmony_cistatic PyObject *
34497db96d56Sopenharmony_ci_curses_set_escdelay_impl(PyObject *module, int ms)
34507db96d56Sopenharmony_ci/*[clinic end generated code: output=43818efbf7980ac4 input=7796fe19f111e250]*/
34517db96d56Sopenharmony_ci{
34527db96d56Sopenharmony_ci    if (ms <= 0) {
34537db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "ms must be > 0");
34547db96d56Sopenharmony_ci        return NULL;
34557db96d56Sopenharmony_ci    }
34567db96d56Sopenharmony_ci
34577db96d56Sopenharmony_ci    return PyCursesCheckERR(set_escdelay(ms), "set_escdelay");
34587db96d56Sopenharmony_ci}
34597db96d56Sopenharmony_ci
34607db96d56Sopenharmony_ci/*[clinic input]
34617db96d56Sopenharmony_ci_curses.get_tabsize
34627db96d56Sopenharmony_ci
34637db96d56Sopenharmony_ciGets the curses TABSIZE setting.
34647db96d56Sopenharmony_ci
34657db96d56Sopenharmony_ciGets the number of columns used by the curses library when converting a tab
34667db96d56Sopenharmony_cicharacter to spaces as it adds the tab to a window.
34677db96d56Sopenharmony_ci[clinic start generated code]*/
34687db96d56Sopenharmony_ci
34697db96d56Sopenharmony_cistatic PyObject *
34707db96d56Sopenharmony_ci_curses_get_tabsize_impl(PyObject *module)
34717db96d56Sopenharmony_ci/*[clinic end generated code: output=7e9e51fb6126fbdf input=74af86bf6c9f5d7e]*/
34727db96d56Sopenharmony_ci{
34737db96d56Sopenharmony_ci    return PyLong_FromLong(TABSIZE);
34747db96d56Sopenharmony_ci}
34757db96d56Sopenharmony_ci/*[clinic input]
34767db96d56Sopenharmony_ci_curses.set_tabsize
34777db96d56Sopenharmony_ci    size: int
34787db96d56Sopenharmony_ci        rendered cell width of a tab character.
34797db96d56Sopenharmony_ci    /
34807db96d56Sopenharmony_ci
34817db96d56Sopenharmony_ciSets the curses TABSIZE setting.
34827db96d56Sopenharmony_ci
34837db96d56Sopenharmony_ciSets the number of columns used by the curses library when converting a tab
34847db96d56Sopenharmony_cicharacter to spaces as it adds the tab to a window.
34857db96d56Sopenharmony_ci[clinic start generated code]*/
34867db96d56Sopenharmony_ci
34877db96d56Sopenharmony_cistatic PyObject *
34887db96d56Sopenharmony_ci_curses_set_tabsize_impl(PyObject *module, int size)
34897db96d56Sopenharmony_ci/*[clinic end generated code: output=c1de5a76c0daab1e input=78cba6a3021ad061]*/
34907db96d56Sopenharmony_ci{
34917db96d56Sopenharmony_ci    if (size <= 0) {
34927db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "size must be > 0");
34937db96d56Sopenharmony_ci        return NULL;
34947db96d56Sopenharmony_ci    }
34957db96d56Sopenharmony_ci
34967db96d56Sopenharmony_ci    return PyCursesCheckERR(set_tabsize(size), "set_tabsize");
34977db96d56Sopenharmony_ci}
34987db96d56Sopenharmony_ci#endif
34997db96d56Sopenharmony_ci
35007db96d56Sopenharmony_ci/*[clinic input]
35017db96d56Sopenharmony_ci_curses.intrflush
35027db96d56Sopenharmony_ci
35037db96d56Sopenharmony_ci    flag: bool(accept={int})
35047db96d56Sopenharmony_ci    /
35057db96d56Sopenharmony_ci
35067db96d56Sopenharmony_ci[clinic start generated code]*/
35077db96d56Sopenharmony_ci
35087db96d56Sopenharmony_cistatic PyObject *
35097db96d56Sopenharmony_ci_curses_intrflush_impl(PyObject *module, int flag)
35107db96d56Sopenharmony_ci/*[clinic end generated code: output=c1986df35e999a0f input=fcba57bb28dfd795]*/
35117db96d56Sopenharmony_ci{
35127db96d56Sopenharmony_ci    PyCursesInitialised;
35137db96d56Sopenharmony_ci
35147db96d56Sopenharmony_ci    return PyCursesCheckERR(intrflush(NULL, flag), "intrflush");
35157db96d56Sopenharmony_ci}
35167db96d56Sopenharmony_ci
35177db96d56Sopenharmony_ci/*[clinic input]
35187db96d56Sopenharmony_ci_curses.isendwin
35197db96d56Sopenharmony_ci
35207db96d56Sopenharmony_ciReturn True if endwin() has been called.
35217db96d56Sopenharmony_ci[clinic start generated code]*/
35227db96d56Sopenharmony_ci
35237db96d56Sopenharmony_cistatic PyObject *
35247db96d56Sopenharmony_ci_curses_isendwin_impl(PyObject *module)
35257db96d56Sopenharmony_ci/*[clinic end generated code: output=d73179e4a7e1eb8c input=6cdb01a7ebf71397]*/
35267db96d56Sopenharmony_ciNoArgTrueFalseFunctionBody(isendwin)
35277db96d56Sopenharmony_ci
35287db96d56Sopenharmony_ci#ifdef HAVE_CURSES_IS_TERM_RESIZED
35297db96d56Sopenharmony_ci/*[clinic input]
35307db96d56Sopenharmony_ci_curses.is_term_resized
35317db96d56Sopenharmony_ci
35327db96d56Sopenharmony_ci    nlines: int
35337db96d56Sopenharmony_ci        Height.
35347db96d56Sopenharmony_ci    ncols: int
35357db96d56Sopenharmony_ci        Width.
35367db96d56Sopenharmony_ci    /
35377db96d56Sopenharmony_ci
35387db96d56Sopenharmony_ciReturn True if resize_term() would modify the window structure, False otherwise.
35397db96d56Sopenharmony_ci[clinic start generated code]*/
35407db96d56Sopenharmony_ci
35417db96d56Sopenharmony_cistatic PyObject *
35427db96d56Sopenharmony_ci_curses_is_term_resized_impl(PyObject *module, int nlines, int ncols)
35437db96d56Sopenharmony_ci/*[clinic end generated code: output=aafe04afe50f1288 input=ca9c0bd0fb8ab444]*/
35447db96d56Sopenharmony_ci{
35457db96d56Sopenharmony_ci    PyCursesInitialised;
35467db96d56Sopenharmony_ci
35477db96d56Sopenharmony_ci    return PyBool_FromLong(is_term_resized(nlines, ncols));
35487db96d56Sopenharmony_ci}
35497db96d56Sopenharmony_ci#endif /* HAVE_CURSES_IS_TERM_RESIZED */
35507db96d56Sopenharmony_ci
35517db96d56Sopenharmony_ci/*[clinic input]
35527db96d56Sopenharmony_ci_curses.keyname
35537db96d56Sopenharmony_ci
35547db96d56Sopenharmony_ci    key: int
35557db96d56Sopenharmony_ci        Key number.
35567db96d56Sopenharmony_ci    /
35577db96d56Sopenharmony_ci
35587db96d56Sopenharmony_ciReturn the name of specified key.
35597db96d56Sopenharmony_ci[clinic start generated code]*/
35607db96d56Sopenharmony_ci
35617db96d56Sopenharmony_cistatic PyObject *
35627db96d56Sopenharmony_ci_curses_keyname_impl(PyObject *module, int key)
35637db96d56Sopenharmony_ci/*[clinic end generated code: output=fa2675ab3f4e056b input=ee4b1d0f243a2a2b]*/
35647db96d56Sopenharmony_ci{
35657db96d56Sopenharmony_ci    const char *knp;
35667db96d56Sopenharmony_ci
35677db96d56Sopenharmony_ci    PyCursesInitialised;
35687db96d56Sopenharmony_ci
35697db96d56Sopenharmony_ci    if (key < 0) {
35707db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "invalid key number");
35717db96d56Sopenharmony_ci        return NULL;
35727db96d56Sopenharmony_ci    }
35737db96d56Sopenharmony_ci    knp = keyname(key);
35747db96d56Sopenharmony_ci
35757db96d56Sopenharmony_ci    return PyBytes_FromString((knp == NULL) ? "" : knp);
35767db96d56Sopenharmony_ci}
35777db96d56Sopenharmony_ci
35787db96d56Sopenharmony_ci/*[clinic input]
35797db96d56Sopenharmony_ci_curses.killchar
35807db96d56Sopenharmony_ci
35817db96d56Sopenharmony_ciReturn the user's current line kill character.
35827db96d56Sopenharmony_ci[clinic start generated code]*/
35837db96d56Sopenharmony_ci
35847db96d56Sopenharmony_cistatic PyObject *
35857db96d56Sopenharmony_ci_curses_killchar_impl(PyObject *module)
35867db96d56Sopenharmony_ci/*[clinic end generated code: output=31c3a45b2c528269 input=1ff171c38df5ccad]*/
35877db96d56Sopenharmony_ci{
35887db96d56Sopenharmony_ci    char ch;
35897db96d56Sopenharmony_ci
35907db96d56Sopenharmony_ci    ch = killchar();
35917db96d56Sopenharmony_ci
35927db96d56Sopenharmony_ci    return PyBytes_FromStringAndSize(&ch, 1);
35937db96d56Sopenharmony_ci}
35947db96d56Sopenharmony_ci
35957db96d56Sopenharmony_ci/*[clinic input]
35967db96d56Sopenharmony_ci_curses.longname
35977db96d56Sopenharmony_ci
35987db96d56Sopenharmony_ciReturn the terminfo long name field describing the current terminal.
35997db96d56Sopenharmony_ci
36007db96d56Sopenharmony_ciThe maximum length of a verbose description is 128 characters.  It is defined
36017db96d56Sopenharmony_cionly after the call to initscr().
36027db96d56Sopenharmony_ci[clinic start generated code]*/
36037db96d56Sopenharmony_ci
36047db96d56Sopenharmony_cistatic PyObject *
36057db96d56Sopenharmony_ci_curses_longname_impl(PyObject *module)
36067db96d56Sopenharmony_ci/*[clinic end generated code: output=fdf30433727ef568 input=84c3f20201b1098e]*/
36077db96d56Sopenharmony_ciNoArgReturnStringFunctionBody(longname)
36087db96d56Sopenharmony_ci
36097db96d56Sopenharmony_ci/*[clinic input]
36107db96d56Sopenharmony_ci_curses.meta
36117db96d56Sopenharmony_ci
36127db96d56Sopenharmony_ci    yes: bool(accept={int})
36137db96d56Sopenharmony_ci    /
36147db96d56Sopenharmony_ci
36157db96d56Sopenharmony_ciEnable/disable meta keys.
36167db96d56Sopenharmony_ci
36177db96d56Sopenharmony_ciIf yes is True, allow 8-bit characters to be input.  If yes is False,
36187db96d56Sopenharmony_ciallow only 7-bit characters.
36197db96d56Sopenharmony_ci[clinic start generated code]*/
36207db96d56Sopenharmony_ci
36217db96d56Sopenharmony_cistatic PyObject *
36227db96d56Sopenharmony_ci_curses_meta_impl(PyObject *module, int yes)
36237db96d56Sopenharmony_ci/*[clinic end generated code: output=22f5abda46a605d8 input=af9892e3a74f35db]*/
36247db96d56Sopenharmony_ci{
36257db96d56Sopenharmony_ci    PyCursesInitialised;
36267db96d56Sopenharmony_ci
36277db96d56Sopenharmony_ci    return PyCursesCheckERR(meta(stdscr, yes), "meta");
36287db96d56Sopenharmony_ci}
36297db96d56Sopenharmony_ci
36307db96d56Sopenharmony_ci#ifdef NCURSES_MOUSE_VERSION
36317db96d56Sopenharmony_ci/*[clinic input]
36327db96d56Sopenharmony_ci_curses.mouseinterval
36337db96d56Sopenharmony_ci
36347db96d56Sopenharmony_ci    interval: int
36357db96d56Sopenharmony_ci        Time in milliseconds.
36367db96d56Sopenharmony_ci    /
36377db96d56Sopenharmony_ci
36387db96d56Sopenharmony_ciSet and retrieve the maximum time between press and release in a click.
36397db96d56Sopenharmony_ci
36407db96d56Sopenharmony_ciSet the maximum time that can elapse between press and release events in
36417db96d56Sopenharmony_ciorder for them to be recognized as a click, and return the previous interval
36427db96d56Sopenharmony_civalue.
36437db96d56Sopenharmony_ci[clinic start generated code]*/
36447db96d56Sopenharmony_ci
36457db96d56Sopenharmony_cistatic PyObject *
36467db96d56Sopenharmony_ci_curses_mouseinterval_impl(PyObject *module, int interval)
36477db96d56Sopenharmony_ci/*[clinic end generated code: output=c4f5ff04354634c5 input=75aaa3f0db10ac4e]*/
36487db96d56Sopenharmony_ci{
36497db96d56Sopenharmony_ci    PyCursesInitialised;
36507db96d56Sopenharmony_ci
36517db96d56Sopenharmony_ci    return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
36527db96d56Sopenharmony_ci}
36537db96d56Sopenharmony_ci
36547db96d56Sopenharmony_ci/*[clinic input]
36557db96d56Sopenharmony_ci_curses.mousemask
36567db96d56Sopenharmony_ci
36577db96d56Sopenharmony_ci    newmask: unsigned_long(bitwise=True)
36587db96d56Sopenharmony_ci    /
36597db96d56Sopenharmony_ci
36607db96d56Sopenharmony_ciSet the mouse events to be reported, and return a tuple (availmask, oldmask).
36617db96d56Sopenharmony_ci
36627db96d56Sopenharmony_ciReturn a tuple (availmask, oldmask).  availmask indicates which of the
36637db96d56Sopenharmony_cispecified mouse events can be reported; on complete failure it returns 0.
36647db96d56Sopenharmony_cioldmask is the previous value of the given window's mouse event mask.
36657db96d56Sopenharmony_ciIf this function is never called, no mouse events are ever reported.
36667db96d56Sopenharmony_ci[clinic start generated code]*/
36677db96d56Sopenharmony_ci
36687db96d56Sopenharmony_cistatic PyObject *
36697db96d56Sopenharmony_ci_curses_mousemask_impl(PyObject *module, unsigned long newmask)
36707db96d56Sopenharmony_ci/*[clinic end generated code: output=9406cf1b8a36e485 input=bdf76b7568a3c541]*/
36717db96d56Sopenharmony_ci{
36727db96d56Sopenharmony_ci    mmask_t oldmask, availmask;
36737db96d56Sopenharmony_ci
36747db96d56Sopenharmony_ci    PyCursesInitialised;
36757db96d56Sopenharmony_ci    availmask = mousemask((mmask_t)newmask, &oldmask);
36767db96d56Sopenharmony_ci    return Py_BuildValue("(kk)",
36777db96d56Sopenharmony_ci                         (unsigned long)availmask, (unsigned long)oldmask);
36787db96d56Sopenharmony_ci}
36797db96d56Sopenharmony_ci#endif
36807db96d56Sopenharmony_ci
36817db96d56Sopenharmony_ci/*[clinic input]
36827db96d56Sopenharmony_ci_curses.napms
36837db96d56Sopenharmony_ci
36847db96d56Sopenharmony_ci    ms: int
36857db96d56Sopenharmony_ci        Duration in milliseconds.
36867db96d56Sopenharmony_ci    /
36877db96d56Sopenharmony_ci
36887db96d56Sopenharmony_ciSleep for specified time.
36897db96d56Sopenharmony_ci[clinic start generated code]*/
36907db96d56Sopenharmony_ci
36917db96d56Sopenharmony_cistatic PyObject *
36927db96d56Sopenharmony_ci_curses_napms_impl(PyObject *module, int ms)
36937db96d56Sopenharmony_ci/*[clinic end generated code: output=a40a1da2e39ea438 input=20cd3af2b6900f56]*/
36947db96d56Sopenharmony_ci{
36957db96d56Sopenharmony_ci    PyCursesInitialised;
36967db96d56Sopenharmony_ci
36977db96d56Sopenharmony_ci    return Py_BuildValue("i", napms(ms));
36987db96d56Sopenharmony_ci}
36997db96d56Sopenharmony_ci
37007db96d56Sopenharmony_ci
37017db96d56Sopenharmony_ci/*[clinic input]
37027db96d56Sopenharmony_ci_curses.newpad
37037db96d56Sopenharmony_ci
37047db96d56Sopenharmony_ci    nlines: int
37057db96d56Sopenharmony_ci        Height.
37067db96d56Sopenharmony_ci    ncols: int
37077db96d56Sopenharmony_ci        Width.
37087db96d56Sopenharmony_ci    /
37097db96d56Sopenharmony_ci
37107db96d56Sopenharmony_ciCreate and return a pointer to a new pad data structure.
37117db96d56Sopenharmony_ci[clinic start generated code]*/
37127db96d56Sopenharmony_ci
37137db96d56Sopenharmony_cistatic PyObject *
37147db96d56Sopenharmony_ci_curses_newpad_impl(PyObject *module, int nlines, int ncols)
37157db96d56Sopenharmony_ci/*[clinic end generated code: output=de52a56eb1098ec9 input=93f1272f240d8894]*/
37167db96d56Sopenharmony_ci{
37177db96d56Sopenharmony_ci    WINDOW *win;
37187db96d56Sopenharmony_ci
37197db96d56Sopenharmony_ci    PyCursesInitialised;
37207db96d56Sopenharmony_ci
37217db96d56Sopenharmony_ci    win = newpad(nlines, ncols);
37227db96d56Sopenharmony_ci
37237db96d56Sopenharmony_ci    if (win == NULL) {
37247db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, catchall_NULL);
37257db96d56Sopenharmony_ci        return NULL;
37267db96d56Sopenharmony_ci    }
37277db96d56Sopenharmony_ci
37287db96d56Sopenharmony_ci    return (PyObject *)PyCursesWindow_New(win, NULL);
37297db96d56Sopenharmony_ci}
37307db96d56Sopenharmony_ci
37317db96d56Sopenharmony_ci/*[clinic input]
37327db96d56Sopenharmony_ci_curses.newwin
37337db96d56Sopenharmony_ci
37347db96d56Sopenharmony_ci    nlines: int
37357db96d56Sopenharmony_ci        Height.
37367db96d56Sopenharmony_ci    ncols: int
37377db96d56Sopenharmony_ci        Width.
37387db96d56Sopenharmony_ci    [
37397db96d56Sopenharmony_ci    begin_y: int = 0
37407db96d56Sopenharmony_ci        Top side y-coordinate.
37417db96d56Sopenharmony_ci    begin_x: int = 0
37427db96d56Sopenharmony_ci        Left side x-coordinate.
37437db96d56Sopenharmony_ci    ]
37447db96d56Sopenharmony_ci    /
37457db96d56Sopenharmony_ci
37467db96d56Sopenharmony_ciReturn a new window.
37477db96d56Sopenharmony_ci
37487db96d56Sopenharmony_ciBy default, the window will extend from the specified position to the lower
37497db96d56Sopenharmony_ciright corner of the screen.
37507db96d56Sopenharmony_ci[clinic start generated code]*/
37517db96d56Sopenharmony_ci
37527db96d56Sopenharmony_cistatic PyObject *
37537db96d56Sopenharmony_ci_curses_newwin_impl(PyObject *module, int nlines, int ncols,
37547db96d56Sopenharmony_ci                    int group_right_1, int begin_y, int begin_x)
37557db96d56Sopenharmony_ci/*[clinic end generated code: output=c1e0a8dc8ac2826c input=29312c15a72a003d]*/
37567db96d56Sopenharmony_ci{
37577db96d56Sopenharmony_ci    WINDOW *win;
37587db96d56Sopenharmony_ci
37597db96d56Sopenharmony_ci    PyCursesInitialised;
37607db96d56Sopenharmony_ci
37617db96d56Sopenharmony_ci    win = newwin(nlines,ncols,begin_y,begin_x);
37627db96d56Sopenharmony_ci    if (win == NULL) {
37637db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, catchall_NULL);
37647db96d56Sopenharmony_ci        return NULL;
37657db96d56Sopenharmony_ci    }
37667db96d56Sopenharmony_ci
37677db96d56Sopenharmony_ci    return (PyObject *)PyCursesWindow_New(win, NULL);
37687db96d56Sopenharmony_ci}
37697db96d56Sopenharmony_ci
37707db96d56Sopenharmony_ci/*[clinic input]
37717db96d56Sopenharmony_ci_curses.nl
37727db96d56Sopenharmony_ci
37737db96d56Sopenharmony_ci    flag: bool(accept={int}) = True
37747db96d56Sopenharmony_ci        If false, the effect is the same as calling nonl().
37757db96d56Sopenharmony_ci    /
37767db96d56Sopenharmony_ci
37777db96d56Sopenharmony_ciEnter newline mode.
37787db96d56Sopenharmony_ci
37797db96d56Sopenharmony_ciThis mode translates the return key into newline on input, and translates
37807db96d56Sopenharmony_cinewline into return and line-feed on output.  Newline mode is initially on.
37817db96d56Sopenharmony_ci[clinic start generated code]*/
37827db96d56Sopenharmony_ci
37837db96d56Sopenharmony_cistatic PyObject *
37847db96d56Sopenharmony_ci_curses_nl_impl(PyObject *module, int flag)
37857db96d56Sopenharmony_ci/*[clinic end generated code: output=b39cc0ffc9015003 input=cf36a63f7b86e28a]*/
37867db96d56Sopenharmony_ciNoArgOrFlagNoReturnFunctionBody(nl, flag)
37877db96d56Sopenharmony_ci
37887db96d56Sopenharmony_ci/*[clinic input]
37897db96d56Sopenharmony_ci_curses.nocbreak
37907db96d56Sopenharmony_ci
37917db96d56Sopenharmony_ciLeave cbreak mode.
37927db96d56Sopenharmony_ci
37937db96d56Sopenharmony_ciReturn to normal "cooked" mode with line buffering.
37947db96d56Sopenharmony_ci[clinic start generated code]*/
37957db96d56Sopenharmony_ci
37967db96d56Sopenharmony_cistatic PyObject *
37977db96d56Sopenharmony_ci_curses_nocbreak_impl(PyObject *module)
37987db96d56Sopenharmony_ci/*[clinic end generated code: output=eabf3833a4fbf620 input=e4b65f7d734af400]*/
37997db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(nocbreak)
38007db96d56Sopenharmony_ci
38017db96d56Sopenharmony_ci/*[clinic input]
38027db96d56Sopenharmony_ci_curses.noecho
38037db96d56Sopenharmony_ci
38047db96d56Sopenharmony_ciLeave echo mode.
38057db96d56Sopenharmony_ci
38067db96d56Sopenharmony_ciEchoing of input characters is turned off.
38077db96d56Sopenharmony_ci[clinic start generated code]*/
38087db96d56Sopenharmony_ci
38097db96d56Sopenharmony_cistatic PyObject *
38107db96d56Sopenharmony_ci_curses_noecho_impl(PyObject *module)
38117db96d56Sopenharmony_ci/*[clinic end generated code: output=cc95ab45bc98f41b input=76714df529e614c3]*/
38127db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(noecho)
38137db96d56Sopenharmony_ci
38147db96d56Sopenharmony_ci/*[clinic input]
38157db96d56Sopenharmony_ci_curses.nonl
38167db96d56Sopenharmony_ci
38177db96d56Sopenharmony_ciLeave newline mode.
38187db96d56Sopenharmony_ci
38197db96d56Sopenharmony_ciDisable translation of return into newline on input, and disable low-level
38207db96d56Sopenharmony_citranslation of newline into newline/return on output.
38217db96d56Sopenharmony_ci[clinic start generated code]*/
38227db96d56Sopenharmony_ci
38237db96d56Sopenharmony_cistatic PyObject *
38247db96d56Sopenharmony_ci_curses_nonl_impl(PyObject *module)
38257db96d56Sopenharmony_ci/*[clinic end generated code: output=99e917e9715770c6 input=9d37dd122d3022fc]*/
38267db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(nonl)
38277db96d56Sopenharmony_ci
38287db96d56Sopenharmony_ci/*[clinic input]
38297db96d56Sopenharmony_ci_curses.noqiflush
38307db96d56Sopenharmony_ci
38317db96d56Sopenharmony_ciDisable queue flushing.
38327db96d56Sopenharmony_ci
38337db96d56Sopenharmony_ciWhen queue flushing is disabled, normal flush of input and output queues
38347db96d56Sopenharmony_ciassociated with the INTR, QUIT and SUSP characters will not be done.
38357db96d56Sopenharmony_ci[clinic start generated code]*/
38367db96d56Sopenharmony_ci
38377db96d56Sopenharmony_cistatic PyObject *
38387db96d56Sopenharmony_ci_curses_noqiflush_impl(PyObject *module)
38397db96d56Sopenharmony_ci/*[clinic end generated code: output=8b95a4229bbf0877 input=ba3e6b2e3e54c4df]*/
38407db96d56Sopenharmony_ciNoArgNoReturnVoidFunctionBody(noqiflush)
38417db96d56Sopenharmony_ci
38427db96d56Sopenharmony_ci/*[clinic input]
38437db96d56Sopenharmony_ci_curses.noraw
38447db96d56Sopenharmony_ci
38457db96d56Sopenharmony_ciLeave raw mode.
38467db96d56Sopenharmony_ci
38477db96d56Sopenharmony_ciReturn to normal "cooked" mode with line buffering.
38487db96d56Sopenharmony_ci[clinic start generated code]*/
38497db96d56Sopenharmony_ci
38507db96d56Sopenharmony_cistatic PyObject *
38517db96d56Sopenharmony_ci_curses_noraw_impl(PyObject *module)
38527db96d56Sopenharmony_ci/*[clinic end generated code: output=39894e5524c430cc input=6ec86692096dffb5]*/
38537db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(noraw)
38547db96d56Sopenharmony_ci
38557db96d56Sopenharmony_ci/*[clinic input]
38567db96d56Sopenharmony_ci_curses.pair_content
38577db96d56Sopenharmony_ci
38587db96d56Sopenharmony_ci    pair_number: pair
38597db96d56Sopenharmony_ci        The number of the color pair (0 - (COLOR_PAIRS-1)).
38607db96d56Sopenharmony_ci    /
38617db96d56Sopenharmony_ci
38627db96d56Sopenharmony_ciReturn a tuple (fg, bg) containing the colors for the requested color pair.
38637db96d56Sopenharmony_ci[clinic start generated code]*/
38647db96d56Sopenharmony_ci
38657db96d56Sopenharmony_cistatic PyObject *
38667db96d56Sopenharmony_ci_curses_pair_content_impl(PyObject *module, int pair_number)
38677db96d56Sopenharmony_ci/*[clinic end generated code: output=4a726dd0e6885f3f input=03970f840fc7b739]*/
38687db96d56Sopenharmony_ci{
38697db96d56Sopenharmony_ci    _CURSES_COLOR_NUM_TYPE f, b;
38707db96d56Sopenharmony_ci
38717db96d56Sopenharmony_ci    PyCursesInitialised;
38727db96d56Sopenharmony_ci    PyCursesInitialisedColor;
38737db96d56Sopenharmony_ci
38747db96d56Sopenharmony_ci    if (_CURSES_PAIR_CONTENT_FUNC(pair_number, &f, &b) == ERR) {
38757db96d56Sopenharmony_ci        if (pair_number >= COLOR_PAIRS) {
38767db96d56Sopenharmony_ci            PyErr_Format(PyExc_ValueError,
38777db96d56Sopenharmony_ci                         "Color pair is greater than COLOR_PAIRS-1 (%d).",
38787db96d56Sopenharmony_ci                         COLOR_PAIRS - 1);
38797db96d56Sopenharmony_ci        }
38807db96d56Sopenharmony_ci        else {
38817db96d56Sopenharmony_ci            PyErr_Format(PyCursesError, "%s() returned ERR",
38827db96d56Sopenharmony_ci                         Py_STRINGIFY(_CURSES_PAIR_CONTENT_FUNC));
38837db96d56Sopenharmony_ci        }
38847db96d56Sopenharmony_ci        return NULL;
38857db96d56Sopenharmony_ci    }
38867db96d56Sopenharmony_ci
38877db96d56Sopenharmony_ci    return Py_BuildValue("(ii)", f, b);
38887db96d56Sopenharmony_ci}
38897db96d56Sopenharmony_ci
38907db96d56Sopenharmony_ci/*[clinic input]
38917db96d56Sopenharmony_ci_curses.pair_number
38927db96d56Sopenharmony_ci
38937db96d56Sopenharmony_ci    attr: int
38947db96d56Sopenharmony_ci    /
38957db96d56Sopenharmony_ci
38967db96d56Sopenharmony_ciReturn the number of the color-pair set by the specified attribute value.
38977db96d56Sopenharmony_ci
38987db96d56Sopenharmony_cicolor_pair() is the counterpart to this function.
38997db96d56Sopenharmony_ci[clinic start generated code]*/
39007db96d56Sopenharmony_ci
39017db96d56Sopenharmony_cistatic PyObject *
39027db96d56Sopenharmony_ci_curses_pair_number_impl(PyObject *module, int attr)
39037db96d56Sopenharmony_ci/*[clinic end generated code: output=85bce7d65c0aa3f4 input=d478548e33f5e61a]*/
39047db96d56Sopenharmony_ci{
39057db96d56Sopenharmony_ci    PyCursesInitialised;
39067db96d56Sopenharmony_ci    PyCursesInitialisedColor;
39077db96d56Sopenharmony_ci
39087db96d56Sopenharmony_ci    return PyLong_FromLong(PAIR_NUMBER(attr));
39097db96d56Sopenharmony_ci}
39107db96d56Sopenharmony_ci
39117db96d56Sopenharmony_ci/*[clinic input]
39127db96d56Sopenharmony_ci_curses.putp
39137db96d56Sopenharmony_ci
39147db96d56Sopenharmony_ci    string: str(accept={robuffer})
39157db96d56Sopenharmony_ci    /
39167db96d56Sopenharmony_ci
39177db96d56Sopenharmony_ciEmit the value of a specified terminfo capability for the current terminal.
39187db96d56Sopenharmony_ci
39197db96d56Sopenharmony_ciNote that the output of putp() always goes to standard output.
39207db96d56Sopenharmony_ci[clinic start generated code]*/
39217db96d56Sopenharmony_ci
39227db96d56Sopenharmony_cistatic PyObject *
39237db96d56Sopenharmony_ci_curses_putp_impl(PyObject *module, const char *string)
39247db96d56Sopenharmony_ci/*[clinic end generated code: output=e98081d1b8eb5816 input=1601faa828b44cb3]*/
39257db96d56Sopenharmony_ci{
39267db96d56Sopenharmony_ci    return PyCursesCheckERR(putp(string), "putp");
39277db96d56Sopenharmony_ci}
39287db96d56Sopenharmony_ci
39297db96d56Sopenharmony_ci/*[clinic input]
39307db96d56Sopenharmony_ci_curses.qiflush
39317db96d56Sopenharmony_ci
39327db96d56Sopenharmony_ci    flag: bool(accept={int}) = True
39337db96d56Sopenharmony_ci        If false, the effect is the same as calling noqiflush().
39347db96d56Sopenharmony_ci    /
39357db96d56Sopenharmony_ci
39367db96d56Sopenharmony_ciEnable queue flushing.
39377db96d56Sopenharmony_ci
39387db96d56Sopenharmony_ciIf queue flushing is enabled, all output in the display driver queue
39397db96d56Sopenharmony_ciwill be flushed when the INTR, QUIT and SUSP characters are read.
39407db96d56Sopenharmony_ci[clinic start generated code]*/
39417db96d56Sopenharmony_ci
39427db96d56Sopenharmony_cistatic PyObject *
39437db96d56Sopenharmony_ci_curses_qiflush_impl(PyObject *module, int flag)
39447db96d56Sopenharmony_ci/*[clinic end generated code: output=9167e862f760ea30 input=e9e4a389946a0dbc]*/
39457db96d56Sopenharmony_ci{
39467db96d56Sopenharmony_ci    PyCursesInitialised;
39477db96d56Sopenharmony_ci
39487db96d56Sopenharmony_ci    if (flag) {
39497db96d56Sopenharmony_ci        qiflush();
39507db96d56Sopenharmony_ci    }
39517db96d56Sopenharmony_ci    else {
39527db96d56Sopenharmony_ci        noqiflush();
39537db96d56Sopenharmony_ci    }
39547db96d56Sopenharmony_ci    Py_RETURN_NONE;
39557db96d56Sopenharmony_ci}
39567db96d56Sopenharmony_ci
39577db96d56Sopenharmony_ci/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
39587db96d56Sopenharmony_ci * and _curses.COLS */
39597db96d56Sopenharmony_ci#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
39607db96d56Sopenharmony_cistatic int
39617db96d56Sopenharmony_ciupdate_lines_cols(void)
39627db96d56Sopenharmony_ci{
39637db96d56Sopenharmony_ci    PyObject *o;
39647db96d56Sopenharmony_ci    PyObject *m = PyImport_ImportModule("curses");
39657db96d56Sopenharmony_ci    _Py_IDENTIFIER(LINES);
39667db96d56Sopenharmony_ci    _Py_IDENTIFIER(COLS);
39677db96d56Sopenharmony_ci
39687db96d56Sopenharmony_ci    if (!m)
39697db96d56Sopenharmony_ci        return 0;
39707db96d56Sopenharmony_ci
39717db96d56Sopenharmony_ci    o = PyLong_FromLong(LINES);
39727db96d56Sopenharmony_ci    if (!o) {
39737db96d56Sopenharmony_ci        Py_DECREF(m);
39747db96d56Sopenharmony_ci        return 0;
39757db96d56Sopenharmony_ci    }
39767db96d56Sopenharmony_ci    if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
39777db96d56Sopenharmony_ci        Py_DECREF(m);
39787db96d56Sopenharmony_ci        Py_DECREF(o);
39797db96d56Sopenharmony_ci        return 0;
39807db96d56Sopenharmony_ci    }
39817db96d56Sopenharmony_ci    /* PyId_LINES.object will be initialized here. */
39827db96d56Sopenharmony_ci    if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_LINES), o)) {
39837db96d56Sopenharmony_ci        Py_DECREF(m);
39847db96d56Sopenharmony_ci        Py_DECREF(o);
39857db96d56Sopenharmony_ci        return 0;
39867db96d56Sopenharmony_ci    }
39877db96d56Sopenharmony_ci    Py_DECREF(o);
39887db96d56Sopenharmony_ci    o = PyLong_FromLong(COLS);
39897db96d56Sopenharmony_ci    if (!o) {
39907db96d56Sopenharmony_ci        Py_DECREF(m);
39917db96d56Sopenharmony_ci        return 0;
39927db96d56Sopenharmony_ci    }
39937db96d56Sopenharmony_ci    if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
39947db96d56Sopenharmony_ci        Py_DECREF(m);
39957db96d56Sopenharmony_ci        Py_DECREF(o);
39967db96d56Sopenharmony_ci        return 0;
39977db96d56Sopenharmony_ci    }
39987db96d56Sopenharmony_ci    if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_COLS), o)) {
39997db96d56Sopenharmony_ci        Py_DECREF(m);
40007db96d56Sopenharmony_ci        Py_DECREF(o);
40017db96d56Sopenharmony_ci        return 0;
40027db96d56Sopenharmony_ci    }
40037db96d56Sopenharmony_ci    Py_DECREF(o);
40047db96d56Sopenharmony_ci    Py_DECREF(m);
40057db96d56Sopenharmony_ci    return 1;
40067db96d56Sopenharmony_ci}
40077db96d56Sopenharmony_ci
40087db96d56Sopenharmony_ci/*[clinic input]
40097db96d56Sopenharmony_ci_curses.update_lines_cols
40107db96d56Sopenharmony_ci
40117db96d56Sopenharmony_ci[clinic start generated code]*/
40127db96d56Sopenharmony_ci
40137db96d56Sopenharmony_cistatic PyObject *
40147db96d56Sopenharmony_ci_curses_update_lines_cols_impl(PyObject *module)
40157db96d56Sopenharmony_ci/*[clinic end generated code: output=423f2b1e63ed0f75 input=5f065ab7a28a5d90]*/
40167db96d56Sopenharmony_ci{
40177db96d56Sopenharmony_ci    if (!update_lines_cols()) {
40187db96d56Sopenharmony_ci        return NULL;
40197db96d56Sopenharmony_ci    }
40207db96d56Sopenharmony_ci    Py_RETURN_NONE;
40217db96d56Sopenharmony_ci}
40227db96d56Sopenharmony_ci
40237db96d56Sopenharmony_ci#endif
40247db96d56Sopenharmony_ci
40257db96d56Sopenharmony_ci/*[clinic input]
40267db96d56Sopenharmony_ci_curses.raw
40277db96d56Sopenharmony_ci
40287db96d56Sopenharmony_ci    flag: bool(accept={int}) = True
40297db96d56Sopenharmony_ci        If false, the effect is the same as calling noraw().
40307db96d56Sopenharmony_ci    /
40317db96d56Sopenharmony_ci
40327db96d56Sopenharmony_ciEnter raw mode.
40337db96d56Sopenharmony_ci
40347db96d56Sopenharmony_ciIn raw mode, normal line buffering and processing of interrupt, quit,
40357db96d56Sopenharmony_cisuspend, and flow control keys are turned off; characters are presented to
40367db96d56Sopenharmony_cicurses input functions one by one.
40377db96d56Sopenharmony_ci[clinic start generated code]*/
40387db96d56Sopenharmony_ci
40397db96d56Sopenharmony_cistatic PyObject *
40407db96d56Sopenharmony_ci_curses_raw_impl(PyObject *module, int flag)
40417db96d56Sopenharmony_ci/*[clinic end generated code: output=a750e4b342be015b input=e36d8db27832b848]*/
40427db96d56Sopenharmony_ciNoArgOrFlagNoReturnFunctionBody(raw, flag)
40437db96d56Sopenharmony_ci
40447db96d56Sopenharmony_ci/*[clinic input]
40457db96d56Sopenharmony_ci_curses.reset_prog_mode
40467db96d56Sopenharmony_ci
40477db96d56Sopenharmony_ciRestore the terminal to "program" mode, as previously saved by def_prog_mode().
40487db96d56Sopenharmony_ci[clinic start generated code]*/
40497db96d56Sopenharmony_ci
40507db96d56Sopenharmony_cistatic PyObject *
40517db96d56Sopenharmony_ci_curses_reset_prog_mode_impl(PyObject *module)
40527db96d56Sopenharmony_ci/*[clinic end generated code: output=15eb765abf0b6575 input=3d82bea2b3243471]*/
40537db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(reset_prog_mode)
40547db96d56Sopenharmony_ci
40557db96d56Sopenharmony_ci/*[clinic input]
40567db96d56Sopenharmony_ci_curses.reset_shell_mode
40577db96d56Sopenharmony_ci
40587db96d56Sopenharmony_ciRestore the terminal to "shell" mode, as previously saved by def_shell_mode().
40597db96d56Sopenharmony_ci[clinic start generated code]*/
40607db96d56Sopenharmony_ci
40617db96d56Sopenharmony_cistatic PyObject *
40627db96d56Sopenharmony_ci_curses_reset_shell_mode_impl(PyObject *module)
40637db96d56Sopenharmony_ci/*[clinic end generated code: output=0238de2962090d33 input=1c738fa64bd1a24f]*/
40647db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(reset_shell_mode)
40657db96d56Sopenharmony_ci
40667db96d56Sopenharmony_ci/*[clinic input]
40677db96d56Sopenharmony_ci_curses.resetty
40687db96d56Sopenharmony_ci
40697db96d56Sopenharmony_ciRestore terminal mode.
40707db96d56Sopenharmony_ci[clinic start generated code]*/
40717db96d56Sopenharmony_ci
40727db96d56Sopenharmony_cistatic PyObject *
40737db96d56Sopenharmony_ci_curses_resetty_impl(PyObject *module)
40747db96d56Sopenharmony_ci/*[clinic end generated code: output=ff4b448e80a7cd63 input=940493de03624bb0]*/
40757db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(resetty)
40767db96d56Sopenharmony_ci
40777db96d56Sopenharmony_ci#ifdef HAVE_CURSES_RESIZETERM
40787db96d56Sopenharmony_ci/*[clinic input]
40797db96d56Sopenharmony_ci_curses.resizeterm
40807db96d56Sopenharmony_ci
40817db96d56Sopenharmony_ci    nlines: int
40827db96d56Sopenharmony_ci        Height.
40837db96d56Sopenharmony_ci    ncols: int
40847db96d56Sopenharmony_ci        Width.
40857db96d56Sopenharmony_ci    /
40867db96d56Sopenharmony_ci
40877db96d56Sopenharmony_ciResize the standard and current windows to the specified dimensions.
40887db96d56Sopenharmony_ci
40897db96d56Sopenharmony_ciAdjusts other bookkeeping data used by the curses library that record the
40907db96d56Sopenharmony_ciwindow dimensions (in particular the SIGWINCH handler).
40917db96d56Sopenharmony_ci[clinic start generated code]*/
40927db96d56Sopenharmony_ci
40937db96d56Sopenharmony_cistatic PyObject *
40947db96d56Sopenharmony_ci_curses_resizeterm_impl(PyObject *module, int nlines, int ncols)
40957db96d56Sopenharmony_ci/*[clinic end generated code: output=56d6bcc5194ad055 input=0fca02ebad5ffa82]*/
40967db96d56Sopenharmony_ci{
40977db96d56Sopenharmony_ci    PyObject *result;
40987db96d56Sopenharmony_ci
40997db96d56Sopenharmony_ci    PyCursesInitialised;
41007db96d56Sopenharmony_ci
41017db96d56Sopenharmony_ci    result = PyCursesCheckERR(resizeterm(nlines, ncols), "resizeterm");
41027db96d56Sopenharmony_ci    if (!result)
41037db96d56Sopenharmony_ci        return NULL;
41047db96d56Sopenharmony_ci    if (!update_lines_cols()) {
41057db96d56Sopenharmony_ci        Py_DECREF(result);
41067db96d56Sopenharmony_ci        return NULL;
41077db96d56Sopenharmony_ci    }
41087db96d56Sopenharmony_ci    return result;
41097db96d56Sopenharmony_ci}
41107db96d56Sopenharmony_ci
41117db96d56Sopenharmony_ci#endif
41127db96d56Sopenharmony_ci
41137db96d56Sopenharmony_ci#ifdef HAVE_CURSES_RESIZE_TERM
41147db96d56Sopenharmony_ci/*[clinic input]
41157db96d56Sopenharmony_ci_curses.resize_term
41167db96d56Sopenharmony_ci
41177db96d56Sopenharmony_ci    nlines: int
41187db96d56Sopenharmony_ci        Height.
41197db96d56Sopenharmony_ci    ncols: int
41207db96d56Sopenharmony_ci        Width.
41217db96d56Sopenharmony_ci    /
41227db96d56Sopenharmony_ci
41237db96d56Sopenharmony_ciBackend function used by resizeterm(), performing most of the work.
41247db96d56Sopenharmony_ci
41257db96d56Sopenharmony_ciWhen resizing the windows, resize_term() blank-fills the areas that are
41267db96d56Sopenharmony_ciextended.  The calling application should fill in these areas with appropriate
41277db96d56Sopenharmony_cidata.  The resize_term() function attempts to resize all windows.  However,
41287db96d56Sopenharmony_cidue to the calling convention of pads, it is not possible to resize these
41297db96d56Sopenharmony_ciwithout additional interaction with the application.
41307db96d56Sopenharmony_ci[clinic start generated code]*/
41317db96d56Sopenharmony_ci
41327db96d56Sopenharmony_cistatic PyObject *
41337db96d56Sopenharmony_ci_curses_resize_term_impl(PyObject *module, int nlines, int ncols)
41347db96d56Sopenharmony_ci/*[clinic end generated code: output=9e26d8b9ea311ed2 input=2197edd05b049ed4]*/
41357db96d56Sopenharmony_ci{
41367db96d56Sopenharmony_ci    PyObject *result;
41377db96d56Sopenharmony_ci
41387db96d56Sopenharmony_ci    PyCursesInitialised;
41397db96d56Sopenharmony_ci
41407db96d56Sopenharmony_ci    result = PyCursesCheckERR(resize_term(nlines, ncols), "resize_term");
41417db96d56Sopenharmony_ci    if (!result)
41427db96d56Sopenharmony_ci        return NULL;
41437db96d56Sopenharmony_ci    if (!update_lines_cols()) {
41447db96d56Sopenharmony_ci        Py_DECREF(result);
41457db96d56Sopenharmony_ci        return NULL;
41467db96d56Sopenharmony_ci    }
41477db96d56Sopenharmony_ci    return result;
41487db96d56Sopenharmony_ci}
41497db96d56Sopenharmony_ci#endif /* HAVE_CURSES_RESIZE_TERM */
41507db96d56Sopenharmony_ci
41517db96d56Sopenharmony_ci/*[clinic input]
41527db96d56Sopenharmony_ci_curses.savetty
41537db96d56Sopenharmony_ci
41547db96d56Sopenharmony_ciSave terminal mode.
41557db96d56Sopenharmony_ci[clinic start generated code]*/
41567db96d56Sopenharmony_ci
41577db96d56Sopenharmony_cistatic PyObject *
41587db96d56Sopenharmony_ci_curses_savetty_impl(PyObject *module)
41597db96d56Sopenharmony_ci/*[clinic end generated code: output=6babc49f12b42199 input=fce6b2b7d2200102]*/
41607db96d56Sopenharmony_ciNoArgNoReturnFunctionBody(savetty)
41617db96d56Sopenharmony_ci
41627db96d56Sopenharmony_ci#ifdef getsyx
41637db96d56Sopenharmony_ci/*[clinic input]
41647db96d56Sopenharmony_ci_curses.setsyx
41657db96d56Sopenharmony_ci
41667db96d56Sopenharmony_ci    y: int
41677db96d56Sopenharmony_ci        Y-coordinate.
41687db96d56Sopenharmony_ci    x: int
41697db96d56Sopenharmony_ci        X-coordinate.
41707db96d56Sopenharmony_ci    /
41717db96d56Sopenharmony_ci
41727db96d56Sopenharmony_ciSet the virtual screen cursor.
41737db96d56Sopenharmony_ci
41747db96d56Sopenharmony_ciIf y and x are both -1, then leaveok is set.
41757db96d56Sopenharmony_ci[clinic start generated code]*/
41767db96d56Sopenharmony_ci
41777db96d56Sopenharmony_cistatic PyObject *
41787db96d56Sopenharmony_ci_curses_setsyx_impl(PyObject *module, int y, int x)
41797db96d56Sopenharmony_ci/*[clinic end generated code: output=23dcf753511a2464 input=fa7f2b208e10a557]*/
41807db96d56Sopenharmony_ci{
41817db96d56Sopenharmony_ci    PyCursesInitialised;
41827db96d56Sopenharmony_ci
41837db96d56Sopenharmony_ci    setsyx(y,x);
41847db96d56Sopenharmony_ci
41857db96d56Sopenharmony_ci    Py_RETURN_NONE;
41867db96d56Sopenharmony_ci}
41877db96d56Sopenharmony_ci#endif
41887db96d56Sopenharmony_ci
41897db96d56Sopenharmony_ci/*[clinic input]
41907db96d56Sopenharmony_ci_curses.start_color
41917db96d56Sopenharmony_ci
41927db96d56Sopenharmony_ciInitializes eight basic colors and global variables COLORS and COLOR_PAIRS.
41937db96d56Sopenharmony_ci
41947db96d56Sopenharmony_ciMust be called if the programmer wants to use colors, and before any other
41957db96d56Sopenharmony_cicolor manipulation routine is called.  It is good practice to call this
41967db96d56Sopenharmony_ciroutine right after initscr().
41977db96d56Sopenharmony_ci
41987db96d56Sopenharmony_ciIt also restores the colors on the terminal to the values they had when the
41997db96d56Sopenharmony_citerminal was just turned on.
42007db96d56Sopenharmony_ci[clinic start generated code]*/
42017db96d56Sopenharmony_ci
42027db96d56Sopenharmony_cistatic PyObject *
42037db96d56Sopenharmony_ci_curses_start_color_impl(PyObject *module)
42047db96d56Sopenharmony_ci/*[clinic end generated code: output=8b772b41d8090ede input=0ca0ecb2b77e1a12]*/
42057db96d56Sopenharmony_ci{
42067db96d56Sopenharmony_ci    int code;
42077db96d56Sopenharmony_ci    PyObject *c, *cp;
42087db96d56Sopenharmony_ci
42097db96d56Sopenharmony_ci    PyCursesInitialised;
42107db96d56Sopenharmony_ci
42117db96d56Sopenharmony_ci    code = start_color();
42127db96d56Sopenharmony_ci    if (code != ERR) {
42137db96d56Sopenharmony_ci        initialisedcolors = TRUE;
42147db96d56Sopenharmony_ci        c = PyLong_FromLong((long) COLORS);
42157db96d56Sopenharmony_ci        if (c == NULL)
42167db96d56Sopenharmony_ci            return NULL;
42177db96d56Sopenharmony_ci        if (PyDict_SetItemString(ModDict, "COLORS", c) < 0) {
42187db96d56Sopenharmony_ci            Py_DECREF(c);
42197db96d56Sopenharmony_ci            return NULL;
42207db96d56Sopenharmony_ci        }
42217db96d56Sopenharmony_ci        Py_DECREF(c);
42227db96d56Sopenharmony_ci        cp = PyLong_FromLong((long) COLOR_PAIRS);
42237db96d56Sopenharmony_ci        if (cp == NULL)
42247db96d56Sopenharmony_ci            return NULL;
42257db96d56Sopenharmony_ci        if (PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp) < 0) {
42267db96d56Sopenharmony_ci            Py_DECREF(cp);
42277db96d56Sopenharmony_ci            return NULL;
42287db96d56Sopenharmony_ci        }
42297db96d56Sopenharmony_ci        Py_DECREF(cp);
42307db96d56Sopenharmony_ci        Py_RETURN_NONE;
42317db96d56Sopenharmony_ci    } else {
42327db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, "start_color() returned ERR");
42337db96d56Sopenharmony_ci        return NULL;
42347db96d56Sopenharmony_ci    }
42357db96d56Sopenharmony_ci}
42367db96d56Sopenharmony_ci
42377db96d56Sopenharmony_ci/*[clinic input]
42387db96d56Sopenharmony_ci_curses.termattrs
42397db96d56Sopenharmony_ci
42407db96d56Sopenharmony_ciReturn a logical OR of all video attributes supported by the terminal.
42417db96d56Sopenharmony_ci[clinic start generated code]*/
42427db96d56Sopenharmony_ci
42437db96d56Sopenharmony_cistatic PyObject *
42447db96d56Sopenharmony_ci_curses_termattrs_impl(PyObject *module)
42457db96d56Sopenharmony_ci/*[clinic end generated code: output=b06f437fce1b6fc4 input=0559882a04f84d1d]*/
42467db96d56Sopenharmony_ciNoArgReturnIntFunctionBody(termattrs)
42477db96d56Sopenharmony_ci
42487db96d56Sopenharmony_ci/*[clinic input]
42497db96d56Sopenharmony_ci_curses.termname
42507db96d56Sopenharmony_ci
42517db96d56Sopenharmony_ciReturn the value of the environment variable TERM, truncated to 14 characters.
42527db96d56Sopenharmony_ci[clinic start generated code]*/
42537db96d56Sopenharmony_ci
42547db96d56Sopenharmony_cistatic PyObject *
42557db96d56Sopenharmony_ci_curses_termname_impl(PyObject *module)
42567db96d56Sopenharmony_ci/*[clinic end generated code: output=96375577ebbd67fd input=33c08d000944f33f]*/
42577db96d56Sopenharmony_ciNoArgReturnStringFunctionBody(termname)
42587db96d56Sopenharmony_ci
42597db96d56Sopenharmony_ci/*[clinic input]
42607db96d56Sopenharmony_ci_curses.tigetflag
42617db96d56Sopenharmony_ci
42627db96d56Sopenharmony_ci    capname: str
42637db96d56Sopenharmony_ci        The terminfo capability name.
42647db96d56Sopenharmony_ci    /
42657db96d56Sopenharmony_ci
42667db96d56Sopenharmony_ciReturn the value of the Boolean capability.
42677db96d56Sopenharmony_ci
42687db96d56Sopenharmony_ciThe value -1 is returned if capname is not a Boolean capability, or 0 if
42697db96d56Sopenharmony_ciit is canceled or absent from the terminal description.
42707db96d56Sopenharmony_ci[clinic start generated code]*/
42717db96d56Sopenharmony_ci
42727db96d56Sopenharmony_cistatic PyObject *
42737db96d56Sopenharmony_ci_curses_tigetflag_impl(PyObject *module, const char *capname)
42747db96d56Sopenharmony_ci/*[clinic end generated code: output=8853c0e55542195b input=b0787af9e3e9a6ce]*/
42757db96d56Sopenharmony_ci{
42767db96d56Sopenharmony_ci    PyCursesSetupTermCalled;
42777db96d56Sopenharmony_ci
42787db96d56Sopenharmony_ci    return PyLong_FromLong( (long) tigetflag( (char *)capname ) );
42797db96d56Sopenharmony_ci}
42807db96d56Sopenharmony_ci
42817db96d56Sopenharmony_ci/*[clinic input]
42827db96d56Sopenharmony_ci_curses.tigetnum
42837db96d56Sopenharmony_ci
42847db96d56Sopenharmony_ci    capname: str
42857db96d56Sopenharmony_ci        The terminfo capability name.
42867db96d56Sopenharmony_ci    /
42877db96d56Sopenharmony_ci
42887db96d56Sopenharmony_ciReturn the value of the numeric capability.
42897db96d56Sopenharmony_ci
42907db96d56Sopenharmony_ciThe value -2 is returned if capname is not a numeric capability, or -1 if
42917db96d56Sopenharmony_ciit is canceled or absent from the terminal description.
42927db96d56Sopenharmony_ci[clinic start generated code]*/
42937db96d56Sopenharmony_ci
42947db96d56Sopenharmony_cistatic PyObject *
42957db96d56Sopenharmony_ci_curses_tigetnum_impl(PyObject *module, const char *capname)
42967db96d56Sopenharmony_ci/*[clinic end generated code: output=46f8b0a1b5dff42f input=5cdf2f410b109720]*/
42977db96d56Sopenharmony_ci{
42987db96d56Sopenharmony_ci    PyCursesSetupTermCalled;
42997db96d56Sopenharmony_ci
43007db96d56Sopenharmony_ci    return PyLong_FromLong( (long) tigetnum( (char *)capname ) );
43017db96d56Sopenharmony_ci}
43027db96d56Sopenharmony_ci
43037db96d56Sopenharmony_ci/*[clinic input]
43047db96d56Sopenharmony_ci_curses.tigetstr
43057db96d56Sopenharmony_ci
43067db96d56Sopenharmony_ci    capname: str
43077db96d56Sopenharmony_ci        The terminfo capability name.
43087db96d56Sopenharmony_ci    /
43097db96d56Sopenharmony_ci
43107db96d56Sopenharmony_ciReturn the value of the string capability.
43117db96d56Sopenharmony_ci
43127db96d56Sopenharmony_ciNone is returned if capname is not a string capability, or is canceled or
43137db96d56Sopenharmony_ciabsent from the terminal description.
43147db96d56Sopenharmony_ci[clinic start generated code]*/
43157db96d56Sopenharmony_ci
43167db96d56Sopenharmony_cistatic PyObject *
43177db96d56Sopenharmony_ci_curses_tigetstr_impl(PyObject *module, const char *capname)
43187db96d56Sopenharmony_ci/*[clinic end generated code: output=f22b576ad60248f3 input=36644df25c73c0a7]*/
43197db96d56Sopenharmony_ci{
43207db96d56Sopenharmony_ci    PyCursesSetupTermCalled;
43217db96d56Sopenharmony_ci
43227db96d56Sopenharmony_ci    capname = tigetstr( (char *)capname );
43237db96d56Sopenharmony_ci    if (capname == NULL || capname == (char*) -1) {
43247db96d56Sopenharmony_ci        Py_RETURN_NONE;
43257db96d56Sopenharmony_ci    }
43267db96d56Sopenharmony_ci    return PyBytes_FromString( capname );
43277db96d56Sopenharmony_ci}
43287db96d56Sopenharmony_ci
43297db96d56Sopenharmony_ci/*[clinic input]
43307db96d56Sopenharmony_ci_curses.tparm
43317db96d56Sopenharmony_ci
43327db96d56Sopenharmony_ci    str: str(accept={robuffer})
43337db96d56Sopenharmony_ci        Parameterized byte string obtained from the terminfo database.
43347db96d56Sopenharmony_ci    i1: int = 0
43357db96d56Sopenharmony_ci    i2: int = 0
43367db96d56Sopenharmony_ci    i3: int = 0
43377db96d56Sopenharmony_ci    i4: int = 0
43387db96d56Sopenharmony_ci    i5: int = 0
43397db96d56Sopenharmony_ci    i6: int = 0
43407db96d56Sopenharmony_ci    i7: int = 0
43417db96d56Sopenharmony_ci    i8: int = 0
43427db96d56Sopenharmony_ci    i9: int = 0
43437db96d56Sopenharmony_ci    /
43447db96d56Sopenharmony_ci
43457db96d56Sopenharmony_ciInstantiate the specified byte string with the supplied parameters.
43467db96d56Sopenharmony_ci[clinic start generated code]*/
43477db96d56Sopenharmony_ci
43487db96d56Sopenharmony_cistatic PyObject *
43497db96d56Sopenharmony_ci_curses_tparm_impl(PyObject *module, const char *str, int i1, int i2, int i3,
43507db96d56Sopenharmony_ci                   int i4, int i5, int i6, int i7, int i8, int i9)
43517db96d56Sopenharmony_ci/*[clinic end generated code: output=599f62b615c667ff input=5e30b15786f032aa]*/
43527db96d56Sopenharmony_ci{
43537db96d56Sopenharmony_ci    char* result = NULL;
43547db96d56Sopenharmony_ci
43557db96d56Sopenharmony_ci    PyCursesSetupTermCalled;
43567db96d56Sopenharmony_ci
43577db96d56Sopenharmony_ci    result = tparm((char *)str,i1,i2,i3,i4,i5,i6,i7,i8,i9);
43587db96d56Sopenharmony_ci    if (!result) {
43597db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, "tparm() returned NULL");
43607db96d56Sopenharmony_ci        return NULL;
43617db96d56Sopenharmony_ci    }
43627db96d56Sopenharmony_ci
43637db96d56Sopenharmony_ci    return PyBytes_FromString(result);
43647db96d56Sopenharmony_ci}
43657db96d56Sopenharmony_ci
43667db96d56Sopenharmony_ci#ifdef HAVE_CURSES_TYPEAHEAD
43677db96d56Sopenharmony_ci/*[clinic input]
43687db96d56Sopenharmony_ci_curses.typeahead
43697db96d56Sopenharmony_ci
43707db96d56Sopenharmony_ci    fd: int
43717db96d56Sopenharmony_ci        File descriptor.
43727db96d56Sopenharmony_ci    /
43737db96d56Sopenharmony_ci
43747db96d56Sopenharmony_ciSpecify that the file descriptor fd be used for typeahead checking.
43757db96d56Sopenharmony_ci
43767db96d56Sopenharmony_ciIf fd is -1, then no typeahead checking is done.
43777db96d56Sopenharmony_ci[clinic start generated code]*/
43787db96d56Sopenharmony_ci
43797db96d56Sopenharmony_cistatic PyObject *
43807db96d56Sopenharmony_ci_curses_typeahead_impl(PyObject *module, int fd)
43817db96d56Sopenharmony_ci/*[clinic end generated code: output=084bb649d7066583 input=f2968d8e1805051b]*/
43827db96d56Sopenharmony_ci{
43837db96d56Sopenharmony_ci    PyCursesInitialised;
43847db96d56Sopenharmony_ci
43857db96d56Sopenharmony_ci    return PyCursesCheckERR(typeahead( fd ), "typeahead");
43867db96d56Sopenharmony_ci}
43877db96d56Sopenharmony_ci#endif
43887db96d56Sopenharmony_ci
43897db96d56Sopenharmony_ci/*[clinic input]
43907db96d56Sopenharmony_ci_curses.unctrl
43917db96d56Sopenharmony_ci
43927db96d56Sopenharmony_ci    ch: object
43937db96d56Sopenharmony_ci    /
43947db96d56Sopenharmony_ci
43957db96d56Sopenharmony_ciReturn a string which is a printable representation of the character ch.
43967db96d56Sopenharmony_ci
43977db96d56Sopenharmony_ciControl characters are displayed as a caret followed by the character,
43987db96d56Sopenharmony_cifor example as ^C.  Printing characters are left as they are.
43997db96d56Sopenharmony_ci[clinic start generated code]*/
44007db96d56Sopenharmony_ci
44017db96d56Sopenharmony_cistatic PyObject *
44027db96d56Sopenharmony_ci_curses_unctrl(PyObject *module, PyObject *ch)
44037db96d56Sopenharmony_ci/*[clinic end generated code: output=8e07fafc430c9434 input=cd1e35e16cd1ace4]*/
44047db96d56Sopenharmony_ci{
44057db96d56Sopenharmony_ci    chtype ch_;
44067db96d56Sopenharmony_ci
44077db96d56Sopenharmony_ci    PyCursesInitialised;
44087db96d56Sopenharmony_ci
44097db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(NULL, ch, &ch_))
44107db96d56Sopenharmony_ci        return NULL;
44117db96d56Sopenharmony_ci
44127db96d56Sopenharmony_ci    return PyBytes_FromString(unctrl(ch_));
44137db96d56Sopenharmony_ci}
44147db96d56Sopenharmony_ci
44157db96d56Sopenharmony_ci/*[clinic input]
44167db96d56Sopenharmony_ci_curses.ungetch
44177db96d56Sopenharmony_ci
44187db96d56Sopenharmony_ci    ch: object
44197db96d56Sopenharmony_ci    /
44207db96d56Sopenharmony_ci
44217db96d56Sopenharmony_ciPush ch so the next getch() will return it.
44227db96d56Sopenharmony_ci[clinic start generated code]*/
44237db96d56Sopenharmony_ci
44247db96d56Sopenharmony_cistatic PyObject *
44257db96d56Sopenharmony_ci_curses_ungetch(PyObject *module, PyObject *ch)
44267db96d56Sopenharmony_ci/*[clinic end generated code: output=9b19d8268376d887 input=6681e6ae4c42e5eb]*/
44277db96d56Sopenharmony_ci{
44287db96d56Sopenharmony_ci    chtype ch_;
44297db96d56Sopenharmony_ci
44307db96d56Sopenharmony_ci    PyCursesInitialised;
44317db96d56Sopenharmony_ci
44327db96d56Sopenharmony_ci    if (!PyCurses_ConvertToChtype(NULL, ch, &ch_))
44337db96d56Sopenharmony_ci        return NULL;
44347db96d56Sopenharmony_ci
44357db96d56Sopenharmony_ci    return PyCursesCheckERR(ungetch(ch_), "ungetch");
44367db96d56Sopenharmony_ci}
44377db96d56Sopenharmony_ci
44387db96d56Sopenharmony_ci#ifdef HAVE_NCURSESW
44397db96d56Sopenharmony_ci/* Convert an object to a character (wchar_t):
44407db96d56Sopenharmony_ci
44417db96d56Sopenharmony_ci    - int
44427db96d56Sopenharmony_ci    - str of length 1
44437db96d56Sopenharmony_ci
44447db96d56Sopenharmony_ci   Return 1 on success, 0 on error. */
44457db96d56Sopenharmony_cistatic int
44467db96d56Sopenharmony_ciPyCurses_ConvertToWchar_t(PyObject *obj,
44477db96d56Sopenharmony_ci                          wchar_t *wch)
44487db96d56Sopenharmony_ci{
44497db96d56Sopenharmony_ci    if (PyUnicode_Check(obj)) {
44507db96d56Sopenharmony_ci        wchar_t buffer[2];
44517db96d56Sopenharmony_ci        if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
44527db96d56Sopenharmony_ci            PyErr_Format(PyExc_TypeError,
44537db96d56Sopenharmony_ci                         "expect str of length 1 or int, "
44547db96d56Sopenharmony_ci                         "got a str of length %zi",
44557db96d56Sopenharmony_ci                         PyUnicode_GET_LENGTH(obj));
44567db96d56Sopenharmony_ci            return 0;
44577db96d56Sopenharmony_ci        }
44587db96d56Sopenharmony_ci        *wch = buffer[0];
44597db96d56Sopenharmony_ci        return 2;
44607db96d56Sopenharmony_ci    }
44617db96d56Sopenharmony_ci    else if (PyLong_CheckExact(obj)) {
44627db96d56Sopenharmony_ci        long value;
44637db96d56Sopenharmony_ci        int overflow;
44647db96d56Sopenharmony_ci        value = PyLong_AsLongAndOverflow(obj, &overflow);
44657db96d56Sopenharmony_ci        if (overflow) {
44667db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
44677db96d56Sopenharmony_ci                            "int doesn't fit in long");
44687db96d56Sopenharmony_ci            return 0;
44697db96d56Sopenharmony_ci        }
44707db96d56Sopenharmony_ci        *wch = (wchar_t)value;
44717db96d56Sopenharmony_ci        if ((long)*wch != value) {
44727db96d56Sopenharmony_ci            PyErr_Format(PyExc_OverflowError,
44737db96d56Sopenharmony_ci                         "character doesn't fit in wchar_t");
44747db96d56Sopenharmony_ci            return 0;
44757db96d56Sopenharmony_ci        }
44767db96d56Sopenharmony_ci        return 1;
44777db96d56Sopenharmony_ci    }
44787db96d56Sopenharmony_ci    else {
44797db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError,
44807db96d56Sopenharmony_ci                     "expect str of length 1 or int, got %s",
44817db96d56Sopenharmony_ci                     Py_TYPE(obj)->tp_name);
44827db96d56Sopenharmony_ci        return 0;
44837db96d56Sopenharmony_ci    }
44847db96d56Sopenharmony_ci}
44857db96d56Sopenharmony_ci
44867db96d56Sopenharmony_ci/*[clinic input]
44877db96d56Sopenharmony_ci_curses.unget_wch
44887db96d56Sopenharmony_ci
44897db96d56Sopenharmony_ci    ch: object
44907db96d56Sopenharmony_ci    /
44917db96d56Sopenharmony_ci
44927db96d56Sopenharmony_ciPush ch so the next get_wch() will return it.
44937db96d56Sopenharmony_ci[clinic start generated code]*/
44947db96d56Sopenharmony_ci
44957db96d56Sopenharmony_cistatic PyObject *
44967db96d56Sopenharmony_ci_curses_unget_wch(PyObject *module, PyObject *ch)
44977db96d56Sopenharmony_ci/*[clinic end generated code: output=1974c9fb01d37863 input=0d56dc65a46feebb]*/
44987db96d56Sopenharmony_ci{
44997db96d56Sopenharmony_ci    wchar_t wch;
45007db96d56Sopenharmony_ci
45017db96d56Sopenharmony_ci    PyCursesInitialised;
45027db96d56Sopenharmony_ci
45037db96d56Sopenharmony_ci    if (!PyCurses_ConvertToWchar_t(ch, &wch))
45047db96d56Sopenharmony_ci        return NULL;
45057db96d56Sopenharmony_ci    return PyCursesCheckERR(unget_wch(wch), "unget_wch");
45067db96d56Sopenharmony_ci}
45077db96d56Sopenharmony_ci#endif
45087db96d56Sopenharmony_ci
45097db96d56Sopenharmony_ci#ifdef HAVE_CURSES_USE_ENV
45107db96d56Sopenharmony_ci/*[clinic input]
45117db96d56Sopenharmony_ci_curses.use_env
45127db96d56Sopenharmony_ci
45137db96d56Sopenharmony_ci    flag: bool(accept={int})
45147db96d56Sopenharmony_ci    /
45157db96d56Sopenharmony_ci
45167db96d56Sopenharmony_ciUse environment variables LINES and COLUMNS.
45177db96d56Sopenharmony_ci
45187db96d56Sopenharmony_ciIf used, this function should be called before initscr() or newterm() are
45197db96d56Sopenharmony_cicalled.
45207db96d56Sopenharmony_ci
45217db96d56Sopenharmony_ciWhen flag is False, the values of lines and columns specified in the terminfo
45227db96d56Sopenharmony_cidatabase will be used, even if environment variables LINES and COLUMNS (used
45237db96d56Sopenharmony_ciby default) are set, or if curses is running in a window (in which case
45247db96d56Sopenharmony_cidefault behavior would be to use the window size if LINES and COLUMNS are
45257db96d56Sopenharmony_cinot set).
45267db96d56Sopenharmony_ci[clinic start generated code]*/
45277db96d56Sopenharmony_ci
45287db96d56Sopenharmony_cistatic PyObject *
45297db96d56Sopenharmony_ci_curses_use_env_impl(PyObject *module, int flag)
45307db96d56Sopenharmony_ci/*[clinic end generated code: output=b2c445e435c0b164 input=1778eb1e9151ea37]*/
45317db96d56Sopenharmony_ci{
45327db96d56Sopenharmony_ci    use_env(flag);
45337db96d56Sopenharmony_ci    Py_RETURN_NONE;
45347db96d56Sopenharmony_ci}
45357db96d56Sopenharmony_ci#endif
45367db96d56Sopenharmony_ci
45377db96d56Sopenharmony_ci#ifndef STRICT_SYSV_CURSES
45387db96d56Sopenharmony_ci/*[clinic input]
45397db96d56Sopenharmony_ci_curses.use_default_colors
45407db96d56Sopenharmony_ci
45417db96d56Sopenharmony_ciAllow use of default values for colors on terminals supporting this feature.
45427db96d56Sopenharmony_ci
45437db96d56Sopenharmony_ciUse this to support transparency in your application.  The default color
45447db96d56Sopenharmony_ciis assigned to the color number -1.
45457db96d56Sopenharmony_ci[clinic start generated code]*/
45467db96d56Sopenharmony_ci
45477db96d56Sopenharmony_cistatic PyObject *
45487db96d56Sopenharmony_ci_curses_use_default_colors_impl(PyObject *module)
45497db96d56Sopenharmony_ci/*[clinic end generated code: output=a3b81ff71dd901be input=656844367470e8fc]*/
45507db96d56Sopenharmony_ci{
45517db96d56Sopenharmony_ci    int code;
45527db96d56Sopenharmony_ci
45537db96d56Sopenharmony_ci    PyCursesInitialised;
45547db96d56Sopenharmony_ci    PyCursesInitialisedColor;
45557db96d56Sopenharmony_ci
45567db96d56Sopenharmony_ci    code = use_default_colors();
45577db96d56Sopenharmony_ci    if (code != ERR) {
45587db96d56Sopenharmony_ci        Py_RETURN_NONE;
45597db96d56Sopenharmony_ci    } else {
45607db96d56Sopenharmony_ci        PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
45617db96d56Sopenharmony_ci        return NULL;
45627db96d56Sopenharmony_ci    }
45637db96d56Sopenharmony_ci}
45647db96d56Sopenharmony_ci#endif /* STRICT_SYSV_CURSES */
45657db96d56Sopenharmony_ci
45667db96d56Sopenharmony_ci
45677db96d56Sopenharmony_ci#ifdef NCURSES_VERSION
45687db96d56Sopenharmony_ci
45697db96d56Sopenharmony_ciPyDoc_STRVAR(ncurses_version__doc__,
45707db96d56Sopenharmony_ci"curses.ncurses_version\n\
45717db96d56Sopenharmony_ci\n\
45727db96d56Sopenharmony_ciNcurses version information as a named tuple.");
45737db96d56Sopenharmony_ci
45747db96d56Sopenharmony_cistatic PyStructSequence_Field ncurses_version_fields[] = {
45757db96d56Sopenharmony_ci    {"major", "Major release number"},
45767db96d56Sopenharmony_ci    {"minor", "Minor release number"},
45777db96d56Sopenharmony_ci    {"patch", "Patch release number"},
45787db96d56Sopenharmony_ci    {0}
45797db96d56Sopenharmony_ci};
45807db96d56Sopenharmony_ci
45817db96d56Sopenharmony_cistatic PyStructSequence_Desc ncurses_version_desc = {
45827db96d56Sopenharmony_ci    "curses.ncurses_version",  /* name */
45837db96d56Sopenharmony_ci    ncurses_version__doc__,    /* doc */
45847db96d56Sopenharmony_ci    ncurses_version_fields,    /* fields */
45857db96d56Sopenharmony_ci    3
45867db96d56Sopenharmony_ci};
45877db96d56Sopenharmony_ci
45887db96d56Sopenharmony_cistatic PyObject *
45897db96d56Sopenharmony_cimake_ncurses_version(PyTypeObject *type)
45907db96d56Sopenharmony_ci{
45917db96d56Sopenharmony_ci    PyObject *ncurses_version;
45927db96d56Sopenharmony_ci    int pos = 0;
45937db96d56Sopenharmony_ci
45947db96d56Sopenharmony_ci    ncurses_version = PyStructSequence_New(type);
45957db96d56Sopenharmony_ci    if (ncurses_version == NULL) {
45967db96d56Sopenharmony_ci        return NULL;
45977db96d56Sopenharmony_ci    }
45987db96d56Sopenharmony_ci
45997db96d56Sopenharmony_ci#define SetIntItem(flag) \
46007db96d56Sopenharmony_ci    PyStructSequence_SET_ITEM(ncurses_version, pos++, PyLong_FromLong(flag)); \
46017db96d56Sopenharmony_ci    if (PyErr_Occurred()) { \
46027db96d56Sopenharmony_ci        Py_CLEAR(ncurses_version); \
46037db96d56Sopenharmony_ci        return NULL; \
46047db96d56Sopenharmony_ci    }
46057db96d56Sopenharmony_ci
46067db96d56Sopenharmony_ci    SetIntItem(NCURSES_VERSION_MAJOR)
46077db96d56Sopenharmony_ci    SetIntItem(NCURSES_VERSION_MINOR)
46087db96d56Sopenharmony_ci    SetIntItem(NCURSES_VERSION_PATCH)
46097db96d56Sopenharmony_ci#undef SetIntItem
46107db96d56Sopenharmony_ci
46117db96d56Sopenharmony_ci    return ncurses_version;
46127db96d56Sopenharmony_ci}
46137db96d56Sopenharmony_ci
46147db96d56Sopenharmony_ci#endif /* NCURSES_VERSION */
46157db96d56Sopenharmony_ci
46167db96d56Sopenharmony_ci/*[clinic input]
46177db96d56Sopenharmony_ci_curses.has_extended_color_support
46187db96d56Sopenharmony_ci
46197db96d56Sopenharmony_ciReturn True if the module supports extended colors; otherwise, return False.
46207db96d56Sopenharmony_ci
46217db96d56Sopenharmony_ciExtended color support allows more than 256 color-pairs for terminals
46227db96d56Sopenharmony_cithat support more than 16 colors (e.g. xterm-256color).
46237db96d56Sopenharmony_ci[clinic start generated code]*/
46247db96d56Sopenharmony_ci
46257db96d56Sopenharmony_cistatic PyObject *
46267db96d56Sopenharmony_ci_curses_has_extended_color_support_impl(PyObject *module)
46277db96d56Sopenharmony_ci/*[clinic end generated code: output=68f1be2b57d92e22 input=4b905f046e35ee9f]*/
46287db96d56Sopenharmony_ci{
46297db96d56Sopenharmony_ci    return PyBool_FromLong(_NCURSES_EXTENDED_COLOR_FUNCS);
46307db96d56Sopenharmony_ci}
46317db96d56Sopenharmony_ci
46327db96d56Sopenharmony_ci/* List of functions defined in the module */
46337db96d56Sopenharmony_ci
46347db96d56Sopenharmony_cistatic PyMethodDef PyCurses_methods[] = {
46357db96d56Sopenharmony_ci    _CURSES_BAUDRATE_METHODDEF
46367db96d56Sopenharmony_ci    _CURSES_BEEP_METHODDEF
46377db96d56Sopenharmony_ci    _CURSES_CAN_CHANGE_COLOR_METHODDEF
46387db96d56Sopenharmony_ci    _CURSES_CBREAK_METHODDEF
46397db96d56Sopenharmony_ci    _CURSES_COLOR_CONTENT_METHODDEF
46407db96d56Sopenharmony_ci    _CURSES_COLOR_PAIR_METHODDEF
46417db96d56Sopenharmony_ci    _CURSES_CURS_SET_METHODDEF
46427db96d56Sopenharmony_ci    _CURSES_DEF_PROG_MODE_METHODDEF
46437db96d56Sopenharmony_ci    _CURSES_DEF_SHELL_MODE_METHODDEF
46447db96d56Sopenharmony_ci    _CURSES_DELAY_OUTPUT_METHODDEF
46457db96d56Sopenharmony_ci    _CURSES_DOUPDATE_METHODDEF
46467db96d56Sopenharmony_ci    _CURSES_ECHO_METHODDEF
46477db96d56Sopenharmony_ci    _CURSES_ENDWIN_METHODDEF
46487db96d56Sopenharmony_ci    _CURSES_ERASECHAR_METHODDEF
46497db96d56Sopenharmony_ci    _CURSES_FILTER_METHODDEF
46507db96d56Sopenharmony_ci    _CURSES_FLASH_METHODDEF
46517db96d56Sopenharmony_ci    _CURSES_FLUSHINP_METHODDEF
46527db96d56Sopenharmony_ci    _CURSES_GETMOUSE_METHODDEF
46537db96d56Sopenharmony_ci    _CURSES_UNGETMOUSE_METHODDEF
46547db96d56Sopenharmony_ci    _CURSES_GETSYX_METHODDEF
46557db96d56Sopenharmony_ci    _CURSES_GETWIN_METHODDEF
46567db96d56Sopenharmony_ci    _CURSES_HAS_COLORS_METHODDEF
46577db96d56Sopenharmony_ci    _CURSES_HAS_EXTENDED_COLOR_SUPPORT_METHODDEF
46587db96d56Sopenharmony_ci    _CURSES_HAS_IC_METHODDEF
46597db96d56Sopenharmony_ci    _CURSES_HAS_IL_METHODDEF
46607db96d56Sopenharmony_ci    _CURSES_HAS_KEY_METHODDEF
46617db96d56Sopenharmony_ci    _CURSES_HALFDELAY_METHODDEF
46627db96d56Sopenharmony_ci    _CURSES_INIT_COLOR_METHODDEF
46637db96d56Sopenharmony_ci    _CURSES_INIT_PAIR_METHODDEF
46647db96d56Sopenharmony_ci    _CURSES_INITSCR_METHODDEF
46657db96d56Sopenharmony_ci    _CURSES_INTRFLUSH_METHODDEF
46667db96d56Sopenharmony_ci    _CURSES_ISENDWIN_METHODDEF
46677db96d56Sopenharmony_ci    _CURSES_IS_TERM_RESIZED_METHODDEF
46687db96d56Sopenharmony_ci    _CURSES_KEYNAME_METHODDEF
46697db96d56Sopenharmony_ci    _CURSES_KILLCHAR_METHODDEF
46707db96d56Sopenharmony_ci    _CURSES_LONGNAME_METHODDEF
46717db96d56Sopenharmony_ci    _CURSES_META_METHODDEF
46727db96d56Sopenharmony_ci    _CURSES_MOUSEINTERVAL_METHODDEF
46737db96d56Sopenharmony_ci    _CURSES_MOUSEMASK_METHODDEF
46747db96d56Sopenharmony_ci    _CURSES_NAPMS_METHODDEF
46757db96d56Sopenharmony_ci    _CURSES_NEWPAD_METHODDEF
46767db96d56Sopenharmony_ci    _CURSES_NEWWIN_METHODDEF
46777db96d56Sopenharmony_ci    _CURSES_NL_METHODDEF
46787db96d56Sopenharmony_ci    _CURSES_NOCBREAK_METHODDEF
46797db96d56Sopenharmony_ci    _CURSES_NOECHO_METHODDEF
46807db96d56Sopenharmony_ci    _CURSES_NONL_METHODDEF
46817db96d56Sopenharmony_ci    _CURSES_NOQIFLUSH_METHODDEF
46827db96d56Sopenharmony_ci    _CURSES_NORAW_METHODDEF
46837db96d56Sopenharmony_ci    _CURSES_PAIR_CONTENT_METHODDEF
46847db96d56Sopenharmony_ci    _CURSES_PAIR_NUMBER_METHODDEF
46857db96d56Sopenharmony_ci    _CURSES_PUTP_METHODDEF
46867db96d56Sopenharmony_ci    _CURSES_QIFLUSH_METHODDEF
46877db96d56Sopenharmony_ci    _CURSES_RAW_METHODDEF
46887db96d56Sopenharmony_ci    _CURSES_RESET_PROG_MODE_METHODDEF
46897db96d56Sopenharmony_ci    _CURSES_RESET_SHELL_MODE_METHODDEF
46907db96d56Sopenharmony_ci    _CURSES_RESETTY_METHODDEF
46917db96d56Sopenharmony_ci    _CURSES_RESIZETERM_METHODDEF
46927db96d56Sopenharmony_ci    _CURSES_RESIZE_TERM_METHODDEF
46937db96d56Sopenharmony_ci    _CURSES_SAVETTY_METHODDEF
46947db96d56Sopenharmony_ci#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102
46957db96d56Sopenharmony_ci    _CURSES_GET_ESCDELAY_METHODDEF
46967db96d56Sopenharmony_ci    _CURSES_SET_ESCDELAY_METHODDEF
46977db96d56Sopenharmony_ci#endif
46987db96d56Sopenharmony_ci    _CURSES_GET_TABSIZE_METHODDEF
46997db96d56Sopenharmony_ci    _CURSES_SET_TABSIZE_METHODDEF
47007db96d56Sopenharmony_ci    _CURSES_SETSYX_METHODDEF
47017db96d56Sopenharmony_ci    _CURSES_SETUPTERM_METHODDEF
47027db96d56Sopenharmony_ci    _CURSES_START_COLOR_METHODDEF
47037db96d56Sopenharmony_ci    _CURSES_TERMATTRS_METHODDEF
47047db96d56Sopenharmony_ci    _CURSES_TERMNAME_METHODDEF
47057db96d56Sopenharmony_ci    _CURSES_TIGETFLAG_METHODDEF
47067db96d56Sopenharmony_ci    _CURSES_TIGETNUM_METHODDEF
47077db96d56Sopenharmony_ci    _CURSES_TIGETSTR_METHODDEF
47087db96d56Sopenharmony_ci    _CURSES_TPARM_METHODDEF
47097db96d56Sopenharmony_ci    _CURSES_TYPEAHEAD_METHODDEF
47107db96d56Sopenharmony_ci    _CURSES_UNCTRL_METHODDEF
47117db96d56Sopenharmony_ci    _CURSES_UNGETCH_METHODDEF
47127db96d56Sopenharmony_ci    _CURSES_UPDATE_LINES_COLS_METHODDEF
47137db96d56Sopenharmony_ci    _CURSES_UNGET_WCH_METHODDEF
47147db96d56Sopenharmony_ci    _CURSES_USE_ENV_METHODDEF
47157db96d56Sopenharmony_ci    _CURSES_USE_DEFAULT_COLORS_METHODDEF
47167db96d56Sopenharmony_ci    {NULL,                  NULL}         /* sentinel */
47177db96d56Sopenharmony_ci};
47187db96d56Sopenharmony_ci
47197db96d56Sopenharmony_ci/* Initialization function for the module */
47207db96d56Sopenharmony_ci
47217db96d56Sopenharmony_ci
47227db96d56Sopenharmony_cistatic struct PyModuleDef _cursesmodule = {
47237db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,
47247db96d56Sopenharmony_ci    "_curses",
47257db96d56Sopenharmony_ci    NULL,
47267db96d56Sopenharmony_ci    -1,
47277db96d56Sopenharmony_ci    PyCurses_methods,
47287db96d56Sopenharmony_ci    NULL,
47297db96d56Sopenharmony_ci    NULL,
47307db96d56Sopenharmony_ci    NULL,
47317db96d56Sopenharmony_ci    NULL
47327db96d56Sopenharmony_ci};
47337db96d56Sopenharmony_ci
47347db96d56Sopenharmony_cistatic void
47357db96d56Sopenharmony_cicurses_destructor(PyObject *op)
47367db96d56Sopenharmony_ci{
47377db96d56Sopenharmony_ci    void *ptr = PyCapsule_GetPointer(op, PyCurses_CAPSULE_NAME);
47387db96d56Sopenharmony_ci    Py_DECREF(*(void **)ptr);
47397db96d56Sopenharmony_ci    PyMem_Free(ptr);
47407db96d56Sopenharmony_ci}
47417db96d56Sopenharmony_ci
47427db96d56Sopenharmony_ciPyMODINIT_FUNC
47437db96d56Sopenharmony_ciPyInit__curses(void)
47447db96d56Sopenharmony_ci{
47457db96d56Sopenharmony_ci    PyObject *m, *d, *v, *c_api_object;
47467db96d56Sopenharmony_ci
47477db96d56Sopenharmony_ci    /* Initialize object type */
47487db96d56Sopenharmony_ci    if (PyType_Ready(&PyCursesWindow_Type) < 0)
47497db96d56Sopenharmony_ci        return NULL;
47507db96d56Sopenharmony_ci
47517db96d56Sopenharmony_ci    /* Create the module and add the functions */
47527db96d56Sopenharmony_ci    m = PyModule_Create(&_cursesmodule);
47537db96d56Sopenharmony_ci    if (m == NULL)
47547db96d56Sopenharmony_ci        return NULL;
47557db96d56Sopenharmony_ci
47567db96d56Sopenharmony_ci    /* Add some symbolic constants to the module */
47577db96d56Sopenharmony_ci    d = PyModule_GetDict(m);
47587db96d56Sopenharmony_ci    if (d == NULL)
47597db96d56Sopenharmony_ci        return NULL;
47607db96d56Sopenharmony_ci    ModDict = d; /* For PyCurses_InitScr to use later */
47617db96d56Sopenharmony_ci
47627db96d56Sopenharmony_ci    void **PyCurses_API = PyMem_Calloc(PyCurses_API_pointers, sizeof(void *));
47637db96d56Sopenharmony_ci    if (PyCurses_API == NULL) {
47647db96d56Sopenharmony_ci        PyErr_NoMemory();
47657db96d56Sopenharmony_ci        return NULL;
47667db96d56Sopenharmony_ci    }
47677db96d56Sopenharmony_ci    /* Initialize the C API pointer array */
47687db96d56Sopenharmony_ci    PyCurses_API[0] = (void *)Py_NewRef(&PyCursesWindow_Type);
47697db96d56Sopenharmony_ci    PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
47707db96d56Sopenharmony_ci    PyCurses_API[2] = (void *)func_PyCursesInitialised;
47717db96d56Sopenharmony_ci    PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
47727db96d56Sopenharmony_ci
47737db96d56Sopenharmony_ci    /* Add a capsule for the C API */
47747db96d56Sopenharmony_ci    c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME,
47757db96d56Sopenharmony_ci                                 curses_destructor);
47767db96d56Sopenharmony_ci    if (c_api_object == NULL) {
47777db96d56Sopenharmony_ci        Py_DECREF(PyCurses_API[0]);
47787db96d56Sopenharmony_ci        PyMem_Free(PyCurses_API);
47797db96d56Sopenharmony_ci        return NULL;
47807db96d56Sopenharmony_ci    }
47817db96d56Sopenharmony_ci    if (PyDict_SetItemString(d, "_C_API", c_api_object) < 0) {
47827db96d56Sopenharmony_ci        Py_DECREF(c_api_object);
47837db96d56Sopenharmony_ci        return NULL;
47847db96d56Sopenharmony_ci    }
47857db96d56Sopenharmony_ci    Py_DECREF(c_api_object);
47867db96d56Sopenharmony_ci
47877db96d56Sopenharmony_ci    /* For exception curses.error */
47887db96d56Sopenharmony_ci    PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
47897db96d56Sopenharmony_ci    PyDict_SetItemString(d, "error", PyCursesError);
47907db96d56Sopenharmony_ci
47917db96d56Sopenharmony_ci    /* Make the version available */
47927db96d56Sopenharmony_ci    v = PyBytes_FromString(PyCursesVersion);
47937db96d56Sopenharmony_ci    PyDict_SetItemString(d, "version", v);
47947db96d56Sopenharmony_ci    PyDict_SetItemString(d, "__version__", v);
47957db96d56Sopenharmony_ci    Py_DECREF(v);
47967db96d56Sopenharmony_ci
47977db96d56Sopenharmony_ci#ifdef NCURSES_VERSION
47987db96d56Sopenharmony_ci    /* ncurses_version */
47997db96d56Sopenharmony_ci    PyTypeObject *version_type;
48007db96d56Sopenharmony_ci    version_type = _PyStructSequence_NewType(&ncurses_version_desc,
48017db96d56Sopenharmony_ci                                             Py_TPFLAGS_DISALLOW_INSTANTIATION);
48027db96d56Sopenharmony_ci    if (version_type == NULL) {
48037db96d56Sopenharmony_ci        return NULL;
48047db96d56Sopenharmony_ci    }
48057db96d56Sopenharmony_ci    v = make_ncurses_version(version_type);
48067db96d56Sopenharmony_ci    Py_DECREF(version_type);
48077db96d56Sopenharmony_ci    if (v == NULL) {
48087db96d56Sopenharmony_ci        return NULL;
48097db96d56Sopenharmony_ci    }
48107db96d56Sopenharmony_ci    PyDict_SetItemString(d, "ncurses_version", v);
48117db96d56Sopenharmony_ci    Py_DECREF(v);
48127db96d56Sopenharmony_ci#endif /* NCURSES_VERSION */
48137db96d56Sopenharmony_ci
48147db96d56Sopenharmony_ci    SetDictInt("ERR", ERR);
48157db96d56Sopenharmony_ci    SetDictInt("OK", OK);
48167db96d56Sopenharmony_ci
48177db96d56Sopenharmony_ci    /* Here are some attributes you can add to chars to print */
48187db96d56Sopenharmony_ci
48197db96d56Sopenharmony_ci    SetDictInt("A_ATTRIBUTES",      A_ATTRIBUTES);
48207db96d56Sopenharmony_ci    SetDictInt("A_NORMAL",              A_NORMAL);
48217db96d56Sopenharmony_ci    SetDictInt("A_STANDOUT",            A_STANDOUT);
48227db96d56Sopenharmony_ci    SetDictInt("A_UNDERLINE",           A_UNDERLINE);
48237db96d56Sopenharmony_ci    SetDictInt("A_REVERSE",             A_REVERSE);
48247db96d56Sopenharmony_ci    SetDictInt("A_BLINK",               A_BLINK);
48257db96d56Sopenharmony_ci    SetDictInt("A_DIM",                 A_DIM);
48267db96d56Sopenharmony_ci    SetDictInt("A_BOLD",                A_BOLD);
48277db96d56Sopenharmony_ci    SetDictInt("A_ALTCHARSET",          A_ALTCHARSET);
48287db96d56Sopenharmony_ci    SetDictInt("A_INVIS",           A_INVIS);
48297db96d56Sopenharmony_ci    SetDictInt("A_PROTECT",         A_PROTECT);
48307db96d56Sopenharmony_ci    SetDictInt("A_CHARTEXT",        A_CHARTEXT);
48317db96d56Sopenharmony_ci    SetDictInt("A_COLOR",           A_COLOR);
48327db96d56Sopenharmony_ci
48337db96d56Sopenharmony_ci    /* The following are never available with strict SYSV curses */
48347db96d56Sopenharmony_ci#ifdef A_HORIZONTAL
48357db96d56Sopenharmony_ci    SetDictInt("A_HORIZONTAL",      A_HORIZONTAL);
48367db96d56Sopenharmony_ci#endif
48377db96d56Sopenharmony_ci#ifdef A_LEFT
48387db96d56Sopenharmony_ci    SetDictInt("A_LEFT",            A_LEFT);
48397db96d56Sopenharmony_ci#endif
48407db96d56Sopenharmony_ci#ifdef A_LOW
48417db96d56Sopenharmony_ci    SetDictInt("A_LOW",             A_LOW);
48427db96d56Sopenharmony_ci#endif
48437db96d56Sopenharmony_ci#ifdef A_RIGHT
48447db96d56Sopenharmony_ci    SetDictInt("A_RIGHT",           A_RIGHT);
48457db96d56Sopenharmony_ci#endif
48467db96d56Sopenharmony_ci#ifdef A_TOP
48477db96d56Sopenharmony_ci    SetDictInt("A_TOP",             A_TOP);
48487db96d56Sopenharmony_ci#endif
48497db96d56Sopenharmony_ci#ifdef A_VERTICAL
48507db96d56Sopenharmony_ci    SetDictInt("A_VERTICAL",        A_VERTICAL);
48517db96d56Sopenharmony_ci#endif
48527db96d56Sopenharmony_ci
48537db96d56Sopenharmony_ci    /* ncurses extension */
48547db96d56Sopenharmony_ci#ifdef A_ITALIC
48557db96d56Sopenharmony_ci    SetDictInt("A_ITALIC",          A_ITALIC);
48567db96d56Sopenharmony_ci#endif
48577db96d56Sopenharmony_ci
48587db96d56Sopenharmony_ci    SetDictInt("COLOR_BLACK",       COLOR_BLACK);
48597db96d56Sopenharmony_ci    SetDictInt("COLOR_RED",         COLOR_RED);
48607db96d56Sopenharmony_ci    SetDictInt("COLOR_GREEN",       COLOR_GREEN);
48617db96d56Sopenharmony_ci    SetDictInt("COLOR_YELLOW",      COLOR_YELLOW);
48627db96d56Sopenharmony_ci    SetDictInt("COLOR_BLUE",        COLOR_BLUE);
48637db96d56Sopenharmony_ci    SetDictInt("COLOR_MAGENTA",     COLOR_MAGENTA);
48647db96d56Sopenharmony_ci    SetDictInt("COLOR_CYAN",        COLOR_CYAN);
48657db96d56Sopenharmony_ci    SetDictInt("COLOR_WHITE",       COLOR_WHITE);
48667db96d56Sopenharmony_ci
48677db96d56Sopenharmony_ci#ifdef NCURSES_MOUSE_VERSION
48687db96d56Sopenharmony_ci    /* Mouse-related constants */
48697db96d56Sopenharmony_ci    SetDictInt("BUTTON1_PRESSED",          BUTTON1_PRESSED);
48707db96d56Sopenharmony_ci    SetDictInt("BUTTON1_RELEASED",         BUTTON1_RELEASED);
48717db96d56Sopenharmony_ci    SetDictInt("BUTTON1_CLICKED",          BUTTON1_CLICKED);
48727db96d56Sopenharmony_ci    SetDictInt("BUTTON1_DOUBLE_CLICKED",   BUTTON1_DOUBLE_CLICKED);
48737db96d56Sopenharmony_ci    SetDictInt("BUTTON1_TRIPLE_CLICKED",   BUTTON1_TRIPLE_CLICKED);
48747db96d56Sopenharmony_ci
48757db96d56Sopenharmony_ci    SetDictInt("BUTTON2_PRESSED",          BUTTON2_PRESSED);
48767db96d56Sopenharmony_ci    SetDictInt("BUTTON2_RELEASED",         BUTTON2_RELEASED);
48777db96d56Sopenharmony_ci    SetDictInt("BUTTON2_CLICKED",          BUTTON2_CLICKED);
48787db96d56Sopenharmony_ci    SetDictInt("BUTTON2_DOUBLE_CLICKED",   BUTTON2_DOUBLE_CLICKED);
48797db96d56Sopenharmony_ci    SetDictInt("BUTTON2_TRIPLE_CLICKED",   BUTTON2_TRIPLE_CLICKED);
48807db96d56Sopenharmony_ci
48817db96d56Sopenharmony_ci    SetDictInt("BUTTON3_PRESSED",          BUTTON3_PRESSED);
48827db96d56Sopenharmony_ci    SetDictInt("BUTTON3_RELEASED",         BUTTON3_RELEASED);
48837db96d56Sopenharmony_ci    SetDictInt("BUTTON3_CLICKED",          BUTTON3_CLICKED);
48847db96d56Sopenharmony_ci    SetDictInt("BUTTON3_DOUBLE_CLICKED",   BUTTON3_DOUBLE_CLICKED);
48857db96d56Sopenharmony_ci    SetDictInt("BUTTON3_TRIPLE_CLICKED",   BUTTON3_TRIPLE_CLICKED);
48867db96d56Sopenharmony_ci
48877db96d56Sopenharmony_ci    SetDictInt("BUTTON4_PRESSED",          BUTTON4_PRESSED);
48887db96d56Sopenharmony_ci    SetDictInt("BUTTON4_RELEASED",         BUTTON4_RELEASED);
48897db96d56Sopenharmony_ci    SetDictInt("BUTTON4_CLICKED",          BUTTON4_CLICKED);
48907db96d56Sopenharmony_ci    SetDictInt("BUTTON4_DOUBLE_CLICKED",   BUTTON4_DOUBLE_CLICKED);
48917db96d56Sopenharmony_ci    SetDictInt("BUTTON4_TRIPLE_CLICKED",   BUTTON4_TRIPLE_CLICKED);
48927db96d56Sopenharmony_ci
48937db96d56Sopenharmony_ci#if NCURSES_MOUSE_VERSION > 1
48947db96d56Sopenharmony_ci    SetDictInt("BUTTON5_PRESSED",          BUTTON5_PRESSED);
48957db96d56Sopenharmony_ci    SetDictInt("BUTTON5_RELEASED",         BUTTON5_RELEASED);
48967db96d56Sopenharmony_ci    SetDictInt("BUTTON5_CLICKED",          BUTTON5_CLICKED);
48977db96d56Sopenharmony_ci    SetDictInt("BUTTON5_DOUBLE_CLICKED",   BUTTON5_DOUBLE_CLICKED);
48987db96d56Sopenharmony_ci    SetDictInt("BUTTON5_TRIPLE_CLICKED",   BUTTON5_TRIPLE_CLICKED);
48997db96d56Sopenharmony_ci#endif
49007db96d56Sopenharmony_ci
49017db96d56Sopenharmony_ci    SetDictInt("BUTTON_SHIFT",             BUTTON_SHIFT);
49027db96d56Sopenharmony_ci    SetDictInt("BUTTON_CTRL",              BUTTON_CTRL);
49037db96d56Sopenharmony_ci    SetDictInt("BUTTON_ALT",               BUTTON_ALT);
49047db96d56Sopenharmony_ci
49057db96d56Sopenharmony_ci    SetDictInt("ALL_MOUSE_EVENTS",         ALL_MOUSE_EVENTS);
49067db96d56Sopenharmony_ci    SetDictInt("REPORT_MOUSE_POSITION",    REPORT_MOUSE_POSITION);
49077db96d56Sopenharmony_ci#endif
49087db96d56Sopenharmony_ci    /* Now set everything up for KEY_ variables */
49097db96d56Sopenharmony_ci    {
49107db96d56Sopenharmony_ci        int key;
49117db96d56Sopenharmony_ci        char *key_n;
49127db96d56Sopenharmony_ci        char *key_n2;
49137db96d56Sopenharmony_ci        for (key=KEY_MIN;key < KEY_MAX; key++) {
49147db96d56Sopenharmony_ci            key_n = (char *)keyname(key);
49157db96d56Sopenharmony_ci            if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
49167db96d56Sopenharmony_ci                continue;
49177db96d56Sopenharmony_ci            if (strncmp(key_n,"KEY_F(",6)==0) {
49187db96d56Sopenharmony_ci                char *p1, *p2;
49197db96d56Sopenharmony_ci                key_n2 = PyMem_Malloc(strlen(key_n)+1);
49207db96d56Sopenharmony_ci                if (!key_n2) {
49217db96d56Sopenharmony_ci                    PyErr_NoMemory();
49227db96d56Sopenharmony_ci                    break;
49237db96d56Sopenharmony_ci                }
49247db96d56Sopenharmony_ci                p1 = key_n;
49257db96d56Sopenharmony_ci                p2 = key_n2;
49267db96d56Sopenharmony_ci                while (*p1) {
49277db96d56Sopenharmony_ci                    if (*p1 != '(' && *p1 != ')') {
49287db96d56Sopenharmony_ci                        *p2 = *p1;
49297db96d56Sopenharmony_ci                        p2++;
49307db96d56Sopenharmony_ci                    }
49317db96d56Sopenharmony_ci                    p1++;
49327db96d56Sopenharmony_ci                }
49337db96d56Sopenharmony_ci                *p2 = (char)0;
49347db96d56Sopenharmony_ci            } else
49357db96d56Sopenharmony_ci                key_n2 = key_n;
49367db96d56Sopenharmony_ci            SetDictInt(key_n2,key);
49377db96d56Sopenharmony_ci            if (key_n2 != key_n)
49387db96d56Sopenharmony_ci                PyMem_Free(key_n2);
49397db96d56Sopenharmony_ci        }
49407db96d56Sopenharmony_ci        SetDictInt("KEY_MIN", KEY_MIN);
49417db96d56Sopenharmony_ci        SetDictInt("KEY_MAX", KEY_MAX);
49427db96d56Sopenharmony_ci    }
49437db96d56Sopenharmony_ci
49447db96d56Sopenharmony_ci    if (PyModule_AddType(m, &PyCursesWindow_Type) < 0) {
49457db96d56Sopenharmony_ci        return NULL;
49467db96d56Sopenharmony_ci    }
49477db96d56Sopenharmony_ci    return m;
49487db96d56Sopenharmony_ci}
4949