Welcome, Guest. Please login or register. Did you miss your activation email?

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - cordis3

Pages: [1]
1
Window / [OSX] keyboard problem (related: sf::isKeyPressed(Key key) )
« on: August 20, 2013, 11:10:34 am »
I'm using sfml 2.0 for developing my game. Game development is almost finished and I've been looking for some bugs and fixing them these days.

I've got SEGFAULT from sf:Keyboard::isKeyPressed. Typically, in normal case, keyboards inputs are well processed and exactly recognize what key is pressed. But after turn off and on my keyboard(apple wireless keyboard), my game is crashed.

bool HIDInputManager::isKeyPressed(Keyboard::Key key)
{
    if (!m_isValid) {
        sf::err() << "HIDInputManager is invalid." << std::endl;
        return false;
    }
   
    // state = true if at least one corresponding HID key is pressed
    bool state = false;
   
    for (IOHIDElements::iterator it = m_keys[key].begin(); it != m_keys[key].end(); ++it) {
       
        IOHIDValueRef value = 0;
       
        IOHIDDeviceRef device = IOHIDElementGetDevice(*it);
        IOHIDDeviceGetValue(device, *it, &value);
       
        if (!value) {
           
            // This means some kind of error / deconnection so we remove this
            // element from our keys
           
            CFRelease(*it);
            it = m_keys[key].erase(it);
                       
        } else if (IOHIDValueGetIntegerValue(value) == 1) {
           
            // This means the key is pressed
            state = true;
            break; // Stop here
           
        } else {
           
            // This means the key is released
        }
       
    }
   
    return state;
}


The game was stopped at "IOHIDDeviceRef device = IOHIDElementGetDevice(*it);" because "*it" was null.
I think this problem is caused by releasing elements in m_keys[] due to reconnection of keyboard or something else.

To identify what key is pressed, "HIDInputManager::isKeyPressed(Keyboard::Key key)" function is called several times. At every function calls, "value", returned from "IOHIDDeviceGetValue()" might be null and function releases "m_keys[]" as shown above code.

when the number of vector(m_keys[]) becomes zero, game crashes because there is no elements in the vector.

I need an advice to fix it. 

Pages: [1]