Add "Send File via KDE Connect" Finder integration on macOS
This commit is contained in:
parent
fca66244ab
commit
b57a321632
5 changed files with 161 additions and 1 deletions
|
@ -13,7 +13,7 @@ ecm_add_app_icon(indicator_SRCS ICONS
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
list(APPEND indicator_SRCS indicatorhelper_win.cpp)
|
list(APPEND indicator_SRCS indicatorhelper_win.cpp)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
list(APPEND indicator_SRCS indicatorhelper_mac.cpp)
|
list(APPEND indicator_SRCS indicatorhelper_mac.cpp serviceregister_mac.mm)
|
||||||
else ()
|
else ()
|
||||||
list(APPEND indicator_SRCS indicatorhelper.cpp)
|
list(APPEND indicator_SRCS indicatorhelper.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
@ -26,6 +26,8 @@ if (WIN32)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
|
# Apple frameworks
|
||||||
|
target_link_libraries(kdeconnect-indicator "-framework AppKit")
|
||||||
# Apple app package
|
# Apple app package
|
||||||
set_target_properties(kdeconnect-indicator PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
set_target_properties(kdeconnect-indicator PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
||||||
set_target_properties(kdeconnect-indicator PROPERTIES
|
set_target_properties(kdeconnect-indicator PROPERTIES
|
||||||
|
|
|
@ -34,5 +34,38 @@
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
<string>True</string>
|
<string>True</string>
|
||||||
|
<key>NSServices</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSBackgroundColorName</key>
|
||||||
|
<string>background</string>
|
||||||
|
<key>NSIconName</key>
|
||||||
|
<string>NSActionTemplate</string>
|
||||||
|
<key>NSMenuItem</key>
|
||||||
|
<dict>
|
||||||
|
<key>default</key>
|
||||||
|
<string>Send File via KDE Connect</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSMessage</key>
|
||||||
|
<string>sendViaKDEConnect</string>
|
||||||
|
<key>NSPortName</key>
|
||||||
|
<string>SendViaKDEConnect</string>
|
||||||
|
<key>NSRequiredContext</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSApplicationIdentifier</key>
|
||||||
|
<string>com.apple.finder</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSRequiredContext</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSTextContent</key>
|
||||||
|
<string>FilePath</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSSendTypes</key>
|
||||||
|
<array>
|
||||||
|
<string>NSFilenamesPboardType</string>
|
||||||
|
<string>public.plain-text</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
@ -32,9 +32,12 @@
|
||||||
|
|
||||||
#include "indicatorhelper.h"
|
#include "indicatorhelper.h"
|
||||||
|
|
||||||
|
#include "serviceregister_mac.h"
|
||||||
|
|
||||||
IndicatorHelper::IndicatorHelper()
|
IndicatorHelper::IndicatorHelper()
|
||||||
{
|
{
|
||||||
|
registerServices();
|
||||||
|
|
||||||
QIcon kdeconnectIcon = QIcon::fromTheme(QStringLiteral("kdeconnect"));
|
QIcon kdeconnectIcon = QIcon::fromTheme(QStringLiteral("kdeconnect"));
|
||||||
QPixmap splashPixmap(kdeconnectIcon.pixmap(256, 256));
|
QPixmap splashPixmap(kdeconnectIcon.pixmap(256, 256));
|
||||||
|
|
||||||
|
|
26
indicator/serviceregister_mac.h
Normal file
26
indicator/serviceregister_mac.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Weixuan XIAO <veyx.shaw@gmail.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) version 3 or any later version
|
||||||
|
* accepted by the membership of KDE e.V. (or its successor approved
|
||||||
|
* by the membership of KDE e.V.), which shall act as a proxy
|
||||||
|
* defined in Section 14 of version 3 of the license.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SERVICE_REGISTER_H
|
||||||
|
#define SERVICE_REGISTER_H
|
||||||
|
|
||||||
|
void registerServices();
|
||||||
|
|
||||||
|
#endif
|
96
indicator/serviceregister_mac.mm
Normal file
96
indicator/serviceregister_mac.mm
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Weixuan XIAO <veyx.shaw@gmail.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) version 3 or any later version
|
||||||
|
* accepted by the membership of KDE e.V. (or its successor approved
|
||||||
|
* by the membership of KDE e.V.), which shall act as a proxy
|
||||||
|
* defined in Section 14 of version 3 of the license.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <AppKit/AppKit.h>
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
@interface KDEConnectSendFileService : NSObject
|
||||||
|
- (void)sendViaKDEConnect:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error;
|
||||||
|
@end
|
||||||
|
|
||||||
|
static KDEConnectSendFileService *sendFileService = nil;
|
||||||
|
|
||||||
|
static void cleanup_service()
|
||||||
|
{
|
||||||
|
if (sendFileService != nil)
|
||||||
|
[sendFileService release];
|
||||||
|
|
||||||
|
sendFileService = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void registerServices() {
|
||||||
|
NSLog(@"Registering KDE Connect Send File Service");
|
||||||
|
KDEConnectSendFileService *sendFileService = [[KDEConnectSendFileService alloc] init];
|
||||||
|
qAddPostRoutine(cleanup_service); // Remove after quit
|
||||||
|
|
||||||
|
NSRegisterServicesProvider(sendFileService, @"SendViaKDEConnect");
|
||||||
|
|
||||||
|
NSLog(@"KDE Connect Send File Service registered");
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation KDEConnectSendFileService
|
||||||
|
|
||||||
|
- (void)sendViaKDEConnect:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
|
||||||
|
Q_UNUSED(userData);
|
||||||
|
Q_UNUSED(error);
|
||||||
|
|
||||||
|
NSAlert *alert = nil;
|
||||||
|
// NSPasteboardTypeFileURL is first introduced in macOS 13, avoid to use it now
|
||||||
|
NSArray *filePathArray = [pboard propertyListForType:NSFilenamesPboardType];
|
||||||
|
for (NSString *path in filePathArray) {
|
||||||
|
BOOL isDirectory = NO;
|
||||||
|
if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]) {
|
||||||
|
if (!isDirectory) {
|
||||||
|
if (QFile::exists(QCoreApplication::applicationDirPath() + QStringLiteral("/kdeconnect-handler"))) {
|
||||||
|
QProcess kdeconnect_handler;
|
||||||
|
kdeconnect_handler.setProgram(QCoreApplication::applicationDirPath() + QStringLiteral("/kdeconnect-handler"));
|
||||||
|
kdeconnect_handler.setArguments({QString::fromNSString(path)});
|
||||||
|
kdeconnect_handler.startDetached();
|
||||||
|
} else {
|
||||||
|
alert = [[NSAlert alloc] init];
|
||||||
|
[alert setInformativeText:@"Cannot find kdeconnect-handler"];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
alert = [[NSAlert alloc] init];
|
||||||
|
[alert setInformativeText:@"Cannot share a directory"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break; // Now we only support single file sharing
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([filePathArray count] < 1) {
|
||||||
|
alert = [[NSAlert alloc] init];
|
||||||
|
[alert setInformativeText:@"Cannot share selected item"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alert) {
|
||||||
|
[alert setMessageText:@"Share file failed"];
|
||||||
|
[alert addButtonWithTitle:@"OK"];
|
||||||
|
[alert setAlertStyle:NSAlertStyleCritical];
|
||||||
|
[alert runModal];
|
||||||
|
[alert release];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
Loading…
Reference in a new issue