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)
Ответ на: комментарий от SoulThreads

Дело в том, что в stumpwm нет понятия float-окна. Есть только float-воркспейс. А со скриншотом это вы здорово придумали =)
По поводу float - я не разбираюсь в устройстве x-window, но некоторые окна тем не менее остаются float в stumpwm, например тот же dmenu, или всякие там диалоговые окошки и gcolor2 ещё. Там какой-то специальный тип окна, что-то типа toolbox.

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

Я вот не помню точно, но там у меня почему-то выставлялся весьма странный тип окна (dropdown menu), поэтому некоторые WM его правильно не ловили. Сейчас исправил на dialog, попробуйте.

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

Пересобираю под Debian stable и вываливается при сборке. Может, что-то в зависимостях должно быть еще и не указано в debian/control?

libgtk..-dev, libglib...-dev, cmake стоят (со всеми своими зависимостями)

Ошибка (этих undeclared много. но я только кусочек привел):

/home/zubok/src/xwinmosaic/src/main.c:542: error: ‘GDK_KEY_j’ undeclared (first use in this function)
/home/zubok/src/xwinmosaic/src/main.c:545: error: ‘GDK_KEY_k’ undeclared (first use in this function)
/home/zubok/src/xwinmosaic/src/main.c:548: error: ‘GDK_KEY_l’ undeclared (first use in this function)
/home/zubok/src/xwinmosaic/src/main.c:551: error: ‘GDK_KEY_slash’ undeclared (first use in this function)
make[3]: *** [src/CMakeFiles/xwinmosaic.dir/main.c.o] Ошибка 1

Какого заголовочного файла не хватает?

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

2.20. В файле debian/control никаких ограничений на версию не указано - я сразу посмотрел.

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

Да это я понимаю. Догадываюсь, что автор заложился на очень новую версию GTK+2. Значит, не судьба. Опакеченные кем-то другим программы я у себя никогда не ставлю.

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

Значит, не судьба.

Похоже, стабильное GTK так весело меняет апи в пределах одной, в общем-то, версии. У вас точно будет работать, если замените 'GDK_KEY_буква' на просто 'GDK_буква'.
Надо тогда что-то с этим придумать.

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

Похоже, стабильное GTK так весело меняет апи в пределах одной, в общем-то, версии. У вас точно будет работать, если замените 'GDK_KEY_буква' на просто 'GDK_буква'. Надо тогда что-то с этим придумать.

Ага, я уже начал было смотреть. Ясное дело, что раньше это все было, но как-то по-другому обзывалось. А придумать толко условную компиляцию или воспользоваться quilt, чтобы при сборке, выяснив версию GTK+2, переопределить в патче эти константы. Геморрой, конечно. Вот такую подлость сделали разработчики GTK+2. :) Ясное дело, что собранный бинарник будет работать, а вот сборку надо патчить.

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

Мотивируйте. Как связаны наброски идей, которые автор может использовать, а может и нет, с Вашим 'язабан'?

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

Всё оказалось проще: константы на GDK_[a..z] теперь лежат в <gdk/gdkkeysyms-compat.h> и в принципе, даже заинклужены в <gdk/gdkkeysyms.h>. Так что закоммитил более рабочий вариант, должно теперь перестать ругаться.

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

Если кому всё ещё интересно, в experimental бранче доделана опция --format, теперь можно из своих скриптов устанавливать кроме надписи ещё и текст, цифирку на фоне и иконку.

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

В общем, заменил. Вроде, прошел дальше, но опять вывалился с ошибкой:

CMakeFiles/xwinmosaic.dir/mosaic_window_box.c.o: In function `mosaic_window_box_class_init':
/home/zubok/src/xwinmosaic/src/mosaic_window_box.c:84: undefined reference to `g_object_class_install_properties'
CMakeFiles/xwinmosaic.dir/mosaic_search_box.c.o: In function `mosaic_search_box_class_init':
/home/zubok/src/xwinmosaic/src/mosaic_search_box.c:67: undefined reference to `g_object_class_install_properties'
collect2: ld returned 1 exit status
make[3]: *** [src/xwinmosaic] Ошибка 1

Где подвох? Я сам не успею разобраться. Звонок другу.

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

Надо тогда что-то с этим придумать.

#ifndef #define :)

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

btw, в stumpwm тоже завелось

ещё косяки:

- в поле ввода не удаляется первая буква

- Ctrl-H/Ctrl-W хотелось бы (опционально) заюзать в емакс-режиме

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

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

P.S.

Если мне требуется что-либо, в состоянии написать сам. Обременять Вас не собираюсь, не переживайте так сильно.

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

Ну так и забудьте про них, коли не нравится. Мне некогда было детально разбираться. Надо - развивайте, нет - похерьте. В чем вопрос-то?

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

Где подвох?

А какой версии у вас glib2? Оно там появилось, начиная с 2.26. Хотя можно, конечно, ещё и это заменить…

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

А какой версии у вас glib2? Оно там появилось, начиная с 2.26. Хотя можно, конечно, ещё и это заменить…

Ох, сколько боли создают разработчики GTK+. Stable API nonsense.

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

в поле ввода не удаляется первая буква

Если запущен xcompmgr, то от этого избавляет screenshot. Если он не запущен, и со screenshot всё равно первая буква не удаляется, надо разбираться.

Ctrl-H/Ctrl-W

Сейчас запилю.

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

А какой версии у вас glib2? Оно там появилось, начиная с 2.26. Хотя можно, конечно, ещё и это заменить…

2.24. Хм, нет, они, конечно, не убрали что-то (нельзя пока их винить в нестабильности), а просто добавили что-то новое в новую минорную версию. Разумеется, использование этого чего-то нового сразу выливается в проблемы со сборкой.

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

Можно просто вообще отказаться от properties, только тогда придётся ещё конструкторы перепилить и всякое такое. GObject — весёлая штуковина, не раз уже приходилось на неё грязно ругаться. :)

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

Угу, поэтому я обычно если что-то пишу, интересуюсь версиями в стабильных дистрибутивах, чтобы не ограничивать аудиторию. Если c GDK_KEY нет было бы проблем с собранным бинарником, то вот на этот эпизод, программа бы выругалась, наверное (не факт, но запросто). Соответственно, пользователи стабильных дистрибутивов уже выпадают, от чего PR страдает, хех. :)

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

С properties разобрался: оказывается, в старых версиях просто надо было каждое свойство вручную указывать через g_object_class_install_property вместо передачи массива свойств сразу одной функцией. Вроде, починил, ваш ход. :)

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

За идею плюс, все остальное идет в минус. Глупо, наивно, тупо, неинтересно.

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

С properties разобрался: оказывается, в старых версиях просто надо было каждое свойство вручную указывать через g_object_class_install_property вместо передачи массива свойств сразу одной функцией. Вроде, починил, ваш ход. :)

Не наш, простите, а ваш. (с) :)

Все ОК! Собралось!

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

Если он не запущен

не запущен

со screenshot всё равно первая буква не удаляется

удаляется :)

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

c screenshot чад кутежа на twinview :), скриншотится первый экран (или оба^Wвсе?), а отображается на активном

ещё не очень нравится то, что два раза Esc приходится нажимать, чтобы выйти

lazyklimm ★★★★★
()

Если повторно нажать комбинацию для переключения окон, то есть повторно вызвать таким образом xwinmosaic, то в списке окон появляется XWinMosaic. Надо бы защиту от повторного запуска сделать.

Zubok ★★★★★
()

сюда бы ещё хоткеи для вызова нужного окна с возможностью закрепить эти хоткеи, сменил бы xatk на сию чудную мозайку а то лениво по большому списку окон бегать клавишами, проще сразу одну какую-нить нажать и уже перейти в нужное

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

За идею плюс, все остальное идет в минус. Глупо, наивно, тупо, неинтересно.

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

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

скриншотится первый экран

Это да, оно берёт скриншот всей рабочей области. Сейчас попытаюсь починить.

два раза Esc приходится нажимать

Это если поиск активен. Сначала оно выходило независимо от состояния строчки поиска, но потом кто-то пожаловался, что неудобно, сделал так.

А C-w и C-h сделал, кстати, можешь тестировать.

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

либо не показывать себя

Он себя много раз запускает. Если модификатор отжать, то тогда проблемы нет. У меня кнопка Win используется как модификатор для всех оконных операций. Если я зажимаю Win+Tab, то программа запускается. Если не отжимать Win и еще клацнуть Tab, то она сразу же второй раз запускается. И так до бесконечности.

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

Реквестирую для conkeror. Хотя у меня лежит скрипт, который дергает историю из sqlite для dmenu, но лень что-то с ним делать.

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

меняешь строку запуска dmenu на xwinmosaic -S -r и всё

я сам так и сделал, соппсна

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

Немного допилил скрипт для переключения буферов емакса, получилось вот так.

ну кто же такие вещи хардкодит? У меня, например, вот такое в конфиге:

(custom-set-variables
 '(jabber-chat-buffer-format "*-jc-%n-*")
 '(jabber-groupchat-buffer-format "*-jg-%n-*")
 '(jabber-muc-private-buffer-format "*-jmuc-priv-%g-%n-*")
 '(jabber-rare-time-format "%e %b %Y %H:00")
 '(jabber-resource-line-format "   %r - %s [%p]")
 '(jabber-roster-buffer "*-jroster-*"))
lazyklimm ★★★★★
()

кстати, в stdin режиме хотелось бы вводить то, чего нет в списке, и тоже выдавать на stdout (dmenu делает именно так)

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

кстати, в stdin режиме хотелось бы вводить то, чего нет в списке, и тоже выдавать на stdout (dmenu делает именно так)

А это есть. Просто добавь воды^W -p к параметру -r. :)

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

Честно, не знаю как получить список всех буфферов именно жаббера.

по режиму, у джаббера они все выглядят как «jabber-*-mode»

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