From b3f81eead5179d70e4e205f3ff0c9a8617ad780d Mon Sep 17 00:00:00 2001
From: Jason Smith <jason.inet@gmail.com>
Date: Sat, 9 Nov 2019 17:27:30 -0800
Subject: [PATCH] Fix/improve TURBO_BACK_MENU_ITEM (#15856)

---
 Marlin/src/lcd/menu/menu.cpp      |  2 +-
 Marlin/src/lcd/menu/menu.h        |  8 +-------
 Marlin/src/lcd/menu/menu_info.cpp | 24 ++++--------------------
 Marlin/src/lcd/ultralcd.h         | 16 ++++++++--------
 4 files changed, 14 insertions(+), 36 deletions(-)

diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp
index 56f47cfe454..fda49bb51e7 100644
--- a/Marlin/src/lcd/menu/menu.cpp
+++ b/Marlin/src/lcd/menu/menu.cpp
@@ -88,7 +88,7 @@ void MarlinUI::save_previous_screen() {
     screen_history[screen_history_depth++] = { currentScreen, encoderPosition, encoderTopLine, screen_items };
 }
 
-void MarlinUI::goto_previous_screen(
+void MarlinUI::_goto_previous_screen(
   #if ENABLED(TURBO_BACK_MENU_ITEM)
     const bool is_back/*=false*/
   #endif
diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h
index aa8e699e77e..e8feeee9df7 100644
--- a/Marlin/src/lcd/menu/menu.h
+++ b/Marlin/src/lcd/menu/menu.h
@@ -110,13 +110,7 @@ class MenuItem_back : public MenuItemBase {
     FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) {
       _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]);
     }
-    static inline void action(PGM_P const=nullptr) {
-      ui.goto_previous_screen(
-        #if ENABLED(TURBO_BACK_MENU_ITEM)
-          true
-        #endif
-      );
-    }
+    static inline void action(PGM_P const=nullptr) { ui.go_back(); }
 };
 
 // SUBMENU(PLABEL, screen_handler)
diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp
index 5ef6bbfc465..e7b4dbe7ce8 100644
--- a/Marlin/src/lcd/menu/menu_info.cpp
+++ b/Marlin/src/lcd/menu/menu_info.cpp
@@ -45,11 +45,7 @@
   // About Printer > Printer Stats
   //
   void menu_info_stats() {
-    if (ui.use_click()) return ui.goto_previous_screen(
-      #if ENABLED(TURBO_BACK_MENU_ITEM)
-        true
-      #endif
-    );
+    if (ui.use_click()) return ui.go_back();
 
     char buffer[21];  // For macro usage
 
@@ -97,11 +93,7 @@
 // About Printer > Thermistors
 //
 void menu_info_thermistors() {
-  if (ui.use_click()) return ui.goto_previous_screen(
-    #if ENABLED(TURBO_BACK_MENU_ITEM)
-      true
-    #endif
-  );
+  if (ui.use_click()) return ui.go_back();
 
   char buffer[21];  // For macro usage
 
@@ -218,11 +210,7 @@ void menu_info_thermistors() {
 // About Printer > Board Info
 //
 void menu_info_board() {
-  if (ui.use_click()) return ui.goto_previous_screen(
-    #if ENABLED(TURBO_BACK_MENU_ITEM)
-      true
-    #endif
-  );
+  if (ui.use_click()) return ui.go_back();
 
   char buffer[21];  // For macro usage
 
@@ -257,11 +245,7 @@ void menu_info_board() {
 #else
 
   void menu_info_printer() {
-    if (ui.use_click()) return ui.goto_previous_screen(
-      #if ENABLED(TURBO_BACK_MENU_ITEM)
-        true
-      #endif
-    );
+    if (ui.use_click()) return ui.go_back();
     START_SCREEN();
     STATIC_ITEM_P(PSTR(MSG_MARLIN), SS_CENTER|SS_INVERT);       // Marlin
     STATIC_ITEM_P(PSTR(SHORT_BUILD_VERSION));                   // x.x.x-Branch
diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h
index 9af9be41948..d8f9e43a956 100644
--- a/Marlin/src/lcd/ultralcd.h
+++ b/Marlin/src/lcd/ultralcd.h
@@ -463,16 +463,16 @@ public:
     static screenFunc_t currentScreen;
     static void goto_screen(const screenFunc_t screen, const uint16_t encoder=0, const uint8_t top=0, const uint8_t items=0);
     static void save_previous_screen();
-    static void goto_previous_screen(
-      #if ENABLED(TURBO_BACK_MENU_ITEM)
-        const bool is_back
-      #endif
-    );
 
+    // goto_previous_screen and go_back may also be used as menu item callbacks
     #if ENABLED(TURBO_BACK_MENU_ITEM)
-      // Various menu items require a "void (*)()" to point to
-      // this function so a default argument *won't* work
-      static inline void goto_previous_screen() { goto_previous_screen(false); }
+      static void _goto_previous_screen(const bool is_back);
+      static inline void goto_previous_screen() { _goto_previous_screen(false); }
+      static inline void go_back()              { _goto_previous_screen(true); }
+    #else
+      static void _goto_previous_screen();
+      FORCE_INLINE static void goto_previous_screen() { _goto_previous_screen(); }
+      FORCE_INLINE static void go_back()              { _goto_previous_screen(); }
     #endif
 
     static void return_to_status();