Simplify buffer positioning, introduce WLDASH_SCALE

Replace most uses of Buffer::subdimensions with Buffer::offset.

Introduce WLDASH_SCALE. Set to 2 to make wldash render at half size.
This commit is contained in:
Kenny Levinsen
2019-09-03 13:24:21 +02:00
parent 2bad68a8cf
commit 3b4c9267bb
11 changed files with 75 additions and 41 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ Consider this alpha-quality: While it works, *everything* is subject to change w
3. Put somewhere: `cp target/release/wldash /usr/local/bin/wldash` 3. Put somewhere: `cp target/release/wldash /usr/local/bin/wldash`
4. Run: `wldash` 4. Run: `wldash`
To display wldash on all outputs, set `WLDASH_ALL_OUTPUTS=1`. To display wldash on all outputs, set `WLDASH_ALL_OUTPUTS=1`. To cut size in half, set `WLDASH_SCALE=2`.
## How to use launcher ## How to use launcher
+13 -8
View File
@@ -43,10 +43,11 @@ struct AppInner {
draw_tx: Sender<Cmd>, draw_tx: Sender<Cmd>,
output_mode: OutputMode, output_mode: OutputMode,
visible: bool, visible: bool,
scale: u32,
} }
impl AppInner { impl AppInner {
fn new(tx: Sender<Cmd>, output_mode: OutputMode) -> AppInner { fn new(tx: Sender<Cmd>, output_mode: OutputMode, scale: u32) -> AppInner {
AppInner { AppInner {
compositor: None, compositor: None,
surfaces: Vec::new(), surfaces: Vec::new(),
@@ -58,6 +59,7 @@ impl AppInner {
draw_tx: tx, draw_tx: tx,
output_mode: output_mode, output_mode: output_mode,
visible: true, visible: true,
scale: scale,
} }
} }
@@ -65,6 +67,7 @@ impl AppInner {
compositor: &wl_compositor::WlCompositor, compositor: &wl_compositor::WlCompositor,
shell: &zwlr_layer_shell_v1::ZwlrLayerShellV1, shell: &zwlr_layer_shell_v1::ZwlrLayerShellV1,
dimensions: (u32, u32), dimensions: (u32, u32),
scale: u32,
configured_surfaces: Arc<Mutex<usize>>, configured_surfaces: Arc<Mutex<usize>>,
tx: Sender<Cmd>, tx: Sender<Cmd>,
output: Option<&wl_output::WlOutput>, output: Option<&wl_output::WlOutput>,
@@ -99,8 +102,8 @@ impl AppInner {
.unwrap(); .unwrap();
shell_surface.set_keyboard_interactivity(1); shell_surface.set_keyboard_interactivity(1);
shell_surface.set_size(dimensions.0, dimensions.1); shell_surface.set_size(dimensions.0/scale, dimensions.1/scale);
surface.set_buffer_scale(scale as i32);
surface.commit(); surface.commit();
(surface, shell_surface) (surface, shell_surface)
} }
@@ -134,6 +137,7 @@ impl AppInner {
&compositor, &compositor,
&shell, &shell,
self.dimensions, self.dimensions,
self.scale,
self.configured_surfaces.clone(), self.configured_surfaces.clone(),
self.draw_tx.clone(), self.draw_tx.clone(),
None, None,
@@ -149,6 +153,7 @@ impl AppInner {
&compositor, &compositor,
&shell, &shell,
self.dimensions, self.dimensions,
self.scale,
self.configured_surfaces.clone(), self.configured_surfaces.clone(),
self.draw_tx.clone(), self.draw_tx.clone(),
Some(&output.1), Some(&output.1),
@@ -271,10 +276,10 @@ impl App {
for surface in inner.surfaces.iter() { for surface in inner.surfaces.iter() {
surface.attach(Some(&new_buffer), 0, 0); surface.attach(Some(&new_buffer), 0, 0);
if force { if force {
surface.damage(0, 0, buf_x as i32, buf_y as i32); surface.damage_buffer(0, 0, buf_x as i32, buf_y as i32);
} else { } else {
for d in damage.iter() { for d in damage.iter() {
surface.damage(d.0, d.1, d.2, d.3); surface.damage_buffer(d.0, d.1, d.2, d.3);
} }
} }
surface.commit(); surface.commit();
@@ -332,8 +337,8 @@ impl App {
None None
} }
pub fn new(tx: Sender<Cmd>, output_mode: OutputMode) -> App { pub fn new(tx: Sender<Cmd>, output_mode: OutputMode, scale: u32) -> App {
let inner = Arc::new(Mutex::new(AppInner::new(tx.clone(), output_mode))); let inner = Arc::new(Mutex::new(AppInner::new(tx.clone(), output_mode, scale)));
// //
// Set up modules // Set up modules
@@ -527,7 +532,7 @@ impl App {
surface_y, surface_y,
.. ..
} => { } => {
pos = (surface_x as u32, surface_y as u32); pos = (surface_x as u32 * scale, surface_y as u32 * scale);
} }
wl_pointer::Event::Axis { axis, value, .. } => { wl_pointer::Event::Axis { axis, value, .. } => {
if axis == wl_pointer::Axis::VerticalScroll { if axis == wl_pointer::Axis::VerticalScroll {
+29
View File
@@ -67,6 +67,35 @@ impl<'a> Buffer<'a> {
}) })
} }
pub fn offset(
&mut self,
offset: (u32, u32),
) -> Result<Buffer, ::std::io::Error> {
let bounds = self.get_bounds();
if offset.0 > bounds.2
|| offset.1 > bounds.3
{
return Err(::std::io::Error::new(
::std::io::ErrorKind::Other,
format!(
"cannot create offset outside buffer: {:?} > {:?}",
offset, bounds
),
));
}
Ok(Buffer {
buf: self.buf,
dimensions: self.dimensions,
subdimensions: Some((
offset.0 + bounds.0,
offset.1 + bounds.1,
bounds.2 - offset.0,
bounds.3 - offset.1,
)),
})
}
pub fn memset(&mut self, c: &Color) { pub fn memset(&mut self, c: &Color) {
if let Some(subdim) = self.subdimensions { if let Some(subdim) = self.subdimensions {
unsafe { unsafe {
-4
View File
@@ -230,8 +230,6 @@ impl Font {
} }
pub fn draw_box(buf: &mut Buffer, c: &Color, dim: (u32, u32)) -> Result<(), ::std::io::Error> { pub fn draw_box(buf: &mut Buffer, c: &Color, dim: (u32, u32)) -> Result<(), ::std::io::Error> {
let mut buf = buf.subdimensions((0, 0, dim.0, dim.1))?;
for x in 0..dim.0 { for x in 0..dim.0 {
let _ = buf.put((x, 0), c); let _ = buf.put((x, 0), c);
let _ = buf.put((x, dim.1 - 1), c); let _ = buf.put((x, dim.1 - 1), c);
@@ -251,8 +249,6 @@ pub fn draw_bar(
height: u32, height: u32,
fill: f32, fill: f32,
) -> Result<(), ::std::io::Error> { ) -> Result<(), ::std::io::Error> {
let mut buf = buf.subdimensions((0, 0, length, height))?;
let mut fill_pos = ((length as f32) * fill) as u32; let mut fill_pos = ((length as f32) * fill) as u32;
if fill_pos > length { if fill_pos > length {
fill_pos = length; fill_pos = length;
+5 -1
View File
@@ -29,6 +29,10 @@ fn main() {
Ok(dir) => dir + "/wldash", Ok(dir) => dir + "/wldash",
Err(_) => "/tmp/wldash".to_string(), Err(_) => "/tmp/wldash".to_string(),
}; };
let scale = match env::var("WLDASH_SCALE") {
Ok(s) => s.parse().unwrap(),
Err(_) => 1,
};
let args: Vec<String> = env::args().collect(); let args: Vec<String> = env::args().collect();
let mode = match args.len() { let mode = match args.len() {
@@ -84,7 +88,7 @@ fn main() {
Err(_) => OutputMode::Active, Err(_) => OutputMode::Active,
}; };
let mut app = App::new(tx_draw, output_mode); let mut app = App::new(tx_draw, output_mode, scale);
app.wipe(); app.wipe();
let worker_queue = app.cmd_queue(); let worker_queue = app.cmd_queue();
+3 -3
View File
@@ -108,19 +108,19 @@ impl ModuleImpl for Backlight {
buf.memset(bg); buf.memset(bg);
let c = Color::new(1.0, 1.0, 1.0, 1.0); let c = Color::new(1.0, 1.0, 1.0, 1.0);
self.font.draw_text( self.font.draw_text(
&mut buf.subdimensions((0, 0, 128, 24))?, buf,
bg, bg,
&c, &c,
"backlight", "backlight",
)?; )?;
draw_bar( draw_bar(
&mut buf.subdimensions((128, 0, 464, 24))?, &mut buf.offset((128, 0))?,
&c, &c,
464, 464,
24, 24,
self.brightness(), self.brightness(),
)?; )?;
draw_box(&mut buf.subdimensions((128, 0, 464, 24))?, &c, (464, 24))?; draw_box(&mut buf.offset((128, 0))?, &c, (464, 24))?;
Ok(vec![buf.get_signed_bounds()]) Ok(vec![buf.get_signed_bounds()])
} }
+3 -3
View File
@@ -214,13 +214,13 @@ impl ModuleImpl for UpowerBattery {
}; };
self.font.draw_text( self.font.draw_text(
&mut buf.subdimensions((0, 0, 128, 24))?, &mut buf.offset((0, 0))?,
bg, bg,
&text_color, &text_color,
"battery", "battery",
)?; )?;
draw_bar( draw_bar(
&mut buf.subdimensions((128, 0, 464, 24))?, &mut buf.offset((128, 0))?,
&bar_color, &bar_color,
464, 464,
24, 24,
@@ -228,7 +228,7 @@ impl ModuleImpl for UpowerBattery {
)?; )?;
draw_box( draw_box(
&mut buf.subdimensions((128, 0, 464, 24))?, &mut buf.offset((128, 0))?,
&bar_color, &bar_color,
(464, 24), (464, 24),
)?; )?;
+8 -8
View File
@@ -48,14 +48,14 @@ impl Calendar {
// //
self.month_cache.draw_text( self.month_cache.draw_text(
&mut buf.subdimensions((0, 0, 304, 72))?, buf,
background_color, background_color,
&Color::new(1.0, 1.0, 1.0, 1.0), &Color::new(1.0, 1.0, 1.0, 1.0),
month_str, month_str,
)?; )?;
if time.year() != orig.year() { if time.year() != orig.year() {
self.year_cache.draw_text( self.year_cache.draw_text(
&mut buf.subdimensions((320, 0, 48, 32))?, &mut buf.offset((320, 0))?,
background_color, background_color,
&Color::new(0.8, 0.8, 0.8, 1.0), &Color::new(0.8, 0.8, 0.8, 1.0),
&format!("{:}", time.year()), &format!("{:}", time.year()),
@@ -79,7 +79,7 @@ impl Calendar {
}; };
self.day_cache.draw_text( self.day_cache.draw_text(
&mut buf.subdimensions((idx * 48 + 4, (y_off * 32) + 64, 24, 16))?, &mut buf.offset((idx * 48 + 4, (y_off * 32) + 64))?,
background_color, background_color,
&Color::new(1.0, 1.0, 1.0, 1.0), &Color::new(1.0, 1.0, 1.0, 1.0),
&wk_chr, &wk_chr,
@@ -105,7 +105,7 @@ impl Calendar {
// //
let wk = time.iso_week(); let wk = time.iso_week();
self.calendar_cache.draw_text( self.calendar_cache.draw_text(
&mut buf.subdimensions((0 * 48, (y_off * 32) + 64, 32, 32))?, &mut buf.offset((0 * 48, (y_off * 32) + 64))?,
background_color, background_color,
&Color::new(0.75, 0.75, 0.75, 1.0), &Color::new(0.75, 0.75, 0.75, 1.0),
&format!("{:02}", wk.week()), &format!("{:02}", wk.week()),
@@ -123,7 +123,7 @@ impl Calendar {
}; };
self.calendar_cache.draw_text( self.calendar_cache.draw_text(
&mut buf.subdimensions((x_pos * 48, (y_off * 32) + 64, 32, 32))?, &mut buf.offset((x_pos * 48, (y_off * 32) + 64))?,
background_color, background_color,
&c, &c,
&format!("{:02}", time.day()), &format!("{:02}", time.day()),
@@ -195,13 +195,13 @@ impl ModuleImpl for Calendar {
.unwrap(); .unwrap();
} }
self.draw_month( self.draw_month(
&mut buf.subdimensions((0, 0, 368, 320))?, &mut buf.offset((0, 0))?,
background_color, background_color,
&time, &time,
&t.pred().with_day(1).unwrap(), &t.pred().with_day(1).unwrap(),
)?; )?;
self.draw_month( self.draw_month(
&mut buf.subdimensions((432, 0, 368, 320))?, &mut buf.offset((432, 0))?,
background_color, background_color,
&time, &time,
&t, &t,
@@ -212,7 +212,7 @@ impl ModuleImpl for Calendar {
t.with_month(t.month() + 1).unwrap() t.with_month(t.month() + 1).unwrap()
}; };
self.draw_month( self.draw_month(
&mut buf.subdimensions((864, 0, 368, 320))?, &mut buf.offset((864, 0))?,
background_color, background_color,
&time, &time,
&n, &n,
+2 -2
View File
@@ -58,7 +58,7 @@ impl ModuleImpl for Clock {
buf.memset(bg); buf.memset(bg);
self.date_cache.draw_text( self.date_cache.draw_text(
&mut buf.subdimensions((0, 0, 240 * 2 + 56, 64))?, buf,
bg, bg,
&Color::new(1.0, 1.0, 1.0, 1.0), &Color::new(1.0, 1.0, 1.0, 1.0),
&format!( &format!(
@@ -71,7 +71,7 @@ impl ModuleImpl for Clock {
)?; )?;
self.clock_cache.draw_text_fixed_width( self.clock_cache.draw_text_fixed_width(
&mut buf.subdimensions((0, 64, 240 * 2 + 56, 256))?, &mut buf.offset((0, 64))?,
bg, bg,
&Color::new(1.0, 1.0, 1.0, 1.0), &Color::new(1.0, 1.0, 1.0, 1.0),
&[120, 120, 56, 120, 120], &[120, 120, 56, 120, 120],
+7 -7
View File
@@ -73,7 +73,7 @@ impl Launcher {
Color::new(1.0, 1.0, 1.0, 1.0) Color::new(1.0, 1.0, 1.0, 1.0)
}; };
let dim = self.font.borrow_mut().auto_draw_text( let dim = self.font.borrow_mut().auto_draw_text(
&mut buf.subdimensions((0, 0, 1232, 32))?, buf,
bg, bg,
&c, &c,
&self.input, &self.input,
@@ -86,7 +86,7 @@ impl Launcher {
let mut width_remaining: i32 = 1232 - x_off as i32; let mut width_remaining: i32 = 1232 - x_off as i32;
for (idx, m) in self.matches.iter().enumerate() { for (idx, m) in self.matches.iter().enumerate() {
let mut b = match buf.subdimensions((x_off, 0, width_remaining as u32, 32)) { let mut b = match buf.offset((x_off, 0)) {
Ok(b) => b, Ok(b) => b,
Err(_) => break, Err(_) => break,
}; };
@@ -135,7 +135,7 @@ impl Launcher {
.font .font
.borrow_mut() .borrow_mut()
.auto_draw_text( .auto_draw_text(
&mut buf.subdimensions((0, 0, 1232, 32))?, buf,
bg, bg,
&Color::new(1.0, 1.0, 0.0, 1.0), &Color::new(1.0, 1.0, 0.0, 1.0),
"=", "=",
@@ -145,7 +145,7 @@ impl Launcher {
let x_off = if self.input.len() > 0 { let x_off = if self.input.len() > 0 {
let dim = self.font.borrow_mut().auto_draw_text( let dim = self.font.borrow_mut().auto_draw_text(
&mut buf.subdimensions((x_off, 0, 1232 - x_off, 32))?, &mut buf.offset((x_off, 0))?,
bg, bg,
&Color::new(1.0, 1.0, 1.0, 1.0), &Color::new(1.0, 1.0, 1.0, 1.0),
&self.input[1..], &self.input[1..],
@@ -158,7 +158,7 @@ impl Launcher {
if let Some(result) = &self.result { if let Some(result) = &self.result {
self.font.borrow_mut().auto_draw_text( self.font.borrow_mut().auto_draw_text(
&mut buf.subdimensions((x_off, 0, 1232 - x_off, 32))?, &mut buf.offset((x_off, 0))?,
bg, bg,
&Color::new(0.75, 0.75, 0.75, 1.0), &Color::new(0.75, 0.75, 0.75, 1.0),
&format!(" = {:}", result), &format!(" = {:}", result),
@@ -179,7 +179,7 @@ impl Launcher {
.font .font
.borrow_mut() .borrow_mut()
.auto_draw_text( .auto_draw_text(
&mut buf.subdimensions((0, 0, 1232, 32))?, &mut buf.offset((0, 0))?,
bg, bg,
&Color::new(1.0, 1.0, 0.0, 1.0), &Color::new(1.0, 1.0, 0.0, 1.0),
"!", "!",
@@ -189,7 +189,7 @@ impl Launcher {
if self.input.len() > 0 { if self.input.len() > 0 {
self.font.borrow_mut().auto_draw_text( self.font.borrow_mut().auto_draw_text(
&mut buf.subdimensions((x_off, 0, 1232 - x_off, 32))?, &mut buf.offset((x_off, 0))?,
bg, bg,
&Color::new(1.0, 1.0, 1.0, 1.0), &Color::new(1.0, 1.0, 1.0, 1.0),
&self.input[1..], &self.input[1..],
+4 -4
View File
@@ -487,20 +487,20 @@ impl ModuleImpl for PulseAudio {
Color::new(1.0, 1.0, 1.0, 1.0) Color::new(1.0, 1.0, 1.0, 1.0)
}; };
self.font.draw_text( self.font.draw_text(
&mut buf.subdimensions((0, 0, 128, 24))?, buf,
bg, bg,
&Color::new(1.0, 1.0, 1.0, 1.0), &Color::new(1.0, 1.0, 1.0, 1.0),
"volume", "volume",
)?; )?;
draw_bar(&mut buf.subdimensions((128, 0, 464, 24))?, &c, 464, 24, vol)?; draw_bar(&mut buf.offset((128, 0))?, &c, 464, 24, vol)?;
let mut iter = 1.0; let mut iter = 1.0;
while vol > 1.0 { while vol > 1.0 {
let c = &Color::new(0.75 / iter, 0.25 / iter, 0.25 / iter, 1.0); let c = &Color::new(0.75 / iter, 0.25 / iter, 0.25 / iter, 1.0);
vol -= 1.0; vol -= 1.0;
iter += 1.0; iter += 1.0;
draw_bar(&mut buf.subdimensions((128, 0, 464, 24))?, &c, 464, 24, vol)?; draw_bar(&mut buf.offset((128, 0))?, &c, 464, 24, vol)?;
} }
draw_box(&mut buf.subdimensions((128, 0, 464, 24))?, &c, (464, 24))?; draw_box(&mut buf.offset((128, 0))?, &c, (464, 24))?;
Ok(vec![buf.get_signed_bounds()]) Ok(vec![buf.get_signed_bounds()])
} }