docs: def _adjust_trim_top(self, canv, size):
          """Adjust self._trim_top according to self._scroll_action"""
          action = self._scroll_action
          self._scroll_action = None
  
          maxcol, maxrow = size
          trim_top = self._trim_top
          canv_rows = canv.rows()
  
          if trim_top < 0:
              # Negative trim_top values use bottom of canvas as reference
              trim_top = canv_rows - maxrow + trim_top + 1
  
          if canv_rows <= maxrow:
              self._trim_top = 0  # Reset scroll position
              return
  
          def ensure_bounds(new_trim_top):
              return max(0, min(canv_rows - maxrow, new_trim_top))
  
          if action == SCROLL_LINE_UP:
              self._trim_top = ensure_bounds(trim_top - 1)
          elif action == SCROLL_LINE_DOWN:
              self._trim_top = ensure_bounds(trim_top + 1)
  
          elif action == SCROLL_PAGE_UP:
              self._trim_top = ensure_bounds(trim_top - maxrow+1)
          elif action == SCROLL_PAGE_DOWN:
              self._trim_top = ensure_bounds(trim_top + maxrow-1)
  
          elif action == SCROLL_TO_TOP:
              self._trim_top = 0
          elif action == SCROLL_TO_END:
              self._trim_top = canv_rows - maxrow
  
          else:
              self._trim_top = ensure_bounds(trim_top)
  
          # If the cursor was moved by the most recent keypress, adjust trim_top
          # so that the new cursor position is within the displayed canvas part.
          # But don't do this if the cursor is at the top/bottom edge so we can still scroll out
          if self._old_cursor_coords is not None and self._old_cursor_coords != canv.cursor:
              self._old_cursor_coords = None
              curscol, cursrow = canv.cursor
              if cursrow < self._trim_top:
                  self._trim_top = cursrow
              elif cursrow >= self._trim_top + maxrow:
                  self._trim_top = max(0, cursrow - maxrow + 1)