LINUX.ORG.RU

Оконная мозаика

 ,


12

6

С год назад я уже показывал разные нестандартные способы переключения окошек. Но если одно из них очень просто заменяется связкой dmenu+wmctrl, то вот цветастую штуковину за пределами xmonad никто изобретать не собирался. А удобная же штуковина! Но ведь главный принцип опенсорса — если чего-то нужного тебе нет, просто сделай это сам, верно? Поэтому в свободное время были изучены некоторые доки по иксам, и началось пиление велосипеда, названного чуть позже xwinmosaic.

Итого: программа написана на чистом С + GTK+2, а для работы нужен только EWMH-совместимый оконный менеджер (почти любой, некоторых в том списке нет). Идея та же — для каждого класса окна назначается свой цвет, что позвволяет легче находить нужное окно в списке. Окна, использовавшиеся недавно, выстраиваются ближе к центру. Для работы достаточно повесить запуск xwinmosaic на какой-нибудь хоткей средствами WM.

Жизнь была простой и беззаботной, когда тестирование производилось лишь на своей машинке с kwin, openbox и xmonad, однако после показа сей приблуды ограниченному кругу людей было выловлено (и вылавливается) неограниченное количество багов, как-никак: Си (сегфолты), зоопарк WM (куча неработающих или работающих по-другому функций), своё собственное отсутствие опыта, наконец.

Тем не менее, за неделю программу удалось причесать, и теперь она умеет:


  • Собственно, переключение между окнами
  • Чтение списка элементов из stdin и вывод выбранного элемента в stdout (что позволяет реализовывать похожее на dmenu поведение или даже изменять существующие скрипты простой заменой вызова dmenu на xwinmosaic, только аргументы придётся поменять)
  • Emacs (C-n C-p C-f C-b) / vim (hjkl)-подобная навигация для любителей.
  • Более-менее приличный поиск по элементам (а также по классам окон), в чем-то похожий на тот, что в ido-mode (например, «ff» найдёт все окна Firefox) — активизируется сразу при наборе в стандартном режиме и по / в режиме vim
  • окно непрямоугольной формы (на заднем плане не скриншот экрана, как в xmonad, а сами окошки, в которые можно тыкать), хотя поведение со скриншотом тоже пришлось реализовывать, так как оказалось, что не все ещё WM могут обогнать в функциональности TWM и не реализуют корректное поведение с XShape.
  • Для режима переключения окон реализовано обновление имён и самого списка окон в реальном времени, показ номера десктопа, на котором находится окно, и даже их иконки (всего этого в оригинале не было)
  • Возможность появления центра мозаики под курсором мыши (что показано на первом скриншоте, получается весьма прикольно)
  • Попытка уместить все элементы на экране вместо примитивного выстраивания их ромбиком (из-за чего к иксмонадовскому GridSelect были большие претензии)
  • Куда более приятные цвета, благодаря использованию цветовой модели HSL.
  • Ну и ещё что-то, наверное забыл упомянуть.


Ради забавы было реализовано даже подобие dmenu_run — получается очень радостно и эпилептично (спасибо, Artificial_Thought!).

На скриншотах, собственно, можно наблюдать xwinmosaic в режиме переключения окон и в режиме переключения буферов емакса (невероятно удобно, между прочим) — спасибо за идею и оригинальный скрипт для dmenu товарищу lazyklimm!
Шрифты — PT Sans в интерфейсе, Consolas в емаксе, убунтопатчи; всё та же старая обоина с Ктулху (очень мотивирует), а больше там ничего и не видно, вроде.

Надеюсь, кому-нибудь оно приглянется, поэтому ссылки:
Github: https://github.com/soulthreads/xwinmosaic (не забывайте писать в issues в случае обнаружения багов)
Пакеты для дебиана/убунты: https://launchpad.net/~soulthreads/ archive/xwinmosaic/ (могут быть немного неактуальными)
Арч: https://aur.archlinux.org/packages.php?ID=59660
Gentoo: https://github.com/soulthreads/xwinmosaic/blob/master/contrib/gentoo/xwinmosa... (надо будет напроситься к кому-нибудь в оверлей)

Вот как-то так, надеюсь, вам не надоело чтение этих многобуков.

>>> Просмотр (1024x1200, 302 Kb)



Проверено: JB ()
Последнее исправление: JB (всего исправлений: 5)
Ответ на: комментарий от Tanger

А может лучше раскрашивать по цветам рабочих столов?

А по какому принципу выбирать цвет рабочего стола? Жаль, конечно, что это не хаскель и тут нет возможности поручить функцию раскраски пользователю. :)

SoulThreads
() автор топика
Ответ на: комментарий от SoulThreads

Жаль, конечно, что это не хаскель и тут нет возможности поручить функцию раскраски пользователю

прилепи сбоку что-нибудь, хоть libguile какой :)

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

Я guile предлагал уже дня 4 назад. Решили что это переключалка окон, а не емакс.

Artificial_Thought ★★★★
()
Ответ на: комментарий от SoulThreads

А по какому принципу выбирать цвет рабочего стола?

Можно конфиг сделать..

Tanger ★★★★★
()
Ответ на: комментарий от lazyklimm

в нижний регистр название класса переводить надо

А вроде, и так в нижний перевожу…

    gchar *class1 = g_ascii_strdown (box->xclass, -1);
    gchar *class2 = g_ascii_strdown (box->xclass+strlen (class1)+1, -1);

SoulThreads
() автор топика

Класс, надо попробовать :)

spiro ★★
()
Ответ на: комментарий от lazyklimm

Понятно, что guile сам по себе не сильный оверхед вносит, но где гарантия того, что ты остановишься на одном только guile?

fat_angel ★★★★★
()

Интересно, что такого нужно делать, чтобы появилась необходимость переключаться между сотнями приложений?

baverman ★★★
()
Ответ на: комментарий от baverman

Из моего опыта за последние 3 месяца — куча окошек evince и libreoffice с документацией и примерами, gimp, автокад в виртуалке, ну и традиционные окна терминалов, бравсеров и прочих торрентов.

fat_angel ★★★★★
()
Ответ на: комментарий от fat_angel

У меня на все частоиспользуемые приложения назначен шоткат для активации, поэтому если нужен браузер, то он сразу появляется. Терминалы на отдельном столе.

С разношерстной документацией иногда грустно, думаю о возможности аттачить сочетание клавиш на лету, тогда про Alt+Tab можно вообще забыть.

baverman ★★★
()

Взял сорцы из git, собрал, запустил - черный экран. По Esc выход. По нажатию на символьную клавишу появляется внизу инпут с введенными символами. Больше ничего.

Gentoo x86_64, Ion3

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

черный экран

Кажется, дело в том, что ion3 не поддерживает EWMH. Или поддерживает, но как-то весьма укороченно.

А «wmctrl -l» у вас список окон выводит? Если нет, то я уже ничего не смогу с этим сделать.

SoulThreads
() автор топика
Ответ на: комментарий от Artificial_Thought

С опцией -S запускай.

Не помогает - просто вместо черного экрана вижу все, что и было запущено на теге. Строка поиска отображается корректно.

andreyu ★★★★★
()
Ответ на: комментарий от SoulThreads

Кажется, дело в том, что ion3 не поддерживает EWMH. Или поддерживает, но как-то весьма укороченно.

Вроде не поддерживает, но wm_supports_ewmh() считает, что поддерживается.

А «wmctrl -l» у вас список окон выводит? Если нет, то я уже ничего не смогу с этим сделать.

$ wmctrl -l
bash: wmctrl: command not found
andreyu ★★★★★
()
Ответ на: комментарий от andreyu

bash: wmctrl: command not found

Ну ты прям как маленький.

xprop -root | grep CLIENT_LIST\(

Хотя тоже пакет не обязательно будет стоять.

baverman ★★★
()

Супер, а главное тут полно места где есть разгуляться воображению.

От себя подкину некоторые наброски для выбора направлений развития:

1.Сделать вывод названий окон в несколько строк, настраиваемое или автоматическое выравнивание, перенос по строкам, автоподбор размера шрифтов

2.Сделать опцию активных плавающих границ вокруг названий окон, изменяющих форму, например, в зависимости от перемещения мыши, но позволяющие ей свободно перемещаться внутри активных границ. Не нужно, но интересно и скорее всего понравится одичавшим хомячкам

3.Шаблоны для создания шкурок оформления, например, чтобы сделать их в виде сот, облачков, кирпичей, рамок картин и прочей стилистической ерунды (возможно разной для каждого вида окон)

4.Размеры площади можно привязать к частоте использования данного окна в данной сессии - больше используется, больше площадь, возможно в зависимости от времени сделать настройку, чтобы размеры постепенно стремились к одинаковым масштабам

5.Вывод в 3-х мерном варианте. Не нужно, но как говорилось уже можно в виде опции

6.Группировка окон в зависимости от типа, опции вывода со всех рабочих столов или с одного

7.Аналогично можно сделать с выводом рабочих столов, панелью, менюшками и даже файлами, хотя по поводу файлов может идея и не очень, так как в любом случае придется перечислять только часть содержимого каталога вот избежание потери читабельности

P.S.

От себя желаю хороших творческих успехов и полного самовыражения. Не пробовал пока тестить, но идея, на мой взгляд, великолепная.

glibych ★★
()
Ответ на: комментарий от andreyu
$ wmctrl -l
Cannot get client list properties. 
(_NET_CLIENT_LIST or _WIN_CLIENT_LIST)
andreyu ★★★★★
()
Ответ на: комментарий от fat_angel

но где гарантия того, что ты остановишься на одном только guile?

а зачем нужно что-то большее? Поддержка нескольких языков там есть, библиотеки есть.

lazyklimm ★★★★★
()
Ответ на: комментарий от glibych

Шаблоны для создания шкурок оформления, например, чтобы сделать их в виде сот, облачков, кирпичей, рамок картин и прочей стилистической ерунды (возможно разной для каждого вида окон)

язабан

lazyklimm ★★★★★
()
Ответ на: комментарий от baverman

не только приложения, ещё буфера емакса, и потенциально дофига всего. Вообще, это что-то типа двумерного dmenu со свистелками

lazyklimm ★★★★★
()
Ответ на: комментарий от glibych

Язабан. Там в ветке experimental если что есть опция -rt, которая позволяет во входном потоке задать цвет/иконку/текст каждого блока. Большего не будет, не надейся.

Artificial_Thought ★★★★
()

Отличная штука, оргомный респект автору!

cyberstorm
()

кстати, незнаю, насколько оправдана такая фича, но

для stdin ввода сделать подстановку иконок по шаблонам:

типа

[icons]
.*\.sh$=gnome-mime-text-x-sh
lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

но про «соты» - шестиугольники идея годная.

silw ★★★★★
()
Ответ на: комментарий от Artificial_Thought

позволяет во входном потоке задать цвет/иконку/текст каждого блока

о, отлично

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

Пока я хочу сделать просто полноценный программный интерфейс во входном потоке, чтобы всю неосновную функциональность можно было бы делать во внешнем скрипте, которы бы просто дёргал мозаику.

Artificial_Thought ★★★★
()
Ответ на: комментарий от lazyklimm

ещё буфера емакса

Кстати, у меня обычно открыто по 20-30 буферов, мозаикой это будет выглядеть несколько страшновато, нет?

baverman ★★★
()
Ответ на: комментарий от baverman

Да нормально выглядит, плюс поиск же есть. Попробуй в общем, у тебя же только фича переключения окон не работает.

Artificial_Thought ★★★★
()
Ответ на: комментарий от Zubok

Надо все-таки сделать fallback для WM, которые NetWM не поддерживают.

Есть стандарт, плохой ли, хороший, но есть. Не поддерживают - ССЗБ.

Я, кстати, ratpoison, в том числе и из-за этого отбросил.

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

Есть стандарт, плохой ли, хороший, но есть. Не поддерживают - ССЗБ.

Неподдержка NetWM - это не криминал. Это же расширение и дополнение ICCCM, поэтому главное, чтобы ICCCM поддерживали. Следование NetWM от оконных менеджеров в принципе не требуется. Есть WM, которые не поддерживают его, есть такие поддерживают частично. Ну не обижать же их пользователей. :)

Zubok ★★★★★
()
Ответ на: комментарий от baverman

Не судьба значит, ion3 не следует стандартам.

Ну я так и написал вначале - «вроде EWMH не поддерживает» :)

andreyu ★★★★★
()
Ответ на: комментарий от vyazovoi

В dswm (stumpwm) окно разворачивается на размер фрейма, есть ещё один баг который описать так сразу затруднюсь (скорее всего баг в dswm).

Для соответствия emacs-style не хватает подтверждения выбора по C-m, т.к. я у себя Return вообще не пользуюсь и повесил его на Control_R, в emacs он не нужен.

Замечательная идея в духе emacs buffer-switcher'ов. Т.к. в dswm нет подобной функциональности в wm (я имею ввиду удобной переключалки окон с вводом части имени), то заменю dmenu-скрипт мозайкой. Спасибо.

vyazovoi ★★★
()
Ответ на: комментарий от vyazovoi

Ещё и по буферам Emacs'а... сейчас протестирую в dswm

Можно для этой цели emacsclient использовать. Например, получить список буферов текущего фрейма Emacs:

$ emacsclient -e "(buffer-list nil)"

и переключаться в них при помощи emacsclient. Плюс к этому есть функции raise-frame, lower-frame, iconify-frame.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Или эта переключалка уже буфера Emacs умеет? (я еще не пробовал)

Ну прямо на скриншоте же показано. :) Там как раз emacsclient используется.

Насчёт ICCCM с XQueryTree подумаю.

SoulThreads
() автор топика
Ответ на: комментарий от SoulThreads

Ну прямо на скриншоте же показано. :) Там как раз emacsclient используется.

Хосп, а я даже внимания не обратил на это! :)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Разумеется, собственно в этой аппликухе (точнее в скрипте, использующем его) так и происходит. У меня на это дело dmenu работает, но мозайка мне больше нравится - более наглядное представление, цвет.

vyazovoi ★★★
()
Ответ на: комментарий от vyazovoi

разворачивается на размер фрейма

Если я правильно понял, то надо попробовать либо сделать окно float, либо запустить с -S, либо и то, и другое.

подтверждения выбора по C-m

Запилил, пересоберите из гита.

SoulThreads
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.