From a0af850b290a4c772c5f49920376fe5b9afb5aad Mon Sep 17 00:00:00 2001 From: Johannes Holmberg Date: Wed, 16 Sep 2015 21:19:42 -0400 Subject: [PATCH] Improve the osd update code - More logical relationship between volume level and bar length - No unnecessary drawing - Volume bar shrinks properly even when volume is lowered very quickly --- wmix/ui_x.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/wmix/ui_x.c b/wmix/ui_x.c index 2ab337e..ef034c5 100644 --- a/wmix/ui_x.c +++ b/wmix/ui_x.c @@ -417,16 +417,20 @@ void update_osd(float volume, bool up) static int bar; if (config.osd) { - foo = - (((dockapp.osd_width / 100) * (volume * 100)) / 20) + 1; + foo = (dockapp.osd_width - 20) * volume / 20.0; - if ((foo != bar) || up) { - XClearArea(display, dockapp.osd, ((bar - 1) * 20), 30, - (foo * 20), 25, 1); - for (i = 1; i < foo; i++) - XFillRectangle(display, dockapp.osd, dockapp.osd_gc, - i * 20, 30, 5, 25); - } + if (up) { + for (i = 1; i <= foo; i++) + XFillRectangle(display, dockapp.osd, dockapp.osd_gc, + i * 20, 30, 5, 25); + } else if (foo < bar) { + XClearArea(display, dockapp.osd, ((foo+1) * 20), 30, + ((bar-foo) * 20), 25, 1); + } else if (foo > bar) { + for (i = (bar > 0 ? bar : 1); i <= foo; i++) + XFillRectangle(display, dockapp.osd, dockapp.osd_gc, + i * 20, 30, 5, 25); + } bar = foo; } }