Skip to main content
GameDev.net gamedev.net
🔒 Locked

Handling Shift modifier

Started by Thrust Dec 23, 2005 at 11:12 PM 2 replies 2k views
Original Post
Thrust
Thrust
Hi, I am currently trying to write a text input function in SDL and I have a question. How would I handle having/not having a shift modifier? Here is my code so far:

					//regular
					if ( event.key.keysym.sym == SDLK_a && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"a";}
					if ( event.key.keysym.sym == SDLK_b && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"b";}
					if ( event.key.keysym.sym == SDLK_c && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"c";}
					if ( event.key.keysym.sym == SDLK_d && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"d";}
					if ( event.key.keysym.sym == SDLK_e && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"e";}
					if ( event.key.keysym.sym == SDLK_f && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"f";}
					if ( event.key.keysym.sym == SDLK_g && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"g";}
					if ( event.key.keysym.sym == SDLK_h && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"h";}
					if ( event.key.keysym.sym == SDLK_i && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"i";}
					if ( event.key.keysym.sym == SDLK_j && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"j";}
					if ( event.key.keysym.sym == SDLK_k && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"k";}
					if ( event.key.keysym.sym == SDLK_l && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"l";}
					if ( event.key.keysym.sym == SDLK_m && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"m";}
					if ( event.key.keysym.sym == SDLK_n && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"n";}
					if ( event.key.keysym.sym == SDLK_o && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"o";}
					if ( event.key.keysym.sym == SDLK_p && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"p";}
					if ( event.key.keysym.sym == SDLK_q && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"q";}
					if ( event.key.keysym.sym == SDLK_r && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"r";}
					if ( event.key.keysym.sym == SDLK_s && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"s";}
					if ( event.key.keysym.sym == SDLK_t && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"t";}
					if ( event.key.keysym.sym == SDLK_u && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"u";}
					if ( event.key.keysym.sym == SDLK_v && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"v";}
					if ( event.key.keysym.sym == SDLK_w && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"w";}
					if ( event.key.keysym.sym == SDLK_x && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"x";}
					if ( event.key.keysym.sym == SDLK_y && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"y";}
					if ( event.key.keysym.sym == SDLK_z && (SDL_GetModState() != KMOD_SHIFT)) {blah=blah+"z";}

					//with shift
					if ( event.key.keysym.sym == SDLK_a && (SDL_GetModState() == KMOD_SHIFT))) {blah=blah+"A";}
					if ( event.key.keysym.sym == SDLK_b && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"B";}
					if ( event.key.keysym.sym == SDLK_c && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"C";}
					if ( event.key.keysym.sym == SDLK_d && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"D";}
					if ( event.key.keysym.sym == SDLK_e && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"E";}
					if ( event.key.keysym.sym == SDLK_f && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"F";}
					if ( event.key.keysym.sym == SDLK_g && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"G";}
					if ( event.key.keysym.sym == SDLK_h && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"H";}
					if ( event.key.keysym.sym == SDLK_i && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"I";}
					if ( event.key.keysym.sym == SDLK_j && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"J";}
					if ( event.key.keysym.sym == SDLK_k && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"K";}
					if ( event.key.keysym.sym == SDLK_l && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"L";}
					if ( event.key.keysym.sym == SDLK_m && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"M";}
					if ( event.key.keysym.sym == SDLK_n && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"N";}
					if ( event.key.keysym.sym == SDLK_o && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"O";}
					if ( event.key.keysym.sym == SDLK_p && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"P";}
					if ( event.key.keysym.sym == SDLK_q && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"Q";}
					if ( event.key.keysym.sym == SDLK_r && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"R";}
					if ( event.key.keysym.sym == SDLK_s && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"S";}
					if ( event.key.keysym.sym == SDLK_t && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"T";}
					if ( event.key.keysym.sym == SDLK_u && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"U";}
					if ( event.key.keysym.sym == SDLK_v && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"V";}
					if ( event.key.keysym.sym == SDLK_w && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"W";}
					if ( event.key.keysym.sym == SDLK_x && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"X";}
					if ( event.key.keysym.sym == SDLK_y && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"Y";}
					if ( event.key.keysym.sym == SDLK_z && (SDL_GetModState() == KMOD_SHIFT)) {blah=blah+"Z";}

I think im using SDL_GetModState() improperly but the documentation doesent help to much.
Mark St. Jean - OwnerWastedInkVwmaggotwV@Yahoo.com
ender7771
ender7771
Why dont you try using a for loop? Note: This assumes that the defines for the keys are in order.
for(int i = SDLK_a; i <= SDLK_z; i++){   if ( event.key.keysym.sym == i){       if( SDL_GetModState() & KMOD_SHIFT) lowercase;       else uppercase;   }}


Edit: In the docs, it said to & it to see.
Binomine
Binomine
It's actually much easier than that.

First keysym.mod is the same as SDL_GetModState() so it's easier to use keysym.mod

event.key.unicode will give you the letter, but you must initalize unicode first.
//this needs to be in your game initalization.init(){SDL_EnableUNICODE(1);}...char bar;if ( (keysym.unicode & 0xFF80) == 0 ) {  bar = keysym.unicode & 0x7F;//&  is a bitwise and.//The documents are unclear if the unicode character will already be capital or not.  //If it's capitalized already, the code below is needed.  if(keysym.mod & KMOD_SHIFT);//     bar -= 'A' - 'a';//this is the distance between capital and lowercase.}


SDL_EnambeUNICODE adds an overhead, if we want to hack a bit, I can gain some additional speed at the cost of being screwy.

Instead of using the unicode, I can subtract SDLK_a from our code, giving us a number between 0 ~ 25, and then adding 'A' to it, which will make it a character from 'A' ~ 'Z'. If shift is not present, I'll add the distance between 'a' and 'A', which will give us a character from 'a' ~ 'z'.

char bar;if(event.key.keysym.sym < SDLK_a || event.key.keysym.sym > SDLK_z)   return;//makes sure the keysim is between a and zcar = event.key.keysym.sym - SDLK_a + 'A';if(!(event.key.keysym.mod & KMOD_SHIFT))// if no shift, increase A to lowercase     car += 'A' - 'a';


My code is untested, but I hope, if it doesn't work, it at least gives you an idea.
Thrust
Thrust
Got it guys, thanks
Mark St. Jean - OwnerWastedInkVwmaggotwV@Yahoo.com

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.