urwid 2.6.15__tar.gz → 2.6.16__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of urwid might be problematic. Click here for more details.

Files changed (319) hide show
  1. {urwid-2.6.15 → urwid-2.6.16}/.github/workflows/pythonpackage.yml +6 -2
  2. {urwid-2.6.15 → urwid-2.6.16}/.pre-commit-config.yaml +3 -3
  3. {urwid-2.6.15 → urwid-2.6.16}/PKG-INFO +3 -1
  4. {urwid-2.6.15 → urwid-2.6.16}/README.rst +1 -0
  5. urwid-2.6.16/black-requirements.txt +1 -0
  6. {urwid-2.6.15 → urwid-2.6.16}/classifiers.txt +2 -1
  7. urwid-2.6.16/pylint-requirements.txt +1 -0
  8. {urwid-2.6.15 → urwid-2.6.16}/pyproject.toml +1 -0
  9. urwid-2.6.16/ruff-requirements.txt +1 -0
  10. {urwid-2.6.15 → urwid-2.6.16}/tests/test_columns.py +1 -1
  11. {urwid-2.6.15 → urwid-2.6.16}/tests/test_tree.py +1 -2
  12. {urwid-2.6.15 → urwid-2.6.16}/tox.ini +1 -1
  13. {urwid-2.6.15 → urwid-2.6.16}/urwid/canvas.py +9 -9
  14. {urwid-2.6.15 → urwid-2.6.16}/urwid/command_map.py +2 -1
  15. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/_posix_raw_display.py +16 -4
  16. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/_win32_raw_display.py +5 -4
  17. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/escape.py +9 -4
  18. {urwid-2.6.15 → urwid-2.6.16}/urwid/font.py +3 -3
  19. {urwid-2.6.15 → urwid-2.6.16}/urwid/util.py +1 -1
  20. {urwid-2.6.15 → urwid-2.6.16}/urwid/version.py +2 -2
  21. {urwid-2.6.15 → urwid-2.6.16}/urwid/vterm.py +9 -1
  22. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/bar_graph.py +1 -1
  23. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/columns.py +2 -2
  24. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/grid_flow.py +1 -1
  25. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/pile.py +2 -2
  26. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/progress_bar.py +10 -1
  27. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/scrollable.py +1 -1
  28. {urwid-2.6.15 → urwid-2.6.16}/urwid.egg-info/PKG-INFO +3 -1
  29. urwid-2.6.15/black-requirements.txt +0 -1
  30. urwid-2.6.15/pylint-requirements.txt +0 -1
  31. urwid-2.6.15/ruff-requirements.txt +0 -1
  32. {urwid-2.6.15 → urwid-2.6.16}/.coveralls.yml +0 -0
  33. {urwid-2.6.15 → urwid-2.6.16}/.devcontainer/dev.dockerfile +0 -0
  34. {urwid-2.6.15 → urwid-2.6.16}/.devcontainer/devcontainer.json +0 -0
  35. {urwid-2.6.15 → urwid-2.6.16}/.dockerignore +0 -0
  36. {urwid-2.6.15 → urwid-2.6.16}/.editorconfig +0 -0
  37. {urwid-2.6.15 → urwid-2.6.16}/.github/CODE_OF_CONDUCT.md +0 -0
  38. {urwid-2.6.15 → urwid-2.6.16}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  39. {urwid-2.6.15 → urwid-2.6.16}/.github/ISSUE_TEMPLATE/docs.md +0 -0
  40. {urwid-2.6.15 → urwid-2.6.16}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  41. {urwid-2.6.15 → urwid-2.6.16}/.github/ISSUE_TEMPLATE/question.md +0 -0
  42. {urwid-2.6.15 → urwid-2.6.16}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  43. {urwid-2.6.15 → urwid-2.6.16}/.github/dependabot.yml +0 -0
  44. {urwid-2.6.15 → urwid-2.6.16}/.github/labeler.yml +0 -0
  45. {urwid-2.6.15 → urwid-2.6.16}/.github/release.yml +0 -0
  46. {urwid-2.6.15 → urwid-2.6.16}/.github/workflows/documentation.yml +0 -0
  47. {urwid-2.6.15 → urwid-2.6.16}/.github/workflows/isolated_static_check.yml +0 -0
  48. {urwid-2.6.15 → urwid-2.6.16}/.github/workflows/labels.yml +0 -0
  49. {urwid-2.6.15 → urwid-2.6.16}/.github/workflows/yamllint.yml +0 -0
  50. {urwid-2.6.15 → urwid-2.6.16}/.gitignore +0 -0
  51. {urwid-2.6.15 → urwid-2.6.16}/.yamllint.yml +0 -0
  52. {urwid-2.6.15 → urwid-2.6.16}/COPYING +0 -0
  53. {urwid-2.6.15 → urwid-2.6.16}/MANIFEST.in +0 -0
  54. {urwid-2.6.15 → urwid-2.6.16}/docs/Makefile +0 -0
  55. {urwid-2.6.15 → urwid-2.6.16}/docs/changelog.rst +0 -0
  56. {urwid-2.6.15 → urwid-2.6.16}/docs/conf.py +0 -0
  57. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/bigtext.py +0 -0
  58. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/bigtext.py.xdotool +0 -0
  59. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/bigtext1.png +0 -0
  60. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/bigtext2.png +0 -0
  61. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/bigtext3.png +0 -0
  62. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/browse.py +0 -0
  63. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/browse.py.xdotool +0 -0
  64. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/browse1.png +0 -0
  65. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/browse2.png +0 -0
  66. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/edit.py +0 -0
  67. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/edit.py.xdotool +0 -0
  68. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/edit1.png +0 -0
  69. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/edit2.png +0 -0
  70. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/edit_text.txt +0 -0
  71. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/graph.py +0 -0
  72. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/graph.py.xdotool +0 -0
  73. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/graph1.png +0 -0
  74. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/graph2.png +0 -0
  75. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/index.rst +0 -0
  76. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/palette_test.py +0 -0
  77. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/palette_test.py.xdotool +0 -0
  78. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/palette_test1.png +0 -0
  79. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/palette_test2.png +0 -0
  80. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/pop_up.py +0 -0
  81. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/pop_up.py.xdotool +0 -0
  82. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/pop_up1.png +0 -0
  83. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/pop_up2.png +0 -0
  84. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/real_browse.py +0 -0
  85. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/real_edit.py +0 -0
  86. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/subproc.py +0 -0
  87. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/subproc.py.xdotool +0 -0
  88. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/subproc1.png +0 -0
  89. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/subproc2.png +0 -0
  90. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/subproc2.py +0 -0
  91. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/tour.py +0 -0
  92. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/tour.py.xdotool +0 -0
  93. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/tour1.png +0 -0
  94. {urwid-2.6.15 → urwid-2.6.16}/docs/examples/tour2.png +0 -0
  95. {urwid-2.6.15 → urwid-2.6.16}/docs/index.rst +0 -0
  96. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/bright_combinations.py +0 -0
  97. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/bright_combinations.py.xdotool +0 -0
  98. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/bright_combinations1.png +0 -0
  99. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/canvascache.rst +0 -0
  100. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/displayattributes.rst +0 -0
  101. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/displaymodules.rst +0 -0
  102. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/encodings.rst +0 -0
  103. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/display_modules.png +0 -0
  104. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/introduction.png +0 -0
  105. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/urwid_widgets.svgz +0 -0
  106. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/urwid_widgets_1.png +0 -0
  107. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/urwid_widgets_1.xcf +0 -0
  108. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/urwid_widgets_2.png +0 -0
  109. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/urwid_widgets_2.xcf +0 -0
  110. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/images/widget_layout.png +0 -0
  111. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/index.rst +0 -0
  112. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/mainloop.rst +0 -0
  113. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/overview.rst +0 -0
  114. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/safe_combinations.py +0 -0
  115. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/safe_combinations.py.xdotool +0 -0
  116. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/safe_combinations1.png +0 -0
  117. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/textlayout.rst +0 -0
  118. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/userinput.rst +0 -0
  119. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/wanat.py +0 -0
  120. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/wanat_multi.py +0 -0
  121. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/wcur1.py +0 -0
  122. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/wcur2.py +0 -0
  123. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/widgets.rst +0 -0
  124. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/wmod.py +0 -0
  125. {urwid-2.6.15 → urwid-2.6.16}/docs/manual/wsel.py +0 -0
  126. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/attrspec.rst +0 -0
  127. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/canvas.rst +0 -0
  128. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/command_map.rst +0 -0
  129. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/constants.rst +0 -0
  130. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/deprecated.rst +0 -0
  131. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/display_modules.rst +0 -0
  132. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/exceptions.rst +0 -0
  133. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/global_settings.rst +0 -0
  134. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/index.rst +0 -0
  135. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/list_walkers.rst +0 -0
  136. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/main_loop.rst +0 -0
  137. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/meta.rst +0 -0
  138. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/signals.rst +0 -0
  139. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/text_layout.rst +0 -0
  140. {urwid-2.6.15 → urwid-2.6.16}/docs/reference/widget.rst +0 -0
  141. {urwid-2.6.15 → urwid-2.6.16}/docs/tools/compile_pngs.sh +0 -0
  142. {urwid-2.6.15 → urwid-2.6.16}/docs/tools/screenshots.sh +0 -0
  143. {urwid-2.6.15 → urwid-2.6.16}/docs/tools/static/.placeholder +0 -0
  144. {urwid-2.6.15 → urwid-2.6.16}/docs/tools/templates/indexcontent.html +0 -0
  145. {urwid-2.6.15 → urwid-2.6.16}/docs/tools/templates/indexsidebar.html +0 -0
  146. {urwid-2.6.15 → urwid-2.6.16}/docs/tools/templates/localtoc.html +0 -0
  147. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/adventure.py +0 -0
  148. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/adventure.py.xdotool +0 -0
  149. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/adventure1.png +0 -0
  150. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/adventure2.png +0 -0
  151. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/adventure3.png +0 -0
  152. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/adventure4.png +0 -0
  153. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/cmenu.py +0 -0
  154. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/cmenu.py.xdotool +0 -0
  155. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/cmenu1.png +0 -0
  156. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/cmenu2.png +0 -0
  157. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/cmenu3.png +0 -0
  158. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/cmenu4.png +0 -0
  159. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/highcolors.py +0 -0
  160. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/highcolors.py.xdotool +0 -0
  161. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/highcolors1.png +0 -0
  162. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/hmenu.py +0 -0
  163. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/hmenu.py.xdotool +0 -0
  164. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/hmenu1.png +0 -0
  165. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/hmenu2.png +0 -0
  166. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/hmenu3.png +0 -0
  167. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/hmenu4.png +0 -0
  168. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/index.rst +0 -0
  169. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/input.py +0 -0
  170. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/input.py.xdotool +0 -0
  171. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/input1.png +0 -0
  172. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/input2.png +0 -0
  173. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/input3.png +0 -0
  174. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/input4.png +0 -0
  175. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/input5.png +0 -0
  176. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/menu25.png +0 -0
  177. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/minimal.py +0 -0
  178. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/minimal.py.xdotool +0 -0
  179. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/minimal1.png +0 -0
  180. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/multiple.py +0 -0
  181. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/multiple.py.xdotool +0 -0
  182. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/multiple1.png +0 -0
  183. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/multiple2.png +0 -0
  184. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/multiple3.png +0 -0
  185. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/multiple4.png +0 -0
  186. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/qa.py +0 -0
  187. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/qa.py.xdotool +0 -0
  188. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/qa1.png +0 -0
  189. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/qa2.png +0 -0
  190. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/qa3.png +0 -0
  191. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/sig.py +0 -0
  192. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/sig.py.xdotool +0 -0
  193. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/sig1.png +0 -0
  194. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/sig2.png +0 -0
  195. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/sig3.png +0 -0
  196. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/sig4.png +0 -0
  197. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/smenu.py +0 -0
  198. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/smenu.py.xdotool +0 -0
  199. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/smenu1.png +0 -0
  200. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/smenu2.png +0 -0
  201. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/smenu3.png +0 -0
  202. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/urwid_attr.py +0 -0
  203. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/urwid_attr.py.xdotool +0 -0
  204. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/urwid_attr1.png +0 -0
  205. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/urwid_attr2.png +0 -0
  206. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/urwid_attr3.png +0 -0
  207. {urwid-2.6.15 → urwid-2.6.16}/docs/tutorial/urwid_attr4.png +0 -0
  208. {urwid-2.6.15 → urwid-2.6.16}/docs/urwid-logo.png +0 -0
  209. {urwid-2.6.15 → urwid-2.6.16}/examples/asyncio_socket_server.py +0 -0
  210. {urwid-2.6.15 → urwid-2.6.16}/examples/bigtext.py +0 -0
  211. {urwid-2.6.15 → urwid-2.6.16}/examples/browse.py +0 -0
  212. {urwid-2.6.15 → urwid-2.6.16}/examples/calc.py +0 -0
  213. {urwid-2.6.15 → urwid-2.6.16}/examples/dialog.py +0 -0
  214. {urwid-2.6.15 → urwid-2.6.16}/examples/edit.py +0 -0
  215. {urwid-2.6.15 → urwid-2.6.16}/examples/fib.py +0 -0
  216. {urwid-2.6.15 → urwid-2.6.16}/examples/graph.py +0 -0
  217. {urwid-2.6.15 → urwid-2.6.16}/examples/input_test.py +0 -0
  218. {urwid-2.6.15 → urwid-2.6.16}/examples/lcd_cf635.py +0 -0
  219. {urwid-2.6.15 → urwid-2.6.16}/examples/palette_test.py +0 -0
  220. {urwid-2.6.15 → urwid-2.6.16}/examples/pop_up.py +0 -0
  221. {urwid-2.6.15 → urwid-2.6.16}/examples/subproc.py +0 -0
  222. {urwid-2.6.15 → urwid-2.6.16}/examples/subproc2.py +0 -0
  223. {urwid-2.6.15 → urwid-2.6.16}/examples/terminal.py +0 -0
  224. {urwid-2.6.15 → urwid-2.6.16}/examples/tour.py +0 -0
  225. {urwid-2.6.15 → urwid-2.6.16}/examples/treesample.py +0 -0
  226. {urwid-2.6.15 → urwid-2.6.16}/examples/twisted_serve_ssh.py +0 -0
  227. {urwid-2.6.15 → urwid-2.6.16}/examples/twisted_serve_ssh.tac +0 -0
  228. {urwid-2.6.15 → urwid-2.6.16}/isort-requirements.txt +0 -0
  229. {urwid-2.6.15 → urwid-2.6.16}/requirements.txt +0 -0
  230. {urwid-2.6.15 → urwid-2.6.16}/setup.cfg +0 -0
  231. {urwid-2.6.15 → urwid-2.6.16}/setup.py +0 -0
  232. {urwid-2.6.15 → urwid-2.6.16}/test_requirements.txt +0 -0
  233. {urwid-2.6.15 → urwid-2.6.16}/tests/__init__.py +0 -0
  234. {urwid-2.6.15 → urwid-2.6.16}/tests/test_canvas.py +0 -0
  235. {urwid-2.6.15 → urwid-2.6.16}/tests/test_container.py +0 -0
  236. {urwid-2.6.15 → urwid-2.6.16}/tests/test_doctests.py +0 -0
  237. {urwid-2.6.15 → urwid-2.6.16}/tests/test_escapes.py +0 -0
  238. {urwid-2.6.15 → urwid-2.6.16}/tests/test_event_loops.py +0 -0
  239. {urwid-2.6.15 → urwid-2.6.16}/tests/test_filler.py +0 -0
  240. {urwid-2.6.15 → urwid-2.6.16}/tests/test_floatedit.py +0 -0
  241. {urwid-2.6.15 → urwid-2.6.16}/tests/test_font.py +0 -0
  242. {urwid-2.6.15 → urwid-2.6.16}/tests/test_frame.py +0 -0
  243. {urwid-2.6.15 → urwid-2.6.16}/tests/test_graphics.py +0 -0
  244. {urwid-2.6.15 → urwid-2.6.16}/tests/test_grid_flow.py +0 -0
  245. {urwid-2.6.15 → urwid-2.6.16}/tests/test_line_box.py +0 -0
  246. {urwid-2.6.15 → urwid-2.6.16}/tests/test_listbox.py +0 -0
  247. {urwid-2.6.15 → urwid-2.6.16}/tests/test_main_loop.py +0 -0
  248. {urwid-2.6.15 → urwid-2.6.16}/tests/test_moved_imports.py +0 -0
  249. {urwid-2.6.15 → urwid-2.6.16}/tests/test_overlay.py +0 -0
  250. {urwid-2.6.15 → urwid-2.6.16}/tests/test_padding.py +0 -0
  251. {urwid-2.6.15 → urwid-2.6.16}/tests/test_pile.py +0 -0
  252. {urwid-2.6.15 → urwid-2.6.16}/tests/test_raw_display.py +0 -0
  253. {urwid-2.6.15 → urwid-2.6.16}/tests/test_scrollable.py +0 -0
  254. {urwid-2.6.15 → urwid-2.6.16}/tests/test_signals.py +0 -0
  255. {urwid-2.6.15 → urwid-2.6.16}/tests/test_str_util.py +0 -0
  256. {urwid-2.6.15 → urwid-2.6.16}/tests/test_text_layout.py +0 -0
  257. {urwid-2.6.15 → urwid-2.6.16}/tests/test_util.py +0 -0
  258. {urwid-2.6.15 → urwid-2.6.16}/tests/test_vterm.py +0 -0
  259. {urwid-2.6.15 → urwid-2.6.16}/tests/test_widget.py +0 -0
  260. {urwid-2.6.15 → urwid-2.6.16}/tests/util.py +0 -0
  261. {urwid-2.6.15 → urwid-2.6.16}/urwid/__init__.py +0 -0
  262. {urwid-2.6.15 → urwid-2.6.16}/urwid/container.py +0 -0
  263. {urwid-2.6.15 → urwid-2.6.16}/urwid/decoration.py +0 -0
  264. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/__init__.py +0 -0
  265. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/_raw_display_base.py +0 -0
  266. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/_web.css +0 -0
  267. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/_web.js +0 -0
  268. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/_win32.py +0 -0
  269. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/common.py +0 -0
  270. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/curses.py +0 -0
  271. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/html_fragment.py +0 -0
  272. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/lcd.py +0 -0
  273. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/raw.py +0 -0
  274. {urwid-2.6.15 → urwid-2.6.16}/urwid/display/web.py +0 -0
  275. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/__init__.py +0 -0
  276. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/abstract_loop.py +0 -0
  277. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/asyncio_loop.py +0 -0
  278. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/glib_loop.py +0 -0
  279. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/main_loop.py +0 -0
  280. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/select_loop.py +0 -0
  281. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/tornado_loop.py +0 -0
  282. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/trio_loop.py +0 -0
  283. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/twisted_loop.py +0 -0
  284. {urwid-2.6.15 → urwid-2.6.16}/urwid/event_loop/zmq_loop.py +0 -0
  285. {urwid-2.6.15 → urwid-2.6.16}/urwid/graphics.py +0 -0
  286. {urwid-2.6.15 → urwid-2.6.16}/urwid/numedit.py +0 -0
  287. {urwid-2.6.15 → urwid-2.6.16}/urwid/signals.py +0 -0
  288. {urwid-2.6.15 → urwid-2.6.16}/urwid/split_repr.py +0 -0
  289. {urwid-2.6.15 → urwid-2.6.16}/urwid/str_util.py +0 -0
  290. {urwid-2.6.15 → urwid-2.6.16}/urwid/text_layout.py +0 -0
  291. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/__init__.py +0 -0
  292. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/attr_map.py +0 -0
  293. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/attr_wrap.py +0 -0
  294. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/big_text.py +0 -0
  295. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/box_adapter.py +0 -0
  296. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/constants.py +0 -0
  297. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/container.py +0 -0
  298. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/divider.py +0 -0
  299. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/edit.py +0 -0
  300. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/filler.py +0 -0
  301. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/frame.py +0 -0
  302. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/line_box.py +0 -0
  303. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/listbox.py +0 -0
  304. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/monitored_list.py +0 -0
  305. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/overlay.py +0 -0
  306. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/padding.py +0 -0
  307. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/popup.py +0 -0
  308. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/solid_fill.py +0 -0
  309. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/text.py +0 -0
  310. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/treetools.py +0 -0
  311. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/widget.py +0 -0
  312. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/widget_decoration.py +0 -0
  313. {urwid-2.6.15 → urwid-2.6.16}/urwid/widget/wimp.py +0 -0
  314. {urwid-2.6.15 → urwid-2.6.16}/urwid/wimp.py +0 -0
  315. {urwid-2.6.15 → urwid-2.6.16}/urwid.egg-info/SOURCES.txt +0 -0
  316. {urwid-2.6.15 → urwid-2.6.16}/urwid.egg-info/dependency_links.txt +0 -0
  317. {urwid-2.6.15 → urwid-2.6.16}/urwid.egg-info/not-zip-safe +0 -0
  318. {urwid-2.6.15 → urwid-2.6.16}/urwid.egg-info/requires.txt +0 -0
  319. {urwid-2.6.15 → urwid-2.6.16}/urwid.egg-info/top_level.txt +0 -0
