| /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ |
| /* |
| * This file is part of the Collabora Office project. |
| * |
| * This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| */ |
| |
| #include <QtInstanceWindow.hxx> |
| #include <QtInstanceWindow.moc> |
| |
| #include <vcl/qt/QtUtils.hxx> |
| |
| #include <QtGui/QWindow> |
| |
| QtInstanceWindow::QtInstanceWindow(QWidget* pWidget) |
| : QtInstanceContainer(pWidget) |
| { |
| // install event filter to handle window activation/deactivation events |
| pWidget->installEventFilter(this); |
| } |
| |
| QtInstanceWindow::~QtInstanceWindow() |
| { |
| if (m_xWindow.is()) |
| m_xWindow->clear(); |
| } |
| |
| void QtInstanceWindow::set_title(const OUString& rTitle) |
| { |
| SolarMutexGuard g; |
| QtInstance& rQtInstance = GetQtInstance(); |
| if (!rQtInstance.IsMainThread()) |
| { |
| rQtInstance.RunInMainThread([&] { set_title(rTitle); }); |
| return; |
| } |
| |
| getQWidget()->setWindowTitle(toQString(rTitle)); |
| } |
| |
| OUString QtInstanceWindow::get_title() const |
| { |
| SolarMutexGuard g; |
| QtInstance& rQtInstance = GetQtInstance(); |
| if (!rQtInstance.IsMainThread()) |
| { |
| OUString sTitle; |
| rQtInstance.RunInMainThread([&] { sTitle = get_title(); }); |
| return sTitle; |
| } |
| |
| return toOUString(getQWidget()->windowTitle()); |
| } |
| |
| void QtInstanceWindow::window_move(int, int) { assert(false && "Not implemented yet"); } |
| |
| bool QtInstanceWindow::get_resizable() const |
| { |
| SolarMutexGuard g; |
| bool bResizable = true; |
| GetQtInstance().RunInMainThread([&] { |
| const QSizePolicy aSizePolicy = getQWidget()->sizePolicy(); |
| bResizable = (aSizePolicy.horizontalPolicy() != QSizePolicy::Policy::Fixed) |
| || (aSizePolicy.verticalPolicy() != QSizePolicy::Policy::Fixed); |
| }); |
| return bResizable; |
| } |
| |
| Size QtInstanceWindow::get_size() const |
| { |
| SolarMutexGuard g; |
| |
| Size aSize; |
| GetQtInstance().RunInMainThread([&] { aSize = toSize(getQWidget()->size()); }); |
| return aSize; |
| } |
| |
| Point QtInstanceWindow::get_position() const |
| { |
| SolarMutexGuard g; |
| |
| Point aPosition; |
| GetQtInstance().RunInMainThread( |
| [&] { aPosition = toPoint(getQWidget()->geometry().topLeft()); }); |
| return aPosition; |
| } |
| |
| AbsoluteScreenPixelRectangle QtInstanceWindow::get_monitor_workarea() const |
| { |
| assert(false && "Not implemented yet"); |
| return AbsoluteScreenPixelRectangle(); |
| } |
| |
| bool QtInstanceWindow::has_toplevel_focus() const |
| { |
| SolarMutexGuard g; |
| bool bFocus; |
| GetQtInstance().RunInMainThread([&] { bFocus = QApplication::activeWindow() == getQWidget(); }); |
| return bFocus; |
| } |
| |
| void QtInstanceWindow::present() |
| { |
| SolarMutexGuard g; |
| GetQtInstance().RunInMainThread([&] { |
| if (QWindow* pWindow = getQWidget()->windowHandle()) |
| pWindow->requestActivate(); |
| }); |
| } |
| |
| void QtInstanceWindow::set_window_state(const OUString& rStr) |
| { |
| SolarMutexGuard g; |
| |
| const vcl::WindowData aData(rStr); |
| const vcl::WindowDataMask eMask = aData.mask(); |
| |
| GetQtInstance().RunInMainThread([&] { |
| QRect aGeometry = getQWidget()->geometry(); |
| if (eMask & vcl::WindowDataMask::X) |
| aGeometry.setX(aData.x()); |
| if (eMask & vcl::WindowDataMask::Y) |
| aGeometry.setY(aData.y()); |
| if (eMask & vcl::WindowDataMask::Width) |
| aGeometry.setWidth(aData.width()); |
| if (eMask & vcl::WindowDataMask::Height) |
| aGeometry.setHeight(aData.height()); |
| |
| getQWidget()->setGeometry(aGeometry); |
| |
| if (eMask & vcl::WindowDataMask::State) |
| { |
| const vcl::WindowState eState = aData.state(); |
| if (eState & vcl::WindowState::Normal) |
| getQWidget()->showNormal(); |
| else if (eState & vcl::WindowState::Maximized) |
| getQWidget()->showMaximized(); |
| else if (eState & vcl::WindowState::Minimized) |
| getQWidget()->showMinimized(); |
| } |
| }); |
| } |
| |
| OUString QtInstanceWindow::get_window_state(vcl::WindowDataMask eMask) const |
| { |
| SolarMutexGuard g; |
| |
| vcl::WindowData aData; |
| GetQtInstance().RunInMainThread([&] { |
| QRect aGeometry = getQWidget()->geometry(); |
| if (eMask & vcl::WindowDataMask::X) |
| aData.setX(aGeometry.x()); |
| if (eMask & vcl::WindowDataMask::Y) |
| aData.setY(aGeometry.y()); |
| if (eMask & vcl::WindowDataMask::Width) |
| aData.setWidth(aGeometry.width()); |
| if (eMask & vcl::WindowDataMask::Height) |
| aData.setHeight(aGeometry.height()); |
| if (eMask & vcl::WindowDataMask::State) |
| { |
| vcl::WindowState nState = vcl::WindowState::NONE; |
| if (getQWidget()->isMaximized()) |
| nState |= vcl::WindowState::Maximized; |
| else if (getQWidget()->isMinimized()) |
| nState |= vcl::WindowState::Minimized; |
| else |
| nState |= vcl::WindowState::Normal; |
| aData.setState(nState); |
| } |
| }); |
| |
| return aData.toStr(); |
| } |
| |
| css::uno::Reference<css::awt::XWindow> QtInstanceWindow::GetXWindow() |
| { |
| if (!m_xWindow.is()) |
| m_xWindow.set(new QtXWindow(this)); |
| return m_xWindow; |
| } |
| |
| SystemEnvData QtInstanceWindow::get_system_data() const |
| { |
| assert(false && "Not implemented yet"); |
| const SystemEnvData* pEnvData = nullptr; |
| |
| return *pEnvData; |
| } |
| |
| void QtInstanceWindow::resize_to_request() { queue_resize(); } |
| |
| weld::ScreenShotCollection QtInstanceWindow::collect_screenshot_data() |
| { |
| assert(false && "Not implemented yet"); |
| return weld::ScreenShotCollection(); |
| } |
| |
| VclPtr<VirtualDevice> QtInstanceWindow::screenshot() |
| { |
| SolarMutexGuard g; |
| |
| VclPtr<VirtualDevice> xOutput(VclPtr<VirtualDevice>::Create(DeviceFormat::WITHOUT_ALPHA)); |
| GetQtInstance().RunInMainThread([&] { |
| resize_to_request(); |
| |
| QImage aImage(getQWidget()->size(), QImage::Format_ARGB32); |
| getQWidget()->render(&aImage); |
| |
| xOutput->SetOutputSize(toSize(aImage.size())); |
| xOutput->DrawImage(Point(0, 0), toImage(aImage)); |
| }); |
| |
| return xOutput; |
| } |
| |
| const vcl::ICOKitNotifier* QtInstanceWindow::GetKitNotifier() { return nullptr; } |
| |
| bool QtInstanceWindow::eventFilter(QObject* pObject, QEvent* pEvent) |
| { |
| SolarMutexGuard g; |
| assert(GetQtInstance().IsMainThread()); |
| |
| if (pObject != getQWidget()) |
| return false; |
| |
| switch (pEvent->type()) |
| { |
| case QEvent::WindowActivate: |
| case QEvent::WindowDeactivate: |
| signal_container_focus_changed(); |
| return false; |
| default: |
| return QtInstanceContainer::eventFilter(pObject, pEvent); |
| } |
| } |
| |
| /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |