1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_vcl.hxx" 26 27 #include "aqua/saldata.hxx" 28 #include "aqua/salnsmenu.h" 29 #include "aqua/salinst.h" 30 31 #import "apple_remote/RemoteMainController.h" 32 33 oslThreadKey SalData::s_aAutoReleaseKey = 0; 34 35 static void SAL_CALL releasePool( void* pPool ) 36 { 37 if( pPool ) 38 [(NSAutoreleasePool*)pPool release]; 39 } 40 41 SalData::SalData() 42 : 43 mpTimerProc( NULL ), 44 mpFirstInstance( NULL ), 45 mpFirstObject( NULL ), 46 mpFirstVD( NULL ), 47 mpFirstPrinter( NULL ), 48 mpFontList( NULL ), 49 mpStatusItem( nil ), 50 mxRGBSpace( CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB) ), 51 mxGraySpace( CGColorSpaceCreateWithName(kCGColorSpaceGenericGray) ), 52 mxP50Space( NULL ), 53 mxP50Pattern( NULL ), 54 maCursors( POINTER_COUNT, INVALID_CURSOR_PTR ), 55 mbIsScrollbarDoubleMax( false ), 56 mnSystemVersion( VER_TIGER ), 57 mpMainController( NULL ), 58 mpDockIconClickHandler( nil ), 59 mnDPIX( 0 ), 60 mnDPIY( 0 ) 61 { 62 if( s_aAutoReleaseKey == 0 ) 63 s_aAutoReleaseKey = osl_createThreadKey( releasePool ); 64 } 65 66 SalData::~SalData() 67 { 68 CGPatternRelease( mxP50Pattern ); 69 CGColorSpaceRelease( mxP50Space ); 70 CGColorSpaceRelease( mxRGBSpace ); 71 CGColorSpaceRelease( mxGraySpace ); 72 for( unsigned int i = 0; i < maCursors.size(); i++ ) 73 { 74 NSCursor* pCurs = maCursors[i]; 75 if( pCurs && pCurs != INVALID_CURSOR_PTR ) 76 [pCurs release]; 77 } 78 if( s_aAutoReleaseKey ) 79 { 80 // release the last pool 81 NSAutoreleasePool* pPool = nil; 82 pPool = reinterpret_cast<NSAutoreleasePool*>( osl_getThreadKeyData( s_aAutoReleaseKey ) ); 83 if( pPool ) 84 { 85 osl_setThreadKeyData( s_aAutoReleaseKey, NULL ); 86 [pPool release]; 87 } 88 89 osl_destroyThreadKey( s_aAutoReleaseKey ); 90 s_aAutoReleaseKey = 0; 91 } 92 if ( mpMainController ) 93 [mpMainController release]; 94 } 95 96 void SalData::ensureThreadAutoreleasePool() 97 { 98 NSAutoreleasePool* pPool = nil; 99 if( s_aAutoReleaseKey ) 100 { 101 pPool = reinterpret_cast<NSAutoreleasePool*>( osl_getThreadKeyData( s_aAutoReleaseKey ) ); 102 if( ! pPool ) 103 { 104 pPool = [[NSAutoreleasePool alloc] init]; 105 osl_setThreadKeyData( s_aAutoReleaseKey, pPool ); 106 } 107 } 108 else 109 { 110 DBG_ERROR( "no autorelease key" ); 111 } 112 } 113 114 void SalData::drainThreadAutoreleasePool() 115 { 116 NSAutoreleasePool* pPool = nil; 117 if( s_aAutoReleaseKey ) 118 { 119 pPool = reinterpret_cast<NSAutoreleasePool*>( osl_getThreadKeyData( s_aAutoReleaseKey ) ); 120 if( pPool ) 121 { 122 // osl_setThreadKeyData( s_aAutoReleaseKey, NULL ); 123 // [pPool release]; 124 [pPool drain]; 125 } 126 else 127 { 128 pPool = [[NSAutoreleasePool alloc] init]; 129 osl_setThreadKeyData( s_aAutoReleaseKey, pPool ); 130 } 131 } 132 else 133 { 134 DBG_ERROR( "no autorelease key" ); 135 } 136 } 137 138 139 struct curs_ent 140 { 141 const char* pBaseName; 142 const NSPoint aHotSpot; 143 } 144 const aCursorTab[ POINTER_COUNT ] = 145 { 146 { NULL, { 0, 0 } }, //POINTER_ARROW 147 { "nullptr", { 16, 16 } }, //POINTER_NULL 148 { "hourglass", { 15, 15 } }, //POINTER_WAIT 149 { NULL, { 0, 0 } }, //POINTER_TEXT 150 { "help", { 0, 0 } }, //POINTER_HELP 151 { NULL, { 0, 0 } }, //POINTER_CROSS 152 { NULL, { 0, 0 } }, //POINTER_MOVE 153 { NULL, { 0, 0 } }, //POINTER_NSIZE 154 { NULL, { 0, 0 } }, //POINTER_SSIZE 155 { NULL, { 0, 0 } }, //POINTER_WSIZE 156 { NULL, { 0, 0 } }, //POINTER_ESIZE 157 { "nwsesize", { 15, 15 } }, //POINTER_NWSIZE 158 { "neswsize", { 15, 15 } }, //POINTER_NESIZE 159 { "neswsize", { 15, 15 } }, //POINTER_SWSIZE 160 { "nwsesize", { 15, 15 } }, //POINTER_SESIZE 161 { NULL, { 0, 0 } }, //POINTER_WINDOW_NSIZE 162 { NULL, { 0, 0 } }, //POINTER_WINDOW_SSIZE 163 { NULL, { 0, 0 } }, //POINTER_WINDOW_WSIZE 164 { NULL, { 0, 0 } }, //POINTER_WINDOW_ESIZE 165 { "nwsesize", { 15, 15 } }, //POINTER_WINDOW_NWSIZE 166 { "neswsize", { 15, 15 } }, //POINTER_WINDOW_NESIZE 167 { "neswsize", { 15, 15 } }, //POINTER_WINDOW_SWSIZE 168 { "nwsesize", { 15, 15 } }, //POINTER_WINDOW_SESIZE 169 { NULL, { 0, 0 } }, //POINTER_HSPLIT 170 { NULL, { 0, 0 } }, //POINTER_VSPLIT 171 { NULL, { 0, 0 } }, //POINTER_HSIZEBAR 172 { NULL, { 0, 0 } }, //POINTER_VSIZEBAR 173 { NULL, { 0, 0 } }, //POINTER_HAND 174 { NULL, { 0, 0 } }, //POINTER_REFHAND 175 { "pen", { 3, 27 } }, //POINTER_PEN 176 { "magnify", { 12, 13 } }, //POINTER_MAGNIFY 177 { "fill", { 10, 22 } }, //POINTER_FILL 178 { "rotate", { 15, 15 } }, //POINTER_ROTATE 179 { "hshear", { 15, 15 } }, //POINTER_HSHEAR 180 { "vshear", { 15, 15 } }, //POINTER_VSHEAR 181 { "mirror", { 14, 12 } }, //POINTER_MIRROR 182 { "crook", { 15, 14 } }, //POINTER_CROOK 183 { "crop", { 9, 9 } }, //POINTER_CROP 184 { "movept", { 0, 0 } }, //POINTER_MOVEPOINT 185 { "movebw", { 0, 0 } }, //POINTER_MOVEBEZIERWEIGHT 186 { "movedata", { 0, 0 } }, //POINTER_MOVEDATA 187 { "copydata", { 0, 0 } }, //POINTER_COPYDATA 188 { "linkdata", { 0, 0 } }, //POINTER_LINKDATA 189 { "movedlnk", { 0, 0 } }, //POINTER_MOVEDATALINK 190 { "copydlnk", { 0, 0 } }, //POINTER_COPYDATALINK 191 { "movef", { 8, 8 } }, //POINTER_MOVEFILE 192 { "copyf", { 8, 8 } }, //POINTER_COPYFILE 193 { "linkf", { 8, 8 } }, //POINTER_LINKFILE 194 { "moveflnk", { 8, 8 } }, //POINTER_MOVEFILELINK 195 { "copyflnk", { 8, 8 } }, //POINTER_COPYFILELINK 196 { "movef2", { 7, 8 } }, //POINTER_MOVEFILES 197 { "copyf2", { 7, 8 } }, //POINTER_COPYFILES 198 { "notallow", { 15, 15 } }, //POINTER_NOTALLOWED 199 { "dline", { 8, 8 } }, //POINTER_DRAW_LINE 200 { "drect", { 8, 8 } }, //POINTER_DRAW_RECT 201 { "dpolygon", { 8, 8 } }, //POINTER_DRAW_POLYGON 202 { "dbezier", { 8, 8 } }, //POINTER_DRAW_BEZIER 203 { "darc", { 8, 8 } }, //POINTER_DRAW_ARC 204 { "dpie", { 8, 8 } }, //POINTER_DRAW_PIE 205 { "dcirccut", { 8, 8 } }, //POINTER_DRAW_CIRCLECUT 206 { "dellipse", { 8, 8 } }, //POINTER_DRAW_ELLIPSE 207 { "dfree", { 8, 8 } }, //POINTER_DRAW_FREEHAND 208 { "dconnect", { 8, 8 } }, //POINTER_DRAW_CONNECT 209 { "dtext", { 8, 8 } }, //POINTER_DRAW_TEXT 210 { "dcapt", { 8, 8 } }, //POINTER_DRAW_CAPTION 211 { "chart", { 15, 16 } }, //POINTER_CHART 212 { "detectiv", { 12, 13 } }, //POINTER_DETECTIVE 213 { "pivotcol", { 7, 5 } }, //POINTER_PIVOT_COL 214 { "pivotrow", { 8, 7 } }, //POINTER_PIVOT_ROW 215 { "pivotfld", { 8, 7 } }, //POINTER_PIVOT_FIELD 216 { "chain", { 0, 2 } }, //POINTER_CHAIN 217 { "chainnot", { 2, 2 } }, //POINTER_CHAIN_NOTALLOWED 218 { "timemove", { 16, 16 } }, //POINTER_TIMEEVENT_MOVE 219 { "timesize", { 16, 17 } }, //POINTER_TIMEEVENT_SIZE 220 { "asn", { 16, 12 } }, //POINTER_AUTOSCROLL_N 221 { "ass", { 15, 19 } }, //POINTER_AUTOSCROLL_S 222 { "asw", { 12, 15 } }, //POINTER_AUTOSCROLL_W 223 { "ase", { 19, 16 } }, //POINTER_AUTOSCROLL_E 224 { "asnw", { 10, 10 } }, //POINTER_AUTOSCROLL_NW 225 { "asne", { 21, 10 } }, //POINTER_AUTOSCROLL_NE 226 { "assw", { 21, 21 } }, //POINTER_AUTOSCROLL_SW 227 { "asse", { 21, 21 } }, //POINTER_AUTOSCROLL_SE 228 { "asns", { 15, 15 } }, //POINTER_AUTOSCROLL_NS 229 { "aswe", { 15, 15 } }, //POINTER_AUTOSCROLL_WE 230 { "asnswe", { 15, 15 } }, //POINTER_AUTOSCROLL_NSWE 231 { "airbrush", { 5, 22 } }, //POINTER_AIRBRUSH 232 { "vtext", { 15, 15 } }, //POINTER_TEXT_VERTICAL 233 { "pivotdel", { 18, 15 } }, //POINTER_PIVOT_DELETE 234 { "tblsels", { 15, 30 } }, //POINTER_TAB_SELECT_S 235 { "tblsele", { 30, 16 } }, //POINTER_TAB_SELECT_E 236 { "tblselse", { 30, 30 } }, //POINTER_TAB_SELECT_SE 237 { "tblselw", { 1, 16 } }, //POINTER_TAB_SELECT_W 238 { "tblselsw", { 1, 30 } }, //POINTER_TAB_SELECT_SW 239 { "pntbrsh", { 9, 16 } } //POINTER_PAINTBRUSH 240 }; 241 242 NSCursor* SalData::getCursor( PointerStyle i_eStyle ) 243 { 244 if( i_eStyle >= POINTER_COUNT ) 245 return nil; 246 247 NSCursor* pCurs = maCursors[ i_eStyle ]; 248 if( pCurs == INVALID_CURSOR_PTR ) 249 { 250 pCurs = nil; 251 if( aCursorTab[ i_eStyle ].pBaseName ) 252 { 253 NSPoint aHotSpot = aCursorTab[ i_eStyle ].aHotSpot; 254 CFStringRef pCursorName = 255 CFStringCreateWithCStringNoCopy( 256 kCFAllocatorDefault, 257 aCursorTab[ i_eStyle ].pBaseName, 258 kCFStringEncodingASCII, 259 kCFAllocatorNull ); 260 CFBundleRef hMain = CFBundleGetMainBundle(); 261 CFURLRef hURL = CFBundleCopyResourceURL( hMain, pCursorName, CFSTR("png"), CFSTR("cursors") ); 262 if( hURL ) 263 { 264 pCurs = [[NSCursor alloc] initWithImage: [[NSImage alloc] initWithContentsOfURL: (NSURL*)hURL] hotSpot: aHotSpot]; 265 CFRelease( hURL ); 266 } 267 CFRelease( pCursorName ); 268 } 269 maCursors[ i_eStyle ] = pCurs; 270 } 271 return pCurs; 272 } 273 274 NSStatusItem* SalData::getStatusItem() 275 { 276 SalData* pData = GetSalData(); 277 if( ! pData->mpStatusItem ) 278 { 279 NSStatusBar* pStatBar =[NSStatusBar systemStatusBar]; 280 if( pStatBar ) 281 { 282 pData->mpStatusItem = [pStatBar statusItemWithLength: NSVariableStatusItemLength]; 283 [pData->mpStatusItem retain]; 284 OOStatusItemView* pView = [[OOStatusItemView alloc] init]; 285 [pData->mpStatusItem setView: pView ]; 286 [pView display]; 287 } 288 } 289 return pData->mpStatusItem; 290 } 291