Hi.
I am using SFML to make a game where the player can write text. I am making a text field to get the pressed keys from keyboard. I am having some problem with my ABNT2 keyboard.
I write this code for test:
#include <SFML/Graphics.hpp>
#include <SFML/Config.hpp>
int main()
{
// create the window
sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
printf("\n%u %s %s SFML version == %u.%u.%u\n",__LINE__,__FILE__,__func__
,SFML_VERSION_MAJOR
,SFML_VERSION_MINOR
,SFML_VERSION_PATCH
);fflush(stdout);
// run the program as long as the window is open
while (window.isOpen())
{
// check all the window's events that were triggered since the last iteration of the loop
sf::Event event;
while (window.pollEvent(event))
{
// "close requested" event: we close the window
if (event.type == sf::Event::Closed)
window.close();
//read the key pressed
if(event.type == sf::Event::KeyPressed){
printf("\n%u %s %s Key Pressed code == %d",__LINE__,__FILE__,__func__
,event.key.code
);fflush(stdout);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Tilde)){
// left key is pressed: move our character
printf(" TILDE PRESSED");fflush(stdout);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Quote)){
// left key is pressed: move our character
printf(" QUOTE PRESSED");fflush(stdout);
}
}
}
// clear the window with black color
window.clear(sf::Color::Black);
// draw everything here...
// window.draw(...);
// end the current frame
window.display();
}
return 0;
}
When I run the program, I press first the quote key '´' one time and then I press the tilde key '~' and I have this return:
$ ./helloSFML
9 main.cpp main SFML version == 2.5.1
28 main.cpp main Key Pressed code == -1 TILDE PRESSED
28 main.cpp main Key Pressed code == -1^C
Is this a problem with the last SFML version? Maybe I could try another old version.
How can I solve this problem?
I am using linux mint "4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux" with XFCE 4.12 with G++ "g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0".
Thanks.
Hi eXpl0it3r.
As the SFML don't have this brazillian keys, i fixed this in the SFML source code in Linux. I hope you guys from the project can add it on the next version.
I found the X11 keys and I discover that keys are dead keys (don't know what does this mean).
Then I go on the file include/SFML/Window/Keyboard.hpp and I add this:
//here the add begin
cCedilla,
grave,
acute,
circumflex,
tilde,
macron,
breve,
abovedot,
diaeresis,
abovering,
doubleacute,
caron,
cedilla,
ogonek,
iota,
voicedSound,
semivoicedSound,
belowdot,
hook,
horn,
//here the add end
KeyCount, ///< Keep last -- the total number of keyboard keys
And I go on the file src/SFML/Window/Unix/WindowImplX11.cpp and I add this code in function keysymToSF:
case XK_9: return sf::Keyboard::Num9;
//Here the add begin
case XK_ccedilla: return sf::Keyboard::cCedilla;
case XK_cedilla: return sf::Keyboard::cedilla;
case XK_dead_grave: return sf::Keyboard::grave;
case XK_dead_acute: return sf::Keyboard::acute;
case XK_dead_circumflex: return sf::Keyboard::circumflex;
case XK_dead_tilde: return sf::Keyboard::tilde;
case XK_dead_macron: return sf::Keyboard::macron;
case XK_dead_breve: return sf::Keyboard::breve;
case XK_dead_abovedot: return sf::Keyboard::abovedot;
case XK_dead_diaeresis: return sf::Keyboard::diaeresis;
case XK_dead_abovering: return sf::Keyboard::abovering;
case XK_dead_doubleacute: return sf::Keyboard::doubleacute;
case XK_dead_caron: return sf::Keyboard::caron;
case XK_dead_cedilla: return sf::Keyboard::cedilla;
case XK_dead_ogonek: return sf::Keyboard::ogonek;
case XK_dead_iota: return sf::Keyboard::iota;
case XK_dead_voiced_sound: return sf::Keyboard::voicedSound;
case XK_dead_semivoiced_sound: return sf::Keyboard::semivoicedSound;
case XK_dead_belowdot: return sf::Keyboard::belowdot;
case XK_dead_hook: return sf::Keyboard::hook;
case XK_dead_horn: return sf::Keyboard::horn;
//here the add end
}
With this code, the events return the code of the key and not -1.
Thanks for the help.
PS: I merge two cedilla in one because one is dead and another is not. It's because I don't know hou SFML will have it in the future. I think my keyboard shoud use it but it use's the cCedilla (cedilla in the C letter).
I hope you can fix it creating two different cedillas.