Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1951 Le 10/05/2018, à 01:27

zozo_serieux

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Merci de vos réponses! Je farfouille là-dedans et je sélectionne en fonction de la façon de présenter comme je suis grand débutant de la chose.

J'ai déjà fait une étape basique mais qui marche (fierté de mon caca).

#! /bin/bash
acpi -i >> monacpi.txt
if  grep -q 'Battery 0: Discharging,' monacpi.txt
then
        telinit 0
fi
exit 0

 

Bon, comme il y a bien à chaque fois le message "Battery 0: Discharging," dans le retour d'acpi -i mon ordi s'est bien éteint. C'est que déjà
Il me reste à apprendre:
   - comment faire tourner ce script en tâche de fond (je ne sais pas si je peux le dire comme ça) sans qu'il s'arrête une fois que je l'ai lancé.
   - à lui faire faire vérification toutes les 2 ou 4mn par exemple
   - à faire éteindre si ça affiche mettons "Battery 0: Discharging, 10%" ou tout nombre inférieur à 10 devant cd %

Merci tout plein ! big_smile Je suis comme un gosse même si je suis encore loin du compte!

Dernière modification par zozo_serieux (Le 10/05/2018, à 02:09)

Hors ligne

#1952 Le 10/05/2018, à 07:45

enebre

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Il y a un script ici

LukePerp a écrit :

Mon problème est rare, mais c'est finalement un bug, soit de Ubuntu, soit une mauvaise prise en charge de l'hardware.
Alors j'ai cherché une solution pour mettre en veille mon labtop lorsque la batterie est faible est j'ai trouvé la solution suivante qui fonctionne dans mon cas :-)

C'est un script à exécuter avec cron, toutes les minutes, qui va vérifier le niveau de la batterie et mettre en veille Linux lorsqu'elle sera faible. Je l'ai modifié pour mes besoins. On remplacer suspend par hibernate ou poweroff


à adapter pour la temporisation et pour la fonction poweroff

#!/bin/bash

# Notifies the user if the battery is low then poweroff when critical.
#
# First ensure that you can hibernate non-interactively from cron without sudo :
# Execute : sudo visudo -f /etc/sudoers.d/custom
# Enter the following into the buffer and saved it :
#     #Enable hibernation from cron
#     YourUserLogin ALL=NOPASSWD: /bin/systemctl suspend
#
# Then, schedule it via cron :
#    chmod +x auto-poweroff.sh
#    sudo crontab -e
#    Add at the enf to execute every minute :
#    * * * * * /path/to/auto-poweroff.sh.
#
# Tested succesfull on Ubuntu Gnome 16.04 x64 with ASUS computer.
# This script is supposed to be called from a cron job.
# If you change this script's name/path, don't forget to update it in crontab.
# Credit to Anmol-Singh-Jaggi on GitHub

# Required for notify-send to work
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

# BAT0 with Ubuntu 16.04
level=$(cat /sys/class/power_supply/BAT0/capacity)
status=$(cat /sys/class/power_supply/BAT0/status)

# Exit if not discharging
if [ "${status}" != "Discharging" ]; then
  exit 0
fi


# Percentage at which to show low-battery notification
low_notif_percentage=14
# Percentage at which to show critical-battery notification
critical_notif_percentage=11
# Percentage at which to power-off
action_percentage=8


if [ "${level}" -le ${action_percentage} ]; then  
  notify-send "Warning, Linux will be poweroff because battery is too low: ${level}%" -t 15
  sleep 5
  # Sudo is required when running from cron
  sudo systemctl suspend
  exit 0
fi

if [ "${level}" -le ${critical_notif_percentage} ]; then
  notify-send "Battery critical: ${level}%" -t 15
  exit 0
fi

if [ "${level}" -le ${low_notif_percentage} ]; then
  notify-send "Battery low: $level%" -t 15
  exit 0
fi

Dernière modification par enebre (Le 10/05/2018, à 07:53)

Hors ligne

#1953 Le 31/01/2021, à 13:35

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour à ceux qui lisent big_smile

Est-ce que ça intéresse une petite interface graphique pour Devil's Pie - Ubuntu Wiki ?

Car j'en ai scrpitée une en bash avec les outils wmctrl et xdotool pour la récupération de données + yad et zenity pour l'interface graphique.

Vli, vlà, vlou

Je vais vendre mon truc un peu quad même :
Quelques screenshots :

Re vli, vlà, vlou, ça parle de soi-même non ?

Ha oui, j'oubliais, un exemple de fichier créé par ce script :  "Xfce4-terminal.ds"

if (and (is (window_class) "Xfce4-terminal") (is (application_name) "Terminal Xfce"))
	(begin

		(set_workspace 1)

		(if (contains (window_name) "Tawal $")
			(geometry "1198x809+0+67"))

		(if (is (window_name) "Préférences")
			(geometry "752x607+228+187"))

		(if (is (window_name) "Choisir la police du Terminal")
			(geometry "424x480+397+269"))

		(if (contains (window_name) "Choisir la couleur")
			(geometry "488x277+365+371"))

		(if (is (window_name) "Trouver")
			(geometry "400x192+404+394"))

		(if (is (window_name) "Enregistrer le contenu…")
			(geometry "742x380+233+300"))

		(if (is (window_name) "Documentation en ligne")
			(geometry "520x247+344+367"))

		(if (is (window_name) "À propos de xfce4-terminal")
			(geometry "424x346+392+317"))

		(if (is (window_name) "Attention")
			(geometry "486x151+361+398"))

    )
)

Donc si ça intéresse ...
En tout cas, je me le garde bien au chaud big_smile

À plus ...

Edit : Devil's Pie IGEL = Devil's Pie Interface Graphique Extra Légère lol
Edit2 : Petite correction hi hi


Modération : merci d'utiliser des images de petite taille (300x300) ou des miniatures pointant sur ces images (Des hébergeurs comme Toile Libre ou TDCT'Pix le permettent).

Dernière modification par Tawal (Le 31/01/2021, à 15:03)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1954 Le 31/01/2021, à 15:04

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Corrigé
Merci prof wink big_smile
N'hésite pas si tu en vois d'autres ...

Dernière modification par Tawal (Le 31/01/2021, à 15:05)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1955 Le 31/01/2021, à 15:05

lynn

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour,

Christophe C propose une interface pour devilspie disponible dans ce post et qui est parfaitement fonctionnelle. Il y a beaucoup de différences avec celle que tu proposes ?


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#1956 Le 31/01/2021, à 15:27

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Salut,

Je connais celle de Christophe C. Je l'ai essayée.

Alors oui, il y a de la différence et je dirais pas des moindres.
Et pourtant la mienne est loin d'être aboutie dans le sens où je n'exploite pas toutes les possibilités de devilspie (loin de là).

Ce que fait celle de Christophe C :
- Elle a la reconnaissance que du nom d'application et du titre de la fenêtre, pas de la classe d'application. Peut être problématique
- Tu choisis le Bureau
- Le placement de la fenêtre ne se fait qu'à des positions prédéfinies (bottom-left, top-center ...)
- Tu dimensionnes les fenêtres avec des jauges à %, pas facile de savoir le rendu ( pas de prévisualisation)
- Ensuite, tu n'agis que sur une seule fenêtre de l'application. Là, c'est problématique !

Ce que fait la mienne :
- Elle reconnaît, la classe d'application en plus, utile car des fois des fenêtres peuvent avoir le même nom d'application mais pas la même classe. si si !
- Elle permet le positionnement et le dimensionnement directement sur la fenêtre concernée (tu l'arranges et la bouge à la souris en gros)
- Elle laisse le choix de la condition de "match" entre "is" et "contains". Très utile pour les titres de fenêtres avec des titres changeants comme un gestionnaire de fichiers et bien d'autres applications encore ...
- Elle permet le parcours de toutes les fenêtres de l'application. Et donc leur réglage.
- Elle permet aussi de configurer plusieurs applications d'un seul trait (faut bien s'y prendre et rester concentré)
- Elle crée un fichier par classe d'application trouvées lors du prospect.
- Elle compile plus d'une règle par application en un seul fichier (1 par appli)
Vli, vlà, vlou en gros

Après j'avoue, elle n'est pas trop ergonomique/intuitive.
Il faudrait que je fasse un "Lisez-moi.txt" plus complet que le How To Do embarqué.

Au plaisir.

Edit : J'ai rien compris aux listes ici big_smile
Edit: mise en forme à la mano ...

Dernière modification par Tawal (Le 31/01/2021, à 15:36)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1957 Le 31/01/2021, à 15:42

lynn

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bon et bien, il n'y a plus qu'à découvrir ton projet. smile


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#1958 Le 31/01/2021, à 15:49

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Re,

Voilà un autre fichier créé avec ma GUI à l'instant, j'ai fait n'importe quoi et du coup ça marche pas (on ne peut séparer [mettre sur différents bureaux] certaines fenêtres de leur fenêtre mère.
Mais, c'est pour montrer les capacités de création.
Regarde aussi les postions et dimensions un peu loufoques.

(if (and (is (window_class) "Sound-juicer") (is (application_name) "Sound Juicer"))
	(begin

		(set_workspace 2)

		(if (is (window_name) "Sound Juicer")
			(geometry "503x694+825+98"))

		(if (contains (window_name) "Préférences")
			(set_workspace 1)
			(geometry "819x451+611+238"))

		(if (contains (window_name) "Sélectionnez un dossier")
			(set_workspace 2)
			(geometry "1213x326+15+460"))

		(if (contains (window_name) "À propos de Sound Juicer")
			(geometry "434x353+869+299"))

		(if (contains (window_name) "À propos de Sound Juicer")
			(set_workspace 1)
			(geometry "424x329+222+174"))

    )
)

Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1959 Le 31/01/2021, à 15:51

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Ah si, autre chose, le clic sur "Attraper les données ..." corrige les caractères manquant ? que devilspie n'interprète pas mais que xdotool si.

J'aurais dû en laisser un l' "? propos"  par exemple qui devient À propos wink

Dernière modification par Tawal (Le 31/01/2021, à 15:53)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1960 Le 31/01/2021, à 16:45

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Trois posts ça fait flood mad

Je veux bien poster mon script ici, mais ça risque d'être difficilement lisible.
Il faut 140 colonnes (caractères) de large pour bien avoir la mise en forme, sinon les retours à la ligne vont gêner la lecture.
De plus, il fait pas loin de 300 lignes tout compris (lignes vides et commentaires ...)
Vous me dites et j'édite ce post.

Autre chose encore, on a parlé de Christophe C.
Déjà je lui passe mon bonjour et je lui dois une fière chandelle car c'est grâce à son post sur le même sujet que j'ai découvert 'yad'.
Autant dire que j'ai grave appris au travers de ses exemples fonctionnels avec yad.
De plus, je me suis inspiré de son script pour la liste des bureaux (j'ai quand même fait différemment mais j'utilise aussi wmctrl).
Donc MERCI et BRAVO pour ton boulot Christophe C.

Ensuite, mon script comporte certainement d'énormes "bashismes" et donc je ne suis pas sûr de sa portabilité (sujet que j'ai pas trop creusé encore). Et il y a sûrement d'autres trucs à simplifier et aussi ... et ... et peut être ...  lol


Vous me dites comment il serait mieux que je procède ...
Le voilà :

#!/bin/bash

###############################################################################
#
# Nom : DevilsPie-IGEL	-	Devil's Pie Interface Graphique Extra Légère
#
# Commande : DevilsPie-IGEL
#
# Arguments : Aucuns
# Options : Aucunes
#
# Nécéssite : devilspie   wmctrl   xdotool   yad   zenity
#								     par Tawal.
###############################################################################

RETOUR=0			# Code de retour si tout se passe bien

ERR_SORTIE_YAD=64		# Sortie utilisateur 1ere boite (attente_appli)
ERR_ABANDON_YAD=65		# Sortie utilisateur 2eme boite (yad_inf_fen)
ERR_PARSING_CONTINUE=70		# Retour zenity erreur parsing (ou split fichier) et utilisateur continue
ERR_PARSING_STOP=71		# Retour zenity erreur parsing (ou split fichier) des fichiers de règles et abandon utilisateur
ERR_CASE_ZENITY=81		# Code retour si case "reponse zenity erreur parsing" a échoue - Très peu probable mais bon
ERR_CASE_YAD=82			# Idem qu'au dessus mais pour yad_inf_fen - Très peu probable aussi
ERR_INCONNUE_FIN_SCRIPT=113	# Exit à la fin du script où il ne devrait jamais passer !


# Création du dossier temporaire Devil et des fichiers temporaires devil_tmp et yad_datas
Devil=$(mktemp -d /tmp/Devil-XXXXXXXXXXXXXXXX)	#+ (du moins les chemins sont contenus dans ces variables)
devil_tmp=$(mktemp -p $Devil devil_tmp-XXX)	# Gestion de l'effacement du dossier et des fichiers temporaires
yad_datas=$(mktemp -p $Devil yad_datas-XXX)	#+ par le 'trap rm' ci-après : un peu trop de signaux trapés ?
						
trap "rm -rf $Devil $devil_tmp $yad_datas" TERM INT ABRT HUP QUIT EXIT 	# TERM=15 INT=Ctrl+C ABRT=Abort HUP=Par.Proc.Mort QUIT=Crtl+D





DOSS="${HOME}/.devilspie/ds-FE"		# Création du dossier récepteur (si inexistant) des fichiers finaux.
[ ! -d "$DOSS" ] && mkdir "$DOSS"	#+ On va pas mettre en prod direct non plus !
					#+ Non, c'est pour éviter d'écraser des fichiers existants

ORIGIN=$(pwd)				# Sauvegarde de l'endroit d'où on vient, on va se ballader un peu
											
sep='|'					# Definition du separateur pour 'yad' et pour les champs de 'awk' et ...
export icon=/usr/share/icons/Tango/32x32/apps/xfce4-session.png




######## Trois Fonctions à exporter pour éviter un script extérieur - Appelées par les boutons 'yad' et par la fonction 'xdoyad'	

