r3status 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5c2c2e2a5985350fdd7009f16224f8d0ce2aa225
4
- data.tar.gz: cdfe3f6a14611a3159ff9c362809e77fe62e224c
3
+ metadata.gz: bafcfeb5316e7a7e409f3a17553495aa16c245ba
4
+ data.tar.gz: 23b1bdd423b22a0477455529117a6ff345580a11
5
5
  SHA512:
6
- metadata.gz: 6671a6a365fff74396378124de0da333ecf9bec77a1f78fed5fdf54bbf3e70ac79a2662d211814d31eb83ef34f3943d69dff37e5d3e6e25dd4d9d939bea149e3
7
- data.tar.gz: 6ee838c35dd8b83b2900eff0cdd522d1a9e3cb239e4e389869978459c643840abb0afee8ae2dd01379d47c5fad2a755386658fa1acef1ca530109a337a2a27c4
6
+ metadata.gz: 617319555169430b21f652e533283527b259fad49d806bc11ac2bdf5543efb57187ebf350880640b3abe270aef48586f47208dd9deb0ef77f286de505295eca3
7
+ data.tar.gz: f3dc133d86ae42da95eb48d895f2ea1933265262dc561447cf33fb3a7e6939cc0102e182124169fe120dae54d5beccef8e06bd9d9ee1cfa674dc22cb45f66eee
@@ -0,0 +1,33 @@
1
+ module R3Status::Blocks
2
+ # A base block for blocks who need to run the update procedure at a
3
+ # different interval than general update interval, or ones who need
4
+ # to run in the background.
5
+ class Async < Base
6
+ # The update interval (in seconds) of the block.
7
+ attr_accessor :update_interval
8
+
9
+ # Creates a new instance of this class.
10
+ # If a block is passed, it will be stored and yielded when the block is clicked.
11
+ def initialize(**args, &block)
12
+ args = {update_interval: 3}.merge(args)
13
+ super(args, &block)
14
+ end
15
+
16
+ # When first called, starts the update loop. Ignored afterwards.
17
+ def update
18
+ return unless @updater_thread.nil?
19
+ @updater_thread = Thread.new do
20
+ loop_with_interval(update_interval) { async_update }
21
+ end
22
+ end
23
+
24
+ # Signals the block to release any resources.
25
+ def terminate
26
+ @updater_thread.kill
27
+ end
28
+
29
+ # When implemented in derived classes, updates the text and color of this block.
30
+ # Implmentations should set the #full_text and #text_color attributes.
31
+ def async_update; end
32
+ end
33
+ end
@@ -0,0 +1,91 @@
1
+ require 'securerandom'
2
+ # Contains the default blocks that can be used using StatusLine.
3
+ module R3Status::Blocks
4
+ # A base class for blocks, providing the needed methods and attributes.
5
+ # Can be use both as a base for other blocks and as a block in itself.
6
+ #
7
+ # ==== Examples
8
+ # b = Blocks::Base.new(full_text: "0") do |block, button|
9
+ # block.full_text = button.to_s
10
+ # end
11
+ class Base
12
+ # The default text color. Will be used if no color was supplied, or +nil+ was given.
13
+ DEFAULT_COLOR = '#ffffff'
14
+ # The default format. Will be used if no format was supplied, or +nil+ was given.
15
+ DEFAULT_FORMAT = '%{val}'
16
+
17
+ attr_accessor(
18
+ :full_text,
19
+ :text_color,
20
+ :name,
21
+ :formats,
22
+ :colors,
23
+ :clicked_block
24
+ )
25
+
26
+ # Creates a new instance of this class.
27
+ # If a block is passed, it will be stored and yielded when the block is clicked.
28
+ def initialize(**args, &block)
29
+ @colors ||= {}
30
+ @formats ||= Hash.new(DEFAULT_FORMAT)
31
+
32
+ args.each do |k, v|
33
+ v.default = v[:default] if (v.is_a? Hash) && (v.key? :default)
34
+ send "#{k}=", v
35
+ end
36
+
37
+ @clicked_block = block
38
+ @name ||= SecureRandom.uuid
39
+ @full_text ||= format
40
+ end
41
+
42
+ # When implemented in derived classes, updates the text and color of this block.
43
+ # Implmentations should set the #full_text and #text_color attributes.
44
+ def update; end
45
+
46
+ # Handles mouse interaction with the block.
47
+ # If a block was supplied to the constructor, it will be yielded.
48
+ # button (Fixnum):: The mouse button that was used.
49
+ # x, y (Fixnum / Float):: The pointer coordinates on the screen.
50
+ def clicked(button, x, y)
51
+ return if @clicked_block.nil?
52
+ args = [self, button, x, y].take(@clicked_block.arity)
53
+ @clicked_block.(*args)
54
+ end
55
+
56
+ # Returns the string representation of this block.
57
+ # prefix::
58
+ def to_s(prefix: nil, postfix: nil)
59
+ %({"full_text": "#{prefix}#{full_text}#{postfix}",
60
+ "color": "#{text_color || DEFAULT_COLOR}", "name": "#{name}",
61
+ "separator": false})
62
+ end
63
+
64
+ # Returns the default format string.
65
+ def format
66
+ formats.default
67
+ end
68
+
69
+ # Sets the default format string.
70
+ def format=(fmt)
71
+ formats.default = fmt
72
+ end
73
+
74
+ # Returns the default color.
75
+ def color
76
+ colors.default
77
+ end
78
+
79
+ # Sets the default color.
80
+ def color=(color)
81
+ colors.default = color
82
+ end
83
+
84
+ # Signals the block to release any resources.
85
+ def terminate; end
86
+
87
+ # When implemented in derived class, returns the current state of the block,
88
+ # if available.
89
+ def state; end
90
+ end
91
+ end
@@ -0,0 +1,28 @@
1
+ module R3Status::Blocks
2
+ # A block that displays the current date and time.
3
+ #
4
+ # ==== States
5
+ # :am, :pm
6
+ #
7
+ # ==== Format values
8
+ # See http://www.ruby-doc.org/core-2.1.3/Time.html#method-i-strftime
9
+ class Clock < Base
10
+
11
+ # Creates a new instance of this class.
12
+ # If a block is passed, it will be stored and yielded when the block is clicked.
13
+ def initialize(**args, &block)
14
+ args = {format: "%H:%m %e/%M/%Y"}.merge(args)
15
+ super(args, &block)
16
+ end
17
+
18
+ # Updates the text and color of this block.
19
+ def update
20
+ self.full_text = Time.now.strftime(formats[state])
21
+ end
22
+
23
+ # Returns the current state of the block
24
+ def state
25
+ Time.now.strftime('%P').to_sym
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ module R3Status::Blocks
2
+ # A block that acts as a keyboard layout indicator.
3
+ #
4
+ # ==== States
5
+ # There are no constant states. A state is the current keyboard layout,
6
+ # as specified by the system. (e.g. +:us+ for US English, +:ru+ for Russian)
7
+ #
8
+ # ==== Format values
9
+ # +%{val}+, +%{sym}+: The current language symbol.
10
+ class KeyboardLayout < Base
11
+
12
+ # Creates a new instance of this class.
13
+ # If a block is passed, it will be stored and yielded when the block is clicked.
14
+ def initialize(**args, &block)
15
+ super(args, &block)
16
+ end
17
+
18
+ # Updates the text and color of this block.
19
+ def update
20
+ sym = state
21
+ @full_text = formats[sym] % {val: sym, sym: sym}
22
+ @text_color = colors[sym]
23
+ end
24
+
25
+ # Returns the current state of the block.
26
+ def state
27
+ if command? "xkblayout-state"
28
+ `xkblayout-state print %s`
29
+ else
30
+ `setxkbmap -query | awk -F"(|[ ]+)" '/layout:/ { print $2 }'`
31
+ end.chomp.to_sym
32
+ end
33
+
34
+ # Determines if a shell command exists.
35
+ def command?(command)
36
+ system("which #{command} > /dev/null 2>&1")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,59 @@
1
+ module R3Status::Blocks
2
+ # A block that acts as a power indicator.
3
+ #
4
+ # ==== States:
5
+ # :charging, :discharging, :full, :unknown, :no_battery
6
+ #
7
+ # ==== Format Values
8
+ # +%{val}+, +%{capacity}+: The current battery capacity.
9
+ class Power < Base
10
+ # The path of the battery on the disk. Examples:
11
+ # * /sys/class/power_supply/BAT1/
12
+ # * /proc/acpi/battery/BAT0/
13
+ attr_accessor :path
14
+
15
+ # Creates a new instance of this class.
16
+ # If a block is passed, it will be stored and yielded when the block is clicked.
17
+ def initialize(**args, &block)
18
+ args = {colors: {charging: '#6DBB45', discharging: '#F4C91D'},
19
+ formats: {charging: 'Bat(charge) %{capacity}%',
20
+ default: 'Bat %{capacity}%'}}.merge(args)
21
+ super(args, &block)
22
+
23
+
24
+ @path = get_battery_path if path.nil?
25
+ path << '/' if path[-1] != '/'
26
+ end
27
+
28
+ # Updates the text and color of this block.
29
+ def update
30
+ cap, st = capacity, state
31
+
32
+ @full_text = formats[st] % {val: cap, capacity: cap, state: st}
33
+ @text_color = colors[st]
34
+ end
35
+
36
+ # Returns the current state of the block
37
+ def state
38
+ return :no_battery unless File.exist? path
39
+ `cat #{path}status`.chomp.downcase.to_sym
40
+ end
41
+
42
+ # Returns the current capacity of the battery, or +nil+ if no battery found.
43
+ def capacity
44
+ return nil if state == :no_battery
45
+ `cat #{path}capacity`.chomp.to_i
46
+ end
47
+
48
+ # Try to find a valid battery path.
49
+ def get_battery_path
50
+ base_paths = ["/proc/acpi/battery/", "/sys/class/power_supply/"]
51
+ base_paths.each do |p|
52
+ if Dir.exist? p
53
+ return p + (Dir.entries(p) - %w{ . .. }).last
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -1,5 +1,5 @@
1
- module R3Status
2
- class ShellBlock < StaticBlock
1
+ module R3Status::Blocks
2
+ class Shell < Base
3
3
  attr_accessor :command, :click_commands
4
4
 
5
5
  def initialize(**args, &block)
@@ -28,5 +28,6 @@ module R3Status
28
28
  `#{click_commands[button]}`
29
29
  end
30
30
  end
31
+
31
32
  end
32
33
  end
@@ -0,0 +1,83 @@
1
+ module R3Status::Blocks
2
+ # A block that acts as a volume indicator.
3
+ # It displays the current Master Volume, and allows to user to change it using scrolling,
4
+ # and muting using the middle mouse button.
5
+ #
6
+ # ==== States
7
+ # :muted, :unmuted
8
+ #
9
+ # ==== Format values
10
+ # +%{val}+, +%{volume}+: The current system volume.
11
+ class Volume < Base
12
+ # The amount of volume (in percents) to change with scroll.
13
+ attr_accessor :step
14
+
15
+ # Creates a new instance of this class.
16
+ # If a block is passed, it will be stored and yielded when the block is clicked.
17
+ def initialize(**args, &block)
18
+ args = {formats: {muted: " %{volume}%", unmuted: " %{volume}%"},
19
+ colors: {muted: '#7CCdCD', unmuted: '#ffffff'}, step: 5,
20
+ name: "volume_master"}.merge(args)
21
+
22
+ super(args, &block)
23
+ end
24
+
25
+ # Updates the text and color of this block.
26
+ def update
27
+ vol = volume
28
+ muted = muted? ? :muted : :unmuted
29
+ @text_color = colors[muted]
30
+ @full_text = formats[muted] % {val: vol, volume: vol}
31
+ end
32
+
33
+ # Handles mouse interaction with the block.
34
+ # If a block was supplied to the constructor, it will be yielded.
35
+ # button (Fixnum):: The mouse button that was used.
36
+ # x, y (Fixnum / Float):: The pointer coordinates on the screen.
37
+ def clicked(button, x, y)
38
+ super(button, x, y)
39
+ case button
40
+ when 4
41
+ increase
42
+ when 2
43
+ toggle_mute
44
+ when 5
45
+ decrease
46
+ end
47
+ end
48
+
49
+ # Toggles the mute state of the system volume.
50
+ def toggle_mute
51
+ `amixer -q set Master toggle`
52
+ end
53
+
54
+ # Increases the system volume by the given amount.
55
+ # step:: The amount of volume to increase. If +nil+, the value default value,
56
+ # or the one supplied in the constructor, will be used.
57
+ def increase(step = nil)
58
+ `amixer -c 0 set Master #{step || @step}%+ unmute`
59
+ end
60
+
61
+ # Decreases the system volume by the given amount.
62
+ # step:: The amount of volume to decrease. If +nil+, the value default value,
63
+ # or the one supplied in the constructor, will be used.
64
+ def decrease(step = nil)
65
+ `amixer -c 0 set Master #{step || @step}%- unmute`
66
+ end
67
+
68
+ # Returns the current system volume.
69
+ def volume
70
+ `amixer -c 0 get Master | grep Mono: | cut -d " " -f6 | tr -d [,],%`.to_i
71
+ end
72
+
73
+ # Returns the mute state of the system volume.
74
+ def muted?
75
+ `amixer -c 0 get Master | grep Mono: | cut -d " " -f8 | tr -d [,]`.chomp == "off"
76
+ end
77
+
78
+ # Returns the current state of the block
79
+ def state
80
+ muted? ? :muted : :unmuted
81
+ end
82
+ end
83
+ end
@@ -1,15 +1,41 @@
1
- require_relative './block.rb'
1
+ module R3Status; end
2
2
 
