summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/windows/window.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/windows/window.h')
-rw-r--r--src/osd/windows/window.h169
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