Files
lunarwm/src/LunarWM_types.h
Slendi f74937bb6a Initial commit
Signed-off-by: Slendi <slendi@socopon.com>
2025-10-01 20:29:18 +03:00

294 lines
6.5 KiB
C

#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