Re: [Tails-dev] MAT nautilus

Nachricht löschen

Nachricht beantworten
Autor: alan
Datum:  
To: tails-dev
Betreff: Re: [Tails-dev] MAT nautilus

> From: alan@???
> 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 <tails@???>
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 <tails@???>
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 <amnesia@???>
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