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
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
### Changed
+6 -1
View File
@@ -1,5 +1,5 @@
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_REQUIRED ON)
@@ -70,6 +70,9 @@ add_library(effector_gui STATIC
)
target_link_libraries(effector_gui PUBLIC effector_core PkgConfig::GTKMM)
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 --------------------------------------------------------------
add_executable(effector src/main.cpp)
@@ -79,6 +82,8 @@ target_compile_options(effector PRIVATE -Wall -Wextra -Wpedantic)
install(TARGETS effector RUNTIME DESTINATION bin)
# The launcher entry, so the interface shows up in the desktop's app menu.
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 --------------------------------------------------------------------
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
Comment=Cascade glitch and collage effects over your photographs
Exec=effector %F
Icon=applications-graphics
Icon=org.effector.Effector
Terminal=false
Categories=Graphics;2DGraphics;RasterGraphics;GTK;
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
# test checks it). From this folder: makepkg -si
pkgname=effector
pkgver=0.5.2
pkgver=0.5.3
pkgrel=1
pkgdesc='Image effects app: a GTK4 interface and a headless CLI over pluggable effects'
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",
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);
}
+1 -1
View File
@@ -2220,7 +2220,7 @@ void EffectorWindow::showAbout() {
aboutDialog_->set_program_name("Effector");
aboutDialog_->set_version(std::string(kVersion));
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_license_type(Gtk::License::GPL_3_0);
}