293
src/LunarWM_types.h
Normal file
293
src/LunarWM_types.h
Normal file
@@ -0,0 +1,293 @@
|
||||
#ifndef LUNAR_WM_TYPES_H
|
||||
#define LUNAR_WM_TYPES_H
|
||||
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
#include <GLES3/gl3.h>
|
||||
#include <GLES3/gl31.h>
|
||||
#include <openxr/openxr.h>
|
||||
#include <openxr/openxr_platform.h>
|
||||
|
||||
#include <wayland-client-protocol.h>
|
||||
#include <wayland-egl.h>
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
#include <wlr/backend/session.h>
|
||||
#include <wlr/backend/wayland.h>
|
||||
#include <wlr/render/allocator.h>
|
||||
#include <wlr/render/egl.h>
|
||||
#include <wlr/render/gles2.h>
|
||||
#include <wlr/types/wlr_compositor.h>
|
||||
#include <wlr/types/wlr_cursor.h>
|
||||
#include <wlr/types/wlr_data_device.h>
|
||||
#include <wlr/types/wlr_output.h>
|
||||
#include <wlr/types/wlr_pointer.h>
|
||||
#include <wlr/types/wlr_subcompositor.h>
|
||||
#include <wlr/types/wlr_xdg_shell.h>
|
||||
#include <wlr/util/box.h>
|
||||
#include <wlr/util/log.h>
|
||||
#include <wlr/xwayland/xwayland.h>
|
||||
|
||||
#include <raylib.h>
|
||||
#include <raymath.h>
|
||||
#include <rlgl.h>
|
||||
|
||||
#include "Config.h"
|
||||
#include "RayExt.h"
|
||||
|
||||
struct LunarWM;
|
||||
|
||||
typedef struct {
|
||||
float r, theta, phi;
|
||||
} SphericalCoord;
|
||||
|
||||
static inline SphericalCoord Vector3ToSpherical(Vector3 v)
|
||||
{
|
||||
SphericalCoord s;
|
||||
s.r = sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
|
||||
if (s.r > 0.0f) {
|
||||
s.theta = atan2f(v.z, v.x);
|
||||
s.phi = acosf(v.y / s.r);
|
||||
} else {
|
||||
s.theta = 0.0f;
|
||||
s.phi = 0.0f;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
static inline Vector3 SphericalToVector3(SphericalCoord s)
|
||||
{
|
||||
Vector3 v;
|
||||
float sin_phi = sinf(s.phi);
|
||||
v.x = s.r * cosf(s.theta) * sin_phi;
|
||||
v.y = s.r * cosf(s.phi);
|
||||
v.z = s.r * sinf(s.theta) * sin_phi;
|
||||
return v;
|
||||
}
|
||||
|
||||
typedef struct virtual_output {
|
||||
struct wl_global *global;
|
||||
struct wl_display *display;
|
||||
struct wl_list clients;
|
||||
|
||||
int32_t x, y;
|
||||
int32_t phys_w_mm, phys_h_mm;
|
||||
int32_t width, height;
|
||||
int32_t refresh_mhz;
|
||||
int32_t scale;
|
||||
enum wl_output_subpixel subpixel;
|
||||
enum wl_output_transform transform;
|
||||
char const *make, *model;
|
||||
char const *name, *desc;
|
||||
} LunarWM_VirtualOutput;
|
||||
|
||||
typedef struct {
|
||||
struct LunarWM *server;
|
||||
|
||||
struct wl_list link;
|
||||
struct wlr_keyboard *wlr_keyboard;
|
||||
|
||||
struct wl_listener modifiers;
|
||||
struct wl_listener key;
|
||||
struct wl_listener destroy;
|
||||
} LunarWM_Keyboard;
|
||||
|
||||
typedef struct {
|
||||
struct LunarWM *server;
|
||||
|
||||
struct wl_list link;
|
||||
struct wlr_pointer *wlr_pointer;
|
||||
|
||||
struct wl_listener motion;
|
||||
struct wl_listener destroy;
|
||||
} LunarWM_Pointer;
|
||||
|
||||
typedef struct {
|
||||
struct LunarWM *wm;
|
||||
struct wlr_output *wlr_output;
|
||||
|
||||
struct wl_listener frame;
|
||||
struct wl_listener destroy;
|
||||
} LunarWM_Output;
|
||||
|
||||
typedef struct {
|
||||
uint32_t id;
|
||||
|
||||
bool is_xwayland;
|
||||
|
||||
struct LunarWM *server;
|
||||
|
||||
struct wl_listener commit;
|
||||
struct wl_listener destroy;
|
||||
|
||||
struct wl_listener map, unmap;
|
||||
|
||||
union {
|
||||
struct wlr_xdg_toplevel *xdg;
|
||||
struct wlr_xwayland_surface *xwl;
|
||||
} u;
|
||||
|
||||
struct wlr_surface *surface;
|
||||
struct wlr_texture *texture;
|
||||
|
||||
struct wlr_buffer *locked_buffer;
|
||||
struct wlr_gles2_texture_attribs attribs;
|
||||
struct wlr_gles2_texture *gles_texture;
|
||||
Texture2D rl_texture;
|
||||
RenderTexture2D surface_rt;
|
||||
struct wlr_box surface_extents;
|
||||
bool composed_has_alpha;
|
||||
} LunarWM_Toplevel;
|
||||
|
||||
typedef struct {
|
||||
LunarWM_Toplevel *tl;
|
||||
SphericalCoord coord;
|
||||
} LunarWM_Window;
|
||||
|
||||
bool LunarWM_Toplevel_init_xdg(
|
||||
LunarWM_Toplevel *tl, struct LunarWM *wm, struct wlr_xdg_toplevel *xdg);
|
||||
bool LunarWM_Toplevel_init_xwayland(
|
||||
LunarWM_Toplevel *tl, struct LunarWM *wm, struct wlr_xwayland_surface *xwl);
|
||||
bool LunarWM_Toplevel_destroy(LunarWM_Toplevel *this);
|
||||
|
||||
bool LunarWM_Toplevel_update(LunarWM_Toplevel *this);
|
||||
void LunarWM_Toplevel_focus(LunarWM_Toplevel *this);
|
||||
|
||||
typedef struct {
|
||||
XrSwapchain swapchain;
|
||||
int64_t swapchain_format;
|
||||
GLuint *v_image_views;
|
||||
} LunarWM_SwapchainInfo;
|
||||
|
||||
typedef struct {
|
||||
XrSwapchain handle;
|
||||
XrSwapchainImageOpenGLESKHR *a_imgs;
|
||||
uint32_t a_imgs_count;
|
||||
} LunarWM_SwapchainImagesEntry;
|
||||
|
||||
typedef struct {
|
||||
XrHandJointLocationEXT joint_locations[XR_HAND_JOINT_COUNT_EXT];
|
||||
XrHandTrackerEXT hand_tracker;
|
||||
} LunarWM_Hand;
|
||||
|
||||
typedef struct {
|
||||
XrTime predicted_display_time;
|
||||
XrCompositionLayerProjection layer_projection;
|
||||
XrCompositionLayerBaseHeader *layers[10];
|
||||
uint32_t layers_count;
|
||||
XrCompositionLayerProjectionView layer_projection_views[10];
|
||||
uint32_t layer_projection_views_count;
|
||||
} LunarWM_RenderLayerInfo;
|
||||
|
||||
typedef struct LunarWM {
|
||||
struct {
|
||||
struct wl_display *display;
|
||||
struct wl_event_loop *event_loop;
|
||||
|
||||
struct wlr_backend *backend;
|
||||
struct wlr_renderer *renderer;
|
||||
struct wlr_session *session;
|
||||
|
||||
struct wlr_egl *egl;
|
||||
EGLDisplay egl_display;
|
||||
EGLContext egl_context;
|
||||
EGLConfig egl_config;
|
||||
|
||||
struct wlr_allocator *allocator;
|
||||
struct wlr_compositor *compositor;
|
||||
struct wl_listener new_surface_listener;
|
||||
struct wlr_subcompositor *subcompositor;
|
||||
struct wlr_data_device_manager *data_device_manager;
|
||||
|
||||
struct wlr_seat *seat;
|
||||
struct wl_list keyboards;
|
||||
struct wl_list pointers;
|
||||
struct wl_listener new_input_listener;
|
||||
|
||||
struct wlr_xdg_shell *xdg_shell;
|
||||
struct wl_listener new_xdg_toplevel_listener;
|
||||
struct wl_listener new_xdg_popup_listener;
|
||||
|
||||
struct wlr_xwayland *xwayland;
|
||||
|
||||
struct wl_listener xwayland_ready;
|
||||
struct wl_listener xwayland_new_surface;
|
||||
struct wl_listener xwayland_associate_tmp;
|
||||
struct wl_listener xwayland_dissociate_tmp;
|
||||
|
||||
LunarWM_VirtualOutput *custom_out_virtual;
|
||||
LunarWM_VirtualOutput *custom_out_hud;
|
||||
|
||||
LunarWM_Toplevel **v_toplevels;
|
||||
int current_focus;
|
||||
|
||||
struct wl_listener new_output_listener;
|
||||
LunarWM_Output **v_outputs;
|
||||
|
||||
} wayland;
|
||||
|
||||
struct {
|
||||
bool available;
|
||||
|
||||
XrInstance instance;
|
||||
XrSystemId system_id;
|
||||
XrSession session;
|
||||
XrSessionState session_state;
|
||||
struct {
|
||||
LunarWM_SwapchainInfo *v_color;
|
||||
LunarWM_SwapchainInfo *v_depth;
|
||||
} swapchains;
|
||||
LunarWM_SwapchainImagesEntry swapchain_images[2];
|
||||
XrViewConfigurationView *a_view_configuration_views;
|
||||
uint32_t view_configuration_views_count;
|
||||
XrEnvironmentBlendMode environment_blend_mode;
|
||||
XrSpace local_space, view_space;
|
||||
LunarWM_Hand hands[2];
|
||||
XrSystemHandTrackingPropertiesEXT hand_tracking_system_properties;
|
||||
|
||||
PFN_xrCreateHandTrackerEXT CreateHandTrackerEXT;
|
||||
PFN_xrDestroyHandTrackerEXT DestroyHandTrackerEXT;
|
||||
PFN_xrLocateHandJointsEXT LocateHandJointsEXT;
|
||||
bool hand_tracking_enabled;
|
||||
|
||||
Quaternion recenter_rot;
|
||||
Vector3 recenter_trans;
|
||||
bool recenter_active;
|
||||
|
||||
bool session_running;
|
||||
} xr;
|
||||
|
||||
struct {
|
||||
GLuint fbo;
|
||||
RenderTexture2D tmp_rt;
|
||||
RenderTexture2D main_rt;
|
||||
RenderTexture2D hud_rt;
|
||||
Camera3D camera;
|
||||
Shader linear_srgb;
|
||||
|
||||
Skybox skybox;
|
||||
|
||||
bool first_frame;
|
||||
} renderer;
|
||||
|
||||
struct {
|
||||
SphericalCoord pointer;
|
||||
int active_workspace;
|
||||
struct {
|
||||
LunarWM_Window *v_windows;
|
||||
} workspaces[10];
|
||||
} wm;
|
||||
|
||||
ConfigManager *cman;
|
||||
|
||||
_Atomic(int) counter;
|
||||
|
||||
bool initialized;
|
||||
bool running;
|
||||
} LunarWM;
|
||||
|
||||
static inline bool LunarWM_get_new_id(LunarWM *this) { return ++this->counter; }
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user