Show/Hide Menubar and Dock Icon

Signed-off-by: Elsie Hupp <9206310+elsiehupp@users.noreply.github.com>
This commit is contained in:
Elsie Hupp 2021-05-08 11:56:42 -04:00 committed by Matthieu Gallien
parent 5bdc2b911d
commit de55ae9b5e
7 changed files with 198 additions and 0 deletions

View file

@ -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)

View file

@ -0,0 +1,42 @@
/*
* Copyright (C) by Elsie Hupp <gpl at elsiehupp dot com>
*
* 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 <AppKit/NSApplication.h>
/**
* @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

View file

@ -0,0 +1,34 @@
/*
* Copyright (C) by Elsie Hupp <gpl at elsiehupp dot com>
*
* 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

View file

@ -0,0 +1,63 @@
/*
* Copyright (C) by Elsie Hupp <gpl at elsiehupp dot com>
*
* 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 <QObject>
#include <QEvent>
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

View file

@ -0,0 +1,39 @@
/*
* Copyright (C) by Elsie Hupp <gpl at elsiehupp dot com>
*
* 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];
}

View file

@ -64,6 +64,10 @@
#include <QQuickItem>
#include <QQmlContext>
#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());

View file

@ -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);