[Risolto]Dock App Preferite e Doppi click.Possibile evitare istante multiple per determinate applicazioni ?

Configurazione e uso delle applicazioni del desktop manager predefinito a partire dalla versione 18.04 di Ubuntu.
DjDiabolik
Prode Principiante
Messaggi: 130
Iscrizione: venerdì 30 marzo 2012, 4:03

Re: Possibile evitare istante multiple per determinate applicazioni ?

Messaggio da DjDiabolik »

GjMan78 ha scritto:
mercoledì 10 aprile 2024, 8:35
Alla fine sei riuscito nel tuo intento. Bravo!
Si sembra di si... anche se la questione del doppio "$1" non mi spiego perché la cosa non va in errore. Forse perchè in un caso il $1 lo usiamo nel contesto della condizione IF e magari quello che invece viene dal .desktop seppur abbiano lo stesso nome magari alla fine sono due variabili diverse ?
Se c'è un altra cosa che non mi spiego è perchè, da un momento all'altro, mi sono ritrovato quella finestra del terminale che rimaneva aperta in backgroud eseguendo il .desktop di kodi dopo i test. Cioè il .desktop è identico e cancellando il suo .sh e lo stesso .desktop e rifancedoli da zero ora il terminale sicuramente c'è ma almeno non lo vedo aperto in background.

Ho addirittura timore a rifare i test... almeno che non li faccio direttamente con una diversa accoppiata .sh/.desktop che potrebbe essere un idea...


Poi una piccola stupidaggine... se volessi fare una cosa simile per kodi in versione flatpak... come giustamente tu mi dicevi il suo .desktop è infatti in /var/lib/flatpak/exports/share/applications/
Ma il collegamento presente qua è un collegamento.. e se ne apro le proprietà addirittura non riesco nemmeno a vederlo completo perchè me lo indica come ../../../app/tv.kodi.Kodi/current/active/export/share/applications/tv.kodi.Kodi.desktop.

Se poi invece vado sulla mia cartella home cioè in /home/diabolik/.local/share/flatpak/ qui ho solo due cartelle 'db' e 'repo' e un file 'changed' non c'è il secondo path che tu suggerisci. in pratica tu suggerivi questo ~/.local/share/flatpak/exports/share ma da me questo path non esiste.


*EDIT*
Poi c'è anche un altra cosa che forse mi manda in confusione ma il comando:

Codice: Seleziona tutto

diabolik@NUC-Ubuntu:~$ update-desktop-database
The databases in [/usr/share/ubuntu/applications, /home/diabolik/.local/share/flatpak/exports/share/applications, /var/lib/flatpak/exports/share/applications, /usr/local/share/applications, /usr/share/applications, /var/lib/snapd/desktop/applications] could not be updated.
diabolik@NUC-Ubuntu:~$ 
Come mai non aggiorna i file .desktop in ~/.local/share/application ? Eventualmente a questo comando si può aggiungere questo path ?

*EDIT 2*
Onestamente cominciano a girarmi un pò i @@... ora che mi serve questa dannata finestra di terminale non riesco a farla uscire fuori che gli pijasse un colpo!
Ho fatto questo:

Codice: Seleziona tutto

[Desktop Entry]
Version=1.0
Name=Kodi Test Desktop
GenericName=Media Center
GenericName[zh_CN]=媒体中心
Comment=Manage and view your media
Comment[ru]=Просмотр и управление мультимедиа
Comment[zh_CN]=管理和查看您的媒体
Exec=bash -c "/usr/bin/koditest.sh provadellamadonna ; read -p press"
Icon=kodi
Terminal=true
Type=Application
Categories=AudioVideo;Video;Player;TV;

Actions=Fullscreen;Standalone;

[Desktop Action Fullscreen]
Name=Open in fullscreen
Name[zh_CN]=全屏打开
Exec=/usr/bin/koditest.sh -fs

[Desktop Action Standalone]
Name=Open in standalone mode
Name[zh_CN]=在独立模式下打开
Exec=/usr/bin/koditest.sh --standalone
ed ovviamente questo:

Codice: Seleziona tutto

#!/bin/bash

echo 'CTRL + C entro 10 secondi per annullare...'
echo 'Test Argomento: ' "$1" && sleep 10

_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

if ! _isRunning kodi; then
        #kodi "$1"
fi

exit 0
Ma che il signore sia maledetto... quel Terminal=true non funziona una S.E.G.A!!!! Non esce fuori nulla... comincio ad incazzarmi e non va bene affatto.

