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:
@@ -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
@@ -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 |
@@ -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;
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user