1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
// Copyright (C) 2019, Hao Hou

//! # i3monkit - The i3 Status Bar Monitor Toolkit
//!
//! This is a toolkit for building customized i3 status bar for the [i3 tiling window manager](https://i3wm.org).
//! i3 has its default status bar program called `i3status`, but it's somehow limited and hard to
//! extend and customize. This crate gives you the ability to reimplement an status bar program for
//! i3 quickly.
//!
//! ![Screenshort](https://raw.githubusercontent.com/38/i3monkit/master/screenshot.png)
//!
//! It comes with a set of builtin widget as well, such as, CPU usage bar, Network speed meter,
//! etc.
//!
//! You can crate your own status bar with just a few lines of code in Rust.
//!
//! First, you need to crate a crate and import this crate
//!
//! ```toml
//! [dependencies]
//! i3mokit = "*"
//!
//! ```
//!
//! Then, config your customized i3 status bar
//!
//! ```rust
//! use i3monkit::*;                                                              
//! use i3monkit::widgets::*;                                                     
//! 
//! fn main() {
//!     let mut bar = WidgetCollection::new();
//! 
//!     //Add realtime stock prices, for example: Microsoft, AMD and Facebook
//!     let stock_client = StockClient::new("your-alphavantage-API-key");         
//!     bar.push(StockClient::create_widget(&stock_client, "MSFT"));              
//!     bar.push(StockClient::create_widget(&stock_client, "AMD"));               
//!     bar.push(StockClient::create_widget(&stock_client, "FB"));
//!                                                                               
//!     //Realtime upload/download rate for a interface                           
//!     bar.push(NetworkSpeedWidget::new("wlp58s0"));
//!                                                                               
//!     //Display all the cpu usage for each core                                 
//!     for i in 0..4 {                                                           
//!         bar.push(CpuWidget::new(i));                                          
//!     }
//!                                                                               
//!     //Volume widget                                                           
//!     bar.push(VolumeWidget::new("default", "Master", 0));
//!                                                                               
//!     //Battery status                                                          
//!     bar.push(BatteryWidget::new(0));
//!                                                                               
//!     //Time                                                                    
//!     bar.push(DateTimeWidget::new());
//!                                                                               
//!     // Then start updating the satus bar                                      
//!     bar.update_loop(I3Protocol::new(Header::new(1), std::io::stdout()));
//! }
//! ```
//!                                                                              
//! Finally, you can change `~/.config/i3/config` to make i3wm uses your status bar program
//!
//! ``` config
//!  # Start i3bar to display a workspace bar (plus the system information i3status
//!  # finds out, if available)
//!  bar {
//!  	status_command path/to/your/customized/status/program
//!  	tray_output primary
//!  	colors {
//!  	   background #222222
//!  	   statusline #00ee22
//!  	   separator #666666
//!  	   #                  border  backgr. text
//!  	   focused_workspace  #4c7899 #285577 #ffffff
//!  	   inactive_workspace #333333 #222222 #888888
//!  	   urgent_workspace   #2f343a #900000 #ffffff
//!  	}                                                           
//!   }
//! ```
//! ## Write your own widget
//!
//! You can also add your customized widget to the framework by implementing the `Widget` trait.
//!
//! ```
//! use i3monkit::{Block, Widget, WidgetUpdate};
//! struct Greeter(&'static str);
//! impl Widget for Greeter {
//!     fn update(&mut self) -> Option<WidgetUpdate> {
//!         Some(WidgetUpdate{
//!             refresh_interval: std::time::Duration::new(3600,0),
//!             data: Some(Block::new().append_full_text(self.0).clone())
//!         })
//!     }
//! }
//!
//! fn main() {
//!     let bar = WidgetCollection::new();
//!     bar.push(Greeter("hello world"));
//!     .....
//! }
//! ```
//!
mod protocol;
mod widget;
pub mod widgets;

pub use crate::protocol::{Header, I3Protocol, Block};
pub use crate::widget::{Widget, WidgetUpdate, WidgetCollection, Decoratable};