trayicon: 创建24depth的窗口进行包装

QWidget::createWindowcontainer没有很好的处理本进程使用XCreateWindow
创建的窗口。
QQ等32位窗口直接丢到windowcontianer也是无法正常工作(被销毁)

暂时全部使用24depth包装。 先不要合并,会导致背景有问题。
This commit is contained in:
snyh 2015-08-16 20:37:00 +08:00 committed by Hualet Wang
parent bcb0ce9edf
commit 2f1a6aa688
2 changed files with 19 additions and 4 deletions

View File

@ -4,7 +4,7 @@
#
#-------------------------------------------------
QT += core gui dbus
QT += core gui dbus x11extras
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

View File

@ -1,9 +1,25 @@
#include <QApplication>
#include <QPainter>
#include <QBitmap>
#include <QX11Info>
#include "dockconstants.h"
#include "trayicon.h"
#include <X11/Xlib.h>
QWindow* wrapper(WId w)
{
Display * dpy = QX11Info::display();
//需要在TrayIcon销毁时候释放
QWindow* fake = new QWindow();
XReparentWindow(dpy, w, fake->winId(), 0, 0);
XMapSubwindows(dpy, fake->winId());
XFlush(dpy);
return QWindow::fromWinId(fake->winId());
}
TrayIcon::TrayIcon(WId winId, QWidget *parent) :
QWidget(parent)
@ -11,14 +27,13 @@ TrayIcon::TrayIcon(WId winId, QWidget *parent) :
initItemMask();
resize(Dock::APPLET_CLASSIC_ICON_SIZE,
Dock::APPLET_CLASSIC_ICON_SIZE);
m_win = QWindow::fromWinId(winId);
m_win = wrapper(winId);
QWidget * winItem = QWidget::createWindowContainer(m_win, this);
winItem->resize(size());
}
void TrayIcon::initItemMask()
{
m_itemMask = QPixmap(Dock::APPLET_CLASSIC_ICON_SIZE,