PyGI migration tasklist (GTK3 GStreamer 1.x)

Christian Stadelmann edited this page Dec 20, 2016 · 140 revisions

Check out our progress on the master branch on github. Feel free to fork and make pull requests! As always, we're around in IRC, but response time may be slow.

Bug report that started this all: https://github.com/exaile/exaile/issues/3

Helpful thoughts

  • On GTK 3.14+, hit CTRL-SHIFT-D or CTRL-SHIFT-I to bring up GtkInspector to help debug UI problems. If the hotkeys don't work, run Exaile with GTK_DEBUG=interactive. (On Gtk=3.18 this sometimes causes GtkDialogs to crash on closing.)
  • To visualize a GStreamer bin, call Gst.debug_bin_to_dot_file(bin, Gst.DebugGraphDetails.ALL, "file") and run Exaile with GST_DEBUG_DUMP_DOT_DIR=/dir. This creates /dir/file.dot, which can be converted to an image with Graphviz: dot -Tpng -ofile.png file.dot.
  • Documentations: GTK+, PyGI-Gtk. Alternatively you can install devhelp from your favorite linux distribution package manager.
  • Converting files to Gtk3: pygi-convert.sh (done and merged).
  • GStreamer debugger (latest version requires Gst 1.7).
  • Version check for slow-moving OSes (try to support these if possible):

Work

Stuff @sjohannes is doing

  • Decrease size of tracklist tabs.
    • If Prefs > Appearance > Tab placement is Left or Right, it looks terrible.
    • We force 6px padding to deal with Adwaita's massive padding, but 6px is actually larger than normal on some other themes. Hmm....
  • Rewrite Moodbar
    • Port to Cairo.
      • Features that likely won't make it to 4.0: waveform, darken. Code for tint is there but unused.
    • Refactor code to make it easier to use different visualisations and cache formats.
    • Reimplement the previewdevice integration.
    • Future: Reimplement the waveform & darken options.
    • Future: Split off the Gst1 Moodbar code from Clementine and turn it into a library or executable. Have code, need to publish.
  • Experimental VLC engine, just to evaluate the engine API.

Stuff @virtuald is doing

  • Look at the patch from @thiblahute to see if it has useful fixes
  • Fixing various preferences dialog bugs
  • Implementing GTK template thing that @mathbr mentioned to simplify composite widget development (see my github repo, will copy into Exaile repo too)
  • Double-clicking cover doesn't work
  • segfault on Linux when using the View -> Columns menu item
  • Smart Playlist editor is broken
  • Audio seek bar doesn't work
    • Doesn't seem to be receiving mouse events, probably needs to be placed in an EventBox, Gtk3 seems to be stricter about that sort of thing
    • Replace GtkProgressBar by a GtkScale? NO.
  • Fix re-emitting events: x.emit('...', e)
    • Easy to fix: just do x.emit('...', e.copy()) and it should work...
    • see dac2c9b58de0da2a27b8d603d963563de332edc4
  • Porting some widgets to use the template thing
  • Rewrite the audio system
    • Removing normal/unified engine distinctions, only one engine remains
    • Supports all the things
    • Ensure that audio outputs can still be switched on the fly
  • Make sure that multiple audio outputs still work (Preview device)
  • {get,set}_data - gone
  • Repackage quod libet Windows/OSX installers into generic set of scripts
    • Package exaile with it on Windows
    • Package exaile with it on OSX

Stuff @fidencio is doing:

  • right click on file, Properties doesn't load (bad glade UI file)
  • gtk3-ize xlgui/properties.py
  • Fix export playlist
  • Fix import playlist

Stuff @genodeftest is doing:

  • migration to Gtk 3.10: Deprecation of GtkHBox, GtkVBox, GtkHButtonBox, GtkVButtonBox, GtkHSeparator, GtkVSeparator, GtkAlignment, GtkTable, GtkStock (including stock icons), GtkMisc:xalign, GtkMisc:yalign, GtkMisc:xpad, GtkMisc:ypad; a little bit of cleanup
    • Glade file migration (main), see #101 and #102
    • plugin glade files, see #105
  • The left tabbar on the main UI is hidden if the Sizer is too small
    • added an implicit minimum size for both sides of the pane. Same fix for preferences dialog
    • partially done, see above
  • Tag editor: the "apply to all" toggle buttons are too large (when not toggled). See #167
  • copy_async no longer exists - playlist file export breaks

Stuff nobody is doing yet

  • Update documentation and special files like README and INSTALLATION
  • Update xlgui/cover.py. It has Lots of thread related issues, most notably crashers due editing UI from non-main thread. Port to GtkTemplate and renew code style.

GtkBuilder/Glade file migration to 3.x:

  • data/ui/preferences, data/ui/panels, data/ui/widgets, data/ui/about_dialog.ui
  • Plugins complete: GroupTagger, LyricsWiki, BPM
  • Add more glade implementations to replace handcoded stuff? Doesn't work with inheritance.

GTK3

  • GdkPixmap and GdkDrawable are gone: OSD, xlgui/icons

Bugs we're aware of

  • Playlist search freezes (regression introduced?)
  • Some plugins are broken, see Exaile 4.x Plugin development status list for details
  • Drag and drop has various errors (maybe time to get rid of legacy stuff?)
    • Most of the issues are fixed.
    • Drag icon (when dragging multiple albums) causes an error.
  • xlgui/preferences/widgets: enable_model_drag_{source,dest} - may need Gtk.TargetEntry.new

  • Hunt down all the threading issues

  • ClickableCellRenderer doesn't work, looks like pixbuf isn't set unless you set it?:

Traceback (most recent call last):
  File "xlgui/widgets/common.py", line 548, in do_activate
    pixbuf_width = self.props.pixbuf.get_width()
AttributeError: 'NoneType' object has no attribute 'get_width'

Some more bugs already fixed:

  • Update installation docs, remove GStreamer 0.10 references
  • Transparency doesn't work
  • "Collection is empty" message should be centered vertically.
  • Rating bar in context menu of tracks does not work (GdkEvent stuff)
  • Scrolling on Mute button does not change volume
  • Empty Collections panel (from searching for a nonexistent track) has a blank tooltip.
  • Shuffle and Repeat buttons don't show the popup menu.
  • TypeError: get_menu_position() takes exactly 3 arguments (5 given) when activating tray menu on Gtk 3.16 due to API break

Visual bugs

Encoding issues

PyGTK sets the system default encoding (sys.getdefaultencoding()) to utf-8; pygtkcompat replicates this crazyness. Since moving to pure PyGI without pygtkcompat, we are getting the original value, which seems to always be ascii in Python 2. This causes problems with locale.strxfrm (Python bug reported in 2008) and str.decode, and maybe other things.

>>> sys.getdefaultencoding()
'ascii'
>>> locale.strxfrm(u'\xe4')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 0: ordinal not in range(128)
>>> u'\xe4'.encode('utf-8').decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

>>> import gtk
>>> sys.getdefaultencoding()
'utf-8'
>>> locale.strxfrm(u'\xe4')
'\x0c\x01\x11\x01\t'
>>> u'\xe4'.encode('utf-8').decode()
u'\xe4'

This also exposes a few bugs in Exaile where the code assumes the default encoding is utf-8. These are hopefully all fixed now.