Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions src/textual/_queue.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from __future__ import annotations

import asyncio
from asyncio import Event
from collections import deque
from typing import Generic, TypeVar

QueueType = TypeVar("QueueType")


class Queue(Generic[QueueType]):
"""A cut-down version of asyncio.Queue

This has just enough functionality to run the message pumps.

"""

def __init__(self) -> None:
self.values: deque[QueueType] = deque()
self.ready_event = Event()

def put_nowait(self, value: QueueType) -> None:
self.values.append(value)
self.ready_event.set()

def qsize(self) -> int:
return len(self.values)

def empty(self) -> bool:
return not self.values

def task_done(self) -> None:
pass

async def get(self) -> QueueType:
if not self.ready_event.is_set():
await self.ready_event.wait()
value = self.values.popleft()
if not self.values:
self.ready_event.clear()
return value

def get_nowait(self) -> QueueType:
if not self.values:
raise asyncio.QueueEmpty()
value = self.values.popleft()
if not self.values:
self.ready_event.clear()
return value
5 changes: 3 additions & 2 deletions src/textual/message_pump.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from textual._context import message_hook as message_hook_context_var
from textual._context import prevent_message_types_stack
from textual._on import OnNoWidget
from textual._queue import Queue
from textual._time import time
from textual.constants import SLOW_THRESHOLD
from textual.css.match import match
Expand Down Expand Up @@ -143,8 +144,8 @@ def __init__(self, parent: MessagePump | None = None) -> None:
"""

@cached_property
def _message_queue(self) -> asyncio.Queue[Message | None]:
return asyncio.Queue()
def _message_queue(self) -> Queue[Message | None]:
return Queue()

@cached_property
def _mounted_event(self) -> asyncio.Event:
Expand Down
4 changes: 2 additions & 2 deletions src/textual/widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -3904,12 +3904,12 @@ def post_render(

return renderable

def watch_mouse_hover(self, value: bool) -> None:
def watch_mouse_hover(self, _mouse_over: bool) -> None:
"""Update from CSS if mouse over state changes."""
if self._has_hover_style:
self._update_styles()

def watch_has_focus(self, value: bool) -> None:
def watch_has_focus(self, _has_focus: bool) -> None:
"""Update from CSS if has focus state changes."""
self._update_styles()

Expand Down
Loading