Port the mouse_demo kitten to Go

This commit is contained in:
Kovid Goyal 2023-10-17 20:21:22 +05:30
parent c03dff2322
commit ee8399ba56
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
5 changed files with 77 additions and 80 deletions

View File

@ -0,0 +1,66 @@
// License: GPLv3 Copyright: 2023, Kovid Goyal, <kovid at kovidgoyal.net>
package mouse_demo
import (
"fmt"
"kitty/tools/tui/loop"
)
var _ = fmt.Print
func Run(args []string) (rc int, err error) {
lp, err := loop.New()
if err != nil {
return 1, err
}
lp.MouseTrackingMode(loop.FULL_MOUSE_TRACKING)
var current_mouse_event *loop.MouseEvent
draw_screen := func() {
lp.StartAtomicUpdate()
defer lp.EndAtomicUpdate()
if current_mouse_event == nil {
lp.Println(`Move the mouse or click to see mouse events`)
return
}
lp.ClearScreen()
lp.Printf("Position: %d, %d (pixels)\r\n", current_mouse_event.Pixel.X, current_mouse_event.Pixel.Y)
lp.Printf("Cell : %d, %d\r\n", current_mouse_event.Cell.X, current_mouse_event.Cell.Y)
lp.Printf("Type : %s\r\n", current_mouse_event.Event_type)
if current_mouse_event.Buttons != loop.NO_MOUSE_BUTTON {
lp.Println(current_mouse_event.Buttons.String())
}
if mods := current_mouse_event.Mods.String(); mods != "" {
lp.Printf("Modifiers: %s\r\n", mods)
}
}
lp.OnInitialize = func() (string, error) {
lp.SetCursorVisible(false)
draw_screen()
return "", nil
}
lp.OnFinalize = func() string {
lp.SetCursorVisible(true)
return ""
}
lp.OnMouseEvent = func(ev *loop.MouseEvent) error {
current_mouse_event = ev
draw_screen()
return nil
}
lp.OnKeyEvent = func(ev *loop.KeyEvent) error {
if ev.MatchesPressOrRepeat("esc") || ev.MatchesPressOrRepeat("ctrl+c") {
lp.Quit(0)
}
return nil
}
err = lp.Run()
if err != nil {
rc = 1
}
return
}

View File

@ -1,79 +0,0 @@
#!/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)

View File

@ -133,7 +133,7 @@ def run_kitten(kitten: str, run_name: str = '__main__') -> None:
def all_kitten_names() -> FrozenSet[str]:
ans = []
for name in list_kitty_resources('kittens'):
if '__' not in name and '.' not in name and name != 'tui':
if '__' not in name and '.' not in name and name not in ('tui', 'mouse_demo'):
ans.append(name)
return frozenset(ans)

View File

@ -11,6 +11,7 @@ import (
"kitty/kittens/hints"
"kitty/kittens/hyperlinked_grep"
"kitty/kittens/icat"
"kitty/kittens/mouse_demo"
"kitty/kittens/show_key"
"kitty/kittens/ssh"
"kitty/kittens/themes"
@ -50,6 +51,15 @@ func KittyToolEntryPoints(root *cli.Command) {
unicode_input.EntryPoint(root)
// show_key
show_key.EntryPoint(root)
// mouse_demo
root.AddSubCommand(&cli.Command{
Name: "mouse_demo",
ShortDescription: "Demo the mouse handling kitty implements for terminal programs",
OnlyArgsAllowed: true,
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
return mouse_demo.Run(args)
},
})
// hyperlinked_grep
hyperlinked_grep.EntryPoint(root)
// ask