On Xfce with compositing off, X11 has no alpha to blend against, so the transparent background came out as a black box around the cat. When a window comes up without an alpha channel, TNCat now cuts the window down to the pixels the drawing covers, using the X11 shape extension, and refreshes that 15 times a second so it follows the animation. A sitting cat in a 120 x 106 window comes out as 96 rectangles over 29 percent of the window, so most of the box is gone. Edges are harder than with a compositor, one bit per pixel, and the log says so and names the Xfce setting that gives smooth ones instead. The image-to-rectangles step is platform independent and folds every device row into its window row, which both halves the rectangle count on a scaled display and keeps a pixel that is opaque in only one of them. xcb and xcb-shape are picked up through pkg-config on Unix and the build still works without them. Opaque mode now paints a neutral card rather than the coat colour. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
85 lines
2.9 KiB
CMake
85 lines
2.9 KiB
CMake
cmake_minimum_required(VERSION 3.21)
|
|
|
|
project(TNCat
|
|
VERSION 0.3.0
|
|
DESCRIPTION "A cute desktop cat that wanders along the bottom of your screen"
|
|
LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
# No Qt Quick Controls and no Qt Widgets: the whole interface is plain Qt Quick.
|
|
find_package(Qt6 6.5 REQUIRED COMPONENTS Core Gui Quick QuickShapes)
|
|
qt_standard_project_setup(REQUIRES 6.5)
|
|
|
|
qt_add_executable(tncat
|
|
src/main.cpp
|
|
src/catcontroller.h src/catcontroller.cpp
|
|
src/appsettings.h src/appsettings.cpp
|
|
src/platforminfo.h src/platforminfo.cpp
|
|
src/windowshape.h src/windowshape.cpp
|
|
)
|
|
|
|
target_include_directories(tncat PRIVATE src)
|
|
|
|
# QML files live in qml/ but register at the module root (TNCat.Main etc.)
|
|
set(TNCAT_QML Main Desktop Cat Chip Cup CatWindow ChipWindow CupWindow OverlayWindow
|
|
SettingsWindow AppButton AppSlider AppToggle SettingsGroup)
|
|
foreach(qmlfile IN LISTS TNCAT_QML)
|
|
set_source_files_properties(qml/${qmlfile}.qml PROPERTIES QT_RESOURCE_ALIAS ${qmlfile}.qml)
|
|
list(APPEND TNCAT_QML_FILES qml/${qmlfile}.qml)
|
|
endforeach()
|
|
|
|
qt_add_qml_module(tncat
|
|
URI TNCat
|
|
VERSION 1.0
|
|
QML_FILES ${TNCAT_QML_FILES}
|
|
)
|
|
|
|
target_link_libraries(tncat PRIVATE
|
|
Qt6::Core Qt6::Gui Qt6::Quick Qt6::QuickShapes)
|
|
|
|
# Without a compositor, X11 renders a transparent background as black. The
|
|
# shape extension is the way out: it cuts the window down to the cat itself.
|
|
# Both libraries ship with X11 and Qt's own xcb plugin already uses them.
|
|
if(UNIX AND NOT APPLE)
|
|
find_package(PkgConfig QUIET)
|
|
if(PkgConfig_FOUND)
|
|
pkg_check_modules(TNCAT_XCB IMPORTED_TARGET xcb xcb-shape)
|
|
endif()
|
|
if(TARGET PkgConfig::TNCAT_XCB)
|
|
target_link_libraries(tncat PRIVATE PkgConfig::TNCAT_XCB)
|
|
target_compile_definitions(tncat PRIVATE TNCAT_HAVE_XCB_SHAPE)
|
|
else()
|
|
message(STATUS "TNCat: xcb-shape not found. Without a compositor the cat "
|
|
"will sit in a black box; install libxcb-shape0-dev or "
|
|
"xcb-util-dev and reconfigure.")
|
|
endif()
|
|
endif()
|
|
|
|
set_target_properties(tncat PROPERTIES
|
|
MACOSX_BUNDLE TRUE
|
|
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/Info.plist.in
|
|
MACOSX_BUNDLE_GUI_IDENTIFIER app.tncat.example
|
|
MACOSX_BUNDLE_BUNDLE_NAME TNCat
|
|
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
|
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
|
WIN32_EXECUTABLE TRUE)
|
|
|
|
include(GNUInstallDirs)
|
|
install(TARGETS tncat
|
|
BUNDLE DESTINATION .
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
install(FILES linux/tncat.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
|
|
endif()
|
|
|
|
qt_generate_deploy_qml_app_script(
|
|
TARGET tncat
|
|
OUTPUT_SCRIPT deploy_script
|
|
MACOS_BUNDLE_POST_BUILD
|
|
NO_UNSUPPORTED_PLATFORM_ERROR
|
|
DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM)
|
|
install(SCRIPT ${deploy_script})
|