Як зробити вікно вказівно-фобічним?


15

Я маю на увазі, що вікно повинно переміщатися, коли я намагаюся перемістити вказівник на нього. У мене є "Екранна програма аналогового годинника" та "Діалогове вікно прогресування файлів", які я налаштовував залишатися "Завжди на вершині" інших вікон із CCSM, але іноді вони заважають робити щось.

Якщо це неможливо, чи є якийсь метод, щоб вони ховалися, коли я переміщу вказівник на них, щоб я міг натискати на додаток прямо внизу?

Далі, якщо це неможливо, ніж ми можемо змусити вікна вести себе так, ніби їх там немає? Я маю на увазі, що я побачу вікно, але вказівник не повинен розпізнавати його і повинен нормально працювати над додатком під ним. Я зміню прозорість додатків і змушу його працювати, якщо це можливо?


2
Ви хочете, щоб якесь вікно було завжди показане, але вони також повинні дозволяти взаємодіяти з іншими вікнами під ними?
Анвар

Так, я не хочу взаємодіяти з цим (наприклад, "Копіювати діалогове вікно" з "Завжди вгорі" увімкнено) "(навіть не фокусуватися на цьому вікні), коли я переміщу вказівник на це вікно. Я просто хочу взаємодіяти з вікном під ним. Головне вікно (яке залишається зверху) повинно діяти як водяний знак (у вас ідея?) або рухатися вбік, коли я переміщу вказівник на нього.
Hemant Yadav

1
Оскільки це незвичне прохання, я не думаю, що це хтось робив. Але це, безумовно, можливо, вам потрібно буде написати розширення для використовуваного менеджера вікон (compiz, я думаю) . Крім того, чи вважаєте ви просто тримати ці вікна на окремому робочому столі та клавіші налаштування, щоб за допомогою "Super + some_number" ви могли перемикатися між робочими стільницями. Це дуже зручно для того, щоб тримати купу вікон, відкритих за один раз.
Привіт-Ангел

1
Розширення Gnome Shell "Workspaces To Dock" має можливість док-станції для ухилення вікон. Це не саме запитання, але, можливо, ви можете подивитися там, щоб зрозуміти, як цього досягти: github.com/passingthru67/workspaces-to-dock .
Самуїл

Погляньте на подібне питання щодо суперпользователя . Хтось припускає, що є функція плагіну compiz "Непрозорість, яскравість та насиченість", яка робить об’єкти з непрозорістю менше 50% натисканням кнопки ...
Jan Stavěl

Відповіді:


2

Сценарій Bash і xdotool == cursophobia.sh

Огляд
Я думаю, що у мене є рішення, яке буде працювати для вас. Це сценарій bash, який дозволяє вибрати вікно. Після вибору вікна сценарій постійно оглядає позиції вікон та курсорів за попередньо визначеними інтервалами. Якщо курсор стає занадто близько, вікно переміщується з шляху.

Залежність
Цей сценарій залежить від xdotool. Щоб встановити, запустітьsudo apt-get install xdotool

Сценарій: cursophobia.sh
Створіть новий скрипт bash із наступним вмістом та зробіть його виконуваним.

#!/bin/bash

windowSelectionDelay=5  # How long to wait for user to select a window?
buffer=10               # How close do we need to be to border to get scared?
jump=20                 # How far do we jump away from pointer when scared?
poll=.25                # How often in seconds should we poll window and mouse?
                        # locations. Increasing poll should lighten CPU load.

# ask user which window to make phobic
for s in $(seq 0 $((windowSelectionDelay - 1)))
do
    clear
    echo "Activate the window that you want to be cursophobic: $((windowSelectionDelay - s))"  
    sleep 1
done
wID=$(xdotool getactivewindow)

# find some boundary info and adjustments
# determine where the window is now
info=$(xdotool getwindowgeometry $wID)
base=$(grep -oP "[\d]+,[\d]+" <<< "$info")

# move the window to 0 0 and get real location
xdotool windowmove $wID 0 0
info=$(xdotool getwindowgeometry $wID)
realMins=$(grep -oP "[\d]+,[\d]+" <<< "$info")
xMin=$(cut -f1 -d, <<< "$realMins")
yMin=$(cut -f2 -d, <<< "$realMins")