@@ -114,7 +114,11 @@ jobs:
114
114
  os: [ "ubuntu-latest", "windows-latest" ]
115
115
  # , "macos-latest"
116
116
  # enable macOS only if OS specific branch will be added
117
- python-version: [ "3.7", "3.8", "3.9", "3.10", "3.11", "3.12" ]
117
+ python-version: [ "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13" ]
118
+ exclude:
119
+ # Not supported by external requirements
120
+ - os: "windows-latest"
121
+ python-version: "3.13"
118
122
 
119
123
  steps:
120
124
  - uses: actions/checkout@v4
@@ -178,7 +182,7 @@ jobs:
178
182
 
179
183
  - uses: actions/setup-python@v5
180
184
  with:
181
- python-version: "3.11"
185
+ python-version: "3.x"
182
186
 
183
187
  - name: Install dependencies
184
188
  run: pip install -U build
@@ -1,6 +1,6 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v4.6.0
3
+ rev: v5.0.0
4
4
  hooks:
5
5
  - id: check-yaml
6
6
  - id: end-of-file-fixer
@@ -20,13 +20,13 @@ repos:
20
20
  types: [pyi]
21
21
 
22
22
  - repo: https://github.com/psf/black
23
- rev: 24.4.2
23
+ rev: 24.10.0
24
24
  hooks:
