main.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #[macro_use]
  2. extern crate chan;
  3. extern crate chan_signal;
  4. extern crate xcb;
  5. mod atom;
  6. mod tray;
  7. use std::thread;
  8. use std::sync::Arc;
  9. fn main() {
  10. let signal = chan_signal::notify(&[chan_signal::Signal::INT, chan_signal::Signal::TERM]);
  11. if let Ok((conn, preferred)) = xcb::Connection::connect(None) {
  12. let conn = Arc::new(conn);
  13. let atoms = atom::Atoms::new(&conn);
  14. let owner = xcb::get_selection_owner(&conn, atoms.get(atom::_NET_SYSTEM_TRAY_S0)).get_reply().unwrap().owner();
  15. if owner != xcb::NONE {
  16. println!("Another system tray is already running");
  17. return
  18. }
  19. let tray = tray::Tray::new(&conn, &atoms, preferred as usize);
  20. tray.create();
  21. if !tray.take_selection() {
  22. println!("Could not take ownership of tray selection. Maybe another tray is also running?");
  23. return
  24. }
  25. {
  26. let conn = conn.clone();
  27. const CLIENT_MESSAGE: u8 = xcb::CLIENT_MESSAGE | 0x80;
  28. thread::spawn(move || {
  29. loop {
  30. match conn.wait_for_event() {
  31. Some(event) => match event.response_type() {
  32. xcb::EXPOSE => { println!("expose") },
  33. CLIENT_MESSAGE => {
  34. println!("client message");
  35. },
  36. _ => {}
  37. },
  38. None => { break; }
  39. }
  40. }
  41. });
  42. }
  43. loop {
  44. chan_select!(
  45. signal.recv() => {
  46. break;
  47. }
  48. );
  49. }
  50. // cleanup code
  51. }
  52. else {
  53. println!("Could not connect to X server!");
  54. }
  55. }