Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWade Brainerd <wadetb@gmail.com>2009-02-26 18:10:15 (GMT)
committer Wade Brainerd <wadetb@gmail.com>2009-02-26 18:10:15 (GMT)
commit9c73df2bec29b63b3a407fd83be47e974a401a49 (patch)
tree223a611331d90332225b1fd4c97f2b12f79c52b2
parent164f8b58a3193d7feb3ffcea8cafd0d840e9ce24 (diff)
WIP on persistent terminal.
-rw-r--r--terminal.py67
1 files changed, 42 insertions, 25 deletions
diff --git a/terminal.py b/terminal.py
index 576175c..036a52c 100644
--- a/terminal.py
+++ b/terminal.py
@@ -15,7 +15,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-import os
+import os, os.path, simplejson, ConfigParser
from gettext import gettext as _
@@ -26,34 +26,31 @@ log.setLevel(logging.DEBUG)
logging.basicConfig()
import gtk
-import dbus
-
-import sugar.graphics.toolbutton
-from sugar.activity import activity
-from sugar import env
-from sugar.graphics.toolbutton import ToolButton
-from sugar.graphics.palette import Palette
-import ConfigParser
-import os.path
-
import vte
import pango
-import simplejson
+import sugar.graphics.toolbutton
+import sugar.activity.activity
+import sugar.env
+
+MASKED_ENVIRONMENT = [
+ 'DBUS_SESSION_BUS_ADDRESS',
+ 'PPID'
+]
-class TerminalActivity(activity.Activity):
+class TerminalActivity(sugar.activity.activity.Activity):
def __init__(self, handle):
- activity.Activity.__init__(self, handle)
+ sugar.activity.activity.Activity.__init__(self, handle)
self.data_file = None
self.set_title(_('Terminal Activity'))
#self.connect('key-press-event', self._key_press_cb)
- toolbox = activity.ActivityToolbox(self)
+ toolbox = sugar.activity.activity.ActivityToolbox(self)
- editbar = activity.EditToolbar()
+ editbar = sugar.activity.activity.EditToolbar()
toolbox.add_toolbar(_('Edit'), editbar)
editbar.show()
editbar.undo.props.visible = False
@@ -79,7 +76,7 @@ class TerminalActivity(activity.Activity):
tabsep.set_draw(False)
# Add a button that will be used to become root easily.
- rootbtn = ToolButton('activity-become-root')
+ rootbtn = sugar.graphics.toolbutton.ToolButton('activity-become-root')
rootbtn.set_tooltip(_('Become root'))
rootbtn.connect('clicked', self._become_root_cb)
@@ -209,7 +206,22 @@ class TerminalActivity(activity.Activity):
if tab_state:
# Restore the environment.
- os.environ['TERMINAL_ENV'] = tab_state['env']
+ env = tab_state['env'].replace('\0', '\n')
+ vt.feed(env)
+
+ filtered_vars = []
+ for e in env.split('\n'):
+ var, sep, value = e.partition('=')
+ if var not in MASKED_ENVIRONMENT:
+ filtered_vars.append(var + sep + value)
+
+ # Restore working directory.
+ vt.feed(var + ' = ' + value + '\r\n')
+ if var == 'PWD':
+ os.chdir(value)
+
+ # TODO: Make the shell restore these environment variables, then clear out TERMINAL_ENV.
+ #os.environ['TERMINAL_ENV'] = '\n'.join(filtered_vars)
# Restore the scrollback buffer.
for l in tab_state['scrollback']:
@@ -242,7 +254,7 @@ class TerminalActivity(activity.Activity):
def _key_press_cb(self, window, event):
if gtk.gdk.keyval_name(event.keyval) == 'Escape':
return True
-
+
return False
def read_file(self, file_path):
@@ -256,14 +268,21 @@ class TerminalActivity(activity.Activity):
data_file = file_path
+ # Clean out any existing tabs.
while self.notebook.get_n_pages():
self.notebook.remove_page(0)
- for tab in data['tabs']:
- index = self._create_tab(tab)
+ # Create new tabs from saved state.
+ for tab_state in data['tabs']:
+ self._create_tab(tab_state)
+ # Restore active tab.
self.notebook.props.page = data['current-tab']
+ # Create a blank one if this state had no terminals.
+ if self.notebook.get_n_pages() == 0:
+ self._create_tab(None)
+
def write_file(self, file_path):
if not self.metadata['mime_type']:
self.metadata['mime_type'] = 'text/plain'
@@ -272,9 +291,7 @@ class TerminalActivity(activity.Activity):
data['current-tab'] = self.notebook.get_current_page()
data['tabs'] = []
- print "about to save tabs"
for i in range(self.notebook.get_n_pages()):
- print "tab %d" % i
page = self.notebook.get_nth_page(i)
def selected_cb(terminal, c, row, cb_data):
@@ -283,7 +300,7 @@ class TerminalActivity(activity.Activity):
scrollback_lines = scrollback_text.split('\n')
- environment = open('/proc/%d/environ' % page.pid, 'r').read().replace('\0','\n')
+ environment = open('/proc/%d/environ' % page.pid, 'r').read().replace('\0', '\n')
tab_state = { 'env': environment, 'cwd': '', 'scrollback': scrollback_lines }
@@ -314,7 +331,7 @@ class TerminalActivity(activity.Activity):
def _configure_vt(self, vt):
conf = ConfigParser.ConfigParser()
- conf_file = os.path.join(env.get_profile_path(), 'terminalrc')
+ conf_file = os.path.join(sugar.env.get_profile_path(), 'terminalrc')
if os.path.isfile(conf_file):
f = open(conf_file, 'r')