More stuff
This commit is contained in:
+86
-63
@@ -6,6 +6,7 @@ mod keyboard;
|
||||
mod state;
|
||||
mod utils;
|
||||
mod widgets;
|
||||
mod event;
|
||||
|
||||
use wayland_client::{Connection, QueueHandle, WaylandSource};
|
||||
|
||||
@@ -18,44 +19,17 @@ use chrono::{Duration, Local, Timelike};
|
||||
use buffer::BufferView;
|
||||
use color::Color;
|
||||
use fonts::{FontMap, MaybeFontMap};
|
||||
use state::{Event, Events, State};
|
||||
use state::State;
|
||||
use event::{Event, Events};
|
||||
use widgets::{
|
||||
Backlight, Battery, Calendar, Clock, Date, Geometry, HorizontalLayout, IndexedLayout,
|
||||
Audio, Backlight, Battery, Calendar, Clock, Date, Geometry, HorizontalLayout, IndexedLayout,
|
||||
Interface, InvertedHorizontalLayout, Line, Margin, VerticalLayout, Widget,
|
||||
};
|
||||
|
||||
use std::{rc::Rc, thread};
|
||||
|
||||
fn main() {
|
||||
let font_thread = thread::spawn(move || {
|
||||
let mut fm = FontMap::new();
|
||||
// Hard-coding font paths make things a lot faster
|
||||
fm.queue_font_path("sans", "/usr/share/fonts/noto/NotoSans-Regular.ttf", 128.);
|
||||
fm.queue_font_path("sans", "/usr/share/fonts/noto/NotoSans-Regular.ttf", 48.);
|
||||
fm.queue_font_path("sans", "/usr/share/fonts/noto/NotoSans-Regular.ttf", 24.);
|
||||
fm.queue_font_path(
|
||||
"monospace",
|
||||
"/usr/share/fonts/noto/NotoSansMono-Regular.ttf",
|
||||
32.,
|
||||
);
|
||||
fm.queue_font_path(
|
||||
"monospace",
|
||||
"/usr/share/fonts/noto/NotoSansMono-Regular.ttf",
|
||||
12.,
|
||||
);
|
||||
fm.queue_font_path(
|
||||
"monospace",
|
||||
"/usr/share/fonts/noto/NotoSansMono-Regular.ttf",
|
||||
12. * 1.5,
|
||||
);
|
||||
fm.queue_font_path(
|
||||
"monospace",
|
||||
"/usr/share/fonts/noto/NotoSansMono-Regular.ttf",
|
||||
12. * 2.0,
|
||||
);
|
||||
fm.load_fonts();
|
||||
fm
|
||||
});
|
||||
// let now = Local::now();
|
||||
let conn = Connection::connect_to_env().unwrap();
|
||||
|
||||
let event_queue = conn.new_event_queue();
|
||||
@@ -66,32 +40,6 @@ fn main() {
|
||||
|
||||
let (ping_sender, ping_source) = calloop::ping::make_ping().unwrap();
|
||||
|
||||
let events = Events::new(ping_sender);
|
||||
|
||||
let clock = Box::new(Clock::new("sans", 128.));
|
||||
// let calendar = Box::new(Calendar::new("monospace", 12.0, 1, -1));
|
||||
let date = Box::new(Date::new("sans", 48.));
|
||||
let line = Box::new(Line::new());
|
||||
let launcher = Box::new(Interface::new("monospace", 32.));
|
||||
let battery = Box::new(Battery::new(events.clone(), "sans", 24.));
|
||||
let backlight = Box::new(Backlight::new("intel_backlight", "sans", 24.));
|
||||
|
||||
let widgets: Vec<Box<dyn Widget>> =
|
||||
vec![clock, date, battery, backlight, line, launcher];
|
||||
let layout = Rc::new(VerticalLayout::new(vec![
|
||||
HorizontalLayout::new(vec![
|
||||
IndexedLayout::new(0),
|
||||
Margin::new(IndexedLayout::new(1), (16, 8, 0, 0)),
|
||||
VerticalLayout::new(vec![
|
||||
Margin::new(IndexedLayout::new(2), (16, 8, 8, 0)),
|
||||
Margin::new(IndexedLayout::new(3), (16, 8, 8, 0)),
|
||||
]),
|
||||
]),
|
||||
IndexedLayout::new(4),
|
||||
IndexedLayout::new(5),
|
||||
// InvertedHorizontalLayout::new(vec![IndexedLayout::new(5), IndexedLayout::new(6)]),
|
||||
]));
|
||||
|
||||
let mut event_loop: EventLoop<State> =
|
||||
EventLoop::try_new().expect("Failed to initialize the event loop!");
|
||||
|
||||
@@ -136,6 +84,79 @@ fn main() {
|
||||
})
|
||||
.expect("Failed to insert event source!");
|
||||
|
||||
let events = Events::new(ping_sender);
|
||||
|
||||
let mut fm = FontMap::new();
|
||||
|
||||
// Todo: Cache in a file
|
||||
fm.add_font_path("sans", "/usr/share/fonts/noto/NotoSans-Regular.ttf".to_string());
|
||||
fm.add_font_path("monospace", "/usr/share/fonts/noto/NotoSansMono-Regular.ttf".to_string());
|
||||
|
||||
let clock = Box::new(Clock::new(&mut fm, "sans", 128.));
|
||||
let calendar = Box::new(Calendar::new(&mut fm, "monospace", 12.0, 1, -1));
|
||||
let date = Box::new(Date::new(&mut fm, "sans", 48.));
|
||||
let line = Box::new(Line::new(1));
|
||||
let launcher = Box::new(Interface::new(events.clone(), &mut fm, "monospace", 32.));
|
||||
let battery = Box::new(Battery::new(events.clone(), &mut fm, "sans", 24.));
|
||||
let backlight = Box::new(Backlight::new("intel_backlight", &mut fm, "sans", 24.));
|
||||
let audio = Box::new(Audio::new(events.clone(), &mut fm, "sans", 24.));
|
||||
|
||||
let widgets: Vec<Box<dyn Widget>> =
|
||||
vec![clock, date, battery, backlight, audio, line, calendar, launcher];
|
||||
|
||||
let layout = Rc::new(VerticalLayout::new(vec![
|
||||
HorizontalLayout::new(vec![
|
||||
IndexedLayout::new(0),
|
||||
Margin::new(IndexedLayout::new(1), (16, 16, 0, 0)),
|
||||
VerticalLayout::new(vec![
|
||||
Margin::new(IndexedLayout::new(2), (16, 8, 8, 0)),
|
||||
Margin::new(IndexedLayout::new(3), (16, 8, 8, 0)),
|
||||
Margin::new(IndexedLayout::new(4), (16, 8, 8, 0)),
|
||||
]),
|
||||
]),
|
||||
IndexedLayout::new(5),
|
||||
InvertedHorizontalLayout::new(vec![IndexedLayout::new(6), IndexedLayout::new(7)]),
|
||||
]));
|
||||
|
||||
/* alt look
|
||||
let clock = Box::new(Clock::new(&mut fm, "sans", 256.));
|
||||
let date = Box::new(Date::new(&mut fm, "sans", 64.));
|
||||
let calendar = Box::new(Calendar::new(&mut fm, "monospace", 16.0, 3, 1));
|
||||
let launcher = Box::new(Interface::new(events.clone(), &mut fm, "monospace", 32.));
|
||||
let battery = Box::new(Battery::new(events.clone(), &mut fm, "sans", 24.));
|
||||
let backlight = Box::new(Backlight::new("intel_backlight", &mut fm, "sans", 24.));
|
||||
|
||||
let widgets: Vec<Box<dyn Widget>> =
|
||||
vec![clock, date, battery, backlight, calendar];
|
||||
|
||||
let layout = Rc::new(Margin::new(
|
||||
VerticalLayout::new(vec![
|
||||
HorizontalLayout::new(vec![
|
||||
VerticalLayout::new(vec![
|
||||
IndexedLayout::new(1),
|
||||
IndexedLayout::new(0),
|
||||
]),
|
||||
Margin::new(
|
||||
VerticalLayout::new(vec![
|
||||
Margin::new(IndexedLayout::new(2), (0, 0, 0, 8)),
|
||||
Margin::new(IndexedLayout::new(3), (0, 0, 0, 8)),
|
||||
]),
|
||||
(88, 0, 0, 0),
|
||||
),
|
||||
]),
|
||||
IndexedLayout::new(4),
|
||||
//IndexedLayout::new(5),
|
||||
]), (20, 20, 20, 20))
|
||||
);
|
||||
*/
|
||||
|
||||
let font_thread = thread::Builder::new()
|
||||
.name("fontloader".to_string())
|
||||
.spawn(move || {
|
||||
fm.load_fonts();
|
||||
fm
|
||||
}).unwrap();
|
||||
|
||||
let mut state = State::new(widgets, layout, MaybeFontMap::Waiting(font_thread), events);
|
||||
|
||||
let mut damage = Vec::new();
|
||||
@@ -174,16 +195,16 @@ fn main() {
|
||||
(state.dimensions.0 as u32, state.dimensions.1 as u32),
|
||||
);
|
||||
|
||||
let bg = Color::new(0., 0., 0., 1.);
|
||||
// eprintln!("time: {}", (Local::now() - now).num_milliseconds());
|
||||
|
||||
let surface = state.base_surface.as_ref().unwrap().clone();
|
||||
if force {
|
||||
// Other compositors probably need this.
|
||||
//bufview.memset(Color::BLACK);
|
||||
for (idx, widget) in state.widgets.iter_mut().enumerate() {
|
||||
if force || widget.get_dirty() {
|
||||
let geo = widget.geometry();
|
||||
bufview.subgeometry(geo).unwrap().memset(&bg);
|
||||
|
||||
let mut subview = bufview.subgeometry(geo).unwrap();
|
||||
let mut subview = bufview.subgeometry(geo);
|
||||
damage[idx] = widget.draw(&mut state.fonts.unwrap().borrow_mut(), &mut subview);
|
||||
//draw_box(&mut subview, &Color::new(1.0, 0.5, 0.0, 1.0), (geo.width, geo.height));
|
||||
}
|
||||
@@ -196,10 +217,10 @@ fn main() {
|
||||
drew = true;
|
||||
|
||||
let old_damage = damage[idx];
|
||||
bufview.subgeometry(old_damage).unwrap().memset(&bg);
|
||||
bufview.subgeometry(old_damage).memset(Color::BLACK);
|
||||
|
||||
let geo = widget.geometry();
|
||||
let mut subview = bufview.subgeometry(geo).unwrap();
|
||||
let mut subview = bufview.subgeometry(geo);
|
||||
|
||||
let new_damage =
|
||||
widget.draw(&mut state.fonts.unwrap().borrow_mut(), &mut subview);
|
||||
@@ -223,5 +244,7 @@ fn main() {
|
||||
|
||||
surface.attach(Some(&buf.buffer), 0, 0);
|
||||
surface.commit();
|
||||
// eprintln!("draw time: {}", (Local::now() - now).num_milliseconds());
|
||||
// std::process::exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user