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