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

20

Leí varias 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 he tenido buen éxito 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,

  • Workspace 1: dedicado a aplicaciones de ciencias y matemáticas
  • Workspace 2: dedicado a herramientas de música
  • Workspace 3 - para circuitos electrónicos y simulaciones
  • Workspace 4 - para navegación web y computación general

Piense en una tableta Android donde cada pantalla puede contener íconos 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.

Dennis J
fuente
¿Quiere decir un conjunto diferente de lanzadores de los iconos por espacio de trabajo? Eso me gusta, pero tengo que correr, trabajaré en eso mañana si eso es lo que quieres decir. Por favor hagamelo saber.
Jacob Vlijm
Sí, eso es Jacob. Existen herramientas específicas (como LTspice) para la simulación de circuitos que no tienen relevancia para la música.
Dennis J
Se puede hacer sin lugar a dudas. Probablemente mañana o mañana :).
Jacob Vlijm
Gracias Jacob Acabo de empezar por el día, así que lo intentaré. ¡Esto suena exactamente como lo que pedí! Entraré en él e informaré de nuevo.
Dennis J
Jacob, aún no he comenzado esto. Antes de comenzar, quiero hacer una imagen de respaldo. No estoy seguro de que las copias de seguridad en la configuración del sistema restaurarán toda la partición. He estado investigando Clonezilla, parece una buena herramienta para crear / restaurar una imagen. De esa manera, si algo sale mal, puedo volver antes de que lo arruine. Hay una nueva unidad de 1 TB en camino esta semana. Necesitaré usar Clonezilla para mover el sistema a él. Parece que los guiones pueden seguirlos, e informaré en cuanto comience. Gracias por el seguimiento, apuesto a que otros también apreciarán lo que has hecho.
Dennis J

Respuestas:

24

Configuración de Unity Launcher diferente por espacio de trabajo:


1. ingrese la descripción de la imagen aquí 2. ingrese la descripción de la imagen aquí 3. ingrese la descripción de la imagen aquí 4. ingrese la descripción de la imagen aquí

La solución a continuación hace que sea posible tener fácilmente un conjunto diferente de iconos de iniciador por espacio de trabajo, sin importar cuántos espacios de trabajo tenga.

La configuración incluye dos partes:

  1. Una (una) combinación de teclas de acceso directo para "recordar" el conjunto de iconos de iniciador para el espacio de trabajo actual.

  2. Un script para ejecutar en segundo plano, realizar un seguimiento de cuál es el espacio de trabajo actual y configurar el Unity Launcher correspondiente. Actúa cada vez que el usuario cambia de espacio de trabajo.

Cómo funciona

Están involucrados dos pequeños guiones:

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

El segundo script vigila cuál es el espacio de trabajo actual. Si hay un cambio en el espacio de trabajo , el script ve si existe un archivo de datos correspondiente (lanzador) (creado por el primer script). Si es así, lee el archivo y altera el Iniciador de Unity, como se recuerda en el archivo.

Eso es.

Como instalar

  1. El script debe wmctrlestar instalado:

    sudo apt-get install wmctrl
    
  2. Cree un directorio en el que se almacenarán ambos scripts . Es importante que ambos scripts se mantengan juntos en un directorio, ya que comparten 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 scripts a continuación en un archivo vacío (diferente), guárdelos en el directorio (creado en 2.), exactamente nombrado como:

    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 el primer script ( set_workspace.py) a la combinación de teclas de acceso directo que prefiera: Configuración del sistema> "Teclado"> "Accesos directos"> "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 .launcher_data_3se crea un archivo, como: en su directorio de inicio. Probablemente necesitará presionar Ctrl+ Hpara que el archivo sea visible (los archivos, comenzando con a, .son invisibles por defecto).

    Navegue a través de sus espacios de trabajo y repita el procedimiento: configure una combinación de iconos de iniciador y presione la combinación de teclas para "recordar" el conjunto para ese espacio de trabajo específico.

  6. Prácticamente has terminado ahora. Pruebe y ejecute el script de fondo con el comando (desde una ventana de terminal, manténgalo ejecutándose):

    python3 /path/to/launcher_perworkspace.py
    

    Si todo funciona bien y su lanzador cambia por espacio de trabajo, agregue el siguiente comando a sus aplicaciones de Inicio: Tablero> Aplicaciones de inicio> Agregar:

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

Notas

  1. Si desea modificar el conjunto de iconos del iniciador para un espacio de trabajo específico, simplemente navegue hasta el espacio de trabajo, agregue / elimine los iconos que desee y presione la combinación de teclas (no es necesario reiniciar el script de fondo).
  2. De los comentarios tengo la sensación de que hay un malentendido en el acceso directo para recordar el Iniciador actual para el espacio de trabajo actual. Solo necesita un método abreviado de teclado para "guardar" el iniciador actual para el espacio de trabajo actual. Funcionará exactamente igual, sin importar en qué espacio de trabajo se encuentre. El script en sí determinará cuál es el espacio de trabajo actual.

Editar

Por su comentario, entiendo que no está seguro de ejecutar los scripts y tiene miedo de estropear 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 de su 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 que ~/launcher_outputcontiene el comando completo para restaurar su Unity Launcher a la situación inicial. En caso de emergencia, simplemente copie el contenido del archivo y péguelo en el terminal.

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


EDICIÓN IMPORTANTE (2)

Como se solicitó en un comentario, por la presente una versión que se ejecuta sin tener que usar ninguna combinación de atajos; simplemente ejecute el script y comience a configurar sus lanzadores en los espacios de trabajo específicos. El script creará archivos (invisibles) en su directorio de inicio, para recordar su conjunto de lanzadores (Unity-) en los diferentes espacios de trabajo.

Intenté esto en la "versión 1" del script, pero siempre "incrustando" las dos comprobaciones del iniciador entre dos comprobaciones del espacio de trabajo resultó ser el truco para evitar comportamientos no deseados (guardar datos incorrectos) al moverse rápidamente por los espacios de trabajo.

Cómo utilizar

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

    sudo apt-get install wmctrl

  2. Copie el script en un archivo vacío, guárdelo como launcher_toworkspace.py

  3. Ejecútelo con el comando:

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

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

La secuencia de comandos

#!/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 el 23/04/2015, la buena pregunta de Dennis J, y el aliento de Parto, han llevado a la creación de un ppaguión, cubierto en webupd8 , que incluye una GUI para administrarlo.

ppa:vlijm/lswitcher

Para instalarlo, ejecute:

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

ingrese la descripción de la imagen aquí

Desde ahora, está empaquetado para Trusty & Utopic. Agregaré otros después de la prueba. También agregaré un .debinstalador, pero sugeriría usar el 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.

Jacob Vlijm
fuente
¿Es esto posible sin usar los atajos de teclado? La forma en que lo visualizo es la siguiente: cuando está en el espacio de trabajo uno, solo se muestra un conjunto de iconos; cuando cambio al espacio de trabajo dos, el iniciador está vacío, excepto los iconos de guión y papelera; luego agrego los iconos que quiero que se guardan automáticamente. Repita para los otros espacios de trabajo. Tal vez incluso pueda crear una GUI para él; le dará +500 si lo hace funcionar. La GUI es opcional.
Parto
1
@Parto WOW, sabes cómo llamar la atención de alguien :) Eso es posible con seguridad, pero se necesitarían múltiples hilos para que funcione sin problemas (lo probé en un script de pista "mono"). Espere una respuesta en los próximos días :).
Jacob Vlijm
1
Increíble. Estaré esperando ... buena pregunta, sin embargo, me pregunto cómo no pensé en eso.
Parto
1
@Parto Debo decir que estoy impresionado por tu generosidad. Estoy planeando trabajar más en ello y tal vez crear una ppa, incluyendo GUI para iniciar / detener, preferencias, etc. ¡Gracias por el empuje! Su escritorio se ve muy bien por cierto!
Jacob Vlijm
1
En cualquier momento. Todos necesitan un empujón de vez en cuando. Además, me has ayudado antes, solo considéralo un agradecimiento. Acerca de este 'proyecto', un ppa sería bueno ya que no todos son técnicos.
Parto