cmake_minimum_required(VERSION 3.20)

project(crystal-dock)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# When doing code clean-up, uncomment this.
# add_compile_options(-Wall -Werror)
# When doing code clean-up, comment this.
add_definitions(-DQT_NO_DEPRECATED_WARNINGS)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt6 6.6 REQUIRED COMPONENTS Concurrent DBus Gui Multimedia Sql Test Widgets)
if (Qt6_VERSION VERSION_GREATER_EQUAL 6.9.0)
  set(QT_NO_PRIVATE_MODULE_WARNING ON)
  find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
endif()
find_package(Wayland 1.22 REQUIRED COMPONENTS Client)
find_package(LayerShellQt 6.0 REQUIRED)
find_package(KF6WindowSystem REQUIRED)

set(SRCS
    desktop/desktop_env.cc
    desktop/budgie_desktop_env.cc
    desktop/hyprland_desktop_env.cc
    desktop/kde_desktop_env.cc
    desktop/labwc_desktop_env.cc
    desktop/lxqt_desktop_env.cc
    desktop/niri_desktop_env.cc
    desktop/sway_desktop_env.cc
    desktop/wayfire_desktop_env.cc
    display/window_system.cc
    display/kde_auto_hide_manager.cc
    display/kde_virtual_desktop_manager.cc
    display/kde_window_manager.cc
    display/kde_kwin_window_manager.cc
    display/kde_screen_edge.c
    display/plasma_virtual_desktop.c
    display/plasma_window_management.c
    display/wlr_foreign_toplevel_management.c
    display/wlr_window_manager.cc
    model/application_menu_config.cc
    model/config_helper.cc
    model/launcher_config.cc
    model/multi_dock_model.cc
    view/add_panel_dialog.cc
    view/appearance_settings_dialog.cc
    view/apps.cc
    view/download_tracker.cc
    view/downloads.cc
    view/downloads_stack_popup.cc
    view/pinned_path.cc
    view/color_button.cc
    view/dock_item.cc
    view/dock_panel.cc
    view/edit_launchers_dialog.cc
    view/icon_based_dock_item.cc
    view/icon_button.cc
    view/iconless_dock_item.cc
    view/multi_dock_view.cc
    view/program.cc
    view/separator.cc
    view/settings_dialog.cc
    view/trash.cc
    view/task_manager_settings_dialog.cc
    utils/desktop_file.cc
    utils/file_manager_utils.cc
    utils/icon_utils.cc
    utils/popup_window_utils.cc
    utils/screen_utils.cc
    desktop/desktop_env.h
    desktop/budgie_desktop_env.h
    desktop/hyprland_desktop_env.h
    desktop/kde_desktop_env.h
    desktop/labwc_desktop_env.h
    desktop/lxqt_desktop_env.h
    desktop/niri_desktop_env.h
    desktop/sway_desktop_env.h
    desktop/wayfire_desktop_env.h
    display/window_system.h
    display/kde_auto_hide_manager.h
    display/kde_virtual_desktop_manager.h
    display/kde_window_manager.h
    display/kde_kwin_window_manager.h
    display/kde_screen_edge.h
    display/plasma_virtual_desktop.h
    display/plasma_window_management.h
    display/wlr_foreign_toplevel_management.h
    display/wlr_window_manager.h
    model/application_menu_config.h
    model/application_menu_entry.h
    model/config_helper.h
    model/launcher_config.h
    model/multi_dock_model.h
    view/add_panel_dialog.h
    view/appearance_settings_dialog.h
    view/apps.h
    view/download_tracker.h
    view/downloads.h
    view/downloads_stack_popup.h
    view/pinned_path.h
    view/color_button.h
    view/dock_item.h
    view/dock_panel.h
    view/edit_launchers_dialog.h
    view/icon_based_dock_item.h
    view/icon_button.h
    view/iconless_dock_item.h
    view/multi_dock_view.h
    view/program.h
    view/separator.h
    view/settings_dialog.h
    view/trash.h
    view/task_manager_settings_dialog.h
    utils/command_utils.h
    utils/desktop_file.h
    utils/file_manager_utils.h
    utils/draw_utils.h
    utils/font_utils.h
    utils/icon_utils.h
    utils/math_utils.h
    utils/menu_utils.h
    utils/progress_bar_tones.h
    utils/popup_window_utils.h
    utils/screen_utils.h
    view/add_panel_dialog.ui
    view/appearance_settings_dialog.ui
    view/edit_launchers_dialog.ui
    view/task_manager_settings_dialog.ui
    resources/crystal_dock.qrc)
add_library(crystal-dock_lib STATIC ${SRCS})

set(LIBS Qt6::Concurrent Qt6::DBus Qt6::GuiPrivate Qt6::Sql Qt6::Widgets Wayland::Client LayerShellQt::Interface KF6::WindowSystem)
target_link_libraries(crystal-dock_lib PUBLIC ${LIBS})

add_executable(crystal-dock main.cc)
target_link_libraries(crystal-dock crystal-dock_lib ${LIBS})

configure_file(crystal-dock.desktop.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/crystal-dock.desktop @ONLY)

# Install

install(TARGETS crystal-dock RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES resources/sounds/empty-trash.wav resources/sounds/added-trash.wav
    DESTINATION ${CMAKE_INSTALL_PREFIX}/share/crystal-dock/sounds)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/crystal-dock.desktop
    DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)

# Uninstall

configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    @ONLY)

add_custom_target(uninstall COMMAND ${CMAKE_COMMAND}
    -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
