diff options
| author | 2021-02-14 00:20:41 -0800 | |
|---|---|---|
| committer | 2021-02-14 00:20:41 -0800 | |
| commit | eae9f2e4404f6bdf8a192bc9c09e53cd87e4359d (patch) | |
| tree | 3f5cfe0d7067853437249cd167e79d9299c984b1 /src/yuzu_cmd | |
| parent | Merge pull request #5925 from ReinUsesLisp/resource-pool-clean (diff) | |
| download | yuzu-eae9f2e4404f6bdf8a192bc9c09e53cd87e4359d.tar.gz yuzu-eae9f2e4404f6bdf8a192bc9c09e53cd87e4359d.tar.xz yuzu-eae9f2e4404f6bdf8a192bc9c09e53cd87e4359d.zip | |
yuzu: Various frontend improvements to avoid crashes and improve experience on Linux.
Diffstat (limited to 'src/yuzu_cmd')
| -rw-r--r-- | src/yuzu_cmd/CMakeLists.txt | 13 | ||||
| -rw-r--r-- | src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | 17 | ||||
| -rw-r--r-- | src/yuzu_cmd/emu_window/emu_window_sdl2.h | 3 | ||||
| -rw-r--r-- | src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp | 2 |
5 files changed, 37 insertions, 0 deletions
diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 0b3f2cb54..8461f8896 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt | |||
| @@ -1,5 +1,15 @@ | |||
| 1 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules) | 1 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules) |
| 2 | 2 | ||
| 3 | function(create_resource file output filename) | ||
| 4 | # Read hex data from file | ||
| 5 | file(READ ${file} filedata HEX) | ||
| 6 | # Convert hex data for C compatibility | ||
| 7 | string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," filedata ${filedata}) | ||
| 8 | # Write data to output file | ||
| 9 | set(RESOURCES_DIR "${PROJECT_BINARY_DIR}/dist" PARENT_SCOPE) | ||
| 10 | file(WRITE "${PROJECT_BINARY_DIR}/dist/${output}" "const unsigned char ${filename}[] = {${filedata}};\nconst unsigned ${filename}_size = sizeof(${filename});\n") | ||
| 11 | endfunction() | ||
| 12 | |||
| 3 | add_executable(yuzu-cmd | 13 | add_executable(yuzu-cmd |
| 4 | config.cpp | 14 | config.cpp |
| 5 | config.h | 15 | config.h |
| @@ -24,6 +34,9 @@ if (MSVC) | |||
| 24 | endif() | 34 | endif() |
| 25 | target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} SDL2 Threads::Threads) | 35 | target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} SDL2 Threads::Threads) |
| 26 | 36 | ||
| 37 | create_resource("../../dist/yuzu.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon") | ||
| 38 | target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR}) | ||
| 39 | |||
| 27 | target_include_directories(yuzu-cmd PRIVATE ../../externals/Vulkan-Headers/include) | 40 | target_include_directories(yuzu-cmd PRIVATE ../../externals/Vulkan-Headers/include) |
| 28 | 41 | ||
| 29 | if(UNIX AND NOT APPLE) | 42 | if(UNIX AND NOT APPLE) |
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp index 39841aa28..7e391ab89 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "input_common/mouse/mouse_input.h" | 12 | #include "input_common/mouse/mouse_input.h" |
| 13 | #include "input_common/sdl/sdl.h" | 13 | #include "input_common/sdl/sdl.h" |
| 14 | #include "yuzu_cmd/emu_window/emu_window_sdl2.h" | 14 | #include "yuzu_cmd/emu_window/emu_window_sdl2.h" |
| 15 | #include "yuzu_cmd/yuzu_icon.h" | ||
| 15 | 16 | ||
| 16 | EmuWindow_SDL2::EmuWindow_SDL2(InputCommon::InputSubsystem* input_subsystem_) | 17 | EmuWindow_SDL2::EmuWindow_SDL2(InputCommon::InputSubsystem* input_subsystem_) |
| 17 | : input_subsystem{input_subsystem_} { | 18 | : input_subsystem{input_subsystem_} { |
| @@ -194,6 +195,22 @@ void EmuWindow_SDL2::WaitEvent() { | |||
| 194 | } | 195 | } |
| 195 | } | 196 | } |
| 196 | 197 | ||
| 198 | void EmuWindow_SDL2::SetWindowIcon() { | ||
| 199 | SDL_RWops* const yuzu_icon_stream = SDL_RWFromConstMem((void*)yuzu_icon, yuzu_icon_size); | ||
| 200 | if (yuzu_icon_stream == nullptr) { | ||
| 201 | LOG_WARNING(Frontend, "Failed to create yuzu icon stream."); | ||
| 202 | return; | ||
| 203 | } | ||
| 204 | SDL_Surface* const window_icon = SDL_LoadBMP_RW(yuzu_icon_stream, 1); | ||
| 205 | if (window_icon == nullptr) { | ||
| 206 | LOG_WARNING(Frontend, "Failed to read BMP from stream."); | ||
| 207 | return; | ||
| 208 | } | ||
| 209 | // The icon is attached to the window pointer | ||
| 210 | SDL_SetWindowIcon(render_window, window_icon); | ||
| 211 | SDL_FreeSurface(window_icon); | ||
| 212 | } | ||
| 213 | |||
| 197 | void EmuWindow_SDL2::OnMinimalClientAreaChangeRequest(std::pair<unsigned, unsigned> minimal_size) { | 214 | void EmuWindow_SDL2::OnMinimalClientAreaChangeRequest(std::pair<unsigned, unsigned> minimal_size) { |
| 198 | SDL_SetWindowMinimumSize(render_window, minimal_size.first, minimal_size.second); | 215 | SDL_SetWindowMinimumSize(render_window, minimal_size.first, minimal_size.second); |
| 199 | } | 216 | } |
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.h b/src/yuzu_cmd/emu_window/emu_window_sdl2.h index a93141240..51a12a6a9 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.h +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.h | |||
| @@ -32,6 +32,9 @@ public: | |||
| 32 | /// Wait for the next event on the main thread. | 32 | /// Wait for the next event on the main thread. |
| 33 | void WaitEvent(); | 33 | void WaitEvent(); |
| 34 | 34 | ||
| 35 | // Sets the window icon from yuzu.bmp | ||
| 36 | void SetWindowIcon(); | ||
| 37 | |||
| 35 | protected: | 38 | protected: |
| 36 | /// Called by WaitEvent when a key is pressed or released. | 39 | /// Called by WaitEvent when a key is pressed or released. |
| 37 | void OnKeyEvent(int key, u8 state); | 40 | void OnKeyEvent(int key, u8 state); |
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp index deddea9ee..a02485c14 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp | |||
| @@ -107,6 +107,8 @@ EmuWindow_SDL2_GL::EmuWindow_SDL2_GL(InputCommon::InputSubsystem* input_subsyste | |||
| 107 | dummy_window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 0, 0, | 107 | dummy_window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 0, 0, |
| 108 | SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL); | 108 | SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL); |
| 109 | 109 | ||
| 110 | SetWindowIcon(); | ||
| 111 | |||
| 110 | if (fullscreen) { | 112 | if (fullscreen) { |
| 111 | Fullscreen(); | 113 | Fullscreen(); |
| 112 | } | 114 | } |
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp index 3ba657c00..6f9b00461 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp | |||
| @@ -35,6 +35,8 @@ EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(InputCommon::InputSubsystem* input_subsyste | |||
| 35 | std::exit(EXIT_FAILURE); | 35 | std::exit(EXIT_FAILURE); |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | SetWindowIcon(); | ||
| 39 | |||
| 38 | switch (wm.subsystem) { | 40 | switch (wm.subsystem) { |
| 39 | #ifdef SDL_VIDEO_DRIVER_WINDOWS | 41 | #ifdef SDL_VIDEO_DRIVER_WINDOWS |
| 40 | case SDL_SYSWM_TYPE::SDL_SYSWM_WINDOWS: | 42 | case SDL_SYSWM_TYPE::SDL_SYSWM_WINDOWS: |