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);