// license:BSD-3-Clause // copyright-holders:Aaron Giles //============================================================ // // window.h - Win32 window handling // //============================================================ #ifndef MAME_OSD_WINDOWS_WINDOW_H #define MAME_OSD_WINDOWS_WINDOW_H #pragma once #include "emucore.h" #include "render.h" #include "modules/osdwindow.h" #include "modules/lib/osdlib.h" #include #include #include #include #include #include // standard windows headers #include #include #include //============================================================ // CONSTANTS //============================================================ #define RESIZE_STATE_NORMAL 0 #define RESIZE_STATE_RESIZING 1 #define RESIZE_STATE_PENDING 2 //============================================================ // TYPE DEFINITIONS //============================================================ enum class win_window_focus { NONE, // neither this window nor this thread have focus THREAD, // a window in this thread has focus WINDOW // this window has focus directly }; class win_window_info : public osd_window_t { public: win_window_info(running_machine &machine, render_module &renderprovider, int index, const std::shared_ptr &monitor, const osd_window_config *config); bool attached_mode() const { return m_attached_mode; } win_window_focus focus() const; void update() override; virtual osd_dim get_size() override { RECT client; GetClientRect(platform_window(), &client); return osd_dim(client.right - client.left, client.bottom - client.top); } win_window_info *main_window() const { return m_main; } void set_main_window(win_window_info &main) { m_main = &main; } void capture_pointer() override; void release_pointer() override; void show_pointer() override; void hide_pointer() override; void complete_destroy() override; // static static std::unique_ptr create( running_machine &machine, render_module &renderprovider, int index, const std::shared_ptr &monitor, const osd_window_config *config); // static callbacks static LRESULT CALLBACK video_window_proc(HWND wnd, UINT message, WPARAM wparam, LPARAM lparam); // member variables volatile int m_init_state; // window handle and info RECT m_non_fullscreen_bounds; int m_startmaximized; int m_isminimized; int m_ismaximized; // monitor info int m_fullscreen_safe; float m_aspect; // rendering info std::mutex m_render_lock; unsigned m_targetview; int m_targetorient; render_layer_config m_targetlayerconfig; u32 m_targetvismask; int m_targetscalemode; bool m_targetkeepaspect; // input info std::chrono::steady_clock::time_point m_lastclicktime; int m_lastclickx; int m_lastclicky; char16_t m_last_surrogate; private: void draw_video_contents(HDC dc, bool update); int complete_create(); int wnd_extra_width(); int wnd_extra_height(); osd_rect constrain_to_aspect_ratio(const osd_rect &rect, int adjustment); osd_dim get_min_bounds(int constrain); osd_dim get_max_bounds(int constrain); void update_minmax_state(); void minimize_window(); void maximize_window(); void adjust_window_position_after_major_change(); void set_fullscreen(int fullscreen); win_window_info * m_main; bool m_attached_mode; static POINT s_saved_cursor_pos; }; //============================================================ // PROTOTYPES //============================================================ bool winwindow_has_focus(void); void winwindow_update_cursor_state(running_machine &machine); void winwindow_toggle_full_screen(void); void winwindow_take_snap(void); void winwindow_take_video(void); void winwindow_toggle_fsfx(void); void winwindow_ui_pause(running_machine &machine, int pause); int winwindow_ui_is_paused(running_machine &machine); void winwindow_dispatch_message(running_machine &machine, MSG *message); //============================================================ // rect_width / rect_height //============================================================ static inline int rect_width(const RECT *rect) { return rect->right - rect->left; } static inline int rect_height(const RECT *rect) { return rect->bottom - rect->top; } #endif // MAME_OSD_WINDOWS_WINDOW_H