Switch usage of std::optional to nonstd::optional for now because of an
error from the Mac builder script, I cannot reproduce the problem yet
but will try to fix it later, it may not be fixable when targeting 10.7.
The header is from:
https://github.com/martinmoene/optional-lite
.
Usage is about the same, to include:
`#include "nonstd/optional.hpp"`
Then use nonstd::optional and nonstd::nullopt instead of the std::
counterparts.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This introduces abstractions for a game key (`wxGameKey`), a game
control (`wxGameControl`) and a common global handler for in-game
user input processing (`wxGameControlState`).
User configuration is changed from a vector to a map of `wxGameControl`
to a set of `wxUserInput`, which simplifies input configuration updates.
User input processing for in-game controls is now unified between
keyboard and joypad input, and is much faster in general since access
to game control state is now always logarithmic rather than linear.
This comes at the expense of slightly slower user input configuration
updates. However, in the worst case scenario, this is still done in
O(log(n)).
This removes all uses of `wxJoyKeyBinding`. However, some uses of the
key, mod, joy triplets remain and will be cleaned up in follow-up PRs.
Issue: #745
Previously, a manual polling of every joystick was performed every 25ms,
resulting in many CPU resources being wasted. This seems to have been
put in place to deal with issues in SDL where joysticks connected after
SDL was initialized did not fire SDL events properly. From manual
testing, this issue seems to have been fixed.
This also fixes a bug in handling of legacy joystick hats, where an
incorrect conversion for the event value was performed.
Finally, this fixes minor typoes and renames
`wxSDLJoyState::ProcessEvent()` to `wxSDLJoyState::ProcessSDLEvent()` to
suppress a warning about a method override.
This introduces a new abstraction for any user input. The long-term goal
is to replace every usage of "custom" {key, mod, joy} triplets in the
code base with this new class.
This class implements comparison operators, allowing for faster access
in a set or as a key in a map, compared to the vectors currently used.
Issue: #745
* Add wxJoystick to abstract what was previously referred to as
|player_index|. This is a first step towards a larger refactor of
input handling.
* Remove "SDL" from types that are not directly SDL-related, namely
"wxSDLJoyEvent", "wxSDLControl".
* Rename "wxSDLJoy" into "wxJoyPoller". This clarifies the use of this
class.
Issue: #745
Use file(GLOB ${lib_name}*.lib) to detect the appropriate suffixes for
wx dependency libs, because the suffix keeps changing, sometimes there
is a 'd' added for debug builds and sometimes it changes to not adding
the suffix, this will make the code more robust and lead to fewer build
failures.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Stop setting the build_prefix* variables as they are no longer used and
relying on build trees being available would break /installed caches
etc..
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Probably fixes this in other environments as well, or breaks it.
Move the wxWidgets_LIBRARIES paths conversion to the already existing
normalize_wx_paths() function that was using a different method that no
longer works. This converts the variable to the right format before the
tests run, fixing the Wx OpenGL test.
For the ABI checks, wrap the function pointers for the minhook
trampoline API in reinterpret_cast<LPVOID>(&fp), why this is necessary I
don't know, and it may break on other compilers. The trampoline is used
to catch message boxes opened by Wx for fatal errors.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Update installdeps and cmake to use windres from gcc binutils from
MINGW64 on MSYS2 CLANG64, because llvm-rc doesn't work sometimes.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Use jpeg.lib instead of jpegd.lib for jpeg debug lib, it no longer has
the "d" suffix.
Fix all CMAKE_BUILD_TYPE checks for debug builds to either also check
for RelWithDebInfo or match "Debug" exactly.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Update installdeps to support CLANG64/CLANG32 MSYS2 targets.
cmake:
Set POLICY CMP0060 to NEW to not convert full lib paths, this is the
default.
Stop disabling ffmpeg on WIN32+i686.
On MSYS2+clang add windows import libs to CMAKE_PREFIX_PATH.
For static builds on MSYS2 append full paths for static libs for tiff,
jbig and lzma to FFMPEG_LIBRARIES.
Add -Wno-unused-command-line-argument to all CFLAGS/CXXFLAGS so that
clang does not warn about gcc-specific options.
Enable -march/-mtune optimizations by default instead of only for
UPSTREAM_RELEASE.
Update find_wx_util() to search suffixes for WIN32 and add the "static"
suffix for static builds.
Remove all linker flags from wxWidgets_LIBRARIES and translate all wx*
libs as well as jpeg, tiff, jbig lzma and expat to full .a paths for
static builds.
Disable strutil tests on MSYS2+clang, currently does not build.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
For MSVC, add the optimization flags:
/fp:fast /Oi
, to favor speed for floating point operations and use intrinsic
operations where possible.
For release builds also add:
/O2
. Use sqrt() instead of std::sqrt() in XBRZ for MSVC x64 just in case to
make sure it uses the intrinsic version.
Test build is reported to run much faster.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Builds translations.zip and nothing else.
This is for the nightly builder when only translations are changed.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This is used by some hacked ROMs like Metroid II DX.
Add a config variable to enable the already existent core support for
this.
This conflicts with using a GB BIOS file, add checks and error dialogs
for this.
Also move including "ConfigManager.h" into "wxvbam.h".
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Use the X86_64 variable instead of AMD64 for this architecture in cmake.
For our upstream binary builds, use -march=core2 -mtune=rocketlake for
X86_64 on macOS, -march=core2 -mtune=znver3 for X86_64 on non-macOS (not
currently used) and -march=pentium-mmx -mtune=core2 for the future
Windows XP 32 bit MinGW build.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Instead of suffixing release zip files with 32bit or 64bit, add an
architecture suffix, which would be one of:
x86_32
x86_64
arm32
arm64
Allow codesign to fail on mac without aborting.
Disable the interactive pause for gpg signing because there is no
passphrase anymore.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
The present ini variable is from vbam 1.x and is behaviourally backwards where setting disablemmx to true actually enables mmx, 2.x builds should not be using the ini from 1.x for various reasons.
- Minor refactoring, some variable name and type changes
- Remove unnecessary checks in clock latch
- Fix stuck in whitescreen after Hudson startup logo
- Fix Gamepak error message at initial load of game without prior rtc
data available to load
- Save the bare-minimum variable needed for rtc (saves only
Basetime/lastTime)
Savestates are broken due to the change in savestate struct size for
HuC3. Since save/load function also includes save data for other
non-active mappers, the change in size breaks every savesfiles being
made.
This PR refactors the HuC3 clock data struct to be separate from the
main struct, and then only added to save/load functions when HuC3 mapper
is used. This still breaks previous HuC3 states but other mappers should
now not get affected
Solution:
Savestate/LoadState should only include mapper data of current active
running rom, not all mappers even if they are inactive. This will break
every savefile but it would be better for the long run when changes are
neede to be done.
- SRAM support is already available, but the battery-enabled flag was
not enable for 0xFE (HuC3) rom types.
- Hookup rtc support based on local time. This would allow time to sync
when starting the game. You need to initially set the time first
though on first bootup (RTC support was based on gambatte sources)
Fix https://github.com/libretro/vbam-libretro/issues/95
Previously, this function returned -1 or "true" but wxWidgets
defines constants for the returned values for FilterEvent()
overrides so use these instead.
Remove keychain unlock for codesigning, that doesn't work anymore, the
key has to be in the system keychain.
Use `zip -9yr` instead of `zip -9r` to make the .zip file of the .app so
that symlinks are preserved, this was creating a corrupted .app.
Don't build zip in the mac builder, use the system zip instead.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Since SDL 2.0.14, KMOD_GUI is no longer a macro but an enum value:
https://hg.libsdl.org/SDL/rev/15a0bc9612e9
So this code broke as the enum value doesn't satisfy `defined()`.
This bug was responsible for audio on Windows not working without
forcefully setting the audio driver to DirectSound.
The problem was that WASAPI (or whatever API SDL2 was choosing)
defaults to an incompatible audio specification (possibly F32 sample
format - I didn't check).
Despite the `audio` struct requesting the S16 sample format, SDL2 was
granted permission to use whatever format it preferred because it was
given the `SDL_AUDIO_ALLOW_ANY_CHANGE` flag.
To fix this, I've removed that flag, effectively forcing SDL2 to use
the audio specification VBA-M requires.
Remove the `find_package(unofficial-gettext ...)` invocation for vcpkg
as it is no longer required, the normal `find_package(Gettext ...)`
mechanism works.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Some allocators return a non-null pointer when calling *alloc with
zero size, that will segfault upon access. Check for the size parameter
before allocating anything to ensure that the breakpoint and trace
fields will stay null when size >> 3 or size >> 1 is zero.
This is a major refactor of the wxSDLJoy class.
* Move handling of SDL objects creation and destruction to its own
class. This simplifies the lifespan of SDL-related objects.
* Re-add handling of HATs. This is necessary for DirectInput
controllers.
* Rename the public API for wxSDLJoy to be clearer.
* Add documentation for every class related to wxSDLJoy.
I'm not sure what purpose this currently serves but I know that it
breaks the build when CMAKE_PREFIX_PATH is set to something nontrivial.
Stop doing that.
Stop setting the 4 plane data pointers in recording audio frames to the
sample stream. This confuses the converter and makes it write the right
channel to both channels.
- Fix#723.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Hopefully fix various bugs caused by not differentiating between SDL
joystick_index and SDL_JoystickID (the joystick instance id.)
On controller disconnect, disconnect and reconnect all configured
devices because the SDL joystick index may change, and this will update
the mapping.
Also fix creating a state entry for the configured joystick even when
it's not connected, add the controller/joystick name to the connected
message and increase the poll time from 10ms to 25ms.
- Fix#718.
- Fix#726.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Start the joystick polling timer on pause and stop it on resume, so that
accelerators bound to joystick events are still processed.
Followup on def5d3e4.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Followup on 7031c1d1, which for some reason removed the calls to stop
the timer when a game is loaded and restart it when it is unloaded.
Add the calls back.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Remove the `evthandler` member and `Attach()` method from `wxSDLJoy`.
Add the `GetJoyEventHandler()` method to `MainFrame`, which returns the
window in focus, or the panel if the option for joystick background
input is enabled.
Remove the handler parameter in `wxSDLJoy::CreateAndSendEvent()` and
call `wxGetApp().frame->GetJoyEventHandler()` to get the handler.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
- Joystick background input.
Set as enabled by default.
- Linux: `X11` and `Wayland` done.
1. `Wayland` does not allow to listen for keypresses for security reasons.
Discussion here: https://github.com/albertlauncher/albert/issues/309
2. For `X11` we can use `XQueryKeymap` to check keyboard state.
- Windows: done.
We use `GetAsyncKeyState` most significant bit to check if the key
is being pressed.
Followup on ff03bcc1.
Running wxrc from the build directory turned out to be unnecessary,
because the dlls were not there anyway, and we added them to the PATH.
And using absolute paths for the xrc sources puts them into the gettext
pot comments which is not what we want.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This adds the command-line option `-c` or `--config` to specify a custom
configuration file.
Co-authored-by: Fabrice de Gans-Riberi <steelskin+github@gmail.com>
Do not link `SDL2main` on any WIN32, not just MSVC.
Define `WIN32_CONSOLE_APP` for Debug mode builds on any WIN32, not just
MSVC.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
When doing a dynamic build, the wxWidgets dlls are needed by the wxrc
executable.
Invoke wxrc with the target triplet debug and release bin directory
prepended to the PATH, this is where the dlls are.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Make `speedup_frame_skip` and `speedup_throttle` independent settings,
with `speedup_frame_skip == 0` when `speedup_throttle` is not in effect,
and `speedup_throttle == 100` when `speedup_frame_skip` is in effect.
This fixes a previously introduced bug where `speedup == true &&
speedup_frame_skip = X` was never enabled.
This also allows `speedup_throttle == 0` for no throttle and no frame
skip during speedup.
Also set the upper bound on `throttle` and `speedup_throttle` to `450`
instead of `600`, as the DirectSound driver does not support values
higher than that.
In the DirectSound implementation of `setThrottle`, for `throttle == 0`
use a `throttle == 450` frequency multiplier, because a zero frequency
does nothing.
- Fix#719.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
When the wxrc installed by vcpkg into tools was made with the non-static
wxWidgets, and the build is static, it will not find the wxWidgets dlls
and fail.
Use our own wxrc.exe from the dependencies submodule for the time being.
This is a temporary fix, a proper fix would be adding the dlls, if they
are installed, to the PATH.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Rename the joystick polling timer accessors and add a predicate.
Check it and make sure the timer is running in the input and accelerator
config dialogs.
- Fix#711.
- Fix#716.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
- Removing mapperSeconds and mapperLSeconds since both of these can be
zero at any time since they are seconds timer, not seconds since
epoch.
- This leaves only mapperLastTime as this is the number of seconds since
last epoch. If this value is zero, then initialize rtc.
It is now installed as `libexpatMD.lib` for release and
`libexpatdMD.lib` for debug and not `expat.lib`.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Use the vcpkg installed wxrc, from a tools subdirectory, instead of
copying it out of the build tree.
Except when running on appveyor, for some reason the vcpkg wxrc does not
work there, so use our own from the dependencies submodule.
Support vcpkg mingw triplets, they don't work yet however.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
- This is done so we can poll inputs from one place all at once for all
player ports instead of calling the function multiple times for each player port.
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.
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>
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>
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`.
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>
MBC30 is a variant of MBC3 with a 4MiB ROM size and a larger RAM size.
https://gekkio.fi/files/gb-docs/gbctr.pdf
Allow addressing 4MiB of the ROM in MBC3 ROM bank select if the ROM size
is 4MiB.
Fix provided by roytam1.
- Fix#652.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
We have some issues when trying to open files on Windows that contains
characters not included in the current codepage. Using `fopen` fails
when that happens.
One example is using the `pt_BR` codepage and then using a name with
japanese chars for the battery file.
The games and BIOS work since they use `blargg_open`. It converts a
`const char *` to `const wchat_t *` and uses `_wfopen` for windows.
(doing a multibyte to widechar conversion)
Since we want to avoid doing many code changes on our cores, we need
some `util*` functions for the matter.
Replace `mb_fn_str` by UTF-8 strings.
Replace all occurrences of `fopen` for `utilOpenFile` on GBA core.
Replace all occurrences of `fopen` for `utilOpenFile` on GBA e-reader.
Adjust e-readers calls on wx frontend.
Replace all occurrences of `fopen` for `utilOpenFile` on Patcher files.
Always apply UTF-8 when dealing with path strings.
On our wx frontend we should always send UTF-8 `char *` to our cores
functions. This way we can have consistency when dealing with them for
each platform.
On Windows, we will convert all multibyte to wide chars and use proper
functions for I/O operation.
Create function to deal with unicode calls of `gzopen`.
We use `gzopen_w` (`zlib>=1.27`).
Replace all occurrences of `fopen` for `utilOpenFile` on Config Manager.
Replace all occurrences of `fopen` for `utilOpenFile` on Cheat files.
Use proper functions for unicode on GB core.
Use function instead of macro for `UTF8()`.
Use `nullptr` instead of `NULL`.
Print wide char strings on status bar.
Fix throttle=0 (unlimited speed) settings for both the Speedup/Turbo
config panel and the general throttle setting and make 100 the default.
Replace the speedup frame skip option with a "Frame skip" checkbox,
which enables skipping the appropriate number of frames if vsync or very
low system performance is in effect. The systemFrameSkip (under video
config) is added to this value.
With speedup_throttle=100, the old speedup behavior is used with 9
frames skipped.
With speedup_throttle == 0 && speedup_throttle_frame_skip, skip 9
frames at full speed, which is exactly the same as the old behavior,
since throttle == 0 is equivalent to speedup == true.
Hopefully these changes will make the turbo config dialog more useful
for users, by default frame skipping to work around vsync will be
enabled, and users can uncheck the "Frame skip" checkbox for a smoother
experience.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Fix problem with the ZIP_SUFFIX option, which causes zip files to have a
suffix of "OFF" if the option is not set.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Since they share the filter function, but can change one from another
(setting on the GBA would apply to GB and vice-versa), we allow only
the proper setting to be toggled while a ROM is loaded.
If GB ROM, then `Options` > `Game Boy` > `LCD Filter` is enabled.
Likewise for GBA. If neither, then no option is enabled.
When we skip frames, we just don't draw them on our frontend. The
function `systemDrawScreen` also send the video frames to be recorded,
but only when called from the core.
Our solution creates a auxiliary `systemSendScreen` that only adds the
frame to the recording. It is called when the core decides to skip a
frame. This way we can get the video frame for recording, just like
audio ones are always sent.
The flag `wxST_NO_AUTORESIZE` does not behave well on our viewers. They
were being hidden due to not fitting the text box available.
On Windows, they were working as expected. It is unknown on MacOs.
XRC error: 131: vertical alignment flag `wxALIGN_BOTTOM` has no effect
inside a vertical box sizer, remove it and consider inserting a spacer
instead.
- Fix#517.
We already had `optFlashSize` for both SDL and WX ports. We assigned
this variable to replace all ocurrences of `winFlashSize`.
As a side note, this entire scope could/should be replaced by a better
auto-detect system for saving types. At the moment, it is only really
useful for the SDL port, since we have overrides for the WX port.
- Fix#585.
We offer a way to control the color saturation for GBA games such as
Fire Emblem Tactics Advance.
It will be enabled by default for GBA games and disabled for GB.
The user will be able to toggle both of them and these options
will be persistent by saving to `vbam.ini`.
- Fix#131.
Add a ZIP_SUFFIX option defaulting to "" that is added to the generated
.zip file with UPSTREAM_RELEASE before the .zip extension.
For example, for an experimental feature you could pass
-DZIP_SUFFIX=-timer_loop and the resulting .zip file would be
visualboyadvance-m-Win-64bit-timer_loop.zip or
visualboyadvance-m-Win-64bit-debug-timer_loop.zip for a debug build.
Also add a modeline to this cmake file because vim-sleuth always gets
the settings wrong. Or it could be the cmake filetype plugins.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
For the netlink dialog, leave the server IP text field enabled when the
server radio button is selected and bind it to the new option
gopts.server_ip which defaults to "*" for binding on all addresses,
which was the previous behavior.
Copy this value to the new GBALink global IP_LINK_BIND_ADDRESS and use
it when creating a listening socket.
SFML supports creating sf:IpAddress values from hostnames, consequently
no additional code is needed to support hostnames in the netlink dialog.
Change GetLinkServerHost to return the primary local address when the
value is "*", which was the previous behavior, and the set value
otherwise.
Remove the min/max macros from GBALink as they are unnecessary and
conflict with std headers.
Require at least SFML 2.4 instead of 2.x for the IP binding
functionality in cmake.
- Fix#632
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
For the zip file containing the executable (and symbols for debug builds
on msvc) add the -debug suffix to the basename of the zip file for debug
builds.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
When UPSTREAM_RELEASE is set, only use gpg to make detached signatures
if the output of gpg -k is not blank. If it is not, the user has likely
installed a private key to sign with.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Quote variables containing the HOME or USERPROFILE, as they may have
spaces.
Check for both osslsigncode and signtool regardless of platform, and
prefer osslsigncode.
The reason for this being that osslsigncode is more reliable and does
not depend on system configuration in any way, while signtool can fail
under more conditions.
The other reason being that you can use either program on both windows
and linux. E.g. the mingw version of osslsigncode or the signtool from
mono distributions on linux.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
When we have a notebook with intel+nvidia, OpenGL sets both
`glXSwapIntervalSGI` (nvidia) and `glXSwapIntervalMESA` (intel) for
usage. That means that if the display is controlled by one, we may
disable vsync for the other card, therefore having no actual effect
on gameplay. With this, we check for all available functions and try
them all.
This may lead to some false warnings, but useful for debugging
purposes.
The vsync has to be {dis,en}abled before a ROM is loaded or we need to
restart the output module to apply it.
We also support MESA based installations (Intel HD Graphics, AMD/ATI and
Nouveau) on Linux.
Include the visualboyadvance-m.pdb file alongside the .exe for Visual
Studio debug builds.
Visual Studio generates this file with the debug symbols for debug
builds. The file is not generated for release builds. It is also
generated for RelWithDebInfo builds.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
soundInit() returns a bool to indicate success, and failure inevitably
leads to crashes as the emulator tries to use a NULL soundDriver.
On false, popup an error dialog saying that the sound driver failed to
initialize, this is at least better than crashes, which will also need
to be fixed.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Limit the utilLoad() function in src/Util.cpp to 32 MiB.
This function loads a file from disk and returns a memory image of it.
This is only used to load ROMs currently.
Followup on 513af13d which replaces the use of libpng with the stb_image
headers.
- Remove the use of libpng in cmake.
- Remove libpng from list of vcpkg dependencies.
- Add libpng to list of wxwidgets link libraries when using vcpkg, since
it is no longer linked directly. This is necessary for static builds.
- Remove libpng from all package lists in installdeps.
- Remove libpng-dev from the debian control file.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Extract strings from all wx sources, not just the enabled ones.
Ignore comments in the generated pot when checking if it was updated, we
don't care about just changes in line numbers.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
gcc (mingw) does not allow converting a const char*[] to a char**
without -fpermissive. Make some adjustments to the string handling to
execute the cmd.exe command to delete the temp file.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Trying to delete the temp file for the winsparkle dll after unloading
the dll would still produce an access denied error, presumably because
for whatever reason not all resources used by the dll were freed.
Instead of trying to immediately delete the file, start an asynchronous
cmd.exe process to sleep for 2 seconds and delete the file. This gives
the app time to exit, after which the file can be deleted.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
When the feature was added in d93f6350, I did not adequately test for
the normal case when the pot is not updated.
This does not work because the pot has a timestamp in the
POT-Creation-Date: field.
Fix check-pot-update.cmake to ignore the pot timestamp and not report
the pot as changed when it has not been.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Remove po/update_pot.sh and generate the gettext .pot source
automatically in cmake on every build instead.
If the .pot is actually updated, print a loud message at the end of the
build to commit the result and push to transifex.
Fix the gettext tools and package loading block to only run when
ENABLE_NLS is enabled and find the xgettext and msginit binaries in the
Windows case as well. xgettext is used to generate the .pot.
Refactor the SRC_WX/HDR_WX/RES_WX/XRC_SOURCES handling to use only
relative paths and move all generated files into RES_WX. This was
necessary to generate the .pot from cmake.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Fix issues with {sav,load}ing e-Reader `Dot Code`.
If `Dot Code` file is not specified, it tries to continually read it and does not accept input.
In Japanese (very likely other languages as well), the path of `Dot Code` file is garbled
internally due to failing conversion to UTF-8.
Default to ON on Windows for x64 or x86.
Set new appcast URL, this will be in the github pages repo.
We will need to get everything ready for the next release.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Default the linkTimeout ConfigManager variable to 500 (milliseconds.)
Detect if the previous default is set, which 1, and set to 500, to
repair existing configurations.
This may reduce the amount of reports about link being broken, as some
people have certainly not checked this setting, and the default should
not be so wrong.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Add field for the network port to the start link dialog, default is 5738
as before.
The port is stored in the user's options config.
Add TextCtrl support to UIntValidator for this.
Related: #594.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This doesn't work to pick up changes from changed translations files
though, because git does not store file timestamps.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
We need to use proper documented behaviour when coding the
core, therefore this should be reverted until a proper
solution is done.
This reverts commit ca3b63d64c.
The current code is very messy as far as GFX goes. There are more
elegant ways of tackling this issue, but they are very difficult with
our current code.
The idea behind this issue is that the backgrounds are not switching
properly for the lcd. So we enable the layers accordingly to
`layerSettings & DISPCNT` on every `CPUUpdateRenderBuffers`.
The bits of `layerSettings` enconde each layer and objs.
We actually only need 2 of these, but I can't do much more here
unsupervised.
- Fix#376.
Use the 3.x wxwidgets mingw package in installdeps.
Add the win64 alias to installdeps for 64 bit mingw builds, like the
win32 alias for 32 bit mingw builds.
Check CROSS_ARCH in Architecture.cmake, set by our mingw toolchains.
Disable LTO by default for all mingw builds, not just amd64, because it
is unfortunately broken on i686 as well now.
Search for heuristically the most appropriate wx-config and set
wxWidgets_CONFIG_EXECUTABLE accordingly in the mingw toolchains.
Refactor the mingw toolchains somewhat, put common code into a common
file, add static toolchains.
For static toolchains, also search for a static zlib and set ZLIB_ROOT.
Change installdeps instructions to use ninja instead of make. Add ninja
to all target dependencies where it was missing, this may be incorrect
in a couple of the rarely used targets, if this is the case the affected
users are free to open an issue.
Also start using ninja on travis instead of make, except for libretro
which uses a GNU Makefile.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Although a length check is being performed on the imported GSA Codes file, `len` is both a signed int and attacker controlled.
With a specially crafted GSA Codes file, an attacker could specify a value for `len` that overflows the `int` type, rolling over into a negative number. By doing so, the attacker can bypass the conditional mentioned above.
The `fseek` length parameter is of type `size_t` which is an unsigned int, this will result in `len` being interpreted as a large unsigned int, allowing for a stack based buffed overflow in the desc char array.
By making `len` an unsigned integer, it will prevent the overflow. It ensures that the bounds check works as intended.
Use GetIcons() to get the IconBundle and call GetIcon() on it to get a
32x32 icon with fallback.
For whatever reason this works while just GetIcon() does not.
Source:
https://forums.wxwidgets.org/viewtopic.php?t=44818
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Followup on f306cc63.
The icon name was changed from "vbam" to "visualboyadvance-m", so also
change the Icon field in the .desktop file.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>
Followup on e98d8931.
Set the BITS variable in Architecture.cmake even if
CMAKE_SYSTEM_PROCESSOR is not set, and it often isn't. This allows for
generating the right release zip for 32 bit MinGW builds.
When invoking zip to make the translations.zip, use `.` instead of `*`
as the argument, with the correct WORKING_DIRECTORY, so as not to rely
on shell globbing of any sort. This broke for the 32 bit MinGW cross
build.
Fix the keychain unlock command on mac, the keychain must be unlocked to
use the codesigning certificate.
Fix the translations.zip.asc signature overwrite prompt on Windows.
For the mac builder, automatically use Xcode 9 for 32 bit builds if
installed, this is necessary on 10.14 (Mojave) and later.
Add interactive-pause.cmake script to wait for the user to press enter
before continuing, invoke it before gpg commands so that waiting for the
passphrase does not time out. It will not run if ENV{CI} is set or
ENV{VBAM_NO_PAUSE} is set, this is so that later we can set up automated
builds.
Signed-off-by: Rafael Kitover <rkitover@gmail.com>