Table des matières

MOC: jamais trop petit!

Introduction

MOC est un lecteur musique en mode curses. Il est très simple et pratique et fait ce qu'on attend de lui.
Mais j'avais un petit soucis lors du redimensionnement automatique du terminal qui l'exécute par un gestionnaire de fenêtre, en deçà d'une certaine taille, il n'affiche plus rien que “…TERMINAL TOO SMALL…” alors qu'il y aurait raisonnablement la place. On va donc voir comment changer ça simplement.

Version Debian GNU/Linux: Wheezy / Version MOC: 2.5.0~alpha4

Mise en place de l'environnement de construction

Pour cela, nous allons récupérer les sources du paquet et ses dépendances, modifier le code et reconstruire le paquet.

Récupération des sources

On va chercher les sources sur les dépôts Debian (bien entendu les lignes deb-src de votre /etc/apt/sources.list doivent être actives).

apt-get source moc
cd moc-2.5.0~alpha4+svn20120224/debian

Récupération des dépendances de construction

Dans le fichier control apparaissent les build-deps, c'est-à-dire les paquets nécessaires à la construction (build) du programme MOC.
Debian étant magique, nous allons les installer toutes en 2 secondes:

apt-get build-dep moc

Modification du code

Adaptation de la taille générale

Dans le répertoire contenant le code source, nous allons éditer (ici j'utilise emacs) le fichier interface_elements.c :

emacs interface_elements.c

et nous allons chercher la ligne (2518 chez moi):

mw->too_small = iw->too_small = COLS < 59 || LINES < 7;

puis remplacer tout bêtement les valeurs par des valeurs moindres; un minimum de 30 colonnes sur 5 lignes permet un affichage restreint mais raisonnable:

mw->too_small = iw->too_small = COLS < 30 || LINES < 5;

Adaptation du placement des éléments internes

Nous allons maintenant modifier les valeurs mini de placement de certains éléments:

mixer_bar:
Recherchez l'expression COLS - 37 (ligne 2761, 3076 et 3434 chez moi) et remplacez chaque occurence par COLS - 27.

mixer_frame:
Recherchez l'expression COLS - 38 (ligne 3384 chez moi) et remplacez la par COLS - 28.

Enregistrez vos modifications et quittez.

Construction du paquet

Nous avons modifié un fichier du code source et Debian, loin d'être bête, le sait! Il nous faut donc commiter nos changements avant construction:

dpkg-source --commit

Donnez un nom à votre commit, du style term_too_small_fix.

Puis nous allons construire, attention les yeux:

dpkg-buildpackage

Fixez attentivement votre écran et regardez la magie s'opérer 8-)

Ding, ☎, c'est prêt, votre paquet est disponible dans le répertoire supérieur:

cd ..

dpkg a également reconstruit le paquet moc-ffmpeg-plugin dont le code était inclus dans le paquet source, il n'est pas nécessaire de le réinstaller mais ça ne fait jamais de mal non plus.

Installation du nouveau paquet

Nous allons l'installer ainsi que le plugin, cela agira comme une mise à jour:

dpkg -i moc-ffmpeg-plugin_2.5.0~alpha4+svn20120224-1_amd64.deb
dpkg -i moc_2.5.0~alpha4+svn20120224-1_amd64.deb

Il peut être intéressant de “geler” cette version du paquet afin qu'elle ne soit pas écrasée lors d'une mise à jour:

apt-mark hold moc

Merci à captnfab pour l'astuce.

Conclusion

MOC, c'est cool!

Bonus track

Voici en bonus, le patch pour application cutanée directe:

--- interface_elements.c        2012-02-24 05:24:21.000000000 -0400
+++ ../tmp/moc-2.5.0~alpha4+svn20120224/interface_elements.c    2014-11-19 21:47:34.000000000 -0400
@@ -2515,7 +2515,7 @@
 /* End the program if the terminal is too small. */
 static void check_term_size (struct main_win *mw, struct info_win *iw)
 {
-       mw->too_small = iw->too_small = COLS < 59 || LINES < 7;
+       mw->too_small = iw->too_small = COLS < 30 || LINES < 5;
 }
 
 /* Update the title with the current fill. */
@@ -2758,7 +2758,7 @@
 
        bar_set_title (&w->mixer_bar, name);
        if (!w->in_entry && !w->too_small) {
-               bar_draw (&w->mixer_bar, w->win, COLS - 37, 0);
+               bar_draw (&w->mixer_bar, w->win, COLS - 27, 0);
                info_win_update_curs (w);
        }
 }
@@ -3073,7 +3073,7 @@
 
        bar_set_fill (&w->mixer_bar, (double) value);
        if (!w->in_entry && !w->too_small)
-               bar_draw (&w->mixer_bar, w->win, COLS - 37, 0);
+               bar_draw (&w->mixer_bar, w->win, COLS - 27, 0);
 }
 
 /* Draw a switch that is turned on or off in form of [TITLE]. */
@@ -3381,7 +3381,7 @@
                     		lines.ltee, lines.rtee, lines.llcorn, lines.lrcorn);
 
		/* mixer frame */
-               mvwaddch (w->win, 0, COLS - 38, lines.rtee);
+               mvwaddch (w->win, 0, COLS - 28, lines.rtee);
		mvwaddch (w->win, 0, COLS - 17, lines.ltee);
 
		/* playlist time frame */
@@ -3431,7 +3431,7 @@
		if (w->in_entry)
        		entry_draw (&w->entry, w->win, 1, 0);
		else
-                       bar_draw (&w->mixer_bar, w->win, COLS - 37, 0);
+                       bar_draw (&w->mixer_bar, w->win, COLS - 27, 0);
 
		bar_draw (&w->time_bar, w->win, 2, 3);
	}