> From: [email protected] > Date: Fri, 10 Aug 2012 10:34:40 +0200 > [...]
> I had fun writing a basic MAT nautilus extension. It works fine for me > under Tails, with nautilus 2.x. > > For now, it doesn't work with nautilus 3.x under wheezy. If I understood > the problem well, Nautilus 3.x imports Gtk through GI, while poppler and > cairo (imported by MAT) import Gtk2 through python bindings. Result: > Find attached a patchset that works under wheezy. It includes a transition from pygtk to gi. Cheers --
From 95e84fc66c28dd61c92b24ca549a07f7526c0de9 Mon Sep 17 00:00:00 2001 From: Tails developers <[email protected]> Date: Sun, 5 Aug 2012 22:53:32 +0200 Subject: [PATCH 1/3] Add nautilus extension --- nautilus/nautilus-mat.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 1 + 2 files changed, 92 insertions(+) create mode 100644 nautilus/nautilus-mat.py diff --git a/nautilus/nautilus-mat.py b/nautilus/nautilus-mat.py new file mode 100644 index 0000000..df0c3a6 --- /dev/null +++ b/nautilus/nautilus-mat.py @@ -0,0 +1,91 @@ +#! /usr/bin/python + +import os +import urllib +import logging +import gettext +gettext.install("mat") + +import xml.sax + +from gi.repository import Nautilus, GObject, Gtk + +# mat package is called lib +import lib.mat as mat +import lib.strippers as strippers + +class MatExtension(GObject.GObject, Nautilus.MenuProvider): + def __init__(self): + logging.debug("nautilus-mat: initializing") + pass + + def get_file_items(self, window, files): + if len(files) != 1: + return + + file = files[0] + + # We're only going to put ourselves on supported mimetypes' context menus + if not file.get_mime_type() in [i["mimetype"] for i in self.__list_supported()]: + logging.debug("%s is not supported by MAT" % file.get_mime_type()) + return + + # MAT can only handle local file: + if file.get_uri_scheme() != 'file': + logging.debug("%s files not supported by MAT" % file.get_uri_scheme()) + return + + item = Nautilus.MenuItem(name="Nautilus::clean_metadata", + label=_("Clean metadata"), + tip=_("Clean file's metadata with MAT")) + item.connect('activate', self.menu_activate_cb, file) + return item, + + def show_message(self, message, type = Gtk.MessageType.INFO): + dialog = Gtk.MessageDialog(parent=None, + flags=Gtk.DialogFlags.MODAL, + type=type, + buttons=Gtk.ButtonsType.OK, + message_format=message) + ret = dialog.run() + dialog.destroy() + return ret + + # Convenience functions that should be merged into MAT core + def __list_supported(self): + ''' + Print all supported fileformat, and exit + ''' + handler = mat.XMLParser() + parser = xml.sax.make_parser() + parser.setContentHandler(handler) + path = os.path.join(mat.get_sharedir('FORMATS')) + with open(path, 'r') as xmlfile: + parser.parse(xmlfile) + + localy_supported = [] + for item in handler.list: + if strippers.STRIPPERS.has_key(item['mimetype'].split(',')[0]): + localy_supported.append(item) + + return localy_supported + + def menu_activate_cb(self, menu, file): + if file.is_gone(): + return + + file_path = urllib.unquote(file.get_uri()[7:]) + + class_file = mat.create_class_file(file_path, + backup=True, + add2archive=False) + if class_file: + if class_file.is_clean(): + self.show_message(_("%s is already clean") % file_path) + else: + if not class_file.remove_all(): + self.show_message(_("Unable to clean %s") % file_path, Gtk.MessageType.ERROR) + else: + self.show_message(_("Unable to process %s") % file_path, Gtk.MessageType.ERROR) + + diff --git a/setup.py b/setup.py index 22a6718..e7a0b0c 100644 --- a/setup.py +++ b/setup.py @@ -29,6 +29,7 @@ setup( ( 'share/applications', ['mat.desktop'] ), ( 'share/mat', ['FORMATS', 'logo.png'] ), ( 'share/doc/mat', ['README', 'TODO'] ), + ( 'share/nautilus-python/extensions', ['nautilus/nautilus-mat.py']) ], cmdclass = { 'build': build_extra.build_extra, -- 1.7.10.4
From 741e678d2138f1fa3fcc59829abf3db3f564373e Mon Sep 17 00:00:00 2001 From: Tails developers <[email protected]> Date: Sun, 5 Aug 2012 22:50:13 +0200 Subject: [PATCH 2/3] Use gi instead of python modules This prevents from importing gtk2 which conflicts with Gtk3 --- lib/office.py | 7 +++---- lib/strippers.py | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/office.py b/lib/office.py index d14125b..85c2604 100644 --- a/lib/office.py +++ b/lib/office.py @@ -7,13 +7,12 @@ import logging import zipfile import fileinput import xml.dom.minidom as minidom - +import gi try: import cairo - import poppler + from gi.repository import Poppler except ImportError: pass - import mat import parser import archive @@ -125,7 +124,7 @@ class PdfStripper(parser.GenericParser): add2archive) uri = 'file://' + os.path.abspath(self.filename) self.password = None - self.document = poppler.document_new_from_file(uri, self.password) + self.document = Poppler.Document.new_from_file(uri, self.password) self.meta_list = frozenset(['title', 'author', 'subject', 'keywords', 'creator', 'producer', 'metadata']) diff --git a/lib/strippers.py b/lib/strippers.py index 61030a7..eaf9444 100644 --- a/lib/strippers.py +++ b/lib/strippers.py @@ -23,8 +23,9 @@ STRIPPERS = { # PDF support pdfSupport = True + try: - import poppler + from gi.repository import Poppler except ImportError: print('Unable to import python-poppler: not PDF support') pdfSupport = False -- 1.7.10.4
From eaecd80f0ac41857c559e36d8595cd2fc8a8b859 Mon Sep 17 00:00:00 2001 From: Tails developers <[email protected]> Date: Fri, 10 Aug 2012 11:58:06 +0200 Subject: [PATCH 3/3] Convert mat-gui to Gtk 3 --- mat-gui | 200 ++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 102 insertions(+), 98 deletions(-) diff --git a/mat-gui b/mat-gui index 18c7467..5601759 100755 --- a/mat-gui +++ b/mat-gui @@ -5,9 +5,6 @@ Metadata anonymisation toolkit - GUI edition ''' -import gtk -import gobject - import gettext import locale import logging @@ -17,6 +14,10 @@ import mimetypes import xml.sax import urllib2 +import gi +from gi.repository import GObject +from gi.repository import Gtk, Gdk, GdkPixbuf + from lib import mat from lib import strippers @@ -28,7 +29,7 @@ class CFile(object): ''' Contain the "parser" class of the file "filename" This class exist just to be "around" my parser.Generic_parser class, - since the gtk.ListStore does not accept it. + since the Gtk.ListStore does not accept it. ''' def __init__(self, filename, backup, add2archive): try: @@ -48,32 +49,32 @@ class GUI: self.add2archive = True # Main window - self.window = gtk.Window() + self.window = Gtk.Window() self.window.set_title('Metadata Anonymisation Toolkit') - self.window.connect('destroy', gtk.main_quit) + self.window.connect('destroy', Gtk.main_quit) self.window.set_default_size(800, 600) self.logo = mat.get_sharedir('logo.png') - icon = gtk.gdk.pixbuf_new_from_file_at_size(self.logo, 50, 50) + icon = GdkPixbuf.Pixbuf.new_from_file_at_size(self.logo, 50, 50) self.window.set_icon(icon) - self.accelerator = gtk.AccelGroup() + self.accelerator = Gtk.AccelGroup() self.window.add_accel_group(self.accelerator) - vbox = gtk.VBox() + vbox = Gtk.VBox() self.window.add(vbox) menubar = self.__create_menu() toolbar = self.__create_toolbar() - content = gtk.ScrolledWindow() - content.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + content = Gtk.ScrolledWindow() + content.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) vbox.pack_start(menubar, False, True, 0) vbox.pack_start(toolbar, False, True, 0) vbox.pack_start(content, True, True, 0) # parser.class - name - path - type - cleaned - self.liststore = gtk.ListStore(object, str, str, str, str, str) + self.liststore = Gtk.ListStore(object, str, str, str, str, str) - self.treeview = gtk.TreeView(model=self.liststore) + self.treeview = Gtk.TreeView(model=self.liststore) self.treeview.set_search_column(1) # filename column is searchable self.treeview.set_rules_hint(True) # alternate colors for rows self.treeview.set_rubber_banding(True) # mouse selection @@ -81,16 +82,19 @@ class GUI: self.treeview.connect('row-activated', self.__popup_metadata) self.treeview.connect('drag_data_received', self.__on_drag_data_received) - self.treeview.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP, - [('text/uri-list', 0, 80), ], gtk.gdk.ACTION_COPY) + self.treeview.drag_dest_set(Gtk.DestDefaults.MOTION | + Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, + [], Gdk.DragAction.COPY) + targets = Gtk.TargetList.new([]) + targets.add_uri_targets(80) + self.treeview.drag_dest_set_target_list(targets) self.__add_columns() self.selection = self.treeview.get_selection() - self.selection.set_mode(gtk.SELECTION_MULTIPLE) + self.selection.set_mode(Gtk.SelectionMode.MULTIPLE) content.add(self.treeview) - self.statusbar = gtk.Statusbar() + self.statusbar = Gtk.Statusbar() self.statusbar.push(1, _('Ready')) vbox.pack_start(self.statusbar, False, False, 0) @@ -100,32 +104,32 @@ class GUI: ''' Returns a vbox object, which contains a toolbar with buttons ''' - toolbar = gtk.Toolbar() + toolbar = Gtk.Toolbar() - toolbutton = gtk.ToolButton(gtk.STOCK_ADD) + toolbutton = Gtk.ToolButton(Gtk.STOCK_ADD) toolbutton.set_label(_('Add')) toolbutton.connect('clicked', self.__add_files) toolbutton.set_tooltip_text(_('Add files')) toolbar.add(toolbutton) - toolbutton = gtk.ToolButton(gtk.STOCK_CLEAR) + toolbutton = Gtk.ToolButton(Gtk.STOCK_CLEAR) toolbutton.set_label(_('Clean')) toolbutton.connect('clicked', self.__process_files, self.__mat_clean) toolbutton.set_tooltip_text(_('Clean selected files')) toolbar.add(toolbutton) - toolbutton = gtk.ToolButton(gtk.STOCK_FIND) + toolbutton = Gtk.ToolButton(Gtk.STOCK_FIND) toolbutton.set_label(_('Check')) toolbutton.connect('clicked', self.__process_files, self.__mat_check) toolbutton.set_tooltip_text(_('Check selected files for harmful meta')) toolbar.add(toolbutton) - toolbutton = gtk.ToolButton(stock_id=gtk.STOCK_QUIT) + toolbutton = Gtk.ToolButton(stock_id=Gtk.STOCK_QUIT) toolbutton.set_label(_('Quit')) - toolbutton.connect('clicked', gtk.main_quit) + toolbutton.connect('clicked', Gtk.main_quit) toolbar.add(toolbutton) - vbox = gtk.VBox(spacing=3) + vbox = Gtk.VBox(spacing=3) vbox.pack_start(toolbar, False, False, 0) return vbox @@ -137,8 +141,8 @@ class GUI: _('Cleaned file')] for i, j in enumerate(colname, 1): - filename_column = gtk.CellRendererText() - column = gtk.TreeViewColumn(j, filename_column, text=i) + filename_column = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(j, filename_column, text=i) column.set_sort_column_id(i) column.set_resizable(True) # column is resizeable self.treeview.append_column(column) @@ -147,13 +151,13 @@ class GUI: ''' Create a MenuItem() like Preferences, Quit, Add, Clean, ... ''' - item = gtk.ImageMenuItem() + item = Gtk.ImageMenuItem() if shortcut: - key, mod = gtk.accelerator_parse(shortcut) + key, mod = Gtk.accelerator_parse(shortcut) item.add_accelerator('activate', self.accelerator, - key, mod, gtk.ACCEL_VISIBLE) - picture = gtk.Image() - picture.set_from_stock(pix, gtk.ICON_SIZE_MENU) + key, mod, Gtk.AccelFlags.VISIBLE) + picture = Gtk.Image() + picture.set_from_stock(pix, Gtk.IconSize.MENU) item.set_image(picture) item.set_label('_' + name) item.set_use_underline(True) @@ -164,8 +168,8 @@ class GUI: ''' Create a submenu like File, Edit, Clean, ... ''' - submenu = gtk.Menu() - menuitem = gtk.MenuItem() + submenu = Gtk.Menu() + menuitem = Gtk.MenuItem() menuitem.set_submenu(submenu) menuitem.set_label('_' + name) menuitem.set_use_underline(True) @@ -176,39 +180,39 @@ class GUI: ''' Return a MenuBar ''' - menubar = gtk.MenuBar() + menubar = Gtk.MenuBar() file_menu = self.__create_sub_menu(_('Files'), menubar) self.__create_menu_item(_('Add files'), self.__add_files, file_menu, - gtk.STOCK_ADD, '<Control>O') - self.__create_menu_item(_('Quit'), gtk.main_quit, file_menu, - gtk.STOCK_QUIT, '<Control>Q') + Gtk.STOCK_ADD, '<Control>O') + self.__create_menu_item(_('Quit'), Gtk.main_quit, file_menu, + Gtk.STOCK_QUIT, '<Control>Q') edit_menu = self.__create_sub_menu(_('Edit'), menubar) self.__create_menu_item(_('Clear the filelist'), - lambda x: self.liststore.clear(), edit_menu, gtk.STOCK_REMOVE, + lambda x: self.liststore.clear(), edit_menu, Gtk.STOCK_REMOVE, None) self.__create_menu_item(_('Preferences'), self.__preferences, - edit_menu, gtk.STOCK_PREFERENCES, '<Control>P') + edit_menu, Gtk.STOCK_PREFERENCES, '<Control>P') process_menu = self.__create_sub_menu(_('Process'), menubar) - item = gtk.ImageMenuItem() - key, mod = gtk.accelerator_parse('<Control>L') + item = Gtk.ImageMenuItem() + key, mod = Gtk.accelerator_parse('<Control>L') item.add_accelerator('activate', self.accelerator, - key, mod, gtk.ACCEL_VISIBLE) - picture = gtk.Image() - picture.set_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU) + key, mod, Gtk.AccelFlags.VISIBLE) + picture = Gtk.Image() + picture.set_from_stock(Gtk.STOCK_CLEAR, Gtk.IconSize.MENU) item.set_image(picture) item.set_label(_('Clean')) item.connect('activate', self.__process_files, self.__mat_clean) process_menu.append(item) - item = gtk.ImageMenuItem() - key, mod = gtk.accelerator_parse('<Control>h') + item = Gtk.ImageMenuItem() + key, mod = Gtk.accelerator_parse('<Control>h') item.add_accelerator('activate', self.accelerator, - key, mod, gtk.ACCEL_VISIBLE) - picture = gtk.Image() - picture.set_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU) + key, mod, Gtk.AccelFlags.VISIBLE) + picture = Gtk.Image() + picture.set_from_stock(Gtk.STOCK_FIND, Gtk.IconSize.MENU) item.set_image(picture) item.set_label(_('Check')) item.connect('activate', self.__process_files, self.__mat_check) @@ -216,9 +220,9 @@ class GUI: help_menu = self.__create_sub_menu(_('Help'), menubar) self.__create_menu_item(_('Supported formats'), self.__supported, - help_menu, gtk.STOCK_INFO, False) + help_menu, Gtk.STOCK_INFO, False) self.__create_menu_item(_('About'), self.__about, help_menu, - gtk.STOCK_ABOUT, False) + Gtk.STOCK_ABOUT, False) return menubar @@ -227,7 +231,7 @@ class GUI: Remove selected files from the treeview when the use hit the 'suppr' key ''' - if gtk.gdk.keyval_name(event.keyval) == "Delete": + if Gdk.keyval_name(event.keyval) == "Delete": rows = [] self.selection.selected_foreach( lambda model, path, iter: rows.append(iter)) @@ -237,18 +241,18 @@ class GUI: ''' Add the files chosed by the filechoser ("Add" button) ''' - chooser = gtk.FileChooserDialog(title=_('Choose files'), - parent=self.window, action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_OK, 0, gtk.STOCK_CANCEL, 1)) + chooser = Gtk.FileChooserDialog(title=_('Choose files'), + parent=self.window, action=Gtk.FileChooserAction.OPEN, + buttons=(Gtk.STOCK_OK, 0, Gtk.STOCK_CANCEL, 1)) chooser.set_default_response(0) chooser.set_select_multiple(True) - all_filter = gtk.FileFilter() # filter that shows all files + all_filter = Gtk.FileFilter() # filter that shows all files all_filter.set_name(_('All files')) all_filter.add_pattern('*') chooser.add_filter(all_filter) - supported_filter = gtk.FileFilter() + supported_filter = Gtk.FileFilter() # filter that shows only supported formats [supported_filter.add_mime_type(i) for i in strippers.STRIPPERS.keys()] supported_filter.set_name(_('Supported files')) @@ -256,10 +260,10 @@ class GUI: response = chooser.run() - if response is 0: # gtk.STOCK_OK + if response is 0: # Gtk.STOCK_OK filenames = chooser.get_filenames() task = self.populate(filenames) - gobject.idle_add(task.next) # asynchrone processing + GObject.idle_add(task.next) # asynchrone processing chooser.destroy() def populate(self, filenames): @@ -316,15 +320,15 @@ class GUI: name = '-<b>' + str(i) + '</b> : ' meta += (name + str(j) + '\n') - w = gtk.MessageDialog(self.window, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, label) + w = Gtk.MessageDialog(self.window, + Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, + Gtk.MessageType.INFO, Gtk.ButtonsType.CLOSE, label) w.set_resizable(True) w.set_size_request(400, 300) - scrolled_window = gtk.ScrolledWindow() - scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + scrolled_window = Gtk.ScrolledWindow() + scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) w.vbox.pack_start(scrolled_window, True, True, 0) - content = gtk.Label(meta) + content = Gtk.Label(label=meta) content.set_selectable(True) content.set_alignment(0, 0) content.set_use_markup(True) @@ -340,11 +344,11 @@ class GUI: Popup that warn the user about the unsupported files that he want to process ''' - dialog = gtk.Dialog(title=_('Not-supported'), parent=self.window, - flags=0, buttons=(gtk.STOCK_OK, 0)) - vbox = gtk.VBox(spacing=5) + dialog = Gtk.Dialog(title=_('Not-supported'), parent=self.window, + flags=0, buttons=(Gtk.STOCK_OK, 0)) + vbox = Gtk.VBox(spacing=5) dialog.get_content_area().pack_start(vbox, True, True, 0) - store = gtk.ListStore(str, str) + store = Gtk.ListStore(str, str) # append filename - mimetype to the store #FIXME : I'm ugly @@ -355,14 +359,14 @@ class GUI: else: store.append([item, 'unknown']) - treeview = gtk.TreeView(store) + treeview = Gtk.TreeView(store) vbox.pack_start(treeview, True, True, 0) #create column - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn(_('Filename'), rendererText, text=0) + rendererText = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(_('Filename'), rendererText, text=0) treeview.append_column(column) - column = gtk.TreeViewColumn(_('Mimetype'), rendererText, text=1) + column = Gtk.TreeViewColumn(_('Mimetype'), rendererText, text=1) treeview.append_column(column) dialog.show_all() @@ -374,17 +378,17 @@ class GUI: ''' About popup ''' - w = gtk.AboutDialog() + w = Gtk.AboutDialog() w.set_authors(['Julien (jvoisin) Voisin', ]) w.set_artists(['Marine BenoƮt', ]) w.set_copyright('GNU Public License v2') w.set_comments(_('This software was coded during the GSoC 2011')) - w.set_logo(gtk.gdk.pixbuf_new_from_file_at_size(self.logo, 400, 200)) + w.set_logo(GdkPixbuf.Pixbuf.new_from_file_at_size(self.logo, 400, 200)) w.set_program_name('Metadata Anonymisation Toolkit') w.set_version(mat.__version__) w.set_website('https://mat.boum.org') w.set_website_label(_('Website')) - w.set_position(gtk.WIN_POS_CENTER) + w.set_position(Gtk.WindowPosition.CENTER) w.run() w.destroy() @@ -392,12 +396,12 @@ class GUI: ''' List the supported formats ''' - dialog = gtk.Dialog(_('Supported formats'), self.window, 0, - (gtk.STOCK_CLOSE, 0)) - vbox = gtk.VBox(spacing=5) + dialog = Gtk.Dialog(_('Supported formats'), self.window, 0, + (Gtk.STOCK_CLOSE, 0)) + vbox = Gtk.VBox(spacing=5) dialog.get_content_area().pack_start(vbox, True, True, 0) - label = gtk.Label() + label = Gtk.Label() label.set_markup('<big><u>Supported fileformats</u></big>') vbox.pack_start(label, True, True, 0) @@ -411,7 +415,7 @@ class GUI: def expander_callback(current): ''' Close every expander except the current one ''' - for i in vbox.get_children()[1:]: # first child is a gtk.Label + for i in vbox.get_children()[1:]: # first child is a Gtk.Label if i != current: i.set_expanded(False) @@ -428,9 +432,9 @@ class GUI: if item['support'] == 'partial': content += '\n\t<b>remaining</b> : ' + item['remaining'] - expander = gtk.Expander(title) + expander = Gtk.Expander(title) vbox.pack_start(expander, False, False, 0) - label = gtk.Label() + label = Gtk.Label() label.set_markup(content) expander.add(label) expander.connect('activate', expander_callback) @@ -444,32 +448,32 @@ class GUI: ''' Preferences popup ''' - dialog = gtk.Dialog(_('Preferences'), self.window, 0, - (gtk.STOCK_OK, 0)) - hbox = gtk.HBox() + dialog = Gtk.Dialog(_('Preferences'), self.window, 0, + (Gtk.STOCK_OK, 0)) + hbox = Gtk.HBox() dialog.get_content_area().pack_start(hbox, False, False, 0) - icon = gtk.Image() - icon.set_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_DIALOG) + icon = Gtk.Image() + icon.set_from_stock(Gtk.STOCK_PREFERENCES, Gtk.IconSize.DIALOG) hbox.pack_start(icon, False, False, 20) - table = gtk.Table(3, 2, False) # nb rows, nb lines + table = Gtk.Table(3, 2, False) # nb rows, nb lines hbox.pack_start(table, True, True, 0) - force = gtk.CheckButton(_('Force Clean'), False) + force = Gtk.CheckButton(_('Force Clean'), False) force.set_active(self.force) force.connect('toggled', self.__invert, 'force') force.set_tooltip_text(_('Do not check if already clean before \ cleaning')) table.attach(force, 0, 1, 0, 1) - backup = gtk.CheckButton(_('Backup'), False) + backup = Gtk.CheckButton(_('Backup'), False) backup.set_active(self.backup) backup.connect('toggled', self.__invert, 'backup') backup.set_tooltip_text(_('Keep a backup copy')) table.attach(backup, 0, 1, 1, 2) - add2archive = gtk.CheckButton(_('Add unsupported file to archives'), + add2archive = Gtk.CheckButton(_('Add unsupported file to archives'), False) add2archive.set_active(self.add2archive) add2archive.connect('toggled', self.__invert, 'add2archive') @@ -479,7 +483,7 @@ non-anonymised) file to output archive')) hbox.show_all() response = dialog.run() - if response is 0: # gtk.STOCK_OK + if response is 0: # Gtk.STOCK_OK dialog.destroy() def __invert(self, button, name): @@ -507,7 +511,7 @@ non-anonymised) file to output archive')) urls = selection.data.strip('\r\n\x00') # strip stupid characters cleaned_urls = map(self.__clean_draged_file_path, urls.split('\n')) task = self.populate(cleaned_urls) - gobject.idle_add(task.next) # asynchrone processing + GObject.idle_add(task.next) # asynchrone processing def __clean_draged_file_path(self, url): ''' @@ -530,7 +534,7 @@ non-anonymised) file to output archive')) if not iterator: # if nothing is selected : select everything iterator = xrange(len(self.liststore)) task = func(iterator) # launch func() in an asynchrone way - gobject.idle_add(task.next) + GObject.idle_add(task.next) def __mat_check(self, iterator): ''' @@ -575,6 +579,6 @@ if __name__ == '__main__': infiles = [arg for arg in sys.argv[1:] if os.path.exists(arg)] if infiles: task = gui.populate(infiles) - gobject.idle_add(task.next) + GObject.idle_add(task.next) - gtk.main() + Gtk.main() -- 1.7.10.4
pgpp9x70OBk65.pgp
Description: PGP signature
_______________________________________________ tails-dev mailing list [email protected] https://mailman.boum.org/listinfo/tails-dev
