Gostaria de saber se existe alguma maneira de obter o efeito dos atalhos Ctrl-Alt-Keypad no Unity usando comandos de terminal? Eu quero um comando que define uma janela GUI para metade do tamanho da tela, alinhada à esquerda ou à direita.
Como pano de fundo, estou escrevendo um script que é executado após o login. Ele usa o Zenity para perguntar se eu quero abrir meu ambiente de desenvolvimento (GVim e IPython lado a lado). Eu tenho tentado alcançar duas janelas de igual tamanho para esses programas usando set lines= columns=
no meu .gvimrc
e c.IPythonWidget.width =
e c.IPythonWidget.height =
na minha ipython_qtconsole_config.py
. No entanto, existem problemas associados a essa abordagem.
Respostas:
O que você encontrará
Se você deseja primeiro chamar um aplicativo e, posteriormente, colocar sua janela em uma posição e tamanho específicos, o tempo entre a chamada do aplicativo e o momento em que a janela realmente aparece é imprevisível. Se o seu sistema estiver ocupado, ele poderá ser significativamente mais longo do que se estiver ocioso.
Você precisa de uma maneira "inteligente" para garantir que o posicionamento / redimensionamento seja feito (imediatamente) depois que a janela aparecer .
Script para chamar um aplicativo, aguarde que ele apareça e posicione-o na tela
Com o script abaixo, você pode chamar um aplicativo e definir a posição e o tamanho em que ele deve aparecer com o comando:
Alguns exemplos:
Para chamar
gnome-terminal
e redimensionar sua janela para 50% e colocá-la na metade direita:Para ligar
gedit
, coloque sua janela à esquerda e liguegnome-terminal
, coloque-a à direita (definindov-size
46% para dar um pouco de espaço entre as janelas):Para chamar o Inkscape, coloque sua janela no quarto esquerdo / superior da tela:
O script e como usá-lo
instale ambos
xdotool
ewmctrl
. Eu usei os dois, pois o redimensionamento comwmctrl
pode causar algumas peculiaridades em (especificamente)Unity
.setwindow
(sem extensão) em~/bin
; crie o diretório, se necessário.~bin
, execute:source ~/.profile
Execute o script com o comando (por exemplo)
Em outras palavras:
Se tudo funcionar bem, use o comando sempre que precisar.
O script
O que faz
Quando o script é chamado, ele:
wmctrl -lp
)ps -ef ww
, comparando o pid da janela com o pid do aplicativo)Problema menor
No Unity, quando você (re) posiciona e (re) dimensiona uma janela com um
wmctrl
ou outroxdotool
, a janela sempre mantém uma pequena marca nos limites da tela, a menos que você a defina como 100%. Você pode ver isso na imagem (3) acima; enquanto ainkscape
janela foi colocada nax
posição 0, você ainda pode ver uma pequena diferença entre o Unity Launcher e ainkscape
janela.fonte
wmctrl
instalado, o comando:wmctrl -lG | grep <windowname>
irá mostrar-lhe uma saída como:0x03600e4f 0 723 197 1114 563 jacob-System-Product-Name dimkeyboard.sh (~/Bureaublad) - gedit
. Nesta saída, a terceira à sexta coluna mostra as dimensões, x, y, largura, largura, altura.appAndParams = sys.argv[1] app = appAndParams[0].split(' ', 1)[0] get = lambda x: subprocess.check_output(["/bin/bash", "-c",x]).decode("utf-8") ws1 = get("wmctrl -lp"); t = 0 subprocess.Popen(["/bin/bash", "-c", appAndParams])
</pre> <edit> ele se recusa a formatar esse código. </edit>O comando real que você deseja é algo como
Isso fará com que a janela atual ocupe metade da tela (mude
$HALF
para as dimensões da tela) e se encaixe no lado esquerdo. Para encaixar à direita, useVocê também pode jogar
wmctrl
para obter o ID das janelas nas quais está interessado, em vez de usar:ACTIVE:
. Não posso ajudar lá, pois isso depende das janelas em questão. Dê uma olhadaman wmctrl
para mais.Eu escrevi um roteiro para isso. Como não uso o Unity, não posso garantir que funcione com ele, mas não vejo motivo para não fazê-lo. Ele precisa
wmctrl
,xdpyinfo
edisper
para ser instalado:Em seguida, salve o script abaixo como
~/bin/snap_windows.sh
, torne-o executável comchmod a+x ~/bin/snap_windows.sh
e você poderá executarPara encaixar no lado direito. Usar
l
para o lado esquerdo e sem argumentos para maximizar a janela. Observe que ele é executado na janela atual, portanto, você precisará atribuir um atalho a ele, se quiser que ele seja executado em qualquer coisa, menos no terminal.O script é um pouco mais complicado do que o que você pede, porque eu o escrevi para trabalhar nas configurações de monitor único e duplo.
fonte
Você pode fazer isso usando
xdotool
.Para instalar,
xdotool
você pode executar:Em seguida, para enviar uma tecla Ctrl+ Alt+ <keypad_key>para a
X
janela do terminal , você pode executar:* <keypad_key_value> = valor da tecla do teclado na lista abaixo
Para executar um programa GUI e enviar o pressionamento de tecla para sua
X
janela (que neste caso é a janela ativa no momento daxdotool
execução do comando), você pode executar:* <comando> = comando que abre a janela para a qual você deseja enviar o pressionamento de tecla; <delay> = tempo de espera em milissegundos antes de enviar o pressionamento de tecla; <keypad_key_value> = valor da tecla do teclado na lista abaixo
Observe que, na maioria dos casos, você precisará executar o comando que está emitindo como um processo independente (por exemplo, executando em
nohup <command> &
vez de<command>
no exemplo acima), caso contrárioxdotool
, não será executado até que<command>
a execução seja concluída.Você também precisará definir algum atraso, caso contrário, o pressionamento de tecla será enviado antes que a janela de destino seja totalmente carregada
X
(um atraso500ms
deve ser feito).Os valores possíveis para
<keypad_key_value>
são:90
87
88
89
83
84
85
79
80
81
Como regra geral, para descobrir o valor de qualquer tecla do teclado no
X
ambiente, é possível executarxev
e pressionar a tecla para gerar seu valor dentro do terminal.fonte
Criei um aplicativo chamado Worksets (no github ) para Unity que permite fazer isso facilmente através de uma interface gráfica do usuário - é gratuito e de código aberto.
É basicamente um invólucro para as soluções wmctrl e xdotool listadas como respostas aqui, e fornece uma maneira fácil de fazer e salvar rapidamente essas configurações.
fonte
Não tenho o representante para comentar diretamente sobre a excelente postagem de Jacob Vlijm, mas modifiquei o script para permitir o início de um aplicativo com argumentos (necessário usar
setwindow
comgedit --new-window
). Mudança:para:
fonte
Eu brinquei com o script de Terdon de cima e adicionei algumas coisas novas (capacidade de selecionar o monitor e definir a altura de cada monitor). Seria extensível a adição de mais monitores, eu acho. Espero que outros achem útil.
Sintaxe básica:
Onde prog_name é como você salvou esse código; monitor é o número do monitor, por exemplo, 1 ou 2; l / r / m é esquerda ou direita ou max; e window_name é o nome (ou uma fração do nome) da janela de destino.
Por exemplo:
Script Bash
fonte