fluxbox_apps_menu 1.2.0 → 1.3.0

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: d0396fb427fa3641352a8803e034f697afac4d60
4
- data.tar.gz: 7b53ce6ad5c763e07cd42706933320dd6bbcbe6d
3
+ metadata.gz: 299c16c1c64506b78ab3c7d9cdf87f0c7b035315
4
+ data.tar.gz: a5ed2130437276cdc9329db41b91725ff3a260ba
5
5
  SHA512:
6
- metadata.gz: 883eaeab6f1e6f6e8b76b5c1783856065c64d9923cb2a83b39ef8e9310934da7d977e00b6202da034643975bad3395cec7571cd0302cc510ccf066af9b9545cd
7
- data.tar.gz: 020895fcbc7c2527015bb3c5e672d830bb9286933870802e4e99fd0f277cd222a805ca2cb01a82db9382fbeb341126c491f92ebc787bccdb9fec934d84e8258c
6
+ metadata.gz: 5268a846daa828e7f7bff6751f42cbb1ba46e00a9e24cfa960d5f88b2728e2093b1e87a42c847509aee474eb728ece1de165973fab0fe6f33450cefe01930cf2
7
+ data.tar.gz: b3954afe8f8967aba09b1f265551c3c21c680a4ab99808d010b6e22eb2406c5e1886ae18a4bda75bb69e2f97bf33e16b3f8d6fd891d6b2893e0eb837015e424c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluxbox_apps_menu (1.1.2)
4
+ fluxbox_apps_menu (1.3.0)
5
5
  inifile (~> 3.0)
6
6
  thor
7
7
 
@@ -9,8 +9,8 @@ GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
11
  inifile (3.0.0)
12
- rake (10.1.0)
13
- thor (0.19.1)
12
+ rake (12.0.0)
13
+ thor (0.19.4)
14
14
 
15
15
  PLATFORMS
16
16
  ruby
@@ -19,3 +19,6 @@ DEPENDENCIES
19
19
  bundler (~> 1.6)
20
20
  fluxbox_apps_menu!
21
21
  rake
22
+
23
+ BUNDLED WITH
24
+ 1.14.5
data/README.md CHANGED
@@ -24,21 +24,23 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
- Build the menu
27
+ Build the menu:
28
28
 
29
29
  $ fluxbox_apps_menu build
30
-
31
- Create a copy of the config file (*fluxbox_apps_menu.yaml*) under
32
- the _~/.fluxbox_ folder
33
30
 
34
- $ fluxbox_apps_menu menuconfig
35
-
36
- When the application menu is built it can be included in
37
- your main fluxbox menu file (usually *~/.fluxbox/menu*) adding
38
- the row below where you want display it:
31
+ When the application menu is built it can be included in your main fluxbox menu file
32
+ (usually *~/.fluxbox/menu*) adding the row below where you want display it:
39
33
 
40
34
  [include] (~/.fluxbox/menu-apps)
41
35
 
36
+
37
+ To start with customizations create a copy of the config file (*fluxbox_apps_menu.yaml*)
38
+ under the _~/.fluxbox_ folder:
39
+
40
+ $ fluxbox_apps_menu config
41
+
42
+ Once completed build again!
43
+
42
44
  ## Get help
43
45
 
44
46
  Where to start
@@ -48,7 +50,7 @@ Where to start
48
50
  Get help for a specific task
49
51
 
50
52
  $ fluxbox_apps_menu help build
51
- $ fluxbox_apps_menu help menuconfig
53
+ $ fluxbox_apps_menu help config
52
54
 
53
55
  More help
54
56
 
@@ -4,16 +4,13 @@ require 'fluxbox_apps_menu/menu'
4
4
  require 'fluxbox_apps_menu/desktop_file'
5
5
  require 'fluxbox_apps_menu/utils'
6
6
 
7
- $VERBOSE = nil
8
-
9
7
  module FluxboxAppsMenu
10
8
 
11
9
  class Builder
12
10
 
13
11
  def initialize(opts)
14
- #p opts; exit
15
12
  @filename = opts[:filename].to_s.empty? ? 'menu-apps' : opts[:filename]
16
- @silent = opts[:silent]
13
+ @verbose = opts[:verbose]
17
14
  @overwrite = opts[:overwrite]
18
15
  @cfg = FluxboxAppsMenu::Config.new
19
16
  @fmenu = FluxboxAppsMenu::Menu.new(@cfg)
@@ -22,7 +19,7 @@ module FluxboxAppsMenu
22
19
  def create_menu
23
20
  if @overwrite == false
24
21
  if File.exists?(File.expand_path("~/.fluxbox/#{@filename}"))
25
- puts "The file #{@filename} already exists!" unless @silent
22
+ STDERR.puts 'Fatal Error! '.bold.red "The file #{@filename} already exists!"
26
23
  exit
27
24
  end
28
25
  end
@@ -35,7 +32,7 @@ module FluxboxAppsMenu
35
32
  def init_config
36
33
  unless @overwrite
37
34
  if File.exists?(File.expand_path("~/.fluxbox/fluxbox_apps_menu.yaml"))
38
- puts '[Error] '.bold.red + "The file 'fluxbox_apps_menu.yaml' already exists in '#{File.expand_path('~/.fluxbox')}'" unless @silent
35
+ STDERR.puts 'Fatal Error! '.bold.red + "The file 'fluxbox_apps_menu.yaml' already exists in '#{File.expand_path('~/.fluxbox')}'"
39
36
  exit
40
37
  end
41
38
  end
@@ -47,7 +44,7 @@ module FluxboxAppsMenu
47
44
  def scan_app_folder
48
45
  @cfg.app_paths.each do |d|
49
46
 
50
- Dir.glob(d + '/*.desktop') do |f|
47
+ Dir.glob(File.expand_path(d + '/*.desktop')) do |f|
51
48
 
52
49
  ini = DesktopFile.new(f, @cfg)
53
50
 
@@ -56,35 +53,47 @@ module FluxboxAppsMenu
56
53
  name = ini.name
57
54
 
58
55
  if ini.hidden?
59
- puts '[Hidden] '.bold.green + "The application \"#{name}\" is hidden" unless @silent
56
+ puts '[H] '.bold.gray + "\"#{name}\" (#{f})" if @verbose
60
57
  next
61
58
  end
62
59
 
63
60
  cat = ini.categories
64
61
  if cat.nil?
65
- puts '[No Category] '.bold.red + "The application \"#{name}\" doesn't have any category" unless @silent
62
+ puts '[C] '.bold.red + "\"#{name}\" (#{f})" if @verbose
66
63
  next
67
64
  end
68
65
 
69
66
  begin
70
- submenu = @fmenu.assign_menu(cat, name)
67
+ submenu = @fmenu.assign_menu(cat, name)
71
68
  rescue NoCategoriesError => e
72
- puts '[No category] '.bold.red + "The \"#{e.message}\" menu item doesn't have any categoty, check your \"fluxbox_menu_apps.yaml\""
69
+ STDERR.puts 'Fatal Error! '.bold.red + "The \"#{e.message}\" menu item doesn't have any category, fix it to your \"fluxbox_menu_apps.yaml\""
73
70
  exit
74
71
  end
75
72
 
76
73
  unless submenu.nil?
77
74
  icon = ini.icon
78
75
  if icon.nil?
79
- puts '[No Icon] '.bold.yellow + "The application \"#{name}\" doesn't have any icon" unless @silent
76
+ puts '[I] '.bold.yellow + "\"#{name}\" (#{f})" if @verbose
80
77
  end
81
78
 
82
- submenu[name] = @fmenu.item_exec(name, icon, ini.exec)
79
+ submenu[name] = MenuItem.new(:label => name, :icon => icon, :command => ini.exec)
80
+ puts '[V]'.bold.green + " \"#{name}\" (#{f})" if @verbose
83
81
  else
84
- puts '[No mapped category] '.bold.red + "The application \"#{name}\" doesn't have any mapped category among: #{ini.categories.join(', ')}" unless @silent
82
+ STDERR.puts 'Warning! '.bold.yellow + "\"#{name}\" doesn't have any mapped category among: #{ini.categories.join(', ')}, fix it to your \"fluxbox_menu_apps.yaml\" "
85
83
  end
86
84
  end
87
85
  end