howtodo() {
	zenity --info --width 450 --window-icon $icon --title "Devil's Pie - IGEL" \
		--text "\t\t\t\t  <u><b>HOW TO DO</b></u>\n\n\t- Ouvrez l'application à gérer et cliquez sur <b>OK</b>.\n\n\t- Redimensionnez et positionnez la fenêtre.\n\n\t- Puis cliquez sur <b>Attraper les données de la fenêtre</b>.\n\n\t- Sélectionnez le Bureau, puis\n\n\t- <u>Ouvrez une nouvelle fenêtre</u> à gérer.\n\n\t- Et cliquez sur <b>Nouvelle Fenêtre OK</b>.\n\n\t- Recommencez l'opération etc ...\n\n\t- Puis cliquez sur <b>Créer Règles</b> quand vous avez fini.\n\n\n<i>Le bouton <b>Attraper les données de la fenêtre</b> ne sauvegarde pas la règle qui s'affiche, celle-ci l'est lorsque vous passez à la fenêtre suivante ou que vous créez les règles.\n\nParcourrez une à une <u>toutes</u> les fenêtres de l'application en suivant la procédure ci-dessus.\n\nToutes les données sont modifiables !\nIl est conseillé de ne changer ni le nom ni la classe d'application.\nSurveillez bien les titres de fenêtres, car ils sont très restrictifs !\n\nChoisisez '<u>is</u>' pour un titre de fenêtre inchangeant.\nOptez pour '<u>contains</u>' pour un titre modifié de fenêtre.\n\nVous pouvez garder cette fenêtre ouverte pendant les opérations.</i>"
}

xdoyad() { 	# Capture des données fenêtre après redimensionnement et retour à 'yad' des données par les 'echo'
	local geom="" pos="" title="" totwinstack chope
	totwinstack=$(xdotool search --onlyvisible --classname "$1" getwindowname %@ 2>/dev/null | wc -l)
	chope=$(xdotool search --onlyvisible --classname "$1" getwindowgeometry %$totwinstack  getwindowname %$totwinstack 2>/dev/null)
	posxdo=( $(echo $chope | awk '{print $4}' | sed 's/,/ /g') )
	X=$((${posxdo[0]}-10)); Y=$((${posxdo[1]}-38)) # Rattrapage de la différence entre Devilspie et Xdotool (approx. quoique)
	pos="+"$X"+"$Y
	geom=$(echo $chope | awk '{print $8}')
	title=$(echo "$chope" | awk 'BEGIN {$1=""; $2=""; $3=""; $4=""; $5=""; $6=""; $7=""; $8=""}; END {print $N}' | sed 's/^ *//g')
	[ -z "$title" ] && zenity_pas_de_fen  && xdoyad $1 # Appel de la fonction zenity_pas_de_fen + récursivité de 'xdoyad'
	echo "3:$title"
	echo "4:${geom}${pos}"
}

zenity_pas_de_fen() { 	# Gestion par la fonction 'xdoyad' en cas si la fenêtre n'est pas trouvée. Appel zenity_pas_de_fen
	zenity --info --width 350 --window-icon $icon --title "Devil's Pie - IGEL" \
			--title "ERREUR ! Fenêtre Non Trouvée !" \
			--text "Réouvrez la fenêtre, cliquez sur <b>Valider</b>\n\npuis sur <b>Attraper les données de la fenêtre</b>"
}


export -f howtodo zenity_pas_de_fen xdoyad   # Export des trois fonctions (elles agissent dans un|des sous-shell|s)
######### Fin Export #################################################################################






############# PARTIE FONCTIONS #####################################################################

sortie() {
	activ_regles
	killall devilspie
	cd $ORIGIN
	exit $1
}

err_parsing() { 				# Gestion de l'erreur dans le parsing ...
	mess=""; mess2=""; mess3=""		#+ N'arrivera pas à mon avis, j'ai du créer les erreurs à la main
	[ "$3" -gt "1" ] && {			#+ sur les fichiers temporaires.
		mess="<u>sans importance</u>"
		mess2="dans une sous-règle."
		mess3="Elle ne 'matchera' pas, mais laissera le reste fonctionner."
	} || {
		mess="<u><b>GRAVE</b></u>"
		mess2="dans l'entête de fichier !"
		mess3="Ce fichier de règles ne fonctionnera pas.\nMais il peut être récupéré manuellement, il sera créé en continuant."
	}
	zenity --question --title "Devil's Pie - IGEL" \
		--window-icon $icon --width 450 \
		--ok-label "OUI" --cancel-label "NON" \
		--text "\nUne erreur $mess est survenue lors de la création d'un fichier .ds\nLe fichier <b>$nom_fich_reel.ds</b> comporte le nom <u>$nom_fich_lu</u> en classe d'application $mess2\n\n$mess3\n\nVoulez-vous tout de même créer le fichier\Cliquer sur 'NON' et aucun fichier ne sera créé !"
	res=$?
	case $res in 
		0 ) RETOUR=$ERR_PARSING_CONTINUE ;;
		1 ) sortie $ERR_PARSING_STOP ;;
		* ) RETOUR=$ERR_CASE_ZENITY ;;
	esac
}

sauve_ds() { 	# On transfère les fichiers finaux du dossier temporaire au dossier DOSS
	local fich n=0 tab
	for fich in *.ds; do  	# Création d'un tableau ( fich1 fich2... DossierDest )
		tab[$n]=$fich
		n=$((n+1 ))
	done
	tab[$n]=$DOSS
	cp -f ${tab[@]} & 	# Copie des fichiers définitifs des règles (1 fichier par classe d'application)
	for n in `seq 1 100`; do 				 	#+ en forcing et à la volée !!!
		echo $n																								 #  DE LA POUDRE AUX YEUX
		sleep 0.005																							 #		ce zenity là !
	done | zenity --progress --window-icon $icon --auto-close --no-cancel --title "Devil's Pie - IGEL" --text "\nCopie des fichiers ..."  
	cd $OLDPWD				# Je l'avais dit : de la balade suivez le chemin ^^
}
 
parse_fich() { # On crée le fichier final de règles. On extrait les données dim + loi ligne par ligne.
	local num_lign app title geom class gui='"' 	#  + Gestion structure fichier final
	for num_lign in `seq 1 $(wc -l $1 | awk '{print $1}')`; do
		nom_fich_reel=$1
		nom_fich_reel=${nom_fich_reel%*-} # On ôte le tret '-' à nom_fich_reel pour bien matcher avec la class d'appli.
		nom_fich_lu=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}' | sed 's/ *//g')
		[ ! "$nom_fich_lu" = "$nom_fich_reel" ] && err_parsing $nom_fich_lu $nom_fich_reel $num_lign  # Teste si le nom du fichier 
		class='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}')'"'   #+ lu dans la ligne
		app='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $2}')'"' #+ correspond à celui du fichier réel
		title='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $3}')'"' #+ Appel de la fonction err_parsing
		geom='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $4}')'"'
		bur=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $5}')
		loi=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $6}')
		[ "$num_lign" = "1" ] && {  # C'est ici qu'on écrit vraiment les règles, 1 tour boucle = 1 ligne lue et éclatée = une règle 
			echo -e "(if (and (is (window_class) $class) (is (application_name) $app))" > "$Devil/$nom_fich_reel.ds"
			echo -e "	(begin\n" >> "$Devil/$nom_fich_reel.ds"																 # 
			[ ! "$bur" = "$defaut" ] && { echo -e "		(set_workspace $bur)\n"  >> "$Devil/$nom_fich_reel.ds"; set_bur=1; } 
			echo -e "		(if ($loi (window_name) $title)" >> "$Devil/$nom_fich_reel.ds"		#+ Entète et
			echo -e "			(geometry $geom))\n" >> "$Devil/$nom_fich_reel.ds"		#+ 1ère règle
		}
		[ "$num_lign" -gt "1" ] && {																						 #
			echo -e "		(if ($loi (window_name) $title)" >> "$Devil/$nom_fich_reel.ds"		# Sous-règles 
			[ ! "$bur" = "$defaut" ] && echo -e "			(set_workspace $bur)" >> "$Devil/$nom_fich_reel.ds" #+
			echo -e "			(geometry $geom))\n" >> "$Devil/$nom_fich_reel.ds"	           #+ suivantes										 # 
		}
	done
	echo "    )" >> "$Devil/$nom_fich_reel.ds"
	echo ")" >> "$Devil/$nom_fich_reel.ds"
	[ "$num_lign" = "1" ] && {	# Si qu'une seule règle pour l'application alors on efface les lignes génantes
		[ "$set_bur" = "1" ] && sed -i '2d; 9d' "$Devil/$nom_fich_reel.ds" || sed -i '2d; 7d' "$Devil/$nom_fich_reel.ds" 
	}																													 #+ et la  ')'
}																										 

creer_ds() { # On envoie chaque fichier 'classe d'app' contenant les données de dim + règles
	local i				# + à la création du fichier .ds final correspondant.
	cd $Devil			# On va travailler dans le dossier temporaire
	for i in *-; do
		parse_fich $i
	done	
}

fich_split() { 	# On éclate le fichier de récupération des données utilisateur, on concatène les données règles par application/fichier
	local i line nom_fich						#+ le 1er champ de chaque ligne est la classe d'application 
	for i in `seq 1 $(wc -l $yad_datas | awk '{print $1}')`; do 	#+ qui sera le nom du fichier .ds final
		line=$(sed -n "$i p" $yad_datas)
		nom_fich=$(echo $line | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}' | sed 's/ *//g')
		echo $line >> "$Devil/$nom_fich-"
	done
}

creer_fichs_regles() {		# Alors là, je me demande bien ce que c'est :D 
	fich_split
	creer_ds
	sauve_ds	
}

enleve_o() { 			# on enlève l'appendice '-o' pour réactiver les règles. Voir plus bas
	local a=$1
	a=${a%*-o}
	mv $1 $a
}

met_o() { 			# On met un appendice '-o' à l'extension du fichier règle pour le désactiver
	local a=$1 		#+ (plus de reconnaissance de l'extension .ds par devilspie)
	a="$a-o"
	mv $1 $a
}

activ_regles() {		# On enlève l'appendice '-o' aux fichiers ~/.devilspie/*.ds
	cd ${HOME}/.devilspie	# Il faut le 'cd' en cas d'abandon aprés erreur parsing
	fich_ds_o=( $(ls *.ds-o) )													
	for i in `seq 0 $(( ${#fich_ds_o[@]}-1 ))`; do
		enleve_o ${fich_ds_o[$i]}
	done
	met_o debug.ds		# Et on met le '-o' à debug.ds qui devient debug.ds-o 
}				#+ debug.ds désactivé du coup ;)

desactiv_regles() {		# On met un appendice '-o' aux fichiers ~/.devilspie/*.ds
	[ ! -e "debug.ds" ] && [ ! -e "debug.ds-o" ] && echo "(debug)" > debug.ds #+ sauf à debug.ds et si debug.ds l'a dejà, on l'enlève
	fich_ds=( $(ls *.ds | grep -v "debug.ds") )				  #+ bref l'inverse d'au dessus.
	debug=( $(ls debug.*) )
	for i in `seq 0 $(( ${#fich_ds[@]}-1 ))`; do
		met_o ${fich_ds[$i]}
	done
	[ "$debug" = "debug.ds-o" ] && enleve_o $debug
}

inf_chop() { # On chope les informations des fenêtres que 'devilspie -d' nous laisse dans devil_tmp (on ne lit que la dernière ligne)
	line=$(tail -n 1 $devil_tmp)																			#+ et on éclate les données
	win_class=$(echo $line | awk 'BEGIN {FS=";"}; END {print $3}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_name=$(echo $line | awk 'BEGIN {FS=";"}; END {print $2}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_title=$(echo $line | awk 'BEGIN {FS=";"}; END {print $1}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_geom=$(echo $line | awk 'BEGIN {FS=";"}; END {print $4}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ //g")
}

yad_attente_appli() { # Pour attendre que l'application à gérer soit ouverte + accès HOW TO DO (1ére fenêtre du script à apparaître)
	yad --form --width 350 --window-icon $icon --title="Devil's Pie - IGEL" \
		--align=center \
		--buttons-layout=center \
		--field=" ":LBL "" \
		--field="<b>Attente de l'application à gérer ...</b>\n\nDémarrez l'application à configurer.\nEt cliquez sur <b>OK</b>":LBL "" \
		--field=" ":LBL "" \
		--button="How To Do":'bash -c "howtodo"' \
		--button="OK":0 \
		--button="Sortie":1
 	[ "$?" -eq 0 ] || sortie $ERR_SORTIE_YAD # Cette boite a une commande sous le bouton How To Do,
}						 #+  appel de 'howtodo' cf. Export Fonction

yad_inf_fen() { # La boite de récupération des données fenêtres à gérer - Interactive grâce au --field=" ":FBTN commande
	inf_chop							  # On va chercher les infos avant d'afficher
	yad --form --window-icon $icon --title="Devil's Pie - IGEL" \
		--item-separator="$sep" \
		--buttons-layout=edge \
		--align=right \
		--field="<b>CLASSE</b>" "$win_class" \
		--field="<b>NOM</b>" "$win_name" \
		--field="<b>TITRE DE FENÊTRE</b>" "$win_title" \
		--field="<b>GÉMOTRIE</b>" "$win_geom" \
		--field="<b>BUREAU</b>":CB "$list_bur" \
		--field="<b>Consistance Règle</b>":CB "is$sep^contains" \
		--field=" ":LBL "" \
		--field="*-*-*-*  	<b>Attraper les données de la fenêtre</b>  	*-*-*-*":FBTN '@bash -c "xdoyad %1"' \
		--button="<b>Nouvelle Fenêtre OK</b>":0 \
		--button="<b>Créer Règles</b>":2 \
		--button="<b>Abandon</b>":1 \
		--field="Un clic sur '<u>Nouvelle Fenêtre OK</u>' confirme la règle et passe à la suivante.           ":LBL "" \
		--field="La nouvelle fenêtre doit être ouverte                                         ":LBL "" >> $yad_datas
								# Pareil une cmd sous un bouton, appel de la fonction 'xdoyad'
	res=$?
	case $res in
		0 ) yad_inf_fen ;;				# Récursivité de yad_inf_fen
		1 ) sortie $ERR_ABANDON_YAD ;;			#+
		2 ) creer_fichs_regles ;;			#+ le reste sort en créant ou pas les fichiers
		* ) RETOUR=$ERR_CASE_YAD ;;			#+ selon le choix utilisateur ou les erreurs possibles
	esac
}
########## Fin Partie Fonction




########## PROGRAMME PRINCIPAL ##########################################
									#
cd ${HOME}/.devilspie							# On travaille dans ~/.devilspie pour désactiver les règles en cours.