# find offset values for no movement. This is necessary because moving 0,0
# relative to the current position sometimes actually moves the window
xdotool windowmove --relative $wID 0 0
info=$(xdotool getwindowgeometry $wID)
diff=$(grep -oP "[\d]+,[\d]+" <<< "$info")
xOffset=$[xMin - $(cut -f1 -d, <<< "$diff")]
yOffset=$[yMin- $(cut -f2 -d, <<< "$diff")]

# move window back to original location
x=$(cut -f1 -d, <<< "$base")
y=$(cut -f2 -d, <<< "$base")
xdotool windowmove $wID $[x + xOffset] $[y + yOffset]

dispSize=$(xdotool getdisplaygeometry)
xMax=$(cut -f1 -d ' ' <<< "$dispSize")
yMax=$(cut -f2 -d ' ' <<< "$dispSize")

clear
echo "You can minimize this window, but don't close it, or your window will overcome its cursophobia"
# start an infinite loop polling to see if we need to move the window.
while :
do
    # get information about where the window is
    info=$(xdotool getwindowgeometry $wID)
    position=$(grep -oP "[\d]+,[\d]+" <<< "$info")
    geometry=$(grep -oP "[\d]+x[\d]+" <<< "$info")
    height=$(cut -f2 -dx <<< "$geometry")
    width=$(cut -f1 -dx <<< "$geometry")
    top=$(cut -f2 -d, <<< "$position")
    left=$(cut -f1 -d, <<< "$position")
    bottom=$((top + height))
    right=$((left + width))

    # save mouse coordinates to x & y
    eval "$(xdotool getmouselocation | cut -f 1-2 -d ' ' | tr ' :' '\n=')"

    # If the mouse is too close to the window, move the window
    if [ $x -gt $((left - buffer)) ] && [ $x -lt $((right + buffer)) ] && [ $y -gt $((top - buffer)) ] && [ $y -lt $((bottom + buffer)) ]; then
        #figure out what side we're closest to so we know which direction to move the window
        t="$((y - top)):0 $((jump + (y - top)))"
        l="$((x - left)):$((jump + (x - left))) 0"
        b="$((bottom - y)):0 -$((jump + (bottom - y)))"
        r="$((right - x)):-$((jump + (right - x))) 0"
        coord="$(echo -e "$t\n$l\n$b\n$r" | sort -n | head -n 1 | cut -f2 -d:)"

        # set the offset values for x and y
        newX=$(cut -f1 -d ' ' <<< "$coord")
        newY=$(cut -f2 -d ' ' <<< "$coord")

        #check to make sure we're not out of bounds
        if [ $((right + newX)) -gt $xMax ]; then
            newX=$((-1 * left + xOffset))
        elif [ $((left + newX)) -lt $xMin ]; then
            newX=$((xMax - width))
        fi
        if [ $((bottom + newY)) -gt $yMax ]; then
            newY=$((-1 * top + yOffset))
        elif [ $((top + newY)) -lt $yMin ]; then
            newY=$((yMax - height))
        fi

        # move the window if it has focus
        [ $(xdotool getactivewindow) -eq $wID ] && xdotool windowmove --relative $wID $((newX + xOffset)) $((newY + yOffset))
    fi
    sleep $poll
done

Не забудьте відредагувати чотири змінні в самому верху на свій смак. Якщо цей скрипт задає ваш процесор, спробуйте збільшити pollзмінну до більшого значення.

cursophobia.sh в дії
Після того, як ви створили свій скрипт і зробили його виконуваним, запустіть його. Він попросить обрати вікно. Клацніть на вікні, яке ви хочете бути курсофським, і зачекайте, поки закінчиться відлік часу. Як тільки відлік часу закінчиться, вибране вікно стане курсофобним. Коли ви будете готові допомогти віконцю, прийшов його страх перед курсорами, закрийте вікно терміналу або вкажіть скрипт із вікна терміналу Ctrl+c

Кілька дисплеїв
Будь ласка, зверніть увагу, що це обмежує вікно курсофобії одним екраном. Я відкритий для редагувань, які б змусили його працювати на кількох екранах.


Весела частина прекрасна; це працює. На жаль, він повністю з'їдає зайнятість мого процесора (близько 60%). Тому це не справжнє корисне рішення, як є.
Яків Влійм

@JacobVlijm, я вніс деякі зміни, щоб полегшити роботу процесора. Спробуй.
b_laoshi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.