XMonad, Qt и LibreOffice - проблемы рендеринга приложений
Многие пользователи сталкиваются с тем, что за пределами kde или гнома у приложений qt пропадают иконки. Но это не единственная проблема.
Вторая проблема - это странное поведение приложений из пакета libreoffice - при каждом щелчке мышью в окне или вводе текста окно полностью перерисовывается. И это заметно даже невооруженным глазом. И очень сильно мешает работать.
Происходит это из-за того, что эти приложения пытаются брать свои настройки из запущенного DE, но для кедов и гнома все хорошо, а вот для менее популярных окружений все плохо.
Самый простой способ решить проблему - указать, из какого окружения нужно брать настройки - выставить переменную окружения XDG_CURRENT_DESKTOP в значение KDE или GNOME (а может быть XFCE - такое значение тоже возможно). Все зависит от того, каким de должен прикидываться ваш wm :)
Сходу мне не попалась спецификация по этой переменной окружения. Поэтому ссылок не вставляют.
Для своей конфигурации xmonad я прописал в .xinitrc
export XDG_CURRENT_DESKTOP=KDE
И все нормально работает. В приложениях qt появились значки, а libreoffice пропали лаги отрисовки.
Linux: связываем приложение с типами файлов
Статья дополнена 2022-03-08
Не секрет, что для новичков в никсах существует лишь один путь для выбора приложения, которым будет открываться какой-либо тип файлов: конфигуратор его рабочей среды (кеды, гном, xfce или иное).
Однако то, что происходит за кадром пользователю остается неизвесным. И как только юный падаван попадает в голые иксы с запущенным xterm или голым, но от этого не менее дружелюбным, оконным менеджером (openbox, fluxbox, xmonad и т.д.) - у него сразу возникает куча проблема.
- почему все мои файловые ассоциации, которые я так долго настраивал исчезли?
- Почему в mc все картинки и видео вдруг начинают открываться в браузере?
- почему они вообще открываются через mc?
- почему firefox при выборе пункта “открывать файл” вместо сохранить открываеть его непонятно где или вообще не открывает?
И новичок это гиблое дело забрасывает и возвращается в удобные кеды, гном или что-то еще.
Но на самом деле не все так страшно.
Современные стандарты freedesktop указывают нам на то, что запуск приложений осуществляется с помощью *.desktop файлов, которые описывают все, что необходимо для работы приложения.
А чтобы связать тип файла с приложением, которое будет запускаться введен стандарт Association between MIME types and applications.
Этот стандарт описывает ряд файлов, которые отвечают за связь меджу типом файла и приложением.
Путь | Предназначение |
---|---|
$HOME/.config/$desktop-mimeapps.list |
Пользовательские ассоциации. Специфичные для рабочего стола $desktop |
$HOME/.config/mimeapps.list |
Пользовательские ассоциации (независимы от рабочего стола) |
/etc/xdg/$desktop-mimeapps.list |
Глобальные ассоциации. Предоставляются администратором. специфичные для рабочего стола $desktop |
/etc/xdg/mimeapps.list |
Глобальные ассоциации, предоставляемые админом и вендорами ПО. |
$HOME/.local/share/applications/$desktop-mimeapps.list |
Глобальные системные ассоциации. Специфичны для рабочего стола $desktop. Запрещен к использованию. Будет удален в новых редакциях стандарта. |
$HOME/.local/share/applications/mimeapps.list |
Глобальные системные ассоциации. Запрещен к использованию. Будет удален в новых редакциях стандарта. |
/usr/local/share/applications/$desktop-mimeapps.list and |
|
/usr/share/applications/$desktop-mimeapps.list |
Набор ассоциаций, которые предоставляются мейнтейнерами дистрибутива. Специфичны для рабочего стола $desktop. |
/usr/local/share/applications/mimeapps.list and |
|
/usr/share/applications/mimeapps.list |
Набор ассоциаций, которые предоставляются мейнтейнерами дистрибутива. |
Таблица описывает файлы в том порядке, в котором они обрабатываются системой. Переменная $desktop представляет из себя имя рабочего стола в нижнем регистре (kde, gnome, xfce, …).
Данные файлы представляют из себя набор записей вида
[Default Applications]
mimetype1=default1.desktop;default2.desktop
mimetype - описание формата. Что-то вроде audio/ogg. Стандарт описания mimetype можно глянуть в соответствующих RFC.
*.desktop есть файл запуска вашего приложения. Обрабатывается список файлов последовательно до первого встреченного существующего приложения. Либо система перейдет к обработке следующего файла.
Помимо основной секции стандарт оговаривает две дополнительных секции.
[Added Associations]
mimetype1=foo1.desktop;foo2.desktop;foo3.desktop
mimetype2=foo4.desktop
[Removed Associations]
mimetype1=foo5.desktop
Секция “added associations” добавляет к выбранным mime-типам указанные приложения в начало списка. Секция “removed association” соотственно удаляет указанные приложения из ассоциации к выбранному mime-типу.
Все. с теорией покончено.
Как было сказано выше - в “дружелюбном окружении уже существует какая-нибудь утилита, которая позволяет пользователю изменить ассоциации.
Но гораздо проще делать это в консоли.
Существует инструмент под названием xdg, который как раз отвечает за работу со списками ассоциаций. И большинство приложений как раз используют его api дабы открывать файлы (mc, nautilus, firefox, …).
Попробуем сделать в консоли
$ xdg-open ~/some_path_to_image.jpg
Вы увидите, что картинка откроется при помощи стандартного вьювера для вашего рабочего стола.
А теперь попробуйте сделать
$ xdg-mime query default image/jpg
Вы увидите что-то вроде
eog.desktop;
xdg-mime - инструмент, который входит в комплект поставки любого дистрибутива. Им можно как просматривать, так и изменять ассоциации файлов.
Для примера узнаем, как система распознает какую-нибудь картинку.
% xdg-mime query filetype wallpaper.jpg
Увидим
image/jpeg
Shared MIME database
Это спецификация, которая позволяет приложениям легче прописывать в систему информацию о том, какими расширениями файлов они могут манипулирвать.
Для целей статьи это неинтересно, но почитать можно тут.
Как работает привязка файлов в ручном режиме
Посмотрим, что происходит под капотом. Сейчас это не самый лучший способ. О более простом варианте речь пойдет чуть дальше.
Допустим, что у нас свежезаведенный профиль.
$ cat ~/.local/share/applications/mimeapps.list
[Default Applications]
У вас этого файла может не быть, либо он может содержать какие-то дефолтные значения.
А теперь мы хотим, чтобы файлы mp4 открывались при помощи vlc.
$ xdg-mime default vlc.desktop video/mp4
$ cat ~/.local/share/applications/mimeapps.list
[Default Applications]
video/mp4=vlc.desktop
Как видим - используется vlc. И если мы попробуем сделать
$ xdg-open path_to_mp4_file.mp4
Файл откроется уже в vlc.
Автоматизированный способ привязки
Сначала нам нужно понять, какие приложения поддерживают нужный mime.
Каждый *.desktop-файл содержит записи mime-типов, которые он поддерживает.
$ cat /usr/share/applications/pcmanfm.desktop | grep -i mime
MimeType=inode/directory;
Теперь нам нужно лишь грепнуть все desktop чтобы найти, что нам надо.
Допустим, что нам хочется переопределить приложение для открытия папок. Найдем, кто их может открывать.
$ rgrep "inode/directory" /usr/share/applications
/usr/share/applications/mimeinfo.cache:inode/directory=org.gnome.baobab.desktop;pcmanfm.desktop;ranger.desktop;
/usr/share/applications/org.gnome.baobab.desktop:MimeType=inode/directory;
/usr/share/applications/mimeapps.list:inode/directory=org.gnome.Nautilus.desktop
/usr/share/applications/pcmanfm.desktop:MimeType=inode/directory;
/usr/share/applications/gnome-mimeapps.list:inode/directory=org.gnome.Nautilus.desktop
/usr/share/applications/ranger.desktop:MimeType=inode/directory;
Тут мы видим, что папками манипулируют ranger, baobab и pcmanfm.
Для привязки приложения и типа нам так же поможет xdg-mime.
xdg-mime default application mimetype(s)
$ xdg-mime default pcmanfm.desktop inode/directory
Тем самым мы связали тип inode/directory
с приложением pcmanfm. Стоит заметить, что указывать путь до *.desktop не надо. Он будет разыскиваться по стандартным путям, которые мы обсудили выше.
Замечания
Искать кто может открыть какой-то файл долго и сложно. Можно воспользоваться утилитой lsdesktopf.
Литература:
PHP+Apache: глюк?
Сегодня столкнулся с совершенно с чудовищным по своей странности багом.
Есть код. Простейший.
$a = array('' => 'value');
$key = '';
$falseKey = false;
$falseKey = (string)$falseKey; // $falseKey === '' будет true
var_dump(isset($a[$key]));
var_dump(isset($a[$falseKey]));
Вы думаете, что в обоих случаях код выведет true?
А вот и нет.
Существуют какие-то глюки в связке модуля пхп и апача, которые приводят к тому, что во втором случае код выдаст false.
Это не вылечилось перезагрузкой апача. Вылечилось лишь его полной остановкой и запуском.
Любопытно, что данный баг воспроизвелся лишь на одном сервере. На других абсолютно идентичных он не воспроизводился.
UPD (13.12.2015):
Таки “автором” этого глюка выступило расширение xdebug. К сожалению детального разбора проблемы я не осуществлял. Просто если вы встретились с неверным пониманием языком типов переменных, то смотрите в сторону xdebug.
Qt: настройка системы рендеринга
Линуксоиды разучились пользоваться консолью? :) Сломал себе систему рендерига до такой степени, что кеды показывали лишь черный экран с курсором.
Поскольку есть лишь консоль, то гугление в линксе на тему расположения конфига, в котором указана система рендеринга показывало лишь результаты, где народ рекомендовал поставить kcm-qt-graphicssystem.
Все это хорошо, но иксов-то нет.
А на деле все оказалось очень просто. Этот пресловутый модуль kcm просто правит содержимое файла
~/.kde/env/qt-graphicssystem.sh
В этом файле лишь одна строчка:
export QT_GRAPHICSSYSTEM=native
Файл есть не что иное, как глобальный экспорт переменной в сеансе kde. Нет никаких специальных файлов конфигурации (привет, dconf2!).
Поэтому если вы угробите свои кеды - просто пропишите другую систему в этот файл: native, raster или opengl.
Eclipse: корявый интерфейс в KDE
Уже несколько вечеров я ломаю голову над вопросом: “почему в eclipse 4.5 (mars) застывает интерфейс при открытии выпадающих списков?”
Проявляется так:
- открываем выпадающий список
- пытаемся выбрать в нем пункт, а пункт не выбирается
Закрыть такой “зависший список можно только прицельным щелчком на стрелочке или нажатием на esc.
Из других интерфейсных проблем: наползание виджетов друг на друга как на скрине в начале статьи.
И последняя проблема - это рандомные креши.
К слову, все это происходит в kde 4.
Я грешил на все: кривые rpm, неправильную сборку самой eclipse и всякое-разное.
Но оказалось все гораздо проще: креши и фризы связаны с темой oxygen-gtk (кто-бы мог подумать). И самый первый репорт датируется аж 2014 годом. И его вроде даже закрыли.
В тему того же бага несколько другой: Bug 470994 - [GTK3] Eclipse Mars on Linux with oxygen-gtk theme looks unfinished.
Он как раз про вторую проблему с перекрывающимися виджетами.
Решается все просто: ставим нормальную тему gtk2 (bluecurve можно).
И выбираем ее в настройках кедов.
Теперь с виджетами все ок, а выпадающие списки работают.