25
25
  - id: black
26
26
 
27
27
  - repo: https://github.com/astral-sh/ruff-pre-commit
28
28
  # Ruff version.
29
- rev: v0.5.0
29
+ rev: v0.6.9
30
30
  hooks:
31
31
  - id: ruff
32
32
  args: [ --fix, --exit-non-zero-on-fix ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: urwid
3
- Version: 2.6.15
3
+ Version: 2.6.16
4
4
  Summary: A full-featured console (xterm et al.) user interface library
5
5
  Home-page: https://urwid.org/
6
6
  Author-email: Ian Ward <ian@excess.org>
@@ -29,6 +29,7 @@ Classifier: Programming Language :: Python :: 3.9
29
29
  Classifier: Programming Language :: Python :: 3.10
30
30
  Classifier: Programming Language :: Python :: 3.11
31
31
  Classifier: Programming Language :: Python :: 3.12
32
+ Classifier: Programming Language :: Python :: 3.13
32
33
  Classifier: Programming Language :: Python :: 3 :: Only
33
34
  Classifier: Programming Language :: Python :: Implementation :: CPython
34
35
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -148,6 +149,7 @@ Supported Python versions
148
149
  - 3.10
149
150
  - 3.11
150
151
  - 3.12
152
+ - 3.13
151
153
  - pypy3
152
154
 
153
155
  Authors
@@ -91,6 +91,7 @@ Supported Python versions
91
91
  - 3.10
92
92
  - 3.11
93
93
  - 3.12
94
+ - 3.13
94
95
  - pypy3
95
96
 
96
97
  Authors
@@ -0,0 +1 @@
1
+ black==24.10.0
@@ -16,6 +16,7 @@ Programming Language :: Python :: 3.9
16
16
  Programming Language :: Python :: 3.10
17
17
  Programming Language :: Python :: 3.11
18
18
  Programming Language :: Python :: 3.12
19
+ Programming Language :: Python :: 3.13
19
20
  Programming Language :: Python :: 3 :: Only
20
21
  Programming Language :: Python :: Implementation :: CPython
21
- Programming Language :: Python :: Implementation :: PyPy
22
+ Programming Language :: Python :: Implementation :: PyPy
@@ -0,0 +1 @@
1
+ pylint==3.3.1
@@ -240,6 +240,7 @@ disable = [
240
240
  "too-many-instance-attributes",
241
241
  "too-many-lines",
242
242
  "too-many-nested-blocks",
243
+ "too-many-positional-arguments",
243
244
  "broad-except",
244
245
  "broad-exception-raised",
245
246
  "logging-fstring-interpolation",
@@ -0,0 +1 @@
1
+ ruff==0.6.9
@@ -231,7 +231,7 @@ class ColumnsTest(unittest.TestCase):
231
231
 
232
232
  def test_render_pack_item_not_fit(self):
233
233
  items = urwid.Text("123"), urwid.Text("456")
234
- widget = urwid.Columns(((urwid.PACK, item) for item in items))
234
+ widget = urwid.Columns((urwid.PACK, item) for item in items)
235
235
  # Make width < widget fixed pack
236
236
  width = items[0].pack(())[0] - 1
237
237
  height = items[0].rows((width,))
@@ -2,13 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
  import unittest
5
- from typing import Collection
6
5
 
7
6
  import urwid
8
7
  from urwid import TreeNode
9
8
 
10
9
  if typing.TYPE_CHECKING:
11
- from collections.abc import Hashable, Iterable
10
+ from collections.abc import Collection, Hashable, Iterable
12
11
 
13
12
 
14
13
  class SelfRegisteringParent(urwid.ParentNode):
@@ -1,5 +1,5 @@
1
1
  [tox]
2
- envlist = py3{7,8,9,10,11},pypy3,isort,black,ruff,pylint,refurb
2
+ envlist = py3{7,8,9,10,11,12,13},pypy3,isort,black,ruff,pylint,refurb
3
3
  skip_missing_interpreters = True
4
4
 
5
5
  [testenv]
@@ -40,7 +40,7 @@ from urwid.util import (
40
40
  )
41
41
 
42
42
  if typing.TYPE_CHECKING:
43
- from collections.abc import Hashable, Iterable, Sequence
43
+ from collections.abc import Hashable, Iterable, Iterator, Sequence
44
44
 
45
45
  from typing_extensions import Literal
46
46
 
@@ -126,7 +126,7 @@ class CanvasCache:
126
126
 
127
127
  ref = weakref.ref(canvas, cls.cleanup)
128
128
  cls._refs[ref] = (widget, wcls, size, focus)
129
- cls._widgets.setdefault(widget, {})[(wcls, size, focus)] = ref
129
+ cls._widgets.setdefault(widget, {})[wcls, size, focus] = ref
130
130
 
131
131
  @classmethod
132
132
  def fetch(cls, widget, wcls, size, focus) -> Canvas | None:
@@ -182,7 +182,7 @@ class CanvasCache:
182
182
  if not sizes:
183
183
  return
184
184
  with suppress(KeyError):
185
- del sizes[(wcls, size, focus)]
185
+ del sizes[wcls, size, focus]
186
186
  if not sizes:
187
187
  with contextlib.suppress(KeyError):
188
188
  del cls._widgets[widget]
@@ -282,7 +282,7 @@ class Canvas:
282
282
  cols: int | None = None,
283
283
  rows: int | None = None,
284
284
  attr=None,
285
- ) -> Iterable[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
285
+ ) -> Iterator[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
286
286
  raise NotImplementedError()
287
287
 
288
288
  def cols(self) -> int:
@@ -376,7 +376,7 @@ class TextCanvas(Canvas):
376
376
 
377
377
  def __init__(
378
378
  self,
379
- text: Sequence[bytes] | None = None,
379
+ text: list[bytes] | None = None,
380
380
  attr: list[list[tuple[Hashable | None, int]]] | None = None,
381
381
  cs: list[list[tuple[Literal["0", "U"] | None, int]]] | None = None,
382
382
  cursor: tuple[int, int] | None = None,
@@ -477,7 +477,7 @@ class TextCanvas(Canvas):
477
477
  cols: int | None = 0,
478
478
  rows: int | None = 0,
479
479
  attr=None,
480
- ) -> Iterable[tuple[object, Literal["0", "U"] | None, bytes]]:
480
+ ) -> Iterator[tuple[object, Literal["0", "U"] | None, bytes]]:
481
481
  """
482
482
  Return the canvas content as a list of rows where each row
483
483
  is a list of (attr, cs, text) tuples.
@@ -551,7 +551,7 @@ class BlankCanvas(Canvas):
551
551
  cols: int | None = 0,
552
552
  rows: int | None = 0,
553
553
  attr=None,
554
- ) -> Iterable[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
554
+ ) -> Iterator[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
555
555
  """
556
556
  return (cols, rows) of spaces with default attributes.
557
557
  """
@@ -603,7 +603,7 @@ class SolidCanvas(Canvas):
603
603
  cols: int | None = None,
604
604
  rows: int | None = None,
605
605
  attr=None,
606
- ) -> Iterable[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
606
+ ) -> Iterator[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
607
607
  if cols is None:
608
608
  cols = self.size[0]
609
609
  if rows is None:
@@ -704,7 +704,7 @@ class CompositeCanvas(Canvas):
704
704
  cols: int | None = None,
705
705
  rows: int | None = None,
706
706
  attr=None,
707
- ) -> Iterable[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
707
+ ) -> Iterator[list[tuple[object, Literal["0", "U"] | None, bytes]]]:
708
708
  """
709
709
  Return the canvas content as a list of rows where each row
710
710
  is a list of (attr, cs, text) tuples.
@@ -21,9 +21,10 @@ from __future__ import annotations
21
21
 
22
22
  import enum
23
23
  import typing
24
- from typing import Iterator
25
24
 
26
25
  if typing.TYPE_CHECKING:
26
+ from collections.abc import Iterator
27
+
27
28
  from typing_extensions import Self
28
29
 
29
30
 
@@ -56,6 +56,7 @@ class Screen(_raw_display_base.Screen):
56
56
  input: typing.TextIO = sys.stdin, # noqa: A002 # pylint: disable=redefined-builtin
57
57
  output: typing.TextIO = sys.stdout,
58
58
  bracketed_paste_mode=False,
59
+ focus_reporting=False,
59
60
  ) -> None:
