GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Cómo agregar espacios de trabajo automáticamente, solo si los necesito?

Supongamos que estoy usando 4 espacios de trabajo y, por cierto, necesito más, ¿hay un proceso automatizado o, si es imposible, una manera fácil de agregar más espacios de trabajo (en lugar de instalar Ubuntu tweak)? etc. etc.).

Respuesta aceptada:

Establecer automáticamente el número de espacios de trabajo; agregue y elimine columnas y filas, según sus necesidades

A continuación, una versión de un (el) script de fondo que agregará automáticamente espacios de trabajo si ingresó la última columna o fila de su matriz de espacio de trabajo.

Así es como funciona:

  1. Si llega a la última columna o fila, se agregan ventanas gráficas adicionales:

  2. Si sus espacios de trabajo no se utilizan durante 5-10 segundos y no hay ventanas en él, los espacios de trabajo adicionales se eliminarán nuevamente. Sin embargo, siempre mantendrá una fila adicional debajo y una columna adicional a la derecha de su ventana gráfica actual:

El guión:

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

# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10

def set_workspaces(size, axis):
    subprocess.Popen([
        "dconf", "write", "/org/compiz/profiles/unity/plugins/core/"+axis,
                str(size)
                ])

def get_res():
    resdata = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    curr = resdata.index("current")
    return (int(resdata[curr+1]), int(resdata[curr+3].replace(",", "")))

def wspace():
    try:
        sp = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        return ([int(n) for n in sp[3].split("x")],
                [int(n) for n in sp[5].split(",")])

    except subprocess.CalledProcessError:
        pass


def clean_up(curr_col, curr_row):
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
        xpos = max([math.ceil((int(w[2])+span[1][0])/res[0]) for w in w_list])
        min_x = max(xpos, curr_col+1, hsize)
        if xpos >= hsize:
            set_workspaces(min_x, "hsize")
        else:
            set_workspaces(min_x, "hsize")
        ypos = max([math.ceil((int(w[3])+span[1][1])/res[1]) for w in w_list])
        min_y = max(ypos, curr_row+1, vsize)
        if ypos >= vsize:
            set_workspaces(min_y, "vsize")
        else:
            set_workspaces(min_y, "vsize")
    except subprocess.CalledProcessError:
        pass

res = get_res()
t = 0

while True:
    span = wspace()
    if span != None:
        cols = int(span[0][0]/res[0]); rows = int(span[0][1]/res[1])
        currcol = int((span[1][0]+res[0])/res[0])
        if all([currcol == cols, cols*rows < max_ws]):
            set_workspaces(cols+1, "hsize")
        currrow = int((span[1][1]+res[1])/res[1])
        if all([currrow == rows, cols*rows < max_ws]):
            set_workspaces(rows+1, "vsize")
        if t == 10:
            clean_up(currcol, currrow)
            t = 0
        else:
            t = t+1
        time.sleep(1)

Cómo usar

  1. Copie el siguiente script en un archivo vacío, guárdelo como add_space.py
  2. En la sección principal del guión, edite las líneas si desea otras configuraciones (número máximo de espacios de trabajo, matriz predeterminada, por ejemplo, 2×2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Pruébalo:ejecútalo con el comando:

    python3 /path/to/add_space.py
    
  4. Si todo funciona bien, agréguelo a sus aplicaciones de inicio:Dash> Aplicaciones de inicio> Agregue el comando:

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

Nota

Como siempre, la secuencia de comandos es extremadamente "baja en jugo" y no agrega ninguna carga notable a su procesador.

Explicación

La historia a continuación es un poco complicada y principalmente una explicación sobre el concepto y el procedimiento , en lugar de la codificación. Solo lee si estás interesado.

Cómo calcular los espacios de trabajo necesarios (columnas de ejemplo)

La salida de wmctrl -d parece:

0  * DG: 3360x2100  VP: 1680,1050  WA: 65,24 1615x1026  N/A

En la salida, VP: 1680,1050 nos da información sobre dónde estamos en el espacio de trabajo de expansión (la matriz de todas las ventanas gráficas). Esta información solo es útil si también tenemos la resolución de la pantalla, ya que p. 1680 podría ser el ancho de dos (poco probable, pero aún así) o una vez la pantalla.
Afortunadamente, podemos analizar la resolución de la pantalla con el comando xrandr .

Entonces, si sabemos que el tamaño x de la pantalla es 1680 y actualmente estamos en VP: 1680,1050 , sabemos que estamos en la segunda columna en la matriz del espacio de trabajo. Como también conocemos el tamaño de la matriz total (DG: 3360x2100 , también desde la salida de wmctrl -d ), sabemos que la matriz actual incluye dos columnas (3360/1680), y estamos en la "última".

Relacionado:Linux:¿cómo agregar parámetros de arranque al kernel con bcfg desde el shell EFI?

El script luego enviará una instrucción para agregar una columna a la matriz mediante el comando:

dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>

Este es el principio.

Cómo calcular los espacios de trabajo a eliminar (columnas de ejemplo)

Una vez cada 10 segundos, el script ejecuta el comando para enumerar todas las ventanas abiertas actualmente, con el comando:

wmctrl -lG

Esto también nos da información sobre la posición de la ventana, como:

0x04604837  0 3425 24   1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit

En la salida, 3425 es la posición x de la ventana. Sin embargo, esta cifra es relativa al espacio de trabajo actual (lado izquierdo). Para conocer la posición absoluta de la ventana (x-wise) en la matriz del espacio de trabajo, debemos agregar el primer número de la información de la ventana actual (por ejemplo, VP: 1680,1050 , desde la salida de wmctrl -d ).
Sin embargo, por razones de simplicidad, supongamos que estamos en la ventana gráfica 1,1 (vista superior izquierda), por lo que la posición relativa de la ventana es igual a su posición absoluta.

Dado que la resolución de la pantalla es 1680 , sabemos que la ventana está en la columna 3425/1680 , redondeado, ya que todo entre 3360 and 5040 está en la misma columna de la matriz (entre 3 y 4 veces la resolución). Para un cálculo adecuado usamos math.ceil() (python )

Dado que el guión también practica la regla de tener siempre un espacio de trabajo adicional a la derecha/abajo, debemos establecer el número de columnas en el más alto valor de:

  • la actual columna del espacio de trabajo + 1
  • la última columna con una ventana
  • el número predeterminado de columnas, como se establece en el encabezado de la secuencia de comandos

Y así lo hace el guión 🙂

Las filas se gestionan exactamente con el mismo procedimiento.


Ubuntu
  1. Cómo agregar un archivo de intercambio en Ubuntu

  2. Cómo agregar una impresora en Ubuntu 11.10 | Agregar impresora en Ubuntu

  3. Cómo agregar un repositorio de Yum

  4. ¿Cómo iniciar programas automáticamente en espacios de trabajo específicos al iniciar?

  5. ¿Cómo Agregar Repositorios Ppa?

Cómo agregar una impresora a Ubuntu

Cómo agregar una entrada MX en cPanel

¿Cómo agregar múltiples espacios de trabajo en Unity 2d?

¿Cómo montar automáticamente la partición de intercambio?

¿Cómo agregar un nuevo dominio solo para correos electrónicos?

Cómo agregar un usuario a Sudoers en Ubuntu 22.04