Begin removing SDL

Window and OpenGL context creation working.
Keyboard, mouse, window events not yet working.
This commit is contained in:
Josh Holtrop 2017-09-27 20:33:18 -04:00
parent 1c673817d2
commit ff89fc7ca7
5 changed files with 155 additions and 46 deletions

94
src/gui/Gui-X.cc Normal file
View File

@ -0,0 +1,94 @@
#ifdef GUI_X
#include "Gui.h"
#include <GL/glx.h>
#include <stdio.h>
static Display * g_display;
static XVisualInfo * g_vi;
static XSetWindowAttributes g_swa;
static GLXContext g_context;
static Bool WaitForNotify(Display * display, XEvent * event, XPointer arg)
{
return (event->type == MapNotify) && (event->xmap.window == (Window)arg);
}
/**
* Initialize the Gui subsystem.
*
* @return true on success, false on failure
*/
bool Gui_Init()
{
static int glx_attribute_list[] = {
GLX_RGBA,
GLX_DOUBLEBUFFER,
None,
};
g_display = XOpenDisplay(NULL);
if (g_display == NULL)
{
fprintf(stderr, "XOpenDisplay() failure\n");
return false;
}
g_vi = glXChooseVisual(g_display, DefaultScreen(g_display),
glx_attribute_list);
if (g_vi == NULL)
{
fprintf(stderr, "glXChooseVisual() failure\n");
return false;
}
g_context = glXCreateContext(g_display, g_vi, NULL, True);
if (g_context == NULL)
{
fprintf(stderr, "glXCreateContext() failure\n");
return false;
}
Colormap colormap = XCreateColormap(g_display,
RootWindow(g_display, g_vi->screen), g_vi->visual, AllocNone);
g_swa.colormap = colormap;
g_swa.border_pixel = 0;
g_swa.event_mask = StructureNotifyMask;
return true;
}
void * Gui_CreateWindow()
{
XEvent event;
Window window = XCreateWindow(g_display,
RootWindow(g_display, g_vi->screen),
0, 0, 800, 800, 0, g_vi->depth, InputOutput, g_vi->visual,
CWBorderPixel | CWColormap | CWEventMask, &g_swa);
XMapWindow(g_display, window);
XIfEvent(g_display, &event, WaitForNotify, (XPointer)window);
if (glXMakeCurrent(g_display, window, g_context) == False)
{
fprintf(stderr, "glXMakeCurrent() failure\n");
XDestroyWindow(g_display, window);
return nullptr;
}
return (void *)window;
}
void Gui_SwapBuffers(void * window)
{
glXSwapBuffers(g_display, (Window)window);
}
void Gui_CloseWindow(void * window)
{
XDestroyWindow(g_display, (Window)window);
}
void Gui_WaitForEvent(Gui_Event * event)
{
}
#endif

19
src/gui/Gui.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef GUI_H
#define GUI_H
#include <stdint.h>
#define GUI_EVENT_CLOSE_WINDOW 1u
typedef struct
{
uint8_t type;
} Gui_Event;
bool Gui_Init();
void * Gui_CreateWindow();
void Gui_SwapBuffers(void * window);
void Gui_CloseWindow(void * window);
void Gui_WaitForEvent(Gui_Event * event);
#endif

View File

@ -2,13 +2,16 @@
#include "Window.h" #include "Window.h"
#include "Runtime.h" #include "Runtime.h"
#include "BufferPane.h" #include "BufferPane.h"
#include "Gui.h"
#include <iostream> #include <iostream>
#include "jes_icon-32x32.h" #include "jes_icon-32x32.h"
#include <unistd.h>
#define INITIAL_WIDTH 800 #define INITIAL_WIDTH 800
#define INITIAL_HEIGHT 800 #define INITIAL_HEIGHT 800
#define FONT_SIZE 16 #define FONT_SIZE 16
#if 0
struct struct
{ {
SDL_TimerID timer_id; SDL_TimerID timer_id;
@ -16,32 +19,7 @@ struct
bool pressed; bool pressed;
bool event_pending; bool event_pending;
} Key_Statuses[SDL_NUM_SCANCODES]; } Key_Statuses[SDL_NUM_SCANCODES];
#endif
/**
* Initialize SDL.
*
* @retval true SDL was loaded successfully.
* @retval false Loading SDL failed.
*/
static bool Initialize_SDL()
{
static bool initialized = false;
if (initialized)
{
return true;
}
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0)
{
return false;
}
atexit(SDL_Quit);
initialized = true;
return true;
}
/** /**
* Initialize OpenGL. * Initialize OpenGL.
@ -80,6 +58,7 @@ static bool Initialize_OpenGL()
return true; return true;
} }
#if 0
void Window::set_window_icon() void Window::set_window_icon()
{ {
SDL_Surface * surface = SDL_CreateRGBSurfaceFrom((void *)jes_icon_32x32, 32, 32, 24, 32 * 3, 0xFF0000u, 0xFF00u, 0xFFu, 0u); SDL_Surface * surface = SDL_CreateRGBSurfaceFrom((void *)jes_icon_32x32, 32, 32, 24, 32 * 3, 0xFF0000u, 0xFF00u, 0xFFu, 0u);
@ -88,6 +67,7 @@ void Window::set_window_icon()
SDL_FreeSurface(surface); SDL_FreeSurface(surface);
} }
#endif
/** /**
* Create a Window. * Create a Window.
@ -97,28 +77,22 @@ void Window::set_window_icon()
*/ */
bool Window::create(std::shared_ptr<Buffer> buffer) bool Window::create(std::shared_ptr<Buffer> buffer)
{ {
if (!Initialize_SDL()) if (!Gui_Init())
{ {
std::cerr << "Error initializing SDL" << std::endl; std::cerr << "Error initializing GUI" << std::endl;
return false; return false;
} }
m_window = SDL_CreateWindow( m_window = Gui_CreateWindow();
APPNAME,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
INITIAL_WIDTH,
INITIAL_HEIGHT,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
if (m_window == NULL) if (m_window == NULL)
{ {
std::cerr << "Error creating SDL window" << std::endl; std::cerr << "Error creating window" << std::endl;
return false; return false;
} }
#if 0
set_window_icon(); set_window_icon();
#endif
(void)SDL_GL_CreateContext(m_window);
if (!Initialize_OpenGL()) if (!Initialize_OpenGL())
{ {
@ -169,6 +143,7 @@ bool Window::create(std::shared_ptr<Buffer> buffer)
*/ */
void Window::run_event_loop() void Window::run_event_loop()
{ {
#if 0
SDL_Event event; SDL_Event event;
while ((!m_exit_requested) && SDL_WaitEvent(&event)) while ((!m_exit_requested) && SDL_WaitEvent(&event))
@ -180,8 +155,12 @@ void Window::run_event_loop()
redraw(); redraw();
} }
} }
#endif
redraw();
sleep(5);
} }
#if 0
Uint32 Key_Repeat(Uint32 interval, void * param) Uint32 Key_Repeat(Uint32 interval, void * param)
{ {
if (Key_Statuses[(uintptr_t)param].pressed) if (Key_Statuses[(uintptr_t)param].pressed)
@ -423,10 +402,15 @@ void Window::handle_keyval(uint32_t keyval)
break; break;
} }
} }
#endif
void Window::resize() void Window::resize()
{ {
m_width = 800;
m_height = 800;
#if 0
SDL_GetWindowSize(m_window, &m_width, &m_height); SDL_GetWindowSize(m_window, &m_width, &m_height);
#endif
glViewport(0, 0, m_width, m_height); glViewport(0, 0, m_width, m_height);
m_gl->resize(m_width, m_height); m_gl->resize(m_width, m_height);
int command_buffer_height = m_command_buffer_screen_rows * m_font->get_line_height(); int command_buffer_height = m_command_buffer_screen_rows * m_font->get_line_height();
@ -453,9 +437,10 @@ void Window::redraw()
m_gl->draw_rect(0, m_command_buffer_screen_rows * m_font->get_line_height(), m_width, 1, 0.5, 0.5, 0.5, 1.0); m_gl->draw_rect(0, m_command_buffer_screen_rows * m_font->get_line_height(), m_width, 1, 0.5, 0.5, 0.5, 1.0);
m_command_buffer_pane->draw(); m_command_buffer_pane->draw();
SDL_GL_SwapWindow(m_window); Gui_SwapBuffers(m_window);
} }
#if 0
uint32_t Window::get_keyval(SDL_Keycode keysym) uint32_t Window::get_keyval(SDL_Keycode keysym)
{ {
uint32_t keyval = keysym; uint32_t keyval = keysym;
@ -560,6 +545,7 @@ uint32_t Window::get_shifted(uint32_t keysym)
return 0u; return 0u;
} }
#endif
void Window::change_focus(std::shared_ptr<BufferPane> buffer_pane) void Window::change_focus(std::shared_ptr<BufferPane> buffer_pane)
{ {

View File

@ -3,7 +3,6 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include <SDL.h>
#include "Font.h" #include "Font.h"
#include "Buffer.h" #include "Buffer.h"
#include "GL.h" #include "GL.h"
@ -55,19 +54,23 @@ protected:
void resize(); void resize();
void redraw(); void redraw();
#if 0
void handle_event(SDL_Event & event); void handle_event(SDL_Event & event);
void handle_keysym(uint32_t keysym); void handle_keysym(uint32_t keysym);
void handle_keyval(uint32_t keyval); void handle_keyval(uint32_t keyval);
uint32_t get_keyval(SDL_Keycode keysym); uint32_t get_keyval(SDL_Keycode keysym);
uint32_t get_shifted(uint32_t keysym); uint32_t get_shifted(uint32_t keysym);
#endif
void change_focus(std::shared_ptr<BufferPane> buffer_pane); void change_focus(std::shared_ptr<BufferPane> buffer_pane);
#if 0
void set_window_icon(); void set_window_icon();
#endif
void handle_command(const EncodedString & command); void handle_command(const EncodedString & command);
void command_write_file(const CommandParser & cp); void command_write_file(const CommandParser & cp);
void command_quit(const CommandParser & cp); void command_quit(const CommandParser & cp);
SDL_Window * m_window; void * m_window;
bool m_exit_requested; bool m_exit_requested;
bool m_redraw_requested; bool m_redraw_requested;
int m_width; int m_width;
@ -84,7 +87,9 @@ protected:
std::shared_ptr<Buffer> m_command_buffer; std::shared_ptr<Buffer> m_command_buffer;
std::shared_ptr<BufferPane> m_command_buffer_pane; std::shared_ptr<BufferPane> m_command_buffer_pane;
#if 0
Uint16 m_keymod; Uint16 m_keymod;
#endif
}; };
#endif #endif

