CodeMouse92
CodeMouse92

Reputation: 6898

Overlay Other GUI Elements Over GStreamer Video

I have a project built in Python, PyGTK 2.24, and PyGST (GStreamer). I have my video working perfectly in a gtk.DrawingArea object.

However, I need to display other GUI elements OVER this video while it is playing. (Please don't ask why, just trust me.) Right now, they all appear to be behind. In the code, the video objects (and gtk.DrawingArea) are declared and put into the gtk.Fixed FIRST, following by everything else.

So, how do I do this? Do I need to change what object GStreamer is playing on? I know it is possible...I've seen GStreamer programs that have things like buttons and labels sitting on top of the video.

Thanks in advance!

Upvotes: 0

Views: 2695

Answers (2)

dlm
dlm

Reputation: 4254

Probably of no use to the OP, but I searched for a long time looking for a way to place widgets over the top of a gtk.gdk.Drawable element (which could be a statically drawn image, animation or video) before I finally figured out how to do this in pygtk2.

Here's a link to what I came up with: http://bazaar.launchpad.net/~damien-moore/picty/trunk/view/642/modules/picty/overlay_widgets.py

This includes 3 custom classes:

ProportionalLayout: an implementation of a custom gtk.Container that lets the user position child widgets using proportions.

DrawableOverlay: an EventBox that emits a 'draw' event for the user to connect to and do drawing on, and displays a ProportionalLayout on top.

DrawableOverlayHover: a DrawableOverlayHover that only shows the widgets if the pointer gets "close" to them.

The sample main program illustrates how to use them. The code should be reasonably straightforward to adapt to a video application.

Upvotes: 2

ptomato
ptomato

Reputation: 57920

You can do this in GTK 3.2 and above using GtkOverlay.

If you can't upgrade, then here is a summary of the old-fashioned way: connect to the expose-event signal of the DrawingArea, and paint the information on yourself using Cairo. When the information changes, trigger a redraw of the drawing area using widget.queue_draw(). Make sure your handler runs after the handler that draws the actual video onto the drawing area. This will work for labels and non-interactive GUI elements.

If you want an actual functioning GUI element to hover above your video, that's rather more complicated and I don't know how to do it. I don't think Fixed guarantees any z-order. I suspect that your buttons and whatnot are being overpainted by the video being drawn onto the drawing area, so maybe triggering a redraw of those in your expose-event handler will work.

Upvotes: 2

Related Questions