60
61
  """Initialize a screen that directly prints escape codes to an output
61
62
  terminal.
@@ -63,11 +64,15 @@ class Screen(_raw_display_base.Screen):
63
64
  bracketed_paste_mode -- enable bracketed paste mode in the host terminal.
64
65
  If the host terminal supports it, the application will receive `begin paste`
65
66
  and `end paste` keystrokes when the user pastes text.
67
+ focus_reporting -- enable focus reporting in the host terminal.
68
+ If the host terminal supports it, the application will receive `focus in`
69
+ and `focus out` keystrokes when the application gains and loses focus.
66
70
  """
67
71
  super().__init__(input, output)
68
72
  self.gpm_mev: Popen | None = None
69
73
  self.gpm_event_pending: bool = False
70
74
  self.bracketed_paste_mode = bracketed_paste_mode
75
+ self.focus_reporting = focus_reporting
71
76
 
72
77
  # These store the previous signal handlers after setting ours
73
78
  self._prev_sigcont_handler = None
@@ -79,7 +84,8 @@ class Screen(_raw_display_base.Screen):
79
84
  f"<{self.__class__.__name__}("
80
85
  f"input={self._term_input_file}, "
81
86
  f"output={self._term_output_file}, "
82
- f"bracketed_paste_mode={self.bracketed_paste_mode})>"
87
+ f"bracketed_paste_mode={self.bracketed_paste_mode}, "
88
+ f"focus_reporting={self.focus_reporting})>"
83
89
  )