defaut="Sur le Bureau où démarre l'application"				# Création liste bureaux pour yad : de la forme 1|2|...|^Defaut
nb_bur=$(wmctrl -d | wc -l)						# Comptage du nombre de bureaux		avec sep=|
for i in `seq 1 $nb_bur`; do
	[ "$i" = "1" ] && list_bur=$i$sep || list_bur=$list_bur$i$sep	# Création de la liste - Pour 'yad', le séparateur par défaut est !
	[ "$i" = "$nb_bur" ] && list_bur=$list_bur"^"$defaut		#+ c'est un peu génant comme caractère d'où la varaible "sep"
done

desactiv_regles								# On désactive toutes les règles sauf le fichier debug.ds 
									#+ il est créé s'il le faut
																	
[ -n "$(pgrep -f devilspie)" ] && killall devilspie			# On tue devilspie si il est présent (pour être tranquille)
									#+ ça vaudra un redémarrage de session (needed to activate new laws)
devilspie -d 2>/dev/null >> $devil_tmp &				# On relance devilspie en mode 'debug' et on log stdout dans devil_tmp

yad_attente_appli							# On attend que l'application soit lancée,
									#+ l'utilsateur le signale par un clic
yad_inf_fen								# On affiche les données récupérées dans la fenêtre
									#+ de création de règle.
sortie $RETOUR								# Et on sort par la petite porte après multiples
									#+ boucles dans les fonctions.
exit $ERR_INCONNUE_FIN_SCRIPT 			# Le script ne doit jamais passer par là !

Bonne déco-lecture big_smile
Mouais, le manque de largeur cache les commentaires, va falloir jouer de la glissière hmm
Et la mise en page des coms à sauté (surement les tabs)
lol où se trouve le "par Tawal" ^^
Voici comment la mise en page rend chez moi (screenshot du début du script) : Mise en page screenshot

Évidemment, si vous avez des questions sur le fonctionnement, les commandes etc ... je vous y répondrais wink

Edit: Rajout d'une éloge de plus pour Christophe C wink
Edit2: Ajout du script.
Edit3etDernier: Ajout de la dernière invitation (heu c'est douteux ça ...)
Edit4: Menteur que je suis ! Bon j'ai remanié à peu près les commentaires, c'est toujours pas beau mais il n'y a plus de retour à la ligne.
J'espère que j'ai pas fait sauter une " ou autre petit caractère ...
Edit5: Bah si, il manqait une accolade fermante }. J'ai copié collé chez moi testé en terminal. Heureusement, j'en ai pété qu'une !
Edit6: Repost du script, remanié avec MousePad, c'est bien plus joli. Et j'ai retesté la mouture ici présente.
Edit7: Hmmm ... Une petite aide pour la lecture : descendez en lisant les commentaires,
et remontez le script fonction par fonction (quasiment) pour l'exécution ....
Edit8: Correction erreur légère : la définition de ERR_CASE devient ERR_CASE_ZENITY=81, ça concerne un retour d'erreur très peu probable.

Dernière modification par Tawal (Le 31/01/2021, à 19:33)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1961 Le 31/01/2021, à 20:08

lynn

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Quelques remarques :

1 - Si le répertoire ~/.devilspie n'existe pas, ça ne fonctionne pas (No s-expressions loaded, quiting).
2 - Une fois les règles des fenêtres créées, il faudrait que ton script démarre devilspie sinon ça ne fonctionne pas (éventuellement, proposer de lancer devilspie au démarrage du pc).
3 - Chez moi, il y a un répertoire ds-FE qui est crée et qui empêche devilspie de démarrer correctement car il ne trouve pas de fichier de configuration .ds à la racine du répertoire ~/.devilspie (No s-expressions loaded, quiting).


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#1962 Le 01/02/2021, à 02:16

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bon je galère, mais ...

Le dossier ~/.devilspie doit exister ! Il est créé par l'installation de devilspie.
Devilspie est configuré pour aller lire les fichiers .ds dans CE répertoire.
Donc en gros, si t'as pas ~/.devilspie c'est que :
   - soit devilspie n'est pas installé (ça s'est fait je teste tous les progs nécessaires)
   - soit il est installé d'une manière "customisée" et donc TU dois savoir OÙ il doit aller lire ces fichiers.

De plus, j'ai testé en effet, si ~/.devilspie n'existe pas, ça ne marche pas.
Par contre, s'il est vide, ça marche quand même vu que j'y crée le fichier debug .

Devilspie cherche les fichiers .ds dans

Devil's Pie 0.23 starting...
Loading /etc/devilspie
/etc/devilspie doesn't exist
Loading /home/tawal/.devilspie
/home/tawal/.devilspie doesn't exist
0 s-expressions loaded.
No s-expressions loaded, quiting

/etc/devilspie et
${HOME}/.devilspie et c'est tout, s'il va ailleurs, c'est que c'est une install custom.
Donc problème du customizer ...

Pour ce qui est du redémarrage de devilspie avec ces nouvelles règles,
il faut passer par la déconnexion reconnexion session, ça regarde l'user là. il aura un avertissement.
Déjà, il y en a un qui manque : si tu démarres l'appli, ça flingue le daemon devilspie en cours.

Vli,vlà,vlou ^^

Voici une nouvelle version /!\ Le dossier ds-FE a changé de nom, il s'appelle ds-igle

#!/bin/bash

###############################################################################
#
# Nom : DevilsPie-IGEL	-	Devil's Pie Interface Graphique Extra Légère
#
# Commande : DevilsPie-IGEL
#
# Arguments : Aucuns
# Options : Aucunes
#
# Nécéssite : devilspie   wmctrl   xdotool   yad   zenity
#								par Tawal.
###############################################################################

RETOUR=0			# Code de retour si tout se passe bien

ERR_SORTIE_YAD=64		# Sortie utilisateur 1ere boite (attente_appli)
ERR_ABANDON_YAD=65		# Sortie utilisateur 2eme boite (yad_inf_fen)
ERR_ABS_PROG=71			# Retour si un prog nécéssaire manque
ERR_ABS_DOSS=72			# Retour si le dossier d'installation de devilspie n'existe pas.
ERR_PARSING_CONTINUE=80		# Retour zenity erreur parsing (ou split fichier) et utilisateur continue
ERR_PARSING_STOP=81		# Retour zenity erreur parsing (ou split fichier) des fichiers de règles et abandon utilisateur
ERR_CASE_ZENITY=91		# Code retour si case "reponse zenity erreur parsing" a échoue - Très peu probable mais bon
ERR_CASE_YAD=92			# Idem qu'au dessus mais pour yad_inf_fen - Très peu probable aussi
ERR_INCONNUE_FIN_SCRIPT=113	# Exit à la fin du script où il ne devrait jamais passer !




# Création du dossier temporaire Devil et des fichiers temporaires devil_tmp et yad_datas
Devil=$(mktemp -d /tmp/Devil-XXXXXXXXXXXXXXXX)	#+ (du moins les chemins sont contenus dans ces variables)
devil_tmp=$(mktemp -p $Devil devil_tmp-XXX)	# Gestion de l'effacement du dossier et des fichiers temporaires
yad_datas=$(mktemp -p $Devil yad_datas-XXX)	#+ par le 'trap rm' ci-après : un peu trop de signaux trapés ?
																		#
trap "rm -rf $Devil $devil_tmp $yad_datas" TERM INT ABRT HUP QUIT EXIT 	# TERM=15 INT=Ctrl+C ABRT=Abort HUP=Par.Proc.Mort QUIT=Crtl+D

ORIGIN=$(pwd)			# Sauvegarde de l'endroit d'où on vient, on va se ballader un peu
											
sep='|'				# Définition du séparateur pour 'yad' et pour les champs de 'awk' et ...
export icon=/usr/share/icons/Tango/32x32/apps/xfce4-session.png




########	4 Fonctions à exporter pour éviter un script extérieur - Appelées par les boutons 'yad'	 et par la fonction 'xdoyad'	

howtodo() {
	zenity --info --width 450 --window-icon $icon --title "Devil's Pie - IGEL - How To Do" \
		--text "\t\t\t\t  <u><b>HOW TO DO</b></u>\n\n\t- Ouvrez l'application à gérer et cliquez sur <b>OK</b>.\n\n\t- Redimensionnez et positionnez la fenêtre.\n\n\t- Puis cliquez sur <b>Attraper les données de la fenêtre</b>.\n\n\t- Sélectionnez le Bureau, puis\n\n\t- <u>Ouvrez une nouvelle fenêtre</u> à gérer.\n\n\t- Et cliquez sur <b>Nouvelle Fenêtre OK</b>.\n\n\t- Recommencez l'opération etc ...\n\n\t- Puis cliquez sur <b>Créer Règles</b> quand vous avez fini.\n\n\n<i>Le bouton <b>Attraper les données de la fenêtre</b> ne sauvegarde pas la règle qui s'affiche, celle-ci l'est lorsque vous passez à la fenêtre suivante ou que vous créez les règles.\n\nParcourrez une à une <u>toutes</u> les fenêtres de l'application en suivant la procédure ci-dessus.\n\nToutes les données sont modifiables !\nIl est conseillé de ne changer ni le nom ni la classe d'application.\nSurveillez bien les titres de fenêtres, car ils sont très restrictifs !\n\nChoisisez '<u>is</u>' pour un titre de fenêtre inchangeant.\nOptez pour '<u>contains</u>' pour un titre modifié de fenêtre.\n\nVous pouvez garder cette fenêtre ouverte pendant les opérations.</i>"
}

xdoyad() { 			# Capture des données fenêtre après redimensionnement et retour à 'yad' des données par les 'echo'
	local geom="" pos="" title="" totwinstack chope
	totwinstack=$(xdotool search --onlyvisible --classname "$1" getwindowname %@ 2>/dev/null | wc -l)
	chope=$(xdotool search --onlyvisible --classname "$1" getwindowgeometry %$totwinstack  getwindowname %$totwinstack 2>/dev/null)
	posxdo=( $(echo $chope | awk '{print $4}' | sed 's/,/ /g') )
	X=$((${posxdo[0]}-10)); Y=$((${posxdo[1]}-38))		# Rattrapage de la différence entre Devilspie et Xdotool (approx. quoique)
	pos="+"$X"+"$Y
	geom=$(echo $chope | awk '{print $8}')
	title=$(echo "$chope" | awk 'BEGIN {$1=""; $2=""; $3=""; $4=""; $5=""; $6=""; $7=""; $8=""}; END {print $N}' | sed 's/^ *//g')
	[ -z "$title" ] && zenity_pas_de_fen  && xdoyad $1     		# Appel de la fonction zenity_pas_de_fen + récursivité de 'xdoyad'
	echo "3:$title"
	echo "4:${geom}${pos}"
}

zenity_pas_de_fen() { 		# Gestion par la fonction 'xdoyad' en cas si la fenêtre n'est pas trouvée et appel affichage ici
	zenity --info --width 350 --window-icon $icon --title "Devil's Pie - IGEL - Pas Trouvé !" \
			--text "Réouvrez la fenêtre, cliquez sur <b>Valider</b>\n\npuis sur <b>Attraper les données de la fenêtre</b>"
}

export -f howtodo zenity_pas_de_fen xdoyad # Export des 4 fonctions (elles agissent dans un|des sous-shell|s)
######### Fin Export ##################################################################################################






################################### PARTIE FONCTIONS ##################################################################


sortie() {
	case $1 in
	   	   72|73 ) ;;
		64|65|80 ) activ_regles ;;
	esac
	killall devilspie
	cd $ORIGIN
	exit $1
}

err_parsing() { 					# Gestion de l'erreur dans le parsing ...
	mess=""; mess2=""; mess3=""			#+ N'arrivera pas à mon avis, j'ai du créer les erreurs à la main
	[ "$3" -gt "1" ] && {				#+ sur les fichiers temporaires.
		mess="<u>sans importance</u>"
		mess2="dans une sous-règle."
		mess3="Elle ne 'matchera' pas, mais laissera le reste fonctionner."
	} || {
		mess="<u><b>GRAVE</b></u>"
		mess2="dans l'entête de fichier !"
		mess3="Ce fichier de règles ne fonctionnera pas.\nMais il peut être récupéré manuellement, il sera créé en continuant."
	}
	zenity --question --title "Devil's Pie - IGEL - ERREUR !" \
		--window-icon $icon --width 450 \
		--ok-label "OUI" --cancel-label "NON" \
		--text "\nUne erreur $mess est survenue lors de la création d'un fichier .ds\nLe fichier <b>$nom_fich_reel.ds</b> comporte le nom <u>$nom_fich_lu</u> en classe d'application $mess2\n\n$mess3\n\nVoulez-vous tout de même créer le fichier\Cliquer sur 'NON' et aucun fichier ne sera créé !"
	res=$?
	case $res in 
		0 ) RETOUR=$ERR_PARSING_CONTINUE ;;
		1 ) sortie $ERR_PARSING_STOP ;;
		* ) RETOUR=$ERR_CASE_ZENITY ;;
	esac
}

sauve_ds() { 		# On transfère les fichiers finaux du dossier temporaire au dossier DOSS_DEST
	local fich n=0 tab
	for fich in *.ds; do  		# Création d'un tableau ( fich1 fich2... DossierDest )
		tab[$n]=$fich
		n=$((n+1 ))
	done
	tab[$n]=$DOSS_DEST
	cp -f ${tab[@]} & 		# Copie des fichiers définitifs des règles (1 fichier par classe d'application)
	for n in `seq 1 100`; do 	#	en forcing et à la volée !!!
		echo $n																								 #  DE LA POUDRE AUX YEUX
		sleep 0.005																							 #		ce zenity là !
	done | zenity --progress --window-icon $icon --auto-close --no-cancel --title "Devil's Pie - IGEL - Copie" --text "\nCopie des fichiers ..."  
	cd $OLDPWD							# Je l'avais dit : de la balade suivez le chemin ^^
}
 
