Commit graph

133 commits

Author SHA1 Message Date
tobi-wan-kenobi
f5052473fb [core] Add preliminary block abstraction to output
The idea is to simplify the way the output module currently works by:
- introducing an abstraction that represents blocks; these abstractions
  contain all data - uninterpreted - required to draw a block
- separately from that, whenever the block is serialized into JSON,
  do the interpretation (pango vs. non-pango, etc.)

This - theoretically - should simplify code by creating two separate
concerns: collecting the data and actually interpreting it.
2020-04-05 10:53:17 +02:00
tobi-wan-kenobi
b5c2ca6ccf [core/output] Add generic pango support
Allow any piece of a theme that specifies a set of attributes (default,
cycles, states, widgets) to use pango *instead* of the usual attributes.

If pango is present, this will have precedence.

A practical example of this can be found in the powerline-pango theme,
which is added solely for demonstration purposes.

fixes #531
2020-04-04 14:38:37 +02:00
tobi-wan-kenobi
89247d834b [core/widget] Use __ for private variables 2020-04-04 13:58:22 +02:00
tobi-wan-kenobi
7547537c81 [core/event] Remove debug output 2020-04-04 13:57:54 +02:00
tobi-wan-kenobi
a6eb6c3a11 [core/output] Use __ for private variables 2020-04-04 13:57:42 +02:00
tobi-wan-kenobi
3aeec1c7e6 [core/module] Use __ for private variables 2020-04-04 13:55:54 +02:00
tobi-wan-kenobi
476b2000f9 [core/config] Use __ for private variables and methods 2020-04-04 13:54:08 +02:00
tobi-wan-kenobi
04fc9867ac [core/input] Move event handling to core.event
Until now, bumblebee-status did event handling in two places with almost
identical code: in core.event (makes sense) and core.input (still makes
sense, but a bit more dubious).

Changed core.input to use core.event
2020-04-04 13:52:10 +02:00
tobi-wan-kenobi
a43917594e [tests/event] Add some more tests for trigger-time args 2020-04-04 08:44:41 +02:00
tobi-wan-kenobi
52e5ad7b43 [core/input] Handle exceptions for non-existent commands 2020-04-04 08:17:35 +02:00
tobi-wan-kenobi
77443b7802 [tests/theme] Add more theme tests 2020-04-04 08:03:03 +02:00
tobi-wan-kenobi
d0200b656d [core/config] Allow string formatted intervals
Allow users to specify intervals such as '5m', for convenience
2020-04-02 16:55:36 +02:00
tobi-wan-kenobi
18154dd74f [modules] Adjust update schedules
Make a few modules update more seldomly, to reduce CPU consumption.
2020-04-02 16:30:31 +02:00
tobi-wan-kenobi
0f6dfb3f1a [core/input] do not throw on wrong event type
until now, if a module had registered callbacks, events for nonexistent
buttons caused the trigger mechanism to raise an exception.
2020-04-02 16:21:07 +02:00
tobi-wan-kenobi
2756f8fbb3 [core/theme] Fix retrieval of rotating theme values (e.g. battery)
When rotating theme values (e.g. the "charge" icon of the battery
module(s)), until now, the code just showed the raw list (because it
wasn't aware of the need to rotate).
2020-04-02 12:51:08 +02:00
tobi-wan-kenobi
95410e4adf [core/input] __ for private variables, use id as property 2020-03-29 14:43:04 +02:00
tobi-wan-kenobi
428b627daf [core/events] Use __ for private variables 2020-03-29 14:37:30 +02:00
tobi-wan-kenobi
c625baa47a [core] Move "every" to decorators module 2020-03-29 14:36:44 +02:00
tobi-wan-kenobi
bd7ff3c8f1 [core] Allow modules to specify default update interval
Expanding on the implementation in d582016, add a decorator
`core.module.every()` that allows a module to specify how often to
update the module's state.

This can still be overridden using the CLI parameter `interval`.
2020-03-29 14:32:47 +02:00
tobi-wan-kenobi
b66b13211e [modules/dunst] Fix toggling
At least Void Linux doesn't like kill -SIGUSR<N>

Also, added some debugging to inspect state changes for modules/widgets.

Also also, fix problem with min width, if no minwidth is set
2020-03-29 14:14:30 +02:00
tobi-wan-kenobi
2a93a001b2 [theme] Add unit tests for WAL loading 2020-03-28 14:51:48 +01:00
tobi-wan-kenobi
5ade8e47f0 [core/theme] Add some unit tests 2020-03-28 14:03:50 +01:00
tobi-wan-kenobi
d5820160dc [modules/sensors2] Fix runtime errors 2020-03-28 13:44:45 +01:00
tobi-wan-kenobi
908ef67109 [core/widget] bump test coverage 2020-03-27 13:54:22 +01:00
Tobias Witek
e8288ef793 [core] Add per-module interval configuration
Allow individual modules to set different update intervals by using an
overriding 'interval' parameter.

see #574
2020-03-23 15:32:06 +01:00
Tobias Witek
9076b30325 [core/output] Make tests pass again
Using an empty configuration vs. no configuration at all to make tests
run again.
2020-03-15 14:02:48 +01:00
Tobias Witek
f2dc5f4b40 [core/output] Implement autohide
Allow output to automatically hide widgets that are *not* in any
critical mode
2020-03-15 14:01:09 +01:00
Tobias Witek
5851b104c5 [modules/xrandr] Adapt to new API 2020-03-13 13:56:08 +01:00
Tobias Witek
41dc387d0c [core] Re-enable WAL support
Implement a generic "load keywords and replace during runtime"
mechanism, with the first concrete use-case of WAL colors (load them
during startup, and during runtime, whenever a matching name is found in
the keywords, replace with the actual color)
2020-03-08 14:19:21 +01:00
Tobias Witek
47e8d5b82b [core] replace widget.minwidth with widget.set('theme.minwidth') 2020-03-07 13:21:19 +01:00
Tobias Witek
b841ba3c93 [modules/battery] Re-enable battery module 2020-03-06 20:57:32 +01:00
Tobias Witek
d2e8057141 [modules] Add CPU module
Also, change minwidth from theme.minwidth to widget property
2020-03-06 14:33:40 +01:00
Tobias Witek
efc2e4f94e [modules] Separate modules into core & contrib
Also, improve errors when importing a module fails.

Also, add more tests.
2020-03-06 14:14:34 +01:00
Tobias Witek
0a0e39b516 [modules] Re-add load module 2020-03-05 21:13:15 +01:00
Tobias Witek
533b8ca0cc [modules] Re-add module nic 2020-03-01 14:36:12 +01:00
Tobias Witek
a1aec8fff6 [core/module] Add error widgets if a module throws
Module should have to care less about thrown exceptions.
2020-03-01 14:08:16 +01:00
Tobias Witek
cb3482ae27 [core/decorators] Simplify and test scrolling 2020-02-29 14:05:02 +01:00
Tobias Witek
b99ac07ef0 [core/decorators] Add more tests 2020-02-27 21:39:04 +01:00
Tobias Witek
162398c6b6 [core/output] Make error widgets critical 2020-02-24 15:07:34 +01:00
Tobias Witek
0cc744ed15 [core/output] Cache widget output for selective redraw
To make redraw work correctly and elegantly with supplementary elements
(e.g. prefix, postfix, separators), always do a full redraw of the bar
(to make the theme update correctly, but cache the actual *data* to
display inside the output.
2020-02-24 15:05:58 +01:00
Tobias Witek
1a093a73b1 [core] Add prefix/postfix support 2020-02-24 14:54:11 +01:00
Tobias Witek
37e1deaa6f [tests] Add (partial) decorator tests 2020-02-24 14:20:54 +01:00
Tobias Witek
0a266b607e [core/output] Unify common i3 attributes 2020-02-24 14:06:57 +01:00
Tobias Witek
84833dc7db [core] Add (partial) support for states
Add states to the modules and widgets. Widgets are mostly just a
pass-through (backwards compatibility, and ease of use - making states
directly inside the widgets would require more code inside the modules
to ensure that each widget is correctly updated).

Still missing:
- Separators during partial update (right now, it takes one interval
until separators are drawn correctly)
2020-02-23 21:13:49 +01:00
Tobias Witek
5e673482d3 [core] Nicify error widget 2020-02-23 14:52:58 +01:00
Tobias Witek
65186baea6 [core] Make error widget scrollable
Restrict error module to 15 characters and make it scrollable.
2020-02-23 14:47:47 +01:00
Tobias Witek
a69e058dd1 [core] Add decorators library
For now, simply add a decorator that allows for scrolling of text
2020-02-23 14:47:20 +01:00
Tobias Witek
a2446a36af [core/theme] Better separator handling
Add a generic method to the theme to get the "previous" value of an
attribute.
2020-02-23 14:31:30 +01:00
Tobias Witek
a9c1c3581a [core/theme] Iconset needs to be auto by default 2020-02-22 14:11:10 +01:00
Tobias Witek
30d34b12e0 [core/theme] Fix loading of custom iconset 2020-02-22 14:08:28 +01:00
Tobias Witek
3bb857f250 [core/theme] Add iconset support
Allow themes to specify iconsets. To do so, add a new util library
"util.algorithm", which currently contains support for deep merging of
dicts.
2020-02-22 14:07:24 +01:00
Tobias Witek
ef75e593f7 [core/config] Add stub for autohide
Add stub for autohide so that my status bar doesn't terminate with an
error (easier testing)
2020-02-22 13:44:44 +01:00
Tobias Witek
38410adcb8 [core/theme|output] Add separators
Add a way for themes to specify custom separators. Doing that, make
nicer interfaces for drawing "supplementary" components (separators)
for widgets and generalize the attribute retrieval within the theme.
2020-02-22 13:42:44 +01:00
Tobias Witek
d3fc648c08 [core/theme] Dynamically create theme accessors
Dynamically generate the accessors for a theme's attributes.

NB: This might be even nicer coming from a JSON rather than inside the
code.
2020-02-16 21:15:14 +01:00
Tobias Witek
808c46f551 [core/theme] Add separator-block-width 2020-02-16 14:54:20 +01:00
Tobias Witek
6e5e297d93 [core/theme] Add true cycling support
Using the freshly introduced eventing system, enable cycling of widget
attributes.
2020-02-16 14:39:10 +01:00
Tobias Witek
a4904d998f [core] Use core.event to decouple main and output
Make output act on events, not on concrete calls.
2020-02-16 14:30:45 +01:00
Tobias Witek
c1df1686c1 [core/event] Initial commit of simplistic event engine 2020-02-16 14:27:17 +01:00
Tobias Witek
26ae63b5ad [core/theme] Add preliminary cycling support
Add support for cycling values in a theme, for now as long as the cycle
size is 0 :P
2020-02-16 14:02:21 +01:00
Tobias Witek
affeba5b8f [core/theme] Add simple theme stub
Add support for default fg/bg colors
2020-02-15 14:05:27 +01:00
Tobias Witek
99cca7002c [core/module] Fix error display 2020-02-15 14:04:53 +01:00
Tobias Witek
5d971267db [core/theme] Add preparatory work for themes
Add two new parameters: theme and iconset

Add a placeholder class core.theme.Theme, an instance of which is passed
in to the i3 output object (which is the only object that should ever
have need of the theme, hopefully).
2020-02-09 13:46:56 +01:00
Tobias Witek
b157aa9fb5 [core/output] Minor refactoring - widget assembly 2020-02-09 13:30:40 +01:00
Tobias Witek
4e2a645bd3 [core/input] Separate module/widget update and retrieval
To make it easier to update individual modules, separate the call to
update() and the call to actually drawing the status.

Additionally, this avoids the "side effect" of updating when drawing the
status line.
2020-02-09 13:25:34 +01:00
Tobias Witek
5810a12944 [core/output] Start implementation of a partial update
Add a "patch()" method that eventually will only update affected
modules.
2020-02-08 14:22:43 +01:00
Tobias Witek
468e30ce66 [main] Add input thread logic and logging
To the main application, add an input thread that "simply" reads
sys.stdin events and transmits them via core.input.

Additionally, set up some initial logging (yeah, for threading, this is
needed immediately)
2020-02-08 13:56:52 +01:00
Tobias Witek
fca364554e [core/output] Add id of widget and module to output
In the process of that, fix a bug in how the parent class constructors
were invoked.
2020-02-08 13:45:52 +01:00
Tobias Witek
4d34fa9261 [core/input] Use util.cli to execute commands
If the registered callback is not callable (i.e. no Python method),
assume it's a command that should be invoked via a shell.
2020-02-08 13:40:51 +01:00
Tobias Witek
f9267f2131 [core/widget] fix small bug (wrong indentation) 2020-02-07 21:32:20 +01:00
Tobias Witek
e0df8b84e5 [core] Add input handling
Add a (half-finished) input library, that for now simply allows
registration and triggering of events.

As next steps, the trigger will happen as part of a separate thread that
reads input events.

Additionally, invoking commands via a execute() will be supported.

Thirdly, there is need of a way to selectively update the affected
modules (widgets), which should be possible given that the event
contains both the instance (widget ID) and name (module name).
2020-02-07 21:28:29 +01:00
Tobias Witek
6adc497f68 [core] Add support for module parameters
Parse '-p' parameters and make them accessible via 'parameter()' from
within a module (basically, restore the previous configuration
facility).

Still TODO: Add support for configuration files.
2020-02-04 21:09:11 +01:00
Tobias Witek
3a531c359f [core/module] Add config to module
Add access for all modules to the commandline parameters (called
"config" in bumblebee-status)
2020-02-03 21:30:06 +01:00
Tobias Witek
74e74bb78b [core/output] Make bar actually work (flush output)
Seems adding a \n isn't sufficient for flushing, instead explicitly
flush stdout to produce a result reliably in the i3bar.
2020-02-02 21:21:24 +01:00
Tobias Witek
445c5a65f1 [core/output] Move widget/module handling inside output
The core.output module now manages the list of modules and retrieves the
widgets inside draw() itself. That way, details of drawing/updating
widgets are not visible from the outside anymore.
2020-02-02 14:18:13 +01:00
Tobias Witek
66537fbe05 [core/output] Rewrite to hide sys.stout
Add generic "draw()" method that redirects internally to the actual
calls. These can now produce JSON, which is nicer because:

1. Easier to use during testing
2. More flexible
3. Centralizes printing (somewhat)

Still, the "suffix" concept isn't really nice, but so far, I have no
better approach.
2020-02-01 21:37:38 +01:00
Tobias Witek
7a9cb8b533 [core/module] Add very basic widget capability 2020-01-26 14:06:09 +01:00
Tobias Witek
fee7cf7882 [core/widget] Add widget class
To maintain backwards compatibility (and because I think it's an OK
design choice), keep the widget concept (a single module can produce
multiple widgets).
2020-01-26 13:58:29 +01:00
Tobias Witek
a17cd4759c [core/output] Implement simple wait
To pace the output lines, implement a simple wait() call for the i3
output.
2020-01-26 13:31:20 +01:00
Tobias Witek
5a60a23ebd [core/config] Add interval (as parameter store)
Add a generic parameter store to the configuration and use it to set the
parameter "interval" (backwards compatibility)
2020-01-25 14:24:21 +01:00
Tobias Witek
bd12a51bfb [core] Add simple module loading
Add a way to load modules located in modules/*
2020-01-19 16:06:21 +01:00
Tobias Witek
8622673114 [core] Re-enable preliminary module loading (stubbed)
Add logic for parsing commandline options, and a preliminary stub for
loading modules.

Note: The idea is that core.module.load() will return a valid, but
empty, module that displays an error, if the module cannot be loaded
2020-01-19 15:36:52 +01:00
Tobias Witek
f234f81aa9 Add missing __init__.py 2020-01-19 14:22:56 +01:00
Tobias Witek
e931bb93c6 [core] Rework core implementation
Experimental re-implementation of core functionality with the aim:
- Depend only on the Python Standard Library for core
- If modules are missing elsewhere, *never* throw
- Unit test *everything*
- Cleaner and more minimal implementation
- Better integration points for existing implementations (charts,
  braille, etc.)
- Full backwards-compatibility with existing module system (except where
  modules can be vastly simplified)
2020-01-19 13:29:34 +01:00