diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index ce33b8fc0aa25..9660bfb7ee7f2 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -316,6 +316,10 @@ IF( APPLE ) macOS/progressobserver.m) endif() + list(APPEND client_SRCS foregroundbackground_interface.h) + list(APPEND client_SRCS foregroundbackground_mac.mm) + list(APPEND client_SRCS foregroundbackground_cocoa.mm) + if(SPARKLE_FOUND AND BUILD_UPDATER) # Define this, we need to check in updater.cpp add_definitions(-DHAVE_SPARKLE) diff --git a/src/gui/foregroundbackground_cocoa.h b/src/gui/foregroundbackground_cocoa.h new file mode 100644 index 0000000000000..c21dbb75f6484 --- /dev/null +++ b/src/gui/foregroundbackground_cocoa.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) by Elsie Hupp + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#import + +/** +* @brief CocoaProcessType provides methods for moving the application between +* the background and foreground. +* @ingroup gui +*/ + +#ifndef COCOAPROCESSTYPE_H +#define COCOAPROCESSTYPE_H + +@interface CocoaProcessType : NSApplication + +/** + * @brief CocoaProcessTypeToForeground() enables the macOS menubar and dock icon, which are necessary for a maximized window to be able to exit full screen. + * @ingroup gui + */ ++ (void)ToForeground; + +/** + * @brief CocoaProcessTypeToBackground() disables the macOS menubar and dock icon, so that the application will only be present as a menubar icon. + * @ingroup gui + */ ++ (void)ToBackground; + +@end + +#endif \ No newline at end of file diff --git a/src/gui/foregroundbackground_cocoa.mm b/src/gui/foregroundbackground_cocoa.mm new file mode 100644 index 0000000000000..be790d1b9b8c6 --- /dev/null +++ b/src/gui/foregroundbackground_cocoa.mm @@ -0,0 +1,34 @@ +/* + * Copyright (C) by Elsie Hupp + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "foregroundbackground_cocoa.h" +#include "common/utility.h" + +@implementation CocoaProcessType + ++ (void)ToForeground +{ + NSApplicationLoad(); + ProcessSerialNumber processSerialNumber = { 0, kCurrentProcess }; + TransformProcessType(&processSerialNumber, kProcessTransformToForegroundApplication); +} + ++ (void)ToBackground +{ + NSApplicationLoad(); + ProcessSerialNumber processSerialNumber = { 0, kCurrentProcess }; + TransformProcessType(&processSerialNumber, kProcessTransformToUIElementApplication); +} + +@end \ No newline at end of file diff --git a/src/gui/foregroundbackground_interface.h b/src/gui/foregroundbackground_interface.h new file mode 100644 index 0000000000000..7d2f1a96f67a5 --- /dev/null +++ b/src/gui/foregroundbackground_interface.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) by Elsie Hupp + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/** +* @brief ForegroundBackgroundInterface allows ForegroundBackground to be implemented differently per platform +* @ingroup gui +*/ + +#ifndef FOREGROUNDBACKGROUND_INTERFACE_H +#define FOREGROUNDBACKGROUND_INTERFACE_H + +#include +#include + +namespace OCC { +namespace Ui { + +class ForegroundBackground; + +} +} + +class ForegroundBackground : public QObject +{ + Q_OBJECT + +public: + + ForegroundBackground() = default; + ~ForegroundBackground() = default; + + /** + * @brief EventFilter catches events that should trigger ForegroundBackground + * @ingroup gui + */ + bool eventFilter(QObject *obj, QEvent *event) override; + +private: + /** + * @brief ToForeground() enables the macOS menubar and dock icon, which are necessary for a maximized window to be able to exit full screen. + * @ingroup gui + */ + void ToForeground(); + + /** + * @brief ToBackground() disables the macOS menubar and dock icon, so that the application will only be present as a menubar icon. + * @ingroup gui + */ + void ToBackground(); +}; + +#endif \ No newline at end of file diff --git a/src/gui/foregroundbackground_mac.mm b/src/gui/foregroundbackground_mac.mm new file mode 100644 index 0000000000000..af44acf92bbba --- /dev/null +++ b/src/gui/foregroundbackground_mac.mm @@ -0,0 +1,39 @@ +/* + * Copyright (C) by Elsie Hupp + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "foregroundbackground_interface.h" +#include "foregroundbackground_cocoa.h" + +bool ForegroundBackground::eventFilter(QObject * /*obj*/, QEvent *event) +{ + if (event->type() == QEvent::Show) { + ToForeground(); + return true; + } + if (event->type() == QEvent::Close) { + ToBackground(); + return true; + } + return false; +} + +void ForegroundBackground::ToForeground() +{ + [CocoaProcessType ToForeground]; +} + +void ForegroundBackground::ToBackground() +{ + [CocoaProcessType ToBackground]; +} diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index 0f8b186fd511b..f9e6ea117672f 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -64,6 +64,10 @@ #include #include +#ifdef Q_OS_MAC +#include "foregroundbackground_interface.h" +#endif + #ifdef BUILD_FILE_PROVIDER_MODULE #include "macOS/fileprovider.h" #include "macOS/fileproviderdomainmanager.h" @@ -598,6 +602,10 @@ void ownCloudGui::slotShowSettings() if (_settingsDialog.isNull()) { _settingsDialog = new SettingsDialog(this); _settingsDialog->setAttribute(Qt::WA_DeleteOnClose, true); +#ifdef Q_OS_MAC + auto *fgbg = new ForegroundBackground(); + _settingsDialog->installEventFilter(fgbg); +#endif _settingsDialog->show(); } raiseDialog(_settingsDialog.data()); diff --git a/src/gui/wizard/owncloudwizard.cpp b/src/gui/wizard/owncloudwizard.cpp index 238286aa0accd..f09c52fcaf155 100644 --- a/src/gui/wizard/owncloudwizard.cpp +++ b/src/gui/wizard/owncloudwizard.cpp @@ -19,6 +19,10 @@ #include "theme.h" #include "owncloudgui.h" +#ifdef Q_OS_MAC +#include "foregroundbackground_interface.h" +#endif + #include "wizard/owncloudwizard.h" #include "wizard/welcomepage.h" #include "wizard/owncloudsetuppage.h" @@ -56,6 +60,10 @@ OwncloudWizard::OwncloudWizard(QWidget *parent) , _webViewPage(nullptr) #endif // WITH_WEBENGINE { +#ifdef Q_OS_MAC + auto *fgbg = new ForegroundBackground(); + this->installEventFilter(fgbg); +#endif setObjectName("owncloudWizard"); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);