Index: src/terraform_gui.cpp =================================================================== --- src/terraform_gui.cpp (revision 19825) +++ src/terraform_gui.cpp (working copy) @@ -293,6 +293,20 @@ { this->RaiseButtons(); } + + virtual EventState OnCTRLStateChange() + { + /* Toggle lower/raise land on ctrl */ + if (this->IsWidgetLowered(TTW_LOWER_LAND)) { + HandlePlacePushButton(this, TTW_RAISE_LAND, ANIMCURSOR_RAISELAND, HT_POINT, PlaceProc_RaiseLand, false); + return ES_HANDLED; + } else if (this->IsWidgetLowered(TTW_RAISE_LAND)) { + HandlePlacePushButton(this, TTW_LOWER_LAND, ANIMCURSOR_LOWERLAND, HT_POINT, PlaceProc_LowerLand, false); + return ES_HANDLED; + } + + return ES_NOT_HANDLED; + } }; static const NWidgetPart _nested_terraform_widgets[] = { Index: src/tilehighlight_func.h =================================================================== --- src/tilehighlight_func.h (revision 19825) +++ src/tilehighlight_func.h (working copy) @@ -19,7 +19,7 @@ void PlaceProc_DemolishArea(TileIndex tile); bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_tile, TileIndex end_tile); -bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyle mode, PlaceProc *placeproc); +bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyle mode, PlaceProc *placeproc, bool doBeep = true); void SetObjectToPlaceWnd(CursorID icon, PaletteID pal, HighLightStyle mode, Window *w); void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num); void ResetObjectToPlace(); Index: src/main_gui.cpp =================================================================== --- src/main_gui.cpp (revision 19825) +++ src/main_gui.cpp (working copy) @@ -90,13 +90,14 @@ * @param cursor How should the cursor image change? E.g. cursor with depot image in it * @param mode Tile highlighting mode, e.g. drawing a rectangle or a dot on the ground * @param placeproc Procedure which will be called when someone clicks on the map + * @param doBeep Whether to play the beep sound or not; default: play it * @return true if the button is clicked, false if it's unclicked */ -bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyle mode, PlaceProc *placeproc) +bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyle mode, PlaceProc *placeproc, bool doBeep) { if (w->IsWidgetDisabled(widget)) return false; - SndPlayFx(SND_15_BEEP); + if (doBeep) SndPlayFx(SND_15_BEEP); w->SetDirty(); if (w->IsWidgetLowered(widget)) {