Ver Fonte

More progress with xlib and glx

Aaro Saila há 3 meses atrás
pai
commit
1ed62b85bb
3 ficheiros alterados com 100 adições e 15 exclusões
  1. 13 13
      src/DynString.c
  2. 68 1
      src/main.c
  3. 19 1
      tests/main.c

+ 13 - 13
src/DynString.c

@@ -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,

+ 68 - 1
src/main.c

@@ -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) {

+ 19 - 1
tests/main.c

@@ -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() {