Когда-то давно был невероятный менеджер окон, названный "просвещением".
Если Вы использовали его, и Вы поражаете Alt+Tab затем, Вы видели маленький список заголовков окон друг ниже друга.
Как это:
Или как это:
Мне понравился он много.
Я хочу это назад. Я имею в виду функцию, не приложение.
Я использую Ubuntu 18.04
Я не хочу видеть значки приложений как это:
У меня есть до пяти открытых терминалов. Если я нажму ключ окон, то я буду видеть примерно то же изображение (небольшая версия большого терминала) пять раз.
Это занимает время и умственная энергия найти правильный терминал. И я хочу переключиться с клавиатурой только, не используя мышь.
Волшебство позади терминала:
xtermset -title foo
У меня есть это сценарий удара, который выполняется, если я вхожу в систему через ssh.
Таким образом, я могу различать несколько терминалов легко.
Как получить эту функцию, которая работала в 1998 году назад?
(Не говорите мне устанавливать менеджер окон просвещения, этот вопрос о простой функции, не приложении),
Пользователь "DK Bose" хотел, чтобы я показал вывод этих команд:
===> wmctrl -m
Name: GNOME Shell
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A
tguettler@aptguettler:~
===>
tguettler@aptguettler:~
===> wmctrl -lx
0x0200000a 0 desktop_window.Nautilus aptguettler Schreibtisch
0x01c00178 0 Pidgin.Pidgin aptguettler tbz
0x02600010 0 Navigator.Firefox aptguettler command line - List of window names on ALT-Tab - Ask Ubuntu - Mozilla Firefox
0x02200010 0 Mail.Thunderbird aptguettler Posteingang - tguettler@tbz-pariv.de (IMAP) - Mozilla Thunderbird
0x04400006 0 gnome-terminal-server.Gnome-terminal aptguettler foooooo
0x044000ce 0 gnome-terminal-server.Gnome-terminal aptguettler tguettler@aptguettler
Строка "foooooo" была установлена через xtermset -title foooooo
. Заголовок был установлен в оболочке, которая выполняла ssh на удаленном сервере.
Я не уверен, что желательно попытаться изменить менеджер окон в Ubuntu 18.04. Менеджер окон интегрируется в GNOME Shell.
Можно найти Rofi подходящим для цели, которую Вы описываете при оставлении значения по умолчанию системы неповрежденным.
Rofi доступен в разделе вселенной.
Это имеет установленный размер 524 КБ и и очень немного зависимостей, которые Вы видите путем выполнения apt show rofi
или путем моделирования его использования установки apt install -s rofi
.
Rofi имеет несколько функций, но тот интереса здесь является переключателем окна.
После того как Rofi установлен:
Выполненный rofi -dump-config > ~/.config/rofi/config.rasi
генерировать локальный файл конфигурации, который можно изменить для удовлетворения потребностям.
Предварительно просмотрите тему, которую требуется использовать путем выполнения rofi-theme-selector
. Если Вы хотите настроить тему далее, Вы могли бы скопировать тему от/usr/share/rofi/themes до ~/.local/share/rofi/themes и дать ей новое имя для предотвращения беспорядка. Я люблю Темный как поп и назвал локальную версию myPop-темной. В изображениях, отправленных в этом ответе, я использовал myPop-темный.
Использование
Продемонстрировать использование Rofi в качестве альтернативы Alt+Tab системы:
Я открыл несколько окон включая пять xterm окон.
Я назначил Ctrl+Win+R комбинацией клавиатуры ярлыка для выполнения rofi -show window -theme myPop-Dark
В изображении, отправленном выше, существует три столбца. Если Вы всегда хотите только название приложения и заголовка окна, редактируете ~/.config/rofi/config.rasi для изменения прокомментированного строка форматов окна на
window-format: "{n} {t}";
Можно также изменить ширину, высоту и местоположение rofi окна.
Для обеспечения окна, Вы хотите в фокус, используете клавиши со стрелками или Ваш указатель мыши, чтобы выделить запись и затем нажать Enter.
Если Вы имеете действительно длинный список окон, нажимаете клавишу, это уникально для окна, Вы хотите отфильтровать все другие окна. Если это не возможно, отфильтруйте записи путем ввода, как в анимации ниже, f, сопровождаемый o для ограничения списка окнами, содержащими строку "нечто".
Анимация ниже иллюстрирует это.
Для закрытия выделенного окна нажмите Shift+Delete.
Ubuntu, включая 18,04, теперь основана на GNOME, и некоторые дополнительные функции могли быть сделаны доступными через GNOME Расширения Shell. Перейдите к веб-сайту и поиску: используйте "переключатель окна" в качестве ключевых слов, и соответствующий внутренний абонент может быть перечислен на первой странице результата поиска.
Этот кажется релевантным и сохраняемым:
Переключатель dlandau
Окна переключателя или запускают приложения быстро путем ввода
Используйте настроенную глобальную горячую клавишу (Super+w по умолчанию) для открытия списка текущих окон. Введите часть имени или заголовок окна приложения, которое Вы хотите активировать и поразить, вводят или нажимают на объект, который Вы хотите активировать. Можно использовать клавиши со стрелками, чтобы перейти среди фильтрованного выбора и ввести разделенные критерии поиска нескольких пространств для фильтрации далее. Используйте Esc или нажмите где угодно вне переключателя для отмены.
Используйте настроенную глобальную горячую клавишу (Super+x по умолчанию) для открытия средства запуска приложения. Введите часть названия приложения, которое Вы хотите запустить и поразить, входят. Можно использовать Ctrl+Space или Ctrl+Tab для переключения между переключателем и средством запуска, или когда нет никаких открытых окон, соответствующих имени, но существуют приложения, режим переключается автоматически.
Можно настроить стиль и функциональность в предпочтениях.
Дополнительная Домашняя страница: https://github.com/daniellandau/switcher
Версия Shell:
3.30
3.28
3.26
3.24
3.22
3.20
3.18
3.16.3
3.16
3.14
Для привязки общего сочетания клавиш Alt+Tab или Super+Tab с этим расширением пользователь может быть обязан использовать обходное решение. Пользователь GitHub, PHLAK, отправил этот выпуск № 63 о GitHub и также объяснил обходное решение в нескольких комментариях:
Я хотел бы связать Переключатель с Супер + Вкладка, но не могу. Я также заметил, что не могу связать его с Высоким звуком + Вкладка также.
Я смог работать вокруг этого путем устанавливания значения непосредственно с
dconf
:dconf write /org/gnome/shell/extensions/switcher/show-switcher "['<Super>tab']"
Можно также сделать то же при помощи
dconf-config
GUI.
Вам, возможно, также придется развязать любые предварительно сконфигурированные ярлыки с помощью того сочетания клавиш. А именно, "Приложения переключателя" связываются с
Super+Tab
в Gnome.Можно изменить это путем открытия Settings и навигации к
Devices > Keyboard
. Затем поискSuper+Tab
и измените или удалите эту привязку.
Отказ от ответственности: Я не использую Ubuntu 18.04 или GNOME Shell, таким образом, я не протестировал это расширение. Я просто заключил в кавычки наиболее на вид надежные ресурсы, найденные в сети. Снимок экрана был восстановлен и оптимизировал (122 КБ) в GIMP вместо этого, потому что исходный снимок экрана и изображение с анимацией были слишком большими (500 КБ, 7 МБ).
TL; DR Переходит к Shell GNOME веб-сайт Расширений и устанавливает предпочтительное расширение: Переключатель dlandau. Согласно совместимости с версией Shell.
Я думаю, что Вы конкретно ищете функцию "Cycling through windows in a list", которая доступна в Тонких настройках Менеджера окон-> Циклически повторяющийся в XFCE.
Последний приготовленный в домашних условиях:
Установка существует двух крошечных сценариев, чтобы быть сохраненной в один и тот же каталог:
#!/usr/bin/env python3
import gi
gi.require_version("Gtk", "3.0")
gi.require_version('Wnck', '3.0')
from gi.repository import Gtk, Wnck, Gdk
import subprocess
css_data = """
.activestyle {
background-color: grey;
color: white;
border-width: 1px;
border-radius: 0px;
border-color: white;
}
.defaultstyle {
border-width: 0px;
color: black;
background-color: white;
}
"""
class AltTabStuff(Gtk.Window):
def __init__(self):
# css
self.provider = Gtk.CssProvider.new()
self.provider.load_from_data(css_data.encode())
Gtk.Window.__init__(
self, title="AltTab replacement"
)
self.curr_index = 0
self.connect('key-press-event', self.get_key)
self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
self.set_decorated(False)
buttongrid = Gtk.Grid()
self.add(buttongrid)
self.connect("delete_event", Gtk.main_quit)
wins = get_winlist()
self.buttonindex = 0
self.buttonsets = []
index = 0
for w in wins:
button = Gtk.Button("\t" + w.get_name())
button.set_relief(Gtk.ReliefStyle.NONE)
buttongrid.attach(button, 0, index, 1, 1)
index = index + 1
button.connect("clicked", raise_window, w)
self.buttonsets.append([button, w])
self.set_focus()
self.show_all()
Gtk.main()
def set_focus(self):
for b in self.buttonsets:
button = b[0]
self.set_style(button, active=False)
newactive = self.buttonsets[self.buttonindex][0]
self.set_style(newactive, active=True)
n_buttons = len(self.buttonsets)
self.buttonindex = self.buttonindex + 1
if self.buttonindex >= n_buttons:
self.buttonindex = 0
def set_style(self, button, active):
st_cont = button.get_style_context()
if active:
st_cont.add_class("activestyle")
st_cont.remove_class("defaultstyle")
else:
st_cont.remove_class("activestyle")
st_cont.add_class("defaultstyle")
Gtk.StyleContext.add_provider(
st_cont,
self.provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
)
def get_key(self, val1, val2):
keyname = Gdk.keyval_name(val2.keyval)
if keyname == "Tab":
self.set_focus()
elif keyname == "Alt_L":
window = self.buttonsets[self.buttonindex-1][1]
button = self.buttonsets[self.buttonindex-1][0]
raise_window(button, window)
elif keyname == "Escape":
Gtk.main_quit()
def raise_window(button, window):
subprocess.Popen(["wmctrl", "-ia", str(window.get_xid())])
Gtk.main_quit()
def check_windowtype(window):
try:
return "WNCK_WINDOW_NORMAL" in str(
window.get_window_type()
)
except AttributeError:
pass
def get_winlist(scr=None):
"""
"""
if not scr:
scr = Wnck.Screen.get_default()
scr.force_update()
windows = [w for w in scr.get_windows() if check_windowtype(w)]
return windows
AltTabStuff()
#!/bin/bash
dr=`dirname $0`
f=$dr'/alttab_runner'
if ! pgrep -f $f
then
$f
else
echo "runs"
fi
Сделайте следующие шаги:
Удостоверьтесь оба Wnck
и wmctrl
установлены:
sudo apt install python3-gi gir1.2-wnck-3.0 wmctrl
Сохраните сценарий 1 в пустой файл как (точно) alttab_runner
, сценарий 2 как (точно) alttab_alternative
. сделайте оба исполняемых файла сценариев
Отключите существующий Alt-Tab:
gsettings set org.gnome.desktop.wm.keybindings switch-applications '[]'
Установите ярлык (точно) Alt-Tab для выполнения сценария 2:
/path/to/alttab_alternative
Нажмите Alt + Вкладка, чтобы назвать переключатель (как в изображении), выпустить Высокий звук и нажать Tab, чтобы циклически повториться через окна, нажать Alt снова для выбора выбранного окна из списка.
Escape отклонит (закрывают) переключатель.
Если Вы хотели бы различные цвета, можно играть с CSS в сценарии 1 для установки собственного моделирования.
Для этого отредактируйте этот раздел, где activestyle
очевидно, в настоящее время выбранный пункт:
css_data = """
.activestyle {
background-color: blue;
color: white;
border-width: 1px;
border-radius: 0px;
border-color: white;
}
.defaultstyle {
border-width: 0px;
color: black;
background-color: white;
}
"""
См. опции CSS Gtk здесь на шрифте и кнопках.
Если требуется придерживаться точно Высокого звука +, Вкладка, в точном ключевом поведении как обычное, использует вместо сценария один:
#!/bin/bash
dr=`dirname $0`
user=$USER
f=$dr'/alttab_runner'
trg='/tmp/'$user'_alttab_trigger'
if ! pgrep -f $f
then
$f
else
echo "runs"
touch $trg
fi
И вместо сценария 2:
#!/usr/bin/env python3
import gi
gi.require_version("Gtk", "3.0")
gi.require_version('Wnck', '3.0')
from gi.repository import Gtk, Wnck, Gdk
import subprocess
from threading import Thread
import time
import os
trigger = os.path.join("/tmp", os.environ["USER"] + "_alttab_trigger")
css_data = """
.activestyle {
background-color: grey;
color: white;
border-width: 1px;
border-radius: 0px;
border-color: white;
}
.defaultstyle {
border-width: 1px;
color: black;
background-color: white;
}
"""
class AltTabStuff(Gtk.Window):
def __init__(self):
# apply css
self.provider = Gtk.CssProvider.new()
self.provider.load_from_data(css_data.encode())
Gtk.Window.__init__(
self, title="AltTab replacement"
)
self.curr_index = 0
self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
self.set_decorated(False)
buttongrid = Gtk.Grid()
self.add(buttongrid)
self.connect("delete_event", Gtk.main_quit)
wins = get_winlist()
self.buttonindex = 0
self.buttonsets = []
index = 0
for w in wins:
button = Gtk.Button("\t" + w.get_name())
button.set_relief(Gtk.ReliefStyle.NONE)
buttongrid.attach(button, 0, index, 1, 1)
index = index + 1
button.connect("clicked", raise_window, w)
self.buttonsets.append([button, w])
self.set_focus()
# thread to watch the trigger file
self.timer = Thread(target=self.wait)
self.timer.setDaemon(True)
self.timer.start()
self.show_all()
Gtk.main()
def set_focus(self):
# rotate the focus + styling
for b in self.buttonsets:
button = b[0]
self.set_style(button, active=False)
newactive = self.buttonsets[self.buttonindex][0]
newselected = self.buttonsets[self.buttonindex][1]
time.sleep(0.03)
self.set_style(newactive, active=True)
n_buttons = len(self.buttonsets)
self.buttonindex = self.buttonindex + 1
if self.buttonindex >= n_buttons:
self.buttonindex = 0
return newselected
def wait(self):
"""
wait loop; see if trigger file pops up, or we need to quit on immediate
key release
"""
newfocus = self.buttonsets[0][1]
while True:
time.sleep(0.05)
if not self.key_checker():
# try/except, in case no windows on workspace
try:
self.activate(str(newfocus.get_xid()))
except TypeError:
pass
Gtk.main_quit()
if os.path.exists(trigger):
os.remove(trigger)
newfocus = self.set_focus()
def activate(self, arg1, arg2=None):
# activate the selected window, close preview window
w = arg2 or arg1
subprocess.Popen(["wmctrl", "-ia", w])
Gtk.main_quit()
def set_style(self, button, active):
st_cont = button.get_style_context()
if active:
# st_cont.add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION)
st_cont.add_class("activestyle")
st_cont.remove_class("defaultstyle")
else:
st_cont.remove_class("activestyle")
# st_cont.remove_class("suggested-action")
st_cont.add_class("defaultstyle")
Gtk.StyleContext.add_provider(
st_cont,
self.provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
)
def key_checker(self):
# check if keys are in a pressed state
exclude = ["Button", "Virtual", "pointer"]
keyboards = [
k for k in get(["xinput", "--list"]).splitlines()
if not any([s in k for s in exclude])
]
dev_ids = [[
s.split("=")[1] for s in k.split() if "id=" in s
][0] for k in keyboards]
pressed = False
for d in dev_ids:
if "down" in get(["xinput", "--query-state", d]):
pressed = True
break
return pressed
def get(cmd):
# just a helper
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except (subprocess.CalledProcessError, TypeError, UnicodeDecodeError):
pass
def raise_window(button, window):
subprocess.Popen(["wmctrl", "-ia", str(window.get_xid())])
Gtk.main_quit()
def check_windowtype(window):
try:
return "WNCK_WINDOW_NORMAL" in str(
window.get_window_type()
)
except AttributeError:
pass
def get_winlist(scr=None):
if not scr:
scr = Wnck.Screen.get_default()
scr.force_update()
windows = [w for w in scr.get_windows() if check_windowtype(w)]
return windows
AltTabStuff()
Установка точно как первая версия:
Удостоверьтесь оба Wnck
и wmctrl
установлены:
sudo apt install python3-gi gir1.2-wnck-3.0 wmctrl
Сохраните сценарий 1 в пустой файл как (точно) alttab_runner
, сценарий 2 как (точно) alttab_alternative
. сделайте оба исполняемых файла сценариев
Отключите существующий Alt-Tab:
gsettings set org.gnome.desktop.wm.keybindings switch-applications '[]'
Установите ярлык (точно) Alt-Tab для выполнения сценария 2:
/path/to/alttab_alternative