22import colorsys
33import dataclasses
44import os
5+ import random
56import threading
7+ import time
68from typing import Any , Callable , Dict , KeysView , List , Self , Tuple
79
810import asyncio_for_robotics .ros2 as afor
@@ -27,8 +29,7 @@ def scancode_to_color(scancode):
2729 brightness = 255
2830 r , g , b = colorsys .hsv_to_rgb (
2931 (scancode % 30 ) / 30 , 0.5 , 1
30- ) # HSV: full saturation, full value
31-
32+ )
3233 return int (r * brightness ), int (g * brightness ), int (b * brightness )
3334
3435
@@ -56,23 +57,35 @@ def sdl_thread(
5657 stop_event : threading .Event ,
5758 sub_input : Callable [[Key ], None ] = lambda * _ : None ,
5859):
60+ r , g , b = colorsys .hsv_to_rgb (
61+ random .random (), (random .random () + 1 ) / 2 , 1
62+ )
63+ back_color = int (r * 255 ), int (g * 255 ), int (b * 255 )
64+
5965 sdl2 .ext .init ()
60- window = sdl2 .ext .Window ("Input" , size = (100 , 100 ))
66+ window = sdl2 .ext .Window ("Input" , size = (100 , 100 ), flags = sdl2 .SDL_WINDOW_RESIZABLE )
67+ renderer = sdl2 .ext .Renderer (window )
6168
6269 pkg_share = get_package_share_directory ("keyboard_event" )
70+ surface_icon = sdl2 .ext .load_img (
71+ os .path .join (pkg_share , "icons" , "gogo.png" )
72+ # "/home/elian/Motion-Stack/src/keyboard_event/icons/gogo.png"
73+ )
74+ window .show ()
6375 surface_gogo_calm = sdl2 .ext .load_img (
64- os .path .join (pkg_share , "icons" , "gogo.bmp" )
76+ os .path .join (pkg_share , "icons" , "gogo.png" ),
77+ # "/home/elian/Motion-Stack/src/keyboard_event/icons/gogo.png"
6578 )
6679 surface_gogo_happy = sdl2 .ext .load_img (
67- os .path .join (pkg_share , "icons" , "gogo_happy.bmp" )
80+ os .path .join (pkg_share , "icons" , "gogo_happy.png" )
81+ # "/home/elian/Motion-Stack/src/keyboard_event/icons/gogo_happy.png"
6882 )
6983 surface_gogo_happy2 = sdl2 .ext .load_img (
70- os .path .join (pkg_share , "icons" , "gogo_happy2.bmp" )
84+ os .path .join (pkg_share , "icons" , "gogo_happy2.png" )
85+ # "/home/elian/Motion-Stack/src/keyboard_event/icons/gogo_happy2.png"
7186 )
72- sdl2 .SDL_SetWindowIcon (window .window , surface_gogo_calm )
73- window .show ()
87+ sdl2 .SDL_SetWindowIcon (window .window , surface_icon )
7488
75- renderer = sdl2 .ext .Renderer (window )
7689 texture_gogo_calm = sdl2 .SDL_CreateTextureFromSurface (
7790 renderer .sdlrenderer , surface_gogo_calm
7891 )
@@ -82,16 +95,12 @@ def sdl_thread(
8295 texture_gogo_happy2 = sdl2 .SDL_CreateTextureFromSurface (
8396 renderer .sdlrenderer , surface_gogo_happy2
8497 )
85- sdl2 .SDL_FreeSurface (surface_gogo_calm )
86- sdl2 .SDL_FreeSurface (surface_gogo_happy )
87- sdl2 .SDL_FreeSurface (surface_gogo_happy2 )
8898 dst_rect = sdl2 .SDL_Rect (0 , 0 , 100 , 100 ) # x, y, width, height
8999
90- renderer .color = scancode_to_color ( 0 )
100+ renderer .color = back_color
91101 renderer .clear ()
92102 sdl2 .SDL_RenderCopy (renderer .sdlrenderer , texture_gogo_calm , None , dst_rect )
93103 renderer .present ()
94- window .refresh ()
95104
96105 running = True
97106 pressed : Dict [int , Key ] = dict ()
@@ -125,17 +134,28 @@ def finish():
125134 k = Key .from_sdl (e .key )
126135 asyncio_loop .call_soon_threadsafe (sub_input , k )
127136 del pressed [k .code ]
137+
138+ elif e .type in [
139+ sdl2 .SDL_WINDOWEVENT ,
140+ ]:
141+ if e .window .event in [
142+ sdl2 .SDL_WINDOWEVENT_SIZE_CHANGED ,
143+ sdl2 .SDL_WINDOWEVENT_RESIZED ,
144+ ]:
145+ pass # continues to update the window to new size
146+ else :
147+ continue # does nothing
128148 else :
129- continue
149+ continue # does nothing
130150
131151 renderer .color = (
132152 scancode_to_color (list (pressed .keys ())[- 1 ])
133153 if len (pressed ) > 0
134- else scancode_to_color ( 0 )
154+ else back_color
135155 )
136156 renderer .clear ()
137157 if len (pressed ) > 0 :
138- cycle = (cycle + 1 )% len (texture_cycle )
158+ cycle = (cycle + 1 ) % len (texture_cycle )
139159 sdl2 .SDL_RenderCopy (
140160 renderer .sdlrenderer , texture_cycle [cycle ], None , dst_rect
141161 )
@@ -145,7 +165,6 @@ def finish():
145165 )
146166 renderer .present ()
147167
148- window .refresh ()
149168 return 0
150169
151170
0 commit comments