More progress with xlib and glx

This commit is contained in:
2026-08-06 13:17:02 +03:00
parent 4ad7ee307b
commit 1ed62b85bb
3 changed files with 100 additions and 15 deletions

View File

@@ -6,6 +6,19 @@
#include "DynString.h"
#include "log.h"
static void DynString_reserve(DynString* dstr, const size_t new_capacity) {
if (dstr->capacity >= new_capacity) {
return;
}
errno = 0;
dstr->data = (char*) realloc(dstr->data, sizeof(char) * new_capacity);
if (errno != 0) {
LOG_FATAL("Ran out of memory");
}
dstr->capacity = new_capacity;
}
DynString DynString_alloc(const char* str, const size_t len) {
DynString dstr = {
.data = (char*) malloc(sizeof(char) * (len + 1)),
@@ -94,19 +107,6 @@ bool DynString_equal_next_chars_c_str(
return true;
}
void DynString_reserve(DynString* dstr, const size_t new_capacity) {
if (dstr->capacity >= new_capacity) {
return;
}
errno = 0;
dstr->data = (char*) realloc(dstr->data, sizeof(char) * new_capacity);
if (errno != 0) {
LOG_FATAL("Ran out of memory");
}
dstr->capacity = new_capacity;
}
void DynString_concat_c_str(
DynString* dstr,
const char* str,

View File

@@ -1,3 +1,4 @@
#include <X11/X.h>
#ifdef _WIN32
#include <assert.h>
@@ -238,6 +239,73 @@ void print_info(Display* display) {
puts("");
}
void glx_print_client_info(Display* display) {
const char* glx_client_vendor_str = glXGetClientString(display, GLX_VENDOR);
printf("Client GLX_VENDOR: %s\n", glx_client_vendor_str);
const char* glx_client_version_str = glXGetClientString(display, GLX_VERSION);
printf("Client GLX_VERSION: %s\n", glx_client_version_str);
const char* glx_client_extensions_str = glXGetClientString(display, GLX_EXTENSIONS);
printf("Client GLX_EXTENSIONS: %s\n", glx_client_extensions_str);
}
void glx_print_server_info(Display* display) {
const char* glx_server_vendor_str = glXQueryServerString(display, DefaultScreen(display), GLX_VENDOR);
printf("Server GLX_VENDOR: %s\n", glx_server_vendor_str);
const char* glx_server_version_str = glXQueryServerString(display, DefaultScreen(display), GLX_VERSION);
printf("Server GLX_VERSION: %s\n", glx_server_version_str);
const char* glx_server_extensions_str = glXQueryServerString(display, DefaultScreen(display), GLX_EXTENSIONS);
printf("Server GLX_EXTENSIONS: %s\n", glx_server_extensions_str);
}
void print_glxfbconfig(Display* display, const GLXFBConfig* cfg) {
int value = 0;
#define PRINT_GLXFBCONFIG_VALUE(attrib) \
value = 0; \
if (glXGetFBConfigAttrib(display, *cfg, attrib, &value) != Success) { \
LOG_FATALF("Invalid attrib %s", #attrib); \
} \
printf(" %s: %d\n", #attrib, value)
puts("{");
PRINT_GLXFBCONFIG_VALUE(GLX_FBCONFIG_ID);
PRINT_GLXFBCONFIG_VALUE(GLX_BUFFER_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_LEVEL);
PRINT_GLXFBCONFIG_VALUE(GLX_DOUBLEBUFFER);
PRINT_GLXFBCONFIG_VALUE(GLX_STEREO);
PRINT_GLXFBCONFIG_VALUE(GLX_AUX_BUFFERS);
PRINT_GLXFBCONFIG_VALUE(GLX_RED_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_GREEN_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_BLUE_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_ALPHA_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_DEPTH_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_STENCIL_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_ACCUM_RED_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_ACCUM_GREEN_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_ACCUM_BLUE_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_ACCUM_ALPHA_SIZE);
PRINT_GLXFBCONFIG_VALUE(GLX_SAMPLE_BUFFERS);
PRINT_GLXFBCONFIG_VALUE(GLX_SAMPLES);
PRINT_GLXFBCONFIG_VALUE(GLX_RENDER_TYPE);
PRINT_GLXFBCONFIG_VALUE(GLX_DRAWABLE_TYPE);
PRINT_GLXFBCONFIG_VALUE(GLX_X_RENDERABLE);
PRINT_GLXFBCONFIG_VALUE(GLX_X_VISUAL_TYPE);
PRINT_GLXFBCONFIG_VALUE(GLX_CONFIG_CAVEAT);
PRINT_GLXFBCONFIG_VALUE(GLX_TRANSPARENT_TYPE);
PRINT_GLXFBCONFIG_VALUE(GLX_TRANSPARENT_INDEX_VALUE);
PRINT_GLXFBCONFIG_VALUE(GLX_TRANSPARENT_RED_VALUE);
PRINT_GLXFBCONFIG_VALUE(GLX_TRANSPARENT_GREEN_VALUE);
PRINT_GLXFBCONFIG_VALUE(GLX_TRANSPARENT_BLUE_VALUE);
PRINT_GLXFBCONFIG_VALUE(GLX_TRANSPARENT_ALPHA_VALUE);
PRINT_GLXFBCONFIG_VALUE(GLX_MAX_PBUFFER_WIDTH);
PRINT_GLXFBCONFIG_VALUE(GLX_MAX_PBUFFER_HEIGHT);
PRINT_GLXFBCONFIG_VALUE(GLX_MAX_PBUFFER_PIXELS);
PRINT_GLXFBCONFIG_VALUE(GLX_VISUAL_ID);
puts("}");
#undef PRINT_GLXFBCONFIG_VALUE
}
int main() {
Display* display = XOpenDisplay(NULL);
if (display == NULL) {
@@ -276,7 +344,6 @@ int main() {
printf(" %s\n", DynString_c_str(glx_extensions + i));
}
// XVisualInfo visual_info = { 0 };
// Status xstatus = XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &visual_info);
// if (xstatus == 0) {

View File

@@ -11,7 +11,7 @@ void test_DynString_alloc(void** state) {
assert_memory_equal(dstr.data, c_str, c_str_len + 1);
assert_true(dstr.len == c_str_len);
assert_true(dstr.capacity == c_str_len);
assert_true(dstr.capacity == c_str_len + 1);
free(dstr.data);
}
@@ -114,6 +114,24 @@ void test_DynString_split(void** state) {
assert_true(arr_len == 2);
assert_string_equal(DynString_c_str(arr), "Hello");
assert_string_equal(DynString_c_str(arr + 1), "World");
DynString_free(&dstr);
for (size_t i = 0; i < arr_len; i++) {
DynString_free(arr + i);
}
arr = NULL;
dstr = DynString_alloc(" Hello World", strlen(" Hello World"));
arr_len = 0;
arr = DynString_split(&dstr, " ", &arr_len);
assert_true(arr_len == 3);
assert_string_equal(DynString_c_str(arr), "");
assert_string_equal(DynString_c_str(arr + 1), "Hello");
assert_string_equal(DynString_c_str(arr + 2), "World");
DynString_free(&dstr);
for (size_t i = 0; i < arr_len; i++) {
DynString_free(arr + i);
}
arr = NULL;
}
int main() {