Files
libsst/libsst-wm/Xlib/XlibPrivate.h
2026-04-03 00:22:39 -05:00

187 lines
6.7 KiB
C

/*
XlibPrivate.h
Author: Patrick Baggett <ptbaggett@762studios.com>
Created: 1/8/2013
Purpose:
License:
This program is free software. It comes without any warranty, to
the extent permitted by applicable law. You can redistribute it
and/or modify it under the terms of the Do What The Fuck You Want
To Public License, Version 2, as published by Sam Hocevar. See
http://sam.zoy.org/wtfpl/COPYING for more details.
*/
#pragma once
#ifndef _XLIBPRIVATE_H
#define _XLIBPRIVATE_H
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xproto.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <pthread.h>
#include <SST/SST_WMTypes.h>
#include "EventQueue.h"
#include "GLXPrivate.h"
#include "XI2Private.h"
#define MIN_BPP 16 /* Minimum BPP for a mode to be considered. Some embedded systems use 16-bit color to save memory, so accept those too. */
/* XGenericEventCookie is required for XI2, but not present on Solaris 10, so fake it*/
#if defined(__sun) && !defined(HAVE_XINPUT2)
typedef void XGenericEventCookie;
#endif
/* Xlib C API */
typedef Display* (*pf_XOpenDisplay)(const char* s);
typedef void (*pf_XCloseDisplay)(Display* dpy);
typedef int (*pf_XMoveWindow)(Display* dpy, Window w, int x, int y);
typedef int (*pf_XResizeWindow)(Display* dpy, Window w, unsigned int x, unsigned int y);
typedef int (*pf_XMapRaised)(Display* dpy, Window w);
typedef int (*pf_XMapWindow)(Display* dpy, Window w);
typedef int (*pf_XUnmapWindow)(Display* dpy, Window w);
typedef int (*pf_XStoreName)(Display* dpy, Window w, const char* windowName);
typedef int (*pf_XDestroyWindow)(Display* dpy, Window w);
typedef Window (*pf_XCreateSimpleWindow)(Display*, Window parent, int x, int y, unsigned int w, unsigned int h, unsigned int borderWidth, unsigned long border, unsigned long background);
typedef Status (*pf_XGetGeometry)(Display* display, Drawable d, Window* root_return, int* x_return, int* y_return, unsigned int* width_return, unsigned int* height_return, unsigned int* border_width_return, unsigned int* depth_return);
typedef int (*pf_XGetWindowProperty)(Display *display, Window w, Atom property, long long_offset, long long_length, Bool _delete, Atom req_type, Atom* actual_type_return, int* actual_format_return, unsigned long* nitems_return, unsigned long* bytes_after_return, unsigned char** prop_return);
typedef int (*pf_XPending)(Display* display);
typedef int (*pf_XNextEvent)(Display* display, XEvent* event_return);
typedef int (*pf_XPeekEvent)(Display* display, XEvent* event_return);
typedef Status (*pf_XSendEvent)(Display *display, Window w, Bool propagate, long event_mask, XEvent *event_send);
typedef int (*pf_XFlush)(Display* display);
typedef int (*pf_XSync)(Display* display, Bool discard);
typedef Atom (*pf_XInternAtom)(Display* display, const char* name, Bool create);
typedef Status (*pf_XSetWMProtocols)(Display* display, Window w, Atom* protocols, int count);
typedef Status (*pf_XIconifyWindow)(Display* display, Window w, int screen_number);
typedef void (*pf_XFree)(void*);
typedef int (*pf_XSelectInput)(Display* display, Window w, long event_mask);
typedef int (*pf_XLookupString)(XKeyEvent* event_struct, char* buffer_return, int bytes_buffer, KeySym* keysym_return, XComposeStatus* status_in_out);
typedef int (*pf_XQueryKeymap)(Display *display, char keys_return[32]);
typedef Bool (*pf_XQueryExtension)(Display* display, const char* name, int* major_opcode_return, int* first_event_return, int* first_error_return);
typedef Bool (*pf_XGetEventData)(Display *display, XGenericEventCookie *cookie);
typedef void (*pf_XFreeEventData)(Display *display, XGenericEventCookie *cookie);
/******************************************************************************/
typedef struct XlibFunctions
{
pf_XOpenDisplay OpenDisplay;
pf_XCloseDisplay CloseDisplay;
pf_XMoveWindow MoveWindow;
pf_XResizeWindow ResizeWindow;
pf_XMapRaised MapRaised;
pf_XMapWindow MapWindow;
pf_XUnmapWindow UnmapWindow;
pf_XStoreName StoreName;
pf_XDestroyWindow DestroyWindow;
pf_XCreateSimpleWindow CreateSimpleWindow;
pf_XGetGeometry GetGeometry;
pf_XGetWindowProperty GetWindowProperty;
pf_XPending Pending;
pf_XNextEvent NextEvent;
pf_XPeekEvent PeekEvent;
pf_XSendEvent SendEvent;
pf_XFlush Flush;
pf_XSync Sync;
pf_XInternAtom InternAtom;
pf_XSetWMProtocols SetWMProtocols;
pf_XIconifyWindow IconifyWindow;
pf_XFree Free;
pf_XSelectInput SelectInput;
pf_XLookupString LookupString;
pf_XQueryKeymap QueryKeymap;
pf_XQueryExtension QueryExtension;
pf_XGetEventData GetEventData;
pf_XFreeEventData FreeEventData;
void* xlib;
} XlibFunctions;
/******************************************************************************/
typedef struct SST_GraphicsEnumerator_Xlib
{
uint32_t width;
uint32_t height;
uint32_t bpp;
} SST_GraphicsEnumerator_Xlib;
/******************************************************************************/
struct SST_Window_Xlib;
typedef struct SST_DisplayTarget_Xlib
{
EventQueue eventQueue;
uint8_t keymapBitvector[32]; /* Bitmap similar to XQueryKeymap() */
pthread_mutex_t eventLock; /* Lock protecting user events, since they may be freely added by other threads */
EventQueue userEventQueue;
Display* display;
struct SST_Window_Xlib* firstWindow;
int relativeMouse; /* Is relative mouse move enabled? */
int ewmhSupport; /* Extended WM Hints, -1: not checked, 0: not supported, else: supported */
int xi2Support; /* XInput2 support, -1: not checked, 0: not supported, else: supported */
int xi2opcode; /* XI2 opcode */
Atom atomWmProtocols;
Atom atomWmDeleteWindow;
} SST_DisplayTarget_Xlib;
/******************************************************************************/
typedef struct SST_Window_Xlib
{
struct SST_Window_Xlib* next;
SST_DisplayTarget_Xlib* owner;
Window xwin;
int isFullscreen;
/* Because configure requests cover a wide variety of events,
keep these "last" parameters to check if an event actually occured */
int lastX, lastY;
int lastWidth, lastHeight;
/* Software rendering support */
XImage* softwareImage;
void* softwareBackbuffer;
uint32_t softwarePitch;
} SST_Window_Xlib;
/******************************************************************************/
typedef struct SST_OpenGLContext_Xlib
{
SST_DisplayTarget_Xlib* displayTarget;
uint16_t ctxVersion[2]; /* context version major/minor */
/* GLX Fields */
int legacyEnabled; /* Did we use legacy GLX (< 1.4) context support? */
GLXContext glxcontext;
GLXFunctions glX;
Window win; /* Window context is bound to */
/* EGL fields */
} SST_OpenGLContext_Xlib;
/******************************************************************************/
extern XlibFunctions X;
int loadXlib();
void unloadXlib();
#endif