Centralize definition of file transfer OSC code

This commit is contained in:
Kovid Goyal 2021-09-08 13:43:59 +05:30
parent 745e97e0ab
commit 8aacf30f19
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
8 changed files with 35 additions and 10 deletions

View File

@ -222,8 +222,16 @@ def files_for_send(cli_opts: TransferCLIOptions, args: List[str]) -> Tuple[File,
return tuple(files) return tuple(files)
class SendManager:
def __init__(self, files: Tuple[File, ...]):
self.files = files
def send_main(cli_opts: TransferCLIOptions, args: List[str]) -> None: def send_main(cli_opts: TransferCLIOptions, args: List[str]) -> None:
pass print('Scanning files…')
files = files_for_send(cli_opts, args)
print(f'Found {len(files)} files and directories, requesting transfer permission…')
def parse_transfer_args(args: List[str]) -> Tuple[TransferCLIOptions, List[str]]: def parse_transfer_args(args: List[str]) -> Tuple[TransferCLIOptions, List[str]]:

View File

@ -5,7 +5,7 @@
from types import TracebackType from types import TracebackType
from typing import ( from typing import (
Any, Callable, ContextManager, Dict, Optional, Sequence, Type, Union Any, Callable, ContextManager, Dict, Optional, Sequence, Type, Union, TYPE_CHECKING
) )
from kitty.types import ParsedShortcut from kitty.types import ParsedShortcut
@ -17,6 +17,10 @@ from kitty.typing import (
from .operations import pending_update from .operations import pending_update
if TYPE_CHECKING:
from kitty.file_transmission import FileTransmissionCommand
class Handler: class Handler:
image_manager_class: Optional[Type[ImageManagerType]] = None image_manager_class: Optional[Type[ImageManagerType]] = None
@ -118,6 +122,9 @@ class Handler:
def on_clipboard_response(self, text: str, from_primary: bool = False) -> None: def on_clipboard_response(self, text: str, from_primary: bool = False) -> None:
pass pass
def on_file_transfer_response(self, ftc: 'FileTransmissionCommand') -> None:
pass
def on_capability_response(self, name: str, val: str) -> None: def on_capability_response(self, name: str, val: str) -> None:
pass pass

View File

@ -17,7 +17,8 @@ from typing import Any, Callable, Dict, Generator, List, NamedTuple, Optional
from kitty.constants import is_macos from kitty.constants import is_macos
from kitty.fast_data_types import ( from kitty.fast_data_types import (
close_tty, normal_tty, open_tty, parse_input_from_terminal, raw_tty FILE_TRANSFER_CODE, close_tty, normal_tty, open_tty,
parse_input_from_terminal, raw_tty
) )
from kitty.key_encoding import ( from kitty.key_encoding import (
ALT, CTRL, PRESS, RELEASE, REPEAT, SHIFT, backspace_key, decode_key_event, ALT, CTRL, PRESS, RELEASE, REPEAT, SHIFT, backspace_key, decode_key_event,
@ -308,15 +309,18 @@ class Loop:
pass pass
def _on_osc(self, osc: str) -> None: def _on_osc(self, osc: str) -> None:
m = re.match(r'(\d+);', osc) parts = osc.split(';', 1)
if m is not None: if len(parts) == 2 and parts[0].isdigit():
code = int(m.group(1)) code = int(parts[0])
rest = osc[m.end():] rest = parts[1]
if code == 52: if code == 52:
where, rest = rest.partition(';')[::2] where, rest = rest.split(';', 1)
from_primary = 'p' in where from_primary = 'p' in where
from base64 import standard_b64decode from base64 import standard_b64decode
self.handler.on_clipboard_response(standard_b64decode(rest).decode('utf-8'), from_primary) self.handler.on_clipboard_response(standard_b64decode(rest).decode('utf-8'), from_primary)
elif code == FILE_TRANSFER_CODE:
from kitty.file_transmission import FileTransmissionCommand
self.handler.on_file_transfer_response(FileTransmissionCommand.deserialize(rest))
def _on_apc(self, apc: str) -> None: def _on_apc(self, apc: str) -> None:
if apc.startswith('G'): if apc.startswith('G'):

View File

@ -238,3 +238,6 @@
// Change cursor shape/blink // Change cursor shape/blink
#define DECSCUSR 'q' #define DECSCUSR 'q'
// File transfer OSC number
# define FILE_TRANSFER_CODE 5113

View File

@ -316,6 +316,7 @@ PyInit_fast_data_types(void) {
PyModule_AddIntMacro(m, DCS); PyModule_AddIntMacro(m, DCS);
PyModule_AddIntMacro(m, APC); PyModule_AddIntMacro(m, APC);
PyModule_AddIntMacro(m, OSC); PyModule_AddIntMacro(m, OSC);
PyModule_AddIntMacro(m, FILE_TRANSFER_CODE);
return m; return m;
} }

View File

@ -256,6 +256,7 @@ GRAPHICS_PROGRAM: int
MARK: int MARK: int
MARK_MASK: int MARK_MASK: int
OSC: int OSC: int
FILE_TRANSFER_CODE: int
REVERSE: int REVERSE: int
SCROLL_FULL: int SCROLL_FULL: int
SCROLL_LINE: int SCROLL_LINE: int

View File

@ -16,7 +16,7 @@ from gettext import gettext as _
from time import monotonic from time import monotonic
from typing import IO, Any, Callable, Deque, Dict, List, Optional, Tuple, Union from typing import IO, Any, Callable, Deque, Dict, List, Optional, Tuple, Union
from kitty.fast_data_types import OSC, add_timer, get_boss from kitty.fast_data_types import FILE_TRANSFER_CODE, OSC, add_timer, get_boss
from .utils import log_error, sanitize_control_codes from .utils import log_error, sanitize_control_codes
@ -485,6 +485,7 @@ class FileTransmission:
boss = get_boss() boss = get_boss()
window = boss.window_id_map.get(self.window_id) window = boss.window_id_map.get(self.window_id)
if window is not None: if window is not None:
payload = f'{FILE_TRANSFER_CODE};{payload}'
queued = window.screen.send_escape_code_to_child(OSC, payload) queued = window.screen.send_escape_code_to_child(OSC, payload)
if not queued: if not queued:
if appendleft: if appendleft:

View File

@ -445,7 +445,7 @@ dispatch_osc(Screen *screen, PyObject DUMP_UNUSED *dump_callback) {
START_DISPATCH START_DISPATCH
DISPATCH_OSC(shell_prompt_marking); DISPATCH_OSC(shell_prompt_marking);
END_DISPATCH END_DISPATCH
case 5113: case FILE_TRANSFER_CODE:
START_DISPATCH START_DISPATCH
DISPATCH_OSC(file_transmission); DISPATCH_OSC(file_transmission);
END_DISPATCH END_DISPATCH