Moved tmux pane logic into State objects
This commit is contained in:
parent
0182777f56
commit
d1f8307153
2 changed files with 147 additions and 150 deletions
|
|
@ -360,6 +360,93 @@ class RecoveryState():
|
|||
min_percent = min(min_percent, b_p.rescued_percent)
|
||||
return min_percent
|
||||
|
||||
def fix_tmux_panes(self, forced=False):
|
||||
"""Fix pane sizes if the winodw has been resized."""
|
||||
needs_fixed = False
|
||||
|
||||
# Check layout
|
||||
for k, v in TMUX_LAYOUT.items():
|
||||
if not v.get('Check'):
|
||||
# Not concerned with the size of this pane
|
||||
continue
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in self.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = self.panes[k]
|
||||
|
||||
# Check pane size
|
||||
x, y = tmux_get_pane_size(pane_id=target)
|
||||
if v.get('x', False) and v['x'] != x:
|
||||
needs_fixed = True
|
||||
if v.get('y', False) and v['y'] != y:
|
||||
needs_fixed = True
|
||||
|
||||
# Bail?
|
||||
if not needs_fixed and not forced:
|
||||
return
|
||||
|
||||
# Remove Destination pane (temporarily)
|
||||
tmux_kill_pane(self.panes['Destination'])
|
||||
|
||||
# Update layout
|
||||
for k, v in TMUX_LAYOUT.items():
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in self.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = self.panes[k]
|
||||
|
||||
# Resize pane
|
||||
tmux_resize_pane(pane_id=target, **v)
|
||||
|
||||
# Calc Source/Destination pane sizes
|
||||
width, height = tmux_get_pane_size()
|
||||
width = int(width / 2) - 1
|
||||
|
||||
# Update Source string
|
||||
source_str = self.source.name
|
||||
if len(source_str) > width:
|
||||
source_str = '{}...'.format(source_str[:width-3])
|
||||
|
||||
# Update Destination string
|
||||
dest_str = self.dest.name
|
||||
if len(dest_str) > width:
|
||||
if self.mode == 'clone':
|
||||
dest_str = '{}...'.format(dest_str[:width-3])
|
||||
else:
|
||||
dest_str = '...{}'.format(dest_str[-width+3:])
|
||||
|
||||
# Rebuild Source/Destination panes
|
||||
tmux_update_pane(
|
||||
pane_id=self.panes['Source'],
|
||||
text='{BLUE}Source{CLEAR}\n{s}'.format(
|
||||
s=source_str, **COLORS))
|
||||
self.panes['Destination'] = tmux_split_window(
|
||||
percent=50, target_pane=self.panes['Source'],
|
||||
text='{BLUE}Destination{CLEAR}\n{s}'.format(
|
||||
s=dest_str, **COLORS))
|
||||
|
||||
if 'SMART' in self.panes:
|
||||
# Calc SMART/ddrescue/Journal panes sizes
|
||||
ratio = [12, 22, 4]
|
||||
width, height = tmux_get_pane_size(pane_id=self.panes['Progress'])
|
||||
height -= 2
|
||||
total = sum(ratio)
|
||||
p_ratio = [int((x/total) * height) for x in ratio]
|
||||
p_ratio[1] = height - p_ratio[0] - p_ratio[2]
|
||||
|
||||
# Resize SMART/Journal panes
|
||||
tmux_resize_pane(self.panes['SMART'], y=ratio[0])
|
||||
tmux_resize_pane(y=ratio[1])
|
||||
tmux_resize_pane(self.panes['Journal'], y=ratio[2])
|
||||
|
||||
def get_smart_source(self):
|
||||
"""Get source for SMART dispay."""
|
||||
disk_path = self.source.path
|
||||
|
|
@ -537,94 +624,6 @@ def double_confirm_clone():
|
|||
return ask('Asking again to confirm, is this correct?')
|
||||
|
||||
|
||||
def fix_tmux_panes(state, forced=False):
|
||||
"""Fix pane sizes if the winodw has been resized."""
|
||||
needs_fixed = False
|
||||
|
||||
# Check layout
|
||||
for k, v in TMUX_LAYOUT.items():
|
||||
if not v.get('Check'):
|
||||
# Not concerned with the size of this pane
|
||||
continue
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in state.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = state.panes[k]
|
||||
|
||||
# Check pane size
|
||||
x, y = tmux_get_pane_size(pane_id=target)
|
||||
if v.get('x', False) and v['x'] != x:
|
||||
needs_fixed = True
|
||||
if v.get('y', False) and v['y'] != y:
|
||||
needs_fixed = True
|
||||
|
||||
# Bail?
|
||||
if not needs_fixed and not forced:
|
||||
return
|
||||
|
||||
# Remove Destination pane (temporarily)
|
||||
tmux_kill_pane(state.panes['Destination'])
|
||||
|
||||
# Update layout
|
||||
for k, v in TMUX_LAYOUT.items():
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in state.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = state.panes[k]
|
||||
|
||||
# Resize pane
|
||||
tmux_resize_pane(pane_id=target, **v)
|
||||
|
||||
# Calc Source/Destination pane sizes
|
||||
width, height = tmux_get_pane_size()
|
||||
width = int(width / 2) - 1
|
||||
|
||||
# Update Source string
|
||||
source_str = state.source.name
|
||||
if len(source_str) > width:
|
||||
source_str = '{}...'.format(source_str[:width-3])
|
||||
|
||||
# Update Destination string
|
||||
dest_str = state.dest.name
|
||||
if len(dest_str) > width:
|
||||
if state.mode == 'clone':
|
||||
dest_str = '{}...'.format(dest_str[:width-3])
|
||||
else:
|
||||
dest_str = '...{}'.format(dest_str[-width+3:])
|
||||
|
||||
# Rebuild Source/Destination panes
|
||||
tmux_update_pane(
|
||||
pane_id=state.panes['Source'],
|
||||
text='{BLUE}Source{CLEAR}\n{s}'.format(
|
||||
s=source_str, **COLORS))
|
||||
state.panes['Destination'] = tmux_split_window(
|
||||
percent=50, target_pane=state.panes['Source'],
|
||||
text='{BLUE}Destination{CLEAR}\n{s}'.format(
|
||||
s=dest_str, **COLORS))
|
||||
|
||||
if 'SMART' in state.panes:
|
||||
# Calc SMART/ddrescue/Journal panes sizes
|
||||
ratio = [12, 22, 4]
|
||||
width, height = tmux_get_pane_size(pane_id=state.panes['Progress'])
|
||||
height -= 2
|
||||
total = sum(ratio)
|
||||
p_ratio = [int((x/total) * height) for x in ratio]
|
||||
p_ratio[1] = height - p_ratio[0] - p_ratio[2]
|
||||
|
||||
# Resize SMART/Journal panes
|
||||
tmux_resize_pane(state.panes['SMART'], y=ratio[0])
|
||||
tmux_resize_pane(y=ratio[1])
|
||||
tmux_resize_pane(state.panes['Journal'], y=ratio[2])
|
||||
|
||||
|
||||
def get_device_details(dev_path):
|
||||
"""Get device details via lsblk, returns JSON dict."""
|
||||
cmd = ['lsblk', '--json', '--output-all', '--paths', dev_path]
|
||||
|
|
@ -816,7 +815,7 @@ def menu_ddrescue(source_path, dest_path, run_mode):
|
|||
|
||||
# Main menu
|
||||
state.build_outer_panes()
|
||||
fix_tmux_panes(state, forced=True)
|
||||
state.fix_tmux_panes(forced=True)
|
||||
menu_main(state)
|
||||
|
||||
# Done
|
||||
|
|
@ -1032,7 +1031,7 @@ def run_ddrescue(state, pass_settings):
|
|||
command=['sudo', 'journalctl', '-f'])
|
||||
|
||||
# Fix layout
|
||||
fix_tmux_panes(state, forced=True)
|
||||
state.fix_tmux_panes(forced=True)
|
||||
|
||||
# Run pass for each block-pair
|
||||
for b_p in state.block_pairs:
|
||||
|
|
@ -1078,7 +1077,7 @@ def run_ddrescue(state, pass_settings):
|
|||
update_sidepane(state)
|
||||
|
||||
# Fix panes
|
||||
fix_tmux_panes(state)
|
||||
state.fix_tmux_panes()
|
||||
|
||||
# Check if ddrescue has finished
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -558,6 +558,62 @@ class State():
|
|||
lines=SIDE_PANE_WIDTH,
|
||||
watch=self.progress_out)
|
||||
|
||||
def fix_tmux_panes(self):
|
||||
"""Fix pane sizes if the window has been resized."""
|
||||
needs_fixed = False
|
||||
|
||||
# Bail?
|
||||
if not self.panes:
|
||||
return
|
||||
|
||||
# Check layout
|
||||
for k, v in self.tmux_layout.items():
|
||||
if not v.get('Check'):
|
||||
# Not concerned with the size of this pane
|
||||
continue
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in self.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = self.panes[k]
|
||||
|
||||
# Check pane size
|
||||
x, y = tmux_get_pane_size(pane_id=target)
|
||||
if v.get('x', False) and v['x'] != x:
|
||||
needs_fixed = True
|
||||
if v.get('y', False) and v['y'] != y:
|
||||
needs_fixed = True
|
||||
|
||||
# Bail?
|
||||
if not needs_fixed:
|
||||
return
|
||||
|
||||
# Update layout
|
||||
for k, v in self.tmux_layout.items():
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in self.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = self.panes[k]
|
||||
|
||||
# Resize pane
|
||||
tmux_resize_pane(pane_id=target, **v)
|
||||
|
||||
def fix_tmux_panes_loop(self):
|
||||
while True:
|
||||
try:
|
||||
self.fix_tmux_panes()
|
||||
sleep(1)
|
||||
except RuntimeError:
|
||||
# Assuming layout definitions changes mid-run, ignoring
|
||||
pass
|
||||
|
||||
def init(self):
|
||||
"""Remove test objects, set log, and add devices."""
|
||||
self.disks = []
|
||||
|
|
@ -603,7 +659,7 @@ class State():
|
|||
|
||||
# Start tmux thread
|
||||
self.tmux_layout = TMUX_LAYOUT.copy()
|
||||
start_thread(fix_tmux_panes_loop, args=[self])
|
||||
start_thread(self.fix_tmux_panes_loop)
|
||||
|
||||
def set_top_pane_text(self, text):
|
||||
"""Set top pane text using TOP_PANE_TEXT and provided text."""
|
||||
|
|
@ -663,64 +719,6 @@ def build_status_string(label, status, info_label=False):
|
|||
**COLORS)
|
||||
|
||||
|
||||
def fix_tmux_panes_loop(state):
|
||||
while True:
|
||||
try:
|
||||
fix_tmux_panes(state)
|
||||
sleep(1)
|
||||
except RuntimeError:
|
||||
# Assuming layout definitions changes mid-run, ignoring
|
||||
pass
|
||||
|
||||
|
||||
def fix_tmux_panes(state):
|
||||
"""Fix pane sizes if the window has been resized."""
|
||||
needs_fixed = False
|
||||
|
||||
# Bail?
|
||||
if not state.panes:
|
||||
return
|
||||
|
||||
# Check layout
|
||||
for k, v in state.tmux_layout.items():
|
||||
if not v.get('Check'):
|
||||
# Not concerned with the size of this pane
|
||||
continue
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in state.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = state.panes[k]
|
||||
|
||||
# Check pane size
|
||||
x, y = tmux_get_pane_size(pane_id=target)
|
||||
if v.get('x', False) and v['x'] != x:
|
||||
needs_fixed = True
|
||||
if v.get('y', False) and v['y'] != y:
|
||||
needs_fixed = True
|
||||
|
||||
# Bail?
|
||||
if not needs_fixed:
|
||||
return
|
||||
|
||||
# Update layout
|
||||
for k, v in state.tmux_layout.items():
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in state.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = state.panes[k]
|
||||
|
||||
# Resize pane
|
||||
tmux_resize_pane(pane_id=target, **v)
|
||||
|
||||
|
||||
def generate_horizontal_graph(rates, oneline=False):
|
||||
"""Generate horizontal graph from rates, returns list."""
|
||||
graph = ['', '', '', '']
|
||||
|
|
|
|||
Loading…
Reference in a new issue