84
90
 
85
91
  def _sigwinch_handler(self, signum: int = 28, frame: FrameType | None = None) -> None:
@@ -180,6 +186,9 @@ class Screen(_raw_display_base.Screen):
180
186
  if self.bracketed_paste_mode:
181
187
  self.write(escape.ENABLE_BRACKETED_PASTE_MODE)
182
188
 
189
+ if self.focus_reporting:
190
+ self.write(escape.ENABLE_FOCUS_REPORTING)
191
+
183
192
  fd = self._input_fileno()
184
193
  if fd is not None and os.isatty(fd):
185
194
  self._old_termios_settings = termios.tcgetattr(fd)
@@ -207,15 +216,18 @@ class Screen(_raw_display_base.Screen):
207
216
  if self.bracketed_paste_mode:
208
217
  self.write(escape.DISABLE_BRACKETED_PASTE_MODE)
209
218
 
219
+ if self.focus_reporting:
220
+ self.write(escape.DISABLE_FOCUS_REPORTING)
221
+
210
222
  signals.emit_signal(self, INPUT_DESCRIPTORS_CHANGED)
211
223
 
212
224
  self.signal_restore()
213
225
 
226
+ self._stop_mouse_restore_buffer()
227
+
214
228
  fd = self._input_fileno()
215
229
  if fd is not None and os.isatty(fd):
