Add calendar, refactor more
This commit is contained in:
+92
-75
@@ -3,11 +3,11 @@ mod color;
|
||||
mod draw;
|
||||
mod fonts;
|
||||
mod keyboard;
|
||||
mod state;
|
||||
mod utils;
|
||||
mod widgets;
|
||||
mod state;
|
||||
|
||||
use wayland_client::{Connection, QueueHandle, WaylandSource,};
|
||||
use wayland_client::{Connection, QueueHandle, WaylandSource};
|
||||
|
||||
use calloop::{
|
||||
timer::{TimeoutAction, Timer},
|
||||
@@ -15,27 +15,16 @@ use calloop::{
|
||||
};
|
||||
use chrono::{Duration, Local, Timelike};
|
||||
|
||||
use buffer::{BufferManager, BufferView};
|
||||
use buffer::BufferView;
|
||||
use color::Color;
|
||||
use fonts::{MaybeFontMap, FontMap};
|
||||
use keyboard::Keyboard;
|
||||
use fonts::{FontMap, MaybeFontMap};
|
||||
use state::{Event, Events, State};
|
||||
use widgets::{
|
||||
Backlight, Battery, Clock, Date, Geometry, Interface, Line, WidgetUpdater,
|
||||
Backlight, Battery, Calendar, Clock, Date, Geometry, HorizontalLayout, IndexedLayout,
|
||||
Interface, InvertedHorizontalLayout, Line, Margin, VerticalLayout, Widget,
|
||||
};
|
||||
use state::State;
|
||||
|
||||
use std::thread;
|
||||
|
||||
impl WidgetUpdater for State {
|
||||
fn geometry_update(
|
||||
&mut self,
|
||||
idx: usize,
|
||||
fonts: &mut FontMap,
|
||||
geometry: &Geometry,
|
||||
) -> Geometry {
|
||||
self.widgets[idx].geometry_update(fonts, geometry)
|
||||
}
|
||||
}
|
||||
use std::{rc::Rc, thread};
|
||||
|
||||
fn main() {
|
||||
let font_thread = thread::spawn(move || {
|
||||
@@ -49,6 +38,21 @@ fn main() {
|
||||
"/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
|
||||
});
|
||||
@@ -60,19 +64,34 @@ fn main() {
|
||||
let display = conn.display();
|
||||
display.get_registry(&qhandle, ());
|
||||
|
||||
let bufmgr = BufferManager {
|
||||
buffers: Vec::new(),
|
||||
};
|
||||
|
||||
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(ping_sender, "sans", 24.));
|
||||
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!");
|
||||
|
||||
@@ -86,7 +105,12 @@ fn main() {
|
||||
|
||||
handle
|
||||
.insert_source(ping_source, |(), &mut (), state| {
|
||||
state.widgets[2].set_dirty(true);
|
||||
let events = state.events.lock().unwrap().flush();
|
||||
for widget in state.widgets.iter_mut() {
|
||||
for event in events.iter() {
|
||||
widget.event(event);
|
||||
}
|
||||
}
|
||||
state.dirty = true;
|
||||
})
|
||||
.expect("Failed to insert ping source!");
|
||||
@@ -101,8 +125,9 @@ fn main() {
|
||||
.with_nanosecond(0)
|
||||
.unwrap();
|
||||
let d = target - now;
|
||||
state.widgets[0].set_dirty(true);
|
||||
state.widgets[1].set_dirty(true);
|
||||
for widget in state.widgets.iter_mut() {
|
||||
widget.event(&Event::NewMinute);
|
||||
}
|
||||
state.dirty = true;
|
||||
|
||||
// The timer event source requires us to return a TimeoutAction to
|
||||
@@ -111,22 +136,7 @@ fn main() {
|
||||
})
|
||||
.expect("Failed to insert event source!");
|
||||
|
||||
let mut state = State {
|
||||
running: true,
|
||||
dirty: true,
|
||||
activated: false,
|
||||
base_surface: None,
|
||||
wm_base: None,
|
||||
xdg_surface: None,
|
||||
wl_shm: None,
|
||||
xdg_activation: None,
|
||||
configured: false,
|
||||
dimensions: (320, 240),
|
||||
bufmgr: bufmgr,
|
||||
widgets: vec![clock, date, battery, backlight, line, launcher],
|
||||
keyboard: Keyboard::new(),
|
||||
fonts: MaybeFontMap::Waiting(font_thread),
|
||||
};
|
||||
let mut state = State::new(widgets, layout, MaybeFontMap::Waiting(font_thread), events);
|
||||
|
||||
let mut damage = Vec::new();
|
||||
for _ in 0..state.widgets.len() {
|
||||
@@ -142,7 +152,6 @@ fn main() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut drew = false;
|
||||
let mut force = false;
|
||||
if state.bufmgr.buffers.len() == 0 {
|
||||
state.add_buffer(&qhandle);
|
||||
@@ -168,43 +177,51 @@ fn main() {
|
||||
let bg = Color::new(0., 0., 0., 1.);
|
||||
|
||||
let surface = state.base_surface.as_ref().unwrap().clone();
|
||||
for (idx, widget) in state.widgets.iter_mut().enumerate() {
|
||||
if force || widget.get_dirty() {
|
||||
widget.set_dirty(false);
|
||||
drew = true;
|
||||
|
||||
let geo = widget.geometry();
|
||||
let old_damage = damage[idx];
|
||||
|
||||
if !force {
|
||||
bufview.subgeometry(old_damage).unwrap().memset(&bg);
|
||||
} else {
|
||||
if force {
|
||||
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 new_damage = widget.draw(&mut state.fonts.unwrap().borrow_mut(), &mut subview);
|
||||
let combined_damage = new_damage.expand(old_damage);
|
||||
damage[idx] = new_damage;
|
||||
surface.damage_buffer(
|
||||
combined_damage.x as i32,
|
||||
combined_damage.y as i32,
|
||||
combined_damage.width as i32,
|
||||
combined_damage.height as i32,
|
||||
);
|
||||
//draw_box(&mut subview, &Color::new(1.0, 0.5, 0.0, 1.0), (geo.width, geo.height));
|
||||
let mut subview = bufview.subgeometry(geo).unwrap();
|
||||
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));
|
||||
}
|
||||
}
|
||||
surface.damage_buffer(0, 0, 0x7FFFFFFF, 0x7FFFFFFF)
|
||||
} else {
|
||||
let mut drew = false;
|
||||
for (idx, widget) in state.widgets.iter_mut().enumerate() {
|
||||
if force || widget.get_dirty() {
|
||||
drew = true;
|
||||
|
||||
let old_damage = damage[idx];
|
||||
bufview.subgeometry(old_damage).unwrap().memset(&bg);
|
||||
|
||||
let geo = widget.geometry();
|
||||
let mut subview = bufview.subgeometry(geo).unwrap();
|
||||
|
||||
let new_damage =
|
||||
widget.draw(&mut state.fonts.unwrap().borrow_mut(), &mut subview);
|
||||
let combined_damage = new_damage.expand(old_damage);
|
||||
damage[idx] = new_damage;
|
||||
|
||||
surface.damage_buffer(
|
||||
combined_damage.x as i32,
|
||||
combined_damage.y as i32,
|
||||
combined_damage.width as i32,
|
||||
combined_damage.height as i32,
|
||||
);
|
||||
//draw_box(&mut subview, &Color::new(1.0, 0.5, 0.0, 1.0), (geo.width, geo.height));
|
||||
}
|
||||
}
|
||||
if !drew {
|
||||
buf.release();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if !drew {
|
||||
buf.release();
|
||||
continue;
|
||||
}
|
||||
|
||||
if force {
|
||||
surface.damage_buffer(0, 0, 0x7FFFFFFF, 0x7FFFFFFF)
|
||||
}
|
||||
surface.attach(Some(&buf.buffer), 0, 0);
|
||||
surface.commit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user