Comment démarrer une application sur un autre espace de travail?

13

J'ai besoin de démarrer une application graphique [Lotus Symphony] sur un espace de travail différent de celui actuellement utilisé. [ex.: il y a 4 espaces de travail sur un bureau GNOME.]

Q: Comment dois-je procéder?

ps: C'est nécessaire parce que le premier démarrage de Lotus Symphony après un redémarrage est très, très lent, mais après avoir été utilisé une fois, il démarre très rapidement. Je pense qu'il se met en cache. C'est pourquoi je veux le démarrer à chaque démarrage sur un espace de travail différent, il sera donc rapide plus tard si je dois l'utiliser.

LanceBaynes
la source
Je suppose qu'il pourrait être utile de savoir quel système d'exploitation et quelle version de GNOME vous utilisez.
enzotib
ubuntu 10.04 - gnome-desktop-data 1: 2.30.2-0ubuntu1
LanceBaynes

Réponses:

8

Consultez Devil's Pie (bien que je ne sois pas sûr que cela fonctionnerait avec Gnome3), et vous pouvez trouver plus d'informations utiles sur stackoverflow bash .

Fondamentalement, vous devez faire ce qui suit:

#!/bin/bash
wmctrl -n 8

firefox &
thunderbird &
/usr/bin/netbeans --locale en &
amsn &
gnome-terminal &
sleep 15

wmctrl -r firefox -t 0
wmctrl -r netbeans -t 1 
wmctrl -r terminal -t 2 
wmctrl -r amsn -t 6 
wmctrl -r thunderbird -t 7

#focus on terminal
wmctrl -a terminal 

