Skip to content
Open
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
67 changes: 37 additions & 30 deletions examples/example.rs
Original file line number Diff line number Diff line change
@@ -1,50 +1,57 @@
extern crate fruitbasket;
use fruitbasket::ActivationPolicy;
use fruitbasket::Trampoline;
use fruitbasket::FruitApp;
use fruitbasket::FruitError;
use fruitbasket::InstallDir;
use fruitbasket::RunPeriod;
use fruitbasket::FruitError;
use std::time::Duration;
use fruitbasket::Trampoline;
use std::path::PathBuf;
use std::time::Duration;

#[macro_use]
extern crate log;

fn main() {
let _ = fruitbasket::create_logger(".fruitbasket.log", fruitbasket::LogDir::Home, 5, 2).unwrap();
let _ =
fruitbasket::create_logger(".fruitbasket.log", fruitbasket::LogDir::Home, 5, 2).unwrap();

// Find the icon file from the Cargo project dir
let icon = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("examples").join("icon.png");
.join("examples")
.join("icon.png");

// Re-launch self in an app bundle if not already running from one.
info!("Executable must run from App bundle. Let's try:");
let mut app = match Trampoline::new("fruitbasket", "fruitbasket", "com.trevorbentley.fruitbasket")
.version("2.1.3")
.icon("fruitbasket.icns")
.plist_key("CFBundleSpokenName","\"fruit basket\"")
.plist_keys(&vec![
("LSMinimumSystemVersion", "10.12.0"),
("LSBackgroundOnly", "1"),
])
.resource(icon.to_str().unwrap())
.build(InstallDir::Temp) {
Err(FruitError::UnsupportedPlatform(_)) => {
info!("This is not a Mac. App bundling is not supported.");
info!("It is still safe to use FruitApp::new(), though the dummy app will do nothing.");
FruitApp::new()
},
Err(FruitError::IOError(e)) => {
info!("IO error! {}", e);
std::process::exit(1);
},
Err(FruitError::GeneralError(e)) => {
info!("General error! {}", e);
std::process::exit(1);
},
Ok(app) => app,
};
let mut app = match Trampoline::new(
"fruitbasket",
"fruitbasket",
"com.trevorbentley.fruitbasket",
)
.version("2.1.3")
.icon("fruitbasket.icns")
.plist_key("CFBundleSpokenName", "\"fruit basket\"")
.plist_keys(&vec![
("LSMinimumSystemVersion", "10.12.0"),
("LSBackgroundOnly", "1"),
])
.resource(icon.to_str().unwrap())
.build(InstallDir::Temp)
{
Err(FruitError::UnsupportedPlatform(_)) => {
info!("This is not a Mac. App bundling is not supported.");
info!("It is still safe to use FruitApp::new(), though the dummy app will do nothing.");
FruitApp::new()
}
Err(FruitError::IOError(e)) => {
info!("IO error! {}", e);
std::process::exit(1);
}
Err(FruitError::GeneralError(e)) => {
info!("General error! {}", e);
std::process::exit(1);
}
Ok(app) => app,
};

// App is guaranteed to be running in a bundle now!

Expand Down
111 changes: 65 additions & 46 deletions examples/register_url.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,58 +13,73 @@
///
extern crate fruitbasket;
use fruitbasket::ActivationPolicy;
use fruitbasket::Trampoline;
use fruitbasket::FruitApp;
use fruitbasket::FruitCallbackKey;
use fruitbasket::FruitError;
use fruitbasket::InstallDir;
use fruitbasket::RunPeriod;
use fruitbasket::FruitError;
use fruitbasket::FruitCallbackKey;
use fruitbasket::Trampoline;
use std::path::PathBuf;

#[macro_use]
extern crate log;

fn main() {
let _ = fruitbasket::create_logger(".fruitbasket_register_url.log", fruitbasket::LogDir::Home, 5, 2).unwrap();
let _ = fruitbasket::create_logger(
".fruitbasket_register_url.log",
fruitbasket::LogDir::Home,
5,
2,
)
.unwrap();

// Find the icon file from the Cargo project dir
let icon = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("examples").join("icon.png");
.join("examples")
.join("icon.png");

// Re-launch self in an app bundle if not already running from one.
info!("Executable must run from App bundle. Let's try:");
let mut app = match Trampoline::new("fruitbasket_register_url", "fruitbasket", "com.trevorbentley.fruitbasket_register_url")
.version("2.1.3")
.icon("fruitbasket.icns")
.plist_key("CFBundleSpokenName","\"fruit basket\"")
.plist_keys(&vec![
("LSMinimumSystemVersion", "10.12.0"),
("LSBackgroundOnly", "1"),
])
// Register "fruitbasket://" and "fbasket://" URL schemes in Info.plist
.plist_raw_string("
let mut app = match Trampoline::new(
"fruitbasket_register_url",
"fruitbasket",
"com.trevorbentley.fruitbasket_register_url",
)
.version("2.1.3")
.icon("fruitbasket.icns")
.plist_key("CFBundleSpokenName", "\"fruit basket\"")
.plist_keys(&vec![
("LSMinimumSystemVersion", "10.12.0"),
("LSBackgroundOnly", "1"),
])
// Register "fruitbasket://" and "fbasket://" URL schemes in Info.plist
.plist_raw_string(
"
CFBundleURLTypes = ( {
CFBundleTypeRole = \"Viewer\";
CFBundleURLName = \"Fruitbasket Example URL\";
CFBundleURLSchemes = (\"fruitbasket\", \"fbasket\");
} );\n".into())
.resource(icon.to_str().unwrap())
.build(InstallDir::Temp) {
Err(FruitError::UnsupportedPlatform(_)) => {
info!("This is not a Mac. App bundling is not supported.");
info!("It is still safe to use FruitApp::new(), though the dummy app will do nothing.");
FruitApp::new()
},
Err(FruitError::IOError(e)) => {
info!("IO error! {}", e);
std::process::exit(1);
},
Err(FruitError::GeneralError(e)) => {
info!("General error! {}", e);
std::process::exit(1);
},
Ok(app) => app,
};
} );\n"
.into(),
)
.resource(icon.to_str().unwrap())
.build(InstallDir::Temp)
{
Err(FruitError::UnsupportedPlatform(_)) => {
info!("This is not a Mac. App bundling is not supported.");
info!("It is still safe to use FruitApp::new(), though the dummy app will do nothing.");
FruitApp::new()
}
Err(FruitError::IOError(e)) => {
info!("IO error! {}", e);
std::process::exit(1);
}
Err(FruitError::GeneralError(e)) => {
info!("General error! {}", e);
std::process::exit(1);
}
Ok(app) => app,
};

// App is guaranteed to be running in a bundle now!

Expand All @@ -79,11 +94,13 @@ CFBundleURLTypes = ( {

// Register a callback for when the ObjC application finishes launching
let stopper = app.stopper();
app.register_callback(FruitCallbackKey::Method("applicationWillFinishLaunching:"),
Box::new(move |_event| {
info!("applicationDidFinishLaunching.");
stopper.stop();
}));
app.register_callback(
FruitCallbackKey::Method("applicationWillFinishLaunching:"),
Box::new(move |_event| {
info!("applicationDidFinishLaunching.");
stopper.stop();
}),
);

// Run until callback is called
info!("Spawned process started. Run until applicationDidFinishLaunching.");
Expand All @@ -93,14 +110,16 @@ CFBundleURLTypes = ( {
// Register a callback to get receive custom URL schemes from any Mac program
app.register_apple_event(fruitbasket::kInternetEventClass, fruitbasket::kAEGetURL);
let stopper = app.stopper();
app.register_callback(FruitCallbackKey::Method("handleEvent:withReplyEvent:"),
Box::new(move |event| {
// Event is a raw NSAppleEventDescriptor.
// Fruitbasket has a parser for URLs. Call that to get the URL:
let url: String = fruitbasket::parse_url_event(event);
info!("Received URL: {}", url);
stopper.stop();
}));
app.register_callback(
FruitCallbackKey::Method("handleEvent:withReplyEvent:"),
Box::new(move |event| {
// Event is a raw NSAppleEventDescriptor.
// Fruitbasket has a parser for URLs. Call that to get the URL:
let url: String = fruitbasket::parse_url_event(event);
info!("Received URL: {}", url);
stopper.stop();
}),
);

// Run 'forever', until the URL callback fires
info!("Spawned process running!");
Expand Down
Loading