2006-03-20 17:12:09 +00:00
/* $Id: event.c,v 1.1.1.1 2006/03/17 19:53:40 zicodxx Exp $ */
/*
*
* SDL Event related stuff
*
*
*/
# include <stdio.h>
# include <stdlib.h>
2009-05-21 12:16:39 +00:00
# include "event.h"
2008-11-17 23:38:43 +00:00
# include "key.h"
2012-03-18 10:03:29 +00:00
# include "mouse.h"
2009-05-21 12:16:39 +00:00
# include "window.h"
2010-07-16 11:07:42 +00:00
# include "timer.h"
2010-12-28 18:11:10 +00:00
# include "config.h"
2006-03-20 17:12:09 +00:00
2007-04-09 02:41:45 +00:00
# include <SDL/SDL.h>
2006-03-20 17:12:09 +00:00
2010-12-10 23:18:17 +00:00
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 ) ;
2011-02-02 00:36:49 +00:00
extern int joy_axis_handler ( SDL_JoyAxisEvent * jae ) ;
2010-12-28 18:11:10 +00:00
extern void mouse_cursor_autohide ( ) ;
2006-03-20 17:12:09 +00:00
static int initialised = 0 ;
void event_poll ( )
{
SDL_Event event ;
2008-11-17 23:38:43 +00:00
int clean_uniframe = 1 ;
2010-07-25 00:49:33 +00:00
window * wind = window_get_front ( ) ;
2011-01-14 09:51:13 +00:00
int idle = 1 ;
2010-07-25 00:49:33 +00:00
// If the front window changes, exit this loop, otherwise unintended behavior can occur
// like pressing 'Return' really fast at 'Difficulty Level' causing multiple games to be started
while ( ( wind = = window_get_front ( ) ) & & SDL_PollEvent ( & event ) )
{
2006-03-20 17:12:09 +00:00
switch ( event . type ) {
2008-11-17 23:38:43 +00:00
case SDL_KEYDOWN :
case SDL_KEYUP :
if ( clean_uniframe )
memset ( unicode_frame_buffer , ' \0 ' , sizeof ( unsigned char ) * KEY_BUFFER_SIZE ) ;
clean_uniframe = 0 ;
2010-12-10 23:18:17 +00:00
key_handler ( ( SDL_KeyboardEvent * ) & event ) ;
2011-01-17 04:17:21 +00:00
idle = 0 ;
2008-11-17 23:38:43 +00:00
break ;
case SDL_MOUSEBUTTONDOWN :
case SDL_MOUSEBUTTONUP :
2010-12-10 23:18:17 +00:00
mouse_button_handler ( ( SDL_MouseButtonEvent * ) & event ) ;
2011-01-17 04:17:21 +00:00
idle = 0 ;
2008-11-17 23:38:43 +00:00
break ;
case SDL_MOUSEMOTION :
2010-12-10 23:18:17 +00:00
mouse_motion_handler ( ( SDL_MouseMotionEvent * ) & event ) ;
2011-01-17 04:17:21 +00:00
idle = 0 ;
2008-11-17 23:38:43 +00:00
break ;
case SDL_JOYBUTTONDOWN :
case SDL_JOYBUTTONUP :
2010-12-10 23:18:17 +00:00
joy_button_handler ( ( SDL_JoyButtonEvent * ) & event ) ;
2011-02-02 00:36:49 +00:00
idle = 0 ;
2008-11-17 23:38:43 +00:00
break ;
case SDL_JOYAXISMOTION :
2011-02-02 00:36:49 +00:00
if ( joy_axis_handler ( ( SDL_JoyAxisEvent * ) & event ) )
idle = 0 ;
2008-11-17 23:38:43 +00:00
break ;
case SDL_JOYHATMOTION :
2010-12-10 23:18:17 +00:00
joy_hat_handler ( ( SDL_JoyHatEvent * ) & event ) ;
2011-02-02 00:36:49 +00:00
idle = 0 ;
2008-11-17 23:38:43 +00:00
break ;
case SDL_JOYBALLMOTION :
break ;
case SDL_QUIT : {
2011-07-13 21:26:43 +00:00
d_event qevent = { EVENT_QUIT } ;
call_default_handler ( & qevent ) ;
2011-01-17 04:17:21 +00:00
idle = 0 ;
2008-11-17 23:38:43 +00:00
} break ;
2006-03-20 17:12:09 +00:00
}
}
2010-07-16 11:07:42 +00:00
2011-01-14 09:51:13 +00:00
// Send the idle event if there were no other events
if ( idle )
{
2011-07-13 21:26:43 +00:00
d_event ievent ;
2011-01-14 09:51:13 +00:00
2011-07-13 21:26:43 +00:00
ievent . type = EVENT_IDLE ;
event_send ( & ievent ) ;
2011-01-14 09:51:13 +00:00
}
2012-03-18 10:03:29 +00:00
else
event_reset_idle_seconds ( ) ;
2011-01-14 09:51:13 +00:00
2010-12-28 18:11:10 +00:00
mouse_cursor_autohide ( ) ;
2006-03-20 17:12:09 +00:00
}
2010-07-30 17:59:21 +00:00
void event_flush ( )
{
SDL_Event event ;
while ( SDL_PollEvent ( & event ) ) ;
}
2006-03-20 17:12:09 +00:00
int event_init ( )
{
// We should now be active and responding to events.
initialised = 1 ;
return 0 ;
}
2009-05-21 12:16:39 +00:00
2010-04-02 05:01:08 +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 ;
}
2011-01-14 09:51:13 +00:00
void event_send ( d_event * event )
{
window * wind ;
2011-10-09 10:32:53 +00:00
int handled = 0 ;
2011-01-14 09:51:13 +00:00
2011-10-09 10:32:53 +00:00
for ( wind = window_get_front ( ) ; wind ! = NULL & & ! handled ; wind = window_get_prev ( wind ) )
if ( window_is_visible ( wind ) )
{
handled = window_send_event ( wind , event ) ;
2011-11-27 20:36:02 +00:00
if ( ! window_exists ( wind ) ) // break away if necessary: window_send_event() could have closed wind by now
break ;
2011-10-09 10:32:53 +00:00
if ( window_is_modal ( wind ) )
break ;
}
if ( ! handled )
2011-01-14 09:51:13 +00:00
call_default_handler ( event ) ;
}
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
2010-01-30 03:24:19 +00:00
// 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 ;
2010-08-06 06:49:45 +00:00
window * wind = window_get_front ( ) ;
2009-05-21 12:16:39 +00:00
2011-02-02 00:36:49 +00:00
timer_update ( ) ;
2010-01-30 03:24:19 +00:00
event_poll ( ) ; // send input events first
2011-01-14 09:51:13 +00:00
// Doing this prevents problems when a draw event can create a newmenu,
2010-08-06 06:49:45 +00:00
// such as some network menus when they report a problem
if ( window_get_front ( ) ! = wind )
return ;
2010-01-20 05:10:32 +00:00
event . type = EVENT_WINDOW_DRAW ; // then draw all visible windows
2011-02-12 22:58:41 +00:00
wind = window_get_first ( ) ;
while ( wind ! = NULL )
{
window * prev = window_get_prev ( wind ) ;
2009-05-21 12:16:39 +00:00
if ( window_is_visible ( wind ) )
window_send_event ( wind , & event ) ;
2011-02-12 22:58:41 +00:00
if ( ! window_exists ( wind ) )
2011-05-26 07:41:28 +00:00
{
if ( ! prev ) // well there isn't a previous window ...
break ; // ... just bail out - we've done everything for this frame we can.
wind = window_get_next ( prev ) ; // the current window seemed to be closed. so take the next one from the previous which should be able to point to the one after the current closed
}
2011-02-12 22:58:41 +00:00
else
wind = window_get_next ( wind ) ;
}
2009-12-26 01:08:57 +00:00
gr_flip ( ) ;
2009-05-21 12:16:39 +00:00
}
2010-12-28 18:11:10 +00:00
void event_toggle_focus ( int activate_focus )
{
if ( activate_focus & & GameCfg . Grabinput )
SDL_WM_GrabInput ( SDL_GRAB_ON ) ;
else
SDL_WM_GrabInput ( SDL_GRAB_OFF ) ;
mouse_toggle_cursor ( ! activate_focus ) ;
}
2012-03-18 10:03:29 +00:00
static fix64 last_event = 0 ;
void event_reset_idle_seconds ( )
{
last_event = timer_query ( ) ;
}
fix event_get_idle_seconds ( )
{
return ( timer_query ( ) - last_event ) / F1_0 ;
}