[UI] Loop thread to main thread WindowedAppContext

This commit is contained in:
Triang3l
2021-08-28 19:38:24 +03:00
parent f540c188bf
commit 6ce5330f5f
95 changed files with 2343 additions and 1235 deletions

View File

@@ -16,10 +16,10 @@
#include "xenia/base/delegate.h"
#include "xenia/base/platform.h"
#include "xenia/ui/graphics_context.h"
#include "xenia/ui/loop.h"
#include "xenia/ui/menu_item.h"
#include "xenia/ui/ui_event.h"
#include "xenia/ui/window_listener.h"
#include "xenia/ui/windowed_app_context.h"
namespace xe {
namespace ui {
@@ -31,11 +31,13 @@ class ImGuiDrawer;
class Window {
public:
static std::unique_ptr<Window> Create(Loop* loop, const std::string& title);
static std::unique_ptr<Window> Create(WindowedAppContext& app_context_,
const std::string& title);
virtual ~Window();
Loop* loop() const { return loop_; }
WindowedAppContext& app_context() const { return app_context_; }
virtual NativePlatformHandle native_platform_handle() const = 0;
virtual NativeWindowHandle native_handle() const = 0;
@@ -69,8 +71,11 @@ class Window {
virtual bool is_bordered() const { return false; }
virtual void set_bordered(bool enabled) {}
virtual int get_dpi() const { return 96; }
virtual float get_dpi_scale() const { return get_dpi() / 96.f; }
virtual int get_medium_dpi() const { return 96; }
virtual int get_dpi() const { return get_medium_dpi(); }
virtual float get_dpi_scale() const {
return float(get_dpi()) / float(get_medium_dpi());
}
bool has_focus() const { return has_focus_; }
virtual void set_focus(bool value) { has_focus_ = value; }
@@ -78,6 +83,8 @@ class Window {
bool is_cursor_visible() const { return is_cursor_visible_; }
virtual void set_cursor_visible(bool value) { is_cursor_visible_ = value; }
// TODO(Triang3l): Don't scale for guest output - use physical pixels. Use
// logical pixels only for the immediate drawer.
int32_t width() const { return width_; }
int32_t height() const { return height_; }
int32_t scaled_width() const { return int32_t(width_ * get_dpi_scale()); }
@@ -135,7 +142,7 @@ class Window {
Delegate<MouseEvent*> on_mouse_wheel;
protected:
Window(Loop* loop, const std::string& title);
Window(WindowedAppContext& app_context, const std::string& title);
void ForEachListener(std::function<void(WindowListener*)> fn);
void TryForEachListener(std::function<bool(WindowListener*)> fn);
@@ -170,7 +177,7 @@ class Window {
void OnKeyPress(KeyEvent* e, bool is_down, bool is_char);
Loop* loop_ = nullptr;
WindowedAppContext& app_context_;
std::unique_ptr<MenuItem> main_menu_;
std::string title_;
#ifdef XE_PLATFORM_GNU_LINUX