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