def __init__(self, mode, ip, port): self.mode = mode self.pipeline = FsPipeline() self.pipeline.codecs_changed_audio = self.reset_audio_codecs self.pipeline.codecs_changed_video = self.reset_video_codecs self.builder = gtk.Builder() self.builder.add_from_file(builderprefix + "main-window.ui") self.builder.connect_signals(self) self.mainwindow = self.builder.get_object("main_window") self.audio_combobox = self.builder.get_object("audio_combobox") self.video_combobox = self.builder.get_object("video_combobox") liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.audio_combobox.set_model(liststore) cell = gtk.CellRendererText() self.audio_combobox.pack_start(cell, True) self.audio_combobox.add_attribute(cell, 'text', 0) self.reset_audio_codecs() liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.video_combobox.set_model(liststore) cell = gtk.CellRendererText() self.video_combobox.pack_start(cell, True) self.video_combobox.add_attribute(cell, 'text', 0) self.reset_video_codecs() if mode == CLIENT: self.client = FsUIClient(ip, port, mycname, FsParticipant, self.pipeline, self) self.builder.get_object("info_label").set_markup( "<b>%s</b>\nConnected to %s:%s" % (mycname, ip, port)) elif mode == SERVER: self.server = FsUIListener(port, FsUIServer, mycname, FsParticipant, self.pipeline, self) self.builder.get_object("info_label").set_markup( "<b>%s</b>\nExpecting connections on port %s" % (mycname, self.server.port)) self.mainwindow.show()
class FsMainUI: "The main UI and its different callbacks" def __init__(self, mode, ip, port): self.mode = mode self.pipeline = FsPipeline() self.pipeline.codecs_changed_audio = self.reset_audio_codecs self.pipeline.codecs_changed_video = self.reset_video_codecs self.builder = gtk.Builder() self.builder.add_from_file(builderprefix + "main-window.ui") self.builder.connect_signals(self) self.mainwindow = self.builder.get_object("main_window") self.audio_combobox = self.builder.get_object("audio_combobox") self.video_combobox = self.builder.get_object("video_combobox") liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.audio_combobox.set_model(liststore) cell = gtk.CellRendererText() self.audio_combobox.pack_start(cell, True) self.audio_combobox.add_attribute(cell, 'text', 0) self.reset_audio_codecs() liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.video_combobox.set_model(liststore) cell = gtk.CellRendererText() self.video_combobox.pack_start(cell, True) self.video_combobox.add_attribute(cell, 'text', 0) self.reset_video_codecs() if mode == CLIENT: self.client = FsUIClient(ip, port, mycname, FsParticipant, self.pipeline, self) self.builder.get_object("info_label").set_markup( "<b>%s</b>\nConnected to %s:%s" % (mycname, ip, port)) elif mode == SERVER: self.server = FsUIListener(port, FsUIServer, mycname, FsParticipant, self.pipeline, self) self.builder.get_object("info_label").set_markup( "<b>%s</b>\nExpecting connections on port %s" % (mycname, self.server.port)) self.mainwindow.show() def reset_codecs(self, combobox, fssession): liststore = combobox.get_model() current = fssession.get_property("current-send-codec") liststore.clear() for c in fssession.get_property("codecs"): str = ( "%s: %s/%s %s" % (c.id, c.media_type.value_nick, c.encoding_name, c.clock_rate)) iter = liststore.append([str, c]) if current and c and current.id == c.id: combobox.set_active_iter(iter) print "active: " + c.to_string() def reset_audio_codecs(self): if AUDIO: self.reset_codecs(self.audio_combobox, self.pipeline.audiosession.fssession) def reset_video_codecs(self): if VIDEO: self.reset_codecs(self.video_combobox, self.pipeline.videosession.fssession) def combobox_changed_cb(self, combobox, fssession): liststore = combobox.get_model() iter = combobox.get_active_iter() if iter: codec = liststore.get_value(iter, 1) fssession.set_send_codec(codec) def audio_combobox_changed_cb(self, combobox): self.combobox_changed_cb(combobox, self.pipeline.audiosession.fssession) def video_combobox_changed_cb(self, combobox): self.combobox_changed_cb(combobox, self.pipeline.videosession.fssession) def exposed(self, widget, *args): "Callback from the exposed event of the widget to make the preview sink" if not VIDEO: return try: self.preview.get_by_interface(gst.interfaces.XOverlay).expose() except AttributeError: self.preview = self.pipeline.make_video_preview( widget.window.xid, self.newsize) def newsize(self, x, y): self.builder.get_object("preview_drawingarea").set_size_request(x, y) def shutdown(self, widget=None): gtk.main_quit() def hbox_add(self, widget, label): table = self.builder.get_object("users_table") x = table.get_properties("n-columns")[0] table.attach(widget, x, x + 1, 0, 1) table.attach(label, x, x + 1, 1, 3, xpadding=6) def __del__(self): self.mainwindow.destroy() def fatal_error(self, errormsg): gtk.gdk.threads_enter() dialog = gtk.MessageDialog(self.mainwindow, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK) dialog.set_markup(errormsg) dialog.run() dialog.destroy() gtk.main_quit() gtk.gdk.threads_leave()
class FsMainUI: "The main UI and its different callbacks" def __init__(self, mode, ip, port): self.mode = mode self.pipeline = FsPipeline() self.pipeline.codecs_changed_audio = self.reset_audio_codecs self.pipeline.codecs_changed_video = self.reset_video_codecs self.builder = gtk.Builder() self.builder.add_from_file(builderprefix + "main-window.ui") self.builder.connect_signals(self) self.mainwindow = self.builder.get_object("main_window") self.audio_combobox = self.builder.get_object("audio_combobox") self.video_combobox = self.builder.get_object("video_combobox") liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.audio_combobox.set_model(liststore) cell = gtk.CellRendererText() self.audio_combobox.pack_start(cell, True) self.audio_combobox.add_attribute(cell, 'text', 0) self.reset_audio_codecs() liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.video_combobox.set_model(liststore) cell = gtk.CellRendererText() self.video_combobox.pack_start(cell, True) self.video_combobox.add_attribute(cell, 'text', 0) self.reset_video_codecs() if mode == CLIENT: self.client = FsUIClient(ip, port, mycname, FsParticipant, self.pipeline, self) self.builder.get_object("info_label").set_markup( "<b>%s</b>\nConnected to %s:%s" % (mycname, ip, port)) elif mode == SERVER: self.server = FsUIListener(port, FsUIServer, mycname, FsParticipant, self.pipeline, self) self.builder.get_object("info_label").set_markup( "<b>%s</b>\nExpecting connections on port %s" % (mycname, self.server.port)) self.mainwindow.show() def reset_codecs(self, combobox, fssession): liststore = combobox.get_model() current = fssession.get_property("current-send-codec") liststore.clear() for c in fssession.get_property("codecs"): str = ("%s: %s/%s %s" % (c.id, c.media_type.value_nick, c.encoding_name, c.clock_rate)) iter = liststore.append([str, c]) if current and c and current.id == c.id: combobox.set_active_iter(iter) print "active: "+ c.to_string() def reset_audio_codecs(self): if AUDIO: self.reset_codecs(self.audio_combobox, self.pipeline.audiosession.fssession) def reset_video_codecs(self): if VIDEO: self.reset_codecs(self.video_combobox, self.pipeline.videosession.fssession) def combobox_changed_cb(self, combobox, fssession): liststore = combobox.get_model() iter = combobox.get_active_iter() if iter: codec = liststore.get_value(iter, 1) fssession.set_send_codec(codec) def audio_combobox_changed_cb(self, combobox): self.combobox_changed_cb(combobox, self.pipeline.audiosession.fssession) def video_combobox_changed_cb(self, combobox): self.combobox_changed_cb(combobox, self.pipeline.videosession.fssession) def exposed(self, widget, *args): "Callback from the exposed event of the widget to make the preview sink" if not VIDEO: return try: self.preview.get_by_interface(gst.interfaces.XOverlay).expose() except AttributeError: self.preview = self.pipeline.make_video_preview(widget.window.xid, self.newsize) def newsize (self, x, y): self.builder.get_object("preview_drawingarea").set_size_request(x,y) def shutdown(self, widget=None): gtk.main_quit() def hbox_add(self, widget, label): table = self.builder.get_object("users_table") x = table.get_properties("n-columns")[0] table.attach(widget, x, x+1, 0, 1) table.attach(label, x, x+1, 1, 3, xpadding=6) def __del__(self): self.mainwindow.destroy() def fatal_error(self, errormsg): gtk.gdk.threads_enter() dialog = gtk.MessageDialog(self.mainwindow, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK) dialog.set_markup(errormsg); dialog.run() dialog.destroy() gtk.main_quit() gtk.gdk.threads_leave()