Wie starte ich eine Anwendung in einem anderen Arbeitsbereich?

13

Ich muss eine GUI-Anwendung [Lotus Symphony] auf einem anderen als dem derzeit verwendeten Arbeitsbereich starten. [Bsp .: Auf einem GNOME-Desktop befinden sich 4 Arbeitsbereiche.]

F: Wie mache ich das?

PS: Dies ist erforderlich, da der erste Start von Lotus Symphony nach einem Neustart sehr, sehr langsam ist, aber nach einmaliger Verwendung sehr schnell erfolgt. Ich denke, dass es sich zwischenspeichert. Deshalb möchte ich es bei jedem Start in einem anderen Arbeitsbereich starten, damit es später schnell ist, wenn ich es verwenden muss.

LanceBaynes
quelle
Es könnte hilfreich sein zu wissen, welches Betriebssystem und welche GNOME-Version Sie verwenden.
Enzotib
ubuntu 10.04 - gnome-desktop-data 1: 2.30.2-0ubuntu1
LanceBaynes

Antworten:

8

Schauen Sie sich Devil's Pie an (obwohl ich nicht sicher bin, ob es mit Gnome3 funktionieren würde) und finden Sie weitere nützliche Informationen zu Stackoverflow Bash .

Grundsätzlich sollten Sie Folgendes tun:

#!/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 

(Ich habe gerade den obigen Code aus dem StackOverFlow-Link oben kopiert und eingefügt, da ich denke, dass er selbsterklärend ist).

AKTUALISIEREN:

Sehen Sie hier für eine einfachere Lösung am besten Standort für Gnome 3 Erweiterungen, sollten Sie die Installation von Auto Move Windows - Erweiterung für Gnome 3. Falls es nicht für Sie arbeiten (wie Sie auf den Link sehen können , gibt es einige Distros sind , dass die Die Automatisierung der Installation funktioniert nicht richtig. Hier erfahren Sie, wie Sie die Installation automatisieren können .

Hanan N.
quelle
2

Der ursprüngliche Beitrag bezog sich auf die Verwendung eines Skripts, um eine Anwendung in einem bestimmten Arbeitsbereich anzuzeigen, sodass ein anderes Skript im Startskript verwendet werden kann, damit ein Benutzer weiterarbeiten kann, während eine sehr langsam startende Anwendung in einem anderen Arbeitsbereich geladen wird. Mein Skript eignet sich hervorragend als Front-End für die recht umständliche wmctrl-Syntax, mit der Sie von jeder Eingabeaufforderung aus eine beliebige Anwendung in einem bestimmten Arbeitsbereich starten können. Somit ist ein weiteres Skript, das einfach so etwas wie lh 1 thunderbird; lh 2 firefox; lh 3 calculator... oder was auch immer auflistet , jetzt einfach. Es gibt jedoch einige Schwierigkeiten mit dem Timing, also dem Schlaf in meinem Drehbuch. Das Folgende ist die aktualisierte Version, die ich nicht pflegen oder erneut posten werde. Verwendung WIE BESEHEN, keine Garantie für die Eignung für eine bestimmte Verwendung. Ändern Sie, wie Sie möchten. Ich schlage vor, als /usr/local/bin/lh, einfach weillh ist kein anderer bekannter Programmname, zumindest nicht auf Mint 18. Was Variablen betrifft - Ich habe Variablen angegeben, die ich für notwendig hielt, um sie in Anführungszeichen zu setzen.

#!/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
quelle
Das ist so toll. Klappt wunderbar. Danke vielmals!
Mic
0

Beta - aber es funktioniert bei mir unter 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
quelle
Das evalsollte möglicherweise bei passieren "$@", oder der Befehl wird nicht funktionieren, wenn eines seiner Argumente Leerzeichen oder Dateinamen enthält, die als Globbing-Zeichen verwendet werden. Im Allgemeinen muss dieses Skript Variablenerweiterungen angeben.
Kusalananda
0

Ich bin von @ user278634s Beitrag in diesem Thread inspiriert , danke.

Was ich modifiziert habe ist:

  1. Ändern Sie 'eval $ CMD &' in 'eval "$ CMD &" &', da der Befehl pid $!
  2. Behalten Sie den aktuellen Arbeitsbereich bei, anstatt zum angegebenen zu wechseln. Starten Sie einfach den Befehl im angegebenen Arbeitsbereich.
  3. Verschieben Sie den Befehl direkt nach dem Auffinden der Fenster-ID in den angegebenen Arbeitsbereich, anstatt 1 Sekunde in den Energiesparmodus zu wechseln. Dies ist ein bisschen wichtig für mich, da ich normalerweise beim Start von desktop-login 8 Terminals für jeden Arbeitsbereich und jede X-Geometrie öffne. Dies würde mehr als 8 Sekunden dauern, wenn "sleep 1" verwendet wird, während mein Skript nur 2..3 Sekunden benötigt.

Hier ist mein Skript:

#!/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
quelle