launchy 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGES → HISTORY} +18 -11
- data/README +19 -37
- data/Rakefile +62 -0
- data/bin/launchy +0 -0
- data/gemspec.rb +41 -0
- data/lib/launchy.rb +46 -51
- data/lib/launchy/application.rb +160 -149
- data/lib/launchy/browser.rb +89 -76
- data/lib/launchy/command_line.rb +38 -38
- data/lib/launchy/paths.rb +53 -0
- data/lib/launchy/version.rb +12 -13
- data/spec/application_spec.rb +51 -52
- data/spec/browser_spec.rb +46 -46
- data/spec/launchy_spec.rb +13 -13
- data/spec/paths_spec.rb +15 -0
- data/spec/version_spec.rb +6 -6
- data/tasks/announce.rake +39 -0
- data/tasks/config.rb +107 -0
- data/tasks/distribution.rake +46 -0
- data/tasks/documentation.rake +32 -0
- data/tasks/rspec.rake +29 -0
- data/tasks/rubyforge.rake +52 -0
- data/tasks/utils.rb +80 -0
- metadata +58 -30
- data/lib/launchy/gemspec.rb +0 -53
- data/lib/launchy/specification.rb +0 -133
data/{CHANGES → HISTORY}
RENAMED
@@ -1,25 +1,32 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
= Launchy Changlog
|
2
|
+
|
3
|
+
== Version 0.3.3 - 2009-02-19
|
4
|
+
|
5
|
+
* pass command line as discrete items to system() to avoid string
|
6
|
+
interpretation by the system shell. (Suraj N. Kurapati)
|
7
|
+
* rework project layout and tasks
|
8
|
+
|
9
|
+
== Version 0.3.2 - 2008-05-21
|
3
10
|
|
4
11
|
* detect aix and mingw as known operating systems.
|
5
12
|
|
6
|
-
|
13
|
+
== Version 0.3.1 - 2007-09-08
|
7
14
|
|
8
15
|
* finalize the command line wrapper around the launchy library.
|
9
16
|
* added more tests
|
10
17
|
|
11
|
-
|
18
|
+
== Version 0.3.0 - 2007-08-30
|
12
19
|
|
13
20
|
* reorganize the code structure, removing Spawnable namespace
|
14
21
|
* removed 'do_magic' method, changed it to 'open'
|
15
22
|
* added override environment variable LAUNCHY_HOST_OS for testing
|
16
23
|
* fix broken cygwin support [Bug #13472]
|
17
24
|
|
18
|
-
|
25
|
+
== Version 0.2.1 - 2007-08-18
|
19
26
|
|
20
27
|
* fix inability to find windows executables [Bug #13132]
|
21
28
|
|
22
|
-
|
29
|
+
== Version 0.2.0 - 2007-08-11
|
23
30
|
|
24
31
|
* rework browser finding
|
25
32
|
* manual override with LAUNCHY_BROWSER environment variable
|
@@ -28,23 +35,23 @@
|
|
28
35
|
* removed win32 gem
|
29
36
|
* Add debug output by setting LAUNCHY_DEBUG environment variable to 'true'
|
30
37
|
|
31
|
-
|
38
|
+
== Version 0.1.2 - 2007-08-11
|
32
39
|
|
33
40
|
* forked child exits without calling at_exit handlers
|
34
41
|
|
35
|
-
|
42
|
+
== Version 0.1.1
|
36
43
|
|
37
44
|
* fixed rubyforge task to release mswin32 gem also
|
38
45
|
|
39
|
-
|
46
|
+
== Version 0.1.0
|
40
47
|
|
41
48
|
* Initial public release
|
42
49
|
* switched to using fork to spawn process and require 'win32/process' if on windows
|
43
50
|
|
44
|
-
|
51
|
+
== Version 0.0.2
|
45
52
|
|
46
53
|
* First attempt at using systemu to spawn processes
|
47
54
|
|
48
|
-
|
55
|
+
== Version 0.0.1
|
49
56
|
|
50
57
|
* Initially working release
|
data/README
CHANGED
@@ -7,11 +7,11 @@
|
|
7
7
|
== DESCRIPTION
|
8
8
|
|
9
9
|
Launchy is helper class for launching cross-platform applications in a
|
10
|
-
fire and forget manner.
|
10
|
+
fire and forget manner.
|
11
11
|
|
12
|
-
There are application concepts (browser, email client, etc) that are
|
13
|
-
across all platforms, and they may be launched differently on
|
14
|
-
platform. Launchy is here to make a common approach to launching
|
12
|
+
There are application concepts (browser, email client, etc) that are
|
13
|
+
common across all platforms, and they may be launched differently on
|
14
|
+
each platform. Launchy is here to make a common approach to launching
|
15
15
|
external application from within ruby programs.
|
16
16
|
|
17
17
|
== FEATURES
|
@@ -32,36 +32,18 @@ OR
|
|
32
32
|
|
33
33
|
Launchy::Browser.new.visit("http://www.ruby-lang.org/")
|
34
34
|
|
35
|
-
== LICENSE
|
36
|
-
|
37
|
-
Copyright (c) 2007
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
distribution.
|
51
|
-
|
52
|
-
* Neither the name of Jeremy Hinegardner nor the
|
53
|
-
names of its contributors may be used to endorse or promote
|
54
|
-
products derived from this software without specific prior written
|
55
|
-
permission.
|
56
|
-
|
57
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
58
|
-
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
59
|
-
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
60
|
-
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
61
|
-
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
62
|
-
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
63
|
-
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
64
|
-
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
65
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
66
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
67
|
-
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
== ISC LICENSE
|
36
|
+
|
37
|
+
Copyright (c) 2007-2009 Jeremy Hinegardner
|
38
|
+
|
39
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
40
|
+
purpose with or without fee is hereby granted, provided that the above
|
41
|
+
copyright notice and this permission notice appear in all copies.
|
42
|
+
|
43
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
44
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
45
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
46
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
47
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
48
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
49
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2007 Jeremy Hinegardner
|
3
|
+
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
|
+
#++
|
5
|
+
|
6
|
+
#-------------------------------------------------------------------------------
|
7
|
+
# make sure our project's top level directory and the lib directory are added to
|
8
|
+
# the ruby search path.
|
9
|
+
#-------------------------------------------------------------------------------
|
10
|
+
$: << File.expand_path(File.join(File.dirname(__FILE__),"lib"))
|
11
|
+
$: << File.expand_path(File.dirname(__FILE__))
|
12
|
+
|
13
|
+
|
14
|
+
#-------------------------------------------------------------------------------
|
15
|
+
# load the global project configuration and add in the top level clean and
|
16
|
+
# clobber tasks so that other tasks can utilize those constants if necessary
|
17
|
+
# This loads up the defaults for the whole project configuration
|
18
|
+
#-------------------------------------------------------------------------------
|
19
|
+
require 'rubygems'
|
20
|
+
require 'tasks/config.rb'
|
21
|
+
require 'rake/clean'
|
22
|
+
|
23
|
+
#-------------------------------------------------------------------------------
|
24
|
+
# Main configuration for the project, these overwrite the items that are in
|
25
|
+
# tasks/config.rb
|
26
|
+
#-------------------------------------------------------------------------------
|
27
|
+
require 'launchy/version'
|
28
|
+
require 'launchy/paths'
|
29
|
+
|
30
|
+
Configuration.for("project") {
|
31
|
+
name "launchy"
|
32
|
+
version Launchy::VERSION
|
33
|
+
author "Jeremy Hinegardner"
|
34
|
+
email "jeremy@copiousfreetime.org"
|
35
|
+
homepage "http://copiousfreetime.rubyforge.org/launchy/"
|
36
|
+
}
|
37
|
+
|
38
|
+
#-------------------------------------------------------------------------------
|
39
|
+
# load up all the project tasks and setup the default task to be the
|
40
|
+
# test:default task.
|
41
|
+
#-------------------------------------------------------------------------------
|
42
|
+
Configuration.for("packaging").files.tasks.each do |tasklib|
|
43
|
+
import tasklib
|
44
|
+
end
|
45
|
+
task :default => 'test:default'
|
46
|
+
|
47
|
+
#-------------------------------------------------------------------------------
|
48
|
+
# Finalize the loading of all pending imports and update the top level clobber
|
49
|
+
# task to depend on all possible sub-level tasks that have a name like
|
50
|
+
# ':clobber' in other namespaces. This allows us to say:
|
51
|
+
#
|
52
|
+
# rake clobber
|
53
|
+
#
|
54
|
+
# and it will get everything.
|
55
|
+
#-------------------------------------------------------------------------------
|
56
|
+
Rake.application.load_imports
|
57
|
+
Rake.application.tasks.each do |t|
|
58
|
+
if t.name =~ /:clobber/ then
|
59
|
+
task :clobber => [t.name]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
data/bin/launchy
CHANGED
File without changes
|
data/gemspec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'launchy/version'
|
3
|
+
require 'tasks/config'
|
4
|
+
|
5
|
+
Launchy::GEM_SPEC = Gem::Specification.new do |spec|
|
6
|
+
proj = Configuration.for('project')
|
7
|
+
spec.name = proj.name
|
8
|
+
spec.version = Launchy::VERSION
|
9
|
+
|
10
|
+
spec.author = proj.author
|
11
|
+
spec.email = proj.email
|
12
|
+
spec.homepage = proj.homepage
|
13
|
+
spec.summary = proj.summary
|
14
|
+
spec.description = proj.description
|
15
|
+
spec.platform = Gem::Platform::RUBY
|
16
|
+
|
17
|
+
|
18
|
+
pkg = Configuration.for('packaging')
|
19
|
+
spec.files = pkg.files.all
|
20
|
+
spec.executables = pkg.files.bin.collect { |b| File.basename(b) }
|
21
|
+
|
22
|
+
# add dependencies here
|
23
|
+
spec.add_dependency("rake", ">= 0.8.1")
|
24
|
+
spec.add_dependency("configuration", ">= 0.0.5")
|
25
|
+
|
26
|
+
if rdoc = Configuration.for_if_exist?('rdoc') then
|
27
|
+
spec.has_rdoc = true
|
28
|
+
spec.extra_rdoc_files = pkg.files.rdoc
|
29
|
+
spec.rdoc_options = rdoc.options + [ "--main" , rdoc.main_page ]
|
30
|
+
else
|
31
|
+
spec.has_rdoc = false
|
32
|
+
end
|
33
|
+
|
34
|
+
if test = Configuration.for_if_exist?('testing') then
|
35
|
+
spec.test_files = test.files
|
36
|
+
end
|
37
|
+
|
38
|
+
if rf = Configuration.for_if_exist?('rubyforge') then
|
39
|
+
spec.rubyforge_project = rf.project
|
40
|
+
end
|
41
|
+
end
|
data/lib/launchy.rb
CHANGED
@@ -1,58 +1,53 @@
|
|
1
1
|
module Launchy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
#
|
3
|
+
# Utility method to require all files ending in .rb in the directory
|
4
|
+
# with the same name as this file minus .rb
|
5
|
+
#
|
6
|
+
def self.require_all_libs_relative_to(fname)
|
7
|
+
prepend = File.basename(fname,".rb")
|
8
|
+
search_me = File.join(File.dirname(fname),prepend)
|
9
|
+
|
10
|
+
Dir.entries(search_me).each do |rb|
|
11
|
+
if File.extname(rb) == ".rb" then
|
12
|
+
require "#{prepend}/#{File.basename(rb,".rb")}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
10
18
|
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
class << self
|
24
|
-
def open(*params)
|
25
|
-
begin
|
26
|
-
klass = Launchy::Application.find_application_class_for(*params)
|
27
|
-
if klass then
|
28
|
-
klass.run(*params)
|
29
|
-
else
|
30
|
-
msg = "Unable to launch #{params.join(' ')}"
|
31
|
-
Launchy.log "#{self.name} : #{msg}"
|
32
|
-
$stderr.puts msg
|
33
|
-
end
|
34
|
-
rescue Exception => e
|
35
|
-
msg = "Failure in opening #{params.join(' ')} : #{e}"
|
36
|
-
Launchy.log "#{self.name} : #{msg}"
|
37
|
-
$stderr.puts msg
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
# Setting the LAUNCHY_DEBUG environment variable to 'true' will spew
|
42
|
-
# debug information to $stderr
|
43
|
-
def log(msg)
|
44
|
-
if ENV['LAUNCHY_DEBUG'] == 'true' then
|
45
|
-
$stderr.puts "LAUNCHY_DEBUG: #{msg}"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Create an instance of the commandline application of launchy
|
50
|
-
def command_line
|
51
|
-
Launchy::CommandLine.new
|
19
|
+
# Convenience method to launch an item
|
20
|
+
#
|
21
|
+
def open(*params)
|
22
|
+
begin
|
23
|
+
klass = Launchy::Application.find_application_class_for(*params)
|
24
|
+
if klass then
|
25
|
+
klass.run(*params)
|
26
|
+
else
|
27
|
+
msg = "Unable to launch #{params.join(' ')}"
|
28
|
+
Launchy.log "#{self.name} : #{msg}"
|
29
|
+
$stderr.puts msg
|
52
30
|
end
|
31
|
+
rescue Exception => e
|
32
|
+
msg = "Failure in opening #{params.join(' ')} : #{e}"
|
33
|
+
Launchy.log "#{self.name} : #{msg}"
|
34
|
+
$stderr.puts msg
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Setting the LAUNCHY_DEBUG environment variable to 'true' will spew
|
39
|
+
# debug information to $stderr
|
40
|
+
def log(msg)
|
41
|
+
if ENV['LAUNCHY_DEBUG'] == 'true' then
|
42
|
+
$stderr.puts "LAUNCHY_DEBUG: #{msg}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Create an instance of the commandline application of launchy
|
47
|
+
def command_line
|
48
|
+
Launchy::CommandLine.new
|
53
49
|
end
|
54
|
-
|
55
|
-
|
50
|
+
end
|
56
51
|
end
|
57
52
|
|
58
53
|
Launchy.require_all_libs_relative_to(__FILE__)
|
data/lib/launchy/application.rb
CHANGED
@@ -1,163 +1,174 @@
|
|
1
1
|
require 'rbconfig'
|
2
2
|
|
3
3
|
module Launchy
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def inherited(sub_class)
|
10
|
-
application_classes << sub_class
|
11
|
-
end
|
12
|
-
def application_classes
|
13
|
-
@application_classes ||= []
|
14
|
-
end
|
15
|
-
|
16
|
-
def find_application_class_for(*args)
|
17
|
-
Launchy.log "#{self.name} : finding application classes for [#{args.join(' ')}]"
|
18
|
-
application_classes.find do |klass|
|
19
|
-
Launchy.log "#{self.name} : Trying #{klass.name}"
|
20
|
-
if klass.handle?(*args) then
|
21
|
-
true
|
22
|
-
else
|
23
|
-
false
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# find an executable in the available paths
|
29
|
-
# mkrf did such a good job on this I had to borrow it.
|
30
|
-
def find_executable(bin,*paths)
|
31
|
-
paths = ENV['PATH'].split(File::PATH_SEPARATOR) if paths.empty?
|
32
|
-
paths.each do |path|
|
33
|
-
file = File.join(path,bin)
|
34
|
-
if File.executable?(file) then
|
35
|
-
Launchy.log "#{self.name} : found executable #{file}"
|
36
|
-
return file
|
37
|
-
end
|
38
|
-
end
|
39
|
-
Launchy.log "#{self.name} : Unable to find `#{bin}' in #{paths.join(', ')}"
|
40
|
-
return nil
|
41
|
-
end
|
42
|
-
|
43
|
-
# return the current 'host_os' string from ruby's configuration
|
44
|
-
def my_os
|
45
|
-
if ENV['LAUNCHY_HOST_OS'] then
|
46
|
-
Launchy.log "#{self.name} : Using LAUNCHY_HOST_OS override of '#{ENV['LAUNCHY_HOST_OS']}'"
|
47
|
-
return ENV['LAUNCHY_HOST_OS']
|
48
|
-
else
|
49
|
-
::Config::CONFIG['host_os']
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# detect what the current os is and return :windows, :darwin or :nix
|
54
|
-
def my_os_family(test_os = my_os)
|
55
|
-
case test_os
|
56
|
-
when /mingw/i
|
57
|
-
family = :windows
|
58
|
-
when /mswin/i
|
59
|
-
family = :windows
|
60
|
-
when /windows/i
|
61
|
-
family = :windows
|
62
|
-
when /darwin/i
|
63
|
-
family = :darwin
|
64
|
-
when /mac os/i
|
65
|
-
family = :darwin
|
66
|
-
when /solaris/i
|
67
|
-
family = :nix
|
68
|
-
when /bsd/i
|
69
|
-
family = :nix
|
70
|
-
when /linux/i
|
71
|
-
family = :nix
|
72
|
-
when /aix/i
|
73
|
-
family = :nix
|
74
|
-
when /cygwin/i
|
75
|
-
family = :cygwin
|
76
|
-
else
|
77
|
-
$stderr.puts "Unknown OS familiy for '#{test_os}'. Please report this bug to #{Launchy::SPEC.email}"
|
78
|
-
family = :unknown
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
4
|
+
class Application
|
5
|
+
class << self
|
6
|
+
def known_os_families
|
7
|
+
@known_os_families ||= [ :windows, :darwin, :nix, :cygwin ]
|
8
|
+
end
|
82
9
|
|
10
|
+
def inherited(sub_class)
|
11
|
+
application_classes << sub_class
|
12
|
+
end
|
13
|
+
def application_classes
|
14
|
+
@application_classes ||= []
|
15
|
+
end
|
83
16
|
|
84
|
-
|
85
|
-
#
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
@nix_desktop_environment = :gnome
|
94
|
-
elsif find_executable("xprop") then
|
95
|
-
if %x[ xprop -root _DT_SAVE_MODE | grep ' = \"xfce\"$' ].strip.size > 0 then
|
96
|
-
@nix_desktop_environment = :xfce
|
97
|
-
end
|
98
|
-
end
|
99
|
-
Launchy.log "#{self.class.name} : nix_desktop_environment => '#{@nix_desktop_environment}'"
|
100
|
-
end
|
101
|
-
return @nix_desktop_environment
|
102
|
-
end
|
103
|
-
|
104
|
-
# find an executable in the available paths
|
105
|
-
def find_executable(bin,*paths)
|
106
|
-
Application.find_executable(bin,*paths)
|
17
|
+
def find_application_class_for(*args)
|
18
|
+
Launchy.log "#{self.name} : finding application classes for [#{args.join(' ')}]"
|
19
|
+
application_classes.find do |klass|
|
20
|
+
Launchy.log "#{self.name} : Trying #{klass.name}"
|
21
|
+
if klass.handle?(*args) then
|
22
|
+
true
|
23
|
+
else
|
24
|
+
false
|
25
|
+
end
|
107
26
|
end
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
27
|
+
end
|
28
|
+
|
29
|
+
# find an executable in the available paths
|
30
|
+
# mkrf did such a good job on this I had to borrow it.
|
31
|
+
def find_executable(bin,*paths)
|
32
|
+
paths = ENV['PATH'].split(File::PATH_SEPARATOR) if paths.empty?
|
33
|
+
paths.each do |path|
|
34
|
+
file = File.join(path,bin)
|
35
|
+
if File.executable?(file) then
|
36
|
+
Launchy.log "#{self.name} : found executable #{file}"
|
37
|
+
return file
|
38
|
+
end
|
112
39
|
end
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
40
|
+
Launchy.log "#{self.name} : Unable to find `#{bin}' in #{paths.join(', ')}"
|
41
|
+
return nil
|
42
|
+
end
|
43
|
+
|
44
|
+
# return the current 'host_os' string from ruby's configuration
|
45
|
+
def my_os
|
46
|
+
if ENV['LAUNCHY_HOST_OS'] then
|
47
|
+
Launchy.log "#{self.name} : Using LAUNCHY_HOST_OS override of '#{ENV['LAUNCHY_HOST_OS']}'"
|
48
|
+
return ENV['LAUNCHY_HOST_OS']
|
49
|
+
else
|
50
|
+
::Config::CONFIG['host_os']
|
117
51
|
end
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
52
|
+
end
|
53
|
+
|
54
|
+
# detect what the current os is and return :windows, :darwin or :nix
|
55
|
+
def my_os_family(test_os = my_os)
|
56
|
+
case test_os
|
57
|
+
when /mingw/i
|
58
|
+
family = :windows
|
59
|
+
when /mswin/i
|
60
|
+
family = :windows
|
61
|
+
when /windows/i
|
62
|
+
family = :windows
|
63
|
+
when /darwin/i
|
64
|
+
family = :darwin
|
65
|
+
when /mac os/i
|
66
|
+
family = :darwin
|
67
|
+
when /solaris/i
|
68
|
+
family = :nix
|
69
|
+
when /bsd/i
|
70
|
+
family = :nix
|
71
|
+
when /linux/i
|
72
|
+
family = :nix
|
73
|
+
when /aix/i
|
74
|
+
family = :nix
|
75
|
+
when /cygwin/i
|
76
|
+
family = :cygwin
|
77
|
+
else
|
78
|
+
$stderr.puts "Unknown OS familiy for '#{test_os}'. Please report this bug to <jeremy at hinegardner dot org>"
|
79
|
+
family = :unknown
|
124
80
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# Determine the appropriate desktop environment for *nix machine. Currently this is
|
86
|
+
# linux centric. The detection is based upon the detection used by xdg-open from
|
87
|
+
# http://portland.freedesktop.org/wiki/XdgUtils
|
88
|
+
def nix_desktop_environment
|
89
|
+
if not defined? @nix_desktop_environment then
|
90
|
+
@nix_desktop_environment = :generic
|
91
|
+
if ENV["KDE_FULL_SESSION"] || ENV["KDE_SESSION_UID"] then
|
92
|
+
@nix_desktop_environment = :kde
|
93
|
+
elsif ENV["GNOME_DESKTOP_SESSION_ID"] then
|
94
|
+
@nix_desktop_environment = :gnome
|
95
|
+
elsif find_executable("xprop") then
|
96
|
+
if %x[ xprop -root _DT_SAVE_MODE | grep ' = \"xfce\"$' ].strip.size > 0 then
|
97
|
+
@nix_desktop_environment = :xfce
|
98
|
+
end
|
130
99
|
end
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
100
|
+
Launchy.log "#{self.class.name} : nix_desktop_environment => '#{@nix_desktop_environment}'"
|
101
|
+
end
|
102
|
+
return @nix_desktop_environment
|
103
|
+
end
|
104
|
+
|
105
|
+
# find an executable in the available paths
|
106
|
+
def find_executable(bin,*paths)
|
107
|
+
Application.find_executable(bin,*paths)
|
108
|
+
end
|
109
|
+
|
110
|
+
# return the current 'host_os' string from ruby's configuration
|
111
|
+
def my_os
|
112
|
+
Application.my_os
|
113
|
+
end
|
114
|
+
|
115
|
+
# detect what the current os is and return :windows, :darwin, :nix, or :cygwin
|
116
|
+
def my_os_family(test_os = my_os)
|
117
|
+
Application.my_os_family(test_os)
|
118
|
+
end
|
119
|
+
|
120
|
+
# returns the list of command line application names for the current os. The list
|
121
|
+
# returned should only contain appliations or commands that actually exist on the
|
122
|
+
# system. The list members should have their full path to the executable.
|
123
|
+
def app_list
|
124
|
+
@app_list ||= self.send("#{my_os_family}_app_list")
|
125
|
+
end
|
126
|
+
|
127
|
+
# On darwin a good general default is the 'open' executable.
|
128
|
+
def darwin_app_list
|
129
|
+
Launchy.log "#{self.class.name} : Using 'open' application on darwin."
|
130
|
+
[ find_executable('open') ]
|
131
|
+
end
|
132
|
+
|
133
|
+
# On windows a good general default is the 'start' Command Shell command
|
134
|
+
def windows_app_list
|
135
|
+
Launchy.log "#{self.class.name} : Using 'start' command on windows."
|
135
136
|
%w[ start ]
|
137
|
+
end
|
138
|
+
|
139
|
+
# Cygwin uses the windows start but through an explicit execution of the cmd shell
|
140
|
+
def cygwin_app_list
|
141
|
+
Launchy.log "#{self.class.name} : Using 'cmd /C start' on windows."
|
142
|
+
[ "cmd /C start" ]
|
143
|
+
end
|
144
|
+
|
145
|
+
# run the command
|
146
|
+
def run(cmd,*args)
|
147
|
+
Launchy.log "#{self.class.name} : Spawning on #{my_os_family} : #{cmd} #{args.inspect}"
|
148
|
+
|
149
|
+
if my_os_family == :windows then
|
150
|
+
# NOTE: the command is purposely omitted here because
|
151
|
+
# running the filename via "cmd /c" is the same as
|
152
|
+
# running "start filename" at the command-prompt
|
153
|
+
#
|
154
|
+
# furthermore, when "cmd /c start filename" is
|
155
|
+
# run, the shell interprets it as two commands:
|
156
|
+
# (1) "start" opens a new terminal, and (2)
|
157
|
+
# "filename" causes the file to be launched.
|
158
|
+
system 'cmd', '/c', *args
|
159
|
+
else
|
160
|
+
# fork, and the child process should NOT run any exit handlers
|
161
|
+
child_pid = fork do
|
162
|
+
# NOTE: we pass a dummy argument *before*
|
163
|
+
# the actual command to prevent sh
|
164
|
+
# from silently consuming our actual
|
165
|
+
# command and assigning it to $0!
|
166
|
+
dummy = ''
|
167
|
+
system 'sh', '-c', '"$@" >/dev/null 2>&1', dummy, cmd, *args
|
168
|
+
exit!
|
136
169
|
end
|
137
|
-
|
138
|
-
|
139
|
-
def cygwin_app_list
|
140
|
-
Launchy.log "#{self.class.name} : Using 'cmd /C start' on windows."
|
141
|
-
[ "cmd /C start" ]
|
142
|
-
end
|
143
|
-
|
144
|
-
# run the command
|
145
|
-
def run(cmd,*args)
|
146
|
-
args.unshift(cmd)
|
147
|
-
cmd_line = args.join(' ')
|
148
|
-
Launchy.log "#{self.class.name} : Spawning on #{my_os_family} : #{cmd_line}"
|
149
|
-
|
150
|
-
if my_os_family == :windows then
|
151
|
-
system cmd_line
|
152
|
-
else
|
153
|
-
# fork, and the child process should NOT run any exit handlers
|
154
|
-
child_pid = fork do
|
155
|
-
cmd_line += " > /dev/null 2>&1"
|
156
|
-
system cmd_line
|
157
|
-
exit!
|
158
|
-
end
|
159
|
-
Process.detach(child_pid)
|
160
|
-
end
|
161
|
-
end
|
170
|
+
Process.detach(child_pid)
|
171
|
+
end
|
162
172
|
end
|
173
|
+
end
|
163
174
|
end
|