mirror of
https://github.com/AxioDL/boo.git
synced 2025-05-17 04:41:37 +00:00
236 lines
6.2 KiB
C++
236 lines
6.2 KiB
C++
#ifndef IWINDOW_HPP
|
|
#define IWINDOW_HPP
|
|
|
|
#include "System.hpp"
|
|
|
|
namespace boo
|
|
{
|
|
struct IGraphicsCommandQueue;
|
|
struct IGraphicsDataFactory;
|
|
|
|
enum class EMouseButton
|
|
{
|
|
None = 0,
|
|
Primary = 1,
|
|
Secondary = 2,
|
|
Middle = 3,
|
|
Aux1 = 4,
|
|
Aux2 = 5
|
|
};
|
|
|
|
struct SWindowRect
|
|
{
|
|
int location[2];
|
|
int size[2];
|
|
};
|
|
|
|
struct SWindowCoord
|
|
{
|
|
unsigned pixel[2];
|
|
unsigned virtualPixel[2];
|
|
float norm[2];
|
|
};
|
|
|
|
struct STouchCoord
|
|
{
|
|
double coord[2];
|
|
};
|
|
|
|
struct SScrollDelta
|
|
{
|
|
double delta[2];
|
|
bool isFine; /* Use system-scale fine-scroll (for scrollable-trackpads) */
|
|
|
|
SScrollDelta operator+(const SScrollDelta& other)
|
|
{return {{delta[0] + other.delta[0], delta[1] + other.delta[1]}, isFine || other.isFine};}
|
|
SScrollDelta& operator+=(const SScrollDelta& other)
|
|
{delta[0] += other.delta[0]; delta[1] += other.delta[1]; isFine |= other.isFine; return *this;}
|
|
void zeroOut() {delta[0] = 0.0; delta[1] = 0.0;}
|
|
};
|
|
|
|
enum class ESpecialKey
|
|
{
|
|
None = 0,
|
|
F1 = 1,
|
|
F2 = 2,
|
|
F3 = 3,
|
|
F4 = 4,
|
|
F5 = 5,
|
|
F6 = 6,
|
|
F7 = 7,
|
|
F8 = 8,
|
|
F9 = 9,
|
|
F10 = 10,
|
|
F11 = 11,
|
|
F12 = 12,
|
|
Esc = 13,
|
|
Enter = 14,
|
|
Backspace = 15,
|
|
Insert = 16,
|
|
Delete = 17,
|
|
Home = 18,
|
|
End = 19,
|
|
PgUp = 20,
|
|
PgDown = 21,
|
|
Left = 22,
|
|
Right = 23,
|
|
Up = 24,
|
|
Down = 25
|
|
};
|
|
|
|
enum class EModifierKey
|
|
{
|
|
None = 0,
|
|
Ctrl = 1<<0,
|
|
Alt = 1<<2,
|
|
Shift = 1<<3,
|
|
Command = 1<<4
|
|
};
|
|
|
|
inline EModifierKey operator|(EModifierKey a, EModifierKey b)
|
|
{
|
|
using T = std::underlying_type_t<EModifierKey>;
|
|
return EModifierKey(static_cast<T>(a) | static_cast<T>(b));
|
|
}
|
|
|
|
inline EModifierKey operator&(EModifierKey a, EModifierKey b)
|
|
{
|
|
using T = std::underlying_type_t<EModifierKey>;
|
|
return EModifierKey(static_cast<T>(a) & static_cast<T>(b));
|
|
}
|
|
|
|
inline EModifierKey& operator|=(EModifierKey& a, const EModifierKey& b)
|
|
{
|
|
using T = std::underlying_type_t<EModifierKey>;
|
|
a = EModifierKey(static_cast<T>(a) | static_cast<T>(b));
|
|
return a;
|
|
}
|
|
|
|
inline EModifierKey operator~(const EModifierKey& key)
|
|
{
|
|
using T = std::underlying_type_t<EModifierKey>;
|
|
return EModifierKey(~static_cast<T>(key));
|
|
}
|
|
|
|
class IWindowCallback
|
|
{
|
|
public:
|
|
virtual void resized(const SWindowRect& rect)
|
|
{(void)rect;}
|
|
virtual void mouseDown(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
|
{(void)coord;(void)button;(void)mods;}
|
|
virtual void mouseUp(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
|
{(void)coord;(void)button;(void)mods;}
|
|
virtual void mouseMove(const SWindowCoord& coord)
|
|
{(void)coord;}
|
|
virtual void mouseEnter(const SWindowCoord& coord)
|
|
{(void)coord;}
|
|
virtual void mouseLeave(const SWindowCoord& coord)
|
|
{(void)coord;}
|
|
virtual void scroll(const SWindowCoord& coord, const SScrollDelta& scroll)
|
|
{(void)coord;(void)scroll;}
|
|
|
|
virtual void touchDown(const STouchCoord& coord, uintptr_t tid)
|
|
{(void)coord;(void)tid;}
|
|
virtual void touchUp(const STouchCoord& coord, uintptr_t tid)
|
|
{(void)coord;(void)tid;}
|
|
virtual void touchMove(const STouchCoord& coord, uintptr_t tid)
|
|
{(void)coord;(void)tid;}
|
|
|
|
virtual void charKeyDown(unsigned long charCode, EModifierKey mods, bool isRepeat)
|
|
{(void)charCode;(void)mods;(void)isRepeat;}
|
|
virtual void charKeyUp(unsigned long charCode, EModifierKey mods)
|
|
{(void)charCode;(void)mods;}
|
|
virtual void specialKeyDown(ESpecialKey key, EModifierKey mods, bool isRepeat)
|
|
{(void)key;(void)mods;(void)isRepeat;}
|
|
virtual void specialKeyUp(ESpecialKey key, EModifierKey mods)
|
|
{(void)key;(void)mods;}
|
|
virtual void modKeyDown(EModifierKey mod, bool isRepeat)
|
|
{(void)mod;(void)isRepeat;}
|
|
virtual void modKeyUp(EModifierKey mod) {(void)mod;}
|
|
virtual void focusLost() {}
|
|
virtual void focusGained() {}
|
|
virtual void windowMoved(const SWindowRect& rect)
|
|
{ (void)rect; }
|
|
|
|
virtual void destroyed()
|
|
{}
|
|
};
|
|
|
|
enum class ETouchType
|
|
{
|
|
None = 0,
|
|
Display = 1,
|
|
Trackpad = 2
|
|
};
|
|
|
|
enum class EWindowStyle
|
|
{
|
|
None = 0,
|
|
Titlebar = 1<<0,
|
|
Resize = 1<<1,
|
|
Close = 1<<2,
|
|
|
|
Default = Titlebar | Resize | Close
|
|
};
|
|
ENABLE_BITWISE_ENUM(EWindowStyle)
|
|
|
|
class IWindow
|
|
{
|
|
public:
|
|
|
|
virtual ~IWindow() {}
|
|
|
|
virtual void setCallback(IWindowCallback* cb)=0;
|
|
|
|
virtual void showWindow()=0;
|
|
virtual void hideWindow()=0;
|
|
|
|
virtual SystemString getTitle()=0;
|
|
virtual void setTitle(const SystemString& title)=0;
|
|
|
|
virtual void setWindowFrameDefault()=0;
|
|
virtual void getWindowFrame(float& xOut, float& yOut, float& wOut, float& hOut) const=0;
|
|
virtual void getWindowFrame(int& xOut, int& yOut, int& wOut, int& hOut) const=0;
|
|
virtual SWindowRect getWindowFrame() const
|
|
{
|
|
SWindowRect retval;
|
|
getWindowFrame(retval.location[0], retval.location[1], retval.size[0], retval.size[1]);
|
|
return retval;
|
|
}
|
|
virtual void setWindowFrame(float x, float y, float w, float h)=0;
|
|
virtual void setWindowFrame(int x, int y, int w, int h)=0;
|
|
virtual void setWindowFrame(const SWindowRect& rect)
|
|
{
|
|
setWindowFrame(rect.location[0], rect.location[1], rect.size[0], rect.size[1]);
|
|
}
|
|
virtual float getVirtualPixelFactor() const=0;
|
|
|
|
virtual bool isFullscreen() const=0;
|
|
virtual void setFullscreen(bool fs)=0;
|
|
|
|
virtual void waitForRetrace()=0;
|
|
|
|
virtual uintptr_t getPlatformHandle() const=0;
|
|
virtual void _incomingEvent(void* event) {(void)event;}
|
|
|
|
virtual ETouchType getTouchType() const=0;
|
|
|
|
virtual void setStyle(EWindowStyle style)=0;
|
|
virtual EWindowStyle getStyle() const=0;
|
|
|
|
virtual IGraphicsCommandQueue* getCommandQueue()=0;
|
|
virtual IGraphicsDataFactory* getDataFactory()=0;
|
|
|
|
/* Creates a new context on current thread!! Call from main client thread */
|
|
virtual IGraphicsDataFactory* getMainContextDataFactory()=0;
|
|
|
|
/* Creates a new context on current thread!! Call from client loading thread */
|
|
virtual IGraphicsDataFactory* getLoadContextDataFactory()=0;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif // IWINDOW_HPP
|