예제 #1
0
void LocalUpdateHandler::extract(UpdateContainer *updateContainer)
{
  {
    AutoLock al(&m_fbLocMut);
    Rect copyRect;
    Point copySrc;
    m_copyRectDetector.detectWindowMovements(&copyRect, &copySrc);

    {
      AutoLock al(m_updateKeeper);
      m_updateKeeper->addCopyRect(&copyRect, &copySrc);
      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;
  }
}
예제 #2
0
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));
}
예제 #3
0
void UpdateHandlerImpl::extract(UpdateContainer *updateContainer)
{
  Rect copyRect;
  Point copySrc;
  m_screenDriver->getCopiedRegion(&copyRect, &copySrc);

  {
    AutoLock al(&m_updateKeeper); // The following operations should be atomic
    m_updateKeeper.addCopyRect(&copyRect, &copySrc);
    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);
}