Give Effector its own icon

An E split into its colour channels, with two slices slipped sideways,
replaces the generic applications-graphics icon in the desktop entry and
About Effector, with a one-colour symbolic version for panels. Both are
installed into the hicolor theme; a build run straight from the build tree
falls back to the copy in the sources. The version moves to 0.5.3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Si
2026-09-26 10:38:49 +02:00
co-authored by Claude Opus 5.5
parent 708b6bdb1b
commit c069de3566
8 changed files with 86 additions and 4 deletions
+7
View File
@@ -4,6 +4,13 @@ Every release of Effector, newest first. The version lives in one place, the
`project()` line of `CMakeLists.txt`, and each release is a `vX.Y.Z` tag on the `project()` line of `CMakeLists.txt`, and each release is a `vX.Y.Z` tag on the
commit that made it. The interface shows this file under Changelog in its menu. commit that made it. The interface shows this file under Changelog in its menu.
## [0.5.3] - 2026-09-26
### Added
- Effector has its own icon, an E split into its colour channels, in the app
menu, the dock and About Effector; a one-colour version goes with it for
panels.
## [0.5.2] - 2026-09-26 ## [0.5.2] - 2026-09-26
### Changed ### Changed
+6 -1
View File
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.20) cmake_minimum_required(VERSION 3.20)
project(effector VERSION 0.5.2 LANGUAGES CXX) project(effector VERSION 0.5.3 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -70,6 +70,9 @@ add_library(effector_gui STATIC
) )
target_link_libraries(effector_gui PUBLIC effector_core PkgConfig::GTKMM) target_link_libraries(effector_gui PUBLIC effector_core PkgConfig::GTKMM)
target_compile_options(effector_gui PRIVATE -Wall -Wextra -Wpedantic) target_compile_options(effector_gui PRIVATE -Wall -Wextra -Wpedantic)
# Where a build that was never installed finds its own icon (see app.cpp).
target_compile_definitions(effector_gui PRIVATE
EFFECTOR_SOURCE_ICON_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/icons")
# --- application -------------------------------------------------------------- # --- application --------------------------------------------------------------
add_executable(effector src/main.cpp) add_executable(effector src/main.cpp)
@@ -79,6 +82,8 @@ target_compile_options(effector PRIVATE -Wall -Wextra -Wpedantic)
install(TARGETS effector RUNTIME DESTINATION bin) install(TARGETS effector RUNTIME DESTINATION bin)
# The launcher entry, so the interface shows up in the desktop's app menu. # The launcher entry, so the interface shows up in the desktop's app menu.
install(FILES data/org.effector.Effector.desktop DESTINATION share/applications) install(FILES data/org.effector.Effector.desktop DESTINATION share/applications)
# The icon it names, in full colour and as a one-colour symbolic for panels.
install(DIRECTORY data/icons/hicolor DESTINATION share/icons)
# --- tests -------------------------------------------------------------------- # --- tests --------------------------------------------------------------------
include(CTest) include(CTest)
@@ -0,0 +1,52 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128">
<!-- Effector: an E split into its colour channels, two slices slipped sideways -->
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#2b2837"/>
<stop offset="1" stop-color="#15131c"/>
</linearGradient>
<clipPath id="face"><rect x="12" y="10" width="104" height="104" rx="24"/></clipPath>
<clipPath id="band0"><rect x="0" y="20" width="128" height="30"/></clipPath>
<clipPath id="band1"><rect x="0" y="50" width="128" height="9"/></clipPath>
<clipPath id="band2"><rect x="0" y="59" width="128" height="15"/></clipPath>
<clipPath id="band3"><rect x="0" y="74" width="128" height="6"/></clipPath>
<clipPath id="band4"><rect x="0" y="80" width="128" height="20"/></clipPath>
</defs>
<rect x="12" y="16" width="104" height="104" rx="24" fill="#0b0a10"/>
<g clip-path="url(#face)">
<rect x="12" y="10" width="104" height="104" fill="url(#bg)"/>
<g fill="#ffffff" opacity=".05">
<rect x="12" y="12" width="104" height="1.4"/>
<rect x="12" y="16" width="104" height="1.4"/>
<rect x="12" y="20" width="104" height="1.4"/>
<rect x="12" y="24" width="104" height="1.4"/>
<rect x="12" y="28" width="104" height="1.4"/>
<rect x="12" y="32" width="104" height="1.4"/>
<rect x="12" y="36" width="104" height="1.4"/>
<rect x="12" y="40" width="104" height="1.4"/>
<rect x="12" y="44" width="104" height="1.4"/>
<rect x="12" y="48" width="104" height="1.4"/>
<rect x="12" y="52" width="104" height="1.4"/>
<rect x="12" y="56" width="104" height="1.4"/>
<rect x="12" y="60" width="104" height="1.4"/>
<rect x="12" y="64" width="104" height="1.4"/>
<rect x="12" y="68" width="104" height="1.4"/>
<rect x="12" y="72" width="104" height="1.4"/>
<rect x="12" y="76" width="104" height="1.4"/>
<rect x="12" y="80" width="104" height="1.4"/>
<rect x="12" y="84" width="104" height="1.4"/>
<rect x="12" y="88" width="104" height="1.4"/>
<rect x="12" y="92" width="104" height="1.4"/>
<rect x="12" y="96" width="104" height="1.4"/>
<rect x="12" y="100" width="104" height="1.4"/>
<rect x="12" y="104" width="104" height="1.4"/>
<rect x="12" y="108" width="104" height="1.4"/>
<rect x="12" y="112" width="104" height="1.4"/>
</g>
<g clip-path="url(#band0)"><g transform="translate(0 0)"><g transform="translate(-5 0)"><rect x="40" y="30" width="16" height="62" fill="#00e5ff"/><rect x="40" y="30" width="48" height="14" fill="#00e5ff"/><rect x="40" y="54" width="40" height="13" fill="#00e5ff"/><rect x="40" y="78" width="48" height="14" fill="#00e5ff"/></g><g transform="translate(5 0)"><rect x="40" y="30" width="16" height="62" fill="#ff2e88"/><rect x="40" y="30" width="48" height="14" fill="#ff2e88"/><rect x="40" y="54" width="40" height="13" fill="#ff2e88"/><rect x="40" y="78" width="48" height="14" fill="#ff2e88"/></g><rect x="40" y="30" width="16" height="62" fill="#ffffff"/><rect x="40" y="30" width="48" height="14" fill="#ffffff"/><rect x="40" y="54" width="40" height="13" fill="#ffffff"/><rect x="40" y="78" width="48" height="14" fill="#ffffff"/></g></g>
<g clip-path="url(#band1)"><g transform="translate(9 0)"><g transform="translate(-5 0)"><rect x="40" y="30" width="16" height="62" fill="#00e5ff"/><rect x="40" y="30" width="48" height="14" fill="#00e5ff"/><rect x="40" y="54" width="40" height="13" fill="#00e5ff"/><rect x="40" y="78" width="48" height="14" fill="#00e5ff"/></g><g transform="translate(5 0)"><rect x="40" y="30" width="16" height="62" fill="#ff2e88"/><rect x="40" y="30" width="48" height="14" fill="#ff2e88"/><rect x="40" y="54" width="40" height="13" fill="#ff2e88"/><rect x="40" y="78" width="48" height="14" fill="#ff2e88"/></g><rect x="40" y="30" width="16" height="62" fill="#ffffff"/><rect x="40" y="30" width="48" height="14" fill="#ffffff"/><rect x="40" y="54" width="40" height="13" fill="#ffffff"/><rect x="40" y="78" width="48" height="14" fill="#ffffff"/></g></g>
<g clip-path="url(#band2)"><g transform="translate(0 0)"><g transform="translate(-5 0)"><rect x="40" y="30" width="16" height="62" fill="#00e5ff"/><rect x="40" y="30" width="48" height="14" fill="#00e5ff"/><rect x="40" y="54" width="40" height="13" fill="#00e5ff"/><rect x="40" y="78" width="48" height="14" fill="#00e5ff"/></g><g transform="translate(5 0)"><rect x="40" y="30" width="16" height="62" fill="#ff2e88"/><rect x="40" y="30" width="48" height="14" fill="#ff2e88"/><rect x="40" y="54" width="40" height="13" fill="#ff2e88"/><rect x="40" y="78" width="48" height="14" fill="#ff2e88"/></g><rect x="40" y="30" width="16" height="62" fill="#ffffff"/><rect x="40" y="30" width="48" height="14" fill="#ffffff"/><rect x="40" y="54" width="40" height="13" fill="#ffffff"/><rect x="40" y="78" width="48" height="14" fill="#ffffff"/></g></g>
<g clip-path="url(#band3)"><g transform="translate(-7 0)"><g transform="translate(-5 0)"><rect x="40" y="30" width="16" height="62" fill="#00e5ff"/><rect x="40" y="30" width="48" height="14" fill="#00e5ff"/><rect x="40" y="54" width="40" height="13" fill="#00e5ff"/><rect x="40" y="78" width="48" height="14" fill="#00e5ff"/></g><g transform="translate(5 0)"><rect x="40" y="30" width="16" height="62" fill="#ff2e88"/><rect x="40" y="30" width="48" height="14" fill="#ff2e88"/><rect x="40" y="54" width="40" height="13" fill="#ff2e88"/><rect x="40" y="78" width="48" height="14" fill="#ff2e88"/></g><rect x="40" y="30" width="16" height="62" fill="#ffffff"/><rect x="40" y="30" width="48" height="14" fill="#ffffff"/><rect x="40" y="54" width="40" height="13" fill="#ffffff"/><rect x="40" y="78" width="48" height="14" fill="#ffffff"/></g></g>
<g clip-path="url(#band4)"><g transform="translate(0 0)"><g transform="translate(-5 0)"><rect x="40" y="30" width="16" height="62" fill="#00e5ff"/><rect x="40" y="30" width="48" height="14" fill="#00e5ff"/><rect x="40" y="54" width="40" height="13" fill="#00e5ff"/><rect x="40" y="78" width="48" height="14" fill="#00e5ff"/></g><g transform="translate(5 0)"><rect x="40" y="30" width="16" height="62" fill="#ff2e88"/><rect x="40" y="30" width="48" height="14" fill="#ff2e88"/><rect x="40" y="54" width="40" height="13" fill="#ff2e88"/><rect x="40" y="78" width="48" height="14" fill="#ff2e88"/></g><rect x="40" y="30" width="16" height="62" fill="#ffffff"/><rect x="40" y="30" width="48" height="14" fill="#ffffff"/><rect x="40" y="54" width="40" height="13" fill="#ffffff"/><rect x="40" y="78" width="48" height="14" fill="#ffffff"/></g></g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<!-- Effector, one colour: the E with its middle slice slipped sideways -->
<g fill="#2e3436">
<rect x="3" y="2" width="10" height="3"/>
<rect x="3" y="5" width="3" height="1.5"/>
<rect x="5" y="6.5" width="8" height="3"/>
<rect x="3" y="9.5" width="3" height="1.5"/>
<rect x="3" y="11" width="10" height="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 433 B

+1 -1
View File
@@ -4,7 +4,7 @@ Name=Effector
GenericName=Image Effects GenericName=Image Effects
Comment=Cascade glitch and collage effects over your photographs Comment=Cascade glitch and collage effects over your photographs
Exec=effector %F Exec=effector %F
Icon=applications-graphics Icon=org.effector.Effector
Terminal=false Terminal=false
Categories=Graphics;2DGraphics;RasterGraphics;GTK; Categories=Graphics;2DGraphics;RasterGraphics;GTK;
MimeType=image/jpeg;image/png;image/webp;image/tiff;image/bmp; MimeType=image/jpeg;image/png;image/webp;image/tiff;image/bmp;
+1 -1
View File
@@ -2,7 +2,7 @@
# so pkgver must follow the project() line of CMakeLists.txt (the version core # so pkgver must follow the project() line of CMakeLists.txt (the version core
# test checks it). From this folder: makepkg -si # test checks it). From this folder: makepkg -si
pkgname=effector pkgname=effector
pkgver=0.5.2 pkgver=0.5.3
pkgrel=1 pkgrel=1
pkgdesc='Image effects app: a GTK4 interface and a headless CLI over pluggable effects' pkgdesc='Image effects app: a GTK4 interface and a headless CLI over pluggable effects'
arch=('x86_64' 'aarch64') arch=('x86_64' 'aarch64')
+8
View File
@@ -13,6 +13,14 @@ int runGui(const Options& initial, int argc, char** argv) {
auto app = Gtk::Application::create("org.effector.Effector", auto app = Gtk::Application::create("org.effector.Effector",
Gio::Application::Flags::NON_UNIQUE); Gio::Application::Flags::NON_UNIQUE);
app->signal_startup().connect([] {
// An installed Effector finds its icon in the hicolor theme; one run
// straight from the build tree falls back to the copy in the sources.
const char* icon = "org.effector.Effector";
auto theme = Gtk::IconTheme::get_for_display(Gdk::Display::get_default());
if (!theme->has_icon(icon)) theme->add_search_path(EFFECTOR_SOURCE_ICON_DIR);
Gtk::Window::set_default_icon_name(icon);
});
return app->make_window_and_run<EffectorWindow>(0, nullptr, initial); return app->make_window_and_run<EffectorWindow>(0, nullptr, initial);
} }
+1 -1
View File
@@ -2220,7 +2220,7 @@ void EffectorWindow::showAbout() {
aboutDialog_->set_program_name("Effector"); aboutDialog_->set_program_name("Effector");
aboutDialog_->set_version(std::string(kVersion)); aboutDialog_->set_version(std::string(kVersion));
aboutDialog_->set_comments("Image effects, cascaded through a chain."); aboutDialog_->set_comments("Image effects, cascaded through a chain.");
aboutDialog_->set_logo_icon_name("applications-graphics"); aboutDialog_->set_logo_icon_name("org.effector.Effector");
aboutDialog_->set_copyright("Copyright © 2026 Si"); aboutDialog_->set_copyright("Copyright © 2026 Si");
aboutDialog_->set_license_type(Gtk::License::GPL_3_0); aboutDialog_->set_license_type(Gtk::License::GPL_3_0);
} }