init
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
.vscode
|
||||||
1765
Cargo.lock
generated
Normal file
1765
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[package]
|
||||||
|
name = "space"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rodio = "0.11.0"
|
||||||
|
tray-item = "0.10.0"
|
||||||
|
windows = { version = "0.56.0", features = ["Win32", "Win32_System", "Win32_System_Console", "Win32_Graphics", "Win32_Graphics_Gdi", "Win32_System_Memory", "Win32_System_LibraryLoader", "UI", "UI_Core", "Win32_UI", "Win32_UI_Input", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_WindowsAndMessaging"] }
|
||||||
|
winit = "0.25.0"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
embed-resource = "2.3"
|
||||||
|
|
||||||
BIN
assets/launch.ico
Normal file
BIN
assets/launch.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
5
build.rs
Normal file
5
build.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
extern crate embed_resource;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
embed_resource::compile("tray-example.rc", embed_resource::NONE);
|
||||||
|
}
|
||||||
100
src/main.rs
Normal file
100
src/main.rs
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
#![windows_subsystem = "windows"]
|
||||||
|
use rodio::source::SineWave;
|
||||||
|
use rodio::{Sink, Source};
|
||||||
|
use std::sync::mpsc;
|
||||||
|
use std::{thread, time::Duration};
|
||||||
|
use tray_item::{IconSource, TrayItem};
|
||||||
|
use windows::Win32::UI::Input::KeyboardAndMouse::{GetAsyncKeyState, VK_SPACE};
|
||||||
|
|
||||||
|
fn detect_space() -> bool {
|
||||||
|
unsafe {
|
||||||
|
let state = GetAsyncKeyState(VK_SPACE.0.into());
|
||||||
|
|
||||||
|
// Check if the key is pressed (the most significant bit is set)
|
||||||
|
(state & (1 << (i16::BITS - 1))) != 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn holding_space() -> bool {
|
||||||
|
for _ in 0..10 {
|
||||||
|
if !detect_space() {
|
||||||
|
thread::sleep(Duration::from_millis(10));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
thread::sleep(Duration::from_millis(20));
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn play_sound_while_holding_space() {
|
||||||
|
enum Message {
|
||||||
|
Pause,
|
||||||
|
Play,
|
||||||
|
}
|
||||||
|
|
||||||
|
let (tx, rx) = mpsc::sync_channel(1);
|
||||||
|
thread::spawn(move || {
|
||||||
|
let source = SineWave::new(440)
|
||||||
|
.take_duration(Duration::from_secs(300))
|
||||||
|
.amplify(0.05);
|
||||||
|
|
||||||
|
let sink = Sink::new(&rodio::default_output_device().unwrap());
|
||||||
|
sink.pause();
|
||||||
|
loop {
|
||||||
|
if !sink.is_paused() && sink.empty() {
|
||||||
|
sink.append(source.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
match rx.recv() {
|
||||||
|
Ok(Message::Pause) => sink.pause(),
|
||||||
|
Ok(Message::Play) => {
|
||||||
|
sink.append(source.clone());
|
||||||
|
sink.play();
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if holding_space() {
|
||||||
|
tx.send(Message::Play).unwrap();
|
||||||
|
while detect_space() {
|
||||||
|
thread::sleep(Duration::from_millis(10));
|
||||||
|
}
|
||||||
|
tx.send(Message::Pause).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tray() {
|
||||||
|
enum TrayMessage {
|
||||||
|
Quit,
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut tray = TrayItem::new("Space Watcher", IconSource::Resource("tray-icon")).unwrap();
|
||||||
|
tray.add_label("Space Watcher").unwrap();
|
||||||
|
tray.inner_mut().add_separator().unwrap();
|
||||||
|
|
||||||
|
let (tx, rx) = mpsc::sync_channel(1);
|
||||||
|
let quit_tx = tx.clone();
|
||||||
|
tray.add_menu_item("Quit", move || {
|
||||||
|
quit_tx.send(TrayMessage::Quit).unwrap();
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match rx.recv() {
|
||||||
|
Ok(TrayMessage::Quit) => {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
thread::spawn(|| play_sound_while_holding_space());
|
||||||
|
tray();
|
||||||
|
}
|
||||||
1
tray-example.rc
Normal file
1
tray-example.rc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
tray-icon ICON "assets/launch.ico"
|
||||||
Reference in New Issue
Block a user