view mde/input/joystick.d @ 67:108d123238c0

Changes to work with tango r3700 (post 0.99.6). Changes to logging. Replaced many uses of PathView with FilePath.
author Diggory Hardy <diggory.hardy@gmail.com>
date Thu, 03 Jul 2008 12:40:31 +0100
parents baa87e68d7dc
children 56c0ddd90193
line wrap: on
line source

/* LICENSE BLOCK
Part of mde: a Modular D game-oriented Engine
Copyright © 2007-2008 Diggory Hardy

This program is free software: you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation, either
version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>. */

/** Opens SDL joysticks ready for use.
* May be extended later to include other input devices and remap devices as per config.
*/
module mde.input.joystick;

import tango.util.log.Log : Log, Logger;

import derelict.sdl.joystick;

private Logger logger;
static this() {
    logger = Log.getLogger ("mde.input.joystick");
}
private SDL_Joystick*[] joysticks;	// pointers to all joystick structs, whether successfully opened or not

/** Open joysticks ready for use.
*
* This is simply required for SDL to handle joystick events. It can fail, but won't affect anything
* else, except for the controller not working.
*
* closeJoysticks must be run to cleanup afterwards.
*/
void openJoysticks () {
    joysticks = new SDL_Joystick*[SDL_NumJoysticks ()];
    
    for (int i = 0; i < joysticks.length; ++i) {
        if ((joysticks[i] = SDL_JoystickOpen (i)) is null) {	// null on failure
            logger.error ("Unable to open joystick {} via SDL", i);
        }
    }
    
    logger.info ("Opened {} joysticks via SDL, succesfully unless preceding errors say otherwise.", joysticks.length);
}

/// Cleanup fct.
void closeJoysticks () {
    foreach (js; joysticks) {
        // FIXME: this is sometimes causing a SIGSEGV (Address boundary error)
        // FIXME: when init fails
        debug logger.trace ("Closing joysticks (this sometimes fails when mde exits prematurely)");
        if(js !is null) SDL_JoystickClose(js);	// only close if successfully opened
        debug logger.trace ("Done closing joysticks");
    }
}