summary refs log tree commit diff stats
path: root/code/action.rb
blob: e463e85226cc82c7abb79bbb010f9e09c2da78af (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
module Action
	def self.copy(files, path)
		files = [files] unless files.is_a? Array
		unless files.empty?
			CopyBar2.new(files, path)
		end
	end

	def self.move(files, path)
		files = [files] unless files.is_a? Array
		unless files.empty?
			MoveBar2.new(files, path)
		end
	end

	def self.run(hash = {})
		unless OpenStruct === hash
			hash = OpenStruct.new(hash)
		end

		cf       = Fm.currentfile
		
		all      = hash.all.or true
		files    = hash.files.or(all ? Fm.selection : [cf])
		mode     = hash.mode.or 0
		newway   = hash.newway.or false

		return false if files.nil?

		if newway
			hash = Fm.filehandler(files, hash)
			handler = hash.exec
		else
			handler, wait = Fm.getfilehandler(*files)
		end

		return false unless handler

		wait     = hash.wait.or wait
		new_term = hash.new_term.or false
		detach   = hash.detach.or false

		log handler
		if detach
			run_detached(handler, new_term)
		else
			run_inside(handler, wait)
		end
		return true
	end

	def self.run_detached(what, new_term)
		if new_term
			p = fork { exec('x-terminal-emulator', '-e', 'bash', '-c', what) }
#			Process.detach(p)
		else
			p = fork { exec "#{what} 2>> /dev/null >> /dev/null" }
			Process.detach(p)
		end
	end

	def self.run_inside(what, wait)
		closei
		system(*what)
		gets if wait
		starti
	end
end