add jtk.c
This commit is contained in:
parent
18ed74615a
commit
4e6c392d44
@ -4,6 +4,7 @@ end
|
||||
|
||||
build do
|
||||
main_env = Rscons::Environment.new do |env|
|
||||
env["LIBS"] += %w[X11 GLX]
|
||||
env["sources"] = glob("src/**/*.{c,d}")
|
||||
env["D_IMPORT_PATH"] += glob("src/**")
|
||||
env.Program("jes", "${sources}")
|
||||
|
@ -1,53 +0,0 @@
|
||||
struct Event
|
||||
{
|
||||
enum Type : ubyte
|
||||
{
|
||||
WINDOW_CLOSE,
|
||||
WINDOW_EXPOSE,
|
||||
KEY_PRESS,
|
||||
KEY_RELEASE,
|
||||
BUTTON_PRESS,
|
||||
BUTTON_RELEASE,
|
||||
TIMER,
|
||||
WINDOW_RESIZE,
|
||||
};
|
||||
|
||||
struct KeyEvent
|
||||
{
|
||||
bool repeat;
|
||||
uint key;
|
||||
uint x_keycode;
|
||||
};
|
||||
|
||||
struct ButtonEvent
|
||||
{
|
||||
uint mods;
|
||||
ubyte button;
|
||||
};
|
||||
|
||||
struct TimerEvent
|
||||
{
|
||||
uint timer_id;
|
||||
void * user1;
|
||||
void * user2;
|
||||
};
|
||||
|
||||
struct WindowResizeEvent
|
||||
{
|
||||
uint width;
|
||||
uint height;
|
||||
};
|
||||
|
||||
Type type;
|
||||
union
|
||||
{
|
||||
KeyEvent key;
|
||||
ButtonEvent button;
|
||||
TimerEvent timer;
|
||||
WindowResizeEvent resize;
|
||||
};
|
||||
}
|
||||
|
||||
class Window
|
||||
{
|
||||
}
|
54
src/jes/gui/jtk.c
Normal file
54
src/jes/gui/jtk.c
Normal file
@ -0,0 +1,54 @@
|
||||
#include <GL/glx.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
static Display * g_display;
|
||||
static XVisualInfo * g_vi;
|
||||
static XSetWindowAttributes g_swa;
|
||||
static GLXContext g_context;
|
||||
|
||||
/**
|
||||
* Initialize the Jtk subsystem.
|
||||
*
|
||||
* @return true on success, false on failure
|
||||
*/
|
||||
bool jtk_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 |
|
||||
KeyPressMask | KeyReleaseMask |
|
||||
ButtonPressMask | ButtonReleaseMask;
|
||||
|
||||
return true;
|
||||
}
|
68
src/jes/gui/jtk.d
Normal file
68
src/jes/gui/jtk.d
Normal file
@ -0,0 +1,68 @@
|
||||
private extern(C) bool jtk_init();
|
||||
|
||||
struct Jtk
|
||||
{
|
||||
struct Event
|
||||
{
|
||||
enum Type : ubyte
|
||||
{
|
||||
WINDOW_CLOSE,
|
||||
WINDOW_EXPOSE,
|
||||
KEY_PRESS,
|
||||
KEY_RELEASE,
|
||||
BUTTON_PRESS,
|
||||
BUTTON_RELEASE,
|
||||
TIMER,
|
||||
WINDOW_RESIZE,
|
||||
};
|
||||
|
||||
struct KeyEvent
|
||||
{
|
||||
bool repeat;
|
||||
uint key;
|
||||
uint x_keycode;
|
||||
};
|
||||
|
||||
struct ButtonEvent
|
||||
{
|
||||
uint mods;
|
||||
ubyte button;
|
||||
};
|
||||
|
||||
struct TimerEvent
|
||||
{
|
||||
uint timer_id;
|
||||
void * user1;
|
||||
void * user2;
|
||||
};
|
||||
|
||||
struct WindowResizeEvent
|
||||
{
|
||||
uint width;
|
||||
uint height;
|
||||
};
|
||||
|
||||
Type type;
|
||||
union
|
||||
{
|
||||
KeyEvent key;
|
||||
ButtonEvent button;
|
||||
TimerEvent timer;
|
||||
WindowResizeEvent resize;
|
||||
};
|
||||
}
|
||||
|
||||
class Window
|
||||
{
|
||||
}
|
||||
|
||||
static bool init()
|
||||
{
|
||||
if (!jtk_init())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,4 +1,7 @@
|
||||
import jes.gui.jtk;
|
||||
|
||||
int main(string[] args)
|
||||
{
|
||||
Jtk.init();
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user