Cinnamon 6.4の変更

Manjaro Cinnamonの公式イメージ画像
去年の12月はじめ頃だったか,ManjaroのCinnamonが6.4系にアップデートされて大きく変わった。
個人的に気になったのが音量調整の段階が5%づつに固定されてしまった点だ。この5%という値はソースの中にハードコードされていて変更できないらしい。
そこで該当するパッケージ(cinnamon-settings-daemon)を改変してインストールしなおすことにした。環境はManjaro Cinnamonだが,手順はすべてのArch系ディストリビューションに適用できると思う。
インストール手順
手順は以下の通り
ソースファイルを入手,改変
PKGBUILDを入手,改変
パッケージのチェックサムを改変
ビルドしてインストール
CinnamonはLinux Mintで開発されているデスクトップ環境のため,見つかる情報のほぼすべてがMintのもので,そのままArchに適用することはできない。ただしパッケージのソースコードを修正してからビルドして再インストールするという手順に変わりはない。
ArchのパッケージをビルドするときはPKGBUILDというbashスクリプトが使われる。PKGBUILDにはソースファイルのありかや依存情報などインストールに必要な情報が含まれていて,PKGBUILDさえどうにかすればなんでもpacmanで管理できるというのがArchのいいところだと思う。
ソースファイルの入手と改変
パッケージ詳細ページからアップストリームのリポジトリはすぐに見つけられる。
あとから細々したファイルが増えるので空のディレクトリ内に移動してクローンする。
mkdir csd
cd csd
git clone https://github.com/linuxmint/cinnamon-settings-daemon
改変するのはcinnamon-settings-daemon > plugins > media-keys
の中にあるcsd-media-keys-manager.c
というファイル。
この中のVOLUME_STEP
を5から任意の値に変更する。今回は以前までのデフォルトの1にした。この程度の変更ならsedを使ってsed -i -e "s/VOLUME_STEP 5/VOLUME_STEP 1/" cinnamon-settings-daemon/plugins/media-keys/csd-media-keys-manager.c
としてもいい。
#define VOLUME_STEP 1
保存して終了。
ここでパッケージをtar.gz形式で圧縮しておく。
tar -czvf cinnamon-settings-daemon.tar.gz cinnamon-settings-daemon
PKGBUILDの入手と改変
PKGBUILDもパッケージ詳細ページのSource Filesというリンクから探すことができる。

wget "https://gitlab.archlinux.org/archlinux/packaging/packages/cinnamon-settings-daemon/-/raw/main/PKGBUILD"
wgetでダウンロードできたらsource
とbuild()
のディレクトリ名を以下のように書き換える。
optdepends=('cinnamon-translations: i18n')
makedepends=(meson samurai xf86-input-wacom glib2-devel)
options=(!emptydirs)
# source=(${url}/archive/${pkgver}/${pkgname}-${pkgver}.tar.gz)
source=(${pkgname}.tar.gz)
sha512sums=('d21d8e1fa80f54b7bc5bde9e42c939e99247df6cb1c1f00ec0de46f938c476bf3633647fa8a1d9962498d62aecd7a624826f97c145d9bd05aaf3f82180a95a5a')
b2sums=('1cb9b49c04f03f3c9d8357e3f9570aecd41bfc4abe5c9fa84410d33566906e4ee8ba44947a98958633ca423b394efc07c0dd670206b332f0efcaf3839e682830')
build() {
# arch-meson --libexecdir=lib/${pkgname} ${pkgname}-${pkgver} build
arch-meson --libexecdir=lib/${pkgname} ${pkgname} build
samu -C build
}
ここで一旦変更内容を保存しておく。
チェックサムの改変
makepkg -g
で新しいパッケージのチェックサムを出力する。
makepkg -g
# ==> Retrieving sources...
# -> Found cinnamon-settings-daemon.tar.gz
# ==> Generating checksums for source files...
# sha512sums=('3f1e746292ff3e566df47ed06920fc46391e0ec845c936b140ece26d45b1c72f30cf9996d3598928fe7ce760d789d8156bc3d02e2a4c72706cf4de6a819e4734')
# b2sums=('88acc19c413989ded1f02d214080156ed24ebde118078be60f1e911067799f973338eca6eb31ac9be0cb36c2ed85fdb85ba2ea2a07e19c9e0c37c44dfd0d414a')
このsha512sums
とb2sums
の値をターミナルからPKGBUILDにコピペする。
あるいは手間はかかるがmakepkg -g >> checksums.new
として出力し,grep "sha512sums=" PKGBUILD >> checksums.old && grep "b2sums=" PKGBUILD >> checksums.old
で取り出した古いチェックサムとdiff --unified checksums.old checksums.new > PKGBUILD.patch
というふうにパッチを作ってpatch < PKGBUILD.patch
としてPKGBUILDに適用するという手もある。(もう少しまともな方法をご存じの方は教えてください。)
ArchWikiはpacman-contrib
に含まれるupdpkgsums
というチェックサムを更新できる便利なツールを使えと案内しているが,以下のようにパッケージにCR+LFが含まれているとエラーが出てしまった。
updpkgsums cinnamon-settings-daemon.tar.gz
# /usr/bin/makepkg: line 1255: warning: command substitution: ignored null byte in input
# ==> ERROR: cinnamon-settings-daemon.tar.gz contains CRLF characters and cannot be sourced.
# ==> ERROR: Failed to generate new checksums
grep
するとたしかにCR+LFが含まれているらしいことはわかった。
grep -lzUP '\r\n' ./*
# => cinnamon-settings-daemon.tar.gz
ただしソースファイルには見当たらないし,sedで無理やり除去してもビルドできないしで今回は対応を諦めた。
このパッケージ以外でも同様のエラーが発生することは確認したので原因はこんど暇なときに調べます。初級Linuxerへの道は遠い。
ビルドしてインストール
PKGBUILDに新しいチェックサムを適用したらmakepkg -si
でビルドしてインストールできる。
makepkg -si
以下のようなエラーが出たらbuild()
のディレクトリ名が${pkgname}-${pkgver}
のままになっておりgit clone
したディレクトリ名と異なっているので${pkgname}
だけになるようPKGBUILDを修正する。
ERROR: Neither source directory 'cinnamon-settings-daemon-6.4.3' nor build directory 'build' contain a build file meson.build.
==> ERROR: A failure occurred in build().
Aborting...
OSDに音量のパーセンテージ表示が出るようにする。

新しいCinnamonではウィンドウの手前に出るOSDウィンドウから音量のパーセンテージ表示がなくなった。地味に困るのでついでに直す。
sudo cp /usr/share/cinnamon/js/ui/osdWindow.js /usr/share/cinnamon/js/ui/osdWindow.orig
sudo nano /usr/share/cinnamon/js/ui/osdWindow.js
if (this._level.visible) {
の次の行にthis.setLabel(value.toString() + ' %');
を挿入する。
setLevel(value) {
this._level.visible = value != null;
if (this._level.visible) {
/* ↓を挿入 */
this.setLabel(value.toString() + ' %');
/* ↑を挿入 */
= value / 100;
value if (this.visible)
this._level.ease_property('value', value, {
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
duration: LEVEL_ANIMATION_TIME,
;
})else
this._level.value = value;
} }
Cinnamonを再起動する。
cinnamon-dbus-command RestartCinnamon 1

これでOK