216
- termios.tcsetattr(fd, termios.TCSADRAIN, self._old_termios_settings)
217
-
218
- self._stop_mouse_restore_buffer()
230
+ termios.tcsetattr(fd, termios.TCSAFLUSH, self._old_termios_settings)
219
231
 
220
232
  if self._old_signal_keys:
221
233
  self.tty_signal_keys(*self._old_signal_keys, fd)
@@ -246,11 +246,12 @@ class ReadInputThread(threading.Thread):
246
246
  if not inp.Event.KeyEvent.bKeyDown:
247
247
  continue
248
248
 
249
- input_data = inp.Event.KeyEvent.uChar.AsciiChar
250
- # On Windows atomic press/release of modifier keys produce phantom input with code NULL
249
+ input_data = inp.Event.KeyEvent.uChar.UnicodeChar
250
+ # On Windows atomic press/release of modifier keys produce phantom input with code NULL.
251
251
  # This input cannot be decoded and should be handled as garbage.
252
- if input_data != b"\x00":
253
- self._input.send(input_data)
252
+ input_bytes = input_data.encode("utf-8")
253
+ if input_bytes != b"\x00":
254
+ self._input.send(input_bytes)
254
255
 
255
256
  elif inp.EventType == _win32.EventType.WINDOW_BUFFER_SIZE_EVENT:
256
257
  self._resize()
@@ -32,7 +32,7 @@ from collections.abc import MutableMapping, Sequence
32
32
  from urwid import str_util
33
33
 
34
34
  if typing.TYPE_CHECKING:
35
- from collections.abc import Collection, Iterable
35
+ from collections.abc import Iterable
36
36
 
37
37
  # NOTE: because of circular imports (urwid.util -> urwid.escape -> urwid.util)
38
38
  # from urwid.util import is_mouse_event -- will not work here
@@ -85,6 +85,8 @@ input_sequences = [
85
85
  ("[F", "end"),
86
86
  ("[G", "5"),
87
87
  ("[H", "home"),
88
+ ("[I", "focus in"),
89
+ ("[O", "focus out"),
88
90
  ("[1~", "home"),
89
91
  ("[2~", "insert"),
90
92
  ("[3~", "delete"),
@@ -225,7 +227,7 @@ class KeyqueueTrie:
225
227
  MutableMapping[int, str | MutableMapping[int, str | MutableMapping[int, str]]]
226
228
  | typing.Literal["mouse", "sgrmouse"]
227
229
  ),
228
- keys: Collection[int],
230
+ keys: Sequence[int],
229
231
  more_available: bool,
230
232
  ):
231
233
  if not isinstance(root, MutableMapping):
@@ -245,7 +247,7 @@ class KeyqueueTrie:
245
247
  return None
246
248
  return self.get_recurse(root[keys[0]], keys[1:], more_available)
247
249
 
248
- def read_mouse_info(self, keys: Collection[int], more_available: bool):
250
+ def read_mouse_info(self, keys: Sequence[int], more_available: bool):
249
251
  if len(keys) < 3:
250
252
  if more_available:
251
253
  raise MoreInputRequired()
@@ -284,7 +286,7 @@ class KeyqueueTrie:
284
286
 
285
287
  return ((f"{prefix}mouse {action}", button, x, y), keys[3:])
286
288
 
287
- def read_sgrmouse_info(self, keys: Collection[int], more_available: bool):
289
+ def read_sgrmouse_info(self, keys: Sequence[int], more_available: bool):
288
290
  # Helpful links:
289
291
  # https://stackoverflow.com/questions/5966903/how-to-get-mousemove-and-mouseclick-in-bash
290
292
  # http://invisible-island.net/xterm/ctlseqs/ctlseqs.pdf
@@ -574,6 +576,9 @@ RESTORE_NORMAL_BUFFER = f"{ESC}[?1049l"
574
576
  ENABLE_BRACKETED_PASTE_MODE = f"{ESC}[?2004h"
575
577
  DISABLE_BRACKETED_PASTE_MODE = f"{ESC}[?2004l"
576
578
 
579
+ ENABLE_FOCUS_REPORTING = f"{ESC}[?1004h"
580
+ DISABLE_FOCUS_REPORTING = f"{ESC}[?1004l"
581
+
577
582
  # RESET_SCROLL_REGION = ESC+"[;r"
578
583
  # RESET = ESC+"c"
579
584
 
@@ -192,9 +192,9 @@ class Font(metaclass=FontRegistry):
192
192
 
193
193
  __slots__ = ("canvas", "char", "utf8_required")
194
194
 
195
- height: int
196
- data: Sequence[str]
197
- name: str
195
+ height: int # pylint: disable=declare-non-slot
196
+ data: Sequence[str] # pylint: disable=declare-non-slot
197
+ name: str # pylint: disable=declare-non-slot
198
198
 
199
199
  def __init__(self) -> None:
200
200
  if not self.height:
@@ -143,7 +143,7 @@ def get_encoding() -> str:
143
143
 
144
144
 
145
145
  @contextlib.contextmanager