3
- require_relative './static_block.rb'
3
+ require_relative './blocks/base.rb'
4
4
 
5
- require_relative './time_block.rb'
5
+ require_relative './blocks/clock.rb'
6
6
 
7
- require_relative './volume_block.rb'
7
+ require_relative './blocks/volume.rb'
8
8
 
9
- require_relative './battery_block.rb'
9
+ require_relative './blocks/power.rb'
10
10
 
11
- require_relative './keyboard_layout_block.rb'
11
+ require_relative './blocks/keyboard_layout.rb'
12
12
 
13
- require_relative './shell_block.rb'
13
+ require_relative './blocks/shell.rb'
14
14
 
15
- require_relative './async_block.rb'
15
+ require_relative './blocks/async.rb'
16
+
17
+ module R3Status
18
+ # Alias for Blocks::Base
19
+ Block = Blocks::Base
20
+
21
+ # Alias for Blocks::Base
22
+ StaticBlock = Blocks::Base
23
+
24
+ # Alias for Blocks::Volume
25
+ VolumeBlock = Blocks::Volume
26
+
27
+ # Alias for Blocks::Clock
28
+ TimeBlock = Blocks::Clock
29
+
30
+ # Alias for Blocks::Power
31
+ BatteryBlock = Blocks::Power
32
+
33
+ # Alias for Blocks::KeyboardLayout
34
+ KeyboardLayoutBlock = Blocks::KeyboardLayout
35
+
36
+ # Alias for Blocks::Async
37
+ AsyncBlock = Blocks::Async
38
+
39
+ # Alias for Blocks::Shell
40
+ ShellBlock = Blocks::Shell
41
+ end
data/lib/r3status.rb CHANGED
@@ -2,7 +2,11 @@ require_relative './r3status/blocks.rb'
2
2
  require 'json'
3
3
 
4
4
  module R3Status
5
-
5
+ # Specifies the mouse buttons and their IDs.
6
+ MOUSE_BUTTONS = {primary: 1, middle: 2, secondary: 3, scroll_up: 4, scroll_down: 5}
7
+
8
+ # Loops over the given block at the specified interval.
9
+ # The interval is the time between yields, not between a yield's ends the next's start.
6
10
  def loop_with_interval secs
7
11
  loop do
8
12
  start = Time.now
@@ -11,10 +15,27 @@ module R3Status
11
15
  sleep(interval) if interval > 0
12
16
  end
13
17
  end
14
-
18
+
19
+ # This class encapsulates a status output.
20
+ # Blocks are added by the user and are displayed each iteration.
21
+ # ==== Example
22
+ # s = StatusLine.new
23
+ # s = StatusLine.new update_interval: 3
24
+ #
25
+ # s << Blocks::Volume.new
26
+ #
27
+ # s.run
15
28
  class StatusLine
16
- attr_reader :blocks, :prefix, :postfix, :update_interval
29
+ # A list blocks to display, right to left, in the bar.
30
+ attr_reader :blocks
31
+ # An object (e.g. _String_) that will be inserted at the start of a block's text. Default: _" "_.
32
+ attr_accessor :prefix
33
+ # An object (e.g. _String_)that will be inserted at the ebd of a block's text. Default: _nil_.
34
+ attr_accessor :postfix
35
+ # The time (in seconds) between iterations. Default: _0.4_.
36
+ attr_accessor :update_interval
17
37
 
