r3status 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/r3status/battery_block.rb +23 -0
- data/lib/r3status/block.rb +28 -0
- data/lib/r3status/blocks.rb +11 -0
- data/lib/r3status/keyboard_layout_block.rb +17 -0
- data/lib/r3status/static_block.rb +17 -0
- data/lib/r3status/time_block.rb +14 -0
- data/lib/r3status/volume_block.rb +48 -0
- data/lib/r3status.rb +63 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5a0f7b146cec610563175f09c27651110f1cc009
|
4
|
+
data.tar.gz: 1ff0569ec99476d1c1e1f7be73dd85fb274cd264
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ebe6cdeb3ce62d85c12777276c336bd21fa1d237cb2bb287e92d341c762f770b0d9a12baf212a7200ef1cd8c155a54dd6d55017d45a9befc67f51c46a3c81465
|
7
|
+
data.tar.gz: aec9b989dd1df12877ddcd254959f5f40ef1f0c621304ff111d6f262684b4006960b3863f05048b390b3164e050153c4f14c8376edbcff7561fb4f9d8da7e245
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module R3Status
|
2
|
+
class BatteryBlock < Block
|
3
|
+
attr_accessor :path
|
4
|
+
|
5
|
+
def initialize(**args)
|
6
|
+
args = {colors: {charging: '#6DBB45', discharging: '#F4C91D'},
|
7
|
+
formats: {charging: 'Bat(charge) %{capacity}%',
|
8
|
+
default: 'Bat %{capacity}%'}}.merge(args)
|
9
|
+
super(args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
cap, st = capacity, status
|
14
|
+
|
15
|
+
@full_text = formats[st] % {val: cap, capacity: cap, status: st}
|
16
|
+
@text_color = colors[st]
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def status; `cat #{path}status`.chomp.downcase.to_sym end
|
21
|
+
def capacity; `cat #{path}capacity`.chomp end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module R3Status
|
2
|
+
class Block
|
3
|
+
DEFAULT_COLOR = '#ffffff'
|
4
|
+
DEFAULT_FORMAT = '%{val}'
|
5
|
+
|
6
|
+
attr_accessor :full_text, :text_color, :name, :formats, :colors
|
7
|
+
|
8
|
+
def initialize(**args)
|
9
|
+
args.each do |k, v|
|
10
|
+
v.default = v[:default] if (v.is_a? Hash) && (v.key? :default)
|
11
|
+
send "#{k}=", v
|
12
|
+
end
|
13
|
+
|
14
|
+
self.colors ||= {}
|
15
|
+
self.formats ||= Hash.new(DEFAULT_FORMAT)
|
16
|
+
end
|
17
|
+
|
18
|
+
def update; end
|
19
|
+
def clicked(button, x, y); end
|
20
|
+
|
21
|
+
def to_s(prefix: nil, postfix: nil)
|
22
|
+
%({"full_text": "#{prefix}#{full_text}#{postfix}",
|
23
|
+
"color": "#{text_color || DEFAULT_COLOR}", "name": "#{name}",
|
24
|
+
"separator": false})
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module R3Status
|
2
|
+
class KeyboardLayoutBlock < Block
|
3
|
+
def initialize(**args)
|
4
|
+
super(args)
|
5
|
+
end
|
6
|
+
|
7
|
+
def update
|
8
|
+
sym = language_symbol
|
9
|
+
@full_text = formats[sym] % {val: sym, sym: sym}
|
10
|
+
@text_color = colors[sym]
|
11
|
+
end
|
12
|
+
|
13
|
+
def language_symbol
|
14
|
+
`xkblayout-state print %s`.chomp.to_sym
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module R3Status
|
2
|
+
class StaticBlock < Block
|
3
|
+
attr_accessor :clicked_block
|
4
|
+
|
5
|
+
def initialize(**args, &block)
|
6
|
+
@clicked_block = block
|
7
|
+
|
8
|
+
super(args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def clicked(button, x, y)
|
12
|
+
return if clicked_block.nil?
|
13
|
+
args = [self, button, x, y].take(clicked_block.arity)
|
14
|
+
clicked_block.call(*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module R3Status
|
2
|
+
class VolumeBlock < Block
|
3
|
+
attr_accessor :format, :format_muted, :default_color, :color_muted, :step
|
4
|
+
|
5
|
+
def initialize(**args)
|
6
|
+
args = {formats: {muted: " %{volume}%", unmuted: " %{volume}%"},
|
7
|
+
colors: {muted: '#7CCdCD', unmuted: '#ffffff'}, step: 5,
|
8
|
+
name: "volume_master"}.merge(args)
|
9
|
+
|
10
|
+
super(args)
|
11
|
+
end
|
12
|
+
|
13
|
+
def update
|
14
|
+
vol = volume
|
15
|
+
muted = muted? ? :muted : :unmuted
|
16
|
+
@text_color = colors[muted]
|
17
|
+
@full_text = formats[muted] % {val: vol, volume: vol}
|
18
|
+
end
|
19
|
+
|
20
|
+
def clicked button, x, y
|
21
|
+
case button
|
22
|
+
when 1, 4
|
23
|
+
increase
|
24
|
+
when 2
|
25
|
+
toggle_mute
|
26
|
+
when 3, 5
|
27
|
+
decrease
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def toggle_mute
|
33
|
+
`amixer -q set Master toggle`
|
34
|
+
end
|
35
|
+
def increase
|
36
|
+
`amixer -c 0 set Master #{step}+ unmute`
|
37
|
+
end
|
38
|
+
def decrease
|
39
|
+
`amixer -c 0 set Master #{step}- unmute`
|
40
|
+
end
|
41
|
+
def volume
|
42
|
+
`amixer -c 0 get Master | grep Mono: | cut -d " " -f6 | tr -d [,],%`.to_i
|
43
|
+
end
|
44
|
+
def muted?
|
45
|
+
`amixer -c 0 get Master | grep Mono: | cut -d " " -f8 | tr -d [,]`.chomp == "off"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/r3status.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative './r3status/blocks.rb'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module R3Status
|
5
|
+
def loop_with_interval secs
|
6
|
+
loop do
|
7
|
+
start = Time.now
|
8
|
+
yield
|
9
|
+
interval = secs - (Time.now - start)
|
10
|
+
sleep(interval) if interval > 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class StatusLine
|
15
|
+
attr_reader :blocks, :prefix, :postfix, :update_interval
|
16
|
+
|
17
|
+
def initialize(prefix: " ", postfix: nil, update_interval: 0.4)
|
18
|
+
@blocks = []
|
19
|
+
@prefix = prefix
|
20
|
+
@postfix = postfix
|
21
|
+
@update_interval = update_interval
|
22
|
+
end
|
23
|
+
|
24
|
+
def << block
|
25
|
+
@blocks << block
|
26
|
+
end
|
27
|
+
|
28
|
+
def transmission
|
29
|
+
@blocks.map { |i| i.to_s(postfix: @postfix, prefix: @prefix) }.
|
30
|
+
reject { |i| i.nil? }.inject { |i, j| i << ",#{j}"}
|
31
|
+
end
|
32
|
+
def parse str
|
33
|
+
return if str.length < 2
|
34
|
+
obj = nil
|
35
|
+
|
36
|
+
str = str.sub(/\A\,/ , "")
|
37
|
+
File.open("input.txt", 'a') {|f| f.puts str }
|
38
|
+
begin
|
39
|
+
obj = JSON.parse(str)
|
40
|
+
rescue Exception => e
|
41
|
+
File.open("log.txt", 'a') {|f| f.puts e.to_s }
|
42
|
+
return
|
43
|
+
end
|
44
|
+
block = @blocks.find { |b| b.name == obj["name"] }
|
45
|
+
block.clicked(obj["button"], obj["x"], obj["y"]) unless block.nil?
|
46
|
+
end
|
47
|
+
def run
|
48
|
+
|
49
|
+
fork do
|
50
|
+
loop do
|
51
|
+
s = gets.chomp
|
52
|
+
parse s
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
puts "{\"version\":1, \"click_events\":true}["
|
57
|
+
loop_with_interval(0.2) do
|
58
|
+
@blocks.each {|b| b.update }
|
59
|
+
puts "[#{transmission}],"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: r3status
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gilad Naaman
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: r3status is ruby implmentation of the i3bar protocol, and is an alternative
|
14
|
+
to the default i3status.
|
15
|
+
email: gilad.doom@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/r3status.rb
|
21
|
+
- lib/r3status/battery_block.rb
|
22
|
+
- lib/r3status/block.rb
|
23
|
+
- lib/r3status/blocks.rb
|
24
|
+
- lib/r3status/keyboard_layout_block.rb
|
25
|
+
- lib/r3status/static_block.rb
|
26
|
+
- lib/r3status/time_block.rb
|
27
|
+
- lib/r3status/volume_block.rb
|
28
|
+
homepage: https://rubygems.org/gems/example
|
29
|
+
licenses:
|
30
|
+
- LGPL3
|
31
|
+
metadata: {}
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 2.2.2
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: i3status replacement written in ruby.
|
52
|
+
test_files: []
|