LINUX.ORG.RU

Сообщения Ower

 

X11 - отслеживание изменения размеров и положения окна

Как наиболее эффективно отслеживать геометрию окна? Окно не принадлежит моему приложению.

Есть ли что-то лучше чем XSelectInput(d, w, StructureNotifyMask) и отслеживать ConfigureNotify?

 , , ,

Ower
()

Qt5 добавляет & в текст

В qt4 такого бага не было. В qt5 к тексту любой кнопки, меню и тд добавляется &, что делает одну из букв подчеркнутой. Как эту хрень отключить? И зачем так делать по умолчанию то?

 

Ower
()

QHash<__int128>

Как добавить поддержку __int128 в QHash не модифицируя «qhashfunctions.h»?

Если добавляю у себя в исходники qHash(__int128) выдает ошибку

call of overloaded ‘qHash(const __int128&)’ is ambiguous      Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))

если добавить в qhashfunctions.h, то работает

 , , ,

Ower
()

qbs глобальные переменные проекта

Начал изучать qbs - пытаюсь перевести на него qmake проект с кучей субпроектов. В qmake в субпроектах используется такие конструкции:

include ($$PROJECT_ROOT/common_options.pro)

В qbs возникла проблема - создав модуль я обнаружил, что версия qt внутри модуля выводится как undefined. Куда копать?

 , ,

Ower
()

xdamage: qt4+xlib - работает, qt5+xcb - не работает

в 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 впервые столкнулся сегодня, то очевидно, что я где-то допустил элементарную ошибку. Помогите, добрые люди.

 , , ,

Ower
()

Завиcание на qDebug

Проблема появилась после обновления с 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                                               

 , ,

Ower
()

LVM - умер один из дисков

Умер один из дисков в 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

Похоже проблемы не с бэдами, а с электроникой?

 , ,

Ower
()

Перемещение XEmbed окна.

Есть 2 qt4 программы. Одна(A) встраивает(XEmbed) свой виджет в окно другой(B).

Необходимо:

  • чтобы встроенный виджет получал все события мыши(изначально так и есть).
  • чтобы встроенный виджет можно было перемещать мышью.

Перемещать встроенный виджет можно из программы B, но так как она не получает событий мыши для встроенного виджета, то мы не знаем когда это делать.

Варианты:

  • IPC. Только если по другому не получится.
  • XGrabPointer. Так как некоторые программы игнорируют XSendEvent не от сервера, то от этого варианта я отказался.
  • XSelectInput. Сейчас пытаюсь с его помощью реализовать.

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

 , ,

Ower
()

Kvm vga passthrough: вернуть хосту видеокарту

Пробрасываю карту:

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)

что нужно сделать, чтобы можно было после остановки ВМ снова полноценно использовать проброшенную видеокарту на хосте?

 , , ,

Ower
()

X11 - получить активный дисплей

Дано: запущено от 0 до n X servers

Требуется: получить название активного дисплея или выяснить, что активна консоль

Пока разобрался лишь как получить активный tty: /sys/class/tty/tty0/active.

 

Ower
()

Неадекватный размер shared memory

После загрузки системы начинает расти 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 все тихо)

 ,

Ower
()

Изменение keycode

Нужно для одной из клавиатур изменить 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 - никакого эффекта.

как эту гадость можно дебажить? может логи какие-то есть?

 , , ,

Ower
()

Несколько таблиц маршрутизации

Есть такая конфигурация:

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 порта работает.

 , ,

Ower
()

resize2fs - не увеличивать количество inodes

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?

 , ,

Ower
()

Thunderbird - отключить аккаунт

Каким образом в Thunderbird отключить аккаунт? Нужно, чтобы он не отображался в главном окне и не ломися проверять сообщения, но при этом я мог быстро его включить.

Ower
()

В устройствах остался отключенный диск

Делал горячее подключение 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 без перезагрузки?

Ower
()

Huawei g700(андроид 4.2) - usb networking

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

 , , ,

Ower
()

Huawei g700(андроид 4.2) - usb storage

При подключении через 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

с андроидом сталкиваюсь впервые. подскажите куда копать

 , ,

Ower
()

Проблема с XOpenDisplay (c QX11Info::display() все работает)

Задача: убрать заданное окно 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"

 ,

Ower
()

qtcreator debugging helper - не работает после обновления системы

После обновления убунты до 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», в поле где должен быть путь, находится сообщение «не нужен».

 , ,

Ower
()

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