yuzu: Various frontend improvements to avoid crashes and improve experience on Linux.

This commit is contained in:
bunnei 2021-02-14 00:20:41 -08:00
parent 0bbf5e61f1
commit eae9f2e440
14 changed files with 54 additions and 16 deletions

View File

@ -1,7 +1,7 @@
[Icon Theme] [Icon Theme]
Name=colorful_dark Name=colorful_dark
Comment=Colorful theme (Dark style) Comment=Colorful theme (Dark style)
Inherits=default Inherits=colorful
Directories=16x16 Directories=16x16
[16x16] [16x16]

View File

@ -1,7 +1,7 @@
[Icon Theme] [Icon Theme]
Name=colorful_midnight_blue Name=colorful_midnight_blue
Comment=Colorful theme (Midnight Blue style) Comment=Colorful theme (Midnight Blue style)
Inherits=default Inherits=colorful
Directories=16x16 Directories=16x16
[16x16] [16x16]

View File

@ -1257,10 +1257,6 @@ QComboBox::item:alternate {
background: #19232D; background: #19232D;
} }
QComboBox::item:checked {
font-weight: bold;
}
QComboBox::item:selected { QComboBox::item:selected {
border: 0px solid transparent; border: 0px solid transparent;
} }

BIN
dist/yuzu.bmp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

View File

@ -64,6 +64,7 @@ void AsyncShaders::FreeWorkers() {
void AsyncShaders::KillWorkers() { void AsyncShaders::KillWorkers() {
is_thread_exiting.store(true); is_thread_exiting.store(true);
cv.notify_all();
for (auto& thread : worker_threads) { for (auto& thread : worker_threads) {
thread.detach(); thread.detach();
} }

View File

@ -151,6 +151,7 @@ add_executable(yuzu
util/util.h util/util.h
compatdb.cpp compatdb.cpp
compatdb.h compatdb.h
yuzu.qrc
yuzu.rc yuzu.rc
) )

View File

@ -2770,7 +2770,7 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {
.arg(errors)); .arg(errors));
} }
QProgressDialog prog; QProgressDialog prog(this);
prog.setRange(0, 0); prog.setRange(0, 0);
prog.setLabelText(tr("Deriving keys...\nThis may take up to a minute depending \non your " prog.setLabelText(tr("Deriving keys...\nThis may take up to a minute depending \non your "
"system's performance.")); "system's performance."));
@ -2952,7 +2952,7 @@ void GMainWindow::filterBarSetChecked(bool state) {
} }
void GMainWindow::UpdateUITheme() { void GMainWindow::UpdateUITheme() {
const QString default_icons = QStringLiteral(":/icons/default"); const QString default_icons = QStringLiteral("default");
const QString& current_theme = UISettings::values.theme; const QString& current_theme = UISettings::values.theme;
const bool is_default_theme = current_theme == QString::fromUtf8(UISettings::themes[0].second); const bool is_default_theme = current_theme == QString::fromUtf8(UISettings::themes[0].second);
QStringList theme_paths(default_theme_paths); QStringList theme_paths(default_theme_paths);
@ -2968,7 +2968,6 @@ void GMainWindow::UpdateUITheme() {
qApp->setStyleSheet({}); qApp->setStyleSheet({});
setStyleSheet({}); setStyleSheet({});
} }
theme_paths.append(default_icons);
QIcon::setThemeName(default_icons); QIcon::setThemeName(default_icons);
} else { } else {
const QString theme_uri(QLatin1Char{':'} + current_theme + QStringLiteral("/style.qss")); const QString theme_uri(QLatin1Char{':'} + current_theme + QStringLiteral("/style.qss"));
@ -2980,10 +2979,7 @@ void GMainWindow::UpdateUITheme() {
} else { } else {
LOG_ERROR(Frontend, "Unable to set style, stylesheet file not found"); LOG_ERROR(Frontend, "Unable to set style, stylesheet file not found");
} }
QIcon::setThemeName(current_theme);
const QString theme_name = QStringLiteral(":/icons/") + current_theme;
theme_paths.append({default_icons, theme_name});
QIcon::setThemeName(theme_name);
} }
QIcon::setThemeSearchPaths(theme_paths); QIcon::setThemeSearchPaths(theme_paths);

View File

@ -14,8 +14,8 @@
<string>yuzu</string> <string>yuzu</string>
</property> </property>
<property name="windowIcon"> <property name="windowIcon">
<iconset> <iconset resource="yuzu.qrc">
<normaloff>../dist/yuzu.ico</normaloff>../dist/yuzu.ico</iconset> <normaloff>:/img/yuzu.ico</normaloff>:/img/yuzu.ico</iconset>
</property> </property>
<property name="tabShape"> <property name="tabShape">
<enum>QTabWidget::Rounded</enum> <enum>QTabWidget::Rounded</enum>
@ -303,6 +303,8 @@
</property> </property>
</action> </action>
</widget> </widget>
<resources/> <resources>
<include location="yuzu.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>

