Skip to content

Commit

Permalink
Merge branch 'fix/fix_curses_py312_v5.1' into 'release/v5.1'
Browse files Browse the repository at this point in the history
Fix Access Violation Error on Windows with Python 3.12 (v5.1)

See merge request espressif/esp-idf!29510
  • Loading branch information
jack0c committed Mar 15, 2024
2 parents b2123cc + c19dfc6 commit 0bef269
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
2 changes: 1 addition & 1 deletion tools/cmake/kconfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ function(__kconfig_generate_config sdkconfig sdkconfig_defaults)
idf_build_set_property(SDKCONFIG_JSON_MENUS ${sdkconfig_json_menus})
idf_build_set_property(CONFIG_DIR ${config_dir})

set(MENUCONFIG_CMD ${python} -m menuconfig)
set(MENUCONFIG_CMD ${python} ${idf_path}/tools/kconfig_new/menuconfig_wrapper.py)
set(TERM_CHECK_CMD ${python} ${idf_path}/tools/check_term.py)

# Generate the menuconfig target
Expand Down
60 changes: 60 additions & 0 deletions tools/kconfig_new/menuconfig_wrapper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import os
import sys
from typing import Any
from typing import Callable

import menuconfig

if os.name == 'nt':
import curses


def main() -> None:
if os.name == 'nt' and sys.version_info[:2] >= (3, 12):
curses.wrapper = _wrapper # type: ignore
menuconfig._main()


def _wrapper(func: Callable) -> Any:
# Using workaround to address windows-curses bug on Python 3.12
# More info: https://github.com/zephyrproject-rtos/windows-curses/issues/50
# This function is a copy of curses.wrapper with changes commented further in the code
if os.name == 'nt' and sys.version_info[:2] >= (3, 12):
stdscr = None
try:
import _curses

# This crashes on Python 3.12 and needs to be commented out.
# It is not needed for the menuconfig to work, though.
# setupterm(term=_os.environ.get('TERM', 'unknown'),
# fd=_sys.__stdout__.fileno())
stdscr = _curses.initscr()
for key, value in _curses.__dict__.items():
if key[0:4] == 'ACS_' or key in ('LINES', 'COLS'):
setattr(curses, key, value)

curses.noecho()
curses.cbreak()

try:
curses.start_color()
except: # noqa: E722
pass

if stdscr is not None:
stdscr.keypad(True)
func(stdscr)
finally:
if stdscr is not None:
stdscr.keypad(False)
curses.echo()
curses.nocbreak()
return curses.endwin()
else:
return curses.wrapper(func)


if __name__ == '__main__':
main()

0 comments on commit 0bef269

Please sign in to comment.