main.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. mod window;
  2. use x11::xlib;
  3. use x11::xinput2;
  4. use std::ffi::CString;
  5. use std::os::raw::{c_int,c_uchar};
  6. use std::ptr;
  7. use std::io::Write;
  8. use std::os::unix::io::AsRawFd;
  9. use pango::LayoutExt;
  10. use window::{Event,Window};
  11. fn main() {
  12. unsafe {
  13. let mut w = Window::create();
  14. w.change_property("_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_DOCK");
  15. {
  16. let prop = w.intern("_NET_WM_STRUT_PARTIAL");
  17. let val = [
  18. 0i64, 0, 36, 0,
  19. 0, 0, 0, 0,
  20. 0, 3840, 0, 0,
  21. ];
  22. xlib::XChangeProperty(
  23. w.display,
  24. w.window,
  25. prop,
  26. xlib::XA_CARDINAL,
  27. 32,
  28. xlib::PropModeReplace,
  29. std::mem::transmute(val.as_ptr()),
  30. val.len() as c_int,
  31. );
  32. }
  33. {
  34. let prop = w.intern("_NET_WM_STRUT");
  35. let val = &[
  36. 0i64, 0, 36, 0,
  37. ];
  38. xlib::XChangeProperty(
  39. w.display,
  40. w.window,
  41. prop,
  42. xlib::XA_CARDINAL,
  43. 32,
  44. xlib::PropModeReplace,
  45. std::mem::transmute(val.as_ptr()),
  46. val.len() as c_int,
  47. );
  48. }
  49. w.set_title("rbar");
  50. {
  51. let mut opcode = 0;
  52. let mut event = 0;
  53. let mut error = 0;
  54. let xinput_str = CString::new("XInputExtension").unwrap();
  55. let _xinput_available =
  56. xlib::XQueryExtension(w.display, xinput_str.as_ptr(), &mut opcode, &mut event, &mut error);
  57. let mut mask: [c_uchar;1] = [0];
  58. let mut input_event_mask = xinput2::XIEventMask {
  59. deviceid: xinput2::XIAllMasterDevices,
  60. mask_len: mask.len() as i32,
  61. mask: mask.as_mut_ptr(),
  62. };
  63. let events = &[
  64. xinput2::XI_ButtonPress,
  65. xinput2::XI_ButtonRelease,
  66. ];
  67. for &event in events {
  68. xinput2::XISetMask(&mut mask, event);
  69. }
  70. match xinput2::XISelectEvents(w.display, w.window, &mut input_event_mask, 1) {
  71. status if status as u8 == xlib::Success => (),
  72. err => panic!("Failed to select events {:?}", err)
  73. }
  74. }
  75. w.set_protocols();
  76. w.map();
  77. let surf = w.get_cairo_surface();
  78. let ctx = cairo::Context::new(&surf);
  79. let window_fd = w.get_fd();
  80. let mut fds = std::mem::uninitialized();
  81. let mut input = format!("Loading...");
  82. let stdin_fd = std::io::stdin().as_raw_fd();
  83. let mut stdin = std::io::BufReader::new(std::io::stdin());
  84. let mut timer = libc::timeval {
  85. tv_sec: 5,
  86. tv_usec: 0,
  87. };
  88. let mut log = std::fs::File::create("/home/gdritter/log.txt").unwrap();
  89. draw(&ctx, "[1]");
  90. loop {
  91. use std::io::BufRead;
  92. libc::FD_ZERO(&mut fds);
  93. libc::FD_SET(window_fd, &mut fds);
  94. libc::FD_SET(stdin_fd, &mut fds);
  95. libc::select(window_fd + 1, &mut fds, ptr::null_mut(), ptr::null_mut(), &mut timer);
  96. if libc::FD_ISSET(stdin_fd, &mut fds) {
  97. input = String::new();
  98. stdin.read_line(&mut input).unwrap();
  99. log.write_fmt(format_args!("got {}", input)).unwrap();
  100. if input == "" {
  101. break;
  102. }
  103. draw(&ctx, &input);
  104. }
  105. while w.has_events() {
  106. draw(&ctx, &input);
  107. match w.handle() {
  108. Event::QuitEvent => break,
  109. Event::ShowEvent =>
  110. draw(&ctx, &input),
  111. _e => (),
  112. }
  113. }
  114. }
  115. }
  116. }
  117. fn draw(ctx: &cairo::Context, left: &str) {
  118. let now = time::now();
  119. ctx.set_source_rgb(0.1, 0.1, 0.1);
  120. ctx.paint();
  121. ctx.set_source_rgb(1.0, 1.0, 1.0);
  122. let layout = pangocairo::functions::create_layout(&ctx).unwrap();
  123. layout.set_alignment(pango::Alignment::Right);
  124. layout.set_width((3840 - 20) * pango::SCALE);
  125. let mut font = pango::FontDescription::from_string("Fira Mono 18");
  126. font.set_weight(pango::Weight::Bold);
  127. layout.set_font_description(&font);
  128. ctx.move_to(10.0, 4.0);
  129. layout.set_text(&time::strftime("%a %b %d %H:%M", &now).unwrap());
  130. pangocairo::functions::show_layout(&ctx, &layout);
  131. layout.set_alignment(pango::Alignment::Left);
  132. layout.set_text(left);
  133. pangocairo::functions::show_layout(&ctx, &layout);
  134. }