5
src/yuzu/yuzu.qrc Normal file
View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/img">
<file alias="yuzu.ico">../../dist/yuzu.ico</file>
</qresource>
</RCC>

View File

@ -1,5 +1,15 @@
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
function(create_resource file output filename)
# Read hex data from file
file(READ ${file} filedata HEX)
# Convert hex data for C compatibility
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," filedata ${filedata})
# Write data to output file
set(RESOURCES_DIR "${PROJECT_BINARY_DIR}/dist" PARENT_SCOPE)
file(WRITE "${PROJECT_BINARY_DIR}/dist/${output}" "const unsigned char ${filename}[] = {${filedata}};\nconst unsigned ${filename}_size = sizeof(${filename});\n")
endfunction()
add_executable(yuzu-cmd add_executable(yuzu-cmd
config.cpp config.cpp
config.h config.h
@ -24,6 +34,9 @@ if (MSVC)
endif() endif()
target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} SDL2 Threads::Threads) target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} SDL2 Threads::Threads)
create_resource("../../dist/yuzu.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon")
target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR})
target_include_directories(yuzu-cmd PRIVATE ../../externals/Vulkan-Headers/include) target_include_directories(yuzu-cmd PRIVATE ../../externals/Vulkan-Headers/include)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)

View File

@ -12,6 +12,7 @@
#include "input_common/mouse/mouse_input.h" #include "input_common/mouse/mouse_input.h"
#include "input_common/sdl/sdl.h" #include "input_common/sdl/sdl.h"
#include "yuzu_cmd/emu_window/emu_window_sdl2.h" #include "yuzu_cmd/emu_window/emu_window_sdl2.h"
#include "yuzu_cmd/yuzu_icon.h"
EmuWindow_SDL2::EmuWindow_SDL2(InputCommon::InputSubsystem* input_subsystem_) EmuWindow_SDL2::EmuWindow_SDL2(InputCommon::InputSubsystem* input_subsystem_)
: input_subsystem{input_subsystem_} { : input_subsystem{input_subsystem_} {
@ -194,6 +195,22 @@ void EmuWindow_SDL2::WaitEvent() {
} }
} }
void EmuWindow_SDL2::SetWindowIcon() {
SDL_RWops* const yuzu_icon_stream = SDL_RWFromConstMem((void*)yuzu_icon, yuzu_icon_size);
if (yuzu_icon_stream == nullptr) {
LOG_WARNING(Frontend, "Failed to create yuzu icon stream.");
return;
}
SDL_Surface* const window_icon = SDL_LoadBMP_RW(yuzu_icon_stream, 1);
if (window_icon == nullptr) {
LOG_WARNING(Frontend, "Failed to read BMP from stream.");
return;
}
// The icon is attached to the window pointer
SDL_SetWindowIcon(render_window, window_icon);
SDL_FreeSurface(window_icon);
}
void EmuWindow_SDL2::OnMinimalClientAreaChangeRequest(std::pair<unsigned, unsigned> minimal_size) { void EmuWindow_SDL2::OnMinimalClientAreaChangeRequest(std::pair<unsigned, unsigned> minimal_size) {
SDL_SetWindowMinimumSize(render_window, minimal_size.first, minimal_size.second); SDL_SetWindowMinimumSize(render_window, minimal_size.first, minimal_size.second);
} }

View File

@ -32,6 +32,9 @@ public:
/// Wait for the next event on the main thread. /// Wait for the next event on the main thread.
void WaitEvent(); void WaitEvent();
// Sets the window icon from yuzu.bmp
void SetWindowIcon();
protected: protected:
/// Called by WaitEvent when a key is pressed or released. /// Called by WaitEvent when a key is pressed or released.
void OnKeyEvent(int key, u8 state); void OnKeyEvent(int key, u8 state);

View File

@ -107,6 +107,8 @@ EmuWindow_SDL2_GL::EmuWindow_SDL2_GL(InputCommon::InputSubsystem* input_subsyste
dummy_window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 0, 0, dummy_window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 0, 0,
SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL); SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL);
SetWindowIcon();
if (fullscreen) { if (fullscreen) {
Fullscreen(); Fullscreen();
} }

View File

@ -35,6 +35,8 @@ EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(InputCommon::InputSubsystem* input_subsyste
std::exit(EXIT_FAILURE); std::exit(EXIT_FAILURE);
} }
SetWindowIcon();
switch (wm.subsystem) { switch (wm.subsystem) {
#ifdef SDL_VIDEO_DRIVER_WINDOWS #ifdef SDL_VIDEO_DRIVER_WINDOWS
case SDL_SYSWM_TYPE::SDL_SYSWM_WINDOWS: case SDL_SYSWM_TYPE::SDL_SYSWM_WINDOWS: