LINUX.ORG.RU

Сообщения thm

 

Домашний кокпит A320

Галерея — Рабочие места

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

Оборудование:

  • i7-11700F / GTX1660S / 32 GB RAM
  • 2 iPad’а для приборов
  • Logitech Extreme 3D Pro
  • Logitech Pro Flight Throttle Quadrant (на фото не влез, у меня под правую руку)
  • SB Play 3 + уже не помню какая гарнитура Sennheiser

Софт:

  • Arch Linux
  • X-Plane 11 (самолёт ToLiss A319 + кастомные сценарии + плагины и т.д.)
  • IVAO Pilot Client
  • AntiMicroX (для Push-To-Talk)
  • x11vnc + RealVNC Viewer

P.S. в будущем планирую собирать полный кокпит A320 :)

>>> Просмотр (4032x2268, 2075 Kb)

 , , ,

thm
()

О глобальном меню

Форум — Development

Здравствуйте! Заинтересовал вопрос глобального меню в GNU/Linux. Я разрабатываю окружение рабочего стола (уже не раз здесь упоминал свой проект) и хотелось бы добавить данный функционал. Но я столкнулся с отсутствием нормальной документации по libdbusmenu, в частности, спецификации DBusMenu. +, как я вижу, проект заброшен, да и далеко не все программы экспортируют своё меню, используя этот стандарт.

Вопрос такой. Имеет ли смысл написать с нуля свою библиотеку, реализующую функционал глобального меню (как серверную, так и клиентскую часть) и удастся ли хоть как-нибудь её распространить среди Open Source проектов (допускаю необходимость делать коммиты самому), если она, например, будет написана на чистом C, и также будет опционально иметь биндинги с Qt, GTK, версию на Python и т.д.? Суть в том, чтобы предоставить нормальную документацию по этой библиотеке и сделать её каким-никаким, но стандартом.

Либо же этим всем заниматься не стоит и лучше таки освоить имеющийся стандарт DBusMenu, и как-то оживить libdbusmenu?

Спасибо.

 , ,

thm
()

plainDE 0.7.1

Галерея — Скриншоты

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

  • апплет StatusNotifierItem-трея;
  • поддержка вертикальных панелей;
  • апплет вывода CLI команды;
  • поддержка прозрачной темы;
  • возможность установить кастомный задний фон панели;
  • многое другое.

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

Апплет CLI Output предоставляет возможность создавать своего рода апплеты самостоятельно, которые могут выводить текст вывода CLI-приложения напрямую либо информацию, указанную в конфигурационном файле, в зависимости от текста из stdout или кода выхода.

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

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

Конфигурация на скриншоте не дефолтная и является одной из множества конфигураций, возможных с plainDE.

Буду рад багрепортам и пожеланиям.

Сайт проекта: https://plainDE.github.io/

Arch Linux

plainDE + Openbox + pcmanfm + xcompmgr

Иконки: Mint-Y и Mac OS X Lion

Шрифт: Rosemary

>>> Просмотр (1920x1080, 2265 Kb)

 , , , ,

thm
()

Прозрачность окна в Qt

Форум — Development

Здравствуйте. Хочу для панели сделать возможность использовать прозрачный фон. Делаю так:

...
this->setObjectName("panel");
...
this->setAttribute(Qt::WA_TranslucentBackground);
this->setAttribute(Qt::WA_NoSystemBackground);
this->setAttribute(Qt::WA_TransparentForMouseEvents);
...
this->setPalette(Qt::transparent);
this->setAutoFillBackground(false);
this->setAttribute(Qt::WA_OpaquePaintEvent);
...

в QSS добавил:

QWidget#panel {
    background-color: transparent;
}

В итоге получается окно с черным фоном. Методом исключения выяснил, что виноват в этом вызов this->winId(); Когда закомментировал, окно стало с прозрачным фоном, но мне нужно знать WId окна, а другого способа его получить, я не нашёл. Глянул в qwidget.cpp. Единственное, что показалось странным, включение аттрибута Qt::WA_NativeWindow. Попробовал перед установкой прозрачного фона его отключить - не помогло. Подскажите, пожалуйста, почему после получения WId окна пропадает прозрачность, и что делать?

 , ,

thm
()

Микрофон C1-U

Форум — Linux-hardware

Здравствуйте! Подскажите, пожалуйста, работает ли в Linux’е микрофон C1-U из коробки? Крайне мало информации по этому поводу в интернете. Спасибо.

 

thm
()

Задание границ для окна - _NET_WM_STRUT_PARTIAL

Форум — Development

Здравствуйте! Наткнулся на такую проблему при разработке панели. Если использовать несколько мониторов, при том в разной ориентации (один в горизонтальной, другой в вертикальной), то возникает ситуация, при которой нижняя граница второго монитора ниже, чем первого. Или наоборот, верхняя граница второго монитора выше, чем первого. Раньше я использовал просто _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

P.S. с мониторами имею ввиду такую ситуацию: https://ibb.co/6vLQghB

 , ,

thm
()

Посоветуйте VNC сервер

Форум — Desktop

Здравствуйте! Нужно выводить данные приборов из авиасимулятора на планшет/другой компьютер/… В качестве VNC сервера обычно использую x11vnc, однако у него большая задержка + подлагивает картинка. Ради прикола попробовал через AnyDesk - там лагов и задержек почти нет. Подскажите, пожалуйста, какой-нибудь VNC-сервер, который сможет передавать картинку без такой задержки, как у x11vnc.

 , ,

thm
()

Не работают функции KWindowSystem

Форум — Development

Здравствуйте! В Arch Linux обновился Qt до версии 5.15.10. (в Debian 12 проблема также присутствует). После этого моя панель перестала резервировать место на экране (окна залезают под панель) и панель пропадает при переходе на другой рабочий стол. Для этих целей использую библиотеку KWindowSystem. В частности: KX11Extras::setStrut и KX11Extras::setOnDesktop. Держать пакет qt5-base необновленным не получится. Подскажите, пожалуйста, на что можно заменить/как можно пофиксить. Есть идея заменить эти вызовы функций на обычный XChangeProperty и им поменять параметр _NET_WM_STRUT, но так и не понял, какие аргументы этой функции, за что отвечают.

 , ,

thm
()

Не работает AP

Форум — Admin

Здравствуйте! Сегодня ни с того, ни с сего начались проблемы с роутером. Все девайсы отключились и назад к Wi-Fi уже не подключились. Потом сеть и вовсе из списка пропала. Подумал, что кто-то занимается деаутентификацией девайсов, но потом это предположение было опровергнуто. Если поднести телефон вплотную, сигнал появляется, но интернет работает крайне плохо. Обновил прошивку, сбросил роутер - не помогло. Поменял роутер на запасной. Wi-Fi работал минуту, после чего повторилось всё то же самое. По LAN, естественно, интернет работает.

Интересно во всей этой истории другое. Взял ноутбук. Настроил hostapd и dnsmasq. Поднял точку доступа. Сначала обрадовался, что заработало, но через минуту точка доступа точно также упала (сигнал есть, но подключиться не удаётся), но теперь есть хоть лог:

...
Failed to set beacon parameters
...
wlp2s0: INTERFACE-DISABLED
wlp2s0: INTERFACE-ENABLED
...
handle_probe_req: send failed
handle_probe_req: send failed
handle_probe_req: send failed
handle_probe_req: send failed
handle_probe_req: send failed
handle_probe_req: send failed

Подскажите, пожалуйста, что это за напасть такая и как пофиксить.

 , ,

thm
()

Использование БД в файловом менеджере

Форум — Development

Здравствуйте. Пишу файловый менеджер в рамках проекта окружения рабочего стола и возник вопрос. Я хочу реализовать теги (как в Mac OS X). У меня активно используется JSON, но я так полагаю, что быстро работать это не будет (файлов может быть много помечено тегом во всей файловой системе, и надо при переходе в каждую директорию проверять наличие файла в списке файлов, помеченных тегом). Пришла в голову идея использовать для этого базу данных. Подскажите, пожалуйста, какую именно лучше использовать, какая будет работать быстрее и с какой будет проще работать в Qt? Спасибо.

 , , ,

thm
()

Простая CAD для Linux

Форум — General

Здравствуйте! Подскажите, пожалуйста, несложную в освоении, легкую CAD для Linux. Возможности Blender для меня слишком обширны.

 , ,

thm
()

Создание QPixmap из QByteArray

Форум — Development

Здравствуйте. Получаю по D-Bus иконку приложения (.../StatusNotifierItem/org.kde.StatusNotifierItem/IconPixmap). Записываю в QByteArray. В QByteArray: https://pastebin.com/MPcJHHA9

Здесь, https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNoti... , указано, что в свойстве IconPixmap хранится бинарный ARGB32.

Далее использую QPixmap::loadFromData, но ничего не получается.

// data - QByteArray
QPixmap pixmap;
pixmap.loadFromData(data);
qDebug() << pixmap  // QPixmap(null)
Пытался указывать вторым аргументом разные форматы изображения, но не помогло. QImage::fromData тоже пробовал — результат аналогичный.

Подскажите, пожалуйста, что делаю не так.

 , ,

thm
()

Виртуальные дисплеи на NVIDIA

Форум — Desktop