146
- def set_temporary_encoding(encoding_name: str) -> Generator[None, None, None]:
146
+ def set_temporary_encoding(encoding_name: str) -> Generator[None]:
147
147
  """Internal helper for encoding specific validation in unittests/doctests.
148
148
 
149
149
  Not exported globally.
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.6.15'
16
- __version_tuple__ = version_tuple = (2, 6, 15)
15
+ __version__ = version = '2.6.16'
16
+ __version_tuple__ = version_tuple = (2, 6, 16)
@@ -375,7 +375,7 @@ class TermCanvas(Canvas):
375
375
  lines = self.height // 2
376
376
 
377
377
  if not up:
378
- lines = -lines # pylint: disable=invalid-unary-operand-type # type already narrowed
378
+ lines = -lines
379
379
 
380
380
  maxscroll = len(self.scrollback_buffer)
381
381
  self.scrolling_up += lines
@@ -1118,6 +1118,14 @@ class TermCanvas(Canvas):
1118
1118
  elif 40 <= attr <= 47:
1119
1119
  bg = attr - 40
1120
1120
  colors = max(16, colors)
1121
+ # AIXTERM bright color spec
1122
+ # https://en.wikipedia.org/wiki/ANSI_escape_code
1123
+ elif 90 <= attr <= 97:
1124
+ fg = attr - 90 + 8
1125
+ colors = max(16, colors)
1126
+ elif 100 <= attr <= 107:
1127
+ bg = attr - 100 + 8
1128
+ colors = max(16, colors)
1121
1129
  elif attr in {38, 48}:
1122
1130
  if idx + 2 < len(attrs) and attrs[idx + 1] == 5:
1123
1131
  # 8 bit color specification
@@ -410,7 +410,7 @@ class BarGraph(Widget, metaclass=BarGraphMeta):
410
410
  if len(bar_type) == 3:
411
411
  # vertical eighths
412
412
  fg, bg, k = bar_type
413
- a = self.satt[(fg, bg)]
413
+ a = self.satt[fg, bg]
414
414
  t = self.eighths[k] * width
415
415
  else:
416
416
  # horizontal lines
@@ -400,7 +400,7 @@ class Columns(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
400
400
  chain(self.contents, repeat((None, (WHSettings.WEIGHT, 1, False)))),
401
401
  )
402
402
  ]
403
- if focus_position < len(widgets): # pylint: disable=consider-using-max-builtin # pylint bug
403
+ if focus_position < len(widgets):
404
404
  self.focus_position = focus_position
405
405
 
406
406
  @property
@@ -441,7 +441,7 @@ class Columns(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
441
441
  (w, ({Sizing.FIXED: WHSettings.GIVEN, Sizing.FLOW: WHSettings.PACK}.get(new_t, new_t), new_n, b))
442
442
  for ((new_t, new_n), (w, (t, n, b))) in zip(column_types, self.contents)
443
443
  ]
444
- if focus_position < len(column_types): # pylint: disable=consider-using-max-builtin # pylint bug
444
+ if focus_position < len(column_types):
445
445
  self.focus_position = focus_position
446
446
 
447
447
  @property
@@ -166,7 +166,7 @@ class GridFlow(WidgetWrap[Pile], WidgetContainerMixin, WidgetContainerListConten
166
166
  )
167
167
  focus_position = self.focus_position
168
168
  self.contents = [(new, (WHSettings.GIVEN, self._cell_width)) for new in widgets]
169
- if focus_position < len(widgets): # pylint: disable=consider-using-max-builtin # pylint bug
169
+ if focus_position < len(widgets):
170
170
  self.focus_position = focus_position
171
171
 
172
172
  def _get_cells(self):
@@ -325,7 +325,7 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
325
325
  chain(self.contents, repeat((None, (WHSettings.WEIGHT, 1)))),
326
326
  )
327
327
  ]
328
- if focus_position < len(widgets): # pylint: disable=consider-using-max-builtin # pylint bug
328
+ if focus_position < len(widgets):
329
329
  self.focus_position = focus_position
330
330
 
331
331
  @property
@@ -365,7 +365,7 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
365
365
  (w, ({Sizing.FIXED: WHSettings.GIVEN, Sizing.FLOW: WHSettings.PACK}.get(new_t, new_t), new_height))
366
366
  for ((new_t, new_height), (w, options)) in zip(item_types, self.contents)
367
367
  ]
368
- if focus_position < len(item_types): # pylint: disable=consider-using-max-builtin # pylint bug
368
+ if focus_position < len(item_types):
369
369
  self.focus_position = focus_position
370
370
 
371
371
  @property
@@ -8,6 +8,8 @@ from .text import Text
8
8
  from .widget import Widget
9
9
 
10
10
  if typing.TYPE_CHECKING:
11
+ from collections.abc import Hashable
12
+
11
13
  from urwid.canvas import TextCanvas
12
14
 
13
15
 
@@ -18,7 +20,14 @@ class ProgressBar(Widget):
18
20
 
19
21
  text_align = Align.CENTER
20
22
 
21
- def __init__(self, normal, complete, current: int = 0, done: int = 100, satt=None):
23
+ def __init__(
24
+ self,
25
+ normal: Hashable | None,
26
+ complete: Hashable | None,
27
+ current: int = 0,
28
+ done: int = 100,
29
+ satt: Hashable | None = None,
30
+ ) -> None:
22
31
  """
23
32
  :param normal: display attribute for incomplete part of progress bar
24
33
  :param complete: display attribute for complete part of progress bar
@@ -537,7 +537,7 @@ class ScrollBar(WidgetDecoration[WrappedWidget]):
537
537
  if use_relative:
538
538
  # `operator.length_hint` is Protocol (Spec) over class based and can end false-negative on the instance
539
539
  # use length_hint-like approach with safe `AttributeError` handling
540
- ow_len = getattr(ow_base, "__len__", getattr(ow_base, "__length_hint__", lambda: 0))()
540
+ ow_len = getattr(ow_base, "__len__", getattr(ow_base, "__length_hint__", int))()
541
541
  ow_canv = render_for_scrollbar()
542
542
  visible_amount = ow_base.get_visible_amount(ow_size, focus)
543
543
  pos = ow_base.get_first_visible_pos(ow_size, focus)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: urwid
3
- Version: 2.6.15
3
+ Version: 2.6.16
4
4
  Summary: A full-featured console (xterm et al.) user interface library
5
5
  Home-page: https://urwid.org/
6
6
  Author-email: Ian Ward <ian@excess.org>
@@ -29,6 +29,7 @@ Classifier: Programming Language :: Python :: 3.9
29
29
  Classifier: Programming Language :: Python :: 3.10
30
30
  Classifier: Programming Language :: Python :: 3.11
31
31
  Classifier: Programming Language :: Python :: 3.12
32
+ Classifier: Programming Language :: Python :: 3.13
32
33
  Classifier: Programming Language :: Python :: 3 :: Only
33
34
  Classifier: Programming Language :: Python :: Implementation :: CPython
34
35
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -148,6 +149,7 @@ Supported Python versions
148
149
  - 3.10
149
150
  - 3.11
150
151
  - 3.12
152
+ - 3.13
151
153
  - pypy3
152
154
 
153
155
  Authors
@@ -1 +0,0 @@
1
- black==24.4.2
@@ -1 +0,0 @@
1
- pylint==3.2.5
@@ -1 +0,0 @@
1
- ruff==0.5.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes