IWindowing.h#

Fully qualified name: carb/windowing/IWindowing.h

File members: carb/windowing/IWindowing.h

// Copyright (c) 2018-2024, NVIDIA CORPORATION. All rights reserved.
//
// NVIDIA CORPORATION and its licensors retain all intellectual property
// and proprietary rights in and to this software, related documentation
// and any modifications thereto. Any use, reproduction, disclosure or
// distribution of this software and related documentation without an express
// license agreement from NVIDIA CORPORATION is strictly prohibited.
//

#pragma once
#include <carb/input/InputTypes.h>
#include "../Interface.h"
#include "../Types.h"

#define carb_windowing_IWindowing_latest CARB_HEXVERSION(1, 5)
#ifndef carb_windowing_IWindowing
#    define carb_windowing_IWindowing CARB_HEXVERSION(1, 4)
#endif

namespace carb
{

namespace input
{
struct Keyboard;
struct Mouse;
struct Gamepad;
} // namespace input

namespace windowing
{

struct Window;
struct Cursor;
struct Monitor;

enum class MonitorChangeEvent : uint32_t
{
    eUnknown,
    eConnected,
    eDisconnected
};

typedef void (*OnWindowMoveFn)(Window* window, int x, int y, void* userData);
typedef void (*OnWindowResizeFn)(Window* window, int width, int height, void* userData);
typedef void (*OnWindowDropFn)(Window* window, const char** paths, int count, void* userData);
typedef void (*OnWindowCloseFn)(Window* window, void* userData);
typedef void (*OnWindowContentScaleFn)(Window* window, float scaleX, float scaleY, void* userData);
typedef void (*OnWindowFocusFn)(Window* window, bool isFocused, void* userData);
typedef void (*OnWindowMaximizeFn)(Window* window, bool isMaximized, void* userData);
typedef void (*OnWindowMinimizeFn)(Window* window, bool isMinimized, void* userData);
typedef void (*OnMonitorChangeFn)(const Monitor* monitor, MonitorChangeEvent evt);

typedef uint32_t WindowHints;
constexpr WindowHints kWindowHintNone = 0;
constexpr WindowHints kWindowHintNoResize = 1 << 0;
constexpr WindowHints kWindowHintNoDecoration = 1 << 1;
constexpr WindowHints kWindowHintNoAutoIconify = 1 << 2;
constexpr WindowHints kWindowHintNoFocusOnShow = 1 << 3;
constexpr WindowHints kWindowHintScaleToMonitor = 1 << 4;
constexpr WindowHints kWindowHintFloating = 1 << 5;
constexpr WindowHints kWindowHintMaximized = 1 << 6;

struct WindowDesc
{
    int width;
    int height;
    const char* title;
    bool fullscreen;
    WindowHints hints;
};

enum class CursorStandardShape : uint32_t
{
    eArrow,
    eIBeam,
    eCrosshair,
    eHand,
    eHorizontalResize,
    eVerticalResize
};

enum class CursorMode : uint32_t
{
    eNormal,
    eHidden,
    eDisabled,
};

enum class InputMode : uint32_t
{
    eStickyKeys,
    eStickyMouseButtons,
    eLockKeyMods,
    eRawMouseMotion
};

struct VideoMode
{
    int width;
    int height;
    int redBits;
    int greenBits;
    int blueBits;
    int refreshRate;
};

struct Image
{
    int32_t width;
    int32_t height;
    uint8_t* pixels;
};

struct IWindowing
{
    CARB_PLUGIN_INTERFACE_EX("carb::windowing::IWindowing", carb_windowing_IWindowing_latest, carb_windowing_IWindowing)

    Window*(CARB_ABI* createWindow)(const WindowDesc& desc);

    void(CARB_ABI* destroyWindow)(Window* window);

    void(CARB_ABI* showWindow)(Window* window);

    void(CARB_ABI* hideWindow)(Window* window);

    uint32_t(CARB_ABI* getWindowWidth)(Window* window);

    uint32_t(CARB_ABI* getWindowHeight)(Window* window);

    Int2(CARB_ABI* getWindowPosition)(Window* window);

    void(CARB_ABI* setWindowPosition)(Window* window, const Int2& position);

    void(CARB_ABI* setWindowTitle)(Window* window, const char* title);

    void(CARB_ABI* setWindowOpacity)(Window* window, float opacity);

    float(CARB_ABI* getWindowOpacity)(Window* window);

    void(CARB_ABI* setWindowFullscreen)(Window* window, bool fullscreen);

    bool(CARB_ABI* isWindowFullscreen)(Window* window);

    void(CARB_ABI* setWindowResizeFn)(Window* window, OnWindowResizeFn onWindowResize, void* userData);

    void(CARB_ABI* resizeWindow)(Window* window, int width, int height);

    void(CARB_ABI* focusWindow)(Window* window);

    void(CARB_ABI* setWindowFocusFn)(Window* window, OnWindowFocusFn onWindowFocusFn, void* userData);

    bool(CARB_ABI* isWindowFocused)(Window* window);

    void(CARB_ABI* setWindowMinimizeFn)(Window* window, OnWindowMinimizeFn onWindowMinimizeFn, void* userData);

    bool(CARB_ABI* isWindowMinimized)(Window* window);

    void(CARB_ABI* setWindowDropFn)(Window* window, OnWindowDropFn onWindowDrop, void* userData);

    void(CARB_ABI* setWindowCloseFn)(Window* window, OnWindowCloseFn onWindowClose, void* userData);

    bool(CARB_ABI* shouldWindowClose)(Window* window);

    void(CARB_ABI* setWindowShouldClose)(Window* window, bool value);

    void*(CARB_ABI* getWindowUserPointer)(Window* window);

    void(CARB_ABI* setWindowUserPointer)(Window* window, void* pointer);

    void(CARB_ABI* setWindowContentScaleFn)(Window* window, OnWindowContentScaleFn onWindowContentScale, void* userData);

    Float2(CARB_ABI* getWindowContentScale)(Window* window);

    void*(CARB_ABI* getNativeDisplay)(Window* window);

    void*(CARB_ABI* getNativeWindow)(Window* window);

    void(CARB_ABI* setInputMode)(Window* window, InputMode mode, bool enabled);

    bool(CARB_ABI* getInputMode)(Window* window, InputMode mode);

    void(CARB_ABI* updateInputDevices)();

    void(CARB_ABI* pollEvents)();

    void(CARB_ABI* waitEvents)();

    input::Keyboard*(CARB_ABI* getKeyboard)(Window* window);

    input::Mouse*(CARB_ABI* getMouse)(Window* window);

    Cursor*(CARB_ABI* createCursorStandard)(CursorStandardShape shape);

    void(CARB_ABI* destroyCursor)(Cursor* cursor);

    void(CARB_ABI* setCursor)(Window* window, Cursor* cursor);

    void(CARB_ABI* setCursorMode)(Window* window, CursorMode mode);

    CursorMode(CARB_ABI* getCursorMode)(Window* window);

    void(CARB_ABI* setCursorPosition)(Window* window, const Int2& position);

    Int2(CARB_ABI* getCursorPosition)(Window* window);

    void(CARB_ABI* setClipboard)(Window* window, const char* text);

    const char*(CARB_ABI* getClipboard)(Window* window);

    void(CARB_ABI* setMonitorsChangeFn)(OnMonitorChangeFn onMonitorChange);

    const Monitor*(CARB_ABI* getMonitorPrimary)();

    const Monitor**(CARB_ABI* getMonitors)(size_t* monitorCount);

    const char*(CARB_ABI* getMonitorName)(const Monitor* monitor);

    Int2(CARB_ABI* getMonitorPhysicalSize)(const Monitor* monitor);

    const VideoMode*(CARB_ABI* getMonitorVideoMode)(const Monitor* monitor);

    Int2(CARB_ABI* getMonitorPosition)(const Monitor* monitor);

    Float2(CARB_ABI* getMonitorContentScale)(const Monitor* monitor);

    void(CARB_ABI* getMonitorWorkArea)(const Monitor* monitor, Int2* positionOut, Int2* sizeOut);

    void(CARB_ABI* setWindowMoveFn)(Window* window, OnWindowMoveFn onWindowMove, void* userData);

    bool(CARB_ABI* isWindowFloating)(Window* window);

    void(CARB_ABI* setWindowFloating)(Window* window, bool isFloating);

    Cursor*(CARB_ABI* createCursor)(const Image& image, int32_t xhot, int32_t yhot);

    void(CARB_ABI* maximizeWindow)(Window* window);

    void(CARB_ABI* minimizeWindow)(Window* window);

    void(CARB_ABI* restoreWindow)(Window* window);

    void(CARB_ABI* setWindowMaximizeFn)(Window* window, OnWindowMaximizeFn onWindowMaximizeFn, void* userData);

    bool(CARB_ABI* isWindowMaximized)(Window* window);

    void(CARB_ABI* setWindowIcon)(Window* window, const Image& image);

#if CARB_VERSION_ATLEAST(carb_windowing_IWindowing, 1, 5)
    carb::input::KeyboardInput(CARB_ABI* translateKey)(carb::input::KeyboardInput input);
#endif
};

} // namespace windowing
} // namespace carb