mod.rs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. mod font;
  2. mod panel;
  3. mod ext;
  4. mod title;
  5. mod tray;
  6. mod sensors;
  7. mod bspwm;
  8. mod spacer;
  9. mod util;
  10. mod widget;
  11. mod x11;
  12. use simple_signal;
  13. use simple_signal::Signal;
  14. use config::Config;
  15. use std::sync::mpsc;
  16. use std::thread;
  17. use std::time;
  18. pub const SIZE: u16 = 20;
  19. pub fn ui_main(cfg: &Config) -> i32 {
  20. if let Some(conn) = x11::Connection::new() {
  21. let (tx, rx) = mpsc::channel();
  22. {
  23. let tx = tx.clone();
  24. simple_signal::set_handler(&[Signal::Int, Signal::Term], move |_signals| {
  25. tx.send(widget::Message::Quit).expect("Failed to send quit");
  26. });
  27. }
  28. {
  29. let tx = tx.clone();
  30. let conn = conn.clone_connection();
  31. thread::spawn(move || {
  32. loop {
  33. match conn.wait_for_event() {
  34. Some(event) => {
  35. let message = widget::Message::XcbEvent(event);
  36. tx.send(message).expect("Failed to send xcb event");
  37. },
  38. None => { break; }
  39. }
  40. }
  41. });
  42. }
  43. let mut panel = panel::Panel::new(conn, cfg);
  44. let bspwm = bspwm::Bspwm::new(tx.clone(), panel.make_draw_context());
  45. panel.add_left_widget(Box::new(bspwm));
  46. let spacer = spacer::create(panel.make_draw_context(), 4, 0x6666, 0x6666, 0x6666, 0xFFFF);
  47. panel.add_left_widget(Box::new(spacer));
  48. let title = title::Title::new(panel.conn.clone(), panel.make_draw_context());
  49. panel.add_left_widget(Box::new(title));
  50. let tray = tray::Tray::new(tx.clone(), panel.conn.clone(), panel.window);
  51. panel.add_right_widget(Box::new(tray));
  52. let sensors = sensors::Sensors::new(panel.make_draw_context(), cfg);
  53. panel.add_right_widget(Box::new(sensors));
  54. panel.create();
  55. {
  56. let tx = tx.clone();
  57. thread::spawn(move || {
  58. loop {
  59. tx.send(widget::Message::Update).expect("Failed to send update");
  60. thread::sleep(time::Duration::from_secs(1));
  61. }
  62. });
  63. }
  64. loop {
  65. let event = rx.recv();
  66. if panel.handle_event(event.unwrap()) {
  67. println!("Exiting");
  68. break;
  69. }
  70. }
  71. }
  72. 0
  73. }