You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
302 lines
7.7 KiB
302 lines
7.7 KiB
/* $Id: sdl_main.c,v 1.15 2014/02/12 21:23:06 steffen Exp $ */
|
|
#include <SDL.h>
|
|
#include "osmroute.h"
|
|
#include "system.h"
|
|
#include "memoryleak.h"
|
|
#include "sdl_port.h"
|
|
#include "gui.h"
|
|
|
|
#define RESOLUTION_X 640
|
|
#define RESOLUTION_Y 480
|
|
|
|
int msdl_eventloop ();
|
|
Uint32 msdl_timercallback (Uint32 interval, void *param);
|
|
int videoflags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_RESIZABLE | SDL_HWPALETTE;
|
|
|
|
SDL_TimerID cycletimer;
|
|
SDL_Surface *screen = NULL;
|
|
|
|
/*************************************************************************
|
|
*
|
|
* only needed for testing
|
|
*
|
|
*************************************************************************/
|
|
struct image *img, *img1;
|
|
|
|
void test_img () {
|
|
struct line_style style;
|
|
d_printf ("*** test_img () ***");
|
|
|
|
style.width = 1;
|
|
style.c = color[COLOR_green][3];
|
|
|
|
img = gfx_img_alloc (400, 300);
|
|
gfx_clear (img, &color[COLOR_blue][2]);
|
|
|
|
img1 = gfx_img_load ("sample_01.png");
|
|
gfx_draw_img (img, 10, 10, 150, 150, img1, 150, 150);
|
|
|
|
gfx_draw_text (img, 20, 10, "sample_01.png nur ein toller test bla bla", &color[COLOR_yellow][3]);
|
|
gfx_draw_text (img, 20, 30, "sample_01.png nur ein toller test bla bla", &color[COLOR_yellow][3]);
|
|
gfx_draw_text (NULL, 20, 10, "sample_01.png nur ein toller test bla bla", &color[COLOR_yellow][3]);
|
|
gfx_draw_text (NULL, 20, 30, "sample_01.png nur ein toller test bla bla", &color[COLOR_yellow][3]);
|
|
gfx_draw_line (img, 20, 100, 200, 100, style);
|
|
};
|
|
|
|
#define TEST_WIDTH 200
|
|
void test_draw () {
|
|
static int once = 1;
|
|
static int _delay = 0;
|
|
static int _tmpx, _tmpy = 0;
|
|
static int _tmpdx = 1, _tmpdy = 1;
|
|
struct line_style style;
|
|
GLfloat vp[] = {500, 210, 540, 210};
|
|
|
|
_delay ++;
|
|
gfx_clear (NULL, &color[COLOR_white][0]);
|
|
|
|
if (once) {
|
|
once = 0;
|
|
test_img ();
|
|
}
|
|
if (_tmpx > img->width-TEST_WIDTH) _tmpdx = -1;
|
|
if (_tmpx < 0) _tmpdx = 1;
|
|
if (_delay % 1 == 0) _tmpx += _tmpdx;
|
|
|
|
if (_tmpy > img->height-TEST_WIDTH) _tmpdy = -1;
|
|
if (_tmpy < 0) _tmpdy = 1;
|
|
if (_delay % 20 == 0) _tmpy += _tmpdy;
|
|
|
|
style.width = 1;
|
|
style.c = color[COLOR_white][3];
|
|
|
|
gfx_draw_line (NULL, 0, gfx_screensize.y, gfx_screensize.x, 0, style);
|
|
gfx_draw_line (NULL, gfx_screensize.x, gfx_screensize.y, 0, 0, style);
|
|
|
|
glColor4f (color[COLOR_green][3].c.r, color[COLOR_green][3].c.g, color[COLOR_green][3].c.b, 1.0f);
|
|
|
|
glLineWidth (style.width);
|
|
glColor4f (style.c.c.r, style.c.c.g, style.c.c.b, 1.0f);
|
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
glVertexPointer(2, GL_FLOAT, 0, vp);
|
|
glDrawArrays(GL_LINES,0,2);
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
|
|
|
gfx_draw_img (NULL, 10, 10, TEST_WIDTH, TEST_WIDTH, img, _tmpx, _tmpy);
|
|
|
|
style.c = color[COLOR_yellow][3];
|
|
gfx_draw_line (NULL, gfx_screensize.x, 0, 0, 10, style);
|
|
gfx_draw_text (NULL, 10, 300, "sollte gehen", &color[COLOR_red][3]);
|
|
gfx_draw_img (NULL, 20, 320, 150, 150, img1, 200, 200);
|
|
|
|
gfx_flip();
|
|
};
|
|
|
|
|
|
|
|
Uint32 msdl_timercallback (Uint32 interval, void *param) {
|
|
app_loop ();
|
|
|
|
d_printf ("timer %d", interval);
|
|
|
|
return (interval);
|
|
};
|
|
|
|
|
|
int msdl_eventloop () {
|
|
SDL_Event event, lastevent;
|
|
int gotevent = 0, keeppoll = 1;
|
|
GUIEvent gevent;
|
|
static int oldkey = 0;
|
|
|
|
/* only the last MOUSEMOTION event will handled */
|
|
while (keeppoll && SDL_PollEvent (&lastevent)) {
|
|
event = lastevent;
|
|
gotevent = 1;
|
|
keeppoll = 0;
|
|
if (event.type == SDL_MOUSEMOTION) keeppoll = 1;
|
|
}
|
|
if (gotevent) {
|
|
switch (event.type) {
|
|
case (SDL_QUIT):
|
|
app.status = APPSTATUS_quit;
|
|
break;
|
|
case SDL_VIDEORESIZE:
|
|
{
|
|
SDL_Surface *scr;
|
|
scr = SDL_SetVideoMode( event.resize.w, event.resize.h, 0, videoflags);
|
|
if ( !scr ) {
|
|
fprintf( stderr, "Could not get a surface after resize: %s\n", SDL_GetError( ) );
|
|
SDL_Quit();
|
|
exit (2);
|
|
}
|
|
gfx_resize (event.resize.w, event.resize.h);
|
|
draw ();
|
|
}
|
|
break;
|
|
case SDL_MOUSEMOTION:
|
|
gevent.scr_mpos.x = event.motion.x;
|
|
gevent.scr_mpos.y = event.motion.y;
|
|
gevent.mousebtn = event.motion.state;
|
|
gevent.event = EGUI_MOUSEMOVE;
|
|
gui_event (gevent);
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
gevent.scr_mpos.x = event.motion.x;
|
|
gevent.scr_mpos.y = event.motion.y;
|
|
gevent.mousebtn = 1;
|
|
gevent.event = EGUI_MOUSEPRESSED;
|
|
gui_event (gevent);
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONUP:
|
|
gevent.scr_mpos.x = event.motion.x;
|
|
gevent.scr_mpos.y = event.motion.y;
|
|
gevent.mousebtn = 1;
|
|
gevent.event = EGUI_MOUSERELEASED;
|
|
gui_event (gevent);
|
|
break;
|
|
|
|
case SDL_KEYDOWN: {
|
|
int keyu = 0;
|
|
d_printf ("keydown. old_key:%d keysym:%d ukey:%d", oldkey, event.key.keysym.sym, event.key.keysym.unicode);
|
|
if (oldkey != event.key.keysym.sym) {
|
|
keyu = oldkey = event.key.keysym.unicode;
|
|
gevent.keychar = keyu;
|
|
if (event.key.keysym.sym == SDLK_UP) gevent.key = GUIKEY_UP;
|
|
else if (event.key.keysym.sym == SDLK_DOWN) gevent.key = GUIKEY_DOWN;
|
|
else if (event.key.keysym.sym == SDLK_LEFT) gevent.key = GUIKEY_LEFT;
|
|
else if (event.key.keysym.sym == SDLK_RIGHT) gevent.key = GUIKEY_RIGHT;
|
|
else gevent.key = event.key.keysym.sym;
|
|
gevent.event = EGUI_KEYCHAR;
|
|
gevent.scr_mpos.x = -1;
|
|
gevent.scr_mpos.y = -1;
|
|
if (gui_event (gevent) != 0) draw();
|
|
}
|
|
} break;
|
|
case SDL_KEYUP:
|
|
d_printf ("keyup. old_key:%d keysym:%d ukey:%d", oldkey, event.key.keysym.sym, event.key.keysym.unicode);
|
|
oldkey = 0;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
else return 0;
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
* some input handling code.. in sdl it seemed to work fine... used alot
|
|
* within the bomberclone code.
|
|
*
|
|
int key = 0, keyu = 0;
|
|
|
|
ki->changed = 0;
|
|
|
|
if (event->type == SDL_KEYDOWN && keybinput_oldkey != event->key.keysym.sym) {
|
|
key = keybinput_oldkey = event->key.keysym.sym;
|
|
keyu = event->key.keysym.unicode;
|
|
|
|
if (key == 8) { // BACKSPACE
|
|
if (ki->curpos > 0) {
|
|
ki->curpos--;
|
|
ki->text[ki->curpos] = 0;
|
|
ki->changed = 1;
|
|
}
|
|
}
|
|
else if (ki->type == KEYBI_text && ((keyu >= 32 && keyu <= 126) || (keyu >= 128 && keyu <= 255))) {
|
|
if (ki->curpos < ki->maxlen) {
|
|
ki->text[ki->curpos++] = event->key.keysym.unicode;
|
|
ki->text[ki->curpos] = 0;
|
|
ki->changed = 1;
|
|
}
|
|
}
|
|
else if (ki->type == KEYBI_int && (keyu == '-' || (keyu >= '0' && keyu <= '9'))) {
|
|
if (ki->curpos < 255) {
|
|
ki->text[ki->curpos] = event->key.keysym.unicode;
|
|
if (atoi(ki->text) <= ki->maxlen)
|
|
ki->curpos++;
|
|
ki->text[ki->curpos] = 0;
|
|
ki->changed = 1;
|
|
}
|
|
}
|
|
else if (ki->type == KEYBI_float && (keyu == '-' || keyu == '.' || (keyu >= '0' && keyu <= '9'))) {
|
|
if (ki->curpos < 255) {
|
|
ki->text[ki->curpos++] = event->key.keysym.unicode;
|
|
ki->text[ki->curpos] = 0;
|
|
ki->changed = 1;
|
|
}
|
|
}
|
|
ki->len = strlen (ki->text);
|
|
}
|
|
|
|
if (keybinput_oldkey == SDLK_RETURN && event->type == SDL_KEYUP)
|
|
keyu = 1;
|
|
else if (keybinput_oldkey == SDLK_ESCAPE && event->type == SDL_KEYUP)
|
|
keyu = -1;
|
|
else
|
|
keyu = 0;
|
|
|
|
if (event->type == SDL_KEYUP)
|
|
keybinput_oldkey = 0;
|
|
|
|
return keyu;
|
|
*/
|
|
|
|
|
|
int main (int argc, char **argv) {
|
|
SDL_Surface *scr;
|
|
static time_t to;
|
|
time_t t1;
|
|
|
|
/* Initialize SDL for video output */
|
|
if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) {
|
|
fprintf (stderr, "Unable to initialize SDL: %s\n",
|
|
SDL_GetError ());
|
|
exit (1);
|
|
}
|
|
|
|
scr = SDL_SetVideoMode(RESOLUTION_X, RESOLUTION_Y, 0, videoflags);
|
|
if ( !scr ) {
|
|
fprintf( stderr, "Could not get a surface after resize: %s\n", SDL_GetError( ) );
|
|
SDL_Quit();
|
|
exit (2);
|
|
}
|
|
SDL_EnableUNICODE(1);
|
|
|
|
app_init (argc, argv);
|
|
gfx_init (RESOLUTION_X, RESOLUTION_Y);
|
|
draw ();
|
|
|
|
while (app.status != APPSTATUS_quit) {
|
|
while (msdl_eventloop ());
|
|
|
|
t1 = time (NULL);
|
|
if (to != t1) {
|
|
app_loop ();
|
|
to = t1;
|
|
}
|
|
|
|
draw ();
|
|
}
|
|
|
|
SDL_Quit ();
|
|
app_shutdown ();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void main_wnd_update () {
|
|
d_printf ("main_wnd_update : %d", app.status);
|
|
while (msdl_eventloop ());
|
|
}
|
|
|