15
wscript
View File

@ -11,8 +11,11 @@ def options(opt):
def configure(conf): def configure(conf):
conf.load("compiler_c compiler_cxx") conf.load("compiler_c compiler_cxx")
conf.check(header_name = "getopt.h", global_define = False) conf.check(header_name = "getopt.h", global_define = False)
conf.check_cfg(package = "sdl2", args = "--cflags --libs")
conf.check_cfg(package = "freetype2", uselib_store = "FreeType2", args = "--cflags --libs") conf.check_cfg(package = "freetype2", uselib_store = "FreeType2", args = "--cflags --libs")
if platform.system() == "Linux":
conf.check(header_name = "X11/Xlib.h", global_define = False)
elif platform.system() == "Windows":
conf.check(header_name = "windows.h", global_define = False)
def build(bld): def build(bld):
defines = ['APPNAME="%s"' % APPNAME] defines = ['APPNAME="%s"' % APPNAME]
@ -22,9 +25,11 @@ def build(bld):
libs = [] libs = []
if platform.system() == "Linux": if platform.system() == "Linux":
defines += ["PLATFORM_LINUX"] defines += ["PLATFORM_LINUX"]
libs += ["dl", "GL"] defines += ["GUI_X"]
elif re.search(r'MINGW', platform.system()): libs += ["dl", "GL", "X11"]
elif platform.system() == "Windows":
defines += ["PLATFORM_WINDOWS"] defines += ["PLATFORM_WINDOWS"]
defines += ["GUI_WINDOWS"]
libs += ["opengl32"] libs += ["opengl32"]
defines += ['GLCXX_GL_INCLUDE="gl3w.h"'] defines += ['GLCXX_GL_INCLUDE="gl3w.h"']
sources = bld.path.ant_glob(["src/**/*.cc", "src/**/*.c", "libs/glcxx/src/glcxx/*"]) sources = bld.path.ant_glob(["src/**/*.cc", "src/**/*.c", "libs/glcxx/src/glcxx/*"])
@ -35,7 +40,7 @@ def build(bld):
defines = defines, defines = defines,
cxxflags = ["-Wall", "-std=gnu++14", "-O2", "-Wno-switch"], cxxflags = ["-Wall", "-std=gnu++14", "-O2", "-Wno-switch"],
lib = libs, lib = libs,
uselib = ["SDL2", "FreeType2"]) uselib = ["FreeType2"])
test_libs = libs + [] test_libs = libs + []
if platform.system() == "Linux": if platform.system() == "Linux":
@ -56,4 +61,4 @@ def build(bld):
lib = test_libs, lib = test_libs,
cxxflags = ["-Wall", "-std=gnu++14", "--coverage", "-Wno-switch", "-include", "iostream"], cxxflags = ["-Wall", "-std=gnu++14", "--coverage", "-Wno-switch", "-include", "iostream"],
linkflags = ["--coverage"], linkflags = ["--coverage"],
uselib = ["SDL2", "FreeType2"]) uselib = ["FreeType2"])