86
+
87
+ if @verbose
88
+ puts ''
89
+ puts 'Quick Help:'
90
+ puts ''
91
+ puts ' [V]: Everything is ok'.bold.green
92
+ puts ' [H]: Hidden app'.bold.gray
93
+ puts ' [I]: App without icon'.bold.yellow
94
+ puts ' [C]: App without categories'.bold.red
95
+ puts ''
96
+ end
88
97
  end
89
98
 
90
99
  end
@@ -7,6 +7,10 @@
7
7
  :banned_files:
8
8
  - 'qmmp_.*'
9
9
  - 'umplayer_.*'
10
+ :unhide_files:
11
+ - 'nm-connection-editor'
12
+ - 'bluedevilsendfile'
13
+ - 'bluedevilwizard'
10
14
  :icon_paths:
11
15
  - /usr/share/icons/gnome/16x16/apps
12
16
  - /usr/share/icons/oxygen/16x16/apps
@@ -22,6 +26,7 @@
22
26
  - /usr/share/applications
23
27
  - /usr/share/applications/kde4
24
28
  - /usr/share/applications/YaST2
29
+ - ~/.local/share/applications
25
30
  :menu:
26
31
  Development:
27
32
  :icon: applications-development
@@ -8,33 +8,39 @@ module FluxboxAppsMenu
8
8
 
9
9
  desc 'build', 'Build the menu'
10
10
  method_option :filename, :aliases => '-f', :default => '', :desc => 'Save as filename.'
11
- method_option :silent, :aliases => '-s', :default => false, :type => :boolean, :desc => 'Don\'t show any output message.'
11
+ method_option :verbose, :aliases => '-v', :default => false, :type => :boolean, :desc => 'Print helping output messages.'
12
12
  method_option :overwrite, :aliases => '-o', :default => true, :type => :boolean, :desc => 'Overwrite the app menu if exists.'
13
13
  def build
14
14
  FluxboxAppsMenu::Builder.new(options).create_menu
15
15
  end
16
16
 
17
- desc 'menuconfig', 'Make a local copy of the configuration file.'
17
+ desc 'config', 'Make a local copy of the configuration file.'
18
18
  method_option :overwrite, :aliases => '-o', :default => false, :type => :boolean, :desc => 'Overwrite the config file if exists.'
19
- def menuconfig
19
+ def config
20
20
  FluxboxAppsMenu::Builder.new(options).init_config
21
21
  end
22
-
22
+
23
23
  def help(arg = nil)
24
24
  if arg.nil?
25
25
  puts <<EOL
26
+
26
27
  FluxboxAppsMenu v.#{FluxboxAppsMenu::VERSION} by Fabio Mucciante
27
28
 
28
29
  Description:
29
- Build a Fluxbox menu putting the applications in the right
30
- section as configured within the "fluxbox_apps_menu.yaml" file.
30
+ Generates a menu for Fluxbox containing the applications installed
31
+ and visible in other DE menus.
32
+
33
+ Customizations on the building process are achieved editing the
34
+ "fluxbox_apps_menu.yaml" file copied under the "~/.fluxbox"
35
+ folder by the "config" task.
36
+ Watch the online page for more info:
37
+
38
+ https://github.com/fabiomux/fluxbox_apps_menu/wiki
31
39
 
32
- Using the "menuconfig" task a copy of this file will be created
33
- under the "~/.fluxbox" path.
40
+ The file containing the application tree will be created by
41
+ default to "~/.fluxbox/menu-apps" and can be included within the
42
+ main menu adding the line:
34
43
 
35
- The application's menu file will be created in "~/.fluxbox/menu-apps"
36
- and can be included within your fluxbox menu adding the row below:
37
-
38
44
  [include] (~/.fluxbox/menu-apps)
39
45
 
40
46
  EOL
@@ -44,7 +50,7 @@ EOL
44
50
  end
45
51
  end
46
52
 
47
- default_task :build
53
+ # default_task :build
48
54
  end
49
55
 
50
56
  end
@@ -2,7 +2,7 @@ require 'yaml'
2
2
 
3
3
  module FluxboxAppsMenu
4
4
  class Config
5
- attr_reader :lang, :icon_paths, :filename, :banned_files, :app_paths, :icons, :terminal
5
+ attr_reader :lang, :icon_paths, :filename, :banned_files, :unhide_files, :app_paths, :icons, :terminal
6
6
  attr_accessor :menu
7
7
 
8
8
  def initialize
@@ -19,8 +19,9 @@ module FluxboxAppsMenu
19
19
  yaml = YAML.load_file(@filename)
20
20
 
21
21
  @banned_files = yaml[:banned_files]
22
+ @unhide_files = yaml[:unhide_files]
22
23
  @icon_paths = yaml[:icon_paths]
23
- @app_paths = yaml[:app_paths] + [ ENV['HOME'] + '/.local/share/applications']
24
+ @app_paths = yaml[:app_paths]
24
25
  @menu = yaml[:menu]
25
26
  @icons = yaml[:icons]
26
27
  @terminal = yaml[:terminal]
@@ -22,6 +22,7 @@ module FluxboxAppsMenu
22
22
  end
23
23
 
24
24
  def hidden?
25
+ @cfg.unhide_files.each { |r| return false if @filename =~ Regexp.new(r) }
25
26
  %w(true 1).include? @ini['Desktop Entry']['NoDisplay'].to_s
26
27
  end
27
28
 
@@ -44,9 +45,10 @@ module FluxboxAppsMenu
44
45
  end
45
46
 
46
47
  def exec
47
- com = @ini['Desktop Entry']['Exec'].to_s.gsub('%c', name).gsub('%F', '')
48
- .gsub('%i', '').gsub('%U', '').gsub('%f', '').gsub('%m', '')
49
- .gsub('%u', '').gsub(/[ ]{2,}/, ' ').gsub(/\ }/, '}').strip
48
+ com = @ini['Desktop Entry']['Exec'].to_s
49
+ .gsub(/((?:"){,1})%c\1/, "\\1#{name}\\1")
50
+ .gsub(/((?:"){,1})(%F|%i|%U|%f|%m|%u)\1/, '')
51
+ .gsub(/[ ]{2,}/, ' ').gsub(/\ }/, '}').strip
50
52
 
51
53
  terminal? ? @cfg.terminal + ' ' + com : com
52
54
  end
@@ -1,43 +1,92 @@
1
+ require 'delegate'
2
+
1
3
  module FluxboxAppsMenu
2
4
 
3
- class Menu
5
+ class MenuItem
6
+ attr_accessor :label, :icon, :command, :level
4
7
 
5
- def initialize(cfg = nil)
6
- @cfg = cfg.nil? ? FluxboxAppsMenu::Config.new : cfg
7
- end
8
+ def initialize(args = {})
9
+ @label = args[:label] if args.has_key? :label
10
+ @icon = args[:icon] if args.has_key? :icon
11
+ @command = args[:command] if args.has_key? :command
12
+ @level = args[:level] if args.has_key? :level
8
13
 
9
- def assign_menu(cat, label)
10
- traverse_menu(@cfg.menu, cat.map(&:downcase), label)[0]
14
+ @rendered = []
15
+ @level ||= 0
11
16
  end
12
17
 
13
- def render
14
- render_menu(@cfg.menu)
18
+ def wrap_item(str)
19
+ "#{' ' * level}#{str}\n"
15
20
  end
16
21
 
17
- def item_exec(label, icon, command)
18
- menu_item(label, icon, 'exec', command)
22
+ def <<(str)
23
+ @rendered << str
24
+ self
19
25
  end
20
26
 
21
- def item_submenu(label, icon)
22
- menu_item(label, icon, 'submenu')
27
+ def render
28
+ @rendered
23
29
  end
30
+ end
31
+
32
+ class SeparatorItem < SimpleDelegator
24
33
 
25
- def item_separator
26
- menu_item('', '', 'separator')
34
+ def initialize(obj)
35
+ super(obj)
36
+ obj << wrap_item('[separator]')
27
37
  end
38
+ end
28
39
 
29
- # type = submenu, exec, separator
30
- private
40
+ class ExecItem < SimpleDelegator
31
41
 
32
- def menu_item(label, icon, type = 'exec', command = nil)
42
+ def initialize(obj)
43
+ super(obj)
33
44
  str = []
34
- str << "[#{type}]"
45
+ str << '[exec]'
35
46
  str << "(#{label.gsub(/(?<!\\)\)/, '\)')})" unless label.to_s.empty?
36
47
  str << "{#{command}}" unless command.nil?
37
48
  str << "<#{icon}>" unless icon.to_s.empty?
38
49
 
39
- str.join(' ')
50
+ obj << wrap_item(str.join(' '))
40
51
  end
52
+ end
53
+
54
+ class StartSubmenuItem < SimpleDelegator
55
+
56
+ def initialize(obj)
57
+ super(obj)
58
+ str = []
59
+ str << '[submenu]'
60
+ str << "(#{label.gsub(/(?<!\\)\)/, '\)')})" unless label.to_s.empty?
61
+ str << "<#{icon}>" unless icon.to_s.empty?
62
+
63
+ obj << wrap_item(str.join(' '))
64
+ end
65
+ end
66
+
67
+ class EndSubmenuItem < SimpleDelegator
68
+
69
+ def initialize(obj)
70
+ super(obj)
71
+ obj << wrap_item('[end]')
72
+ end
73
+ end
74
+
75
+ class Menu
76
+
77
+ def initialize(cfg = nil)
78
+ @cfg = cfg.nil? ? FluxboxAppsMenu::Config.new : cfg
79
+ end
80
+
81
+ def assign_menu(cat, label)
82
+ traverse_menu(@cfg.menu, cat.map(&:downcase), label)[0]
83
+ end
84
+
85
+ def render
86
+ render_menu(@cfg.menu)
87
+ end
88
+
89
+ private
41
90
 
42
91
  def traverse_menu(menu, cat, label, selected_index = nil)
43
92
  #categories with smaller index are the favorites
@@ -50,7 +99,7 @@ module FluxboxAppsMenu
50
99
  if info.class == Hash
51
100
  subitems = info.select { |k, v| k.class == String }
52
101
 
53
- # when a label is set the path has high priority
102
+ # when a label is set the path has high priority
54
103
  return [info, 0] if info.has_key?(label)
55
104
 
56
105
  if info.has_key? :mandatory_categories
@@ -71,7 +120,7 @@ module FluxboxAppsMenu
71
120
  if categories.include?(c.strip)
72
121
  i = categories.index(c)
73
122
  if i < selected_index
74
- selected = info
123
+ selected = info
75
124
  selected_index = i
76
125
  end
77
126
  end
@@ -84,23 +133,28 @@ module FluxboxAppsMenu
84
133
  end
85
134
 
86
135
  def render_menu(menu, level = 0)
87
- prefix = ' ' * (level)
88
136
  text = ''
89
137
 
90
138
  # sort the items but let menu folders at the top
91
- menu = menu.select { |k, v| k.class == String }.sort_by { |k, v| v.class == String ? k.downcase : '' }
139
+ menu = menu.select { |k, v| k.class == String }.sort_by { |k, v| (v.kind_of? MenuItem) ? k.downcase : '' }
92
140
  menu.each do |name, items|
93
- if items.class.to_s == 'Hash'
141
+
142
+ if items.class == Hash
94
143
  icon = items[:icon]
95
144
  items = items.select { |k, v| k.class == String }
96
145
  subitems = render_menu(items, level + 1)
97
146
 
98
147
  unless subitems.empty?
99
- text += "#{prefix}#{item_submenu(name, @cfg.expand_icon(nil, icon))}\n#{subitems}#{prefix}[end]\n"
148
+ text += begin
149
+ i = MenuItem.new(:level => level, :label => name, :icon => @cfg.expand_icon(nil, icon))
150
+ EndSubmenuItem.new(StartSubmenuItem.new(i) << subitems).render
151
+ end.join
100
152
  end
101
-
102
- elsif items.class.to_s == 'String'
103
- text += prefix + items + "\n"
153
+ elsif items.kind_of? MenuItem
154
+ text += begin
155
+ items.level = level
156
+ ExecItem.new(items).render
157
+ end.join
104
158
  end
105
159
  end
106
160
 
@@ -1,3 +1,3 @@
1
1
  module FluxboxAppsMenu
2
- VERSION = "1.2.0"
2
+ VERSION = '1.3.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluxbox_apps_menu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Mucciante
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-13 00:00:00.000000000 Z
11
+ date: 2017-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler