From bcfe0fb076bcbacfb7cdc13d88d23997b4713097 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Fri, 6 Jan 2023 23:24:38 +0100 Subject: [PATCH] Codechange: introduce GetMainWindow() to properly account for nullptr checks Some nullptr checks have been removed as they were not triggered with nullptr with the null video driver and in dedicated server mode. --- src/console_cmds.cpp | 2 +- src/error_gui.cpp | 2 +- src/genworld.cpp | 4 +--- src/intro_gui.cpp | 2 +- src/linkgraph/linkgraph_gui.cpp | 2 +- src/main_gui.cpp | 2 +- src/misc_gui.cpp | 2 +- src/network/network_gui.cpp | 2 +- src/saveload/misc_sl.cpp | 12 +++++------- src/screenshot.cpp | 4 ++-- src/smallmap_gui.cpp | 8 ++++---- src/toolbar_gui.cpp | 8 ++++---- src/vehicle_gui.cpp | 12 ++++++------ src/viewport_gui.cpp | 6 +++--- src/window.cpp | 18 ++++++++++++++---- src/window_func.h | 1 + 16 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 33b47d9600..e652e64111 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -295,7 +295,7 @@ DEF_CONSOLE_CMD(ConZoomToLevel) } else if (level > _settings_client.gui.zoom_max) { IConsolePrint(CC_ERROR, "Current client settings do not allow zooming out beyond level {}.", _settings_client.gui.zoom_max); } else { - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + Window *w = GetMainWindow(); Viewport *vp = w->viewport; while (vp->zoom > level) DoZoomInOutWindow(ZOOM_IN, w); while (vp->zoom < level) DoZoomInOutWindow(ZOOM_OUT, w); diff --git a/src/error_gui.cpp b/src/error_gui.cpp index 77a96bfc7d..7e04db7c56 100644 --- a/src/error_gui.cpp +++ b/src/error_gui.cpp @@ -235,7 +235,7 @@ public: int scr_bot = GetMainViewBottom() - 20; Point pt = RemapCoords(this->position.x, this->position.y, GetSlopePixelZOutsideMap(this->position.x, this->position.y)); - const Viewport *vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport; + const Viewport *vp = GetMainWindow()->viewport; if (this->face == INVALID_COMPANY) { /* move x pos to opposite corner */ pt.x = UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left; diff --git a/src/genworld.cpp b/src/genworld.cpp index 8ff7da064a..711a9868ba 100644 --- a/src/genworld.cpp +++ b/src/genworld.cpp @@ -321,9 +321,7 @@ void GenerateWorld(GenWorldMode mode, uint size_x, uint size_y, bool reset_setti ShowGenerateWorldProgress(); /* Centre the view on the map */ - if (FindWindowById(WC_MAIN_WINDOW, 0) != nullptr) { - ScrollMainWindowToTile(TileXY(MapSizeX() / 2, MapSizeY() / 2), true); - } + ScrollMainWindowToTile(TileXY(MapSizeX() / 2, MapSizeY() / 2), true); _GenerateWorld(); } diff --git a/src/intro_gui.cpp b/src/intro_gui.cpp index 7e86c1e53c..1d84732bf7 100644 --- a/src/intro_gui.cpp +++ b/src/intro_gui.cpp @@ -222,7 +222,7 @@ struct SelectGameWindow : public Window { } IntroGameViewportCommand &vc = intro_viewport_commands[this->cur_viewport_command_index]; - Window *mw = FindWindowByClass(WC_MAIN_WINDOW); + Window *mw = GetMainWindow(); Viewport *vp = mw->viewport; /* Early exit if the current command hasn't elapsed and isn't animated. */ diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index 8752894b04..ee7cdc05dd 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -553,7 +553,7 @@ LinkGraphLegendWindow::LinkGraphLegendWindow(WindowDesc *desc, int window_number { this->InitNested(window_number); this->InvalidateData(0); - this->SetOverlay(FindWindowById(WC_MAIN_WINDOW, 0)->viewport->overlay); + this->SetOverlay(GetMainWindow()->viewport->overlay); } /** diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 33d3d5d311..683d4f9d97 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -157,7 +157,7 @@ void FixTitleGameZoom(int zoom_adjust) { if (_game_mode != GM_MENU) return; - Viewport *vp = FindWindowByClass(WC_MAIN_WINDOW)->viewport; + Viewport *vp = GetMainWindow()->viewport; /* Adjust the zoom in/out. * Can't simply add, since operator+ is not defined on the ZoomLevel type. */ diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 2641f7227e..352cbf7c2a 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -1264,7 +1264,7 @@ static WindowDesc _query_desc( */ void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallbackProc *callback) { - if (parent == nullptr) parent = FindWindowById(WC_MAIN_WINDOW, 0); + if (parent == nullptr) parent = GetMainWindow(); for (Window *w : Window::Iterate()) { if (w->window_class != WC_CONFIRM_POPUP_QUERY) continue; diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index cc9adaa01a..6591cde3bd 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -2517,6 +2517,6 @@ void ShowNetworkAskRelay(const std::string &server_connection_string, const std: { CloseWindowByClass(WC_NETWORK_ASK_RELAY); - Window *parent = FindWindowById(WC_MAIN_WINDOW, 0); + Window *parent = GetMainWindow(); new NetworkAskRelayWindow(&_network_ask_relay_desc, parent, server_connection_string, relay_connection_string, token); } diff --git a/src/saveload/misc_sl.cpp b/src/saveload/misc_sl.cpp index f50b03fe41..e537bee019 100644 --- a/src/saveload/misc_sl.cpp +++ b/src/saveload/misc_sl.cpp @@ -34,18 +34,16 @@ ZoomLevel _saved_scrollpos_zoom; void SaveViewportBeforeSaveGame() { - const Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + const Window *w = GetMainWindow(); - if (w != nullptr) { - _saved_scrollpos_x = w->viewport->scrollpos_x; - _saved_scrollpos_y = w->viewport->scrollpos_y; - _saved_scrollpos_zoom = w->viewport->zoom; - } + _saved_scrollpos_x = w->viewport->scrollpos_x; + _saved_scrollpos_y = w->viewport->scrollpos_y; + _saved_scrollpos_zoom = w->viewport->zoom; } void ResetViewportAfterLoadGame() { - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + Window *w = GetMainWindow(); w->viewport->scrollpos_x = _saved_scrollpos_x; w->viewport->scrollpos_y = _saved_scrollpos_y; diff --git a/src/screenshot.cpp b/src/screenshot.cpp index 91a16d835b..1a8d0d3c4e 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -732,7 +732,7 @@ void SetupScreenshotViewport(ScreenshotType t, Viewport *vp, uint32 width, uint3 case SC_CRASHLOG: { assert(width == 0 && height == 0); - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + Window *w = GetMainWindow(); vp->virtual_left = w->viewport->virtual_left; vp->virtual_top = w->viewport->virtual_top; vp->virtual_width = w->viewport->virtual_width; @@ -776,7 +776,7 @@ void SetupScreenshotViewport(ScreenshotType t, Viewport *vp, uint32 width, uint3 default: { vp->zoom = (t == SC_ZOOMEDIN) ? _settings_client.gui.zoom_min : ZOOM_LVL_VIEWPORT; - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + Window *w = GetMainWindow(); vp->virtual_left = w->viewport->virtual_left; vp->virtual_top = w->viewport->virtual_top; diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 67aec0e430..dd2e0749cd 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -941,7 +941,7 @@ void SmallMapWindow::DrawTowns(const DrawPixelInfo *dpi) const void SmallMapWindow::DrawMapIndicators() const { /* Find main viewport. */ - const Viewport *vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport; + const Viewport *vp = GetMainWindow()->viewport; Point upper_left_smallmap_coord = InverseRemapCoords2(vp->virtual_left, vp->virtual_top); Point lower_right_smallmap_coord = InverseRemapCoords2(vp->virtual_left + vp->virtual_width - 1, vp->virtual_top + vp->virtual_height - 1); @@ -1433,7 +1433,7 @@ int SmallMapWindow::GetPositionOnLegend(Point pt) if (click_count > 0) this->mouse_capture_widget = widget; const NWidgetBase *wid = this->GetWidget(WID_SM_MAP); - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + Window *w = GetMainWindow(); int sub; pt = this->PixelToTile(pt.x - wid->pos_x, pt.y - wid->pos_y, &sub); ScrollWindowTo(this->scroll_x + pt.x * TILE_SIZE, this->scroll_y + pt.y * TILE_SIZE, -1, w); @@ -1665,7 +1665,7 @@ void SmallMapWindow::SetNewScroll(int sx, int sy, int sub) */ void SmallMapWindow::SmallMapCenterOnCurrentPos() { - const Viewport *vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport; + const Viewport *vp = GetMainWindow()->viewport; Point viewport_center = InverseRemapCoords2(vp->virtual_left + vp->virtual_width / 2, vp->virtual_top + vp->virtual_height / 2); int sub; @@ -1882,7 +1882,7 @@ void ShowSmallMap() */ bool ScrollMainWindowTo(int x, int y, int z, bool instant) { - bool res = ScrollWindowTo(x, y, z, FindWindowById(WC_MAIN_WINDOW, 0), instant); + bool res = ScrollWindowTo(x, y, z, GetMainWindow(), instant); /* If a user scrolls to a tile (via what way what so ever) and already is on * that tile (e.g.: pressed twice), move the smallmap to that location, diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index c0967054b7..9d1aad649a 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -884,7 +884,7 @@ static CallBackFunction MenuClickShowAir(int index) static CallBackFunction ToolbarZoomInClick(Window *w) { - if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) { + if (DoZoomInOutWindow(ZOOM_IN, GetMainWindow())) { w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)WID_TE_ZOOM_IN : (byte)WID_TN_ZOOM_IN); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); } @@ -895,7 +895,7 @@ static CallBackFunction ToolbarZoomInClick(Window *w) static CallBackFunction ToolbarZoomOutClick(Window *w) { - if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) { + if (DoZoomInOutWindow(ZOOM_OUT, GetMainWindow())) { w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)WID_TE_ZOOM_OUT : (byte)WID_TN_ZOOM_OUT); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); } @@ -2146,7 +2146,7 @@ struct MainToolbarWindow : Window { void OnInvalidateData(int data = 0, bool gui_scope = true) override { if (!gui_scope) return; - if (FindWindowById(WC_MAIN_WINDOW, 0) != nullptr) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, WID_TN_ZOOM_IN, WID_TN_ZOOM_OUT); + HandleZoomMessage(this, GetMainWindow()->viewport, WID_TN_ZOOM_IN, WID_TN_ZOOM_OUT); } static HotkeyList hotkeys; @@ -2520,7 +2520,7 @@ struct ScenarioEditorToolbarWindow : Window { void OnInvalidateData(int data = 0, bool gui_scope = true) override { if (!gui_scope) return; - if (FindWindowById(WC_MAIN_WINDOW, 0) != nullptr) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, WID_TE_ZOOM_IN, WID_TE_ZOOM_OUT); + HandleZoomMessage(this, GetMainWindow()->viewport, WID_TE_ZOOM_IN, WID_TE_ZOOM_OUT); } void OnQueryTextFinished(char *str) override diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 42633aff51..f8c9bce791 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -3118,7 +3118,7 @@ public: if (_ctrl_pressed) { ShowExtraViewportWindow(TileVirtXY(v->x_pos, v->y_pos)); } else { - const Window *mainwindow = FindWindowById(WC_MAIN_WINDOW, 0); + const Window *mainwindow = GetMainWindow(); if (click_count > 1 && mainwindow->viewport->zoom <= ZOOM_LVL_OUT_4X) { /* main window 'follows' vehicle */ mainwindow->viewport->follow_vehicle = v->index; @@ -3176,9 +3176,9 @@ public: { /* If the hotkey is not for any widget in the UI (i.e. for honking) */ if (hotkey == WID_VV_HONK_HORN) { - const Window* mainwindow = FindWindowById(WC_MAIN_WINDOW, 0); - const Vehicle* v = Vehicle::Get(window_number); - /*Only play the sound if we're following this vehicle */ + const Window *mainwindow = GetMainWindow(); + const Vehicle *v = Vehicle::Get(window_number); + /* Only play the sound if we're following this vehicle */ if (mainwindow->viewport->follow_vehicle == v->index) { v->PlayLeaveStationSound(true); } @@ -3342,8 +3342,8 @@ bool VehicleClicked(const GUIVehicleGroup &vehgroup) void StopGlobalFollowVehicle(const Vehicle *v) { - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); - if (w != nullptr && w->viewport->follow_vehicle == v->index) { + Window *w = GetMainWindow(); + if (w->viewport->follow_vehicle == v->index) { ScrollMainWindowTo(v->x_pos, v->y_pos, v->z_pos, true); // lock the main view on the vehicle's last position w->viewport->follow_vehicle = INVALID_VEHICLE; } diff --git a/src/viewport_gui.cpp b/src/viewport_gui.cpp index 6f74237d33..df670cc152 100644 --- a/src/viewport_gui.cpp +++ b/src/viewport_gui.cpp @@ -63,7 +63,7 @@ public: Point pt; if (tile == INVALID_TILE) { /* No tile? Use center of main viewport. */ - const Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + const Window *w = GetMainWindow(); /* center on same place as main window (zoom is maximum, no adjustment needed) */ pt.x = w->viewport->scrollpos_x + w->viewport->virtual_width / 2; @@ -95,7 +95,7 @@ public: case WID_EV_ZOOM_OUT: DoZoomInOutWindow(ZOOM_OUT, this); break; case WID_EV_MAIN_TO_VIEW: { // location button (move main view to same spot as this view) 'Paste Location' - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + Window *w = GetMainWindow(); int x = this->viewport->scrollpos_x; // Where is the main looking at int y = this->viewport->scrollpos_y; @@ -107,7 +107,7 @@ public: } case WID_EV_VIEW_TO_MAIN: { // inverse location button (move this view to same spot as main view) 'Copy Location' - const Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + const Window *w = GetMainWindow(); int x = w->viewport->scrollpos_x; int y = w->viewport->scrollpos_y; diff --git a/src/window.cpp b/src/window.cpp index 81952d27db..736b2c443f 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1178,6 +1178,18 @@ Window *FindWindowByClass(WindowClass cls) return nullptr; } +/** + * Get the main window, i.e. FindWindowById(WC_MAIN_WINDOW, 0). + * If the main window is not available, this function will trigger an assert. + * @return Pointer to the main window. + */ +Window *GetMainWindow() +{ + Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + assert(w != nullptr); + return w; +} + /** * Close a window by its class and window number (if it is open). * @param cls Window class @@ -2431,7 +2443,7 @@ static EventState HandleViewportScroll() return ES_NOT_HANDLED; } - if (_last_scroll_window == FindWindowById(WC_MAIN_WINDOW, 0) && _last_scroll_window->viewport->follow_vehicle != INVALID_VEHICLE) { + if (_last_scroll_window == GetMainWindow() && _last_scroll_window->viewport->follow_vehicle != INVALID_VEHICLE) { /* If the main window is following a vehicle, then first let go of it! */ const Vehicle *veh = Vehicle::Get(_last_scroll_window->viewport->follow_vehicle); ScrollMainWindowTo(veh->x_pos, veh->y_pos, veh->z_pos, true); // This also resets follow_vehicle @@ -2776,9 +2788,7 @@ const std::chrono::milliseconds TIME_BETWEEN_DOUBLE_CLICK(500); ///< Time betwee static void ScrollMainViewport(int x, int y) { if (_game_mode != GM_MENU) { - Window *w = FindWindowById(WC_MAIN_WINDOW, 0); - assert(w); - + Window *w = GetMainWindow(); w->viewport->dest_scrollpos_x += ScaleByZoom(x, w->viewport->zoom); w->viewport->dest_scrollpos_y += ScaleByZoom(y, w->viewport->zoom); } diff --git a/src/window_func.h b/src/window_func.h index d68b7ba1c1..0f4d154e54 100644 --- a/src/window_func.h +++ b/src/window_func.h @@ -16,6 +16,7 @@ Window *FindWindowById(WindowClass cls, WindowNumber number); Window *FindWindowByClass(WindowClass cls); +Window *GetMainWindow(); void ChangeWindowOwner(Owner old_owner, Owner new_owner); void ResizeWindow(Window *w, int x, int y, bool clamp_to_screen = true);