parse_fich() { # On crée le fichier final de règles. On extrait les données dim + loi ligne par ligne. + Gestion structure fichier final
	local num_lign app title geom class gui='"'
	for num_lign in `seq 1 $(wc -l $1 | awk '{print $1}')`; do
		nom_fich_reel=$1
		nom_fich_reel=${nom_fich_reel%*-} # On ôte le tiret '-' à nom_fich_reel pour bien matcher avec la class d'appli. et on l' utilise en
		nom_fich_lu=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}' | sed 's/ *//g')   #+ nom de fich. final
		[ ! "$nom_fich_lu" = "$nom_fich_reel" ] && err_parsing $nom_fich_lu $nom_fich_reel $num_lign  # Teste si le nom du fichier 
		class='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}')'"'   #+ lu dans la ligne
		app='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $2}')'"'     #+ correspond à celui du fichier réel
		title='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $3}')'"'   #+ Appel de la fonction err_parsing
		geom='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $4}')'"'
		bur=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $5}')
		loi=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $6}')
		[ "$num_lign" = "1" ] && { 		   # C'est ici qu'on écrit vraiment les règles, 1 tour boucle = 1 ligne lue et éclatée = une règle 
			echo -e "(if (and (is (window_class) $class) (is (application_name) $app))" > "$Devil/$nom_fich_reel.ds"
			echo -e "	(begin\n" >> "$Devil/$nom_fich_reel.ds"																 # 
			[ ! "$bur" = "$defaut" ] && { echo -e "		(set_workspace $bur)\n"  >> "$Devil/$nom_fich_reel.ds"; set_bur=1; } # Entète et
			echo -e "		(if ($loi (window_name) $title)" >> "$Devil/$nom_fich_reel.ds"				     #+ 1ère règle
			echo -e "			(geometry $geom))\n" >> "$Devil/$nom_fich_reel.ds"											 #
		}
		[ "$num_lign" -gt "1" ] && {																						 #
			echo -e "		(if ($loi (window_name) $title)" >> "$Devil/$nom_fich_reel.ds"			   # Sous-règles 
			[ ! "$bur" = "$defaut" ] && echo -e "			(set_workspace $bur)" >> "$Devil/$nom_fich_reel.ds"#+ suivantes
			echo -e "			(geometry $geom))\n" >> "$Devil/$nom_fich_reel.ds"											 # 
		}
	done
	echo "    )" >> "$Devil/$nom_fich_reel.ds"
	echo ")" >> "$Devil/$nom_fich_reel.ds"
	[ "$num_lign" = "1" ] && {				# Si qu'une seule règle pour l'application alors on efface les lignes génantes
		[ "$set_bur" = "1" ] && sed -i '2d; 9d' "$Devil/$nom_fich_reel.ds" || sed -i '2d; 7d' "$Devil/$nom_fich_reel.ds" #+ le '(begin'
	}																													 #+ et la  ')'
}																										 

creer_ds() { # On envoie chaque fichier 'classe d'app' contenant les données de dim + règles
	local i				# + à la création du fichier .ds final correspondant.
	cd $Devil			# On va travailler dans le dossier temporaire (balade)
	for i in *-; do
		parse_fich $i
	done	
}

fich_split() { 	# On éclate le fichier de récupération des données utilisateur, on concatène les données règles par application/fichier
	local i line nom_fich						#+ le 1er champ de chaque ligne est la classe d'application 
	for i in `seq 1 $(wc -l $yad_datas | awk '{print $1}')`; do 	#+ qui sera le nom du fichier .ds final
		line=$(sed -n "$i p" $yad_datas)
		nom_fich=$(echo $line | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}' | sed 's/ *//g')
		echo $line >> "$Devil/$nom_fich-"
	done
}

creer_fichs_regles() {		# Alors là, je me demande bien ce que c'est :D 
	fich_split
	creer_ds
	sauve_ds	
}

enleve_o() { 			# on enlève l'appendice '-o' pour réactiver les règles. Voir plus bas
	local a=$1
	a=${a%*-o}
	mv $1 $a
}

met_o() { 			# On met un appendice '-o' à l'extension du fichier règle pour le désactiver
	local a=$1 		#+ (plus de reconnaissance de l'extension .ds par devilspie)
	a="$a-o"
	mv $1 $a
}

activ_regles() {				# On enlève l'appendice '-o' aux fichiers ~/.devilspie/*.ds
	cd "$DOSS_CONF"				# Il faut le 'cd' en cas d'abandon aprés erreur parsing
	fich_ds_o=( $(ls *.ds-o 2>/dev/null) )
	[ -n "$fich_ds_o" ] && {												
		for i in `seq 0 $(( ${#fich_ds_o[@]}-1 ))`; do
			enleve_o ${fich_ds_o[$i]}	# Appel des fonctions met_o et enleve_o
		done
	}
	met_o debug.ds					# Et on met le '-o' à debug.ds qui devient debug.ds-o 
}							#+ debug.ds désactivé du coup ;)


desactiv_regles() {									# On met un appendice '-o' aux fichiers ~/.devilspie/*.ds
	[ ! -e "debug.ds" ] && [ ! -e "debug.ds-o" ] && echo "(debug)" > debug.ds	#+ sauf à debug.ds et si debug.ds l'a dejà, on l'enlève
	fich_ds=( $(ls *.ds 2>/dev/null | grep -v "debug.ds") )				#+ bref cf. activ_regles.
	debug=$(ls debug.ds-o  2>/dev/null)
	[ -n "${fich_ds[@]}" ] && {
		for i in `seq 0 $(( ${#fich_ds[@]}-1 ))`; do
			met_o ${fich_ds[$i]}						# Appel des fonctions met_o et enleve_o
		done
	}
	[ -n "$debug" ] && enleve_o $debug						# On ne veut que le fichier debug.ds comme règle active
}

inf_chop() {	# On chope les informations des fenêtres que 'devilspie -d' nous laisse dans devil_tmp (on ne lit que la dernière ligne)
	line=$(tail -n 1 $devil_tmp)																			#+ et on éclate les données
	win_class=$(echo $line | awk 'BEGIN {FS=";"}; END {print $3}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_name=$(echo $line | awk 'BEGIN {FS=";"}; END {print $2}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_title=$(echo $line | awk 'BEGIN {FS=";"}; END {print $1}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_geom=$(echo $line | awk 'BEGIN {FS=";"}; END {print $4}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ //g")
}

yad_attente_appli() { 		# Pour attendre que l'application à gérer soit ouverte + accès HOW TO DO (1ére fenêtre du script à apparaître)
	yad --form --width 350 --window-icon $icon --title="Devil's Pie - IGEL - Attente" \
		--align=center \
		--buttons-layout=center \
		--field=" ":LBL "" \
		--field="<b>Attente de l'application à gérer ...</b>\n\nDémarrez l'application à configurer.\nEt cliquez sur <b>OK</b>":LBL "" \
		--field=" ":LBL "" \
		--button="How To Do":'bash -c "howtodo"' \
		--button="OK":0 \
		--button="Sortie":1
 	[ "$?" -eq 0 ] || sortie $ERR_SORTIE_YAD # Cette boite a une commande sous le bouton How To Do, appel de 'howtodo' cf. Export Fonction
}

yad_inf_fen() { # La boite de récupération/saisie des données fenêtres à gérer - Interactive grâce au --field=" ":FBTN commande
	inf_chop								# On va chercher les infos avant d'afficher
	yad --form --window-icon $icon --title="Devil's Pie - IGEL - Chope Infos" \
		--item-separator="$sep" \
		--buttons-layout=edge \
		--align=right \
		--field="<b>CLASSE</b>" "$win_class" \
		--field="<b>NOM</b>" "$win_name" \
		--field="<b>TITRE DE FENÊTRE</b>" "$win_title" \
		--field="<b>GÉMOTRIE</b>" "$win_geom" \
		--field="<b>BUREAU</b>":CB "$list_bur" \
		--field="<b>Consistance Règle</b>":CB "is$sep^contains" \
		--field=" ":LBL "" \
		--field="*-*-*-*  	<b>Attraper les données de la fenêtre</b>  	*-*-*-*":FBTN '@bash -c "xdoyad %1"' \
		--button="<b>Nouvelle Fenêtre OK</b>":0 \
		--button="<b>Créer Règles</b>":2 \
		--button="<b>Abandon</b>":1 \
		--field="Un clic sur '<u>Nouvelle Fenêtre OK</u>' confirme la règle et passe à la suivante.           ":LBL "" \
		--field="La nouvelle fenêtre doit être ouverte                                         ":LBL "" >> $yad_datas
								# Pareil une cmd sous un bouton, appel de la fonction 'xdoyad'
	res=$?
	case $res in
		0 ) yad_inf_fen ;;				# Récursivité de yad_inf_fen
		1 ) sortie $ERR_ABANDON_YAD ;;			#+
		2 ) creer_fichs_regles ;;			#+ le reste sort en créant ou pas les fichiers .ds
		* ) RETOUR=$ERR_CASE_YAD ;;			#+ selon le choix utilisateur ou les erreurs possibles
	esac
}

zen_abs_prog() {
	zenity --error --width 350 --window-icon $icon --title "Devil's Pie - IGEL - Prog. Abs." \
		--text "\nUn ou plusieurs de ces programmes manquent :\n\tdevilspie\n\twmctrl\n\txdotool\n\tyad\n"
	sortie $ERR_ABS_PROG
}
zen_abs_doss() {
	zenity --error --timeout 5 --width 350 --window-icon $icon --title "Devil's Pie - IGEL - Dossier Absent" \
		--text "\nAucun dossier de configuration !\n\nSortie du programme ..."
	sortie $ERR_ABS_DOSS
}

########## Fin Partie Fonction




########## PROGRAMME PRINCIPAL ##################################
								#
pres_devil=$(whereis devilspie | awk '{print $2}')		# Test de la présence de 'devilspie' 'wmcrtl' 'xdotool' et 'yad'
pres_wmctrl=$(whereis wmctrl | awk '{print $2}')		#
pres_xdotool=$(whereis xdotool | awk '{print $2}')		#
pres_yad=$(whereis yad | awk '{print $2}')			# Si il manque un seul logiciel, on sort.
[ -z $"pres_devil" -o -z "$pres_wmctrl" -o -z "$pres_xdotool" -o -z "$pres_yad" ] && zen_abs_prog

[ -d "${HOME}/.devilspie" ] && {
	DOSS_CONF=${HOME}/.devilspie				# On teste la présence du dossier d'installation
	DOSS_DEST="${HOME}/.devilspie/ds-igel"			# par défaut de devilspie
	[ -d "$DOSS_DEST" ] || mkdir "$DOSS_DEST"		# si oui on crée le dossier destination
} || zen_abs_doss

cd "$DOSS_CONF"							# On travaille dans ~/.devilspie pour désactiver les règles en cours.

defaut="Sur le Bureau où démarre l'application"			# Création liste bureaux pour yad : de la forme 1|2|...|^Defaut
nb_bur=$(wmctrl -d | wc -l)					# Comptage du nombre de bureaux.		avec sep=|
for i in `seq 1 $nb_bur`; do
	[ "$i" = "1" ] && list_bur=$i$sep || list_bur=$list_bur$i$sep	# Création de la liste - Pour 'yad', le séparateur par défaut est !
	[ "$i" = "$nb_bur" ] && list_bur=$list_bur"^"$defaut		#+ c'est un peu génant comme caractère d'où la varaible "sep"
done

desactiv_regles							# On désactive toutes les règles sauf le fichier debug.ds 
echo "sortie desactiv"						#+ il est créé s'il le faut
																	
[ -n "$(pgrep -f devilspie)" ] && killall devilspie		# On tue devilspie si il est présent (pour être tranquille)
								#+ ça vaudra un redémarrage de session (needed to activate new laws)
devilspie -d 2>/dev/null >> $devil_tmp &			# On relance devilspie en mode 'debug' et on log stdout dans devil_tmp
echo "devil lancé"
yad_attente_appli						# On attend que l'application soit lancée,
								#+ l'utilsateur le signale par un clic
yad_inf_fen							# On affiche les données récupérées dans la fenêtre
								#+ de création de règle.
sortie $RETOUR							# Et on sort par la petite porte après multiples
								#+ boucles dans les fonctions.
exit $ERR_INCONNUE_FIN_SCRIPT 			# Le script ne doit jamais passer par là !

Je pense que ça tiens la route. Il y aura toujours quelques probs et des améliorations.
En tout cas, c'est toujours mieux que d'éditer les règles à la main non ?
Et puis avec mon script, si tu fais bien le tour de toutes les fenêtres possibles de l'application que tu configures,
tu ne te retrouves pas avec, tout d'un coup, une fenêtre du genre "Céer un dossier" qui fait la taille de la fenêtre mère.
Ça m'est arrivé, j'avais abandonné devilspie car pas d'outils pour le manier !
Si j'y reviens c'est bien qu'il fait le taf !
Et si mon script me gave trop (trop rigide ou autre),j 'irais peut être voir du coté de Gdevilspie.
mais à ce que j'en ai lu, il à l'air plutôt compliqué à prendre en main, mais apparemmment, il couvrirait toutes les fonctions de devilspie.

Au plaisir.

Dernière modification par Tawal (Le 01/02/2021, à 17:39)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1963 Le 01/02/2021, à 09:58

lynn

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Tawal a écrit :

Le dossier ~/.devilspie doit exister ! Il est créé par l'installation de devilspie.

Pas chez moi... J'ai testé l'installation de devilspie sur Ubuntu 18.04, 20.04 et 21.04 et le résultat est le même. Le répertoire ~/.devilspie n'est pas créé après installation de devilspie.



Tawal a écrit :

   - soit il est installé d'une manière "customisée" et donc TU dois savoir OÙ il doit aller lire ces fichiers.

Si tu entends installation customisée une installation réalisée par le biais d'un terminal

sudo apt install devilspie

alors oui, c'est une installation customisée. tongue


Quel S.E utilises-tu ?


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#1964 Le 01/02/2021, à 10:59

lynn

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Par acquis de conscience, j'ai refait la manip sur une Ubuntu 20.04 fraîchement installée et quand je tapes devilspie -d :

devilspie -d
Devil's Pie 0.23 starting...
Loading /etc/devilspie
/etc/devilspie doesn't exist
Loading /home/lynn/.devilspie
/home/lynn/.devilspie doesn't exist
0 s-expressions loaded.
No s-expressions loaded, quiting
lynn@Ubuntu-20.04:~$ ls

On peut voir que le répertoire situé dans le dossier personnel n'existe pas par défaut; Il n'est pas créé par l'installation de devilspie. C'est pourquoi dans ton ton script, il serait peut-être bon de vérifier la présence de celui ci et de le créer au besoin.


PS: Je n'avais pas bien fait attention mais le retour de ta commande devilspie -d confirme ce que j'écris au dessus... ton répertoire ~/.devilspie n'existe pas non plus :

Tawal a écrit :

Devil's Pie 0.23 starting...
Loading /etc/devilspie
/etc/devilspie doesn't exist
Loading /home/tawal/.devilspie
/home/tawal/.devilspie doesn't exist

