We can utilize QStringList's join() function to perform all of the
appending in a single function call.
While we're at it, make the extension list a single translatable string
and add a disambiguation comment to explain to translators what %1
actually is.
change TouchToPixelPos to return std::pair<int, int>
static_cast (SDL)
various minor style and code improvements
style - PascalCase for function names
made touch events private
const pointer arg in touch events
make TouchToPixelPos a const member function
did I do this right?
braces on barely-multiline if
remove question comment (confirmed in Discord)
fixed consts
remove unused parameter from TouchEndEvent
DRY - High-DPI scaled touch put in separate function
also fixes a bug where if you start touching (with either mouse or touchscreen) and drag the mouse to the LEFT of the emulator window, the touch point jumps to the RIGHT side of the touchscreen; draggin to above the window would make it jump to the bottom.
implicit conversion from QPoint to QPointF, apparently
I have no idea what const even means but I'll put it here anyway
remove unused or used-once variables
make touch scaling functions const, and put their implementations together
removed unused FingerID parameters
QTouchEvent forward declaration; add comment to TouchBegin that was lost in an edit
better DRY in SDL
To do -> TODO(NeatNit)
remove unused include
This adds a Game List configuration group box which is similar to yuzu's, with features including icon size setting, row 1/2 text, and ability to hide invalid titles (those without a valid SMDH). I also added a UI tab and moved the language and theme settings there.
Placing the array wholesale into the header places a copy of the whole
array into every translation unit that uses the data, which is wasteful.
Particularly given that this array is referenced from three different
translation units.
This also changes the array to contain pairs of const char*, rather than
QString instances. This way, the string data is able to be fixed into
the read-only segment of the program, as well as eliminate static
constructors/heap allocation immediately on program start.
Keeps the individual behaviors in their own functions, and cleanly
separate. We can also do a little better by converting the relevant IDs
within the core to a QString only once, instead of converting every
string into a std::string.
Disambiguates what the string represents to help translators more easily
understand what it is that they're translating. While we're at it, we
can move the code to its own function, so that we don't need to specify
the same string twice.
Frame advancing is a commonly used TAS feature which basically means running the game frame by frame. TASers use this feature to press exact buttons at the exact frames. This commit added frame advancing to the framelimiter and two actions to the Movie menu. The default hotkey is `\` for advancing frames, and `Ctrl+A` for toggling frame advancing. The `Advance Frame` hotkey would automatically enable frame advancing if not already enabled.
This adds a clock init time field to the CTM header. The clock settings would be overridden when playing a movie. And when recording a movie, if the clock is set to System Time, it would be set to fixed init time at the current moment as well. In this way this keeps consistency with the RNG even if the user does just no setting.
Changes the interface as well to remove any unique methods that
frontends needed to call such as StartJoystickEventHandler by
conditionally starting the polling thread only if the frontend hasn't
started it already. Additionally, moves all global state into a single
SDLState class in order to guarantee that the destructors are called in
the proper order
Instead of using an unsigned int as a parameter and expecting a user to
always pass in the correct values, we can just convert the enum into an
enum class and use that type as the parameter type instead, which makes
the interface more type safe.
We also get rid of the bookkeeping "NUM_" element in the enum by just
using an unordered map. This function is generally low-frequency in
terms of calls (and I'd hope so, considering otherwise would mean we're
slamming the disk with IO all the time) so I'd consider this acceptable
in this case.
Qt provides an overload of tr() that operates on quantities in relation
to pluralization. This also allows the translation to adapt based on the
target language rules better.
For example, the previous code would result in an incorrect translation
for the French language (which doesn't use the pluralized version of
"result" in the case of a total of zero. While in English it's
correct to use the pluralized version of "result", that is, "results"
---
For example:
English: "0 results"
French: "0 résultat" (uses the singular form)
In French, the noun being counted is singular if the quantity is 0 or 1.
In English, on the other hand, if the noun being counted has a quantity
of 0 or N > 1, then the noun is pluralized.
---
For another example in a language that has different counting methods
than the above, consider English and Irish. Irish has a special form of
of a grammatical number called a dual. Which alters how a word is
written when N of something is 2. This won't appear in this case with a
direct number "2", but it would change if we ever used "Two" to refer to
two of something. For example:
English: "Zero results"
Irish: "Toradh ar bith"
English: "One result"
Irish: "Toradh amháin"
English: "Two results"
Irish: "Dhá thorthaí" <- Dual case
Which is an important distinction to make between singular and plural,
because in other situations, "two" on its own would be written as "dó"
in Irish. There's also a few other cases where the order the words are
placed *and* whether or not the plural or singular variant of the word
is used *and* whether or not the word is placed after or between a set
of numbers can vary. Counting in Irish also differs depending on whether or not
you're counting things (like above) or counting people, in which case an
entirely different set of numbers are used.
It's not important for this case, but it's provided as an example as to why one
should never assume the placement of values in text will be like that of
English or other languages. Some languages have very different ways to
represent counting, and breaking up the translated string like this
isn't advisable because it makes it extremely difficult to get right
depending on what language a translator is translating text into due to
the ambiguity of the strings being presented for translation.
In this case a translator would see three fragmented strings on
Transifex (and not necessarily grouped beside one another, but even
then, it would still be annoying to decipher):
- "of"
- "result"
- "results"
There is no way a translator is going to know what those sets of words
are actually used for unless they look at the code to see what is being
done with them (which they shouldn't have to do).
Previously, these were sitting outside of the Kernel namespace, which
doesn't really make sense, given they're related to the Thread class
which is within the Kernel namespace.
"value" is already a used variable name within the outermost ranged-for
loop, so this variable was shadowing the outer one. This isn't a bug,
but it will get rid of a -Wshadow warning.
* use SDL_PollEvent instead of SDL_JoystickUpdate
Register hot plugged controller by GUID if they were configured in a previous session
* Move SDL_PollEvent into its own thread
* Don't store SDLJoystick pointer in Input Device; Get pointer on each GetStatus call
* Fix that joystick_list gets cleared after SDL_Quit
* Add VirtualJoystick for InputDevices thats never nullptr
* fixup! Add VirtualJoystick for InputDevices thats never nullptr
* fixup! fixup! Add VirtualJoystick for InputDevices thats never nullptr
* Remove SDL_GameController, make SDL_Joystick* unique_ptr
* fixup! Remove SDL_GameController, make SDL_Joystick* unique_ptr
* Adressed feedback; fixed handling of same guid reconnects
* fixup! Adressed feedback; fixed handling of same guid reconnects
* merge the two joystick_lists into one
* make SDLJoystick a member of VirtualJoystick
* fixup! make SDLJoystick a member of VirtualJoystick
* fixup! make SDLJoystick a member of VirtualJoystick
* fixup! fixup! make SDLJoystick a member of VirtualJoystick
* Added a context menu on the buttons including Clear & Restore Default
* Allow clearing (unsetting) inputs. Added a Clear All button
* Allow restoring a single input to default (instead of all)
* Fix the issue that icons for owned games do not appear
* Fix the issue where you would double click on a room and connect to another
* Fix the issue that room name and nickname does not have size limitation
Shared fonts is no different from any other system archives, and there is not really any point to make a separate status for it. This also fixes the incorrect error message that was introduced when I made the UI text improvements.
* Add setting to switch between a fixed start time and the system time
Add clock settings to SDL
Make clock configureable in qt
Add a SharedPage handler class
Init shared_page_handler for tests
…class
Makes the global a member of the RendererBase class. We also change this
to be a reference. Passing any form of null pointer to these functions
is incorrect entirely, especially given the code itself assumes that the
pointer would always be in a valid state.
This also makes it easier to follow the lifecycle of instances being
used, as we explicitly interact the renderer with the rasterizer, rather
than it just operating on a global pointer.
Instead, we make a proper registry class and house it within the main
window, then pass it to whatever needs access to the loaded hotkeys.
This way, we avoid a global variable, and don't need to initialize a
std::map instance before the program can do anything.
* kernel/event: Make data members private
Instead we can simply provide accessors to the required data instead of
giving external read/write access to the variables directly.
* fix compile error
General moving to keep kernel object types separate from the direct
kernel code. Also essentially a preliminary cleanup before eliminating
global kernel state in the kernel code.
* Initial Discord RPC support
Build with Discord Presence ON
Fix RPC detection
Fix Time elapsed on pause; will now continue to count.
* Fix CI builds with compile flag
Addressed reviews
Fix silly mistakes
Fix 'Not in-game' display
class instead of namespace
Fix
Revamped
remove redundant code
Using Pimpl pattern
* Implement Null class
* Fix config updation
* Addressed All Reviews
* externals/discord-rpc : Updated to latest commit
- Can be used in either DynCom or Dynarmic mode
- Added support for threads
- Proper support for FPU registers
- Fix for NibbleToHex conversion that used to produce false error codes
- Fix for clang-format failing under Windows
* qt_themes: add two colorful themes
These two colorful themes are based on the Default and Dark themes, and contain icons that are colored rather than black and white. These icons come from https://icons8.com and they have been slightly revised by me. I'm pretty sure I was licensed to use them for Citra.
* Add license for icons
An implementation of the cemuhook motion/touch protocol, this adds the
ability for users to connect several different devices to citra to send
direct motion and touch data to citra.
This got rid of a warning of CMake Policy CMP0071 not set. In fact, setting it to either OLD or NEW is same for Citra (I tested on MSVC and MinGW), and the OLD option is deprecated, so I am using NEW here.
In dark theme, it is very hard to see the connected/disconnected icons because they are dark too. So I added two white-coloured icons for the dark theme. This also fixed an issue where theme update does not change the icon on the status bar.
When you change the language when a game is running, the "Continue" action in the "Emulation" menu would become "Start". This commit fixes the issue by checking and setting it if it should be "Continue". It seems that this is the only place with this issue.
The hotkey widget has a separate class defined for it, and qt cannot automatically retranslate it when retranslateUi is called. This commit explicitly calls the function to retranslate the hotkey dialog.
Previously, once you change language, the texts in the buttons in the Input tab will disappear. It is because the default text in the buttons are empty, and we did not update the text after translations are reloaded, aka texts are reset. This commit fixed the issue.
Due to a bug of Qt Linguist, the spliters in numbers cannot be parsed correctly and will cause strange issues. As far as I know, this caused 4 texts to be untranslated (translation source for them are not generated). Before the Qt bug is fixed (and we move to that version), I think we can temporarily remove the spliters from the numbers.
This doesn't depend on class state at all, so this can be made internal.
While we're at it, amend the function to take its arguments by const reference.
QString initializes to an empty string by default, so this does nothing
meaningful. While we're at it, use a constructor initializer list for
initializing the gamelist member variable.
* Addressed comments and removed the applet interface
* swkbd: address @lioncash's comments
* core: more fixes
** Moved registered_swkbd to System
** Removed an usused virtual
** Removed functionality of DrawScreenKeyboard
** Removed src/core/settings.h change
* swkbd: address @lioncash's 2nd review
* swkbd: update logging macro
* QtKeyboard: Make dialog modal and hide help
* citra_qt: correct spelling in configuration
* citra_qt/camera: Changed the order of the translation
The translation may not correspond to "couln't load" and "the camera", so create two cases which can get translated individually.
Also add a space after "the camera".
* citra_qt/camera: use the same syntax for the filter in "still_image_camera.cpp" as in "configure_camera.cpp"
* citra_qt/camera: the config should only get added if it's not empty
* Change the logging backend to support multiple sinks through the
Backend Interface
* Add a new set of logging macros to use fmtlib instead.
* Qt: Compile as GUI application on windows to make the console hidden by
default. Add filter configuration and a button to open log location.
* SDL: Migrate to the new logging macros
* Move Joining state change sooner in the code to prevent an issue where
failing to connect multiple times in a row doesn't change the state (as
it goes from CouldNotConnect -> CouldNotConnect which doesn't trigger a
state changed callback)
* Prevent double clicking too fast on a room in the lobby from causing
issues
* Lobby no longer closes when joining a room
Each window can still watch for state changes to update the ui or to
close the window as appropriate, but for any error announcements, they
all belong in Multiplayer state now.
In file included from src/citra_qt/citra-qt_autogen/mocs_compilation.cpp:14:
In file included from src/citra_qt/citra-qt_autogen/EWIEGA46WW/moc_game_list_p.cpp:9:
src/citra_qt/game_list_p.h:160:17: error: use of undeclared identifier 'QCoreApplication'; did you mean 'QApplication'?
setText(QCoreApplication::translate("GameList", status.text));
^~~~~~~~~~~~~~~~
QApplication
/usr/local/include/qt5/QtGui/qwindowdefs.h:81:7: note: 'QApplication' declared here
class QApplication;
^
In file included from src/citra_qt/citra-qt_autogen/mocs_compilation.cpp:14:
In file included from src/citra_qt/citra-qt_autogen/EWIEGA46WW/moc_game_list_p.cpp:9:
src/citra_qt/game_list_p.h:160:17: error: incomplete type 'QApplication' named in nested name specifier
setText(QCoreApplication::translate("GameList", status.text));
^~~~~~~~~~~~~~~~~~
/usr/local/include/qt5/QtCore/qobject.h:446:18: note: forward declaration of 'QApplication'
friend class QApplication;
^
In file included from src/citra_qt/citra-qt_autogen/mocs_compilation.cpp:14:
In file included from src/citra_qt/citra-qt_autogen/EWIEGA46WW/moc_game_list_p.cpp:9:
src/citra_qt/game_list_p.h:161:20: error: use of undeclared identifier 'QCoreApplication'; did you mean 'QApplication'?
setToolTip(QCoreApplication::translate("GameList", status.tooltip));
^~~~~~~~~~~~~~~~
QApplication
/usr/local/include/qt5/QtGui/qwindowdefs.h:81:7: note: 'QApplication' declared here
class QApplication;
^
In file included from src/citra_qt/citra-qt_autogen/mocs_compilation.cpp:14:
In file included from src/citra_qt/citra-qt_autogen/EWIEGA46WW/moc_game_list_p.cpp:9:
src/citra_qt/game_list_p.h:161:20: error: incomplete type 'QApplication' named in nested name specifier
setToolTip(QCoreApplication::translate("GameList", status.tooltip));
^~~~~~~~~~~~~~~~~~
/usr/local/include/qt5/QtCore/qobject.h:446:18: note: forward declaration of 'QApplication'
friend class QApplication;
^
This fixes#2092, a long-standing bug where on macOS resizing the window
results in a garbled display.
It seems the seemingly optional child()->makeCurrent call is actually
required on macOS. Enabling it in all cases fixes the resize issue.
* Remove borders from status bar items
On Ubuntu the status bar didn't look as good as on Windows due to some border being drawn around each status bar cell.
* Revert "Remove borders from status bar items"
This reverts commit 15fd32bf2b.
* Remove borders from status bar items
On Ubuntu the status bar didn't look as good as on Windows due to some border being drawn around each status bar cell.
* More accessible screen layout settings.
Depending on the game I'm playing I find myself needing to switch screen layouts very often and it's currently a hassle to have to open the settings dialog in order to do that so I've added shortcuts for the screen layout options and swap screen option on the main menu plus I added a keyboard shortcut to quickly toggle between the available layouts during game play (F10). I've also updated the swap screen shortcut (F9 now, used to be Ctrl + Tab) so it's next to the layout toggle shortcut by default (F9 and F10).
* Clean up.
* Add Context Menu Options to Open Application and Update Location
* address jroweboy's feedback
move enum definition to game list header
declare sdmc_dir in SAVE_DATA case
fix log formatting
* Address Merry's feedback
remove redundant line
format program ID as 16 digit hex in log|
change case of open_target to look better in title bar
add whitespace for readability
citra-qt: Add customizable speed limit target
* Update SDL config for the new frame_limit option
* Made max lag time a function of target speed percent.
* Added a checkbox to enable/disable frame limiter
* UI: Prevent frame_limit from under/overflowing
* UI: Hide target speed percent when frame limiter is off
* Disable frame limit spin box when framelimit isn't enabled
* Add tilt clamp setting
* Updated `clamp` to use variable
* Fixed a minor typo
* Include possibly necessary header
* expose setting in sdl2
* expose setting in qt
* incorporate @wwylele 's suggestion in sdl2
* Incorporate @wwylele 's suggestion (?)
Please review the code, this is the first time I'm working with `ParamPackage`s so I may just screw up the code.
* Forgot to change in qt
* Fixed an fatal error
* fixed clang format error
* remove the old setting
* fixed typos cusing errors
* removed old setting
* Changed init style
* Forgot this one
* Removed unnecessary header inclusion
* Update config.cpp
* update qt-config
* Update motion_emu.cpp
* Update motion_emu.cpp
* Add infrastructure to poll joystick input and get ParamPackages
* Generalize the callbacks in configure_input.cpp and add buttons for analog sticks
* Use the polling classes in the input dialog
* Fix includes
* Formatting fix
* Include real header instead of forward declaring, to fix compiler error
* Split up pair and add deadzone for joystick configuration
* Pass ParamPackages by reference to callback
* fix formatting
* getPollers -> GetPollers
* Add forward declarations and simplify code a bit
* Update joysticks before opening them
* Fix mixup between joystick IDs and device indices
Kernel/Threads: Add a new thread status that will allow using a Kernel::Event to put a guest thread to sleep inside an HLE handler until said event is signaled