dynmenu 0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/dynmenu CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+
2
3
  require 'yaml'
4
+
3
5
  $subtle = true
4
6
  $lines = 20
5
7
  begin
@@ -58,6 +60,7 @@ else
58
60
  end
59
61
 
60
62
  file = ARGV[ARGV.length - 1]
63
+
61
64
  if File.exist? file
62
65
  menu = YAML::load File.read(file)
63
66
  else
data/lib/command.rb CHANGED
@@ -1,57 +1,52 @@
1
1
  require 'item'
2
+ require 'uri'
3
+
2
4
 
3
5
  class Command
4
- if $subtle
5
- @@RE_COMMAND = Regexp.new(/^[+\^\*]*.+(\s[+\^\*])*(\s[@#][A-Za-z0-9_-]+)*$/)
6
- @@RE_MODES = Regexp.new(/^[+\^\*]+$/)
7
- @@RE_SEARCH = Regexp.new(/^[gs]\s+(.*)/)
8
- @@RE_METHOD = Regexp.new(/^:\s*(.*)/)
9
- @@RE_BROWSER = Regexp.new(/(chrom[e|ium]|iron|navigator|firefox|opera)/i)
10
- end
6
+ @@RE_COMMAND = Regexp.new(/^[+\^\*]*.+(\s[+\^\*])*(\s[@#][A-Za-z0-9_-]+)*$/)
7
+ @@RE_MODES = Regexp.new(/^[+\^\*=]+$/)
8
+ @@RE_METHOD = Regexp.new(/^:\s*(.*)/)
9
+ @@RE_BROWSER = Regexp.new(/(chrom[e|ium]|iron|navigator|firefox|opera)/i)
10
+ @@RE_SEARCH = Regexp.new(/^[gs]\s+(.*)/)
11
11
  @@RE_URI = Regexp.new(/^((w\s+((https?|ftp):\/\/)?)|(https?|ftp):\/\/)(?:[A-Z0-9-]+.)+[A-Z]{2,6}([\/?].+)?$/i)
12
12
  @@RE_PROTO = Regexp.new(/^(http|https):\/\/.*/)
13
13
 
14
14
  include Item
15
15
 
16
+ attr_reader :tags, :views, :app, :modes, :command
17
+
16
18
  def initialize name, command = nil
17
19
  @name = name
18
- if $subtle
19
- @tags = []
20
- @views = []
21
- @app = ""
22
- @modes = ""
23
- end
20
+ clear_subtle_vars
21
+ self.command = command
22
+ end
24
23
 
25
- set_command command
24
+ def clear_subtle_vars
25
+ @tags = []
26
+ @views = []
27
+ @app = ""
28
+ @modes = []
26
29
  end
27
30
 
28
31
  def encode_with coder
29
32
  coder['name'] = @name
30
33
  coder['command'] = @command
31
- if $subtle
32
- coder['tags'] = @tags
33
- coder['views'] = @views
34
- coder['app'] = @app
35
- coder['modes'] = @modes
36
- end
34
+ coder['tags'] = @tags
35
+ coder['views'] = @views
36
+ coder['app'] = @app
37
+ coder['modes'] = @modes
37
38
  end
38
39
 
39
40
  def init_with coder
40
41
  @name = coder['name']
41
42
  @command = coder['command']
42
- if $subtle
43
- @tags = coder['tags'] || []
44
- @views = coder['views'] || []
45
- @app = coder['app'] || ""
46
- @modes = coder['modes'] || ""
47
- end
48
- end
49
-
50
- def command
51
- @command
43
+ @tags = coder['tags']
44
+ @views = coder['views']
45
+ @app = coder['app']
46
+ @modes = coder['modes']
52
47
  end
53
48
 
54
- def set_command command
49
+ def command= command
55
50
  unless command.nil? || command.empty?
56
51
  if @@RE_URI.match command
57
52
  split = Regexp.last_match(0).split(/\s+/)
@@ -64,17 +59,22 @@ class Command
64
59
  if @@RE_METHOD.match(command)
65
60
  command = Regexp.last_match(0).to_sym
66
61
  elsif @@RE_COMMAND.match command
67
- @tags = []
68
- @views = []
69
- @app = ""
70
- @modes = ""
62
+ clear_subtle_vars
71
63
 
72
64
  command.split.each do |arg|
73
65
  case arg[0]
74
66
  when '#' then @tags << arg[1..-1]
75
67
  when '@' then @views << arg[1..-1]
76
- when '+', '^', '*'
77
- @modes += @@RE_MODES.match(arg).to_s
68
+ when '+', '^', '*','='
69
+ mode_s = @@RE_MODES.match(arg).to_s
70
+ @modes += mode_s.split(//).map! do |c|
71
+ case c
72
+ when '+' then :full
73
+ when '^' then :float
74
+ when '*' then :stick
75
+ when '=' then :zaphod
76
+ end
77
+ end
78
78
  else
79
79
  if @app.nil? || @app.empty?
80
80
  @app = arg
@@ -129,11 +129,10 @@ class Command
129
129
  system "#{@command} &>/dev/null"
130
130
  end
131
131
  when URI
132
- puts @command.to_s
133
- system "xdg-open '%s' &>/dev/null &" % [ @command.to_s ]
132
+ system "xdg-open '%s' &>/dev/null" % [ @command.to_s ]
134
133
  if $subtle
135
- find_browser
136
- @browser.focus unless @browser.nil?
134
+ browser = find_browser
135
+ browser.focus unless browser.nil?
137
136
  end
138
137
  end
139
138
  true
@@ -152,23 +151,8 @@ class Command
152
151
  end
153
152
  unless (client = Subtlext::Client.spawn(@app)).nil?
154
153
  client.tags = tags unless tags.empty?
155
- unless @modes.empty?
156
- flags = []
157
-
158
- @modes.each_char do |c|
159
- case c
160
- when '+' then flags << :full
161
- when '^' then flags << :float
162
- when '*' then flags << :stick
163
- when '=' then flags << :zaphod
164
- end
165
- end
166
- client.flags = flags
167
- end
154
+ client.flags = @modes unless @modes.empty?
168
155
  end
169
- end
170
-
171
- def to_s
172
- "#{@name} => #{command}"
156
+ true
173
157
  end
174
158
  end
data/lib/editor.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'menu'
2
2
  require 'dynamic'
3
3
 
4
+
4
5
  class Editor < Menu
5
6
 
6
7
  include Dynamic
@@ -12,12 +13,12 @@ class Editor < Menu
12
13
  end
13
14
 
14
15
  def name
15
- "> #{@@name}"
16
+ "> #{Editor.name}"
16
17
  end
17
18
 
18
19
  def initialize parent
19
20
  @parent = parent
20
- set_style parent.style
21
+ self.style = parent.style
21
22
  end
22
23
 
23
24
  def to_s
@@ -35,13 +36,13 @@ class Editor < Menu
35
36
  entries << "Done"
36
37
  selection = show_menu entries, @@name
37
38
  case entries.index selection
38
- when 0 then @parent.set_name show_menu([@parent.name], "Edit Name")
39
- when 1 then @parent.set_style show_style_menu
39
+ when 0 then @parent.name = show_menu([@parent.name], "Edit Name")
40
+ when 1 then @parent.style = show_style_menu
40
41
  when 2 then show_entries_menu
41
42
  when 3 then show_run_menu_menu
42
43
  end
43
44
  end
44
- @parent.execute
45
+ false
45
46
  end
46
47
 
47
48
  def show_run_menu_menu
@@ -57,7 +58,7 @@ class Editor < Menu
57
58
  entries << "Done"
58
59
  selection = show_menu entries, "Run menu"
59
60
  case entries.index selection
60
- when 0 then @parent.set_run_menu !@parent.run_menu?
61
+ when 0 then @parent.run_menu = !@parent.run_menu?
61
62
  when 1 then show_history_menu
62
63
  end
63
64
  end
@@ -78,15 +79,15 @@ class Editor < Menu
78
79
  entries << "Done"
79
80
 
80
81
  selection = show_menu entries, "History"
81
- case entries.index.selection
82
+ case entries.index selection
82
83
  when 0
83
84
  selection = (show_menu [], "Enter a number")
84
85
  number = selection.to_i
85
- @parent.history.set_length number unless number < 1 || number.to_s != selection
86
+ @parent.history.length = number unless number < 1 || number.to_s != selection
86
87
  when 1
87
88
  selection = (show_menu [], "Enter a number")
88
89
  number = (show_menu [], "Enter a number").to_i
89
- @parent.history.set_show_num_items number unless number.to_s != selection
90
+ @parent.history.show_num_items = number unless number.to_s != selection
90
91
  when 2 then clear = !clear
91
92
  when (entries.length - 1) then @parent.history.clear if clear
92
93
  end
@@ -112,7 +113,7 @@ class Editor < Menu
112
113
  colors = [:bg, :fg, :bg_hi, :fg_hi]
113
114
  unless (entries.index selection).nil?
114
115
  if (entries.index selection) < 4
115
- style.set_color colors[entries.index selection], show_menu([style.color(colors[entries.index selection])], "Enter a color")
116
+ style.color = colors[entries.index selection], show_menu([style.color(colors[entries.index selection])], "Enter a color")
116
117
  elsif (entries.index selection) < 5
117
118
  if style.font.nil?
118
119
  selection = show_menu(["default"], "Set font")
@@ -120,7 +121,7 @@ class Editor < Menu
120
121
  selection = show_menu([style.font], "Set font")
121
122
  end
122
123
  unless selection.nil? || selection == "default"
123
- style.set_font selection
124
+ style.font = selection
124
125
  end
125
126
  end
126
127
  end
@@ -202,12 +203,12 @@ class Editor < Menu
202
203
  case entries.index selection
203
204
  when 0
204
205
  new_name = show_menu([command.name], "Enter a name")
205
- command.set_name new_name unless new_name.empty?
206
+ command.name = new_name unless new_name.empty?
206
207
  when 1
207
208
  history = History.new 1, 1
208
209
  history.update command.command unless command.command.nil? or command.command.empty?
209
210
  new_command = Run_Menu.new(self, history, "Enter a command").show_menu
210
- command.set_command new_command unless new_command.empty?
211
+ command.command = new_command unless new_command.empty?
211
212
  when 2 then delete = !delete unless new
212
213
  end
213
214
  end
@@ -219,7 +220,7 @@ class Editor < Menu
219
220
  new = menu.nil?
220
221
  if new
221
222
  menu = Menu.new "New menu"
222
- menu.set_style @parent.style
223
+ menu.style = @parent.style
223
224
  end
224
225
  @parent.remove_item menu
225
226
  entries = []
@@ -241,7 +242,7 @@ class Editor < Menu
241
242
  selection = show_menu entries, string
242
243
  if (entries.index selection) == 0
243
244
  new_name = show_menu [], "Enter a name"
244
- menu.set_name new_name unless new_name.empty?
245
+ menu.name = new_name unless new_name.empty?
245
246
  end
246
247
  delete = !delete if (entries.index selection) == 1 && !new
247
248
  end
data/lib/history.rb CHANGED
@@ -1,24 +1,11 @@
1
1
  class History
2
- def initialize length, show_num_items = 5
3
- @items = {}
4
- set_length length
5
- set_show_num_items show_num_items
6
- end
7
-
8
- def length
9
- @length
10
- end
11
2
 
12
- def show_num_items
13
- @show_num_items
14
- end
3
+ attr_accessor :length, :show_num_items
15
4
 
16
- def set_length length
17
- @length = length
18
- end
19
-
20
- def set_show_num_items num
21
- @show_num_items = num
5
+ def initialize length, show_num_items = 5
6
+ @items = {}
7
+ self.length = length
8
+ self.show_num_items = show_num_items
22
9
  end
23
10
 
24
11
  def update item
@@ -30,11 +17,8 @@ class History
30
17
  end
31
18
 
32
19
  def items
33
- ret = {
34
- :first => ((@items.sort_by {|item,age| age}).map {|pair| pair.first}).first(@show_num_items)
35
- }
36
- ret.store :rest, (@items.reject {|item, age| ret[:first].include? item}).keys
37
- ret
20
+ sorted_items = (@items.sort_by {|item,age| age}).map {|pair| pair.first}
21
+ sorted_items.partition {|item| sorted_items.index(item) < (@show_num_items)}
38
22
  end
39
23
 
40
24
  def clear
data/lib/item.rb CHANGED
@@ -3,7 +3,7 @@ module Item
3
3
  @name
4
4
  end
5
5
 
6
- def set_name name
6
+ def name= name
7
7
  @name = name
8
8
  end
9
9
  end
data/lib/menu.rb CHANGED
@@ -1,27 +1,31 @@
1
1
  require 'item'
2
2
 
3
+
3
4
  class Menu
4
5
 
5
6
  include Item
6
7
 
8
+ attr_accessor :style
9
+ attr_writer :name
10
+
7
11
  def initialize name
8
- @name = name
12
+ self.name = name
9
13
  @items = Hash.new
10
- @style = Style.new
11
- set_item Editor.new self
14
+ self.style = Style.new
15
+ set_item(Editor.new self) unless self.is_a? Dynamic
12
16
  end
13
17
 
14
18
  def encode_with coder
15
19
  coder['name'] = @name
16
20
  coder['items'] = items
17
- coder['style'] = @style
21
+ coder['style'] = style
18
22
  end
19
23
 
20
24
  def init_with coder
21
- @name = coder['name']
25
+ self.name = coder['name']
22
26
  @items = coder['items']
23
- @style = coder['style']
24
- set_item Editor.new self
27
+ self.style = coder['style']
28
+ set_item(Editor.new self)
25
29
  end
26
30
 
27
31
  def set_item item
@@ -40,14 +44,6 @@ class Menu
40
44
  "> #{super}"
41
45
  end
42
46
 
43
- def style
44
- @style
45
- end
46
-
47
- def set_style style
48
- @style = style
49
- end
50
-
51
47
  def to_s
52
48
  string = "#{name}\n"
53
49
  string += (@items.keys.sort.map {|name| name.prepend(" ")}).join("\n")
@@ -84,8 +80,8 @@ class Menu
84
80
 
85
81
  def get_font_string
86
82
  font = ""
87
- unless @style.font.nil?
88
- font = "-fn \"#{@style.font}\""
83
+ unless self.style.font.nil?
84
+ font = "-fn \"#{self.style.font}\""
89
85
  end
90
86
  font
91
87
  end
data/lib/root_menu.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  require 'menu'
2
+
2
3
  class Root_Menu < Menu
3
4
 
5
+ attr_writer :run_menu
6
+ attr_reader :history
7
+
4
8
  def initialize history_length = 1000, history_items = 5
5
9
  super "Dynmenu"
6
- @run_menu = true
10
+ self.run_menu = true
7
11
  @history = History.new history_length, history_items
8
12
  set_item Run_Menu.new self, @history
9
13
  end
@@ -21,9 +25,6 @@ class Root_Menu < Menu
21
25
  end
22
26
  end
23
27
 
24
- def set_run_menu value
25
- @run_menu = value
26
- end
27
28
 
28
29
  def encode_with coder
29
30
  super
data/lib/run_menu.rb CHANGED
@@ -4,12 +4,12 @@ class Run_Menu < Menu
4
4
 
5
5
  include Dynamic
6
6
 
7
- @@RE_HIDDEN = Regexp.new /\/{,1}\.[^\/]*$/
7
+ @@RE_HIDDEN = Regexp.new(/(^|\/)\.[^\/]*$/i)
8
8
  def initialize parent, history = History.new(1, 5), name = "Run"
9
- @name = name
9
+ self.name = name
10
10
  @parent = parent
11
11
  @history = history
12
- set_style parent.style
12
+ self.style = parent.style
13
13
  end
14
14
 
15
15
  def name
@@ -26,8 +26,10 @@ class Run_Menu < Menu
26
26
  def show_menu
27
27
  get_files
28
28
  history_items = @history.items
29
- items = history_items[:first] + @files + history_items[:rest]
30
- super items, @name
29
+ items = history_items.first
30
+ items << '---' unless items.empty?
31
+ items += @files + history_items[1]
32
+ super items, self.name
31
33
  end
32
34
 
33
35
  def get_files dirs = (`echo $PATH`).split(':')
data/lib/style.rb CHANGED
@@ -9,7 +9,7 @@ class Style
9
9
  }
10
10
  end
11
11
 
12
- def set_color color, value
12
+ def color= color, value
13
13
  unless @colors.keys.include? color
14
14
  raise ArgumentError, "Invalid key!"
15
15
  end
@@ -26,7 +26,7 @@ class Style
26
26
  @colors[color]
27
27
  end
28
28
 
29
- def set_font font
29
+ def font= font
30
30
  @font = font
31
31
  end
32
32
  def to_s
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynmenu
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-03 00:00:00.000000000 Z
12
+ date: 2013-02-06 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A dmenu wrapper for subtle wm
15
15
  email: mail@jreinert.com
@@ -46,10 +46,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
46
  - - ! '>='
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
- requirements: []
49
+ requirements:
50
+ - dmenu
50
51
  rubyforge_project:
51
52
  rubygems_version: 1.8.23
52
53
  signing_key:
53
54
  specification_version: 3
54
55
  summary: Dynmenu
55
56
  test_files: []
57
+ has_rdoc: