dxx-rebirth/arch/sdl/event.c

116 lines
2.6 KiB
C
Raw Normal View History

/* $Id: event.c,v 1.1.1.1 2006/03/17 19:53:40 zicodxx Exp $ */
/*
*
* SDL Event related stuff
*
*
*/
2006-03-20 16:43:15 +00:00
#include <stdio.h>
#include <stdlib.h>
2009-05-21 12:16:39 +00:00
#include "event.h"
#include "key.h"
2009-05-21 12:16:39 +00:00
#include "window.h"
2006-03-20 16:43:15 +00:00
#include <SDL/SDL.h>
extern void key_handler(SDL_KeyboardEvent *event);
extern void mouse_button_handler(SDL_MouseButtonEvent *mbe);
extern void mouse_motion_handler(SDL_MouseMotionEvent *mme);
extern void joy_button_handler(SDL_JoyButtonEvent *jbe);
extern void joy_hat_handler(SDL_JoyHatEvent *jhe);
extern void joy_axis_handler(SDL_JoyAxisEvent *jae);
2006-03-20 16:43:15 +00:00
static int initialised=0;
void event_poll()
{
SDL_Event event;
int clean_uniframe=1;
while (SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_KEYDOWN:
case SDL_KEYUP:
if (clean_uniframe)
memset(unicode_frame_buffer,'\0',sizeof(unsigned char)*KEY_BUFFER_SIZE);
clean_uniframe=0;
key_handler((SDL_KeyboardEvent *)&event);
break;
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
mouse_button_handler((SDL_MouseButtonEvent *)&event);
break;
case SDL_MOUSEMOTION:
mouse_motion_handler((SDL_MouseMotionEvent *)&event);
break;
case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP:
joy_button_handler((SDL_JoyButtonEvent *)&event);
break;
case SDL_JOYAXISMOTION:
joy_axis_handler((SDL_JoyAxisEvent *)&event);
break;
case SDL_JOYHATMOTION:
joy_hat_handler((SDL_JoyHatEvent *)&event);
break;
case SDL_JOYBALLMOTION:
break;
case SDL_QUIT: {
d_event event = { EVENT_QUIT };
call_default_handler(&event);
} break;
}
}
}
2006-03-20 16:43:15 +00:00
int event_init()
{
// We should now be active and responding to events.
initialised = 1;
2006-03-20 16:43:15 +00:00
return 0;
}
2009-05-21 12:16:39 +00:00
int (*default_handler)(d_event *event) = NULL;
void set_default_handler(int (*handler)(d_event *event))
{
default_handler = handler;
}
int call_default_handler(d_event *event)
{
if (default_handler)
return (*default_handler)(event);
return 0;
}
2009-05-21 12:16:39 +00:00
// Process the first event in queue, sending to the appropriate handler
// This is the new object-oriented system
// Uses the old system for now, but this may change
2009-05-21 12:16:39 +00:00
void event_process(void)
{
d_event event;
window *wind;
event_poll(); // send input events first
event.type = EVENT_IDLE;
if ((wind = window_get_front()))
{
if (!window_send_event(wind, &event))
call_default_handler(&event);
}
else
call_default_handler(&event);
event.type = EVENT_WINDOW_DRAW; // then draw all visible windows
2009-05-21 12:16:39 +00:00
for (wind = window_get_first(); wind != NULL; wind = window_get_next(wind))
if (window_is_visible(wind))
window_send_event(wind, &event);
gr_flip();
2009-05-21 12:16:39 +00:00
}