*EDIT 3*
Guarda... c'è qualcosa di sicuramente strano nel REFRESH stesso dei file .desktop.
Per risolvere c'è solo una soluzione.. FISICAMENTE SPOSTARE il .desktop dalla cartella ~/.local/share/application . Aspettare tipo 5 secondi poi ce lo ripiazzo (magari torno da nautilus indietro semplicemente alla cartella share e uso taglia ed incolla poi lo risposto di nuovo in application). Solo cosi sembra effettivamente PRENDERE ed ACCETTARE tutte le modifiche che fai all'interno del file .desktop.
Compreso anche la cosa del "Terminal=true" o "Terminal=false"

Non saprei se è un BUG di Wayland o di Gnome stesso o di qualsiasi altro componenti di ubuntu 22.04.4 LTS..... lol.
DjDiabolik
Prode Principiante
Messaggi: 130
Iscrizione: venerdì 30 marzo 2012, 4:03

Re: Possibile evitare istante multiple per determinate applicazioni ?

Messaggio da DjDiabolik »

Ma porca miseria........ allora amici come avrete ben capito la cosa di questo _ifrunning funziona molto bene, AIHME' , ho scoperto che risolve parzialmente il problema. Perchè ? Ve lo spiego subito:

Allora io sono al desktop di UBUNTU ok ? Ho sulla sinistra la DOCK delle APP preferite. Già dall'inizio lo scopo del thread era quello di prevenire le doppie istanze in caso di DOPPIO CLICK involontario.

Bè forse dirrò una cavolata ma tutta sta cosa del file .SH forse in caso di doppio CLICK non fa in tempo ad entrare in gioco e quindi quando già FATTO fin qua non fa il suo lavoro.
Nello specifico se io faccio doppio click sull'icona del "Retropie" (per rimanere alle mie due icone usate fin qua in questo thread) vedo cmq le DUE ISTANZE di Emulationstation che vengono avviate cosi come esattamente KODI se io faccio doppio click sull'icona vedo cmq due istanze di KODI che si avviano.

Arrivati ad ora mi sa che cambia proprio il contesto di tutta la questione. Cioè.. forse quando fatto fin'ora è PERFETTO per una specifica situazione. Cioè io apro Kodi, lo iconizzo tornando al dekstop se ci riclicco sull'icona appunto non parte una seconda istanza di Kodi stesso però non è ok per il doppio click.

Ora non so... che faccio edito la discussione ? Ne apro una seconda ? Forse ora faccio un EDIT del primo post magari che rimanda a questo reply.....

*EDIT Come Soluzione Temporanea*
Allora con un pò di fatica sono arrivato a questo metodo RUDE:

Codice: Seleziona tutto

#!/bin/bash
START=$(cat ./test.pipe)

if [ $START == 1 ]
then
    exit 0
else
    echo 1 >./test.pipe
    sleep 1 
    echo 0 >./test.pipe
fi

 
_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

if ! _isRunning emulationstatio; then
    #gnome-terminal --full-screen --hide-menubar -e emulationstation
    sudo gedit

fi

