summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO5
-rw-r--r--PKGBUILD8
-rw-r--r--partial_revert.patch657
3 files changed, 665 insertions, 5 deletions
diff --git a/.SRCINFO b/.SRCINFO
index e251557a657d..eedb369452b0 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = pida-hg
pkgdesc = Snapshot of the last repository of the Python Integrated Development Application
pkgver = 2921.be90809a5d81
- pkgrel = 1
+ pkgrel = 2
url = http://pidsoff.appspot.com/pida
install = pida.install
arch = any
@@ -11,7 +11,6 @@ pkgbase = pida-hg
depends = python2-simplejson
depends = python2-pygtkhelpers
depends = python2-dbus
- depends = python2-logbook
depends = python2-notify
depends = python2-py
optdepends = python2-anyvc: version control integration
@@ -21,6 +20,7 @@ pkgbase = pida-hg
source = https://files.pythonhosted.org/packages/47/70/abb5fae71af6f86c4341b0f5c1ab2163cb48b47259a6f86ddcecae27e2d0/pida-0.6.2.tar.gz
source = pida.desktop
source = nodrm.patch
+ source = partial_revert.patch
source = json.patch
source = internal_moo.patch
source = api_update.patch
@@ -28,6 +28,7 @@ pkgbase = pida-hg
sha256sums = f8476c9a36399b525a18761b709c204ae3f3c4344a4334b726d4ddccfca17a34
sha256sums = 145e340a66e3ebce242d4dfb4bc58c81d01ddfa07aac981ed4e70c8c97eb7dec
sha256sums = c8be7fab72344e097375ac76e8de6d59c516c6a6084f771d55538bce4b69e83d
+ sha256sums = 8cbe9fac4ca3a3c124c4b294363e3767e03ac2a4d5f6bdecb27ad293b6341c3b
sha256sums = f27c5de285f0795a8d680974afac39968e3a1fc3b64d1b38bfa0a2da07576a7e
sha256sums = 8899d86b094970be7da56cfc56c02ec256870a4ce68966eaa684f3b390addf7f
sha256sums = 5582539ace888fbef4c22fa3db80bd760a8f587bdc9efb767de3dda50b80febe
diff --git a/PKGBUILD b/PKGBUILD
index 06fb7701191a..6b3a83f2e82a 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -2,18 +2,18 @@
pkgname=pida-hg
pkgver=2921.be90809a5d81
-pkgrel=1
+pkgrel=2
pkgdesc="Snapshot of the last repository of the Python Integrated Development Application"
arch=('any')
url="http://pidsoff.appspot.com/pida"
license=('custom')
-depends=('vte-legacy' 'python2-simplejson' 'python2-pygtkhelpers' 'python2-dbus' 'python2-logbook' 'python2-notify' 'python2-py')
+depends=('vte-legacy' 'python2-simplejson' 'python2-pygtkhelpers' 'python2-dbus' 'python2-notify' 'python2-py')
makedepends=('python2-distribute')
optdepends=('python2-anyvc: version control integration'
'python2-apipkg: version control integration')
provides=('pida')
conflicts=('pida')
-source=(https://files.pythonhosted.org/packages/47/70/abb5fae71af6f86c4341b0f5c1ab2163cb48b47259a6f86ddcecae27e2d0/pida-0.6.2.tar.gz pida.desktop nodrm.patch json.patch internal_moo.patch api_update.patch hg_update.tar.gz)
+source=(https://files.pythonhosted.org/packages/47/70/abb5fae71af6f86c4341b0f5c1ab2163cb48b47259a6f86ddcecae27e2d0/pida-0.6.2.tar.gz pida.desktop nodrm.patch partial_revert.patch json.patch internal_moo.patch api_update.patch hg_update.tar.gz)
install=pida.install
package() {
@@ -24,6 +24,7 @@ package() {
patch -Np1 -i ../api_update.patch
patch -Np1 -i ../hg_update.patch
patch -Np1 -i ../json.patch
+ patch -Np1 -i ../partial_revert.patch
#patch -Np1 -i ../nodrm.patch
python2 setup.py install --root="$pkgdir" --prefix=/usr
@@ -36,6 +37,7 @@ package() {
sha256sums=('f8476c9a36399b525a18761b709c204ae3f3c4344a4334b726d4ddccfca17a34'
'145e340a66e3ebce242d4dfb4bc58c81d01ddfa07aac981ed4e70c8c97eb7dec'
'c8be7fab72344e097375ac76e8de6d59c516c6a6084f771d55538bce4b69e83d'
+ '8cbe9fac4ca3a3c124c4b294363e3767e03ac2a4d5f6bdecb27ad293b6341c3b'
'f27c5de285f0795a8d680974afac39968e3a1fc3b64d1b38bfa0a2da07576a7e'
'8899d86b094970be7da56cfc56c02ec256870a4ce68966eaa684f3b390addf7f'
'5582539ace888fbef4c22fa3db80bd760a8f587bdc9efb767de3dda50b80febe'
diff --git a/partial_revert.patch b/partial_revert.patch
new file mode 100644
index 000000000000..d8aee274ddb2
--- /dev/null
+++ b/partial_revert.patch
@@ -0,0 +1,657 @@
+diff -ruN pida-0.6.2.orig/pida/core/languages.py pida-0.6.2/pida/core/languages.py
+--- pida-0.6.2.orig/pida/core/languages.py 2024-01-13 23:15:03.293222648 -0300
++++ pida-0.6.2/pida/core/languages.py 2024-01-13 23:15:27.369887672 -0300
+@@ -17,9 +17,19 @@
+ from pida.core.projects import Project
+ from pida.core.service import Service
+ from pida.core.features import FeaturesConfig
+-from pida.utils.languages import (
+- COMPLETER, LANG_PRIO,
+- Suggestion, Definition, ValidationError, Documentation)
++#from pida.utils.languages import (COMPLETER, LANG_PRIO, Suggestion, Definition, ValidationError, Documentation)
++
++from pida.utils.addtypes import Enumeration
++LANG_PRIO = Enumeration('LANG_PRIORITIES',
++(
++ ('PERFECT', 100),
++ ('VERY_GOOD', 50),
++ ('GOOD', 10),
++ ('DEFAULT', 0),
++ ('LOW', -50),
++ ('BAD', -100),
++))
++
+ from pida.utils.path import get_relative_path
+ # locale
+ from pida.core.locale import Locale
+diff -ruN pida-0.6.2.orig/pida/editors/mooedit/mooedit.py pida-0.6.2/pida/editors/mooedit/mooedit.py
+--- pida-0.6.2.orig/pida/editors/mooedit/mooedit.py 2024-01-13 23:15:03.296555981 -0300
++++ pida-0.6.2/pida/editors/mooedit/mooedit.py 2024-01-13 23:16:00.669885393 -0300
+@@ -39,11 +39,10 @@
+ from pida.core.events import EventsConfig
+ from pida.core.document import DocumentException
+ from pida.core.options import OptionsConfig, choices
+-from pida.ui.completer import (PidaCompleter, PidaCompleterWindow,
+- SuggestionsList)
++#from pida.ui.completer import (PidaCompleter, PidaCompleterWindow, SuggestionsList)
+ from pygtkhelpers.gthreads import GeneratorTask, gcall, AsyncTask
+-from pida.core.languages import Suggestion
+-from pida.ui.languages import PidaDocWindow
++#from pida.core.languages import Suggestion
++#from pida.ui.languages import PidaDocWindow
+ from pida.services.buffer import view as buffer_view
+
+
+@@ -233,7 +232,7 @@
+
+ def set_editor(self, editor):
+ self.editor = editor
+- self.editor_view = editor.get_view()
++ self.editor_view = editor.get_view()
+ self.editor_view.props.buffer.connect('changed', self.on_changed)
+ self.add(self.editor_view)
+ self.editor_view.show()
+@@ -525,16 +524,17 @@
+ self.svc = svc
+ self.editor = editor
+ self.document = document
+- self.editor_view = editor.get_view()
+- self.completer_window = PidaCompleterWindow(type_=gtk.WINDOW_POPUP,
+- show_input=False)
++ self.editor_view = editor.get_view()
++ """
++ self.completer_window = PidaCompleterWindow(type_=gtk.WINDOW_POPUP, show_input=False)
+ self.completer = self.completer_window.widget
+ self.completer.show_all()
+ self.completer.connect("user-accept", self.accept)
+ self.completer.connect("suggestion-selected", self.suggestion_selected)
++ """
+ self.editor_view.connect("cursor-moved", self.on_cursor_moved)
+- self.model = SuggestionsList()
+- self.completer.set_model(self.model)
++ #self.model = SuggestionsList()
++ #self.completer.set_model(self.model)
+
+ #self.completer.hide()
+ #self.completer_visible = False
+@@ -558,13 +558,14 @@
+ #editor.connect_after("key-press-event", self.on_after_keypress)
+
+ def disconnect(self):
++ return
+ #self.editor_view.disconnect_by_func(self.on_keypress)
+ #self.editor_view.disconnect_by_func(self.on_do_hide)
+ #try:
+ # self.editor.get_toplevel().disconnect_by_func(self.on_do_hide)
+ #except ValueError: pass
+- self.completer.disconnect_by_func(self.accept)
+- self.completer.disconnect_by_func(self.suggestion_selected)
++ #self.completer.disconnect_by_func(self.accept)
++ #self.completer.disconnect_by_func(self.suggestion_selected)
+ #self.editor_view.disconnect_by_func(self.on_cursor_moved)
+
+
+@@ -593,9 +594,11 @@
+ yield x
+
+ def get_completer_visible(self):
++ """
+ if self.completer_window and self.completer_window.window and \
+ self.completer_window.window.is_visible():
+ return True
++ """
+ return False
+
+ def set_completer_visible(self, value):
+@@ -615,7 +618,7 @@
+ def hide(self):
+ if not self.completer_visible:
+ return
+- self.completer_window.hide()
++ #self.completer_window.hide()
+ #self.completer.hide_all()
+ self.completer_visible = False
+ self.show_auto = False
+@@ -645,10 +648,12 @@
+
+ cmpl = self.svc.boss.get_service('language').get_completer(self.document)
+ info = self.svc.boss.get_service('language').get_info(self.document)
++ """`
+ if info:
+ self.completer.ignore_case = not info.case_sensitive
+ else:
+ self.completer.ignore_case = False
++ """
+
+ buf = self.editor.get_buffer()
+
+@@ -681,8 +686,8 @@
+ rpos = (pos[0]+abspos[0], pos[1]+abspos[1])
+ #self.completer_window.show_all()
+ #self.completer_window.move(rpos[0],rpos[1])
+- self.completer.place(rpos[0],rpos[1] - rec.height, rec.height)
+- self.completer_window.set_transient_for(self.svc.boss.window)
++ #self.completer.place(rpos[0],rpos[1] - rec.height, rec.height)
++ #self.completer_window.set_transient_for(self.svc.boss.window)
+ #self.completer_window.window.set_accept_focus(False)
+ #self.completer_window.window.set_focus_on_map(False)
+ #self.completer_window.window.set_skip_taskbar_hint(True)
+@@ -703,13 +708,15 @@
+ #self.completer_window.move(pos[0], pos[1])
+ #self.editor.move_child(self.completer, pos[0], pos[1])
+ #self.boss.get_service('language').
+- self.model.clear()
++ #self.model.clear()
++ """
+ if start != pos:
+ self.completer.filter = buf.get_text(
+ buf.get_iter_at_offset(start),
+ buf.get_iter_at_offset(cpos))
+ else:
+ self.completer.filter = ""
++ """
+
+ self._task = GeneratorTask(self.update_completer_and_add,
+ self.add_str)
+@@ -717,10 +724,12 @@
+
+ self.show_auto = show_auto
+
++ """
+ if visible:
+ self.completer_window.show()
+ self.completer.show_all()
+ #self.completer_visible = True
++ """
+
+ def accept(self, widget, suggestion):
+ self._delete_typed()
+@@ -856,6 +865,7 @@
+
+ def add_str(self, line):
+ #print "add line", line
++ """
+ if len(self.completer) > 3000:
+ #emergency stop
+ self.svc.log.info(
+@@ -874,6 +884,7 @@
+ self.editor_view.is_focus():
+ if len(self.completer.model):
+ self.completer_window.show()
++ """
+
+ def on_cursor_moved(self, widget, itr):
+ buf = self.editor.get_buffer()
+@@ -924,7 +935,7 @@
+ etest((gtk.keysyms.Page_Down,0)))):
+ #(65362, 65364, 65293, 65366, 65365):
+ if self.completer_visible:
+- self.completer.on_key_press_event(editor, event)
++ #self.completer.on_key_press_event(editor, event)
+ return True
+ elif etest(self.svc.key_close): # esc
+ self.hide()
+@@ -955,8 +966,8 @@
+ typed = self._get_typed()
+ if not len(typed):
+ self.hide()
+- else:
+- self.completer.filter = typed
++ #else:
++ #self.completer.filter = typed
+ elif len(event.string):
+ info = self.svc.boss.get_service('language').get_info(self.document)
+ if event.string not in info.word:
+@@ -967,7 +978,7 @@
+ buf = self.editor.get_buffer()
+ buf.move_mark(self.completer_start,
+ buf.get_iter_at_offset(buf.props.cursor_position))
+- self.completer.filter = self._get_typed()
++ #self.completer.filter = self._get_typed()
+ return True
+ # we have to retest as the completer could just have been closed by
+ # a non word character but an attrib char should open it again
+@@ -994,7 +1005,7 @@
+ #print "append typed", self._get_suggested(), self._get_typed()
+ self._delete_suggested()
+ self._append_typed(event.string)
+- self.completer.filter = self._get_typed()
++ #self.completer.filter = self._get_typed()
+
+
+ #if self.svc.opt('auto_char'):
+@@ -1292,7 +1303,7 @@
+ else:
+ editor = self._editor_instance.create_doc(document.filename)
+ document.editor = editor
+- self._editor_view = editor.get_view()
++ self._editor_view = editor.get_view()
+ editor.inputter = PidaMooInput(self, editor, document)
+ self._editor_view.props.show_line_marks = True
+ editor.props.enable_bookmarks = False
+@@ -1559,7 +1570,7 @@
+ self.boss.get_service('notify').notify(
+ data=_('No documentation found'), timeout=2000)
+ return
+- pd = PidaDocWindow(documentation=docu)
++ #pd = PidaDocWindow(documentation=docu)
+ if not pd.valid:
+ self.notify_user(_("No documentation found"),
+ title=_("Show documentation"),
+diff -ruN pida-0.6.2.orig/pida/services/commander/commander.py pida-0.6.2/pida/services/commander/commander.py
+--- pida-0.6.2.orig/pida/services/commander/commander.py 2024-01-13 23:15:03.296555981 -0300
++++ pida-0.6.2/pida/services/commander/commander.py 2024-01-13 23:16:17.216550926 -0300
+@@ -18,7 +18,7 @@
+ from pida.core.events import EventsConfig
+ from pida.core.actions import ActionsConfig
+ from pida.core.options import OptionsConfig
+-
++from pida.ui.views import PidaView
+
+
+ # locale
+@@ -27,7 +27,6 @@
+ _ = locale.gettext
+
+
+-from .views import TerminalView, PythonView
+
+ class CommanderOptionsConfig(OptionsConfig):
+
+@@ -316,6 +315,299 @@
+ if (context == 'file-menu'):
+ self.svc.get_action('terminal-for-file').set_visible(kw['file_name'] is not None)
+
++class TerminalView(PidaView):
++
++ icon_name = 'terminal'
++
++ def create_ui(self):
++ self._pid = None
++ self._is_alive = False
++ self._last_cwd = None
++ self._hb = gtk.HBox()
++ self._hb.show()
++ self.add_main_widget(self._hb)
++ self._term = PidaTerminal(**self.svc.get_terminal_options())
++ #self._matchids = {}
++ #for match, callback in self.svc.features['matches']:
++ # i = self._term.match_add(match)
++ # if i < 0:
++ # continue
++ # self._term.match_set_cursor_type(i, gtk.gdk.HAND2)
++ # self._matchids[i] = match
++ self._term.parent_view = self
++ self._term.connect('window-title-changed', self.on_window_title_changed)
++ self._term.connect('selection-changed', self.on_selection_changed)
++ #self._term.connect('button_press_event', self.on_button_pressed)
++ self._term.show()
++ self._create_scrollbar()
++ self._create_bar()
++ self._hb.pack_start(self._term)
++ if self.svc.opt('scrollbar_visible'):
++ self._hb.pack_start(self._scrollbar, expand=False)
++ self._hb.pack_start(self._bar, expand=False)
++ self.master = None
++ self.slave = None
++ self._init_matches()
++ #self.prep_highlights()
++
++ def _init_matches(self):
++ for args in self.svc.features['match']:
++ self._term.match_add_match(usr=self, *args)
++ for args in self.svc.features['match-callback']:
++ self._term.match_add_callback(usr=self, *args)
++ for args in self.svc.features['match-menu']:
++ self._term.match_add_menu(usr=self, *args)
++ for args in self.svc.features['match-menu-callback']:
++ self._term.match_add_menu_callback(usr=self, *args)
++
++ def _create_scrollbar(self):
++ self._scrollbar = gtk.VScrollbar()
++ self._scrollbar.set_adjustment(self._term.get_adjustment())
++ self._scrollbar.show()
++
++ def _create_bar(self):
++ self._bar = gtk.VBox(spacing=1)
++ self._stick_button = create_mini_button(
++ 'pin', _('Automatic change to the current buffer\'s directory'),
++ None, toggleButton=True)
++ self._bar.pack_start(self._stick_button, expand=False)
++ self._copy_button = create_mini_button(
++ gtk.STOCK_COPY, _('Copy the selection to the clipboard'),
++ self.on_copy_clicked)
++ self._copy_button.set_sensitive(False)
++ self._bar.pack_start(self._copy_button, expand=False)
++ self._paste_button = create_mini_button(
++ gtk.STOCK_PASTE, _('Paste the contents of the clipboard'),
++ self.on_paste_clicked)
++ self._bar.pack_start(self._paste_button, expand=False)
++ self._title = gtk.Label()
++ self._title.set_alignment(0.5, 1)
++ self._title.set_padding(0, 3)
++ self._title.set_angle(270)
++ self._title.set_size_request(0,0)
++ self._bar.pack_start(self._title)
++ self._bar.show_all()
++
++ def execute(self, commandargs, env, cwd, eof_handler=None,
++ use_python_fork=False, parser_func=None):
++ title_text = ' '.join(commandargs)
++ self._is_alive = True
++ self._title.set_text(title_text)
++ if eof_handler is None:
++ self.eof_handler = self.on_exited
++ else:
++ def eof_wrapper(*args, **kwargs):
++ self._is_alive = False
++ eof_handler(self, *args, **kwargs)
++ self.eof_handler = eof_wrapper
++ if use_python_fork:
++ if parser_func == None:
++ self._python_fork(commandargs, env, cwd)
++ else:
++ self._python_fork_parse(commandargs, env, cwd, parser_func)
++ else:
++ self._vte_fork(commandargs, env, cwd)
++
++ def _python_fork_waiter(self, popen):
++ exit_code = popen.wait()
++ return exit_code
++
++ def _python_fork_complete(self, exit_code):
++ gobject.timeout_add(200, self.eof_handler, self._term)
++
++ def _python_fork_preexec_fn(self):
++ os.setpgrp()
++
++ def _python_fork(self, commandargs, env, cwd):
++ self._term.connect('commit', self.on_commit_python)
++ # TODO: Env broken
++ env = dict(os.environ)
++ env['TERM'] = 'xterm'
++ (master, slave) = os.openpty()
++ self.slave = slave
++ self.master = master
++ self._term.set_pty(master)
++ p = subprocess.Popen(commandargs, stdin=slave, stdout=slave,
++ preexec_fn=self._python_fork_preexec_fn,
++ stderr=slave, env=env, cwd=cwd, close_fds=True)
++ self._pid = p.pid
++ self._last_cwd = cwd
++ gobject.timeout_add(200, self._save_cwd)
++ t = AsyncTask(self._python_fork_waiter, self._python_fork_complete)
++ t.start(p)
++
++ def _python_fork_parse(self, commandargs, env, cwd, parser_func):
++ self._term.connect('commit', self.on_commit_python)
++ env = dict(os.environ)
++ env['TERM'] = 'xterm'
++ master, self.slave = os.openpty()
++ self._term.set_pty(master)
++ self.master, slave = os.openpty()
++ p = subprocess.Popen(commandargs, stdout=slave,
++ stderr=subprocess.STDOUT, stdin=slave,
++ close_fds=True)
++ self._pid = p.pid
++ self._last_cwd = cwd
++ gobject.timeout_add(200, self._save_cwd)
++ gobject.io_add_watch(self.master, gobject.IO_IN,
++ self._on_python_fork_parse_stdout, parser_func)
++ self._term.connect('key-press-event',
++ self._on_python_fork_parse_key_press_event, self.master)
++
++ def _on_python_fork_parse_key_press_event(self, term, event, fd):
++ mapping = {
++ 22: '\x7f',
++ 98: "\x1bOA",
++ 104:"\x1bOB",
++ 100:"\x1bOD",
++ 102:"\x1bOC",
++ }
++ os.write(fd, mapping.get(event.hardware_keycode, event.string))
++ return True
++
++ def _on_python_fork_parse_stdout(self, fd, state, parser = None):
++ data = os.read(fd,1024)
++ os.write(self.slave, data)
++ if parser != None:
++ parser(data)
++ return True
++
++ def _vte_env_map_to_list(self, env):
++ return ['%s=%s' % (k, v) for (k, v) in env.items()]
++
++ def _vte_fork(self, commandargs, env, cwd):
++ self._term.connect('child-exited', self.eof_handler)
++ self._pid = self._term.fork_command(commandargs[0], commandargs, env, cwd)
++ self._last_cwd = cwd
++ gobject.timeout_add(200, self._save_cwd)
++
++ def close_view(self):
++ self.svc.boss.cmd('window', 'remove_view', view=self)
++
++ def on_exited(self, term):
++ self._is_alive = False
++ self._term.feed_text(_('Child exited')+'\r\n', '1;34')
++ self._term.feed_text(_('Press Enter/Space key to close.'))
++ self._term.connect('commit', self.on_press_any_key)
++
++ def can_be_closed(self):
++ self.kill()
++ return True
++
++ def kill(self):
++ if self._pid is not None:
++ try:
++ ostools.kill_pid(self._pid)
++ except (ostools.NoSuchProcess, ostools.AccessDenied):
++ self.svc.log.debug('PID %s has already gone' % self._pid)
++
++ def on_button_pressed(self, term, event):
++ if not event.button in [1,2] or \
++ not event.state & gtk.gdk.CONTROL_MASK:
++ return
++ line = int(event.y/self._term.get_char_height())
++ col = int(event.x/self._term.get_char_width())
++ chk = self._term.match_check(col, line)
++ if not chk:
++ return
++
++ (match, matchfun) = chk
++ if match and self._matchids.has_key(matchfun):
++ callbacks = self.svc.get_match_callbacks(self._matchids[matchfun])
++ for call in callbacks:
++ if call(self, event, match):
++ return
++
++ def on_selection_changed(self, term):
++ self._copy_button.set_sensitive(self._term.get_has_selection())
++
++ def on_copy_clicked(self, button):
++ self._term.copy_clipboard()
++
++ def on_paste_clicked(self, button):
++ self._term.paste_clipboard()
++
++ def on_press_any_key(self, term, data, datalen):
++ if data == "\r" or data == " ":
++ self.close_view()
++
++ def on_commit_python(self, term, data, datalen):
++ if data == '\x03':
++ ostools.kill_pid(self._pid, 2)
++
++ def on_window_title_changed(self, term):
++ self._title.set_text(term.get_window_title())
++
++ def chdir(self, path):
++ """
++ Try to change into the new directory.
++ Used by pin terminals for example.
++ """
++ if ostools.get_cwd(self._pid) == path:
++ return
++ # maybe we find a good way to check if the term is currently
++ # in shell mode and maybe there is a better way to change
++ # directories somehow
++ # this is like kate does it
++ self._term.feed_child(u'cd %s\n' %path)
++
++ def _save_cwd(self):
++ try:
++ self._last_cwd = ostools.get_cwd(self._pid)
++ return True
++ except (ostools.NoSuchProcess, ostools.AccessDenied):
++ return False
++
++ def get_absolute_path(self, path):
++ """
++ Return the absolute path for path and the terminals cwd
++ """
++ try:
++ return ostools.get_absolute_path(path, self._pid)
++ except (ostools.NoSuchProcess, ostools.AccessDenied):
++ if self._last_cwd:
++ apath = os.path.abspath(os.path.join(self._last_cwd, path))
++ if os.path.exists(apath):
++ return apath
++
++ @property
++ def is_alive(self):
++ return self._is_alive
++
++class PythonView(PidaView):
++
++ icon_name = 'terminal'
++ focus_ignore = True
++
++ def create_ui(self):
++ self.pid = None
++ self._box = gtk.HBox()
++ self._socket = gtk.Socket()
++ self._box.add(self._socket)
++ self._socket.show()
++ self._box.show()
++ self.add_main_widget(self._box)
++
++ def execute(self, file_=None, cwd=os.getcwd()):
++ commandargs = [
++ 'bpython-gtk',
++ '--socket-id=%s' % self._socket.get_id(),
++ ]
++ if file_:
++ commandargs.extend(['-i', file_])
++ self.popen = p = subprocess.Popen(commandargs, cwd=cwd)
++ self._pid = p.pid
++
++ def can_be_closed(self):
++ self.kill()
++ return True
++
++ def kill(self):
++ if self._pid is not None:
++ try:
++ ostools.kill_pid(self._pid)
++ except ostools.NoSuchProcess:
++ self.svc.log_debug('PID %s has already gone' % self._pid)
+
+ # Service class
+ class Commander(Service):
+diff -ruN pida-0.6.2.orig/pida/services/filemanager/filemanager.py pida-0.6.2/pida/services/filemanager/filemanager.py
+--- pida-0.6.2.orig/pida/services/filemanager/filemanager.py 2024-01-13 23:15:03.299889314 -0300
++++ pida-0.6.2/pida/services/filemanager/filemanager.py 2024-01-13 23:16:29.836550062 -0300
+@@ -459,7 +459,7 @@
+ if (project_scope_count == 0):
+ separator.hide()
+ toolitem = None
+- for proxy in self.svc.get_action('toolbar_hidden_menu').get_proxies():
++ for proxy in []:#self.svc.get_action('toolbar_hidden_menu').get_proxies():
+ if (isinstance(proxy, DropDownMenuToolButton)):
+ toolitem = proxy
+ break
+@@ -745,11 +745,7 @@
+ gtk.ToggleAction('toolbar_toggle_hidden',
+ _('Show Hidden Files'),
+ _('Show hidden files'),
+- gtk.STOCK_SELECT_ALL),
+- PidaDropDownMenuToolAction('toolbar_hidden_menu',
+- None,
+- _('Setup which kind of files should be hidden'),
+- None),
++ gtk.STOCK_SELECT_ALL)
+ ]
+
+ accels = {
+diff -ruN pida-0.6.2.orig/pida/ui/actions.py pida-0.6.2/pida/ui/actions.py
+--- pida-0.6.2.orig/pida/ui/actions.py 1969-12-31 21:00:00.000000000 -0300
++++ pida-0.6.2/pida/ui/actions.py 2024-01-13 23:15:46.689886345 -0300
+@@ -0,0 +1,43 @@
++import gtk
++from pida.ui.dropdownmenutoolbutton import DropDownMenuToolButton
++
++class PidaMenuToolAction(gtk.Action):
++ """
++ Custom gtk.Action subclass for handling toolitems with a dropdown menu
++ attached.
++ """
++
++ __gtype_name__ = "PidaMenuToolAction"
++
++ def __init__(self, *args, **kw):
++ gtk.Action.__init__(self, *args, **kw)
++ self.set_tool_item_type(gtk.MenuToolButton)
++
++class PidaDropDownMenuToolAction(gtk.Action):
++ """
++ Custom gtk.Action subclass for handling toolitems with a dropdown menu
++ attached.
++ """
++
++ __gtype_name__ = "PidaDropDownMenuToolAction"
++
++ def __init__(self, *args, **kw):
++ gtk.Action.__init__(self, *args, **kw)
++ self.set_tool_item_type(DropDownMenuToolButton)
++ self._set_arrow = ((kw['label'] == None) or (kw['label'] == '')) and \
++ (kw['stock_id'] == None)
++
++ def create_tool_item(self):
++ toolitem = gtk.Action.create_tool_item(self)
++ if (self._set_arrow == True):
++ toolitem.set_arrow()
++ return toolitem
++
++
++class PidaRememberToggle(gtk.ToggleAction):
++ """Remembers the state of the toggle on restart"""
++
++ __gtype_name__ = "PidaRememberToggle"
++
++ def __init__(self, *args, **kw):
++ gtk.ToggleAction.__init__(self, *args, **kw)
+diff -ruN pida-0.6.2.orig/pida/ui/languages.py pida-0.6.2/pida/ui/languages.py
+--- pida-0.6.2.orig/pida/ui/languages.py 2024-01-13 23:15:03.303222648 -0300
++++ pida-0.6.2/pida/ui/languages.py 2024-01-13 23:15:40.686553426 -0300
+@@ -1,6 +1,20 @@
+ import gtk
+-from pida.utils.languages import Documentation
++#from pida.utils.languages import Documentation
+
++class Documentation(InitObject):
++ """
++ Documentation of a object in the text
++ """
++ path = None
++ short = None
++ long_ = None
++
++ def __unicode__(self):
++ return self.long_ or self.short or ""
++
++ def __nonzero__(self):
++ # a documentation object is true if it holds any value
++ return bool(self.path) or bool(self.short) or bool(self.long_)
+
+ class PidaDocWindow(gtk.Window):
+ """