¿Cómo obtener un Unity Launcher diferente con diferentes íconos en cada espacio de trabajo?

20

Leí las distintas respuestas para tener carpetas de escritorio separadas en cada área de trabajo usando Screenlets, Devilspie o CCSM ... pero esa no es la respuesta a mi pregunta. Instalé 14.04 LTS hace unos días y obtuve buenos resultados al ejecutar la mayoría de mis aplicaciones y algunas nuevas. Lo que me gustaría es tener 4 espacios de trabajo separados, cada uno con algunos iconos diferentes para los entornos que ejecuto. Por ejemplo,

  • Espacio de trabajo 1: dedicado a aplicaciones de ciencias y matemáticas
  • Espacio de trabajo 2: dedicado a herramientas de música
  • Área de trabajo 3: para circuitos electrónicos y simulaciones
  • Espacio de trabajo 4: para la navegación web y la informática en general

Piensa en una tableta Android donde cada pantalla puede contener iconos separados.

Debe ser obvio cómo hacer esto, pero no puedo encontrar una respuesta. Tengo 4 días en Ubuntu, así que no asumas que sé lo que estoy haciendo.

    
pregunta Dennis J 10.04.2015 - 14:18

1 respuesta

24

Configurando un Unity Launcher diferente por área de trabajo:


1. 2. 3. < em> 4.

La siguiente solución hace que sea más fácil tener un conjunto diferente de iconos de iniciador por área de trabajo, sin importar cuántos espacios de trabajo tenga.

La configuración incluye dos partes:

  1. Una (una) combinación de teclas de método abreviado para "recordar" el conjunto de íconos del iniciador para el espacio de trabajo actual.

  2. Una secuencia de comandos para ejecutar en segundo plano, haciendo un seguimiento de lo que es el espacio de trabajo actual y configurando el Unity Launcher correspondiente. Actúa cada vez que el usuario cambia de espacio de trabajo.

Cómo funciona

Dos pequeños scripts están involucrados:

El primer script hace una cosa simple: escribe el contenido del iniciador actual en un archivo (oculto) en su directorio de inicio, nombrado (numerado) después de su espacio de trabajo actual.

El script second vigila qué es el espacio de trabajo actual. Si hay un espacio de trabajo change , el script ve si existe un archivo de datos correspondiente (launcher-) (creado por el primer script). Si es así, lee el archivo y altera el Unity Launcher, como se recuerda en el archivo.

Eso es todo.

Cómo configurar

  1. El script necesita wmctrl para instalarse:

    sudo apt-get install wmctrl
    
  2. Crea un directorio en el que ambos scripts se almacenarán. Es importante que ambos scripts se mantengan juntos en un directorio, ya que comparten la funcionalidad y uno importa del otro. Por la misma razón, es importante que los nombre exactamente como se indica a continuación.

  3. Copie cada uno de los siguientes scripts en un archivo vacío (diferente), guárdelos en el directorio (creado en 2. ), exactamente con el nombre de:

    set_workspace.py

    #!/usr/bin/env python3
    import subprocess    
    import os
    
    workspace_data = os.environ["HOME"]+"/.launcher_data_"
    key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"]
    
    def get_res():
        # get resolution
        xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
        pos = xr.index("current")
        return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    
    def current():
        # get the current viewport
        res = get_res()
        vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        dt = [int(n) for n in vp_data[3].split("x")]
        cols = int(dt[0]/res[0])
        curr_vpdata = [int(n) for n in vp_data[5].split(",")]
        curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
        return str(curr_col+curr_row*cols)
    
    def remember_current():  
        currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip()
        f = workspace_data+current()
        open(f, "w").write(currlauncher)
    
    if __name__ == "__main__":
        remember_current()
    

    launcher_perworkspace.py

    #!/usr/bin/env python3
    import subprocess
    import set_workspace
    import time
    
    workspace_data = set_workspace.workspace_data
    key = set_workspace.key
    
    def check_datafile(desktop):
        f = workspace_data+str(desktop)
        try:
            new_launcher = open(f).read()
            command = key[1]+key[2]+' "'+str(new_launcher)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
        except FileNotFoundError:
            pass
    
    curr_dt1 = set_workspace.current()
    check_datafile(curr_dt1)
    
    while True:
        time.sleep(1)
        curr_dt2 = set_workspace.current()
        if curr_dt2 != curr_dt1:
            check_datafile(curr_dt2)
        curr_dt1 = curr_dt2
    
  4. Agregue la primera secuencia de comandos ( set_workspace.py ) a una combinación de teclas de acceso directo de su elección: Configuración del sistema & gt; "Teclado" & gt; "Accesos directos" & gt; "Accesos directos personalizados". Haga clic en "+" y agregue el comando:

    python3 /path/to/set_workspace.py
    
  5. Ejecute la combinación de teclas y vea si se creó un archivo, como: .launcher_data_3 en su directorio de inicio. Probablemente necesites presionar Ctrl + H para hacer que el archivo sea visible (los archivos que comienzan con un . son invisibles por defecto).

    Navegue por sus espacios de trabajo y repita el procedimiento: establezca una combinación de íconos del iniciador y presione la combinación de teclas para "recordar" el conjunto de ese espacio de trabajo específico.

  6. Prácticamente estás hecho ahora. Pruebe ejecutar el script de fondo con el comando (desde una ventana de terminal, manténgalo en ejecución):

    python3 /path/to/launcher_perworkspace.py
    

    Si todo funciona bien y su iniciador cambia por área de trabajo, agregue el siguiente comando a sus aplicaciones de inicio: Dash & gt; Aplicaciones de inicio & gt; Agregar:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
    

Notas

  1. Si desea modificar el conjunto de íconos del iniciador para un espacio de trabajo específico, simplemente navegue al área de trabajo, agregue / elimine íconos a su gusto y presione la combinación de teclas (no es necesario reiniciar el guión de fondo).
  2. Del comentario (s) tengo la sensación de que hay un malentendido en el atajo para recordar el Iniciador actual para el espacio de trabajo actual. Solo necesita un atajo de teclado para "guardar" el iniciador actual para el espacio de trabajo actual. Funcionará exactamente igual, sin importar en qué área de trabajo se encuentre. El script en sí determinará qué es el espacio de trabajo actual.

Editar

De su comentario, entiendo que no está seguro de ejecutar los guiones y que tiene miedo de arruinar su iniciador actual.

Estoy bastante seguro de que es demasiado (o muy poco :)) respeto por lo que está haciendo el guión. Sin embargo, simplemente puede hacer una copia de seguridad del Unity Launcher actual con el comando:

printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output

Esto creará un archivo ~/launcher_output , que contiene el comando completo para restaurar tu Unity Launcher a la situación inicial. En caso de emergencia, simplemente copie el contenido del archivo y péguelo en la terminal.

Pero, de nuevo, es muy poco probable que arruines tu launcher, a menos que cambies el script manualmente.

EDITAR IMPORTANTE (2)

Según lo solicitado en un comentario, una versión que se ejecuta sin tener que usar ninguna combinación de acceso directo ; solo ejecute el script y comience a configurar sus iniciadores en los espacios de trabajo específicos. El script creará archivos (invisibles) en su directorio personal, para recordar su conjunto de iniciadores (Unity-) en los diferentes espacios de trabajo.

Intenté esto en la "versión 1" de la secuencia de comandos, pero siempre "incrustando" las dos comprobaciones de iniciador entre dos comprobaciones del espacio de trabajo resultó ser el truco para evitar el comportamiento no deseado (guardando datos incorrectos) al pasar rápidamente por el espacios de trabajo.

Cómo usar

  1. Al igual que la primera versión, este script usa wmctrl :

    sudo apt-get install wmctrl

  2. Copie la secuencia de comandos en un archivo vacío, guárdelo como launcher_toworkspace.py

  3. Ejecútalo con el comando:

    python3 /path/to/launcher_toworkspace.py
    
  4. Si funciona como se esperaba, agregue el siguiente comando a sus Aplicaciones de inicio:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_toworkspace.py"
    

El script

#!/usr/bin/env python3
import subprocess    
import os
import time

datadir = os.environ["HOME"]+"/.config/lswitcher"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/launcher_data_"

key = [
    "gsettings get ",
    "gsettings set ",
    "com.canonical.Unity.Launcher favorites",
    ]

def get_launcher():
    return subprocess.check_output(
        ["/bin/bash", "-c", key[0]+key[2]]
        ).decode("utf-8").strip()

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def current():
    # get the current viewport
    res = get_res()
    vp_data = subprocess.check_output(
        ["wmctrl", "-d"]
        ).decode("utf-8").split()
    dt = [int(n) for n in vp_data[3].split("x")]
    cols = int(dt[0]/res[0])
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    curr_col = int(curr_vpdata[0]/res[0])+1
    curr_row = int(curr_vpdata[1]/res[1])
    return str(curr_col+curr_row*cols)

curr_ws1 = current()
currlauncher1 = get_launcher()

while True:
    time.sleep(1)
    currlauncher2 = get_launcher()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if currlauncher2 != currlauncher1:
            open(datafile, "wt").write(currlauncher2)
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(currlauncher2)
        else:
            curr_set = open(datafile).read()
            command = key[1]+key[2]+' "'+str(curr_set)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
    curr_ws1 = curr_ws2
    currlauncher1 = get_launcher()

Nota

Si configura sus espacios de trabajo con la versión anterior del script, también deberían funcionar para esta versión.

PPA

Según 2015-04-23, la agradable pregunta de Dennis J y el estímulo de Parto han llevado a crear un ppa para el guión, cubierto en webupd8 , incluida una GUI para administrarlo.

ppa:vlijm/lswitcher

Para instalarlo, ejecuta:

sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher

Desde ahora, está empaquetado para Trusty & amp; Utópico Agregaré otros después de la prueba. También agregaré un instalador .deb , pero sugeriría usar ppa , ya que generalmente este tipo de cosas se actualiza de vez en cuando.

Dado que la ubicación de los datos de la ventana gráfica ha cambiado de ~/ a ~/.config/lswitcher , tendrá que configurar su Unity Launcher nuevamente si utilizó el script anterior.

    
respondido por el Jacob Vlijm 12.04.2015 - 07:15

Lea otras preguntas en las etiquetas