chiark / gitweb /
Prepare to pass a Client through to activity constructors.
authorSimon Tatham <anakin@pobox.com>
Fri, 29 Dec 2023 11:15:05 +0000 (11:15 +0000)
committerSimon Tatham <anakin@pobox.com>
Fri, 29 Dec 2023 18:17:34 +0000 (18:17 +0000)
src/tui.rs

index 90f765de59532c9af0597f829151dcdede148a87..35e70054d21970aa86e35d6bf6256eff9a81f130 100644 (file)
@@ -212,7 +212,6 @@ impl Tui {
         let result = tui.main_loop();
 
         let _ = &tui.subthread_sender; // FIXME: this just suppresses a warning
-        let _ = &tui.client; // FIXME: this just suppresses a warning
 
         disable_raw_mode()?;
         stdout().execute(LeaveAlternateScreen)?;
@@ -288,7 +287,8 @@ impl Tui {
                         Event::Key(key) => {
                             if key.kind == KeyEventKind::Press {
                                 for ourkey in Self::translate_keypress(key) {
-                                    match self.state.handle_keypress(ourkey) {
+                                    match self.state.handle_keypress(
+                                        ourkey, &mut self.client) {
                                         PhysicalAction::Beep => {
                                             Self::beep()?
                                         },
@@ -346,7 +346,9 @@ struct TuiLogicalState {
     activity_state: Box<dyn ActivityState>,
 }
 
-fn new_activity_state(activity: Activity) -> Box<dyn ActivityState> {
+fn new_activity_state(activity: Activity, _client: &mut Client) ->
+    Box<dyn ActivityState>
+{
     match activity {
         Activity::NonUtil(NonUtilityActivity::MainMenu) => main_menu(),
         Activity::Util(UtilityActivity::UtilsMenu) => utils_menu(),
@@ -360,7 +362,10 @@ fn new_activity_state(activity: Activity) -> Box<dyn ActivityState> {
 impl TuiLogicalState {
     fn new() -> Self {
         let activity_stack = ActivityStack::new();
-        let activity_state = new_activity_state(activity_stack.top());
+        // It would be nice to construct this by calling
+        // new_activity_state, but we don't have a &mut Client to give
+        // it, and in this case we know we don't need one.
+        let activity_state = main_menu();
 
         TuiLogicalState {
             activity_stack: activity_stack,
@@ -390,7 +395,9 @@ impl TuiLogicalState {
         }
     }
 
-    fn handle_keypress(&mut self, key: OurKey) -> PhysicalAction {
+    fn handle_keypress(&mut self, key: OurKey, client: &mut Client) ->
+        PhysicalAction
+    {
         let logact = match key {
             // Central handling of [ESC]: it _always_ goes to the
             // utilities menu, from any UI context at all.
@@ -407,18 +414,19 @@ impl TuiLogicalState {
             LogicalAction::NYI => PhysicalAction::Beep,
             LogicalAction::Goto(activity) => {
                 self.activity_stack.goto(activity);
-                self.changed_activity();
+                self.changed_activity(client);
                 PhysicalAction::Nothing
             },
             LogicalAction::Pop => {
                 self.activity_stack.pop();
-                self.changed_activity();
+                self.changed_activity(client);
                 PhysicalAction::Nothing
             },
         }
     }
 
-    fn changed_activity(&mut self) {
-        self.activity_state = new_activity_state(self.activity_stack.top());
+    fn changed_activity(&mut self, client: &mut Client) {
+        self.activity_state = new_activity_state(
+            self.activity_stack.top(), client);
     }
 }