exit 0
@GjMan78 non so se editando ti arriva la menzione ma mi piacerebbe sapere se hai una soluzione migliore. Allora vediamo.
In pratica non so se è possibile creare una variabile GENERALE. In pratica io ho creato quel piccolo SLEEP di 1 secondo sullo script di esecuzione in questo caso prendendo come esempio lo script del retropie.
Che cosa faccio ?
- In pratica lo script appena avviato non fa altro che estrarre la variabile dal file ./temp.pipe (che viene salvato nella home dell'utente)
- Il File in questione in teoria dovrebbe contenere un singolo carattere numerico 0 (zero) o 1.
- Poi faccio verificare questa variabile appena ricavata.
- Se la variabile è 1 killo direttamente l'esecuzione dello script
- Se invece la variabile è 0 (zero) appunto la setto ad 1 sul file, parte lo sleep di 1 secondo, poi resetto a zero il valore del file temp.pipe e quindi lancio emulationstation (nell'esempio che vedete qui ho fatto lanciare gedit per avere un output a schermo che quando fatto sopra funzionasse... invece di emulationstation mi sembrava la cosa più rapida da far partire)


Questo in pratica quel secondo che la variabile su temp.pipe è settata su 1 fa si che se si lanciano 2 sezioni differenti del retropie.sh la seconda trova la variabile ad 1 (che viene tenuta ad 1 per un secondo) e quindi alla fine è solo un'istanza singola che viene lanciata e non due.
Vale sempre poi la cosa dell'ifrunning su click a lungo termine.

Ora come dico la soluzione del file temporaneo è rude. Come dico se ci fosse modo di settare una VARIABILE GENERICA sarebbe più easy. Ho provato con EXPORT e ha "giocare" con la variabile START ma sembra non funzionare quando avvio diversi retropie.sh.
Chi sa dirmi perchè ?


*EDIT 2*
Altra variante appena testata... creare un file totalmente temporaneo in pratica cosi:

Codice: Seleziona tutto

START=$(cat ./test.pipe)

if [ $START == 1 ]
then
    exit 0
else
    echo 1 >./test.pipe && sleep 1 && rm ./test.pipe
fi
Posso eventualmente far settare e creare il file direttamente nella cartella /tmp per assurdo.........

*EDIT 3*
E alla fine questi sono i test definitivi........ alla fine salvo il tutto su file temporaneo.. il retropie.sh è ora cosi (Da notare i primi 2 IF commentati per puro scopo di test):

Codice: Seleziona tutto

#!/bin/bash
<<com #Da qua funziona a tutto
START=$(cat ./test.pipe)

if [ $START == 1 ]
then
    exit 0
else
    echo 1 >./test.pipe
    sleep 1
    echo 0 >./test.pipe
fi


START=$(cat ./test.pipe)

if [ $START == 1 ]
then
    exit 0
else
    echo 1 >./test.pipe && sleep 1 && rm ./test.pipe
fi
com

START=$(cat /tmp/temp.$PPID)

if [ $START == 1 ]
then
    exit 0
else
    echo 1 >/tmp/temp.$PPID && sleep 1 && rm /tmp/temp.$PPID
fi

 
_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

if ! _isRunning emulationstatio; then
    #gnome-terminal --full-screen --hide-menubar -e emulationstation
    sudo gedit

fi

exit 0
Qui forse è addiriturra più semplice capire cosa faccio ora:
- Il file retropie.sh va a leggere il file /tmp/temp.$PPID (con l'estensione in base all'ID del processo principale)
- Se il file non esiste la variabile START avra valore 0. A quel punto tramite 'else' appunto creo il file temporaneo per un secondo (lo sleep 1) e poi lo cancello subito dopo

Ma se si avviano due istanze consecutive del file retropie.sh appunto la seconda istanza troverà quel file temporaneo settato ad 1 e la variabile START (che è letta ad inizio script) va nell'if 1 e quindi va subito in EXIT 0.

Questo appunto crea.. doppio click.. triplo click... un solo avvio di GEDIT.

Come detto ancora una volta... soluzione rude ma efficace. Se avete altri consigli sono sempre ben accetti.
Avatar utente
woddy68
Rampante Reduce
Rampante Reduce
Messaggi: 8747
Iscrizione: sabato 12 febbraio 2011, 14:23
Desktop: Kde Plasma 6
Distribuzione: openSUSE Tumbleweed - KDE Neon
Sesso: Maschile

Re: [Parzialmente Risolto]Dock App Preferite e Doppi click.Possibile evitare istante multiple per determinate applicazio

Messaggio da woddy68 »

L'unico consiglio che mi sento di darti, è quello di togliere quel tag "[Parzialmente Risolto]"prima che intervengano i moderatori, perché quel tag non è consentito o ritieni che è risolto e allora metti il tag [Risolto] o non lo è, e non metti niente.
Un saluto.
Desktop - DELL Optiplex 7010 - Notebook HP 250
-Ho sempre accettato caramelle dagli sconosciuti-
Avatar utente
GjMan78
Rampante Reduce
Rampante Reduce
Messaggi: 5804
Iscrizione: mercoledì 22 novembre 2006, 19:15
Desktop: KdePlasma
Distribuzione: EndeavourOS
Sesso: Maschile
Località: ~/Italia/Lazio/Viterbo/

Re: [Parzialmente Risolto]Dock App Preferite e Doppi click.Possibile evitare istante multiple per determinate applicazio

Messaggio da GjMan78 »

@DjDiabolik mi spiace ma temo di essermi perso in tutti i passaggi.

Quello che posso dirti come "prima impressione" è che la cosa è diventata enormemente complessa rispetto al compito semplice da svolgere.
Riassumendo: a te servirebbe uno script che controlli se l'applicazione è in funzione e se non lo è la attivi. Non deve fare altro.

Tra stasera e domani faccio qualche prova pratica con retropie ti aggiorno.
MacBook Pro - Intel i5-3210 - 16 Gbyte Ram DDR3 - SSD 500 Gbyte x 2
»»» 𝗙𝗮𝗶 𝗶𝗹 𝗕𝗮𝗰𝗸𝘂𝗽! ¯\_(ツ)_/¯
DjDiabolik
Prode Principiante
Messaggi: 130
Iscrizione: venerdì 30 marzo 2012, 4:03

Re: [Parzialmente Risolto]Dock App Preferite e Doppi click.Possibile evitare istante multiple per determinate applicazio

Messaggio da DjDiabolik »

woddy68 ha scritto:
domenica 14 aprile 2024, 19:28
L'unico consiglio che mi sento di darti, è quello di togliere quel tag "[Parzialmente Risolto]"prima che intervengano i moderatori, perché quel tag non è consentito o ritieni che è risolto e allora metti il tag [Risolto] o non lo è, e non metti niente.
Un saluto.
Allora si in pratica posso mettere anche risolto ma poi continuare la discussione in effetti e magari fare gli edit del caso come ho appena fatto..... Risparmio pure con i caratteri.
GjMan78 ha scritto:
domenica 14 aprile 2024, 19:57
@DjDiabolik mi spiace ma temo di essermi perso in tutti i passaggi.

Quello che posso dirti come "prima impressione" è che la cosa è diventata enormemente complessa rispetto al compito semplice da svolgere.
Riassumendo: a te servirebbe uno script che controlli se l'applicazione è in funzione e se non lo è la attivi. Non deve fare altro.

Tra stasera e domani faccio qualche prova pratica con retropie ti aggiorno.
Allora ha dire il vero non ti sei perso nulla... e come ho sempre detto mi sei stato molto utile perché la cosa _ifrunning mi torna cmq utile.
Però appunto poi mi sono accorto effettivamente che non è quello che a me serviva fare... cioè provo a fare un recap breve:
Allora in pratica una qualsiasi APP impostata per stare nella barra sinistra dei preferiti. Se questa app non ha un controllo integrato per le istanze doppie succede esattamente questo. Se tu fai un doppio click voluto o non voluto (perchè magari ti parte il doppio click per errore) vedrai avviarsi le due istanze distinte dell'app in questione.
Nel mio esempio con Retropie a sua volta viene avviato Emulationstation. Se fai un doppio click appunto le due istanze di emulationstation.

Con la cosa dell'_ifrunning da te suggerita è perfettamente adatta per due click eseguiti a distanza di tempo. Nel caso del doppio click invece a me serve qualcosa che agisca in tempi rapidi e quindi alla fine questa credo sia la soluzione perfetta:

Codice: Seleziona tutto

#!/bin/bash
file=/tmp/file.$PPID
 
if ! [ -f $file ]; 
then 
    echo 1 >$file && sleep 1 && rm $file
else
    exit 0
fi

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

if ! _isRunning emulationstatio; then
    gnome-terminal --full-screen --hide-menubar -e emulationstation
    
fi

exit 0
In pratica è molto semplice cosa sto facendo. Appena io clicco sull'icona Retropie sulla barra lui verifica la NON ESISTENZA del file '$file' nella cartella /tmp.
Se la condizione if è confermata (cioè se non trova il file specificato) nel THEN successivo non faccio altro che creare lo stesso file e dopo un secondo cancellarlo.

Questa cosa appunto crea la condizione che se io avvio col doppio click l'icona Retropie la seconda istanza del file retropie.sh TROVERA' quel file temporaneo nella cartella /tmp e quindi invece del THEN verrà applicato l'ELSE che non fa altro che killare l'esecuzione della seconda istanza del retropie.sh.

Di fatto alla fine qualsiasi click faccio sull'icona di avvio di Retropie in quella barra laterale sinistra dei preferiti entro quello "sleep 1" solo un processo del retropie.sh rimarrà attivo.

Entro quel lasso di tempo di 1 secondo poi entra in gioco il check dell'_ifrunning che previene l'avvio della seconda istanza di Retropie (e quindi emulationstation) anche se faccio un click a distanza di minuti e quello come abbiamo visto era già funzionante perfettamente.

*EDIT*
Per assurdo appena fatto questo per KODI:

Codice: Seleziona tutto

#!/bin/bash
file=/tmp/file.$PPID
 
if ! [ -f $file ]; 
then 
    echo 1 >$file && sleep 1 && rm $file
else
    sleep 10 && exit 0
fi

_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

if ! _isRunning kodi; then
	#echo 'Test Argomento: ' "$1" && sleep 5
	kodi "$1"
fi

exit 0
Forse si riesce a capire ciò a che serve esattamente quel file temporaneo cancellato esattamente un secondo dopo.
Se c'è ed se avete un modo diverso per ottenere lo stesso scopo fatemi sapere ovviamente.
Scrivi risposta

Ritorna a “GNOME”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti