feat: add panel-tweaks for GNOME panel customization
This commit is contained in:
commit
a9a1cf16bb
2 files changed
+212
No files matched your search
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# Installs cinnamon-panel-tweaks for the current user:
|
||||
# - copies the app into ~/.local/share/cinnamon-panel-tweaks/
|
||||
# - creates a menu launcher (~/.local/share/applications/)
|
||||
set -euo pipefail
|
||||
|
||||
SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
APP_DIR="$HOME/.local/share/cinnamon-panel-tweaks"
|
||||
DESKTOP_FILE="$HOME/.local/share/applications/cinnamon-panel-tweaks.desktop"
|
||||
|
||||
mkdir -p "$APP_DIR" "$(dirname "$DESKTOP_FILE")"
|
||||
cp "$SRC_DIR/panel_tweaks.py" "$APP_DIR/"
|
||||
chmod +x "$APP_DIR/panel_tweaks.py"
|
||||
|
||||
cat > "$DESKTOP_FILE" << EOF
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Panel Tweaks
|
||||
Comment=Quick toggles for the Cinnamon panel: autohide, height, edit mode, applets
|
||||
Exec=python3 $APP_DIR/panel_tweaks.py
|
||||
Icon=preferences-desktop-cinnamon
|
||||
Terminal=false
|
||||
Categories=Settings;
|
||||
EOF
|
||||
|
||||
echo "Installed -> $APP_DIR"
|
||||
echo "Menu launcher -> $DESKTOP_FILE"
|
||||
echo "Run directly with: python3 $APP_DIR/panel_tweaks.py"
|
||||
Executable
+184
@@ -0,0 +1,184 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
cinnamon-panel-tweaks
|
||||
=======================
|
||||
|
||||
A small GTK3 GUI for the handful of Cinnamon bottom-panel settings that
|
||||
otherwise require digging through Cinnamon Settings -> Panel: autohide,
|
||||
height, edit mode (drag applets around), and per-applet enable/disable.
|
||||
Everything here reads and writes the same "org.cinnamon" gsettings keys
|
||||
Cinnamon Settings itself uses, so changes apply live, no restart needed.
|
||||
|
||||
This intentionally does not attempt applet development or layout editing
|
||||
beyond enable/disable + reorder-via-edit-mode - that is Cinnamon Settings'
|
||||
job. This is a quick-access shortcut to the few knobs used often enough to
|
||||
be worth a one-click toggle.
|
||||
|
||||
Run directly: python3 panel_tweaks.py
|
||||
"""
|
||||
|
||||
import gi
|
||||
gi.require_version("Gtk", "3.0")
|
||||
from gi.repository import Gtk, Gio
|
||||
|
||||
CINNAMON_SCHEMA = "org.cinnamon"
|
||||
|
||||
DEFAULT_PANEL_ID = "1"
|
||||
|
||||
|
||||
def _panelsEnabledIds(settings):
|
||||
ids = []
|
||||
for entry in settings.get_strv("panels-enabled"):
|
||||
panelId = entry.split(":", 1)[0]
|
||||
if panelId not in ids:
|
||||
ids.append(panelId)
|
||||
return ids or [DEFAULT_PANEL_ID]
|
||||
|
||||
|
||||
def _readPanelIndexedValue(settings, key, panelId, fallback):
|
||||
for entry in settings.get_strv(key):
|
||||
prefix, _, value = entry.partition(":")
|
||||
if prefix == panelId:
|
||||
return value
|
||||
return fallback
|
||||
|
||||
|
||||
def _writePanelIndexedValue(settings, key, panelId, value):
|
||||
entries = settings.get_strv(key)
|
||||
updated = []
|
||||
found = False
|
||||
for entry in entries:
|
||||
prefix, _, _oldValue = entry.partition(":")
|
||||
if prefix == panelId:
|
||||
updated.append(f"{panelId}:{value}")
|
||||
found = True
|
||||
else:
|
||||
updated.append(entry)
|
||||
if not found:
|
||||
updated.append(f"{panelId}:{value}")
|
||||
settings.set_strv(key, updated)
|
||||
|
||||
|
||||
class AppletRow(Gtk.Box):
|
||||
def __init__(self, panelId, zone, position, appletId, instanceId, onToggle):
|
||||
super().__init__(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
|
||||
self.panelId = panelId
|
||||
self.zone = zone
|
||||
self.position = position
|
||||
self.appletId = appletId
|
||||
self.instanceId = instanceId
|
||||
|
||||
check = Gtk.CheckButton()
|
||||
check.set_active(True)
|
||||
check.connect("toggled", onToggle, self)
|
||||
self.pack_start(check, False, False, 0)
|
||||
self.pack_start(Gtk.Label(label=f"{appletId} ({zone})", xalign=0), True, True, 0)
|
||||
|
||||
|
||||
class PanelTweaksWindow(Gtk.Window):
|
||||
def __init__(self):
|
||||
super().__init__(title="Panel Tweaks")
|
||||
self.set_default_size(460, 420)
|
||||
self.set_border_width(10)
|
||||
self.settings = Gio.Settings.new(CINNAMON_SCHEMA)
|
||||
self.panelId = _panelsEnabledIds(self.settings)[0]
|
||||
|
||||
rootBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
|
||||
self.add(rootBox)
|
||||
|
||||
self.autohideSwitch = self._buildSwitchRow(
|
||||
rootBox, "Auto-hide panel", self._readAutohide(), self._onAutohideToggled,
|
||||
)
|
||||
self.editModeSwitch = self._buildSwitchRow(
|
||||
rootBox, "Edit mode (drag applets)", self.settings.get_boolean("panel-edit-mode"),
|
||||
self._onEditModeToggled,
|
||||
)
|
||||
|
||||
heightBox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
|
||||
heightBox.pack_start(Gtk.Label(label="Panel height"), False, False, 0)
|
||||
adjustment = Gtk.Adjustment(value=self._readHeight(), lower=20, upper=80, step_increment=1)
|
||||
self.heightScale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adjustment)
|
||||
self.heightScale.set_digits(0)
|
||||
self.heightScale.set_hexpand(True)
|
||||
self.heightScale.connect("value-changed", self._onHeightChanged)
|
||||
heightBox.pack_start(self.heightScale, True, True, 0)
|
||||
rootBox.pack_start(heightBox, False, False, 0)
|
||||
|
||||
rootBox.pack_start(Gtk.Separator(), False, False, 4)
|
||||
rootBox.pack_start(Gtk.Label(label="Applets on this panel", xalign=0), False, False, 0)
|
||||
|
||||
scroller = Gtk.ScrolledWindow()
|
||||
scroller.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
|
||||
self.appletsList = Gtk.ListBox()
|
||||
scroller.add(self.appletsList)
|
||||
rootBox.pack_start(scroller, True, True, 0)
|
||||
|
||||
self._reloadApplets()
|
||||
self.connect("destroy", Gtk.main_quit)
|
||||
|
||||
def _buildSwitchRow(self, rootBox, label, initialState, onToggled):
|
||||
row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
|
||||
row.pack_start(Gtk.Label(label=label, xalign=0), True, True, 0)
|
||||
switch = Gtk.Switch()
|
||||
switch.set_active(initialState)
|
||||
switch.connect("notify::active", onToggled)
|
||||
row.pack_start(switch, False, False, 0)
|
||||
rootBox.pack_start(row, False, False, 0)
|
||||
return switch
|
||||
|
||||
def _readAutohide(self):
|
||||
value = _readPanelIndexedValue(self.settings, "panels-autohide", self.panelId, "false")
|
||||
return value == "true"
|
||||
|
||||
def _readHeight(self):
|
||||
value = _readPanelIndexedValue(self.settings, "panels-height", self.panelId, "40")
|
||||
try:
|
||||
return int(value)
|
||||
except ValueError:
|
||||
return 40
|
||||
|
||||
def _onAutohideToggled(self, switch, _param):
|
||||
_writePanelIndexedValue(
|
||||
self.settings, "panels-autohide", self.panelId,
|
||||
"true" if switch.get_active() else "false",
|
||||
)
|
||||
|
||||
def _onEditModeToggled(self, switch, _param):
|
||||
self.settings.set_boolean("panel-edit-mode", switch.get_active())
|
||||
|
||||
def _onHeightChanged(self, scale):
|
||||
_writePanelIndexedValue(self.settings, "panels-height", self.panelId, str(int(scale.get_value())))
|
||||
|
||||
def _reloadApplets(self):
|
||||
for child in self.appletsList.get_children():
|
||||
self.appletsList.remove(child)
|
||||
self.enabledApplets = self.settings.get_strv("enabled-applets")
|
||||
for entry in self.enabledApplets:
|
||||
parts = entry.split(":")
|
||||
if len(parts) < 5 or parts[0] != f"panel{self.panelId}":
|
||||
continue
|
||||
_panel, zone, position, appletId, instanceId = parts[0], parts[1], parts[2], parts[3], parts[4]
|
||||
row = AppletRow(self.panelId, zone, position, appletId, instanceId, self._onAppletToggled)
|
||||
self.appletsList.add(row)
|
||||
self.appletsList.show_all()
|
||||
|
||||
def _onAppletToggled(self, check, row):
|
||||
entries = list(self.settings.get_strv("enabled-applets"))
|
||||
entry = f"panel{row.panelId}:{row.zone}:{row.position}:{row.appletId}:{row.instanceId}"
|
||||
if check.get_active():
|
||||
if entry not in entries:
|
||||
entries.append(entry)
|
||||
else:
|
||||
entries = [e for e in entries if e != entry]
|
||||
self.settings.set_strv("enabled-applets", entries)
|
||||
|
||||
|
||||
def main():
|
||||
window = PanelTweaksWindow()
|
||||
window.show_all()
|
||||
Gtk.main()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user