Здравствуйте. Вопрос по поводу создания виртуальных дисплеев. Я делал так на встроенной графике Intel (https://thm-unix.github.io/blog/tablet-as-second-monitor). Но на десктопе у меня только NVIDIA, без встроенной. Подскажите, пожалуйста, как создать виртуальный дисплей на NVIDIA графике?

GTX1660S / nvidia 525.89.02-2 / Arch Linux

 , ,

thm
()

Arch Linux + plainDE

Галерея — Скриншоты

Год назад я начал разработку окружения рабочего стола на C++/Qt. Пока есть только панель и control center.

Целью разработки было легковесное окружение рабочего стола, которое в тоже время имеет широкие возможности кастомизации. Нужна была середина между легковесностью (как у того же LXDE) и кастомизацией, потому что в наиболее распространенных окружениях рабочего стола эти два понятия не сочетаются. В таких случаях обычно используется i3, но для его конфигурации нужно много времени, поэтому важным фактором также было user-friendly UI.

Среди доступных на текущий момент апплетов:

  • меню приложений;
  • список окон;
  • launcher’ы (иконки приложений на панели);
  • индикатор батареи;
  • переключатель рабочих столов;
  • управление воспроизведением (MPRIS);
  • регулятор громкости;
  • индикатор раскладки клавиатуры (флаг или ISO-код);
  • дата/время;
  • меню пользователя (выключение, перезагрузка, сон, настройки);
  • индикатор локального IPv4 адреса;
  • разделитель |;
  • заполнитель (QSpacerItem).

Панелей пока максимально может быть 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 МБ ОЗУ.

Мейнтейнер проекта: @ivabus

На скриншоте: Arch Linux, plainDE, pcmanfm, picom.

Иконки: Mint-Y-Legacy.

https://plainde.org/

>>> Просмотр (1280x768, 632 Kb)

 , , ,

thm
()

WA_X11NetWmWindowTypeDock в QML

Форум — Development

Здравствуйте. У меня есть панель на Qt, но я решил перейти с Qt Widgets на QML. С Qt Widgets я писал

this->setAttribute(Qt::WA_X11NetWmWindowTypeDock
. Теперь, т.к. естественно класс не унаследован от QWidget, я этого сделать не могу. Подскажите, пожалуйста, как установить этот аттрибут для QML окна. Флаги в QML файле работают, но это не флаг, а attributes: не предусмотрены.

 , , ,

thm
()

Баги xcompmgr

Форум — Desktop

Здравствуйте. При использовании xcompmgr с OpenBox возникла следующая проблема. Неожиданно закончилось место на диске, посмотрел по baobab, а ~/.local/share/sddm/xorg-session.log весит 228 ГБ. Весь в ошибках рода: error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 2402 error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 4064 error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 12902 error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 17120 error 3: BadWindow (invalid Window parameter) request 15 minor 0 serial 18444 и т.д.

Опытно-экспериментальным путем выяснил, что ошибка проявляется при закрытии окон при запущенном xcompmgr. xcompmgr я теперь юзать не буду, но чем пользоваться вместо него на OpenBox. Полноценные оконные менеджеры вроде KWin мне не нужны. Спасибо.

 , ,

thm
()

Интерфейс D-Bus появляется дважды

Форум — Development

Здравствуйте. Столкнулся с такой проблемой. У меня есть класс DBusIntegration:

dbusintegration.h

#ifndef DBUSINTEGRATION_H
#define DBUSINTEGRATION_H

#include <QDBusAbstractAdaptor>


class DBusIntegration : public QDBusAbstractAdaptor {
    Q_CLASSINFO("D-Bus Interface", "org.plainDE.actions")

public:
    void init();
    DBusIntegration(QString service,
                    QString path,
                    QString interfaceName,
                    QObject* parent);
};

#endif // DBUSINTEGRATION_H

dbusintegration.cpp

#include "dbusintegration.h"

#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <QDebug>


DBusIntegration::DBusIntegration(QString service,
                                 QString path,
                                 QString interfaceName,
                                 QObject* parent) : QDBusAbstractAdaptor(parent) {
    QDBusConnection bus = QDBusConnection::sessionBus();


     bus.registerService(service);

     bus.registerObject(path,
                        interfaceName,
                        parent,
                        QDBusConnection::ExportAllSlots);
}

Из другого файла:

DBusIntegration db("org.plainDE.plainPanel", "/Actions", "org.plainDE.actions", this);

Открываю qdbusviewer. Сервис действительно появился, по правильному пути, но вот с интерфейсами беда. Их почему-то два. И даже при том, что из другого Qt приложения методы работают, все равно это неправильно (я собрался также реализовывать org.kde.StatusNotifierWatcher, и другие приложения не понимают 2 интерфейса с одним именем).

Если я убираю прямое указание имени интерфейса:

DBusIntegration db("org.plainDE.plainPanel", "/Actions", this);

, то ситуация лучше. Появляются два интерфейса local.plainPanel.panel и org.qtproject.Qt.QWidget. Но если при взаимодействии двух моих приложений, меня это устраивает, то org.kde.StatusNotifierWatcher, естественно должно быть правильное имя интерфейса (все тот же org.kde.StatusNotifierWatcher).

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

 , ,

thm
()

D-Bus в Qt

Форум — Development

Здравствуйте. Мне потребовалось использование 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)?

org.plainDE.plainPanel.xml

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
	<interface name="org.plainDE.plainPanel">
		<method name="UpdateConfig"></method>
	</interface>
</node>

Читал также пример Ping-Pong на QtDBus. Насколько я понимаю, в серверной части нужно создать QDBusConnection::sessionBus(), зарегистрировать сервис, затем зарегистрировать объект и ожидать вызовов функций, но вопрос с интерфейсами и реализацией.

 , , ,

thm
()

Перестают запускаться программы и висит система после сна

Форум — General

Здравствуйте. Столкнулся с такой проблемой. На ноутбуке, когда включаю режим сна, где-то к утру, перестают запускаться программы (как 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)

 , ,

thm
()

Получение имени окна по ID

Форум — Development

Здравствуйте. Получаю список окон при помощи свойства корневого окна _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 не получаю ничего. Подскажите, пожалуйста, в чем дело.

 , ,

thm
()

RSS подписка на новые темы