blob: 2fb7e21c3b925ae2660f23ee2539bbe18a730622 (
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
from time import time
from ranger.actions import Actions
from ranger.container import Bookmarks
from ranger.ext.relpath import relpath_conf
from ranger import __version__
from ranger.fsobject import Loader
CTRL_C = 3
TICKS_BEFORE_COLLECTING_GARBAGE = 100
class FM(Actions):
input_blocked = False
input_blocked_until = 0
stderr_to_out = False
def __init__(self, ui=None, bookmarks=None, tags=None):
"""Initialize FM."""
Actions.__init__(self)
self.ui = ui
self.bookmarks = bookmarks
self.tags = tags
self.loader = Loader()
self.apps = self.settings.apps.CustomApplications()
from ranger.shared import FileManagerAware
FileManagerAware.fm = self
def initialize(self):
"""If ui/bookmarks are None, they will be initialized here."""
from ranger.fsobject.directory import Directory
if self.bookmarks is None:
self.bookmarks = Bookmarks(
bookmarkfile=relpath_conf('bookmarks'),
bookmarktype=Directory,
autosave=False)
self.bookmarks.load()
else:
self.bookmarks = bookmarks
from ranger.container.tags import Tags
if self.tags is None:
self.tags = Tags('~/.ranger/tagged')
if self.ui is None:
from ranger.gui.defaultui import DefaultUI
self.ui = DefaultUI()
self.ui.initialize()
def block_input(self, sec=0):
self.input_blocked = sec != 0
self.input_blocked_until = time() + sec
def loop(self):
"""
The main loop consists of:
1. reloading bookmarks if outdated
2. letting the loader work
3. drawing and finalizing ui
4. reading and handling user input
5. after X loops: collecting unused directory objects
"""
self.env.enter_dir(self.env.path)
gc_tick = 0
try:
while True:
try:
self.bookmarks.update_if_outdated()
self.loader.work()
if hasattr(self.ui, 'throbber'):
if self.loader.has_work():
self.ui.throbber(self.loader.status)
else:
self.ui.throbber(remove=True)
self.ui.redraw()
self.ui.set_load_mode(self.loader.has_work())
key = self.ui.get_next_key()
if key > 0:
if self.input_blocked and \
time() > self.input_blocked_until:
self.input_blocked = False
if not self.input_blocked:
self.ui.handle_key(key)
gc_tick += 1
if gc_tick > TICKS_BEFORE_COLLECTING_GARBAGE:
gc_tick = 0
self.env.garbage_collect()
except KeyboardInterrupt:
self.ui.handle_key(CTRL_C)
finally:
self.bookmarks.remember(self.env.pwd)
self.bookmarks.save()
|