Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activity.py46
-rw-r--r--consoles.py246
-rw-r--r--editor.py1
-rw-r--r--icons/console-python.svg36
-rw-r--r--icons/console-terminal.svg11
5 files changed, 333 insertions, 7 deletions
diff --git a/activity.py b/activity.py
index ae1488f..5dc5703 100644
--- a/activity.py
+++ b/activity.py
@@ -33,10 +33,13 @@ import gtk
import sugar
from sugar import mime
+
from sugar.graphics import iconentry
from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.radiotoolbutton import RadioToolButton
from sugar.graphics.toggletoolbutton import ToggleToolButton
from sugar.graphics.toolbarbox import ToolbarBox
+from sugar.graphics.tray import VTray
from sugar.activity.widgets import EditToolbar, StopButton, \
ActivityToolbarButton, ToolbarButton
from sugar.datastore import datastore
@@ -45,12 +48,11 @@ from sugar.activity import activity
from pep8_check import PEP8_Check
import options
from editor import Editor
-from python_console import PythonConsole
+import consoles
import file_choosers
file_choosers.langsmanager = options.LANGUAGE_MANAGER
file_choosers.langs = options.LANGUAGES
-
class JAMEdit(activity.Activity):
def __init__(self, handle):
@@ -69,12 +71,13 @@ class JAMEdit(activity.Activity):
scroll.set_policy(gtk.POLICY_AUTOMATIC,
gtk.POLICY_AUTOMATIC)
scroll.add(self.editor)
- scroll.show_all()
vbox = gtk.VBox()
vpaned = gtk.VPaned()
- vpaned.pack1(scroll)
vbox.pack_start(vpaned, True, True, 0)
+ vpaned.show()
+ vpaned.pack1(scroll, resize=True)
+ scroll.show_all()
self.set_canvas(vbox)
@@ -114,12 +117,41 @@ class JAMEdit(activity.Activity):
self.pep8_bar.add(self.pep8_bar.label)
vbox.pack_end(self.pep8_bar, False, True, 0)
- self.python_console = PythonConsole()
- self.python_console.show()
- vpaned.pack2(self.python_console)
+ tray = VTray()
+ self.test_notebook = gtk.Notebook()
+ self.test_notebook.set_show_tabs(False)
+ terminal = consoles.Terminal()
+ terminal.show()
+ terminal_item = RadioToolButton()
+ terminal_item.set_named_icon("console-terminal")
+ terminal_item.set_tooltip("Terminal")
+ terminal_item.connect("toggled", self.page_changed, 0)
+ terminal_item.show()
+ self.test_notebook.append_page(terminal, None)
+ tray.add_item(terminal_item)
+ python_console = consoles.PythonConsole()
+ python_console.show()
+ python_item = RadioToolButton()
+ python_item.set_named_icon("console-python")
+ python_item.set_tooltip("Python Console")
+ python_item.set_group(terminal_item)
+ python_item.connect("toggled", self.page_changed, 1)
+ python_item.show()
+ self.test_notebook.append_page(python_console)
+ tray.add_item(python_item)
+ hbox = gtk.HBox()
+ hbox.pack_start(tray, False, True, 0)
+ hbox.pack_start(self.test_notebook)
+ self.test_notebook.show()
+ vpaned.pack2(hbox, resize=True)
vpaned.show_all()
+ tray.show()
+ hbox.show()
vbox.show_all()
+ def page_changed(self, widget, index):
+ self.test_notebook.set_current_page(index)
+
def change_style(self, widget, style):
self.editor.set_style(style)
diff --git a/consoles.py b/consoles.py
new file mode 100644
index 0000000..0bb6322
--- /dev/null
+++ b/consoles.py
@@ -0,0 +1,246 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+
+# consoles.py by/por:
+# Agustin Zubiaga <aguszs97@gmail.com>
+# Daniel Francis <santiago.danielfrancis@gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+from signal import SIGTERM
+import os
+
+import pango
+import gtk
+import vte
+
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.colorbutton import ColorToolButton
+from sugar.graphics.tray import VTray
+
+class Console(gtk.HBox):
+ def __init__(self):
+ gtk.HBox.__init__(self)
+ self.terminal = vte.Terminal()
+ self.bgcolor = gtk.gdk.color_parse("#000000")
+ self.fgcolor = gtk.gdk.color_parse("#FFFFFF")
+ self.scrollbar = gtk.VScrollbar(self.terminal.get_adjustment())
+ self.terminal.show()
+ self.scrollbar.show()
+ self.pack_start(self.terminal, True, True, 0)
+ self.pack_end(self.scrollbar, False, True, 0)
+ self.terminal.grab_focus()
+
+ def set_font(self, font):
+ self.terminal.set_font(font)
+
+ def set_bgcolor(self, color):
+ self.terminal.set_colors(self.fgcolor, color, [])
+ self.bgcolor = color
+
+ def set_fgcolor(self, color):
+ self.terminal.set_colors(color, self.bgcolor, [])
+ self.fgcolor = color
+
+ def copy(self):
+ if self.terminal.get_has_selection():
+ self.terminal.copy_clipboard()
+
+ def paste(self):
+ self.terminal.paste_clipboard()
+
+ def stop(self):
+ try:
+ os.kill(self.process_id, SIGTERM)
+ self._clear_console()
+ except Exception, err:
+ print err
+
+ def _clear_console(self):
+ self.terminal.grab_focus()
+ self.terminal.feed("\x1B[H\x1B[J\x1B[0;39m")
+
+ def run_command(self, command=None, args=None):
+ self.process_id = self.terminal.fork_command(command=command, argv=args)
+
+class Terminal(gtk.HBox):
+ def __copy_cb(self, button):
+ self.console.copy()
+
+ def __paste_cb(self, button):
+ self.console.paste()
+
+ def _fgcolor_cb(self, button, pspec):
+ newcolor = button.get_color()
+ self.console.set_fgcolor(newcolor)
+
+ def _bgcolor_cb(self, button, pspec):
+ newcolor = button.get_color()
+ self.console.set_bgcolor(newcolor)
+
+ def update_font(self, widget, font_selection):
+ font = pango.FontDescription(font_selection.get_font_name())
+ self.console.set_font(font)
+
+ def reset(self, widget):
+ self.console.stop()
+ self.console.run_command()
+
+ def __init__(self):
+ gtk.HBox.__init__(self)
+ self.toolbar = VTray()
+
+ copy = ToolButton("edit-copy")
+ copy.set_tooltip('Copy')
+ copy.connect("clicked", self.__copy_cb)
+ copy.show()
+ self.toolbar.add_item(copy, -1)
+ paste = ToolButton("edit-paste")
+ paste.set_tooltip("Paste")
+ paste.connect("clicked", self.__paste_cb)
+ paste.show()
+ self.toolbar.add_item(paste, -1)
+
+ fgcolor = ColorToolButton()
+ fgcolor.get_child()._title = "Font Color"
+ self.toolbar.add_item(fgcolor, -1)
+ fgcolor.connect('notify::color', self._fgcolor_cb)
+ fgcolor.show_all()
+ bgcolor = ColorToolButton()
+ bgcolor.get_child()._title = "Background Color"
+ bgcolor.connect('notify::color', self._bgcolor_cb)
+ self.toolbar.add_item(bgcolor, -1)
+ bgcolor.show_all()
+
+ self.console = Console()
+ self.console.set_bgcolor(gtk.gdk.color_parse("#FFFFFF"))
+ self.console.set_fgcolor(gtk.gdk.color_parse("#000000"))
+ bgcolor.set_color(gtk.gdk.color_parse("#FFFFFF"))
+ fgcolor.set_color(gtk.gdk.color_parse("#000000"))
+ self.console.show()
+
+ font = ToolButton("format-text")
+ font.set_tooltip("Console Font")
+ fontselection = gtk.FontSelection()
+ fontselection.get_family_list().get_selection().connect("changed", self.update_font, fontselection)
+ fontselection.get_face_list().get_selection().connect("changed", self.update_font, fontselection)
+ fontselection.get_size_entry().connect("changed", self.update_font, fontselection)
+ fontselection.get_size_entry().connect("activate", self.update_font, fontselection)
+ fontselection.show()
+ font.props.palette.set_content(fontselection)
+ fontselection.set_font_name("Monospace Regular 10")
+ font.show()
+ self.toolbar.add_item(font, -1)
+
+ reset = ToolButton("view-refresh")
+ reset.set_tooltip("Reset Console")
+ reset.connect("clicked", self.reset)
+ reset.show()
+ self.toolbar.add_item(reset, -1)
+ self.toolbar.show()
+ self.pack_start(self.toolbar, False, True, 0)
+
+ self.console.run_command()
+ self.pack_start(self.console)
+
+class PythonConsole(gtk.HBox):
+ def __copy_cb(self, button):
+ self.console.copy()
+
+ def __paste_cb(self, button):
+ self.console.paste()
+
+ def _fgcolor_cb(self, button, pspec):
+ newcolor = button.get_color()
+ self.console.set_fgcolor(newcolor)
+
+ def _bgcolor_cb(self, button, pspec):
+ newcolor = button.get_color()
+ self.console.set_bgcolor(newcolor)
+
+ def update_font(self, widget, font_selection):
+ font = pango.FontDescription(font_selection.get_font_name())
+ self.console.set_font(font)
+
+ def reset(self, widget):
+ self.console.stop()
+ self.console.run_command("python")
+
+ def __init__(self):
+ gtk.HBox.__init__(self)
+ self.toolbar = VTray()
+
+ copy = ToolButton("edit-copy")
+ copy.set_tooltip('Copy')
+ copy.connect("clicked", self.__copy_cb)
+ copy.show()
+ self.toolbar.add_item(copy, -1)
+ paste = ToolButton("edit-paste")
+ paste.set_tooltip("Paste")
+ paste.connect("clicked", self.__paste_cb)
+ paste.show()
+ self.toolbar.add_item(paste, -1)
+
+ fgcolor = ColorToolButton()
+ fgcolor.get_child()._title = "Font Color"
+ self.toolbar.add_item(fgcolor, -1)
+ fgcolor.connect('notify::color', self._fgcolor_cb)
+ fgcolor.show_all()
+ bgcolor = ColorToolButton()
+ bgcolor.get_child()._title = "Background Color"
+ bgcolor.connect('notify::color', self._bgcolor_cb)
+ self.toolbar.add_item(bgcolor, -1)
+ bgcolor.show_all()
+
+ self.console = Console()
+ self.console.set_bgcolor(gtk.gdk.color_parse("#FFFFFF"))
+ self.console.set_fgcolor(gtk.gdk.color_parse("#000000"))
+ bgcolor.set_color(gtk.gdk.color_parse("#FFFFFF"))
+ fgcolor.set_color(gtk.gdk.color_parse("#000000"))
+ self.console.show()
+
+ font = ToolButton("format-text")
+ font.set_tooltip("Console Font")
+ fontselection = gtk.FontSelection()
+ fontselection.get_family_list().get_selection().connect("changed", self.update_font, fontselection)
+ fontselection.get_face_list().get_selection().connect("changed", self.update_font, fontselection)
+ fontselection.get_size_entry().connect("changed", self.update_font, fontselection)
+ fontselection.get_size_entry().connect("activate", self.update_font, fontselection)
+ fontselection.show()
+ font.props.palette.set_content(fontselection)
+ fontselection.set_font_name("Monospace Regular 10")
+ font.show()
+ self.toolbar.add_item(font, -1)
+
+ reset = ToolButton("view-refresh")
+ reset.set_tooltip("Reset Console")
+ reset.connect("clicked", self.reset)
+ reset.show()
+ self.toolbar.add_item(reset, -1)
+ self.toolbar.show()
+ self.pack_start(self.toolbar, False, True, 0)
+
+ self.console.run_command("python")
+ self.pack_start(self.console)
+
+if __name__ == "__main__":
+ w = gtk.Window()
+ term = Terminal()
+ term.show()
+ w.add(term)
+ w.show()
+ w.set_resizable(True)
+ gtk.main()
diff --git a/editor.py b/editor.py
index d9345fc..a397c28 100644
--- a/editor.py
+++ b/editor.py
@@ -35,6 +35,7 @@ from sugar.graphics.combobox import ComboBox
from sugar.graphics.toolcombobox import ToolComboBox
LANGUAGE_MANAGER = gtksourceview2.language_manager_get_default()
+LANGUAGES = LANGUAGE_MANAGER.get_language_ids()
class Editor(gtksourceview2.View):
__gsignals__ = {"pep8-aviable": (gobject.SIGNAL_RUN_LAST,
diff --git a/icons/console-python.svg b/icons/console-python.svg
new file mode 100644
index 0000000..753aa9c
--- /dev/null
+++ b/icons/console-python.svg
@@ -0,0 +1,36 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48">
+ <defs>
+ <linearGradient id="lg1">
+ <stop stop-color="#555555" offset="0"/>
+ <stop stop-color="#000000" offset="1"/>
+ </linearGradient>
+ <linearGradient id="lg2">
+ <stop stop-color="#fff" offset="0"/>
+ <stop stop-color="#fff" stop-opacity="0.165" offset="1"/>
+ </linearGradient>
+ <linearGradient id="lg3">
+ <stop stop-color="#999999" offset="0"/>
+ <stop stop-color="#FFFFFF" offset="1"/>
+ </linearGradient>
+ <linearGradient id="lg4">
+ <stop stop-color="#000" offset="0"/>
+ <stop stop-color="#000" stop-opacity="0" offset="1"/>
+ </linearGradient>
+ <linearGradient x1="94.693" y1="112.511" x2="94.693" y2="64.053" id="lg5" xlink:href="#lg2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.353878,0,0,0.353878,-17.3795,-19.412)"/>
+ <linearGradient x1="59.728" y1="102" x2="142.62" y2="102" id="lg6" xlink:href="#lg1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.353878,0,0,0.353878,-17.3795,-19.412)"/>
+ <linearGradient x1="94.693" y1="112.511" x2="94.693" y2="64.053" id="lg7" xlink:href="#lg2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.353878,0,0,0.353878,-6.29697,-7.94537)"/>
+ <linearGradient x1="119.191" y1="89.13" x2="116.965" y2="169.279" id="lg8" xlink:href="#lg3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.353878,0,0,0.353878,-16.3897,-17.997)"/>
+ <radialGradient cx="15.115" cy="63.965" r="12.289" fx="15.115" fy="63.965" id="rg1" xlink:href="#lg4" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.6,0,0,0.551754,-0.183975,4.83575)"/>
+ </defs>
+ <path d="m 43.6618,40.1289 a 19.6618,6.7805 0 0 1 -39.3236,0 19.6618,6.7805 0 1 1 39.3236,0 z" fill="url(#rg1)"/>
+ <path d="m 34.0804,37.5795 c 0,2.7319 -2.371,4.1156 -4.7774,4.8057 -3.6202,1.0404 -6.5255,0.8811 -9.5511,0 -2.5268,-0.7362 -4.7774,-2.2402 -4.7774,-4.8057 l 0,-9.0132 c 0,-2.594 2.1621,-4.8092 4.7774,-4.8092 l 9.3984,-0.6111 c 3.1814,0 5.2606,-1.9858 5.2606,-5.245 l 0.8655,-4.3569 3.5813,0 c 2.7814,0 4.0909,2.0667 4.7774,4.8056 0.9555,3.8043 0.9978,6.6495 0,9.615 -0.9661,2.8805 -2,4.8056 -4.7774,4.8056 l -4.7773,0 -9.5512,0 0,-0.02 c 8.2424,0.02 9.5512,-3.3164 9.5512,4.8281 z" fill="url(#lg8)"/>
+ <path d="m 28.1104,38.1776 c 0,-0.9944 0.8033,-1.8013 1.7906,-1.8013 1,0 1.7906,0.8069 1.7906,1.8013 0,0.9979 -0.7997,1.8047 -1.7906,1.8047 -0.9873,0 -1.7906,-0.8068 -1.7906,-1.8047 z" fill="#000"/>
+ <path d="m 35.2662,13.5436 0,4.2265 C 31.8551,23.767 25.375,23.7787 19.939,23.7787 l -2.017,0.2052 c -2.8342,2.4364 -2.9244,6.3463 -2.9223,9.7756 6.2502,-6.9742 12.9174,-7.5004 16.2436,-7.4854 6.6377,0.029 9.7638,-1.6029 12.9339,-5.1939 -0.016,-0.07 0.016,-0.132 0,-0.2037 -0.1222,-0.8 -0.3362,-1.6544 -0.5601,-2.546 -0.3218,-1.2839 -0.7428,-2.4141 -1.4257,-3.2589 -0.016,-0.016 -0.038,-0.034 -0.051,-0.05 0,0 -0.042,0 -0.05,0 -0.023,-0.028 -0.028,-0.075 -0.05,-0.1011 -0.047,-0.034 -0.052,-0.07 -0.101,-0.101 -0.016,-0.016 -0.039,0.016 -0.05,0 C 41.1653,14.3502 40.2858,14 39.3942,13.8519 38.5861,13.7183 37.775,13.6165 36.95,13.5464 l -0.5092,0 -1.1711,0 z" opacity="0.837" fill="url(#lg7)"/>
+ <path d="m 34.559,37.579 c 0,2.732 -2.8497,4.116 -5.256,4.806 -3.62,1.04 -6.525,0.881 -9.551,0 -2.527,-0.736 -4.801,-2.24 -4.805,-4.805 l -0.016,-9.258 c -0.01,-3.073 2.302,-5.01 4.849,-5 l 8.4667,0.015 c 3.25,0 6.41,-3.3 6.401,-6.55 l 0,-3.237 4.21,0 c 2.7814,0 4.09,2.067 4.777,4.806 0.956,3.804 1,6.649 0,9.615 -0.966,2.88 -2,5.1476 -4.777,5.148 l -4.3,0 -10.03,0 0,-0.02 10.03,0.034 z" fill="none" stroke="#FFFFFF" stroke-width="1.63"/>
+ <path d="m 35.4653,14.3584 0,2.3933 c 0,3.7245 -3.4965,7.3757 -7.4809,7.3757 l -8.2491,0 c -2.8506,0 -4.0184,2.1569 -4.0042,4.4379 l 0.056,9.0129 c 0.01,1.0446 0.4,1.8235 1.148,2.4951 0.748,0.6715 1.8726,1.183 3.0553,1.5277 2.9164,0.8492 5.576,1.0022 9.0638,0 1.1327,-0.3248 2.6394,-0.9401 3.3976,-1.5964 0.7581,-0.6565 1.3077,-1.2961 1.3077,-2.4264 l 0,-3.6298 -10.052,0 0,-1.6795 15.1743,0.05 c 1.2008,0 1.788,-0.4724 2.3844,-1.1633 0.5964,-0.691 1.1149,-2.0469 1.5874,-3.456 0.9456,-2.8096 0.9336,-5.4491 0,-9.1658 -0.3252,-1.2978 -0.7976,-2.3461 -1.4257,-3.0552 -0.628,-0.7091 -1.357,-1.1202 -2.5461,-1.1202 z m 1.6294,1.6294 1.7867,0 c 0.5202,0 1.1993,0.4194 1.324,0.5602 0.3625,0.4093 0.78,1.2386 1.0694,2.3932 0.8895,3.5416 0.8915,5.7515 0.05,8.2491 -0.4517,1.347 -0.9205,2.6142 -1.2729,3 -0.3184,0.3395 -1,0.5093 -1.1713,0.5093 l -4.7865,-0.051 -12.0173,0 0,4.9384 10.052,0 0,2 c 0,0.727 -0.9733,1.1789 -1.1408,1.3239 -0.4872,0.4219 -1.3508,0.8359 -2.3423,1.1202 -3.223,0.9264 -5.5,0.7859 -8.1984,0 -1.0211,-0.2975 -1.9061,-0.7339 -2.4069,-1.1595 -0.5008,-0.4256 -0.5316,-0.7741 -0.6238,-1.285 l -0.056,-9.0129 c -0.013,-2.0224 0.6457,-2.8084 2.3748,-2.8084 l 8.2491,0 c 4.9233,0 9.1103,-4.3502 9.1103,-9.0052 1e-4,-0.2574 -10e-5,-0.5149 -10e-5,-0.7723 z" opacity="0.384" fill="#fff"/>
+ <path d="m 13.9847,7.3199 c 0,-2.7319 0.7324,-4.2182 4.7772,-4.926 2.7462,-0.4813 6.2673,-0.5414 9.5513,0 2.5939,0.4282 4.7774,2.3604 4.7774,4.926 l 0,9.0134 c 0,2.6434 -2.1198,4.8091 -4.7774,4.8091 l -8.6621,0.4788 c -3.2414,0 -6.589,2.8321 -6.589,5.957 l -0.2736,3.777 -3.284,0 c -2.7779,0 -4.3951,-2.0029 -5.0745,-4.8056 -0.9166,-3.7651 -0.8776,-6.0088 0,-9.6147 0.7608,-3.1461 3.192,-4.8058 5.7,-4.8058 l 3.5848,0 c 0,0 8.9448,-0.035 0,-0.032 l 0,-4.7771 0,0 z" fill="url(#lg6)"/>
+ <path d="m 16.3733,6.7218 c 0,-1 0.8,-1.8048 1.7906,-1.8048 0.9873,0 1.7907,0.8068 1.7907,1.8048 0,0.9944 -0.8034,1.8012 -1.7907,1.8012 -0.9908,0 -1.7906,-0.8068 -1.7906,-1.8012 z" fill="#fff"/>
+ <path d="M 22.7173,1.9955 C 21.3039,2.0297 19.9469,2.1923 18.7455,2.4028 14.7007,3.1106 14.01,4.6102 14.01,7.3421 l -0.2952,4.787 -3.3203,-3e-4 c -2.7779,0 -5.1968,1.6406 -5.9576,4.7864 -0.5165,2.1225 -0.7504,3.7842 -0.6621,5.5504 6.2924,-7.1319 13.0442,-7.6531 16.3965,-7.638 6.6376,0.029 9.7637,-1.6029 12.9338,-5.1939 l 0,-2.2914 c 0,-2.5655 -2.1926,-4.511 -4.7865,-4.9392 C 26.4714,2.0983 24.5345,1.9515 22.7173,1.9955 z" opacity="0.377" fill="url(#lg5)"/>
+ <path d="m 18.696,2.6271 c 3.6201,-1.0404 6.5255,-0.8811 9.551,0 2.5268,0.7361 4.7787,2.24 4.7774,4.8057 l 0,9.7315 c 0,1.3662 -1.9746,4.5293 -4.7726,4.5293 l -8.8988,0 c -2.4983,0 -5.997,2.7217 -5.997,5.981 l 0,3.7937 -4.21,0 c -2.7815,0 -4.0909,-2.0667 -4.7774,-4.8058 -0.9555,-3.8041 -1,-6.6493 0,-9.6148 0.9661,-2.8806 2,-5.1477 4.7774,-5.1477 l 4.2985,0 10.03,0 0,0.019 -10.03,-0.034 0.019,-4.8733 c -0.026,-1.9965 2.4146,-3.5524 5.2323,-4.3845 z" fill="none" stroke="#000000" stroke-width="1.63"/>
+ <path d="m 12.5337,30.6538 0,-2.796 c 0,-3.7246 3.3953,-7.0287 7.0461,-7.0287 l 8.6839,0 c 2.1549,0 4.024,-2.2411 4.0042,-4.3821 L 32.1845,7.434 C 32.1748,6.3895 31.8123,5.6105 31.0642,4.9389 30.3163,4.2673 29.1916,3.7558 28.009,3.4113 c -2.9166,-0.8494 -5.5762,-1.0023 -9.0639,0 -1.1326,0.3248 -2.6396,0.94 -3.3976,1.5964 -0.7582,0.6564 -1.3076,1.296 -1.3076,2.4263 l 0,3.6298 10.0519,0 0,1.6804 -15.1743,-0.051 c -1.2,0 -1.788,0.4724 -2.3844,1.1634 -0.5964,0.6908 -1.1149,2.0467 -1.5874,3.4559 -0.9456,2.8096 -0.9335,5.449 0,9.1657 0.3252,1.2978 0.7976,2.3461 1.4258,3.0552 0.628,0.7092 1.357,1.1203 2.546,1.1203 l 3.4162,0 z m -1.6295,-1.6295 -1.7867,0 c -0.52,0 -1.2,-0.4194 -1.3239,-0.56 C 7.431,28.0549 7.0135,27.2255 6.7241,26.0709 5.8346,22.5294 5.8327,20.3196 6.6736,17.8218 7.1253,16.475 7.5941,15.2077 7.9466,14.8319 8.265,14.4926 8.9375,14.3227 9.1178,14.3227 l 16.8038,0.051 0,-4.9394 -10.0519,0 0,-2 c 0,-0.727 0.9732,-1.1789 1.1407,-1.3239 0.4873,-0.4219 1.3509,-0.8359 2.3424,-1.12 3.2229,-0.9262 5.5,-0.7858 8.1983,0 1.0212,0.2975 1.9061,0.7339 2.3932,1.1712 0.1733,0.1352 0.2646,0.2973 0.4078,0.4582 0.1987,0.237 0.1552,0.55023 0.2011,0.8147 l 0,9.013 c 0,1.2357 -1.0565,2.7527 -2.2913,2.7527 l -8.6839,0 c -4.5897,0 -8.6756,4.0029 -8.6756,8.6581 0,0.3875 0,1.166 0,1.166 z" opacity="0.165" fill="#fff"/>
+</svg>
diff --git a/icons/console-terminal.svg b/icons/console-terminal.svg
new file mode 100644
index 0000000..12d3fa1
--- /dev/null
+++ b/icons/console-terminal.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#FFFFFF">
+ <!ENTITY fill_color "none">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="activity-terminal">
+
+ <rect fill="&fill_color;" height="32.442" stroke="&stroke_color;" stroke-linecap="round" stroke-width="3.5" width="43.457" x="5.646" y="9.404"/>
+ <g>
+ <path d="M15.531,27.872h-1.187l-0.007-2.205 c-0.61-0.024-1.201-0.093-1.772-0.205s-1.128-0.269-1.67-0.469v-1.919c0.562,0.288,1.129,0.509,1.703,0.663 c0.573,0.153,1.156,0.24,1.747,0.26v-2.278l-0.242-0.044c-1.167-0.205-1.996-0.527-2.486-0.967 c-0.491-0.439-0.736-1.072-0.736-1.897c0-0.874,0.3-1.557,0.899-2.047c0.6-0.491,1.455-0.758,2.565-0.802l0.007-1.692h1.179v1.663 c0.488,0.039,0.977,0.1,1.465,0.183s0.979,0.19,1.473,0.322v1.86c-0.488-0.205-0.977-0.365-1.465-0.479s-0.979-0.185-1.472-0.209 v2.102l0.234,0.044c1.24,0.195,2.11,0.521,2.611,0.978c0.5,0.457,0.75,1.131,0.75,2.025c0,0.898-0.297,1.588-0.893,2.069 c-0.596,0.481-1.497,0.756-2.703,0.824V27.872z M14.345,19.544v-1.912c-0.347,0.02-0.624,0.114-0.832,0.282 c-0.208,0.169-0.311,0.382-0.311,0.641c0,0.288,0.095,0.514,0.286,0.677C13.678,19.396,13.964,19.5,14.345,19.544z M15.531,21.932 v2.036c0.425-0.005,0.744-0.088,0.956-0.249c0.213-0.161,0.319-0.403,0.319-0.725c0-0.332-0.098-0.58-0.293-0.744 C16.317,22.087,15.99,21.98,15.531,21.932z" fill="&stroke_color;" stroke="&stroke_color;" stroke-width="0.5"/>
+ <path d="M27.646,27.813v1.392h-7.501v-1.392H27.646z" fill="&stroke_color;" stroke="&stroke_color;" stroke-width="0.5"/>
+ </g>
+</g></svg>