0 s-expressions loaded.
No s-expressions loaded, quiting

Tu disais quoi sur l'installation customisée..? lol


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#1965 Le 01/02/2021, à 17:31

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour,

En effet, ça me revient, c'est moi qui a crée le ~/.devilspie
C'était indiqué sur un site concernant l'installation de devilspie (peut être Debian Wiki, je sais plus)

Donc, je regarde pour l'existence du dossier et sa création en cas d'absence. OK

lynn a écrit :

PS: Je n'avais pas bien fait attention mais le retour de ta commande devilspie -d confirme ce que j'écris au dessus... ton répertoire ~/.devilspie n'existe pas non plus :

Non, non, il existe mais je l'avais renommé pour tests. Mais forcément, Devilspie ne tournait pas et ne loggait aucune apparition de fenêtres.

Ensuite, j'ai une nouvelle version plus ergonomique/intuitive :
     - Le clic sur "Nouvelle Fenêtre OK" ne ferme plus la boite yad d'infos sur les dim et pos de la fenêtre mais enregistre toujours la règle affichée avant le clic
     - Du coup, on se sent moins perdu sans cette boite yad qui bouge tout le temps (fermeture et réapparition ça c'est fini wink )
Je ne poste pas de suite cette version, je regarde pour le dossier ~/.devilspie.

Pour ce qui est de mon S.E, je suis sur Debian 10 stable Xfce
Alors en effet, il peut y avoir quelques différences.

Merci de tes tests et investigations smile

Edit: Pour moi, une installation "customisée", c'est quand tu changes des paramètres dans les fichiers conf de l'appli.
Et une console t'en diras toujours plus qu'une appli graphique. C'est pour moi, une des meilleures méthodes d'installation de paquets ... fin bref.

Editt2: Je crois que je suis amoureux d'Edith ^^.
Non SERIEUX, il y avait une erreur dans le dernier post du script : un # s'était collé à la fin d'une ligne après le remaniement mise en page. C'est corrigé.

Edit3: mmm Edith ....
Présence du dossier ~/.devilspie       FAIT
Par contre, j'ai toujours laissé l'enregistrement des règles dans le dossier ~/.devilspie/ds-igle. Pourquoi :
   - Les fichiers de règles nouvelles ne peuvent être actifs qu'après un redémarrage session.
   - Si des fichiers de règles sont déjà existants et portent le même nom que le fichier de règle qui va être créé, il y aura écrasement !
(je n'arrive pas à retrouver un prompt pour avoir une confirmation de l'user, d'où le forcing à la copie)

PS : citation de Wiki Ubuntu

Wiki Ubuntu a écrit :

Créer un répertoire caché /.devilspie dans votre Dossier Personnel (si vous préférez le terminal : mkdir ~/.devilspie).

Dernière modification par Tawal (Le 01/02/2021, à 18:13)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1966 Le 01/02/2021, à 21:42

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Hello,

Y'a du neuf !

Une nouvelle version plus ergonomique !

Détection des programmes nécessaires.
Détection de la présence du dossier ~/.devilspie

Le script gère maintenant le redémarrage de Devil's Pie (sans déconnexion de session) avec les nouvelles règles ou bien les anciennes au choix.
On a aussi le choix de ne pas démarrer Devil's Pie.
Même en cas de Sortie dès la 1ere boite ou d'abandon dans la 2eme, on sera invité à démarrer Devil's Pie ou non. (forcément avec les anciennes règles vu qu'il n'y en a pas de nouvelles créées)
Si on choisi de "Créer les nouvelles règles", un avertissement apparaît pour prévenir que les fichiers dans ~/.devilspie/ds-igel risquent d'êtres écrasés.
Ensuite, on est invité à "Démarrer avec les nouvelles règles" où on est prévenu du risque d’écrasement des fichiers dans ~/.devilspie.

Coté Ergonomie :
La boite de données de dimension et position de la fenêtre ne se referme plus à l'appui sur "Nouvelle Fenêtre OK".
Ce qui fait qu'elle ne se balade plus de droite à gauche (de haut en bas aussi ^^) lors de sa réapparition (elle se ferme plus, elle réapparaît pas, elle reste en place).
Le clic sur ce bouton enregistre toujours la règle affichée avant le clic et passe à la fenêtre suivante (qui doit être ouverte juste avant le clic).

Voici le script :

#!/bin/bash

###############################################################################
#
# Nom : DevilsPie-IGEL	-	Devil's Pie Interface Graphique Extra Légère
#
# Commande : DevilsPie-IGEL
#
# Arguments : Aucuns
# Options : Aucunes
#
# Nécéssite : devilspie   wmctrl   xdotool   yad   zenity
#								     par Tawal.
###############################################################################

RETOUR=0			# Code de retour si tout se passe bien

ERR_SORTIE_YAD=64		# Sortie utilisateur 1ere boite (attente_appli)
ERR_ABANDON_YAD=65		# Sortie utilisateur 2eme boite (yad_inf_fen)
ERR_NON_LANCE=66		# Retour si l'user ne veut pas demarrer devilspie
ERR_NO_TRANSFER=67		# Retour si l'user demarre devilspie sur ses anciennes règles
ERR_ABS_PROG=71			# Retour si un prog nécéssaire manque
ERR_PARSING_CONTINUE=80		# Retour zenity erreur parsing (ou split fichier) et utilisateur continue
ERR_PARSING_STOP=81		# Retour zenity erreur parsing (ou split fichier) des fichiers de règles et abandon utilisateur
ERR_CASE_ZENITY=91		# Code retour si case "reponse zenity erreur parsing" a échoue - Très peu probable mais bon
ERR_CASE_YAD=92			# Idem qu'au dessus mais pour yad_inf_fen - Très peu probable aussi
ERR_CASE_DEMAND=93		# Idem qu'au dessus mais pour demande_dem_devilspie - Très peu probable aussi
ERR_CASE_SORTIE=94		# Idem qu'au dessus mais pour sortie (après demande_dem_devilspie) - Très peu probable aussi
ERR_INCONNUE_FIN_SCRIPT=113	# Exit à la fin du script où il ne devrait jamais passer !




# Création du dossier temporaire Devil et des fichiers temporaires devil_tmp et yad_datas
Devil=$(mktemp -d /tmp/Devil-XXXXXXXXXXXXXXXX)	#+ (du moins les chemins sont contenus dans ces variables)
devil_tmp=$(mktemp -p $Devil devil_tmp-XXX)	# Gestion de l'effacement du dossier et des fichiers temporaires
yad_datas=$(mktemp -p $Devil yad_datas-XXX)	#+ par le 'trap rm' ci-après : un peu trop de signaux trapés ?
trap "rm -rf $Devil $devil_tmp $yad_datas" TERM INT ABRT HUP QUIT EXIT 	
						# TERM=15 INT=Ctrl+C ABRT=Abort HUP=Par.Proc.Mort QUIT=Crtl+D

ORIGIN=$(pwd)			# Sauvegarde de l'endroit d'où on vient, on va se ballader un peu
											
sep='|'				# Définition du séparateur pour 'yad' et pour les champs de 'awk' et ...
export icon=/usr/share/icons/Tango/32x32/apps/xfce4-session.png

export devil_tmp yad_datas	# Vont être utilsées par la fonction exportée 'inf_chop' et 'inf_nouv_nf'
				# + elles ont besoin de "voir" les variable devil_tmp et yad_datas



########### Fonctions à exporter pour éviter un script extérieur ########################################
#	Toutes ces fonctions sont dans un sous shell crée par les commandes sous les boutons de 'yad'	  #

howtodo() {
	zenity --info --width 450 --window-icon $icon --title "Devil's Pie - IGEL - How To Do" \
		--text "\t\t\t\t  <u><b>HOW TO DO</b></u>\n\n\t- Ouvrez l'application à gérer et cliquez sur <b>OK</b>.\n\n\t- Redimensionnez et positionnez la fenêtre.\n\n\t- Puis cliquez sur <b>Attraper les données de la fenêtre</b>.\n\n\t- Sélectionnez le Bureau, puis\n\n\t- <u>Ouvrez une nouvelle fenêtre</u> à gérer.\n\n\t- Et cliquez sur <b>Nouvelle Fenêtre OK</b>.\n\n\t- Recommencez l'opération etc ...\n\n\t- Puis cliquez sur <b>Créer Règles</b> quand vous avez fini.\n\n\n<i>Le bouton <b>Attraper les données de la fenêtre</b> ne sauvegarde pas la règle qui s'affiche, celle-ci l'est lorsque vous passez à la fenêtre suivante ou que vous créez les règles.\n\nParcourrez une à une <u>toutes</u> les fenêtres de l'application en suivant la procédure ci-dessus.\n\nToutes les données sont modifiables !\nIl est conseillé de ne changer ni le nom ni la classe d'application.\nSurveillez bien les titres de fenêtres, car ils sont très restrictifs !\n\nChoisisez '<u>is</u>' pour un titre de fenêtre inchangeant.\nOptez pour '<u>contains</u>' pour un titre modifié de fenêtre.\n\nVous pouvez garder cette fenêtre ouverte pendant les opérations.</i>"
}

xdoyad() { 			# Capture des données fenêtre après redimensionnement et retour à 'yad' des données par les 'echo'
	local geom="" pos="" title="" totwinstack chope
	totwinstack=$(xdotool search --onlyvisible --classname "$1" getwindowname %@ 2>/dev/null | wc -l)
	chope=$(xdotool search --onlyvisible --classname "$1" getwindowgeometry %$totwinstack  getwindowname %$totwinstack 2>/dev/null)
	posxdo=( $(echo $chope | awk '{print $4}' | sed 's/,/ /g') )
	X=$((${posxdo[0]}-10)); Y=$((${posxdo[1]}-38))		# Rattrapage de la différence entre Devilspie et Xdotool (approx. quoique)
	pos="+"$X"+"$Y
	geom=$(echo $chope | awk '{print $8}')
	title=$(echo "$chope" | awk 'BEGIN {$1=""; $2=""; $3=""; $4=""; $5=""; $6=""; $7=""; $8=""}; END {print $N}' | sed 's/^ *//g')
	[ -z "$title" ] && zenity_pas_de_fen  && xdoyad $1     		# Appel de la fonction zenity_pas_de_fen + récursivité de 'xdoyad'
	echo "3:$title"
	echo "4:${geom}${pos}"
}

inf_chop() {	# On chope les informations des fenêtres que 'devilspie -d' nous laisse dans devil_tmp (on ne lit que la dernière ligne)
	line=$(tail -n 1 $devil_tmp)									#+ et on éclate les données
	win_class=$(echo $line | awk 'BEGIN {FS=";"}; END {print $3}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_name=$(echo $line | awk 'BEGIN {FS=";"}; END {print $2}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_title=$(echo $line | awk 'BEGIN {FS=";"}; END {print $1}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ '//g; s/'$//g")
	win_geom=$(echo $line | awk 'BEGIN {FS=";"}; END {print $4}' | awk 'BEGIN {FS=":"}; END {print $2}' | sed "s/^ //g")
	[ -n "$1" ] && {
		eval $1=\$win_class
		eval $2=\$win_name
		eval $3=\$win_title
		eval $4=\$win_geom
	}
}

inf_nouv_fen() {					
	echo "$1|$2|$3|$4|$5|$6" >> "$yad_datas"	# On enregistre la règle créée par l'user et
	inf_chop nf_class nf_name nf_title nf_geom 	# on chope les infos de la nouvelle fenêtre et
	echo "1:$nf_class"			
	echo "2:$nf_name"				# on renvoie à yad les données par les echo
	echo "3:$nf_title"
	echo "4:$nf_geom"
	echo "5:$list_bur"
	echo "6:$list_loi"
}

zenity_pas_de_fen() { 	# Gestion par la fonction 'xdoyad' en cas si la fenêtre n'est pas trouvée et appel affichage ici
	zenity --info --width 350 --window-icon $icon --title "Devil's Pie - IGEL - Pas Trouvé !" \
			--text "Réouvrez la fenêtre, cliquez sur <b>Valider</b>\n\npuis sur <b>Attraper les données de la fenêtre</b>"
}

export -f howtodo
export -f xdoyad 				# Export des fonctions (elles agissent dans un|des sous-shell|s)
export -f inf_nouv_fen  
export -f zenity_pas_de_fen
export -f inf_chop
######### Fin Export ##################################################################################################






################################### PARTIE FONCTIONS ##################################################################


sortie() {
	killall devilspie
	case $1 in
		0|64|65|80 ) activ_regles ;;
			 * ) ;;
	esac
	lance=pass
	case $1 in
		 0|80 ) demande_dem_devilspie ;;		# on demande si l'user veut demarrer devilspie
		64|65 ) demande_dem_devilspie abort;;
		    * )  ;;
	esac
	case $lance in
		nada ) RETOUR=$ERR_NON_LANCE ;;
		oui  ) trans_et_dem ;;
		non  ) just_dem ;;
		pass ) ;;
		   * ) RETOUR=$ERR_CASE_SORTIE
	esac
	cd $ORIGIN
	exit $1
}

