Advertisement
Guest User

Flyswatter

a guest
Dec 11th, 2013
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.90 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. '''
  4. Porting This http://sourceforge.net/projects/camdesk/?source=dlp (cool app from Mike, give him the money) following https://wiki.ubuntu.com/Novacut/GStreamer1.0
  5.  
  6. Many things are not yet working. Broken: -video appears in new window ~ -no settings window yet
  7.  
  8. What has been done:
  9.  
  10. Changes folowing the porting guide
  11. All indents are using four spaces even on line breaks (or python3 complains)
  12. What needs to be done:
  13.  
  14. somehow connect the video to widget
  15. settings window is broke, debug and fix
  16. anything else
  17. look for and implement new stuff (talk to creator?)
  18. '''
  19.  
  20. import sys, os
  21. import gi
  22. gi.require_version('Gst', '1.0')
  23. from gi.repository import GObject, Gst, Gtk, Gdk
  24. from gi.repository import GdkX11, GstVideo
  25.  
  26. GObject.threads_init()
  27. Gst.init(None)
  28.  
  29. class CamDesk(Gtk.Window):
  30.     '''
  31.    The base CamDesk class
  32.    '''
  33.  
  34.     def __init__(self):
  35.         '''
  36.        Case switch in python FTW
  37.        '''
  38.         super(CamDesk, self).__init__()
  39.        
  40.         self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
  41.         self.set_title("CamDesk")
  42.         self.set_decorated(False)
  43.         #self.set_has_frame(False)
  44.         self.set_size_request(320, 240)
  45.         self.set_resizable(False)
  46.         self.set_keep_above(True)
  47.         self.set_property('skip-taskbar-hint', True)
  48.         #Gtk.Window_set_default_icon_from_file('logo.png')
  49.         self.connect("destroy", Gtk.main_quit)
  50.         self.connect("key-press-event", self.on_keypress)
  51.        
  52.         vbox = Gtk.VBox(False, 0)
  53.         self.add(vbox)
  54.        
  55.         self.movie_window = Gtk.DrawingArea()
  56.         vbox.add(self.movie_window)
  57.         self.show_all()
  58.  
  59.         # Set up the Gstreamer pipeline
  60.         self.player = Gst.parse_launch ("v4l2src ! autovideosink")
  61.        
  62.         bus = self.player.get_bus()
  63.         bus.add_signal_watch()
  64.         bus.enable_sync_message_emission()
  65.         bus.connect("message", self.on_message)
  66.         bus.connect("sync-message::element", self.on_sync_message)
  67.  
  68.  
  69.     def post_init(self):
  70.         self.on_keypress_dict = {
  71.             Gdk.KEY_Escape : Gtk.main_quit,
  72.             Gdk.KEY_F1 : self.player.set_state,
  73.             Gdk.KEY_F2 : self.player.set_state,
  74.         }
  75.         self.state_args = {
  76.             Gdk.KEY_Escape : Gtk.main_quit,
  77.             Gdk.KEY_F1 : Gst.State.PLAYING,
  78.             Gdk.KEY_F2 : Gst.State.NULL
  79.         }
  80.    
  81.     def on_keypress(self, widget, event):
  82.         '''
  83.        A case switch statement to eliminate the
  84.        five checks kludginess
  85.        '''
  86.         print('In keypress')
  87.         if event.keyval == Gdk.KEY_F5: self.properties(widget, event)
  88.         else: self.on_keypress_dict[event.keyval](self.state_args[event.keyval])
  89.  
  90.     def properties(self, widget, event) :
  91.         self.win = Gtk.Window(Gtk.WindowType.TOPLEVEL)
  92.         self.win.set_title("Properties")
  93.         self.win.set_size_request(320, 120)
  94.         self.win.set_resizable(False)
  95.         self.win.set_keep_above(True)
  96.         self.win.set_property('skip-taskbar-hint', True)
  97.         self.win.connect("destroy", self.closeproperties)
  98.         vbox = Gtk.VBox(spacing=4)
  99.         hbox = Gtk.HBox(spacing=4)
  100.         hbox2 = Gtk.HBox(spacing=4)
  101.         check = Gtk.CheckButton("Pin")
  102.         check.set_active(True)
  103.         check.set_size_request(100, 35)
  104.         check.connect("clicked", self.pinning)
  105.         hbox.pack_start(check, True, True, 0)
  106.         scale = Gtk.HScale()
  107.         scale.set_range(0, 100)
  108.         scale.set_value(100)
  109.         scale.set_size_request(320, 35)
  110.         scale.connect("value-changed", self.opac_slider)
  111.         hbox.pack_start(scale, True, True, 0)
  112.         self.entry = Gtk.Entry()
  113.         self.entry2 = Gtk.Entry()
  114.         self.entry.set_text("width")
  115.         self.entry2.set_text("height")
  116.         hbox2.pack_start(self.entry, True, True, 0)
  117.         hbox2.pack_start(self.entry2, True, True, 0)
  118.         hbox3 = Gtk.HBox(spacing=4)
  119.         ok = Gtk.Button("OK")
  120.         ok.connect("clicked", self.change_size)
  121.         hbox3.pack_start(ok, True, True, 0)
  122.         exit = Gtk.Button("Exit")
  123.         exit.connect("clicked", self.closeproperties)
  124.         hbox3.pack_start(exit, True, True, 0)
  125.         vbox.pack_start(hbox, True, True, 0)
  126.         vbox.pack_start(hbox2, True, True, 0)
  127.         vbox.pack_start(hbox3, True, True, 0)
  128.         self.win.add(vbox)
  129.         self.win.show_all()
  130.            
  131.     def pinning(self, checkbox):
  132.         if checkbox.get_active():
  133.             self.set_keep_above(True)
  134.         else:
  135.             self.set_keep_above(False)
  136.  
  137.     def opac_slider(self, w):
  138.         self.set_opacity(w.get_value()/100.0)
  139.                
  140.     def change_size(self, w):
  141.         width = int(self.entry.get_text())
  142.         height = int(self.entry2.get_text())
  143.         self.set_size_request(width,height)
  144.         self.show()
  145.  
  146.     def closeproperties(self, w):
  147.         self.win.hide()
  148.  
  149.     def on_message(self, bus, message):
  150.         t = message.type
  151.         if t == Gst.Message.EOS:
  152.             self.player.set_state(Gst.State_NULL)
  153.             self.startcam.set_label("Start")
  154.         elif t == Gst.Message.ERROR:
  155.             err, debug = message.parse_error()
  156.         print("Error: %s" % err, debug)
  157.         self.player.set_state(Gst.State_NULL)
  158.         self.startcam.set_label("Start")
  159.                
  160.     def on_sync_message(self, bus, message):
  161.         if message.structure is None:
  162.             return
  163.             message_name = message.structure.get_name()
  164.         if message_name == "prepare-window-handle":
  165.             # Assign the viewport
  166.             print('Got to assign')
  167.             self.movie_window.imagesink = message.src
  168.             self.movie_window.imagesink.set_property("force-aspect-ratio", True)
  169.             self.movie_window.imagesink.set_window_handle(self.movie_window.window.xid)
  170.  
  171. camdesk = CamDesk()
  172. camdesk.post_init()
  173. #Gtk.gdk.threads_init()
  174. print("Got here")
  175. Gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement