main.rs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #[macro_use]
  2. extern crate chan;
  3. extern crate chan_signal;
  4. extern crate xcb;
  5. mod atom;
  6. mod event;
  7. mod tray;
  8. use std::thread;
  9. use std::sync::Arc;
  10. fn main() {
  11. let signal = chan_signal::notify(&[chan_signal::Signal::INT, chan_signal::Signal::TERM]);
  12. if let Ok((conn, preferred)) = xcb::Connection::connect(None) {
  13. let conn = Arc::new(conn);
  14. let atoms = atom::Atoms::new(&conn);
  15. let dir = "top-right";
  16. let dir = match dir {
  17. "top-right" => tray::TOP_RIGHT,
  18. "bottom-left" => tray::BOTTOM_LEFT,
  19. "bottom-right" => tray::BOTTOM_RIGHT,
  20. _ => tray::TOP_LEFT
  21. };
  22. let mut tray = tray::Tray::new(&conn, &atoms, preferred as usize, 20, dir);
  23. if !tray.is_selection_available() {
  24. println!("Another system tray is already running");
  25. return
  26. }
  27. let (tx, rx) = chan::sync::<event::Event>(0);
  28. {
  29. let conn = conn.clone();
  30. thread::spawn(move || {
  31. event::event_loop(&conn, tx);
  32. });
  33. }
  34. tray.create();
  35. loop {
  36. use event::Event::*;
  37. chan_select!(
  38. rx.recv() -> event => match event.unwrap() {
  39. Ready(timestamp) => {
  40. if !tray.take_selection(timestamp) {
  41. println!("Could not take ownership of tray selection. Maybe another tray is also running?");
  42. return
  43. }
  44. },
  45. ChildRequest(window) => {
  46. tray.adopt(window);
  47. },
  48. ChildDestroyed(window) => {
  49. tray.forget(window);
  50. },
  51. ChildConfigured(window) => {
  52. tray.force_size(window);
  53. }
  54. },
  55. signal.recv() => {
  56. break;
  57. }
  58. );
  59. }
  60. // cleanup code
  61. tray.cleanup();
  62. }
  63. else {
  64. println!("Could not connect to X server!");
  65. }
  66. }