17 votos

¿Puedo minimizar una ventana en una caja en la unidad?

4Dwm de Irix, hubo una capacidad de minimizar ventanas en una caja (contrario a la barra de tareas utilizada por gestores de ventanas modernas). He visto esto también en un HPUX antiguos.

Ver la "consola" cuadrada de la imagen vinculada:

enter image description here

¿Es posible lograr en Ubuntu, ya sea con un plugin o tal vez algún gestor de ventanas diferente unidad?

18voto

Jacob Vlijm Puntos 24137

Para mi propia sorpresa, funciona bastante bien, siempre que no tienen demasiadas cosas en su escritorio.


Trabajé con ella durante un tiempo, y lo que parece extraño, pero extrañamente agradable alternativa a los frecuentes del área de trabajo de los interruptores. Refrescante por su simplicidad.

En la práctica

La solución es en realidad bastante más de lo que usted describe:

  • Pulsando la combinación de teclas "cuadro de" la ventana en el escritorio, desde una ventana:

    enter image description here

    en un icono, con el aspecto de la aplicación:

    enter image description here

  • Haga doble clic en el icono y la ventana se va a volver a aparecer y el icono desaparecerá.

Cómo funciona

La historia corta (explicación):

  • Cuando se pulsa la tecla de acceso directo, el script se llama con el argumento de box:

    windowbox box
    
  • A continuación, el script:

    • lee el id de ventana de la ventana situada en primer plano
    • comprueba que si es una ventana "normal" (que no quiere desasignar el escritorio por ejemplo)
    • Busca el nombre de proceso de la aplicación, la posesión de la ventana.
    • Busca el icono correspondiente en la aplicación correspondiente de la .desktop archivo /usr/share/applications
    • crea un nombre único .desktop archivo, con un Exec= de la línea que llama a la secuencia de comandos (cuando se hace doble clic) con el argumento de show:

      windowbox show
      

El .desktop archivo para añadir un número de argumentos adicionales argumentos, tales como la identificación de la ventana, el (archivo) nombre de la .desktop archivo.

Posteriormente:

  • El .desktop archivo se hace ejecutable, para hacer un doble - clickable objeto.

  • Cuando la .desktop archivo se hace doble clic, en la ventana se (re-) asignada, el .desktop archivo es eliminado de su escritorio.

Cómo configurar

  1. Como casi siempre, cuando quieres jugar con windows, el script necesita tanto wmctrl y xdotool:

    sudo apt-get install xdotool wmctrl
    
  2. Crear el directorio ~/bin (~ destaca por su directorio home)
  3. Copie la secuencia de comandos siguiente en un archivo vacío, guárdelo como windowbox (sin extensión) en ~/bin.

    #!/usr/bin/env python3
    import subprocess
    import sys
    import os
    
    # --- On Unity, there is a (y-wise) deviation in window placement
    # set to zero for other window managers
    deviation = 28
    # ---
    
    args = sys.argv[1:]
    
    get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
    
    def find_dtop():
        # get the localized path to the Desktop folder
        home = os.environ["HOME"]
        dr_file = home+"/.config/user-dirs.dirs"
        return [home+"/"+ l.split("/")[-1].strip() \
                for l in open(dr_file).readlines() \
                if l.startswith("XDG_DESKTOP_DIR=")][0].replace('"', "")
    
    def check_windowtype(w_id):
        # check the type of window; only unmap "NORMAL" windows
        return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
    
    def get_process(w_id):
        # get the name of the process, owning the window and window x/y position
        w_list = get(["wmctrl", "-lpG"]).splitlines()
        pid = [l for l in w_list if w_id in l][0].split()
        proc = get(["ps", "-p", pid[2], "-o", "comm="])
        xy = (" ").join(pid[3:5])
        return (proc, xy)
    
    def read_f(f, string, proc):
        # search for a possible match in a targeted .desktop file
        try:
            with open(f) as read:
                for l in read:
                    if all([l.startswith(string), proc in l]):
                        in_f = True
                        break
                    else:
                        in_f = False
        except:
            in_f = False
        return in_f
    
    def get_icon(proc, w_name):
        # search appropriate icon in /usr/share/applications
        exceptions = [item for item in [
            ["soffice", "libreoffice-main"],
            ["gnome-terminal", "utilities-terminal"],
            ["nautilus", "folder"],
            ] if item[0] in proc]
        if exceptions:
            if exceptions == [["soffice", "libreoffice-main"]]:
                loffice = [
                    ["Calc", "libreoffice-calc"],
                    ["Writer", "libreoffice-writer"],
                    ["Base", "libreoffice-base"],
                    ["Draw", "libreoffice-draw"],
                    ["Impress", "libreoffice-impress"],
                    ]
                match = [m[1] for m in loffice if m[0] in w_name]
                if match:
                    return match[0]
                else:
                    return exceptions[0][1]
            else:      
                return exceptions[0][1]
        else:
            default = "/usr/share/applications"
            dtfiles = [default+"/"+f for f in os.listdir(default)]
            for f in dtfiles:
                if read_f(f, "Exec=", proc) == True:   
                    for l in open(f).readlines():
                        if l.startswith("Icon="):
                            icon = l.replace("Icon=", "").strip()
                            print(f)
                            break
                    break
            return icon
    
    def create_name():
        # create unique (file-) name for boxed window
        n = 1
        while True:
            name = dtop+"/"+"boxed_"+str(n)+".desktop"
            if os.path.exists(name):
                n += 1
            else:
                break
        return name
    
    def convert_wid(w_id):
        # convert window- id, xdotool format, into wmctrl format
        w_id = hex(int(w_id))
        return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
    
    def create_icon(w_id, w_name, icon, pos):
        # create the launcher, representing the boxed window
        boxedwindow = create_name()
        f_content =[
                "[Desktop Entry]",
                "Name=[WINDOW] "+w_name,
                "Exec=windowbox show "+w_id+" '"+boxedwindow+"' "+pos,
                "Icon="+icon,
                "Type=Application",
                ]
        if icon == "generic":
            f_content.pop(3)
        with open(boxedwindow, "wt") as boxed:
            for l in f_content:
                boxed.write(l+"\n")
        command = "chmod +x "+"'"+boxedwindow+"'"
        subprocess.call(["/bin/bash", "-c", command])
    
    if args[0] == "box":
        dtop = find_dtop()
        w_id = convert_wid(get(["xdotool", "getactivewindow"]))
        w_name = get(["xdotool", "getwindowname", w_id])
        if check_windowtype(w_id) == True:
            procdata = get_process(w_id)
            procname = procdata[0]
            icon = get_icon(procname, w_name); icon = icon if icon != None else "generic"
            create_icon(w_id, w_name, icon, procdata[1])
            subprocess.call(["xdotool", "windowunmap", w_id])
    
    elif args[0] == "show":
        w_id = args[1]
        subprocess.call(["xdotool", "windowmap", w_id])    
        subprocess.call(["xdotool", "windowmove", "--sync", w_id, args[3], str(int(args[4])-deviation)])
        os.remove(args[2])
    
  4. Hacer el script ejecutable

  5. Para hacer que el directorio recién creado "pop-up" en $PATH, log in/out, o de ejecutar source ~/.profile (desde una ventana de terminal)
  6. Prueba a ejecutar la secuencia de comandos desde una ventana de terminal con el comando:

    windowbox box
    

    La ventana debe desaparecer, la "caja" de la ventana debe aparecer en el escritorio.

  7. Si todo funciona bien, agregue el siguiente comando en una tecla de acceso directo: seleccione el icono de engranaje en la parte superior derecha de tu pantalla:

    Gear icon

  8. Ir a la Configuración del SistemaTecladoaccesos directosaccesos directos Personalizados. Haga clic en el + y agregar el comando:

    windowbox box
    

Que debe hacerlo.

Nota importante

La secuencia de comandos utiliza xdotool's windowunmap para hacer invisible la ventana. Ha creado el "cuadro" (icono) en el escritorio es la única "puerta" en la ventana oculta. En otras palabras: no quitar el escritorio archivo(s) manualmente. La ventana será perdido para siempre si lo haces.

El trabajo de hacer [editar 20-12: hecho]

El guión aún podría utilizar un poco de refinamiento:

  • La geometría de la ventana no se restaura por definición. Puede ser fija muy bien, pero yo pensé que le muestre el resultado de la primera.
  • En la mayoría de los casos, la caja de la ventana de su icono correcto. La función get_process(w_id) podría utilizar algunas mejoras, sin embargo. Si el proceso no se encuentra como un comando en /usr/share/applications, el archivo tiene un icono genérico.

Dando a la caja de la ventana de iconos de un tamaño distinto a los otros iconos

La secuencia de comandos de los nombres de los creados .desktop archivos siempre boxed_1.desktop, boxed_2.desktop etc, dependiendo de la "disposición" de nombre en el momento de la creación (los nombres de archivo, no el nombre que se muestra).

Usted puede cambiar el tamaño de los archivos (en general), derecho - haga clic en > tamaño de icono. La buena noticia es que si se quita el archivo y volver a crearla, el tamaño es recordado. Incluso si crea el archivo de nuevo después de reiniciar. Eso significa que si usted alguna vez cambiado el tamaño de la caja de windows (por ejemplo) 1-5, ellos siempre tienen el mismo tamaño cuando usted (el script) crear de nuevo!

enter image description here

7voto

Cyberbear Puntos 11

Usted puede utilizar fvwm para lograr esto.

  1. Instalar fvwm:

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. Encontrar un ellos que utiliza el iconificar función - hay varios aquí: http://www.jmcunx.com/fvwm_theme.html Varios aspecto de la captura de pantalla que muestran.

  3. Copia el texto del tema, a continuación, desplácese a ~/.fvwm/ (mostrar archivos ocultos en primer lugar), a continuación, cree un archivo .fvwm2rc

  4. Abrir el archivo en un editor de texto como gedit) y pegar el tema del texto.

  5. Reiniciar el equipo y seleccionar fvwm y de inicio de sesión.

enter image description here

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: