use the asyncio loop object rather than the urwid loop almost everywhere
This commit is contained in:
parent
b1fb40507f
commit
cb52ab75a2
|
@ -219,7 +219,7 @@ class IdentityController(BaseController):
|
|||
self.model.add_user(result)
|
||||
login_details_path = '.subiquity/login-details.txt'
|
||||
else:
|
||||
self.loop.draw_screen()
|
||||
self.app.urwid_loop.draw_screen()
|
||||
cp = run_command(
|
||||
["snap", "create-user", "--sudoer", "--json", email])
|
||||
if cp.returncode != 0:
|
||||
|
|
|
@ -69,7 +69,7 @@ class Upload(metaclass=urwid.MetaSignals):
|
|||
cancelled = attr.ib(default=False)
|
||||
|
||||
def start(self):
|
||||
self.pipe_w = self.controller.loop.watch_pipe(self._progress)
|
||||
self.pipe_w = self.controller.app.urwid_loop.watch_pipe(self._progress)
|
||||
|
||||
def _progress(self, x):
|
||||
urwid.emit_signal(self, 'progress')
|
||||
|
@ -81,7 +81,7 @@ class Upload(metaclass=urwid.MetaSignals):
|
|||
os.write(self.pipe_w, b'x')
|
||||
|
||||
def stop(self):
|
||||
self.controller.loop.remove_watch_pipe(self.pipe_w)
|
||||
self.controller.app.urwid_loop.remove_watch_pipe(self.pipe_w)
|
||||
os.close(self.pipe_w)
|
||||
|
||||
|
||||
|
|
|
@ -149,7 +149,7 @@ class ErrorReportStretchy(Stretchy):
|
|||
for n, b in self.btns.items():
|
||||
self.btns[n] = Padding(b, width=w, align='center')
|
||||
|
||||
self.spinner = Spinner(app.loop, style='dots')
|
||||
self.spinner = Spinner(app.aio_loop, style='dots')
|
||||
self.pile = Pile([])
|
||||
self._report_changed()
|
||||
super().__init__("", [self.pile], 0, 0)
|
||||
|
|
|
@ -41,7 +41,7 @@ class SlowProbing(BaseView):
|
|||
|
||||
def __init__(self, controller):
|
||||
self.controller = controller
|
||||
self.spinner = Spinner(loop=controller.loop, style="dots")
|
||||
self.spinner = Spinner(loop=controller.app.aio_loop, style="dots")
|
||||
self.spinner.start()
|
||||
super().__init__(screen(
|
||||
[
|
||||
|
|
|
@ -41,7 +41,7 @@ class MyLineBox(LineBox):
|
|||
class ProgressView(BaseView):
|
||||
def __init__(self, controller):
|
||||
self.controller = controller
|
||||
self.spinner = Spinner(controller.loop)
|
||||
self.spinner = Spinner(controller.app.aio_loop)
|
||||
|
||||
self.reboot_btn = Toggleable(ok_btn(
|
||||
_("Reboot Now"), on_press=self.reboot))
|
||||
|
|
|
@ -285,8 +285,8 @@ class Detector:
|
|||
|
||||
|
||||
class ApplyingConfig(WidgetWrap):
|
||||
def __init__(self, loop):
|
||||
spinner = Spinner(loop, style='dots')
|
||||
def __init__(self, aio_loop):
|
||||
spinner = Spinner(aio_loop, style='dots')
|
||||
spinner.start()
|
||||
text = _("Applying config")
|
||||
# | text |
|
||||
|
@ -465,7 +465,7 @@ class KeyboardView(BaseView):
|
|||
|
||||
def really_done(self, setting):
|
||||
if setting != self.model.setting:
|
||||
ac = ApplyingConfig(self.controller.loop)
|
||||
ac = ApplyingConfig(self.controller.app.aio_loop)
|
||||
self.show_overlay(ac, width=ac.width, min_width=None)
|
||||
self.controller.done(setting)
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ class RefreshView(BaseView):
|
|||
|
||||
def __init__(self, controller):
|
||||
self.controller = controller
|
||||
self.spinner = Spinner(self.controller.loop, style="dots")
|
||||
self.spinner = Spinner(self.controller.app.aio_loop, style="dots")
|
||||
|
||||
if self.controller.check_state == CheckState.UNKNOWN:
|
||||
self.check_state_checking()
|
||||
|
|
|
@ -248,9 +248,9 @@ class SnapInfoView(WidgetWrap):
|
|||
|
||||
class FetchingInfo(WidgetWrap):
|
||||
|
||||
def __init__(self, parent, snap, loop):
|
||||
def __init__(self, parent, snap, aio_loop):
|
||||
self.parent = parent
|
||||
self.spinner = Spinner(loop, style='dots')
|
||||
self.spinner = Spinner(aio_loop, style='dots')
|
||||
self.spinner.start()
|
||||
self.closed = False
|
||||
text = _("Fetching info for {}").format(snap.name)
|
||||
|
@ -342,7 +342,7 @@ class SnapCheckBox(CheckBox):
|
|||
self.loaded()
|
||||
return
|
||||
fi = FetchingInfo(
|
||||
self.parent, self.snap, self.parent.controller.loop)
|
||||
self.parent, self.snap, self.parent.controller.app.aio_loop)
|
||||
self.parent.show_overlay(fi, width=fi.width)
|
||||
schedule_task(self.wait(t, fi))
|
||||
|
||||
|
@ -391,7 +391,7 @@ class SnapListView(BaseView):
|
|||
if t.done():
|
||||
self.loaded()
|
||||
return
|
||||
spinner = Spinner(self.controller.loop, style='dots')
|
||||
spinner = Spinner(self.controller.app.aio_loop, style='dots')
|
||||
spinner.start()
|
||||
self._w = screen(
|
||||
[spinner], [ok_btn(label=_("Continue"), on_press=self.done)],
|
||||
|
|
|
@ -155,7 +155,7 @@ class SSHForm(Form):
|
|||
class FetchingSSHKeys(WidgetWrap):
|
||||
def __init__(self, parent):
|
||||
self.parent = parent
|
||||
spinner = Spinner(parent.controller.loop, style='dots')
|
||||
spinner = Spinner(parent.controller.app.aio_loop, style='dots')
|
||||
spinner.start()
|
||||
text = _("Fetching SSH keys...")
|
||||
button = cancel_btn(label=_("Cancel"), on_press=self.cancel)
|
||||
|
|
|
@ -11,7 +11,8 @@ class IdentityViewTests(unittest.TestCase):
|
|||
|
||||
def make_view(self):
|
||||
controller = mock.create_autospec(spec=InstallProgressController)
|
||||
controller.loop = None
|
||||
controller.app = mock.Mock()
|
||||
controller.app.aio_loop = None
|
||||
return ProgressView(controller)
|
||||
|
||||
def test_initial_focus(self):
|
||||
|
|
|
@ -34,7 +34,6 @@ class BaseController(ABC):
|
|||
self.ui = app.ui
|
||||
self.signal = app.signal
|
||||
self.opts = app.opts
|
||||
self.loop = app.loop
|
||||
self.app = app
|
||||
self.context = self.app.context.child(self.name, childlevel="DEBUG")
|
||||
self.answers = app.answers.get(self.name, {})
|
||||
|
@ -128,9 +127,7 @@ class BaseController(ABC):
|
|||
next(it)
|
||||
except StopIteration:
|
||||
return
|
||||
self.loop.set_alarm_in(
|
||||
delay,
|
||||
lambda *args: self._run_iterator(it, delay/1.1))
|
||||
self.app.aio_loop.call_later(delay, self._run_iterator, it, delay/1.1)
|
||||
|
||||
|
||||
class RepeatedController(BaseController):
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import asyncio
|
||||
import fcntl
|
||||
import json
|
||||
import logging
|
||||
|
@ -386,13 +387,14 @@ class Application:
|
|||
self.updated = os.path.exists(os.path.join(self.state_dir, 'updating'))
|
||||
self.signal = Signal()
|
||||
self.prober = prober
|
||||
self.loop = None
|
||||
self.aio_loop = asyncio.get_event_loop()
|
||||
self.urwid_loop = None
|
||||
self.controllers = ControllerSet(self, self.controllers)
|
||||
self.context = Context.new(self)
|
||||
|
||||
def run_command_in_foreground(self, cmd, before_hook=None, after_hook=None,
|
||||
**kw):
|
||||
screen = self.loop.screen
|
||||
screen = self.urwid_loop.screen
|
||||
|
||||
# Calling screen.stop() sends the INPUT_DESCRIPTORS_CHANGED
|
||||
# signal. This calls _reset_input_descriptors() which calls
|
||||
|
@ -528,14 +530,14 @@ class Application:
|
|||
|
||||
ss = ScriptState()
|
||||
|
||||
def _run_script(*args):
|
||||
def _run_script():
|
||||
log.debug("running %s", ss.scripts[0])
|
||||
exec(ss.scripts[0], ss.ns)
|
||||
if ss.waiting:
|
||||
return
|
||||
ss.scripts = ss.scripts[1:]
|
||||
if ss.scripts:
|
||||
self.loop.set_alarm_in(0.01, _run_script)
|
||||
self.aio_loop.call_soon(_run_script)
|
||||
|
||||
def c(pat):
|
||||
but = view_helpers.find_button_matching(self.ui, '.*' + pat + '.*')
|
||||
|
@ -552,7 +554,7 @@ class Application:
|
|||
def wait(delay, func=None):
|
||||
ss.waiting = True
|
||||
|
||||
def next(loop, user_data):
|
||||
def next():
|
||||
ss.waiting = False
|
||||
if func is not None:
|
||||
func()
|
||||
|
@ -560,13 +562,13 @@ class Application:
|
|||
ss.scripts = ss.scripts[1:]
|
||||
if ss.scripts:
|
||||
_run_script()
|
||||
self.loop.set_alarm_in(delay, next)
|
||||
self.aio_loop.call_later(delay, next)
|
||||
|
||||
ss.ns['c'] = c
|
||||
ss.ns['wait'] = wait
|
||||
ss.ns['ui'] = self.ui
|
||||
|
||||
self.loop.set_alarm_in(0.06, _run_script)
|
||||
self.aio_loop.call_later(0.06, _run_script)
|
||||
|
||||
def toggle_color(self):
|
||||
if self.is_color:
|
||||
|
@ -575,14 +577,14 @@ class Application:
|
|||
else:
|
||||
new_palette = self.color_palette
|
||||
self.is_color = True
|
||||
self.loop.screen.register_palette(new_palette)
|
||||
self.loop.screen.clear()
|
||||
self.urwid_loop.screen.register_palette(new_palette)
|
||||
self.urwid_loop.screen.clear()
|
||||
|
||||
def unhandled_input(self, key):
|
||||
if self.opts.dry_run and key == 'ctrl x':
|
||||
self.exit()
|
||||
elif key == 'f3':
|
||||
self.loop.screen.clear()
|
||||
self.urwid_loop.screen.clear()
|
||||
elif key in ['ctrl t', 'f4']:
|
||||
self.toggle_color()
|
||||
|
||||
|
@ -616,12 +618,12 @@ class Application:
|
|||
log.debug("Application.run")
|
||||
screen = make_screen(self.COLORS, self.is_linux_tty, self.opts.ascii)
|
||||
|
||||
self.loop = urwid.MainLoop(
|
||||
self.urwid_loop = urwid.MainLoop(
|
||||
self.ui, palette=self.color_palette, screen=screen,
|
||||
handle_mouse=False, pop_ups=True,
|
||||
input_filter=self.input_filter.filter,
|
||||
unhandled_input=self.unhandled_input,
|
||||
event_loop=AsyncioEventLoop())
|
||||
event_loop=AsyncioEventLoop(loop=self.aio_loop))
|
||||
|
||||
if self.opts.ascii:
|
||||
urwid.util.set_encoding('ascii')
|
||||
|
@ -642,16 +644,14 @@ class Application:
|
|||
if self.updated:
|
||||
initial_controller_index = self.load_serialized_state()
|
||||
|
||||
self.loop.set_alarm_in(
|
||||
0.00, lambda loop, ud: tty.setraw(0))
|
||||
self.loop.set_alarm_in(
|
||||
0.05, lambda loop, ud: self.select_initial_screen(
|
||||
initial_controller_index))
|
||||
self.aio_loop.call_soon(tty.setraw, 0)
|
||||
self.aio_loop.call_soon(
|
||||
self.select_initial_screen, initial_controller_index)
|
||||
self._connect_base_signals()
|
||||
|
||||
self.start_controllers()
|
||||
|
||||
self.loop.run()
|
||||
self.urwid_loop.run()
|
||||
except Exception:
|
||||
log.exception("Exception in controller.run():")
|
||||
raise
|
||||
|
|
|
@ -32,8 +32,8 @@ styles = {
|
|||
|
||||
|
||||
class Spinner(Text):
|
||||
def __init__(self, loop=None, style='spin', align='center'):
|
||||
self.loop = loop
|
||||
def __init__(self, aio_loop=None, style='spin', align='center'):
|
||||
self.aio_loop = aio_loop
|
||||
self.spin_index = 0
|
||||
self.spin_text = styles[style]['texts']
|
||||
self.rate = styles[style]['rate']
|
||||
|
@ -44,9 +44,9 @@ class Spinner(Text):
|
|||
self.spin_index = (self.spin_index + 1) % len(self.spin_text)
|
||||
self.set_text(self.spin_text[self.spin_index])
|
||||
|
||||
def _advance(self, sender=None, user_data=None):
|
||||
def _advance(self):
|
||||
self.spin()
|
||||
self.handle = self.loop.set_alarm_in(self.rate, self._advance)
|
||||
self.handle = self.aio_loop.call_later(self.rate, self._advance)
|
||||
|
||||
def start(self):
|
||||
self.stop()
|
||||
|
@ -55,5 +55,5 @@ class Spinner(Text):
|
|||
def stop(self):
|
||||
self.set_text('')
|
||||
if self.handle is not None:
|
||||
self.loop.remove_alarm(self.handle)
|
||||
self.handle.cancel()
|
||||
self.handle = None
|
||||
|
|
|
@ -158,7 +158,7 @@ class NetworkView(BaseView):
|
|||
)
|
||||
|
||||
def show_apply_spinner(self):
|
||||
s = Spinner(self.controller.loop)
|
||||
s = Spinner(self.controller.app.aio_loop)
|
||||
s.start()
|
||||
c = TablePile([
|
||||
TableRow([
|
||||
|
@ -202,7 +202,7 @@ class NetworkView(BaseView):
|
|||
address_info.extend(
|
||||
[(label, Text(addr)) for addr in addrs])
|
||||
elif dev.dhcp_state(v) == "PENDING":
|
||||
s = Spinner(self.controller.loop, align='left')
|
||||
s = Spinner(self.controller.app.aio_loop, align='left')
|
||||
s.rate = 0.3
|
||||
s.start()
|
||||
address_info.append((label, s))
|
||||
|
|
Loading…
Reference in New Issue