Unity atalho de teclado para mover o mouse (e focar) de uma tela para outra tela

4

Desfrutando da configuração de vários monitores em casa e no trabalho, mas imaginando como mover o foco entre monitores individuais (ou seja, "telas") sem mouse?

Os atalhos dos teclados são excelentes para alternar entre os desktops virtuais, e eu observei várias opções em ccsm , mas nada me veio à mente.

Também vejo outras questões, como alternar foco entre separar telas X ou links para dualscreenmouseutils e switchscreen mas todos parecem estar preocupados com telas separadas por xorg.conf . Atualmente, o Unity "simplesmente funciona" com vários monitores (por meio da porta de exibição), portanto, é um pouco embaraçoso para as riquezas.

Mas qualquer dica de como navegar em várias telas (físicas) dentro de uma única exibição Unity (virtual) seria muito bem-vinda.

    
por Dirk Eddelbuettel 25.07.2015 / 15:24

2 respostas

3

Alterne entre as telas e (opcionalmente) defina o foco na janela (tela inteira)

O script abaixo irá alternar (e "focar") entre as telas esquerda e direita se as duas telas estiverem mais ou menos alinhadas no centro ou no topo, e < em> mais ou menos da mesma resolução vertical.
Eu suponho em praticamente todas as situações de uma configuração de tela esquerda / direita que funcionará.

O script

#!/usr/bin/env python3
import subprocess
# just a helper function
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")
# get the current mouse position
current = [int(n) for n in [it.split(":")[1] for it in get(["xdotool", "getmouselocation"]).split()[:2]]]
# get the x/y size of the left screen
screendata = [(s.split("x")[0], s.split("x")[1].split("+")[0]) for s in get(["xrandr"]).split() if "+0+0" in s ][0]
xy = [int(n) for n in screendata]
# see if the mouse is on the left- or right screen
if current[0] < xy[0]:
    # if the mouse currently is on the left screen, move it to the right (from the middle of the left screen)
    command = ["xdotool", "mousemove", "--sync", str(current[0]+xy[0]), str(xy[1]/2)]
else:
    # if the mouse currently is on the left screen, move it to the right (from the middle of the left screen)
    command = ["xdotool", "mousemove", "--sync", str(current[0]-xy[0]), str(xy[1]/2)]

subprocess.Popen(command)
# optional: click after the mouse move: comment out if not needed / wanted
subprocess.Popen(["xdotool", "click", "1"])

Como usar

  1. O script precisa de xdotool para ser instalado (!)

    sudo apt-get install xdotool
    
  2. Copie o script em um arquivo vazio, salve-o como toggle_screenloc.py

  3. Teste-o pelo comando:

    python3 /path/to/toggle_screenloc.py
    
  4. Se tudo funcionar bem, adicione-o a uma tecla de atalho: Escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:

    python3 /path/to/toggle_screenloc.py
    

O que faz exatamente

Se o script for executado, ele:

  1. deriva o tamanho da tela (esquerda) (x / y) da saída do comando xrandr .
  2. ele vê se o mouse está na tela esquerda ou direita, marcando o comando ( xdotool ):

    xdotool getmouselocation
    

Se o ponteiro do mouse estiver localizado na tela esquerda:

  • ele é movido para o meio (verticalmente) da tela esquerda e movido horizontalmente para uma posição, igual à posição atual + a largura da tela à esquerda.

Se o ponteiro do mouse estiver na tela da direita:

  • as ações são o oposto.

Posteriormente, o mouse clica uma única vez para definir o foco no (possível) aplicativo de tela cheia (opcional).

    
por Jacob Vlijm 25.07.2015 / 17:23
3

A resposta de Jacob Vlijm tem a idéia certa, mas existem outras maneiras. Aqui está minha opinião:

#!/bin/bash

eval $(xdotool getmouselocation --shell)

if [ $Y -gt 1080 ]
then
    theta=0
else
    theta=180
fi

xdotool mousemove_relative --polar $theta 1080

eval $(xdotool getmouselocation --shell)

xdotool windowfocus $WINDOW

A simplificação vem do uso de xdotool getmouselocation --shell , que despeja convenientemente as variáveis no script de execução. Isso também nos permite focar a janela sem clicar, o que poderia ter efeitos colaterais que não queremos.

Note que no meu caso, minhas telas são empilhadas verticalmente, então eu movo o mouse para cima (theta = 0) ou para baixo (theta = 180). Eu também escolho 1080px como linha divisória.

    
por chreekat 13.11.2015 / 21:45