diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c398a8..9802c7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,12 @@ cmake_minimum_required(VERSION 3.25) project(clrsync VERSION 0.1.3 LANGUAGES CXX) include(GNUInstallDirs) - set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# ----------------------------- +# Platform-specific install dirs +# ----------------------------- if(WIN32) set(CMAKE_INSTALL_PREFIX "C:/Program Files/clrsync") set(CMAKE_INSTALL_BINDIR "bin") @@ -14,11 +16,17 @@ if(WIN32) set(CMAKE_INSTALL_FULL_DATADIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}") endif() +# ----------------------------- +# RPATH settings +# ----------------------------- set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") +# ----------------------------- +# Templates +# ----------------------------- configure_file( ${CMAKE_SOURCE_DIR}/src/core/version.hpp.in ${CMAKE_SOURCE_DIR}/src/core/version.hpp @@ -31,10 +39,14 @@ configure_file( @ONLY ) +# ----------------------------- +# Find packages +# ----------------------------- find_package(OpenGL REQUIRED) if(WIN32) include(FetchContent) + FetchContent_Declare( freetype URL https://download.savannah.gnu.org/releases/freetype/freetype-2.14.1.tar.gz @@ -46,20 +58,60 @@ if(WIN32) GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_TAG 3.3.10 ) - set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(glfw) - else() find_package(Freetype REQUIRED) find_package(PkgConfig REQUIRED) find_package(Fontconfig REQUIRED) + find_package(ZLIB REQUIRED) + find_package(BZip2 REQUIRED) + find_package(PNG REQUIRED) + + find_library(BROTLIDEC_LIBRARY NAMES brotlidec) + find_library(BROTLICOMMON_LIBRARY NAMES brotlicommon) + + pkg_check_modules(HARFBUZZ harfbuzz) pkg_check_modules(GLFW REQUIRED glfw3) + pkg_check_modules(WAYLAND_CLIENT wayland-client) + pkg_check_modules(WAYLAND_EGL wayland-egl) + + include(CheckSymbolExists) + check_symbol_exists(glfwGetWaylandDisplay "GLFW/glfw3.h" GLFW_HAS_WAYLAND) endif() +# ----------------------------- +# Extra libraries for Freetype +# ----------------------------- +set(FREETYPE_EXTRA_LIBS "") +if(BROTLIDEC_LIBRARY AND BROTLICOMMON_LIBRARY) + list(APPEND FREETYPE_EXTRA_LIBS ${BROTLIDEC_LIBRARY} ${BROTLICOMMON_LIBRARY}) + message(STATUS "Found Brotli libraries") +endif() + +if(HARFBUZZ_FOUND) + list(APPEND FREETYPE_EXTRA_LIBS ${HARFBUZZ_LIBRARIES}) + message(STATUS "Found HarfBuzz") +endif() + +# ----------------------------- +# Wayland +# ----------------------------- +set(WAYLAND_LIBS "") +if(WAYLAND_CLIENT_FOUND) + list(APPEND WAYLAND_LIBS ${WAYLAND_CLIENT_LIBRARIES}) + message(STATUS "Found Wayland client") +endif() +if(WAYLAND_EGL_FOUND) + list(APPEND WAYLAND_LIBS ${WAYLAND_EGL_LIBRARIES}) + message(STATUS "Found Wayland EGL") +endif() + +# ----------------------------- +# Core +# ----------------------------- set(CORE_SOURCES src/core/palette/color.cpp src/core/io/toml_file.cpp @@ -76,10 +128,16 @@ target_compile_definitions(clrsync_core PUBLIC CLRSYNC_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/clrsync\" ) +# ----------------------------- +# CLI +# ----------------------------- add_executable(clrsync_cli src/cli/main.cpp) target_include_directories(clrsync_cli PRIVATE src SYSTEM lib) target_link_libraries(clrsync_cli PRIVATE clrsync_core) +# ----------------------------- +# GUI +# ----------------------------- set(GUI_SOURCES src/gui/main.cpp src/gui/color_scheme_editor.cpp @@ -93,74 +151,66 @@ set(GUI_SOURCES src/gui/settings_window.cpp src/gui/font_loader.cpp ) + add_executable(clrsync_gui ${GUI_SOURCES}) target_include_directories(clrsync_gui PRIVATE src SYSTEM lib) -# if(WIN32) -# set_target_properties(clrsync_gui PROPERTIES -# LINK_FLAGS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup" -# ) -# endif() -if(WIN32) - target_link_libraries(clrsync_gui PRIVATE clrsync_core glfw freetype imgui OpenGL::GL) -else() - target_include_directories(clrsync_gui PRIVATE ${FREETYPE_INCLUDE_DIRS} ${GLFW_INCLUDE_DIRS}) - target_link_libraries(clrsync_gui PRIVATE clrsync_core imgui ${FREETYPE_LIBRARIES} ${GLFW_LIBRARIES} X11 Xrandr Xi Fontconfig::Fontconfig OpenGL::GL) -endif() - -set(imgui_SOURCE_DIR lib/imgui) +# imgui +set(IMGUI_SOURCE_DIR lib/imgui) add_library(imgui STATIC - ${imgui_SOURCE_DIR}/imgui.cpp - ${imgui_SOURCE_DIR}/imgui_draw.cpp - ${imgui_SOURCE_DIR}/imgui_widgets.cpp - ${imgui_SOURCE_DIR}/imgui_tables.cpp - ${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp - ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp - ${imgui_SOURCE_DIR}/misc/freetype/imgui_freetype.cpp + ${IMGUI_SOURCE_DIR}/imgui.cpp + ${IMGUI_SOURCE_DIR}/imgui_draw.cpp + ${IMGUI_SOURCE_DIR}/imgui_widgets.cpp + ${IMGUI_SOURCE_DIR}/imgui_tables.cpp + ${IMGUI_SOURCE_DIR}/backends/imgui_impl_glfw.cpp + ${IMGUI_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp + ${IMGUI_SOURCE_DIR}/misc/freetype/imgui_freetype.cpp ) - target_include_directories(imgui PUBLIC SYSTEM - ${imgui_SOURCE_DIR} - ${imgui_SOURCE_DIR}/backends + ${IMGUI_SOURCE_DIR} + ${IMGUI_SOURCE_DIR}/backends ) +target_compile_definitions(imgui PUBLIC IMGUI_ENABLE_FREETYPE) if(WIN32) target_include_directories(imgui PUBLIC ${GLFW_INCLUDE_DIRS} ${freetype_SOURCE_DIR}/include) + target_link_libraries(clrsync_gui PRIVATE clrsync_core glfw freetype imgui OpenGL::GL) else() target_include_directories(imgui PUBLIC ${GLFW_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS}) + target_link_libraries(clrsync_gui PRIVATE + clrsync_core imgui Freetype::Freetype ${FREETYPE_EXTRA_LIBS} + ZLIB::ZLIB BZip2::BZip2 PNG::PNG + ${GLFW_LIBRARIES} ${WAYLAND_LIBS} + X11 Xrandr Xi Fontconfig::Fontconfig OpenGL::GL + ) endif() -target_link_libraries(imgui PUBLIC glfw OpenGL::GL freetype) -target_compile_definitions(imgui PUBLIC IMGUI_ENABLE_FREETYPE) - +# ----------------------------- +# Installation +# ----------------------------- install(TARGETS clrsync_core LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Core ) - install(TARGETS clrsync_cli RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT CLI ) - install(TARGETS clrsync_gui RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT GUI ) -install(FILES - example_config/config.toml +install(FILES example_config/config.toml DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync COMPONENT Core ) - install(DIRECTORY example_config/templates DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync COMPONENT Core FILES_MATCHING PATTERN "*" ) - install(DIRECTORY example_config/palettes DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync COMPONENT Core @@ -174,14 +224,17 @@ if(UNIX AND NOT APPLE) ) endif() +# ----------------------------- +# CPack configuration +# ----------------------------- set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") -set(CPACK_COMPONENTS_ALL Core GUI CLI) - set(CPACK_PACKAGE_NAME "clrsync") set(CPACK_PACKAGE_VENDOR "Daniel Dada") set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Color scheme manager") +set(CPACK_GENERATOR "NSIS;DEB;RPM") +# Components set(CPACK_COMPONENTS_ALL Core GUI CLI) set(CPACK_COMPONENT_CORE_DISPLAY_NAME "Core Library") set(CPACK_COMPONENT_CORE_DESCRIPTION "clrsync core library and default configs (required)") @@ -193,30 +246,28 @@ set(CPACK_COMPONENT_CLI_DISPLAY_NAME "Command Line Tool") set(CPACK_COMPONENT_CLI_DESCRIPTION "clrsync CLI app") set(CPACK_COMPONENT_CLI_DEPENDS Core) -set(CPACK_GENERATOR "NSIS;DEB;RPM") - +# NSIS set(CPACK_NSIS_INSTALLED_NAME "clrsync") set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") - set(CPACK_NSIS_MODIFY_PATH ON) set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) - set(CPACK_NSIS_MENU_LINKS "bin/clrsync_gui.exe" "clrsync") set(CPACK_NSIS_CREATE_DESKTOP_LINKS "bin/clrsync_gui.exe;clrsync") +# Debian set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Daniel Dada ") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.31), libglfw3, libfreetype6") set(CPACK_DEBIAN_PACKAGE_SECTION "utils") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") +# RPM set(CPACK_RPM_PACKAGE_LICENSE "MIT") set(CPACK_RPM_PACKAGE_GROUP "Applications/System") set(CPACK_RPM_PACKAGE_URL "https://github.com/obsqrbtz/clrsync") set(CPACK_RPM_PACKAGE_REQUIRES "freetype, glfw, fontconfig") +include(CPack) message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") message(STATUS "CMAKE_INSTALL_FULL_DATADIR: ${CMAKE_INSTALL_FULL_DATADIR}") - -include(CPack) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..65e4798 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1764950072, + "narHash": "sha256-BmPWzogsG2GsXZtlT+MTcAWeDK5hkbGRZTeZNW42fwA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f61125a668a320878494449750330ca58b78c557", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..5c4161c --- /dev/null +++ b/flake.nix @@ -0,0 +1,99 @@ +{ + description = "clrsync - Color scheme manager"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs, ... }: let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in { + packages.${system} = rec { + clrsync-git = pkgs.stdenv.mkDerivation rec { + pname = "clrsync-git"; + version = "unstable"; + + src = pkgs.fetchgit { + url = "https://github.com/obsqrbtz/clrsync.git"; + rev = "HEAD"; + sha256 = "sha256-znRtdLfdEmfdSGeiQA0v6hcZBFsQzgQtPY5uN98lwjo="; + }; + + nativeBuildInputs = [ + pkgs.cmake + pkgs.git + pkgs.pkg-config + pkgs.makeWrapper + ]; + + buildInputs = [ + pkgs.glfw + pkgs.freetype + pkgs.fontconfig + pkgs.xorg.libXcursor + pkgs.mesa + pkgs.xorg.libX11 + pkgs.xorg.libXrandr + pkgs.xorg.libXi + pkgs.xorg.libXinerama + pkgs.xorg.libXcursor + pkgs.wayland + pkgs.wayland-protocols + pkgs.libxkbcommon + pkgs.zlib + pkgs.bzip2 + ]; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=Release" + ]; + + installPhase = '' + cmake --install . --prefix $out + wrapProgram $out/bin/clrsync_gui \ + --prefix LD_LIBRARY_PATH : ${pkgs.lib.makeLibraryPath buildInputs} + wrapProgram $out/bin/clrsync_cli \ + --prefix LD_LIBRARY_PATH : ${pkgs.lib.makeLibraryPath buildInputs} + ''; + + meta = with pkgs.lib; { + description = "Color scheme manager (git version)"; + homepage = "https://github.com/obsqrbtz/clrsync"; + license = licenses.mit; + platforms = platforms.linux; + mainProgram = "clrsync_gui"; + }; + }; + + default = clrsync-git; + }; + + apps.${system} = { + clrsync-gui = { + type = "app"; + program = "${self.packages.${system}.clrsync-git}/bin/clrsync_gui"; + }; + + clrsync-cli = { + type = "app"; + program = "${self.packages.${system}.clrsync-git}/bin/clrsync_cli"; + }; + + default = self.apps.${system}.clrsync-gui; + }; + + devShells.${system}.default = pkgs.mkShell { + buildInputs = with pkgs; [ + cmake + git + pkg-config + glfw + freetype + fontconfig + xorg.libXcursor + mesa + ]; + }; + }; +} diff --git a/src/gui/main.cpp b/src/gui/main.cpp index df1f02a..a85cd9f 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -1,6 +1,10 @@ #include +#define GLFW_EXPOSE_NATIVE_X11 +#define GLFW_EXPOSE_NATIVE_WAYLAND #include +#include + #include "core/config/config.hpp" #include "core/io/toml_file.hpp" @@ -27,6 +31,8 @@ int main(int, char**) GLFWwindow* window = init_glfw(); if (!window) return 1; + printf("Using backend: %s\n", glfwGetVersionString()); + init_imgui(window, ini_path); font_loader loader;