X11 - отслеживание изменения размеров и положения окна
Как наиболее эффективно отслеживать геометрию окна? Окно не принадлежит моему приложению.
Есть ли что-то лучше чем XSelectInput(d, w, StructureNotifyMask) и отслеживать ConfigureNotify?
Как наиболее эффективно отслеживать геометрию окна? Окно не принадлежит моему приложению.
Есть ли что-то лучше чем XSelectInput(d, w, StructureNotifyMask) и отслеживать ConfigureNotify?
В qt4 такого бага не было. В qt5 к тексту любой кнопки, меню и тд добавляется &, что делает одну из букв подчеркнутой. Как эту хрень отключить? И зачем так делать по умолчанию то?
Как добавить поддержку __int128 в QHash не модифицируя «qhashfunctions.h»?
Если добавляю у себя в исходники qHash(__int128) выдает ошибку
call of overloaded ‘qHash(const __int128&)’ is ambiguous Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
если добавить в qhashfunctions.h, то работает
Начал изучать qbs - пытаюсь перевести на него qmake проект с кучей субпроектов. В qmake в субпроектах используется такие конструкции:
include ($$PROJECT_ROOT/common_options.pro)
В qbs возникла проблема - создав модуль я обнаружил, что версия qt внутри модуля выводится как undefined. Куда копать?
в qt4 работает:
// init:
m_isXDamageAvailable = XDamageQueryExtension(QX11Info::display(), &m_damageEvent, &m_damageError);
// add window:
XDamageCreate(QX11Info::display(), w.id, XDamageReportNonEmpty);
// x11EventFilter(XEvent* event):
if(event->type == m_damageEvent + XDamageNotify)
{
XDamageNotifyEvent* e = reinterpret_cast<XDamageNotifyEvent*>(event);
XDamageSubtract(QX11Info::display(), e->damage, None, None);
emit windowContentChanged(e->drawable);
}
в qt5 x11EventFilter удалили и нужно юзать xcb:
// init:
xcb_prefetch_extension_data(m_xcb_connection, &xcb_damage_id);
const auto* reply = xcb_get_extension_data(m_xcb_connection, &xcb_damage_id);
if(reply->present)
{
m_damageEventBase = reply->first_event;
xcb_damage_query_version_unchecked(m_xcb_connection, XCB_DAMAGE_MAJOR_VERSION, XCB_DAMAGE_MINOR_VERSION);
}
// add window:
const auto damageId = xcb_generate_id(m_xcb_connection);
m_damageWatches[w.id] = damageId;
xcb_damage_create(m_xcb_connection, damageId, w.id, XCB_DAMAGE_REPORT_LEVEL_NON_EMPTY);
xcb_flush(m_xcb_connection);
// nativeEventFilter(const QByteArray& eventType, void* message, long* result):
xcb_generic_event_t* ev = static_cast<xcb_generic_event_t *>(message);
const auto responseType = XCB_EVENT_RESPONSE_TYPE(ev);
if (responseType == app->m_damageEventBase + XCB_DAMAGE_NOTIFY)
{
// здесь можно размещать любой код, нужно не выполнять
}
В nativeEventFilter приходит куча событий, но XCB_DAMAGE_NOTIFY - никогда.
Так как c xcb впервые столкнулся сегодня, то очевидно, что я где-то допустил элементарную ошибку. Помогите, добрые люди.
Проблема появилась после обновления с ubuntu 14.10 до 16.04 и сборки программы с qt5 вместо qt4. Не представляю как это дебажить. Зависает не на первом вызове, а через некоторое время. В чем может быть причина?
1 write syscall-template.S
2 _IO_new_file_write fileops.c
3 new_do_write fileops.c
4 _IO_new_file_xsputn fileops.c
5 buffered_vfprintf vfprintf.c
6 _IO_vfprintf_internal vfprintf.c
7 ___fprintf_chk fprintf_chk.c
8 ??
9 ??
10 QMessageLogger::debug(const char *, ...) const
Умер один из дисков в lvm. Сможет ли система после выключения загрузиться, если корень находится в vg, которая не пересекается с умершим диском?
В лог внезапно начало сыпаться такое:
Read(16): 88 00 00 00 00 00 1f af a5 90 00 00 00 08 00 00
sd 6:0:0:0: [sdc]
Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
dd if=/dev/sdc of=/dev/null
dd: error reading ‘/dev/sdc’: Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.00103421 s, 0.0 kB/s
smartctl -a -T permissive /dev/sdc
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-96-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Vendor: /6:0:0:0
Product:
User Capacity: 600,332,565,813,390,450 bytes [600 PB]
Logical block size: 774843950 bytes
>> Terminate command early due to bad response to IEC mode page
=== START OF READ SMART DATA SECTION ===
Error Counter logging not supported
Device does not support Self Test logging
Похоже проблемы не с бэдами, а с электроникой?
Есть 2 qt4 программы. Одна(A) встраивает(XEmbed) свой виджет в окно другой(B).
Необходимо:
Перемещать встроенный виджет можно из программы B, но так как она не получает событий мыши для встроенного виджета, то мы не знаем когда это делать.
Варианты:
Столкнулся с проблемой - пытаюсь убрать у встраиваемого виджета ButtonPressMask, чтобы иметь возможность получать события нажатия клавиш мыши из приложения B, однако
XWindowAttributes wattr;
XSetWindowAttributes sattr;
XGetWindowAttributes(display, w, &wattr);
sattr.event_mask = wattr.all_event_masks & ~ButtonPressMask;
XChangeWindowAttributes(display, w, CWEventMask, &sattr);
XChangeWindowAttributes возвращает BadRequest. Что здесь не так?
Пробрасываю карту:
echo 0000:01:00.0 > /sys/bus/pci/drivers/radeon/unbind
echo 0000:01:00.0 > /sys/bus/pci/drivers/vfio-pci/bind
стартую qemu:
qemu-system-x86_64 -hda image.qcow -enable-kvm -m 2048 -cpu host -device vfio-pci,host=01:00.0,x-vga=on -vga none
останавливаю qemu:
system_powerdown
пытаюсь вернуть:
echo 0000:01:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind
echo 0000:01:00.0 > /sys/bus/pci/drivers/radeon/bind
запускаю на возвращенной карте иксы:
startx -- -config xorg.conf.secondary
иксы запускаются, монитор переключается на правильный видеовыход, но там постоянно отображается последнее состояние перед выключением qemu, также перестает работать датчик температуры
radeon-pci-0100
Adapter: PCI adapter
temp1: -1.0°C (crit = +0.0°C, hyst = +0.0°C)
что нужно сделать, чтобы можно было после остановки ВМ снова полноценно использовать проброшенную видеокарту на хосте?
Дано: запущено от 0 до n X servers
Требуется: получить название активного дисплея или выяснить, что активна консоль
Пока разобрался лишь как получить активный tty: /sys/class/tty/tty0/active.
После загрузки системы начинает расти shared и cached memory со скоростью ~1-2 MB/sec. останавливается на таких значениях:
total used free shared buffers cached
Mem: 7981 4542 3439 4046 38 4262
-/+ buffers/cache: 242 7739
Swap: 0 0 0
Активности диска нет. Активности процессора нет. Свопа нет. Память 8GB
Убивал почти все процессы (некоторые типа dbus systemd upstart почему то перезапускаются после kill -9 - похоже на баг) - ни на что не влияет.
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 104857
max total shared memory (kbytes) = 209712
min seg size (bytes) = 1
в /dev/shm 2 файла по 65 метров - pulse-shm-*
Если на пути к заветным ~4GB не хватает помяти - начинаются жесточайшие тормоза и прибивается полезный процесс для бесполезного выделения памяти.
Началось такое поведение после обновления ubuntu c 14.04 до 14.10.
Вопросы:
1. Как правильно установить лимиты shared memory?
2. Почему растет cached memory? (в iotop все тихо)
Нужно для одной из клавиатур изменить keycode клавиш цифрового ряда на F13-F24.
Пробую делать как написано тут: https://wiki.archlinux.org/index.php/Map_scancodes_to_keycodes
Example for custom hwdb
The example hwdb file will match all USB and AT keyboards:
/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_10=suspend
KEYBOARD_KEY_a0=search
Updating the Hardware Database Index
After changing the configuration files, the hardware database index, hwdb.bin, needs to be rebuilt.
Update hwdb.bin manually by running
# udevadm hwdb --update
сейчас пытаюсь переназначить 1 -> f12 для всех клавиатур
скан код клавиши «1»: 2
/etc/udev/hwdb.d/70-keyboad.hwdb:
keyboard:usb:v*p*
KEYBOARD_KEY_02=f12
udevadm hwdb --update; udevadm trigger
udevadm hwdb --test=keyboard:usb:v*p*
KEYBOARD_KEY_02=f12
не работает. пробовал кучу других скан кодов никакой реакции, также пробовал setkeycodes - никакого эффекта.
как эту гадость можно дебажить? может логи какие-то есть?
Есть такая конфигурация:
client:
eth0 - lan
server:
eth0 - inet
eth1 - lan
tun0 - vpn over eth0
нужно маршрутизировать запросы клиента к различным портам на различные интерфейсы, например 80 - через tun0, остальное - eth0
Вначале пробую маршрутизацию всего трафика через vpn:
ip route add $vpn_external_ip via $inet_gate
ip route del default gw $inet_gate
ip route add default gw $tun0_ip
работает.
Теперь пытаюсь использовать две таблицы маршрутизации:
echo 2 myinet >> /etc/iproute2/rt_tables
ip route add default gw $inet_gate table myinet
ip rule add from all fwmark 1 table myinet
iptables -A PREROUTING -t mangle -i eth1 -p tcp --dport 80 -j MARK --set-mark 1
теперь все, кроме 80 порта работает.
man tune2fs:
resize_inode
Reserve space so the block group descriptor table may grow in the future.
Tune2fs only supports clearing this filesystem feature.
То есть, как я понял, если отключить resize_inode - resize2fs не будет добавлять новые inode. Но при этом я не смогу вернуть resize_inode обрато.
Есть ли способ расширить раздел без увеличения количества inodes, но при этом иметь возможность при будущем увеличении раздела увеличить количество inodes?
Каким образом в Thunderbird отключить аккаунт? Нужно, чтобы он не отображался в главном окне и не ломися проверять сообщения, но при этом я мог быстро его включить.
Делал горячее подключение sata hdd. После чего отключил его:
umount
hdparm -Y
кабель данных
кабель питания
после чего в системе осталось устройство
/dev/sdc,/dev/sdc1,/dev/sdc2
в лог сыпятся такие ошибки:
exception Emask 0x73 SAct 0x0 SErr 0xffffffff action 0xe frozen
ata6: irq_stat 0xffffffff, unknown FIS 00000000 00000000 00000000 00000000, host bus
ata6: SError: { RecovData RecovComm UnrecovData Persist Proto HostInt PHYRdyChg PHYInt CommWake 10B8B Dispar BadCRC Handshk LinkSeq TrStaTrns UnrecFIS DevExch }
ata6: limiting SATA link speed to 1.5 Gbps
ata6: hard resetting link
ata5: exception Emask 0x73 SAct 0x0 SErr 0xffffffff action 0xe frozen
ata5: irq_stat 0xffffffff, unknown FIS 00000000 00000000 00000000 00000000, host bus
ata5: SError: { RecovData RecovComm UnrecovData Persist Proto HostInt PHYRdyChg PHYInt CommWake 10B8B Dispar BadCRC Handshk LinkSeq TrStaTrns UnrecFIS DevExch }
ata5: limiting SATA link speed to 1.5 Gbps
ata5: hard resetting link
ata5: failed to resume link (SControl FFFFFFFF)
ata5: SATA link down (SStatus FFFFFFFF SControl FFFFFFFF)
ata6: failed to resume link (SControl FFFFFFFF)
ata6: SATA link down (SStatus FFFFFFFF SControl FFFFFFFF)
возможно ли избавиться от этого несуществуещего физически /dev/sdc без перезагрузки?
usb debug в настройках включен, но при подключении не появляется usb0.
при подключении nokia n900 все работает
dmesg huawei
[18355.042113] usb 3-2: new high-speed USB device number 54 using ehci-pci
[18355.174993] usb 3-2: New USB device found, idVendor=12d1, idProduct=1038
[18355.174997] usb 3-2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[18355.174999] usb 3-2: Product: MT65xx Android Phone
[18355.175001] usb 3-2: Manufacturer: MediaTek
[18355.175002] usb 3-2: SerialNumber: GMLNU4LB4T6LEYUO
[18355.175660] usb-storage 3-2:1.0: USB Mass Storage device detected
[18355.175759] scsi42 : usb-storage 3-2:1.0
[18356.175001] scsi 42:0:0:0: Direct-Access Linux File-CD Gadget 0000 PQ: 0 ANSI: 2
[18356.175318] sd 42:0:0:0: Attached scsi generic sg3 type 0
[18356.177253] sd 42:0:0:0: [sdd] Attached SCSI removable disk
dmesg nokia
[18392.083128] usb 3-2: new high-speed USB device number 55 using ehci-pci
[18392.216116] usb 3-2: New USB device found, idVendor=0421, idProduct=01c8
[18392.216120] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[18392.216122] usb 3-2: Product: N900 (PC-Suite Mode)
[18392.216123] usb 3-2: Manufacturer: Nokia
[18392.217625] cdc_acm 3-2:1.6: This device cannot do calls on its own. It is not a modem.
[18392.217690] cdc_acm 3-2:1.6: ttyACM0: USB ACM device
[18392.218889] cdc_ether 3-2:1.8 usb0: register 'cdc_ether' at usb-0000:00:16.2-2, CDC Ethernet Device, f6:d6:76:59:ff:c3
При подключении через usb пишет, что 'подключен как usb память'
dmesg
[11320.125737] usb 3-2: new high-speed USB device number 15 using ehci-pci
[11320.258613] usb 3-2: New USB device found, idVendor=12d1, idProduct=1038
[11320.258616] usb 3-2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[11320.258618] usb 3-2: Product: MT65xx Android Phone
[11320.258619] usb 3-2: Manufacturer: MediaTek
[11320.258621] usb 3-2: SerialNumber: GMLNU4LB4T6LEYUO
[11320.259260] usb-storage 3-2:1.0: USB Mass Storage device detected
[11320.259339] scsi23 : usb-storage 3-2:1.0
[11321.258632] scsi 23:0:0:0: Direct-Access Linux File-CD Gadget 0000 PQ: 0 ANSI: 2
[11321.258915] sd 23:0:0:0: Attached scsi generic sg3 type 0
[11321.260988] sd 23:0:0:0: [sdd] Attached SCSI removable disk
fdisk /dev/sdd
fdisk: unable to open /dev/sdd: No medium found
с андроидом сталкиваюсь впервые. подскажите куда копать
Задача: убрать заданное окно qt приложения с панели задач.
Решение:
hideFromTaskBar(QWidget* widget)
{
Display* display = QX11Info::display();
const int n_elements = 2;
Atom state[n_elements];
state[0] = XInternAtom(display, "_NET_WM_STATE_SKIP_PAGER" , true);
state[1] = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", true);
XChangeProperty(display, widget->winId(),
XInternAtom(display, "_NET_WM_STATE", true),
XA_ATOM,
32,
PropModeReplace,
(unsigned char*)state,
n_elements);
}
Проблема: если заменить
QX11Info::display()
XOpenDisplay(0)
Приложение замечательно работает используя QX11Info::display(), но мне интересно, что я делаю неправльно при использовании XOpenDisplay?
Другие фунции(например XQueryTree) нормально работают с объектом получаемым через XOpenDisplay.
Тестовое приложение: pro:
QT += gui
TARGET = test_hide_from_taskbar
SOURCES += main.cpp
LIBS += -lX11
main.cpp:
#include <QApplication>
#include <QPushButton>
#include <QX11Info>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
class Widget : public QPushButton
{
Q_OBJECT
public:
Widget(QWidget* parent = 0);
void hideFromTaskBar(QWidget *widget);
public slots:
void on_click();
};
Widget::Widget(QWidget *parent)
: QPushButton(parent)
{
resize(200, 200);
connect(this, SIGNAL(clicked()), SLOT(on_click()));
}
void Widget::hideFromTaskBar(QWidget* widget)
{
Display* display = XOpenDisplay(0);
Display* qdisplay = QX11Info::display();
// display = qdisplay;
const int n_elements = 2;
Atom state[n_elements];
Q_ASSERT(RootWindow(display, 0) ==
RootWindow(qdisplay, 0));
state[0] = XInternAtom(display, "_NET_WM_STATE_SKIP_PAGER" , true);
state[1] = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", true);
XChangeProperty(display, widget->winId(),
XInternAtom(display, "_NET_WM_STATE", true),
XA_ATOM,
32,
PropModeReplace,
(unsigned char*)state,
n_elements);
}
void Widget::on_click()
{
QWidget* wgt = new QWidget();
wgt->resize(500, 500);
wgt->show();
hideFromTaskBar(wgt);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "main.moc"
После обновления убунты до 13.10, qtcreator при запуске приложения в дебаг режиме выдает:
Отладчик не смог загрузить библиотеку помощника отладчика.
Помощник отладчика используется для преобразования значений к наглядному виду некоторых типов данных Qt и стандартной библиотеки. Он должен быть собран отдельно для каждого профиля Qt. Это можно сделать в настройках сборки и запуска, выбрав профиль Qt, развернув раздер «Подробнее» и нажав на «Пересобрать всё».
Показать подробности:
Библиотека помощника отладчика не обнаружена в /usr/share/qt4/qtc-debugging-helper/, /home/ower/qtcreator-2.6.1/qtc-debugging-helper/30324244/, /home/ower/.local/share/data/QtProject/QtCreator/qtc-debugging-helper/30324244/.
В настройках сборки и запуска все кнопки «собрать» неактивны, а напротив «Помощник GDB», в поле где должен быть путь, находится сообщение «не нужен».
следующие → |