From 71d27edaf72f18ab0d6a31098aedf8c89ded400c Mon Sep 17 00:00:00 2001 From: SimonFJ20 Date: Wed, 8 Mar 2023 15:05:42 +0100 Subject: [PATCH] init --- .clang-format | 14 +++++++ .gitignore | 3 ++ Makefile | 19 +++++++++ based_gui.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ based_gui.h | 13 ++++++ example.c | 15 +++++++ 6 files changed, 174 insertions(+) create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 based_gui.c create mode 100644 based_gui.h create mode 100644 example.c diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..8ae9b75 --- /dev/null +++ b/.clang-format @@ -0,0 +1,14 @@ +BasedOnStyle: WebKit +IndentWidth: 4 +ColumnLimit: 80 +IndentCaseLabels: true +BreakBeforeBraces: Custom +BraceWrapping: + AfterFunction: true + SplitEmptyFunction: false +AlignAfterOpenBracket: BlockIndent +AlignOperands: AlignAfterOperator +BreakBeforeBinaryOperators: true +BinPackArguments: false +BinPackParameters: false + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a0a0e9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.o +example +compile_flags.txt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..23f5907 --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ + +CFLAGS = -std=c17 -Wall -Wextra -Wpedantic -Wconversion + +HEADERS = $(wildcard *.h) + +all: compile_flags.txt example + +example: based_gui.o example.o + gcc $^ -o $@ -lX11 -lXpm -lXext + +%.o: %.c $(HEADERS) + gcc $< -c -o $@ $(CFLAGS) + +clean: + rm -rf *.o wacc + +compile_flags.txt: + echo -xc $(CFLAGS) | sed 's/\s\+/\n/g' > compile_flags.txt + diff --git a/based_gui.c b/based_gui.c new file mode 100644 index 0000000..1d4f00f --- /dev/null +++ b/based_gui.c @@ -0,0 +1,110 @@ +#include "based_gui.h" +#include +#include +#include +#include +#include +#include + +struct BasedWindow { + int a; +}; + +struct BasedApp { + Display* display; + Window window; + XdbeBackBuffer back_buffer; + bool has_back_buffer; + XdbeSwapInfo swap_info; + Atom wm_delete_window; +}; + +void based_window_delete(BasedWindow* window) { (void)window; } + +BasedApp* based_app_new(void) +{ + BasedApp* app = malloc(sizeof(app)); + + XInitThreads(); + + app->display = XOpenDisplay(NULL); + + unsigned long white = WhitePixel(app->display, DefaultScreen(app->display)); + unsigned long black = BlackPixel(app->display, DefaultScreen(app->display)); + + app->window = XCreateSimpleWindow( + app->display, + DefaultRootWindow(app->display), + 0, + 0, + 500, + 500, + 0, + white, + white + ); + + app->has_back_buffer = false; + + // Create back buffer for double buffering + int xdbe_major_version, xdbe_minor_version; + if (XdbeQueryExtension( + app->display, &xdbe_major_version, &xdbe_minor_version + )) { + app->has_back_buffer = true; + + app->back_buffer + = XdbeAllocateBackBufferName(app->display, app->window, 0); + + app->swap_info + = (XdbeSwapInfo) { .swap_window = app->window, .swap_action = 0 }; + } + + XSelectInput( + app->display, app->window, ExposureMask | KeyPressMask | KeyReleaseMask + ); + + app->wm_delete_window + = XInternAtom(app->display, "WM_DELETE_WINDOW", false); + XSetWMProtocols(app->display, app->window, &app->wm_delete_window, 1); + + XVisualInfo vinfo; + XMatchVisualInfo( + app->display, DefaultScreen(app->display), 32, TrueColor, &vinfo + ); + + XMapWindow(app->display, app->window); + + return app; +} + +void based_app_delete(BasedApp* app) { (void)app; } + +BasedWindow* based_app_make_window(BasedApp* app) +{ + (void)app; + return NULL; +} + +void based_app_run(BasedApp* app) +{ + + XEvent event; + for (;;) { + XNextEvent(app->display, &event); + switch (event.type) { + case Expose: + if (!event.xexpose.x && !event.xexpose.y && !event.xexpose.width + && !event.xexpose.height) { + break; + } + break; + case ClientMessage: + if ((uint64_t)event.xclient.data.l[0] == app->wm_delete_window) + return; + } + + if (app->has_back_buffer) + XdbeSwapBuffers(app->display, &app->swap_info, 1); + } +} diff --git a/based_gui.h b/based_gui.h new file mode 100644 index 0000000..d2f9c5a --- /dev/null +++ b/based_gui.h @@ -0,0 +1,13 @@ +#ifndef BASED_GUI_H +#define BASED_GUI_H + +typedef struct BasedWindow BasedWindow; +void based_window_delete(BasedWindow* window); + +typedef struct BasedApp BasedApp; +BasedApp* based_app_new(void); +void based_app_delete(BasedApp* app); +BasedWindow* based_app_make_window(BasedApp* app); +void based_app_run(BasedApp* app); + +#endif diff --git a/example.c b/example.c new file mode 100644 index 0000000..0c2a8d6 --- /dev/null +++ b/example.c @@ -0,0 +1,15 @@ +#include "based_gui.h" +#include + +int main(void) +{ + BasedApp* app = based_app_new(); + + BasedWindow* window = based_app_make_window(app); + + based_app_run(app); + + based_window_delete(window); + + based_app_delete(app); +}