diff --git a/src/openttd.cpp b/src/openttd.cpp index cda4aa3c11..00ddade4bb 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -782,6 +782,7 @@ int ttd_main(int argc, char *argv[]) /* restore saved music volume */ _music_driver->SetVolume(_settings_client.music.music_vol); + _video_driver->ClaimMousePointer(); NetworkStartUp(); // initialize network-core diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index 54c5c9cd37..39203cbca3 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -28,14 +28,16 @@ #include static bool _has_console; +static bool _cursor_disable = true; +static bool _cursor_visible = true; -static bool cursor_visible = true; - -bool MyShowCursor(bool show) +bool MyShowCursor(bool show, bool toggle) { - if (cursor_visible == show) return show; + if (toggle) _cursor_disable = !_cursor_disable; + if (_cursor_disable) return show; + if (_cursor_visible == show) return show; - cursor_visible = show; + _cursor_visible = show; ShowCursor(show); return !show; diff --git a/src/os/windows/win32.h b/src/os/windows/win32.h index 19f04d1f2f..66c519973f 100644 --- a/src/os/windows/win32.h +++ b/src/os/windows/win32.h @@ -13,7 +13,7 @@ #define WIN32_H #include -bool MyShowCursor(bool show); +bool MyShowCursor(bool show, bool toggle = false); typedef void (*Function)(int); bool LoadLibraryList(Function proc[], const char *dll); diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index 27b7a44488..0154cb519f 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -225,11 +225,23 @@ static bool CreateMainSurface(uint w, uint h) snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision); set_window_title(caption); + enable_hardware_cursor(); + select_mouse_cursor(MOUSE_CURSOR_ARROW); + show_mouse(_allegro_screen); + GameSizeChanged(); return true; } +bool VideoDriver_Allegro::ClaimMousePointer() +{ + select_mouse_cursor(MOUSE_CURSOR_NONE); + show_mouse(_allegro_screen); + disable_hardware_cursor(); + return true; +} + struct VkMapping { uint16 vk_from; byte vk_count; diff --git a/src/video/allegro_v.h b/src/video/allegro_v.h index 6a81159ca3..da95269ce3 100644 --- a/src/video/allegro_v.h +++ b/src/video/allegro_v.h @@ -31,6 +31,8 @@ public: /* virtual */ bool AfterBlitterChange(); + /* virtual */ bool ClaimMousePointer(); + /* virtual */ const char *GetName() const { return "allegro"; } }; diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index 8768004b69..ebb0ca7575 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -259,13 +259,18 @@ static bool CreateMainSurface(uint w, uint h) snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision); SDL_CALL SDL_WM_SetCaption(caption, caption); - SDL_CALL SDL_ShowCursor(0); GameSizeChanged(); return true; } +bool VideoDriver_SDL::ClaimMousePointer() +{ + SDL_CALL SDL_ShowCursor(0); + return true; +} + struct VkMapping { uint16 vk_from; byte vk_count; diff --git a/src/video/sdl_v.h b/src/video/sdl_v.h index baecc7ba74..e4df2a30ae 100644 --- a/src/video/sdl_v.h +++ b/src/video/sdl_v.h @@ -31,6 +31,8 @@ public: /* virtual */ bool AfterBlitterChange(); + /* virtual */ bool ClaimMousePointer(); + /* virtual */ const char *GetName() const { return "sdl"; } }; diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index 4e8a2a0a1f..306fe28039 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -56,6 +56,11 @@ public: return true; } + virtual bool ClaimMousePointer() + { + return true; + } + /** * Whether the driver has a graphical user interface with the end user. * Or in other words, whether we should spawn a thread for world generation diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index cc242fb2e5..f571638b8d 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -81,6 +81,12 @@ static void UpdatePalette(HDC dc, uint start, uint count) SetDIBColorTable(dc, start, count, rgb); } +bool VideoDriver_Win32::ClaimMousePointer() +{ + MyShowCursor(false, true); + return true; +} + struct VkMapping { byte vk_from; byte vk_count; diff --git a/src/video/win32_v.h b/src/video/win32_v.h index f6c562a940..0706c0ee7a 100644 --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -31,6 +31,8 @@ public: /* virtual */ bool AfterBlitterChange(); + /* virtual */ bool ClaimMousePointer(); + /* virtual */ const char *GetName() const { return "win32"; } bool MakeWindow(bool full_screen);