Como funciona
O script abaixo mede o tamanho de uma área, entre dois locais do ponteiro do mouse.
Funciona como segue:
-
Coloque o ponteiro do mouse na primeira posição (sem clicar)
Pressioneacombinaçãodeteclasdesuaescolha(vejaabaixo)
Coloqueomousenasegundaposição(novamentesemclicar)
-
Pressione sua combinação de teclas novamente. Uma notificação informará o tamanho exato (px) da área.
Opções
Vocêpodeescolher(descomentandoumadaslinhas)comogostariadesernotificado;porumanotificação:
Ou uma janela de informações do Zenity:
(osexemplossãodediferentesáreas)
Comousar
Oscriptusaxdotool
:
sudoapt-getinstallxdotool
Copieoscriptabaixoemumarquivovazio,descomenteumadaslinhas:
command=['notify-send','Areasize',str(w)+'x'+str(h)]
(parasernotificadopelaopçãonotify-send
)
ou:
command=['zenity','--info','--title','AreaSize','--text',str(w)+'x'+str(h)]
paraaopçãoZenity
.
Salveoscriptem~/bin
(provavelmenteseránecessáriocriarodiretório)comomeasure_area
(semextensão)etorná-loexecutável.
Adicioneumacombinaçãodeteclasàsuaescolhaparaexecutaroscript:Escolha:Configuraçõesdosistema>"Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:
measure_area
Notas
- Você terá que sair / entrar primeiro
- Não faz diferença o que você considera como primeira / segunda posição; o script mede valores absolutos .
O script
#!/usr/bin/env python3
import subprocess
import os
import math
home = os.environ["HOME"]
area = home+"/"+".measure_area.txt"
def get_pos():
pos_data = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
return [m[2:] for m in pos_data.split()[:2]]
def confirm():
get = subprocess.check_output(["xrandr", "--verbose"]).decode("utf-8").split()
for s in [get[i-1] for i in range(len(get)) if get[i] == "connected"]:
br_data = float(get[get.index("Brightness:")+1])
brightness = lambda br: ["xrandr", "--output", s, "--brightness", br]
flash = ["sleep", "0.1"]
for cmd in [brightness(str(br_data-0.1)), flash, brightness(str(br_data))]:
subprocess.call(cmd)
if not os.path.exists(area):
with open(area, "wt") as measure:
measure.write(str(get_pos()))
confirm()
else:
second = get_pos()
with open(area) as first_m:
try:
first = eval(first_m.read())
w = int(math.fabs(int(second[0]) - int(first[0])))
h = int(math.fabs(int(second[1]) - int(first[1])))
#--- uncomment either one of the lines below:
# command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
#---
confirm()
except SyntaxError:
text = "Please try again, there was an error in the data"
command = ['zenity', '--info', '--title', 'Please try again', '--text', text]
subprocess.Popen(command)
os.remove(area)
Explicação
Quando o script é chamado pela primeira vez, ele obtém a posição atual do mouse com o comando xdotool
:
xdotool getmouselocation
Em seguida, ele salva a posição em um arquivo (invisível) .measure_area.txt
, aguardando a segunda chamada.
Na segunda chamada, ele lê o arquivo, o remove e compara as coordenadas x/y
armazenadas com as mais recentes e calcula o tamanho da área entre elas.
Editar
Atualizou o script com várias melhorias:
- Comandos
subprocess.Popen()
/ subprocess.check_output()
otimizados (graças a @muru, @Trengot)
- Foi adicionado um procedimento de reparo caso algo desse errado com o primeiro arquivo de dados (por exemplo, se o usuário primeiro tentasse executar o script sem ter o
xdotool
instalado)
- Adicionado um pequeno flash de tela de confirmação quando a combinação de teclas é pressionada para as primeiras coordenadas. Parece um pouco mais fácil de usar para dar ao usuário algum tipo de confirmação da ação.