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;
|
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)
|
#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
|
int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
|
||||||
#endif
|
#endif
|
||||||
@ -1949,19 +1973,7 @@ int Get_input(int sleep_time)
|
|||||||
case KeyPress:
|
case KeyPress:
|
||||||
{
|
{
|
||||||
KeySym sym;
|
KeySym sym;
|
||||||
// right/left window 40 Mod4Mask
|
mod = X11_to_GFX2_Modifiers(event.xkey.state);
|
||||||
// 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;
|
|
||||||
//sym = XKeycodeToKeysym(X11_display, event.xkey.keycode, 0);
|
//sym = XKeycodeToKeysym(X11_display, event.xkey.keycode, 0);
|
||||||
sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 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",
|
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;
|
KeySym sym;
|
||||||
|
|
||||||
if (event.xkey.state & ShiftMask)
|
mod = X11_to_GFX2_Modifiers(event.xkey.state);
|
||||||
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;
|
|
||||||
sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 0);
|
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",
|
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);
|
event.xkey.keycode, event.xkey.state, sym, XKeysymToString(sym), mod);
|
||||||
@ -2023,14 +2028,7 @@ int Get_input(int sleep_time)
|
|||||||
GrabModeAsync, GrabModeAsync,
|
GrabModeAsync, GrabModeAsync,
|
||||||
X11_window, None, CurrentTime);
|
X11_window, None, CurrentTime);
|
||||||
//printf("Press button = %d state = 0x%08x\n", event.xbutton.button, event.xbutton.state);
|
//printf("Press button = %d state = 0x%08x\n", event.xbutton.button, event.xbutton.state);
|
||||||
if (event.xkey.state & ShiftMask)
|
mod = X11_to_GFX2_Modifiers(event.xbutton.state);
|
||||||
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;
|
|
||||||
switch(event.xbutton.button)
|
switch(event.xbutton.button)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
@ -2061,6 +2059,7 @@ int Get_input(int sleep_time)
|
|||||||
break;
|
break;
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
XUngrabPointer(X11_display, CurrentTime);
|
XUngrabPointer(X11_display, CurrentTime);
|
||||||
|
mod = X11_to_GFX2_Modifiers(event.xbutton.state);
|
||||||
//printf("Release button = %d\n", event.xbutton.button);
|
//printf("Release button = %d\n", event.xbutton.button);
|
||||||
if(event.xbutton.button == 1 || event.xbutton.button == 3)
|
if(event.xbutton.button == 1 || event.xbutton.button == 3)
|
||||||
{
|
{
|
||||||
@ -2075,6 +2074,7 @@ int Get_input(int sleep_time)
|
|||||||
break;
|
break;
|
||||||
case MotionNotify:
|
case MotionNotify:
|
||||||
//printf("mouse %dx%d\n", event.xmotion.x, event.xmotion.y);
|
//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);
|
user_feedback_required = Move_cursor_with_constraints(event.xmotion.x / Pixel_width, event.xmotion.y / Pixel_height);
|
||||||
break;
|
break;
|
||||||
case Expose:
|
case Expose:
|
||||||
|
|||||||
@ -29,6 +29,12 @@
|
|||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
#include "keycodes.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__)
|
#if defined(__macosx__)
|
||||||
// Apple's "command" character is not present in the ANSI table, so we
|
// Apple's "command" character is not present in the ANSI table, so we
|
||||||
@ -331,27 +337,37 @@ word Key_for_scancode(word scancode)
|
|||||||
else
|
else
|
||||||
return Scancode_to_sym[scancode & 0xFF][0];
|
return Scancode_to_sym[scancode & 0xFF][0];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USE_SDL) || defined(USE_SDL2)
|
||||||
|
|
||||||
// Convertit des modificateurs de touches SDL en modificateurs GrafX2
|
// Convertit des modificateurs de touches SDL en modificateurs GrafX2
|
||||||
word Get_Key_modifiers(void)
|
word Get_Key_modifiers(void)
|
||||||
{
|
{
|
||||||
word modifiers=0;
|
#if defined(USE_SDL)
|
||||||
SDLMod mod = SDL_GetModState();
|
SDLMod mod;
|
||||||
|
#else
|
||||||
|
SDL_Keymod mod;
|
||||||
|
#endif
|
||||||
|
word modifiers = 0;
|
||||||
|
mod = SDL_GetModState();
|
||||||
|
|
||||||
if (mod & KMOD_CTRL )
|
if (mod & KMOD_CTRL) // either one of the CTRL keys
|
||||||
modifiers|=GFX2_MOD_CTRL;
|
modifiers |= GFX2_MOD_CTRL;
|
||||||
if (mod & KMOD_SHIFT )
|
if (mod & KMOD_SHIFT ) // either one of the SHIFT keys
|
||||||
modifiers|=GFX2_MOD_SHIFT;
|
modifiers |= GFX2_MOD_SHIFT;
|
||||||
if (mod & (KMOD_ALT|KMOD_MODE))
|
if (mod & (KMOD_ALT|KMOD_MODE)) // either ALT or ALTGR key
|
||||||
modifiers|=GFX2_MOD_ALT;
|
modifiers |= GFX2_MOD_ALT;
|
||||||
|
#if defined(USE_SDL)
|
||||||
if (mod & (KMOD_META))
|
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;
|
return modifiers;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_SDL) || defined(USE_SDL2)
|
|
||||||
|
|
||||||
#if defined(USE_SDL)
|
#if defined(USE_SDL)
|
||||||
word Keysym_to_keycode(SDL_keysym keysym)
|
word Keysym_to_keycode(SDL_keysym keysym)
|
||||||
@ -850,10 +866,6 @@ word Key_for_scancode(word scancode)
|
|||||||
{
|
{
|
||||||
return scancode;
|
return scancode;
|
||||||
}
|
}
|
||||||
word Get_Key_modifiers(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
word Key_for_scancode(word scancode)
|
word Key_for_scancode(word scancode)
|
||||||
{
|
{
|
||||||
@ -881,6 +893,10 @@ word Get_Key_modifiers(void)
|
|||||||
}
|
}
|
||||||
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x8000)
|
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x8000)
|
||||||
mod |= GFX2_MOD_META;
|
mod |= GFX2_MOD_META;
|
||||||
|
#elif defined(USE_X11)
|
||||||
|
mod = X11_key_mod;
|
||||||
|
#else
|
||||||
|
GFX2_Log(GFX2_WARNING, "Get_Key_modifiers() not implemented !\n");
|
||||||
#endif
|
#endif
|
||||||
return mod;
|
return mod;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user