LINUX.ORG.RU

Сообщения thm

 

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

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

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

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

Спасибо.

 , ,

thm
()

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

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

...
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’е микрофон C1-U из коробки? Крайне мало информации по этому поводу в интернете. Спасибо.

 

thm
()

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

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

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

 , ,

thm
()

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

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

 , ,

thm
()

Не работает AP

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

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

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

 , , ,

thm
()

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

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

 , ,

thm
()

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

Здравствуйте. Получаю по 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

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

GTX1660S / nvidia 525.89.02-2 / Arch Linux

 , ,

thm
()

WA_X11NetWmWindowTypeDock в QML

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

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

 , , ,

thm
()

Баги xcompmgr

Здравствуйте. При использовании 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 появляется дважды

Здравствуйте. Столкнулся с такой проблемой. У меня есть класс 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

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

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

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

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

[РЕШЕНО] Откуда segfault?

Здравствуйте. Имеется QListWidget* menuAppsList и QString mask. Пишу функцию для поиска по меню приложений:

void AppMenu::searchApps(QListWidget* menuAppsList, QString mask) {
    QList<QListWidgetItem*> searchResults = menuAppsList->findItems(mask, Qt::MatchContains);
    menuAppsList->clear();
    foreach (QListWidgetItem* item, searchResults) {
        menuAppsList->addItem(item);
    }
}

При обращении к элементу item (будь то item->text() или добавление в QListWidget - получаю Segmentation Fault). Пробовал по-разному (составлять список searchResults вручную циклом, тоже самое; пробовал динамически выделять память под список searchResults - тоже самое). Проходился дебагом, доходит до ассемблера. Проблема кроется именно где-то в функции, т.к., перенеся функцию в новый проект без сигналов и слотов, получаю тот же segfault. Подскажите, пожалуйста, в чем может быть проблема. Спасибо.

 , ,

thm
()

Обработка XEvent как сигнала

Здравствуйте. Для отображения списка открытых окон в текущий момент из документации я выбрал способ через обработку события XEvent. В итоге получилось как-то так:

...
Display* display;
...
void updateWindowList(QHBoxLayout* windowList) {
    XEvent event;
    XNextEvent(display, &event);
    if (event.type == CreateNotify) {
        // обновление списка окон в windowList
    }
}
...
int result;
display = XkbOpenDisplay(getenv("DISPLAY"), NULL, NULL, NULL, NULL, &result);
Таймером обрабатывать событие не получилось (таймер, также как и цикл, который для теста делал, просто перестает выполняться) (да и не эффективно это). Подскажите, пожалуйста, каким образом можно сделать событие XEvent слотом, который можно обработать сигналом. Спасибо.

 , , ,

thm
()

Получение текущей раскладки клавиатуры C++/Qt [РЕШЕНО]

Здравствуйте. Имеем C++, Qt, Xorg, setxkbmap. Подскажите, пожалуйста, как получить текущую раскладку клавиатуры вида us или ru. Пробовал разные варианты:

  • Стандартными функциями Qt (возвращает us вне зависимости от реальной раскладки)

  • https://github.com/nonpop/xkblayout-state (дает результат, но запрашивать данные с него, пусть даже раз в 0.5 сек, сильно потребляет ресурсы)

  • setxkbmap -print | awk -F"+" ‘/xkb_symbols/ {print $2}’ (также дает результат, но костыльно и также потребляет ресурсы)

Собственно, вопрос, как средствами Qt или чем-то другим (но желательно не очень костыльно) получить текущую раскладку в системе? Спасибо

 , , ,

thm
()

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