void LocalUpdateHandler::extract(UpdateContainer *updateContainer) { { AutoLock al(&m_fbLocMut); Rect copyRect; Point copySrc; m_copyRectDetector.detectWindowMovements(©Rect, ©Src); { AutoLock al(m_updateKeeper); m_updateKeeper->addCopyRect(©Rect, ©Src); m_updateKeeper->extract(updateContainer); } updateVideoRegion(); updateContainer->videoRegion = m_vidRegion; // Constrain the video region to the current frame buffer border. Region fbRect(&m_backupFrameBuffer.getDimension().getRect()); updateContainer->videoRegion.intersect(&fbRect); m_updateFilter->filter(updateContainer); if (!m_absoluteRect.isEmpty()) { updateContainer->changedRegion.addRect(&m_screenDriver->getScreenBuffer()-> getDimension().getRect()); m_absoluteRect.clear(); } // Checking for screen properties changing or frame buffers differ if (m_screenDriver->getPropertiesChanged() || !m_backupFrameBuffer.isEqualTo(m_screenDriver->getScreenBuffer())) { if (m_screenDriver->getScreenSizeChanged()) { updateContainer->screenSizeChanged = true; } m_screenDriver->applyNewProperties(); m_backupFrameBuffer.clone(m_screenDriver->getScreenBuffer()); updateContainer->changedRegion.clear(); updateContainer->copiedRegion.clear(); m_absoluteRect = m_backupFrameBuffer.getDimension().getRect(); m_updateKeeper->setBorderRect(&m_absoluteRect); } } // Cursor position must always be present. updateContainer->cursorPos = m_mouseDetector->getCursorPos(); // Checking for mouse shape changing if (updateContainer->cursorShapeChanged || m_fullUpdateRequested) { // Update cursor shape AutoLock al(&m_mouseGrabLocMut); m_mouseGrabber.grab(&m_backupFrameBuffer.getPixelFormat()); // Store cursor shape m_cursorShape.clone(m_mouseGrabber.getCursorShape()); m_fullUpdateRequested = false; } }
TWindow::TWindow(int32 pixelCount) : BWindow(BRect(0, 0, 0, 0), B_TRANSLATE_SYSTEM_NAME("Magnify"), B_TITLED_WINDOW, B_OUTLINE_RESIZE) { GetPrefs(pixelCount); // add info view BRect infoRect(Bounds()); infoRect.InsetBy(-1, -1); fInfo = new TInfoView(infoRect); AddChild(fInfo); fFontHeight = FontHeight(fInfo, true); fInfoHeight = (fFontHeight * 2) + (3 * 5); BRect fbRect(0, 0, (fHPixelCount*fPixelSize), (fHPixelCount*fPixelSize)); if (InfoIsShowing()) fbRect.OffsetBy(10, fInfoHeight); fFatBits = new TMagnify(fbRect, this); fInfo->AddChild(fFatBits); fFatBits->SetSelection(fShowInfo); fInfo->SetMagView(fFatBits); ResizeWindow(fHPixelCount, fVPixelCount); UpdateInfoBarOnResize(); AddShortcut('S', B_COMMAND_KEY, new BMessage(msg_save)); AddShortcut('C', B_COMMAND_KEY, new BMessage(msg_copy_image)); AddShortcut('T', B_COMMAND_KEY, new BMessage(msg_show_info)); AddShortcut('H', B_COMMAND_KEY, new BMessage(msg_add_cross_hair)); AddShortcut('H', B_SHIFT_KEY, new BMessage(msg_remove_cross_hair)); AddShortcut('G', B_COMMAND_KEY, new BMessage(msg_toggle_grid)); AddShortcut('F', B_COMMAND_KEY, new BMessage(msg_freeze)); AddShortcut('I', B_COMMAND_KEY, new BMessage(msg_stick)); AddShortcut('-', B_COMMAND_KEY, new BMessage(msg_shrink)); AddShortcut('=', B_COMMAND_KEY, new BMessage(msg_grow)); AddShortcut('/', B_COMMAND_KEY, new BMessage(msg_make_square)); AddShortcut(',', B_COMMAND_KEY, new BMessage(msg_shrink_pixel)); AddShortcut('.', B_COMMAND_KEY, new BMessage(msg_grow_pixel)); }
void UpdateHandlerImpl::extract(UpdateContainer *updateContainer) { Rect copyRect; Point copySrc; m_screenDriver->getCopiedRegion(©Rect, ©Src); { AutoLock al(&m_updateKeeper); // The following operations should be atomic m_updateKeeper.addCopyRect(©Rect, ©Src); m_updateKeeper.extract(updateContainer); } // Note: The getVideoRegion() function is not a thread safe function, but it invokes // only from this one place and so that is why it does not cover by the mutex. m_screenDriver->getVideoRegion(&updateContainer->videoRegion); // Constrain the video region to the current frame buffer border. Region fbRect(&m_backupFrameBuffer.getDimension().getRect()); updateContainer->videoRegion.intersect(&fbRect); updateContainer->videoRegion.intersect(&fbRect); m_updateFilter->filter(updateContainer); if (!m_absoluteRect.isEmpty()) { updateContainer->changedRegion.addRect(&m_screenDriver->getScreenBuffer()-> getDimension().getRect()); m_absoluteRect.clear(); } // Checking for screen properties changing or frame buffers differ if (m_screenDriver->getScreenPropertiesChanged() || !m_backupFrameBuffer.isEqualTo(m_screenDriver->getScreenBuffer())) { Dimension currentDimension = m_backupFrameBuffer.getDimension(); Dimension newDimension = m_screenDriver->getScreenDimension(); if (m_screenDriver->getScreenSizeChanged() || !currentDimension.isEqualTo(&newDimension)) { updateContainer->screenSizeChanged = true; } applyNewScreenProperties(); { // Only this place the class provides frame buffer changings, and then why it // must be under the mutex. Getters for the backup frame buffer in here (at this function) // can work without the mutex, but other getters for the frame buffer in other places // may be invoked from other threads and then it shall cover by the mutex. AutoLock al(&m_fbLocMut); m_backupFrameBuffer.clone(m_screenDriver->getScreenBuffer()); } updateContainer->changedRegion.clear(); updateContainer->copiedRegion.clear(); m_absoluteRect = m_backupFrameBuffer.getDimension().getRect(); m_updateKeeper.setBorderRect(&m_absoluteRect); } // Cursor position must always be present. updateContainer->cursorPos = m_screenDriver->getCursorPosition(); // Checking for mouse shape changing if (updateContainer->cursorShapeChanged || m_fullUpdateRequested) { // Update cursor shape m_screenDriver->grabCursorShape(&m_backupFrameBuffer.getPixelFormat()); // Store cursor shape m_cursorShape.clone(m_screenDriver->getCursorShape()); m_fullUpdateRequested = false; } }
void LLNavigationBar::showFavoritesPanel(BOOL visible) { bool npVisible = gSavedSettings.getBOOL("ShowNavbarNavigationPanel"); LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite"); LLRect nbRect(getRect()); LLRect fbRect(fb->getRect()); if (visible) { if (npVisible) { // Favorites Panel must be shown. Navigation Panel is visible. S32 fbHeight = fbRect.getHeight(); S32 newHeight = nbRect.getHeight() + fbHeight; nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight); fbRect.setLeftTopAndSize(mDefaultFpRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight()); } else { // Favorites Panel must be shown. Navigation Panel is hidden. S32 fpHeight = mDefaultFpRect.getHeight(); nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight); fbRect.setLeftTopAndSize(fbRect.mLeft, fpHeight, fbRect.getWidth(), fpHeight); } reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); fb->reshape(fbRect.getWidth(), fbRect.getHeight()); fb->setRect(fbRect); } else { if (npVisible) { // Favorites Panel must be hidden. Navigation Panel is visible. S32 fbHeight = fbRect.getHeight(); S32 newHeight = nbRect.getHeight() - fbHeight; nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight); } else { // Favorites Panel must be hidden. Navigation Panel is hidden. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0); } reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); } childSetVisible("bg_icon", visible); childSetVisible("bg_icon_no_fav", !visible); fb->setVisible(visible); }
void LLNavigationBar::showNavigationPanel(BOOL visible) { bool fpVisible = gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"); LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite"); LLPanel* navPanel = getChild<LLPanel>("navigation_panel"); LLRect nbRect(getRect()); LLRect fbRect(fb->getRect()); navPanel->setVisible(visible); if (visible) { if (fpVisible) { // Navigation Panel must be shown. Favorites Panel is visible. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), mDefaultNbRect.getHeight()); fbRect.setLeftTopAndSize(fbRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight()); // this is duplicated in 'else' section because it should be called BEFORE fb->reshape reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); // propagate size to parent container getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); fb->reshape(fbRect.getWidth(), fbRect.getHeight()); fb->setRect(fbRect); } else { // Navigation Panel must be shown. Favorites Panel is hidden. S32 height = mDefaultNbRect.getHeight() - mDefaultFpRect.getHeight(); nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), height); reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); } } else { if (fpVisible) { // Navigation Panel must be hidden. Favorites Panel is visible. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fbRect.getHeight()); fbRect.setLeftTopAndSize(fbRect.mLeft, fbRect.getHeight(), fbRect.getWidth(), fbRect.getHeight()); // this is duplicated in 'else' section because it should be called BEFORE fb->reshape reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); fb->reshape(fbRect.getWidth(), fbRect.getHeight()); fb->setRect(fbRect); } else { // Navigation Panel must be hidden. Favorites Panel is hidden. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0); reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); } } childSetVisible("bg_icon", fpVisible); childSetVisible("bg_icon_no_fav", !fpVisible); }