diff options
Diffstat (limited to 'src/osd/windows/window.h')
-rw-r--r-- | src/osd/windows/window.h | 169 |
1 files changed, 95 insertions, 74 deletions
diff --git a/src/osd/windows/window.h b/src/osd/windows/window.h index b04e35aa110..ada71f1cba7 100644 --- a/src/osd/windows/window.h +++ b/src/osd/windows/window.h @@ -1,40 +1,38 @@ // license:BSD-3-Clause -// copyright-holders:Aaron Giles +// copyright-holders:Aaron Giles, Vas Crabb //============================================================ // // window.h - Win32 window handling // //============================================================ +#ifndef MAME_OSD_WINDOWS_WINDOW_H +#define MAME_OSD_WINDOWS_WINDOW_H -#ifndef __WIN_WINDOW__ -#define __WIN_WINDOW__ - -// standard windows headers -#include <windows.h> -#include <windowsx.h> -#include <mmsystem.h> - -#include <chrono> -#include <mutex> -#include <memory> -#include <list> +#pragma once +#include "emucore.h" #include "render.h" #include "modules/osdwindow.h" +#include "modules/lib/osdlib.h" -//============================================================ -// PARAMETERS -//============================================================ +#include <chrono> +#include <list> +#include <memory> +#include <mutex> +#include <utility> +#include <vector> + +// standard windows headers +#include <windows.h> +#include <windowsx.h> +#include <mmsystem.h> //============================================================ // CONSTANTS //============================================================ -#define RESIZE_STATE_NORMAL 0 -#define RESIZE_STATE_RESIZING 1 -#define RESIZE_STATE_PENDING 2 @@ -53,49 +51,45 @@ enum class win_window_focus class win_window_info : public osd_window_t<HWND> { public: - win_window_info(running_machine &machine, int index, std::shared_ptr<osd_monitor_info> monitor, const osd_window_config *config); + enum + { + RESIZE_STATE_NORMAL, + RESIZE_STATE_RESIZING, + RESIZE_STATE_PENDING + }; - running_machine &machine() const override { return m_machine; } + win_window_info(running_machine &machine, render_module &renderprovider, int index, const std::shared_ptr<osd_monitor_info> &monitor, const osd_window_config *config); - virtual render_target *target() override { return m_target; } - int fullscreen() const override { return m_fullscreen; } bool attached_mode() const { return m_attached_mode; } win_window_focus focus() const; void update() override; - virtual bool win_has_menu() override - { -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - return GetMenu(platform_window()) ? true : false; -#else - return false; -#endif - } - virtual osd_dim get_size() override { -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) RECT client; GetClientRect(platform_window(), &client); return osd_dim(client.right - client.left, client.bottom - client.top); -#else - throw ref new Platform::NotImplementedException(); -#endif } + 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; - virtual osd_monitor_info *monitor() const override { return m_monitor.get(); } - - void destroy() override; + void complete_destroy() override; // static - static void create(running_machine &machine, int index, std::shared_ptr<osd_monitor_info> monitor, const osd_window_config *config); + static std::unique_ptr<win_window_info> create( + running_machine &machine, + render_module &renderprovider, + int index, + const std::shared_ptr<osd_monitor_info> &monitor, + const osd_window_config *config); // static callbacks @@ -103,38 +97,54 @@ public: // member variables - win_window_info * m_next; volatile int m_init_state; // window handle and info - char m_title[256]; RECT m_non_fullscreen_bounds; int m_startmaximized; int m_isminimized; int m_ismaximized; // monitor info - std::shared_ptr<osd_monitor_info> m_monitor; - int m_fullscreen; - int m_fullscreen_safe; - float m_aspect; + int m_fullscreen_safe; + float m_aspect; // rendering info std::mutex m_render_lock; - render_target * m_target; - int m_targetview; + unsigned m_targetview; int m_targetorient; render_layer_config m_targetlayerconfig; + u32 m_targetvismask; + int m_targetscalemode; + bool m_targetkeepaspect; // input info - std::chrono::system_clock::time_point m_lastclicktime; - int m_lastclickx; - int m_lastclicky; + std::chrono::steady_clock::time_point m_lastclicktime; + int m_lastclickx; + int m_lastclicky; + char16_t m_last_surrogate; + + HDC m_dc; // only used by GDI renderer! + int m_resize_state; private: + struct win_pointer_info : public pointer_info + { + static constexpr bool compare(win_pointer_info const &info, WORD ptrid) { return info.ptrid < ptrid; } + + win_pointer_info(win_pointer_info const &) = default; + win_pointer_info(win_pointer_info &&) = default; + win_pointer_info &operator=(win_pointer_info const &) = default; + win_pointer_info &operator=(win_pointer_info &&) = default; + + win_pointer_info(WORD p, POINTER_INPUT_TYPE t, unsigned i, unsigned d); + + WORD ptrid; + POINTER_INPUT_TYPE type; + }; + void draw_video_contents(HDC dc, bool update); int complete_create(); - void set_starting_view(int index, const char *defview, const char *view); int wnd_extra_width(); int wnd_extra_height(); osd_rect constrain_to_aspect_ratio(const osd_rect &rect, int adjustment); @@ -145,22 +155,40 @@ private: void maximize_window(); void adjust_window_position_after_major_change(); void set_fullscreen(int fullscreen); - std::shared_ptr<osd_monitor_info> monitor_from_rect(const osd_rect* proposed) const; - static POINT s_saved_cursor_pos; - -#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - static Windows::UI::Core::CoreCursor^ s_cursor; -#endif - - running_machine & m_machine; + // pointer handling helpers + void pointer_entered(WPARAM wparam, LPARAM lparam); + void pointer_left(WPARAM wparam, LPARAM lparam); + void pointer_updated(WPARAM wparam, LPARAM lparam); + void pointer_capture_changed(WPARAM wparam, LPARAM lparam); + void mouse_left(WPARAM wparam, LPARAM lparam); + void mouse_updated(WPARAM wparam, LPARAM lparam); + void expire_pointer(std::vector<win_pointer_info>::iterator info, POINT const &where, bool canceled); + void update_pointer(win_pointer_info &info, POINT const &where, unsigned buttons, bool canceled); + std::vector<win_pointer_info>::iterator map_pointer(WPARAM wparam); + std::vector<win_pointer_info>::iterator find_pointer(WPARAM wparam); + std::vector<win_pointer_info>::iterator map_mouse_pointer(); + std::vector<win_pointer_info>::iterator find_mouse_pointer(); + + win_window_info * m_main; bool m_attached_mode; -}; -struct osd_draw_callbacks -{ - osd_renderer *(*create)(osd_window *window); - void (*exit)(void); + // these functions first appear in Windows 8/Server 2012 + OSD_DYNAMIC_API(user32, "User32.dll", "User32.dll"); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerType, UINT32, POINTER_INPUT_TYPE *); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerInfo, UINT32, POINTER_INFO *); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerPenInfo, UINT32, POINTER_PEN_INFO *); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerTouchInfo, UINT32, POINTER_TOUCH_INFO *); + + // info on currently active pointers - 64 pointers ought to be enough for anyone + uint64_t m_pointer_mask; + unsigned m_next_pointer, m_next_ptrdev; + bool m_tracking_mouse; + std::vector<std::pair<HANDLE, unsigned> > m_ptrdev_map; + std::vector<pointer_dev_info> m_ptrdev_info; + std::vector<win_pointer_info> m_active_pointers; + + static POINT s_saved_cursor_pos; }; @@ -171,22 +199,15 @@ struct osd_draw_callbacks bool winwindow_has_focus(void); void winwindow_update_cursor_state(running_machine &machine); -extern LRESULT CALLBACK winwindow_video_window_proc_ui(HWND wnd, UINT message, WPARAM wparam, LPARAM lparam); - void winwindow_toggle_full_screen(void); void winwindow_take_snap(void); void winwindow_take_video(void); void winwindow_toggle_fsfx(void); -void winwindow_process_events_periodic(running_machine &machine); -void winwindow_process_events(running_machine &machine, bool ingame, bool nodispatch); - 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); - -extern int win_create_menu(running_machine &machine, HMENU *menus); +void winwindow_dispatch_message(running_machine &machine, MSG const &message); @@ -205,4 +226,4 @@ static inline int rect_height(const RECT *rect) return rect->bottom - rect->top; } -#endif +#endif // MAME_OSD_WINDOWS_WINDOW_H |