Stereo buffer is not remade in the case of audio plugin
switch (only affects GBA, not GB). This results in a crash.
We need to remake the stereo buffer and reinit the pointers
in Gba_Pcm.output or they will be dangling, and lead to a
crash. Also, cleaning up the Multi_Buffer class a bit.
Just a hack to fix a problem with vcpkg upgrades, in this case the
version of the zlib port being too old breaks another upgrade, so we
will check if zlib is in the list of packages to upgrade and upgrade it
before anything else.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Don't disable ccache for msys+ninja anymore, since the mingw ccache
works now and there is no reason to use the msys ccache anymore.
Use RULE_LAUNCH_COMPILE only on cmake versions < 3.4.0, because this
currently breaks resource compilation with visual studio and the windows
native ccache from chocolatey, this needs to be fixed in ccache.
On cmake 3.4.0 and greater, set the variables
CMAKE_<LANG>_COMPILER_LAUNCHER instead. This has the effect of using
ccache for C, C++ and nasm, but not for the resource file, avoiding the
problem with visual studio, which has a more recent cmake. This must be
done before the project() call.
TODO: Currently the Visual Studio build with ccache from chocolatey
works correctly, ccache is being invoked from ninja, but no cache files
are being created. This is being followed up with the chocolatey package
maintainer and upstream if necessary. The resource compiler issue also
needs to be fixed upstream.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Add the Catch2 headers to third_party/include/catch2.
Add Catch.cmake and CatchAddTests.cmake to cmake/.
Add unit tests src/wx/tests/strutils.cpp using Catch2 to test
src/wx/strutils.cpp.
Make some code changes to strutils.cpp to make the tests pass.
See src/wx/tests/CMakeLists.txt for how to set up unit test files; they
plug into the normal CTest mechanism in cmake.
The test binaries are written to the tests/ subdirectory of the build
directory.
Building the tests and enabling the CTest support can be turned off by
passing -DBUILD_TESTING=OFF to cmake, the default is ON, this is the
standard mechanism.
Start running ctest on travis and appveyor.
Move stb to third_party/include where Catch2 is now as well.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Build on bionic with downloaded stow packages in /usr/local.
f51e1ee4 is actually a fix for a wx with --enable-utf8 and NOT for a wx
with --disable-stl, as it turns out.
FreeBSD uses --enable-utf8, while Linux distributions generally don't.
Tested by reverting f51e1ee4.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Followup on baa0341b.
Reintroduce checking if a key is actually pressed in the panel OnKeyDown
event with wxGetKeyState(key_code).
Introduced in b0ec846 and removed in baa0341b.
wxGetKeyState() does not work on Wayland and does not work for Unicode
keys, support for which was introduced in baa0341b, which is why the
call was removed.
Add two static functions is_key_pressed(ev) and is_key_released(ev) that
return true under Wayland or if the key is Unicode, and call
wxGetKeyState() otherwise.
The reason this call was introduced in b0ec846 was to work around a bug
in some Linux distributions that caused spurious keyboard events to be
generated. The bug apparently still persists, see #689.
Because the two additional checks were necessarily added, the bug may
persist on Wayland, if it exists there, and for Unicode keys, but will
be fixed in the more common case of Latin keys under Xorg.
Tested on Linux with both Latin and Unicode game input keyboard keys.
- Fix#689.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Followup on baa0341b.
Use ToStdWstring() instead of wc_str() to look up strings in the map,
the key for the map is std::wstring.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
- Allow some control chars to be used as input.
This is actually a regression, since our default config uses some of
these chars.
- Allow default keys bindings to be used elsewhere.
If we try to use keys such as `KP_ADD`, `KP_ENTER` as game input, we
actually execute a `NOOP` command accelerator (nothing done), as we
associate the key with it to disable the accel.
Due to this, we do not allow any further processing of this key, such
as game input.
- Allow key shortcuts to run with loaded game.
For example, when we set `CTRL+A` for `load most recent save state` and
use `A` for some input command, holding `CTRL` and then pressing `A`
will not execute the shortcut. Instead, the key press `A` will be used
only as the input and nothing else.
With this, we use both the input and shortcut key.
- Isolate function to get keyboard key codes.
As explained on [1]:
"Using `GetUnicodeKey()` is in general the right thing to do if you are
interested in the characters typed by the user, `GetKeyCode()` should
be only used for special keys (for which `GetUnicodeKey()` returns
`WXK_NONE`)."
We also allow special keys to be mapped, hence the requirement of using
both functions.
[1] https://docs.wxwidgets.org/3.1/classwx_key_event.html
- Allow use of unicode keys for input and shortcut.
Use format `KeyCode:Modifier` for saving/loading unicode keys.
`WxWidgets=3.{0,1}` does not create an accelerator from strings with
unicode keys such as `ç` (`FromString` function). It fails with an
assertion error and stops execution. At the same time, we use the keys'
strings that are known for WxWidgets, such as `A`, `CTRL+O`,
`PAGEUP` etc.
Use both `EVT_KEY_DOWN` and `EVT_CHAR`.
`EVT_CHAR` is better than `EVT_KEY_DOWN` here because it is where the
raw key events will have been cooked using whatever recipes are in
effect from the os, locale, international keyboard settings, etc.
- Enable SDL joysticks input as key shortcuts.
Start/Stop polling joysticks on Unload/load game.
Our main loop already polls the joystick, we don't need the timer
while a game is running.
- Create function `str_split_with_sep` and use it.
For when we parse strings that may include the sep string, such as
game input and key shortcuts.
It is not needed to set `throttle` on neither case. There is actually a
bug when using turbo/speedup and closing the emulator. The test case
is the following:
https://github.com/visualboyadvance-m/visualboyadvance-m/issues/627
On Windows:
1. use opengl;
2. load GBA game;
3. set throttle to `100%`;
4. set turbo throttle to `200%`;
5. enable turbo on menu;
6. save game;
7. close emulator && open emulator;
8. load GBA game;
==>
throttle is `200%`.
This is definitely not expected.
Before, if we tried changing the connection type without closing vbam,
we would get an error about a connection already existing. We needed
to restart vbam to change it.
Ignore mouse movements of less than 11 pixels, to avoid spurious events
from mice in high DPI mode etc..
- Fix#675.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
We are not going to release 32 bit mac builds anymore, because any mac
sold after 2007 will run a 64 bit binary. And since we are building for
10.7, which requires a 64 bit mac, and will run 64 bit binaries even on
a 32 bit kernel, the 32 bit binary was always pointless.
More on this here:
https://apple.stackexchange.com/questions/99640/how-old-are-macs-that-cannot-run-64-bit-applications/99644#99644https://apple.stackexchange.com/a/261793/206363
Remove references to 32 bit mac binary from the dev manual.
Builder updates:
- Bump cmake 3.13.0-rc1 -> 3.17.3. This is needed for the new
FetchContent feature in cmake, which we use for Sparkle (online
updates for mac.)
- Bump sfml to newer master commit.
- Add pre-build hook for libvpx on mac to set
-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET in CFLAGS.
- Force C locale in all builder scripts, homebrew bash was erroring due
to some kind of locale bug with a non-English locale.
- Remove .app in build_project() before building, rebuilds were failing
due to reinstallation of frameworks (Sparkle.)
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Minor code improvements.
Do not suppress output of sudo invocation, this may cause it hang on an
invisible password prompt.
- Fix#676.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
In the Turbo config dialog, remove the selection list for entering the
value and leave only the spin control. Allow values above 600%, up to
4000%.
Reintroduce the speedup_frame_skip config variable, defaulting to 9, use
it for turbo selection values > 600%, with speedup_throttle == 0.
The rationale for this is that on average modern hardware, throttle
values above 500% or 600% will not be effective.
The default is now shown as 1000%, which is:
frame_skip == 9 && speedup == 1,
where:
speedup == 1 is equivalent to throttle == 0,
as was the case before the turbo config changes.
Values above 600% are automatically rounded up or down to the nearest
100%, on entry and on click of the up/down arrows of the spin control.
The frame skip checkbox is cleared and disabled for the "Unlimited"
setting (throttle == 0), and set and disabled for values > 600%, to
reflect the mechanism to the user.
When the value again enters the modifiable range in the spin control,
the previous value of the checkbox is restored.
Misc:
- Turn off translation of percentage values in the xrc.
- Remove the size element for the throttle selection list in the general
config dialog xrc, it breaks the layout on GTK3.
- Add a note about passing wxWidgets_CONFIG_EXECUTABLE to cmake to
select wxWidgets version to README.md.
Hopefully this will reduce confusion and present a nicer UI.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Followup on 07064c87.
Use codesign --deep to sign the .app before signing all the frameworks,
otherwise codesign will refuse to sign the app due to unsigned dylibs
when not making a static build.
The error is:
./visualboyadvance-m.app: code object is not signed at all
In subcomponent: ...libtheoraenc.1.dylib
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Create and enable auto-updater for MacOS using `Sparkle=1.23`. We need
to sign our app using an `Apple Developer Key` for it to work properly,
since we are not going to sign updates with the Sparkle key.
Add all auto-updater files to `gettext`'s pot.
Use `str_split` to always get related stable version. We do not want
to check for nightly builds.
For Windows, we create the flag `-DHTTPS` to select between using an
HTTPS or HTTP URL for the auto-updater checks. We use this to keep
support for Windows XP (HTTP only) while all others should be HTTPS.
Also, use `::FreeLibrary` to allow us to remove the temporary file
that stores the `WinSparkle.dll`. Previously, we could not get it to
work with `wine`.
We upgrade only the first listed package to upgrade for vcpkg to not
overrun the CI time limit.
Sometimes these packages are up-to-date but are listed for rebuild due
to depending on other packages that would be upgraded.
Find the first package in the upgrade list that is not up-to-date and
use that as the package to upgrade.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Add support for non-GameController SDL Joysticks.
Add proxy class wxSDLJoyDev to support using either SDL_GameController*
or SDL_Joystick* values in joystate.dev.
Add pretty much identical SDL code to support SDL_Joystick* when the
device cannot be opened as an SDL_GameController*, without changing the
API. SDL_Joystick* devices operate almost identically to SDL_Controller*
devices with their own default mappings, for both events and polling.
Filter axis motion events in the bindings editor widget for subsequent
events within 300ms. This gets rid of the double binding for +1/-1 when
the stick is moved to a direction.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Add ui/hideMenuBar boolean option, defaulting to on, which hides the
main menubar when the mouse is idle or outside the frame.
This is disabled on mac, because on macs the main menubar is not part of
the application window.
Fix pointer hiding/unhiding by connecting panel events to the gamearea
mouse event handler.
Clean up the pausing when menus are opened code, make it actually work
on Windows.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
When toggling "retain aspect ratio", destroy the drawing panel so it is
recreated with the desired aspect ratio settings.
Only add the vertical spacers when aspect ratio is on, they are not
needed when it's off.
Set the sizer priority of the DrawingPanel to 1 if aspect ratio is off
so that wxEXPAND always works.
Clear the GameArea sizer when attaching a new DrawingPanel, this is so
that the vertical spacers used when aspect ratio is on are not included
when aspect ratio is off.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>