yuzu: Various frontend improvements to avoid crashes and improve experience on Linux.
This commit is contained in:
parent
0bbf5e61f1
commit
eae9f2e440
|
@ -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]
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 256 KiB |
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
<RCC>
|
||||||
|
<qresource prefix="/img">
|
||||||
|
<file alias="yuzu.ico">../../dist/yuzu.ico</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Reference in New Issue