Splits layout: Add a new mappable action to move the active window to the screen edge
Fixes #5643
This commit is contained in:
parent
9d471782dd
commit
f5de08d5fa
@ -38,6 +38,8 @@ Detailed list of changes
|
|||||||
0.26.5 [future]
|
0.26.5 [future]
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
- Splits layout: Add a new mappable action to move the active window to the screen edge (:iss:`5643`)
|
||||||
|
|
||||||
- ssh kitten: Allow using absolute paths for the location of transferred data (:iss:`5607`)
|
- ssh kitten: Allow using absolute paths for the location of transferred data (:iss:`5607`)
|
||||||
|
|
||||||
- Fix a regression in the previous release that caused a :opt:`resize_draw_strategy` of ``static`` to not work (:iss:`5601`)
|
- Fix a regression in the previous release that caused a :opt:`resize_draw_strategy` of ``static`` to not work (:iss:`5601`)
|
||||||
|
|||||||
@ -167,6 +167,12 @@ define a few extra key bindings in :file:`kitty.conf`::
|
|||||||
map shift+right move_window right
|
map shift+right move_window right
|
||||||
map shift+down move_window down
|
map shift+down move_window down
|
||||||
|
|
||||||
|
# Move the active window to the indicated screen edge
|
||||||
|
map ctrl+shift+up layout_action move_to_screen_edge top
|
||||||
|
map ctrl+shift+left layout_action move_to_screen_edge left
|
||||||
|
map ctrl+shift+right layout_action move_to_screen_edge right
|
||||||
|
map ctrl+shift+down layout_action move_to_screen_edge bottom
|
||||||
|
|
||||||
# Switch focus to the neighboring window in the indicated direction
|
# Switch focus to the neighboring window in the indicated direction
|
||||||
map ctrl+left neighboring_window left
|
map ctrl+left neighboring_window left
|
||||||
map ctrl+right neighboring_window right
|
map ctrl+right neighboring_window right
|
||||||
|
|||||||
@ -414,6 +414,16 @@ class Splits(Layout):
|
|||||||
def pairs_root(self, root: Pair) -> None:
|
def pairs_root(self, root: Pair) -> None:
|
||||||
self._pairs_root = root
|
self._pairs_root = root
|
||||||
|
|
||||||
|
def remove_windows(self, *windows_to_remove: int) -> None:
|
||||||
|
root = self.pairs_root
|
||||||
|
for pair in root.self_and_descendants():
|
||||||
|
pair.remove_windows(windows_to_remove)
|
||||||
|
root.collapse_redundant_pairs()
|
||||||
|
if root.one is None or root.two is None:
|
||||||
|
q = root.one or root.two
|
||||||
|
if isinstance(q, Pair):
|
||||||
|
self.pairs_root = q
|
||||||
|
|
||||||
def do_layout(self, all_windows: WindowList) -> None:
|
def do_layout(self, all_windows: WindowList) -> None:
|
||||||
groups = tuple(all_windows.iter_all_layoutable_groups())
|
groups = tuple(all_windows.iter_all_layoutable_groups())
|
||||||
window_count = len(groups)
|
window_count = len(groups)
|
||||||
@ -421,15 +431,8 @@ class Splits(Layout):
|
|||||||
all_present_window_ids = frozenset(w.id for w in groups)
|
all_present_window_ids = frozenset(w.id for w in groups)
|
||||||
already_placed_window_ids = frozenset(root.all_window_ids())
|
already_placed_window_ids = frozenset(root.all_window_ids())
|
||||||
windows_to_remove = already_placed_window_ids - all_present_window_ids
|
windows_to_remove = already_placed_window_ids - all_present_window_ids
|
||||||
|
|
||||||
if windows_to_remove:
|
if windows_to_remove:
|
||||||
for pair in root.self_and_descendants():
|
self.remove_windows(*windows_to_remove)
|
||||||
pair.remove_windows(windows_to_remove)
|
|
||||||
root.collapse_redundant_pairs()
|
|
||||||
if root.one is None or root.two is None:
|
|
||||||
q = root.one or root.two
|
|
||||||
if isinstance(q, Pair):
|
|
||||||
root = self.pairs_root = q
|
|
||||||
id_window_map = {w.id: w for w in groups}
|
id_window_map = {w.id: w for w in groups}
|
||||||
id_idx_map = {w.id: i for i, w in enumerate(groups)}
|
id_idx_map = {w.id: i for i, w in enumerate(groups)}
|
||||||
windows_to_add = all_present_window_ids - already_placed_window_ids
|
windows_to_add = all_present_window_ids - already_placed_window_ids
|
||||||
@ -552,6 +555,23 @@ class Splits(Layout):
|
|||||||
if swap:
|
if swap:
|
||||||
pair.one, pair.two = pair.two, pair.one
|
pair.one, pair.two = pair.two, pair.one
|
||||||
return True
|
return True
|
||||||
|
elif action_name == 'move_to_screen_edge':
|
||||||
|
args = args or ('left',)
|
||||||
|
which = args[0]
|
||||||
|
horizontal = which in ('left', 'right')
|
||||||
|
wg = all_windows.active_group
|
||||||
|
if wg is not None:
|
||||||
|
self.remove_windows(wg.id)
|
||||||
|
new_root = Pair(horizontal)
|
||||||
|
if which in ('left', 'top'):
|
||||||
|
new_root.balanced_add(wg.id)
|
||||||
|
new_root.two = self.pairs_root
|
||||||
|
else:
|
||||||
|
new_root.one = self.pairs_root
|
||||||
|
new_root.two = wg.id
|
||||||
|
self.pairs_root = new_root
|
||||||
|
return True
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def layout_state(self) -> Dict[str, Any]:
|
def layout_state(self) -> Dict[str, Any]:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user