Changeset 7867 in vbox
- Timestamp:
- Apr 10, 2008 12:24:19 PM (17 years ago)
- Location:
- trunk/src/VBox/Frontends/VirtualBox4
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox4/include/VBoxFrameBuffer.h
r7610 r7867 453 453 454 454 private: 455 456 inline CGRect QRectToCGRect (const QRect &aRect) const457 {458 return CGRectMake (aRect.x(), aRect.y(), aRect.width(), aRect.height());459 }460 461 inline QRect mapYOrigin (const QRect &aRect, int aHeight) const462 {463 /* The cgcontext has a fliped y-coord relative to the464 * qt coord system. So we need some mapping here */465 return QRect (aRect.x(), aHeight - (aRect.y() + aRect.height()),466 aRect.width(), aRect.height());467 }468 455 469 456 void clean(); -
trunk/src/VBox/Frontends/VirtualBox4/include/VBoxUtils.h
r7789 r7867 197 197 # undef PAGE_SHIFT 198 198 # include <Carbon/Carbon.h> 199 200 #define AssertCarbonOSStatus(a) AssertMsg ((a) == noErr, ("Carbon OSStatus: %d\n", static_cast<int> (a))) 201 199 202 class QImage; 200 203 class QPixmap; … … 208 211 void DarwinUpdateDockPreview (VBoxFrameBuffer *aFrameBuffer, CGImageRef aOverlayImage); 209 212 OSStatus DarwinRegionHandler (EventHandlerCallRef aInHandlerCallRef, EventRef aInEvent, void *aInUserData); 213 214 inline HIViewRef mapToHIViewRef (QWidget *aWidget) 215 { 216 return HIViewRef(aWidget->winId()); 217 } 218 219 inline WindowRef mapToWindowRef (HIViewRef aViewRef) 220 { 221 return reinterpret_cast<WindowRef> (HIViewGetWindow(aViewRef)); 222 } 223 224 inline WindowRef mapToWindowRef (QWidget *aWidget) 225 { 226 return mapToWindowRef (mapToHIViewRef (aWidget)); 227 } 228 229 inline CGContextRef mapToCGContextRef (QWidget *aWidget) 230 { 231 return static_cast<CGContext *> (aWidget->macCGHandle()); 232 } 233 234 inline HIRect mapToHIRect (const QRect &aRect) 235 { 236 return CGRectMake (aRect.x(), aRect.y(), aRect.width(), aRect.height()); 237 } 238 210 239 #endif /* Q_WS_MAC */ 211 240 -
trunk/src/VBox/Frontends/VirtualBox4/src/VBoxConsoleView.cpp
r7619 r7867 714 714 #if defined (VBOX_GUI_USE_QUARTZ2D) 715 715 case VBoxDefs::Quartz2DMode: 716 /* Indicate that we are doing all 717 * drawing stuff ourself */ 718 pViewport->setAttribute (Qt::WA_PaintOnScreen); 716 719 mFrameBuf = new VBoxQuartz2DFrameBuffer (this); 717 720 break; -
trunk/src/VBox/Frontends/VirtualBox4/src/VBoxConsoleWnd.cpp
r7721 r7867 256 256 else 257 257 { 258 dbgStatisticsAction = NULL; 258 dbgStatisticsAction = NULL;osstatus 259 259 dbgCommandLineAction = NULL; 260 260 } … … 1160 1160 break; 1161 1161 } 1162 #ifdef Q_WS_MAC 1163 case QEvent::Paint: 1164 { 1165 if (mIsSeamless) 1166 { 1167 /* Clear the background */ 1168 HIRect viewRect; 1169 HIViewGetBounds (mapToHIViewRef (this), &viewRect); 1170 CGContextClearRect (mapToCGContextRef (this), viewRect); 1171 } 1172 break; 1173 } 1174 #endif 1162 1175 case StatusTipEvent::Type: 1163 1176 { … … 2106 2119 palette.setColor (centralWidget()->backgroundRole(), Qt::black); 2107 2120 centralWidget()->setPalette (palette); 2108 centralWidget()->setAutoFillBackground ( true);2121 centralWidget()->setAutoFillBackground (!aSeamless); 2109 2122 console_style = console->frameStyle(); 2110 2123 console->setFrameStyle (QFrame::NoFrame); … … 2123 2136 { 2124 2137 OSStatus status; 2125 WindowPtr WindowRef = reinterpret_cast<WindowPtr>(winId()); 2126 EventTypeSpec wNonCompositingEvent = { kEventClassWindow, kEventWindowGetRegion }; 2127 status = InstallWindowEventHandler (WindowRef, DarwinRegionHandler, GetEventTypeCount (wNonCompositingEvent), &wNonCompositingEvent, &mCurrRegion, &mDarwinRegionEventHandlerRef); 2128 Assert (status == noErr); 2129 status = ReshapeCustomWindow (WindowRef); 2130 Assert (status == noErr); 2138 HIViewRef viewRef = mapToHIViewRef (console->viewport()); 2139 Assert (VALID_PTR (viewRef)); 2140 WindowRef windowRef = mapToWindowRef (viewRef); 2141 Assert (VALID_PTR (windowRef)); 2142 /* @todo=poetzsch: Currently this isn't necessary. I should 2143 * investigate if we can/should use this. */ 2144 /* 2145 EventTypeSpec wCompositingEvent = { kEventClassWindow, kEventWindowGetRegion }; 2146 status = InstallWindowEventHandler ((WindowPtr)winId(), DarwinRegionHandler, GetEventTypeCount (wCompositingEvent), &wCompositingEvent, &mCurrRegion, &mDarwinRegionEventHandlerRef); 2147 AssertCarbonOSStatus (status); 2148 HIViewRef contentView = 0; 2149 status = HIViewFindByID(HIViewGetRoot(windowRef), kHIViewWindowContentID, &contentView); 2150 AssertCarbonOSStatus (status); 2151 EventTypeSpec drawEvent = { kEventClassControl, kEventControlDraw }; 2152 status = InstallControlEventHandler (contentView, DarwinRegionHandler, GetEventTypeCount (drawEvent), &drawEvent, &contentView, NULL); 2153 AssertCarbonOSStatus (status); 2154 */ 2131 2155 UInt32 features; 2132 status = GetWindowFeatures ( WindowRef, &features);2133 Assert (status == noErr);2156 status = GetWindowFeatures (windowRef, &features); 2157 AssertCarbonOSStatus (status); 2134 2158 if (( features & kWindowIsOpaque ) != 0) 2135 2159 { 2136 status = HIWindowChangeFeatures ( WindowRef, 0, kWindowIsOpaque);2137 Assert (status == noErr);2160 status = HIWindowChangeFeatures (windowRef, 0, kWindowIsOpaque); 2161 AssertCarbonOSStatus (status); 2138 2162 } 2139 status = SetWindowAlpha(WindowRef, 0.999); 2140 Assert (status == noErr); 2163 status = HIViewReshapeStructure (viewRef); 2164 AssertCarbonOSStatus (status); 2165 status = SetWindowAlpha(windowRef, 0.999); 2166 AssertCarbonOSStatus (status); 2141 2167 /* For now disable the shadow of the window. This feature cause errors 2142 2168 * if a window in vbox looses focus, is reselected and than moved. */ 2143 2169 /** @todo Search for an option to enable this again. A shadow on every 2144 2170 * window has a big coolness factor. */ 2145 ChangeWindowAttributes (WindowRef, kWindowNoShadowAttribute, 0); 2171 status = ChangeWindowAttributes (windowRef, kWindowNoShadowAttribute, 0); 2172 AssertCarbonOSStatus (status); 2146 2173 } 2147 2174 #else … … 2173 2200 2174 2201 #ifdef Q_WS_MAC 2175 if (!aSeamless)2176 SetSystemUIMode (kUIModeNormal, 0);2177 2178 2202 if (aSeamless) 2179 2203 { 2180 2204 /* Undo all mac specific installations */ 2181 2205 OSStatus status; 2182 WindowPtr WindowRef = reinterpret_cast<WindowPtr>(winId()); 2206 WindowRef windowRef = mapToWindowRef (this); 2207 Assert (VALID_PTR (windowRef)); 2208 /* See above. 2183 2209 status = RemoveEventHandler (mDarwinRegionEventHandlerRef); 2184 Assert (status == noErr); 2185 status = ReshapeCustomWindow (WindowRef); 2186 Assert (status == noErr); 2187 status = SetWindowAlpha (WindowRef, 1); 2188 Assert (status == noErr); 2210 AssertCarbonOSStatus (status); 2211 */ 2212 status = ReshapeCustomWindow (windowRef); 2213 AssertCarbonOSStatus (status); 2214 status = SetWindowAlpha (windowRef, 1.0); 2215 AssertCarbonOSStatus (status); 2189 2216 } 2190 2217 #endif … … 2252 2279 QRect aRect (aTargetRect); 2253 2280 mMaskShift.scale (aTargetRect.left(), aTargetRect.top(), Qt::IgnoreAspectRatio); 2254 #ifdef Q_WS_MAC2255 /* On mac os x this isn't necessary cause the screen starts2256 * by y=0 always regardless if there is the global menubar or not. */2257 aRect.setRect (aRect.left(), 0, aRect.width(), aRect.height() + aRect.top());2258 #endif // Q_WS_MAC2259 2281 /* Set the clipping mask */ 2260 2282 mStrictedRegion = aRect; … … 2713 2735 * an repaint only. All the magic clipping stuff is done 2714 2736 * in the paint engine. */ 2715 repaint();2716 // qApp->processEvents();2737 HIViewReshapeStructure (mapToHIViewRef (console->viewport())); 2738 // ReshapeCustomWindow (mapToWindowRef (this)); 2717 2739 } 2718 2740 else … … 2725 2747 if (!region.isEmpty()) 2726 2748 region |= QRect (0, 0, 1, 1); 2727 /* Save the current region for later processing in the darwin event handler. */ 2728 mCurrRegion = region; 2729 /* We repaint the screen before the ReshapeCustomWindow command. Unfortunately 2730 * this command flushes a copy of the backbuffer to the screen after the new 2731 * mask is set. This leads into a missplaced drawing of the content. Currently 2732 * no alternative to this and also this is not 100% perfect. */ 2733 repaint(); 2734 qApp->processEvents(); 2735 /* Now force the reshaping of the window. This is definitly necessary. */ 2736 ReshapeCustomWindow (reinterpret_cast <WindowPtr> (winId())); 2749 // /* Save the current region for later processing in the darwin event handler. */ 2750 // mCurrRegion = region; 2751 // /* We repaint the screen before the ReshapeCustomWindow command. Unfortunately 2752 // * this command flushes a copy of the backbuffer to the screen after the new 2753 // * mask is set. This leads into a missplaced drawing of the content. Currently 2754 // * no alternative to this and also this is not 100% perfect. */ 2755 // repaint(); 2756 // qApp->processEvents(); 2757 // /* Now force the reshaping of the window. This is definitly necessary. */ 2758 // ReshapeCustomWindow (reinterpret_cast <WindowPtr> (winId())); 2759 QMainWindow::setMask (region); 2737 2760 } 2738 2761 #else -
trunk/src/VBox/Frontends/VirtualBox4/src/VBoxFBQuartz2D.cpp
r7678 r7867 23 23 #include "VBoxProblemReporter.h" 24 24 #include "VBoxGlobal.h" 25 #include "VBoxUtils.h" 25 26 /* Needed for checking against seamless mode */ 26 27 #include "VBoxConsoleWnd.h" 27 28 #include "VBoxIChatTheaterWrapper.h" 28 29 29 /* Qt includes */ 30 #include <qapplication.h> 31 #include <q3mainwindow.h> 32 #include <qstatusbar.h> 33 //Added by qt3to4: 34 #include <QPaintEvent> 35 #include <Q3MemArray> 30 //#define COMP_WITH_SHADOW 36 31 37 32 /** @class VBoxQuartz2DFrameBuffer … … 150 145 } 151 146 152 void VBoxQuartz2DFrameBuffer::paintEvent (QPaintEvent *pe) 153 { 154 /* Some general hints at the beginning: 155 * The console is not a real sub window of the main window. There is 156 * one real mac window only. This means all the drawing on the context has 157 * to pay attention to the statusbar, the scrollbars, the shifting spacers 158 * and any frame borders. 159 * Secondly the origin of the coordinate system is differently defined in 160 * Qt and Quartz2D. In Qt the point (0, 0) means top/left where this is 161 * bottom/left in Quartz2D. Use mapYOrigin to map from Qt to Quartz2D. 162 * 163 * For debugging /Developer/Applications/Performance Tools/Quartz Debug.app 164 * is a nice tool to see which parts of the screen are updated. */ 147 void VBoxQuartz2DFrameBuffer::paintEvent (QPaintEvent *aEvent) 148 { 149 /* For debugging /Developer/Applications/Performance Tools/Quartz 150 * Debug.app is a nice tool to see which parts of the screen are 151 * updated.*/ 165 152 166 153 Assert (mImage); 167 154 168 155 QWidget *pMain = qApp->mainWidget(); 169 Assert (pMain); 170 /* Calculate the view rect to draw in */ 171 QPoint p = mView->viewport()->mapTo (pMain, QPoint (0, 0)); 172 QRect Q2DViewRect = mapYOrigin (QRect (p.x(), p.y(), mView->width(), mView->height()), pMain->height()); 173 /* We have to pay special attention to the scrollbars */ 174 // if (mView->horizontalScrollBar()->isVisible()) 175 // Q2DViewRect.setY (Q2DViewRect.y() + (mView->horizontalScrollBar()->frameSize().height() + 2)); 176 // if (mView->verticalScrollBar()->isVisible()) 177 // Q2DViewRect.setWidth (Q2DViewRect.width() - (mView->verticalScrollBar()->frameSize().width() + 2)); 178 179 /* Create the context to draw on */ 180 // WindowPtr window = static_cast <WindowPtr> (mView->viewport()->handle()); 181 // SetPortWindowPort (window); 182 CGContextRef ctx = static_cast<CGContext *> (mView->viewport()->macCGHandle()); 183 // QDBeginCGContext (GetWindowPort (window), &ctx); 156 Assert (VALID_PTR (pMain)); 157 QWidget* viewport = mView->viewport(); 158 Assert (VALID_PTR (viewport)); 159 160 HIViewRef viewRef = mapToHIViewRef (viewport); 161 Assert (VALID_PTR (viewRef)); 162 /* Get the dimensions of this HIView */ 163 HIRect viewRect; 164 HIViewGetBounds (viewRef, &viewRect); 165 /* Get the context of this window from qt */ 166 CGContextRef ctx = mapToCGContextRef (viewport); 167 Assert (VALID_PTR (ctx)); 184 168 /* We handle the seamless mode as a special case. */ 185 if ( static_cast <VBoxConsoleWnd*> (pMain)->isTrueSeamless())169 if (qobject_cast <VBoxConsoleWnd *> (pMain)->isTrueSeamless()) 186 170 { 187 171 /* Here we paint the windows without any wallpaper. … … 191 175 * Currently this subimage is the whole screen. */ 192 176 CGImageRef subImage = CGImageCreateWithImageInRect (mImage, CGRectMake (mView->contentsX(), mView->contentsY(), mView->visibleWidth(), mView->visibleHeight())); 193 Assert ( subImage);177 Assert (VALID_PTR (subImage)); 194 178 /* Clear the background (Make the rect fully transparent) */ 195 Rect winRect; 196 // GetPortBounds (GetWindowPort (window), &winRect); 197 CGContextClearRect (ctx, CGRectMake (winRect.left, winRect.top, winRect.right - winRect.left, winRect.bottom - winRect.top)); 179 CGContextClearRect (ctx, viewRect); 180 #ifdef COMP_WITH_SHADOW 181 /* Enable shadows */ 182 CGContextSetShadow (ctx, CGSizeMake (10, -10), 10); 183 CGContextBeginTransparencyLayer (ctx, NULL); 184 #endif 198 185 /* Grab the current visible region. */ 199 186 RegionRects *rgnRcts = (RegionRects *) ASMAtomicXchgPtr ((void * volatile *) &mRegion, NULL); … … 202 189 if (rgnRcts->used > 0) 203 190 { 204 /* Save state for display fliping */205 CGContextSaveGState (ctx);206 /* Flip the y-coord */207 CGContextScaleCTM (ctx, 1.0, -1.0);208 CGContextTranslateCTM (ctx, Q2DViewRect.x(), -Q2DViewRect.height() - Q2DViewRect.y());209 191 /* Add the clipping rects all at once. They are defined in 210 192 * SetVisibleRegion. */ 211 193 CGContextBeginPath (ctx); 212 194 CGContextAddRects (ctx, rgnRcts->rcts, rgnRcts->used); 213 /* Restore the context state. Note that the214 * current path isn't destroyed. */215 CGContextRestoreGState (ctx);216 195 /* Now convert the path to a clipping path. */ 217 196 CGContextClip (ctx); … … 223 202 } 224 203 /* In any case clip the drawing to the view window */ 225 CGContextClipToRect (ctx, QRectToCGRect (Q2DViewRect));204 CGContextClipToRect (ctx, viewRect); 226 205 /* At this point draw the real vm image */ 227 CGContextDrawImage (ctx, QRectToCGRect (Q2DViewRect), subImage); 206 HIViewDrawCGImage (ctx, &viewRect, subImage); 207 #ifdef COMP_WITH_SHADOW 208 CGContextEndTransparencyLayer (ctx); 209 #endif 228 210 } 229 211 else … … 233 215 /* Create a subimage of the current view in the size 234 216 * of the bounding box of the current paint event */ 235 QRect ir = pe->rect();217 QRect ir = aEvent->rect(); 236 218 QRect is = QRect (ir.x() + mView->contentsX(), ir.y() + mView->contentsY(), ir.width(), ir.height()); 237 CGImageRef subImage = CGImageCreateWithImageInRect (mImage, QRectToCGRect (is)); 238 Assert (subImage); 239 /* Flip the y-coord */ 240 CGContextScaleCTM (ctx, 1.0, -1.0); 241 CGContextTranslateCTM (ctx, Q2DViewRect.x(), -Q2DViewRect.height() - Q2DViewRect.y()); 242 219 CGImageRef subImage = CGImageCreateWithImageInRect (mImage, mapToHIRect (is)); 220 Assert (VALID_PTR (subImage)); 243 221 /* Ok, for more performance we set a clipping path of the 244 222 * regions given by this paint event. */ 245 Q3MemArray <QRect> a = pe->region().rects(); 246 // if (a.size() > 0) 247 if (0) 223 QVector<QRect> a = aEvent->region().rects(); 224 if (!a.isEmpty()) 248 225 { 249 /* Save state for display fliping */250 CGContextSaveGState (ctx);251 /* Flip the y-coord */252 226 CGContextBeginPath (ctx); 253 227 /* Add all region rects to the current context as path components */ 254 for (unsigned int i = 0; i < a.size(); ++i) 255 CGContextAddRect (ctx, QRectToCGRect (a[i])); 256 CGContextRestoreGState (ctx); 228 for (int i = 0; i < a.size(); ++i) 229 CGContextAddRect (ctx, mapToHIRect (a[i])); 257 230 /* Now convert the path to a clipping path. */ 258 231 CGContextClip (ctx); … … 260 233 261 234 /* In any case clip the drawing to the view window */ 262 CGContextClipToRect (ctx, QRectToCGRect (Q2DViewRect)); 263 /* Draw the sub image to the right position */ 264 QPoint p = mView->viewport()->mapTo (pMain, QPoint (ir.x(), ir.y())); 265 QRect cr = mapYOrigin (QRect (p.x(), p.y(), ir.width(), ir.height()), pMain->height()); 266 CGContextDrawImage (ctx, QRectToCGRect (cr), subImage); 267 } 268 // QDEndCGContext (GetWindowPort (window), &ctx); 269 } 270 /* Save for later shadow stuff ... */ 271 // CGContextSetShadow (myContext, myShadowOffset, 10); 272 // CGContextBeginTransparencyLayer (myContext, NULL); 273 // CGContextSetShadow (myContext, CGSizeMake (10, 5), 1); 274 // CGContextClipToRect (myContext, rect); 275 // QRect ir = pe->rect(); 276 // CGContextClipToRect (myContext, CGRectMake (ir.y(), ir.x(), ir.width(), ir.height())); 277 // CGContextEndTransparencyLayer (myContext); 278 279 void VBoxQuartz2DFrameBuffer::resizeEvent (VBoxResizeEvent *re) 235 CGContextClipToRect (ctx, viewRect); 236 /* At this point draw the real vm image */ 237 HIRect destRect = mapToHIRect (ir); 238 HIViewDrawCGImage (ctx, &destRect, subImage); 239 } 240 } 241 242 void VBoxQuartz2DFrameBuffer::resizeEvent (VBoxResizeEvent *aEvent) 280 243 { 281 244 #if 0 282 245 printf ("fmt=%lu, vram=%X, bpp=%lu, bpl=%lu, width=%lu, height=%lu\n", 283 re->pixelFormat(), (unsigned int)re->VRAM(),284 re->bitsPerPixel(), re->bytesPerLine(),285 re->width(), re->height());246 aEvent->pixelFormat(), (unsigned int)aEvent->VRAM(), 247 aEvent->bitsPerPixel(), aEvent->bytesPerLine(), 248 aEvent->width(), aEvent->height()); 286 249 #endif 287 250 … … 289 252 clean(); 290 253 291 mWdt = re->width();292 mHgt = re->height();254 mWdt = aEvent->width(); 255 mHgt = aEvent->height(); 293 256 294 257 bool remind = false; … … 299 262 * Mac OS X supports 16 bit also but not in the 565 mode. So we could use 300 263 * 32 bit only. */ 301 if ( re->pixelFormat() == FramebufferPixelFormat_FOURCC_RGB302 && re->bitsPerPixel() == 32)264 if ( aEvent->pixelFormat() == FramebufferPixelFormat_FOURCC_RGB 265 && aEvent->bitsPerPixel() == 32) 303 266 { 304 267 // printf ("VRAM\n"); 305 268 CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); 306 269 /* Create the image copy of the framebuffer */ 307 CGDataProviderRef dp = CGDataProviderCreateWithData (NULL, re->VRAM(), re->bitsPerPixel() / 8 * mWdt * mHgt, NULL);308 mImage = CGImageCreate (mWdt, mHgt, 8, re->bitsPerPixel(), re->bytesPerLine(), cs,270 CGDataProviderRef dp = CGDataProviderCreateWithData (NULL, aEvent->VRAM(), aEvent->bitsPerPixel() / 8 * mWdt * mHgt, NULL); 271 mImage = CGImageCreate (mWdt, mHgt, 8, aEvent->bitsPerPixel(), aEvent->bytesPerLine(), cs, 309 272 kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, dp, 0, false, 310 273 kCGRenderingIntentDefault); 311 mDataAddress = re->VRAM();274 mDataAddress = aEvent->VRAM(); 312 275 CGDataProviderRelease (dp); 313 276 } … … 348 311 // } 349 312 // }; 350 // (new RemindEvent ( re->bitsPerPixel()))->post();313 // (new RemindEvent (aEvent->bitsPerPixel()))->post(); 351 314 // } 352 315 } -
trunk/src/VBox/Frontends/VirtualBox4/src/darwin/VBoxUtils-darwin.cpp
r7412 r7867 251 251 } 252 252 253 /* Currently not used! */ 253 254 OSStatus DarwinRegionHandler (EventHandlerCallRef aInHandlerCallRef, EventRef aInEvent, void *aInUserData) 254 255 { … … 270 271 if (code == kWindowOpaqueRgn) 271 272 { 273 printf("test1\n"); 272 274 GetEventParameter (aInEvent, kEventParamRgnHandle, typeQDRgnHandle, NULL, sizeof (rgn), NULL, &rgn); 273 275 SetEmptyRgn (rgn); … … 277 279 else if (code == (kWindowStructureRgn))// || kWindowGlobalPortRgn || kWindowUpdateRgn)) 278 280 { 281 printf("test2\n"); 279 282 GetEventParameter (aInEvent, kEventParamRgnHandle, typeQDRgnHandle, NULL, sizeof (rgn), NULL, &rgn); 280 283 QRegion *pRegion = static_cast <QRegion*> (aInUserData); … … 287 290 break; 288 291 } 292 case kEventControlDraw: 293 { 294 printf("test3\n"); 295 CGContextRef ctx; 296 HIRect bounds; 297 298 GetEventParameter (aInEvent, kEventParamCGContextRef, typeCGContextRef, NULL, sizeof (ctx), NULL, &ctx); 299 HIViewGetBounds ((HIViewRef)aInUserData, &bounds); 300 301 CGContextClearRect (ctx, bounds); 302 status = noErr; 303 break; 304 } 289 305 } 290 306
Note:
See TracChangeset
for help on using the changeset viewer.