Merge branch 'placement-strategies' of https://github.com/jwueller/kitty

This commit is contained in:
Kovid Goyal 2024-05-08 21:16:02 +05:30
commit 990bc22577
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
5 changed files with 31 additions and 17 deletions

View file

@ -50,7 +50,8 @@ class NeighborsMap(TypedDict):
class LayoutGlobalData:
draw_minimal_borders: bool = True
draw_active_borders: bool = True
align_top_left: bool = False
alignment_x: int = 0
alignment_y: int = 0
central: Region = Region((0, 0, 199, 199, 200, 200))
cell_width: int = 20
@ -70,7 +71,8 @@ def idx_for_id(win_id: int, windows: Iterable[WindowType]) -> Optional[int]:
def set_layout_options(opts: Options) -> None:
lgd.draw_minimal_borders = opts.draw_minimal_borders and sum(opts.window_margin_width) == 0
lgd.draw_active_borders = opts.active_border_color is not None
lgd.align_top_left = opts.placement_strategy == 'top-left'
lgd.alignment_x = -1 if opts.placement_strategy.endswith('left') else 1 if opts.placement_strategy.endswith('right') else 0
lgd.alignment_y = -1 if opts.placement_strategy.startswith('top') else 1 if opts.placement_strategy.startswith('bottom') else 0
def convert_bias_map(bias: Dict[int, float], number_of_windows: int, number_of_cells: int) -> Sequence[float]:
@ -107,7 +109,7 @@ def calculate_cells_map(
def layout_dimension(
start_at: int, length: int, cell_length: int,
decoration_pairs: DecorationPairs,
left_align: bool = False,
alignment: int = 0,
bias: Union[None, Sequence[float], Dict[int, float]] = None
) -> LayoutDimension:
number_of_windows = len(decoration_pairs)
@ -122,8 +124,10 @@ def layout_dimension(
assert sum(cells_map) == number_of_cells
extra = length - number_of_cells * cell_length - space_needed_for_decorations
pos = start_at
if not left_align:
pos = start_at # start
if alignment > 0: # end
pos += extra
elif alignment == 0: # center
pos += extra // 2
last_i = len(cells_map) - 1
@ -175,9 +179,14 @@ def window_geometry_from_layouts(x: LayoutData, y: LayoutData) -> WindowGeometry
return window_geometry(x.content_pos, x.cells_per_window, y.content_pos, y.cells_per_window, x.space_before, y.space_before, x.space_after, y.space_after)
def layout_single_window(xdecoration_pairs: DecorationPairs, ydecoration_pairs: DecorationPairs, left_align: bool = False) -> WindowGeometry:
x = next(layout_dimension(lgd.central.left, lgd.central.width, lgd.cell_width, xdecoration_pairs, left_align=lgd.align_top_left))
y = next(layout_dimension(lgd.central.top, lgd.central.height, lgd.cell_height, ydecoration_pairs, left_align=lgd.align_top_left))
def layout_single_window(
xdecoration_pairs: DecorationPairs,
ydecoration_pairs: DecorationPairs,
xalignment: int = 0,
yalignment: int = 0,
) -> WindowGeometry:
x = next(layout_dimension(lgd.central.left, lgd.central.width, lgd.cell_width, xdecoration_pairs, alignment=xalignment))
y = next(layout_dimension(lgd.central.top, lgd.central.height, lgd.cell_height, ydecoration_pairs, alignment=yalignment))
return window_geometry_from_layouts(x, y)
@ -333,7 +342,7 @@ def layout_single_window_group(self, wg: WindowGroup, add_blank_rects: bool = Tr
wg.decoration('top', border_mult=bw, is_single_window=True),
wg.decoration('bottom', border_mult=bw, is_single_window=True),
),)
geom = layout_single_window(xdecoration_pairs, ydecoration_pairs, left_align=lgd.align_top_left)
geom = layout_single_window(xdecoration_pairs, ydecoration_pairs, xalignment=lgd.alignment_x, yalignment=lgd.alignment_y)
wg.set_geometry(geom)
if add_blank_rects and wg:
self.blank_rects.extend(blank_rects_for_window(geom))
@ -355,7 +364,7 @@ def xlayout(
start = lgd.central.left
if size is None:
size = lgd.central.width
return layout_dimension(start, size, lgd.cell_width, decoration_pairs, bias=bias, left_align=lgd.align_top_left)
return layout_dimension(start, size, lgd.cell_width, decoration_pairs, bias=bias, alignment=lgd.alignment_x)
def ylayout(
self,
@ -374,7 +383,7 @@ def ylayout(
start = lgd.central.top
if size is None:
size = lgd.central.height
return layout_dimension(start, size, lgd.cell_height, decoration_pairs, bias=bias, left_align=lgd.align_top_left)
return layout_dimension(start, size, lgd.cell_height, decoration_pairs, bias=bias, alignment=lgd.alignment_y)
def set_window_group_geometry(self, wg: WindowGroup, xl: LayoutData, yl: LayoutData) -> WindowGeometry:
geom = window_geometry_from_layouts(xl, yl)

View file

@ -45,7 +45,7 @@ def column_layout(
bias: Optional[Sequence[float]] = None,
) -> LayoutDimension:
decoration_pairs = tuple(repeat((0, 0), num))
return layout_dimension(lgd.central.left, lgd.central.width, lgd.cell_width, decoration_pairs, bias=bias, left_align=lgd.align_top_left)
return layout_dimension(lgd.central.left, lgd.central.width, lgd.cell_width, decoration_pairs, bias=bias, alignment=lgd.alignment_x)
def row_layout(
self,
@ -53,7 +53,7 @@ def row_layout(
bias: Optional[Sequence[float]] = None,
) -> LayoutDimension:
decoration_pairs = tuple(repeat((0, 0), num))
return layout_dimension(lgd.central.top, lgd.central.height, lgd.cell_height, decoration_pairs, bias=bias, left_align=lgd.align_top_left)
return layout_dimension(lgd.central.top, lgd.central.height, lgd.cell_height, decoration_pairs, bias=bias, alignment=lgd.alignment_y)
def variable_layout(self, layout_func: Callable[..., LayoutDimension], num_windows: int, biased_map: Dict[int, float]) -> LayoutDimension:
return layout_func(num_windows, bias=biased_map if num_windows > 1 else None)
@ -157,8 +157,10 @@ def layout(ld: LayoutData, cell_length: int, before_dec: int, after_dec: int) ->
number_of_cells = content_size // cell_length
cell_area = number_of_cells * cell_length
extra = content_size - cell_area
if extra > 0 and not lgd.align_top_left:
if lgd.alignment_x == 0: # center
before_dec += extra // 2
elif lgd.alignment_x > 0: # end
before_dec += extra
return LayoutData(start + before_dec, number_of_cells, before_dec, size - cell_area - before_dec, cell_area)
def position_window_in_grid_cell(window_idx: int, xl: LayoutData, yl: LayoutData) -> None:

View file

@ -1079,13 +1079,16 @@
)
opt('placement_strategy', 'center',
choices=('center', 'top-left'),
choices=('top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right'),
long_text='''
When the window size is not an exact multiple of the cell size, the cell area of
the terminal window will have some extra padding on the sides. You can control
how that padding is distributed with this option. Using a value of
:code:`center` means the cell area will be placed centrally. A value of
:code:`top-left` means the padding will be only at the bottom and right edges.
The value can be one of: :code:`top-left`, :code:`top`, :code:`top-right`,
:code:`left`, :code:`center`, :code:`right`, :code:`bottom-left`,
:code:`bottom`, :code:`bottom-right`.
'''
)

View file

@ -1135,7 +1135,7 @@ def placement_strategy(self, val: str, ans: typing.Dict[str, typing.Any]) -> Non
raise ValueError(f"The value {val} is not a valid choice for placement_strategy")
ans["placement_strategy"] = val
choices_for_placement_strategy = frozenset(('center', 'top-left'))
choices_for_placement_strategy = frozenset(('top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right'))
def pointer_shape_when_dragging(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
val = val.lower()

View file

@ -23,7 +23,7 @@
choices_for_linux_display_server = typing.Literal['auto', 'wayland', 'x11']
choices_for_macos_colorspace = typing.Literal['srgb', 'default', 'displayp3']
choices_for_macos_show_window_title_in = typing.Literal['all', 'menubar', 'none', 'window']
choices_for_placement_strategy = typing.Literal['center', 'top-left']
choices_for_placement_strategy = typing.Literal['top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right']
choices_for_pointer_shape_when_dragging = choices_for_default_pointer_shape
choices_for_pointer_shape_when_grabbed = choices_for_default_pointer_shape
choices_for_strip_trailing_spaces = typing.Literal['always', 'never', 'smart']