Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] master from p0deje:master #87

Merged
merged 9 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified Designs/App-Store/03-Search.pxd
Binary file not shown.
1 change: 1 addition & 0 deletions Maccy/Clipboard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ class Clipboard {
pasteboard.writeObjects(fileURLItems)

pasteboard.setString("", forType: .fromMaccy)
pasteboard.setString(item.application ?? "", forType: .source)
sync()

Task {
Expand Down
5 changes: 5 additions & 0 deletions Maccy/Extensions/NSPasteboard.PasteboardType+Types.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ extension NSPasteboard.PasteboardType: Defaults.Serializable {
// See http://nspasteboard.org for more details.
static let autoGenerated = NSPasteboard.PasteboardType(rawValue: "org.nspasteboard.AutoGeneratedType")
static let concealed = NSPasteboard.PasteboardType(rawValue: "org.nspasteboard.ConcealedType")
static let source = NSPasteboard.PasteboardType(rawValue: "org.nspasteboard.source")
static let transient = NSPasteboard.PasteboardType(rawValue: "org.nspasteboard.TransientType")

// https://github.com/p0deje/Maccy/issues/429#issuecomment-1182575226
Expand All @@ -20,4 +21,8 @@ extension NSPasteboard.PasteboardType: Defaults.Serializable {
// Types that indicate Microsoft Word bookmarks (links).
static let microsoftObjectLink = NSPasteboard.PasteboardType(rawValue: "com.microsoft.ObjectLink")
static let microsoftLinkSource = NSPasteboard.PasteboardType(rawValue: "com.microsoft.Link-Source")

// Safari preview and extra metadata that changes frequently.
static let linkPresentationMetadata = NSPasteboard.PasteboardType(rawValue: "com.apple.linkpresentation.metadata")
static let customPasteboardData = NSPasteboard.PasteboardType(rawValue: "com.apple.WebKit.custom-pasteboard-data")
}
26 changes: 18 additions & 8 deletions Maccy/KeyChord.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,28 @@ enum KeyChord: CaseIterable {
case unknown

init(_ event: NSEvent?) {
guard let event, event.type == .keyDown,
let key = Sauce.shared.key(for: Int(event.keyCode)) else {
guard let event, event.type == .keyDown else {
self = .unknown
return
}

self.init(
key,
event.modifierFlags
.intersection(.deviceIndependentFlagsMask)
.subtracting([.capsLock, .numericPad, .function])
)
let modifierFlags = event.modifierFlags
.intersection(.deviceIndependentFlagsMask)
.subtracting([.capsLock, .numericPad, .function])
var key: Key?

if KeyboardLayout.current.commandSwitchesToQWERTY, modifierFlags.contains(.command) {
key = Key(QWERTYKeyCode: Int(event.keyCode))
} else {
key = Sauce.shared.key(for: Int(event.keyCode))
}

guard let key else {
self = .unknown
return
}

self.init(key, modifierFlags)
}

init(_ key: Key, _ modifierFlags: NSEvent.ModifierFlags) { // swiftlint:disable:this cyclomatic_complexity
Expand Down
4 changes: 3 additions & 1 deletion Maccy/Models/HistoryItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ class HistoryItem {
private static let transientTypes: [String] = [
NSPasteboard.PasteboardType.modified.rawValue,
NSPasteboard.PasteboardType.fromMaccy.rawValue,
"com.apple.linkpresentation.metadata"
NSPasteboard.PasteboardType.linkPresentationMetadata.rawValue,
NSPasteboard.PasteboardType.customPasteboardData.rawValue,
NSPasteboard.PasteboardType.source.rawValue
]

var application: String?
Expand Down
73 changes: 36 additions & 37 deletions Maccy/Settings/AppearanceSettingsPane.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,49 +48,13 @@ struct AppearanceSettingsPane: View {
return formatter
}()

private func labelForScreen(index screenIndex: Int) -> String {
switch screenIndex {
case 0:
return String(localized: "ActiveScreen", table: "AppearanceSettings")
case _: return screens[screenIndex - 1].localizedName
}
}

@ViewBuilder private func screenPicker(for position: PopupPosition)
-> some View
{
let screenBinding: Binding<Int> = Binding {
return popupScreen
} set: {
popupScreen = $0
popupAt = position
}
Picker(selection: screenBinding) {
Text(labelForScreen(index: 0))
.tag(0)

ForEach(screens.indices, id: \.self) { index in
Text(labelForScreen(index: index + 1))
.tag(index + 1)
}
} label: {
if popupAt == position {
Text("\(position.description) (\(labelForScreen(index: popupScreen)))")
} else {
Text(position.description)
}
}
}

var body: some View {
Settings.Container(contentWidth: 650) {
Settings.Section(label: { Text("PopupAt", tableName: "AppearanceSettings") }) {
HStack {
Picker("", selection: $popupAt) {
ForEach(PopupPosition.allCases) { position in
if position == .center || position == .lastPosition,
screens.count > 1
{
if position == .center || position == .lastPosition, screens.count > 1 {
screenPicker(for: position)
} else {
Text(position.description)
Expand Down Expand Up @@ -220,6 +184,41 @@ struct AppearanceSettingsPane: View {
screens = NSScreen.screens
}
}

@ViewBuilder
private func screenPicker(for position: PopupPosition) -> some View {
let screenBinding: Binding<Int> = Binding {
return popupScreen
} set: {
popupScreen = $0
popupAt = position
}

Picker(selection: screenBinding) {
Text(labelForScreen(index: 0))
.tag(0)

ForEach(screens.indices, id: \.self) { index in
Text(labelForScreen(index: index + 1))
.tag(index + 1)
}
} label: {
if popupAt == position {
Text("\(position.description) (\(labelForScreen(index: popupScreen)))")
} else {
Text(position.description)
}
}
}

private func labelForScreen(index screenIndex: Int) -> String {
switch screenIndex {
case 0:
return String(localized: "ActiveScreen", table: "AppearanceSettings")
case _:
return screens[screenIndex - 1].localizedName
}
}
}

#Preview {
Expand Down
12 changes: 6 additions & 6 deletions Maccy/Settings/fr.lproj/AdvancedSettings.strings
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
"Title" = "Avancé";
"TurnOff" = "Éteindre";
"TurnOffDescription" = "Ignorer temporairement toute nouvelle copie.\nVous êtes susceptible de l'utiliser pour le développement ou lors de la copie de données sensibles.";
"TurnOff" = "Désactiver";
"TurnOffDescription" = "Ignorer temporairement toute nouvelle copie.\nVous êtes susceptible de lutiliser pour le développement ou lors de la copie de données sensibles.";
"TurnOffShellScript" = "defaults write org.p0deje.Maccy ignoreEvents true\n# copier des données\ndefaults write org.p0deje.Maccy ignoreEvents false";
"TurnOffViaMenuIconDescription" = "Vous pouvez également cliquer sur l'icône du menu en appuyant sur ⌥.\nPour ignorer uniquement la copie suivante, cliquez avec ⌥⇧.";
"TurnOffViaMenuIconDescription" = "Vous pouvez également cliquer sur licône du menu en appuyant sur ⌥.\nPour ignorer uniquement la copie suivante, cliquez avec ⌥⇧.";
"TurnOffNextShellScript" = "defaults write org.p0deje.Maccy ignoreOnlyNextEvent true\n# copier des données";
"ClearHistoryOnQuit" = "Effacer l'historique en quittant";
"ClearHistoryOnQuitTooltip" = "Supprimez automatiquement tous les éléments non épinglés avant de quitter l'application.";
"ClearHistoryOnQuit" = "Effacer lhistorique en quittant";
"ClearHistoryOnQuitTooltip" = "Supprimez automatiquement tous les éléments non épinglés avant de quitter lapplication.";
"ClearSystemClipboard" = "Effacer également le presse-papiers du système";
"ClearSystemClipboardTooltip" = "Lorsqu'elle est activée, l'effacement de l'historique effacera également le presse-papiers du système actuel.";
"ClearSystemClipboardTooltip" = "Lorsquelle est activée, leffacement de lhistorique effacera également le presse-papiers du système actuel.";
22 changes: 11 additions & 11 deletions Maccy/Settings/fr.lproj/AppearanceSettings.strings
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,33 @@
"PopupAtCursor" = "Curseur";
"PopupAtMenuBarIcon" = "Icône du menu";
"PopupAtWindowCenter" = "Centre de la fenêtre";
"PopupAtScreenCenter" = "Centre de l'écran";
"PopupAtScreenCenter" = "Centre de lécran";
"PopupAtLastPosition" = "Dernière position";
"PopupAtLastLocationReset" = "Réinitialiser la position";
"PopupAtTooltip" = "Changer la localisation de l'apparition du popup.\nPar défaut : Curseur.";
"PopupAtTooltip" = "Changer la localisation de lapparition du popup.\nPar défaut : Curseur.";
"SearchVisibilityAlways" = "Toujours";
"SearchVisibilityDuringSearch" = "Pendant la recherche";
"ActiveScreen" = "Écran actif";
"PinTo" = "Epingler à :";
"PinTo" = "Épingler à :";
"PinToTop" = "Haut";
"PinToBottom" = "Bas";
"PinToTooltip" = "Change la localisation des élements épinglés.\nPar défaut : Haut.";
"PinToTooltip" = "Change la localisation des éléments épinglés.\nPar défaut : Haut.";
"ImageHeight" = "Hauteur de l'image :";
"ImageHeightTooltip" = "Hauteur maximale de l'aperçu de l'image.\nPar défaut : 40.\nAstuce : réglez sur 16 pour qu'ils ressemblent à des éléments de texte.";
"ImageHeightTooltip" = "Hauteur maximale de laperçu de limage.\nPar défaut : 40.\nAstuce : réglez sur 16 pour quils ressemblent à des éléments de texte.";
"PreviewDelay" = "Délai de prévisualisation :";
"PreviewDelayTooltip" = "Délai en millisecondes jusqu'à ce qu'une fenêtre d'aperçu s'affiche.\nPar défaut : 1500.";
"HighlightMatches" = "Matchs phares :";
"PreviewDelayTooltip" = "Délai en millisecondes jusquà ce quune fenêtre daperçu s'affiche.\nPar défaut : 1500.";
"HighlightMatches" = "Format des termes trouvés :";
"HighlightMatchColor" = "Couleur";
"HighlightMatchBold" = "Gras";
"HighlightMatchItalic" = "Italique";
"HighlightMatchUnderline" = "Souligner";
"HighlightMatchesTooltip" = "Modifiez le style de surbrillance des correspondances de recherche.\nPar défaut : Gras.";
"ShowSpecialSymbols" = "Afficher les symboles spéciaux";
"ShowSpecialSymbolsTooltip" = "Afficher les nouvelles lignes, les tabulations, les espaces de début et de fin via des symboles spéciaux.";
"ShowMenuIcon" = "Afficher l'icone du menu";
"ShowRecentCopyInMenuBar" = "Afficher la copie récente à côté de l'icône du menu";
"ShowMenuIcon" = "Afficher l’icône du menu";
"ShowRecentCopyInMenuBar" = "Afficher la copie récente à côté de licône du menu";
"ShowSearchField" = "Afficher le champ de recherche";
"ShowTitleBeforeSearchField" = "Afficher le titre avant la barre de recherche";
"ShowFooter" = "Afficher le bas de l'application";
"ShowFooter" = "Afficher le bas de lapplication";
"ShowApplicationIcons" = "Afficher les icônes des applications";
"OpenPreferencesWarning" = "⚠️ Pressez ⌘, pour ouvrir les préférences quand le bas de l'application est caché.";
"OpenPreferencesWarning" = "⚠️ Pressez ⌘, pour ouvrir les préférences quand le bas de lapplication est caché.";
10 changes: 5 additions & 5 deletions Maccy/Settings/fr.lproj/GeneralSettings.strings
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
"CheckForUpdates" = "Vérifier les mises à jour automatiquement";
"CheckNow" = "Vérifier maintenant";
"Open" = "Ouvrir :";
"OpenTooltip" = "Raccourci pour ouvrir l'application.\nPar défaut : %@C.";
"Pin" = "Accrocher :";
"PinTooltip" = "Touche de raccourci pour épingler un élément de l'historique.\nPar défaut : %@P.";
"OpenTooltip" = "Raccourci pour ouvrir lapplication.\nPar défaut : %@C.";
"Pin" = "Épingler :";
"PinTooltip" = "Touche de raccourci pour épingler un élément de lhistorique.\nPar défaut : %@P.";
"Delete" = "Supprimer :";
"DeleteTooltip" = "Touche de raccourci pour supprimer un élément de l'historique.\nPar défaut : %@⌫.";
"DeleteTooltip" = "Touche de raccourci pour supprimer un élément de lhistorique.\nPar défaut : %@⌫.";
"Behavior" = "Comportement :";
"PasteAutomatically" = "Coller automatiquement";
"PasteWithoutFormatting" = "Coller sans formatage";
"Modifiers" = "Customiser le comportement lors de la sélection de l'élément :\n• Selectionnez avec %@ pressé pour copier un élément.\n• Selectionnez avec %@ pressé pour copier et coller l'élément.\n• Selectionnez avec %@ pressé pour copier, reformater et coller l'élément.";
"Modifiers" = "Personnaliser le comportement lors de la sélection de lélément :\n— sélectionnez avec %@ pressé pour copier un élément ;\n— sélectionnez avec %@ pressé pour copier et coller lélément ;\n— sélectionnez avec %@ pressé pour copier, reformater et coller lélément.";
"Search" = "Recherche :";
"Exact" = "Exacte";
"Fuzzy" = "Approximative";
Expand Down
8 changes: 4 additions & 4 deletions Maccy/Settings/fr.lproj/IgnoreSettings.strings
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"Title" = "Ignorer";
"ApplicationsTab" = "Applications";
"IgnoredAppsDescription" = "Il est possible d'ignorer les copies provenant de certaines applications.\nVeuillez noter que la façon dont cela fonctionne n'est pas à l'épreuve des balles, il est donc préférable d'utiliser des types de carton lorsque cela est possible.";
"IgnoredAllAppsExceptListed" = "Ignorer toutes les applications sauf listées";
"IgnoredAppsDescription" = "Il est possible dignorer les copies provenant de certaines applications.\nVeuillez noter que la façon dont cela fonctionne nest pas infaillible, il est donc préférable de filtrer le type de presse-papier lorsque cela est possible.";
"IgnoredAllAppsExceptListed" = "Ignorer toutes les applications sauf celles listées";
"PasteboardTypesTab" = "Types";
"IgnoredPasteboardTypesDescription" = "Il est possible d'ignorer certains types de presse-papiers.\nPar défaut, certains types spécifiques à l'application sont définis. Vous pouvez les supprimer et ajouter tous les types personnalisés que vous souhaitez.";
"IgnoredPasteboardTypesDescription" = "Il est possible dignorer certains types de presse-papiers.\nPar défaut, certains types spécifiques à lapplication sont définis. Vous pouvez les supprimer et ajouter tous les types personnalisés que vous souhaitez.";
"IgnoredPasteboardTypesReset" = "Remise à zéro";
"RegexpTab" = "Expressions régulières";
"IgnoredRegexpsDescription" = "Il est possible d'ignorer certaines copies de la mémorisation en fonction d'expressions régulières définies.";
"IgnoredRegexpsDescription" = "Il est possible dignorer certaines copies de la mémorisation en fonction dexpressions régulières définies.";
4 changes: 4 additions & 0 deletions MaccyTests/ClipboardTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,13 @@ class ClipboardTests: XCTestCase {
let item = HistoryItem()
Storage.shared.context.insert(item)
item.contents = contents
item.application = "com.foo.bar"
clipboard.copy(item)
XCTAssertEqual(pasteboard.string(forType: .string), "foo")
XCTAssertEqual(pasteboard.data(forType: .tiff), imageData)
XCTAssertEqual(pasteboard.string(forType: .fileURL), "file://foo.bar")
XCTAssertEqual(pasteboard.string(forType: .fromMaccy), "")
XCTAssertEqual(pasteboard.string(forType: .source), "com.foo.bar")
}

@MainActor
Expand All @@ -232,9 +234,11 @@ class ClipboardTests: XCTestCase {
let item = HistoryItem()
Storage.shared.context.insert(item)
item.contents = contents
item.application = "com.foo.bar"
clipboard.copy(item, removeFormatting: true)
XCTAssertEqual(pasteboard.string(forType: .string), "foo")
XCTAssertEqual(pasteboard.string(forType: .fromMaccy), "")
XCTAssertEqual(pasteboard.string(forType: .source), "com.foo.bar")
XCTAssertEqual(pasteboard.string(forType: .fileURL), "file://foo.bar")
XCTAssertNil(pasteboard.data(forType: .rtf))
}
Expand Down