transfer() {
	mv -f $DOSS_DEST/*.ds $DOSS_CONF
	poudreauxyeux
}

trans_et_dem() {
	RETOUR=0
	transfer
	devilspie &
	disown %1
}

just_dem() {
	RETOUR=$ERR_NO_TRANSFER
	devilspie &
	disown %1
}

demande_dem_devilspie() {
	[ -z "$1" ] && {
		yad --form --width 450 --window-icon $icon --title "Devil's Pie - IGEL - Lancer Devil's Pie ?" \
			--align=center \
			--buttons-layout=spread \
			--field=" ":LBL "" \
			--field="Voulez-vous lancer Devil's Pie avec les nouvelles règles ?":LBL "" \
			--field=" ":LBL "" \
			--field="Si <b>OUI</b> les nouvelles règles seront :":LBL "" \
			--field="\t- copiées dans le dossier ${HOME}/.devilspie":LBL "" \
			--field="\t- avec un risque d'écrasement des fichiers déjà existant !":LBL "" \
			--field=" ":LBL "" \
			--field="Si <b>NON</b> Devil's Pie sera lancé avec les règles déjà exixtantes":LBL "" \
			--button="Ne Pas Lancer":0 \
			--button="     OUI     ":1 \
			--button="     NON     ":2
		res="$?"
		case $res in
			0 ) lance="nada" ;;
			1 ) lance="oui" ;;
			2 ) lance="non" ;;
			* ) sortie $ERR_CASE_DEMAND ;;
		esac
	} || {
		yad --form --width 450 --window-icon $icon --title "Devil's Pie - IGEL - Lancer Devil's Pie ?" \
			--align=center \
			--buttons-layout=center \
			--field=" ":LBL "" \
			--field="Devil's Pie et vos règles sont désactivées":LBL "" \
			--field="Voulez-vous réactiver et les règles et Devil's Pie ?":LBL "" \
			--field=" ":LBL "" \
			--button="OUI":0 \
			--button="NON":1
		[ "$?" -eq 0 ] && lance="non" || lance="nada"
	}
}

poudreauxyeux() {
	for n in `seq 1 100`; do 	
		echo $n
		sleep 0.005
	done | zenity --progress --window-icon $icon --auto-close --no-cancel --title "Devil's Pie - IGEL - Copie" --text "\nCopie des fichiers ..." 
}

err_parsing() { 					# Gestion de l'erreur dans le parsing ...
	mess=""; mess2=""; mess3=""			#+ N'arrivera pas à mon avis, j'ai du créer les erreurs à la main
	[ "$3" -gt "1" ] && {				#+ sur les fichiers temporaires.
		mess="<u>sans importance</u>"
		mess2="dans une sous-règle."
		mess3="Elle ne 'matchera' pas, mais laissera le reste fonctionner."
	} || {
		mess="<u><b>GRAVE</b></u>"
		mess2="dans l'entête de fichier !"
		mess3="Ce fichier de règles ne fonctionnera pas.\nMais il peut être récupéré manuellement, il sera créé en continuant."
	}
	zenity --question --title "Devil's Pie - IGEL - ERREUR !" \
		--window-icon $icon --width 450 \
		--ok-label "OUI" --cancel-label "NON" \
		--text "\nUne erreur $mess est survenue lors de la création d'un fichier .ds\nLe fichier <b>$nom_fich_reel.ds</b> comporte le nom <u>$nom_fich_lu</u> en classe d'application $mess2\n\n$mess3\n\nVoulez-vous tout de même créer le fichier\Cliquer sur 'NON' et aucun fichier ne sera créé !"
	res=$?
	case $res in 
		0 ) RETOUR=$ERR_PARSING_CONTINUE ;;
		1 ) sortie $ERR_PARSING_STOP ;;
		* ) RETOUR=$ERR_CASE_ZENITY ;;
	esac
}

sauve_ds() { 				# On transfère les fichiers finaux du dossier temporaire au dossier DOSS_DEST
	local fich n=0 tab
	for fich in *.ds; do  		# Création d'un tableau ( fich1 fich2... DossierDest )
		tab[$n]=$fich
		n=$((n+1 ))
	done
	tab[$n]=$DOSS_DEST
	cp -f ${tab[@]}			# Copie des fichiers définitifs des règles (1 fichier par classe d'application)#+ en forcing et à la volée !!!
	poudreauxyeux			# Pour l'effet
	cd $OLDPWD			# Je l'avais dit : de la balade suivez le chemin ^^
}
 
parse_fich() { # On crée le fichier final de règles. On extrait les données dim + loi ligne par ligne. + Gestion structure fichier final
	local num_lign app title geom class gui='"'
	for num_lign in `seq 1 $(wc -l $1 | awk '{print $1}')`; do
		nom_fich_reel=$1
		nom_fich_reel=${nom_fich_reel%*-} # On ôte le tiret '-' à nom_fich_reel pour bien matcher avec la class d'appli. et on l' utilise en
		nom_fich_lu=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}' | sed 's/ *//g')   #+ nom de fich. final
		[ ! "$nom_fich_lu" = "$nom_fich_reel" ] && err_parsing $nom_fich_lu $nom_fich_reel $num_lign  # Teste si le nom du fichier 
		class='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}')'"'   #+ lu dans la ligne
		app='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $2}')'"'     #+ correspond à celui du fichier réel
		title='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $3}')'"'   #+ Appel de la fonction err_parsing
		geom='"'$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $4}')'"'
		bur=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $5}')
		loi=$(sed -n "$num_lign p" $1 | awk -v var="$sep" 'BEGIN {FS=var}; END {print $6}')
		[ "$num_lign" = "1" ] && { 	 # C'est ici qu'on écrit vraiment les règles, 1 tour boucle = 1 ligne lue et éclatée = une règle 
			echo -e "(if (and (is (window_class) $class) (is (application_name) $app))" > "$Devil/$nom_fich_reel.ds"
			echo -e "	(begin\n" >> "$Devil/$nom_fich_reel.ds"
			[ ! "$bur" = "$defaut" ] && { echo -e "		(set_workspace $bur)\n"  >> "$Devil/$nom_fich_reel.ds"; set_bur=1; }
			echo -e "		(if ($loi (window_name) $title)" >> "$Devil/$nom_fich_reel.ds"			# Entète et
			echo -e "			(geometry $geom))\n" >> "$Devil/$nom_fich_reel.ds"			#+ 1ère règle
		}
		[ "$num_lign" -gt "1" ] && {
			echo -e "		(if ($loi (window_name) $title)" >> "$Devil/$nom_fich_reel.ds"			# Sous-règles 
			[ ! "$bur" = "$defaut" ] && echo -e "			(set_workspace $bur)" >> "$Devil/$nom_fich_reel.ds" 
			echo -e "			(geometry $geom))\n" >> "$Devil/$nom_fich_reel.ds"			#+ suivantes
		}
	done
	echo "    )" >> "$Devil/$nom_fich_reel.ds"
	echo ")" >> "$Devil/$nom_fich_reel.ds"
	[ "$num_lign" = "1" ] && {			# Si qu'une seule règle pour l'application alors on efface les lignes génantes
		[ "$set_bur" = "1" ] && sed -i '2d; 9d' "$Devil/$nom_fich_reel.ds" || sed -i '2d; 7d' "$Devil/$nom_fich_reel.ds" 
	}												#+ le '(begin'  et la  ')'
}																										 

creer_ds() { # On envoie chaque fichier 'classe d'app' contenant les données de dim + règles
	local i				# + à la création du fichier .ds final correspondant.
	cd $Devil			# On va travailler dans le dossier temporaire (balade)
	for i in *-; do
		parse_fich $i
	done	
}

fich_split() { 	# On éclate le fichier de récupération des données utilisateur, on concatène les données règles par application/fichier
	local i line nom_fich						#+ le 1er champ de chaque ligne est la classe d'application 
	for i in `seq 1 $(wc -l $yad_datas | awk '{print $1}')`; do 	#+ qui sera le nom du fichier .ds final
		line=$(sed -n "$i p" $yad_datas)
		nom_fich=$(echo $line | awk -v var="$sep" 'BEGIN {FS=var}; END {print $1}' | sed 's/ *//g')
		echo $line >> "$Devil/$nom_fich-"
	done
}

avertissement() {
	zenity --info --width 350 --window-icon $icon --title "Devil's Pie - IGEL - Avertissement" \
			--text "\n\tLes fichiers présents dans\n\n<b>${HOME}/.devilspie/ds-igel</b>\n\n\tseront <b><u>écrasés</u></b> !"
}

creer_fichs_regles() {		# Alors là, je me demande bien ce que c'est :D
	avertissement
	fich_split
	creer_ds
	sauve_ds	
}

enleve_o() { 			# on enlève l'appendice '-o' pour réactiver les règles. Voir plus bas
	local a=$1
	a=${a%*-o}
	mv $1 $a
}

met_o() { 			# On met un appendice '-o' à l'extension du fichier règle pour le désactiver
	local a=$1 		#+ (plus de reconnaissance de l'extension .ds par devilspie)
	a="$a-o"
	mv $1 $a
}

activ_regles() {				# On enlève l'appendice '-o' aux fichiers ~/.devilspie/*.ds
	cd "$DOSS_CONF"				# Il faut le 'cd' en cas d'abandon aprés erreur parsing
	fich_ds_o=( $(ls *.ds-o 2>/dev/null) )
	[ -n "${fich_ds_o[0]}" ] && {												
		for i in `seq 0 $(( ${#fich_ds_o[@]}-1 ))`; do
			enleve_o ${fich_ds_o[$i]}	# Appel des fonctions met_o et enleve_o
		done
	}
	met_o debug.ds					# Et on met le '-o' à debug.ds qui devient debug.ds-o 
							#+ debug.ds désactivé du coup ;)
}


desactiv_regles() {									# On met un appendice '-o' aux fichiers ~/.devilspie/*.ds
	[ ! -e "debug.ds" ] && [ ! -e "debug.ds-o" ] && echo "(debug)" > debug.ds	#+ sauf à debug.ds et si debug.ds l'a dejà, on l'enlève
	fich_ds=( $(ls *.ds 2>/dev/null | grep -v "debug.ds") )				#+ bref cf. activ_regles.
	debug=$(ls debug.ds-o  2>/dev/null)
	[ -n "${fich_ds[0]}" ] && {
		for i in `seq 0 $(( ${#fich_ds[@]}-1 ))`; do
			met_o ${fich_ds[$i]}						# Appel des fonctions met_o et enleve_o
		done
	}
	[ -n "$debug" ] && enleve_o $debug						# On ne veut que le fichier debug.ds comme règle active
}

yad_attente_appli() { 	# Pour attendre que l'application à gérer soit ouverte + accès HOW TO DO (1ére fenêtre du script à apparaître)
	yad --form --width 350 --window-icon $icon --title="Devil's Pie - IGEL - Attente" \
		--align=center \
		--buttons-layout=center \
		--field=" ":LBL "" \
		--field="<b>Attente de l'application à gérer ...</b>\n\nDémarrez l'application à configurer.\nEt cliquez sur <b>OK</b>":LBL "" \
		--field=" ":LBL "" \
		--button="How To Do":'bash -c "howtodo"' \
		--button="OK":0 \
		--button="Sortie":1
 	[ "$?" -eq 0 ] || sortie $ERR_SORTIE_YAD 
}					# Cette boite a une commande sous le bouton How To Do, appel de 'howtodo' cf. Export Fonction

yad_inf_fen() { # La boite de récupération/saisie des données fenêtres à gérer - Interactive grâce au --field=" ":FBTN commande
	inf_chop								# On va chercher les infos avant d'afficher
	yad --form --window-icon $icon --title="Devil's Pie - IGEL - Chope Infos" \
		--item-separator="$sep" \
		--buttons-layout=edge \
		--align=right \
		--field="<b>CLASSE</b>" "$win_class" \
		--field="<b>NOM</b>" "$win_name" \
		--field="<b>TITRE DE FENÊTRE</b>" "$win_title" \
		--field="<b>GÉMOTRIE</b>" "$win_geom" \
		--field="<b>BUREAU</b>":CB "$list_bur" \
		--field="<b>Consistance Règle</b>":CB "$list_loi" \
		--field=" ":LBL "" \
		--field="*-*-*-*  	<b>Attraper les données de la fenêtre</b>  	*-*-*-*":FBTN '@bash -c "xdoyad %1"' \
		--field="Un clic sur '<u>Nouvelle Fenêtre OK</u>' enregistre la règle et passe à la suivante.":LBL "" \
		--field="La nouvelle fenêtre doit être ouverte                              ":LBL "" \
		--field="<b>Nouvelle Fenêtre OK</b>":FBTN '@bash -c "inf_nouv_fen %1 %2 %3 %4 %5 %6"' \
		--button="<b>Créer Règles</b>":2 \
		--button="<b>Abandon</b>":1 >> $yad_datas
		
	res=$?							# Pareil 2 comandes sous 2 boutons, appel de la fonction 'xdoyad'
	case $res in										#+ appel de la fonction inf_nouv_fen
		1 ) sortie $ERR_ABANDON_YAD ;;			# Soit on sort par volonté (Abandon)
		2 ) creer_fichs_regles ;;			#+ soit ont en créant les règles (Créer Règles)
		* ) RETOUR=$ERR_CASE_YAD ;;			#+ ou pire le case a planté !
	esac
}

zen_abs_prog() {						# Boite si un prog manque et on sort ensuite
	zenity --error --width 350 --window-icon $icon --title "Devil's Pie - IGEL - Prog. Abs." \
		--text "\nUn ou plusieurs de ces programmes manquent :\n\tdevilspie\n\twmctrl\n\txdotool\n\tyad\n"
	sortie $ERR_ABS_PROG
}
########## Fin Partie Fonction




########## PROGRAMME PRINCIPAL ###############
								                              #
pres_devil=$(which devilspie)		                              # Test de la présence de 'devilspie' 'wmcrtl' 'xdotool' et 'yad'
pres_wmctrl=$(which wmctrl)		                                      #
pres_xdotool=$(which xdotool)		                              #
pres_yad=$(which yad)			                                      # Si il manque un seul logiciel, on sort.
[ -z $"pres_devil" -o -z "$pres_wmctrl" -o -z "$pres_xdotool" -o -z "$pres_yad" ] && zen_abs_prog

[ -d "${HOME}/.devilspie" ] && {				              # On teste la présence du dossier d'installation
	DOSS_CONF=${HOME}/.devilspie			      # par défaut de devilspie
	DOSS_DEST="${HOME}/.devilspie/ds-igel"		      #
	[ -d "$DOSS_DEST" ] || mkdir "$DOSS_DEST"	      # si oui on crée le dossier destination
} || {
	mkdir ${HOME}/.devilspie				              # si non on crée les dossiers ~/.devilspie et
	mkdir ${HOME}/.devilspie/ds-igel			              #+ le dossier ~/.devilspie/ds-igel
	DOSS_CONF="${HOME}/.devilspie"
	DOSS_DEST="${HOME}/.devilspie/ds-igel"
}

cd "$DOSS_CONF"							       # On travaille dans ~/.devilspie pour désactiver les règles en cours.

defaut="Sur le Bureau où démarre l'application"		       # Création liste bureaux pour yad : de la forme 1|2|...|^Defaut
nb_bur=$(wmctrl -d | wc -l)					               #+ Comptage du nombre de bureaux.		avec sep=|
for i in `seq 1 $nb_bur`; do					               #
	[ "$i" = "1" ] && list_bur=$i$sep || list_bur=$list_bur$i$sep
	[ "$i" = "$nb_bur" ] && list_bur=$list_bur"^"$defaut        #+ Création de la liste - Pour 'yad', le séparateur par défaut est !
done 								                       #+ c'est un peu génant comme caractère d'où la varaible "sep"
list_loi="is$sep^contains"