38
+ # Creates a new StatusLine object.
18
39
  def initialize(prefix: " ", postfix: nil, update_interval: 0.4)
19
40
  @blocks = []
20
41
  @prefix = prefix
@@ -22,41 +43,20 @@ module R3Status
22
43
  @update_interval = update_interval
23
44
  end
24
45
 
46
+ # Appends a new block to this StatusLine object.
25
47
  def << block
26
48
  @blocks << block
27
49
  end
28
50
 
29
- def transmission
30
- @blocks.map { |i| i.to_s(postfix: @postfix, prefix: @prefix) }.
31
- reject { |i| i.nil? }.inject { |i, j| i << ",#{j}"}
32
- end
33
-
34
- def parse str
35
- return if str.length < 2
36
- obj = nil
37
- str = str.strip.sub(/\A\,/ , "")
38
-
39
- begin
40
- obj = JSON.parse(str)
41
- rescue Exception => e
42
- return
43
- end
44
-
45
- block = @blocks.find { |b| b.name == obj["name"] }
46
- block.clicked(obj["button"], obj["x"], obj["y"]) unless block.nil?
47
- end
48
-
51
+ # Starts the operation of the status line and the output of the data to the standard output.
49
52
  def run
50
53
  @reader_thread = Thread.new do
51
- begin
52
54
  loop do
53
55
  s = gets.chomp
54
56
  parse s
55
57
  end
56
- rescue Exception => e
57
- File.open("log.txt", 'a') {|f| f.puts e.backtrace }
58
- end
59
- end.run
58
+ end
59
+ @reader_thread.run
60
60
 
61
61
  at_exit do
62
62
  @reader_thread.kill
@@ -70,5 +70,29 @@ module R3Status
70
70
  end
71
71
 
72
72
  end
73
+
74
+ private
75
+ # Generates a single transmission.
76
+ def transmission
77
+ @blocks.map { |i| i.to_s(postfix: @postfix, prefix:
78
+ @prefix) }.
79
+ reject { |i| i.nil? }.inject { |i, j| i << ",#{j}"}
80
+ end
81
+
82
+ # Parses a single input from i3bar.
83
+ def parse(str)
84
+ return if str.length < 2
85
+ obj = nil
86
+ str = str.strip.sub(/\A\,/ , "")
87
+
88
+ begin
89
+ obj = JSON.parse(str)
90
+ rescue Exception => e
91
+ return
92
+ end
93
+
94
+ block = @blocks.find { |b| b.name == obj["name"] }
95
+ block.clicked(obj["button"], obj["x"], obj["y"]) unless block.nil?
96
+ end
73
97
  end
74
98
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: r3status
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gilad Naaman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-25 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2014-09-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description: r3status is ruby implmentation of the i3bar protocol, and is an alternative
14
28
  to the default i3status.
