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