diff --git a/src/osd/modules/osdhelper.h b/src/osd/modules/osdhelper.h index 463d8cdfb48..093c392e249 100644 --- a/src/osd/modules/osdhelper.h +++ b/src/osd/modules/osdhelper.h @@ -6,23 +6,23 @@ // //============================================================ -#pragma once +#ifndef MAME_OSD_MODULES_OSDHELPER_H +#define MAME_OSD_MODULES_OSDHELPER_H -#ifndef __OSDHELPER__ -#define __OSDHELPER__ +#pragma once class osd_dim { public: - osd_dim(const int &w, const int &h) - : m_w(w), m_h(h) - { - } - int width() const { return m_w; } - int height() const { return m_h; } + constexpr osd_dim() : m_w(0), m_h(0) { } + constexpr osd_dim(int w, int h) : m_w(w), m_h(h) { } + + constexpr int width() const { return m_w; } + constexpr int height() const { return m_h; } + + constexpr bool operator!=(const osd_dim &other) { return (m_w != other.width()) || (m_h != other.height()); } + constexpr bool operator==(const osd_dim &other) { return (m_w == other.width()) && (m_h == other.height()); } - bool operator!=(const osd_dim &other) { return (m_w != other.width()) || (m_h != other.height()); } - bool operator==(const osd_dim &other) { return (m_w == other.width()) && (m_h == other.height()); } private: int m_w; int m_h; @@ -31,30 +31,25 @@ private: class osd_rect { public: - osd_rect() - : m_x(0), m_y(0), m_d(0,0) - { - } - osd_rect(const int x, const int y, const int &w, const int &h) - : m_x(x), m_y(y), m_d(w,h) - { - } - osd_rect(const int x, const int y, const osd_dim &d) - : m_x(x), m_y(y), m_d(d) - { - } - int top() const { return m_y; } - int left() const { return m_x; } - int width() const { return m_d.width(); } - int height() const { return m_d.height(); } + constexpr osd_rect() : m_x(0), m_y(0), m_d(0, 0) { } + constexpr osd_rect(int x, int y, int w, int h) : m_x(x), m_y(y), m_d(w, h) { } + constexpr osd_rect(int x, int y, const osd_dim &d) : m_x(x), m_y(y), m_d(d) { } - osd_dim dim() const { return m_d; } + constexpr int left() const { return m_x; } + constexpr int top() const { return m_y; } + constexpr int width() const { return m_d.width(); } + constexpr int height() const { return m_d.height(); } - int bottom() const { return m_y + m_d.height(); } - int right() const { return m_x + m_d.width(); } + constexpr osd_dim dim() const { return m_d; } - osd_rect move_by(int dx, int dy) const { return osd_rect(m_x + dx, m_y + dy, m_d); } - osd_rect resize(int w, int h) const { return osd_rect(m_x, m_y, w, h); } + constexpr int right() const { return m_x + m_d.width(); } + constexpr int bottom() const { return m_y + m_d.height(); } + + constexpr osd_rect move_by(int dx, int dy) const { return osd_rect(m_x + dx, m_y + dy, m_d); } + constexpr osd_rect resize(int w, int h) const { return osd_rect(m_x, m_y, w, h); } + + constexpr bool operator!=(const osd_rect &other) { return (m_x != other.left()) || (m_y != other.top()) || (m_d != other.dim()); } + constexpr bool operator==(const osd_rect &other) { return (m_x == other.left()) && (m_y == other.top()) && (m_d == other.dim()); } private: int m_x; @@ -62,4 +57,4 @@ private: osd_dim m_d; }; -#endif // __OSDHELPER__ +#endif // MAME_OSD_MODULES_OSDHELPER_H diff --git a/src/osd/windows/video.h b/src/osd/windows/video.h index 3f4b49efbe4..c012e42af9d 100644 --- a/src/osd/windows/video.h +++ b/src/osd/windows/video.h @@ -1,19 +1,29 @@ // license:BSD-3-Clause -// copyright-holders:Aaron Giles +// copyright-holders:Aaron Giles, Vas Crabb //============================================================ // -// video.h - Win32 implementation of MAME video routines +// video.h - Win32 video helpers // //============================================================ +#ifndef MAME_OSD_WINDOWS_VIDEO_H +#define MAME_OSD_WINDOWS_VIDEO_H -#ifndef __WIN_VIDEO__ -#define __WIN_VIDEO__ +#pragma once #include "modules/osdhelper.h" -inline osd_rect RECT_to_osd_rect(const RECT &r) +#include + + +constexpr osd_rect RECT_to_osd_rect(RECT const &r) { return osd_rect(r.left, r.top, r.right - r.left, r.bottom - r.top); } -#endif +inline RECT osd_rect_to_RECT(osd_rect const &r) +{ + RECT const result{ r.left(), r.top(), r.right(), r.bottom() }; + return result; +} + +#endif // MAME_OSD_WINDOWS_VIDEO_H diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index c3376b2fb0c..d331ec3f4d8 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -1663,7 +1664,7 @@ void win_window_info::minimize_window() RECT bounds; GetWindowRect(platform_window(), &bounds); - osd_rect newrect(bounds.left, bounds.top, newsize ); + osd_rect newrect(bounds.left, bounds.top, newsize); SetWindowPos(platform_window(), nullptr, newrect.left(), newrect.top(), newrect.width(), newrect.height(), SWP_NOZORDER); @@ -1715,17 +1716,35 @@ void win_window_info::adjust_window_position_after_major_change() if (video_config.keepaspect) newrect = constrain_to_aspect_ratio(newrect, WMSZ_BOTTOMRIGHT); } - - // in full screen, make sure it covers the primary display else { + // in full screen, make sure it covers the primary display std::shared_ptr monitor = monitor_from_rect(nullptr); newrect = monitor->position_size(); } + // restrict the window to one monitor and avoid toolbars if possible + HMONITOR const nearest_monitor = MonitorFromWindow(platform_window(), MONITOR_DEFAULTTONEAREST); + if (NULL != nearest_monitor) + { + MONITORINFO info; + std::memset(&info, 0, sizeof(info)); + info.cbSize = sizeof(info); + if (GetMonitorInfo(nearest_monitor, &info)) + { + if (newrect.right() > info.rcWork.right) + newrect = newrect.move_by(info.rcWork.right - newrect.right(), 0); + if (newrect.bottom() > info.rcWork.bottom) + newrect = newrect.move_by(0, info.rcWork.bottom - newrect.bottom()); + if (newrect.left() < info.rcWork.left) + newrect = newrect.move_by(info.rcWork.left - newrect.left(), 0); + if (newrect.top() < info.rcWork.top) + newrect = newrect.move_by(0, info.rcWork.top - newrect.top()); + } + } + // adjust the position if different - if (oldrect.left != newrect.left() || oldrect.top != newrect.top() || - oldrect.right != newrect.right() || oldrect.bottom != newrect.bottom()) + if (RECT_to_osd_rect(oldrect) != newrect) SetWindowPos(platform_window(), fullscreen() ? HWND_TOPMOST : HWND_TOP, newrect.left(), newrect.top(), newrect.width(), newrect.height(), 0); diff --git a/src/tools/testkeys.cpp b/src/tools/testkeys.cpp index ce802d90685..a536e4ac272 100644 --- a/src/tools/testkeys.cpp +++ b/src/tools/testkeys.cpp @@ -10,25 +10,21 @@ // //============================================================ -#include -#include -#include -#include +#include "osdcore.h" #include "SDL2/SDL.h" -#include "osdcore.h" + +#include +#include //#include "unicode.h" -struct key_lookup_table -{ - int code; - const char *name; -}; -#define KE(x) { SDL_SCANCODE_ ## x, "SDL_SCANCODE_" #x }, +struct key_lookup_table { int code; const char *name; }; -static key_lookup_table sdl_lookup[] = +#define KE(x) { SDL_SCANCODE_##x, "SDL_SCANCODE_" #x }, + +static constexpr key_lookup_table sdl_lookup[] = { KE(UNKNOWN) @@ -287,65 +283,63 @@ static key_lookup_table sdl_lookup[] = KE(APP1) KE(APP2) - - - {-1, ""} }; -static const char * lookup_key_name(const key_lookup_table *kt, int kc) +static char const *lookup_key_name(int kc) { - int i=0; - while (kt[i].code>=0) + for (key_lookup_table const &k : sdl_lookup) { - if (kc==kt[i].code) - return kt[i].name; - i++; + if (k.code == kc) + return k.name; } - return NULL; + return nullptr; } int main(int argc, char *argv[]) { - SDL_Event event; - int quit = 0; - char lasttext[20] = ""; - - if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { - fprintf(stderr, "Couldn't initialize SDL: %s\n", - SDL_GetError()); + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); exit(1); } - SDL_CreateWindow("Input Test", 0, 0, 100, 100,0 ); + SDL_CreateWindow("Input Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 100, 0); - while(SDL_PollEvent(&event) || !quit) { + SDL_Event event; + bool quit = false; + std::string lasttext; + while (SDL_PollEvent(&event) || !quit) { switch(event.type) { case SDL_QUIT: - quit = 1; + quit = true; break; case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) - quit=1; - else - { - printf("ITEM_ID_XY %s %s\n", - lookup_key_name(sdl_lookup, event.key.keysym.scancode), ""); - lasttext[0] = 0; + if (event.key.keysym.sym == SDLK_ESCAPE) { + quit = true; + } else { + std::cout + << "ITEM_ID_XY " + << lookup_key_name(event.key.keysym.scancode) + << ' ' + << std::endl; + lasttext.clear(); } break; case SDL_KEYUP: - printf("ITEM_ID_XY %s %s\n", - lookup_key_name(sdl_lookup, event.key.keysym.scancode), lasttext); + std::cout + << "ITEM_ID_XY " + << lookup_key_name(event.key.keysym.scancode) + << ' ' + << lasttext + << std::endl; break; - case SDL_TEXTINPUT: - strcpy(lasttext, event.text.text); + lasttext = event.text.text; break; } event.type = 0; - #ifdef SDLMAME_OS2 - SDL_Delay( 10 ); - #endif +#ifdef SDLMAME_OS2 + SDL_Delay(10); +#endif } SDL_Quit(); return(0);