Здравствуйте! Заинтересовал вопрос глобального меню в GNU/Linux. Я разрабатываю окружение рабочего стола (уже не раз здесь упоминал свой проект) и хотелось бы добавить данный функционал. Но я столкнулся с отсутствием нормальной документации по libdbusmenu, в частности, спецификации DBusMenu. +, как я вижу, проект заброшен, да и далеко не все программы экспортируют своё меню, используя этот стандарт.
Вопрос такой. Имеет ли смысл написать с нуля свою библиотеку, реализующую функционал глобального меню (как серверную, так и клиентскую часть) и удастся ли хоть как-нибудь её распространить среди Open Source проектов (допускаю необходимость делать коммиты самому), если она, например, будет написана на чистом C, и также будет опционально иметь биндинги с Qt, GTK, версию на Python и т.д.? Суть в том, чтобы предоставить нормальную документацию по этой библиотеке и сделать её каким-никаким, но стандартом.
Либо же этим всем заниматься не стоит и лучше таки освоить имеющийся стандарт DBusMenu, и как-то оживить libdbusmenu?
На скриншоте выше моя конфигурация собственного окружения рабочего стола plainDE, которое я начал разрабатывать 2 года назад. С последнего поста о plainDE прошло чуть больше года. За это время было выпущено 9 релизов, включая последний –– 0.7.1, в которых повышена стабильность и добавлено множество новых возможностей, например:
апплет StatusNotifierItem-трея;
поддержка вертикальных панелей;
апплет вывода CLI команды;
поддержка прозрачной темы;
возможность установить кастомный задний фон панели;
многое другое.
Релиз 0.7.1, среди прочего, добавляет возможность авто-скрытия панели и позволяет автоматически установить панель по центру экрана, тем самым предоставляя инструменты, необходимые для создания Dock-панели (пример таковой на скриншоте).
Апплет CLI Output предоставляет возможность создавать своего рода апплеты самостоятельно, которые могут выводить текст вывода CLI-приложения напрямую либо информацию, указанную в конфигурационном файле, в зависимости от текста из stdout или кода выхода.
В крайних релизах проведена работа по оптимизации и рефакторингу кода, что улучшает его читаемость и позволяет другому разработчику создать свой полнофункциональный апплет. На текущий момент разрабатывается часть документации, которая позволит сделать этот процесс еще проще.
Сейчас разрабатываются новые компоненты: файловый менеджер и демон уведомлений. Планируется, что они будут доступны во второй половине года.
Конфигурация на скриншоте не дефолтная и является одной из множества конфигураций, возможных с plainDE.
В итоге получается окно с черным фоном. Методом исключения выяснил, что виноват в этом вызов this->winId(); Когда закомментировал, окно стало с прозрачным фоном, но мне нужно знать WId окна, а другого способа его получить, я не нашёл. Глянул в qwidget.cpp. Единственное, что показалось странным, включение аттрибута Qt::WA_NativeWindow. Попробовал перед установкой прозрачного фона его отключить - не помогло. Подскажите, пожалуйста, почему после получения WId окна пропадает прозрачность, и что делать?
Здравствуйте! Наткнулся на такую проблему при разработке панели. Если использовать несколько мониторов, при том в разной ориентации (один в горизонтальной, другой в вертикальной), то возникает ситуация, при которой нижняя граница второго монитора ниже, чем первого. Или наоборот, верхняя граница второго монитора выше, чем первого. Раньше я использовал просто _NET_WM_STRUT, но стало ясно, что этот вариант не подходит даже для того случая, когда все мониторы в одной ориентации (на втором мониторе тоже задаётся граница, когда она там не нужна). Нашёл _NET_WM_STRUT_PARTIAL. Подумал, что это как раз то, что нужно. Он позволяет указать ограничения для границ. Т.е. я могу задать все границы (left, right, top, bottom) и могу потом указать для каких зон они действуют (left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x). Однако путём несложных тестов и осознания того, что здесь написано, стало ясно, что это подходит только, когда, в моём случае, высота второго монитора <= высоте первого. Т.е. помимо top_start_x, top_end_x, bottom_start_x, bottom_end_x, мне еще нужны top_start_y, top_end_y, bottom_start_y, bottom_end_y. Подскажите, пожалуйста, как их задать (и возможно ли это в принципе). Спецификация freedesktop не предлагает таких параметров у _NET_WM_STRUT_PARTIAL
Здравствуйте! Нужно выводить данные приборов из авиасимулятора на планшет/другой компьютер/… В качестве VNC сервера обычно использую x11vnc, однако у него большая задержка + подлагивает картинка. Ради прикола попробовал через AnyDesk - там лагов и задержек почти нет. Подскажите, пожалуйста, какой-нибудь VNC-сервер, который сможет передавать картинку без такой задержки, как у x11vnc.
Здравствуйте! В Arch Linux обновился Qt до версии 5.15.10. (в Debian 12 проблема также присутствует). После этого моя панель перестала резервировать место на экране (окна залезают под панель) и панель пропадает при переходе на другой рабочий стол. Для этих целей использую библиотеку KWindowSystem. В частности:
KX11Extras::setStrut и KX11Extras::setOnDesktop.
Держать пакет qt5-base необновленным не получится. Подскажите, пожалуйста, на что можно заменить/как можно пофиксить.
Есть идея заменить эти вызовы функций на обычный XChangeProperty и им поменять параметр _NET_WM_STRUT, но так и не понял, какие аргументы этой функции, за что отвечают.
Здравствуйте! Сегодня ни с того, ни с сего начались проблемы с роутером. Все девайсы отключились и назад к Wi-Fi уже не подключились. Потом сеть и вовсе из списка пропала. Подумал, что кто-то занимается деаутентификацией девайсов, но потом это предположение было опровергнуто. Если поднести телефон вплотную, сигнал появляется, но интернет работает крайне плохо. Обновил прошивку, сбросил роутер - не помогло. Поменял роутер на запасной. Wi-Fi работал минуту, после чего повторилось всё то же самое. По LAN, естественно, интернет работает.
Интересно во всей этой истории другое. Взял ноутбук. Настроил hostapd и dnsmasq. Поднял точку доступа. Сначала обрадовался, что заработало, но через минуту точка доступа точно также упала (сигнал есть, но подключиться не удаётся), но теперь есть хоть лог:
Здравствуйте. Пишу файловый менеджер в рамках проекта окружения рабочего стола и возник вопрос. Я хочу реализовать теги (как в Mac OS X). У меня активно используется JSON, но я так полагаю, что быстро работать это не будет (файлов может быть много помечено тегом во всей файловой системе, и надо при переходе в каждую директорию проверять наличие файла в списке файлов, помеченных тегом). Пришла в голову идея использовать для этого базу данных. Подскажите, пожалуйста, какую именно лучше использовать, какая будет работать быстрее и с какой будет проще работать в Qt? Спасибо.
Здравствуйте. Получаю по D-Bus иконку приложения (.../StatusNotifierItem/org.kde.StatusNotifierItem/IconPixmap). Записываю в QByteArray.
В QByteArray: https://pastebin.com/MPcJHHA9
Здравствуйте. Вопрос по поводу создания виртуальных дисплеев. Я делал так на встроенной графике Intel (https://thm-unix.github.io/blog/tablet-as-second-monitor). Но на десктопе у меня только NVIDIA, без встроенной. Подскажите, пожалуйста, как создать виртуальный дисплей на NVIDIA графике?
Год назад я начал разработку окружения рабочего стола на C++/Qt. Пока есть только панель и control center.
Целью разработки было легковесное окружение рабочего стола, которое в тоже время имеет широкие возможности кастомизации. Нужна была середина между легковесностью (как у того же LXDE) и кастомизацией, потому что в наиболее распространенных окружениях рабочего стола эти два понятия не сочетаются. В таких случаях обычно используется i3, но для его конфигурации нужно много времени, поэтому важным фактором также было user-friendly UI.
Среди доступных на текущий момент апплетов:
меню приложений;
список окон;
launcher’ы (иконки приложений на панели);
индикатор батареи;
переключатель рабочих столов;
управление воспроизведением (MPRIS);
регулятор громкости;
индикатор раскладки клавиатуры (флаг или ISO-код);
Панелей пока максимально может быть 2 (1 сверху и 1 снизу). Их можно делать нерастянутыми на всю ширину экрана и сдвигать. Из возможностей кастомизации внешнего вида: смена иконок, шрифта, акцента (любой из RGB), темы (их можно писать самому, лежат по пути /usr/share/plainDE/styles) и т.д. Список того, что можно изменить будет непрерывно пополняться. Для упрощения создания тем оформления можно будет их создавать из GUI.
Разработка активно ведется, поэтому есть много планов на будущее: вертикальные панели, написание своего оконного менеджера, поддержка Wayland, файловый менеджер, переход на QML, взаимодействие с сообществом (локализация, апплеты, artwork, …).
Потребление ресурсов в основном зависит от оконного менеджера. Сама панель потребляет не более 20-30 МБ ОЗУ. Дефолтный конфиг (Openbox + plainPanel) без композитного менеджера и pcmanfm –desktop потребляет в среднем 150-160 МБ ОЗУ на виртуальной машине. На нетбуке с 1 ГБ ОЗУ на дистрибутиве Arch Linux 32 результат ~120 МБ ОЗУ.
Здравствуйте. У меня есть панель на Qt, но я решил перейти с Qt Widgets на QML. С Qt Widgets я писал
this->setAttribute(Qt::WA_X11NetWmWindowTypeDock
. Теперь, т.к. естественно класс не унаследован от QWidget, я этого сделать не могу. Подскажите, пожалуйста, как установить этот аттрибут для QML окна. Флаги в QML файле работают, но это не флаг, а attributes: не предусмотрены.
Здравствуйте. При использовании xcompmgr с OpenBox возникла следующая проблема. Неожиданно закончилось место на диске, посмотрел по baobab, а ~/.local/share/sddm/xorg-session.log весит 228 ГБ. Весь в ошибках рода:
error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 2402error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 4064error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 12902error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 17120error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 18444
и т.д.
Опытно-экспериментальным путем выяснил, что ошибка проявляется при закрытии окон при запущенном xcompmgr. xcompmgr я теперь юзать не буду, но чем пользоваться вместо него на OpenBox. Полноценные оконные менеджеры вроде KWin мне не нужны. Спасибо.
Открываю qdbusviewer. Сервис действительно появился, по правильному пути, но вот с интерфейсами беда. Их почему-то два. И даже при том, что из другого Qt приложения методы работают, все равно это неправильно (я собрался также реализовывать org.kde.StatusNotifierWatcher, и другие приложения не понимают 2 интерфейса с одним именем).
, то ситуация лучше. Появляются два интерфейса local.plainPanel.panel и org.qtproject.Qt.QWidget. Но если при взаимодействии двух моих приложений, меня это устраивает, то org.kde.StatusNotifierWatcher, естественно должно быть правильное имя интерфейса (все тот же org.kde.StatusNotifierWatcher).
Подскажите, пожалуйста, что я делаю не так, почему появляются два интерфейса с одинаковым именем? Спасибо.
Здравствуйте. Мне потребовалось использование D-Bus в проекте для того, чтобы перезапустить панель из control center'а, использовать StatusNotifierItem и пр. Когда пытался реализовать SNI, обнаружил, что LxQt, например, создает сервис org.kde.StatusNotifierWatcher, используя интерфейс, который прописан в org.kde.statusnotifierwatcher.xml. Там он преобразован с помощью qdbusxml2cpp. Сейчас пытаюсь реализовать не SNI, а просто возможность передать сигнал панели, что ее нужно перезапустить (точнее, снова прочитать конфиги после сохранения настроек в control center). Прочитал множество доков по QtDBus. Пытался создавать сервис в session bus (QDBusConnection.registerService). Посмотрел по qdbusviewer, он там появился. Но я не понимаю, как указать, что нужно использовать конкретный xml в качестве интерфейса и где писать реализацию методов (как использовать QDBusInterface)?
Читал также пример Ping-Pong на QtDBus.
Насколько я понимаю, в серверной части нужно создать QDBusConnection::sessionBus(), зарегистрировать сервис, затем зарегистрировать объект и ожидать вызовов функций, но вопрос с интерфейсами и реализацией.
Здравствуйте. Столкнулся с такой проблемой. На ноутбуке, когда включаю режим сна, где-то к утру, перестают запускаться программы (как GUI, так и CLI) из под юзера. Хотел dmesg посмотреть, даже sudo не работал. Зашел под рута в 4 консоли, почитал dmesg. В конце много сообщений вида task … blocked for more than 122 seconds. Было написано wpa_supplicant, Qt bearer, DNS resolver и т.д. Убил X, захожу в юзера, все, как и предполагаемо, висит. Иду в ребут, висит на убивании процессов, которые еще не остановились (waiting for process …). Помогает только Alt+SysRq+REISUB, либо hard reset (т.к. даже, если оставить это минут на 10, время, в течение которого процессы, должны быть убиты просто увеличивается с 1.5 минуты до 2, с 2 до 4 и т.д.) Подскажите, пожалуйста, что с этим сделать и в чем проблема (я так полагаю, systemd надо менять на OpenRC)
Здравствуйте. Получаю список окон при помощи свойства корневого окна _NET_CLIENT_LIST:
Window *winlist(Display* display, unsigned long* len) {
Atom prop = XInternAtom(display,"_NET_CLIENT_LIST",False), type;
int form;
unsigned long remain;
unsigned char* list;
XGetWindowProperty(display,XDefaultRootWindow(display),prop,0,1024, False, 33,
&type,&form,len,&remain,&list);
return (Window*)list;
}
void getWinList(Display* display, QList<unsigned long>* winIDs) {
unsigned long len;
Window* list = winlist(display, &len);
for (unsigned int i = 0; i < len; ++i) {
winIDs->append(*(list + i));
}
}
ID есть и если перевести полученные числа из десятичной СС в шестнадцатеричную СС, то адреса совпадают с теми, что показывает wmctrl -l и xprop -root _NET_CLIENT_LIST. Пытаюсь получить имена:
QString getNameByID(Display* display, unsigned long* id) {
Atom prop = XInternAtom(display, "_NET_WM_NAME", False), type;
int form;
unsigned long remain;
unsigned char* list;
unsigned long len = 0;
XGetWindowProperty(display, (Window)id, prop, 0, 1024, False, 4,
&type, &form, &len, &remain, &list);
for (unsigned int i = 0; i < len; ++i) {
qDebug() << *(list + i);
}
return "";
}
В ответ на qDebug не получаю ничего. Подскажите, пожалуйста, в чем дело.