15
29
  email: gilad.doom@gmail.com
@@ -18,15 +32,14 @@ extensions: []
18
32
  extra_rdoc_files: []
19
33
  files:
20
34
  - lib/r3status.rb
21
- - lib/r3status/async_block.rb
22
- - lib/r3status/battery_block.rb
23
- - lib/r3status/block.rb
24
35
  - lib/r3status/blocks.rb
25
- - lib/r3status/keyboard_layout_block.rb
26
- - lib/r3status/shell_block.rb
27
- - lib/r3status/static_block.rb
28
- - lib/r3status/time_block.rb
29
- - lib/r3status/volume_block.rb
36
+ - lib/r3status/blocks/async.rb
37
+ - lib/r3status/blocks/base.rb
38
+ - lib/r3status/blocks/clock.rb
39
+ - lib/r3status/blocks/keyboard_layout.rb
40
+ - lib/r3status/blocks/power.rb
41
+ - lib/r3status/blocks/shell.rb
42
+ - lib/r3status/blocks/volume.rb
30
43
  homepage: https://github.com/Gilnaa/R3Status
31
44
  licenses:
32
45
  - LGPL3
@@ -1,24 +0,0 @@
1
- module R3Status
2
- class AsyncBlock < Block
3
- attr_accessor :update_interval, :updater_thread
4
-
5
- def initialize(**args)
6
- args = {update_interval: 3}.merge(args)
7
- super(args)
8
- end
9
-
10
- def update
11
- @full_text
12
- return if @updater_pid.is_a? Fixnum
13
- @updater_thread = Thread.new do
14
- loop_with_interval(update_interval) { async_update }
15
- end
16
- end
17
-
18
- def terminate
19
- @updater_thread.kill
20
- end
21
-
22
- def async_update; end
23
- end
24
- end
@@ -1,23 +0,0 @@
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
@@ -1,37 +0,0 @@
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
- self.colors ||= {}
10
- self.formats ||= Hash.new(DEFAULT_FORMAT)
11
- args.each do |k, v|
12
- v.default = v[:default] if (v.is_a? Hash) && (v.key? :default)
13
- send "#{k}=", v
14
- end
15
- end
16
-
17
- def update; end
18
-
19
- def terminate; end
20
-
21
- def clicked(button, x, y); end
22
-
23
- def to_s(prefix: nil, postfix: nil)
24
- %({"full_text": "#{prefix}#{full_text}#{postfix}",
25
- "color": "#{text_color || DEFAULT_COLOR}", "name": "#{name}",
26
- "separator": false})
27
- end
28
-
29
- def format
30
- formats.default
31
- end
32
-
33
- def format=(fmt)
34
- @formats.default = fmt
35
- end
36
- end
37
- end
@@ -1,17 +0,0 @@
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
@@ -1,22 +0,0 @@
1
- require 'securerandom'
2
-
3
- module R3Status
4
- class StaticBlock < Block
5
- attr_accessor :clicked_block
6
-
7
- def initialize(**args, &block)
8
- @clicked_block = block
9
-
10
- super(args)
11
-
12
- @full_text ||= format
13
- @name ||= SecureRandom.uuid
14
- end
15
-
16
- def clicked(button, x, y)
17
- return if @clicked_block.nil?
18
- args = [self, button, x, y].take(@clicked_block.arity)
19
- @clicked_block.(*args)
20
- end
21
- end
22
- end
@@ -1,13 +0,0 @@
1
- module R3Status
2
- class TimeBlock < Block
3
-
4
- def initialize(**args)
5
- args = {format: "%H:%m @ %e/%M/%Y"}.merge(args)
6
- super(args)
7
- end
8
-
9
- def update
10
- self.full_text = Time.now.strftime(format)
11
- end
12
- end
13
- end
@@ -1,48 +0,0 @@
1
- module R3Status
2
- class VolumeBlock < Block
3
- attr_accessor :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 4
23
- increase
24
- when 2
25
- toggle_mute
26
- when 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