Initial commit
- Basic main window - Are you sure you want to exit modal - Basic settings window
This commit is contained in:
commit
6632e58e61
|
@ -0,0 +1,4 @@
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
logmeow
|
||||||
|
logmeow.exe
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "imgui"]
|
||||||
|
path = imgui
|
||||||
|
url = https://github.com/ocornut/imgui.git
|
|
@ -0,0 +1,91 @@
|
||||||
|
#
|
||||||
|
# Cross Platform Makefile
|
||||||
|
# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X
|
||||||
|
#
|
||||||
|
# You will need SDL2 (http://www.libsdl.org):
|
||||||
|
# Linux:
|
||||||
|
# apt-get install libsdl2-dev
|
||||||
|
# Mac OS X:
|
||||||
|
# brew install sdl2
|
||||||
|
# MSYS2:
|
||||||
|
# pacman -S mingw-w64-i686-SDL2
|
||||||
|
#
|
||||||
|
|
||||||
|
#CXX = g++
|
||||||
|
#CXX = clang++
|
||||||
|
|
||||||
|
EXE = logmeow
|
||||||
|
IMGUI_DIR = imgui
|
||||||
|
SOURCES = main.cpp config.cpp event_loop.cpp
|
||||||
|
SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp
|
||||||
|
SOURCES += $(IMGUI_DIR)/misc/cpp/imgui_stdlib.cpp $(IMGUI_DIR)/backends/imgui_impl_sdl.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp
|
||||||
|
OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES))))
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
LINUX_GL_LIBS = -lGL
|
||||||
|
|
||||||
|
CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/misc/cpp -I$(IMGUI_DIR)/backends
|
||||||
|
CXXFLAGS += -g -Wall -Wformat
|
||||||
|
LIBS =
|
||||||
|
|
||||||
|
##---------------------------------------------------------------------
|
||||||
|
## OPENGL ES
|
||||||
|
##---------------------------------------------------------------------
|
||||||
|
|
||||||
|
## This assumes a GL ES library available in the system, e.g. libGLESv2.so
|
||||||
|
# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2
|
||||||
|
# LINUX_GL_LIBS = -lGLESv2
|
||||||
|
## If you're on a Raspberry Pi and want to use the legacy drivers,
|
||||||
|
## use the following instead:
|
||||||
|
# LINUX_GL_LIBS = -L/opt/vc/lib -lbrcmGLESv2
|
||||||
|
|
||||||
|
##---------------------------------------------------------------------
|
||||||
|
## BUILD FLAGS PER PLATFORM
|
||||||
|
##---------------------------------------------------------------------
|
||||||
|
|
||||||
|
ifeq ($(UNAME_S), Linux) #LINUX
|
||||||
|
ECHO_MESSAGE = "Linux"
|
||||||
|
LIBS += $(LINUX_GL_LIBS) -ldl `sdl2-config --libs`
|
||||||
|
|
||||||
|
CXXFLAGS += `sdl2-config --cflags`
|
||||||
|
CFLAGS = $(CXXFLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(UNAME_S), Darwin) #APPLE
|
||||||
|
ECHO_MESSAGE = "Mac OS X"
|
||||||
|
LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs`
|
||||||
|
LIBS += -L/usr/local/lib -L/opt/local/lib
|
||||||
|
|
||||||
|
CXXFLAGS += `sdl2-config --cflags`
|
||||||
|
CXXFLAGS += -I/usr/local/include -I/opt/local/include
|
||||||
|
CFLAGS = $(CXXFLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(OS), Windows_NT)
|
||||||
|
ECHO_MESSAGE = "MinGW"
|
||||||
|
LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2`
|
||||||
|
|
||||||
|
CXXFLAGS += `pkg-config --cflags sdl2`
|
||||||
|
CFLAGS = $(CXXFLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
##---------------------------------------------------------------------
|
||||||
|
## BUILD RULES
|
||||||
|
##---------------------------------------------------------------------
|
||||||
|
|
||||||
|
%.o:%.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
%.o:$(IMGUI_DIR)/%.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
%.o:$(IMGUI_DIR)/misc/cpp/%.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
%.o:$(IMGUI_DIR)/backends/%.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
$(EXE): $(OBJS)
|
||||||
|
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(EXE) $(OBJS)
|
|
@ -0,0 +1,71 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
std::string get_config_path() {
|
||||||
|
const char* path;
|
||||||
|
|
||||||
|
path = getenv("XDG_CONFIG_HOME");
|
||||||
|
if (path) {
|
||||||
|
return std::string(path) + "/logmeow/config";
|
||||||
|
}
|
||||||
|
path = getenv("HOME");
|
||||||
|
if (path) {
|
||||||
|
return std::string(path) + "/.config/logmeow/config";
|
||||||
|
}
|
||||||
|
|
||||||
|
throw std::runtime_error("cannot find suitable config folder, please set XDG_CONFIG_HOME or HOME");
|
||||||
|
}
|
||||||
|
|
||||||
|
Config parse_config(FILE* file) {
|
||||||
|
size_t line_capacity_size = 128 * sizeof(char);
|
||||||
|
char* line = static_cast<char*>(malloc(line_capacity_size));
|
||||||
|
if (line == nullptr) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
Config config;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
errno = 0;
|
||||||
|
if (getline(&line, &line_capacity_size, file) < 0) {
|
||||||
|
int errsv = errno;
|
||||||
|
free(line);
|
||||||
|
if (errsv == ENOMEM) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
} else if (errsv != 0) {
|
||||||
|
throw std::system_error(errsv, std::generic_category(), "getline()");
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (line_capacity_size == 0 || line[0] == '\0' || line[0] == '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (char* newline = strchr(line, '\n')) {
|
||||||
|
*newline = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp(line, "logcat_command=", 15 * sizeof(char)) == 0) {
|
||||||
|
config.logcat_command = &line[16];
|
||||||
|
} else {
|
||||||
|
std::invalid_argument e = std::invalid_argument(std::string("unknown config line: ") + line);
|
||||||
|
free(line);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_config(std::ofstream& file, const Config& config) {
|
||||||
|
file << "# This is an auto-generated file, comments made will be lost\n"
|
||||||
|
<< "# This is a poor man's config file \"format\", there are only three legal lines:\n"
|
||||||
|
<< "# # a comment, only available at the start of a line\n"
|
||||||
|
<< "# (an empty line, no whitespace)\n"
|
||||||
|
<< "# key=value pairs, no spaces around the delimiter, and no unknown keys\n\n"
|
||||||
|
<< "logcat_command=" << config.logcat_command;
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
struct Config {
|
||||||
|
std::string logcat_command;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string get_config_path();
|
||||||
|
Config parse_config(FILE* file);
|
||||||
|
void write_config(std::ofstream& file, const Config& config);
|
|
@ -0,0 +1,75 @@
|
||||||
|
#include <imgui.h>
|
||||||
|
#include <imgui_stdlib.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
static inline void settings_window(Config& inactive_config, bool* show_settings_window) {
|
||||||
|
// by default, the settings window is a bit cramped
|
||||||
|
ImGui::SetNextWindowSize(ImVec2(575, 75), ImGuiCond_FirstUseEver);
|
||||||
|
if (!ImGui::Begin("Settings", show_settings_window)) {
|
||||||
|
ImGui::End();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ImGui::Text("Persistence coming soon(tm)");
|
||||||
|
ImGui::InputTextWithHint("Logcat command", "adb logcat -Dv 'threadtime UTC epoch usec'", &inactive_config.logcat_command);
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void main_window(Config& active_config, Config& inactive_config, bool* show_demo_window,
|
||||||
|
bool* show_settings_window, bool* save_settings_when_settings_window_closed, bool* exit_requested_rev) {
|
||||||
|
if (!ImGui::Begin("LogMeow", exit_requested_rev)) {
|
||||||
|
ImGui::End();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ImGui::Checkbox("Show Dear ImGui Demo Window", show_demo_window);
|
||||||
|
if (ImGui::Button("Settings")) {
|
||||||
|
if (!*show_settings_window) {
|
||||||
|
inactive_config = active_config;
|
||||||
|
}
|
||||||
|
*show_settings_window = true;
|
||||||
|
*save_settings_when_settings_window_closed = true;
|
||||||
|
}
|
||||||
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void exit_modal_if_necessary(bool* run_event_loop) {
|
||||||
|
if (ImGui::BeginPopupModal("Exit?", nullptr, ImGuiWindowFlags_NoResize)) {
|
||||||
|
ImGui::Text("Are you sure you want to exit?");
|
||||||
|
|
||||||
|
if (ImGui::Button("Yes", ImVec2(120, 0))) {
|
||||||
|
*run_event_loop = false;
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("No", ImVec2(120, 0))) {
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
ImGui::SetItemDefaultFocus();
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void event_loop(Config& active_config, bool* run_event_loop) {
|
||||||
|
static bool show_demo_window = false;
|
||||||
|
static bool show_settings_window = false;
|
||||||
|
static bool save_settings_when_settings_window_closed = false;
|
||||||
|
static bool exit_requested_rev = true;
|
||||||
|
static Config inactive_config;
|
||||||
|
|
||||||
|
if (show_demo_window) {
|
||||||
|
ImGui::ShowDemoWindow(&show_demo_window);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (show_settings_window) {
|
||||||
|
settings_window(inactive_config, &show_settings_window);
|
||||||
|
} else if (save_settings_when_settings_window_closed) {
|
||||||
|
active_config = inactive_config;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!exit_requested_rev) {
|
||||||
|
ImGui::OpenPopup("Exit?");
|
||||||
|
exit_requested_rev = true;
|
||||||
|
}
|
||||||
|
exit_modal_if_necessary(run_event_loop);
|
||||||
|
main_window(active_config, inactive_config, &show_demo_window, &show_settings_window, &save_settings_when_settings_window_closed, &exit_requested_rev);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
void event_loop(Config& config, bool* run_event_loop);
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit e57871bb95faec757e51214bc0e1ae29b13258ab
|
|
@ -0,0 +1,20 @@
|
||||||
|
[Window][Debug##Default]
|
||||||
|
Pos=60,60
|
||||||
|
Size=400,400
|
||||||
|
Collapsed=0
|
||||||
|
|
||||||
|
[Window][LogMeow]
|
||||||
|
Pos=60,60
|
||||||
|
Size=339,94
|
||||||
|
Collapsed=0
|
||||||
|
|
||||||
|
[Window][Exit?]
|
||||||
|
Pos=549,324
|
||||||
|
Size=264,71
|
||||||
|
Collapsed=0
|
||||||
|
|
||||||
|
[Window][Settings]
|
||||||
|
Pos=88,228
|
||||||
|
Size=575,75
|
||||||
|
Collapsed=0
|
||||||
|
|
|
@ -0,0 +1,158 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
|
#include <imgui_impl_sdl.h>
|
||||||
|
#include <imgui_impl_opengl3.h>
|
||||||
|
#include <SDL.h>
|
||||||
|
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
||||||
|
#include <SDL_opengles2.h>
|
||||||
|
#else
|
||||||
|
#include <SDL_opengl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "event_loop.h"
|
||||||
|
|
||||||
|
int main(int, char**)
|
||||||
|
{
|
||||||
|
Config config;
|
||||||
|
FILE* config_file = nullptr;
|
||||||
|
try {
|
||||||
|
config_file = fopen(get_config_path().c_str(), "r");
|
||||||
|
if (config_file) {
|
||||||
|
config = parse_config(config_file);
|
||||||
|
} else if (errno != ENOENT) {
|
||||||
|
perror("Failed to open config file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
fprintf(stderr, "Failed to parse config: %s\n", e.what());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (config_file) {
|
||||||
|
if (fclose(config_file)) {
|
||||||
|
perror("Failed to close config file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup SDL
|
||||||
|
// (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems,
|
||||||
|
// depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to the latest version of SDL is recommended!)
|
||||||
|
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0)
|
||||||
|
{
|
||||||
|
printf("Error: %s\n", SDL_GetError());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decide GL+GLSL versions
|
||||||
|
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
||||||
|
// GL ES 2.0 + GLSL 100
|
||||||
|
const char* glsl_version = "#version 100";
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
// GL 3.2 Core + GLSL 150
|
||||||
|
const char* glsl_version = "#version 150";
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
||||||
|
#else
|
||||||
|
// GL 3.0 + GLSL 130
|
||||||
|
const char* glsl_version = "#version 130";
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Create window with graphics context
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
||||||
|
SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||||
|
SDL_Window* window = SDL_CreateWindow("LogMeow", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags);
|
||||||
|
SDL_GLContext gl_context = SDL_GL_CreateContext(window);
|
||||||
|
SDL_GL_MakeCurrent(window, gl_context);
|
||||||
|
SDL_GL_SetSwapInterval(1); // Enable vsync
|
||||||
|
|
||||||
|
// Setup Dear ImGui context
|
||||||
|
IMGUI_CHECKVERSION();
|
||||||
|
ImGui::CreateContext();
|
||||||
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
||||||
|
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
||||||
|
|
||||||
|
// Setup Dear ImGui style
|
||||||
|
ImGui::StyleColorsDark();
|
||||||
|
//ImGui::StyleColorsLight();
|
||||||
|
|
||||||
|
// Setup Platform/Renderer backends
|
||||||
|
ImGui_ImplSDL2_InitForOpenGL(window, gl_context);
|
||||||
|
ImGui_ImplOpenGL3_Init(glsl_version);
|
||||||
|
|
||||||
|
// Load Fonts
|
||||||
|
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
|
||||||
|
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
|
||||||
|
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
|
||||||
|
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
|
||||||
|
// - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering.
|
||||||
|
// - Read 'docs/FONTS.md' for more instructions and details.
|
||||||
|
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
|
||||||
|
//io.Fonts->AddFontDefault();
|
||||||
|
//io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f);
|
||||||
|
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
|
||||||
|
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
|
||||||
|
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
|
||||||
|
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
|
||||||
|
//IM_ASSERT(font != NULL);
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
bool run_event_loop = true;
|
||||||
|
while (run_event_loop)
|
||||||
|
{
|
||||||
|
// Poll and handle events (inputs, window resize, etc.)
|
||||||
|
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
|
||||||
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
||||||
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
||||||
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
|
SDL_Event event;
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||||
|
if (event.type == SDL_QUIT) {
|
||||||
|
run_event_loop = false;
|
||||||
|
} else if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window))
|
||||||
|
run_event_loop = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start the Dear ImGui frame
|
||||||
|
ImGui_ImplOpenGL3_NewFrame();
|
||||||
|
ImGui_ImplSDL2_NewFrame();
|
||||||
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
event_loop(config, &run_event_loop);
|
||||||
|
|
||||||
|
// Rendering
|
||||||
|
ImGui::Render();
|
||||||
|
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
|
||||||
|
glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||||
|
SDL_GL_SwapWindow(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
ImGui_ImplOpenGL3_Shutdown();
|
||||||
|
ImGui_ImplSDL2_Shutdown();
|
||||||
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
|
SDL_GL_DeleteContext(gl_context);
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
SDL_Quit();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue