Skip to content

Commit 508ca70

Browse files
committed
Fix #8998
1 parent f85085a commit 508ca70

File tree

4 files changed

+28
-15
lines changed

4 files changed

+28
-15
lines changed

kittens/panel/main.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,11 @@ def panel_kitten_options_spec() -> str:
4545
ans: str = getattr(panel_kitten_options_spec, 'ans')
4646
return ans
4747

48-
def parse_panel_args(args: list[str]) -> tuple[PanelCLIOptions, list[str]]:
49-
return parse_args(args, panel_kitten_options_spec, usage, help_text, 'kitty +kitten panel', result_class=PanelCLIOptions)
48+
49+
def parse_panel_args(args: list[str], track_seen_options: set[str] | None = None) -> tuple[PanelCLIOptions, list[str]]:
50+
return parse_args(
51+
args, panel_kitten_options_spec, usage, help_text, 'kitty +kitten panel',
52+
result_class=PanelCLIOptions, track_seen_options=track_seen_options)
5053

5154

5255
def dual_distance(spec: str, min_cell_value_if_no_pixels: int = 0) -> tuple[int, int]:

kitty/cli.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -591,28 +591,37 @@ def handle_version(self) -> NoReturn:
591591
PreparsedCLIFlags = tuple[dict[str, tuple[Any, bool]], list[str]]
592592

593593

594-
def apply_preparsed_cli_flags(preparsed_from_c: PreparsedCLIFlags, ans: Any, create_oc: Callable[[], Options]) -> list[str]:
594+
def apply_preparsed_cli_flags(
595+
preparsed_from_c: PreparsedCLIFlags, ans: Any, create_oc: Callable[[], Options],
596+
track_seen_options: set[str] | None = None
597+
) -> list[str]:
595598
for key, (val, is_seen) in preparsed_from_c[0].items():
596599
if key == 'help' and is_seen and val:
597600
create_oc().handle_help()
598601
elif key == 'version' and is_seen and val:
599602
create_oc().handle_version()
603+
if is_seen and track_seen_options is not None:
604+
track_seen_options.add(key)
600605
setattr(ans, key, val)
601606
return preparsed_from_c[1]
602607

603608

604609
def parse_cmdline_inner(
605-
args: list[str], oc: Options, disabled: OptionSpecSeq, names_map: dict[str, OptionDict], values_map: dict[str, OptionDict], ans: Any
610+
args: list[str], oc: Options, disabled: OptionSpecSeq, names_map: dict[str, OptionDict],
611+
values_map: dict[str, OptionDict], ans: Any, track_seen_options: set[str] | None = None
606612
) -> list[str]:
607613
preparsed = parse_cli_from_spec(args, names_map, values_map)
608-
leftover_args = apply_preparsed_cli_flags(preparsed, ans, lambda: oc)
614+
leftover_args = apply_preparsed_cli_flags(preparsed, ans, lambda: oc, track_seen_options)
609615
for opt in disabled:
610616
if not isinstance(opt, str):
611617
setattr(ans, opt['dest'], defval_for_opt(opt))
612618
return leftover_args
613619

614620

615-
def parse_cmdline(oc: Options, disabled: OptionSpecSeq, ans: Any, args: list[str] | None = None) -> list[str]:
621+
def parse_cmdline(
622+
oc: Options, disabled: OptionSpecSeq, ans: Any, args: list[str] | None = None,
623+
track_seen_options: set[str] | None = None
624+
) -> list[str]:
616625
names_map = oc.names_map.copy()
617626
values_map = oc.values_map.copy()
618627
if 'help' not in names_map:
@@ -622,7 +631,7 @@ def parse_cmdline(oc: Options, disabled: OptionSpecSeq, ans: Any, args: list[str
622631
names_map['version'] = {'type': 'bool-set', 'aliases': ('--version', '-v')} # type: ignore
623632
values_map['version'] = False
624633
try:
625-
return parse_cmdline_inner(sys.argv[1:] if args is None else args, oc, disabled, names_map, values_map, ans)
634+
return parse_cmdline_inner(sys.argv[1:] if args is None else args, oc, disabled, names_map, values_map, ans, track_seen_options)
626635
except Exception as e:
627636
raise SystemExit(str(e))
628637

@@ -668,6 +677,7 @@ def parse_args(
668677
appname: str | None = None,
669678
result_class: type[T] | None = None,
670679
preparsed_from_c: PreparsedCLIFlags | None = None,
680+
track_seen_options: set[str] | None = None,
671681
) -> tuple[T, list[str]]:
672682
if result_class is not None:
673683
ans = result_class()
@@ -685,7 +695,7 @@ def create_oc() -> Options:
685695
options = parse_option_spec(ospec())
686696
seq, disabled = options
687697
oc = Options(seq, usage, message, appname)
688-
return ans, parse_cmdline(oc, disabled, ans, args=args)
698+
return ans, parse_cmdline(oc, disabled, ans, args=args, track_seen_options=track_seen_options)
689699

690700

691701
SYSTEM_CONF = f'/etc/xdg/{appname}/{appname}.conf'

kitty/launch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,11 +443,11 @@ def get_env(opts: LaunchCLIOptions, active_child: Child | None = None, base_env:
443443
return env
444444

445445

446-
def layer_shell_config_from_panel_opts(panel_opts: Iterable[str]) -> LayerShellConfig:
446+
def layer_shell_config_from_panel_opts(panel_opts: Iterable[str], track_seen_options: set[str] | None = None) -> LayerShellConfig:
447447
from kittens.panel.main import layer_shell_config, parse_panel_args
448448
args = [('' if x.startswith('--') else '--') + x for x in panel_opts]
449449
try:
450-
opts, _ = parse_panel_args(args)
450+
opts, _ = parse_panel_args(args, track_seen_options=track_seen_options)
451451
except SystemExit as e:
452452
raise ValueError(str(e))
453453
return layer_shell_config(opts)

kitty/rc/resize_os_window.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,22 +119,22 @@ def response_from_kitty(self, boss: Boss, window: Window | None, payload_get: Pa
119119
if not panels:
120120
raise RemoteControlErrorWithoutTraceback('Must specify at least one panel setting')
121121
from kitty.launch import layer_shell_config_from_panel_opts
122+
seen_options: set[str] = set()
122123
try:
123-
lsc = layer_shell_config_from_panel_opts(panels)
124+
lsc = layer_shell_config_from_panel_opts(panels, track_seen_options=seen_options)
124125
except Exception as e:
125126
raise RemoteControlErrorWithoutTraceback(
126127
f'Invalid panel options specified: {e}')
127128
if payload_get('incremental'):
128-
defaults = layer_shell_config_from_panel_opts(())
129-
changed_fields = {f for f in lsc._fields if getattr(lsc, f) != getattr(defaults, f)}
130129
existing = layer_shell_config_for_os_window(os_window_id)
131130
if existing is None:
132131
raise RemoteControlErrorWithoutTraceback(
133132
f'The OS Window {os_window_id} has no panel configuration')
133+
defaults = layer_shell_config_from_panel_opts(())
134134
replacements = {}
135135
for x in lsc._fields:
136-
if x not in changed_fields:
137-
replacements[x] = existing[x]
136+
if x not in seen_options:
137+
replacements[x] = getattr(defaults, x)
138138
lsc = lsc._replace(**replacements)
139139
if not set_layer_shell_config(os_window_id, lsc):
140140
raise RemoteControlErrorWithoutTraceback(f'Failed to change panel configuration for OS Window {os_window_id}')

0 commit comments

Comments
 (0)