80 lines
1.9 KiB
Python
80 lines
1.9 KiB
Python
#!/usr/bin/env python
|
|
# License: GPLv3 Copyright: 2021, Kovid Goyal <kovid at kovidgoyal.net>
|
|
|
|
import sys
|
|
from typing import List, Optional
|
|
|
|
from kitty.key_encoding import ALT, CAPS_LOCK, CTRL, HYPER, META, NUM_LOCK, SHIFT, SUPER
|
|
|
|
from ..tui.handler import Handler
|
|
from ..tui.loop import Loop, MouseEvent
|
|
from ..tui.operations import MouseTracking
|
|
|
|
mod_names = {
|
|
SHIFT: 'Shift',
|
|
ALT: 'Alt',
|
|
CTRL: 'Ctrl',
|
|
SUPER: 'Super',
|
|
HYPER: 'Hyper',
|
|
META: 'Meta',
|
|
NUM_LOCK: 'NumLock',
|
|
CAPS_LOCK: 'CapsLock',
|
|
}
|
|
|
|
|
|
def format_mods(mods: int) -> str:
|
|
if not mods:
|
|
return ''
|
|
lmods = []
|
|
for m, name in mod_names.items():
|
|
if mods & m:
|
|
lmods.append(name)
|
|
return '+'.join(lmods)
|
|
|
|
|
|
class Mouse(Handler):
|
|
mouse_tracking = MouseTracking.full
|
|
|
|
def __init__(self) -> None:
|
|
self.current_mouse_event: Optional[MouseEvent] = None
|
|
|
|
def initialize(self) -> None:
|
|
self.cmd.set_cursor_visible(False)
|
|
self.draw_screen()
|
|
|
|
def finalize(self) -> None:
|
|
self.cmd.set_cursor_visible(True)
|
|
|
|
def on_mouse_event(self, ev: MouseEvent) -> None:
|
|
self.current_mouse_event = ev
|
|
self.draw_screen()
|
|
|
|
@Handler.atomic_update
|
|
def draw_screen(self) -> None:
|
|
self.cmd.clear_screen()
|
|
ev = self.current_mouse_event
|
|
if ev is None:
|
|
self.print('Move the mouse or click to see mouse events')
|
|
return
|
|
self.print(f'Position: {ev.pixel_x}, {ev.pixel_y}')
|
|
self.print(f'Cell: {ev.cell_x}, {ev.cell_y}')
|
|
self.print(f'{ev.type}')
|
|
if ev.buttons:
|
|
self.print(ev.buttons)
|
|
if ev.mods:
|
|
self.print(f'Modifiers: {format_mods(ev.mods)}')
|
|
|
|
def on_interrupt(self) -> None:
|
|
self.quit_loop(0)
|
|
on_eot = on_interrupt
|
|
|
|
|
|
def main(args: List[str]) -> None:
|
|
loop = Loop()
|
|
handler = Mouse()
|
|
loop.loop(handler)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.argv)
|