diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 31c4fb0..7215853 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,12 +32,16 @@ deploy:package:
script:
- mkdir out # package
- cd build
+ - mkdir -p applications
+ - cp ../resource/config/*.desktop applications
+ - mkdir -p icons/hicolor/256x256/apps
+ - cp ../univerxel.png icons/hicolor/256x256/apps
- cp ../resource/config/full.toml config.toml
- - tar cfz ../out/full-nux64.tar.gz univerxel config.toml content
+ - tar cfz ../out/full-nux64.tar.gz univerxel applications/fr.wadza.univerxel.desktop config.toml icons content
- cp ../resource/config/client.toml config.toml
- - tar cfz ../out/client-nux64.tar.gz univerxel-client config.toml content/shaders content/textures
+ - tar cfz ../out/client-nux64.tar.gz univerxel-client applications/fr.wadza.univerxel.client.desktop config.toml icons content/shaders content/textures
- cp ../resource/config/server.toml config.toml
- - tar cfz ../out/server-nux64.tar.gz univerxel-server config.toml content/cert.pem content/key.pem content/zstd.dict
+ - tar cfz ../out/server-nux64.tar.gz univerxel-server applications/fr.wadza.univerxel.server.desktop config.toml icons content/cert.pem content/key.pem content/zstd.dict
- cd ../out # deploy
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file full-nux64.tar.gz ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/Univerxel/$CI_COMMIT_TAG/Univerxel-$CI_COMMIT_TAG-nux64.tar.gz'
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file client-nux64.tar.gz ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/Univerxel-client/$CI_COMMIT_TAG/Univerxel-client-$CI_COMMIT_TAG-nux64.tar.gz'
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ac3a080..7487922 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -76,20 +76,26 @@ else()
set(CORE_LIBS ${CORE_LIBS} picoquic-core pthread dl)
endif()
+if (WIN32)
+ set(ICON univerxel.rc)
+elseif (APPLE)
+ set(ICON univerxel.icns)
+endif()
+
# All in one exec
-add_executable(univerxel "src/main.cpp" ${CORE_SOURCES} ${CLIENT_SOURCES} ${SERVER_SOURCES})
+add_executable(univerxel "src/main.cpp" ${ICON} ${CORE_SOURCES} ${CLIENT_SOURCES} ${SERVER_SOURCES})
target_compile_features(univerxel PUBLIC cxx_std_17)
target_link_libraries(univerxel ${CORE_LIBS} ${CLIENT_LIBS} ${SERVER_LIBS})
target_include_directories(univerxel PRIVATE ${CORE_HEADERS} ${CLIENT_HEADERS} ${SERVER_HEADERS})
# Standalone server
-add_executable(univerxel-server EXCLUDE_FROM_ALL "src/server.cpp" ${CORE_SOURCES} ${SERVER_SOURCES})
+add_executable(univerxel-server EXCLUDE_FROM_ALL "src/server.cpp" ${ICON} ${CORE_SOURCES} ${SERVER_SOURCES})
target_compile_features(univerxel-server PUBLIC cxx_std_17)
target_link_libraries(univerxel-server ${CORE_LIBS} ${SERVER_LIBS})
target_include_directories(univerxel-server PRIVATE ${CORE_HEADERS} ${SERVER_HEADERS})
# Dumb client
-add_executable(univerxel-client EXCLUDE_FROM_ALL "src/client.cpp" ${CORE_SOURCES} ${CLIENT_SOURCES})
+add_executable(univerxel-client EXCLUDE_FROM_ALL "src/client.cpp" ${ICON} ${CORE_SOURCES} ${CLIENT_SOURCES})
target_compile_features(univerxel-client PUBLIC cxx_std_17)
target_link_libraries(univerxel-client ${CORE_LIBS} ${CLIENT_LIBS})
target_include_directories(univerxel-client PRIVATE ${CORE_HEADERS} ${CLIENT_HEADERS})
@@ -110,3 +116,15 @@ add_custom_target(docs
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Build doc."
)
+
+if (APPLE)
+ set_target_properties(univerxel PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Univerxel")
+ set_target_properties(univerxel-client PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Univerxel Client")
+ set_target_properties(univerxel-server PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Univerxel Server")
+ set_source_files_properties(univerxel.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
+ set_target_properties(univerxel univerxel-client PROPERTIES
+ MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
+ MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION}
+ MACOSX_BUNDLE_ICON_FILE univerxel.icns
+ MACOSX_BUNDLE_INFO_PLIST "resource/config/Info.plist.in")
+endif()
\ No newline at end of file
diff --git a/resource/config/Info.plist.in b/resource/config/Info.plist.in
new file mode 100644
index 0000000..684ad79
--- /dev/null
+++ b/resource/config/Info.plist.in
@@ -0,0 +1,38 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ ${MACOSX_BUNDLE_EXECUTABLE_NAME}
+ CFBundleGetInfoString
+ ${MACOSX_BUNDLE_INFO_STRING}
+ CFBundleIconFile
+ ${MACOSX_BUNDLE_ICON_FILE}
+ CFBundleIdentifier
+ ${MACOSX_BUNDLE_GUI_IDENTIFIER}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleLongVersionString
+ ${MACOSX_BUNDLE_LONG_VERSION_STRING}
+ CFBundleName
+ ${MACOSX_BUNDLE_BUNDLE_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ ${MACOSX_BUNDLE_SHORT_VERSION_STRING}
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ ${MACOSX_BUNDLE_BUNDLE_VERSION}
+ CSResourcesFileMapped
+
+ LSRequiresCarbon
+
+ NSHumanReadableCopyright
+ ${MACOSX_BUNDLE_COPYRIGHT}
+ NSHighResolutionCapable
+
+
+
diff --git a/resource/config/fr.wadza.univerxel.client.desktop b/resource/config/fr.wadza.univerxel.client.desktop
new file mode 100644
index 0000000..5b98599
--- /dev/null
+++ b/resource/config/fr.wadza.univerxel.client.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=Univerxel Client
+TryExec=univerxel-client
+Exec=univerxel-client %u
+Terminal=true
+Type=Application
+Icon=univerxel
+Categories=Game;Network;
+Keywords=game;online;
+StartupNotify=true
+Actions=Composer;
diff --git a/resource/config/fr.wadza.univerxel.desktop b/resource/config/fr.wadza.univerxel.desktop
new file mode 100644
index 0000000..e590747
--- /dev/null
+++ b/resource/config/fr.wadza.univerxel.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=Univerxel
+TryExec=univerxel
+Exec=univerxel %u
+Terminal=true
+Type=Application
+Icon=univerxel
+Categories=Game;Network;
+Keywords=game;online;
+StartupNotify=true
+Actions=Composer;
diff --git a/resource/config/fr.wadza.univerxel.server.desktop b/resource/config/fr.wadza.univerxel.server.desktop
new file mode 100644
index 0000000..f8fd1c6
--- /dev/null
+++ b/resource/config/fr.wadza.univerxel.server.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=Univerxel Server
+TryExec=univerxel-server
+Exec=univerxel-server %u
+Terminal=true
+Type=Application
+Icon=univerxel
+Categories=Game;Network;
+Keywords=game;online;
+StartupNotify=true
+Actions=Composer;
diff --git a/src/client/Window.cpp b/src/client/Window.cpp
index 04071f1..a10e389 100644
--- a/src/client/Window.cpp
+++ b/src/client/Window.cpp
@@ -6,6 +6,7 @@
#include
#include
#include "../core/utils/logger.hpp"
+#include "logo.cxx"
/// Default floating window width
constexpr auto DEFAULT_WIDTH = 1280;
@@ -84,6 +85,7 @@ bool Window::create(const CreateInfo &opt) {
glfwSetFramebufferSizeCallback(ptr, opt.pfnResize);
glfwSetWindowTitle(ptr, APP_NAME);
+ glfwSetWindowIcon(ptr, 1, &LOGO);
glfwSetWindowAttrib(ptr, GLFW_RESIZABLE, true);
setTargetFPS(opt.fps);
diff --git a/src/client/logo.cxx b/src/client/logo.cxx
new file mode 100644
index 0000000..2f778b9
--- /dev/null
+++ b/src/client/logo.cxx
@@ -0,0 +1,297 @@
+static const unsigned char LOGO_DATA[48 * 48 * 4 + 1] =
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\025\020\037(\034\026'\362\010\005\031\375\011\006\033\375\007\004"
+ "\025\362%\037\060)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\016#I\027"
+ "\022(\377\013\010\035\377\033\026,\377\012\007\033\377\011\006\032J\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000:)b\000\026\017>\034\030\021;\217gJu%\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\020\014$g\017\013%\377\024\017.\377\021\015$\377\017\013"
+ "!\377\017\013!i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\014%%\025"
+ "\020%\217\061)B\034\010\005\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\010\000M\071\206\007\060$iz\034\025"
+ "J\363\033\024@\377\032\022?\313\023\015\071\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\034\024\066\205\023\015.\377\036\026\066\377\016\012#\377\013\007\037\377\025\017"
+ "%\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\017&\010\022\015'\312\012\007\035"
+ "\377\012\007\035\363\012\007\036{\010\006\033\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\000\065*|\231/$g\377\036\027"
+ "J\377.&N\377wn\231\377)!T\223\040\026G\000\000\000\000\000\000\000\000\000\012\010#\000\012\010\"\013"
+ "\014\011(\254\034\024\066\377\022\015-\377\061'C\377\062(?\377\011\007\040\255\023\013\066"
+ "\013\017\013\064\000\000\000\000\000\000\000\000\000<$Z\000\030\021-\222\015\011%\377\015\012!\377\016\013"
+ "$\377\023\016$\377\010\006\035\231\011\004\035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\060%uL\"\032\\\377\035\027I\377"
+ "!\032J\377\034\026I\377\031\023>\375\020\013\062U\015\011,\063\014\011*\205\024\017\061\312"
+ "\027\021-\365\027\021/\377\015\011(\377\033\025\062\377\030\021.\377\016\011#\377\022\016"
+ "(\377\024\016\062\365\025\020\071\312\021\015.\206\015\012*\063\070/NT\030\021;\375+$B"
+ "\377\025\020/\377\022\015\061\377\013\010%\377\012\007!M\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\037\030\\\004"
+ "&\035T\332$\034O\377$\034O\377\027\023D\377\037\030E\377\017\012/\373\023\016\065\376"
+ "\030\022\065\377K\377\060%c\377\035\026I\332\014\011'\004"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\003\000\030\023Jp\027\022E\377+\036N\377\"\031L\377!\031G\377\031"
+ "\022:\377\022\015\065\377\023\016\060\377#\034=\377\020\014\061\377\021\014/\377\020\013"
+ ",\377\022\014\060\377\020\014&\377\023\016'\377\013\010#\377\013\010$\377%\032;\377\015"
+ "\012*\377\031\023\065\377\024\016\070\377\022\016\067\377!\031@\377\037\027I\377\276\264"
+ "\334\377|j\260p\001\001\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\033U\025\033\024G\370&\034M\377"
+ "'\037R\377(\037P\377\024\016\071\377/\"A\377\036\030\065\377)!@\377\032\023\070\377"
+ "\020\014.\377\012\010\040\377\034\023,\377\013\010!\377\016\012#\377\032\024*\377\031\024"
+ ".\377\017\012,\377\026\020/\377\030\022\070\377\023\016\070\377\026\022;\377\031\023\067"
+ "\377\063'X\377O?|\371dR\237\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\001\000\016\010+\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\033\023M\015+!`\265\033"
+ "\023J\377\036\026J\377\030\022G\377D\065_\377.&M\377:-R\377\023\016\061\377\021\015"
+ "/\377\022\015\062\377\015\012+\376-\"<\363\014\010\037\351\010\006\032\351\010\005\031\363"
+ "\011\007\036\376!\032\070\377%\035:\377\021\015'\377\025\017\066\377\031\022;\377\026\021"
+ ":\377\024\015\066\377\040\030B\377\027\017\067\377\027\020-\265\017\011+\015\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\005\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\015\011,\007\020\013\061\231\031\022>M\014\012\065\004\003\002\007\000\000"
+ "\000\000\000/\"Z\015$\033R\302TG\177\377cY\207\377$\034Q\377\033\024D\377\"\030C\377"
+ "\035\026B\377$\033?\377\016\012-\362\016\013\060\243)\035DW\015\011.$\012\007#\037\034\027"
+ ".'\007\005\031'\021\013$\037\011\007\037$\017\012/W\015\011%\243\025\017*\362\021\014\063\377"
+ "\025\016<\377J>e\377(\034F\377\023\016\066\377\021\014/\377)\036=\377\017\011,\303\020"
+ "\012.\015\000\000\000\000\000\000\001\000\026\020\064\004\017\011$M\026\017!\231\005\003\026\007\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\010-\000\016\013(y\031\024\065\377.\040F\377\031"
+ "\023@\332\032\023Hq\037\026P\025\034\025L\264$\034P\377)\036W\377\036\026P\377\060$Q\377"
+ "\037\030E\377)\036K\377>(]\361\026\020<~\021\014\061\036\017\013\061_\020\014\062\261\020"
+ "\014\060\352\031\022\061\374\027\020'\377\016\012\"\377\020\014&\374\017\013*\352\013\010"
+ "$\261\011\007\037`\014\011(\036\021\014\067~\033\023F\361*\037M\377\025\017<\377\040\031@"
+ "\377\036\026?\377\024\015\061\377\021\013/\377\037\025<\265\022\013\060\025\026\016\064p"
+ "\017\012)\332\017\012&\377\021\014\036\377\017\012\036{\010\005\027\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\015\012+\033\032\024\063\362\031\022\063\377\027\021;\377\037\027M\377"
+ ")\036S\377\070(Y\371\035\027L\377\036\027H\377!\030K\377\027\021@\377\030\021C\377,"
+ "\037L\377.\040O\275\237|\255&\032\023=q\040\031;\351\026\021\066\377\034\025\071\377"
+ "\021\014\062\354\033\026\071\304\040\030\070\256\035\027\070\255\021\015(\304\027\021\060"
+ "\354\012\007\037\377\033\024+\377\013\010#\351\016\012.r\037\027J%<\060`\275\034\025I\377"
+ "\033\023I\377(\034O\377\037\027<\377\037\027:\377\034\023<\377\037\030=\371WHp\377\024"
+ "\014/\377\030\021.\377\040\027.\377\034\023)\363\017\012\040\034\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\022\015\064\216\023\016\063\377\021\014\063\377\030\021A\377&\034X\377$"
+ "\034P\377\031\022D\377!\031N\377\037\031H\377\026\020@\377\031\022C\377\033\024C\377"
+ "\031\023@\226\034\023L(\040\030P\311\027\021;\377\022\015\062\366\032\023\070\232!\032;"
+ "\071\017\015\064\005\017\013\061\000\000\000\000\000\000\000\000\000\013\006\040\000\012\007#\005\011\007\036\071\023"
+ "\016(\231\030\023\061\365\021\014\065\377\030\021B\312\030\021D(!\027R\226%\033N\377&"
+ "\033Q\377&\033F\377!\027<\377\025\016\064\377\031\022:\377\032\021;\377!\027\067\377"
+ "\021\013.\377#\033\067\377\015\010\037\377\031\022&\217\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\025\020<%\023\016\071\312\033\024;\377\026\020@\377\032\023F\377\032\024E\377\036"
+ "\027H\377#\032O\377\036\026K\377\035\026K\377\031\024G\377\030\022D\226\032\024K\063a"
+ "R\205\350!\031O\377\021\015\065\266\021\014\065\"\016\011/\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\007&\000\017\012.!.&L\265*\037T\377"
+ "%\035U\350\036\026P\064\037\026L\226\034\024J\377\037\027D\377\062&N\377\034\023\071\377"
+ "\031\022\067\377$\030B\377I\065X\377\030\021\064\377\035\025\067\377\024\015)\313\012\006"
+ "\032%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\014\064\010\024\016\071\222(\035"
+ "G\375\033\024D\377#\034G\377\033\024C\377&\035Q\377-\040Z\377\037\027L\377=-[\275"
+ "=\061](\033\024E\350&\034[\376\036\027R\203\023\016;\003\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030"
+ "\023D\003\035\025K\202#\032U\376\031\023G\350\037\026P(\035\024J\275-#N\377\031\022=\377"
+ "!\030A\377$\033E\377#\030C\377#\032?\377\060\"E\375XDe\223lW\205\010\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\010\063\000#\034BT\022\016\070"
+ "\373\026\021A\377\025\020@\377(\035S\377*\037]\377(\036Z\361O\067e\032N\311&\035"
+ "T\377&\035T\203!\027T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\030U\000C\061"
+ "g\203\062$S\377\060!_\312\037\027R%%\033O\361&\033K\377.\037P\377\033\024I\377\040"
+ "\030P\377,!U\373\036\024JU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\014\064\063\023\016:\376\030\023H\377\034\025J\377"
+ ".\"Y\377G\071r\377g[\217~\036\026Sq?\060g\377.\"_\266K\071p\003\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\020[\003\037\027Q\265/\"f\377\062&o"
+ "r%\033\\~%\033W\377G\065i\377\032\023H\377%\032W\377<*b\376F/m\064\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\021"
+ "B\205\026\021A\377\033\026I\377\037\031N\377+\"V\377,![\362'\034`\036<-s\351/$p\366"
+ "~i\236\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000$\033^!=+q\365\071+s\351\062$j\037&\034^\362-\040_\377!\030V\377$\032U\377"
+ "\061!U\377\064\040`\206\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\027\023F\000\027\022C\312\027\022E\377#\034Q\377\061\200\377;.}\261\067+{W<-v\377\071+o\377-\"g\377(\034\\\377"
+ "%\032X\365\037\026P\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\004\022(\021\015&I\024\016"
+ "\065g\026\021@\206\034\025L\254!\030V\377\035\025M\377\060'X\377=\061j\377,\040]\376"
+ "\037\027U$/$i\352D\065\201\355\066+{\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\070,}\005=\061\205\354;.\202"
+ "\352\067+|$@\061\204\376p`\237\377\067)w\377\066'q\377\065'o\377\060$e\255I\064"
+ "k\206&\032Rh\066(YJ\227\377F\066\215';/\200\351\067*y\377F\065\203\377"
+ "<-\177\377?.\201\377\066'u\377:)w\377\065't\377F\061q\377%\032S\374\027\020\065"
+ "\375\024\016\060\377-#F\377+\037M\377\036\026O\377\036\026S\377C\067j\377'\034\\\377"
+ "\067+o\377<.}\351+!j',!g\377A\060t\256\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`M\256"
+ "\256ZH\251\377PB\236'I;\221\351VC\226\377B\062\207\377B\062\205\377C\061\205"
+ "\377A\061\177\377O=\203\377J\067\177\377;,z\377;+q\374\030\021\066\361\025\017:"
+ "\377\032\022E\377!\030O\377\037\026P\377\062%[\377\040\027O\377\071)i\377\063's\377"
+ "\070+z\363\070*z\037/$n\374)\037e\304*\040h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000bK\266\000u]\302\304"
+ "\232\202\320\374cN\266\037\\J\256\363SB\237\377K;\227\377M\071\217\377>-\177"
+ "\377\061$n\377,\037g\377>.o\377]L\217\377D\061\204\361aSs(\027\020>I\033\022Fh!"
+ "\027R\206!\030Q\255\033\024K\377\062'^\377.\"h\377Q<\201\377A.z\376\071*{$\063'"
+ "t\352+\040g\355\060\040i\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000jR\300\005w_\305\354rY\301\352TE\247"
+ "$VE\250\376UD\245\377_J\252\377Q?\226\377N;\210\377\061#m\255+\035c\206-\040"
+ "_g\064%pIK\067\217(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\026S\013'\033]\365+\037^\377"
+ "/#g\377R>\202\377@.x\377A/|X\061%n\261+\037e\377\061!j:\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000jQ\273"
+ "\071t]\310\377nV\301\261hS\273WbN\262\377]J\255\377YF\243\377B\060\205\377"
+ "=+}\365=+~\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000;(j\000-\037c\312,\037a\377\064'k\377\062$p\377\062$n\377\061#l\244/!h_\060!i"
+ "\377\071&r\232A,|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000WA\245\000VA\243\231~f\302\377\214t\321_\206n\322\243qZ\303"
+ "\377`K\260\377R?\232\377<+s\377,\035`\312/\036h\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000+\034\\\205)\033]\377\062#g\377"
+ "\064$m\377\064%m\377.\036c\362\061\040g\036\070%n\351\067#k\366\063\035`\"\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000eJ\263!j"
+ "O\262\365~c\304\351\205o\323\037\200j\317\362nV\300\377^I\257\377I\066\220"
+ "\377E\065y\377M>u\206\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\026Q\063!\024L\376\"\024L\377)\031S\377-\034]\377"
+ "\063!d\377\071$m~\065\040gq\061\035`\377.\030S\266\060\030K\003\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000|a\307\003sY\301\265y\\\302\377\245\213"
+ "\324r\223|\331~\210q\322\377sY\267\377VA\234\377E\062\210\377>+x\376-\034b"
+ "\064\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000*\032V\000%\027QT#\025M\373\031\017<\377\036\021=\377)\027I\377*\030T\377R?y\362\063"
+ "\034b&\062\034`\311;#f\377\060\031V\203(\017;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\202c\307\000\225w\323\203\204i\315\377}b\311\311\216u\325&\221y\326"
+ "\361\204k\315\377lS\263\377R;\225\377A,\201\377@+x\373<,lU\000\000C\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000G!hq;\033T\351K\"h\377S+|\377`;\227\355b<\227\304"
+ "jB\242\256c\071\226\256k<\231\304\201U\265\354oC\243\377mB\242\377c\071\223"
+ "\351mB\235r\205[\267&\242|\326\275\255\215\340\377\252\211\335\377\235}\327"
+ "\377\230}\323\377\204j\306\377[B\237\377A*}\371;%p\377\064\037g\377\062\036a"
+ "\377\064\"b\377)\032Y\363&\030R\034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\015\063"
+ "\000\022\012-z\025\014\062\377\023\011)\377\016\006\032\332\007\004\014q\013\005\023\025#\016\063"
+ "\264,\022A\377<\031T\377M\"i\377Y,\177\377P'v\377U,\200\377f;\225\361a\066\223"
+ "~V,\177\036D\035[_T's\261c\065\220\352l@\231\374k?\234\377n?\232\377\260\177"
+ "\276\374i\071\217\352b\065\216\261uG\252_\223h\306\036\207b\266~uK\250\361\230"
+ "l\311\377\236x\324\377\235w\322\377\211g\303\377L\061}\377cI\250\377S<\230"
+ "\265H/\200\025A(pp\062\034a\331\060\034]\377.\035Y\377/\034V{\"\030T\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\006\034\007\012\005\026\231\015\005\031M\026\011&\004\000"
+ "\000\000\000\000\000\000\000*\021>\015;\031U\302d\065\201\377yB\233\377t?\240\377Z*z\377r\070"
+ "\225\377\206L\257\377\200E\253\377u;\234\362h\061\212\244|=\237Xx\071\225$"
+ "\201L\245\037j;\220'i\067\224'\221U\256\037o;\230$i\067\224W\215Z\275\243\245"
+ "u\323\362\204Z\262\377\214\\\275\377\207U\265\377\204T\266\377\214b\301\377"
+ "nK\245\377B(_\377;%h\303[A\240\015\000\000\000\000\001\000\004\000/\030Z\004-\030\\L)\030Y\231"
+ "(\026S\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\004\017\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Y*~\015\206L\257\265\215O\270\377"
+ "\202D\254\377w:\227\377\216M\265\377\237a\302\377\243b\302\377\232S\271\377"
+ "\221N\266\377\210D\251\377s\065\216\376{;\231\363u:\230\351\177J\254\351~"
+ "I\257\363r>\237\376t?\240\377\216Z\275\377\264\213\327\377\234k\313\377\217"
+ "[\275\377\205J\257\377zC\244\377vF\245\377lF\241\377R\061{\265\017\006\027\015"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000+\032\\\000\001\000\003\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\225Q\274\025\230W\276\370\231V\276\377\241c\300\377"
+ "\237^\301\377\247i\306\377\260q\312\377\245d\300\377\240[\276\377\230W\272"
+ "\377\232Y\273\377\223P\264\377q\066\215\377p\070\222\377{D\240\377t;\230\377"
+ "s:\227\377\213P\265\377\223^\277\377\226b\305\377\222\\\275\377\204I\255"
+ "\377\203P\250\377o>\233\377i?\232\371Z\064\215\025\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\014\003\020\000\236W\275p\242`\303\377\247d\304\377\262r\312\377\273\200\321\377"
+ "\257o\307\377\267{\315\377\274\202\326\377\257r\313\377\276\206\330\377\257"
+ "u\312\377\227S\260\377n\062\202\377Y&k\377\177O\224\377h/\201\377g\062}\377"
+ "\221S\266\377\232^\300\377\230^\300\377\232d\301\377\220Q\270\377}A\244\377"
+ "r?\236\377c\065\220\377zV\233p\023\013\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\243W\272\004\243Y"
+ "\272\331\247e\303\377\252h\304\377\271z\317\377\305\211\331\377\266w\314"
+ "\373\246b\276\376\256r\312\377\264x\317\377\271\177\323\377\255q\311\377"
+ "\240]\274\377\205B\237\377o\062\202\377](p\377j/}\377p\064\212\377\215H\260"
+ "\377\214F\255\377\226U\272\376\226\\\276\373\212J\262\377\215K\261\377\212"
+ "K\261\377d\062\215\377X/~\332M$t\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\250c\275L\247]\271\377\247"
+ "b\276\377\262r\312\377\272{\317\377\312\230\334\375\337\300\352U\250d\301"
+ "\063\261t\315\205\261t\314\312\255s\313\365\242b\300\377\244c\303\377\223"
+ "Q\257\377\227R\262\377\216N\246\377\235c\263\377\213K\243\365\222N\264\312"
+ "\206A\244\206\225O\266\063\217M\267T\205G\255\375z>\242\377\202A\247\377\202"
+ "H\237\377[\060~\377M%uM\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\246^\273\000\253h\300\231\251b\274\377\246Z"
+ "\270\377\263t\312\377\265u\313\377\260p\307\223\315\214\332\000\000\000\000\000\006\002"
+ "\010\000\243a\301\000\254o\310\013\302\214\332\254\315\233\342\377\317\233\342"
+ "\377\313\227\337\377\264y\316\377\271\207\320\255\306\230\321\013\222L\265"
+ "\000\004\001\006\000\000\000\000\000\216L\266\000z=\237\222k\061\213\377q\067\224\377{B\227\377"
+ "h<\204\377Y\063z\231J#p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\013\003\016\000\256o\305\007\252d\275z\247]\271\363\257"
+ "o\306\377\264r\310\313\257h\301\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\313\227\343\205\316\232\346\377\305\216\337\377\305\216\337\377\304\216"
+ "\335\377\272\201\326\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000n\062\217"
+ "\010g.\201\312r\066\224\377w\071\225\363f.\207zS%v\007\002\001\005\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\246`\271\000\247b\275\034\253k\301\217\265u\312%\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\312\227\344g\312\225\343\377\303\215\340\377\304\217"
+ "\340\377\311\224\340\377\307\221\336h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000g.\201$q\063\216\217p\064\220\034z\070\226\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\323\245\347I\323\242\350\377\316\233\345\377\310\224"
+ "\341\377\311\224\340\377\310\222\336I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\322\242\350'\322\243\350\361\312\230\344\375\275\207\333\375"
+ "\253n\307\361\257t\312(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
+
+static const struct GLFWimage LOGO = {48, 48, (unsigned char*)LOGO_DATA};
\ No newline at end of file
diff --git a/univerxel.icns b/univerxel.icns
new file mode 100644
index 0000000..85c0f05
Binary files /dev/null and b/univerxel.icns differ
diff --git a/univerxel.ico b/univerxel.ico
new file mode 100644
index 0000000..1907e16
Binary files /dev/null and b/univerxel.ico differ
diff --git a/univerxel.png b/univerxel.png
new file mode 100644
index 0000000..ce516e4
--- /dev/null
+++ b/univerxel.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7a47c1411335348ac149fe32292ece268d649212134dea0c25c3c702f8c90525
+size 91238
diff --git a/univerxel.rc b/univerxel.rc
new file mode 100644
index 0000000..c91d121
--- /dev/null
+++ b/univerxel.rc
@@ -0,0 +1,28 @@
+
+UNIVERXEL ICON "univerxel.ico"
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 0,0,1,0
+PRODUCTVERSION 0,0,1,0
+
+EGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0" /* LANG_ENGLISH/SUBLANG_ENGLISH_US, Unicode CP */
+ BEGIN
+ VALUE "CompanyName", "Shu"
+ VALUE "FileVersion", "0,0,1,0"
+ VALUE "LegalCopyright", "MIT"
+ VALUE "ProductName", "Univerxel"
+ VALUE "ProductVersion", "0,0,1,0"
+ VER_SPECIAL_BUILD_LINE
+ VER_PRIVATE_BUILD_LINE
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 0x04B0
+ END
+END