Commit Graph

126 Commits (3779bf3845e43150cf1a3897aeeaea5489e498b8)

Author SHA1 Message Date
Sam Lantinga 3779bf3845 Fixed bug 2948 - [Android] Arrow keys from external keyboard are not received
Sylvain

http://developer.android.com/reference/android/view/InputDevice.html
 int SOURCE_CLASS_JOYSTICK   Constant Value: 16       (0x00000010)

 int SOURCE_JOYSTICK         Constant Value: 16777232 (0x01000010)
 int SOURCE_KEYBOARD         Constant Value: 257      (0x00000101)
 int SOURCE_GAMEPAD          Constant Value: 1025     (0x00000401)
 int SOURCE_DPAD             Constant Value:  513     (0x00000201)


I have an a PC keyboard that I connect to an android device.
The issue is that "arrow" keys gets lost.

More explanation:

This device gets detected twice by the java "pollInputDevices()" both as SOURCE_KEYBOARD and as a composite (0x1000311 == SOURCE_JOYSTICK | SOURCE_KEYBOARD | SOURCE_DPAD).
Because of being a SOURCE_CLASS_JOYSTICK, only the second entry is registered, and I opened it.


When I press one arrow key, the java method "onKey(...)" is called.
The Source "event.getSource()" is "SOURCE_KEYBOARD", so it enters this conditions :

   if ( (event.getSource() & InputDevice.SOURCE_GAMEPAD) != 0 ||
      (event.getSource() & InputDevice.SOURCE_DPAD) != 0 ) {


And then, it enters :

   SDLActivity.onNativePadDown() (native code in "SDL_sysjoystick.c")


Since the "arrows" are viewed as "D-PAD", it gets translated :

   int button = keycode_to_SDL(keycode);


But the android-java "event.getDeviceId()" is wrong: this is the one from the Keyboard, and not the one from the Joystick that I have opened.
So I don't get them through the Joystick interface.


And since, the keycode has been translated, it returns 0 and assume it was consumed.
So I lost the key in the function "Android_OnPadDown()"


Notice, It won't happen with other normal "letters" keys because they does not get translated by "keycode_to_SDL", so "Android_OnPadDown()" returns -1.
And then java code send the keys to "SDLActivity.onNativeKeyDown()".




Possible patch on "Android_OnPadDown" and also "Android_OnPadUp" (and maybe other functons):

85 int
186 Android_OnPadDown(int device_id, int keycode)
187 {
188     SDL_joylist_item *item;
189     int button = keycode_to_SDL(keycode);
190     if (button >= 0) {
191         item = JoystickByDeviceId(device_id);
192         if (item && item->joystick) {
193             SDL_PrivateJoystickButton(item->joystick, button , SDL_PRESSED);
194         }
+           else return -1;
195         return 0;
196     }
197
198     return -1;
199 }

It would allow the java caller function to send the key to "SDLActivity.onNativeKeyDown();"



Another solution, would be to replace:

 if ( (event.getSource() & InputDevice.SOURCE_GAMEPAD) != 0 ||
      (event.getSource() & InputDevice.SOURCE_DPAD) != 0 ) {

by

 if ( (event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0)

Because only "SOURCE_CLASS_JOYSTICK" devices are registered/opened.
2015-06-17 00:00:53 -07:00
Sam Lantinga 59d34bc35d Fixed bug 3015 - grab mouse inconsistent state
Martin Gerhardy

Not sure - but I think there might be a logic flaw in SDL_SetWindowGrab.

The problem here is that this modifies the window flags and e.g. sets
SDL_WINDOW_INPUT_GRABBED - but the _this->grabbed_window pointer is not
yet set.

Then in SDL_UpdateWindowGrab the _this->grabbed_window pointer is only
set if the function pointer _this->SetWindowGrab is not NULL. But if
this is NULL, the _this->grabbed_window pointer is never set, but every
future call to any of the grab functions include an assert for:
SDL_assert(!_this->grabbed_window || ((_this->grabbed_window->flags &
SDL_WINDOW_INPUT_GRABBED) != 0));

That means the first call works, the second always fails and triggers
the assert.
2015-06-15 23:44:08 -07:00
Colby Klein ccc12a3632 Implement repositioning the OS-rendered IME with SDL_SetTextInputRect on Windows. 2015-06-15 20:24:51 -07:00
Ryan C. Gordon 0c3830a9a9 Haptic/Linux: Keep track of device numbers properly to track duplicates.
Fixes Bugzilla #3014.
2015-06-16 00:57:45 -04:00
Sam Lantinga d797582376 Fixed style 2015-06-14 19:26:20 -07:00
Sam Lantinga 34634082ff Fixed bug 3012 - Android accelerometer joystick axis values overflow when values from Android are larger than gravity
Magnus Bjerke Vik

This causes issues when for instance using the joystick API to make an Android phone rotate an object by rotating the phone. When the absolute value of an axis reported by android is larger than earth gravity, SDL will overflow the Sint16 value used for joystick axes, causing sporadic movements when close to the gravity. Just holding the phone so that e.g. Y points directly upwards will make it unstable, and even more if you just tap the phone gently from below (increasing the acceleration).

More detailed: SDLActivity gets the accelerometer values in onSensorChanged and divides each axis by earth gravity. SDL_SYS_JoystickUpdate takes each of the axis values, multiplies them by 32767.0 (largest Sint16), and the casts them to Sint16. From this you can see that any value from Android that exceeds earth gravity will overflow the joystick axis.

A fix is to clamp the values so that they won't overflow the Sint16.
2015-06-14 19:25:12 -07:00
Sam Lantinga e3df6d5e66 Fixed bug 2953 - Crash due to a bad cleanup in the SDL_SYS_HapticQuit function
Technically this is caused by the haptic devices not being closed at quit time, which we need to fix anyway, but this is a bandaid for now.
2015-06-14 19:21:13 -07:00
Sam Lantinga a4eb0dea86 Fixed bug 2908 - Fix clang warnings
Simon Deschenes

My build system still shows warning as errors.

The first warning says that the member named instances can never be false (or NULL) as it is a static array, and we should check for instances[index] which we do anyway.
2015-06-14 19:10:51 -07:00
Sam Lantinga 98f9b88cef Fixed bug 3011 - pthread/SDL_syssem.c requires _GNU_SOURCE
Ozkan Sezer

pthread/SDL_syssem.c requires _GNU_SOURCE predefined (like SDL_sysmutex.c),
otherwise sem_timedwait() prototype might not be available to it.  Problem
seen with glibc-2.3.4.
2015-06-13 13:36:47 -07:00
Sam Lantinga 9cf47d2f0d Fixed bug 3010 - SDL_x11messagebox.c needs including X11/keysym.h
Ozkan Sezer

SDL_x11messagebox.c needs including <X11/keysym.h> otherwise XK_Escape,
etc might not be available to it. Seen this with x.org-x11-6.8.2.
2015-06-13 13:34:30 -07:00
Philipp Wiesemann d8c2b36c21 Fixed crash if allocation for touch device failed.
If the allocation of an SDL_Touch failed, the number of touch devices was still
increased. Later access of the SDL_Touch would then have dereferenced the NULL.
2015-06-12 21:10:31 +02:00
Ryan C. Gordon 714687427a Make some string literals "const char *", not "char *" (thanks, Martin!).
Fixes Bugzilla #3007.
2015-06-12 11:58:31 -04:00
Sam Lantinga f29de0d324 Fixed bug 3005 - MOMO steering wheel not detected by SDL
Joe Thompson

This is a regression. The changes to fix #2460 cause the EnumJoysticksCallback() function to return without adding devices (Line 345 in SDL-0a2b6bc7005f\src\joystick\windows\SDL_dinputjoystick.c).
Looking at dinput.h on my system, at least DI8DEVTYPE_DRIVING and DI8DEVTYPE_FLIGHT need to be added to the test.
It might be better to check if (devtype == DI8DEVTYPE_SUPPLEMENTAL) rather than checking if it is NOT EQUAL to a long list of types. Or check if the device is already in the list.
2015-06-11 12:04:57 -07:00
Alex Szpakowski a86df3b7cf iOS: Fixed some cases where SDL_DestroyWindow or SDL_GL_DeleteContext can cause crashes. 2015-06-09 21:08:24 -03:00
Philipp Wiesemann cd1d7c94e9 Wayland: Fixed SDL_GetTouchDevice() returning 0 for the valid device index.
The single touch device gets SDL_TouchID 1 (like on Emscripten, iOS and WinRT).
2015-06-09 21:06:55 +02:00
Philipp Wiesemann 5d6aa08b28 Emscripten: Fixed SDL_GetTouchDevice() returning 0 for the valid device index.
The single touch device gets SDL_TouchID 1 (like on iOS and WinRT).
2015-06-09 21:06:29 +02:00
Philipp Wiesemann 86e9ab79ce Linux: Fixed not needed call to close() on error.
It was called if file descriptor was none and -1.
2015-06-08 20:46:09 +02:00
Ryan C. Gordon 50981d418a x11: Drop duplicate XInput2 XI_RawMotion events.
This happens when the pointer is grabbed, but it's not clear if this is a
bug in x.org or my misunderstanding of the XGrabPointer() documentation.

At any rate, we'll want to revisit this later for a better solution.

Fixes Bugzilla #2963.
2015-06-08 02:58:46 -04:00
Ryan C. Gordon 7232e51a68 Unix: Don't send quit events during signal handler.
Make note to send it, and send next time we SDL_PumpEvents().

Otherwise, we might be trying to use malloc() to push a new event on the
queue while a signal is interrupting malloc() elsewhere, usually causing a
crash.

Fixes Bugzilla #2870.
2015-06-08 01:52:43 -04:00
Ryan C. Gordon e3f4ca0d71 configure/cmake/x11: Removed SDL_VIDEO_DRIVER_X11_CONST_PARAM_XDATA32 test.
This was the only thing that made SDL_config.h generate differently between
32 and 64-bit versions of Linux, so instead we force a function cast in our
X11 code to match our dynamic loader version, which removes the compile error
on some machines that prompted this test in the first place.

Xlib never wrote to this data, so if you're on an older Xlib where this param
wasn't const, your data should still be intact when we force the caller to
think it was actually const after all.

Fixes Bugzilla #1893.
2015-06-08 01:13:51 -04:00
Ryan C. Gordon d98cfe1435 Let's assume that if VS2005 and VS2010 do it, VS2008 probably does, too. 2015-06-07 20:00:20 -04:00
Ryan C. Gordon 753f95c5dd VS2005 tweaks (thanks, Ozkan!).
Fixes Bugzilla #2895.

His notes:

The following trivial changes make SDL2 tree (mostly) compatible with Visual
Studio 2005:

* SDL_stdlib.c: Similar to VS2010 and newer, VS2005 also generates memcpy(),
  (it also generates memset(), see below), so propagate the #if condition to
  cover VS2005.

* SDL_pixels.c (SDL_CalculateGammaRamp): VS2005 generates a memset() call for
  gamma==0 case, so replace the if loop with SDL_memset().

* SDL_windowsvideo.h: Include msctf.h only with VS2008 and newer, otherwise
  include SDL_msctf.h

* SDL_windowskeyboard.c: Adjust the #ifdefs so that SDL_msctf.h inclusion is
  always recognized correctly.
2015-06-07 19:58:42 -04:00
Ryan C. Gordon 8bac796791 Maybe patched to compile on some Windows configurations.
(Maybe) Fixes Bugzilla #3001.
2015-06-07 18:29:23 -04:00
Ryan C. Gordon 141ac2b59d Backed out changeset c6d43e08be34
This caused Bugzilla #2963, so we'll find a better solution.
2015-06-07 17:59:31 -04:00
Ryan C. Gordon 699f879a8f Fixed a memory leak (thanks, Zack!).
We should probably rework this piece of code a little more after 2.0.4 ships,
though.

Fixes Bugzilla #3004.
2015-06-07 17:54:39 -04:00
Ryan C. Gordon 8a85084fc1 RPi: Patched to compile without OpenGL (thanks, Simon!), other cleanups.
Fixes Bugzilla #3003.
2015-06-06 22:45:22 -04:00
Philipp Wiesemann fd8b7c1ca3 Fixed comments at conditional compilation macros. 2015-06-05 19:41:18 +02:00
Ryan C. Gordon 360d05bf72 X11: Fixed SelectionRequest replies for target TARGETS.
Fixes Google Chrome, etc, freezing up when SDL owns the clipboard selection
and actually sends thems the correct text for pasting. Confirmed working with
Unicode strings in UTF-8 format.

There were a few tweaks in this patch, but the specific fix is that
event.xselection.target in the SelectionNotify event we send back in reply
must be set to the same atom as the request ("TARGETS" in this case), and
we failed to do that in this special case. Things that don't ask for a target,
like the Gnome Terminal app, worked fine because they don't ask for TARGETS
and just go right to asking for a UTF8_STRING, and Mozilla apparently just
was more liberal in what they accepted in reply.

Chrome would reject our wrong reply and freeze up waiting for a valid one.
Someone should fix that in Chrome, too.  :)

Fixes Bugzilla #2926.
2015-06-04 15:41:39 -04:00
Ryan C. Gordon 96aef8cbca X11: Fixed compiler warnings in DEBUG_XEVENTS sections. 2015-06-04 10:59:02 -04:00
Philipp Wiesemann 7738bd9b55 AIX: Fixed nearly impossible file descriptor leak. 2015-06-04 17:52:51 +02:00
Sam Lantinga 38549a7bba Fixed bug 2625 - Direct3D9 with SDL_TEXTUREACCESS_TARGET textures causes an application crash
Roberto

I have debugged the code checking the function calls when Direct3D is the renderer, remember that with software and OpenGL renderers, this issue is not happening.

- Create the texture:
SDL_Texture *pTex = SDL_CreateTexture(pRenderer, iFormat, SDL_TEXTUREACCESS_TARGET, pSurf->w, pSurf->h);

- Update the texture:
SDL_UpdateTexture(pTex, NULL, pSurf->pixels, pSurf->pitch);
  SDL_render.c, SDL_UpdateTexture(): return renderer->UpdateTexture(renderer, texture, rect, pixels, pitch);
    SDL_render_d3d.c, D3D_UpdateTexture(): if (D3D_UpdateTextureRep(data->device, &texturedata->texture, texture->format, rect->x, rect->y, rect->w, rect->h, pixels, pitch) < 0) {
      SDL_render_d3d.c, D3D_UpdateTextureRep(): if (D3D_CreateStagingTexture(device, texture) < 0) {
        SDL_render_d3d.c, D3D_CreateStagingTexture(): result = IDirect3DDevice9_CreateTexture(..., D3DPOOL_SYSTEMMEM, ...) --> FAIL! with INVALIDCALL code

After checking a bit the Microsoft documentation, I found this:

D3DUSAGE_RENDERTARGET can only be used with D3DPOOL_DEFAULT. (https://msdn.microsoft.com/en-us/library/windows/desktop/bb172625%28v=vs.85%29.aspx)

The call that fails, is using D3DUSAGE_RENDERTARGET with D3DPOOL_SYSTEMMEM which is unsupported, hence the INVALIDCALL return code.
2015-06-04 00:56:11 -07:00
Ryan C. Gordon ba1263cd1d Backout commit 83034612a883
This caused 8-bit modes to be chosen on older OS X releases.

Fixes Bugzilla #3000.
2015-06-04 02:12:06 -04:00
Ryan C. Gordon e8b376c9d5 Linux: Implemented sysfs-based version of SDL_GetPowerInfo().
Fixes Bugzilla #2938.
2015-06-03 13:11:28 -07:00
Ryan C. Gordon 36ecb766c8 Changed a static function to match the naming scheme of rest of source file. 2015-06-01 01:25:22 -04:00
Jason Wyatt cad269bc27 Also set the _NET_WM_NAME. Window managers supporting this will take this value over the value set by XStoreName. This explicitly supports UTF-8 encoding, which fixes corrupt UTF-8 titles in KDE. 2015-05-05 09:16:12 +01:00
Ryan C. Gordon 05e78b3f49 X11: search all XI2 touch devices, not just masters (thanks, Volumetic!).
Otherwise, you won't find touch devices that aren't currently assigned to a
system cursor.
2015-05-31 22:59:59 -04:00
Ryan C. Gordon 554b2b0e36 X11: Fixed message boxes not responding to click on titlebar close button.
The window needs to catch ClientMessage events for one specific window, but
XNextEvent() catches everything, and XWindowEvent doesn't catch ClientMessage,
so we need predicate procedure and XIfEvent() here.

Fixes Bugzilla #2980.
2015-05-31 22:48:26 -04:00
Ryan C. Gordon 7619ad3430 Cocoa: deal with mouse focus when warping the cursor from outside a window.
Otherwise, you might not get appropriate mouse enter/leave events.

Better fix for Bugzilla #2984.
2015-05-31 21:43:36 -04:00
Ryan C. Gordon 5b2ff76c12 Cocoa: send a MOUSEMOTION event when warping cursor from outside the window.
Fixes Bugzilla #2984.
2015-05-31 13:58:36 -04:00
Philipp Wiesemann 551fbf7bea Android: Changed two unknown keys to be consistent with Windows and X11 mapping. 2015-05-31 19:22:42 +02:00
Ryan C. Gordon 80614b27e4 Fixed swizzle of SDL_FillRect() on 24-bit surface (thanks, "nagydavid91"!).
Fixes Bugzilla #2986.
2015-05-31 11:38:10 -04:00
Ryan C. Gordon e58a5c43c4 X11: Fixed high mouse buttons mappings and horizontal wheels (thanks, Daniel!).
Fixes Bugzilla #2472.
2015-05-31 00:58:43 -04:00
Ryan C. Gordon 870df8adab Cocoa: ignore mouseDown events in a window's titlebar.
These events accidentally slipping in sometimes appears to be a bug (or
maybe new behavior) in 10.10, as previous versions of Mac OS X don't appear
to ever trigger this.

Thanks to Paulo Marques for pointing out the fix on the SDL mailing list!

Fixes Bugzilla #2842 (again).
2015-05-31 00:50:30 -04:00
Ryan C. Gordon f001a00b08 X11: Force the window focus during ShowWindow if there's no window manager.
Fixes Bugzilla #2997.
2015-05-29 15:21:47 -04:00
Sam Lantinga c888183728 Improved fix for bug 2096 - Mapping from scancode to keycode doesn't work for remapped modifier keys
Zack Middleton

The change to the keymap to use SDL_SCANCODE_TO_KEYCODE in SDL_x11keyboard.c causes all SDL scancodes without a Usc4 character to be XOR'd with SDLK_SCANCODE_MASK, but not all key code are suppose to be (as seen in include/SDL_keycodes.h). SDLK_BACKSPACE is not 0x4000002A.

I think the full list of keys affected are return, escape, backspace, tab, and delete.
2015-05-28 19:06:07 -07:00
Sam Lantinga da1909755b Fixed clip rectangle calculation when there is a viewport offset 2015-05-28 18:57:10 -07:00
Sam Lantinga 6e67c949c1 Fixed bug 2054 - SDL_GetError: "Unknown touch device"
Volumetric

The "Unknown touch device" message appears because the initial touch device setup loop uses SDL_GetTouch() as a guard for calling SDL_AddTouch().  SDL_GetTouch() will always report "Unknown touch device" since the device hasn't been added yet.  The SDL_GetTouch() call is unnecessary since SDL_AddTouch() calls SDL_GetTouchIndex() to verify that the device hasn't been added yet, and SDL_GetTouchIndex() has the benefit of not reporting an error for a device it can't find.
2015-05-28 12:55:01 -07:00
Sam Lantinga 32d6dcdb47 Fixed bug 2096 - Mapping from scancode to keycode doesn't work for remapped modifier keys
Jacob Lee

If a user has a non-standard keyboard mapping -- say, their caps lock key has been mapped to Ctrl -- then SDL_GetModState() is no longer accurate: it only considers the unmapped keys. This is a regression from SDL 1.2.

I think there are two parts to this bug: first, GetModState should use keycodes, rather than scancodes, which is easy enough.

Unfortunately, on my system, SDL considers Caps Lock, even when mapped as Control, to be both SDL_SCANCODE_CAPSLOCK and SDLK_CAPSLOCK. The output from checkkeys for it is:

INFO: Key pressed :  scancode 57 = CapsLock, keycode 0x40000039 = CapsLock  modifiers: CAPS

Whereas the output for xev is:

KeyPress event, serial 41, synthetic NO, window 0x4a00001,
    root 0x9a, subw 0x0, time 40218333, (144,177), root:(1458,222),
    state 0x10, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XKeysymToKeycode returns keycode: 37
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

I think the problem is that X11_UpdateKeymap in SDL_x11keyboard.c only builds a mapping for keycodes associated with a Unicode character (anything where X11_KeyCodeToUcs returns a value). In the case of caps lock, SDL scancode 57 becomes x11 keycode 66, which becomes x11 keysym 65507(Control_L), which does not have a unicode value.

To fix this, I suspect that SDL needs a mapping of the rest of the x11 keysyms to their corresponding SDL key codes.
2015-05-28 12:48:20 -07:00
Ryan C. Gordon 4d1626d042 Windows SDL_GetBasePath: free string on failure. 2015-05-28 15:36:27 -04:00
Ryan C. Gordon aa43bee434 Windows GetBasePath: fixed reallocation code. 2015-05-28 15:32:45 -04:00