web-dev-qa-db-fra.com

Pourquoi un script bash-zenity a-t-il ce titre sur Unity Panel et cette icône sur Unity Launcher?

J'ai ce petit script bash qui aide à utiliser Infinality les options de rendu des polices via une fenêtre plus conviviale Zenity: - http://gnomefiles.org/content/show.php/Infinality+Style+Changer?content=161984

Mais chaque fois que je le lance, j'ai ce titre "Color Picker" sur Unity Panel avec l'icône affectée à l'utilitaire "Color Picker".

Je me demande pourquoi et comment cela se produit et comment je peux le changer?

enter image description here

#!/bin/bash
# A simple script to provide a basic, zenity-based GUI to change Infinality Style.
# v.1.2
#
infinality_current=`cat /etc/profile.d/infinality-settings.sh | grep "USE_STYLE=" | awk -F'"' '{print $2}'`
Sudo_password="$( gksudo --print-pass --message 'Provide permission to make system changes: Enter your password to start or press Cancel to quit.' -- : 2>/dev/null )"
# Check for null entry or cancellation.
if [[ ${?} != 0 || -z ${Sudo_password} ]]
then
# Add a zenity message here if you want.
exit 4
fi
# Check that the password is valid.
if ! Sudo -kSp '' [ 1 ] <<<"${Sudo_password}" 2>/dev/null
then
# Add a zenity message here if you want.
exit 4
fi
#
menu(){
im="zenity --width=500 --height=490 --list --radiolist --title=\"Change Infinality Style\" --text=\"Current <i>Infinality Style</i> is\: <b>$infinality_current</b>\n✔ To <i>change</i> it, select any other option below and press <b>OK</b>\n✘ To <i>quit without changing</i>, press <b>Cancel</b>\" "
im=$im" --column=\" \" --column \"Options\" --column \"Description\" "
im=$im"FALSE \"DEFAULT\" \"Use default settings - a compromise that should please most people\" "
im=$im"FALSE \"OSX\" \"Simulate OSX rendering\" "
im=$im"FALSE \"IPAD\" \"Simulate iPad rendering\" "
im=$im"FALSE \"UBUNTU\" \"Simulate Ubuntu rendering\" "
im=$im"FALSE \"LINUX\" \"Generic Linux style - no snapping or certain other tweaks\" "
im=$im"FALSE \"WINDOWS\" \"Simulate Windows rendering\" "
im=$im"FALSE \"WIN7\" \"Simulate Windows 7 rendering with normal glyphs\" "
im=$im"FALSE \"WINLIGHT\" \"Simulate Windows 7 rendering with lighter glyphs\" "
im=$im"FALSE \"Vanilla\" \"Just subpixel hinting\" "
im=$im"FALSE \"CLASSIC\" \"Infinality rendering circa 2010 - No snapping.\" "
im=$im"FALSE \"Nudge\" \"Infinality - Classic with lightly stem snapping and tweaks\" "
im=$im"FALSE \"Push\" \"Infinality - Classic with medium stem snapping and tweaks\" "
im=$im"FALSE \"SHOVE\" \"Infinality - Full stem snapping and tweaks without sharpening\" "
im=$im"FALSE \"SHARPENED\" \"Infinality - Full stem snapping, tweaks, and Windows-style sharpening\" "
im=$im"FALSE \"INFINALITY\" \"Infinality - Standard\" "
im=$im"FALSE \"DISABLED\" \"Act without extra infinality enhancements - just subpixel hinting\" "
}
#
option(){
choice=`echo $im | sh -`
#
if echo $choice | grep "DEFAULT" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"DEFAULT\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "OSX" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"OSX\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "IPAD" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"IPAD\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "UBUNTU" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"UBUNTU\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "LINUX" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"LINUX\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "WINDOWS" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"WINDOWS\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "WIN7" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"WINDOWS7\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "WINLIGHT" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"WINDOWS7LIGHT\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "Vanilla" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"Vanilla\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "CLASSIC" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"CLASSIC\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "Nudge" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"Nudge\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "Push" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"Push\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "SHOVE" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"SHOVE\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "SHARPENED" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"SHARPENED\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "INFINALITY" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"INFINALITY\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
if echo $choice | grep "DISABLED" > /dev/null;
then
Sudo -Sp '' sed -i "s/USE_STYLE=\"${infinality_current}\"/USE_STYLE=\"DISABLED\"/g" '/etc/profile.d/infinality-settings.sh' <<<"${Sudo_password}"
fi
#
}
#
menu
option
#
if test ${#choice} -gt 0; then
echo "Operation completed"
fi
#
exit 0

Le fichier .desktop "/usr/local/share/applications/InfinalitySettings.desktop" contient le texte suivant:

[Desktop Entry]
Name=Infinality Style Changer
GenericName=Infinality Settings
Exec=/usr/local/bin/InfinalitySettings
Icon=gnome-settings-font
Terminal=false
Type=Application
Categories=GTK;GNOME;System;Settings;Fonts;

Et voici le contenu de "/usr/share/applications/zenity-color-selection.desktop" qui a ce titre et cette icône:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Categories=Graphics;2DGraphics;RasterGraphics;GTK;
Name=Color Picker
GenericName=Color Picker
Comment=Pick a color from palette or any color on your screen
NotShowIn=KDE;
Icon=preferences-color
#Icon=applications-graphics
Exec=zenity --color-selection --show-palette
Terminal=false
3
Sadi

Je pense que le problème est que les deux scripts Zenity utilisent la même classe de gestionnaire de fenêtres. Vous pouvez le vérifier en exécutant xprop et en cliquant sur chaque fenêtre, respectivement.

Si vous fournissez Zenity avec un WMCLASS, vous pouvez vous assurer que la boîte de dialogue recevra toujours la bonne .desktop lanceur.

Voici les étapes que vous devrez suivre:

  1. Définissez une classe de gestionnaire de fenêtres pour la boîte de dialogue en ajoutant --class=<WMCLASS> à la ligne de commande, par exemple:

    zenity --class=InfinalitySettings --width=500 --height=490 [...]
    

    Vous pouvez choisir un nom arbitraire tant qu'il est unique et qu'il n'est utilisé par aucune autre application/script. Je ne sais pas si les caractères spéciaux fonctionnent, mais par prudence, je m'en tiendrai uniquement aux caractères alphanumériques.

  2. Ajoutez la ligne suivante au .desktop lanceur:

    StartupWMClass=InfinalitySettings
    

Voici comment vous pouvez implémenter cela dans votre script (j'ai également modifié quelques autres choses):

#!/bin/bash
# A simple script to provide a basic, zenity-based GUI to change Infinality Style.
# v.1.3

# tip: use http://www.shellcheck.net/ to avoid common problems

## variables

InfinalityConfig="/etc/profile.d/infinality-settings.sh"
InfinalityCurrent="$(cat "$InfinalityConfig" | grep "USE_STYLE=" | awk -F\" '{print $2}')" 
#                  ↑ "$()" is safer than ``

## dialog

# assign descriptions and other dialog elements
# makes the script easier to read

WmClass="InfinalitySettings"


TxtMain="Current <i>Infinality Style</i> is\: <b>$InfinalityCurrent</b>
✔ To <i>change</i> it, select any other option below and press <b>OK</b>
✘ To <i>quit without changing</i>, press <b>Cancel</b>"

Title="Change Infinality Style"

## functions

select_style(){
    Choice="$(zenity --class="$WmClass" --width=500 --height=490 --list --radiolist \
    --title="$Title" --text="$TxtMain" \
    --column="" --column="Options" --column="Descriptions" \
    "FALSE" "DEFAULT" "Use default settings - a compromise that should please most people" \
    "FALSE" "OSX" "Simulate OSX rendering" \
    "FALSE" "IPAD" "Simulate iPad rendering" \
    "FALSE" "UBUNTU" "Simulate Ubuntu rendering" \
    "FALSE" "LINUX" "Generic Linux style - no snapping or certain other tweaks" \
    "FALSE" "WINDOWS" "Simulate Windows rendering" \
    "FALSE" "WIN7" "Simulate Windows 7 rendering with normal glyphs" \
    "FALSE" "WINLIGHT" "Simulate Windows 7 rendering with lighter glyphs" \
    "FALSE" "Vanilla" "Just subpixel hinting" \
    "FALSE" "CLASSIC" "Infinality rendering circa 2010 - No snapping." \
    "FALSE" "Nudge" "Infinality - Classic with lightly stem snapping and tweaks" \
    "FALSE" "Push" "Infinality - Classic with medium stem snapping and tweaks" \
    "FALSE" "SHOVE" "Infinality - Full stem snapping and tweaks without sharpening" \
    "FALSE" "SHARPENED" "Infinality - Full stem snapping, tweaks, and Windows-style sharpening" \
    "FALSE" "INFINALITY" "Infinality - Standard" \
    "FALSE" "DISABLED" "Act without extra infinality enhancements - just subpixel hinting" \
    )"
    RET_YAD="$?"                # get exit code

    if [[ "$RET_YAD" != "0" ]]  # if exit code != 0 (e.g. user closed window, hit 'cancel')
      then
          echo "Aborted."
          exit 1
    Elif [[ -z "$Choice" ]]
      then
          echo "No option selected. Exiting."
          exit 0
    fi

    echo "User chose: $Choice"
}

set_style(){
    pkexec --user root sed -i "s/USE_STYLE=\"$InfinalityCurrent\"/USE_STYLE=\"$Choice\"/g"\
     "$InfinalityConfig"
    RET_PKEXEC="$?"

    if [[ "$RET_PKEXEC" != "0" ]]
      then
          exit 1
          # Add a zenity message here if you want.
      else
          exit 0
    fi
}

## main

select_style
set_style
4
Glutanimate

C'est vraiment étrange. Sans savoir où vous avez obtenu le script, je devrais deviner. Il est possible que l'auteur ait simplement utilisé le fichier de bureau pour gcolorpicker comme modèle pour le sien, oubliant simplement de changer le GenericName et l'icône. Mais c'est de la pure spéculation.

Si vous avez installé le script globalement, vous pouvez rechercher le fichier de bureau dans/usr/share/applications. Il devrait s'appeler quelque chose comme "infidelity-settings.desktop". Si mon hypothèse est correcte, ce fichier doit contenir une ligne comme celle-ci: "GenericName = Color Picker" et une autre ligne ressemblant à "Icon = gcolorpicker".

Si vous avez installé le fichier uniquement pour votre utilisateur, vous devriez trouver ce fichier de bureau dans /home/yourusername/.local/share/applications/

1