New patches: [Show file icons in Transfer Manager on Windows Maciej Niedzielski **20061122232326] { hunk ./src/filetransdlg.cpp 141 + QString filePath; // full file path, but without ".part" hunk ./src/filetransdlg.cpp 196 + d->filePath = fname; hunk ./src/filetransdlg.cpp 238 +#ifdef Q_WS_WIN +// Copyright (C) 1992-2006 Trolltech AS. All rights reserved. +// From Qt 4.1.3, qwindowsstyle.cpp +QPixmap convertHIconToPixmap( const HICON icon) +{ + bool foundAlpha = false; + HDC screenDevice = qt_win_display_dc(); + HDC hdc = CreateCompatibleDC(screenDevice); + + ICONINFO iconinfo; + GetIconInfo(icon, &iconinfo); //x and y Hotspot describes the icon center + + //create image + HBITMAP winBitmap = CreateBitmap(iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 1, 32, 0); + HGDIOBJ oldhdc = SelectObject(hdc, winBitmap); + DrawIconEx( hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_NORMAL); + QPixmap::HBitmapFormat alphaType = QPixmap::PremultipliedAlpha; + + BITMAP bitmapData; + GetObject(iconinfo.hbmColor, sizeof(BITMAP), &bitmapData); + + QPixmap iconpixmap = QPixmap::fromWinHBITMAP(winBitmap, alphaType); + QImage img = iconpixmap.toImage(); + + if ( bitmapData.bmBitsPixel == 32 ) { //only check 32 bit images for alpha + for (int y = 0 ; y < iconpixmap.height() && !foundAlpha ; y++) { + QRgb *scanLine= reinterpret_cast(img.scanLine(y)); + for (int x = 0; x < img.width() ; x++) { + if (qAlpha(scanLine[x]) != 0) { + foundAlpha = true; + break; + } + } + } + } + + if (!foundAlpha) { + //If no alpha was found, we use the mask to set alpha values + HBITMAP winMask = CreateBitmap(iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 1, 32, 0); + SelectObject(hdc, winMask); + DrawIconEx( hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_MASK); + + QPixmap maskPixmap = QPixmap::fromWinHBITMAP(winMask, alphaType); + QImage mask = maskPixmap.toImage(); + + for (int y = 0 ; y< iconpixmap.height() ; y++){ + QRgb *scanlineImage = reinterpret_cast(img.scanLine(y)); + QRgb *scanlineMask = reinterpret_cast(mask.scanLine(y)); + for (int x = 0; x < img.width() ; x++){ + if (qRed(scanlineMask[x]) != 0) + scanlineImage[x] = 0; //mask out this pixel + else + scanlineImage[x] |= 0xff000000; // set the alpha channel to 255 + } + } + DeleteObject(winMask); + } + + //dispose resources created by iconinfo call + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + + SelectObject(hdc, oldhdc); //restore state + DeleteDC(hdc); + DeleteObject(winBitmap); + return QPixmap::fromImage(img); +} +#endif + +QPixmap FileTransferHandler::fileIcon() const +{ + QPixmap icon; + +#ifdef Q_WS_WIN + + SHFILEINFO sfi; + const bool partial = !d->sending && d->sent < d->fileSize; + + QFileInfo fi(d->filePath); + QString iconPath; + UINT flags = SHGFI_ICON | SHGFI_LARGEICON; + + if (partial || !fi.exists()) { + flags |= SHGFI_USEFILEATTRIBUTES; + iconPath = "." + fi.suffix(); + } + else { + iconPath = d->filePath; + iconPath.replace('/', '\\'); + } + + if (SHGetFileInfo(iconPath.utf16(), FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), flags)) { + icon = convertHIconToPixmap(sfi.hIcon); + } + +#endif + + return icon; +} + hunk ./src/filetransdlg.cpp 371 + d->filePath = saveName; + d->filePath.chop(5); // remove ".part" hunk ./src/filetransdlg.cpp 1060 - QPixmap icon; + QPixmap icon, fileicon; hunk ./src/filetransdlg.cpp 1340 - p->drawPixmap(m, m + yoff, icon); - int tm = m + icon.width() + 4; - tw = tw - (icon.width() + 4); + int fullIconWidth; + if(!fileicon.isNull()) { + fullIconWidth = fileicon.width() + icon.width()/2; + p->drawPixmap(m, m + yoff, fileicon); + p->drawPixmap(m + fullIconWidth - icon.width(), m + yoff + fileicon.height() - icon.height()/2, icon); + } + else { + fullIconWidth = icon.width(); + p->drawPixmap(m, m + yoff, icon); + } + + int tm = m + fullIconWidth + 4; + tw = tw - (fullIconWidth + 4); hunk ./src/filetransdlg.cpp 1628 - parent->setProgress(i->id, i->p, i->h->totalSteps(), i->sent, bps, updateAll); - hunk ./src/filetransdlg.cpp 1634 - } - - PsiAccount *pa = i->h->account(); - transferList.removeRef(i); hunk ./src/filetransdlg.cpp 1635 - if(recv) { hunk ./src/filetransdlg.cpp 1645 + + findItem(i->id)->fileicon = i->h->fileIcon(); hunk ./src/filetransdlg.cpp 1649 + PsiAccount *pa = i->h->account(); hunk ./src/filetransdlg.cpp 1652 + + parent->setProgress(i->id, i->p, i->h->totalSteps(), i->sent, bps, updateAll); + + if(done) { + transferList.removeRef(i); + } hunk ./src/filetransdlg.cpp 1709 -int FileTransDlg::addItem(const QString &filename, qlonglong size, const QString &peer, bool sending) +int FileTransDlg::addItem(const QString &filename, const QPixmap &fileicon, qlonglong size, const QString &peer, bool sending) hunk ./src/filetransdlg.cpp 1717 + + i->fileicon = fileicon; + hunk ./src/filetransdlg.cpp 1780 - i->id = addItem(h->fileName(), h->fileSize(), peer, (h->mode() == FileTransferHandler::Sending)); + i->id = addItem(h->fileName(), h->fileIcon(), h->fileSize(), peer, (h->mode() == FileTransferHandler::Sending)); hunk ./src/filetransdlg.h 5 +#include hunk ./src/filetransdlg.h 38 + QPixmap fileIcon() const; hunk ./src/filetransdlg.h 118 - int addItem(const QString &filename, qlonglong size, const QString &peer, bool sending); + int addItem(const QString &filename, const QPixmap &fileicon, qlonglong size, const QString &peer, bool sending); } [Created DesktopUtil with getFileIcon() Maciej Niedzielski **20061205013924] { adddir ./src/tools/desktoputil adddir ./src/tools/desktoputil/third-party hunk ./src/filetransdlg.cpp 42 +#include "desktoputil.h" hunk ./src/filetransdlg.cpp 239 -#ifdef Q_WS_WIN -// Copyright (C) 1992-2006 Trolltech AS. All rights reserved. -// From Qt 4.1.3, qwindowsstyle.cpp -QPixmap convertHIconToPixmap( const HICON icon) -{ - bool foundAlpha = false; - HDC screenDevice = qt_win_display_dc(); - HDC hdc = CreateCompatibleDC(screenDevice); - - ICONINFO iconinfo; - GetIconInfo(icon, &iconinfo); //x and y Hotspot describes the icon center - - //create image - HBITMAP winBitmap = CreateBitmap(iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 1, 32, 0); - HGDIOBJ oldhdc = SelectObject(hdc, winBitmap); - DrawIconEx( hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_NORMAL); - QPixmap::HBitmapFormat alphaType = QPixmap::PremultipliedAlpha; - - BITMAP bitmapData; - GetObject(iconinfo.hbmColor, sizeof(BITMAP), &bitmapData); - - QPixmap iconpixmap = QPixmap::fromWinHBITMAP(winBitmap, alphaType); - QImage img = iconpixmap.toImage(); - - if ( bitmapData.bmBitsPixel == 32 ) { //only check 32 bit images for alpha - for (int y = 0 ; y < iconpixmap.height() && !foundAlpha ; y++) { - QRgb *scanLine= reinterpret_cast(img.scanLine(y)); - for (int x = 0; x < img.width() ; x++) { - if (qAlpha(scanLine[x]) != 0) { - foundAlpha = true; - break; - } - } - } - } - - if (!foundAlpha) { - //If no alpha was found, we use the mask to set alpha values - HBITMAP winMask = CreateBitmap(iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 1, 32, 0); - SelectObject(hdc, winMask); - DrawIconEx( hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_MASK); - - QPixmap maskPixmap = QPixmap::fromWinHBITMAP(winMask, alphaType); - QImage mask = maskPixmap.toImage(); - - for (int y = 0 ; y< iconpixmap.height() ; y++){ - QRgb *scanlineImage = reinterpret_cast(img.scanLine(y)); - QRgb *scanlineMask = reinterpret_cast(mask.scanLine(y)); - for (int x = 0; x < img.width() ; x++){ - if (qRed(scanlineMask[x]) != 0) - scanlineImage[x] = 0; //mask out this pixel - else - scanlineImage[x] |= 0xff000000; // set the alpha channel to 255 - } - } - DeleteObject(winMask); - } - - //dispose resources created by iconinfo call - DeleteObject(iconinfo.hbmMask); - DeleteObject(iconinfo.hbmColor); - - SelectObject(hdc, oldhdc); //restore state - DeleteDC(hdc); - DeleteObject(winBitmap); - return QPixmap::fromImage(img); -} -#endif - hunk ./src/filetransdlg.cpp 241 - QPixmap icon; - -#ifdef Q_WS_WIN - - SHFILEINFO sfi; - const bool partial = !d->sending && d->sent < d->fileSize; - - QFileInfo fi(d->filePath); - QString iconPath; - UINT flags = SHGFI_ICON | SHGFI_LARGEICON; - - if (partial || !fi.exists()) { - flags |= SHGFI_USEFILEATTRIBUTES; - iconPath = "." + fi.suffix(); - } - else { - iconPath = d->filePath; - iconPath.replace('/', '\\'); - } - - if (SHGetFileInfo(iconPath.utf16(), FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), flags)) { - icon = convertHIconToPixmap(sfi.hIcon); - } - -#endif - - return icon; + return DesktopUtil::getFileIcon(d->filePath, !d->sending && d->sent < d->fileSize, true); + // use generic icon when still receiving the file hunk ./src/src.pri 16 +include($$PWD/tools/desktoputil/desktoputil.pri) addfile ./src/tools/desktoputil/desktoputil.cpp hunk ./src/tools/desktoputil/desktoputil.cpp 1 +#include "desktoputil.h" + +#include + +/** + * \brief Returns icon of the given file. + * \param path, path to the file + * \param genericIcon, retrieve the icon basing just on file type + * \param largeIcon, retrieve large image + * + * If the file does not exist, a generic icon is always returned. + * + * To retrieve icon for a given file extension, simply provide ".extension" as \a path + * and set \a genericIcon to true. + */ +QPixmap DesktopUtil::getFileIcon(const QString &path, bool genericIcon, bool largeIcon) +{ + QPixmap icon; + +#ifdef Q_WS_WIN + + SHFILEINFO sfi; + + QFileInfo fi(path); + QString iconPath = path; + + UINT flags = SHGFI_ICON; + flags |= largeIcon ? SHGFI_LARGEICON : SHGFI_SMALLICON; + + if (genericIcon || !fi.exists()) { + flags |= SHGFI_USEFILEATTRIBUTES; + iconPath = "." + fi.suffix(); + } + else { + iconPath.replace('/', '\\'); + } + + if (SHGetFileInfo(iconPath.utf16(), FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), flags)) { + icon = HIconUtil::convertHIconToPixmap(sfi.hIcon); + DestroyIcon(sfi.hIcon); + } + +#endif + + return icon; +} addfile ./src/tools/desktoputil/desktoputil.h hunk ./src/tools/desktoputil/desktoputil.h 1 +#include +#include + +#ifdef Q_WS_WIN +#include "third-party/qt_hicon_win.h" +#endif + +namespace DesktopUtil +{ + QPixmap getFileIcon(const QString &path, bool genericIcon = false, bool largeIcon = true); +}; addfile ./src/tools/desktoputil/desktoputil.pri hunk ./src/tools/desktoputil/desktoputil.pri 1 +HEADERS += $$PWD/desktoputil.h +SOURCES += $$PWD/desktoputil.cpp +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD + +win32: { + HEADERS += $$PWD/third-party/qt_hicon_win.h + SOURCES += $$PWD/third-party/qt_hicon_win.cpp +} addfile ./src/tools/desktoputil/third-party/qt_hicon_win.cpp hunk ./src/tools/desktoputil/third-party/qt_hicon_win.cpp 1 +/**************************************************************************** +** +** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved. +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +/* From Qt 4.1.3, qwindowsstyle.cpp */ + +#include "qt_hicon_win.h" + +QPixmap HIconUtil::convertHIconToPixmap(const HICON icon) +{ + bool foundAlpha = false; + HDC screenDevice = qt_win_display_dc(); + HDC hdc = CreateCompatibleDC(screenDevice); + + ICONINFO iconinfo; + GetIconInfo(icon, &iconinfo); //x and y Hotspot describes the icon center + + //create image + HBITMAP winBitmap = CreateBitmap(iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 1, 32, 0); + HGDIOBJ oldhdc = SelectObject(hdc, winBitmap); + DrawIconEx( hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_NORMAL); + QPixmap::HBitmapFormat alphaType = QPixmap::PremultipliedAlpha; + + BITMAP bitmapData; + GetObject(iconinfo.hbmColor, sizeof(BITMAP), &bitmapData); + + QPixmap iconpixmap = QPixmap::fromWinHBITMAP(winBitmap, alphaType); + QImage img = iconpixmap.toImage(); + + if ( bitmapData.bmBitsPixel == 32 ) { //only check 32 bit images for alpha + for (int y = 0 ; y < iconpixmap.height() && !foundAlpha ; y++) { + QRgb *scanLine= reinterpret_cast(img.scanLine(y)); + for (int x = 0; x < img.width() ; x++) { + if (qAlpha(scanLine[x]) != 0) { + foundAlpha = true; + break; + } + } + } + } + + if (!foundAlpha) { + //If no alpha was found, we use the mask to set alpha values + HBITMAP winMask = CreateBitmap(iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 1, 32, 0); + SelectObject(hdc, winMask); + DrawIconEx( hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_MASK); + + QPixmap maskPixmap = QPixmap::fromWinHBITMAP(winMask, alphaType); + QImage mask = maskPixmap.toImage(); + + for (int y = 0 ; y< iconpixmap.height() ; y++){ + QRgb *scanlineImage = reinterpret_cast(img.scanLine(y)); + QRgb *scanlineMask = reinterpret_cast(mask.scanLine(y)); + for (int x = 0; x < img.width() ; x++){ + if (qRed(scanlineMask[x]) != 0) + scanlineImage[x] = 0; //mask out this pixel + else + scanlineImage[x] |= 0xff000000; // set the alpha channel to 255 + } + } + DeleteObject(winMask); + } + + //dispose resources created by iconinfo call + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + + SelectObject(hdc, oldhdc); //restore state + DeleteDC(hdc); + DeleteObject(winBitmap); + return QPixmap::fromImage(img); +} addfile ./src/tools/desktoputil/third-party/qt_hicon_win.h hunk ./src/tools/desktoputil/third-party/qt_hicon_win.h 1 +#include +#include + +namespace HIconUtil +{ + QPixmap convertHIconToPixmap(const HICON icon); +}; } Context: [Reset status messages when going offline. Remko Troncon **20061204133046] [Last Activity (XEP-0012) for offline users. Remko Troncon **20061204131343] [Disable 'Publish tune' if no PEP is available (FS#594). Remko Troncon **20061203150921] [Some PsiContactList refactoring. Remko Troncon **20061203133749] [Fix illegal nick change handling (FS#596). Remko Troncon **20061203123229] [Uncheck legacy ssl probe if disabled. Remko Troncon **20061129191140] [Some xmpptest tweaks. Remko Troncon **20061129191102] [Remove obsolete widgets. Remko Troncon **20061128175136] [Keep account JID bare. Remko Troncon **20061128140200] [Finished authzid support. Remko Troncon **20061128125911] [Encode domain names before passing them to SASL. Remko Troncon **20061128104108] [Fix overriding of realms in simplesasl. Remko Troncon **20061128104041] [Compilation fix. Remko Troncon **20061128092442] [Encode internationalized domain names. Remko Troncon **20061128091835] [Reworked SSL/TLS account settings. Remko Troncon **20061127221100] [We don't need PsiCon::mainWin() around anymore. Michail Pishchagin **20061126210629] [Removed dependencies on MainWin. Michail Pishchagin **20061126194557] [Fix httpconnect.cpp newline detection bug. Remko Troncon **20061126181911 Thanks to michalj. ] [but lets make it statuschangeless in MUC by default Kevin Smith **20061126124231] [Show status changes in MUC (thanks dion) Kevin Smith **20061126123852] [OptionsTab Shortcuts (Thanks Ephraim) Kevin Smith **20061126120715] [temporary add options.ui.contactlist.temp-no-roster-animation option to workaround extrem CPU usage of animated roaster icons Martin H. **20060730215542] [Auto-copy fix Maciej Niedzielski **20061106222750] [Report reason when people leave a MUC (Thanks Dion) Kevin Smith **20061126102314] [IconToolButton will display text if it doesn't have an icon. Michail Pishchagin **20061125185504] [options.tip.* -> options.ui.tip.*. Michail Pishchagin **20061125184705] [Icon -> PsiIcon. Michail Pishchagin **20061125173226] [Windows Vista detection support Kevin Smith **20061122230043] [Three doxygen comments from Textshell Kevin Smith **20061122221724] [(ClassName *)PsiAccount::dialogFind("ClassName") -> PsiAccount::findDialog(). Michail Pishchagin **20061122132956] [Two null XMPP::Jids are equal. Michail Pishchagin **20061122120403] [Correctly ignore WinAmp header warnings. Michail Pishchagin **20061120145252] [Suppress more warnings. Michail Pishchagin **20061120140823] [Suppress compilation warnings. Michail Pishchagin **20061120140034] [Fix to BookmarkManager (thanks Ephraim) Kevin Smith **20061119195128] [Make window flashing optional (options.xml) Kevin Smith **20061119152845] [Don't needlessly expand LineEdit vertically in ChatDlg. Michail Pishchagin **20061113125127] [New Alertable class to simplify alert icon plumbing. Michail Pishchagin **20061114213929] [Strip unnecessary data from the manifest file. Michail Pishchagin **20061108164138] [Ephraim's fix correction for the gcdialog Kevin Smith **20061107165709] [AvatarFactory ensures that all avatars are square in size. Michail Pishchagin **20061107160555] [Moved function to create transparent QPixmaps to separate file. Michail Pishchagin **20061107160210] [Changed animation groupbox to combobox. Michail Pishchagin **20061106163452 Thanks to Martin H. ] [Visual Styles Manifest (for Windows) Maciej Niedzielski **20061018203842 Enables Windows Visual Styles in Psi. Now all common dialogs (file open, file save) will use visual styles, too. ] [Fixed splitter resizing in chats and groupchats. Michail Pishchagin **20061106151310 Thanks to Ephraim. ] [Added Q_OBJECT macro to aboutdlg. Remko Troncon **20061104145551] [Fixed sort order in groupchat dialog. Remko Troncon **20061103220932] [Do not add a body to MUC topic changes. Remko Troncon **20061103170842] [More Aspell UTF-8 support. Remko Troncon **20061102211848] [Added Mac OS X spell checking support. Remko Troncon **20061102203818] [Use UTF-8 in the ASpellChecker. Remko Troncon **20061102182805] [Fix statusdlg signal slot. Remko Troncon **20061101003800] [Added support for JEP-70. Remko Troncon **20061031193236 Thanks to Machekku. ] [Added more ignore rules to the boring file. Michail Pishchagin **20061030100120] [Tab drag and drop Kevin Smith **20061026100810] [Disable 'check spelling' option when no spell checker is available. Remko Troncon **20061026095747 Thanks to Ephraim. ] [Added XMPP::Status constructor. Remko Troncon **20061026095152] [Fix shortcuts in event dialog. Remko Troncon **20061026085820] [Remove unwanted whitespace from error stanza. Remko Troncon **20061026075059 Thanks to Machekku. ] [Fixed typo in shortcut manager. Remko Troncon **20061026074154] [Fixed warning fix. Remko Troncon **20061025213440] [Fix compilation warning. Remko Troncon **20061025172832] [Make sure that there is at least one shortcut to send chat messages. Remko Troncon **20061025154932] [Workaround for shortcut segfault. Remko Troncon **20061025154348] [Remove the shortcut for clearing the chatlog. Remko Troncon **20061025153546] [Start rewriting Tab widgets Kevin Smith **20061025150151] [Narrowing includes down. Remko Troncon **20061025134832] [Split off some common classes from im.h. Remko Troncon **20061025134244] [Make resourceMenu use XMPP::Status. Remko Troncon **20061025121333] [Make status presets use XMPP::Status. Remko Troncon **20061025120452] [Removed redundant type field from XMPP::Status. Remko Troncon **20061025114556] [Added XMPP::Status::type() function and Type enum for safer programming. Michail Pishchagin **20061025105450] [Refactored BlockTransportPopupList class a little. Michail Pishchagin **20061025082210] [mac builds should be devel, not beta3 Kevin Smith **20061025094954] [Use QDesktopServices::openUrl instead of our hand coded way. Remko Troncon **20061025094241] [Enable new tray icon by default on all platforms. Remko Troncon **20061024214146] [Add shadow around tray icon on X11. Remko Troncon **20061024192121] [More tray icon code. Remko Troncon **20061024190541] [Some more tray menu refactoring. Remko Troncon **20061024184654] [Fixed trayicon slot mismatch. Remko Troncon **20061024181846] [Use QSystemTrayIcon on Mac OS X. Remko Troncon **20061024180330] [Renamed MTray to PsiTrayIcon, and put it in a separate file. Remko Troncon **20061024161054] [Use QSyntaxHighlighter for spell checking. Remko Troncon **20061024154309 Fixes highlighting issues. ] [Do not set mask while the pixmap is being painted on. Michail Pishchagin **20061024141610] [Extracted AccountLabel to separate file. Michail Pishchagin **20061024120956] [Disabling qca-gnupg. Michail Pishchagin **20061024120537] [Refactored PsiCon::accountList() -> PsiContactList::accounts(). Michail Pishchagin **20061024112623 To be more precise: accountList(false) -> PsiContactList::accounts() and accountList(true) -> PsiContactList::enabledAccounts(). ] [Moved PsiAccountList to the separate PsiContactList class. Michail Pishchagin **20061024102058] [Added more valgrind suppressions (tested on Kubuntu Dapper). Michail Pishchagin **20061024100830] [Workaround for 100% CPU usage on connection error. Remko Troncon **20061024084520] [Migrating tip of the day. Remko Troncon **20061023185050] [Moved text utilities to TextUtil. Remko Troncon **20061023121846] [Fixed X11 compilation issues. Remko Troncon **20061023115501] [Some more common.h reordering. Remko Troncon **20061023113057] [Moving some things out of common.cpp. Remko Troncon **20061023111734] [Moved global PsiIconset instance into PsiIconset. Remko Troncon **20061023094755] [Cleanups in common.h. Remko Troncon **20061023085345] [Remove dependency on Psi from aspellchecker. Remko Troncon **20061023082646] [Aspell fix. Remko Troncon **20061023075215] [Some src.pri cleanups. Remko Troncon **20061022213649] [More portable way of linking against static jingle. Remko Troncon **20061022212611] [More portable way of linking against a static qca. Remko Troncon **20061022212124] [Tightening includes. Remko Troncon **20061022204405] [Copied BSocket from ambrosia. Remko Troncon **20061022200658] [Removed Q3CStrings. Remko Troncon **20061022200025] [Split off AboutDlg. Remko Troncon **20061022185351] [Fixed segfault on linux in getHomeDir(). Remko Troncon **20061022152235] [Migrate global shortcut options to new options system. Remko Troncon **20061021213722] [More common.h cleanups. Remko Troncon **20061021210021] [Some more common.h cleanups. Remko Troncon **20061021201149] [Fixed windows building of QCA. Remko Troncon **20061021201442] [Moved application information out of common.h into ApplicationInfo. Remko Troncon **20061021191231] [Added Mac OS X support in SystemInfo. Remko Troncon **20061021173553] [Sorting Ad-Hoc commands. Remko Troncon **20061021172941 Thanks to Norman Rasmussen. ] [Added missing includes to systeminfo. Remko Troncon **20061021172045] [Added busywidget to ad-hoc command dialog. Remko Troncon **20061021171745 Thanks to Norman Rasmussen. ] [Added extra include to systeminfo. Remko Troncon **20061021171133] [Moved system information methods from common.h to SystemInfo. Remko Troncon **20061021163132] [Removed obsolete string functions from common.h Remko Troncon **20061021150533] [Added registrationdlg to darcs. Remko Troncon **20061021143528] [Moved StretchWidget from common.h. Remko Troncon **20061021143301] [Splitting up servicesdlg into searchdlg and registrationdlg. Remko Troncon **20061021142021] [Removing some qt3support dependencies. Remko Troncon **20061021135310] [Ported all Q3FileDialogs. Remko Troncon **20061021134311] [Refactoring + Qt4-proper port of SSLCertDlg. Remko Troncon **20061021130542] [Clear keypad modifier from key events. Remko Troncon **20061021112448] [Added workaround to force VS2005/VC8 to link. Remko Troncon **20061021104201 Thanks to Norman Rasmussen. ] [Migration of 'enter sends message' to new shortcut system. Remko Troncon **20061021093801] [Updated README. Remko Troncon **20061020160227] [Make (group)chatdlg respect shortcuts. Remko Troncon **20061020141504] [Fixed compilation problems. Remko Troncon **20061020144525] [Removed roster opacity from common.h. Remko Troncon **20061020135341] [Removed 'enter sends message' option from the UI. Remko Troncon *-20061019184833] [TAG 20061020 Remko Troncon **20061020124531] Patch bundle hash: 107ae91364a24d7e0a6af40c22184351c327e6d1