12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #[macro_use]
- extern crate chan;
- extern crate chan_signal;
- extern crate xcb;
- mod atom;
- mod tray;
- use std::thread;
- use std::sync::Arc;
- fn main() {
- let signal = chan_signal::notify(&[chan_signal::Signal::INT, chan_signal::Signal::TERM]);
- if let Ok((conn, preferred)) = xcb::Connection::connect(None) {
- let conn = Arc::new(conn);
- let atoms = atom::Atoms::new(&conn);
- let owner = xcb::get_selection_owner(&conn, atoms.get(atom::_NET_SYSTEM_TRAY_S0)).get_reply().unwrap().owner();
- if owner != xcb::NONE {
- println!("Another system tray is already running");
- return
- }
- let tray = tray::Tray::new(&conn, &atoms, preferred as usize);
- tray.create();
- if !tray.take_selection() {
- println!("Could not take ownership of tray selection. Maybe another tray is also running?");
- return
- }
- {
- let conn = conn.clone();
- const CLIENT_MESSAGE: u8 = xcb::CLIENT_MESSAGE | 0x80;
- thread::spawn(move || {
- loop {
- match conn.wait_for_event() {
- Some(event) => match event.response_type() {
- xcb::EXPOSE => { println!("expose") },
- CLIENT_MESSAGE => {
- println!("client message");
- },
- _ => {}
- },
- None => { break; }
- }
- }
- });
- }
- loop {
- chan_select!(
- signal.recv() => {
- break;
- }
- );
- }
- // cleanup code
- }
- else {
- println!("Could not connect to X server!");
- }
- }
|