mirror of
				https://git.h3cjp.net/H3cJP/citra.git
				synced 2025-10-30 22:44:58 +00:00 
			
		
		
		
	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] | ||||
| Name=colorful_dark | ||||
| Comment=Colorful theme (Dark style) | ||||
| Inherits=default | ||||
| Inherits=colorful | ||||
| Directories=16x16 | ||||
|   | ||||
| [16x16] | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| [Icon Theme] | ||||
| Name=colorful_midnight_blue | ||||
| Comment=Colorful theme (Midnight Blue style) | ||||
| Inherits=default | ||||
| Inherits=colorful | ||||
| Directories=16x16 | ||||
| 
 | ||||
| [16x16] | ||||
|  |  | |||
|  | @ -1257,10 +1257,6 @@ QComboBox::item:alternate { | |||
|   background: #19232D; | ||||
| } | ||||
| 
 | ||||
| QComboBox::item:checked { | ||||
|   font-weight: bold; | ||||
| } | ||||
| 
 | ||||
| QComboBox::item:selected { | ||||
|   border: 0px solid transparent; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								dist/yuzu.bmp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dist/yuzu.bmp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 256 KiB | 
|  | @ -64,6 +64,7 @@ void AsyncShaders::FreeWorkers() { | |||
| 
 | ||||
| void AsyncShaders::KillWorkers() { | ||||
|     is_thread_exiting.store(true); | ||||
|     cv.notify_all(); | ||||
|     for (auto& thread : worker_threads) { | ||||
|         thread.detach(); | ||||
|     } | ||||
|  |  | |||
|  | @ -151,6 +151,7 @@ add_executable(yuzu | |||
|     util/util.h | ||||
|     compatdb.cpp | ||||
|     compatdb.h | ||||
|     yuzu.qrc | ||||
|     yuzu.rc | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -2770,7 +2770,7 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) { | |||
|                     .arg(errors)); | ||||
|         } | ||||
| 
 | ||||
|         QProgressDialog prog; | ||||
|         QProgressDialog prog(this); | ||||
|         prog.setRange(0, 0); | ||||
|         prog.setLabelText(tr("Deriving keys...\nThis may take up to a minute depending \non your " | ||||
|                              "system's performance.")); | ||||
|  | @ -2952,7 +2952,7 @@ void GMainWindow::filterBarSetChecked(bool state) { | |||
| } | ||||
| 
 | ||||
| void GMainWindow::UpdateUITheme() { | ||||
|     const QString default_icons = QStringLiteral(":/icons/default"); | ||||
|     const QString default_icons = QStringLiteral("default"); | ||||
|     const QString& current_theme = UISettings::values.theme; | ||||
|     const bool is_default_theme = current_theme == QString::fromUtf8(UISettings::themes[0].second); | ||||
|     QStringList theme_paths(default_theme_paths); | ||||
|  | @ -2968,7 +2968,6 @@ void GMainWindow::UpdateUITheme() { | |||
|             qApp->setStyleSheet({}); | ||||
|             setStyleSheet({}); | ||||
|         } | ||||
|         theme_paths.append(default_icons); | ||||
|         QIcon::setThemeName(default_icons); | ||||
|     } else { | ||||
|         const QString theme_uri(QLatin1Char{':'} + current_theme + QStringLiteral("/style.qss")); | ||||
|  | @ -2980,10 +2979,7 @@ void GMainWindow::UpdateUITheme() { | |||
|         } else { | ||||
|             LOG_ERROR(Frontend, "Unable to set style, stylesheet file not found"); | ||||
|         } | ||||
| 
 | ||||
|         const QString theme_name = QStringLiteral(":/icons/") + current_theme; | ||||
|         theme_paths.append({default_icons, theme_name}); | ||||
|         QIcon::setThemeName(theme_name); | ||||
|         QIcon::setThemeName(current_theme); | ||||
|     } | ||||
| 
 | ||||
|     QIcon::setThemeSearchPaths(theme_paths); | ||||
|  |  | |||
|  | @ -14,8 +14,8 @@ | |||
|    <string>yuzu</string> | ||||
|   </property> | ||||
|   <property name="windowIcon"> | ||||
|    <iconset> | ||||
|     <normaloff>../dist/yuzu.ico</normaloff>../dist/yuzu.ico</iconset> | ||||
|    <iconset resource="yuzu.qrc"> | ||||
|     <normaloff>:/img/yuzu.ico</normaloff>:/img/yuzu.ico</iconset> | ||||
|   </property> | ||||
|   <property name="tabShape"> | ||||
|    <enum>QTabWidget::Rounded</enum> | ||||
|  | @ -303,6 +303,8 @@ | |||
|    </property> | ||||
|   </action> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <resources> | ||||
|   <include location="yuzu.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
|  |  | |||
							
								
								
									
										5
									
								
								src/yuzu/yuzu.qrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/yuzu/yuzu.qrc
									
									
									
									
									
										Normal file
									
								
							|  | @ -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) | ||||
| 
 | ||||
| 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 | ||||
|     config.cpp | ||||
|     config.h | ||||
|  | @ -24,6 +34,9 @@ if (MSVC) | |||
| endif() | ||||
| 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) | ||||
| 
 | ||||
| if(UNIX AND NOT APPLE) | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ | |||
| #include "input_common/mouse/mouse_input.h" | ||||
| #include "input_common/sdl/sdl.h" | ||||
| #include "yuzu_cmd/emu_window/emu_window_sdl2.h" | ||||
| #include "yuzu_cmd/yuzu_icon.h" | ||||
| 
 | ||||
| EmuWindow_SDL2::EmuWindow_SDL2(InputCommon::InputSubsystem* 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) { | ||||
|     SDL_SetWindowMinimumSize(render_window, minimal_size.first, minimal_size.second); | ||||
| } | ||||
|  |  | |||
|  | @ -32,6 +32,9 @@ public: | |||
|     /// Wait for the next event on the main thread.
 | ||||
|     void WaitEvent(); | ||||
| 
 | ||||
|     // Sets the window icon from yuzu.bmp
 | ||||
|     void SetWindowIcon(); | ||||
| 
 | ||||
| protected: | ||||
|     /// Called by WaitEvent when a key is pressed or released.
 | ||||
|     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, | ||||
|                                     SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL); | ||||
| 
 | ||||
|     SetWindowIcon(); | ||||
| 
 | ||||
|     if (fullscreen) { | ||||
|         Fullscreen(); | ||||
|     } | ||||
|  |  | |||
|  | @ -35,6 +35,8 @@ EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(InputCommon::InputSubsystem* input_subsyste | |||
|         std::exit(EXIT_FAILURE); | ||||
|     } | ||||
| 
 | ||||
|     SetWindowIcon(); | ||||
| 
 | ||||
|     switch (wm.subsystem) { | ||||
| #ifdef SDL_VIDEO_DRIVER_WINDOWS | ||||
|     case SDL_SYSWM_TYPE::SDL_SYSWM_WINDOWS: | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue