{"id":55206,"date":"2020-01-15T00:00:00","date_gmt":"2020-01-14T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/alternativnoe-upravlenie-oknami-v-linux"},"modified":"2020-02-18T14:03:18","modified_gmt":"2020-02-18T11:03:18","slug":"alternativnoe-upravlenie-oknami-v-linux","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","title":{"rendered":"Administraci\u00f3n alternativa de ventanas en Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Soy de los que configuran el Caps Lock para cambiar el idioma porque me da pereza presionar 2 teclas cuando puedo presionar una. Incluso desear\u00eda tener 2 teclas innecesarias: usar\u00eda una para activar el idioma ingl\u00e9s y la otra para el ruso. Pero la segunda tecla innecesaria es la que llama al men\u00fa contextual, que es tan innecesaria que muchos fabricantes de laptops la eliminan. As\u00ed que tengo que conformarme con lo que hay. <\/p>\n<p><\/p>\n<p>Adem\u00e1s, no quiero estar buscando los iconos de las ventanas en la barra de tareas al cambiar entre ellas, intentando captar los nombres al desplazarse a trav\u00e9s de <em>Alt+Tab<\/em>, desplaz\u00e1ndome entre escritorios, etc. Quiero presionar una combinaci\u00f3n de teclas (idealmente solo una, pero ya no hay teclas innecesarias disponibles) y entrar directamente a la ventana que necesito. Por ejemplo:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: Firefox<\/li>\n<li>Alt+D: Firefox (Navegaci\u00f3n Privada)<\/li>\n<li>Alt+T: Terminal<\/li>\n<li>Alt+M: Calculadora<\/li>\n<li>Alt+E: IntelliJ Idea<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p><\/p>\n<p>Y adem\u00e1s, al presionar, por ejemplo, el <em>Alt+M<\/em> , quiero ver la calculadora sin importar si ese programa est\u00e1 abierto en ese momento. Si est\u00e1 abierto, el foco debe trasladarse a su ventana, y si no, se debe iniciar el programa necesario y transferir el foco cuando se cargue.<\/p>\n<p><\/p>\n<p>Para los casos que no cubre el escenario anterior, quiero tener combinaciones de teclas universales a las que se les pueda asignar f\u00e1cilmente cualquier ventana abierta. Por ejemplo, tengo 10 combinaciones asignadas desde <em>Alt+1<\/em> hasta <em>Alt+0<\/em>, que no est\u00e1n vinculadas a ning\u00fan programa. Solo puedo presionar <em>Alt+1<\/em> y la ventana que est\u00e1 en foco obtendr\u00e1 el foco al presionar <em>Alt+1<\/em>.<\/p>\n<p><\/p>\n<p>A continuaci\u00f3n hay una descripci\u00f3n de un par de caracter\u00edsticas adicionales y una respuesta sobre c\u00f3mo se puede hacer esto. Pero advierto que este tipo de personalizaci\u00f3n \u00aba medida\u00bb puede causar una fuerte dependencia e incluso malestar al tener que usar Windows, Mac OS o incluso otra computadora con Linux.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>En realidad, si lo piensas, no usamos tantas aplicaciones en nuestro d\u00eda a d\u00eda. Un navegador, terminal, IDE, alg\u00fan mensajero, un gestor de archivos, una calculadora y, quiz\u00e1s, eso es casi todo. No se necesitan muchas combinaciones de teclas para cubrir el 95% de las tareas cotidianas.<\/p>\n<p><\/p>\n<p>Para programas que tienen varias ventanas abiertas, se puede designar una de ellas como principal. Por ejemplo, si hay varias ventanas de IntelliJ Idea abiertas, se designan a la combinaci\u00f3n <em>Alt+E<\/em>. En condiciones normales, al presionar <em>Alt+E<\/em> se abrir\u00e1 alguna ventana de este programa, probablemente aquella que se abri\u00f3 primero. Sin embargo, si haces clic en <em>Alt+E<\/em> cuando una de las ventanas de este programa ya est\u00e1 en el foco, esta ventana se convertir\u00e1 en la principal y es a ella a la que se transferir\u00e1 el foco en pulsaciones posteriores de la combinaci\u00f3n. <\/p>\n<p><\/p>\n<p>La ventana principal se puede reasignar. Para ello, primero hay que desactivar la combinaci\u00f3n y luego asignar otra ventana como principal. Para desactivar la combinaci\u00f3n, hay que pulsar la propia combinaci\u00f3n y luego una combinaci\u00f3n especial de reinicio, que yo tengo asignada a <em>Alt+Backspace<\/em>. Esto ejecutar\u00e1 un script que cancelar\u00e1 la asignaci\u00f3n de la ventana principal para la combinaci\u00f3n anterior. Luego, puedes asignar una nueva ventana principal como se describi\u00f3 en el p\u00e1rrafo anterior. Reiniciar la ventana vinculada a las combinaciones universales ocurre de manera similar.<\/p>\n<p><\/p>\n<p>La introducci\u00f3n fue larga, pero quer\u00eda contar primero qu\u00e9 haremos y luego explicar c\u00f3mo hacerlo.<\/p>\n<p><\/p>\n<h2 id=\"dlya-teh-komu-nadoelo-chitat\">Para aquellos que est\u00e1n cansados de leer<\/h2>\n<p><\/p>\n<p>En resumen, el enlace a los scripts est\u00e1 al final del art\u00edculo.<\/p>\n<p><\/p>\n<p>Pero no se podr\u00e1 instalar y usar de inmediato. Primero tendr\u00e1s que entender c\u00f3mo el script encuentra la ventana deseada. Sin esto, no podr\u00e1s indicar al script a d\u00f3nde transferir el foco. Y hay que entender qu\u00e9 hacer si de repente no se encontr\u00f3 la ventana adecuada.<\/p>\n<p><\/p>\n<p>Adem\u00e1s, no me detendr\u00e9 en c\u00f3mo configurar la ejecuci\u00f3n de scripts mediante combinaciones de teclas. Por ejemplo, en KDE esto se hace en Configuraci\u00f3n del Sistema \u2192 Atajos \u2192 Atajos Personalizados. En otros gestores de ventanas tambi\u00e9n deber\u00eda estar disponible.<\/p>\n<p><\/p>\n<h2 id=\"znakomstvo-s-wmctrl\">Conociendo wmctrl<\/h2>\n<p><\/p>\n<p><em>Wmctrl<\/em> es una utilidad de consola para interactuar con el Gestor de Ventanas X. Es el programa clave para el script. Veamos r\u00e1pidamente c\u00f3mo se puede usar.<\/p>\n<p><\/p>\n<p>Primero, imprimamos una lista de ventanas abiertas:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -lx\n0x01e0000e -1 plasmashell.plasmashell             N\/A Escritorio \u2014 Plasma\n0x01e0001e -1 plasmashell.plasmashell             N\/A Plasma\n0x03a00001  0 skype.Skype                         N\/A Skype\n0x04400003  0 Navigator.Firefox                   N\/A Google Translator - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Publicaciones m\u00e1s destacadas del d\u00eda \/ Habr - Mozilla Firefox (Navegaci\u00f3n Privada)\n...<\/code><\/pre>\n<p><\/p>\n<p>La opci\u00f3n <em>-l<\/em> muestra una lista de todas las ventanas abiertas, y <em>-x<\/em> agrega a la salida el nombre de la clase (<em>skype.Skype<\/em>, <em>Navigator.Firefox<\/em> etc.). Aqu\u00ed necesitaremos el id de la ventana (columna 1), el nombre de la clase (columna 3) y el nombre de la ventana (\u00faltima columna).<\/p>\n<p><\/p>\n<p>Puedes intentar activar alguna ventana usando la opci\u00f3n <em>-a<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -a skype.Skype -x<\/code><\/pre>\n<p><\/p>\n<p>Si todo ha ido seg\u00fan lo planeado, deber\u00eda aparecer una ventana de Skype en la pantalla. Si en lugar de la opci\u00f3n <em>-x<\/em> utilizar la opci\u00f3n <em>, el intervalo entre el env\u00edo de paquetes.<\/em>, se puede usar id para especificar el id de la ventana en lugar del nombre de clase. El problema con el id es que cambia con cada inicio de la aplicaci\u00f3n y no podemos conocerlo de antemano. Por otro lado, este atributo se\u00f1ala de manera inequ\u00edvoca a la ventana, lo cual puede ser importante cuando la aplicaci\u00f3n abre m\u00e1s de una ventana. De esto hablaremos m\u00e1s adelante.<\/p>\n<p><\/p>\n<p>En esta etapa, debemos recordar que buscaremos la ventana deseada utilizando regex a partir de la salida <em>wmctrl -lx<\/em>. Pero eso no significa que necesariamente debamos utilizar algo complicado. Normalmente, el nombre de la clase o el t\u00edtulo de la ventana son suficientes. <\/p>\n<p><\/p>\n<p>En principio, la idea principal ya deber\u00eda estar clara. En la configuraci\u00f3n de teclas r\u00e1pidas\/globales de su gestor de ventanas, configuramos la combinaci\u00f3n deseada para ejecutar el script.<\/p>\n<p><\/p>\n<h2 id=\"kak-polzovatsya-skriptami\">C\u00f3mo utilizar scripts<\/h2>\n<p><\/p>\n<p>Primero, necesitamos instalar las utilidades de consola <em>wmctrl<\/em> y <em>xdotool<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get install wmctrl xdotool<\/code><\/pre>\n<p><\/p>\n<p>Luego, debemos descargar los scripts y agregarlos a <em>$PATH<\/em>. Normalmente, los coloco en <em>~\/bin<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd ~\/bin\n$ git clone https:\/\/github.com\/masyamandev\/Showwin-script.git\n$ ln -s .\/Showwin-script\/showwin showwin\n$ ln -s .\/Showwin-script\/showwinDetach showwinDetach<\/code><\/pre>\n<p><\/p>\n<p>Si no exist\u00eda el directorio <em>~\/bin<\/em> , deber\u00edamos crearlo y reiniciarnos (o volver a iniciar sesi\u00f3n), de lo contrario <em>~\/bin<\/em> no se incluir\u00e1 en <em>$PATH<\/em>. Si todo est\u00e1 correctamente hecho, los scripts deber\u00edan estar disponibles desde la consola y la autocompleci\u00f3n deber\u00eda funcionar con Tab.<\/p>\n<p><\/p>\n<p>El script principal <strong>showwin<\/strong> acepta 2 par\u00e1metros: el primero es regex, con el que buscaremos la ventana deseada, y el segundo es el comando que se debe ejecutar si no se encuentra la ventana deseada. <\/p>\n<p><\/p>\n<p>Podemos intentar ejecutar el script, por ejemplo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ showwin \"Mozilla Firefox$\" firefox<\/code><\/pre>\n<p><\/p>\n<p>Si Firefox est\u00e1 instalado, la ventana deber\u00eda recibir el foco. Incluso si Firefox no se hab\u00eda iniciado, deber\u00eda iniciarse.<\/p>\n<p><\/p>\n<p>Si funcion\u00f3, podemos intentar configurar la ejecuci\u00f3n de comandos con combinaciones. En la configuraci\u00f3n de teclas r\u00e1pidas\/globales a\u00f1adimos:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: mostrar ventana \u00abMozilla Firefox$\u00bb firefox<\/li>\n<li>Alt+D: mostrar ventana \u00abMozilla Firefox (Navegaci\u00f3n Privada)$\u00bb \u00abfirefox -private-window\u00bb<\/li>\n<li>Alt+C: mostrar ventana \u00abchromium-browser.Navegador Chromium N*\u00bb chromium-browser<\/li>\n<li>Alt+X: mostrar ventana \u00abchromium-browser.Navegador Chromium I*\u00bb \u00abchromium-browser -incognito\u00bb<\/li>\n<li>Alt+S: mostrar ventana \u00abskype.Skype\u00bb skypeforlinux<\/li>\n<li>Alt+E: mostrar ventana \u00abjetbrains-idea\u00bb idea.sh<\/li>\n<\/ul>\n<p><\/p>\n<p>Etc\u00e9tera. Cada uno puede configurar las combinaciones de teclas y software como le parezca mejor.<br \/>\nSi todo ha salido bien, podemos alternar entre las ventanas con solo pulsar las teclas indicadas.<\/p>\n<p><\/p>\n<p>Desilusi\u00f3n para los amantes de Chrome: una ventana normal en modo inc\u00f3gnito se distingue por su salida <em>wmctrl<\/em> no se puede, ya que tienen los mismos nombres de clases y t\u00edtulos de ventana. En las expresiones regulares propuestas, los s\u00edmbolos N* e I* son necesarios solo para que estas expresiones regulares se diferencien entre s\u00ed y se puedan asignar diferentes ventanas como principales.<\/p>\n<p><\/p>\n<p>Para restablecer la ventana principal de la combinaci\u00f3n anterior (de hecho para la expresi\u00f3n regular con la que <strong>showwin<\/strong> se llam\u00f3 la \u00faltima vez) es necesario ejecutar el script <strong>showwinDetach<\/strong>. Yo tengo asignado este script a una combinaci\u00f3n de teclas <em>Alt+Backspace<\/em>. <\/p>\n<p><\/p>\n<p>El script <strong>showwin<\/strong> tiene otra funci\u00f3n. Cuando se invoca con un solo par\u00e1metro (en este caso el par\u00e1metro es simplemente un identificador), no verifica la expresi\u00f3n regular en absoluto, sino que considera adecuadas todas las ventanas. En s\u00ed mismo, esto parece in\u00fatil, sin embargo, de este modo podemos asignar cualquier ventana como principal y cambiar r\u00e1pidamente a esa ventana.<\/p>\n<p><\/p>\n<p>Tengo configuradas las siguientes combinaciones:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+1: mostrar ventana \u00abCustomKey1\u00bb<\/li>\n<li>Alt+2: mostrar ventana \u00abCustomKey2\u00bb<\/li>\n<li>\u2026<\/li>\n<li>Alt+0: mostrar ventana \u00abCustomKey0\u00bb<\/li>\n<li>Alt+Backspace: showwinDetach<\/li>\n<\/ul>\n<p><\/p>\n<p>De este modo, puedo vincular cualquier ventana a combinaciones <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>. Simplemente al presionar <em>Alt+1<\/em> asigno la ventana actual a esta combinaci\u00f3n. Puedo desasignarla presionando <em>Alt+1<\/em>, y luego <em>Alt+Backspace<\/em>. O cerrar la ventana, eso tambi\u00e9n funciona.<\/p>\n<p><\/p>\n<p>A continuaci\u00f3n, hablar\u00e9 un poco sobre detalles t\u00e9cnicos. Se pueden ignorar y simplemente intentar configurarlos y ver. Pero de todos modos, recomendar\u00eda entender los scripts de otras personas antes de ejecutarlos en su computadora :).<\/p>\n<p><\/p>\n<h2 id=\"kak-razlichat-raznye-okna-odnogo-prilozheniya\">C\u00f3mo distinguir diferentes ventanas de una misma aplicaci\u00f3n<\/h2>\n<p><\/p>\n<p>En principio, el primer ejemplo \u00abwmctrl -a skype.Skype -x\u00bb funcionaba y se puede utilizar. Pero revisemos nuevamente el ejemplo con Firefox, en el que est\u00e1n abiertas 2 ventanas:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">0x04400003  0 Navigator.Firefox                   N\/A Google Translator - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Publicaciones destacadas del d\u00eda \/ Habr - Mozilla Firefox (Navegaci\u00f3n Privada)<\/code><\/pre>\n<p><\/p>\n<p>La primera ventana es en modo normal, y la segunda es Navegaci\u00f3n Privada. Nos gustar\u00eda considerar estas ventanas como diferentes aplicaciones y alternar entre ellas con diferentes combinaciones de teclas. <\/p>\n<p><\/p>\n<p>Es necesario complicar el script que cambia de ventanas. Us\u00e9 esta soluci\u00f3n: listar todas las ventanas, hacer <em>grep<\/em> a trav\u00e9s de regex, tomar la primera l\u00ednea con ayuda de <em>head<\/em>, extraer la primera columna (esto ser\u00e1 el id de la ventana) usando <em>cut<\/em>, cambiar a la ventana por id.<\/p>\n<p><\/p>\n<p>Aqu\u00ed deber\u00eda haber una broma sobre expresiones regulares y dos problemas, pero en realidad no uso nada complicado. Necesito las expresiones regulares para poder indicar el final de la l\u00ednea (el s\u00edmbolo \u00ab$\u00bb) y distinguir \u00abMozilla Firefox$\u00bb de \u00abMozilla Firefox (Navegaci\u00f3n Privada)$\u00bb.<\/p>\n<p><\/p>\n<p>El comando se ve aproximadamente as\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -i -a `wmctrl -lx | grep -i \"Mozilla Firefox$\" | head -1 | cut -d\" \" -f1`<\/code><\/pre>\n<p><\/p>\n<p>Aqu\u00ed ya se puede adivinar la segunda peculiaridad del script: si grep no devuelve nada, significa que la aplicaci\u00f3n deseada no est\u00e1 abierta y debe ser iniciada ejecutando el comando del segundo par\u00e1metro. Luego, hay que comprobar peri\u00f3dicamente si se ha abierto la ventana deseada para poder darle el enfoque. No voy a profundizar en esto, quien lo necesite, que mire el c\u00f3digo fuente.<\/p>\n<p><\/p>\n<h2 id=\"kogda-okna-prilozheniya-ne-razlichimy\">Cuando las ventanas de la aplicaci\u00f3n no son distinguibles<\/h2>\n<p><\/p>\n<p>As\u00ed que hemos aprendido a dar enfoque a la ventana de la aplicaci\u00f3n deseada. Pero, \u00bfqu\u00e9 pasa si hay m\u00e1s de una ventana abierta de la aplicaci\u00f3n? \u00bfA cu\u00e1l de ellas se le debe dar enfoque? El script anterior probablemente se lo dar\u00e1 a la primera ventana abierta. Sin embargo, nos gustar\u00eda tener m\u00e1s flexibilidad. Nos gustar\u00eda poder recordar qu\u00e9 ventana es la que necesitamos y alternar exactamente a esa ventana.<\/p>\n<p><\/p>\n<p>La idea era la siguiente: Si queremos recordar una ventana espec\u00edfica para una combinaci\u00f3n de teclas, debemos presionar esa combinaci\u00f3n cuando la ventana deseada est\u00e9 enfocada. M\u00e1s adelante, al presionar esa combinaci\u00f3n, el enfoque se dar\u00e1 precisamente a esa ventana. Hasta que la ventana se cierre o no hagamos un reinicio para esa combinaci\u00f3n del script. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<p>El algoritmo del script <strong>showwin<\/strong> es aproximadamente as\u00ed:<\/p>\n<p><\/p>\n<ul>\n<li>Verificar si hemos recordado antes el ID de la ventana a la que hay que dar enfoque.<br \/>\nSi hemos recordado y esa ventana a\u00fan existe, le damos el enfoque y salimos. <\/li>\n<li>Miramos qu\u00e9 ventana est\u00e1 actualmente en foco, y si corresponde a nuestra solicitud, entonces recordamos su ID para pasar a ella m\u00e1s adelante y salimos.<\/li>\n<li>Pasamos a cualquier ventana adecuada si existe o abrimos la aplicaci\u00f3n deseada.<\/li>\n<\/ul>\n<p><\/p>\n<p>Para saber qu\u00e9 ventana est\u00e1 actualmente en foco, podemos usar la utilidad de consola xdotool, transformando su salida al formato hexadecimal:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ printf \"0xx\" `xdotool getwindowfocus`<\/code><\/pre>\n<p><\/p>\n<p>Recoger algo en bash es m\u00e1s f\u00e1cil creando archivos en un sistema de archivos virtual que est\u00e1 en memoria. En Ubuntu, esto est\u00e1 conectado por defecto en <em>\/dev\/shm\/<\/em>. No puedo hablar de otras distribuciones, espero que algo similar tambi\u00e9n exista. Se puede ver con el comando:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ mount -l | grep tmpfs<\/code><\/pre>\n<p><\/p>\n<p>El script crear\u00e1 directorios vac\u00edos en esta carpeta, as\u00ed: <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX\/$WINDOW_ID<\/em>. Adem\u00e1s, en cada llamada se crear\u00e1 un symlink <em>\/dev\/shm\/$USER\/showwin\/showwin_last<\/em> en <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX<\/em>. Esto ser\u00e1 necesario para poder eliminar el id de la ventana para una determinada combinaci\u00f3n mediante el script <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<h2 id=\"chto-mozhno-uluchshit\">Qu\u00e9 se puede mejorar<\/h2>\n<p><\/p>\n<p>En primer lugar, los scripts deben configurarse manualmente. Seguramente, debido a la necesidad de involucrarse y hacer mucho a mano, muchos de ustedes ni siquiera intentar\u00e1n configurar el sistema. Si hubiera una forma de simplemente instalar un paquete y configurarlo m\u00e1s f\u00e1cilmente, tal vez esto ganar\u00eda algo de popularidad. Y con suerte, podr\u00eda incluirse la aplicaci\u00f3n en las distribuciones est\u00e1ndar.<\/p>\n<p><\/p>\n<p>Y tal vez se podr\u00eda hacer m\u00e1s simple. Si se puede conocer el id del proceso que cre\u00f3 la ventana mediante el id de la ventana, y a partir del id del proceso saber qu\u00e9 comando lo cre\u00f3, se podr\u00eda automatizar la configuraci\u00f3n. En realidad, no he investigado si lo que escrib\u00ed en este p\u00e1rrafo es posible. Lo que pasa es que, personalmente, estoy satisfecho con c\u00f3mo funciona ahora. Pero si a alguien m\u00e1s le parece conveniente el enfoque y lo mejora, estar\u00e9 encantado de utilizar la mejor soluci\u00f3n.<\/p>\n<p><\/p>\n<p>Otro problema, como ya mencion\u00e9, es que en algunas ocasiones no se pueden distinguir las ventanas. Hasta ahora, solo he observado esto con incognito en chrome\/chromium, pero tal vez haya algo similar en otro lugar. En \u00faltima instancia, siempre hay una opci\u00f3n de combinaciones universales <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>. Nuevamente, uso Firefox y para m\u00ed este problema no es significativo.<\/p>\n<p><\/p>\n<p>Pero un problema significativo para m\u00ed es que, por trabajo, uso Mac OS y all\u00e1 no pude configurar nada similar. La utilidad <em>wmctrl<\/em> parece que pude instalarla, pero no funciona bien en Mac OS. Algo se puede hacer con la aplicaci\u00f3n <em>Automator<\/em>, pero es tan lenta que no es conveniente usarla incluso cuando funciona. No pude configurar combinaciones de teclas para que funcionaran en todos los programas. Si alguien encuentra una soluci\u00f3n, estar\u00e9 feliz de usarla.<\/p>\n<p><\/p>\n<h2 id=\"vmesto-zaklyucheniya\">En conclusi\u00f3n<\/h2>\n<p><\/p>\n<p>Result\u00f3 ser inesperadamente muchas palabras para una funcionalidad que parec\u00eda tan simple. Quer\u00eda transmitir la idea sin sobrecargar el texto, pero a\u00fan no he logrado encontrar una manera m\u00e1s sencilla de contarlo. Quiz\u00e1s en formato de video ser\u00eda mejor, pero aqu\u00ed no les gusta tanto.<\/p>\n<p><\/p>\n<p>He hablado un poco sobre lo que hay detr\u00e1s del script y c\u00f3mo configurarlo. No profundic\u00e9 en los detalles del propio script, pero son solo 50 l\u00edneas, as\u00ed que no es complicado de entender. <\/p>\n<p><\/p>\n<p>Espero que alguien m\u00e1s pruebe esta idea y, quiz\u00e1s, incluso la valore. Puedo decir que el script fue escrito hace aproximadamente 3 a\u00f1os y me resulta MUY conveniente. Tan conveniente que causa un serio incomodidad al trabajar con computadoras ajenas. Y con el MacBook de trabajo. <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/masyamandev\/Showwin-script\">Enlace a los scripts<\/a><\/noindex><\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483846\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443. \u042f \u0431\u044b \u0434\u0430\u0436\u0435 \u0445\u043e\u0442\u0435\u043b 2 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438: \u043e\u0434\u043d\u0443 \u0431\u044b \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438, \u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0434\u043b\u044f \u0440\u0443\u0441\u0441\u043a\u043e\u0439. \u041d\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f, \u0447\u0442\u043e \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55206","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-14T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Control alternativo de ventanas en Linux | ProHoster","description":"Soy de los que asignan el cambio de idioma a Caps Lock porque me da pereza presionar 2 teclas cuando se puede hacer con una.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster","og:description":"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-14T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55206","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:48:29","updated":"2022-09-30 14:18:59","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/55206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=55206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/55206\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=55206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=55206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=55206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}