main.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. extern crate xcb;
  2. extern crate mpd;
  3. extern crate simple_signal;
  4. extern crate freetype;
  5. extern crate fontconfig_sys;
  6. mod sensors;
  7. mod config;
  8. mod ui;
  9. mod widgets;
  10. use simple_signal::Signal;
  11. use std::env;
  12. use std::process;
  13. use std::sync::mpsc;
  14. use std::thread;
  15. use std::time;
  16. use ui::x11;
  17. use widgets::Message;
  18. fn main() {
  19. let config_path = env::args().nth(1).unwrap_or("./panel.toml".to_string());
  20. let cfg = config::load(&config_path);
  21. if let Some(conn) = x11::Connection::new() {
  22. let (tx, rx) = mpsc::channel();
  23. {
  24. let tx = tx.clone();
  25. simple_signal::set_handler(&[Signal::Int, Signal::Term], move |_signals| {
  26. tx.send(Message::Quit).expect("Failed to send quit");
  27. });
  28. }
  29. {
  30. let tx = tx.clone();
  31. let conn = conn.clone_connection();
  32. thread::spawn(move || {
  33. loop {
  34. match conn.wait_for_event() {
  35. Some(event) => {
  36. let message = Message::XcbEvent(event);
  37. tx.send(message).expect("Failed to send xcb event");
  38. },
  39. None => { break; }
  40. }
  41. }
  42. });
  43. }
  44. let mut panel = ui::panel::Panel::new(conn, &cfg);
  45. let left_widgets = vec![
  46. widgets::bspwm(tx.clone(), panel.make_draw_context()),
  47. widgets::spacer(panel.make_draw_context(), 4, 0x6666, 0x6666, 0x6666, 0xFFFF),
  48. widgets::title(panel.conn.clone(), panel.make_draw_context())
  49. ];
  50. let mut right_widgets = vec![
  51. widgets::mpd(tx.clone(), panel.make_draw_context()),
  52. widgets::sensors(panel.make_draw_context(), &cfg),
  53. widgets::tray(tx.clone(), panel.conn.clone(), panel.window)
  54. ];
  55. right_widgets.reverse();
  56. for widget in left_widgets {
  57. panel.add_left_widget(widget);
  58. }
  59. for widget in right_widgets {
  60. panel.add_right_widget(widget);
  61. }
  62. panel.create();
  63. {
  64. let tx = tx.clone();
  65. thread::spawn(move || {
  66. loop {
  67. tx.send(Message::Update).expect("Failed to send update");
  68. thread::sleep(time::Duration::from_secs(1));
  69. }
  70. });
  71. }
  72. loop {
  73. let event = rx.recv();
  74. if panel.handle_event(event.unwrap()) {
  75. println!("Exiting");
  76. break;
  77. }
  78. }
  79. }
  80. process::exit(0);
  81. }