Begin removing SDL
Window and OpenGL context creation working. Keyboard, mouse, window events not yet working.
This commit is contained in:
parent
1c673817d2
commit
ff89fc7ca7
94
src/gui/Gui-X.cc
Normal file
94
src/gui/Gui-X.cc
Normal 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
19
src/gui/Gui.h
Normal 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
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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
15
wscript
@ -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"])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user