mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-08 21:25:32 +02:00
Refactor previous PR
Move code to incrementally update lsc config into the kitten module do that it is more likely to stay in sync with any future changes to the kitten cli.
This commit is contained in:
@@ -30,7 +30,7 @@ from kitty.fast_data_types import (
|
||||
toggle_os_window_visibility,
|
||||
)
|
||||
from kitty.simple_cli_definitions import panel_options_spec
|
||||
from kitty.types import LayerShellConfig
|
||||
from kitty.types import LayerShellConfig, run_once
|
||||
from kitty.typing_compat import BossType
|
||||
from kitty.utils import log_error
|
||||
|
||||
@@ -95,6 +95,46 @@ def layer_shell_config(opts: PanelCLIOptions) -> LayerShellConfig:
|
||||
output_name=opts.output_name or '')
|
||||
|
||||
|
||||
@run_once
|
||||
def cli_option_to_lsc_configs_map() -> dict[str, tuple[str, ...]]:
|
||||
return {
|
||||
'lines': ('y_size_in_cells', 'y_size_in_pixels'),
|
||||
'columns': ('x_size_in_cells', 'x_size_in_pixels'),
|
||||
'margin_top': ('requested_top_margin',),
|
||||
'margin_left': ('requested_left_margin',),
|
||||
'margin_bottom': ('requested_bottom_margin',),
|
||||
'margin_right': ('requested_right_margin',),
|
||||
'edge': ('edge',),
|
||||
'layer': ('type',),
|
||||
'output_name': ('output_name',),
|
||||
'focus_policy': ('focus_policy',),
|
||||
'exclusive_zone': ('requested_exclusive_zone',),
|
||||
'override_exclusive_zone': ('override_exclusive_zone',),
|
||||
'hide_on_focus_loss': ('hide_on_focus_loss',)
|
||||
}
|
||||
|
||||
|
||||
def incrementally_update_layer_shell_config(existing: dict[str, Any], cli_options: Iterable[str]) -> LayerShellConfig:
|
||||
seen_options: dict[str, Any] = {}
|
||||
try:
|
||||
try:
|
||||
opts, _ = parse_panel_args(list(cli_options), track_seen_options=seen_options)
|
||||
except SystemExit as e:
|
||||
raise ValueError(str(e))
|
||||
lsc = layer_shell_config(opts)
|
||||
except Exception as e:
|
||||
raise ValueError(f'Invalid panel options specified: {e}')
|
||||
lsc_cli_map = cli_option_to_lsc_configs_map()
|
||||
for option in seen_options:
|
||||
for config in lsc_cli_map[option]:
|
||||
existing[config] = getattr(lsc, config)
|
||||
if seen_options.get('edge') == 'background':
|
||||
existing['type'] = GLFW_LAYER_SHELL_BACKGROUND
|
||||
if existing['hide_on_focus_loss']:
|
||||
existing['focus_policy'] = GLFW_FOCUS_ON_DEMAND
|
||||
return LayerShellConfig(**existing)
|
||||
|
||||
|
||||
mtime_map: dict[str, float] = {}
|
||||
|
||||
|
||||
|
||||
@@ -443,11 +443,11 @@ def get_env(opts: LaunchCLIOptions, active_child: Child | None = None, base_env:
|
||||
return env
|
||||
|
||||
|
||||
def layer_shell_config_from_panel_opts(panel_opts: Iterable[str], track_seen_options: dict[str, Any] | None = None) -> LayerShellConfig:
|
||||
def layer_shell_config_from_panel_opts(panel_opts: Iterable[str]) -> LayerShellConfig:
|
||||
from kittens.panel.main import layer_shell_config, parse_panel_args
|
||||
args = [('' if x.startswith('--') else '--') + x for x in panel_opts]
|
||||
try:
|
||||
opts, _ = parse_panel_args(args, track_seen_options=track_seen_options)
|
||||
opts, _ = parse_panel_args(args)
|
||||
except SystemExit as e:
|
||||
raise ValueError(str(e))
|
||||
return layer_shell_config(opts)
|
||||
|
||||
@@ -1,13 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>
|
||||
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from kitty.fast_data_types import (
|
||||
GLFW_FOCUS_ON_DEMAND,
|
||||
GLFW_LAYER_SHELL_BACKGROUND,
|
||||
)
|
||||
from kitty.types import LayerShellConfig
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from .base import (
|
||||
MATCH_WINDOW_OPTION,
|
||||
@@ -124,41 +118,23 @@ using this option means that you will not be notified of failures.
|
||||
f'The OS Window {os_window_id} is not a panel you should not use the --action=resize option to resize it')
|
||||
if not panels:
|
||||
raise RemoteControlErrorWithoutTraceback('Must specify at least one panel setting')
|
||||
from kitty.launch import layer_shell_config_from_panel_opts
|
||||
seen_options: dict[str, Any] = {}
|
||||
try:
|
||||
lsc = layer_shell_config_from_panel_opts(panels, track_seen_options=seen_options)
|
||||
except Exception as e:
|
||||
raise RemoteControlErrorWithoutTraceback(
|
||||
f'Invalid panel options specified: {e}')
|
||||
if payload_get('incremental'):
|
||||
cli_option_to_lsc_configs_map = {
|
||||
'lines': ('y_size_in_cells', 'y_size_in_pixels'),
|
||||
'columns': ('x_size_in_cells', 'x_size_in_pixels'),
|
||||
'margin_top': ('requested_top_margin',),
|
||||
'margin_left': ('requested_left_margin',),
|
||||
'margin_bottom': ('requested_bottom_margin',),
|
||||
'margin_right': ('requested_right_margin',),
|
||||
'edge': ('edge',),
|
||||
'layer': ('type',),
|
||||
'output_name': ('output_name',),
|
||||
'focus_policy': ('focus_policy',),
|
||||
'exclusive_zone': ('requested_exclusive_zone',),
|
||||
'override_exclusive_zone': ('override_exclusive_zone',),
|
||||
'hide_on_focus_loss': ('hide_on_focus_loss',)
|
||||
}
|
||||
existing = layer_shell_config_for_os_window(os_window_id)
|
||||
if existing is None:
|
||||
raise RemoteControlErrorWithoutTraceback(
|
||||
f'The OS Window {os_window_id} has no panel configuration')
|
||||
for option in seen_options:
|
||||
for config in cli_option_to_lsc_configs_map[option]:
|
||||
existing[config] = getattr(lsc, config)
|
||||
if seen_options.get('edge') == 'background':
|
||||
existing['type'] = GLFW_LAYER_SHELL_BACKGROUND
|
||||
if existing['hide_on_focus_loss']:
|
||||
existing['focus_policy'] = GLFW_FOCUS_ON_DEMAND
|
||||
lsc = LayerShellConfig(**existing)
|
||||
from kittens.panel.main import incrementally_update_layer_shell_config
|
||||
try:
|
||||
lsc = incrementally_update_layer_shell_config(existing, panels)
|
||||
except Exception as e:
|
||||
raise RemoteControlErrorWithoutTraceback(str(e))
|
||||
else:
|
||||
from kitty.launch import layer_shell_config_from_panel_opts
|
||||
try:
|
||||
lsc = layer_shell_config_from_panel_opts(panels)
|
||||
except Exception as e:
|
||||
raise RemoteControlErrorWithoutTraceback(
|
||||
f'Invalid panel options specified: {e}')
|
||||
if not set_layer_shell_config(os_window_id, lsc):
|
||||
raise RemoteControlErrorWithoutTraceback(f'Failed to change panel configuration for OS Window {os_window_id}')
|
||||
elif ac == 'toggle-visibility':
|
||||
|
||||
Reference in New Issue
Block a user