#[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!"); } }