(Je viens de copier et de coller le code ci-dessus à partir du lien StackOverFlow ci-dessus, car je pense qu'il est explicite).

MISE À JOUR:

Voir ici pour une solution plus simple sur le meilleur site pour les extensions Gnome 3, vous devez installer l' extension Auto Move Windows pour Gnome 3. Au cas où cela ne fonctionnerait pas pour vous (comme vous pouvez le voir sur le lien, il y a quelques distributions que le l'automatisation de l'installation ne fonctionne pas correctement, obtenez ici des exploitations plus détaillées sur la façon de le faire fonctionner.

Hanan N.
la source
2

Le message d'origine concernait l'utilisation d'un script pour faire apparaître une application sur un espace de travail particulier, de sorte qu'un autre script puisse être utilisé dans le script de démarrage pour permettre à un utilisateur de continuer à travailler pendant qu'une application à démarrage très lent est chargée sur un autre espace de travail. Mon script fonctionne très bien en tant que frontal pour la syntaxe wmctrl plutôt lourde, pour lancer une application sur un espace de travail donné, à partir de n'importe quelle invite de commande. Ainsi, un autre script qui répertorie simplement quelque chose comme, lh 1 thunderbird; lh 2 firefox; lh 3 calculator...., ou autre, est maintenant facile. Il y a cependant quelques difficultés de timing, donc le sommeil dans mon script. Ce qui suit est la version mise à jour, que je ne maintiendrai pas ou ne publierai plus. Utilisez TEL QUEL, aucune garantie d'adéquation pour une utilisation particulière. Modifiez à votre guise. Je suggère d'enregistrer comme /usr/local/bin/lh, tout simplement parce quelh n'est pas un autre nom de programme connu, du moins pas sur Mint 18. Quant aux variables - j'ai cité des variables que j'ai jugées nécessaires pour être citées.

#!/bin/sh
## Author: B.A. Computer Services www.ba-computer.com
## Purpose: Frontend to launch anything on a specific desktop/workspace.
##  lh is short for LaunchHere

USAGE="USAGE: $(basename $0) [-r] workspace(1,2,..) command\
    LaunchHere launches COMMAND on specific workspace.\
    -r option returns to current workspace"
[ -z "$1" ] && echo $USAGE && exit 0
ISRETURN=$(false); [ "$1" = "-r" ] && ISRETURN=true && shift;  
WRKSPC=$1;[ -z "$WRKSPC" ] && echo $USAGE && exit 0
WSN=$(expr $WRKSPC - 1)  ## wmctrl starts with 0 as first wrkspc
shift; CMD="$*"; [ -z "$CMD" ] && echo $USAGE && exit 0

WM=$(which wmctrl);[ -z "$WM" ] && echo MISSING wmctrl && exit 1
CURRENT=$(wmctrl -d | grep '*' | cut -c1)


# Switch to desired workspace
$WM -s $WSN
$CMD &
PID=$!
echo Executed $CMD on workspace $WRKSPC,  PID=$PID
sleep 3

# Return to CURRENT workspace ?
# [ $ISRETURN ] && echo TRUE || echo FALSE
[ $ISRETURN ] && $WM -s $CURRENT
BACS
la source
C'est génial. Fonctionne comme un charme. Merci beaucoup!
Mic
0

Bêta - mais cela fonctionne pour moi sur Linux Mint.

#!/bin/sh
## Author: B.A. Computer Services www.ba-computer.com
## Purpose: Frontend to launch anything on a specific desktop/workspace.
##  lh is short for LaunchHere

USAGE="USAGE: $(basename $0) workspace(0,1,2,..) command"
WRKSPC=$1;[ -z "$WRKSPC" ] && echo $USAGE && exit 0
shift; CMD="$*"; [ -z "$CMD" ] && echo $USAGE && exit 0

WM=$(which wmctrl);[ -z "$WM" ] && echo MISSING wmctrl && exit 1

echo Executing $CMD on workspace $WRKSPC
$WM -s $WRKSPC
eval $CMD &
sleep 1
$WM -r :ACTIVE: -t $WRKSPC
user278634
la source
Le evaldevrait se produire sur "$@", ou la commande, si l'un de ses arguments contient des espaces ou des caractères globbing de nom de fichier, ne fonctionnera pas. En général, ce script doit citer des extensions de variables.
Kusalananda
0

Je suis inspiré du post de @ user278634 dans ce fil, merci.

Ce que j'ai modifié c'est:

  1. changez 'eval $ CMD &' en 'eval "$ CMD &"' en raison de la commande pid $ !.
  2. conserver l'espace de travail actuel plutôt que de passer à celui spécifié; il suffit de lancer la commande dans l'espace de travail spécifié.
  3. déplacez la commande vers l'espace de travail spécifié juste après avoir trouvé l'identifiant de fenêtre, plutôt que de dormir 1 seconde. C'est un peu important pour moi car j'ouvre habituellement 8 terminaux pour chaque espace de travail et géométrie X au démarrage de la connexion au bureau. Cela prendrait plus de 8 secondes lors de l'utilisation de 'sleep 1' alors que mon script ne prend que 2..3 sec.

Voici mon script:

#!/bin/sh
# = NAME
# lh - Launch Here
#
# = SYNOPSIS
# lh <workspace> <command> [<command-args>]
#
# = DESCRIPTION
# launch command (with any command-args) on a specific desktop/workspace.
#
# Example:
#
#   lh 2 xterm -geometry 80x46+881+0
#
# = Author
# Fumisky Wells

USAGE="USAGE: $(basename $0) workspace(0,1,2,..) command"
WRKSPC=$1;[ -z "$WRKSPC" ] && echo $USAGE && exit 0
shift; CMD="$*"; [ -z "$CMD" ] && echo $USAGE && exit 0    
WM=$(which wmctrl);[ -z "$WM" ] && echo MISSING wmctrl && exit 1    
eval "$CMD &"
pid=$!    
while :; do
  wid=$($WM -l -p | grep " $pid " | awk '{print $1}')
  if [ "$wid" != "" ]; then
    $WM -i -r $wid -t $WRKSPC
    exit
  fi
  # not found yet...
  sleep 0.1
done
Fumisky Wells
la source
0

Installer wmctrl

sudo apt install wmctrl

Et créez un script (dans cet exemple thunderbird sur le deuxième espace de travail ( -t 1)):

#!/bin/sh

 (thunderbird &)  & sleep 5 && 
sh -c "wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"

Pour connaître le nom de votre application sur wmctrl, vous pouvez le voir en tapant sur votre terminal:

wmctrl -l

Et remplacez-le par le nom correct dans le script.

Soyez prudent avec la lettre majuscule ("Thunderbird" pas "thunderbird") !!

Autre exemple avec Firefox sur l'espace de travail 3D ( -t 2):

#!/bin/sh
(firefox &)  & sleep 5 && 
sh -c "wmctrl -i -r `wmctrl -l | grep Firefox` -t 2"

Prime :

Voici la commande à exécuter au démarrage:

sh -c "thunderbird  & sleep 5 && wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"

Travaillez sur Debain 10 avec Cannelle. Mais devrait fonctionner pour tous

pzim
la source