From 775d15df3814409f94146ad22935a47c67936c57 Mon Sep 17 00:00:00 2001 From: Taylor Holliday Date: Tue, 21 Feb 2023 15:45:11 -0800 Subject: [PATCH] Simplify and use copy_to_clipboard. --- examples/open_window.rs | 15 +++++++++++++-- src/clipboard.rs | 11 +++++++++++ src/lib.rs | 2 ++ src/macos/window.rs | 18 +++++------------- 4 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 src/clipboard.rs diff --git a/examples/open_window.rs b/examples/open_window.rs index 95141b9..58c0713 100644 --- a/examples/open_window.rs +++ b/examples/open_window.rs @@ -2,7 +2,8 @@ use std::time::Duration; use rtrb::{Consumer, RingBuffer}; -use baseview::{Event, EventStatus, Window, WindowHandler, WindowScalePolicy}; +use baseview::copy_to_clipboard; +use baseview::{Event, EventStatus, MouseEvent, Window, WindowHandler, WindowScalePolicy}; #[derive(Debug, Clone)] enum Message { @@ -22,7 +23,17 @@ impl WindowHandler for OpenWindowExample { fn on_event(&mut self, _window: &mut Window, event: Event) -> EventStatus { match event { - Event::Mouse(e) => println!("Mouse event: {:?}", e), + Event::Mouse(e) => { + println!("Mouse event: {:?}", e); + + #[cfg(target_os = "macos")] + match e { + MouseEvent::ButtonPressed { button, modifiers } => { + copy_to_clipboard("This is a test!".into()) + } + _ => (), + } + } Event::Keyboard(e) => println!("Keyboard event: {:?}", e), Event::Window(e) => println!("Window event: {:?}", e), } diff --git a/src/clipboard.rs b/src/clipboard.rs new file mode 100644 index 0000000..baad5f0 --- /dev/null +++ b/src/clipboard.rs @@ -0,0 +1,11 @@ +#[cfg(target_os = "macos")] +use crate::macos as platform; +#[cfg(target_os = "windows")] +use crate::win as platform; +#[cfg(target_os = "linux")] +use crate::x11 as platform; + +#[cfg(target_os = "macos")] +pub fn copy_to_clipboard(data: String) { + platform::copy_to_clipboard(data) +} diff --git a/src/lib.rs b/src/lib.rs index 46a3695..54d57dd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,7 @@ mod win; #[cfg(target_os = "linux")] mod x11; +mod clipboard; mod event; mod keyboard; mod mouse_cursor; @@ -15,6 +16,7 @@ mod window_open_options; #[cfg(feature = "opengl")] pub mod gl; +pub use clipboard::*; pub use event::*; pub use mouse_cursor::MouseCursor; pub use window::*; diff --git a/src/macos/window.rs b/src/macos/window.rs index bcbe67c..731e45e 100644 --- a/src/macos/window.rs +++ b/src/macos/window.rs @@ -9,7 +9,7 @@ use cocoa::appkit::{ NSPasteboard, NSView, NSWindow, NSWindowStyleMask, }; use cocoa::base::{id, nil, NO, YES}; -use cocoa::foundation::{NSAutoreleasePool, NSData, NSPoint, NSRect, NSSize, NSString}; +use cocoa::foundation::{NSAutoreleasePool, NSPoint, NSRect, NSSize, NSString}; use core_foundation::runloop::{ CFRunLoop, CFRunLoopTimer, CFRunLoopTimerContext, __CFRunLoopTimer, kCFRunLoopDefaultMode, }; @@ -484,21 +484,13 @@ unsafe impl HasRawWindowHandle for Window { } } -pub enum ClipboardDataType { - String, -} - -pub fn copy_to_clipboard(data: String, data_type: ClipboardDataType) { +pub fn copy_to_clipboard(string: String) { unsafe { let pb = NSPasteboard::generalPasteboard(nil); - let data = - NSData::dataWithBytes_length_(nil, data.as_ptr() as *const c_void, data.len() as u64); + let ns_str = NSString::alloc(nil).init_str(&string); - let pb_type = match data_type { - ClipboardDataType::String => cocoa::appkit::NSPasteboardTypeString, - }; - - pb.setData_forType(data, pb_type); + pb.clearContents(); + pb.setString_forType(ns_str, cocoa::appkit::NSPasteboardTypeString); } }