volay 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rubocop.yml +10 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -0
- data/LICENSE +674 -0
- data/MANIFEST +38 -0
- data/README.md +52 -0
- data/Rakefile +9 -0
- data/bin/volay +34 -0
- data/glade/icons/volume-high.png +0 -0
- data/glade/icons/volume-low.png +0 -0
- data/glade/icons/volume-medium.png +0 -0
- data/glade/icons/volume-muted.png +0 -0
- data/glade/volay.glade +99 -0
- data/lib/volay/app.rb +62 -0
- data/lib/volay/cli.rb +44 -0
- data/lib/volay/config.rb +91 -0
- data/lib/volay/exceptions.rb +6 -0
- data/lib/volay/mixer/alsa.rb +48 -0
- data/lib/volay/mixer/default.rb +72 -0
- data/lib/volay/utils.rb +40 -0
- data/lib/volay/version.rb +4 -0
- data/lib/volay/volay.rb +11 -0
- data/lib/volay/widget/events.rb +22 -0
- data/lib/volay/widget/system_tray.rb +91 -0
- data/lib/volay/widget/volume_control.rb +37 -0
- data/lib/volay.rb +20 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/volay/app_spec.rb +56 -0
- data/spec/volay/config_spec.rb +64 -0
- data/spec/volay/mixer/alsa_spec.rb +56 -0
- data/spec/volay/mixer/default_spec.rb +44 -0
- data/spec/volay/utils_spec.rb +52 -0
- data/spec/volay/widget/volume_control_spec.rb +27 -0
- data/task/manifest.rake +9 -0
- data/task/rubocop.rake +5 -0
- data/task/spec.rake +6 -0
- data/volay.gemspec +27 -0
- metadata +208 -0
data/MANIFEST
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
.gitignore
|
2
|
+
.rubocop.yml
|
3
|
+
.travis.yml
|
4
|
+
Gemfile
|
5
|
+
LICENSE
|
6
|
+
MANIFEST
|
7
|
+
README.md
|
8
|
+
Rakefile
|
9
|
+
bin/volay
|
10
|
+
glade/icons/volume-high.png
|
11
|
+
glade/icons/volume-low.png
|
12
|
+
glade/icons/volume-medium.png
|
13
|
+
glade/icons/volume-muted.png
|
14
|
+
glade/volay.glade
|
15
|
+
lib/volay.rb
|
16
|
+
lib/volay/app.rb
|
17
|
+
lib/volay/cli.rb
|
18
|
+
lib/volay/config.rb
|
19
|
+
lib/volay/exceptions.rb
|
20
|
+
lib/volay/mixer/alsa.rb
|
21
|
+
lib/volay/mixer/default.rb
|
22
|
+
lib/volay/utils.rb
|
23
|
+
lib/volay/version.rb
|
24
|
+
lib/volay/volay.rb
|
25
|
+
lib/volay/widget/events.rb
|
26
|
+
lib/volay/widget/system_tray.rb
|
27
|
+
lib/volay/widget/volume_control.rb
|
28
|
+
spec/spec_helper.rb
|
29
|
+
spec/volay/app_spec.rb
|
30
|
+
spec/volay/config_spec.rb
|
31
|
+
spec/volay/mixer/alsa_spec.rb
|
32
|
+
spec/volay/mixer/default_spec.rb
|
33
|
+
spec/volay/utils_spec.rb
|
34
|
+
spec/volay/widget/volume_control_spec.rb
|
35
|
+
task/manifest.rake
|
36
|
+
task/rubocop.rake
|
37
|
+
task/spec.rake
|
38
|
+
volay.gemspec
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#Volay, the Volume System Tray
|
2
|
+
|
3
|
+
[](https://travis-ci.org/PierreRambaud/volay)
|
4
|
+
|
5
|
+
##Requirements
|
6
|
+
|
7
|
+
* Ruby 1.9.3 or newer
|
8
|
+
|
9
|
+
##Installation
|
10
|
+
|
11
|
+
From Rubygems:
|
12
|
+
|
13
|
+
```
|
14
|
+
$ gem install volay
|
15
|
+
```
|
16
|
+
|
17
|
+
From Github:
|
18
|
+
|
19
|
+
```
|
20
|
+
$ git clone https://github.com/PierreRambaud/volay.git
|
21
|
+
$ cd volay
|
22
|
+
$ bundle install
|
23
|
+
$ bundle exec rake install
|
24
|
+
```
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
```bash
|
29
|
+
$ volay -h
|
30
|
+
Volay, the Volume System Tray.
|
31
|
+
-d, --down PERCENT Down volume
|
32
|
+
-l, --log_level LEVEL Set the log level (debug, info, warn, error, fatal)
|
33
|
+
-m, --toggle-mute Toggle mute
|
34
|
+
-u, --up PERCENT Up volume
|
35
|
+
-h, --help Show this message
|
36
|
+
```
|
37
|
+
|
38
|
+
If no arguments are passed, the Gtk app is launched.
|
39
|
+
|
40
|
+
## Running tests
|
41
|
+
|
42
|
+
To run unit tests:
|
43
|
+
`$ bundle exec rake spec`
|
44
|
+
|
45
|
+
To check code style:
|
46
|
+
`$ bundle exec rake rubocop`
|
47
|
+
|
48
|
+
To run all tests:
|
49
|
+
`$ bundle exec rake`
|
50
|
+
|
51
|
+
## License
|
52
|
+
See [LICENSE](LICENSE) file
|
data/Rakefile
ADDED
data/bin/volay
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.expand_path('../../lib/volay', __FILE__)
|
3
|
+
|
4
|
+
# Module volay
|
5
|
+
module Volay
|
6
|
+
# Main class to display app or control volume
|
7
|
+
class Main
|
8
|
+
def initialize
|
9
|
+
cli = Volay::CLI.new
|
10
|
+
cli.parse_options
|
11
|
+
Volay::Config.set(:log_level, cli.config[:log_level])
|
12
|
+
Volay::Config.init_config
|
13
|
+
if [:up, :down, :mute].any? { |k| cli.config.key?(k) }
|
14
|
+
sound(cli.config)
|
15
|
+
else
|
16
|
+
app
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def sound(config)
|
21
|
+
Volay::Config.mixer.up(config[:up]) unless config[:up].nil?
|
22
|
+
Volay::Config.mixer.down(config[:down]) unless config[:down].nil?
|
23
|
+
Volay::Config.mixer.toggle if config[:mute]
|
24
|
+
end
|
25
|
+
|
26
|
+
def app
|
27
|
+
Gtk.init
|
28
|
+
Volay::App.new('glade/volay.glade')
|
29
|
+
Gtk.main
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Volay::Main.new
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/glade/volay.glade
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- Generated with glade 3.18.3 -->
|
3
|
+
<interface>
|
4
|
+
<requires lib="gtk+" version="3.6"/>
|
5
|
+
<object class="GtkIconFactory" id="icon_factory">
|
6
|
+
<sources>
|
7
|
+
<source stock-id="volume-high" filename="/glade/icons/volume-high.png"/>
|
8
|
+
<source stock-id="volume-medium" filename="/glade/icons/volume-medium.png"/>
|
9
|
+
<source stock-id="volume-muted" filename="/glade/icons/volume-muted.png"/>
|
10
|
+
<source stock-id="volume-low" filename="/glade/icons/volume-low.png"/>
|
11
|
+
</sources>
|
12
|
+
</object>
|
13
|
+
<object class="GtkMenu" id="popup_menu">
|
14
|
+
<property name="visible">True</property>
|
15
|
+
<property name="can_focus">False</property>
|
16
|
+
<child>
|
17
|
+
<object class="GtkImageMenuItem" id="popup_menu_quit">
|
18
|
+
<property name="label">gtk-quit</property>
|
19
|
+
<property name="visible">True</property>
|
20
|
+
<property name="can_focus">False</property>
|
21
|
+
<property name="use_underline">True</property>
|
22
|
+
<property name="use_stock">True</property>
|
23
|
+
<property name="always_show_image">True</property>
|
24
|
+
<signal name="activate" handler="on_popup_menu_quit_activate" swapped="no"/>
|
25
|
+
</object>
|
26
|
+
</child>
|
27
|
+
</object>
|
28
|
+
<object class="GtkStatusIcon" id="status_icon">
|
29
|
+
<property name="stock">volume-muted</property>
|
30
|
+
<signal name="button-press-event" handler="on_status_icon_button_press_event" swapped="no"/>
|
31
|
+
<signal name="popup-menu" handler="on_status_icon_popup_menu" swapped="no"/>
|
32
|
+
</object>
|
33
|
+
<object class="GtkAdjustment" id="volume_adjustement">
|
34
|
+
<property name="upper">100</property>
|
35
|
+
<property name="step_increment">1</property>
|
36
|
+
<property name="page_increment">10</property>
|
37
|
+
<signal name="value-changed" handler="on_volume_adjustement_value_changed" swapped="no"/>
|
38
|
+
</object>
|
39
|
+
<object class="GtkWindow" id="system_tray_window">
|
40
|
+
<property name="width_request">25</property>
|
41
|
+
<property name="height_request">200</property>
|
42
|
+
<property name="can_focus">True</property>
|
43
|
+
<property name="events">GDK_FOCUS_CHANGE_MASK</property>
|
44
|
+
<property name="resizable">False</property>
|
45
|
+
<property name="modal">True</property>
|
46
|
+
<property name="window_position">mouse</property>
|
47
|
+
<property name="type_hint">popup-menu</property>
|
48
|
+
<property name="focus_on_map">False</property>
|
49
|
+
<property name="decorated">False</property>
|
50
|
+
<property name="deletable">False</property>
|
51
|
+
<signal name="focus-out-event" handler="on_system_tray_window_focus_out_event" swapped="no"/>
|
52
|
+
<signal name="show" handler="on_system_tray_window_show" swapped="no"/>
|
53
|
+
<child>
|
54
|
+
<object class="GtkBox" id="volume_control_box">
|
55
|
+
<property name="visible">True</property>
|
56
|
+
<property name="can_focus">False</property>
|
57
|
+
<property name="orientation">vertical</property>
|
58
|
+
<child>
|
59
|
+
<object class="GtkScale" id="volume_scale">
|
60
|
+
<property name="visible">True</property>
|
61
|
+
<property name="can_focus">True</property>
|
62
|
+
<property name="orientation">vertical</property>
|
63
|
+
<property name="adjustment">volume_adjustement</property>
|
64
|
+
<property name="inverted">True</property>
|
65
|
+
<property name="round_digits">0</property>
|
66
|
+
<property name="digits">0</property>
|
67
|
+
<signal name="realize" handler="on_volume_scale_realize" swapped="no"/>
|
68
|
+
</object>
|
69
|
+
<packing>
|
70
|
+
<property name="expand">True</property>
|
71
|
+
<property name="fill">True</property>
|
72
|
+
<property name="position">0</property>
|
73
|
+
</packing>
|
74
|
+
</child>
|
75
|
+
<child>
|
76
|
+
<object class="GtkToggleButton" id="toggle_mute">
|
77
|
+
<property name="visible">True</property>
|
78
|
+
<property name="can_focus">False</property>
|
79
|
+
<property name="receives_default">True</property>
|
80
|
+
<property name="always_show_image">True</property>
|
81
|
+
<signal name="toggled" handler="on_toggle_mute_toggled" swapped="no"/>
|
82
|
+
<child>
|
83
|
+
<object class="GtkImage" id="toggle_mute_image">
|
84
|
+
<property name="visible">True</property>
|
85
|
+
<property name="can_focus">False</property>
|
86
|
+
<property name="stock">volume-muted</property>
|
87
|
+
</object>
|
88
|
+
</child>
|
89
|
+
</object>
|
90
|
+
<packing>
|
91
|
+
<property name="expand">False</property>
|
92
|
+
<property name="fill">True</property>
|
93
|
+
<property name="position">1</property>
|
94
|
+
</packing>
|
95
|
+
</child>
|
96
|
+
</object>
|
97
|
+
</child>
|
98
|
+
</object>
|
99
|
+
</interface>
|
data/lib/volay/app.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# Volay module
|
2
|
+
module Volay
|
3
|
+
# App class
|
4
|
+
class App < Gtk::Builder
|
5
|
+
attr_accessor :signals_list
|
6
|
+
attr_reader :mixer, :utils
|
7
|
+
|
8
|
+
##
|
9
|
+
# Initialize application
|
10
|
+
#
|
11
|
+
# @param [String] path Path to glade file
|
12
|
+
#
|
13
|
+
def initialize(path)
|
14
|
+
super()
|
15
|
+
|
16
|
+
Gtk::Settings.default.gtk_button_images = true
|
17
|
+
|
18
|
+
initialize_ui(path)
|
19
|
+
initialize_mixer
|
20
|
+
initialize_events
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
##
|
26
|
+
# Initialize events
|
27
|
+
#
|
28
|
+
def initialize_events
|
29
|
+
@signals_list = {}
|
30
|
+
@utils = Volay::Utils.new(self)
|
31
|
+
@utils.update_status_icon
|
32
|
+
Volay::Widget::SystemTray.new(self)
|
33
|
+
Volay::Widget::VolumeControl.new(self)
|
34
|
+
|
35
|
+
connect_signals do |handler|
|
36
|
+
@signals_list[handler] if @signals_list.key?(handler)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
##
|
41
|
+
# Initialize mixer for controlling volume
|
42
|
+
#
|
43
|
+
def initialize_mixer
|
44
|
+
@mixer ||= Volay::Config.mixer
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Intiailize ui by overriding icons path
|
49
|
+
#
|
50
|
+
# @param [String] path Path to glade file
|
51
|
+
#
|
52
|
+
def initialize_ui(path)
|
53
|
+
# Override Icon path to prevent
|
54
|
+
# Gtk-CRITICAL **:gtk_icon_source_set_filename:
|
55
|
+
ui = File.read(path)
|
56
|
+
ui.gsub!(%r{/glade/icons},
|
57
|
+
File.expand_path('../../glade/icons',
|
58
|
+
File.dirname(__FILE__)))
|
59
|
+
add_from_string(ui)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/volay/cli.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Volay module
|
2
|
+
module Volay
|
3
|
+
# CLI implementation
|
4
|
+
class CLI
|
5
|
+
include Mixlib::CLI
|
6
|
+
|
7
|
+
banner('Volay, the Volume System Tray.')
|
8
|
+
|
9
|
+
option(:help,
|
10
|
+
short: '-h',
|
11
|
+
long: '--help',
|
12
|
+
description: 'Show this message',
|
13
|
+
on: :tail,
|
14
|
+
boolean: true,
|
15
|
+
show_options: true,
|
16
|
+
exit: 0)
|
17
|
+
|
18
|
+
option(:log_level,
|
19
|
+
short: '-l LEVEL',
|
20
|
+
long: '--log_level LEVEL',
|
21
|
+
description: 'Set the log level (debug, info, warn, error, fatal)',
|
22
|
+
in: %w(debug info warn error fatal),
|
23
|
+
default: :info,
|
24
|
+
proc: proc { |l| l.to_sym })
|
25
|
+
|
26
|
+
option(:up,
|
27
|
+
short: '-u PERCENT',
|
28
|
+
long: '--up PERCENT',
|
29
|
+
description: 'Up volume',
|
30
|
+
proc: proc { |l| l.to_i })
|
31
|
+
|
32
|
+
option(:down,
|
33
|
+
short: '-d PERCENT',
|
34
|
+
long: '--down PERCENT',
|
35
|
+
description: 'Down volume',
|
36
|
+
proc: proc { |l| l.to_i })
|
37
|
+
|
38
|
+
option(:mute,
|
39
|
+
short: '-m',
|
40
|
+
long: '--toggle-mute',
|
41
|
+
boolean: true,
|
42
|
+
description: 'Toggle mute')
|
43
|
+
end
|
44
|
+
end
|
data/lib/volay/config.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# Volay module
|
2
|
+
module Volay
|
3
|
+
# Config class
|
4
|
+
class Config
|
5
|
+
attr_reader :logger, :mixer, :options
|
6
|
+
|
7
|
+
##
|
8
|
+
# Get option
|
9
|
+
#
|
10
|
+
# @return [Mixed]
|
11
|
+
#
|
12
|
+
def self.init_config
|
13
|
+
File.write(config_file, '') unless File.exist?(config_file)
|
14
|
+
logger.level = get(:log_level)
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Get option
|
19
|
+
#
|
20
|
+
# @return [Mixed]
|
21
|
+
#
|
22
|
+
def self.get(option)
|
23
|
+
@options ||= {}
|
24
|
+
@options[option.to_sym] if @options.key?(option.to_sym)
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Set option
|
29
|
+
#
|
30
|
+
# @param [String|Symbol] option Option key
|
31
|
+
# @param [Mixed] value Option value
|
32
|
+
#
|
33
|
+
def self.set(option, value)
|
34
|
+
@options ||= {}
|
35
|
+
@options[option.to_sym] = value
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Get config file
|
40
|
+
#
|
41
|
+
# @return [String]
|
42
|
+
#
|
43
|
+
def self.config_file
|
44
|
+
File.expand_path('~/.volay')
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Get logger
|
49
|
+
#
|
50
|
+
# @return [Logger]
|
51
|
+
#
|
52
|
+
def self.logger
|
53
|
+
@logger ||= Logger.new(STDOUT)
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Initialize mixer for controlling volume
|
58
|
+
#
|
59
|
+
def self.mixer
|
60
|
+
@mixer ||= begin
|
61
|
+
if which('amixer')
|
62
|
+
Volay::Mixer::Alsa.new
|
63
|
+
else
|
64
|
+
fail MixerNotFound
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Cross-platform way of finding an executable in the $PATH.
|
71
|
+
#
|
72
|
+
# Example:
|
73
|
+
# which('ruby') #=> /usr/bin/ruby
|
74
|
+
# which('foo') #=> nil
|
75
|
+
#
|
76
|
+
# @param [String] cmd Which command
|
77
|
+
# @return [String|NilClass]
|
78
|
+
#
|
79
|
+
def self.which(cmd)
|
80
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
81
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
82
|
+
exts.each do |ext|
|
83
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
84
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Volay module
|
2
|
+
module Volay
|
3
|
+
# Mixer module
|
4
|
+
module Mixer
|
5
|
+
# Alsa class for playing with amixer
|
6
|
+
class Alsa < Default
|
7
|
+
DEFAULT_VALUE = 2
|
8
|
+
|
9
|
+
def up(value = DEFAULT_VALUE)
|
10
|
+
command("-q set Master #{value}%+")
|
11
|
+
end
|
12
|
+
|
13
|
+
def down(value = DEFAULT_VALUE)
|
14
|
+
command("-q set Master #{value}%-")
|
15
|
+
end
|
16
|
+
|
17
|
+
def value=(value)
|
18
|
+
command("-q set Master #{value}%")
|
19
|
+
end
|
20
|
+
|
21
|
+
def toggle
|
22
|
+
command('-q set Master toggle')
|
23
|
+
end
|
24
|
+
|
25
|
+
def current
|
26
|
+
result = command('get Master')
|
27
|
+
max_value = result.match(/ 0 - (\d+)/)[1].to_i
|
28
|
+
current_percent = result.match(/\[([0-9]+)%\]\s+\[o(?:n|ff)\]/)[1].to_i
|
29
|
+
current_value = ((current_percent * max_value) / 100).to_i
|
30
|
+
current_state = result.match(/\[([a-z]+)\]/)[1].to_s
|
31
|
+
|
32
|
+
{ value: current_value,
|
33
|
+
max_value: max_value,
|
34
|
+
percent: current_percent,
|
35
|
+
muted: current_state == 'on' ? false : true }
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def command(cmd)
|
41
|
+
result = Mixlib::ShellOut.new("amixer #{cmd}")
|
42
|
+
result.run_command
|
43
|
+
Volay::Config.logger.error(result.stderr) unless result.stderr.empty?
|
44
|
+
result.stdout
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Volay module
|
2
|
+
module Volay
|
3
|
+
# Mixer module
|
4
|
+
module Mixer
|
5
|
+
# Default class
|
6
|
+
class Default
|
7
|
+
##
|
8
|
+
# Up the volume
|
9
|
+
#
|
10
|
+
def up(*)
|
11
|
+
fail NotImplementedError
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# Down the volume
|
16
|
+
#
|
17
|
+
def down(*)
|
18
|
+
fail NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Set the volume
|
23
|
+
#
|
24
|
+
def value=(*)
|
25
|
+
fail NotImplementedError
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Toggle mute
|
30
|
+
#
|
31
|
+
def toggle
|
32
|
+
fail NotImplementedError
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Current data, value, max_value,
|
37
|
+
# percent and muted
|
38
|
+
#
|
39
|
+
def current
|
40
|
+
fail NotImplementedError
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Current value
|
45
|
+
#
|
46
|
+
def max_value
|
47
|
+
current[:value]
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Current value
|
52
|
+
#
|
53
|
+
def value
|
54
|
+
current[:value]
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Current percent
|
59
|
+
#
|
60
|
+
def percent
|
61
|
+
current[:percent]
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# Is muted
|
66
|
+
#
|
67
|
+
def muted?
|
68
|
+
current[:muted]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/volay/utils.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Volay module
|
2
|
+
module Volay
|
3
|
+
# Utils class
|
4
|
+
class Utils
|
5
|
+
attr_reader :app
|
6
|
+
|
7
|
+
##
|
8
|
+
# Initialize utils class
|
9
|
+
#
|
10
|
+
# @param [Gtk::Builder] app Application
|
11
|
+
#
|
12
|
+
def initialize(app)
|
13
|
+
@app = app
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# Change status icon stock
|
18
|
+
#
|
19
|
+
def update_status_icon
|
20
|
+
icon = status_icon
|
21
|
+
@app.get_object('status_icon')
|
22
|
+
.set_stock(icon)
|
23
|
+
@app.get_object('toggle_mute_image')
|
24
|
+
.set_stock(icon)
|
25
|
+
end
|
26
|
+
|
27
|
+
def status_icon
|
28
|
+
case @app.mixer.percent
|
29
|
+
when 66..100
|
30
|
+
icon = 'volume-high'
|
31
|
+
when 33..65
|
32
|
+
icon = 'volume-medium'
|
33
|
+
when 0..32
|
34
|
+
icon = 'volume-low'
|
35
|
+
end unless @app.mixer.muted?
|
36
|
+
|
37
|
+
icon.nil? ? 'volume-muted' : icon
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/volay/volay.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'gtk3'
|
2
|
+
require 'mixlib-cli'
|
3
|
+
|
4
|
+
unless $LOAD_PATH.include?(File.expand_path('../', __FILE__))
|
5
|
+
$LOAD_PATH.unshift(File.expand_path('../', __FILE__))
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'volay/version'
|
9
|
+
require 'volay/app'
|
10
|
+
require 'volay/cli'
|
11
|
+
require 'volay/widget/events'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Volay module
|
2
|
+
module Volay
|
3
|
+
# Widgets components
|
4
|
+
module Widget
|
5
|
+
# Events class
|
6
|
+
class Events
|
7
|
+
attr_reader :app
|
8
|
+
|
9
|
+
##
|
10
|
+
# Initialize signals events
|
11
|
+
#
|
12
|
+
def initialize(app)
|
13
|
+
@app = app
|
14
|
+
|
15
|
+
methods.each do |name|
|
16
|
+
next unless name.match(/^on_/)
|
17
|
+
@app.signals_list[name.to_s] = method(name)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|