From 667839ee6560a10aca54885dbf8951b77bdc21b2 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Fri, 3 May 2013 02:51:37 -0500 Subject: Hack around ARGB task tray icon background display glitch --- kicker/applets/systemtray/systemtrayapplet.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'kicker/applets/systemtray/systemtrayapplet.cpp') diff --git a/kicker/applets/systemtray/systemtrayapplet.cpp b/kicker/applets/systemtray/systemtrayapplet.cpp index f9d490162..542ac42d0 100644 --- a/kicker/applets/systemtray/systemtrayapplet.cpp +++ b/kicker/applets/systemtray/systemtrayapplet.cpp @@ -1130,13 +1130,20 @@ void SystemTrayApplet::setBackground() TrayEmbed::TrayEmbed( bool kdeTray, TQWidget* parent ) - : QXEmbed( parent ), kde_tray( kdeTray ) + : QXEmbed( parent ), kde_tray( kdeTray ), m_ensureBackgroundSetTimerCount(0) { + m_ensureBackgroundSetTimer = new TQTimer(); + connect(m_ensureBackgroundSetTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(ensureBackgroundSet())); hide(); m_scaledWidget = new TQWidget(parent); m_scaledWidget->hide(); } +TrayEmbed::~TrayEmbed() +{ + delete m_ensureBackgroundSetTimer; +} + void TrayEmbed::getIconSize(int defaultIconSize) { TQSize minSize = minimumSizeHint(); @@ -1170,6 +1177,7 @@ void TrayEmbed::setBackground() if (!isHidden()) { XClearArea(x11Display(), embeddedWinId(), 0, 0, 0, 0, True); + m_ensureBackgroundSetTimerCount = 0; ensureBackgroundSet(); } } @@ -1182,7 +1190,7 @@ void TrayEmbed::ensureBackgroundSet() // This is a nasty little hack to make sure that tray icons / applications which do not match our QXEmbed native depth are still displayed properly, // i.e without irritating white/grey borders where the tray icon's transparency is supposed to be... // Essentially it converts a 24 bit Xlib Pixmap to a 32 bit Xlib Pixmap - + TQPixmap bg(width(), height()); // Get the RGB background image @@ -1212,5 +1220,16 @@ void TrayEmbed::ensureBackgroundSet() XSetWindowBackgroundPixmap(x11Display(), embeddedWinId(), argbpixmap); XFreePixmap(x11Display(), argbpixmap); XFreeGC(x11Display(), gc); + + // Repaint + XClearArea(x11Display(), embeddedWinId(), 0, 0, 0, 0, True); + + // HACK + // Clear background artifacts in first available timeslot after initial icon display + if (m_ensureBackgroundSetTimerCount < 1) { + m_ensureBackgroundSetTimerCount++; + m_ensureBackgroundSetTimer->stop(); + m_ensureBackgroundSetTimer->start(0, TRUE); + } } } -- cgit v1.2.1