From e8a9def25d285d7f321b232f2b65a4b8ea413da1 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Mon, 9 Feb 2026 12:21:48 -0600 Subject: [PATCH 1/4] Optional supervisor module availability --- adafruit_usb_host_mouse/__init__.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/adafruit_usb_host_mouse/__init__.py b/adafruit_usb_host_mouse/__init__.py index 011241c..d5a13d2 100644 --- a/adafruit_usb_host_mouse/__init__.py +++ b/adafruit_usb_host_mouse/__init__.py @@ -29,11 +29,17 @@ # * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register """ +try: + import supervisor +except ImportError: + BLINKA = True +else: + BLINKA = False + import array from traceback import print_exception import adafruit_usb_host_descriptors -import supervisor import usb from displayio import OnDiskBitmap, TileGrid @@ -217,13 +223,16 @@ def __init__( # noqa: PLR0913, too many args which buttons are currently pressed.""" if tilegrid is not None: - self.display_size = ( - supervisor.runtime.display.width, - supervisor.runtime.display.height, - ) - self.tilegrid.x, self.tilegrid.y = ( - x // 2 for x in self.display_size - ) # center cursor in display + if not BLINKA: + self.display_size = ( + supervisor.runtime.display.width, + supervisor.runtime.display.height, + ) + self.tilegrid.x, self.tilegrid.y = ( + x // 2 for x in self.display_size + ) # center cursor in display + else: + self.tilegrid.x, self.tilegrid.y = 0 else: self._x, self._y = 0, 0 From 9283648e10620cd68524e85535c17be38e1f4d19 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Tue, 10 Feb 2026 15:35:20 -0600 Subject: [PATCH 2/4] Refactor supervisor module check --- adafruit_usb_host_mouse/__init__.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/adafruit_usb_host_mouse/__init__.py b/adafruit_usb_host_mouse/__init__.py index d5a13d2..389cbcc 100644 --- a/adafruit_usb_host_mouse/__init__.py +++ b/adafruit_usb_host_mouse/__init__.py @@ -29,13 +29,6 @@ # * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register """ -try: - import supervisor -except ImportError: - BLINKA = True -else: - BLINKA = False - import array from traceback import print_exception @@ -223,7 +216,11 @@ def __init__( # noqa: PLR0913, too many args which buttons are currently pressed.""" if tilegrid is not None: - if not BLINKA: + try: + import supervisor + except ImportError: + self.tilegrid.x, self.tilegrid.y = 0 + else: self.display_size = ( supervisor.runtime.display.width, supervisor.runtime.display.height, @@ -231,8 +228,6 @@ def __init__( # noqa: PLR0913, too many args self.tilegrid.x, self.tilegrid.y = ( x // 2 for x in self.display_size ) # center cursor in display - else: - self.tilegrid.x, self.tilegrid.y = 0 else: self._x, self._y = 0, 0 From 11f463ad4055dccb0456d780ab97a21afbb525f6 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Tue, 10 Feb 2026 15:46:40 -0600 Subject: [PATCH 3/4] Add ruff exception --- adafruit_usb_host_mouse/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_usb_host_mouse/__init__.py b/adafruit_usb_host_mouse/__init__.py index 389cbcc..d9f28f3 100644 --- a/adafruit_usb_host_mouse/__init__.py +++ b/adafruit_usb_host_mouse/__init__.py @@ -217,7 +217,7 @@ def __init__( # noqa: PLR0913, too many args if tilegrid is not None: try: - import supervisor + import supervisor # noqa: PLC0415 except ImportError: self.tilegrid.x, self.tilegrid.y = 0 else: From a35f3a17e511ab20a622ab78eefd3c81099f2426 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Wed, 11 Feb 2026 10:17:03 -0600 Subject: [PATCH 4/4] Use `adafruit_imageload` instead of `displayio.OnDiskBitmap` --- adafruit_usb_host_mouse/__init__.py | 16 +++++++++++----- requirements.txt | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/adafruit_usb_host_mouse/__init__.py b/adafruit_usb_host_mouse/__init__.py index d9f28f3..dc578d7 100644 --- a/adafruit_usb_host_mouse/__init__.py +++ b/adafruit_usb_host_mouse/__init__.py @@ -32,9 +32,10 @@ import array from traceback import print_exception +import adafruit_imageload import adafruit_usb_host_descriptors import usb -from displayio import OnDiskBitmap, TileGrid +from displayio import Bitmap, Palette, TileGrid __version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_USB_Host_Mouse.git" @@ -119,13 +120,15 @@ def find_and_init_mouse(cursor_image=DEFAULT_CURSOR, subclass=SUBCLASS_BOOT): # load the mouse cursor bitmap mouse_tg = None if isinstance(cursor_image, str): - mouse_bmp = OnDiskBitmap(cursor_image) + mouse_bmp, mouse_palette = adafruit_imageload.load( + cursor_image, bitmap=Bitmap, palette=Palette + ) # make the background pink pixels transparent - mouse_bmp.pixel_shader.make_transparent(0) + mouse_palette.make_transparent(0) # create a TileGrid for the mouse, using its bitmap and pixel_shader - mouse_tg = TileGrid(mouse_bmp, pixel_shader=mouse_bmp.pixel_shader) + mouse_tg = TileGrid(mouse_bmp, pixel_shader=mouse_palette) return ( (mouse_device, mouse_interface_index, mouse_endpoint_address, mouse_was_attached), @@ -268,7 +271,10 @@ def release(self): # an empty list if no interfaces were detached for intf in self.was_attached: if not self.device.is_kernel_driver_active(intf): - self.device.attach_kernel_driver(intf) + try: + self.device.attach_kernel_driver(intf) + except usb.core.USBError: + pass def update(self): """ diff --git a/requirements.txt b/requirements.txt index 2a43f3e..0fa11be 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ # SPDX-License-Identifier: MIT Adafruit-Blinka +adafruit-circuitpython-imageload adafruit-circuitpython-usb-host-descriptors