noctalia
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"files": {
|
||||
"Paths.xcu": "f0249a769fed68b4329baf57ac5c1bac",
|
||||
"README.md": "c36760d40cae238078e2c8ceae480730",
|
||||
"Theme_Colors.xcu": "9e3918407865e787a1081059d19187fd",
|
||||
"apply.sh": "79b637c398e457e22e1975169c1f7f2f",
|
||||
"description.xml": "810920710dcde3c1bfe9fb1ea671316c",
|
||||
"light-screenshot.png": "ad688f5dc4feda44ed3da38827165497",
|
||||
"pkg-description.en": "50f53d956476e61f87005bf9399e36f4",
|
||||
"screenshot.png": "8f29907e3b5fd8a6471914503a3c8b2b",
|
||||
"template.toml": "e1da6de79923919b05291dddf6ff5fd0"
|
||||
},
|
||||
"version": 1
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Paths" oor:package="org.openoffice.Office">
|
||||
<node oor:name="Paths">
|
||||
<node oor:name="Palette">
|
||||
<node oor:name="InternalPaths">
|
||||
<node oor:name="%origin%/palettes" oor:op="fuse"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</oor:component-data>
|
||||
@@ -0,0 +1,104 @@
|
||||
# LibreOffice
|
||||
|
||||
Tested against LibreOffice 26.2.4.2 (Flatpak, `org.libreoffice.LibreOffice`).
|
||||
|
||||
## Why this ships as an extension, not a rendered config file
|
||||
|
||||
LibreOffice's main window chrome (menus, toolbars, buttons, dialogs) is drawn by its own widget
|
||||
framework, not read from `gtk.css`. Confirmed live: an unmistakable
|
||||
`window { background-color: #ff0000; }` override in
|
||||
`~/.var/app/org.libreoffice.LibreOffice/config/gtk-3.0/gtk.css` had zero effect, even with the
|
||||
GTK3 VCL plugin explicitly forced (`SAL_USE_VCLPLUGIN=gtk3`). LibreOffice's real theming
|
||||
mechanism is its own **ColorScheme** system (Tools > Options > LibreOffice > Application Colors),
|
||||
distributed as an installable `.oxt` extension package, the same format real community themes
|
||||
like [libre-nord](https://github.com/gomesluiz/libre-nord) use.
|
||||
|
||||
## The property list is confirmed against LibreOffice's own source, not guessed
|
||||
|
||||
Every `ColorScheme` property name and its real meaning is confirmed against
|
||||
[`officecfg/registry/schema/org/openoffice/Office/UI.xcs`](https://github.com/LibreOffice/core/blob/master/officecfg/registry/schema/org/openoffice/Office/UI.xcs)
|
||||
in the LibreOffice/core repository, not a partial third-party example. This mattered in practice:
|
||||
`FieldColor`'s own schema description is "Allows to overwrite the system field color", it
|
||||
controls input/dropdown widget backgrounds, not document-embedded field shading the way its name
|
||||
first suggests. An earlier pass mapped it to a literal document-shading color by analogy with a
|
||||
third-party reference theme, and dropdown boxes, the Options sidebar, and text fields stayed on
|
||||
a stock dark color as a result, exactly the kind of "confirmed working" that only turns out to
|
||||
be partially true once someone actually looks closely. Fixed by mapping `FieldColor` to a real
|
||||
Noctalia surface role, then cross-checking the *entire* property list against the schema (several
|
||||
other properties, `DisabledColor`, `ActiveTextColor`, `InactiveColor`, and their pairs, were
|
||||
missing from the theme entirely and are now set too).
|
||||
|
||||
Colors below are hex placeholders in the template source; `Theme_Colors.xcu` uses this schema's
|
||||
own decimal-integer format, not hex, so `apply.sh` converts every value at render time (plain
|
||||
`int(hex, 16)`, confirmed against the Document Foundation's own blog post examples).
|
||||
|
||||
## Document canvas and BASIC editor colors stay literal, deliberately
|
||||
|
||||
Same reasoning as darktable's neutral photo-viewing background: `DocColor`, `FontColor`,
|
||||
`DocBoundaries`, `CalcGrid`, and the BASIC IDE syntax-highlighting colors are kept as sensible
|
||||
literal light/dark values regardless of how dark the surrounding chrome is. A document is still
|
||||
meant to look like a normal page (or be printed), and code syntax highlighting needs
|
||||
distinguishable, conventional colors (keywords, strings, comments), not four or five UI accent
|
||||
roles stretched over a dozen token types. These are functional, not chrome.
|
||||
|
||||
## Real gotchas found building this, not theoretical
|
||||
|
||||
- **The scheme has to be selected manually, once.** Installing the extension registers "Noctalia"
|
||||
as an available option in the Scheme dropdown, it does not auto-select it. Confirmed live: same
|
||||
behavior class as darktable's own theme dropdown. Go to Tools > Options > LibreOffice >
|
||||
Application Colors, pick "Noctalia" from the Scheme dropdown, click Apply/OK. After that one
|
||||
manual step, every later theme change re-renders and reinstalls the extension automatically
|
||||
through Noctalia's own template pipeline, no further manual selection needed.
|
||||
- **A restart is needed to see updated colors**, same as Heroic's own documented limitation.
|
||||
Confirmed live: switching Noctalia's theme mode while LibreOffice was already open did not
|
||||
change the running window at all; closing and reopening it did. This is not a bug in the
|
||||
template, extensions are loaded at LibreOffice startup.
|
||||
- **`unopkg add --force` alone is not reliable for reinstalling the same extension identifier.**
|
||||
Confirmed live, the hard way: after several reinstalls it left the extension in a broken state,
|
||||
`unopkg list` reported nothing installed at all, while a stale binary cache index
|
||||
(`uno_packages/cache/uno_packages.pmap`) still pointed at a deleted temp directory, causing
|
||||
every subsequent install attempt to fail with "file opening ... NOT_EXISTING" until the whole
|
||||
cache directory was cleared by hand. `apply.sh` now explicitly `unopkg remove`s the extension
|
||||
identifier before every `add`, ignoring failure since it may not be installed yet, rather than
|
||||
relying on `--force` to handle that atomically.
|
||||
- **`unopkg add` while LibreOffice is running can corrupt the install the same way.** `apply.sh`
|
||||
checks for a running `soffice.bin` process first and skips the install step entirely if found,
|
||||
rather than risk it, the `.oxt` is still rebuilt with the current colors either way, so the next
|
||||
render (once LibreOffice is closed) or the next manual re-apply installs them, and a restart is
|
||||
already required regardless.
|
||||
- **`unopkg` is not on the sandbox's `PATH`** inside the Flatpak. Confirmed live:
|
||||
`flatpak run --command=unopkg ...` fails with "No such file or directory", the full path
|
||||
`/app/libreoffice/program/unopkg` is required.
|
||||
- **If LibreOffice was open at the exact moment the theme changed, the install-skip above has no
|
||||
automatic retry.** The `.oxt` still gets rebuilt with the current colors every render, but
|
||||
since the install step is skipped while LibreOffice is running, closing LibreOffice alone is
|
||||
not enough, nothing re-triggers the install afterward on its own. Confirmed live: after
|
||||
changing the palette while LibreOffice was open, colors stayed stale even after closing and
|
||||
reopening it, until `apply.sh` was run again by hand with LibreOffice closed. In practice this
|
||||
means a color change made while LibreOffice happens to be open may need the theme re-applied
|
||||
once more (`noctalia msg templates-apply`) after closing it, not just a restart.
|
||||
|
||||
## Native install
|
||||
|
||||
Same `unopkg` mechanism, invoked directly. `apply.sh` resolves `unopkg` from `PATH` first, then
|
||||
falls back to the official TDF install layout (`/opt/libreoffice*/program/unopkg`,
|
||||
`/usr/lib/libreoffice/program/unopkg`, `/usr/lib64/libreoffice/program/unopkg`) so the official
|
||||
`.deb`/`.rpm` packages, which do **not** put `unopkg` on `PATH`, are detected too. If no native
|
||||
`unopkg` is found it falls back to the Flatpak `flatpak run --command=` form.
|
||||
|
||||
**Verified live** against LibreOffice 26.2.4.2 from the official TDF `.deb` packages on
|
||||
Kali Linux (amd64), including a clean-PATH run where `command -v unopkg` returned nothing and
|
||||
`/opt/libreoffice26.2/program/unopkg` was picked up by the fallback; the extension installed
|
||||
and registered correctly.
|
||||
|
||||
## Flatpak install (`org.libreoffice.LibreOffice`)
|
||||
|
||||
Extension cache lives at
|
||||
`~/.var/app/org.libreoffice.LibreOffice/config/libreoffice/4/user/uno_packages/`. No
|
||||
`flatpak override` needed.
|
||||
|
||||
## Status
|
||||
|
||||
Verified live against LibreOffice 26.2.4.2 (Flatpak) through Noctalia's own real render pipeline,
|
||||
`community_ids` + local `community-templates/libreoffice/`, both dark and light mode, confirmed
|
||||
after a restart in each case. Native install path is implemented but not live-tested.
|
||||
@@ -0,0 +1,64 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Colors below are hex placeholders, {{ config_dir }}/apply.sh converts them to the decimal
|
||||
integers this schema actually requires (standard int(hex, 16) RRGGBB conversion, confirmed
|
||||
against LibreOffice/core's own officecfg/registry/schema/org/openoffice/Office/UI.xcs, the
|
||||
authoritative source for every ColorScheme property name and description used below,
|
||||
including FieldColor, which really does control input-widget backgrounds despite its name
|
||||
reading like a document-field-shading setting at first glance). Chrome roles map to Noctalia
|
||||
colors. Document/BASIC-editor colors stay literal, legible regardless of chrome darkness,
|
||||
same reasoning as darktable's neutral photo-viewing background: these are functional, not
|
||||
chrome. -->
|
||||
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" oor:name="UI" oor:package="org.openoffice.Office">
|
||||
<node oor:name="ColorScheme">
|
||||
<node oor:name="ColorSchemes">
|
||||
<node oor:name="Noctalia" oor:op="fuse">
|
||||
<node oor:name="AppBackground"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="DocColor"><prop oor:name="Color" oor:op="fuse"><value>f7f7fa</value></prop></node>
|
||||
<node oor:name="FontColor"><prop oor:name="Color" oor:op="fuse"><value>1a1a1a</value></prop></node>
|
||||
<node oor:name="DocBoundaries"><prop oor:name="Color" oor:op="fuse"><value>cccccc</value></prop></node>
|
||||
|
||||
<node oor:name="WindowColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="WindowTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="BaseColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="ButtonColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container_high.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="ButtonTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="AccentColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="DisabledColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline_variant.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="DisabledTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface_variant.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="ShadowColor"><prop oor:name="Color" oor:op="fuse"><value>808080</value></prop></node>
|
||||
<node oor:name="Shadow"><prop oor:name="Color" oor:op="fuse"><value xsi:nil="false" /></prop><prop oor:name="IsVisible" oor:op="fuse"><value>false</value></prop></node>
|
||||
<node oor:name="SeparatorColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline_variant.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="FaceColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="ActiveColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="ActiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="ActiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="FieldColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container_high.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuBarColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuBarTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuBarHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuBarHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_primary.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="MenuBorderColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="InactiveColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.surface_container.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="InactiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.on_surface_variant.default.hex_stripped}}</value></prop></node>
|
||||
<node oor:name="InactiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>{{colors.outline_variant.default.hex_stripped}}</value></prop></node>
|
||||
|
||||
<node oor:name="BASICEditor"><prop oor:name="Color" oor:op="fuse"><value>ffffff</value></prop></node>
|
||||
<node oor:name="BASICError"><prop oor:name="Color" oor:op="fuse"><value>d32f2f</value></prop></node>
|
||||
<node oor:name="BASICIdentifier"><prop oor:name="Color" oor:op="fuse"><value>1a1a1a</value></prop></node>
|
||||
<node oor:name="BASICKeyword"><prop oor:name="Color" oor:op="fuse"><value>0b57d0</value></prop></node>
|
||||
<node oor:name="BASICNumber"><prop oor:name="Color" oor:op="fuse"><value>d97706</value></prop></node>
|
||||
<node oor:name="BASICOperator"><prop oor:name="Color" oor:op="fuse"><value>444444</value></prop></node>
|
||||
<node oor:name="BASICString"><prop oor:name="Color" oor:op="fuse"><value>15803d</value></prop></node>
|
||||
<node oor:name="BASICComment"><prop oor:name="Color" oor:op="fuse"><value>6b7280</value></prop></node>
|
||||
|
||||
<node oor:name="WriterIdxShadings"><prop oor:name="Color" oor:op="fuse"><value>e8e8e8</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
|
||||
<node oor:name="WriterFieldShadings"><prop oor:name="Color" oor:op="fuse"><value>e8e8e8</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
|
||||
<node oor:name="CalcGrid"><prop oor:name="Color" oor:op="fuse"><value>d9d9d9</value></prop></node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</oor:component-data>
|
||||
@@ -0,0 +1,130 @@
|
||||
#!/usr/bin/env bash
|
||||
# Runs on every theme change (post_hook). Converts the rendered Theme_Colors.xcu's
|
||||
# hex color values to the decimal integers LibreOffice's ColorScheme schema
|
||||
# actually requires, assembles a fresh .oxt from this directory's static files
|
||||
# plus the converted colors, and installs it via unopkg.
|
||||
set -euo pipefail
|
||||
|
||||
CONFIG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
RENDERED="${XDG_STATE_HOME:-$HOME/.local/state}/noctalia/libreoffice-theme-staging/Theme_Colors.xcu"
|
||||
BUILD_DIR="$CONFIG_DIR/build"
|
||||
OXT_PATH="$BUILD_DIR/noctalia-theme.oxt"
|
||||
|
||||
if [ ! -f "$RENDERED" ]; then
|
||||
echo "noctalia libreoffice: rendered Theme_Colors.xcu not found at $RENDERED" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm -rf "$BUILD_DIR/pkg"
|
||||
mkdir -p "$BUILD_DIR/pkg/META-INF"
|
||||
|
||||
# Convert every 6-hex-digit <value>...</value> to its decimal equivalent.
|
||||
# ColorScheme's schema stores colors as base-10 integers, not hex strings.
|
||||
python3 - "$RENDERED" "$BUILD_DIR/pkg/Theme_Colors.xcu" << 'PYEOF'
|
||||
import re
|
||||
import sys
|
||||
|
||||
src, dst = sys.argv[1], sys.argv[2]
|
||||
with open(src) as f:
|
||||
content = f.read()
|
||||
|
||||
|
||||
def hex_to_dec(match):
|
||||
return f"<value>{int(match.group(1), 16)}</value>"
|
||||
|
||||
|
||||
converted = re.sub(r"<value>([0-9a-fA-F]{6})</value>", hex_to_dec, content)
|
||||
with open(dst, "w") as f:
|
||||
f.write(converted)
|
||||
PYEOF
|
||||
|
||||
cp "$CONFIG_DIR/Paths.xcu" "$BUILD_DIR/pkg/Paths.xcu"
|
||||
cp "$CONFIG_DIR/description.xml" "$BUILD_DIR/pkg/description.xml"
|
||||
cp "$CONFIG_DIR/pkg-description.en" "$BUILD_DIR/pkg/pkg-description.en"
|
||||
|
||||
# Write the package manifest inline rather than copying it from the template directory.
|
||||
# The template distribution pipeline only ships top-level files, so the
|
||||
# META-INF/manifest.xml that used to live here was never delivered to users and
|
||||
# the previous `cp` aborted under set -euo pipefail before the .oxt was built.
|
||||
# The manifest is static and small, so generating it here keeps the template
|
||||
# self-contained and removes the only subdirectory dependency.
|
||||
cat > "$BUILD_DIR/pkg/META-INF/manifest.xml" <<'MANIFEST'
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
|
||||
<manifest:file-entry manifest:full-path="Theme_Colors.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
||||
<manifest:file-entry manifest:full-path="Paths.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
||||
</manifest:manifest>
|
||||
MANIFEST
|
||||
|
||||
rm -f "$OXT_PATH"
|
||||
(cd "$BUILD_DIR/pkg" && zip -qr "$OXT_PATH" .)
|
||||
|
||||
# unopkg add --force while LibreOffice is running has been confirmed live to
|
||||
# silently corrupt the install (it can remove the old registration before
|
||||
# failing to add the new one, leaving nothing installed at all). Skip the
|
||||
# install step entirely rather than risk that -- the .oxt is still rebuilt
|
||||
# above so the next run (once LibreOffice is closed) installs the current
|
||||
# colors, and a restart is already required to see any change regardless.
|
||||
if pgrep -x soffice.bin >/dev/null 2>&1; then
|
||||
# The .oxt above is already rebuilt with the current colors, only the
|
||||
# install step is skipped here. A restart alone does NOT pick up anything
|
||||
# new, the previously-installed extension is still what's registered.
|
||||
# Close LibreOffice, then re-run the theme apply (or wait for the next
|
||||
# theme change) to actually install this build.
|
||||
echo "noctalia libreoffice: LibreOffice is running, skipping extension install this run (installing while it's open has been confirmed to corrupt the existing install). Close LibreOffice, then re-apply the theme to actually install these colors, a restart alone will not pick them up." >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
EXT_ID="dev.noctalia.libreoffice.theme"
|
||||
INSTALLED_ANY=0
|
||||
|
||||
# `add --force` alone has been confirmed live to leave the extension in a
|
||||
# broken state (a stale cache index pointing at a deleted temp dir, `list`
|
||||
# then reports nothing installed at all, and every later reinstall fails
|
||||
# with "file opening ... NOT_EXISTING" until the cache is cleared by hand).
|
||||
# Explicitly removing the old registration first, ignoring failure since it
|
||||
# may not be installed yet, avoids relying on --force to do that atomically.
|
||||
|
||||
# Install to every LibreOffice found, not just whichever `unopkg` a plain
|
||||
# PATH lookup happens to resolve first. A machine with both a native
|
||||
# LibreOffice (providing `unopkg` on PATH) and the Flatpak (the tested
|
||||
# target) installed would otherwise only get themed on whichever one won
|
||||
# that lookup, silently leaving the other one unthemed.
|
||||
#
|
||||
# Native detection here also covers the official TDF `.deb`/`.rpm` layout,
|
||||
# which installs into /opt/libreoffice<major>.<minor>/ and does NOT place
|
||||
# `unopkg` on PATH. `command -v unopkg` alone misses it, so fall back to the
|
||||
# known install dirs before concluding there is no native install.
|
||||
UNOPKG="$(command -v unopkg || true)"
|
||||
if [ -z "$UNOPKG" ]; then
|
||||
for candidate in /opt/libreoffice*/program/unopkg \
|
||||
/usr/lib/libreoffice/program/unopkg \
|
||||
/usr/lib64/libreoffice/program/unopkg; do
|
||||
if [ -x "$candidate" ]; then
|
||||
UNOPKG="$candidate"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -n "$UNOPKG" ]; then
|
||||
"$UNOPKG" remove "$EXT_ID" >/dev/null 2>&1 || true
|
||||
if "$UNOPKG" add --force "$OXT_PATH" 2>&1; then
|
||||
INSTALLED_ANY=1
|
||||
else
|
||||
echo "noctalia libreoffice: native unopkg install failed ($UNOPKG)" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
if flatpak info org.libreoffice.LibreOffice >/dev/null 2>&1; then
|
||||
flatpak run --command=/app/libreoffice/program/unopkg org.libreoffice.LibreOffice remove "$EXT_ID" >/dev/null 2>&1 || true
|
||||
if flatpak run --command=/app/libreoffice/program/unopkg org.libreoffice.LibreOffice add --force "$OXT_PATH" 2>&1; then
|
||||
INSTALLED_ANY=1
|
||||
else
|
||||
echo "noctalia libreoffice: Flatpak unopkg install failed" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$INSTALLED_ANY" -eq 0 ]; then
|
||||
echo "noctalia libreoffice: no LibreOffice installation found (neither native unopkg on PATH nor the org.libreoffice.LibreOffice Flatpak)" >&2
|
||||
fi
|
||||
Binary file not shown.
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
|
||||
<manifest:file-entry manifest:full-path="Theme_Colors.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
||||
<manifest:file-entry manifest:full-path="Paths.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
|
||||
</manifest:manifest>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Paths" oor:package="org.openoffice.Office">
|
||||
<node oor:name="Paths">
|
||||
<node oor:name="Palette">
|
||||
<node oor:name="InternalPaths">
|
||||
<node oor:name="%origin%/palettes" oor:op="fuse"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</oor:component-data>
|
||||
@@ -0,0 +1,64 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Colors below are hex placeholders, /home/yuri/.local/state/noctalia/community-templates/libreoffice/apply.sh converts them to the decimal
|
||||
integers this schema actually requires (standard int(hex, 16) RRGGBB conversion, confirmed
|
||||
against LibreOffice/core's own officecfg/registry/schema/org/openoffice/Office/UI.xcs, the
|
||||
authoritative source for every ColorScheme property name and description used below,
|
||||
including FieldColor, which really does control input-widget backgrounds despite its name
|
||||
reading like a document-field-shading setting at first glance). Chrome roles map to Noctalia
|
||||
colors. Document/BASIC-editor colors stay literal, legible regardless of chrome darkness,
|
||||
same reasoning as darktable's neutral photo-viewing background: these are functional, not
|
||||
chrome. -->
|
||||
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" oor:name="UI" oor:package="org.openoffice.Office">
|
||||
<node oor:name="ColorScheme">
|
||||
<node oor:name="ColorSchemes">
|
||||
<node oor:name="Noctalia" oor:op="fuse">
|
||||
<node oor:name="AppBackground"><prop oor:name="Color" oor:op="fuse"><value>1250068</value></prop></node>
|
||||
<node oor:name="DocColor"><prop oor:name="Color" oor:op="fuse"><value>16250874</value></prop></node>
|
||||
<node oor:name="FontColor"><prop oor:name="Color" oor:op="fuse"><value>1710618</value></prop></node>
|
||||
<node oor:name="DocBoundaries"><prop oor:name="Color" oor:op="fuse"><value>13421772</value></prop></node>
|
||||
|
||||
<node oor:name="WindowColor"><prop oor:name="Color" oor:op="fuse"><value>1250068</value></prop></node>
|
||||
<node oor:name="WindowTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
|
||||
<node oor:name="BaseColor"><prop oor:name="Color" oor:op="fuse"><value>1250068</value></prop></node>
|
||||
<node oor:name="ButtonColor"><prop oor:name="Color" oor:op="fuse"><value>2763306</value></prop></node>
|
||||
<node oor:name="ButtonTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
|
||||
<node oor:name="AccentColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
|
||||
<node oor:name="DisabledColor"><prop oor:name="Color" oor:op="fuse"><value>4474699</value></prop></node>
|
||||
<node oor:name="DisabledTextColor"><prop oor:name="Color" oor:op="fuse"><value>12961483</value></prop></node>
|
||||
<node oor:name="ShadowColor"><prop oor:name="Color" oor:op="fuse"><value>8421504</value></prop></node>
|
||||
<node oor:name="Shadow"><prop oor:name="Color" oor:op="fuse"><value xsi:nil="false" /></prop><prop oor:name="IsVisible" oor:op="fuse"><value>false</value></prop></node>
|
||||
<node oor:name="SeparatorColor"><prop oor:name="Color" oor:op="fuse"><value>4474699</value></prop></node>
|
||||
<node oor:name="FaceColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
|
||||
<node oor:name="ActiveColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
|
||||
<node oor:name="ActiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>2699577</value></prop></node>
|
||||
<node oor:name="ActiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
|
||||
<node oor:name="FieldColor"><prop oor:name="Color" oor:op="fuse"><value>2763306</value></prop></node>
|
||||
<node oor:name="MenuBarColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
|
||||
<node oor:name="MenuBarTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
|
||||
<node oor:name="MenuBarHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
|
||||
<node oor:name="MenuBarHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>2699577</value></prop></node>
|
||||
<node oor:name="MenuColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
|
||||
<node oor:name="MenuTextColor"><prop oor:name="Color" oor:op="fuse"><value>15000290</value></prop></node>
|
||||
<node oor:name="MenuHighlightColor"><prop oor:name="Color" oor:op="fuse"><value>12568530</value></prop></node>
|
||||
<node oor:name="MenuHighlightTextColor"><prop oor:name="Color" oor:op="fuse"><value>2699577</value></prop></node>
|
||||
<node oor:name="MenuBorderColor"><prop oor:name="Color" oor:op="fuse"><value>9343381</value></prop></node>
|
||||
<node oor:name="InactiveColor"><prop oor:name="Color" oor:op="fuse"><value>2039584</value></prop></node>
|
||||
<node oor:name="InactiveTextColor"><prop oor:name="Color" oor:op="fuse"><value>12961483</value></prop></node>
|
||||
<node oor:name="InactiveBorderColor"><prop oor:name="Color" oor:op="fuse"><value>4474699</value></prop></node>
|
||||
|
||||
<node oor:name="BASICEditor"><prop oor:name="Color" oor:op="fuse"><value>16777215</value></prop></node>
|
||||
<node oor:name="BASICError"><prop oor:name="Color" oor:op="fuse"><value>13840175</value></prop></node>
|
||||
<node oor:name="BASICIdentifier"><prop oor:name="Color" oor:op="fuse"><value>1710618</value></prop></node>
|
||||
<node oor:name="BASICKeyword"><prop oor:name="Color" oor:op="fuse"><value>743376</value></prop></node>
|
||||
<node oor:name="BASICNumber"><prop oor:name="Color" oor:op="fuse"><value>14251782</value></prop></node>
|
||||
<node oor:name="BASICOperator"><prop oor:name="Color" oor:op="fuse"><value>4473924</value></prop></node>
|
||||
<node oor:name="BASICString"><prop oor:name="Color" oor:op="fuse"><value>1409085</value></prop></node>
|
||||
<node oor:name="BASICComment"><prop oor:name="Color" oor:op="fuse"><value>7041664</value></prop></node>
|
||||
|
||||
<node oor:name="WriterIdxShadings"><prop oor:name="Color" oor:op="fuse"><value>15263976</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
|
||||
<node oor:name="WriterFieldShadings"><prop oor:name="Color" oor:op="fuse"><value>15263976</value></prop><prop oor:name="IsVisible" oor:op="fuse"><value>true</value></prop></node>
|
||||
<node oor:name="CalcGrid"><prop oor:name="Color" oor:op="fuse"><value>14277081</value></prop></node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</oor:component-data>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<description xmlns="http://openoffice.org/extensions/description/2006"
|
||||
xmlns:d="http://openoffice.org/extensions/description/2006"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<identifier value="dev.noctalia.libreoffice.theme" />
|
||||
<version value="1.0.0" />
|
||||
<publisher>
|
||||
<name xlink:href="https://github.com/noctalia-dev/community-templates" lang="en">Noctalia</name>
|
||||
</publisher>
|
||||
<display-name>
|
||||
<name lang="en">Noctalia Theme</name>
|
||||
</display-name>
|
||||
<extension-description>
|
||||
<src xlink:href="pkg-description.en" lang="en" />
|
||||
</extension-description>
|
||||
</description>
|
||||
@@ -0,0 +1,2 @@
|
||||
Colors LibreOffice's application chrome (menus, toolbars, buttons, dialogs) to match the active
|
||||
Noctalia palette. Installed and kept in sync automatically by Noctalia's own template pipeline.
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<description xmlns="http://openoffice.org/extensions/description/2006"
|
||||
xmlns:d="http://openoffice.org/extensions/description/2006"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<identifier value="dev.noctalia.libreoffice.theme" />
|
||||
<version value="1.0.0" />
|
||||
<publisher>
|
||||
<name xlink:href="https://github.com/noctalia-dev/community-templates" lang="en">Noctalia</name>
|
||||
</publisher>
|
||||
<display-name>
|
||||
<name lang="en">Noctalia Theme</name>
|
||||
</display-name>
|
||||
<extension-description>
|
||||
<src xlink:href="pkg-description.en" lang="en" />
|
||||
</extension-description>
|
||||
</description>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
@@ -0,0 +1,2 @@
|
||||
Colors LibreOffice's application chrome (menus, toolbars, buttons, dialogs) to match the active
|
||||
Noctalia palette. Installed and kept in sync automatically by Noctalia's own template pipeline.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 47 KiB |
@@ -0,0 +1,8 @@
|
||||
[catalog.libreoffice]
|
||||
name = "LibreOffice"
|
||||
category = "editor"
|
||||
|
||||
[templates.libreoffice]
|
||||
input_path = "Theme_Colors.xcu"
|
||||
output_path = "$XDG_STATE_HOME/noctalia/libreoffice-theme-staging/Theme_Colors.xcu"
|
||||
post_hook = "bash '{{ config_dir }}/apply.sh'"
|
||||
Reference in New Issue
Block a user