export list_bur list_loi 

desactiv_regles							                # On désactive toutes les règles sauf le fichier debug.ds 
								                                #+ il est créé s'il le faut
																	
[ -n "$(pgrep -f devilspie)" ] && killall devilspie		        # On tue devilspie si il est présent (pour être tranquille)
								                                #

devilspie -d 2>/dev/null >> $devil_tmp &			        # On relance devilspie en mode 'debug' et on log stdout dans devil_tmp

yad_attente_appli						                        # On attend que l'application soit lancée,
								                                #+ l'utilsateur le signale par un clic
yad_inf_fen						                        	# On affiche les données récupérées dans la fenêtre
								                                #+ de création de règle.
sortie $RETOUR							                # Et on sort par la petite porte après multiples
								                                #+ boucles dans les fonctions.
exit $ERR_INCONNUE_FIN_SCRIPT 		# Le script ne doit jamais passer par là !

Bien à vous, au plaisir ...
pour les fautes d'orthographe, ne soyez pas trop criard, signalez les simplement.

Edit:                                                                                                                                                                        elle prend cher Edith
Ce que je n'ai pas dit, c'est qu'il n'y a plus de récursivité de la fonction principale (celle qui affiche les données fenêtre)
Du coup, c'est plus léger en CPU et ça ma fait sauter quelques fonctions donc un peu moins de RAM consommée.

Edit: Modif Test Présence Prog Nécessaires

Dernière modification par Tawal (Le 02/02/2021, à 03:02)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1967 Le 02/02/2021, à 13:46

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Plop, plop

Dernier post sur ce sujet (à moins que ...)

Donc la dernière version est dans le post au dessus.
Pour moi, elle est aboutie, elle fait ce que je lui demande.
Et elle n'est pas si déroutante à utiliser, même agréable je dirais.

J'ai fait un petit "Lisez-moi" plus complet que que le "How To Do" embarqué.
Le voici pour ceux qui voudraient savoir comment l'utiliser correctement :

Devil's Pie Interface Graphique Extra Légère


Comment Faire :

	- Donnez les droits d'exécution au fichier DevilsPie-IGEL.
		Dans un terminal : chmod +x DEvilsPie-IGEL

	- Ensuite entrez la commande suivante pour lancer Devil's Pie I.G.L.E.
		Dans un terminal : DevilsPie-IGEL
	- Ou créez un lanceur.

	- Un 1ère fenêtre apparaît vous demandant d'ouvrir l'application à gérer.
	- Ouvrez l'application désirée.
	
	- Cliquez sur OK dans la fenêtre DevilsPie-IGEL.
	- Une nouvelle fenêtre s'ouvre avec les propriétés de la fenêtre de l'application.
		- Le nom de la classe d'application
		- le nom de l'application
		- le titre de la fenêtre
		- les dimensions et position de la fenêtre

	- Manipulez votre fenêtre d'application pour la postionner et la dimensionner.

	- Cliquez sur "Attraper les données de la fenêtre".
		il est possible d'"Attraper les données" de la fenêtre plusieurs fois,
		cela n'engendre pas de règles.
		Elle sera engendrée à l'appui sur "Nouvelle Fenêtre OK".
		Mais ce sera les dernières données qui serviront à la règle.

	- Choisissez le bureau sur lequel vous voulez que l'application démarre.
		1 = Bureau 1	2 = Bureau 2	 etc ....
		Le choix "Sur le Bureau où démarre l'application" laisse 
			votre application s'afficher sur le bureau actuel.

	- Choisssez la consistance de la règle à appliquer : "is" ou "contains"
		is : la correspondance avec le titre de la fenêtre doit être EXACTE (le titre est XXXXX).
		contains : le titre de la fenêtre contient la chaine de caractère XXXXX.
			Beaucoup de titres fenêtre d'application sont interactifs avec leur contenu.
			Par exemple : "Lisez-moi - Mousepad" est le titre de ma fenêtre actuelle.
				Donc si je veux contrôler cette fenêtre d'une manière générale.
					(sans prendre en compte que ce soit lisez- moi ou un autre document)
				Je choisi la consistance "contains"
					ET je MODIFIE LE TITRE DE LA FENÊTRE en conséquence.
					( j'enlève "Lisez-moi - " et je laisse "Mousepad" dans le champ de titre.)
				Si, au contraire, je veux contrôler cette fenêtre précisément,
					je choisi "is" et je laisse le titre intact.

	- Ne changez pas le nom d'application ni la classe. IMPORTANT

	- Une fois les réglages de dimension, position, 
		choix de bureau, choix de consistance
		et changement ou non du titre faits,
	- OUVREZ UNE NOUVELLE FENÊTRE

	- Cliquez sur "Nouvelle Fenêtre OK".

	 - Les nouvelles informations apparaissent, recommencez la procédure.
		Attraper les données.
		Dimensionnement, Positionnement, choix Bureau,
			choix Consistance et modification Titre.
		Ouvrir une nouvelle fenêtre.
		Cliquer sur "Nouvelle Fenêtre OK".

	- Parcourez ainsi TOUTES les fenêtres de votre application.

	- quand toutes les fenêtres ont été parcourues,
		cliquez sur "Créer Règles" et laissez vous guider.

	- Il se peut que l'application utilise un programme extérieur.
		ce n'est pas grave, un fichier à son nom sera créé,
		mais il faudra peut-être soit désactiver ce fichier (supprimer)
		soit contrôler cette nouvelle application entièrement avec DevilsPie-IGEL.

Que Fait Exactement DevilsPie-IGEL :

	- DevilsPie-IGEL considère la 1ère fenêtre d'une application
		comme étant la fenêtre mère.
		il prend les informations :
			Classe d'application,
			Nom d'application,
			Titre de Fenêtre (modifié ou pas),
			Géométrie,
			Bureau et
			Loi
	pour créer la première règle du fichier de la forme :
-----------------------------------------------------------------------------------------

(if (and (is (window_class) "CLASSE APPLICATION") (is (application_name) "NOM APPLICATION"))

		(set_workspace N)	<--------------------selon le choix fait pour le bureau
									(n'apparaît pas si aucun choix)
		(if (LOI (window_name) "TITRE FENÊTRE (modifié ou pas")  <-LOI est le choix
			(geometry "DIM+POS"))                                                    entre "is" et "contains"

)
-----------------------------------------------------------------------------------------

	- Ensuite si d'autres règles pour des fenêtres
		ayant le même nom d'application sont trouvées (saisies par l'utilsateur)
		il les rajoute au fichier de la façon suivante :
-----------------------------------------------------------------------------------------


(if (and (is (window_class) "CLASSE APPLICATION") (is (application_name) "NOM APPLICATION"))
	(begin

		(set_workspace N)

		(if (LOI (window_name) "TITRE FENÊTRE (modifié ou pas")
			(geometry "DIM+POS"))

		(if (LOI2 (window_name) "TITRE FENÊTRE 2 (modifié ou pas")  <---2ème règle
			(set_workspace N2)                                                <--------n'apparaît pas si 
			(geometry "DIM2+POS2"))                                           pas de choix de Bureau
	)
)
-----------------------------------------------------------------------------------------

Et ainsi de suite jusqu'à épuisement des règles à ajouter.

Ce qu'il faut comprendre dans cette structure,
c'est que l'application assujétie l'est tout d'abord par sa Classe et son Nom.
Ensuite le 1er choix de bureau assujéti aussi toute l'application,
il n'est pas nécéssaire de choisir le bureau pour toutes les fenêtres
à partir du moment où il a été choisi pour la 1ère fenêtre.
Certaines fenêtres ne sont pas séparables de leur fenêtres mère.
Par exemple, n'essayez pas de faire afficher les "préférences" d'une application
sur un autre bureau que celui de l'application.
CA NE MARCHE PAS !

Il est possible fabriquer des règles pour plusieurs applications en 1 fois.
Pour se faire, il suffit quand on a fini avec une application
d'ouvrir une nouvelle application et de cliquer sur "Nouvelle Fenêtre OK"
Et pas sur "Créer Règles" qui fini la prospection
et enregistre les fichiers règles précédemment saisis.

Un dossier ~/.devilspie/ds-igel est créé pour stocker
les règles construites avec DevilsPie-IGEL.
Si vous choisissez de redémarrer devilspie,
ce dossier sera vidé dans le dossier ~/.devilspie
(plus rien dans ~/.devilspie/ds-igel)
Si vous choisissez de ne pas démarrer avec les nouvelles règles,
les fichiers créés restent dans le dossier ~/.devilspie/ds-igel
Toutes les copies de fichiers se font avec "écrasement" en cas de fichier déjà exixtant.
Un message d'avertissemnt apparaît avant l'action de copie,
ce qui vous laisse la liberté sur les fichiers risquant d'être écrasés.

Devil's Pie Interface Graphique Extra Légère n'a pas la prétention
d'englober toutes les fonctionnalités de Devil's Pie.
Il est là surtout pour des règles simples, sans édition à la main.
Il est toujours possible d'utiliser Devil's Pie I.G.E.L
pour obtenir les informations de dimension et position
afin de créer soit même ses propres règles.
                                                                        Fait par Tawal.

Vli,vlà,vlou

À la bonne heure et au plaisir ...

PS : une petite fonctionnalité non décrite dans le lisez-moi :
On peut se servir de ce script pour "redémarrer devilspie" après un changement de règles (edit à la mano ou autre).
Et ce sans dans déconnexion de session.
Une fois la règle modifiée, on ouvre Devil'sPie I.G.E.L., on clique sur "Sortie" directement et on a l'invite pour redémarrer devilspie.

Edit: Nouvelle Version !
Elle prend en charge les positionnements et dimensionnement prédéfinis (center, minimize, maximize et fullscreen).
Voici un fichier .ds crée à l'instant :

(if (and (is (window_class) "Xfburn") (is (application_name) "Xfburn"))
	(begin

		(set_workspace 2)

		(if (is (window_name) "Xfburn")
			(begin
				(geometry "1077x214")
				(minimize)
			)
		)

		(if (is (window_name) "Préférences")
			(begin
				(set_workspace 2)
				(geometry "775x400")
				(center)
			)
		)

		(if (is (window_name) "Répertoire temporaire")
			(begin
				(set_workspace 2)
				(geometry "595x534")
				(maximize)
			)
		)

		(if (is (window_name) "À propos de Xfburn")
			(begin
				(set_workspace 2)
				(geometry "355x230")
				(center)
			)
		)

    )
)

Et ça marche ! Malgré la configuration un peu loufoque !
Je pourrais même ajouter la loi "matches" ...
Je ne poste pas le script, ça n'a pas l'air d'intéresser ....
Edit2: Loi "matches" ajoutée ...
Edit3: Rajout des codes retour commandes 'cp' et 'mv', donc si on a un code retour non listé il faut regarder de coté là en 1er
Edit4: Un dernier fichier .ds généré par mon script (je ne l'aurais certainement pas fait à la main, j'aurais raté des fenêtres etc ...)

(if (and (is (window_class) "Gedit") (is (application_name) "gedit"))
	(begin

		(if (contains (window_name) "gedit")
			(geometry "1290x920+-36+-31"))

		(if (is (window_name) "Ouvrir")
			(begin
				(geometry "742x535")
				(center)
			)
		)

		(if (is (window_name) "Enregistrer sous")
			(begin
				(geometry "742x535")
				(center)
			)
		)

		(if (is (window_name) "Quick Open")
			(begin
				(geometry "450x300")
				(center)
			)
		)

		(if (is (window_name) "Rechercher et remplacer")
			(begin
				(geometry "582x223")
				(center)
			)
		)

		(if (is (window_name) "Find in Files")
			(begin
				(geometry "408x223")
				(center)
			)
		)

		(if (is (window_name) "Select a _folder")
			(begin
				(geometry "742x535")
				(center)
			)
		)

		(if (is (window_name) "Mode de coloration")
			(begin
				(geometry "477x513")
				(center)
			)
		)

		(if (is (window_name) "Vérifier l'orthographe")
			(begin
				(geometry "534x356")
				(center)
			)
		)

		(if (is (window_name) "Définir la langue")
			(begin
				(geometry "405x283")
				(center)
			)
		)

		(if (is (window_name) "Statistiques du document")
			(begin
				(geometry "434x263")
				(center)
			)
		)

		(if (is (window_name) "Préférences")
			(begin
				(geometry "559x528")
				(center)
			)
		)

		(if (is (window_name) "Choisissez la police de l’éditeur")
			(begin
				(geometry "424x480")
				(center)
			)
		)

		(if (is (window_name) "Insérer la date et l’heure")
			(begin
				(geometry "440x378")
				(center)
			)
		)

		(if (is (window_name) "À propos de Commentateur de code")
			(begin
				(geometry "424x332")
				(center)
			)
		)

		(if (is (window_name) "À propos de Complétion de mots")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Complétion de parenthèses")
			(begin
				(geometry "424x329")
				(fullscreen)
			)
		)

		(if (is (window_name) "À propos de Console Python")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Éditeur de jeu de couleurs")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Édition multiple")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Espaces intelligents")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Fournisseur de données Zeitgeist")
			(begin
				(geometry "471x329")
				(center)
			)
		)


		(if (is (window_name) "À propos de Fragments de code")
			(begin
				(geometry "429x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Git")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Indicateur d'espaces")
			(begin
				(geometry "424x346")
				(center)
			)
		)

		(if (is (window_name) "À propos de Insérer la date et l’heure")
			(begin
				(geometry "431x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Joindre/couper les lignes")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Ligne de commande")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Modificateurs")
			(begin
				(geometry "452x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Outils externes")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (contains (window_name) "À propos de Outils externes")
			(begin
				(geometry "434x353")
				(center)
			)
		)
		
		(if (is (window_name) "À propos de Ouverture rapide")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Panneau de l’explorateur de fichiers")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Recherche dans des fichiers")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Sélecteur de couleurs")
			(begin
				(geometry "499x349")
				(center)
			)
		)

		(if (is (window_name) "À propos de Signets")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Statistiques du document")
			(begin
				(geometry "463x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Surlignage rapide")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de SyncTeX")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Table de caractères")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Terminal intégré")
			(begin
				(geometry "424x329")
				(center)
			)
		)

		(if (is (window_name) "À propos de Translate")
			(begin
				(geometry "424x332")
				(center)
			)
		)

		(if (is (window_name) "À propos de Trier")
			(begin
				(geometry "424x249")
				(center)
			)
		)

		(if (is (window_name) "À propos de Vérificateur orthographique")
			(begin
				(geometry "424x249")
				(center)
			)
		)

		(if (is (window_name) "Color Scheme Editor")
			(begin
				(geometry "700x550")
				(center)
			)
		)

		(if (is (window_name) "Pick the foreground color")
			(begin
				(geometry "488x277")
				(center)
			)
		)

		(if (is (window_name) "À propos de gedit")
			(begin
				(geometry "503x380")
				(center)
			)
		)

		(if (contains (window_name) "Untitled window")
			(begin
				(geometry "561x167")
				(center)
			)
		)

    )
)

À bon entendeur ....
Edit: Tiens, en relisant mon fichier, je me suis rendu compte que j'ai mis une boite "À propos qqchose" en "fullscreen" !
Ça, c'est une erreur de saisie de ma part ! Comme quoi, il faut faire attention, sinon on fait n'importe quoi.
Allez, petite correction à la mano pour moi ...

Dernière modification par Tawal (Le 04/02/2021, à 11:25)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1968 Le 03/02/2021, à 21:12

nordinatueur

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Merci beaucoup !

Bien sûr que ça intéresse. Et si ce n'est pas maintenant, ce sera plus tard !


Linux User #508094
Pour une meilleure coopération, utilisez des liens relatifs sur le forum !

Hors ligne

#1969 Le 03/02/2021, à 22:10

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

J'ai une nouvelle version plus complète que la dernière postée.
Tu dis si tu la veux wink

Dernière modification par Tawal (Le 03/02/2021, à 22:10)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1970 Le 08/02/2021, à 11:29

loutch

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour


recherche aide pour ce script (ne fonctionne plus ) jepense que google @ de nouveau changer un truc .

Pas obliger que ce soit google qui fait la recherche cela peut etre un autre moteur de recherche.

Merci d'avance.

qdbus com.github.radiotray_ng /com/github/radiotray_ng com.github.radiotray_ng.get_player_state | grep artist |sed 's/^.*" \: "//' |sed 's/",.*$//' > artiste_titre.txt
qdbus com.github.radiotray_ng /com/github/radiotray_ng com.github.radiotray_ng.get_player_state | grep title  |sed 's/^.*" \: "//' |sed 's/",.*$//' >> artiste_titre.txt
titre=$(cat artiste_titre.txt)
lynx --source -useragent="Googlebot-Image/1.0" "www.google.com/search?q=$titre\&tbm=isch" | perl -pe 's!.*?<img .*?src="([^"]*)".*!$1!' > lienMiniaturefile
sed -i 's/^.* http\:/http\:/' lienMiniaturefile
sed -i '/gstatic/!d' lienMiniaturefile

lienMiniature=$(cat lienMiniaturefile)
lynx -dump "$lienMiniature" > miniatureGoogleImage

convert miniatureGoogleImage pochette.png

cette partie qui cause problème.

lynx --source -useragent="Googlebot-Image/1.0" "www.google.com/search?q=$titre\&tbm=isch" | perl -pe 's!.*?<img .*?src="([^"]*)".*!$1!' > lienMiniaturefile
sed -i 's/^.* http\:/http\:/' lienMiniaturefile
sed -i '/gstatic/!d' lienMiniaturefile

lienMiniature=$(cat lienMiniaturefile)
lynx -dump "$lienMiniature" > miniatureGoogleImage

@+

Hors ligne

#1971 Le 05/04/2021, à 11:44

thib1984

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Je vous propose un "script" (en réalité c'est du python, mais cela reste de la ligne de commande) sur lequel j'ai pas mal travaillé à l'automne durant l'hacktoberfest.

pypodo est un paquet pip (ou image docker si vous voulez -mais c'est moins performant-). Il s’agit d’un outil de todolist qui fonctionne avec un fichier .todo à la racine de votre home par défaut. Il possède un mécanisme d’index et d’étiquettes.

https://pypi.org/project/pypodo/
https://github.com/thib1984/pypodo

https://user-images.githubusercontent.c … c09999.png

N'hésitez pas à proposer des issues sur le projet git smile


Modération : merci d'utiliser des images de petite taille (300x300) ou des miniatures pointant sur ces images (Des hébergeurs comme Toile Libre ou TDCT'Pix le permettent).

Dernière modification par cqfd93 (Le 05/04/2021, à 11:50)

En ligne

#1972 Le 05/04/2021, à 15:42

Watael

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

j'ai cru que c'était un podomètre !
pourquoi pypodo, et pas pytodo ?


Welcome to sHell. · eval is evil.

Hors ligne

#1973 Le 08/04/2021, à 19:38

thib1984

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Pytodo était déjà pris, du coup, j'ai cherché un jeu de mots avec python/todo/pip cool

En ligne

#1974 Le 09/04/2021, à 18:45

Tawal

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Hello,

On connaît tous l'addition de tableaux en bash avec :

Tab_Somme=( "${Tab1[@]}" "${Tab2[@]}" )

Mais quid de la soustraction ?

J'entends par là supprimer les éléments communs aux deux tableaux :

  • Tab2 - Tab1             --> Tab2 se verra enlever tous les éléments de Tab1 (Tab1 reste intact).

  • Tab3=Tab2-Tab1     --> Tab3 reçoit la soustraction, Tab1 et Tab2 restent intacts.

Alors, je me suis penché sur la question et j'ai pondu un p'tit bout de script qui fait l'affaire :

for i1 in ${!tab1[@]}
do
    for i2 in ${!tab2[@]}
    do
        while [ "${tab2[$i2]}" = "${tab1[$i1]}" ]
        do
            tab2=( "${tab2[@]:0:$i2}" "${tab2[@]:$((i2+1))}" )     # Suppression de l'élément indice i2 dans Tab2
#            break 2
        done
    done
done

Le "while" est pour continuer en cas d'éléments successifs identiques.
L'option "break 2" est pour ne supprimer que la 1ère occurrence dans le tableau Tab2.
On peut monter un système autour de ce break pour sélectionner le nombre d'occurrence ôtées.

Pour garder une sauvegarde de Tab2, il suffit d'en faire une copie et de travailler sur la copie.

C'est rigolo, ça peut peut-être servir ...

Au plaisir.


Edit: Je me suis amusé (sans break 2) :

$ ./../../Progs-Test/Tableau-Soustraction2
Formule des tableaux :
   * Tab1=( A C D E G )
   * Tab2=( {A..E} {C..G} C E )

Tab1 : (éléments à supprimer)
   Tab1[0]=A
   Tab1[1]=C
   Tab1[2]=D
   Tab1[3]=E
   Tab1[4]=G

Soustraction :
  A   oté de Tab2 ind 0   ind Tab1 0

  C   oté de Tab2 ind 1   ind Tab1 1
      oté de Tab2 ind 3
      oté de Tab2 ind 7

  D   oté de Tab2 ind 1   ind Tab1 2
      oté de Tab2 ind 2

  E   oté de Tab2 ind 1   ind Tab1 3
      oté de Tab2 ind 1
      oté de Tab2 ind 3

  G   oté de Tab2 ind 2   ind Tab1 4

Tab2 : (tableau original)
   Tab2[0]=A
   Tab2[1]=B
   Tab2[2]=C
   Tab2[3]=D
   Tab2[4]=E
   Tab2[5]=C
   Tab2[6]=D
   Tab2[7]=E
   Tab2[8]=F
   Tab2[9]=G
   Tab2[10]=C
   Tab2[11]=E

Tab2_trav : (tableau résultat)
   Tab2_trav[0]=B
   Tab2_trav[1]=F

$

Dernière modification par Tawal (Le 09/04/2021, à 19:22)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

En ligne

#1975 Le 11/04/2021, à 13:13

thib1984

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

With ytdlmusic, you can download from youtube a mp3 music without use browser. 5 choices are available with small summary to facilitate the choice. You can also use auto mode to download the first item.

Avec ytdlmusic, vous pouvez télécharger depuis youtube une musique au format mp3 sans utiliser votre navigateur. 5 choix sont proposés avec un petit résumé pour faciliterle choix. Vous pouvez aussi utiliser le mode 'auto' afin de télécharger le premier item.

Exemple d'utilisation :

tga@DESKTOP-BRCQS31:~$ ytdlmusic "the beatles" "let it be"
artiste : the beatles
title : let it be
search the beatles let it be mp3 with youtubesearchpython

1
Let It Be (Remastered 2009)
https://www.youtube.com/watch?v=QDYfEBY9NM4
4:04 - 75,940,717 views


2
Let It Be (Remastered 2015)
https://www.youtube.com/watch?v=HzvDofigTKQ
3:51 - 13,390,170 views


3
The Beatles - Let it be
https://www.youtube.com/watch?v=7P6X3IWLECY
4:15 - 29,202,773 views


4
Beatles   Let It Be 1970
https://www.youtube.com/watch?v=nt9uBlRuBPw
3:55 - 326,823 views


5
Let It Be (Remastered 2009)
https://www.youtube.com/watch?v=hR-3ajVftG4
3:53 - 1,684,647 views


which (1-5, 0 to exit properly) ? 3
future file name is : the_beatles_let_it_be.mp3
download https://www.youtube.com/watch?v=7P6X3IWLECY with youtubedl
[youtube] 7P6X3IWLECY: Downloading webpage
[download] Destination: the_beatles_let_it_be.m4a
[download] 100% of 3.92MiB in 00:00
[ffmpeg] Correcting container in "the_beatles_let_it_be.m4a"
[ffmpeg] Destination: the_beatles_let_it_be.mp3
Deleting original file the_beatles_let_it_be.m4a (pass -k to keep)
[ffmpeg] Adding metadata to 'the_beatles_let_it_be.mp3'
the_beatles_let_it_be.mp3 is ready

ou

tga@DESKTOP-BRCQS31:~$ ytdlmusic "joe dassin" "la fleur aux dents" "auto"
artiste : joe dassin
title : la fleur aux dents
search joe dassin la fleur aux dents mp3 with youtubesearchpython
future file name is : joe_dassin_la_fleur_aux_dents.mp3
download https://www.youtube.com/watch?v=U7iIP8Gc3OY with youtubedl
[youtube] U7iIP8Gc3OY: Downloading webpage
[download] Destination: joe_dassin_la_fleur_aux_dents.webm
[download] 100% of 2.12MiB in 00:00
[ffmpeg] Destination: joe_dassin_la_fleur_aux_dents.mp3
Deleting original file joe_dassin_la_fleur_aux_dents.webm (pass -k to keep)
[ffmpeg] Adding metadata to 'joe_dassin_la_fleur_aux_dents.mp3'
joe_dassin_la_fleur_aux_dents.mp3 is ready

On peut coupler le mode auto à un script shell pour boucler sur un csv

#!/bin/bash

file_csv="./test.csv"
colonne_artiste=2
colonne_titre=1
sep=','

i=1
while true
do
	i=$((i+1))
	line=$(sed $i'!d' $file_csv)
	artiste=$(echo $line | cut -d $sep -f $colonne_artiste) 
        titre=$(echo $line | cut -d $sep -f $colonne_titre)
	echo ""
	echo ""
	echo "********************"
	echo $line
	[ -z "$line" ] && echo "ligne vide : fin du script" && exit 0
	ytdlmusic "$artiste" "$titre" auto
	echo "********************"
done 

ce qui donne

tga@DESKTOP-BRCQS31:~$ batch.sh
********************
Bad,Michael Jackson,Bad 25th Anniversary,Favorite Tracks,Favorite
artiste : Michael Jackson
title : Bad
search Michael Jackson Bad mp3 with youtubesearchpython
future file name is : michael_jackson_bad.mp3
download https://www.youtube.com/watch?v=dIQmcwSg0nU with youtubedl
[youtube] dIQmcwSg0nU: Downloading webpage
[download] Destination: michael_jackson_bad.m4a
[download] 100% of 3.80MiB in 00:00
[ffmpeg] Correcting container in "michael_jackson_bad.m4a"
[ffmpeg] Destination: michael_jackson_bad.mp3
Deleting original file michael_jackson_bad.m4a (pass -k to keep)
[ffmpeg] Adding metadata to 'michael_jackson_bad.mp3'
michael_jackson_bad.mp3 is ready
********************


********************
They Don't Care About Us (Remastered Version),Michael Jackson,Michael Jackson's This Is It,Favorite Tracks,Favorite
artiste : Michael Jackson
title : They Don't Care About Us (Remastered Version)
search Michael Jackson They Don't Care About Us (Remastered Version) mp3 with youtubesearchpython
future file name is : michael_jackson_they_don_t_care_about_us_remastered_version_.mp3
download https://www.youtube.com/watch?v=GsHZBisKwxg with youtubedl
[youtube] GsHZBisKwxg: Downloading webpage
[download] Destination: michael_jackson_they_don_t_care_about_us_remastered_version_.m4a
[download] 100% of 4.39MiB in 00:00
[ffmpeg] Correcting container in "michael_jackson_they_don_t_care_about_us_remastered_version_.m4a"
[ffmpeg] Destination: michael_jackson_they_don_t_care_about_us_remastered_version_.mp3
Deleting original file michael_jackson_they_don_t_care_about_us_remastered_version_.m4a (pass -k to keep)
[ffmpeg] Adding metadata to 'michael_jackson_they_don_t_care_about_us_remastered_version_.mp3'
michael_jackson_they_don_t_care_about_us_remastered_version_.mp3 is ready
********************


********************
Beat It,Michael Jackson,Michael Jackson's This Is It,Favorite Tracks,Favorite
artiste : Michael Jackson
title : Beat It
search Michael Jackson Beat It mp3 with youtubesearchpython
future file name is : michael_jackson_beat_it.mp3
download https://www.youtube.com/watch?v=yWxm6PYncIo with youtubedl
[youtube] yWxm6PYncIo: Downloading webpage
[download] Destination: michael_jackson_beat_it.webm
[download] 100% of 4.05MiB in 00:00
[ffmpeg] Destination: michael_jackson_beat_it.mp3
Deleting original file michael_jackson_beat_it.webm (pass -k to keep)
[ffmpeg] Adding metadata to 'michael_jackson_beat_it.mp3'
michael_jackson_beat_it.mp3 is ready
********************

ligne vide : fin du script

Lien de téléchargement et Lien Github

PS : c'est un projet perso, vos retours sont donc les bienvenus!

Dernière modification par thib1984 (Le 11/04/2021, à 13:38)

En ligne