urwid 2.6.8__tar.gz → 2.6.10__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.
Files changed (318) hide show
  1. urwid-2.6.10/.editorconfig +22 -0
  2. {urwid-2.6.8 → urwid-2.6.10}/.pre-commit-config.yaml +1 -1
  3. {urwid-2.6.8 → urwid-2.6.10}/PKG-INFO +1 -1
  4. urwid-2.6.10/black-requirements.txt +1 -0
  5. {urwid-2.6.8 → urwid-2.6.10}/docs/conf.py +3 -3
  6. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/real_browse.py +10 -3
  7. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/highcolors.py +1 -1
  8. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/input.py +1 -1
  9. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/qa.py +1 -1
  10. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/urwid_attr.py +1 -1
  11. {urwid-2.6.8 → urwid-2.6.10}/examples/browse.py +10 -3
  12. {urwid-2.6.8 → urwid-2.6.10}/examples/twisted_serve_ssh.py +2 -2
  13. {urwid-2.6.8 → urwid-2.6.10}/pyproject.toml +14 -8
  14. urwid-2.6.10/ruff-requirements.txt +1 -0
  15. {urwid-2.6.8 → urwid-2.6.10}/tests/test_scrollable.py +75 -1
  16. {urwid-2.6.8 → urwid-2.6.10}/tox.ini +10 -10
  17. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/escape.py +7 -9
  18. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/asyncio_loop.py +4 -3
  19. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/trio_loop.py +4 -3
  20. {urwid-2.6.8 → urwid-2.6.10}/urwid/version.py +2 -2
  21. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/listbox.py +178 -63
  22. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/monitored_list.py +1 -1
  23. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/scrollable.py +70 -25
  24. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/treetools.py +4 -4
  25. {urwid-2.6.8 → urwid-2.6.10}/urwid.egg-info/PKG-INFO +1 -1
  26. {urwid-2.6.8 → urwid-2.6.10}/urwid.egg-info/SOURCES.txt +1 -0
  27. urwid-2.6.8/black-requirements.txt +0 -1
  28. urwid-2.6.8/ruff-requirements.txt +0 -1
  29. {urwid-2.6.8 → urwid-2.6.10}/.coveralls.yml +0 -0
  30. {urwid-2.6.8 → urwid-2.6.10}/.devcontainer/dev.dockerfile +0 -0
  31. {urwid-2.6.8 → urwid-2.6.10}/.devcontainer/devcontainer.json +0 -0
  32. {urwid-2.6.8 → urwid-2.6.10}/.dockerignore +0 -0
  33. {urwid-2.6.8 → urwid-2.6.10}/.github/CODE_OF_CONDUCT.md +0 -0
  34. {urwid-2.6.8 → urwid-2.6.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  35. {urwid-2.6.8 → urwid-2.6.10}/.github/ISSUE_TEMPLATE/docs.md +0 -0
  36. {urwid-2.6.8 → urwid-2.6.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  37. {urwid-2.6.8 → urwid-2.6.10}/.github/ISSUE_TEMPLATE/question.md +0 -0
  38. {urwid-2.6.8 → urwid-2.6.10}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  39. {urwid-2.6.8 → urwid-2.6.10}/.github/dependabot.yml +0 -0
  40. {urwid-2.6.8 → urwid-2.6.10}/.github/labeler.yml +0 -0
  41. {urwid-2.6.8 → urwid-2.6.10}/.github/release.yml +0 -0
  42. {urwid-2.6.8 → urwid-2.6.10}/.github/workflows/documentation.yml +0 -0
  43. {urwid-2.6.8 → urwid-2.6.10}/.github/workflows/isolated_static_check.yml +0 -0
  44. {urwid-2.6.8 → urwid-2.6.10}/.github/workflows/labels.yml +0 -0
  45. {urwid-2.6.8 → urwid-2.6.10}/.github/workflows/pythonpackage.yml +0 -0
  46. {urwid-2.6.8 → urwid-2.6.10}/.github/workflows/yamllint.yml +0 -0
  47. {urwid-2.6.8 → urwid-2.6.10}/.gitignore +0 -0
  48. {urwid-2.6.8 → urwid-2.6.10}/.yamllint.yml +0 -0
  49. {urwid-2.6.8 → urwid-2.6.10}/COPYING +0 -0
  50. {urwid-2.6.8 → urwid-2.6.10}/MANIFEST.in +0 -0
  51. {urwid-2.6.8 → urwid-2.6.10}/README.rst +0 -0
  52. {urwid-2.6.8 → urwid-2.6.10}/classifiers.txt +0 -0
  53. {urwid-2.6.8 → urwid-2.6.10}/docs/Makefile +0 -0
  54. {urwid-2.6.8 → urwid-2.6.10}/docs/changelog.rst +0 -0
  55. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/bigtext.py +0 -0
  56. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/bigtext.py.xdotool +0 -0
  57. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/bigtext1.png +0 -0
  58. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/bigtext2.png +0 -0
  59. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/bigtext3.png +0 -0
  60. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/browse.py +0 -0
  61. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/browse.py.xdotool +0 -0
  62. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/browse1.png +0 -0
  63. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/browse2.png +0 -0
  64. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/edit.py +0 -0
  65. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/edit.py.xdotool +0 -0
  66. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/edit1.png +0 -0
  67. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/edit2.png +0 -0
  68. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/edit_text.txt +0 -0
  69. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/graph.py +0 -0
  70. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/graph.py.xdotool +0 -0
  71. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/graph1.png +0 -0
  72. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/graph2.png +0 -0
  73. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/index.rst +0 -0
  74. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/palette_test.py +0 -0
  75. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/palette_test.py.xdotool +0 -0
  76. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/palette_test1.png +0 -0
  77. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/palette_test2.png +0 -0
  78. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/pop_up.py +0 -0
  79. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/pop_up.py.xdotool +0 -0
  80. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/pop_up1.png +0 -0
  81. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/pop_up2.png +0 -0
  82. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/real_edit.py +0 -0
  83. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/subproc.py +0 -0
  84. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/subproc.py.xdotool +0 -0
  85. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/subproc1.png +0 -0
  86. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/subproc2.png +0 -0
  87. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/subproc2.py +0 -0
  88. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/tour.py +0 -0
  89. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/tour.py.xdotool +0 -0
  90. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/tour1.png +0 -0
  91. {urwid-2.6.8 → urwid-2.6.10}/docs/examples/tour2.png +0 -0
  92. {urwid-2.6.8 → urwid-2.6.10}/docs/index.rst +0 -0
  93. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/bright_combinations.py +0 -0
  94. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/bright_combinations.py.xdotool +0 -0
  95. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/bright_combinations1.png +0 -0
  96. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/canvascache.rst +0 -0
  97. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/displayattributes.rst +0 -0
  98. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/displaymodules.rst +0 -0
  99. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/encodings.rst +0 -0
  100. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/display_modules.png +0 -0
  101. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/introduction.png +0 -0
  102. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/urwid_widgets.svgz +0 -0
  103. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/urwid_widgets_1.png +0 -0
  104. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/urwid_widgets_1.xcf +0 -0
  105. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/urwid_widgets_2.png +0 -0
  106. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/urwid_widgets_2.xcf +0 -0
  107. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/images/widget_layout.png +0 -0
  108. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/index.rst +0 -0
  109. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/mainloop.rst +0 -0
  110. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/overview.rst +0 -0
  111. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/safe_combinations.py +0 -0
  112. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/safe_combinations.py.xdotool +0 -0
  113. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/safe_combinations1.png +0 -0
  114. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/textlayout.rst +0 -0
  115. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/userinput.rst +0 -0
  116. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/wanat.py +0 -0
  117. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/wanat_multi.py +0 -0
  118. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/wcur1.py +0 -0
  119. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/wcur2.py +0 -0
  120. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/widgets.rst +0 -0
  121. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/wmod.py +0 -0
  122. {urwid-2.6.8 → urwid-2.6.10}/docs/manual/wsel.py +0 -0
  123. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/attrspec.rst +0 -0
  124. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/canvas.rst +0 -0
  125. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/command_map.rst +0 -0
  126. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/constants.rst +0 -0
  127. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/deprecated.rst +0 -0
  128. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/display_modules.rst +0 -0
  129. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/exceptions.rst +0 -0
  130. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/global_settings.rst +0 -0
  131. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/index.rst +0 -0
  132. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/list_walkers.rst +0 -0
  133. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/main_loop.rst +0 -0
  134. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/meta.rst +0 -0
  135. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/signals.rst +0 -0
  136. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/text_layout.rst +0 -0
  137. {urwid-2.6.8 → urwid-2.6.10}/docs/reference/widget.rst +0 -0
  138. {urwid-2.6.8 → urwid-2.6.10}/docs/tools/compile_pngs.sh +0 -0
  139. {urwid-2.6.8 → urwid-2.6.10}/docs/tools/screenshots.sh +0 -0
  140. {urwid-2.6.8 → urwid-2.6.10}/docs/tools/static/.placeholder +0 -0
  141. {urwid-2.6.8 → urwid-2.6.10}/docs/tools/templates/indexcontent.html +0 -0
  142. {urwid-2.6.8 → urwid-2.6.10}/docs/tools/templates/indexsidebar.html +0 -0
  143. {urwid-2.6.8 → urwid-2.6.10}/docs/tools/templates/localtoc.html +0 -0
  144. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/adventure.py +0 -0
  145. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/adventure.py.xdotool +0 -0
  146. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/adventure1.png +0 -0
  147. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/adventure2.png +0 -0
  148. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/adventure3.png +0 -0
  149. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/adventure4.png +0 -0
  150. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/cmenu.py +0 -0
  151. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/cmenu.py.xdotool +0 -0
  152. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/cmenu1.png +0 -0
  153. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/cmenu2.png +0 -0
  154. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/cmenu3.png +0 -0
  155. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/cmenu4.png +0 -0
  156. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/highcolors.py.xdotool +0 -0
  157. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/highcolors1.png +0 -0
  158. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/hmenu.py +0 -0
  159. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/hmenu.py.xdotool +0 -0
  160. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/hmenu1.png +0 -0
  161. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/hmenu2.png +0 -0
  162. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/hmenu3.png +0 -0
  163. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/hmenu4.png +0 -0
  164. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/index.rst +0 -0
  165. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/input.py.xdotool +0 -0
  166. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/input1.png +0 -0
  167. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/input2.png +0 -0
  168. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/input3.png +0 -0
  169. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/input4.png +0 -0
  170. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/input5.png +0 -0
  171. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/menu25.png +0 -0
  172. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/minimal.py +0 -0
  173. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/minimal.py.xdotool +0 -0
  174. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/minimal1.png +0 -0
  175. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/multiple.py +0 -0
  176. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/multiple.py.xdotool +0 -0
  177. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/multiple1.png +0 -0
  178. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/multiple2.png +0 -0
  179. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/multiple3.png +0 -0
  180. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/multiple4.png +0 -0
  181. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/qa.py.xdotool +0 -0
  182. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/qa1.png +0 -0
  183. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/qa2.png +0 -0
  184. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/qa3.png +0 -0
  185. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/sig.py +0 -0
  186. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/sig.py.xdotool +0 -0
  187. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/sig1.png +0 -0
  188. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/sig2.png +0 -0
  189. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/sig3.png +0 -0
  190. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/sig4.png +0 -0
  191. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/smenu.py +0 -0
  192. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/smenu.py.xdotool +0 -0
  193. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/smenu1.png +0 -0
  194. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/smenu2.png +0 -0
  195. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/smenu3.png +0 -0
  196. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/urwid_attr.py.xdotool +0 -0
  197. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/urwid_attr1.png +0 -0
  198. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/urwid_attr2.png +0 -0
  199. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/urwid_attr3.png +0 -0
  200. {urwid-2.6.8 → urwid-2.6.10}/docs/tutorial/urwid_attr4.png +0 -0
  201. {urwid-2.6.8 → urwid-2.6.10}/docs/urwid-logo.png +0 -0
  202. {urwid-2.6.8 → urwid-2.6.10}/examples/asyncio_socket_server.py +0 -0
  203. {urwid-2.6.8 → urwid-2.6.10}/examples/bigtext.py +0 -0
  204. {urwid-2.6.8 → urwid-2.6.10}/examples/calc.py +0 -0
  205. {urwid-2.6.8 → urwid-2.6.10}/examples/dialog.py +0 -0
  206. {urwid-2.6.8 → urwid-2.6.10}/examples/edit.py +0 -0
  207. {urwid-2.6.8 → urwid-2.6.10}/examples/fib.py +0 -0
  208. {urwid-2.6.8 → urwid-2.6.10}/examples/graph.py +0 -0
  209. {urwid-2.6.8 → urwid-2.6.10}/examples/input_test.py +0 -0
  210. {urwid-2.6.8 → urwid-2.6.10}/examples/lcd_cf635.py +0 -0
  211. {urwid-2.6.8 → urwid-2.6.10}/examples/palette_test.py +0 -0
  212. {urwid-2.6.8 → urwid-2.6.10}/examples/pop_up.py +0 -0
  213. {urwid-2.6.8 → urwid-2.6.10}/examples/subproc.py +0 -0
  214. {urwid-2.6.8 → urwid-2.6.10}/examples/subproc2.py +0 -0
  215. {urwid-2.6.8 → urwid-2.6.10}/examples/terminal.py +0 -0
  216. {urwid-2.6.8 → urwid-2.6.10}/examples/tour.py +0 -0
  217. {urwid-2.6.8 → urwid-2.6.10}/examples/treesample.py +0 -0
  218. {urwid-2.6.8 → urwid-2.6.10}/examples/twisted_serve_ssh.tac +0 -0
  219. {urwid-2.6.8 → urwid-2.6.10}/isort-requirements.txt +0 -0
  220. {urwid-2.6.8 → urwid-2.6.10}/pylint-requirements.txt +0 -0
  221. {urwid-2.6.8 → urwid-2.6.10}/requirements.txt +0 -0
  222. {urwid-2.6.8 → urwid-2.6.10}/setup.cfg +0 -0
  223. {urwid-2.6.8 → urwid-2.6.10}/setup.py +0 -0
  224. {urwid-2.6.8 → urwid-2.6.10}/test_requirements.txt +0 -0
  225. {urwid-2.6.8 → urwid-2.6.10}/tests/__init__.py +0 -0
  226. {urwid-2.6.8 → urwid-2.6.10}/tests/test_canvas.py +0 -0
  227. {urwid-2.6.8 → urwid-2.6.10}/tests/test_columns.py +0 -0
  228. {urwid-2.6.8 → urwid-2.6.10}/tests/test_container.py +0 -0
  229. {urwid-2.6.8 → urwid-2.6.10}/tests/test_doctests.py +0 -0
  230. {urwid-2.6.8 → urwid-2.6.10}/tests/test_escapes.py +0 -0
  231. {urwid-2.6.8 → urwid-2.6.10}/tests/test_event_loops.py +0 -0
  232. {urwid-2.6.8 → urwid-2.6.10}/tests/test_filler.py +0 -0
  233. {urwid-2.6.8 → urwid-2.6.10}/tests/test_floatedit.py +0 -0
  234. {urwid-2.6.8 → urwid-2.6.10}/tests/test_font.py +0 -0
  235. {urwid-2.6.8 → urwid-2.6.10}/tests/test_frame.py +0 -0
  236. {urwid-2.6.8 → urwid-2.6.10}/tests/test_graphics.py +0 -0
  237. {urwid-2.6.8 → urwid-2.6.10}/tests/test_grid_flow.py +0 -0
  238. {urwid-2.6.8 → urwid-2.6.10}/tests/test_line_box.py +0 -0
  239. {urwid-2.6.8 → urwid-2.6.10}/tests/test_listbox.py +0 -0
  240. {urwid-2.6.8 → urwid-2.6.10}/tests/test_main_loop.py +0 -0
  241. {urwid-2.6.8 → urwid-2.6.10}/tests/test_moved_imports.py +0 -0
  242. {urwid-2.6.8 → urwid-2.6.10}/tests/test_overlay.py +0 -0
  243. {urwid-2.6.8 → urwid-2.6.10}/tests/test_padding.py +0 -0
  244. {urwid-2.6.8 → urwid-2.6.10}/tests/test_pile.py +0 -0
  245. {urwid-2.6.8 → urwid-2.6.10}/tests/test_raw_display.py +0 -0
  246. {urwid-2.6.8 → urwid-2.6.10}/tests/test_signals.py +0 -0
  247. {urwid-2.6.8 → urwid-2.6.10}/tests/test_str_util.py +0 -0
  248. {urwid-2.6.8 → urwid-2.6.10}/tests/test_text_layout.py +0 -0
  249. {urwid-2.6.8 → urwid-2.6.10}/tests/test_tree.py +0 -0
  250. {urwid-2.6.8 → urwid-2.6.10}/tests/test_util.py +0 -0
  251. {urwid-2.6.8 → urwid-2.6.10}/tests/test_vterm.py +0 -0
  252. {urwid-2.6.8 → urwid-2.6.10}/tests/test_widget.py +0 -0
  253. {urwid-2.6.8 → urwid-2.6.10}/tests/util.py +0 -0
  254. {urwid-2.6.8 → urwid-2.6.10}/urwid/__init__.py +0 -0
  255. {urwid-2.6.8 → urwid-2.6.10}/urwid/canvas.py +0 -0
  256. {urwid-2.6.8 → urwid-2.6.10}/urwid/command_map.py +0 -0
  257. {urwid-2.6.8 → urwid-2.6.10}/urwid/container.py +0 -0
  258. {urwid-2.6.8 → urwid-2.6.10}/urwid/decoration.py +0 -0
  259. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/__init__.py +0 -0
  260. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/_posix_raw_display.py +0 -0
  261. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/_raw_display_base.py +0 -0
  262. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/_web.css +0 -0
  263. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/_web.js +0 -0
  264. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/_win32.py +0 -0
  265. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/_win32_raw_display.py +0 -0
  266. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/common.py +0 -0
  267. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/curses.py +0 -0
  268. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/html_fragment.py +0 -0
  269. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/lcd.py +0 -0
  270. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/raw.py +0 -0
  271. {urwid-2.6.8 → urwid-2.6.10}/urwid/display/web.py +0 -0
  272. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/__init__.py +0 -0
  273. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/abstract_loop.py +0 -0
  274. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/glib_loop.py +0 -0
  275. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/main_loop.py +0 -0
  276. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/select_loop.py +0 -0
  277. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/tornado_loop.py +0 -0
  278. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/twisted_loop.py +0 -0
  279. {urwid-2.6.8 → urwid-2.6.10}/urwid/event_loop/zmq_loop.py +0 -0
  280. {urwid-2.6.8 → urwid-2.6.10}/urwid/font.py +0 -0
  281. {urwid-2.6.8 → urwid-2.6.10}/urwid/graphics.py +0 -0
  282. {urwid-2.6.8 → urwid-2.6.10}/urwid/numedit.py +0 -0
  283. {urwid-2.6.8 → urwid-2.6.10}/urwid/signals.py +0 -0
  284. {urwid-2.6.8 → urwid-2.6.10}/urwid/split_repr.py +0 -0
  285. {urwid-2.6.8 → urwid-2.6.10}/urwid/str_util.py +0 -0
  286. {urwid-2.6.8 → urwid-2.6.10}/urwid/text_layout.py +0 -0
  287. {urwid-2.6.8 → urwid-2.6.10}/urwid/util.py +0 -0
  288. {urwid-2.6.8 → urwid-2.6.10}/urwid/vterm.py +0 -0
  289. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/__init__.py +15 -15
  290. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/attr_map.py +0 -0
  291. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/attr_wrap.py +0 -0
  292. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/bar_graph.py +0 -0
  293. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/big_text.py +0 -0
  294. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/box_adapter.py +0 -0
  295. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/columns.py +0 -0
  296. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/constants.py +0 -0
  297. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/container.py +0 -0
  298. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/divider.py +0 -0
  299. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/edit.py +0 -0
  300. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/filler.py +0 -0
  301. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/frame.py +0 -0
  302. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/grid_flow.py +0 -0
  303. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/line_box.py +0 -0
  304. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/overlay.py +0 -0
  305. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/padding.py +0 -0
  306. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/pile.py +0 -0
  307. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/popup.py +0 -0
  308. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/progress_bar.py +0 -0
  309. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/solid_fill.py +0 -0
  310. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/text.py +0 -0
  311. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/widget.py +0 -0
  312. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/widget_decoration.py +0 -0
  313. {urwid-2.6.8 → urwid-2.6.10}/urwid/widget/wimp.py +0 -0
  314. {urwid-2.6.8 → urwid-2.6.10}/urwid/wimp.py +0 -0
  315. {urwid-2.6.8 → urwid-2.6.10}/urwid.egg-info/dependency_links.txt +0 -0
  316. {urwid-2.6.8 → urwid-2.6.10}/urwid.egg-info/not-zip-safe +0 -0
  317. {urwid-2.6.8 → urwid-2.6.10}/urwid.egg-info/requires.txt +0 -0
  318. {urwid-2.6.8 → urwid-2.6.10}/urwid.egg-info/top_level.txt +0 -0
@@ -0,0 +1,22 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ indent_style = space
7
+ insert_final_newline = true
8
+ trim_trailing_whitespace = true
9
+
10
+ [*.{py,pyi,pyx,pxd}]
11
+ indent_size = 4
12
+ max_line_length = 120
13
+
14
+ [*.{yml,yaml,json,ini,toml}]
15
+ indent_size = 2
16
+ max_line_length = 120
17
+
18
+ [*.{rst,md}]
19
+ indent_size = 2
20
+
21
+ [{Makefile,Makefile.in}]
22
+ indent_style = tab
@@ -26,7 +26,7 @@ repos:
26
26
 
27
27
  - repo: https://github.com/astral-sh/ruff-pre-commit
28
28
  # Ruff version.
29
- rev: v0.2.2
29
+ rev: v0.3.2
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.8
3
+ Version: 2.6.10
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>
@@ -0,0 +1 @@
1
+ black==24.3.0
@@ -226,11 +226,11 @@ htmlhelp_basename = "Urwiddoc"
226
226
 
227
227
  latex_elements = {
228
228
  # The paper size ('letterpaper' or 'a4paper').
229
- #'papersize': 'letterpaper',
229
+ # 'papersize': 'letterpaper',
230
230
  # The font size ('10pt', '11pt' or '12pt').
231
- #'pointsize': '10pt',
231
+ # 'pointsize': '10pt',
232
232
  # Additional stuff for the LaTeX preamble.
233
- #'preamble': '',
233
+ # 'preamble': '',
234
234
  }
235
235
 
236
236
  # Grouping the document tree into LaTeX files. List of tuples
@@ -274,7 +274,14 @@ class DirectoryBrowser:
274
274
  self.listbox.offset_rows = 1
275
275
  self.footer = urwid.AttrMap(urwid.Text(self.footer_text), "foot")
276
276
  self.view = urwid.Frame(
277
- urwid.AttrMap(self.listbox, "body"),
277
+ urwid.AttrMap(
278
+ urwid.ScrollBar(
279
+ self.listbox,
280
+ thumb_char=urwid.ScrollBar.Symbols.FULL_BLOCK,
281
+ trough_char=urwid.ScrollBar.Symbols.LITE_SHADE,
282
+ ),
283
+ "body",
284
+ ),
278
285
  header=urwid.AttrMap(self.header, "head"),
279
286
  footer=self.footer,
280
287
  )
@@ -379,9 +386,9 @@ def escape_filename_sh_ansic(name: str) -> str:
379
386
  SPLIT_RE = re.compile(r"[a-zA-Z]+|\d+")
380
387
 
381
388
 
382
- def alphabetize(s):
389
+ def alphabetize(s: str) -> list[str]:
383
390
  L = []
384
- for isdigit, group in itertools.groupby(SPLIT_RE.findall(s), key=lambda x: x.isdigit()):
391
+ for isdigit, group in itertools.groupby(SPLIT_RE.findall(s), key=str.isdigit):
385
392
  if isdigit:
386
393
  L.extend(("", int(n)) for n in group)
387
394
  else:
@@ -4,7 +4,7 @@ import urwid
4
4
 
5
5
 
6
6
  def exit_on_q(key):
7
- if key in ("q", "Q"):
7
+ if key in {"q", "Q"}:
8
8
  raise urwid.ExitMainLoop()
9
9
 
10
10
 
@@ -4,7 +4,7 @@ import urwid
4
4
 
5
5
 
6
6
  def show_or_exit(key: str) -> None:
7
- if key in ("q", "Q"):
7
+ if key in {"q", "Q"}:
8
8
  raise urwid.ExitMainLoop()
9
9
  txt.set_text(repr(key))
10
10
 
@@ -4,7 +4,7 @@ import urwid
4
4
 
5
5
 
6
6
  def exit_on_q(key: str) -> None:
7
- if key in ("q", "Q"):
7
+ if key in {"q", "Q"}:
8
8
  raise urwid.ExitMainLoop()
9
9
 
10
10
 
@@ -4,7 +4,7 @@ import urwid
4
4
 
5
5
 
6
6
  def exit_on_q(key: str) -> None:
7
- if key in ("q", "Q"):
7
+ if key in {"q", "Q"}:
8
8
  raise urwid.ExitMainLoop()
9
9
 
10
10
 
@@ -274,7 +274,14 @@ class DirectoryBrowser:
274
274
  self.listbox.offset_rows = 1
275
275
  self.footer = urwid.AttrMap(urwid.Text(self.footer_text), "foot")
276
276
  self.view = urwid.Frame(
277
- urwid.AttrMap(self.listbox, "body"),
277
+ urwid.AttrMap(
278
+ urwid.ScrollBar(
279
+ self.listbox,
280
+ thumb_char=urwid.ScrollBar.Symbols.FULL_BLOCK,
281
+ trough_char=urwid.ScrollBar.Symbols.LITE_SHADE,
282
+ ),
283
+ "body",
284
+ ),
278
285
  header=urwid.AttrMap(self.header, "head"),
279
286
  footer=self.footer,
280
287
  )
@@ -379,9 +386,9 @@ def escape_filename_sh_ansic(name: str) -> str:
379
386
  SPLIT_RE = re.compile(r"[a-zA-Z]+|\d+")
380
387
 
381
388
 
382
- def alphabetize(s):
389
+ def alphabetize(s: str) -> list[str]:
383
390
  L = []
384
- for isdigit, group in itertools.groupby(SPLIT_RE.findall(s), key=lambda x: x.isdigit()):
391
+ for isdigit, group in itertools.groupby(SPLIT_RE.findall(s), key=str.isdigit):
385
392
  if isdigit:
386
393
  L.extend(("", int(n)) for n in group)
387
394
  else:
@@ -201,7 +201,7 @@ class TwistedScreen(Screen):
201
201
  tuples. This very simple implementation iterates each row and simply
202
202
  writes it out.
203
203
  """
204
- (maxcol, maxrow) = size
204
+ (_maxcol, _maxrow) = size
205
205
  # self.terminal.eraseDisplay()
206
206
  lasta = None
207
207
  for i, row in enumerate(canvas.content()):
@@ -400,7 +400,7 @@ class UrwidTerminalSession(TerminalSession):
400
400
 
401
401
  def windowChanged(self, dimensions):
402
402
  """Called when the window size has changed."""
403
- (h, w, x, y) = dimensions
403
+ (h, w, _x, _y) = dimensions
404
404
  self.chained_protocol.terminalProtocol.terminalSize(h, w)
405
405
 
406
406
 
@@ -2,9 +2,9 @@
2
2
  # Minimum requirements for the build system to execute.
3
3
  # PEP 508 specifications for PEP 518.
4
4
  requires = [
5
- "setuptools >= 61.0.0",
6
- "setuptools_scm[toml]>=7.0",
7
- "wheel",
5
+ "setuptools >= 61.0.0",
6
+ "setuptools_scm[toml]>=7.0",
7
+ "wheel",
8
8
  ]
9
9
  build-backend="setuptools.build_meta"
10
10
 
@@ -178,8 +178,8 @@ extend-select = [
178
178
  "TRY", "UP", "I", "PL", "PERF", "RUF", # tryceratops, pyupgrade, isort, pylint + perflint, Ruff-specific
179
179
  ]
180
180
  extend-ignore = [
181
- "PLR6301", "E203", "PLW3201",
182
- # refactor rules (too many statements/arguments/branches)
181
+ "PLR6301", "E203",
182
+ # refactor rules (too many statements/arguments/branches)
183
183
  "PLR0904", "PLR0911", "PLR0912", "PLR0913", "PLR0914", "PLR0915", "PLR0917", "PLR2004",
184
184
  "PLC0415", # We have a lot of imports outside of top-level
185
185
  "RET504", # Unnecessary variable assignment before return statement
@@ -197,6 +197,15 @@ known-third-party = []
197
197
  [tool.ruff.lint.pydocstyle]
198
198
  convention = "pep257"
199
199
 
200
+ [tool.ruff.lint.pylint]
201
+ allow-dunder-method-names = [
202
+ "__rich_repr__",
203
+ # class generation
204
+ "_contents__getitem__",
205
+ "_contents__setitem__",
206
+ "_contents__delitem__",
207
+ ]
208
+
200
209
  [tool.pylint]
201
210
  extension-pkg-whitelist = []
202
211
  ignore = ["CVS", "_version.py"]
@@ -236,8 +245,6 @@ disable = [
236
245
  "broad-exception-raised",
237
246
  "logging-fstring-interpolation",
238
247
  "logging-format-interpolation",
239
- "consider-alternative-union-syntax",
240
- "deprecated-typing-alias",
241
248
  "fixme",
242
249
  "invalid-name",
243
250
  "import-outside-toplevel",
@@ -247,7 +254,6 @@ disable = [
247
254
  "unused-argument",
248
255
  "unused-private-member",
249
256
  "arguments-differ",
250
- "consider-alternative-union-syntax",
251
257
  "consider-using-assignment-expr",
252
258
  "superfluous-parens",
253
259
  # Magic part
@@ -0,0 +1 @@
1
+ ruff==0.3.4
@@ -1,10 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import string
4
+ import typing
4
5
  import unittest
5
6
 
6
7
  import urwid
7
8
 
9
+ if typing.TYPE_CHECKING:
10
+ from collections.abc import Iterable
11
+
8
12
  LGPL_HEADER = """
9
13
  Copyright (C) <year> <name of author>
10
14
 
@@ -192,9 +196,28 @@ class TestScrollBarScrollable(unittest.TestCase):
192
196
  with self.assertRaises(TypeError):
193
197
  urwid.ScrollBar(urwid.SolidFill(" "))
194
198
 
199
+ def test_no_scrollbar(self):
200
+ """If widget fit without scroll - no scrollbar needed"""
201
+ widget = urwid.ScrollBar(
202
+ urwid.Scrollable(urwid.BigText("1", urwid.HalfBlockHeavy6x5Font())),
203
+ trough_char=urwid.ScrollBar.Symbols.LITE_SHADE,
204
+ thumb_char=urwid.ScrollBar.Symbols.DARK_SHADE,
205
+ )
206
+ reduced_size = (8, 5)
207
+ self.assertEqual(
208
+ (
209
+ " ▐█▌ ",
210
+ " ▀█▌ ",
211
+ " █▌ ",
212
+ " █▌ ",
213
+ " ███▌ ",
214
+ ),
215
+ widget.render(reduced_size).decoded_text,
216
+ )
217
+
195
218
 
196
219
  class TestScrollBarListBox(unittest.TestCase):
197
- def test_non_selectable(self):
220
+ def test_relative_non_selectable(self):
198
221
  widget = urwid.ScrollBar(
199
222
  urwid.ListBox(urwid.SimpleListWalker(urwid.Text(line) for line in LGPL_HEADER.splitlines()))
200
223
  )
@@ -323,3 +346,54 @@ class TestScrollBarListBox(unittest.TestCase):
323
346
  widget.keypress(reduced_size, "down")
324
347
 
325
348
  self.assertEqual(pos_1_down_rendered, widget.render(reduced_size).decoded_text)
349
+
350
+ def test_hinted_len(self):
351
+ class HintedWalker(urwid.ListWalker):
352
+ def __init__(self, items: Iterable[str]) -> None:
353
+ self.items: tuple[str] = tuple(items)
354
+ self.focus = 0
355
+ self.requested_numbers: set[int] = set()
356
+
357
+ def __length_hint__(self) -> int:
358
+ return len(self.items)
359
+
360
+ def __getitem__(self, item: int) -> urwid.Text:
361
+ self.requested_numbers.add(item)
362
+ return urwid.Text(self.items[item])
363
+
364
+ def set_focus(self, item: int) -> None:
365
+ self.focus = item
366
+
367
+ def next_position(self, position: int) -> int:
368
+ if position + 1 < len(self.items):
369
+ return position + 1
370
+ raise IndexError
371
+
372
+ def prev_position(self, position: int) -> int:
373
+ if position - 1 >= 0:
374
+ return position - 1
375
+ raise IndexError
376
+
377
+ widget = urwid.ScrollBar(urwid.ListBox(HintedWalker((f"Line {idx:02}") for idx in range(1, 51))))
378
+ size = (10, 10)
379
+ widget.original_widget.focus_position = 19
380
+ self.assertEqual(
381
+ (
382
+ "Line 16 ",
383
+ "Line 17 ",
384
+ "Line 18 ",
385
+ "Line 19 █",
386
+ "Line 20 █",
387
+ "Line 21 ",
388
+ "Line 22 ",
389
+ "Line 23 ",
390
+ "Line 24 ",
391
+ "Line 25 ",
392
+ ),
393
+ widget.render(size).decoded_text,
394
+ )
395
+ self.assertNotIn(
396
+ 30,
397
+ widget.original_widget.body.requested_numbers,
398
+ "Requested index out of range [0, last shown]. This means not relative scroll bar built.",
399
+ )
@@ -7,8 +7,8 @@ usedevelop = true
7
7
  deps = -r {toxinidir}/test_requirements.txt
8
8
 
9
9
  commands =
10
- coverage run -m unittest discover -s tests -v
11
- coverage report
10
+ coverage run -m unittest discover -s tests -v
11
+ coverage report
12
12
 
13
13
  [testenv:readme]
14
14
  deps =
@@ -21,7 +21,7 @@ commands =
21
21
  [testenv:isort]
22
22
  skip_install = true
23
23
  deps =
24
- isort
24
+ isort
25
25
  commands =
26
26
  isort .
27
27
 
@@ -41,18 +41,18 @@ commands = ruff check .
41
41
 
42
42
  [testenv:docs]
43
43
  deps =
44
- -r {toxinidir}/test_requirements.txt
45
- PyGObject
46
- sphinx
47
- sphinx-github-changelog
44
+ -r {toxinidir}/test_requirements.txt
45
+ PyGObject
46
+ sphinx
47
+ sphinx-github-changelog
48
48
  commands = sphinx-build docs/ build/documentation
49
49
 
50
50
  [testenv:pylint]
51
51
  depends = black,isort
52
52
  deps =
53
- -r {toxinidir}/test_requirements.txt
54
- PyGObject
55
- pylint
53
+ -r {toxinidir}/test_requirements.txt
54
+ PyGObject
55
+ pylint
56
56
  commands = pylint urwid
57
57
 
58
58
  [testenv:refurb]
@@ -310,17 +310,15 @@ class KeyqueueTrie:
310
310
 
311
311
  (b, x, y) = (int(val) for val in value[:-1].split(";"))
312
312
  action = value[-1]
313
-
314
- # shift, etc. is not communicated on my machine, so I
315
- # can't and won't be able to add support for it.
316
- # Double and triple clicks are not supported as well. They can be
317
- # implemented by using a timer. This timer can check if the last
318
- # registered click is below a certain threshold. This threshold
319
- # is normally set in the operating system itself, so setting one
320
- # here will cause an inconsistent behaviour. I do not plan to use
321
- # that feature, so I won't implement it.
313
+ # Double and triple clicks are not supported.
314
+ # They can be implemented by using a timer.
315
+ # This timer can check if the last registered click is below a certain threshold.
316
+ # This threshold is normally set in the operating system itself,
317
+ # so setting one here will cause an inconsistent behaviour.
322
318
 
323
319
  prefixes = []
320
+ if b & 4:
321
+ prefixes.append("shift ")
324
322
  if b & 8:
325
323
  prefixes.append("meta ")
326
324
  if b & 16:
@@ -222,9 +222,10 @@ class AsyncioEventLoop(EventLoop):
222
222
  loop.default_exception_handler(context)
223
223
 
224
224
  def run(self) -> None:
225
- """
226
- Start the event loop. Exit the loop when any callback raises
227
- an exception. If ExitMainLoop is raised, exit cleanly.
225
+ """Start the event loop.
226
+
227
+ Exit the loop when any callback raises an exception.
228
+ If ExitMainLoop is raised, exit cleanly.
228
229
  """
229
230
  self._loop.set_exception_handler(self._exception_handler)
230
231
  self._loop.run_forever()
@@ -160,9 +160,10 @@ class TrioEventLoop(EventLoop):
160
160
  trio.run(self._main_task, instruments=[emulate_idle_callbacks])
161
161
 
162
162
  async def run_async(self) -> None:
163
- """Starts the main loop and blocks asynchronously until the main loop
164
- exits. This allows one to embed an urwid app in a Trio app even if the
165
- Trio event loop is already running. Example::
163
+ """Starts the main loop and blocks asynchronously until the main loop exits.
164
+
165
+ This allows one to embed an urwid app in a Trio app even if the Trio event loop is already running.
166
+ Example::
166
167
 
167
168
  with trio.open_nursery() as nursery:
168
169
  event_loop = urwid.TrioEventLoop()
@@ -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.8'
16
- __version_tuple__ = version_tuple = (2, 6, 8)
15
+ __version__ = version = '2.6.10'
16
+ __version_tuple__ = version_tuple = (2, 6, 10)