Я задаюсь вопросом, существует ли способ заставить одно действие иметь два различных эффекта в зависимости от рабочей области, это идет.
Например: если на рабочей области 1, то команда, чтобы сфокусировать список чата Сочувствия используется, но если на рабочей области 2, то команда для открытия Chrome используется.
Это было бы связано с mousing к правому краю экрана в Compiz.
Действительно ли это возможно?
Взгляните на xdotool
. get_desktop
произведет текущий рабочий стол в поле зрения.
Для Ubuntu с Единицей называют рабочие области viewports
и представлены в координатной форме, положении X и Y верхнего левого угла.
Например,
$ xdotool get_desktop_viewport
4780 0
Можно использовать ту информацию для выяснения, какая рабочая область Вы идете и выполняете команду на каждую рабочую область.
Примечание: Ответ был переписан в Python для лучшей производительности, но без элементов GUI. Посмотрите раздел Python Version
Рев сценария позволяет выполнять определенную команду в зависимости от в настоящее время активной рабочей области. Это предназначается, чтобы быть связанным с сочетанием клавиш. Демонстрация сценария в действии может быть найдена здесь: https://www.youtube.com/watch? v=oxim3JbeiVM
Скопируйте источник сценария с этого сообщения или установки через следующие шаги:
sudo apt-get install git
cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
sudo chmod -R +x sergrep
Файл /opt/sergrep/unity_viewport_commands.sh
Сценарий имеет следующие флаги:
-r
выполните команду для текущей области просмотра-g
генерируйте новый список команд-h
распечатайте текст справки-v
просмотрите текущие настройки-s
измените настройки для единственной области просмотраСценарий предназначен, чтобы быть связанным с сочетанием клавиш с конкретным флагом. Например, Ctrl+Alt+I был бы связан с unity_viewport_commands.sh -r
для вызова команды.
Для привязки сценария с ярлыком обратитесь к тому, Как я обязываю .sh файлы вводить с клавиатуры комбинацию?
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com
# Date: April 18th, 2016
# Purpose: Script that runs a command depending
# on the current viewport
# Written for: https://askubuntu.com/q/56367/295286
# Tested on: Ubuntu 14.04 , Unity 7.2.6
###########################################################
# Copyright: Serg Kolo , 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
ARGV0="$0"
ARGC=$#
get_screen_geometry()
{
xwininfo -root | awk '/-geometry/{gsub(/+|x/," ");print $2,$3}'
}
gui_dialog()
{
SCHEMA="org.compiz.core:/org/compiz/profiles/unity/plugins/core/"
read swidth sdepth <<< "$(get_screen_geometry)"
vwidth=$(gsettings get $SCHEMA hsize)
vheight=$(gsettings get $SCHEMA vsize)
width=0
for horizontal in $(seq 1 $vwidth); do
height=0
for vertical in $(seq 1 $vheight); do
# array+=( FALSE )
viewport+=( $(echo "$width"x"$height") )
height=$(($height+$sdepth))
done
width=$(($width+$swidth))
done
local fmtstr=""
for i in ${viewport[@]} ; do
fmtstr=$fmtstr"$(printf "%s\"%s\" " "--add-entry=" $i)"
done
STR=$(zenity --forms --title="Set Viewport Commands" \
--text='Please avoid using # character' --separator="#" \
$fmtstr 2>/dev/null)
OLDIFS=$IFS
IFS="#"
commands=( $STR )
IFS=$OLDIFS
# for loop done with while loop
counter=0
while [ $counter -lt ${#viewport[@]} ] ;
do
echo "${viewport[$counter]}":"${commands[$counter]}"
counter=$(($counter+1))
done
}
get_current_viewport()
{
xprop -root -notype _NET_DESKTOP_VIEWPORT | \
awk -F'=' '{gsub(/\,/,"x");gsub(/\ /,"");print $2}'
}
run_viewport_command()
{
[ -r "$HOME"/"$DATAFILE" ] || \
{ printf ">>> ERR: commands file doesn't exit. \
\nCreate new one using -g flag" > /dev/stderr ; exit 1 ;}
local VP=$(get_current_viewport)
cmd=$(awk -v regex="^$VP" -F ':' '$0~regex{ $1="";print }' "$HOME"/"$DATAFILE")
eval $cmd " &> /dev/null &"
}
view_current_settings()
{
if [ -r "$HOME"/"$DATAFILE" ]; then
cat "$HOME"/"$DATAFILE" | \
zenity --list --height=250 --width=250 \
--title="current settings" --column="" 2> /dev/null
else
printf ">>> ERR: commands file doesn't exist
\\nCreate new one using -g flag" > /dev/stderr
exit 1
fi
}
change_single()
{
if [ -r "$HOME"/"$DATAFILE" ] ;then
NEWLINE="$(zenity --forms --separator='#' \
--add-entry="viewport to change(XPOSxYPOS):"\
--add-entry="new command")"
remove_this=$(awk -F '#' '{ print $1 }' <<< "$NEWLINE")
sed -i '/^'$remove_this'/d' "$HOME"/"$DATAFILE"
new_cmd=$(awk -F '#' '{$1="";printf "%s",$0}' <<< "$NEWLINE")
echo "$remove_this":"$new_cmd" >> "$HOME"/"$DATAFILE"
fi
}
print_usage()
{
cat << EOF
Usage: viewport_commands.sh [option]
Copyright Serg Kolo , 2016
-r run a command for current viewport
-g generate new list of commands
-h print this text
-v view current settings
-s change setting for a single viewport
EOF
}
parse_args()
{
[ $# -eq 0 ] && print_usage && exit 0
local option OPTIND
while getopts "grvhs" option ;
do
case ${option} in
g) gui_dialog > "$HOME"/"$DATAFILE"
;;
r) run_viewport_command
;;
v) view_current_settings
;;
s) change_single
;;
h) print_usage && exit 0
;;
\?) echo "Invalid option: -$OPTARG" >&2
;;
esac
done
shift $((OPTIND-1))
}
main()
{
local DATAFILE=".viewport_commands"
parse_args "$@"
exit 0
}
main "$@"
Ubuntu использует области просмотра вместо рабочих областей. Это - система координат, которая рассчитывает в положительных числах вниз и праве, где 0,0
была бы Ваша верхняя левая рабочая область.
Путем знания то, что, у нас может быть простой сценарий, который получает текущие координаты, тестирует их и выполняет соответствующую команду. Рев сценария делает это.
#!/bin/bash
get_viewport()
{
xprop -root -notype _NET_DESKTOP_VIEWPORT | \
awk -F '=' '{ gsub(/\ /,"");print $2 }'
}
get_viewport
case "$(get_viewport)" in
"0,0") notify-send 'You are in the top left viewport'
;;
"2732,768") notify-send 'You are in the bottom right viewport'
;;
esac
Замена notify-send
команды с тем, какой бы ни действие Вы хотите. Использовать nohup COMMAND 2>/dev/null &
избегать команд, подвешивающих сценарий (notify-send
исключение, следовательно не добавил его там).
Используйте xprop -root -notype _NET_DESKTOP_VIEWPORT
определить координаты каждой из Ваших областей просмотра.
Наконец, не должно быть никаких пробелов в опциях оператора выбора, например. "0,0"
работы, но "0, 0"
не будет.
Эта версия сценария выполняет ту же функцию, но не содержит параметры командной строки или элементы GUI ради простоты и удобства использования. Сценарий доступен как Суть GitHub, а также ниже:
Использование очень просто:
python3 /path/to/workspace_command.py
Сценарий определяет текущую рабочую область и выполняет соответствующую команду, определенную в ~/.workspace_commands.json
. Удостоверьтесь, что Вы создаете этот файл сначала, иначе работа привычки сценария. Обратите внимание также, что необходимо использовать двойные кавычки для определения каждой рабочей области и команды + аргумент
Образец ~/workspace_commands.json
:
{
"1":["nautilus"],
"2":["firefox","google.com"],
"3":["virtualbox"]
}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Author: Serg Kolo , contact: 1047481448@qq.com
Date: August 9th, 2016
Purpose: Spawns a command depending on current
viewport, as defined in ~/.workspace_commands.json
Written for: https://askubuntu.com/q/56367/295286
Tested on: Ubuntu 16.04 LTS , Unity desktop
The MIT License (MIT)
Copyright © 2016 Sergiy Kolodyazhnyy <1047481448@qq.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE
"""
# Just in case the user runs
# the script with python 2, import
# print function
from __future__ import print_function
import gi
gi.require_version('Gdk', '3.0')
from gi.repository import Gio,Gdk
import json
import subprocess
import os
def gsettings_get(schema,path,key):
"""Get value of gsettings schema"""
if path is None:
gsettings = Gio.Settings.new(schema)
else:
gsettings = Gio.Settings.new_with_path(schema,path)
return gsettings.get_value(key)
def run_cmd(cmdlist):
""" Reusable function for running shell commands"""
try:
stdout = subprocess.check_output(cmdlist)
except subprocess.CalledProcessError:
print(">>> subprocess:",cmdlist)
sys.exit(1)
else:
if stdout:
return stdout
def enumerate_viewports():
""" generates enumerated dictionary of viewports and their
indexes, counting left to right """
schema="org.compiz.core"
path="/org/compiz/profiles/unity/plugins/core/"
keys=['hsize','vsize']
screen = Gdk.Screen.get_default()
screen_size=[ screen.get_width(),screen.get_height()]
grid=[ int(str(gsettings_get(schema,path,key))) for key in keys]
x_vals=[ screen_size[0]*x for x in range(0,grid[0]) ]
y_vals=[screen_size[1]*x for x in range(0,grid[1]) ]
viewports=[(x,y) for y in y_vals for x in x_vals ]
return {vp:ix for ix,vp in enumerate(viewports,1)}
def get_current_viewport():
"""returns tuple representing current viewport,
in format (width,height)"""
vp_string = run_cmd(['xprop', '-root',
'-notype', '_NET_DESKTOP_VIEWPORT'])
vp_list=vp_string.decode().strip().split('=')[1].split(',')
return tuple( int(i) for i in vp_list )
def read_config_file():
""" reads ~/.workspace_commands file """
rcfile = os.path.join( os.path.expanduser('~'),
'.workspace_commands.json')
try:
with open(rcfile) as config_file:
config_data = json.load(config_file)
except IOError as error:
print(error.__repr__())
else:
if config_data:
return config_data
def main():
# get all the info we need first
viewports_dict=enumerate_viewports()
current_viewport = get_current_viewport()
current_vp_number = viewports_dict[current_viewport]
viewport_config = read_config_file()
for vp,command in viewport_config.items():
if int(vp) == current_vp_number:
# spawn the command and let us exit
pid = subprocess.Popen(command).pid
break
if __name__ == '__main__':
main()
Исходный вопрос спрашивает о том, чтобы заставлять это работать с действием наведения мыши с правой стороной экрана. В то время как я предлагаю использовать вышеупомянутые сценарии, как связано с сочетаниями клавиш, мышь по действию возможна. Ниже простой сценарий, который запускает версию Python выше, если мышь находится в правом верхнем углу экрана. Не стесняйтесь корректировать сценарий для удовлетворения потребностям
#!/usr/bin/env python3
import gi
gi.require_version('Gdk', '3.0')
from gi.repository import Gio,Gdk
import subprocess
from time import sleep
def main():
screen = Gdk.Screen.get_default()
root_window = screen.get_root_window()
while True:
if root_window.get_pointer()[2] == 0 and \
root_window.get_pointer()[1] >= root_window.get_width()-2:
proc = subprocess.Popen(['python3','/home/user/bin/python/workspace_command.py']).pid
sleep(0.75)
if __name__ == '__main__':
main()
Подобный сценарий события от нажатия мыши может быть сделан со сценарием оболочки, который использует xdotool getmouselocation
команда и синтаксические анализы ее вывод, который был бы чем-то вроде этого:
$ xdotool getmouselocation
x:1140 y:420 screen:0 window:14680095