web-dev-qa-db-fra.com

Modifier le menu de l'indicateur de son pour masquer les commandes du lecteur inactif ou le supprimer après la fermeture

J'aime le menu des indicateurs de Spotify qui s’agrandit chaque fois que l’application est ouverte. Je n'aime pas Rhythmbox qui affiche tous les boutons tout le temps.

J'aimerais masquer les boutons Rew/Play/FF de Rhythmbox lorsque l'application est inactive.

Merci de votre aide.

5
Diego

Indicateur sonore, sans lecteur actif (uniquement pour les lanceurs, sans boutons de commande)

Sound indicator, with no active player (launchers only, no control buttons)

Indicateur sonore, avec lecteur actif (boutons de commande complets)

Sound indicator, with active player (full control buttons)


15h10

Avoir les mêmes étapes de construction que 14.04.

  • Retirer le lecteur du menu après la fermeture

    Modifiez le menu src/service.vala pour desktop en HIDE_INACTIVE_PLAYERS.

    this.menus.insert ("desktop", new SoundMenu ("indicator.desktop-settings", SoundMenu.DisplayFlags.SHOW_MUTE|SoundMenu.DisplayFlags.HIDE_INACTIVE_PLAYERS));
    

    Et modifiez src/sound-menu.vala pour que la fonction add_player supprime remove_player_section si elle n’est pas en cours d’exécution et que le masquage inactif est défini.

    public void add_player (MediaPlayer player) {
        if (this.notify_handlers.contains (player))
            return;
    
        if (player.is_running || !this.hide_inactive)
                this.insert_player_section (player);
            else         
                this.remove_player_section (player);
        this.update_playlists (player);
    
  • Masquer les commandes du lecteur (Prev/Play/Next) du menu après la fermeture, ne garder que son lanceur

    Identique à 14.04, pas de changement.


14.04

  1. Télécharger les dépendances de construction et le source

    Sudo apt-get build-dep indicator-sound
    apt-get source indicator-sound
    
  2. Choisissez le comportement que vous voulez:

    • Retirer le lecteur du menu après la fermeture

      Modifiez src/service.vala pour le menu desktop.

      this.menus.insert ("desktop", new SoundMenu ("indicator.desktop-settings", SoundMenu.DisplayFlags.SHOW_MUTE | SoundMenu.DisplayFlags.HIDE_INACTIVE_PLAYERS));
      

      J'ai ajouté | SoundMenu.DisplayFlags.HIDE_INACTIVE_PLAYERS, Vous pouvez supprimer SoundMenu.DisplayFlags.SHOW_MUTE | si vous souhaitez masquer le contrôle du volume avec des lecteurs en mode sourdine.

    • Masquer les commandes du lecteur (Prev/Play/Next) du menu après la fermeture, ne garder que son lanceur

      Modifier src/sound-menu.vala

      1. Ajouter un nouvel indicateur HIDE_INACTIVE_PLAYERS_CONTROLS = 128 avec , à la fin de la ligne précédente.

        public enum DisplayFlags {
            NONE = 0,
            SHOW_MUTE = 1,
            HIDE_INACTIVE_PLAYERS = 2,
            HIDE_PLAYERS = 4,
            HIDE_INACTIVE_PLAYERS_CONTROLS = 128
        }
        
      2. Ajouter la variable bool hide_inactive_controls; pour conserver le statut de l'indicateur

        bool hide_inactive;
        bool hide_inactive_controls;
        bool hide_players = false;
        
      3. Ajouter la ligne this.hide_inactive_controls =.... passer le paramètre indicateur de constructeur SoundMenu à sa variable.

        this.hide_inactive = (flags & DisplayFlags.HIDE_INACTIVE_PLAYERS) != 0;
        this.hide_inactive_controls = (flags & DisplayFlags.HIDE_INACTIVE_PLAYERS_CONTROLS) != 0;
        this.notify_handlers = new HashTable<MediaPlayer, ulong> (direct_hash, direct_equal);
        
      4. Ajoutez if (player.is_running || !this.hide_inactive_controls) { et }. pour envelopper les instructions qui créent (prev/play/next) dans un élément de menu. Ainsi, ils ne sont pas créés uniquement si le joueur est en cours d’exécution ou si le drapeau est inactif.

        if (player.is_running || !this.hide_inactive_controls) {
            var playback_item = new MenuItem (null, null);
            playback_item.set_attribute ("x-canonical-type", "s", "com.canonical.unity.playback-item");
            playback_item.set_attribute ("x-canonical-play-action", "s", "indicator.play." + player.id);
            playback_item.set_attribute ("x-canonical-next-action", "s", "indicator.next." + player.id);
            playback_item.set_attribute ("x-canonical-previous-action", "s", "indicator.previous." + player.id);
            section.append_item (playback_item);
        }
        
      5. Ajoutez if (this.hide_inactive_controls) { au prochain }. Pour forcer la récréation de la section du menu du lecteur lorsque le joueur is-running change de statut.

        var handler_id = player.notify["is-running"].connect ( () => {
            if (this.hide_inactive) {
                if (player.is_running) {
                    this.insert_player_section (player);
                }
                else {
                    this.remove_player_section (player);
                }
            }
            if (this.hide_inactive_controls) {
                this.remove_player_section (player);
                this.insert_player_section (player);
            }
            this.update_playlists (player);
        });
        
      6. Enfin, modifiez src/service.vala. Ajoutez notre nouveau drapeau créé | SoundMenu.DisplayFlags.HIDE_INACTIVE_PLAYERS_CONTROLS au menu desktop.

        this.menus.insert ("desktop", new SoundMenu ("indicator.desktop-settings", SoundMenu.DisplayFlags.SHOW_MUTE | SoundMenu.DisplayFlags.HIDE_INACTIVE_PLAYERS_CONTROLS));
        
  3. Construire et installer

    cd indicator-sound-12.10.2+14.04.20140313/
    mkdir build
    cd build/
    cmake ..
    make
    Sudo make install
    

Maintenant, les joueurs vont disparaître après les avoir fermés.


12.04

  1. Télécharger les dépendances de construction et le source

    Sudo apt-get build-dep indicator-sound
    apt-get source indicator-sound
    
  2. Modifiez src/player-controller.vala, remplacez "rhythmbox.desktop" par "xrhythmbox.desktop" dans les deux occurrences. (juste un nom différent)

  3. Construire et installer

    cd indicator-sound-0.8.5.0/
    ./configure
    make
    make install
    

Remarque: C'était une astuce, la bonne façon peut être:

  • Remplacer

      this.custom_items[widget_order.TRANSPORT].property_set_bool (MENUITEM_PROP_VISIBLE,
                                                              this.app_info.get_id() == "rhythmbox.desktop"); 
    

    avec

      this.custom_items[widget_order.TRANSPORT].property_set_bool (MENUITEM_PROP_VISIBLE,
                                                              false); 
    
  • et

    if (this.app_info.get_id() == "rhythmbox.desktop"){
      TransportMenuitem transport = this.custom_items[widget_order.TRANSPORT] as TransportMenuitem;
      transport.handle_cached_action();
    }
    else{
      this.custom_items[widget_order.TRANSPORT].property_set_bool (MENUITEM_PROP_VISIBLE,
                                                               true);         
    }
    

    avec

    this.custom_items[widget_order.TRANSPORT].property_set_bool (MENUITEM_PROP_VISIBLE,
                                                               true);
    
4
user.dz