init
This commit is contained in:
parent
f2f42466b0
commit
5bcfcfa400
14
.clang-format
Normal file
14
.clang-format
Normal file
@ -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
|
||||||
|
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
*.o
|
||||||
|
example
|
||||||
|
compile_flags.txt
|
19
Makefile
Normal file
19
Makefile
Normal file
@ -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
|
||||||
|
|
110
based_gui.c
Normal file
110
based_gui.c
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
#include "based_gui.h"
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/extensions/Xdbe.h>
|
||||||
|
#include <X11/xpm.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
struct BasedWindow {
|
||||||
|
int a;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BasedApp {
|
||||||
|
Display* display;
|
||||||
|
Window window;
|
||||||
|
XdbeBackBuffer back_buffer;
|
||||||
|
bool has_back_buffer;
|
||||||
|
XdbeSwapInfo swap_info;
|
||||||
|
Atom wm_delete_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void based_window_delete(BasedWindow* window) { free(window); }
|
||||||
|
|
||||||
|
void based_app_delete(BasedApp* app) { free(app); }
|
13
based_gui.h
Normal file
13
based_gui.h
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user