fix: 任务栏应用图标显示异常
对于某些没有提供desktop文件(或者desktop文件中没有指定Icon字段)的应用 需要从窗管获取应用的Icon Log: 修复任务栏应用图标显示异常的问题 Resolve: https://github.com/linuxdeepin/developer-center/issues/3811 Influence: 任务栏应用图片显示
This commit is contained in:
parent
de36918beb
commit
d1c121667a
@ -127,6 +127,8 @@ AppInfo *WindowIdentify::identifyWindowX11(WindowInfoX *winInfo, QString &innerI
|
||||
}
|
||||
|
||||
qInfo() << "identifyWindowX11: failed";
|
||||
// 如果识别窗口失败,则该app的entryInnerId使用当前窗口的innerId
|
||||
innerId = winInfo->getInnerId();
|
||||
return appInfo;
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
#ifndef WINDOWINFOBASE_H
|
||||
#define WINDOWINFOBASE_H
|
||||
|
||||
#include "processinfo.h"
|
||||
#include "xcbutils.h"
|
||||
|
||||
#include <QString>
|
||||
@ -12,7 +13,6 @@
|
||||
|
||||
class Entry;
|
||||
class AppInfo;
|
||||
class ProcessInfo;
|
||||
|
||||
class WindowInfoBase
|
||||
{
|
||||
@ -24,7 +24,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
virtual bool shouldSkip() = 0;
|
||||
virtual QString getIcon() = 0;
|
||||
virtual QString getTitle() = 0;
|
||||
|
@ -14,6 +14,9 @@
|
||||
#include <QTimer>
|
||||
#include <QImage>
|
||||
#include <QIcon>
|
||||
#include <QBuffer>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#define XCB XCBUtils::instance()
|
||||
|
||||
@ -354,10 +357,52 @@ void WindowInfoX::update()
|
||||
innerId = genInnerId(this);
|
||||
}
|
||||
|
||||
// TODO 从窗口中获取图标, 并设置best size be used in Entry
|
||||
QString WindowInfoX::getIconFromWindow()
|
||||
{
|
||||
return QString();
|
||||
char *displayname = nullptr;
|
||||
Display * dpy = XOpenDisplay (displayname);
|
||||
if (!dpy) {
|
||||
exit (1);
|
||||
}
|
||||
|
||||
Atom net_wm_icon = XCB->getAtom("_NET_WM_ICON");
|
||||
|
||||
unsigned char *buf;
|
||||
int format;
|
||||
Atom type;
|
||||
unsigned long nitems, bytes;
|
||||
|
||||
// Get image size
|
||||
XGetWindowProperty(dpy, xid, net_wm_icon, 0, 1, 0, AnyPropertyType, &type, &format, &nitems, &bytes, &buf);
|
||||
int width = *(int *)buf;
|
||||
XFree(buf);
|
||||
XGetWindowProperty(dpy, xid, net_wm_icon, 1, 1, 0, AnyPropertyType, &type, &format, &nitems, &bytes, &buf);
|
||||
int height = *(int *)buf;
|
||||
XFree(buf);
|
||||
|
||||
long size = width * height;
|
||||
XGetWindowProperty(dpy, xid, net_wm_icon, 2, size, 0, AnyPropertyType, &type, &format, &nitems, &bytes,
|
||||
&buf);
|
||||
unsigned long *imgArr = (unsigned long *)(buf);
|
||||
std::vector<uint32_t> imgARGB32(size);
|
||||
for (long i = 0; i < size; ++i) {
|
||||
imgARGB32[i] = (uint32_t)(imgArr[i]);
|
||||
}
|
||||
|
||||
XFree(buf);
|
||||
|
||||
QImage img = QImage((uchar *)imgARGB32.data(), width, height, QImage::Format_ARGB32);
|
||||
QBuffer buffer;
|
||||
buffer.open(QIODevice::WriteOnly);
|
||||
img.scaled(48, 48, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
img.save(&buffer, "PNG");
|
||||
|
||||
// convert to base64
|
||||
QString encode = buffer.data().toBase64();
|
||||
QString iconPath = QString("%1,%2").arg("data:image/png:base64").arg(encode);
|
||||
buffer.close();
|
||||
|
||||
return iconPath;
|
||||
}
|
||||
|
||||
bool WindowInfoX::isActionMinimizeAllowed()
|
||||
|
Loading…
Reference in New Issue
Block a user