00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <QApplication>
00029
00030 #include "trayicon_mac.h"
00031
00032
00033
00034 TrayIconImpl::TrayIconImpl()
00035 {
00036 setObjectName("trayiconimpl");
00037 _imageRef = 0;
00038 _shown = false;
00039 }
00040
00041
00042 TrayIconImpl::~TrayIconImpl()
00043 {
00044 if (_shown) {
00045 hide();
00046 }
00047 if (_imageRef) {
00048 CGImageRelease(_imageRef);
00049 }
00050 }
00051
00052
00053 void
00054 TrayIconImpl::releaseCallback(void *info, const void *data, size_t size)
00055 {
00056 Q_UNUSED(info);
00057 Q_UNUSED(size);
00058 free((void*)data);
00059 }
00060
00061
00062 CGImageRef
00063 TrayIconImpl::createIconFromFile(FSSpec fileSpec)
00064 {
00065 CGDataProviderRef provider = NULL;
00066 CGImageRef image = NULL;
00067 IconFamilyHandle iconFamily;
00068
00069
00070 if (ReadIconFile(&fileSpec, &iconFamily) == noErr) {
00071 int size = 128 * 128 * 4;
00072 Handle rawBitmapdata = NewHandle(size);
00073 GetIconFamilyData(iconFamily, kThumbnail32BitData, rawBitmapdata);
00074
00075 Handle rawMaskdata = NewHandle(128 * 128);
00076 GetIconFamilyData(iconFamily, kThumbnail8BitMask, rawMaskdata);
00077
00078 char *data = (char *)malloc(size);
00079 HLock(rawBitmapdata);
00080 HLock(rawMaskdata);
00081
00082
00083 const char *mask = (const char*) *rawMaskdata;
00084 const char *from = (const char*) *rawBitmapdata;
00085 char *to = data;
00086
00087 for (int i= 0; i < 128*128; i++) {
00088 from++;
00089 *to++ = *mask++;
00090 *to++ = *from++;
00091 *to++ = *from++;
00092 *to++ = *from++;
00093 }
00094 HUnlock(rawBitmapdata);
00095 HUnlock(rawMaskdata);
00096
00097 DisposeHandle(rawBitmapdata);
00098 DisposeHandle(rawMaskdata);
00099
00100 provider = CGDataProviderCreateWithData(NULL, data, size, releaseCallback);
00101 CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
00102
00103 image = CGImageCreate(128,
00104 128,
00105 8,
00106 32,
00107 4 * 128,
00108 cs,
00109 kCGImageAlphaFirst,
00110 provider,
00111 NULL,
00112 0,
00113 kCGRenderingIntentDefault);
00114
00115 CGColorSpaceRelease(cs);
00116 CGDataProviderRelease(provider);
00117 }
00118 return image;
00119 }
00120
00121
00122 CGImageRef
00123 TrayIconImpl::createIcon(const QString &iconFile)
00124 {
00125 FSRef ref;
00126 CGImageRef image = NULL;
00127
00128
00129 CFStringRef iconFileRef = CFStringCreateWithCString(NULL, qPrintable(iconFile),
00130 kCFStringEncodingASCII);
00131 if (!iconFileRef) {
00132 return NULL;
00133 }
00134
00135
00136 CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(),
00137 iconFileRef, CFSTR("icns"), NULL);
00138 if (!url) {
00139 return NULL;
00140 }
00141
00142
00143 if (CFURLGetFSRef(url, &ref)) {
00144 FSSpec fileSpec;
00145 if (FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL,
00146 NULL, &fileSpec, NULL) == noErr) {
00147
00148 image = createIconFromFile(fileSpec);
00149 }
00150 }
00151 CFRelease(iconFileRef);
00152 CFRelease(url);
00153 return image;
00154 }
00155
00156
00157 void
00158 TrayIconImpl::show()
00159 {
00160 if (_imageRef) {
00161 CGContextRef ctxRef = BeginCGContextForApplicationDockTile();
00162 if (!ctxRef) {
00163 return;
00164 }
00165 SetApplicationDockTileImage(_imageRef);
00166 EndCGContextForApplicationDockTile(ctxRef);
00167
00168 _shown = true;
00169 }
00170 }
00171
00172
00173 void
00174 TrayIconImpl::hide()
00175 {
00176 _shown = false;
00177
00178 CGContextRef ctxRef = BeginCGContextForApplicationDockTile();
00179 if (!ctxRef) {
00180 return;
00181 }
00182 RestoreApplicationDockTileImage();
00183 EndCGContextForApplicationDockTile(ctxRef);
00184 }
00185
00186
00187 void
00188 TrayIconImpl::setToolTip(const QString &toolTip)
00189 {
00190
00191 Q_UNUSED(toolTip);
00192 }
00193
00194
00195 void
00196 TrayIconImpl::setIcon(const QString &iconFile)
00197 {
00198
00199 if (_imageRef) {
00200 CGImageRelease(_imageRef);
00201 _imageRef = 0;
00202 }
00203
00204
00205 _imageRef = createIcon(iconFile);
00206
00207
00208 if (_imageRef && _shown) {
00209 show();
00210 }
00211 }
00212