SDL2 / X11 : implement Get_Key_modifiers()
important for function with holding SHIFT during mouse movements
This commit is contained in:
		
							parent
							
								
									db5feb25b6
								
							
						
					
					
						commit
						788d05111a
					
				
							
								
								
									
										58
									
								
								src/input.c
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								src/input.c
									
									
									
									
									
								
							@ -1379,6 +1379,30 @@ int Directional_acceleration(int msec)
 | 
			
		||||
  return 1+(msec-initial_delay+linear_factor)/linear_factor+(msec-initial_delay)*(msec-initial_delay)/accel_factor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(USE_X11)
 | 
			
		||||
word X11_key_mod;
 | 
			
		||||
 | 
			
		||||
static word X11_to_GFX2_Modifiers(unsigned int state)
 | 
			
		||||
{
 | 
			
		||||
  word mod = 0;
 | 
			
		||||
  // right/left window 40 Mod4Mask
 | 
			
		||||
  // left alt = 8         Mod1Mask
 | 
			
		||||
  // right alt = 80       Mod5Mask
 | 
			
		||||
  // NumLock = 10         Mod2Mask
 | 
			
		||||
  // see "modmap"
 | 
			
		||||
  if (state & ShiftMask)
 | 
			
		||||
    mod |= GFX2_MOD_SHIFT;
 | 
			
		||||
  if (state & ControlMask)
 | 
			
		||||
    mod |= GFX2_MOD_CTRL;
 | 
			
		||||
  if (state & (Mod1Mask | Mod5Mask))
 | 
			
		||||
    mod |= GFX2_MOD_ALT;
 | 
			
		||||
  if (state & Mod4Mask)
 | 
			
		||||
    mod |= GFX2_MOD_META;
 | 
			
		||||
  X11_key_mod = mod;
 | 
			
		||||
  return mod;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2)
 | 
			
		||||
int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
 | 
			
		||||
#endif
 | 
			
		||||
@ -1949,19 +1973,7 @@ int Get_input(int sleep_time)
 | 
			
		||||
        case KeyPress:
 | 
			
		||||
          {
 | 
			
		||||
            KeySym sym;
 | 
			
		||||
            // right/left window 40 Mod4Mask
 | 
			
		||||
            // left alt = 8         Mod1Mask
 | 
			
		||||
            // right alt = 80       Mod5Mask
 | 
			
		||||
            // NumLock = 10         Mod2Mask
 | 
			
		||||
            // see "modmap"
 | 
			
		||||
            if (event.xkey.state & ShiftMask)
 | 
			
		||||
              mod |= GFX2_MOD_SHIFT;
 | 
			
		||||
            if (event.xkey.state & ControlMask)
 | 
			
		||||
              mod |= GFX2_MOD_CTRL;
 | 
			
		||||
            if (event.xkey.state & (Mod1Mask | Mod5Mask))
 | 
			
		||||
              mod |= GFX2_MOD_ALT;
 | 
			
		||||
            if (event.xkey.state & Mod4Mask)
 | 
			
		||||
              mod |= GFX2_MOD_META;
 | 
			
		||||
            mod = X11_to_GFX2_Modifiers(event.xkey.state);
 | 
			
		||||
            //sym = XKeycodeToKeysym(X11_display, event.xkey.keycode, 0);
 | 
			
		||||
            sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 0);
 | 
			
		||||
            GFX2_Log(GFX2_DEBUG, "key press code = %3d state=0x%08x sym = 0x%04lx %s\tmod=%04x\n",
 | 
			
		||||
@ -2003,14 +2015,7 @@ int Get_input(int sleep_time)
 | 
			
		||||
          {
 | 
			
		||||
            KeySym sym;
 | 
			
		||||
 | 
			
		||||
            if (event.xkey.state & ShiftMask)
 | 
			
		||||
              mod |= GFX2_MOD_SHIFT;
 | 
			
		||||
            if (event.xkey.state & ControlMask)
 | 
			
		||||
              mod |= GFX2_MOD_CTRL;
 | 
			
		||||
            if (event.xkey.state & (Mod1Mask | Mod5Mask))
 | 
			
		||||
              mod |= GFX2_MOD_ALT;
 | 
			
		||||
            if (event.xkey.state & Mod4Mask)
 | 
			
		||||
              mod |= GFX2_MOD_META;
 | 
			
		||||
            mod = X11_to_GFX2_Modifiers(event.xkey.state);
 | 
			
		||||
            sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 0);
 | 
			
		||||
            GFX2_Log(GFX2_DEBUG, "keyrelease code= %3d state=0x%08x sym = 0x%04lx %s\tmod=%04x\n",
 | 
			
		||||
                     event.xkey.keycode, event.xkey.state, sym, XKeysymToString(sym), mod);
 | 
			
		||||
@ -2023,14 +2028,7 @@ int Get_input(int sleep_time)
 | 
			
		||||
                       GrabModeAsync, GrabModeAsync,
 | 
			
		||||
                       X11_window, None, CurrentTime);
 | 
			
		||||
          //printf("Press button = %d state = 0x%08x\n", event.xbutton.button, event.xbutton.state);
 | 
			
		||||
          if (event.xkey.state & ShiftMask)
 | 
			
		||||
            mod |= GFX2_MOD_SHIFT;
 | 
			
		||||
          if (event.xkey.state & ControlMask)
 | 
			
		||||
            mod |= GFX2_MOD_CTRL;
 | 
			
		||||
          if (event.xkey.state & (Mod1Mask | Mod5Mask))
 | 
			
		||||
            mod |= GFX2_MOD_ALT;
 | 
			
		||||
          if (event.xkey.state & Mod3Mask)
 | 
			
		||||
            mod |= GFX2_MOD_META;
 | 
			
		||||
          mod = X11_to_GFX2_Modifiers(event.xbutton.state);
 | 
			
		||||
          switch(event.xbutton.button)
 | 
			
		||||
          {
 | 
			
		||||
            case 1:
 | 
			
		||||
@ -2061,6 +2059,7 @@ int Get_input(int sleep_time)
 | 
			
		||||
          break;
 | 
			
		||||
        case ButtonRelease:
 | 
			
		||||
          XUngrabPointer(X11_display, CurrentTime);
 | 
			
		||||
          mod = X11_to_GFX2_Modifiers(event.xbutton.state);
 | 
			
		||||
          //printf("Release button = %d\n", event.xbutton.button);
 | 
			
		||||
          if(event.xbutton.button == 1 || event.xbutton.button == 3)
 | 
			
		||||
          {
 | 
			
		||||
@ -2075,6 +2074,7 @@ int Get_input(int sleep_time)
 | 
			
		||||
          break;
 | 
			
		||||
        case MotionNotify:
 | 
			
		||||
          //printf("mouse %dx%d\n", event.xmotion.x, event.xmotion.y);
 | 
			
		||||
          mod = X11_to_GFX2_Modifiers(event.xmotion.state);
 | 
			
		||||
          user_feedback_required = Move_cursor_with_constraints(event.xmotion.x / Pixel_width, event.xmotion.y / Pixel_height);
 | 
			
		||||
          break;
 | 
			
		||||
        case Expose:
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,12 @@
 | 
			
		||||
#include "global.h"
 | 
			
		||||
#include "keyboard.h"
 | 
			
		||||
#include "keycodes.h"
 | 
			
		||||
#include "gfx2log.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USE_X11)
 | 
			
		||||
/// State of modifier keys (shift, CTRL, ALT, etc.)
 | 
			
		||||
extern word X11_key_mod;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__macosx__)
 | 
			
		||||
  // Apple's "command" character is not present in the ANSI table, so we
 | 
			
		||||
@ -331,27 +337,37 @@ word Key_for_scancode(word scancode)
 | 
			
		||||
  else
 | 
			
		||||
    return Scancode_to_sym[scancode & 0xFF][0];
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(USE_SDL) || defined(USE_SDL2)
 | 
			
		||||
 | 
			
		||||
// Convertit des modificateurs de touches SDL en modificateurs GrafX2
 | 
			
		||||
word Get_Key_modifiers(void)
 | 
			
		||||
{
 | 
			
		||||
  word modifiers=0;
 | 
			
		||||
  SDLMod mod = SDL_GetModState();
 | 
			
		||||
#if defined(USE_SDL)
 | 
			
		||||
  SDLMod mod;
 | 
			
		||||
#else
 | 
			
		||||
  SDL_Keymod mod;
 | 
			
		||||
#endif
 | 
			
		||||
  word modifiers = 0;
 | 
			
		||||
  mod = SDL_GetModState();
 | 
			
		||||
 | 
			
		||||
    if (mod & KMOD_CTRL )
 | 
			
		||||
      modifiers|=GFX2_MOD_CTRL;
 | 
			
		||||
    if (mod & KMOD_SHIFT )
 | 
			
		||||
      modifiers|=GFX2_MOD_SHIFT;
 | 
			
		||||
    if (mod & (KMOD_ALT|KMOD_MODE))
 | 
			
		||||
      modifiers|=GFX2_MOD_ALT;
 | 
			
		||||
    if (mod & KMOD_CTRL)    // either one of the CTRL keys
 | 
			
		||||
      modifiers |= GFX2_MOD_CTRL;
 | 
			
		||||
    if (mod & KMOD_SHIFT )  // either one of the SHIFT keys
 | 
			
		||||
      modifiers |= GFX2_MOD_SHIFT;
 | 
			
		||||
    if (mod & (KMOD_ALT|KMOD_MODE)) // either ALT or ALTGR key
 | 
			
		||||
      modifiers |= GFX2_MOD_ALT;
 | 
			
		||||
#if defined(USE_SDL)
 | 
			
		||||
    if (mod & (KMOD_META))
 | 
			
		||||
      modifiers|=GFX2_MOD_META;
 | 
			
		||||
#else
 | 
			
		||||
    if (mod & (KMOD_GUI))   // right or left Window key
 | 
			
		||||
#endif
 | 
			
		||||
      modifiers |= GFX2_MOD_META;
 | 
			
		||||
 | 
			
		||||
GFX2_Log(GFX2_DEBUG, "mod=%x => %04x\n", (unsigned)mod, modifiers);
 | 
			
		||||
  return modifiers;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(USE_SDL) || defined(USE_SDL2)
 | 
			
		||||
 | 
			
		||||
#if defined(USE_SDL)
 | 
			
		||||
word Keysym_to_keycode(SDL_keysym keysym)
 | 
			
		||||
@ -850,10 +866,6 @@ word Key_for_scancode(word scancode)
 | 
			
		||||
{
 | 
			
		||||
  return scancode;
 | 
			
		||||
}
 | 
			
		||||
word Get_Key_modifiers(void)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
word Key_for_scancode(word scancode)
 | 
			
		||||
{
 | 
			
		||||
@ -881,6 +893,10 @@ word Get_Key_modifiers(void)
 | 
			
		||||
  }
 | 
			
		||||
  if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x8000)
 | 
			
		||||
    mod |= GFX2_MOD_META;
 | 
			
		||||
#elif defined(USE_X11)
 | 
			
		||||
  mod = X11_key_mod;
 | 
			
		||||
#else
 | 
			
		||||
  GFX2_Log(GFX2_WARNING, "Get_Key_modifiers() not implemented !\n");
 | 
			
		||||
#endif
 | 
			
		||||
  return mod;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user