Event Ballons and Tray Icon improvements (#1561)
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
2
.gitmodules
vendored
@ -48,7 +48,7 @@
|
||||
branch = master
|
||||
[submodule "third-party/tray"]
|
||||
path = third-party/tray
|
||||
url = https://github.com/dmikushin/tray
|
||||
url = https://github.com/LizardByte/tray
|
||||
branch = master
|
||||
[submodule "third-party/nvapi-open-source-sdk"]
|
||||
path = third-party/nvapi-open-source-sdk
|
||||
|
@ -157,14 +157,18 @@ endif()
|
||||
if(${SUNSHINE_ENABLE_TRAY})
|
||||
pkg_check_modules(APPINDICATOR appindicator3-0.1)
|
||||
if(NOT APPINDICATOR_FOUND)
|
||||
pkg_check_modules(APPINDICATOR ayatana-appindicator3-0.1)
|
||||
endif()
|
||||
pkg_check_modules(LIBNOTIFY libnotify)
|
||||
if(NOT APPINDICATOR_FOUND OR NOT LIBNOTIFY_FOUND)
|
||||
message(WARNING "Missing appindicator, disabling tray icon")
|
||||
set(SUNSHINE_TRAY 0)
|
||||
else()
|
||||
include_directories(SYSTEM ${APPINDICATOR_INCLUDE_DIRS})
|
||||
link_directories(${APPINDICATOR_LIBRARY_DIRS})
|
||||
include_directories(SYSTEM ${APPINDICATOR_INCLUDE_DIRS} ${LIBNOTIFY_INCLUDE_DIRS})
|
||||
link_directories(${APPINDICATOR_LIBRARY_DIRS} ${LIBNOTIFY_LIBRARY_DIRS})
|
||||
|
||||
list(APPEND PLATFORM_TARGET_FILES third-party/tray/tray_linux.c)
|
||||
list(APPEND SUNSHINE_EXTERNAL_LIBRARIES ${APPINDICATOR_LIBRARIES})
|
||||
list(APPEND SUNSHINE_EXTERNAL_LIBRARIES ${APPINDICATOR_LIBRARIES} ${LIBNOTIFY_LIBRARIES})
|
||||
endif()
|
||||
else()
|
||||
set(SUNSHINE_TRAY 0)
|
||||
|
@ -69,7 +69,14 @@ set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)
|
||||
|
||||
# tray icon
|
||||
if(${SUNSHINE_TRAY} STREQUAL 1)
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons")
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons")
|
||||
install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/images/sunshine-playing.svg"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons")
|
||||
install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/images/sunshine-pausing.svg"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons")
|
||||
install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/images/sunshine-locked.svg"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons")
|
||||
|
||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS "\
|
||||
${CPACK_DEBIAN_PACKAGE_DEPENDS}, \
|
||||
|
14
src/main.cpp
@ -390,6 +390,20 @@ launch_ui() {
|
||||
platf::open_url(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Launch the Web UI at a specific endpoint.
|
||||
*
|
||||
* EXAMPLES:
|
||||
* ```cpp
|
||||
* launch_ui_with_path("/pin");
|
||||
* ```
|
||||
*/
|
||||
void
|
||||
launch_ui_with_path(std::string path) {
|
||||
std::string url = "https://localhost:" + std::to_string(map_port(confighttp::PORT_HTTPS)) + path;
|
||||
platf::open_url(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Flush the log.
|
||||
*
|
||||
|
@ -48,6 +48,8 @@ std::uint16_t
|
||||
map_port(int port);
|
||||
void
|
||||
launch_ui();
|
||||
void
|
||||
launch_ui_with_path(std::string path);
|
||||
|
||||
// namespaces
|
||||
namespace mail {
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "platform/common.h"
|
||||
#include "process.h"
|
||||
#include "rtsp.h"
|
||||
#include "system_tray.h"
|
||||
#include "utility.h"
|
||||
#include "uuid.h"
|
||||
#include "video.h"
|
||||
@ -507,7 +508,6 @@ namespace nvhttp {
|
||||
auto ptr = map_id_sess.emplace(sess.client.uniqueID, std::move(sess)).first;
|
||||
|
||||
ptr->second.async_insert_pin.salt = std::move(get_arg(args, "salt"));
|
||||
|
||||
if (config::sunshine.flags[config::flag::PIN_STDIN]) {
|
||||
std::string pin;
|
||||
|
||||
@ -517,6 +517,9 @@ namespace nvhttp {
|
||||
getservercert(ptr->second, tree, pin);
|
||||
}
|
||||
else {
|
||||
#if defined SUNSHINE_TRAY && SUNSHINE_TRAY >= 1
|
||||
system_tray::update_tray_require_pin();
|
||||
#endif
|
||||
ptr->second.async_insert_pin.response = std::move(response);
|
||||
|
||||
fg.disable();
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "crypto.h"
|
||||
#include "main.h"
|
||||
#include "platform/common.h"
|
||||
#include "system_tray.h"
|
||||
#include "utility.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
@ -116,7 +117,6 @@ namespace proc {
|
||||
|
||||
_app_id = app_id;
|
||||
_app = *iter;
|
||||
|
||||
_app_prep_begin = std::begin(_app.prep_cmds);
|
||||
_app_prep_it = _app_prep_begin;
|
||||
|
||||
@ -244,9 +244,8 @@ namespace proc {
|
||||
|
||||
void
|
||||
proc_t::terminate() {
|
||||
bool has_run = _app_id > 0;
|
||||
std::error_code ec;
|
||||
|
||||
// Ensure child process is terminated
|
||||
placebo = false;
|
||||
process_end(_process, _process_handle);
|
||||
_process = bp::child();
|
||||
@ -279,6 +278,13 @@ namespace proc {
|
||||
}
|
||||
|
||||
_pipe.reset();
|
||||
#if defined SUNSHINE_TRAY && SUNSHINE_TRAY >= 1
|
||||
// Only show the Stopped notification if we actually have an app to stop
|
||||
// Since terminate() is always run when a new app has started
|
||||
if (proc::proc.get_last_run_app_name().length() > 0 && has_run) {
|
||||
system_tray::update_tray_stopped(proc::proc.get_last_run_app_name());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
const std::vector<ctx_t> &
|
||||
@ -304,6 +310,11 @@ namespace proc {
|
||||
return validate_app_image_path(app_image_path);
|
||||
}
|
||||
|
||||
std::string
|
||||
proc_t::get_last_run_app_name() {
|
||||
return _app.name;
|
||||
}
|
||||
|
||||
proc_t::~proc_t() {
|
||||
// It's not safe to call terminate() here because our proc_t is a static variable
|
||||
// that may be destroyed after the Boost loggers have been destroyed. Instead,
|
||||
|
@ -82,7 +82,8 @@ namespace proc {
|
||||
get_apps();
|
||||
std::string
|
||||
get_app_image(int app_id);
|
||||
|
||||
std::string
|
||||
get_last_run_app_name();
|
||||
void
|
||||
terminate();
|
||||
|
||||
|
@ -25,6 +25,7 @@ extern "C" {
|
||||
#include "stat_trackers.h"
|
||||
#include "stream.h"
|
||||
#include "sync.h"
|
||||
#include "system_tray.h"
|
||||
#include "thread_safe.h"
|
||||
#include "utility.h"
|
||||
|
||||
@ -1732,6 +1733,11 @@ namespace stream {
|
||||
|
||||
// If this is the last session, invoke the platform callbacks
|
||||
if (--running_sessions == 0) {
|
||||
#if defined SUNSHINE_TRAY && SUNSHINE_TRAY >= 1
|
||||
if (proc::proc.running()) {
|
||||
system_tray::update_tray_pausing(proc::proc.get_last_run_app_name());
|
||||
}
|
||||
#endif
|
||||
platf::streaming_will_stop();
|
||||
}
|
||||
|
||||
@ -1776,6 +1782,9 @@ namespace stream {
|
||||
// If this is the first session, invoke the platform callbacks
|
||||
if (++running_sessions == 1) {
|
||||
platf::streaming_will_start();
|
||||
#if defined SUNSHINE_TRAY && SUNSHINE_TRAY >= 1
|
||||
system_tray::update_tray_playing(proc::proc.get_last_run_app_name());
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -10,10 +10,19 @@
|
||||
#include <accctrl.h>
|
||||
#include <aclapi.h>
|
||||
#define TRAY_ICON WEB_DIR "images/favicon.ico"
|
||||
#define TRAY_ICON_PLAYING WEB_DIR "images/sunshine-playing.ico"
|
||||
#define TRAY_ICON_PAUSING WEB_DIR "images/sunshine-pausing.ico"
|
||||
#define TRAY_ICON_LOCKED WEB_DIR "images/sunshine-locked.ico"
|
||||
#elif defined(__linux__) || defined(linux) || defined(__linux)
|
||||
#define TRAY_ICON "sunshine"
|
||||
#define TRAY_ICON_PLAYING "sunshine-playing"
|
||||
#define TRAY_ICON_PAUSING "sunshine-pausing"
|
||||
#define TRAY_ICON_LOCKED "sunshine-locked"
|
||||
#elif defined(__APPLE__) || defined(__MACH__)
|
||||
#define TRAY_ICON WEB_DIR "images/logo-sunshine-16.png"
|
||||
#define TRAY_ICON_PLAYING WEB_DIR "images/sunshine-playing-16.png"
|
||||
#define TRAY_ICON_PAUSING WEB_DIR "images/sunshine-pausing-16.png"
|
||||
#define TRAY_ICON_LOCKED WEB_DIR "images/sunshine-locked-16.png"
|
||||
#include <dispatch/dispatch.h>
|
||||
#endif
|
||||
|
||||
@ -268,5 +277,93 @@ namespace system_tray {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the tray icon in playing mode and spawns the appropriate notification
|
||||
* @param app_name The started application name
|
||||
*/
|
||||
void
|
||||
update_tray_playing(std::string app_name) {
|
||||
tray.notification_title = NULL;
|
||||
tray.notification_text = NULL;
|
||||
tray.notification_cb = NULL;
|
||||
tray.notification_icon = NULL;
|
||||
tray.icon = TRAY_ICON_PLAYING;
|
||||
tray_update(&tray);
|
||||
tray.icon = TRAY_ICON_PLAYING;
|
||||
tray.notification_title = "Stream Started";
|
||||
char msg[256];
|
||||
sprintf(msg, "Streaming started for %s", app_name.c_str());
|
||||
tray.notification_text = msg;
|
||||
tray.tooltip = msg;
|
||||
tray.notification_icon = TRAY_ICON_PLAYING;
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the tray icon in pausing mode (stream stopped but app running) and spawns the appropriate notification
|
||||
* @param app_name The paused application name
|
||||
*/
|
||||
void
|
||||
update_tray_pausing(std::string app_name) {
|
||||
tray.notification_title = NULL;
|
||||
tray.notification_text = NULL;
|
||||
tray.notification_cb = NULL;
|
||||
tray.notification_icon = NULL;
|
||||
tray.icon = TRAY_ICON_PAUSING;
|
||||
tray_update(&tray);
|
||||
char msg[256];
|
||||
sprintf(msg, "Streaming paused for %s", app_name.c_str());
|
||||
tray.icon = TRAY_ICON_PAUSING;
|
||||
tray.notification_title = "Stream Paused";
|
||||
tray.notification_text = msg;
|
||||
tray.tooltip = msg;
|
||||
tray.notification_icon = TRAY_ICON_PAUSING;
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the tray icon in stopped mode (app and stream stopped) and spawns the appropriate notification
|
||||
* @param app_name The started application name
|
||||
*/
|
||||
void
|
||||
update_tray_stopped(std::string app_name) {
|
||||
tray.notification_title = NULL;
|
||||
tray.notification_text = NULL;
|
||||
tray.notification_cb = NULL;
|
||||
tray.notification_icon = NULL;
|
||||
tray.icon = TRAY_ICON;
|
||||
tray_update(&tray);
|
||||
char msg[256];
|
||||
sprintf(msg, "Application %s successfully stopped", app_name.c_str());
|
||||
tray.icon = TRAY_ICON;
|
||||
tray.notification_icon = TRAY_ICON;
|
||||
tray.notification_title = "Application Stopped";
|
||||
tray.notification_text = msg;
|
||||
tray.tooltip = "Sunshine";
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Spawns a notification for PIN Pairing. Clicking it opens the PIN Web UI Page
|
||||
*/
|
||||
void
|
||||
update_tray_require_pin() {
|
||||
tray.notification_title = NULL;
|
||||
tray.notification_text = NULL;
|
||||
tray.notification_cb = NULL;
|
||||
tray.notification_icon = NULL;
|
||||
tray.icon = TRAY_ICON;
|
||||
tray_update(&tray);
|
||||
tray.icon = TRAY_ICON;
|
||||
tray.notification_title = "Incoming Pairing Request";
|
||||
tray.notification_text = "Click here to complete the pairing process";
|
||||
tray.notification_icon = TRAY_ICON_LOCKED;
|
||||
tray.tooltip = "Sunshine";
|
||||
tray.notification_cb = []() {
|
||||
launch_ui_with_path("/pin");
|
||||
};
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
} // namespace system_tray
|
||||
#endif
|
||||
|
@ -27,5 +27,13 @@ namespace system_tray {
|
||||
run_tray();
|
||||
int
|
||||
end_tray();
|
||||
void
|
||||
update_tray_playing(std::string app_name);
|
||||
void
|
||||
update_tray_pausing(std::string app_name);
|
||||
void
|
||||
update_tray_stopped(std::string app_name);
|
||||
void
|
||||
update_tray_require_pin();
|
||||
|
||||
} // namespace system_tray
|
||||
|
BIN
src_assets/common/assets/web/images/sunshine-locked-16.png
Normal file
After Width: | Height: | Size: 737 B |
BIN
src_assets/common/assets/web/images/sunshine-locked-45.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
src_assets/common/assets/web/images/sunshine-locked.ico
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
src_assets/common/assets/web/images/sunshine-locked.png
Normal file
After Width: | Height: | Size: 16 KiB |
75
src_assets/common/assets/web/images/sunshine-locked.svg
Normal file
@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Sunshine_Logo"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="256px"
|
||||
height="256px"
|
||||
viewBox="0 0 256 256"
|
||||
style="enable-background:new 0 0 256 256;"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="sunshine-locked.svg"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs15" /><sodipodi:namedview
|
||||
id="namedview13"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
showguides="true"
|
||||
inkscape:zoom="0.81054689"
|
||||
inkscape:cx="25.291566"
|
||||
inkscape:cy="47.498794"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="991"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Sunshine_Logo"><sodipodi:guide
|
||||
position="82.968675,154.83373"
|
||||
orientation="1,0"
|
||||
id="guide453"
|
||||
inkscape:locked="false" /><sodipodi:guide
|
||||
position="82.968675,154.83373"
|
||||
orientation="0,-1"
|
||||
id="guide506"
|
||||
inkscape:locked="false" /></sodipodi:namedview>
|
||||
<style
|
||||
type="text/css"
|
||||
id="style2">
|
||||
.st0{fill:#FDD107;}
|
||||
.st1{fill:#F89A1C;}
|
||||
.st2{fill:#EF3E23;}
|
||||
.st3{fill:#F26222;}
|
||||
</style>
|
||||
<path
|
||||
class="st0"
|
||||
d="M118.7688675,20.7120476c0,0-63.8333359,26-74.3333359,83.8333282s37.1666718,91.5,86.3333282,75.3333282 s70.3333435-51,81.8333435-86.9999924c0,0-9.3333435,100.4999924-96.1666718,115.4999924s-118.1666641-50-82.1666641-119.8333282 C44.2688675,67.0453796,80.5188675,29.6287155,118.7688675,20.7120476z"
|
||||
id="path4" />
|
||||
<path
|
||||
class="st1"
|
||||
d="M118.7688675,20.7120476c0,0-41.125,3.6666679-83.25,61.0416679s-28.125,139.125,34.25,149.375 s115.8749924-44.875,133.5-82.375s15.1666718-61.4583282,9.75-77.8749924c0,0,0.6666718,36.4166641-13.3333282,59.6666641 s-29.75,46.3333282-65.0833282,62.1666718s-74.1666718,13.75-95.4166718-19.25s-5.9166641-76.0833359-0.2916641-85.3333359 S72.3938675,33.7953796,118.7688675,20.7120476z"
|
||||
id="path6" />
|
||||
<path
|
||||
class="st2"
|
||||
d="M73.0188675,39.6287155c0,0,38.125-28.125,76.8749924-28.125s63,28.25,68.5,52.25s6,54.125-11.5,87.6249924 s-37.375,56-79.1249924,76.125s-84.625,2.75-84.625,2.75s25.9769745,25.8750153,71.0509872,16.5 c45.0740051-9.375,82.2406769-40.875,98.4073486-69.5s28.7916565-57.3749924,27.6666565-92.2499924s-23.75-54.5-31.25-60.25 s-23.1875-17.8125-58.1875-16.5625S86.4563675,29.8162155,73.0188675,39.6287155z"
|
||||
id="path8" />
|
||||
<path
|
||||
class="st3"
|
||||
d="M73.0188675,39.6287155c0,0,35-32.8125,82.4374924-32.8125s69.1875,24.8125,78.875,44.6875 s21.8125,70-12.1875,122.9999924s-74.625,67.375-93.625,71.625s-42.4311447,4.269165-59.1114044-1.2299957 c0,0,35.1947479,8.3966675,66.7780762-7.4366608s51.6666718-32.1666718,74.0833282-68.8333435 s25.9166718-72.7499924,22.1666718-93.9166565s-12.1666718-42.4166718-36.5-56.3333359s-56.7291718-10.531251-74.4791641-4.531251 S91.9876175,26.4099655,73.0188675,39.6287155z"
|
||||
id="path10" />
|
||||
<path
|
||||
d="m 158.02296,141.96684 v 13.57376 h 45.24591 v -13.57376 c 0,-12.49918 -10.12378,-22.62296 -22.62296,-22.62296 -12.49918,0 -22.62295,10.12378 -22.62295,22.62296 z m -18.09837,13.57376 v -13.57376 c 0,-22.48156 18.23976,-40.72132 40.72132,-40.72132 22.48156,0 40.72131,18.23976 40.72131,40.72132 v 13.57376 h 4.5246 c 9.98237,0 18.09836,8.11599 18.09836,18.09837 v 54.29509 c 0,9.98238 -8.11599,18.09836 -18.09836,18.09836 H 135.4 c -9.98238,0 -18.09837,-8.11598 -18.09837,-18.09836 v -54.29509 c 0,-9.98238 8.11599,-18.09837 18.09837,-18.09837 z"
|
||||
id="path240"
|
||||
style="stroke-width:8.5;stroke:#777777;stroke-opacity:1;stroke-dasharray:none;fill:#999999;fill-opacity:1" /></svg>
|
After Width: | Height: | Size: 4.0 KiB |
BIN
src_assets/common/assets/web/images/sunshine-pausing-16.png
Normal file
After Width: | Height: | Size: 756 B |
BIN
src_assets/common/assets/web/images/sunshine-pausing-45.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
src_assets/common/assets/web/images/sunshine-pausing.ico
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
src_assets/common/assets/web/images/sunshine-pausing.png
Normal file
After Width: | Height: | Size: 13 KiB |
84
src_assets/common/assets/web/images/sunshine-pausing.svg
Normal file
@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Sunshine_Logo"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="256px"
|
||||
height="256px"
|
||||
viewBox="0 0 256 256"
|
||||
style="enable-background:new 0 0 256 256;"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="sunshine-pausesvg.svg"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs15" /><sodipodi:namedview
|
||||
id="namedview13"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
showguides="true"
|
||||
inkscape:zoom="2"
|
||||
inkscape:cx="76.25"
|
||||
inkscape:cy="133.75"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="991"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Sunshine_Logo"><sodipodi:guide
|
||||
position="82.968675,154.83373"
|
||||
orientation="1,0"
|
||||
id="guide453"
|
||||
inkscape:locked="false" /><sodipodi:guide
|
||||
position="82.968675,154.83373"
|
||||
orientation="0,-1"
|
||||
id="guide506"
|
||||
inkscape:locked="false" /></sodipodi:namedview>
|
||||
<style
|
||||
type="text/css"
|
||||
id="style2">
|
||||
.st0{fill:#FDD107;}
|
||||
.st1{fill:#F89A1C;}
|
||||
.st2{fill:#EF3E23;}
|
||||
.st3{fill:#F26222;}
|
||||
</style>
|
||||
<path
|
||||
class="st0"
|
||||
d="M118.7688675,20.7120476c0,0-63.8333359,26-74.3333359,83.8333282s37.1666718,91.5,86.3333282,75.3333282 s70.3333435-51,81.8333435-86.9999924c0,0-9.3333435,100.4999924-96.1666718,115.4999924s-118.1666641-50-82.1666641-119.8333282 C44.2688675,67.0453796,80.5188675,29.6287155,118.7688675,20.7120476z"
|
||||
id="path4" />
|
||||
<path
|
||||
class="st1"
|
||||
d="M118.7688675,20.7120476c0,0-41.125,3.6666679-83.25,61.0416679s-28.125,139.125,34.25,149.375 s115.8749924-44.875,133.5-82.375s15.1666718-61.4583282,9.75-77.8749924c0,0,0.6666718,36.4166641-13.3333282,59.6666641 s-29.75,46.3333282-65.0833282,62.1666718s-74.1666718,13.75-95.4166718-19.25s-5.9166641-76.0833359-0.2916641-85.3333359 S72.3938675,33.7953796,118.7688675,20.7120476z"
|
||||
id="path6" />
|
||||
<path
|
||||
class="st2"
|
||||
d="M73.0188675,39.6287155c0,0,38.125-28.125,76.8749924-28.125s63,28.25,68.5,52.25s6,54.125-11.5,87.6249924 s-37.375,56-79.1249924,76.125s-84.625,2.75-84.625,2.75s25.9769745,25.8750153,71.0509872,16.5 c45.0740051-9.375,82.2406769-40.875,98.4073486-69.5s28.7916565-57.3749924,27.6666565-92.2499924s-23.75-54.5-31.25-60.25 s-23.1875-17.8125-58.1875-16.5625S86.4563675,29.8162155,73.0188675,39.6287155z"
|
||||
id="path8" />
|
||||
<path
|
||||
class="st3"
|
||||
d="M73.0188675,39.6287155c0,0,35-32.8125,82.4374924-32.8125s69.1875,24.8125,78.875,44.6875 s21.8125,70-12.1875,122.9999924s-74.625,67.375-93.625,71.625s-42.4311447,4.269165-59.1114044-1.2299957 c0,0,35.1947479,8.3966675,66.7780762-7.4366608s51.6666718-32.1666718,74.0833282-68.8333435 s25.9166718-72.7499924,22.1666718-93.9166565s-12.1666718-42.4166718-36.5-56.3333359s-56.7291718-10.531251-74.4791641-4.531251 S91.9876175,26.4099655,73.0188675,39.6287155z"
|
||||
id="path10" />
|
||||
<rect
|
||||
style="fill:#00d9ff;stroke:#20bbd6;stroke-width:7.602;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:normal;fill-opacity:1"
|
||||
id="rect3049"
|
||||
width="44.143799"
|
||||
height="130.65352"
|
||||
x="130.76886"
|
||||
y="118.14676" /><rect
|
||||
style="fill:#00d9ff;stroke:#20bbd6;stroke-width:7.602;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:normal;fill-opacity:1"
|
||||
id="rect3049-8"
|
||||
width="44.143799"
|
||||
height="130.65352"
|
||||
x="200.3856"
|
||||
y="118.55195" /></svg>
|
After Width: | Height: | Size: 3.8 KiB |
BIN
src_assets/common/assets/web/images/sunshine-playing-16.png
Normal file
After Width: | Height: | Size: 779 B |
BIN
src_assets/common/assets/web/images/sunshine-playing-45.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
src_assets/common/assets/web/images/sunshine-playing.ico
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
src_assets/common/assets/web/images/sunshine-playing.png
Normal file
After Width: | Height: | Size: 16 KiB |
89
src_assets/common/assets/web/images/sunshine-playing.svg
Normal file
@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Sunshine_Logo"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="256px"
|
||||
height="256px"
|
||||
viewBox="0 0 256 256"
|
||||
style="enable-background:new 0 0 256 256;"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="sunshine-playing.svg"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs15" /><sodipodi:namedview
|
||||
id="namedview13"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
showguides="true"
|
||||
inkscape:zoom="2.2925728"
|
||||
inkscape:cx="145.46976"
|
||||
inkscape:cy="128.89449"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="991"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Sunshine_Logo"><sodipodi:guide
|
||||
position="82.968675,154.83373"
|
||||
orientation="1,0"
|
||||
id="guide453"
|
||||
inkscape:locked="false" /><sodipodi:guide
|
||||
position="82.968675,154.83373"
|
||||
orientation="0,-1"
|
||||
id="guide506"
|
||||
inkscape:locked="false" /></sodipodi:namedview>
|
||||
<style
|
||||
type="text/css"
|
||||
id="style2">
|
||||
.st0{fill:#FDD107;}
|
||||
.st1{fill:#F89A1C;}
|
||||
.st2{fill:#EF3E23;}
|
||||
.st3{fill:#F26222;}
|
||||
</style>
|
||||
<path
|
||||
class="st0"
|
||||
d="M118.7688675,20.7120476c0,0-63.8333359,26-74.3333359,83.8333282s37.1666718,91.5,86.3333282,75.3333282 s70.3333435-51,81.8333435-86.9999924c0,0-9.3333435,100.4999924-96.1666718,115.4999924s-118.1666641-50-82.1666641-119.8333282 C44.2688675,67.0453796,80.5188675,29.6287155,118.7688675,20.7120476z"
|
||||
id="path4" />
|
||||
<path
|
||||
class="st1"
|
||||
d="M118.7688675,20.7120476c0,0-41.125,3.6666679-83.25,61.0416679s-28.125,139.125,34.25,149.375 s115.8749924-44.875,133.5-82.375s15.1666718-61.4583282,9.75-77.8749924c0,0,0.6666718,36.4166641-13.3333282,59.6666641 s-29.75,46.3333282-65.0833282,62.1666718s-74.1666718,13.75-95.4166718-19.25s-5.9166641-76.0833359-0.2916641-85.3333359 S72.3938675,33.7953796,118.7688675,20.7120476z"
|
||||
id="path6" />
|
||||
<path
|
||||
class="st2"
|
||||
d="M73.0188675,39.6287155c0,0,38.125-28.125,76.8749924-28.125s63,28.25,68.5,52.25s6,54.125-11.5,87.6249924 s-37.375,56-79.1249924,76.125s-84.625,2.75-84.625,2.75s25.9769745,25.8750153,71.0509872,16.5 c45.0740051-9.375,82.2406769-40.875,98.4073486-69.5s28.7916565-57.3749924,27.6666565-92.2499924s-23.75-54.5-31.25-60.25 s-23.1875-17.8125-58.1875-16.5625S86.4563675,29.8162155,73.0188675,39.6287155z"
|
||||
id="path8" />
|
||||
<path
|
||||
class="st3"
|
||||
d="M73.0188675,39.6287155c0,0,35-32.8125,82.4374924-32.8125s69.1875,24.8125,78.875,44.6875 s21.8125,70-12.1875,122.9999924s-74.625,67.375-93.625,71.625s-42.4311447,4.269165-59.1114044-1.2299957 c0,0,35.1947479,8.3966675,66.7780762-7.4366608s51.6666718-32.1666718,74.0833282-68.8333435 s25.9166718-72.7499924,22.1666718-93.9166565s-12.1666718-42.4166718-36.5-56.3333359s-56.7291718-10.531251-74.4791641-4.531251 S91.9876175,26.4099655,73.0188675,39.6287155z"
|
||||
id="path10" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#00ff00;stroke:#20d620;stroke-width:7.602;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
id="path508"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="82.968674"
|
||||
sodipodi:cy="101.16627"
|
||||
sodipodi:r1="67.238556"
|
||||
sodipodi:r2="33.619278"
|
||||
sodipodi:arg1="9.2993911e-15"
|
||||
sodipodi:arg2="1.0471976"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="m 150.20723,101.16627 -50.428919,29.11515 -50.428915,29.11514 0,-58.23029 0,-58.2303 50.428918,29.115149 z"
|
||||
inkscape:transform-center-x="-18.975181"
|
||||
transform="matrix(1.1288273,0,0,1.1288273,75.061915,69.679461)"
|
||||
inkscape:transform-center-y="3.0795783e-06" /></svg>
|
After Width: | Height: | Size: 4.0 KiB |
2
third-party/tray
vendored
@ -1 +1 @@
|
||||
Subproject commit 75106962a8ec5abb86157908d12cb799147babb4
|
||||
Subproject commit 2921d9628e150c29f6e9f2ad86fd48b842aad5ca
|